001    /**
002     * OntoBride library.
003     * GAIA - Group for Artifical Intelligence Applications
004     * Departamento de Ingeniería del Software e Inteligencia Artificial
005     * Universidad Complutense de Madrid
006     * 
007     * Licensed under the terms of the GNU Library or Lesser General Public License (LGPL)
008     *
009     * @author Juan A. Recio García
010     * @version 1.0 beta
011     * 
012     * This software is a subproject of the jCOLIBRI framework
013     * http://sourceforge.net/projects/jcolibri-cbr/
014     * http://gaia.fdi.ucm.es/projects/jcolibri/
015     * 
016     * File: PnlInstancesTree.java
017     * 26/02/2007
018     */
019    package es.ucm.fdi.gaia.ontobridge.test.gui;
020    
021    import javax.swing.BorderFactory;
022    import javax.swing.Icon;
023    import javax.swing.JPanel;
024    import javax.swing.JScrollPane;
025    import javax.swing.JTree;
026    import javax.swing.border.Border;
027    import javax.swing.tree.DefaultMutableTreeNode;
028    import javax.swing.tree.DefaultTreeCellRenderer;
029    import javax.swing.tree.DefaultTreeModel;
030    
031    import java.awt.*;
032    
033    import es.ucm.fdi.gaia.ontobridge.OntoBridge;
034    
035    import java.util.*;
036    
037    
038    /**
039     * Shows the relationships of an instance
040     * @author Juan Ant. Recio García
041     *
042     */
043    public class PnlInstancesTree extends JPanel{
044    
045            private static final long serialVersionUID = 1L;
046            
047            private JTree ontologyTree;
048            private DefaultMutableTreeNode root;
049            
050            private static  Icon INSTANCE = new javax.swing.ImageIcon(PnlInstancesTree.class.getResource("/es/ucm/fdi/gaia/ontobridge/test/gui/instance.gif"));
051            private static  Icon DATATYPE = new javax.swing.ImageIcon(PnlInstancesTree.class.getResource("/es/ucm/fdi/gaia/ontobridge/test/gui/datatype.gif"));
052            private static  Icon PROPERTY = new javax.swing.ImageIcon(PnlInstancesTree.class.getResource("/es/ucm/fdi/gaia/ontobridge/test/gui/property.gif"));
053    
054            
055            private static int maxdepth = 20; //Constant to avoid cycles;
056            private static ArrayList<String> drawnInstances = new ArrayList<String>(); //avoid cycles between instances
057            private static Set<String> datatypes = new java.util.HashSet<String>();    
058    
059            /**
060             * Constructor
061             */
062            public PnlInstancesTree(OntoBridge ob, String instance) {
063                    super();
064                    createComponents(instance);
065                    showInstance(ob, instance);
066            }
067    
068            protected void createComponents(String instance){
069                    JScrollPane scrPnl;
070                    Border lineBorder, titleBorder, emptyBorder, compoundBorder;
071                    
072                    //set border and layout
073                    emptyBorder = BorderFactory.createEmptyBorder(0, 5, 0, 5);
074                    lineBorder = BorderFactory.createLineBorder(Color.BLACK);
075                    titleBorder = BorderFactory.createTitledBorder(lineBorder, "Ontology Structure");
076                    compoundBorder = BorderFactory.createCompoundBorder(titleBorder,
077                                    emptyBorder);
078                    setBorder(compoundBorder);
079                    
080                    //set Ontology
081                    root= new DefaultMutableTreeNode(instance);
082    
083                    ontologyTree = new JTree(root);
084                    ontologyTree.setCellRenderer(new MyRenderer());
085            ontologyTree.setSelectionModel(null);
086            
087                    scrPnl = new JScrollPane(ontologyTree);
088            scrPnl.setViewportView(ontologyTree);
089                    
090                    setLayout(new BorderLayout());
091                    add(scrPnl,BorderLayout.CENTER);
092            }
093            
094            /**
095             * Read the ontology classes.
096             * 
097             */
098            protected void showInstance(OntoBridge ob, String instance) {
099                    try 
100                    {
101                            ontologyTree.setModel(new DefaultTreeModel(createNode(instance, ob, 0)));
102                    ontologyTree.expandRow(0);
103                    
104                    } catch (Exception e) {
105                            org.apache.commons.logging.LogFactory.getLog(this.getClass()).error(e);
106                    }
107            }
108    
109            
110            private DefaultMutableTreeNode createNode(String nodeName, OntoBridge ob, int depth)
111            {
112                    DefaultMutableTreeNode node = new DefaultMutableTreeNode(ob.getShortName(nodeName));
113                    if(depth > maxdepth)
114                            return node;
115                    if(drawnInstances.contains(ob.getShortName(nodeName)))
116                            return node;
117                    
118                    drawnInstances.add(ob.getShortName(nodeName));
119                    ArrayList<String> properties = new ArrayList<String>();
120                    ArrayList<String> values = new ArrayList<String>();
121                    ob.listInstancePropertiesValues(nodeName, properties, values);
122                    Iterator<String> propI = properties.iterator();
123                    Iterator<String>  valI = values.iterator();
124                    while(propI.hasNext())
125                    {
126                            String property = propI.next();
127                            String value = valI.next();
128                            DefaultMutableTreeNode propnode = new DefaultMutableTreeNode(ob.getShortName(property));
129                            node.add(propnode);
130                            if(ob.isOntoProperty(property))
131                                    propnode.add(createNode(value, ob, depth+1));
132                            else
133                            {
134                                    propnode.add(new DefaultMutableTreeNode(value));
135                                    datatypes.add(value);
136                            }
137                    }
138    
139                    return node;
140            }
141    
142    
143            class MyRenderer extends DefaultTreeCellRenderer {
144                    private static final long serialVersionUID = 1L;
145                    
146                    public MyRenderer() {
147                    }
148    
149                    public Component getTreeCellRendererComponent(JTree tree, Object value,
150                                    boolean sel, boolean expanded, boolean leaf, int row,
151                                    boolean hasFocus) {
152    
153                                    super.getTreeCellRendererComponent(tree, value, sel, expanded,
154                                                                                                       leaf, row, hasFocus);
155                                    
156                                    try {
157                                            DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode)value;
158                                            Object o = dmtn.getUserObject();
159                                            if(datatypes.contains(o))
160                                                    setIcon(DATATYPE);
161                                            else if(drawnInstances.contains(o))
162                                                    setIcon(INSTANCE);
163                                            else
164                                                    setIcon(PROPERTY);
165                                    } catch (Exception e) {
166                                            org.apache.commons.logging.LogFactory.getLog(this.getClass()).error(e);
167                                    }
168                            
169                                return this;
170                    }
171            }
172            
173    }
174    
175    
176