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.Component;
031 import java.awt.event.ActionEvent;
032 import java.awt.event.ActionListener;
033 import java.awt.event.MouseAdapter;
034 import java.awt.event.MouseEvent;
035 import java.util.ArrayList;
036 import java.util.Collections;
037 import java.util.Comparator;
038 import java.util.List;
039
040 import javax.swing.JMenuItem;
041
042 import edu.stanford.smi.protege.model.Frame;
043 import edu.stanford.smi.protege.model.Instance;
044 import edu.stanford.smi.protege.model.SimpleInstance;
045 import edu.uchsc.ccp.knowtator.KnowtatorManager;
046 import edu.uchsc.ccp.knowtator.Span;
047 import edu.uchsc.ccp.knowtator.TextSourceUtil;
048 import edu.uchsc.ccp.knowtator.textsource.TextSourceAccessException;
049
050 public class AnnotationSchemaMenuItemFactory {
051 public static final int SELECTION_ITEMS_COUNT_THRESHOLD = 20;
052
053 public static JMenuItem createAnnotationMenuItem(final KnowtatorManager manager, final Frame selectedFrame,
054 TextSourceUtil textSourceUtil) {
055 boolean create = manager.getFilterUtil().isClsLicensedByFilter(manager.getSelectedFilter(), selectedFrame);
056
057 if (create) {
058 List<Span> selectedSpans = manager.getSelectedSpans();
059 String annotationText = "<html>create <b>" + selectedFrame.getBrowserText() + "</b> annotation</html>";
060 if (selectedSpans != null && selectedSpans.size() != 0) {
061 try {
062 String selectedText = textSourceUtil.getCurrentTextSource().getText(selectedSpans);
063 if (selectedText.length() > 30) {
064 selectedText = selectedText.substring(0, 30) + "...";
065 }
066 annotationText = "<html>create <b>" + selectedFrame.getBrowserText() + "</b> annotation with <b>"
067 + selectedText + "</b></html>";
068 } catch (TextSourceAccessException tsae) {
069 tsae.printStackTrace();
070 }
071 }
072
073 JMenuItem menuItem = new JMenuItem(annotationText);
074 menuItem.addActionListener(new ActionListener() {
075 public void actionPerformed(ActionEvent actionEvent) {
076 manager.createAnnotation((Instance) selectedFrame);
077 }
078 });
079 return menuItem;
080 }
081 return null;
082 }
083
084 public static JMenuItem createFastAnnotateMenuItem(final KnowtatorManager manager, final Frame selectedFrame) {
085 Frame fastAnnotateFrame = manager.getFastAnnotateFrame();
086 JMenuItem fastAnnotateMenuItem = null;
087 fastAnnotateMenuItem = new JMenuItem("<html>fast annotate with <b>" + selectedFrame.getBrowserText()
088 + "</b></html>");
089 fastAnnotateMenuItem.addActionListener(new ActionListener() {
090 public void actionPerformed(ActionEvent actionEvent) {
091 manager.startFastAnnotate(selectedFrame);
092 }
093 });
094
095 return fastAnnotateMenuItem;
096 }
097
098 /**
099 * Creates and returns the menu item that will remove the selected class
100 * (button) from the fast annotation toolbar.
101 *
102 * @param manager
103 * @param selectedFrame
104 * The class that will be removed from the fast annotate toolbar.
105 *
106 * @return The menu item that will remove the class from the toolbar
107 */
108 public static JMenuItem createRemoveClsFromToolbarMenuItem(final KnowtatorManager manager, final Frame selectedFrame) {
109 JMenuItem removeClsMenuItem = new JMenuItem("<html>remove <b>" + selectedFrame.getBrowserText()
110 + "</b> from fast annotate toolbar</html>");
111 removeClsMenuItem.addActionListener(new ActionListener() {
112 public void actionPerformed(ActionEvent actionEvent) {
113 manager.removeFastAnnotateFrame(selectedFrame);
114 }
115 });
116 return removeClsMenuItem;
117 }
118
119 public static List<JMenuItem> createSelectAnnotationMenuItems(final KnowtatorManager manager,
120 final Frame selectedFrame, final Component parent) {
121 List<JMenuItem> selectAnnotationMenuItems = new ArrayList<JMenuItem>();
122
123 final List<SimpleInstance> clsAnnotations = new ArrayList<SimpleInstance>(manager
124 .getCurrentAnnotationsForFrame(selectedFrame));
125
126 boolean showMoreItem = false;
127
128 if (clsAnnotations != null && clsAnnotations.size() > 0) {
129 // SimpleInstance selectedAnnotation =
130 // manager.getLastSelectedAnnotation();
131
132 Comparator<SimpleInstance> annotationComparator = manager.getSpanUtil().comparator(
133 manager.getBrowserTextUtil().comparator());
134 Collections.sort(clsAnnotations, annotationComparator);
135
136 List<SimpleInstance> filteredAnnotations = new ArrayList<SimpleInstance>();
137
138 boolean belowVisibleRange = false;
139 for (SimpleInstance annotation : clsAnnotations) {
140 if (manager.isAnnotationVisible(annotation)) {
141 filteredAnnotations.add(annotation);
142 belowVisibleRange = true;
143 } else if (belowVisibleRange)
144 filteredAnnotations.add(annotation);
145 }
146
147 //this could happen if none of the annotations are visible - e.g. because they are all spanless
148 //or above the visible range. We will only add the spanless annotations here because we do not want the
149 //screen jumping around on us.
150 if(filteredAnnotations.size() == 0) {
151 for (SimpleInstance annotation : clsAnnotations) {
152 List<Span> spans = manager.getAnnotationUtil().getSpans(annotation);
153 if(spans == null || spans.size() == 0) {
154 filteredAnnotations.add(annotation);
155 }
156 }
157 }
158
159 filteredAnnotations = filteredAnnotations.subList(0, Math.min(filteredAnnotations.size(),
160 SELECTION_ITEMS_COUNT_THRESHOLD));
161 if (filteredAnnotations.size() < clsAnnotations.size())
162 showMoreItem = true;
163
164 JMenuItem selectAnnotationMenuItem;
165
166 if (showMoreItem) {
167 selectAnnotationMenuItem = new JMenuItem("more ...");
168 selectAnnotationMenuItem.addActionListener(new ActionListener() {
169 public void actionPerformed(ActionEvent actionEvent) {
170 List<SimpleInstance> chosenAnnotations = AnnotationPicker.pickAnnotationsFromCollection(parent,
171 manager, clsAnnotations, "select annotation of type '" + selectedFrame + "'");
172 if (chosenAnnotations.size() > 0)
173 manager.setSelectedAnnotation(chosenAnnotations.get(0));
174 }
175 });
176 selectAnnotationMenuItems.add(selectAnnotationMenuItem);
177 }
178
179 // TODO add the 20 closest annotations to the most recently selected
180 // annotation.
181 for (int i = 0; i < filteredAnnotations.size(); i++) {
182 final SimpleInstance annotation = filteredAnnotations.get(i);
183 selectAnnotationMenuItem = new JMenuItem("select: "
184 + manager.getBrowserTextUtil().getBrowserText(annotation, 30));
185 selectAnnotationMenuItem.addActionListener(new ActionListener() {
186 public void actionPerformed(ActionEvent actionEvent) {
187 manager.setSelectedAnnotation(annotation);
188 }
189 });
190 selectAnnotationMenuItem.addMouseListener(new MouseAdapter() {
191 public void mouseEntered(MouseEvent event) {
192 manager.getTextPane().highlightAnnotationTemp(annotation);
193 manager.setNotifyText(manager.getBrowserTextUtil().getBrowserText(annotation));
194 }
195
196 public void mouseExited(MouseEvent event) {
197 manager.refreshAnnotationsDisplay(true);
198 }
199 });
200 selectAnnotationMenuItems.add(selectAnnotationMenuItem);
201 }
202 }
203 return selectAnnotationMenuItems;
204 }
205 }
206
207 // if(selectedAnnotation != null)
208 // {
209 // Comparator<SimpleInstance> positionComparator =
210 // manager.getPositionComparator(selectedAnnotation);
211 // Collections.sort(clsAnnotations, positionComparator);
212 // while(clsAnnotations.size() > SELECTION_ITEMS_COUNT_THRESHOLD)
213 // clsAnnotations.remove(SELECTION_ITEMS_COUNT_THRESHOLD);
214 // }
215