package viewer; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; import viewer.MenuVector; import viewer.SecondoViewer; import viewer.rtree.*; import viewer.rtree.datatypes.*; import gui.SecondoObject; import viewer.rtree.gui.*; import sj.lang.ListExpr; /** * Main class of the RTreeViewer. * * RTreeViewer mainly consists of an additional menu and three panels: * * NodeTreePanel: Tree view of the tree * NodeViewerPanel: Rendering area for the bounding boxes and referenced objects * NodeInfoPanel: Detail information on the currently selected tree node * * @author Oliver Feuer * @author Benedikt Buer * @author Christian Oevermann * @since 08.03.2010 * @version 1.3 */ public class RTreeViewer extends SecondoViewer implements ActionListener, ItemListener { // the display panels private NodeTreePanel nodeTreePanel; private NodeInfoPanel nodeInfoPanel; private NodeViewerPanel nodeViewerPanel; // the menu private JMenu xAxis, yAxis, zoom; private MenuVector menuVector; private JMenuItem xySwitch, rootView, nodeView, zoomIn, zoomOut; private JCheckBoxMenuItem tupleBBShow, refShow, childRefShow; private LinkedList x, y; private JMenuItem runscript; // constructors /** * Cretes a new RTreeViewer object. */ public RTreeViewer() { // set layout, create and configure panels setLayout(new BorderLayout()); JPanel panel = new JPanel( new BorderLayout() ); panel.setBorder(BorderFactory.createLineBorder(Color.pink)); panel.setBackground(Color.blue); nodeTreePanel = new NodeTreePanel(this); nodeViewerPanel = new NodeViewerPanel(this); nodeInfoPanel = new NodeInfoPanel(); JSplitPane splitPaneR = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, nodeViewerPanel, nodeInfoPanel); splitPaneR.setOneTouchExpandable(true); splitPaneR.setDividerLocation(400); JSplitPane splitPaneL = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, nodeTreePanel, splitPaneR); splitPaneL.setOneTouchExpandable(true); splitPaneL.setDividerLocation(175); Dimension minimumSize = new Dimension(50, 50); nodeTreePanel.setMinimumSize(minimumSize); nodeViewerPanel.setMinimumSize(minimumSize); nodeInfoPanel.setMinimumSize(minimumSize); panel.add(splitPaneL, BorderLayout.CENTER); add(panel, BorderLayout.CENTER); // ad monitors for inter panel communication nodeTreePanel.addSelectionMonitor(nodeViewerPanel); nodeTreePanel.addSelectionMonitor(nodeInfoPanel); nodeViewerPanel.addSelectionMonitor(nodeInfoPanel); nodeViewerPanel.addSelectionMonitor(nodeTreePanel); // create menu entries and add listeners menuVector = new MenuVector(); JMenu rTreeMenu = new JMenu("RTree"); xAxis = new JMenu("x-Axis"); xAxis.setEnabled(false); rTreeMenu.add(xAxis); x = new LinkedList(); yAxis = new JMenu("y-Axis"); yAxis.setEnabled(false); rTreeMenu.add(yAxis); y = new LinkedList(); xySwitch = new JMenuItem("x-y-Switch"); xySwitch.addActionListener(this); xySwitch.setEnabled(false); rTreeMenu.add(xySwitch); rTreeMenu.addSeparator(); zoom = new JMenu("Zoom"); zoom.setEnabled(false); rTreeMenu.add(zoom); rootView = new JMenuItem("Root View"); rootView.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, ActionEvent.ALT_MASK)); rootView.addActionListener(this); rootView.setEnabled(false); zoom.add(rootView); nodeView = new JMenuItem("Node View"); nodeView.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK)); nodeView.addActionListener(this); nodeView.setEnabled(false); zoom.add(nodeView); zoomIn = new JMenuItem("Zoom In"); zoomIn.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, ActionEvent.ALT_MASK)); zoomIn.addActionListener(this); zoomIn.setEnabled(false); zoom.add(zoomIn); zoomOut = new JMenuItem("Zoom Out"); zoomOut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, ActionEvent.ALT_MASK)); zoomOut.addActionListener(this); zoomOut.setEnabled(false); zoom.add(zoomOut); rTreeMenu.addSeparator(); tupleBBShow = new JCheckBoxMenuItem("Show Key-MBR"); tupleBBShow.addItemListener(this); tupleBBShow.setState(true); tupleBBShow.setEnabled(false); rTreeMenu.add(tupleBBShow); refShow = new JCheckBoxMenuItem("Show references"); refShow.addItemListener(this); refShow.setEnabled(false); rTreeMenu.add(refShow); childRefShow = new JCheckBoxMenuItem("Show child references"); childRefShow.addItemListener(this); childRefShow.setEnabled(false); rTreeMenu.add(childRefShow); rTreeMenu.addSeparator(); JMenu debug = new JMenu("Debug"); runscript = new JMenuItem("Run Script"); runscript.addActionListener(this); debug.add(runscript); rTreeMenu.add(debug); menuVector.addMenu(rTreeMenu); } // public methods /** * Handles the actionPerformed event. * @param e Event detail data */ public void actionPerformed(ActionEvent e) { if (e.getSource() == xySwitch) { nodeViewerPanel.switchAxis(); int xindex=0; for (int i=0; i-1) { nodeViewerPanel.setXProjection(index); } index = y.indexOf(e.getItemSelectable()); if (index>-1) { nodeViewerPanel.setYProjection(index); } } } /** * Is called by NodeTreePanel if an rtree is set or unset. * @param dim dimension of RTree to set or zero to reset */ public void setRTreeMenu(int dim) { xAxis.removeAll(); yAxis.removeAll(); xAxis.setEnabled(dim>0); yAxis.setEnabled(dim>0); xySwitch.setEnabled(dim>0); zoom.setEnabled(dim>0); rootView.setEnabled(dim>0); nodeView.setEnabled(dim>0); zoomIn.setEnabled(dim>0); zoomOut.setEnabled(dim>0); x.clear(); y.clear(); tupleBBShow.setEnabled(dim>0); if (dim>0) { JRadioButtonMenuItem rb; ButtonGroup xgroup = new ButtonGroup(); ButtonGroup ygroup = new ButtonGroup(); for (int i=0; i < dim; i++) { rb = new JRadioButtonMenuItem("x = x"+i); rb.addItemListener(this); if (i==0) rb.setSelected(true); x.add(rb); xAxis.add(rb); xgroup.add(rb); rb = new JRadioButtonMenuItem("y = x"+i); rb.addItemListener(this); if (i==1) rb.setSelected(true); y.add(rb); yAxis.add(rb); ygroup.add(rb); } } } /** * Is called by NodeTreePanel if an attribute is set or unset. * @param enable enables attribute menu items if true, otherwise disables it */ public void setAttributeMenu(boolean enable) { refShow.setEnabled(enable); childRefShow.setEnabled(enable); if (!enable) { refShow.setState(false); childRefShow.setState(false); } } /** * Is called by Secondo to add an object. * Currently not needed, as objects are only added explicitly by the viewer. * @param o A Secondo object */ public boolean addObject(SecondoObject o) { return false; } /** * Is called by Secondo to check if an object can be displayed. * @param o A Secondo object */ public boolean canDisplay(SecondoObject o) { return false; } /** * Is called by Secondo to check if an object is currently displayed. * @param o A Secondo object */ public boolean isDisplayed(SecondoObject o) { return false; } /** * Is called by Secondo to check how an object can be displayed. * @param o A Secondo object */ public double getDisplayQuality(SecondoObject so) { return 0.0f; } /** * Is called by Secondo to remove all objects. */ public void removeAll() { } /** * Is called by Secondo to remove an object. * Currently not needed, as objects are only removed explicitly by the viewer. * @param o A Secondo object */ public void removeObject(SecondoObject o) { } /** * Is called by Secondo to select an object. * @param o A Secondo object */ public boolean selectObject(SecondoObject O) { return false; } /** * Is called by Secondo to display the menu. */ public MenuVector getMenuVector() { return menuVector; } /** * Is called by Secondo to get the viewer name. */ public String getName() { return "RTree Viewer"; } /** * Activates test mode. * Currently not implemented. */ public void enableTestmode(boolean on) { } /** * Sets the cursor to indicate a current activity. */ public void setWaitCursor() { Cursor hourglassCursor = new Cursor(Cursor.WAIT_CURSOR); setCursor(hourglassCursor); } /** * Sets the cursor to default. */ public void setDefaultCursor() { Cursor normalCursor = new Cursor(Cursor.DEFAULT_CURSOR); setCursor(normalCursor); } // private methods /** * Enables the user to select and run a script. */ private void runScript() { JFileChooser fileChooser = new JFileChooser(); fileChooser.showOpenDialog(this); // check if file was selected if (fileChooser.getSelectedFile() != null) { String filename = fileChooser.getSelectedFile().getPath(); if (filename != null && filename != "") { ScriptRunner scriptRunner = new ScriptRunner(this); scriptRunner.runScript(filename); } } } }