package org.jacorb.ir.gui; /* * JacORB - a free Java ORB * * Copyright (C) 1997-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.JTree; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import org.jacorb.ir.gui.typesystem.AbstractContainer; import org.jacorb.ir.gui.typesystem.NodeMapper; import org.jacorb.ir.gui.typesystem.TypeAssociator; import org.jacorb.ir.gui.typesystem.TypeSystem; import org.jacorb.ir.gui.typesystem.TypeSystemNode; import org.jacorb.ir.gui.typesystem.remote.RemoteTypeSystem; /** * @author (c) Joerg von Frantzius, Gerald Brose, FU Berlin */ class IRBrowser extends JFrame implements java.awt.event.WindowListener, java.awt.event.MouseListener, ListSelectionListener, TreeSelectionListener, ActionListener { JTable contentTable; JSplitPane splitPane; JTree treeView; JTextArea textArea; TypeSystem typeSystem; TreeModel treeModel; JMenuItem followTypeMenu; private static final String title = "IRBrowser"; /** * Constructor */ public IRBrowser() { super(); try { typeSystem = new RemoteTypeSystem(); } catch (Exception e) { System.err.println ("Caught exception starting browser"); e.printStackTrace(); System.exit(-1); } initialize(); } /** * @param repositoryIOR java.lang.String */ public IRBrowser (String repositoryIOR) { super(); try { typeSystem = new RemoteTypeSystem(repositoryIOR); } catch (Exception e) { System.err.println ("Caught exception starting browser"); e.printStackTrace(); System.exit(-1); } initialize(); } /** * @param event java.awt.ActionEvent */ public void actionPerformed (java.awt.event.ActionEvent event) { NodeMapper nodeMapper = (NodeMapper)contentTable.getModel().getValueAt(contentTable.getSelectedRow(),0); TypeSystemNode typeSystemNode = nodeMapper.getNode(); followTypeOf(typeSystemNode); System.out.println("following type of "+typeSystemNode); } /** * conn0: (IRBrowser.window.windowClosing(java.awt.event.WindowEvent) --> IRBrowser.dispose()) * @param arg1 java.awt.event.WindowEvent */ private void conn0(java.awt.event.WindowEvent arg1) { try { // user code begin {1} // user code end this.dispose(); // user code begin {2} // user code end } catch (java.lang.Throwable ivjExc) { // user code begin {3} // user code end handleException(ivjExc); } } /** * @param typeSystemNode typesystem.TypeSystemNode */ public void followTypeOf(TypeSystemNode typeSystemNode) { DefaultMutableTreeNode treeNode=null; if ( typeSystemNode instanceof TypeAssociator ) { TypeSystemNode assTypeNode = ((TypeAssociator)typeSystemNode).getAssociatedTypeSystemNode(); if (assTypeNode.getModelRepresentant(treeModel)!=null) { treeNode = (DefaultMutableTreeNode)assTypeNode.getModelRepresentant(treeModel); } } if ( treeNode != null ) { // If Node is an AbstractContainer or has an associated // TypeSystemNode, jump to the corresponding location in treeView DefaultTreeModel treeModel = (DefaultTreeModel)treeView.getModel(); TreePath fullTreePath = new TreePath(treeModel.getPathToRoot(treeNode)); treeView.scrollPathToVisible(fullTreePath); // set selection to node treeView.setSelectionPath(fullTreePath); treeView.validate(); } } /** * Called whenever the part throws an exception. * @param exception java.lang.Throwable */ private void handleException(Throwable exception) { exception.printStackTrace(); } /** * Initializes connections */ private void initConnections() { this.addWindowListener(this); } /** * Initialize class */ public void initialize() { // setBackground(java.awt.Color.lightGray); setTitle(title); splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); // Create the table DefaultTableModel tableModel = typeSystem.getTableModel(null); contentTable = new JTable(tableModel); contentTable.setAutoCreateColumnsFromModel(true); // contentTable.setModel(tableModel); contentTable.setColumnSelectionAllowed(false); contentTable.setRowSelectionAllowed(true); contentTable.setCellSelectionEnabled(false); contentTable.removeEditor(); contentTable.setShowGrid(false); contentTable.setTableHeader(new javax.swing.table.JTableHeader(contentTable.getColumnModel())); contentTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); // contentTable.setBackground(java.awt.Color.white); // contentTable.setMinimumSize(new java.awt.Dimension(100,contentTable.getMinimumSize().height)); contentTable.setMinimumSize(new Dimension(100,100)); contentTable.getSelectionModel().addListSelectionListener(this); this.treeModel = typeSystem.getTreeModel(); // this.treeModel = typeSystem.createTreeModelRoot(); treeView = new JTree(treeModel); // treeView.addTreeExpansionListener(typeSystem.getTreeExpansionListener(this.treeModel)); treeView.setRootVisible(true); treeView.setShowsRootHandles(true); // treeView.setBackground(java.awt.Color.lightGray); // treeView.setMinimumSize(new java.awt.Dimension(200,100)); treeView.setMinimumSize(new Dimension(100,100)); treeView.addTreeSelectionListener(this); JScrollPane tableScrollPane = JTable.createScrollPaneForTable(contentTable); JScrollPane treeScrollPane = new JScrollPane(treeView); // tableScrollPane.setBackground(java.awt.Color.white); tableScrollPane.setMinimumSize(new java.awt.Dimension(100,100)); treeScrollPane.setMinimumSize(new java.awt.Dimension(100,100)); tableScrollPane.setPreferredSize(new java.awt.Dimension(100,100)); treeScrollPane.setPreferredSize(new java.awt.Dimension(100,100)); textArea = new JTextArea("Hallo, hallo!"); textArea.setEditable(false); textArea.setFont(new java.awt.Font("sansserif",java.awt.Font.PLAIN,10)); textArea.setRows(4); textArea.setTabSize(15); textArea.setBorder(BorderFactory.createLoweredBevelBorder()); textArea.setMinimumSize(new java.awt.Dimension(100,100)); textArea.setPreferredSize(new Dimension(600,90)); // textArea.setBackground(java.awt.Color.lightGray); splitPane.setLeftComponent(new JScrollPane(treeView)); splitPane.setRightComponent(tableScrollPane); // splitPane.setRightComponent(new JScrollPane(contentTable)); splitPane.setDividerLocation(300); // Add components Container contentPane = getContentPane(); // contentPane.setBackground(java.awt.Color.lightGray); /* getContentPane().setLayout(new java.awt.BorderLayout()); getContentPane().add(splitPane, java.awt.BorderLayout.NORTH); getContentPane().add(textArea, java.awt.BorderLayout.SOUTH); */ // contentPane.setLayout(new BorderLayout()); /* Container north = new JPanel(); north.setLayout(new SpringLayout()); Container south = new JPanel(); south.setLayout(new SpringLayout()); north.add(splitPane, SpringLayout.HEIGHT_WIDTH_SPRING); south.add(textArea); contentPane.add(north,BorderLayout.NORTH); contentPane.add(south,BorderLayout.SOUTH); */ // contentPane.add(splitPane,"North"); // contentPane.add(textArea,"South"); splitPane.setBounds(0,0,600,400-textArea.getPreferredSize().height); textArea.setBounds(0,splitPane.bounds().height,600,textArea.getPreferredSize().height); // contentPane.setLayout(layout); contentPane.setLayout(new BorderLayout()); contentPane.add("Center",splitPane); // contentPane.add(textArea); contentPane.add("South",textArea); contentPane.setBackground(Color.white); resize(600,400); // contentPane.setBounds(); // JPopupMenu popup = new JPopupMenu(treeView); // popup.add(new JMenuItem("Hallo?")); // popup.addPopupMenuListener(new TreePopupMenuListener()); // treeView.add(popup); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("Navigate"); menuBar.add(menu); followTypeMenu = new JMenuItem("Follow Type"); followTypeMenu.setEnabled(false); followTypeMenu.addActionListener(this); menu.add(followTypeMenu); setJMenuBar(menuBar); validate(); treeView.expandPath(new TreePath(((DefaultMutableTreeNode)treeModel.getRoot()).getPath())); treeView.addMouseListener((MouseListener)this); contentTable.addMouseListener((MouseListener)this); // pack(); // validate(); // validate(); // user code end setName("IRBrowser"); setName("IRBrowser"); initConnections(); // user code begin {2} // user code end } private static void usage() { System.out.println("Usage: IRBrowser [ -i ior_str | -f filename ]"); System.out.println(" Note - if no arguments, will default to using resolve_initial_reference"); } /** * @param args java.lang.String[] */ public static void main(String args[]) { IRBrowser test = null; String ior = null; if( args.length == 1 || args.length > 2 ) { usage(); } else if( args.length == 2 && args[0].equals("-f")) { try { java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader( args[1] ) ); ior = in.readLine(); while (ior.indexOf("IOR:") != 0) ior = in.readLine(); in.close(); } catch ( java.io.IOException io ) { io.printStackTrace(); usage(); } test = new IRBrowser(ior); } else if ( args.length == 2 && args[0].equals("-i")) { test = new IRBrowser(args[1]); } else { test = new IRBrowser(); } test.show(); } public void mouseClicked(MouseEvent event) { javax.swing.tree.DefaultMutableTreeNode treeNode = null; // on double-click on contentTable, set treeView to the corresponding // TypeSystemNode if ( event.getComponent() == contentTable && event.getClickCount() > 1 && contentTable.getSelectedRow() != -1) { System.out.println("contentTable doubleClick"); // In the TableModel there's a NodeMapper in each cell which // can tell us the corresponding treeNode NodeMapper nodeMapper = (NodeMapper)contentTable.getModel().getValueAt(contentTable.getSelectedRow(),0); TypeSystemNode typeSystemNode = nodeMapper.getNode(); if (typeSystemNode instanceof AbstractContainer) { treeNode = (DefaultMutableTreeNode)typeSystemNode.getModelRepresentant(treeModel); } if (typeSystemNode instanceof TypeAssociator) { TypeSystemNode assTypeNode = ((TypeAssociator)typeSystemNode).getAssociatedTypeSystemNode(); if (assTypeNode.getModelRepresentant(treeModel) != null) { treeNode = (DefaultMutableTreeNode)assTypeNode.getModelRepresentant(treeModel); } } if ( treeNode!=null ) { // if Node is an AbstractContainer or has an associated // TypeSystemNode, jump to it in the treeView System.out.println("expanding Tree: "+treeNode); DefaultTreeModel treeModel = (DefaultTreeModel)treeView.getModel(); TreePath fullTreePath = new TreePath(treeModel.getPathToRoot(treeNode)); treeView.scrollPathToVisible(fullTreePath); // Selection auf node setzen treeView.setSelectionPath(fullTreePath); treeView.validate(); } } } public void mouseEntered(MouseEvent event) {} public void mouseExited(MouseEvent event){} public void mousePressed(MouseEvent event){} public void mouseReleased(MouseEvent event){} /** * Set the title of the Frame and enable/disable menus according * to the selected Node (could have been selected in TableView * or in TreeView). * @param node typesystem.TypeSystemNode */ public void setSelectedNode (TypeSystemNode node ) { // Node could have been selected in TableView or TreeView setTitle(title + " - " + node.getAbsoluteName()); textArea.setText(node.description()); if (node instanceof TypeAssociator) { followTypeMenu.setEnabled(true); } else { followTypeMenu.setEnabled(false); } } /** */ public void valueChanged (ListSelectionEvent e ) { // change contentTable only when it's a simple selection // System.out.println("valueChanged (Table...)"); TypeSystemNode node; if (contentTable.getSelectedRow() != -1) { NodeMapper nodeMapper = (NodeMapper)contentTable.getModel().getValueAt(contentTable.getSelectedRow(),0); if ((node = ((TypeSystemNode)nodeMapper.getNode())) != null) { setSelectedNode(node); } } } /** */ public void valueChanged (TreeSelectionEvent e ) { // change contentTable only when it's a simple selection DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)e.getPath().getLastPathComponent(); TypeSystemNode node = (TypeSystemNode)treeNode.getUserObject(); contentTable.setModel(typeSystem.getTableModel(treeNode)); contentTable.clearSelection(); TableColumnModel tabColMod = contentTable.getColumnModel(); for (int i=0; i<contentTable.getColumnCount(); i++) { TableColumn tabCol = tabColMod.getColumn(i); tabCol.setCellEditor( null ); // otherwise columns would be editable } setSelectedNode(node); contentTable.validate(); treeView.validate(); } /** * Method to handle events for the WindowListener interface. * @param e java.awt.event.WindowEvent */ public void windowActivated(java.awt.event.WindowEvent e) { // user code begin {1} // user code end // user code begin {2} // user code end } /** * Method to handle events for the WindowListener interface. * @param e java.awt.event.WindowEvent */ /* WARNING: THIS METHOD WILL BE REGENERATED. */ public void windowClosed(java.awt.event.WindowEvent e) { // user code begin {1} System.exit(0); // user code end // user code begin {2} // user code end } /** * Method to handle events for the WindowListener interface. * @param e java.awt.event.WindowEvent */ /* WARNING: THIS METHOD WILL BE REGENERATED. */ public void windowClosing(java.awt.event.WindowEvent e) { // user code begin {1} // user code end if ((e.getSource() == this) ) { conn0(e); } // user code begin {2} // user code end } /** * Method to handle events for the WindowListener interface. * @param e java.awt.event.WindowEvent */ /* WARNING: THIS METHOD WILL BE REGENERATED. */ public void windowDeactivated(java.awt.event.WindowEvent e) { // user code begin {1} // user code end // user code begin {2} // user code end } /** * Method to handle events for the WindowListener interface. * @param e java.awt.event.WindowEvent */ /* WARNING: THIS METHOD WILL BE REGENERATED. */ public void windowDeiconified(java.awt.event.WindowEvent e) { // user code begin {1} // user code end // user code begin {2} // user code end } /** * Method to handle events for the WindowListener interface. * @param e java.awt.event.WindowEvent */ /* WARNING: THIS METHOD WILL BE REGENERATED. */ public void windowIconified(java.awt.event.WindowEvent e) { // user code begin {1} // user code end // user code begin {2} // user code end } /** * Method to handle events for the WindowListener interface. * @param e java.awt.event.WindowEvent */ /* WARNING: THIS METHOD WILL BE REGENERATED. */ public void windowOpened(java.awt.event.WindowEvent e) { // user code begin {1} // user code end // user code begin {2} // user code end } }