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: PnlConceptsTree.java
017     * 26/02/2007
018     */
019    package es.ucm.fdi.gaia.ontobridge.test.gui;
020    
021    import java.awt.event.MouseAdapter;
022    import java.awt.event.MouseEvent;
023    
024    import javax.swing.BorderFactory;
025    import javax.swing.Icon;
026    import javax.swing.JPanel;
027    import javax.swing.JScrollPane;
028    import javax.swing.JTree;
029    import javax.swing.border.Border;
030    import javax.swing.event.TreeSelectionEvent;
031    import javax.swing.event.TreeSelectionListener;
032    import javax.swing.tree.DefaultMutableTreeNode;
033    import javax.swing.tree.DefaultTreeCellRenderer;
034    import javax.swing.tree.TreePath;
035    import javax.swing.tree.TreeSelectionModel;
036    
037    import java.awt.*;
038    
039    import es.ucm.fdi.gaia.ontobridge.OntoBridge;
040    
041    import java.util.*;
042    
043    
044    /**
045     * Shows the concepts hierarchy of an ontology
046     * @author Juan Ant. Recio García
047     *
048     */
049    public class PnlConceptsTree extends JPanel  implements TreeSelectionListener{
050    
051            private static final long serialVersionUID = 1L;
052            
053            private JTree ontologyTree;
054            private DefaultMutableTreeNode root;
055            
056            private static  Icon CONCEPT = new javax.swing.ImageIcon(PnlConceptsTree.class.getResource("/es/ucm/fdi/gaia/ontobridge/test/gui/class-orange.gif"));
057    
058            
059            private static int maxdepth = 20; //Constant to avoid cycles;
060                  
061    
062            /**
063             * Constructor
064             */
065            public PnlConceptsTree(OntoBridge ob) {
066                    super();
067                    createComponents();
068                    readOntology(ob);
069            }
070    
071            
072        public String getSelectedConcept(){
073            return selectedConcept;
074        }
075        
076        private String selectedConcept = null;
077        
078        public void valueChanged(TreeSelectionEvent event) {
079            selectedConcept = ontologyTree.getLastSelectedPathComponent().toString();
080          }
081    
082            
083            protected void createComponents(){
084                    JScrollPane scrPnl;
085                    Border lineBorder, titleBorder, emptyBorder, compoundBorder;
086                    
087                    //set border and layout
088                    emptyBorder = BorderFactory.createEmptyBorder(0, 5, 0, 5);
089                    lineBorder = BorderFactory.createLineBorder(Color.BLACK);
090                    titleBorder = BorderFactory.createTitledBorder(lineBorder, "Ontology Structure");
091                    compoundBorder = BorderFactory.createCompoundBorder(titleBorder,
092                                    emptyBorder);
093                    setBorder(compoundBorder);
094                    
095                    //set Ontology
096                    root= new DefaultMutableTreeNode("Thing");
097    
098                    ontologyTree = new JTree(root);
099                    ontologyTree.setCellRenderer(new MyRenderer());
100            ontologyTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
101            ontologyTree.addTreeSelectionListener(this);
102            
103            ontologyTree.addMouseListener(new MouseAdapter() {
104                public void mousePressed(MouseEvent e) {
105                    int selRow = ontologyTree.getRowForLocation(e.getX(), e.getY());
106                    TreePath selPath = ontologyTree.getPathForLocation(e.getX(), e.getY());
107                    if(selRow != -1) {
108                            selectedConcept = selPath.toString();
109                    }
110                }
111            });
112            
113                    scrPnl = new JScrollPane(ontologyTree);
114            scrPnl.setViewportView(ontologyTree);
115                    
116                    setLayout(new BorderLayout());
117                    add(scrPnl,BorderLayout.CENTER);
118            }
119            
120            /**
121             * Read the ontology classes.
122             * 
123             */
124            protected void readOntology(OntoBridge ob) {
125                    try 
126                    {
127                            ontologyTree.getModel().getRoot();
128                            Iterator<String> rc = ob.listRootClasses();
129                            while(rc.hasNext())
130                            {
131                                    DefaultMutableTreeNode node = createNode(rc.next(), ob, 0);
132                                    root.add(node);
133                            }
134                    ontologyTree.expandRow(0);
135                    
136                    } catch (Exception e) {
137                            org.apache.commons.logging.LogFactory.getLog(this.getClass()).error(e);
138                    }
139            }
140    
141            
142            private DefaultMutableTreeNode createNode(String nodeName, OntoBridge ob, int depth)
143            {
144                    DefaultMutableTreeNode node = new DefaultMutableTreeNode(ob.getShortName(nodeName));
145                    if(depth > maxdepth)
146                            return node;
147                    
148                            Iterator<String> subClasses = ob.listSubClasses(nodeName, true);
149                            while(subClasses.hasNext())
150                            {
151                                    String subClassName = ob.getShortName(subClasses.next());
152                                    if(!subClassName.equals("owl:Nothing"))
153                                            node.add(createNode(subClassName, ob, depth+1));
154                            }
155    
156                    return node;
157            }
158    
159    
160            class MyRenderer extends DefaultTreeCellRenderer {
161                    private static final long serialVersionUID = 1L;
162                    
163                    public MyRenderer() {
164                    }
165    
166                    public Component getTreeCellRendererComponent(JTree tree, Object value,
167                                    boolean sel, boolean expanded, boolean leaf, int row,
168                                    boolean hasFocus) {
169    
170                                    super.getTreeCellRendererComponent(tree, value, sel, expanded,
171                                                                                                       leaf, row, hasFocus);
172                                    
173                                    try {
174                                            setIcon(CONCEPT);
175                                    } catch (Exception e) {
176                                            org.apache.commons.logging.LogFactory.getLog(this.getClass()).error(e);
177                                    }
178                            
179                                return this;
180                    }
181            }
182    }
183    
184    
185