001 package nl.cwi.sen1.error.viewer;
002
003 import java.util.HashMap;
004
005 import javax.swing.JTree;
006 import javax.swing.event.TreeSelectionEvent;
007 import javax.swing.event.TreeSelectionListener;
008 import javax.swing.tree.TreePath;
009
010 import nl.cwi.sen1.error.model.SelectableNode;
011 import nl.cwi.sen1.gui.CloseAbortedException;
012 import nl.cwi.sen1.gui.Studio;
013 import nl.cwi.sen1.gui.StudioImplWithPredefinedLayout;
014 import nl.cwi.sen1.gui.StudioWithPredefinedLayout;
015 import nl.cwi.sen1.gui.component.StudioComponent;
016 import nl.cwi.sen1.gui.component.StudioComponentImpl;
017 import nl.cwi.sen1.gui.plugin.DefaultStudioPlugin;
018 import aterm.ATerm;
019 import aterm.ATermFactory;
020 import aterm.pure.PureFactory;
021 import errorapi.Factory;
022 import errorapi.types.Summary;
023
024 public class ErrorViewer extends DefaultStudioPlugin implements ErrorViewerTif {
025 private static final String TOOL_NAME = "error-viewer";
026
027 private Studio studio;
028
029 private StudioComponent component;
030
031 ErrorViewerBridge bridge;
032
033 errorapi.Factory errorFactory;
034
035 private HashMap<String, ErrorPanel> panels = new HashMap<String, ErrorPanel>();
036
037 public String getName() {
038 return TOOL_NAME;
039 }
040
041 public void initStudioPlugin(Studio studio) {
042 this.studio = studio;
043
044 ATermFactory factory = studio.getATermFactory();
045 errorFactory = Factory.getInstance((PureFactory) factory);
046
047 bridge = new ErrorViewerBridge(factory, this);
048 bridge.setLockObject(this);
049
050 studio.connect(getName(), bridge);
051 }
052
053 public ErrorViewer() {
054 }
055
056 private void addListener(ErrorPanel panel) {
057 final JTree tree = panel.getTree();
058
059 tree.addTreeSelectionListener(new TreeSelectionListener() {
060 public void valueChanged(TreeSelectionEvent e) {
061 TreePath path = tree.getSelectionPath();
062 if (path != null) {
063 Object node = path.getLastPathComponent();
064 if (node != null && node instanceof SelectableNode) {
065 ((SelectableNode) node).selected(studio, bridge);
066 tree.clearSelection();
067 }
068 }
069 }
070 });
071 }
072
073 private ErrorPanel createPanel(String panelId) {
074 ErrorPanel panel = new ErrorPanel();
075 addListener(panel);
076
077 component = new StudioComponentImpl(panelId, panel) {
078 public void requestClose() throws CloseAbortedException {
079 throw new CloseAbortedException();
080 }
081 };
082
083 ((StudioWithPredefinedLayout) studio).addComponent(component,
084 StudioImplWithPredefinedLayout.BOTTOM_RIGHT);
085
086 return panel;
087 }
088
089 private ErrorPanel getPanel(String panelId) {
090 ErrorPanel panel = panels.get(panelId);
091
092 if (panel != null) {
093 return panel;
094 }
095 panel = createPanel(panelId);
096 panels.put(panelId, panel);
097 return panel;
098 }
099
100 public void showFeedbackSummary(String panelId, ATerm summaryTerm) {
101 try {
102 Summary summary = errorFactory.SummaryFromTerm(summaryTerm);
103 if (summary.getList().isEmpty() == false) {
104 getPanel(panelId).addError(summary);
105 studio.makeVisible(component);
106 }
107 } catch (aterm.ParseError ex) {
108 System.err.println("Summary is not a valid ATerm");
109 } catch (IllegalArgumentException ex) {
110 System.err.println("Summary is not valid");
111 }
112 }
113
114 public void refreshFeedbackSummary(String panelId, ATerm summaryTerm) {
115 try {
116 Summary summary = errorFactory.SummaryFromTerm(summaryTerm);
117 String producer = summary.getProducer();
118 String id = summary.getId();
119
120 getPanel(panelId).removeAllMatchingErrors(producer, id);
121 getPanel(panelId).addError(summary);
122 } catch (aterm.ParseError ex) {
123 System.err.println("Summary is not a valid ATerm");
124 } catch (IllegalArgumentException ex) {
125 System.err.println("Summary is not valid");
126 }
127 }
128
129 public void removeFeedbackSummary(String panelId, String producer, String id) {
130 getPanel(panelId).removeAllMatchingErrors(producer, id);
131 }
132
133 public void removeFeedbackSummary(String panelId, String path) {
134 getPanel(panelId).removeAllMatchingErrors(path);
135 }
136
137 public void recAckEvent(ATerm t0) {
138 }
139
140 public void recTerminate(ATerm t0) {
141 fireStudioPluginClosed();
142 }
143 }