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.BorderLayout;
031    import java.awt.Component;
032    import java.awt.Dimension;
033    import java.awt.Point;
034    import java.awt.event.MouseEvent;
035    import java.awt.event.MouseMotionListener;
036    import java.util.ArrayList;
037    import java.util.Collection;
038    import java.util.Collections;
039    import java.util.List;
040    
041    import javax.swing.JComponent;
042    import javax.swing.JList;
043    import javax.swing.JScrollPane;
044    import javax.swing.ListCellRenderer;
045    import javax.swing.ListSelectionModel;
046    import javax.swing.event.ListSelectionEvent;
047    import javax.swing.event.ListSelectionListener;
048    
049    import org.apache.log4j.Logger;
050    
051    import edu.stanford.smi.protege.model.SimpleInstance;
052    import edu.stanford.smi.protege.ui.ListFinder;
053    import edu.stanford.smi.protege.util.Assert;
054    import edu.stanford.smi.protege.util.ComponentFactory;
055    import edu.stanford.smi.protege.util.ComponentUtilities;
056    import edu.uchsc.ccp.knowtator.AnnotationUtil;
057    import edu.uchsc.ccp.knowtator.DisplayColors;
058    import edu.uchsc.ccp.knowtator.KnowtatorManager;
059    
060    /**
061     * The following code was copied and modified from
062     * edu.stanford.smi.protege.ui.DisplayUtilities written by the Protege team.
063     */
064    
065    public class AnnotationPicker extends JComponent implements MouseMotionListener, ListSelectionListener {
066            static final long serialVersionUID = 0;
067    
068            Logger logger = Logger.getLogger(AnnotationPicker.class);
069    
070            private JList _list;
071    
072            List<SimpleInstance> annotations;
073    
074            int mouseOverIndex = -1;
075    
076            ListCellRenderer renderer;
077    
078            KnowtatorManager manager;
079    
080            DisplayColors displayColors;
081    
082            AnnotationUtil annotationUtil;
083    
084            public AnnotationPicker(KnowtatorManager manager, List<SimpleInstance> annotations, boolean allowMultipleSelection) {
085                    this.manager = manager;
086                    displayColors = manager.getDisplayColors();
087                    annotationUtil = manager.getAnnotationUtil();
088    
089                    renderer = manager.getRenderer();
090    
091                    this.annotations = annotations;
092                    // Collections.sort(slotList, new FrameComparator());
093                    _list = ComponentFactory.createList(ModalDialog.getCloseAction(this));
094                    _list.setListData(annotations.toArray());
095                    _list.setCellRenderer(renderer);
096                    _list.addMouseMotionListener(this);
097                    _list.addListSelectionListener(this);
098                    if (!allowMultipleSelection)
099                            _list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
100                    setLayout(new BorderLayout());
101                    add(new JScrollPane(_list), BorderLayout.CENTER);
102                    add(new ListFinder(_list, "Find"), BorderLayout.SOUTH);
103                    setPreferredSize(new Dimension(300, 300));
104            }
105    
106            public Collection getSelection() {
107                    return ComponentUtilities.getSelection(_list);
108            }
109    
110            public void mouseDragged(MouseEvent e) {
111            }
112    
113            public void mouseMoved(MouseEvent e) {
114                    if (_list.getSelectedIndex() != -1)
115                            return;
116                    Point p = e.getPoint();
117                    int index = _list.locationToIndex(p);
118                    if (index != mouseOverIndex) {
119                            mouseOverIndex = index;
120                            SimpleInstance annotation = (SimpleInstance) annotations.get(index);
121                            manager.getTextPane().highlightAnnotationTemp(annotation);
122                    }
123            }
124    
125            public void valueChanged(ListSelectionEvent arg0) {
126                    int index = _list.getSelectedIndex();
127                    if (index != mouseOverIndex) {
128                            mouseOverIndex = index;
129                            SimpleInstance annotation = (SimpleInstance) annotations.get(index);
130                            manager.getTextPane().highlightAnnotationTemp(annotation);
131                    }
132            }
133    
134            public static List<SimpleInstance> pickAnnotationsFromCollection(Component component, KnowtatorManager manager,
135                            List<SimpleInstance> annotations, String label) {
136                    return pickAnnotationsFromCollection(component, manager, annotations, label, true);
137            }
138    
139            public static List<SimpleInstance> pickAnnotationsFromCollection(Component component, KnowtatorManager manager,
140                            List<SimpleInstance> annotations, String label, boolean allowMultipleSelection) {
141                    AnnotationPicker panel = new AnnotationPicker(manager, annotations, allowMultipleSelection);
142    
143                    Collection pickedAnnotations = Collections.EMPTY_LIST;
144                    int result = ModalDialog.showDialog(component, panel, label, ModalDialog.MODE_OK_CANCEL, null);
145                    switch (result) {
146                    case ModalDialog.OPTION_OK:
147                            pickedAnnotations = panel.getSelection();
148                            break;
149                    case ModalDialog.OPTION_CANCEL:
150                            break;
151                    default:
152                            Assert.fail("bad result: " + result);
153                    }
154                    List<SimpleInstance> returnValues = new ArrayList<SimpleInstance>();
155                    for (Object obj : pickedAnnotations) {
156                            returnValues.add((SimpleInstance) obj);
157                    }
158                    return returnValues;
159            }
160    
161    }