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.awt.Color;
032    import java.util.Collection;
033    import java.util.HashMap;
034    import java.util.List;
035    import java.util.Map;
036    
037    import javax.swing.Icon;
038    
039    import org.annotation.gui.SwatchIcon;
040    
041    import edu.stanford.smi.protege.event.FrameAdapter;
042    import edu.stanford.smi.protege.event.FrameEvent;
043    import edu.stanford.smi.protege.model.Cls;
044    import edu.stanford.smi.protege.model.Frame;
045    import edu.stanford.smi.protege.model.Instance;
046    import edu.stanford.smi.protege.model.KnowledgeBase;
047    import edu.stanford.smi.protege.model.SimpleInstance;
048    import edu.stanford.smi.protege.model.Slot;
049    import edu.stanford.smi.protege.util.CollectionUtilities;
050    
051    public class DisplayColors {
052            public static final Color DEFAULT_ANNOTATION_COLOR = new Color(128, 128, 128);
053    
054            public static final Icon DEFAULT_ICON = new SwatchIcon(10, 10, DEFAULT_ANNOTATION_COLOR);
055    
056            KnowtatorManager manager;
057    
058            KnowtatorProjectUtil kpu;
059    
060            KnowledgeBase kb;
061    
062            MentionUtil mentionUtil;
063    
064            AnnotationUtil annotationUtil;
065    
066            Map<Frame, Color> clsColorMap;
067    
068            Map<Color, Icon> colorIconMap;
069    
070            static Map<Color, Color> backgroundColors = new HashMap<Color, Color>();
071    
072            /** Creates a new instance of DisplayColors */
073            public DisplayColors(KnowtatorManager manager) {
074                    this.manager = manager;
075                    this.kpu = manager.getKnowtatorProjectUtil();
076                    this.kb = manager.getKnowledgeBase();
077                    this.mentionUtil = manager.getMentionUtil();
078                    this.annotationUtil = manager.getAnnotationUtil();
079    
080                    clsColorMap = new HashMap<Frame, Color>();
081                    colorIconMap = new HashMap<Color, Icon>();
082    
083                    List<SimpleInstance> colorAssignments = manager.getColorAssignments();
084                    for (SimpleInstance colorAssignment : colorAssignments) {
085                            addAssignment(colorAssignment);
086                    }
087                    initListener();
088            }
089    
090            private void initListener() {
091                    SimpleInstance configuration = ProjectSettings.getActiveConfiguration(kb.getProject());
092                    configuration.addFrameListener(new FrameAdapter() {
093                            public void ownSlotValueChanged(FrameEvent frameEvent) {
094                                    updateColorAssignments(frameEvent.getSlot());
095                            }
096    
097                            public void ownSlotAdded(FrameEvent frameEvent) {
098                                    updateColorAssignments(frameEvent.getSlot());
099                            }
100    
101                            public void ownSlotRemoved(FrameEvent frameEvent) {
102                                    updateColorAssignments(frameEvent.getSlot());
103                            }
104    
105                            private void updateColorAssignments(Slot slot) {
106                                    if (slot.equals(kpu.getColorAssignmentsSlot())) {
107                                            clsColorMap.clear();
108                                            colorIconMap.clear();
109    
110                                            List<SimpleInstance> colorAssignments = manager.getColorAssignments();
111                                            for (SimpleInstance colorAssignment : colorAssignments) {
112                                                    addAssignment(colorAssignment);
113                                            }
114                                    }
115                            }
116                    });
117    
118            }
119    
120            private boolean isColorAssignmentInstance(SimpleInstance colorAssignmentInstance) {
121                    return colorAssignmentInstance.getDirectType().equals(kpu.colorAssignmentCls);
122            }
123    
124            public void addAssignment(SimpleInstance colorAssignmentInstance) {
125                    if (isColorAssignmentInstance(colorAssignmentInstance)) {
126                            try {
127                                    Cls colorClass = (Cls) colorAssignmentInstance.getOwnSlotValue(kpu.colorClassSlot);
128                                    Instance displayColorInstance = (Instance) colorAssignmentInstance
129                                                    .getOwnSlotValue(kpu.displayColorSlot);
130                                    int blue = (Integer) displayColorInstance.getOwnSlotValue(kpu.displayColorBSlot);
131                                    int green = (Integer) displayColorInstance.getOwnSlotValue(kpu.displayColorGSlot);
132                                    int red = (Integer) displayColorInstance.getOwnSlotValue(kpu.displayColorRSlot);
133                                    Color clsColor = new Color(red, green, blue);
134                                    clsColorMap.put(colorClass, clsColor);
135                                    if (!colorIconMap.containsKey(clsColor))
136                                            colorIconMap.put(clsColor, new SwatchIcon(10, 10, clsColor));
137                            } catch (NullPointerException npe) {
138                            }
139                    }
140            }
141    
142            public void addAssignment(Cls assignedCls, SimpleInstance colorInstance) {
143                    SimpleInstance colorAssignment = kb.createSimpleInstance(null, null, CollectionUtilities
144                                    .createCollection(kpu.colorAssignmentCls), true);
145                    colorAssignment.setOwnSlotValue(kpu.colorClassSlot, assignedCls);
146                    colorAssignment.setOwnSlotValue(kpu.displayColorSlot, colorInstance);
147                    addAssignment(colorAssignment);
148            }
149    
150            public Icon getIcon(Color color) {
151                    if (colorIconMap.containsKey(color)) {
152                            return colorIconMap.get(color);
153                    } else {
154                            return DEFAULT_ICON;
155                    }
156            }
157    
158            private Color _getColor(Cls cls) {
159                    Collection<Cls> superClses = (Collection<Cls>) cls.getDirectSuperclasses();
160                    if (superClses == null)
161                            return DEFAULT_ANNOTATION_COLOR;
162                    for (Cls superCls : superClses) {
163                            if (clsColorMap.containsKey(superCls)) {
164                                    return clsColorMap.get(superCls);
165                            }
166                    }
167                    for (Cls superCls : superClses) {
168                            return _getColor(superCls);
169                    }
170                    return DEFAULT_ANNOTATION_COLOR;
171            }
172    
173            public Color getColor(Frame frame) {
174                    try {
175                            if (frame == null)
176                                    return DEFAULT_ANNOTATION_COLOR;
177    
178                            if (clsColorMap.containsKey(frame)) {
179                                    return clsColorMap.get(frame);
180                            } else if (frame instanceof Cls) {
181                                    Color clsColor = _getColor((Cls) frame);
182                                    clsColorMap.put(frame, clsColor);
183                                    return clsColor;
184                            } else if (frame instanceof SimpleInstance) {
185                                    SimpleInstance instance = (SimpleInstance) frame;
186                                    Color frameColor = null;
187                                    if (annotationUtil.isAnnotation(instance)) {
188                                            SimpleInstance annotatedMention = annotationUtil.getMention(instance);
189                                            frameColor = getColor(annotatedMention);
190                                    } else if (mentionUtil.isClassMention(instance) || mentionUtil.isInstanceMention(instance)) {
191                                            Cls mentionCls = mentionUtil.getMentionCls(instance);
192                                            frameColor = getColor(mentionCls);
193                                    } else {
194                                            frameColor = getColor(instance.getDirectType());
195                                    }
196                                    clsColorMap.put(frame, frameColor);
197                                    return frameColor;
198                            }
199                    } catch (NullPointerException npe) {
200                    }
201    
202                    return DEFAULT_ANNOTATION_COLOR;
203            }
204    
205            public static Color getBackgroundColor(Color color) {
206                    if (backgroundColors.containsKey(color))
207                            return backgroundColors.get(color);
208                    int red = color.getRed();
209                    int green = color.getGreen();
210                    int blue = color.getBlue();
211                    red = red + 4 * ((255 - red) / 5);
212                    green = green + 4 * ((255 - green) / 5);
213                    blue = blue + 4 * ((255 - blue) / 5);
214                    Color backgroundColor = new Color(red, green, blue);
215                    backgroundColors.put(color, backgroundColor);
216                    return backgroundColor;
217            }
218    }
219    
220    /**
221     *TODO need to check for existing color assignment for a given class first and
222     * update it if possible rather than always creating a new one.
223     */
224    
225    // public void askForColorAssignment(Component component)
226    // {
227    // Cls rootCls = ProjectSettings.getRootCls(kb.getProject());
228    // Cls cls = DisplayUtilities.pickCls(component,
229    // kb,
230    // CollectionUtilities.createCollection(rootCls),
231    // "Choose class to assign a color to");
232    //    
233    // if(cls != null)
234    // {
235    // Instance colorInstance = DisplayUtilities.pickInstance(component,
236    // CollectionUtilities.createCollection(kpu.displayColorCls),
237    // "Choose color for "+cls.getBrowserText());
238    // if(colorInstance != null)
239    // {
240    // addAssignment(cls, (SimpleInstance) colorInstance);
241    // JOptionPane.showMessageDialog(component,
242    // "Color assignments may not take full effect until project is re-opened."+
243    // "  Color assignments may be deleted under the \"Instances\" tab.","",
244    // JOptionPane.INFORMATION_MESSAGE);
245    // }
246    // }
247    //
248    // }