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
029 /**
030 * 8/16/2005 pvo modified handleAddAction such that a message dialog appears if
031 * there is no span selected instructing the user to select a span
032 * of text before clicking the add button.
033 */
034
035 package edu.uchsc.ccp.knowtator;
036
037 import java.util.ArrayList;
038 import java.util.Collection;
039 import java.util.HashSet;
040 import java.util.List;
041 import java.util.Set;
042
043 import javax.swing.JOptionPane;
044
045 import edu.stanford.smi.protege.model.SimpleInstance;
046 import edu.stanford.smi.protege.widget.StringListWidget;
047 import edu.uchsc.ccp.knowtator.textsource.TextSourceAccessException;
048
049 public class SpanWidget extends StringListWidget {
050 static final long serialVersionUID = 0;
051
052 KnowtatorManager manager;
053
054 KnowtatorProjectUtil kpu;
055
056 AnnotationUtil annotationUtil;
057
058 public void initialize() {
059 super.initialize();
060 manager = (KnowtatorManager) getKnowledgeBase().getClientInformation(Knowtator.KNOWTATOR_MANAGER);
061 kpu = manager.getKnowtatorProjectUtil();
062 annotationUtil = manager.getAnnotationUtil();
063 }
064
065 protected void handleCreateAction() {
066 handleAddAction();
067 }
068
069 private List<Span> getIntersectingSpans(Span span, List<Span> spans) {
070 List<Span> returnValues = new ArrayList<Span>();
071 for (Span spn : spans) {
072 if (spn.intersects(span)) {
073 returnValues.add(spn);
074 }
075 }
076 return returnValues;
077 }
078
079 protected void handleAddAction() {
080 try {
081 SimpleInstance annotation = (SimpleInstance) getInstance();
082 List<Span> selectedSpans = manager.getSelectedSpans();
083
084 if (selectedSpans.size() > 0) {
085 List<Span> newSpans = new ArrayList<Span>();
086 Set<Span> retiredSpans = new HashSet<Span>();
087 List<Span> currentSpans = annotationUtil.getSpans(annotation);
088 for (Span selectedSpan : selectedSpans) {
089 List<Span> intersectingSpans = getIntersectingSpans(selectedSpan, currentSpans);
090 if (intersectingSpans.size() > 0) {
091 Span mergedSpan = selectedSpan;
092 for (Span intersectingSpan : intersectingSpans) {
093 mergedSpan = Span.merge(mergedSpan, intersectingSpan);
094 }
095 newSpans.add(mergedSpan);
096 retiredSpans.addAll(intersectingSpans);
097 } else {
098 newSpans.add(selectedSpan);
099 }
100 }
101
102 List<Span> spans = new ArrayList<Span>();
103 for (Span currentSpan : currentSpans) {
104 if (!retiredSpans.contains(currentSpan)) {
105 spans.add(currentSpan);
106 }
107 }
108 spans.addAll(newSpans);
109 annotationUtil.setSpans(annotation, spans, null);
110 manager.refreshAnnotationsDisplay(true);
111 } else {
112 JOptionPane.showMessageDialog(null,
113 "Select a span of text in the text viewer before clicking the 'add span' button.",
114 "Select Span First", JOptionPane.INFORMATION_MESSAGE);
115 }
116 } catch (InvalidSpanException ise) {
117 JOptionPane.showMessageDialog(this, "Annotation has an invalid span value: " + ise.getMessage(),
118 "Invalid span", JOptionPane.ERROR_MESSAGE);
119 } catch (TextSourceAccessException tsae) {
120 JOptionPane.showMessageDialog(null, "There was a problem retrieving the text from the text source: "
121 + tsae.getMessage(), "Text Source Error", JOptionPane.ERROR_MESSAGE);
122 }
123 }
124
125 protected void handleRemoveAction(Collection instances) {
126 try {
127 super.handleRemoveAction(instances);
128 annotationUtil.setSpans((SimpleInstance) getInstance(), annotationUtil.getSpans(
129 (SimpleInstance) getInstance(), true), null);
130 manager.refreshAnnotationsDisplay(true);
131 } catch (InvalidSpanException ise) {
132 JOptionPane.showMessageDialog(this, "Annotation has an invalid span value: " + ise.getMessage(),
133 "Invalid span", JOptionPane.ERROR_MESSAGE);
134 } catch (TextSourceAccessException tsae) {
135 JOptionPane.showMessageDialog(null, "There was a problem retrieving the text from the text source: "
136 + tsae.getMessage(), "Text Source Error", JOptionPane.ERROR_MESSAGE);
137 }
138
139 }
140
141 public int[] getSelectedIndices() {
142 return getList().getSelectedIndices();
143 }
144
145 public void setSelectedIndices(int[] selectedIndices) {
146 getList().setSelectedIndices(selectedIndices);
147 }
148
149 @Override
150 protected void handleViewAction(String str) {
151 return;
152 }
153
154 }