summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rwxr-xr-xjava/src/IceGrid/Actions.java233
-rwxr-xr-xjava/src/IceGrid/AdminGUI.java9
-rwxr-xr-xjava/src/IceGrid/MainPane.java50
-rwxr-xr-xjava/src/IceGrid/Model.java359
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapter.java24
-rwxr-xr-xjava/src/IceGrid/TreeNode/AdapterActions.java102
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapters.java108
-rwxr-xr-xjava/src/IceGrid/TreeNode/AdaptersActions.java105
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommonBase.java30
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommonBaseI.java31
-rwxr-xr-xjava/src/IceGrid/TreeNode/ListElementEditor.java1
-rwxr-xr-xjava/src/IceGrid/TreeNode/ListParent.java23
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java202
-rwxr-xr-xjava/src/IceGrid/TreeNode/Server.java178
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerActions.java180
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplate.java243
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplateActions.java61
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplates.java102
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplatesActions.java112
-rwxr-xr-xjava/src/IceGrid/TreeNode/Service.java86
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceActions.java131
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplate.java64
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplateActions.java61
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplates.java54
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplatesActions.java99
-rwxr-xr-xjava/src/IceGrid/TreeNode/Services.java141
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServicesActions.java136
-rwxr-xr-xjava/src/IceGrid/TreeNode/TemplateEditor.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/Templates.java9
-rwxr-xr-xjava/src/IceGrid/TreeNode/UpdateFailedException.java27
30 files changed, 2255 insertions, 708 deletions
diff --git a/java/src/IceGrid/Actions.java b/java/src/IceGrid/Actions.java
new file mode 100755
index 00000000000..beb68e6a69a
--- /dev/null
+++ b/java/src/IceGrid/Actions.java
@@ -0,0 +1,233 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+import com.jgoodies.looks.Options;
+import com.jgoodies.looks.HeaderStyle;
+import com.jgoodies.looks.BorderStyle;
+import com.jgoodies.looks.plastic.PlasticLookAndFeel;
+
+import IceGrid.TreeNode.CommonBase;
+
+//
+// The base class for all actions; provides the corresponding menu bar, tool bar and popup-menu.
+//
+
+public class Actions
+{
+ private class ToolBar extends JToolBar
+ {
+ private ToolBar()
+ {
+ putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
+ putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
+ setFloatable(false);
+ putClientProperty("JToolBar.isRollover", Boolean.TRUE);
+
+ _model.addTools(this);
+
+ addSeparator();
+ add(_copy);
+ add(_paste);
+ addSeparator();
+ add(_delete);
+ addSeparator();
+
+ addTools(this);
+ }
+ }
+
+ private class MenuBar extends JMenuBar
+ {
+ private MenuBar()
+ {
+ putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
+ putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
+
+ _model.addFileMenu(this);
+
+ //
+ // Edit menu
+ //
+ JMenu editMenu = new JMenu("Edit");
+ editMenu.setMnemonic(java.awt.event.KeyEvent.VK_E);
+ add(editMenu);
+ editMenu.add(_copy);
+ editMenu.add(_paste);
+ editMenu.addSeparator();
+ editMenu.add(_delete);
+
+ addMenu(this);
+ _model.addHelpMenu(this);
+ }
+ }
+
+ public Actions(Model model)
+ {
+ _model = model;
+
+ _copy = new AbstractAction("Copy", Utils.getIcon("/icons/copy_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ copy();
+ }
+ };
+ _copy.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl C"));
+
+ _paste = new AbstractAction("Paste", Utils.getIcon("/icons/paste_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ paste();
+ }
+ };
+ _paste.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl V"));
+
+
+ _delete = new AbstractAction("Delete", Utils.getIcon("/icons/delete_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ delete();
+ }
+ };
+ _delete.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("DELETE"));
+ _copy.setEnabled(false);
+ _paste.setEnabled(false);
+ _delete.setEnabled(false);
+
+ _popupListener = new PopupMenuListener()
+ {
+ public void popupMenuCanceled(PopupMenuEvent e)
+ {
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e)
+ {
+ //
+ // Undo the getActions() that opened this menu without
+ // selecting the node
+ //
+ CommonBase currentNode = _model.getSelectedNode();
+ if(currentNode != null)
+ {
+ currentNode.getActions();
+ }
+ else
+ {
+ _model.setActions(_model.getDefaultActions());
+ }
+ }
+
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e)
+ {
+
+ }
+ };
+ }
+
+ public final JToolBar getToolBar()
+ {
+ if(_toolBar == null)
+ {
+ _toolBar = new ToolBar();
+ }
+ return _toolBar;
+ }
+
+ public final JMenuBar getMenuBar()
+ {
+ if(_menuBar == null)
+ {
+ _menuBar = new MenuBar();
+ }
+ return _menuBar;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ //
+ // By default, no popup menu
+ //
+ return null;
+ }
+
+ //
+ // Access to some actions
+ //
+ public Action getCopyAction()
+ {
+ return _copy;
+ }
+
+ public Action getPasteAction()
+ {
+ return _paste;
+ }
+
+ public Action getDeleteAction()
+ {
+ return _delete;
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ // That's it for the base tool bar.
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ // No private menu for the base menu bar
+ }
+
+
+ protected void copy()
+ {
+ //
+ // Corresponding action must be disabled is copy is not overridden.
+ //
+ assert false;
+ }
+
+ protected void paste()
+ {
+ assert false;
+ }
+
+ protected void delete()
+ {
+ assert false;
+ }
+
+ protected Model _model;
+
+ protected Action _copy;
+ protected Action _paste;
+ protected Action _delete;
+
+ protected PopupMenuListener _popupListener;
+
+ private MenuBar _menuBar;
+ private ToolBar _toolBar;
+ }
diff --git a/java/src/IceGrid/AdminGUI.java b/java/src/IceGrid/AdminGUI.java
index b00f2f549b8..2d2ec03e949 100755
--- a/java/src/IceGrid/AdminGUI.java
+++ b/java/src/IceGrid/AdminGUI.java
@@ -90,12 +90,11 @@ public class AdminGUI extends JFrame
// MainPane
//
getContentPane().add(new MainPane(_model), BorderLayout.CENTER);
-
+
+ //
+ // Menu and tool bars
//
- // Menu bar and Tool bar
- //
- setJMenuBar(_model.createMenuBar());
- getContentPane().add(_model.createToolBar(), BorderLayout.PAGE_START);
+ _model.setActions(_model.getDefaultActions());
//
// Status bar
diff --git a/java/src/IceGrid/MainPane.java b/java/src/IceGrid/MainPane.java
index 8baf6fca85b..bb57f48e933 100755
--- a/java/src/IceGrid/MainPane.java
+++ b/java/src/IceGrid/MainPane.java
@@ -66,11 +66,27 @@ public class MainPane extends JSplitPane
if(path != null)
{
CommonBase node = (CommonBase)path.getLastPathComponent();
- JPopupMenu popup = node.getPopupMenu();
+ JPopupMenu popup = node.getActions().getPopupMenu();
if(popup != null)
{
popup.show(tree, e.getX(), e.getY());
}
+ else
+ {
+ //
+ // Undo the getActions() above!
+ //
+ Model model = node.getModel();
+ CommonBase currentNode = model.getSelectedNode();
+ if(currentNode != null)
+ {
+ currentNode.getActions();
+ }
+ else
+ {
+ model.setActions(model.getDefaultActions());
+ }
+ }
}
}
}
@@ -78,10 +94,29 @@ public class MainPane extends JSplitPane
static class SelectionListener implements TreeSelectionListener
{
+ SelectionListener(Model model)
+ {
+ _model = model;
+ }
+
public void valueChanged(TreeSelectionEvent e)
{
- TreePath path = e.getPath();
- if(path != null)
+ TreePath path = null;
+ if(e.isAddedPath())
+ {
+ path = e.getPath();
+ }
+
+ if(path == null)
+ {
+ if(_model.displayEnabled())
+ {
+ //
+ // TODO: display splash?
+ //
+ }
+ }
+ else
{
CommonBase newNode = (CommonBase)path.getLastPathComponent();
@@ -91,8 +126,12 @@ public class MainPane extends JSplitPane
_previousNode.destroy();
}
+ //
+ // Must be a valid node
+ //
+ assert newNode.getParent() != null;
_previousNode = newNode;
- if(newNode.getModel().displayEnabled())
+ if(_model.displayEnabled())
{
newNode.displayProperties();
}
@@ -100,6 +139,7 @@ public class MainPane extends JSplitPane
}
private CommonBase _previousNode;
+ private Model _model;
}
public void updateUI()
@@ -137,7 +177,7 @@ public class MainPane extends JSplitPane
tree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
- SelectionListener appSelectionListener = new SelectionListener();
+ SelectionListener appSelectionListener = new SelectionListener(_model);
tree.addTreeSelectionListener(appSelectionListener);
tree.setRootVisible(false);
_model.setTree(tree);
diff --git a/java/src/IceGrid/Model.java b/java/src/IceGrid/Model.java
index 3202791d68f..fb910581b73 100755
--- a/java/src/IceGrid/Model.java
+++ b/java/src/IceGrid/Model.java
@@ -11,6 +11,7 @@ package IceGrid;
import java.util.prefs.Preferences;
import java.util.prefs.BackingStoreException;
+import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Frame;
import java.awt.Rectangle;
@@ -100,68 +101,6 @@ public class Model
private Preferences _connectionPrefs;
}
- class MenuBar extends JMenuBar
- {
- MenuBar()
- {
- putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
- putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
-
- JMenu fileMenu = new JMenu("File");
- fileMenu.setMnemonic(java.awt.event.KeyEvent.VK_F);
- add(fileMenu);
-
- JMenu editMenu = new JMenu("Edit");
- editMenu.setMnemonic(java.awt.event.KeyEvent.VK_E);
- add(editMenu);
-
- JMenu helpMenu = new JMenu("Help");
- helpMenu.setMnemonic(java.awt.event.KeyEvent.VK_H);
- add(helpMenu);
-
- fileMenu.add(_connect);
- fileMenu.addSeparator();
- fileMenu.add(_save);
- fileMenu.add(_discard);
- fileMenu.addSeparator();
- fileMenu.add(_exit);
-
- editMenu.add(_copy);
- editMenu.add(_paste);
- editMenu.addSeparator();
- editMenu.add(_delete);
-
- helpMenu.add(_about);
- }
- }
-
- class ToolBar extends JToolBar
- {
- ToolBar()
- {
- putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
- putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
- setFloatable(false);
- putClientProperty("JToolBar.isRollover", Boolean.TRUE);
-
- add(_connect);
- addSeparator();
- add(_save);
- add(_discard);
- addSeparator();
- add(_copy);
- add(_paste);
- addSeparator();
- add(_delete);
- addSeparator();
- add(new JToggleButton(_substituteVar));
- addSeparator();
- add(_moveUp);
- add(_moveDown);
- }
- }
-
-
//
// All Model's methods run in the UI thread
//
@@ -169,7 +108,6 @@ public class Model
{
return _communicator;
}
-
public Root getRoot()
{
@@ -303,10 +241,13 @@ public class Model
public void refreshDisplay()
{
- CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
- if(currentNode != null)
+ if(_displayEnabled)
{
- currentNode.displayProperties();
+ CommonBase currentNode = getSelectedNode();
+ if(currentNode != null)
+ {
+ currentNode.displayProperties();
+ }
}
}
@@ -660,9 +601,6 @@ public class Model
public void setTree(JTree tree)
{
_tree = tree;
-
- _tree.getActionMap().put("copy", _copy);
- _tree.getActionMap().put("paste", _paste);
}
public JTree getTree()
@@ -703,37 +641,10 @@ public class Model
{
public void actionPerformed(ActionEvent e)
{
- if(_latestSerial != -1 && _latestSerial == _writeSerial)
- {
- int saveFirst = JOptionPane.showConfirmDialog(
- _mainFrame,
- "Do you want to save your updates?",
- "Save Confirmation",
- JOptionPane.YES_NO_CANCEL_OPTION);
- switch(saveFirst)
- {
- case JOptionPane.YES_OPTION:
- if(saveUpdates())
- {
- _sessionKeeper.createSession(false);
- }
- break;
- case JOptionPane.NO_OPTION:
- discardUpdates(true);
- break;
- case JOptionPane.CANCEL_OPTION:
- break;
- default:
- assert false;
- }
- }
- else
- {
- _sessionKeeper.reconnect(true);
- }
+ connect();
}
};
- _connect.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl N"));
+
_save = new AbstractAction("Save", Utils.getIcon("/icons/save_edit.gif"))
{
@@ -743,9 +654,11 @@ public class Model
}
};
_save.setEnabled(false);
-
+ _save.putValue(Action.ACCELERATOR_KEY,
+ KeyStroke.getKeyStroke("ctrl S"));
+
_discard = new AbstractAction("Discard all updates...",
- Utils.getIcon("/icons/undo_edit.gif"))
+ Utils.getIcon("/icons/undo_edit.gif"))
{
public void actionPerformed(ActionEvent e)
{
@@ -763,78 +676,14 @@ public class Model
};
_exit.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("alt F4"));
- _copy = new AbstractAction("Copy", Utils.getIcon("/icons/copy_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
- if(currentNode != null)
- {
- _copiedDescriptor = currentNode.copy();
- _paste.setEnabled(_copiedDescriptor != null);
- }
- }
- };
- _copy.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl C"));
-
- _paste = new AbstractAction("Paste", Utils.getIcon("/icons/paste_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
- if(currentNode != null)
- {
- currentNode.paste(_copiedDescriptor);
- }
- }
- };
- _paste.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl V"));
- _paste.setEnabled(false);
-
- _delete = new AbstractAction("Delete", Utils.getIcon("/icons/delete_edit.gif"))
+ _about = new AbstractAction("About...")
{
public void actionPerformed(ActionEvent e)
{
- CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
- if(currentNode != null)
- {
- CommonBase parent = currentNode.getParent();
- CommonBase toSelect = null;
- if(parent != null)
- {
- int index = parent.getIndex(currentNode);
- toSelect = (CommonBase)parent.getChildAt(index + 1);
- if(toSelect == null)
- {
- if(index > 0)
- {
- toSelect = (CommonBase)parent.getChildAt(0);
- }
- else
- {
- toSelect = parent;
- }
- }
- }
- if(toSelect != null)
- {
- disableDisplay();
- }
- boolean destroyed = currentNode.destroy();
- if(toSelect != null)
- {
- enableDisplay();
- if(destroyed)
- {
- toSelect = findNewNode(toSelect.getPath());
- _tree.setSelectionPath(toSelect.getPath());
- }
- }
- }
+ // TODO: implement
}
};
- _delete.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("DELETE"));
-
+
_substituteVar = new AbstractAction("${}")
{
public void actionPerformed(ActionEvent e)
@@ -842,44 +691,104 @@ public class Model
toggleSubstitute();
}
};
-
_substituteVar.putValue(Action.SHORT_DESCRIPTION,
- "Substitute variables and parameters in servers' properties");
-
+ "Substitute variables and parameters in servers' properties");
- _moveUp = new AbstractAction("Up")
+
+ _defaultActions = new Actions(this);
+ }
+
+ //
+ // "Connect" action
+ //
+ private void connect()
+ {
+ if(_latestSerial != -1 && _latestSerial == _writeSerial)
+ {
+ int saveFirst = JOptionPane.showConfirmDialog(
+ _mainFrame,
+ "Do you want to save your updates?",
+ "Save Confirmation",
+ JOptionPane.YES_NO_CANCEL_OPTION);
+ switch(saveFirst)
{
- public void actionPerformed(ActionEvent e)
- {
- CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
- if(currentNode != null)
+ case JOptionPane.YES_OPTION:
+ if(saveUpdates())
{
- currentNode.moveUp();
+ _sessionKeeper.createSession(false);
}
- }
- };
-
- _moveDown = new AbstractAction("Down")
+ break;
+ case JOptionPane.NO_OPTION:
+ discardUpdates(true);
+ break;
+ case JOptionPane.CANCEL_OPTION:
+ break;
+ default:
+ assert false;
+ }
+ }
+ else
+ {
+ _sessionKeeper.reconnect(true);
+ }
+ }
+
+
+ /*
+ void deleteCurrentNode()
+ {
+ CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
+ if(currentNode != null)
+ {
+ CommonBase parent = currentNode.getParent();
+ CommonBase toSelect = null;
+ if(parent != null)
{
- public void actionPerformed(ActionEvent e)
+ int index = parent.getIndex(currentNode);
+ toSelect = (CommonBase)parent.getChildAt(index + 1);
+ if(toSelect == null)
{
- CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
- if(currentNode != null)
+ if(index > 0)
{
- currentNode.moveDown();
+ toSelect = (CommonBase)parent.getChildAt(0);
+ }
+ else
+ {
+ toSelect = parent;
}
}
- };
-
- _about = new AbstractAction("About...")
+ }
+ if(toSelect != null)
{
- public void actionPerformed(ActionEvent e)
+ disableDisplay();
+ }
+ boolean destroyed = currentNode.destroy();
+ if(toSelect != null)
+ {
+ enableDisplay();
+ if(destroyed)
{
- // TODO: implement
+ toSelect = findNewNode(toSelect.getPath());
+ _tree.setSelectionPath(toSelect.getPath());
}
- };
+ }
+ }
+ }
+ */
+
+
+ public void setClipboard(Object copy)
+ {
+ _clipboard = copy;
+ }
+
+ public Object getClipboard()
+ {
+ return _clipboard;
}
+
+
void showMainFrame()
{
if(!loadWindowPrefs())
@@ -955,14 +864,54 @@ public class Model
return _sessionKeeper;
}
- JToolBar createToolBar()
+ public Actions getDefaultActions()
{
- return new ToolBar();
+ return _defaultActions;
}
- JMenuBar createMenuBar()
+ public void setActions(Actions actions)
{
- return new MenuBar();
+ _mainFrame.setJMenuBar(actions.getMenuBar());
+ if(_currentActions != null)
+ {
+ _mainFrame.getContentPane().remove(_currentActions.getToolBar());
+ }
+ _currentActions = actions;
+ _mainFrame.getContentPane().add(_currentActions.getToolBar(),
+ BorderLayout.PAGE_START);
+
+ _tree.getActionMap().put("copy", _currentActions.getCopyAction());
+ _tree.getActionMap().put("paste", _currentActions.getPasteAction());
+ }
+
+ void addFileMenu(JMenuBar menuBar)
+ {
+ JMenu fileMenu = new JMenu("File");
+ fileMenu.setMnemonic(java.awt.event.KeyEvent.VK_F);
+ menuBar.add(fileMenu);
+
+ fileMenu.add(_connect);
+ fileMenu.addSeparator();
+ fileMenu.add(_save);
+ fileMenu.add(_discard);
+ fileMenu.addSeparator();
+ fileMenu.add(_exit);
+ }
+
+ void addHelpMenu(JMenuBar menuBar)
+ {
+ JMenu helpMenu = new JMenu("Help");
+ helpMenu.setMnemonic(java.awt.event.KeyEvent.VK_H);
+ menuBar.add(helpMenu);
+ helpMenu.add(_about);
+ }
+
+ void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_connect);
+ toolBar.addSeparator();
+ toolBar.add(_save);
+ toolBar.add(_discard);
}
Preferences getPrefs()
@@ -970,6 +919,14 @@ public class Model
return _prefs;
}
+
+
+
+ public Action getSubstituteVarAction()
+ {
+ return _substituteVar;
+ }
+
private Ice.Communicator _communicator;
private Preferences _prefs;
private StatusBar _statusBar;
@@ -993,20 +950,16 @@ public class Model
private JFrame _mainFrame;
private SessionKeeper _sessionKeeper;
- private Object _copiedDescriptor;
+ private Object _clipboard;
+
+ private Actions _defaultActions;
+ private Actions _currentActions;
- //
- // Actions
- //
private Action _connect;
private Action _save;
private Action _discard;
private Action _exit;
- private Action _copy;
- private Action _paste;
- private Action _delete;
private Action _about;
+
private Action _substituteVar;
- private Action _moveUp;
- private Action _moveDown;
}
diff --git a/java/src/IceGrid/TreeNode/Adapter.java b/java/src/IceGrid/TreeNode/Adapter.java
index 30ff44ef4b6..5cf3d51701e 100755
--- a/java/src/IceGrid/TreeNode/Adapter.java
+++ b/java/src/IceGrid/TreeNode/Adapter.java
@@ -14,6 +14,7 @@ import javax.swing.tree.DefaultTreeCellRenderer;
import IceGrid.SimpleInternalFrame;
+import IceGrid.Actions;
import IceGrid.AdapterDescriptor;
import IceGrid.Model;
import IceGrid.Utils;
@@ -45,8 +46,20 @@ class Adapter extends Leaf
tree, value, sel, expanded, leaf, row, hasFocus);
}
+ public Actions getActions()
+ {
+ if(_actions == null)
+ {
+ _actions = new AdapterActions(_model);
+ }
+ _actions.reset(this);
+ return _actions;
+ }
+
public void displayProperties()
{
+ _model.setActions(getActions());
+
SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
propertiesFrame.setTitle("Properties for " + _id);
@@ -57,8 +70,9 @@ class Adapter extends Leaf
_editor.show(this);
propertiesFrame.setContent(_editor.getComponent());
- propertiesFrame.validate();
- propertiesFrame.repaint();
+
+ _model.getMainFrame().validate();
+ _model.getMainFrame().repaint();
}
public boolean destroy()
@@ -129,7 +143,7 @@ class Adapter extends Leaf
_descriptor.objects = ad.objects;
}
- public Object copy()
+ Object copy()
{
return copyDescriptor(_descriptor);
}
@@ -224,7 +238,7 @@ class Adapter extends Leaf
}
}
- private boolean _ephemeral;
+ private final boolean _ephemeral;
private AdapterDescriptor _descriptor;
private Utils.Resolver _resolver;
@@ -234,4 +248,6 @@ class Adapter extends Leaf
static private DefaultTreeCellRenderer _cellRenderer;
static private AdapterEditor _editor;
+ static private AdapterActions _actions;
+
}
diff --git a/java/src/IceGrid/TreeNode/AdapterActions.java b/java/src/IceGrid/TreeNode/AdapterActions.java
new file mode 100755
index 00000000000..502f9fc2b58
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/AdapterActions.java
@@ -0,0 +1,102 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JCheckBox;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+import javax.swing.tree.TreePath;
+
+import IceGrid.Actions;
+import IceGrid.AdapterDescriptor;
+import IceGrid.Model;
+
+class AdapterActions extends Actions
+{
+ AdapterActions(Model model)
+ {
+ super(model);
+ _substituteTool = new JToggleButton(_model.getSubstituteVarAction());
+ _substituteMenuItem = new JCheckBox(_model.getSubstituteVarAction());
+ }
+
+ void reset(Adapter adapter)
+ {
+ _adapter = adapter;
+ _copy.setEnabled(true);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof AdapterDescriptor)
+ {
+ Adapters adapters = (Adapters)_adapter.getParent();
+ _paste.setEnabled(adapters.canHaveNewChild());
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(_adapter.isEditable());
+
+ if(_adapter.getResolver() != null && !_adapter.isEphemeral())
+ {
+ _model.getSubstituteVarAction().setEnabled(true);
+ _substituteTool.setSelected(_model.substitute());
+ _substituteMenuItem.setSelected(_model.substitute());
+ }
+ else
+ {
+ _model.getSubstituteVarAction().setEnabled(false);
+ }
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_substituteTool);
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ JMenu adapterMenu = new JMenu("Adapter");
+ adapterMenu.setMnemonic(java.awt.event.KeyEvent.VK_A);
+ menuBar.add(adapterMenu);
+
+ adapterMenu.add(_substituteMenuItem);
+ }
+
+ protected void copy()
+ {
+ _model.setClipboard(_adapter.copy());
+
+ Adapters adapters = (Adapters)_adapter.getParent();
+ _paste.setEnabled(adapters.canHaveNewChild());
+ }
+
+ protected void paste()
+ {
+ ((Adapters)_adapter.getParent()).paste();
+ }
+
+ protected void delete()
+ {
+ TreePath parentPath = _adapter.getParent().getPath();
+ _adapter.destroy();
+ _model.setSelectionPath(parentPath);
+ }
+
+ Adapter _adapter;
+ JCheckBox _substituteMenuItem;
+ JToggleButton _substituteTool;
+}
diff --git a/java/src/IceGrid/TreeNode/Adapters.java b/java/src/IceGrid/TreeNode/Adapters.java
index 8e9daab8f75..2ad60cfcae3 100755
--- a/java/src/IceGrid/TreeNode/Adapters.java
+++ b/java/src/IceGrid/TreeNode/Adapters.java
@@ -15,53 +15,23 @@ import javax.swing.Action;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
+import IceGrid.Actions;
import IceGrid.AdapterDescriptor;
import IceGrid.Model;
import IceGrid.Utils;
class Adapters extends ListParent
{
- static class NewPopupMenu extends JPopupMenu
+ public Actions getActions()
{
- NewPopupMenu()
+ if(_actions == null)
{
- _new = new AbstractAction("New adapter")
- {
- public void actionPerformed(ActionEvent e)
- {
- _parent.newAdapter(null);
- }
- };
-
- add(_new);
+ _actions = new AdaptersActions(_model);
}
-
- void setParent(Adapters parent)
- {
- _parent = parent;
- }
-
- private Adapters _parent;
- private Action _new;
+ _actions.reset(this);
+ return _actions;
}
- public JPopupMenu getPopupMenu()
- {
- if(canHaveNewChild())
- {
- if(_popup == null)
- {
- _popup = new NewPopupMenu();
- }
- _popup.setParent(this);
- return _popup;
- }
- else
- {
- return null;
- }
- }
-
static public java.util.LinkedList
copyDescriptors(java.util.LinkedList descriptors)
{
@@ -159,35 +129,9 @@ class Adapters extends ListParent
return _isEditable && !_inIceBox;
}
- void newAdapter(AdapterDescriptor descriptor)
+ private void newAdapter(AdapterDescriptor descriptor)
{
- //
- // Generate a unique child name; ignore substitution for simplicity
- //
- String baseName = descriptor == null ? "NewAdapter" : descriptor.name;
- String name = makeNewChildId(baseName);
-
- if(descriptor == null)
- {
- CommonBase parent = getParent();
- String defaultId = (parent instanceof Service ||
- parent instanceof ServiceTemplate) ?
- "${server}.${service}." + name : "${server}." + name;
-
- descriptor = new AdapterDescriptor(
- name,
- defaultId,
- "", // TODO: ReplicaId
- false,
- true,
- new java.util.LinkedList());
- }
- else
- {
- descriptor.name = name;
- }
-
- Adapter adapter = new Adapter(name, descriptor, _model);
+ Adapter adapter = new Adapter(descriptor.name, descriptor, _model);
try
{
addChild(adapter, true);
@@ -199,18 +143,38 @@ class Adapters extends ListParent
_model.setSelectionPath(adapter.getPath());
}
- public void paste(Object descriptor)
+ void newAdapter()
{
- if(canHaveNewChild() && descriptor instanceof AdapterDescriptor)
- {
- AdapterDescriptor d = (AdapterDescriptor)descriptor;
- newAdapter(Adapter.copyDescriptor(d));
- }
+ String name = makeNewChildId("NewAdapter");
+ CommonBase parent = getParent();
+ String defaultId = (parent instanceof Service ||
+ parent instanceof ServiceTemplate) ?
+ "${server}.${service}." + name : "${server}." + name;
+
+ AdapterDescriptor descriptor = new AdapterDescriptor(
+ name,
+ defaultId,
+ "${server}",
+ false,
+ true,
+ new java.util.LinkedList());
+
+ newAdapter(descriptor);
+ }
+
+ void paste()
+ {
+ Object descriptor = _model.getClipboard();
+ assert canHaveNewChild() && descriptor instanceof AdapterDescriptor;
+
+ AdapterDescriptor d = Adapter.copyDescriptor((AdapterDescriptor)descriptor);
+ d.name = makeNewChildId(d.name);
+ newAdapter(d);
}
private Utils.Resolver _resolver;
private boolean _isEditable;
private boolean _inIceBox;
-
- static private NewPopupMenu _popup;
+
+ static private AdaptersActions _actions;
}
diff --git a/java/src/IceGrid/TreeNode/AdaptersActions.java b/java/src/IceGrid/TreeNode/AdaptersActions.java
new file mode 100755
index 00000000000..c766c321aa3
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/AdaptersActions.java
@@ -0,0 +1,105 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JCheckBox;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+
+import IceGrid.Actions;
+import IceGrid.AdapterDescriptor;
+import IceGrid.Model;
+
+class AdaptersActions extends Actions
+{
+ private class PopupMenu extends JPopupMenu
+ {
+ PopupMenu()
+ {
+ add(_newAdapter);
+ addPopupMenuListener(_popupListener);
+ }
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(_newAdapter.isEnabled())
+ {
+ return _popup;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ protected void paste()
+ {
+ _adapters.paste();
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ JMenu adaptersMenu = new JMenu("Adapters");
+ adaptersMenu.setMnemonic(java.awt.event.KeyEvent.VK_A);
+ menuBar.add(adaptersMenu);
+
+ adaptersMenu.add(_newAdapter);
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_newAdapter);
+ }
+
+ AdaptersActions(Model model)
+ {
+ super(model);
+ _newAdapter = new AbstractAction("New Adapter")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _adapters.newAdapter();
+ }
+ };
+ _newAdapter.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl N"));
+
+ _popup = new PopupMenu();
+ }
+
+ void reset(Adapters adapters)
+ {
+ _adapters = adapters;
+ _copy.setEnabled(false);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof AdapterDescriptor)
+ {
+ _paste.setEnabled(_adapters.canHaveNewChild());
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(false);
+
+ _newAdapter.setEnabled(_adapters.canHaveNewChild());
+ }
+
+ Adapters _adapters;
+ Action _newAdapter;
+ PopupMenu _popup;
+}
diff --git a/java/src/IceGrid/TreeNode/CommonBase.java b/java/src/IceGrid/TreeNode/CommonBase.java
index e38f7a2dd21..b96b0dd2ebe 100755
--- a/java/src/IceGrid/TreeNode/CommonBase.java
+++ b/java/src/IceGrid/TreeNode/CommonBase.java
@@ -10,12 +10,11 @@ package IceGrid.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeCellRenderer;
-import javax.swing.JPopupMenu;
import javax.swing.JPanel;
-import IceGrid.SimpleInternalFrame;
-
+import IceGrid.Actions;
import IceGrid.Model;
+import IceGrid.SimpleInternalFrame;
//
// CommonBase is similar to javax.swing.tree.TreeNode
@@ -48,7 +47,6 @@ public interface CommonBase extends TreeCellRenderer
//
boolean destroy();
-
//
// Get this node's parent;
// null when the node is not attached to the root
@@ -63,9 +61,9 @@ public interface CommonBase extends TreeCellRenderer
TreePath getPath();
//
- // Get pop-up menu
+ // Actions associated with this object
//
- JPopupMenu getPopupMenu();
+ Actions getActions();
void displayProperties();
@@ -103,26 +101,6 @@ public interface CommonBase extends TreeCellRenderer
void restoreDescriptor(Object savedDescriptor);
//
- // Copy the underlying data (typically descriptor);
- // this is a _deep_ copy
- // Objects that are not copyable return null
- //
- Object copy();
-
- //
- // Create a new object using this descriptor in this container
- // or the parent's container; does nothing if the descriptor
- // is not of the proper type
- //
- void paste(Object descriptor);
-
- //
- // Change the sorting order (using no-op)
- //
- void moveUp();
- void moveDown();
-
- //
// Set this child's parent
//
void setParent(CommonBase parent);
diff --git a/java/src/IceGrid/TreeNode/CommonBaseI.java b/java/src/IceGrid/TreeNode/CommonBaseI.java
index 8aa74eb6168..efd3e39b353 100755
--- a/java/src/IceGrid/TreeNode/CommonBaseI.java
+++ b/java/src/IceGrid/TreeNode/CommonBaseI.java
@@ -16,6 +16,7 @@ import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.tree.TreePath;
+import IceGrid.Actions;
import IceGrid.SimpleInternalFrame;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.factories.DefaultComponentFactory;
@@ -77,16 +78,15 @@ abstract class CommonBaseI implements CommonBase
return false;
}
- public JPopupMenu getPopupMenu()
+ public Actions getActions()
{
- //
- // Default = no popup menu
- //
- return null;
+ return _model.getDefaultActions();
}
public void displayProperties()
{
+ _model.setActions(getActions());
+
if(_panel == null)
{
JLabel label = DefaultComponentFactory.getInstance().createTitle("This element has no property");
@@ -98,8 +98,9 @@ abstract class CommonBaseI implements CommonBase
SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
propertiesFrame.setTitle("Properties");
propertiesFrame.setContent(_panel);
- propertiesFrame.validate();
- propertiesFrame.repaint();
+
+ _model.getMainFrame().validate();
+ _model.getMainFrame().repaint();
}
public Component getTreeCellRendererComponent(
@@ -135,22 +136,6 @@ abstract class CommonBaseI implements CommonBase
assert false;
}
- public Object copy()
- {
- return null;
- }
-
- public void paste(Object descriptor)
- {
- //
- // Try my parent
- //
- if(_parent != null)
- {
- _parent.paste(descriptor);
- }
- }
-
public java.util.List findAllInstances(CommonBase child)
{
assert getIndex(child) != -1;
diff --git a/java/src/IceGrid/TreeNode/ListElementEditor.java b/java/src/IceGrid/TreeNode/ListElementEditor.java
index 23fd3d06f8f..b47ef9f7383 100755
--- a/java/src/IceGrid/TreeNode/ListElementEditor.java
+++ b/java/src/IceGrid/TreeNode/ListElementEditor.java
@@ -97,6 +97,7 @@ abstract class ListElementEditor extends Editor
finally
{
model.enableDisplay();
+ model.refreshDisplay();
}
}
}
diff --git a/java/src/IceGrid/TreeNode/ListParent.java b/java/src/IceGrid/TreeNode/ListParent.java
index c26f9a7e7b4..b16a5d8ad38 100755
--- a/java/src/IceGrid/TreeNode/ListParent.java
+++ b/java/src/IceGrid/TreeNode/ListParent.java
@@ -88,13 +88,14 @@ abstract class ListParent extends Parent
boolean destroyChild(CommonBase child)
{
- if(isEditable() && _model.canUpdate())
+ if(child.isEphemeral())
{
- if(child.isEphemeral())
- {
- removeChild(child, true);
- }
- else
+ removeChild(child, true);
+ return true;
+ }
+ else
+ {
+ if(isEditable() && _model.canUpdate())
{
Object descriptor = child.getDescriptor();
removeDescriptor(descriptor);
@@ -112,12 +113,12 @@ abstract class ListParent extends Parent
parent.findChildWithDescriptor(descriptor),
true);
}
+ return true;
+ }
+ else
+ {
+ return false;
}
- return true;
- }
- else
- {
- return false;
}
}
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index db3b602340a..0239795ab0e 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -9,6 +9,7 @@
package IceGrid.TreeNode;
import java.awt.Component;
+import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.Icon;
import javax.swing.tree.TreeCellRenderer;
@@ -26,17 +27,8 @@ import IceGrid.ServerState;
import IceGrid.TemplateDescriptor;
import IceGrid.Utils;
-class Node extends EditableParent
-{
- //
- // Node creation/deletion/renaming is done by starting/restarting
- // an IceGridNode process. Not through admin calls.
- //
-
- //
- // TODO: consider showing per-application node variables
- //
-
+class Node extends EditableParent implements InstanceParent
+{
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
@@ -91,6 +83,141 @@ class Node extends EditableParent
}
+ static private class Backup
+ {
+ java.util.TreeSet removedElements;
+ java.util.TreeMap parameterValues;
+ }
+
+ public Object rebuild(CommonBase child, java.util.List editables)
+ throws UpdateFailedException
+ {
+ Backup backup = new Backup();
+ backup.removedElements = (java.util.TreeSet)_removedElements.clone();
+
+ removeChild(child, true);
+ Server server = (Server)child;
+ ServerInstanceDescriptor instanceDescriptor = server.getInstanceDescriptor();
+
+ if(instanceDescriptor != null)
+ {
+ TemplateDescriptor templateDescriptor
+ = getApplication().findServerTemplateDescriptor(instanceDescriptor.template);
+
+ java.util.Set parameters = new java.util.HashSet(templateDescriptor.parameters);
+ if(!parameters.equals(instanceDescriptor.parameterValues.keySet()))
+ {
+ backup.parameterValues = instanceDescriptor.parameterValues;
+ instanceDescriptor.parameterValues = Editor.makeParameterValues(
+ instanceDescriptor.parameterValues, templateDescriptor.parameters);
+ }
+
+ try
+ {
+ Server newServer = createServer(true, instanceDescriptor, getApplication());
+ addChild(newServer, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ e.addParent(this);
+ restore(child, backup);
+ throw e;
+ }
+ }
+ else
+ {
+ try
+ {
+ Server newServer = createServer(true, server.getServerDescriptor(), getApplication());
+ addChild(newServer, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ restore(child, backup);
+ throw e;
+ }
+ }
+ return backup;
+ }
+
+ public void restore(CommonBase child, Object backupObject)
+ {
+ Backup backup = (Backup)backupObject;
+ _removedElements = backup.removedElements;
+
+ Server goodServer = (Server)child;
+ ServerInstanceDescriptor instanceDescriptor = goodServer.getInstanceDescriptor();
+ if(instanceDescriptor != null && backup.parameterValues != null)
+ {
+ instanceDescriptor.parameterValues = backup.parameterValues;
+ }
+
+ CommonBase badServer = findChildWithDescriptor(goodServer.getDescriptor());
+ if(badServer != null)
+ {
+ removeChild(badServer, true);
+ }
+
+ try
+ {
+ addChild(child, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false; // impossible
+ }
+ }
+
+ private Server createServer(boolean brandNew, ServerInstanceDescriptor instanceDescriptor,
+ Application application) throws UpdateFailedException
+ {
+ //
+ // Find template
+ //
+ TemplateDescriptor templateDescriptor =
+ application.findServerTemplateDescriptor(instanceDescriptor.template);
+
+ assert templateDescriptor != null;
+
+ ServerDescriptor serverDescriptor =
+ (ServerDescriptor)templateDescriptor.descriptor;
+
+ assert serverDescriptor != null;
+
+ //
+ // Build resolver
+ //
+ Utils.Resolver instanceResolver =
+ new Utils.Resolver(_resolver, instanceDescriptor.parameterValues);
+
+ String serverId = instanceResolver.substitute(serverDescriptor.id);
+ instanceResolver.put("server", serverId);
+
+ //
+ // Create server
+ //
+ return new Server(brandNew, serverId, instanceResolver, instanceDescriptor,
+ serverDescriptor, application);
+ }
+
+ private Server createServer(boolean brandNew, ServerDescriptor serverDescriptor,
+ Application application) throws UpdateFailedException
+ {
+ //
+ // Build resolver
+ //
+ Utils.Resolver instanceResolver = new Utils.Resolver(_resolver);
+ String serverId = instanceResolver.substitute(serverDescriptor.id);
+ instanceResolver.put("server", serverId);
+
+ //
+ // Create server
+ //
+ return new Server(brandNew, serverId, instanceResolver, null, serverDescriptor,
+ application);
+
+ }
+
void up()
{
_up = true;
@@ -396,35 +523,8 @@ class Node extends EditableParent
{
ServerInstanceDescriptor instanceDescriptor =
(ServerInstanceDescriptor)p.next();
-
- //
- // Find template
- //
- TemplateDescriptor templateDescriptor =
- application.findServerTemplateDescriptor(instanceDescriptor.template);
-
- assert templateDescriptor != null;
-
- ServerDescriptor serverDescriptor =
- (ServerDescriptor)templateDescriptor.descriptor;
-
- assert serverDescriptor != null;
-
- //
- // Build resolver
- //
- Utils.Resolver instanceResolver =
- new Utils.Resolver(_resolver, instanceDescriptor.parameterValues);
-
- String serverId = instanceResolver.substitute(serverDescriptor.id);
- instanceResolver.put("server", serverId);
-
- //
- // Create server
- //
- Server server = new Server(false, serverId, instanceResolver, instanceDescriptor,
- serverDescriptor, application);
- addChild(server);
+
+ addChild(createServer(false, instanceDescriptor, application));
}
//
@@ -434,20 +534,7 @@ class Node extends EditableParent
while(p.hasNext())
{
ServerDescriptor serverDescriptor = (ServerDescriptor)p.next();
-
- //
- // Build resolver
- //
- Utils.Resolver instanceResolver = new Utils.Resolver(_resolver);
- String serverId = instanceResolver.substitute(serverDescriptor.id);
- instanceResolver.put("server", serverId);
-
- //
- // Create server
- //
- Server server = new Server(false, serverId, instanceResolver, null, serverDescriptor,
- application);
- addChild(server);
+ addChild(createServer(false, serverDescriptor, application));
}
if(fireEvent)
@@ -659,6 +746,13 @@ class Node extends EditableParent
}
}
+ void paste()
+ {
+ //
+ // TODO: implement
+ //
+ }
+
Utils.Resolver getResolver()
{
return _resolver;
diff --git a/java/src/IceGrid/TreeNode/Server.java b/java/src/IceGrid/TreeNode/Server.java
index f56d51f546e..64bf51d998a 100755
--- a/java/src/IceGrid/TreeNode/Server.java
+++ b/java/src/IceGrid/TreeNode/Server.java
@@ -38,6 +38,8 @@ import com.jgoodies.forms.layout.Sizes;
import com.jgoodies.forms.util.LayoutStyle;
import IceGrid.SimpleInternalFrame;
+import IceGrid.Actions;
+import IceGrid.AdapterDescriptor;
import IceGrid.IceBoxDescriptor;
import IceGrid.Model;
import IceGrid.PropertyDescriptor;
@@ -57,59 +59,116 @@ import IceGrid.Utils;
// - Icebox instance
//
class Server extends EditableParent
-{
- static class PopupMenu extends JPopupMenu
+{
+ static public ServerDescriptor
+ copyDescriptor(ServerDescriptor sd)
{
- PopupMenu()
- {
- _startAction = new AbstractAction("Start")
- {
- public void actionPerformed(ActionEvent e)
- {
- _server.start();
- }
- };
+ ServerDescriptor copy = (ServerDescriptor)sd.clone();
+ copy.adapters = Adapters.copyDescriptors(copy.adapters);
+ copy.dbEnvs = DbEnvs.copyDescriptors(copy.dbEnvs);
- _stopAction = new AbstractAction("Stop")
- {
- public void actionPerformed(ActionEvent e)
- {
- _server.stop();
- }
- };
+ //
+ // Update to properties is not atomic because of Adapter endpoints
+ // (and possibly other properties set through a PropertiesHolder)
+ //
+ copy.properties = (java.util.LinkedList)copy.properties.clone();
- add(_startAction);
- add(_stopAction);
- }
-
- void setServer(Server server)
+ if(copy instanceof IceBoxDescriptor)
{
- _server = server;
- ServerState state = _server.getState();
-
- boolean canStart = (_server.getState() == ServerState.Inactive);
- _startAction.setEnabled(canStart);
- _stopAction.setEnabled(!canStart);
+ IceBoxDescriptor ib = (IceBoxDescriptor)copy;
+ ib.services = Services.copyDescriptors(ib.services);
}
+ return copy;
+ }
- private Server _server;
- private Action _startAction;
- private Action _stopAction;
+ static public ServerInstanceDescriptor
+ copyDescriptor(ServerInstanceDescriptor sid)
+ {
+ return (ServerInstanceDescriptor)sid.clone();
}
+ static public void shallowRestore(ServerDescriptor from, ServerDescriptor into)
+ {
+ //
+ // When editing a server or server template, if we update properties,
+ // we replace the entire field
+ into.properties = from.properties;
+
+ into.description = from.description;
+ into.id = from.id;
+ into.exe = from.exe;
+ into.options = from.options;
+ into.envs = from.envs;
+ into.activation = from.activation;
+ into.activationTimeout = from.activationTimeout;
+ into.deactivationTimeout = from.deactivationTimeout;
+ into.distrib = from.distrib;
+ }
- public JPopupMenu getPopupMenu()
+ static public ServerDescriptor newServerDescriptor()
{
- if(_popup == null)
+ return new ServerDescriptor(
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ "",
+ "",
+ "",
+ "",
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ "on-demand",
+ "",
+ "",
+ new IceGrid.DistributionDescriptor("", new java.util.LinkedList()));
+ }
+
+ static public IceBoxDescriptor newIceBoxDescriptor()
+ {
+ AdapterDescriptor serviceManager = new AdapterDescriptor(
+ "IceBox.ServiceManager",
+ "", // direct-adapter by default
+ "",
+ true,
+ true,
+ new java.util.LinkedList()
+ );
+
+ java.util.LinkedList adapterList = new java.util.LinkedList();
+ adapterList.add(serviceManager);
+
+ return new IceBoxDescriptor(
+ adapterList,
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ "",
+ "",
+ "",
+ "",
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ "on-demand",
+ "",
+ "",
+ new IceGrid.DistributionDescriptor("", new java.util.LinkedList()),
+ new java.util.LinkedList()
+ );
+ }
+
+ public Actions getActions()
+ {
+ if(_actions == null)
{
- _popup = new PopupMenu();
+ _actions = new ServerActions(_model);
}
- _popup.setServer(this);
- return _popup;
+ _actions.reset(this);
+ return _actions;
}
public void displayProperties()
{
+ _model.setActions(getActions());
+
SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
propertiesFrame.setTitle("Properties for " + _id);
@@ -136,8 +195,8 @@ class Server extends EditableParent
propertiesFrame.setContent(_serverInstanceEditor.getComponent());
}
- propertiesFrame.validate();
- propertiesFrame.repaint();
+ _model.getMainFrame().validate();
+ _model.getMainFrame().repaint();
}
@@ -194,30 +253,6 @@ class Server extends EditableParent
return _propertiesHolder;
}
- static public ServerInstanceDescriptor
- copyDescriptor(ServerInstanceDescriptor sid)
- {
- return (ServerInstanceDescriptor)sid.clone();
- }
-
- static public ServerDescriptor
- copyDescriptor(ServerDescriptor sd)
- {
- ServerDescriptor copy = null;
- copy = (ServerDescriptor)sd.clone();
- copy.adapters = Adapters.copyDescriptors(copy.adapters);
- copy.dbEnvs = DbEnvs.copyDescriptors(copy.dbEnvs);
- // TODO: copy.patchs = Patchs.copyDescriptor(copy.patchs);
-
- if(copy instanceof IceBoxDescriptor)
- {
- IceBoxDescriptor ib = (IceBoxDescriptor)copy;
- ib.services = Services.copyDescriptors(ib.services);
- }
- return copy;
- }
-
-
public Object getDescriptor()
{
if(_instanceDescriptor != null)
@@ -446,6 +481,20 @@ class Server extends EditableParent
_model.getStatusBar().setText("Stopping server '" + _id + "'... done.");
}
+ boolean isEnabled()
+ {
+ return true;
+ }
+
+ void enable()
+ {
+ }
+
+ void disable()
+ {
+ }
+
+
ServerState getState()
{
return _state;
@@ -529,7 +578,8 @@ class Server extends EditableParent
static private DefaultTreeCellRenderer _cellRenderer;
static private Icon[] _icons;
- static private PopupMenu _popup;
+
+ static private ServerActions _actions;
static private ServerEditor _serverEditor;
static private ServerInstanceEditor _serverInstanceEditor;
diff --git a/java/src/IceGrid/TreeNode/ServerActions.java b/java/src/IceGrid/TreeNode/ServerActions.java
new file mode 100755
index 00000000000..68ddde12486
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServerActions.java
@@ -0,0 +1,180 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JCheckBox;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+import javax.swing.tree.TreePath;
+
+import IceGrid.Actions;
+import IceGrid.Model;
+import IceGrid.ServerDescriptor;
+import IceGrid.ServerInstanceDescriptor;
+import IceGrid.ServerState;
+
+
+class ServerActions extends Actions
+{
+ private class PopupMenu extends JPopupMenu
+ {
+ PopupMenu()
+ {
+ add(_start);
+ add(_stop);
+ add(_enable);
+ add(_disable);
+ addPopupMenuListener(_popupListener);
+ }
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ return _popup;
+ }
+
+ ServerActions(Model model)
+ {
+ super(model);
+ _substituteTool = new JToggleButton(_model.getSubstituteVarAction());
+ _substituteMenuItem = new JCheckBox(_model.getSubstituteVarAction());
+
+ _start = new AbstractAction("Start")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _server.start();
+ }
+ };
+
+ _stop = new AbstractAction("Stop")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _server.stop();
+ }
+ };
+
+ _enable = new AbstractAction("Enable")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _server.enable();
+ }
+ };
+
+ _disable = new AbstractAction("Disable")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _server.disable();
+ }
+ };
+
+ _popup = new PopupMenu();
+ }
+
+ void reset(Server server)
+ {
+ _server = server;
+ _copy.setEnabled(true);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && (clipboard instanceof ServerDescriptor
+ || clipboard instanceof ServerInstanceDescriptor))
+ {
+ _paste.setEnabled(true);
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(true);
+
+ if(!_server.isEphemeral())
+ {
+ _model.getSubstituteVarAction().setEnabled(true);
+ _substituteTool.setSelected(_model.substitute());
+ _substituteMenuItem.setSelected(_model.substitute());
+ }
+ else
+ {
+ _model.getSubstituteVarAction().setEnabled(false);
+ }
+
+ _start.setEnabled(_server.getState() == ServerState.Inactive
+ && _server.isEnabled());
+ _stop.setEnabled(_server.getState() != ServerState.Inactive);
+
+ _enable.setEnabled(!_server.isEnabled());
+ _disable.setEnabled(server.isEnabled());
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_substituteTool);
+ toolBar.addSeparator();
+ toolBar.add(_start);
+ toolBar.add(_stop);
+ toolBar.addSeparator();
+ toolBar.add(_enable);
+ toolBar.add(_disable);
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ JMenu serverMenu = new JMenu("Server");
+ serverMenu.setMnemonic(java.awt.event.KeyEvent.VK_S);
+ menuBar.add(serverMenu);
+
+ serverMenu.add(_substituteMenuItem);
+ serverMenu.addSeparator();
+ serverMenu.add(_start);
+ serverMenu.add(_stop);
+ serverMenu.addSeparator();
+ serverMenu.add(_enable);
+ serverMenu.add(_disable);
+ }
+
+ protected void copy()
+ {
+ _model.setClipboard(_server.copy());
+ _paste.setEnabled(true);
+ }
+
+ protected void paste()
+ {
+ ((Node)_server.getParent()).paste();
+ }
+
+ protected void delete()
+ {
+ TreePath parentPath = _server.getParent().getPath();
+ _server.destroy();
+ _model.setSelectionPath(parentPath);
+ }
+
+ Action _start;
+ Action _stop;
+ Action _enable;
+ Action _disable;
+
+ Server _server;
+ JCheckBox _substituteMenuItem;
+ JToggleButton _substituteTool;
+
+ PopupMenu _popup;
+}
diff --git a/java/src/IceGrid/TreeNode/ServerTemplate.java b/java/src/IceGrid/TreeNode/ServerTemplate.java
index d442607cf70..49a4ca1f4c9 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplate.java
@@ -31,6 +31,7 @@ import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.FormLayout;
import IceGrid.SimpleInternalFrame;
+import IceGrid.Actions;
import IceGrid.IceBoxDescriptor;
import IceGrid.Model;
import IceGrid.ServerDescriptor;
@@ -43,8 +44,31 @@ import IceGrid.Utils;
class ServerTemplate extends EditableParent
{
+ static public TemplateDescriptor
+ copyDescriptor(TemplateDescriptor templateDescriptor)
+ {
+ TemplateDescriptor copy = (TemplateDescriptor)
+ templateDescriptor.clone();
+
+ copy.descriptor = Server.copyDescriptor(
+ (ServerDescriptor)copy.descriptor);
+ return copy;
+ }
+
+ public Actions getActions()
+ {
+ if(_actions == null)
+ {
+ _actions = new ServerTemplateActions(_model);
+ }
+ _actions.reset(this);
+ return _actions;
+ }
+
public void displayProperties()
{
+ _model.setActions(getActions());
+
SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
propertiesFrame.setTitle("Properties for " + _id);
@@ -54,12 +78,101 @@ class ServerTemplate extends EditableParent
}
_editor.show(this);
propertiesFrame.setContent(_editor.getComponent());
- propertiesFrame.validate();
- propertiesFrame.repaint();
+
+ _model.getMainFrame().validate();
+ _model.getMainFrame().repaint();
+ }
+
+ public boolean destroy()
+ {
+ ServerTemplates serverTemplates = (ServerTemplates)_parent;
+
+ if(serverTemplates != null && _ephemeral)
+ {
+ serverTemplates.removeChild(this, true);
+ return true;
+ }
+ else if(serverTemplates != null && _model.canUpdate())
+ {
+ serverTemplates.removeDescriptor(_id);
+ getApplication().removeServerInstances(_id);
+ serverTemplates.removeElement(this, true);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
}
+ public boolean isEphemeral()
+ {
+ return _ephemeral;
+ }
+
+ public java.util.List findAllInstances(CommonBase child)
+ {
+ java.util.List result = super.findAllInstances(child);
+
+ java.util.List serverInstances =
+ getApplication().findServerInstances(_id);
+
+ java.util.Iterator p = serverInstances.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ result.addAll(server.findChildrenWithType(child.getClass()));
+ }
+
+ return result;
+ }
+
+ public PropertiesHolder getPropertiesHolder()
+ {
+ return _propertiesHolder;
+ }
+
+ public String toString()
+ {
+ if(_ephemeral)
+ {
+ return super.toString();
+ }
+ else
+ {
+ return templateLabel(_id, _templateDescriptor.parameters);
+ }
+ }
+
+ public Object getDescriptor()
+ {
+ return _templateDescriptor;
+ }
+
+
+ public Object saveDescriptor()
+ {
+ //
+ // Shallow copy
+ //
+ TemplateDescriptor clone = (TemplateDescriptor)_templateDescriptor.clone();
+ clone.descriptor = (ServerDescriptor)_templateDescriptor.descriptor.clone();
+ return clone;
+ }
- //
+ public void restoreDescriptor(Object savedDescriptor)
+ {
+ TemplateDescriptor clone = (TemplateDescriptor)savedDescriptor;
+ //
+ // Keep the same object
+ //
+ _templateDescriptor.parameters = clone.parameters;
+
+ Server.shallowRestore((ServerDescriptor)clone.descriptor,
+ (ServerDescriptor)_templateDescriptor.descriptor);
+ }
+
+ //
// Application is needed to lookup service templates
//
ServerTemplate(boolean brandNew, String name, TemplateDescriptor descriptor,
@@ -67,12 +180,31 @@ class ServerTemplate extends EditableParent
throws UpdateFailedException
{
super(brandNew, name, application.getModel());
+ _ephemeral = false;
rebuild(descriptor, application);
}
+ ServerTemplate(String name, TemplateDescriptor descriptor,
+ Application application)
+ {
+ super(true, name, application.getModel());
+ _ephemeral = true;
+ try
+ {
+ rebuild(descriptor, application);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ }
+
ServerTemplate(ServerTemplate o)
{
super(o, true);
+ assert o._ephemeral == false;
+ _ephemeral = false;
+
_templateDescriptor = o._templateDescriptor;
_iceBoxDescriptor = o._iceBoxDescriptor;
_services = o._services;
@@ -82,6 +214,18 @@ class ServerTemplate extends EditableParent
_propertiesHolder = o._propertiesHolder;
}
+ java.util.List findServiceInstances(String template)
+ {
+ if(_services != null)
+ {
+ return _services.findServiceInstances(template);
+ }
+ else
+ {
+ return new java.util.LinkedList();
+ }
+ }
+
void rebuild(TemplateDescriptor descriptor, Application application)
throws UpdateFailedException
{
@@ -93,31 +237,40 @@ class ServerTemplate extends EditableParent
// Fix-up parameters order
//
java.util.Collections.sort(_templateDescriptor.parameters);
-
- if(_templateDescriptor.descriptor instanceof IceBoxDescriptor)
- {
- _iceBoxDescriptor = (IceBoxDescriptor)_templateDescriptor.descriptor;
-
- _services = new Services(_iceBoxDescriptor.services, true, null,
- application);
- addChild(_services);
- assert _templateDescriptor.descriptor.dbEnvs.size() == 0;
+ if(_ephemeral)
+ {
+ _adapters = null;
_dbEnvs = null;
+ _services = null;
}
else
- {
- _services = null;
- _iceBoxDescriptor = null;
-
- _dbEnvs = new DbEnvs(_templateDescriptor.descriptor.dbEnvs, true,
- null, _model);
- addChild(_dbEnvs);
+ {
+ if(_templateDescriptor.descriptor instanceof IceBoxDescriptor)
+ {
+ _iceBoxDescriptor = (IceBoxDescriptor)_templateDescriptor.descriptor;
+
+ _services = new Services(_iceBoxDescriptor.services, true, null,
+ application);
+ addChild(_services);
+
+ assert _templateDescriptor.descriptor.dbEnvs.size() == 0;
+ _dbEnvs = null;
+ }
+ else
+ {
+ _services = null;
+ _iceBoxDescriptor = null;
+
+ _dbEnvs = new DbEnvs(_templateDescriptor.descriptor.dbEnvs, true,
+ null, _model);
+ addChild(_dbEnvs);
+ }
+
+ _adapters = new Adapters(_templateDescriptor.descriptor.adapters, true,
+ _services != null, null, _model);
+ addChild(_adapters);
}
-
- _adapters = new Adapters(_templateDescriptor.descriptor.adapters, true,
- _services != null, null, _model);
- addChild(_adapters);
}
void removeServiceInstances(String template)
@@ -128,50 +281,12 @@ class ServerTemplate extends EditableParent
}
}
- public java.util.List findAllInstances(CommonBase child)
- {
- java.util.List result = super.findAllInstances(child);
-
- java.util.List serverInstances =
- getApplication().findServerInstances(_id);
-
- java.util.Iterator p = serverInstances.iterator();
- while(p.hasNext())
- {
- Server server = (Server)p.next();
- result.addAll(server.findChildrenWithType(child.getClass()));
- }
- return result;
- }
-
- java.util.List findServiceInstances(String template)
+ TemplateDescriptor copy()
{
- if(_services != null)
- {
- return _services.findServiceInstances(template);
- }
- else
- {
- return new java.util.LinkedList();
- }
- }
-
-
- public PropertiesHolder getPropertiesHolder()
- {
- return _propertiesHolder;
+ return copyDescriptor(_templateDescriptor);
}
- public String toString()
- {
- return templateLabel(_id, _templateDescriptor.parameters);
- }
-
- public Object getDescriptor()
- {
- return _templateDescriptor;
- }
private TemplateDescriptor _templateDescriptor;
private IceBoxDescriptor _iceBoxDescriptor;
@@ -181,6 +296,8 @@ class ServerTemplate extends EditableParent
private DbEnvs _dbEnvs;
private PropertiesHolder _propertiesHolder;
+ private final boolean _ephemeral;
static private ServerTemplateEditor _editor;
+ static private ServerTemplateActions _actions;
}
diff --git a/java/src/IceGrid/TreeNode/ServerTemplateActions.java b/java/src/IceGrid/TreeNode/ServerTemplateActions.java
new file mode 100755
index 00000000000..e8e5e298c69
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServerTemplateActions.java
@@ -0,0 +1,61 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import javax.swing.tree.TreePath;
+
+import IceGrid.Actions;
+import IceGrid.ServerDescriptor;
+import IceGrid.TemplateDescriptor;
+import IceGrid.Model;
+
+class ServerTemplateActions extends Actions
+{
+ ServerTemplateActions(Model model)
+ {
+ super(model);
+ }
+
+ void reset(ServerTemplate serverTemplate)
+ {
+ _serverTemplate = serverTemplate;
+ _copy.setEnabled(true);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof TemplateDescriptor)
+ {
+ TemplateDescriptor d = (TemplateDescriptor)clipboard;
+ _paste.setEnabled(d.descriptor instanceof ServerDescriptor);
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(true);
+ }
+
+ protected void copy()
+ {
+ _model.setClipboard(_serverTemplate.copy());
+ _paste.setEnabled(true);
+ }
+
+ protected void paste()
+ {
+ ((ServerTemplates)_serverTemplate.getParent()).paste();
+ }
+
+ protected void delete()
+ {
+ TreePath parentPath = _serverTemplate.getParent().getPath();
+ _serverTemplate.destroy();
+ _model.setSelectionPath(parentPath);
+ }
+
+ ServerTemplate _serverTemplate;
+}
diff --git a/java/src/IceGrid/TreeNode/ServerTemplates.java b/java/src/IceGrid/TreeNode/ServerTemplates.java
index 6211997ef12..73d750d5957 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplates.java
@@ -8,16 +8,30 @@
// **********************************************************************
package IceGrid.TreeNode;
+import javax.swing.JOptionPane;
+
+import IceGrid.Actions;
+import IceGrid.IceBoxDescriptor;
import IceGrid.Model;
import IceGrid.TemplateDescriptor;
import IceGrid.TreeModelI;
-class ServerTemplates extends EditableParent
+class ServerTemplates extends Templates
{
+ public Actions getActions()
+ {
+ if(_actions == null)
+ {
+ _actions = new ServerTemplatesActions(_model);
+ }
+ _actions.reset(this);
+ return _actions;
+ }
+
ServerTemplates(java.util.Map descriptors, Application application)
throws UpdateFailedException
{
- super(false, "Server templates", application.getModel());
+ super("Server templates", application.getModel());
_descriptors = descriptors;
@@ -116,6 +130,84 @@ class ServerTemplates extends EditableParent
}
}
+ void newServerTemplate()
+ {
+ newServerTemplate(new TemplateDescriptor(
+ Server.newServerDescriptor(),
+ new java.util.LinkedList(),
+ new java.util.TreeMap()));
+ }
+
+ void newIceBoxTemplate()
+ {
+ newServerTemplate(new TemplateDescriptor(
+ Server.newIceBoxDescriptor(),
+ new java.util.LinkedList(),
+ new java.util.TreeMap()));
+ }
+
+
+ void newServerTemplate(TemplateDescriptor descriptor)
+ {
+ String id;
+ if(descriptor.descriptor instanceof IceBoxDescriptor)
+ {
+ id = makeNewChildId("NewIceBoxTemplate");
+ }
+ else
+ {
+ id = makeNewChildId("NewServerTemplate");
+ }
+
+ ServerTemplate t = new ServerTemplate(id, descriptor, getApplication());
+ try
+ {
+ addChild(t, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ _model.setSelectionPath(t.getPath());
+ }
+
+ void paste()
+ {
+ Object descriptor = _model.getClipboard();
+ TemplateDescriptor td = (TemplateDescriptor)descriptor;
+ newServerTemplate(td);
+ }
+
+ boolean tryAdd(String newId, TemplateDescriptor descriptor)
+ {
+ if(findChild(newId) != null)
+ {
+ JOptionPane.showMessageDialog(
+ _model.getMainFrame(),
+ "There is already a server template with the same id.",
+ "Duplicate id",
+ JOptionPane.INFORMATION_MESSAGE);
+ return false;
+ }
+ _descriptors.put(newId, descriptor);
+
+ try
+ {
+ addChild(new ServerTemplate(true, newId, descriptor,
+ getApplication()), true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false; // impossible
+ }
+ return true;
+ }
+
+ protected java.util.List findAllTemplateInstances(String templateId)
+ {
+ return getApplication().findServerInstances(templateId);
+ }
+
void update(java.util.Map updates, String[] removeTemplates)
throws UpdateFailedException
{
@@ -161,5 +253,11 @@ class ServerTemplates extends EditableParent
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));
}
+ void removeDescriptor(String id)
+ {
+ _descriptors.remove(id);
+ }
+
private java.util.Map _descriptors;
+ static private ServerTemplatesActions _actions;
}
diff --git a/java/src/IceGrid/TreeNode/ServerTemplatesActions.java b/java/src/IceGrid/TreeNode/ServerTemplatesActions.java
new file mode 100755
index 00000000000..e82e77033a7
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServerTemplatesActions.java
@@ -0,0 +1,112 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+
+import IceGrid.Actions;
+import IceGrid.Model;
+import IceGrid.ServerDescriptor;
+import IceGrid.TemplateDescriptor;
+
+
+class ServerTemplatesActions extends Actions
+{
+ private class PopupMenu extends JPopupMenu
+ {
+ PopupMenu()
+ {
+ add(_newServerTemplate);
+ add(_newIceBoxTemplate);
+ addPopupMenuListener(_popupListener);
+ }
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ return _popup;
+ }
+
+ protected void paste()
+ {
+ _templates.paste();
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ JMenu templatesMenu = new JMenu("Templates");
+ templatesMenu.setMnemonic(java.awt.event.KeyEvent.VK_T);
+ menuBar.add(templatesMenu);
+
+ templatesMenu.add(_newServerTemplate);
+ templatesMenu.add(_newIceBoxTemplate);
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_newServerTemplate);
+ toolBar.add(_newIceBoxTemplate);
+ }
+
+ ServerTemplatesActions(Model model)
+ {
+ super(model);
+
+ _newServerTemplate = new AbstractAction("New server template")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _templates.newServerTemplate();
+ }
+ };
+ _newServerTemplate.putValue(Action.ACCELERATOR_KEY,
+ KeyStroke.getKeyStroke("ctrl N"));
+
+ _newIceBoxTemplate = new AbstractAction("New IceBox template")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _templates.newIceBoxTemplate();
+ }
+ };
+
+ _popup = new PopupMenu();
+ }
+
+ void reset(ServerTemplates templates)
+ {
+ _templates = templates;
+ _copy.setEnabled(false);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof TemplateDescriptor)
+ {
+ TemplateDescriptor d = (TemplateDescriptor)clipboard;
+ _paste.setEnabled(d.descriptor instanceof ServerDescriptor);
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(false);
+ }
+
+ ServerTemplates _templates;
+ Action _newServerTemplate;
+ Action _newIceBoxTemplate;
+ PopupMenu _popup;
+}
diff --git a/java/src/IceGrid/TreeNode/Service.java b/java/src/IceGrid/TreeNode/Service.java
index 3248b2edb4d..1d0e55bb25b 100755
--- a/java/src/IceGrid/TreeNode/Service.java
+++ b/java/src/IceGrid/TreeNode/Service.java
@@ -10,6 +10,7 @@ package IceGrid.TreeNode;
import IceGrid.SimpleInternalFrame;
+import IceGrid.Actions;
import IceGrid.Model;
import IceGrid.ServiceDescriptor;
import IceGrid.ServiceInstanceDescriptor;
@@ -26,18 +27,25 @@ class Service extends Parent
if(copy.descriptor != null)
{
- copy.descriptor = (ServiceDescriptor)copy.descriptor.clone();
- copy.descriptor.adapters = Adapters.copyDescriptors(copy.descriptor.adapters);
- copy.descriptor.dbEnvs = DbEnvs.copyDescriptors(copy.descriptor.dbEnvs);
-
- //
- // Update to properties is not atomic because of Adapter endpoints
- // (and possibly other properties set through a PropertiesHolder)
- //
- copy.descriptor.properties = (java.util.LinkedList)copy.descriptor.properties.clone();
+ copy.descriptor = copyDescriptor((ServiceDescriptor)copy.descriptor);
}
return copy;
}
+
+ static public ServiceDescriptor
+ copyDescriptor(ServiceDescriptor sd)
+ {
+ ServiceDescriptor copy = (ServiceDescriptor)sd.clone();
+ copy.adapters = Adapters.copyDescriptors(copy.adapters);
+ copy.dbEnvs = DbEnvs.copyDescriptors(copy.dbEnvs);
+
+ //
+ // Update to properties is not atomic because of Adapter endpoints
+ // (and possibly other properties set through a PropertiesHolder)
+ //
+ copy.properties = (java.util.LinkedList)copy.properties.clone();
+ return copy;
+ }
public Object getDescriptor()
{
@@ -74,7 +82,7 @@ class Service extends Parent
}
}
- public Object copy()
+ Object copy()
{
return copyDescriptor(_instanceDescriptor);
}
@@ -85,8 +93,20 @@ class Service extends Parent
((ListParent)_parent).destroyChild(this);
}
+ public Actions getActions()
+ {
+ if(_actions == null)
+ {
+ _actions = new ServiceActions(_model);
+ }
+ _actions.reset(this);
+ return _actions;
+ }
+
public void displayProperties()
{
+ _model.setActions(getActions());
+
SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
propertiesFrame.setTitle("Properties for " + _id);
@@ -108,8 +128,8 @@ class Service extends Parent
_editor.show(this);
propertiesFrame.setContent(_editor.getComponent());
}
- propertiesFrame.validate();
- propertiesFrame.repaint();
+ _model.getMainFrame().validate();
+ _model.getMainFrame().repaint();
}
public String toString()
@@ -131,14 +151,41 @@ class Service extends Parent
public void moveUp()
{
- move(true);
+ assert canMoveUp();
+ ((Services)_parent).move(this, true);
}
public void moveDown()
{
- move(false);
+ assert canMoveDown();
+ ((Services)_parent).move(this, false);
}
+ boolean canMoveUp()
+ {
+ if(_ephemeral)
+ {
+ return false;
+ }
+ else
+ {
+ return ((Services)_parent).canMove(this, true);
+ }
+ }
+
+ boolean canMoveDown()
+ {
+ if(_ephemeral)
+ {
+ return false;
+ }
+ else
+ {
+ return ((Services)_parent).canMove(this, false);
+ }
+ }
+
+
//
// child == _adapters or _dbEnvs
//
@@ -166,13 +213,7 @@ class Service extends Parent
}
- private void move(boolean up)
- {
- if(!_ephemeral)
- {
- ((Services)_parent).move(this, up);
- }
- }
+
Service(String name,
String displayString,
@@ -263,7 +304,7 @@ class Service extends Parent
private ServiceDescriptor _serviceDescriptor;
private String _displayString;
- private boolean _ephemeral;
+ private final boolean _ephemeral;
private Utils.Resolver _resolver;
private Adapters _adapters;
private DbEnvs _dbEnvs;
@@ -272,4 +313,5 @@ class Service extends Parent
static private ServiceEditor _editor;
static private ServiceInstanceEditor _instanceEditor;
+ static private ServiceActions _actions;
}
diff --git a/java/src/IceGrid/TreeNode/ServiceActions.java b/java/src/IceGrid/TreeNode/ServiceActions.java
new file mode 100755
index 00000000000..7c5dbfa0b7d
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServiceActions.java
@@ -0,0 +1,131 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JCheckBox;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+import javax.swing.tree.TreePath;
+
+import IceGrid.Actions;
+import IceGrid.ServiceInstanceDescriptor;
+import IceGrid.Model;
+
+class ServiceActions extends Actions
+{
+ ServiceActions(Model model)
+ {
+ super(model);
+ _substituteTool = new JToggleButton(_model.getSubstituteVarAction());
+ _substituteMenuItem = new JCheckBox(_model.getSubstituteVarAction());
+
+ _moveUp = new AbstractAction("Up")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _service.moveUp();
+ }
+ };
+
+ _moveDown = new AbstractAction("Down")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _service.moveDown();
+ }
+ };
+ }
+
+ void reset(Service service)
+ {
+ _service = service;
+ _copy.setEnabled(true);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof ServiceInstanceDescriptor)
+ {
+ Services services = (Services)_service.getParent();
+ _paste.setEnabled(services.isEditable());
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(_service.isEditable());
+
+ if(_service.getResolver() != null && !_service.isEphemeral())
+ {
+ _model.getSubstituteVarAction().setEnabled(true);
+ _substituteTool.setSelected(_model.substitute());
+ _substituteMenuItem.setSelected(_model.substitute());
+ }
+ else
+ {
+ _model.getSubstituteVarAction().setEnabled(false);
+ }
+
+ _moveUp.setEnabled(_service.canMoveUp());
+ _moveDown.setEnabled(_service.canMoveDown());
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_substituteTool);
+ toolBar.addSeparator();
+ toolBar.add(_moveUp);
+ toolBar.add(_moveDown);
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ JMenu serviceMenu = new JMenu("Service");
+ serviceMenu.setMnemonic(java.awt.event.KeyEvent.VK_S);
+ menuBar.add(serviceMenu);
+
+ serviceMenu.add(_substituteMenuItem);
+ serviceMenu.addSeparator();
+ serviceMenu.add(_moveUp);
+ serviceMenu.add(_moveDown);
+ }
+
+ protected void copy()
+ {
+ _model.setClipboard(_service.copy());
+
+ Services services = (Services)_service.getParent();
+ _paste.setEnabled(services.isEditable());
+ }
+
+ protected void paste()
+ {
+ ((Services)_service.getParent()).paste();
+ }
+
+ protected void delete()
+ {
+ TreePath parentPath = _service.getParent().getPath();
+ _service.destroy();
+ _model.setSelectionPath(parentPath);
+ }
+
+
+ Action _moveUp;
+ Action _moveDown;
+
+ Service _service;
+ JCheckBox _substituteMenuItem;
+ JToggleButton _substituteTool;
+}
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplate.java b/java/src/IceGrid/TreeNode/ServiceTemplate.java
index dca60373a73..1c95e05adfc 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplate.java
@@ -10,14 +10,39 @@ package IceGrid.TreeNode;
import IceGrid.SimpleInternalFrame;
+import IceGrid.Actions;
import IceGrid.ServiceDescriptor;
import IceGrid.TemplateDescriptor;
import IceGrid.Model;
class ServiceTemplate extends EditableParent
{
+ static public TemplateDescriptor
+ copyDescriptor(TemplateDescriptor templateDescriptor)
+ {
+ TemplateDescriptor copy = (TemplateDescriptor)
+ templateDescriptor.clone();
+
+ copy.descriptor = Service.copyDescriptor(
+ (ServiceDescriptor)copy.descriptor);
+
+ return copy;
+ }
+
+ public Actions getActions()
+ {
+ if(_actions == null)
+ {
+ _actions = new ServiceTemplateActions(_model);
+ }
+ _actions.reset(this);
+ return _actions;
+ }
+
public void displayProperties()
{
+ _model.setActions(getActions());
+
SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
propertiesFrame.setTitle("Properties for " + _id);
@@ -27,8 +52,8 @@ class ServiceTemplate extends EditableParent
}
_editor.show(this);
propertiesFrame.setContent(_editor.getComponent());
- propertiesFrame.validate();
- propertiesFrame.repaint();
+ _model.getMainFrame().validate();
+ _model.getMainFrame().repaint();
}
@@ -59,6 +84,7 @@ class ServiceTemplate extends EditableParent
{
super(o, true);
assert o._ephemeral == false;
+ _ephemeral = false;
_templateDescriptor = o._templateDescriptor;
_adapters = o._adapters;
@@ -125,20 +151,18 @@ class ServiceTemplate extends EditableParent
public boolean destroy()
{
- if(_parent != null && _model.canUpdate())
+ ServiceTemplates serviceTemplates = (ServiceTemplates)_parent;
+
+ if(serviceTemplates != null && _ephemeral)
+ {
+ serviceTemplates.removeChild(this, true);
+ return true;
+ }
+ else if(serviceTemplates != null && _model.canUpdate())
{
- ServiceTemplates serviceTemplates = (ServiceTemplates)_parent;
-
- if(_ephemeral)
- {
- serviceTemplates.removeChild(this, true);
- }
- else
- {
- serviceTemplates.removeDescriptor(_id);
- getApplication().removeServiceInstances(_id);
- serviceTemplates.removeElement(this, true);
- }
+ serviceTemplates.removeDescriptor(_id);
+ getApplication().removeServiceInstances(_id);
+ serviceTemplates.removeElement(this, true);
return true;
}
else
@@ -164,7 +188,12 @@ class ServiceTemplate extends EditableParent
return result;
}
-
+ TemplateDescriptor copy()
+ {
+ return copyDescriptor(_templateDescriptor);
+ }
+
+
public Object saveDescriptor()
{
//
@@ -197,8 +226,9 @@ class ServiceTemplate extends EditableParent
private DbEnvs _dbEnvs;
private PropertiesHolder _propertiesHolder;
- private boolean _ephemeral;
+ private final boolean _ephemeral;
static private ServiceTemplateEditor _editor;
+ static private ServiceTemplateActions _actions;
}
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplateActions.java b/java/src/IceGrid/TreeNode/ServiceTemplateActions.java
new file mode 100755
index 00000000000..9d537aec285
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServiceTemplateActions.java
@@ -0,0 +1,61 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import javax.swing.tree.TreePath;
+
+import IceGrid.Actions;
+import IceGrid.ServiceDescriptor;
+import IceGrid.TemplateDescriptor;
+import IceGrid.Model;
+
+class ServiceTemplateActions extends Actions
+{
+ ServiceTemplateActions(Model model)
+ {
+ super(model);
+ }
+
+ void reset(ServiceTemplate serviceTemplate)
+ {
+ _serviceTemplate = serviceTemplate;
+ _copy.setEnabled(true);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof TemplateDescriptor)
+ {
+ TemplateDescriptor d = (TemplateDescriptor)clipboard;
+ _paste.setEnabled(d.descriptor instanceof ServiceDescriptor);
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(true);
+ }
+
+ protected void copy()
+ {
+ _model.setClipboard(_serviceTemplate.copy());
+ _paste.setEnabled(true);
+ }
+
+ protected void paste()
+ {
+ ((ServiceTemplates)_serviceTemplate.getParent()).paste();
+ }
+
+ protected void delete()
+ {
+ TreePath parentPath = _serviceTemplate.getParent().getPath();
+ _serviceTemplate.destroy();
+ _model.setSelectionPath(parentPath);
+ }
+
+ ServiceTemplate _serviceTemplate;
+}
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplates.java b/java/src/IceGrid/TreeNode/ServiceTemplates.java
index bbe398b9663..6695d7a4584 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplates.java
@@ -15,45 +15,21 @@ import javax.swing.Action;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
-
+import IceGrid.Actions;
import IceGrid.Model;
import IceGrid.ServiceDescriptor;
import IceGrid.TemplateDescriptor;
class ServiceTemplates extends Templates
{
- static class NewPopupMenu extends JPopupMenu
+ public Actions getActions()
{
- NewPopupMenu()
- {
- _new = new AbstractAction("New service template")
- {
- public void actionPerformed(ActionEvent e)
- {
- _parent.newServiceTemplate();
- }
- };
-
- add(_new);
- }
-
- void setParent(ServiceTemplates parent)
+ if(_actions == null)
{
- _parent = parent;
+ _actions = new ServiceTemplatesActions(_model);
}
-
- private ServiceTemplates _parent;
- private Action _new;
- }
-
- public JPopupMenu getPopupMenu()
- {
- if(_popup == null)
- {
- _popup = new NewPopupMenu();
- }
- _popup.setParent(this);
- return _popup;
+ _actions.reset(this);
+ return _actions;
}
ServiceTemplates(java.util.Map descriptors, Model model)
@@ -126,16 +102,11 @@ class ServiceTemplates extends Templates
_model.setSelectionPath(t.getPath());
}
- public void paste(Object descriptor)
+ void paste()
{
- if(descriptor instanceof TemplateDescriptor)
- {
- TemplateDescriptor td = (TemplateDescriptor)descriptor;
- if(td.descriptor instanceof ServiceDescriptor)
- {
- newServiceTemplate(td);
- }
- }
+ Object descriptor = _model.getClipboard();
+ TemplateDescriptor td = (TemplateDescriptor)descriptor;
+ newServiceTemplate(td);
}
boolean tryAdd(String newId, TemplateDescriptor descriptor)
@@ -254,9 +225,8 @@ class ServiceTemplates extends Templates
{
_descriptors.remove(id);
}
-
-
+
private java.util.Map _descriptors;
- static private NewPopupMenu _popup;
+ static private ServiceTemplatesActions _actions;
}
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplatesActions.java b/java/src/IceGrid/TreeNode/ServiceTemplatesActions.java
new file mode 100755
index 00000000000..2f65f6318b3
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServiceTemplatesActions.java
@@ -0,0 +1,99 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+
+import IceGrid.Actions;
+import IceGrid.TemplateDescriptor;
+import IceGrid.ServiceDescriptor;
+import IceGrid.Model;
+
+class ServiceTemplatesActions extends Actions
+{
+ private class PopupMenu extends JPopupMenu
+ {
+ PopupMenu()
+ {
+ add(_newServiceTemplate);
+ addPopupMenuListener(_popupListener);
+ }
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ return _popup;
+ }
+
+ protected void paste()
+ {
+ _templates.paste();
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ JMenu templatesMenu = new JMenu("Templates");
+ templatesMenu.setMnemonic(java.awt.event.KeyEvent.VK_T);
+ menuBar.add(templatesMenu);
+
+ templatesMenu.add(_newServiceTemplate);
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_newServiceTemplate);
+ }
+
+ ServiceTemplatesActions(Model model)
+ {
+ super(model);
+
+ _newServiceTemplate = new AbstractAction("New template")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _templates.newServiceTemplate();
+ }
+ };
+ _newServiceTemplate.putValue(Action.ACCELERATOR_KEY,
+ KeyStroke.getKeyStroke("ctrl N"));
+
+ _popup = new PopupMenu();
+ }
+
+ void reset(ServiceTemplates templates)
+ {
+ _templates = templates;
+ _copy.setEnabled(false);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof TemplateDescriptor)
+ {
+ TemplateDescriptor d = (TemplateDescriptor)clipboard;
+ _paste.setEnabled(d.descriptor instanceof ServiceDescriptor);
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(false);
+ }
+
+ ServiceTemplates _templates;
+ Action _newServiceTemplate;
+ PopupMenu _popup;
+}
diff --git a/java/src/IceGrid/TreeNode/Services.java b/java/src/IceGrid/TreeNode/Services.java
index 08b7597f353..6218053ef7f 100755
--- a/java/src/IceGrid/TreeNode/Services.java
+++ b/java/src/IceGrid/TreeNode/Services.java
@@ -15,6 +15,7 @@ import javax.swing.Action;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
+import IceGrid.Actions;
import IceGrid.Model;
import IceGrid.ServiceDescriptor;
import IceGrid.ServiceInstanceDescriptor;
@@ -23,74 +24,6 @@ import IceGrid.Utils;
class Services extends ListParent implements InstanceParent
{
- static class NewPopupMenu extends JPopupMenu
- {
- NewPopupMenu()
- {
- _newService = new AbstractAction("New service")
- {
- public void actionPerformed(ActionEvent e)
- {
- ServiceDescriptor sd =
- new ServiceDescriptor(new java.util.LinkedList(),
- new java.util.LinkedList(),
- new java.util.LinkedList(),
- "",
- "NewService",
- "");
-
- ServiceInstanceDescriptor descriptor =
- new ServiceInstanceDescriptor("",
- new java.util.TreeMap(),
- sd);
- _parent.newService(descriptor);
- }
- };
-
- add(_newService);
-
- _newInstance = new AbstractAction("New template instance")
- {
- public void actionPerformed(ActionEvent e)
- {
- ServiceInstanceDescriptor descriptor =
- new ServiceInstanceDescriptor("",
- new java.util.TreeMap(),
- null);
- _parent.newService(descriptor);
- }
- };
-
- add(_newInstance);
- }
-
- void setParent(Services parent)
- {
- _parent = parent;
- }
-
- private Services _parent;
- private Action _newService;
- private Action _newInstance;
- }
-
- public JPopupMenu getPopupMenu()
- {
- if(_isEditable)
- {
- if(_popup == null)
- {
- _popup = new NewPopupMenu();
- }
- _popup.setParent(this);
- return _popup;
- }
- else
- {
- return null;
- }
- }
-
static public java.util.LinkedList
copyDescriptors(java.util.LinkedList descriptors)
{
@@ -105,7 +38,7 @@ class Services extends ListParent implements InstanceParent
private Service createService(ServiceInstanceDescriptor descriptor,
- Application application) throws UpdateFailedException
+ Application application) throws UpdateFailedException
{
ServiceDescriptor serviceDescriptor = null;
String serviceName = null;
@@ -256,15 +189,13 @@ class Services extends ListParent implements InstanceParent
_model.setSelectionPath(service.getPath());
}
- public void paste(Object descriptor)
+ void paste()
{
- if(_isEditable && descriptor instanceof ServiceInstanceDescriptor)
- {
- ServiceInstanceDescriptor d = (ServiceInstanceDescriptor)descriptor;
- newService(Service.copyDescriptor(d));
- }
+ Object descriptor = _model.getClipboard();
+ ServiceInstanceDescriptor d = (ServiceInstanceDescriptor)descriptor;
+ newService(Service.copyDescriptor(d));
}
-
+
boolean isEditable()
{
return _isEditable;
@@ -397,22 +328,27 @@ class Services extends ListParent implements InstanceParent
return _resolver;
}
- void move(Service service, boolean up)
+ boolean canMove(Service service, boolean up)
{
- if(!_isEditable)
+ if(_isEditable)
{
- return;
+ int index = _descriptors.indexOf(service.getDescriptor());
+ assert index != -1;
+ if(up && index == 0 || !up && (index == _descriptors.size() - 1))
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
}
- //
- // Note: can't have any ephemeral in the list, since a non-ephemeral
- // is selected
- //
+ return false;
+ }
+
+ void move(Service service, boolean up)
+ {
int index = _descriptors.indexOf(service.getDescriptor());
- assert index != -1;
- if(up && index == 0 || !up && (index == _descriptors.size() - 1))
- {
- return;
- }
if(_model.canUpdate())
{
@@ -433,7 +369,6 @@ class Services extends ListParent implements InstanceParent
//
// Propagate to instances
//
-
if(_parent instanceof ServerTemplate)
{
java.util.List instances =
@@ -452,6 +387,11 @@ class Services extends ListParent implements InstanceParent
_model.setSelectionPath(service.getPath());
_model.enableDisplay();
+
+ //
+ // Recompute actions
+ //
+ service.getActions();
}
}
@@ -492,7 +432,16 @@ class Services extends ListParent implements InstanceParent
}
catch(UpdateFailedException e)
{
- restore(child, savedParameterValues);
+ e.addParent(this);
+ //
+ // Restore
+ //
+ if(savedParameterValues != null)
+ {
+ descriptor.parameterValues = savedParameterValues;
+ }
+ addChild(index, child, true);
+
throw e;
}
@@ -526,9 +475,19 @@ class Services extends ListParent implements InstanceParent
}
}
+ public Actions getActions()
+ {
+ if(_actions == null)
+ {
+ _actions = new ServicesActions(_model);
+ }
+ _actions.reset(this);
+ return _actions;
+ }
+
private final boolean _isEditable;
private final Utils.Resolver _resolver;
- static private NewPopupMenu _popup;
+ static private ServicesActions _actions;
}
diff --git a/java/src/IceGrid/TreeNode/ServicesActions.java b/java/src/IceGrid/TreeNode/ServicesActions.java
new file mode 100755
index 00000000000..21d23817938
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServicesActions.java
@@ -0,0 +1,136 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JCheckBox;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPopupMenu;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.KeyStroke;
+
+import IceGrid.Actions;
+import IceGrid.ServiceDescriptor;
+import IceGrid.ServiceInstanceDescriptor;
+import IceGrid.Model;
+
+class ServicesActions extends Actions
+{
+ private class PopupMenu extends JPopupMenu
+ {
+ PopupMenu()
+ {
+ add(_newService);
+ add(_newInstance);
+ addPopupMenuListener(_popupListener);
+ }
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(_newService.isEnabled())
+ {
+ return _popup;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ protected void paste()
+ {
+ _services.paste();
+ }
+
+ protected void addMenu(JMenuBar menuBar)
+ {
+ JMenu servicesMenu = new JMenu("Services");
+ servicesMenu.setMnemonic(java.awt.event.KeyEvent.VK_S);
+ menuBar.add(servicesMenu);
+
+ servicesMenu.add(_newService);
+ servicesMenu.add(_newInstance);
+ }
+
+ protected void addTools(JToolBar toolBar)
+ {
+ toolBar.add(_newService);
+ toolBar.add(_newInstance);
+ }
+
+ ServicesActions(Model model)
+ {
+ super(model);
+
+ _newService = new AbstractAction("New service")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ ServiceDescriptor sd =
+ new ServiceDescriptor(new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ "",
+ "NewService",
+ "");
+
+ ServiceInstanceDescriptor descriptor =
+ new ServiceInstanceDescriptor("",
+ new java.util.TreeMap(),
+ sd);
+ _services.newService(descriptor);
+ }
+ };
+ _newService.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl N"));
+
+ _newInstance = new AbstractAction("New template instance")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ ServiceInstanceDescriptor descriptor =
+ new ServiceInstanceDescriptor("",
+ new java.util.TreeMap(),
+ null);
+ _services.newService(descriptor);
+ }
+ };
+
+ _popup = new PopupMenu();
+ }
+
+ void reset(Services services)
+ {
+ _services = services;
+ _copy.setEnabled(false);
+ Object clipboard = _model.getClipboard();
+ if(clipboard != null && clipboard instanceof ServiceInstanceDescriptor)
+ {
+ _paste.setEnabled(_services.isEditable());
+ }
+ else
+ {
+ _paste.setEnabled(false);
+ }
+ _delete.setEnabled(false);
+
+ _newService.setEnabled(_services.isEditable());
+ _newInstance.setEnabled(_services.isEditable());
+ }
+
+ Services _services;
+ Action _newService;
+ Action _newInstance;
+ PopupMenu _popup;
+}
diff --git a/java/src/IceGrid/TreeNode/TemplateEditor.java b/java/src/IceGrid/TreeNode/TemplateEditor.java
index 4e68ea07491..3cf724141c0 100755
--- a/java/src/IceGrid/TreeNode/TemplateEditor.java
+++ b/java/src/IceGrid/TreeNode/TemplateEditor.java
@@ -79,7 +79,7 @@ class TemplateEditor extends Editor
boolean isSimpleUpdate()
{
TemplateDescriptor descriptor = getDescriptor();
- return _parameters.getText().equals(descriptor.parameters);
+ return _parameters.getText().equals(parametersToString(descriptor.parameters));
}
void append(DefaultFormBuilder builder)
diff --git a/java/src/IceGrid/TreeNode/Templates.java b/java/src/IceGrid/TreeNode/Templates.java
index a27f017ebdb..543561b30d6 100755
--- a/java/src/IceGrid/TreeNode/Templates.java
+++ b/java/src/IceGrid/TreeNode/Templates.java
@@ -8,6 +8,8 @@
// **********************************************************************
package IceGrid.TreeNode;
+import javax.swing.JOptionPane;
+
import IceGrid.Model;
import IceGrid.TemplateDescriptor;
@@ -55,6 +57,13 @@ abstract class Templates extends EditableParent
parent = (InstanceParent)parentList.get(i);
parent.restore((CommonBase)instanceList.get(i), backupList.get(i));
}
+
+ JOptionPane.showMessageDialog(
+ _model.getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
+
return false;
}
diff --git a/java/src/IceGrid/TreeNode/UpdateFailedException.java b/java/src/IceGrid/TreeNode/UpdateFailedException.java
index 2b68fa2f0d9..e6e7b8b5a71 100755
--- a/java/src/IceGrid/TreeNode/UpdateFailedException.java
+++ b/java/src/IceGrid/TreeNode/UpdateFailedException.java
@@ -8,13 +8,15 @@
// **********************************************************************
package IceGrid.TreeNode;
+import javax.swing.tree.TreePath;
+
class UpdateFailedException extends Exception
{
UpdateFailedException(Parent parent, String duplicateName)
{
_duplicateName = duplicateName;
_parentList = new java.util.LinkedList();
- addParent(parent);
+ _parentList.addFirst(parent);
}
UpdateFailedException(String message)
@@ -26,7 +28,8 @@ class UpdateFailedException extends Exception
{
if(_message == null)
{
- if(_parentList.get(0) != parent)
+ Parent firstParent = (Parent)_parentList.get(0);
+ if(firstParent != parent && firstParent.getParent() == null)
{
_parentList.addFirst(parent);
}
@@ -40,15 +43,33 @@ class UpdateFailedException extends Exception
_message = "";
if(_parentList != null)
{
+ TreePath path = null;
+
java.util.Iterator p = _parentList.iterator();
while(p.hasNext())
{
Parent parent = (Parent)p.next();
+ if(path == null)
+ {
+ path = parent.getPath();
+ if(path == null)
+ {
+ path = new TreePath(parent);
+ }
+ }
+ else
+ {
+ path = path.pathByAddingChild(parent);
+ }
+ }
+
+ for(int i = 1; i < path.getPathCount(); ++i)
+ {
if(!_message.equals(""))
{
_message += "/";
}
- _message += parent.getId();
+ _message += ((CommonBase)path.getPathComponent(i)).getId();
}
}
else