package org.simantics.interop.issues; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.swt.widgets.Display; /** * IssueReporter is singleton class that handles collecting issues. * * TODO: how to store issues when the application is closed? Memento-based? * * @author Marko Luukkainen * */ public class IssueReporter implements IssueListener{ private static IssueReporter INSTANCE; private List issues = new ArrayList(); private List listeners = new ArrayList(); private IssueReporter() { } public static IssueReporter getInstance() { if (INSTANCE == null) INSTANCE = new IssueReporter(); return INSTANCE; } /** * Retuns list of issues. * @return */ public List getIssues() { return Collections.unmodifiableList(issues); } public void addIssue(Issue issue) { issues.add(issue); issue.addListener(this); fireAdded(issue); } public void removeIssue(Issue issue) { issue.removeListener(this); issues.remove(issue); fireRemoved(issue); } @Override public void updated(Issue issue) { fireUpdated(issue); } @Override public void disposed(Issue issue) { issue.removeListener(this); issues.remove(issue); fireRemoved(issue); } public void addListener(IssueReporterListener listener) { listeners.add(listener); } public void removeListener(IssueReporterListener listener) { listeners.remove(listener); } protected void fireAdded(final Issue issue) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { for (IssueReporterListener l : listeners) l.added(issue); } }); } protected void fireRemoved(final Issue issue) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { for (IssueReporterListener l : listeners) l.removed(issue); } }); } protected void fireUpdated(final Issue issue) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { for (IssueReporterListener l : listeners) l.updated(issue); } }); } }