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    package edu.uchsc.ccp.knowtator.ui;
030    
031    import java.util.ArrayList;
032    import java.util.Collection;
033    import java.util.List;
034    
035    import edu.stanford.smi.protege.model.Project;
036    import edu.stanford.smi.protege.model.SimpleInstance;
037    import edu.stanford.smi.protege.ui.InstanceDisplay;
038    import edu.stanford.smi.protege.util.CollectionUtilities;
039    import edu.stanford.smi.protege.widget.ClsWidget;
040    import edu.stanford.smi.protege.widget.SlotWidget;
041    import edu.uchsc.ccp.knowtator.InvalidSpanException;
042    import edu.uchsc.ccp.knowtator.KnowtatorProjectUtil;
043    import edu.uchsc.ccp.knowtator.Span;
044    import edu.uchsc.ccp.knowtator.SpanWidget;
045    import edu.uchsc.ccp.knowtator.event.EventHandler;
046    import edu.uchsc.ccp.knowtator.event.SelectedAnnotationChangeEvent;
047    import edu.uchsc.ccp.knowtator.event.SelectedAnnotationChangeListener;
048    
049    public class AnnotationInstanceDisplay extends InstanceDisplay implements SelectedAnnotationChangeListener
050    
051    {
052            KnowtatorProjectUtil kpu;
053    
054            Project project;
055    
056            public AnnotationInstanceDisplay(KnowtatorProjectUtil kpu, Project project) {
057                    super(project);
058                    this.kpu = kpu;
059                    this.project = project;
060                    EventHandler.getInstance().addSelectedAnnotationChangeListener(this);
061            }
062    
063            public AnnotationInstanceDisplay(KnowtatorProjectUtil kpu, Project project, boolean showHeader,
064                            boolean showHeaderLabel) {
065                    super(project, showHeader, showHeaderLabel);
066                    this.kpu = kpu;
067                    this.project = project;
068                    EventHandler.getInstance().addSelectedAnnotationChangeListener(this);
069            }
070    
071            /**
072             * Returns a list Span objects corresponding to the span strings selected in
073             * the span widget If there are no spans selected, then the first span
074             * listed in the span widget is returned.
075             */
076            public List<Span> getSelectedSpans() throws InvalidSpanException {
077                    List<Span> spans = new ArrayList<Span>();
078                    ClsWidget clsWidget = getFirstClsWidget(); // getCurrentClsWidget();
079                    SlotWidget slotWidget = clsWidget.getSlotWidget(kpu.getAnnotationSpanSlot());
080                    SpanWidget spanWidget = (SpanWidget) slotWidget;
081    
082                    // spanWidget.addSelectionListener(listener)
083    
084                    try {
085                            Collection<String> spanStrings = (Collection<String>) spanWidget.getSelection();
086                            for (String spanString : spanStrings) {
087                                    Span span = Span.parseSpan(spanString);
088                                    spans.add(span);
089                            }
090                            if (spans.size() == 0) {
091                                    String spanString = (String) CollectionUtilities.getFirstItem(spanWidget.getValues());
092                                    if (spanString != null) {
093                                            Span span = Span.parseSpan(spanString);
094                                            spans.add(span);
095                                    }
096                            }
097                    } catch (ClassCastException cce) {
098                            throw new InvalidSpanException(cce.getMessage());
099                    }
100                    return spans;
101            }
102    
103            public int[] getSelectedSpanIndices() throws InvalidSpanException {
104                    ClsWidget clsWidget = getFirstClsWidget(); // getCurrentClsWidget();
105                    SlotWidget slotWidget = clsWidget.getSlotWidget(kpu.getAnnotationSpanSlot());
106                    SpanWidget spanWidget = (SpanWidget) slotWidget;
107                    return spanWidget.getSelectedIndices();
108            }
109    
110            public void setSelectedSpanIndices(int[] selectedSpanIndices) {
111                    ClsWidget clsWidget = getFirstClsWidget(); // getCurrentClsWidget();
112                    SlotWidget slotWidget = clsWidget.getSlotWidget(kpu.getAnnotationSpanSlot());
113                    SpanWidget spanWidget = (SpanWidget) slotWidget;
114                    spanWidget.setSelectedIndices(selectedSpanIndices);
115            }
116    
117            public void annotationSelectionChanged(SelectedAnnotationChangeEvent sace) {
118                    SimpleInstance annotation = sace.getSelectedAnnotation();
119                    setInstance(annotation);
120            }
121    }