summaryrefslogtreecommitdiff
path: root/java/src/IceGridGUI/ApplicationPane.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/IceGridGUI/ApplicationPane.java')
-rw-r--r--java/src/IceGridGUI/ApplicationPane.java486
1 files changed, 486 insertions, 0 deletions
diff --git a/java/src/IceGridGUI/ApplicationPane.java b/java/src/IceGridGUI/ApplicationPane.java
new file mode 100644
index 00000000000..d35baae27e4
--- /dev/null
+++ b/java/src/IceGridGUI/ApplicationPane.java
@@ -0,0 +1,486 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2011 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+package IceGridGUI;
+
+import java.awt.*;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.*;
+import javax.swing.border.AbstractBorder;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.plaf.SplitPaneUI;
+import javax.swing.plaf.basic.BasicSplitPaneUI;
+import javax.swing.tree.TreeCellRenderer;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+
+import com.jgoodies.looks.Options;
+import com.jgoodies.looks.plastic.PlasticLookAndFeel;
+import com.jgoodies.looks.windows.WindowsLookAndFeel;
+import com.jgoodies.forms.factories.Borders;
+
+import IceGrid.*;
+import IceGridGUI.Application.Editor;
+import IceGridGUI.Application.Root;
+import IceGridGUI.Application.TreeNode;
+
+public class ApplicationPane extends JSplitPane implements Tab
+{
+ public void updateUI()
+ {
+ super.updateUI();
+ setEmptyDividerBorder();
+ }
+
+ public void selected()
+ {
+ Coordinator c = _root.getCoordinator();
+
+ c.getShowLiveDeploymentFiltersAction().setEnabled(false);
+ c.getCloseApplicationAction().setEnabled(true);
+
+ c.getSaveAction().setEnabled(_root.needsSaving() && (_root.isLive() && c.connectedToMaster() ||
+ _root.hasFile()));
+ c.getDiscardUpdatesAction().setEnabled(_root.needsSaving() && (_root.isLive() || _root.hasFile()));
+
+ if(_root.isLive())
+ {
+ c.getSaveToRegistryAction().setEnabled(_root.needsSaving() && c.connectedToMaster());
+ }
+ else
+ {
+ c.getSaveToRegistryAction().setEnabled(c.connectedToMaster());
+ }
+ c.getSaveToFileAction().setEnabled(true);
+
+ c.getBackAction().setEnabled(_previousNodes.size() > 0);
+ c.getForwardAction().setEnabled(_nextNodes.size() > 0);
+ c.showActions(_currentNode);
+ }
+
+ public void refresh()
+ {
+ if(_currentNode != null)
+ {
+ _currentEditor = _currentNode.getEditor();
+ if(_root.getCoordinator().getCurrentTab() == this)
+ {
+ //
+ // Refresh actions as well
+ //
+ _root.getCoordinator().showActions(_currentNode);
+ }
+ }
+ }
+
+ public void showNode(TreeNodeBase node)
+ {
+ TreeNode newNode = (TreeNode)node;
+
+ if(newNode != _currentNode)
+ {
+ if(_currentNode != null && _currentNode.isEphemeral() && _root.hasNode(_currentNode))
+ {
+ _currentNode.destroy();
+ _currentNode = null;
+ }
+
+ if(newNode == null)
+ {
+ _currentNode = null;
+ showCurrentNode();
+ }
+ else
+ {
+ if(_currentNode != null && _root.hasNode(_currentNode))
+ {
+ _previousNodes.add(_currentNode);
+ while(_previousNodes.size() >= HISTORY_MAX_SIZE)
+ {
+ _previousNodes.removeFirst();
+ }
+ _root.getCoordinator().getBackAction().setEnabled(true);
+ }
+ _nextNodes.clear();
+ _root.getCoordinator().getForwardAction().setEnabled(false);
+ _currentNode = newNode;
+ showCurrentNode();
+ }
+ }
+ else
+ {
+ _currentEditor = _currentNode.getEditor();
+ if(_root.getCoordinator().getCurrentTab() == this)
+ {
+ //
+ // Refresh actions as well
+ //
+ _root.getCoordinator().showActions(_currentNode);
+ }
+ }
+ }
+
+ public void back()
+ {
+ //
+ // Auto-apply changes
+ //
+ if(_currentEditor != null && !_currentEditor.save(false))
+ {
+ return;
+ }
+
+ TreeNode previousNode = null;
+ do
+ {
+ previousNode = _previousNodes.removeLast();
+ } while(_previousNodes.size() > 0 && (previousNode == _currentNode || !_root.hasNode(previousNode)));
+
+ if(_previousNodes.size() == 0)
+ {
+ _root.getCoordinator().getBackAction().setEnabled(false);
+ }
+
+ if(previousNode != _currentNode)
+ {
+ if(_currentNode != null)
+ {
+ _nextNodes.addFirst(_currentNode);
+ _root.getCoordinator().getForwardAction().setEnabled(true);
+ }
+
+ _currentNode = previousNode;
+ _root.disableSelectionListener();
+ _root.setSelectedNode(_currentNode);
+ _root.enableSelectionListener();
+ showCurrentNode();
+ }
+ }
+
+ public void forward()
+ {
+ if(_currentEditor != null && !_currentEditor.save(false))
+ {
+ return;
+ }
+
+ TreeNode nextNode = null;
+ do
+ {
+ nextNode = _nextNodes.removeFirst();
+ } while(_nextNodes.size() > 0 && (nextNode == _currentNode || !_root.hasNode(nextNode)));
+
+ if(_nextNodes.size() == 0)
+ {
+ _root.getCoordinator().getForwardAction().setEnabled(false);
+ }
+
+ if(nextNode != _currentNode)
+ {
+ if(_currentNode != null)
+ {
+ _previousNodes.add(_currentNode);
+ _root.getCoordinator().getBackAction().setEnabled(true);
+ }
+
+ _currentNode = nextNode;
+ _root.disableSelectionListener();
+ _root.setSelectedNode(_currentNode);
+ _root.enableSelectionListener();
+ showCurrentNode();
+ }
+ }
+
+ public Root getRoot()
+ {
+ return _root;
+ }
+
+ //
+ // E.g. to replace an ephemeral root
+ //
+ public void setRoot(Root newRoot)
+ {
+ boolean reset = (_root != null);
+
+ if(reset)
+ {
+ ToolTipManager.sharedInstance().unregisterComponent(_root.getTree());
+ _currentNode = null;
+ _previousNodes.clear();
+ _nextNodes.clear();
+ }
+
+ _root = newRoot;
+ _root.setPane(this);
+
+ //
+ // Tree display
+ //
+ TreeCellRenderer renderer = new CellRenderer();
+ PopupListener popupListener = new PopupListener();
+
+ JTree tree = _root.getTree();
+
+ tree.setBorder(new EmptyBorder(5, 5, 5, 5));
+ tree.setCellRenderer(renderer);
+ ToolTipManager.sharedInstance().registerComponent(tree);
+ tree.addMouseListener(popupListener);
+
+ tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+
+ tree.addTreeSelectionListener(new SelectionListener());
+
+ tree.setRootVisible(true);
+
+ JScrollPane leftScroll =
+ new JScrollPane(tree,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ leftScroll.setBorder(Borders.EMPTY_BORDER);
+
+ _leftPane.setContent(leftScroll);
+
+ if(reset)
+ {
+ _root.getCoordinator().getMainPane().resetIcon(_root);
+ _leftPane.validate();
+ _leftPane.repaint();
+ }
+ }
+
+ public void save()
+ {
+ if(_currentEditor == null || _currentEditor.save(true))
+ {
+ _root.save();
+ }
+ }
+
+ public void saveToRegistry()
+ {
+ if(_currentEditor == null || _currentEditor.save(true))
+ {
+ _root.saveToRegistry();
+ }
+ }
+
+ public void saveToFile()
+ {
+ if(_currentEditor == null || _currentEditor.save(true))
+ {
+ _root.saveToFile();
+ }
+ }
+
+ public void discardUpdates()
+ {
+ _root.discardUpdates();
+ }
+
+ public boolean close()
+ {
+ _root.getCoordinator().getMainPane().remove(this);
+ return true;
+ }
+
+ public boolean applyUpdates(boolean refresh)
+ {
+ if(_currentEditor == null)
+ {
+ return true;
+ }
+ else
+ {
+ return _currentEditor.save(refresh);
+ }
+ }
+
+ private void registerAction(Coordinator c, int index)
+ {
+ Action action = c.getActionsForMenu().get(index);
+
+ javax.swing.ActionMap am = _leftPane.getActionMap();
+ javax.swing.InputMap im = _leftPane.getInputMap();
+
+ im.put((KeyStroke)action.getValue(Action.ACCELERATOR_KEY), (String)action.getValue(Action.NAME));
+ am.put((String)action.getValue(Action.NAME), action);
+ }
+
+ ApplicationPane(Root root)
+ {
+ super(JSplitPane.HORIZONTAL_SPLIT, true);
+ setBorder(new EmptyBorder(10, 10, 10, 10));
+
+ _leftPane = new SimpleInternalFrame("Descriptors");
+ _leftPane.setPreferredSize(new Dimension(280, 350));
+ Coordinator c = root.getCoordinator();
+ registerAction(c, TreeNode.COPY);
+ registerAction(c, TreeNode.PASTE);
+ registerAction(c, TreeNode.DELETE);
+
+ //
+ // Right pane
+ //
+ _propertiesFrame = new SimpleInternalFrame("Properties");
+
+ setLeftComponent(_leftPane);
+ setRightComponent(_propertiesFrame);
+
+ setRoot(root);
+ }
+
+ private void showCurrentNode()
+ {
+ _root.getCoordinator().showActions(_currentNode);
+
+ if(_currentNode == null)
+ {
+ Component oldContent = _propertiesFrame.getContent();
+ if(oldContent != null)
+ {
+ _propertiesFrame.remove(oldContent);
+ }
+ _propertiesFrame.setTitle("Properties");
+ _propertiesFrame.setToolBar(null);
+ _currentEditor = null;
+ }
+ else
+ {
+ _currentEditor = _currentNode.getEditor();
+ Component currentProperties = _currentEditor.getProperties();
+ _propertiesFrame.setContent(currentProperties);
+ _propertiesFrame.setTitle(currentProperties.getName());
+ _propertiesFrame.setToolBar(_currentEditor.getToolBar());
+ }
+ _propertiesFrame.validate();
+ _propertiesFrame.repaint();
+ }
+
+ private void setEmptyDividerBorder()
+ {
+ SplitPaneUI splitPaneUI = getUI();
+ if(splitPaneUI instanceof BasicSplitPaneUI)
+ {
+ BasicSplitPaneUI basicUI = (BasicSplitPaneUI)splitPaneUI;
+ basicUI.getDivider().setBorder(BorderFactory.createEmptyBorder());
+ }
+ }
+
+ private class PopupListener extends MouseAdapter
+ {
+ public void mousePressed(MouseEvent e)
+ {
+ maybeShowPopup(e);
+ }
+
+ public void mouseReleased(MouseEvent e)
+ {
+ maybeShowPopup(e);
+ }
+
+ private void maybeShowPopup(MouseEvent e)
+ {
+ if (e.isPopupTrigger())
+ {
+ JTree tree = (JTree)e.getComponent();
+
+ TreePath path = tree.getPathForLocation(e.getX(), e.getY());
+
+ if(path != null)
+ {
+ TreeNode node = (TreeNode)path.getLastPathComponent();
+ JPopupMenu popup = node.getPopupMenu();
+ if(popup != null)
+ {
+ popup.show(tree, e.getX(), e.getY());
+ }
+ }
+ }
+ }
+ }
+
+ private class SelectionListener implements TreeSelectionListener
+ {
+ public void valueChanged(TreeSelectionEvent e)
+ {
+ if(_root.isSelectionListenerEnabled())
+ {
+ //
+ // Auto-apply changes
+ //
+ if(_currentEditor != null && !_currentEditor.save(false))
+ {
+ //
+ // Go back to this path
+ //
+ _root.disableSelectionListener();
+ _root.setSelectedNode(_currentEditor.getTarget());
+ _root.enableSelectionListener();
+ }
+ else
+ {
+ if(e.isAddedPath())
+ {
+ TreePath path = e.getPath();
+
+ if(path == null)
+ {
+ showNode(null);
+ }
+ else
+ {
+ TreeNode node = (TreeNode)path.getLastPathComponent();
+ Root root = node.getRoot();
+ if(root.hasNode(node))
+ {
+ showNode(node);
+ }
+ else
+ {
+ node = root.findNodeLike(path, false);
+ if(node == null)
+ {
+ node = root;
+ }
+ root.setSelectedNode(node);
+ }
+ }
+ }
+ else
+ {
+ showNode(null);
+ }
+ }
+ }
+ }
+ }
+
+ private Root _root;
+ private SimpleInternalFrame _leftPane;
+ private SimpleInternalFrame _propertiesFrame;
+
+ //
+ // back/forward navigation
+ //
+ private java.util.LinkedList<TreeNode> _previousNodes = new java.util.LinkedList<TreeNode>();
+ private java.util.LinkedList<TreeNode> _nextNodes = new java.util.LinkedList<TreeNode>();
+
+ private TreeNode _currentNode;
+ private Editor _currentEditor;
+
+ static private final int HISTORY_MAX_SIZE = 20;
+}