RelationSetView.java
001 /*
002  *  RelationSetView.java
003  *
004  *  Copyright (c) 1995-2013, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Mark A. Greenwood, 15th December 2013
013  */
014 package gate.gui.docview;
015 
016 import gate.AnnotationSet;
017 import gate.Document;
018 import gate.Resource;
019 import gate.creole.AbstractVisualResource;
020 import gate.creole.metadata.CreoleResource;
021 import gate.creole.metadata.GuiType;
022 import gate.event.AnnotationSetEvent;
023 import gate.event.AnnotationSetListener;
024 import gate.event.DocumentEvent;
025 import gate.event.DocumentListener;
026 import gate.event.RelationSetEvent;
027 import gate.event.RelationSetListener;
028 import gate.gui.MainFrame;
029 import gate.relations.RelationSet;
030 
031 import java.awt.BorderLayout;
032 import java.awt.event.ActionEvent;
033 import java.awt.event.ActionListener;
034 
035 import javax.swing.JButton;
036 import javax.swing.JLabel;
037 import javax.swing.JTextPane;
038 import javax.swing.JToolBar;
039 
040 @CreoleResource(name = "Relation Viewer", guiType = GuiType.LARGE, resourceDisplayed = "gate.Document")
041 public class RelationSetView extends AbstractVisualResource
042                                                            implements
043                                                            DocumentListener,
044                                                            AnnotationSetListener,
045                                                            RelationSetListener {
046 
047   private static final long serialVersionUID = 2976754146115707386L;
048 
049   private JTextPane text = new JTextPane();
050 
051   private Document doc = null;
052 
053   @Override
054   public Resource init() {
055     setLayout(new BorderLayout());
056 
057     text.setEditable(false);
058 
059     add(text, BorderLayout.CENTER);
060 
061     JButton btnRefresh = new JButton("Refresh", MainFrame.getIcon("Refresh"));
062     btnRefresh.addActionListener(new ActionListener() {
063 
064       @Override
065       public void actionPerformed(ActionEvent arg0) {
066         refresh();
067       }
068     });
069 
070     JToolBar toolbar = new JToolBar(JToolBar.HORIZONTAL);
071     toolbar.setFloatable(false);
072 
073     toolbar.add(btnRefresh);
074     toolbar.addSeparator();
075     toolbar.add(new JLabel("Currently this view is not automatically updated"));
076 
077     // not currently need as we now support the listners properly
078     // add(toolbar, BorderLayout.NORTH);
079 
080     return this;
081   }
082 
083   private void refresh() {
084     if(doc == nullreturn;
085 
086     StringBuilder builder = new StringBuilder();
087 
088     RelationSet relations = doc.getAnnotations().getRelations();
089     if(relations.size() 0) {
090       builder.append(relations).append("\n\n");
091     }
092 
093     for(String name : doc.getAnnotationSetNames()) {
094       relations = doc.getAnnotations(name).getRelations();
095       if(relations.size() 0) {
096         builder.append(name).append(":\n").append(relations).append("\n\n");
097       }
098     }
099 
100     text.setText(builder.toString());
101   }
102 
103   @Override
104   public void setTarget(Object target) {
105     if(doc != null) {
106       doc.removeDocumentListener(this);
107       doc.getAnnotations().removeAnnotationSetListener(this);
108       doc.getAnnotations().getRelations().removeRelationSetListener(this);
109       for(String name : doc.getAnnotationSetNames()) {
110         AnnotationSet as = doc.getAnnotations(name);
111         as.removeAnnotationSetListener(this);
112         as.getRelations().removeRelationSetListener(this);
113       }
114     }
115 
116     doc = (Document)target;
117     doc.addDocumentListener(this);
118     doc.getAnnotations().addAnnotationSetListener(this);
119     doc.getAnnotations().getRelations().addRelationSetListener(this);
120 
121     for(String name : doc.getAnnotationSetNames()) {
122       AnnotationSet as = doc.getAnnotations(name);
123       as.addAnnotationSetListener(this);
124       as.getRelations().addRelationSetListener(this);
125     }
126 
127     refresh();
128   }
129 
130   @Override
131   public void annotationSetAdded(DocumentEvent e) {
132     doc.getAnnotations(e.getAnnotationSetName()).addAnnotationSetListener(this);
133     refresh();
134   }
135 
136   @Override
137   public void annotationSetRemoved(DocumentEvent e) {
138     doc.getAnnotations(e.getAnnotationSetName()).removeAnnotationSetListener(
139             this);
140     refresh();
141   }
142 
143   @Override
144   public void contentEdited(DocumentEvent e) {
145     // we don't care about changes in content, as hopefully any changes
146     // that cause annotations to be deleted will be handled through the
147     // appropriate handlers
148   }
149 
150   @Override
151   public void annotationAdded(AnnotationSetEvent e) {
152     refresh();
153   }
154 
155   @Override
156   public void annotationRemoved(AnnotationSetEvent e) {
157     refresh();
158   }
159 
160   @Override
161   public void relationAdded(RelationSetEvent e) {
162     refresh();
163   }
164 
165   @Override
166   public void relationRemoved(RelationSetEvent e) {
167     refresh();
168   }
169 }