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.Rectangle;
031 import java.awt.event.MouseAdapter;
032 import java.awt.event.MouseEvent;
033 import java.awt.event.MouseListener;
034 import java.util.ArrayList;
035 import java.util.Collection;
036 import java.util.Collections;
037 import java.util.List;
038
039 import javax.swing.JMenuItem;
040 import javax.swing.JPopupMenu;
041
042 import edu.stanford.smi.protege.model.Cls;
043 import edu.stanford.smi.protege.model.Frame;
044 import edu.stanford.smi.protege.model.KnowledgeBase;
045 import edu.stanford.smi.protege.model.SimpleInstance;
046 import edu.stanford.smi.protege.ui.FrameComparator;
047 import edu.stanford.smi.protege.util.ComponentUtilities;
048 import edu.stanford.smi.protege.util.SelectableList;
049 import edu.stanford.smi.protege.util.SimpleListModel;
050 import edu.uchsc.ccp.knowtator.AnnotationUtil;
051 import edu.uchsc.ccp.knowtator.BrowserTextUtil;
052 import edu.uchsc.ccp.knowtator.KnowtatorManager;
053 import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil;
054 import edu.uchsc.ccp.knowtator.MentionUtil;
055 import edu.uchsc.ccp.knowtator.ProjectSettings;
056 import edu.uchsc.ccp.knowtator.TextSourceUtil;
057 import edu.uchsc.ccp.knowtator.event.EventHandler;
058 import edu.uchsc.ccp.knowtator.event.RefreshAnnotationsDisplayListener;
059 import edu.uchsc.ccp.knowtator.event.SelectedAnnotationChangeEvent;
060 import edu.uchsc.ccp.knowtator.event.SelectedAnnotationChangeListener;
061 import edu.uchsc.ccp.knowtator.event.SelectedClsChangeEvent;
062 import edu.uchsc.ccp.knowtator.event.SelectedClsChangeListener;
063
064 public class AnnotationSchemaInstancesList extends SelectableList implements SelectedAnnotationChangeListener,
065 RefreshAnnotationsDisplayListener {
066 KnowtatorManager manager;
067
068 KnowledgeBase kb;
069
070 KnowtatorProjectUtil kpu;
071
072 AnnotationUtil annotationUtil;
073
074 MentionUtil mentionUtil;
075
076 TextSourceUtil textSourceUtil;
077
078 BrowserTextUtil browserTextUtil;
079
080 ColorFrameRenderer renderer;
081
082 JPopupMenu popupMenu;
083
084 public AnnotationSchemaInstancesList(KnowtatorManager manager) {
085 super();
086 initialize(manager);
087 }
088
089 private void initialize(KnowtatorManager manager) {
090 this.manager = manager;
091 setModel(new SimpleListModel());
092
093 kb = manager.getKnowledgeBase();
094 kpu = manager.getKnowtatorProjectUtil();
095 renderer = manager.getRenderer();
096 annotationUtil = manager.getAnnotationUtil();
097 mentionUtil = manager.getMentionUtil();
098 textSourceUtil = manager.getTextSourceUtil();
099 browserTextUtil = manager.getBrowserTextUtil();
100
101 setCellRenderer(renderer);
102
103 popupMenu = new JPopupMenu();
104
105 addMouseListener(createSelectableListener());
106 EventHandler.getInstance().addSelectedClsChangeListener(new SelectedClsChangeListener() {
107 public void clsSelectionChanged(SelectedClsChangeEvent scce) {
108 Cls selectedCls = AnnotationSchemaInstancesList.this.manager.getSelectedCls();
109 ArrayList instances = new ArrayList(selectedCls.getDirectInstances());
110 Collections.sort(instances, new FrameComparator());
111 if (ProjectSettings.getShowInstances(getKb().getProject())) {
112 ((SimpleListModel) (AnnotationSchemaInstancesList.this.getModel())).setValues(instances);
113 }
114 }
115 });
116
117 EventHandler.getInstance().addSelectedAnnotationChangeListener(this);
118 EventHandler.getInstance().addRefreshAnnotationsDisplayListener(this);
119
120 }
121
122 private KnowledgeBase getKb() {
123 return kb;
124 }
125
126 private MouseListener createSelectableListener() {
127 return new MouseAdapter() {
128
129 public void mouseClicked(MouseEvent event) {
130 if (event.isPopupTrigger())
131 return;
132 Collection selection = getSelection();
133
134 if (selection.size() == 1) {
135 final Frame selectedFrame = (Frame) selection.iterator().next();
136
137 int index = locationToIndex(event.getPoint());
138 Rectangle cellBounds = getCellBounds(index, index);
139 if (!cellBounds.contains(event.getPoint()))
140 return;
141
142 popupMenu.removeAll();
143 JMenuItem createAnnotationMenuItem = AnnotationSchemaMenuItemFactory.createAnnotationMenuItem(
144 manager, selectedFrame, textSourceUtil);
145 if (createAnnotationMenuItem != null) {
146 popupMenu.add(createAnnotationMenuItem);
147 popupMenu.addSeparator();
148 JMenuItem fastAnnotateMenuItem = AnnotationSchemaMenuItemFactory.createFastAnnotateMenuItem(
149 manager, selectedFrame);
150 popupMenu.add(fastAnnotateMenuItem);
151 if (manager.isFastAnnotateMode() && manager.fastAnnotateToolBarContains(selectedFrame)) {
152 JMenuItem removeItem = AnnotationSchemaMenuItemFactory.createRemoveClsFromToolbarMenuItem(
153 manager, selectedFrame);
154 popupMenu.add(removeItem);
155 }
156
157 } else {
158 popupMenu.add(new JMenuItem(
159 "The current filter does not allow creation of annotations of this type."));
160 }
161 List<JMenuItem> selectAnnotationMenuItems = AnnotationSchemaMenuItemFactory
162 .createSelectAnnotationMenuItems(manager, selectedFrame, AnnotationSchemaInstancesList.this);
163 if (selectAnnotationMenuItems != null && selectAnnotationMenuItems.size() > 0)
164 popupMenu.addSeparator();
165 for (JMenuItem selectAnnotationMenuItem : selectAnnotationMenuItems) {
166 popupMenu.add(selectAnnotationMenuItem);
167 }
168
169 if (popupMenu.getSubElements() != null && popupMenu.getSubElements().length > 0)
170 popupMenu.show(event.getComponent(), event.getX() + 10, event.getY());
171 }
172 }
173 };
174 }
175
176 public void annotationSelectionChanged(SelectedAnnotationChangeEvent sace) {
177 SimpleInstance annotation = sace.getSelectedAnnotation();
178 if (annotation == null)
179 return;
180 SimpleInstance selectedMention = annotationUtil.getMention(annotation);
181
182 mentionUtil.initializeSlotMentions(selectedMention);
183
184 SimpleInstance mentionInstance = mentionUtil.getMentionInstance(selectedMention);
185 if (mentionInstance != null) {
186 ComponentUtilities.setSelectedValue(this, mentionInstance);
187 } else
188 clearSelection();
189 }
190
191 public void refreshAnnotationsDisplay(boolean scrollToSelection) {
192 validate();
193 repaint();
194 }
195 }