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