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: PnlConceptsAndInstancesTree.java
017     * 26/02/2007
018     */
019    
020    package es.ucm.fdi.gaia.ontobridge.test.gui;
021    
022    import java.awt.BorderLayout;
023    import java.awt.Color;
024    import java.awt.Component;
025    import java.awt.event.ActionEvent;
026    import java.awt.event.ActionListener;
027    import java.util.Iterator;
028    
029    import javax.swing.BorderFactory;
030    import javax.swing.Icon;
031    import javax.swing.JButton;
032    import javax.swing.JCheckBox;
033    import javax.swing.JPanel;
034    import javax.swing.JScrollPane;
035    import javax.swing.JTree;
036    import javax.swing.border.Border;
037    import javax.swing.event.TreeSelectionEvent;
038    import javax.swing.event.TreeSelectionListener;
039    import javax.swing.tree.DefaultMutableTreeNode;
040    import javax.swing.tree.DefaultTreeCellRenderer;
041    import javax.swing.tree.DefaultTreeModel;
042    import javax.swing.tree.TreeSelectionModel;
043    
044    import es.ucm.fdi.gaia.ontobridge.OntoBridge;
045    
046    
047    /**
048     * Shows concepts, defined and inferred instances and allows to select one.
049     * @author Juan Ant. Recio García
050     */
051    public class PnlSelectInstance extends JPanel  implements TreeSelectionListener{
052    
053            private static final long serialVersionUID = 1L;
054            
055            private JTree ontologyTree;
056            private DefaultMutableTreeNode root;
057            private JCheckBox inferredInstancesCB;
058            private JButton update;
059            private java.util.ArrayList<String> _instances = new java.util.ArrayList<String>();
060            private OntoBridge ob;
061            
062            private static int maxdepth = 20; //Constant to avoid cycles;
063            private static Icon CONCEPT  = new javax.swing.ImageIcon(PnlSelectInstance.class.getResource("/es/ucm/fdi/gaia/ontobridge/test/gui/class-orange.gif"));      
064            private static Icon INSTANCE = new javax.swing.ImageIcon(PnlSelectInstance.class.getResource("/es/ucm/fdi/gaia/ontobridge/test/gui/instance.gif"));      
065            
066            /**
067             * Constructor
068             */
069            public PnlSelectInstance(OntoBridge ob) {
070                    super();
071                    createComponents();
072                    this.ob = ob;
073                    readOntology();
074            }
075    
076            /**
077             * Constructor
078             */
079            public PnlSelectInstance(OntoBridge ob, boolean inferenceEnabled) {
080                    super();
081                    createComponents();
082                    this.inferredInstancesCB.setSelected(inferenceEnabled);
083                    this.ob = ob;
084                    readOntology();
085            }
086            
087            protected void createComponents(){
088                    JScrollPane scrPnl;
089                    Border lineBorder, titleBorder, emptyBorder, compoundBorder;
090                    
091                    //set border and layout
092                    emptyBorder = BorderFactory.createEmptyBorder(0, 5, 0, 5);
093                    lineBorder = BorderFactory.createLineBorder(Color.BLACK);
094                    titleBorder = BorderFactory.createTitledBorder(lineBorder, "Ontology Structure");
095                    compoundBorder = BorderFactory.createCompoundBorder(titleBorder,
096                                    emptyBorder);
097                    setBorder(compoundBorder);
098                    
099                    //set Ontology
100                    root= new DefaultMutableTreeNode("Thing");
101    
102                    ontologyTree = new JTree(root);
103                    ontologyTree.setCellRenderer(new MyRenderer());
104                    ontologyTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
105                    ontologyTree.addTreeSelectionListener(this);
106            
107                    scrPnl = new JScrollPane(ontologyTree);
108            scrPnl.setViewportView(ontologyTree);
109                    
110                    setLayout(new BorderLayout());
111                    add(scrPnl,BorderLayout.CENTER);
112                    
113                    JPanel options = new JPanel();
114                    inferredInstancesCB = new JCheckBox("Inferred Instances");
115                    update = new JButton("Update");
116                    options.setLayout(new BorderLayout());
117                    options.add(inferredInstancesCB, BorderLayout.WEST);
118                    options.add(update, BorderLayout.EAST);
119                    add(options, BorderLayout.SOUTH);
120                    
121                    
122                    update.addActionListener(new ActionListener(){
123                            public void actionPerformed(ActionEvent e) {
124                                    readOntology(); 
125                            }
126                    });
127                    
128    
129            }
130    
131            String selectedInstance = null;
132            
133        public void valueChanged(TreeSelectionEvent event) {
134                    Object node = ontologyTree.getLastSelectedPathComponent();
135                    if(node == null)
136                            return;
137                    String selected = node.toString();
138                    if(ob.existsClass(selected))
139                            ontologyTree.getSelectionModel().clearSelection();
140          }
141            
142        
143        public String getSelectedInstance()
144        {
145            return selectedInstance;
146        }
147        
148            /**
149             * Read the ontology classes.
150             * 
151             */
152            protected void readOntology() {
153                    try 
154                    {
155                            root.removeAllChildren();
156                            Iterator<String> rc = ob.listRootClasses();
157                            while(rc.hasNext())
158                            {
159                                    DefaultMutableTreeNode node = createNode(rc.next(), ob, 0);
160                                    root.add(node);
161                            }
162                            ontologyTree.setModel(new DefaultTreeModel(root));
163                    ontologyTree.expandRow(0);
164                    
165                    } catch (Exception e) {
166                            org.apache.commons.logging.LogFactory.getLog(this.getClass()).error(e);
167                    }
168            }
169    
170            
171            private DefaultMutableTreeNode createNode(String nodeName, OntoBridge ob, int depth)
172            {
173                    DefaultMutableTreeNode node = new DefaultMutableTreeNode(ob.getShortName(nodeName));
174                    if(depth > maxdepth)
175                            return node;
176                    
177                            Iterator<String> subClasses = ob.listSubClasses(nodeName, true);
178                            while(subClasses.hasNext())
179                            {
180                                    String subClassName = ob.getShortName(subClasses.next());
181                                    if(!subClassName.equals("owl:Nothing"))
182                                            node.add(createNode(subClassName, ob, depth+1));
183                            }
184                            Iterator<String> instances;
185                            if(this.inferredInstancesCB.isSelected())
186                                    instances = ob.listInstances(nodeName);
187                            else
188                                    instances = ob.listDeclaredInstances(nodeName);
189                            
190                            while(instances.hasNext())
191                            {
192                                    String instanceName = ob.getShortName(instances.next());
193                                    node.add(new DefaultMutableTreeNode(instanceName));
194                                    _instances.add(instanceName);
195                            }       
196                    return node;
197            }
198    
199    
200            class MyRenderer extends DefaultTreeCellRenderer {
201                    private static final long serialVersionUID = 1L;
202                    
203                    public MyRenderer() {
204                    }
205    
206                    public Component getTreeCellRendererComponent(JTree tree, Object value,
207                                    boolean sel, boolean expanded, boolean leaf, int row,
208                                    boolean hasFocus) {
209    
210                                    super.getTreeCellRendererComponent(tree, value, sel, expanded,
211                                                                                                       leaf, row, hasFocus);
212                                    
213                                    try {
214                                            DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode)value;
215                                            if(_instances.contains( dmtn.getUserObject() ))
216                                                    setIcon(INSTANCE);
217                                            else
218                                                    setIcon(CONCEPT);
219                                    } catch (Exception e) {
220                                            org.apache.commons.logging.LogFactory.getLog(this.getClass()).error(e);
221                                    }
222                            
223                                return this;
224                    }
225            }
226    }
227    
228    
229