package org.mindswap.swoop.explore; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Panel; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import org.mindswap.swoop.SwoopModel; import org.mindswap.swoop.utils.graph.hierarchy.popup.ClassAxiomContainer; import org.mindswap.swoop.utils.graph.hierarchy.popup.ConcisePlainVisitor; import org.semanticweb.owl.impl.model.OWLClassImpl; import org.semanticweb.owl.impl.model.OWLObjectImpl; import org.semanticweb.owl.io.ShortFormProvider; import org.semanticweb.owl.model.OWLClassAxiom; import org.semanticweb.owl.model.OWLDescription; import org.semanticweb.owl.model.OWLObject; public class ClassExpTable extends JFrame implements WindowListener, ComponentListener, MouseListener { class ClassExpRenderer extends JLabel implements TableCellRenderer { private ConcisePlainVisitor myVisitor; public ClassExpRenderer( ConcisePlainVisitor visitor ) { this.setOpaque( true ); myVisitor = visitor; } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { try { // managing colors if ( isSelected ) { this.setBackground( table.getSelectionBackground() ); this.setForeground( table.getSelectionForeground() ); } else { this.setBackground( table.getSelectionForeground() ); this.setForeground( Color.BLACK ); } OWLDescription desc = (OWLDescription)value; desc.accept( myVisitor ); String str = myVisitor.result(); myVisitor.reset(); this.setText( str ); //System.out.println( this.getText() ); } catch ( Exception e ) { e.printStackTrace(); } return this; } } class RichHeaderRenderer extends JPanel implements TableCellRenderer { private ConcisePlainVisitor myVisitor; private JLabel myLabel = null; private int myColNum; private boolean isInit = false; public RichHeaderRenderer() { super(); setOpaque(true); } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if ( !isInit ) init( table, value, column ); return this; } private void init( JTable table, Object value, int column ) { isInit = true; myLabel = new JLabel( value.toString() ); this.add( myLabel ); myColNum = column; this.setPreferredSize( new Dimension( 200, 50 )); //this.setBackground( Color.LIGHT_GRAY ); } public void paint( Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D)g; g2d.setColor( Color.BLACK ); g2d.drawLine( 0, 0, this.getWidth(), 0 ); // top g2d.drawLine( 0, this.getHeight()-1, this.getWidth(), this.getHeight()-1 ); // bot g2d.drawLine( this.getWidth()-1, 0, this.getWidth()-1, this.getHeight() ); // right if ( myColNum == 0 ) g2d.drawLine( 0, 0, 0, this.getHeight() ); // left } } class ClassExpTableModel extends AbstractTableModel { private String[] myColNames = null; private Object[][] myData = null; public ClassExpTableModel( String [] colNames, Object[][] data ) { myColNames = colNames; myData = data; } public int getColumnCount() { return myColNames.length; } public int getRowCount() { return myData.length; } public String getColumnName(int col) { return myColNames[col]; } public Object getValueAt(int row, int col) { return myData[row][col]; } public Class getColumnClass(int c) { //System.err.println("column class: " + c); return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { return false; } public void setValueAt(Object value, int row, int col) { } } private JTable myTable; private ClassExpTableModel myDataModel; private TableSorter myManipModel; private AxiomIndexer myIndexer; public ClassExpTable( AxiomIndexer indexer, ConcisePlainVisitor visitor, HashedCounts classExpCounts, Hashtable classExpDepths ) { this.myIndexer = indexer; String [] colNames = {"Class Expression", "#Occurences", "Depth", "Score"}; Object [][] data = new Object[classExpCounts.keySet().size() ][4]; int i = 0; for ( Iterator it = classExpCounts.keySet().iterator(); it.hasNext(); ) { OWLDescription desc = (OWLDescription)it.next(); if ( desc == null ) System.out.println("description is null at " + i); Integer count = new Integer( classExpCounts.getCount( desc )); Integer depth = (Integer)classExpDepths.get( desc ); try { if ( depth == null ) { System.out.println(" depth is null at " + i); desc.accept( visitor ); String str = visitor.result(); System.out.println(" [" + str + "]"); visitor.reset(); } } catch ( Exception e ) { e.printStackTrace(); } data[i][0] = desc; data[i][1] = count; data[i][2] = depth; data[i][3] = new Double( Math.pow( count.intValue(), (depth.intValue() + 1) )); i++; } myDataModel = new ClassExpTableModel(colNames , data); myManipModel = new TableSorter( myDataModel ); myTable = new JTable( myManipModel ); myManipModel.setTableHeader( myTable.getTableHeader() ); /* for ( int vColIndex = 0; vColIndex < 3; vColIndex++ ) { TableColumn col = myTable.getColumnModel().getColumn(vColIndex); col.setHeaderRenderer(new RichHeaderRenderer()); } */ myTable.setDefaultRenderer( OWLObjectImpl.class, new ClassExpRenderer(visitor)); setupUI(); this.addWindowListener( this ); this.addComponentListener( this ); myTable.addMouseListener( this ); this.setSize( 300, 600 ); this.setVisible( true ); } private void setupUI() { JScrollPane scrollPane = new JScrollPane( myTable ); myTable.setPreferredScrollableViewportSize(new Dimension(500, 300)); this.add( scrollPane, BorderLayout.CENTER ); } public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) { this.setVisible( false ); this.dispose(); } public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void componentResized(ComponentEvent e) {} public void componentMoved(ComponentEvent e) {} public void componentShown(ComponentEvent e) {} public void componentHidden(ComponentEvent e) {} public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { if ( e.getSource() instanceof JTable ) { JTable table = (JTable)e.getSource(); int row = table.getSelectedRow(); OWLDescription desc = (OWLDescription)table.getValueAt( row, 0 ); Vector axioms = (Vector)myIndexer.classExpToAxioms.get( desc ); Vector axiomContainers = new Vector(); for ( Iterator it = axioms.iterator(); it.hasNext(); ) { OWLClassAxiom axi = (OWLClassAxiom)it.next(); ClassAxiomContainer container = new ClassAxiomContainer( axi, myIndexer.myShortForms, myIndexer.myModel ); axiomContainers.add( container ); } AxiomList view = new AxiomList( "Axioms where selected expression occurs in", axiomContainers ); } } } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} }