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