001 /*
002 * The contents of this file are subject to the Mozilla Public
003 * License Version 1.1 (the "License"); you may not use this file
004 * except in compliance with the License. You may obtain a copy of
005 * the License at http://www.mozilla.org/MPL/
006 *
007 * Software distributed under the License is distributed on an "AS
008 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
009 * implied. See the License for the specific language governing
010 * rights and limitations under the License.
011 *
012 * The Original Code is Knowtator.
013 *
014 * The Initial Developer of the Original Code is University of Colorado.
015 * Copyright (C) 2005-2008. All Rights Reserved.
016 *
017 * Knowtator was developed by the Center for Computational Pharmacology
018 * (http://compbio.uchcs.edu) at the University of Colorado Health
019 * Sciences Center School of Medicine with support from the National
020 * Library of Medicine.
021 *
022 * Current information about Knowtator can be obtained at
023 * http://knowtator.sourceforge.net/
024 *
025 * Contributor(s):
026 * Philip V. Ogren <philip@ogren.info> (Original Author)
027 */
028 package edu.uchsc.ccp.knowtator.ui;
029
030 import java.awt.event.ActionEvent;
031 import java.awt.event.ActionListener;
032 import java.awt.event.MouseAdapter;
033 import java.awt.event.MouseEvent;
034 import java.awt.event.MouseListener;
035 import java.util.Collection;
036 import java.util.List;
037
038 import javax.swing.Action;
039 import javax.swing.JMenuItem;
040 import javax.swing.JPopupMenu;
041 import javax.swing.tree.TreeNode;
042 import javax.swing.tree.TreePath;
043
044 import org.apache.log4j.Logger;
045
046 import edu.stanford.smi.protege.event.FrameAdapter;
047 import edu.stanford.smi.protege.event.FrameEvent;
048 import edu.stanford.smi.protege.model.Cls;
049 import edu.stanford.smi.protege.model.Frame;
050 import edu.stanford.smi.protege.model.KnowledgeBase;
051 import edu.stanford.smi.protege.model.ModelUtilities;
052 import edu.stanford.smi.protege.model.SimpleInstance;
053 import edu.stanford.smi.protege.model.Slot;
054 import edu.stanford.smi.protege.ui.ParentChildRoot;
055 import edu.stanford.smi.protege.util.ComponentUtilities;
056 import edu.stanford.smi.protege.util.LazyTreeNode;
057 import edu.stanford.smi.protege.util.LazyTreeRoot;
058 import edu.stanford.smi.protege.util.Selectable;
059 import edu.stanford.smi.protege.util.SelectableTree;
060 import edu.stanford.smi.protege.util.SelectionListener;
061 import edu.uchsc.ccp.knowtator.AnnotationUtil;
062 import edu.uchsc.ccp.knowtator.BrowserTextUtil;
063 import edu.uchsc.ccp.knowtator.KnowtatorManager;
064 import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil;
065 import edu.uchsc.ccp.knowtator.MentionUtil;
066 import edu.uchsc.ccp.knowtator.ProjectSettings;
067 import edu.uchsc.ccp.knowtator.TextSourceUtil;
068 import edu.uchsc.ccp.knowtator.event.EventHandler;
069 import edu.uchsc.ccp.knowtator.event.RefreshAnnotationsDisplayListener;
070 import edu.uchsc.ccp.knowtator.event.SelectedAnnotationChangeEvent;
071 import edu.uchsc.ccp.knowtator.event.SelectedAnnotationChangeListener;
072
073 public class AnnotationSchemaTree extends SelectableTree implements SelectedAnnotationChangeListener,
074 SelectionListener, RefreshAnnotationsDisplayListener {
075 public void refreshAnnotationsDisplay(boolean scrollToSelection) {
076 validate();
077 repaint();
078 }
079
080 static final long serialVersionUID = 0;
081
082 KnowtatorManager manager;
083
084 KnowledgeBase kb;
085
086 AnnotationUtil annotationUtil;
087
088 MentionUtil mentionUtil;
089
090 KnowtatorProjectUtil kpu;
091
092 TextSourceUtil textSourceUtil;
093
094 BrowserTextUtil browserTextUtil;
095
096 ColorFrameRenderer renderer;
097
098 JPopupMenu popupMenu;
099
100 Logger logger = Logger.getLogger(AnnotationSchemaTree.class);
101
102 public AnnotationSchemaTree(KnowtatorManager manager, Action doubleClickAction, LazyTreeRoot root) {
103 super(doubleClickAction, root);
104
105 initialize(manager);
106 }
107
108 private void initialize(KnowtatorManager manager) {
109 this.manager = manager;
110 mentionUtil = manager.getMentionUtil();
111 annotationUtil = manager.getAnnotationUtil();
112 kpu = manager.getKnowtatorProjectUtil();
113 textSourceUtil = manager.getTextSourceUtil();
114 browserTextUtil = manager.getBrowserTextUtil();
115 renderer = manager.getRenderer();
116
117 popupMenu = new JPopupMenu();
118
119 setLargeModel(true);
120 // setRowHeight(rootCls.getIcon().getIconHeight());
121 setSelectionRow(0);
122 setAutoscrolls(true);
123 setCellRenderer(renderer);
124 addSelectionListener(this);
125 addMouseListener(createSelectableListener());
126
127 SimpleInstance configuration = ProjectSettings.getActiveConfiguration(kpu.getKnowledgeBase().getProject());
128 configuration.addFrameListener(new FrameAdapter() {
129 public void ownSlotValueChanged(FrameEvent frameEvent) {
130 Slot slot = frameEvent.getSlot();
131 if (slot.equals(kpu.getRootClsesSlot())) {
132 setRoot(new ParentChildRoot(AnnotationSchemaTree.this.manager.getRootClses()));
133 }
134 }
135 });
136
137 EventHandler.getInstance().addSelectedAnnotationChangeListener(this);
138 EventHandler.getInstance().addRefreshAnnotationsDisplayListener(this);
139 }
140
141 public void annotationSelectionChanged(SelectedAnnotationChangeEvent sace) {
142 SimpleInstance selectedAnnotation = sace.getSelectedAnnotation();
143 if (selectedAnnotation == null)
144 return;
145
146 SimpleInstance selectedMention = annotationUtil.getMention(selectedAnnotation);
147
148 logger.debug("selected annotation = \"" + browserTextUtil.getBrowserText(selectedAnnotation, 100));
149 mentionUtil.initializeSlotMentions(selectedMention);
150
151 Cls selectedCls = mentionUtil.getMentionCls(selectedMention);
152
153 if (selectedCls != null) {
154 java.util.List path = ModelUtilities.getPathToRoot(selectedCls);
155 List<Cls> rootClses = manager.getRootClses();
156 if (rootClses.size() > 0) {
157 boolean baseOfPathFound = false;
158 while (!baseOfPathFound && path.size() > 0) {
159 for (Cls rootCls : rootClses) {
160 if (rootCls.equals(path.get(0))) {
161 baseOfPathFound = true;
162 }
163 }
164 if (!baseOfPathFound)
165 path.remove(0);
166 }
167 if (path.size() > 0)
168 ComponentUtilities.setSelectedObjectPath(this, path);
169 }
170 }
171
172 }
173
174 public void selectionChanged(edu.stanford.smi.protege.util.SelectionEvent selectionEvent) {
175 Selectable selectable = selectionEvent.getSelectable();
176 Collection selection = selectable.getSelection();
177
178 if (selection.size() == 1) {
179 Cls selectedCls = (Cls) selection.iterator().next();
180 logger.debug("selected cls = \"" + selectedCls + "\"");
181 manager.setSelectedCls(selectedCls);
182 }
183 }
184
185 private MouseListener createSelectableListener() {
186 return new MouseAdapter() {
187
188 public void mouseClicked(MouseEvent event) {
189 Collection selection = getSelection();
190 logger.debug("selection size=" + selection.size());
191 if (selection.size() == 1) {
192 final Frame selectedFrame = (Frame) selection.iterator().next();
193
194 final TreePath treePath = getPathForLocation(event.getX(), event.getY());
195 if (treePath == null) {
196 return;
197 }
198 boolean addCollapseMenuItem = false;
199 if (treePath.getPathCount() == 2) {
200 Object lastComponent = treePath.getLastPathComponent();
201 if (lastComponent instanceof LazyTreeNode) {
202 LazyTreeNode node = (LazyTreeNode) lastComponent;
203 int childCount = node.getChildCount();
204 if (childCount > 0) {
205 TreeNode childNode = node.getChildAt(0);
206 TreePath childTreePath = treePath.pathByAddingChild(childNode);
207 if (!isVisible(childTreePath)) {
208 expandPath(treePath);
209 return;
210 } else
211 addCollapseMenuItem = true;
212 }
213 }
214 }
215
216 popupMenu.removeAll();
217 JMenuItem createAnnotationMenuItem = AnnotationSchemaMenuItemFactory.createAnnotationMenuItem(
218 manager, selectedFrame, textSourceUtil);
219 if (createAnnotationMenuItem != null) {
220 popupMenu.add(createAnnotationMenuItem);
221 popupMenu.addSeparator();
222 JMenuItem fastAnnotateMenuItem = AnnotationSchemaMenuItemFactory.createFastAnnotateMenuItem(
223 manager, selectedFrame);
224 popupMenu.add(fastAnnotateMenuItem);
225 if (manager.isFastAnnotateMode() && manager.fastAnnotateToolBarContains(selectedFrame)) {
226 JMenuItem removeItem = AnnotationSchemaMenuItemFactory.createRemoveClsFromToolbarMenuItem(
227 manager, selectedFrame);
228 popupMenu.add(removeItem);
229 }
230
231 } else {
232 popupMenu.add(new JMenuItem(
233 "The current filter does not allow creation of annotations of this type."));
234 }
235 List<JMenuItem> selectAnnotationMenuItems = AnnotationSchemaMenuItemFactory
236 .createSelectAnnotationMenuItems(manager, selectedFrame, AnnotationSchemaTree.this);
237 if (selectAnnotationMenuItems != null && selectAnnotationMenuItems.size() > 0)
238 popupMenu.addSeparator();
239 for (JMenuItem selectAnnotationMenuItem : selectAnnotationMenuItems) {
240 popupMenu.add(selectAnnotationMenuItem);
241 }
242
243 if (addCollapseMenuItem) {
244 popupMenu.addSeparator();
245 JMenuItem menuItem = new JMenuItem("collapse root node");
246 menuItem.addActionListener(new ActionListener() {
247 public void actionPerformed(ActionEvent actionEvent) {
248 collapsePath(treePath);
249 }
250 });
251 popupMenu.add(menuItem);
252 }
253
254 if (popupMenu.getSubElements() != null && popupMenu.getSubElements().length > 0)
255 popupMenu.show(event.getComponent(), event.getX() + 10, event.getY());
256 }
257 }
258 };
259 }
260 }
261
262 // final SimpleInstance selectedAnnotation = manager.getSelectedAnnotation();
263 // final Rectangle textBounds = manager.getVisibleTextRect();
264 // popupMenu.addPopupMenuListener(new PopupMenuListener() {
265 // public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
266 //
267 // }
268 // public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
269 //
270 // }
271 // public void popupMenuCanceled(PopupMenuEvent e) {
272 // if(manager.getSelectedAnnotation() ==
273 // selectedAnnotation)
274 // manager.setVisibleTextRect(textBounds);
275 // }
276 // });