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;
030    
031    import java.util.ArrayList;
032    import java.util.Collections;
033    import java.util.Comparator;
034    import java.util.Iterator;
035    
036    import edu.stanford.smi.protege.model.Cls;
037    import edu.stanford.smi.protege.model.SimpleInstance;
038    import edu.stanford.smi.protege.model.Slot;
039    import edu.stanford.smi.protege.widget.ClsWidget;
040    import edu.stanford.smi.protege.widget.SlotWidget;
041    import edu.stanford.smi.protegex.widget.contains.ContainsWidget;
042    
043    /**
044     * This class is a simple extension of the ContainsWidget that simply overrides
045     * the setValues method so that the slot mentions of a class mention or instance
046     * mention will always be in a predictable order - rather than a random order(!)
047     * The order of the slots is currently alphabetical by the slot name. Preference
048     * is given to the slot's form label as it appears in the mentioned classes slot
049     * widget as configured in the Forms tab.
050     * 
051     * @author Philip V. Ogren
052     */
053    public class SlotMentionWidget extends ContainsWidget {
054    
055            static final long serialVersionUID = 0;
056    
057            MentionUtil mentionUtil;
058    
059            SlotMentionComparator slotMentionComparator;
060    
061            public void initialize() {
062                    KnowtatorManager manager = (KnowtatorManager) getKnowledgeBase().getClientInformation(
063                                    Knowtator.KNOWTATOR_MANAGER);
064                    mentionUtil = manager.getMentionUtil();
065                    slotMentionComparator = new SlotMentionComparator();
066                    super.initialize();
067            }
068    
069            public void setValues(java.util.Collection values) {
070                    ArrayList<SimpleInstance> sortedValues = new ArrayList<SimpleInstance>();
071                    Iterator valuesIterator = values.iterator();
072                    while (valuesIterator.hasNext()) {
073                            sortedValues.add((SimpleInstance) valuesIterator.next());
074                    }
075    
076                    Collections.sort(sortedValues, slotMentionComparator);
077    
078                    super.setValues(sortedValues);
079            }
080    
081            public class SlotMentionComparator implements Comparator<SimpleInstance> {
082    
083                    public int compare(SimpleInstance mention1, SimpleInstance mention2) {
084                            if (mentionUtil.isSlotMention(mention1) && mentionUtil.isSlotMention(mention2)) {
085                                    Slot slot1 = mentionUtil.getSlotMentionSlot(mention1);
086                                    Slot slot2 = mentionUtil.getSlotMentionSlot(mention2);
087    
088                                    if (slot1 == null && slot2 == null)
089                                            return 0;
090                                    if (slot1 == null)
091                                            return 1;
092                                    if (slot2 == null)
093                                            return -1;
094    
095                                    String mentionLabel1 = null;
096                                    String mentionLabel2 = null;
097    
098                                    try {
099                                            SimpleInstance mentionedByMention = mentionUtil.getMentionedBy(mention1);
100                                            Cls mentionCls = mentionUtil.getMentionCls(mentionedByMention);
101                                            ClsWidget clsWidget = getProject().getDesignTimeClsWidget(mentionCls);
102                                            SlotWidget slotWidget = clsWidget.getSlotWidget(slot1);
103                                            mentionLabel1 = slotWidget.getLabel();
104                                    } catch (Exception e) {
105                                    }
106    
107                                    if (mentionLabel1 == null)
108                                            mentionLabel1 = slot1.getBrowserText();
109    
110                                    try {
111                                            SimpleInstance mentionedByMention = mentionUtil.getMentionedBy(mention2);
112                                            Cls mentionCls = mentionUtil.getMentionCls(mentionedByMention);
113                                            ClsWidget clsWidget = getProject().getDesignTimeClsWidget(mentionCls);
114                                            SlotWidget slotWidget = clsWidget.getSlotWidget(slot2);
115                                            mentionLabel2 = slotWidget.getLabel();
116                                    } catch (Exception e) {
117                                    }
118    
119                                    if (mentionLabel2 == null)
120                                            mentionLabel2 = slot2.getBrowserText();
121    
122                                    return mentionLabel1.compareTo(mentionLabel2);
123                            }
124                            return 0;
125                    }
126            }
127    
128    }