diff options
author | Bernard Normier <bernard@zeroc.com> | 2006-12-04 17:02:43 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2006-12-04 17:02:43 +0000 |
commit | b1863fa8330d6f06b9dbddbea0c11be53320e1a5 (patch) | |
tree | 38e118544bb38b0884e85c88384c6772033480f0 /java/src | |
parent | Added extra proxy properties (diff) | |
download | ice-b1863fa8330d6f06b9dbddbea0c11be53320e1a5.tar.bz2 ice-b1863fa8330d6f06b9dbddbea0c11be53320e1a5.tar.xz ice-b1863fa8330d6f06b9dbddbea0c11be53320e1a5.zip |
Numerous fixes: copy/paste etc, auto-apply by default and more
Diffstat (limited to 'java/src')
-rwxr-xr-x | java/src/IceGridGUI/Application/AbstractServerEditor.java | 20 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/ApplicationEditor.java | 2 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/Communicator.java | 5 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/CommunicatorChildEditor.java | 17 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/Editor.java | 14 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/Node.java | 13 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/NodeEditor.java | 14 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/PropertySetEditor.java | 14 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/ReplicaGroupEditor.java | 13 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/Root.java | 34 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/TemplateEditor.java | 19 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Application/TreeNode.java | 15 | ||||
-rwxr-xr-x | java/src/IceGridGUI/ApplicationActions.java | 13 | ||||
-rwxr-xr-x | java/src/IceGridGUI/ApplicationPane.java | 74 | ||||
-rwxr-xr-x | java/src/IceGridGUI/Coordinator.java | 241 |
15 files changed, 419 insertions, 89 deletions
diff --git a/java/src/IceGridGUI/Application/AbstractServerEditor.java b/java/src/IceGridGUI/Application/AbstractServerEditor.java index 19a9ee33aa7..b8d2d78fb16 100755 --- a/java/src/IceGridGUI/Application/AbstractServerEditor.java +++ b/java/src/IceGridGUI/Application/AbstractServerEditor.java @@ -37,7 +37,7 @@ abstract class AbstractServerEditor extends Editor _propertiesPanel.setName("Server Properties"); } - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { Root root = _target.getRoot(); Server server = (Server)_target; @@ -90,9 +90,13 @@ abstract class AbstractServerEditor extends Editor // Success // _target = (TreeNode)node.findChildWithDescriptor(server.getDescriptor()); - root.updated(); - root.setSelectedNode(_target); + + if(refresh) + { + root.setSelectedNode(_target); + } + } else if(isSimpleUpdate()) { @@ -154,10 +158,16 @@ abstract class AbstractServerEditor extends Editor _target = node.findChildWithDescriptor(server.getDescriptor()); root.updated(); - root.setSelectedNode(_target); + if(refresh) + { + root.setSelectedNode(_target); + } } - root.getCoordinator().getCurrentTab().showNode(_target); + if(refresh) + { + root.getCoordinator().getCurrentTab().showNode(_target); + } _applyButton.setEnabled(false); _discardButton.setEnabled(false); return true; diff --git a/java/src/IceGridGUI/Application/ApplicationEditor.java b/java/src/IceGridGUI/Application/ApplicationEditor.java index 474d676ed7c..bb3b006f5a0 100755 --- a/java/src/IceGridGUI/Application/ApplicationEditor.java +++ b/java/src/IceGridGUI/Application/ApplicationEditor.java @@ -28,7 +28,7 @@ import IceGridGUI.*; class ApplicationEditor extends Editor { - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { Root root = (Root)_target; MainPane mainPane = _target.getCoordinator().getMainPane(); diff --git a/java/src/IceGridGUI/Application/Communicator.java b/java/src/IceGridGUI/Application/Communicator.java index 76ecd061c1e..85d3eb15c0c 100755 --- a/java/src/IceGridGUI/Application/Communicator.java +++ b/java/src/IceGridGUI/Application/Communicator.java @@ -737,9 +737,7 @@ abstract class Communicator extends TreeNode implements DescriptorHolder if(t == null) { - t = (ServiceTemplate)getRoot().getServiceTemplates().getChildAt(0); - - if(t == null) + if(getRoot().getServiceTemplates().getChildCount() == 0) { JOptionPane.showMessageDialog( getCoordinator().getMainFrame(), @@ -750,6 +748,7 @@ abstract class Communicator extends TreeNode implements DescriptorHolder } else { + t = (ServiceTemplate)getRoot().getServiceTemplates().getChildAt(0); descriptor.template = t.getId(); descriptor.parameterValues = new java.util.HashMap(); } diff --git a/java/src/IceGridGUI/Application/CommunicatorChildEditor.java b/java/src/IceGridGUI/Application/CommunicatorChildEditor.java index d9ccbe65788..b54c97208fb 100755 --- a/java/src/IceGridGUI/Application/CommunicatorChildEditor.java +++ b/java/src/IceGridGUI/Application/CommunicatorChildEditor.java @@ -21,7 +21,7 @@ abstract class CommunicatorChildEditor extends Editor void postUpdate() {} - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { Root root = _target.getRoot(); root.disableSelectionListener(); @@ -68,7 +68,10 @@ abstract class CommunicatorChildEditor extends Editor // _target = childList.findChildWithDescriptor(descriptor); root.updated(); - root.setSelectedNode(_target); + if(refresh) + { + root.setSelectedNode(_target); + } } else if(isSimpleUpdate()) { @@ -104,12 +107,18 @@ abstract class CommunicatorChildEditor extends Editor // _target = childList.findChildWithDescriptor(_target.getDescriptor()); root.updated(); - root.setSelectedNode(_target); + if(refresh) + { + root.setSelectedNode(_target); + } } postUpdate(); - root.getCoordinator().getCurrentTab().showNode(_target); + if(refresh) + { + root.getCoordinator().getCurrentTab().showNode(_target); + } _applyButton.setEnabled(false); _discardButton.setEnabled(false); return true; diff --git a/java/src/IceGridGUI/Application/Editor.java b/java/src/IceGridGUI/Application/Editor.java index 62298aa0f04..7f3db446282 100755 --- a/java/src/IceGridGUI/Application/Editor.java +++ b/java/src/IceGridGUI/Application/Editor.java @@ -57,11 +57,11 @@ public class Editor extends EditorBase return result; } - public boolean save() + public boolean save(boolean refresh) { if(_applyButton.isEnabled()) { - return validate() && applyUpdate(); + return validate() && applyUpdate(refresh); } else { @@ -74,7 +74,7 @@ public class Editor extends EditorBase return true; } - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { assert false; return false; @@ -122,7 +122,10 @@ public class Editor extends EditorBase { if(validate()) { - applyUpdate(); + if(applyUpdate(true)) + { + _target.getRoot().getTree().grabFocus(); + } } } }; @@ -137,6 +140,7 @@ public class Editor extends EditorBase public void actionPerformed(ActionEvent e) { discardUpdate(); + _target.getRoot().getTree().grabFocus(); } }; _discardButton = new JButton(discard); @@ -174,7 +178,7 @@ public class Editor extends EditorBase return null; } - TreeNode getTarget() + public TreeNode getTarget() { return _target; } diff --git a/java/src/IceGridGUI/Application/Node.java b/java/src/IceGridGUI/Application/Node.java index b413385fd1d..f264ccc4b37 100755 --- a/java/src/IceGridGUI/Application/Node.java +++ b/java/src/IceGridGUI/Application/Node.java @@ -1261,9 +1261,7 @@ class Node extends TreeNode implements PropertySetParent if(t == null) { - t = (ServerTemplate)root.getServerTemplates().getChildAt(0); - - if(t == null) + if(root.getServerTemplates().getChildCount() == 0) { JOptionPane.showMessageDialog( getCoordinator().getMainFrame(), @@ -1272,11 +1270,10 @@ class Node extends TreeNode implements PropertySetParent JOptionPane.INFORMATION_MESSAGE); return; } - else - { - descriptor.template = t.getId(); - descriptor.parameterValues = new java.util.HashMap(); - } + + t = (ServerTemplate)root.getServerTemplates().getChildAt(0); + descriptor.template = t.getId(); + descriptor.parameterValues = new java.util.HashMap(); } ServerInstance server = new ServerInstance(this, id, descriptor); diff --git a/java/src/IceGridGUI/Application/NodeEditor.java b/java/src/IceGridGUI/Application/NodeEditor.java index 10cc65e1a9b..5a0aaffd7c8 100755 --- a/java/src/IceGridGUI/Application/NodeEditor.java +++ b/java/src/IceGridGUI/Application/NodeEditor.java @@ -36,7 +36,7 @@ class NodeEditor extends Editor _propertiesPanel.setName("Node Properties"); } - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { Root root = _target.getRoot(); @@ -81,7 +81,10 @@ class NodeEditor extends Editor // _target = nodes.findChildWithDescriptor(descriptor); root.updated(); - root.setSelectedNode(_target); + if(refresh) + { + root.setSelectedNode(_target); + } } else if(isSimpleUpdate()) { @@ -109,7 +112,7 @@ class NodeEditor extends Editor } catch(UpdateFailedException e) { - ((Node)_target) .restoreDescriptor(savedDescriptor); + ((Node)_target).restoreDescriptor(savedDescriptor); JOptionPane.showMessageDialog( root.getCoordinator().getMainFrame(), e.toString(), @@ -129,7 +132,10 @@ class NodeEditor extends Editor root.updated(); } - root.getCoordinator().getCurrentTab().showNode(_target); + if(refresh) + { + root.getCoordinator().getCurrentTab().showNode(_target); + } _applyButton.setEnabled(false); _discardButton.setEnabled(false); return true; diff --git a/java/src/IceGridGUI/Application/PropertySetEditor.java b/java/src/IceGridGUI/Application/PropertySetEditor.java index af61997df74..a287b1c2645 100755 --- a/java/src/IceGridGUI/Application/PropertySetEditor.java +++ b/java/src/IceGridGUI/Application/PropertySetEditor.java @@ -32,7 +32,7 @@ import IceGridGUI.*; class PropertySetEditor extends Editor { - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { PropertySet nps = (PropertySet)_target; Root root = nps.getRoot(); @@ -79,9 +79,12 @@ class PropertySetEditor extends Editor // Success // _target = ((TreeNode)parent).findChildWithDescriptor(descriptor); - root.updated(); - root.setSelectedNode(_target); _id.setEditable(false); + root.updated(); + if(refresh) + { + root.setSelectedNode(_target); + } } else { @@ -90,7 +93,10 @@ class PropertySetEditor extends Editor nps.getEditable().markModified(); } - root.getCoordinator().getCurrentTab().showNode(_target); + if(refresh) + { + root.getCoordinator().getCurrentTab().showNode(_target); + } _applyButton.setEnabled(false); _discardButton.setEnabled(false); return true; diff --git a/java/src/IceGridGUI/Application/ReplicaGroupEditor.java b/java/src/IceGridGUI/Application/ReplicaGroupEditor.java index e6a126dfea8..4cb075956c4 100755 --- a/java/src/IceGridGUI/Application/ReplicaGroupEditor.java +++ b/java/src/IceGridGUI/Application/ReplicaGroupEditor.java @@ -32,7 +32,7 @@ import IceGridGUI.*; class ReplicaGroupEditor extends Editor { - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { ReplicaGroup replicaGroup = (ReplicaGroup)_target; Root root = replicaGroup.getRoot(); @@ -138,10 +138,17 @@ class ReplicaGroupEditor extends Editor _target = replicaGroups.findChildWithDescriptor(descriptor); root.updated(); - root.setSelectedNode(_target); + + if(refresh) + { + root.setSelectedNode(_target); + } } - root.getCoordinator().getCurrentTab().showNode(_target); + if(refresh) + { + root.getCoordinator().getCurrentTab().showNode(_target); + } _applyButton.setEnabled(false); _discardButton.setEnabled(false); return true; diff --git a/java/src/IceGridGUI/Application/Root.java b/java/src/IceGridGUI/Application/Root.java index a3d96bb71fc..7aec1d77fbc 100755 --- a/java/src/IceGridGUI/Application/Root.java +++ b/java/src/IceGridGUI/Application/Root.java @@ -103,6 +103,13 @@ public class Root extends ListTreeNode _tree = new JTree(this, true); _treeModel = (DefaultTreeModel)_tree.getModel(); + + // + // Rebind "copy" and "paste" + // + javax.swing.ActionMap am = _tree.getActionMap(); + am.put("copy", _coordinator.getActionsForMenu().get(COPY)); + am.put("paste", _coordinator.getActionsForMenu().get(PASTE)); } @@ -927,6 +934,10 @@ public class Root extends ListTreeNode assert ok; } _concurrentUpdates.clear(); + + _coordinator.getSaveAction().setEnabled(false); + _coordinator.getDiscardUpdatesAction().setEnabled(false); + _coordinator.getSaveToRegistryAction().setEnabled(false); } } @@ -959,7 +970,7 @@ public class Root extends ListTreeNode public boolean needsSaving() { - return _updated; + return _updated || !_registryUpdatesEnabled; } Editor getEditor(Class c, TreeNode node) @@ -1025,23 +1036,22 @@ public class Root extends ListTreeNode // void disableRegistryUpdates() { - _registryUpdatesEnabled = false; + if(_registryUpdatesEnabled) + { + _registryUpdatesEnabled = false; + _coordinator.getSaveAction().setEnabled(_live && _coordinator.connectedToMaster() || _file != null); + _coordinator.getDiscardUpdatesAction().setEnabled(_live || _file != null); + _coordinator.getSaveToRegistryAction().setEnabled(_coordinator.connectedToMaster()); + } } void updated() { _updated = true; - _registryUpdatesEnabled = false; // can be true before that when updated() is called by destroy() - + disableRegistryUpdates(); // can be still enabled when updated() is called by destroy() + _concurrentUpdates.clear(); - - _coordinator.getSaveAction().setEnabled(_live && _coordinator.connectedToMaster() || _file != null); - _coordinator.getDiscardUpdatesAction().setEnabled(_live || _file != null); - - _coordinator.getSaveToRegistryAction().setEnabled(_coordinator.connectedToMaster()); - _coordinator.getSaveToFileAction().setEnabled(true); } - void rebuild() throws UpdateFailedException { @@ -1208,7 +1218,7 @@ public class Root extends ListTreeNode private boolean _discardMe = false; // - // True when any update was applies to this application + // True when any update was applied to this application // (including children) // private boolean _updated = false; diff --git a/java/src/IceGridGUI/Application/TemplateEditor.java b/java/src/IceGridGUI/Application/TemplateEditor.java index 7f40fe78b22..8adfb8d498b 100755 --- a/java/src/IceGridGUI/Application/TemplateEditor.java +++ b/java/src/IceGridGUI/Application/TemplateEditor.java @@ -98,7 +98,7 @@ class TemplateEditor extends Editor _parameters.set(descriptor.parameters, descriptor.parameterDefaults); } - protected boolean applyUpdate() + protected boolean applyUpdate(boolean refresh) { Root root = _target.getRoot(); root.disableSelectionListener(); @@ -144,8 +144,11 @@ class TemplateEditor extends Editor // _target = parent.findChildWithDescriptor(descriptor); root.updated(); - root.setSelectedNode(_target); _template.setEditable(false); + if(refresh) + { + root.setSelectedNode(_target); + } } else if(isSimpleUpdate()) { @@ -188,11 +191,17 @@ class TemplateEditor extends Editor ((Communicator)_target).getEnclosingEditable().markModified(); root.updated(); - _target = parent.findChildWithDescriptor(getDescriptor()); - root.setSelectedNode(_target); + _target = parent.findChildWithDescriptor(getDescriptor()); + if(refresh) + { + root.setSelectedNode(_target); + } } - root.getCoordinator().getCurrentTab().showNode(_target); + if(refresh) + { + root.getCoordinator().getCurrentTab().showNode(_target); + } _applyButton.setEnabled(false); _discardButton.setEnabled(false); return true; diff --git a/java/src/IceGridGUI/Application/TreeNode.java b/java/src/IceGridGUI/Application/TreeNode.java index 54e5d68ea44..ae738a718f1 100755 --- a/java/src/IceGridGUI/Application/TreeNode.java +++ b/java/src/IceGridGUI/Application/TreeNode.java @@ -26,8 +26,7 @@ public abstract class TreeNode extends TreeNodeBase abstract void write(XMLWriter writer) throws java.io.IOException; // - // Ephemeral objects are destroyed when you switch selection - // without "apply"ing the changes. + // Ephemeral objects are destroyed when discard their changes // public boolean isEphemeral() { @@ -362,7 +361,19 @@ public abstract class TreeNode extends TreeNodeBase } public void delete() { + boolean enabled = getRoot().isSelectionListenerEnabled(); + + if(enabled) + { + getRoot().disableSelectionListener(); + } destroy(); + getCoordinator().getCurrentTab().showNode(null); + if(enabled) + { + getRoot().enableSelectionListener(); + } + if(_parent != null) { getRoot().setSelectedNode((TreeNode)_parent); diff --git a/java/src/IceGridGUI/ApplicationActions.java b/java/src/IceGridGUI/ApplicationActions.java index 4468b20dc80..f9051d2ada8 100755 --- a/java/src/IceGridGUI/ApplicationActions.java +++ b/java/src/IceGridGUI/ApplicationActions.java @@ -178,34 +178,29 @@ public class ApplicationActions { public void actionPerformed(ActionEvent e) { + assert isEnabled(); _target.copy(); } }; - _array[TreeNode.COPY].putValue(Action.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_C, MENU_MASK)); - _array[TreeNode.COPY].putValue(Action.SHORT_DESCRIPTION, "Copy"); _array[TreeNode.PASTE] = new AbstractAction("Paste") { public void actionPerformed(ActionEvent e) { + assert isEnabled(); _target.paste(); } }; - _array[TreeNode.PASTE].putValue(Action.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_V, MENU_MASK)); - _array[TreeNode.PASTE].putValue(Action.SHORT_DESCRIPTION, "Paste"); _array[TreeNode.DELETE] = new AbstractAction("Delete") { public void actionPerformed(ActionEvent e) { + assert isEnabled(); _target.delete(); } }; - _array[TreeNode.DELETE].putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("DELETE")); - _array[TreeNode.DELETE].putValue(Action.SHORT_DESCRIPTION, "Delete"); - + _array[TreeNode.SHOW_VARS] = new AbstractAction("Show variables") { diff --git a/java/src/IceGridGUI/ApplicationPane.java b/java/src/IceGridGUI/ApplicationPane.java index 6525d59d6db..6827accb31e 100755 --- a/java/src/IceGridGUI/ApplicationPane.java +++ b/java/src/IceGridGUI/ApplicationPane.java @@ -129,6 +129,14 @@ public class ApplicationPane extends JSplitPane implements Tab public void back() { + // + // Auto-apply changes + // + if(_currentEditor != null && !_currentEditor.save(false)) + { + return; + } + TreeNode previousNode = null; do { @@ -159,6 +167,11 @@ public class ApplicationPane extends JSplitPane implements Tab public void forward() { + if(_currentEditor != null && !_currentEditor.save(false)) + { + return; + } + TreeNode nextNode = null; do { @@ -247,21 +260,21 @@ public class ApplicationPane extends JSplitPane implements Tab public void save() { - if(_currentEditor == null || _currentEditor.save()) + if(_currentEditor == null || _currentEditor.save(true)) { _root.save(); } } public void saveToRegistry() { - if(_currentEditor == null || _currentEditor.save()) + if(_currentEditor == null || _currentEditor.save(true)) { _root.saveToRegistry(); } } public void saveToFile() { - if(_currentEditor == null || _currentEditor.save()) + if(_currentEditor == null || _currentEditor.save(true)) { _root.saveToFile(); } @@ -276,6 +289,18 @@ public class ApplicationPane extends JSplitPane implements Tab return true; } + private void registerAction(Coordinator c, int index) + { + Action action = c.getActionsForMenu().get(index); + + javax.swing.ActionMap am = _leftPane.getActionMap(); + javax.swing.InputMap im = _leftPane.getInputMap(); + + im.put((KeyStroke)action.getValue(Action.ACCELERATOR_KEY), (String)action.getValue(Action.NAME)); + am.put((String)action.getValue(Action.NAME), action); + } + + ApplicationPane(Root root) { super(JSplitPane.HORIZONTAL_SPLIT, true); @@ -283,7 +308,11 @@ public class ApplicationPane extends JSplitPane implements Tab _leftPane = new SimpleInternalFrame("Descriptors"); _leftPane.setPreferredSize(new Dimension(280, 350)); - + Coordinator c = root.getCoordinator(); + registerAction(c, TreeNode.COPY); + registerAction(c, TreeNode.PASTE); + registerAction(c, TreeNode.DELETE); + // // Right pane // @@ -374,25 +403,42 @@ public class ApplicationPane extends JSplitPane implements Tab { if(_root.isSelectionListenerEnabled()) { - TreePath path = null; - if(e.isAddedPath()) - { - path = e.getPath(); - } - - if(path == null) + // + // Auto-apply changes + // + if(_currentEditor != null && !_currentEditor.save(false)) { - showNode(null); + // + // Go back to this path + // + _root.disableSelectionListener(); + _root.setSelectedNode(_currentEditor.getTarget()); + _root.enableSelectionListener(); } else { - showNode((TreeNode)path.getLastPathComponent()); + if(e.isAddedPath()) + { + TreePath path = e.getPath(); + + if(path == null) + { + showNode(null); + } + else + { + showNode((TreeNode)path.getLastPathComponent()); + } + } + else + { + showNode(null); + } } } } } - private Root _root; private SimpleInternalFrame _leftPane; private SimpleInternalFrame _propertiesFrame; diff --git a/java/src/IceGridGUI/Coordinator.java b/java/src/IceGridGUI/Coordinator.java index 7527703c030..1ea813f88b1 100755 --- a/java/src/IceGridGUI/Coordinator.java +++ b/java/src/IceGridGUI/Coordinator.java @@ -41,6 +41,7 @@ import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; +import javax.swing.JMenuItem; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -51,9 +52,11 @@ import javax.swing.JTree; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import javax.swing.TransferHandler; import javax.swing.border.EmptyBorder; import javax.swing.filechooser.FileFilter; +import javax.swing.text.JTextComponent; import com.jgoodies.looks.Options; import com.jgoodies.looks.HeaderStyle; @@ -106,6 +109,180 @@ public class Coordinator JLabel _text; } + private class ActionWrapper extends AbstractAction implements java.beans.PropertyChangeListener + { + public ActionWrapper(String name) + { + super(name); + setEnabled(false); + } + + public void actionPerformed(ActionEvent e) + { + if(_target != null) + { + _target.actionPerformed(e); + } + } + + public void propertyChange(java.beans.PropertyChangeEvent e) + { + // + // The only property we're interested in is isEnabled + // + + java.beans.PropertyChangeListener[] l = getPropertyChangeListeners(); + for(int i = 0; i < l.length; ++i) + { + l[i].propertyChange(e); + } + } + + void setTarget(Action t) + { + if(_target != t) + { + if(_target != null) + { + _target.removePropertyChangeListener(this); + } + _target = t; + if(_target != null) + { + _target.addPropertyChangeListener(this); + setEnabled(_target.isEnabled()); + } + else + { + setEnabled(false); + } + } + } + + Action getTarget() + { + return _target; + } + + private Action _target; + } + + private class DeleteTextAction extends AbstractAction + { + public DeleteTextAction(String name) + { + super(name); + } + + public void actionPerformed(ActionEvent e) + { + if(_target != null) + { + Action a = _target.getActionMap().get("delete-next"); + if(a != null) + { + a.actionPerformed(new ActionEvent(_target, ActionEvent.ACTION_PERFORMED, null)); + } + } + } + + void setTarget(JTextComponent t) + { + _target = t; + } + + private JTextComponent _target; + + } + + private class FocusListener implements java.beans.PropertyChangeListener + { + public void propertyChange(java.beans.PropertyChangeEvent e) + { + Object o = e.getNewValue(); + if(o == null) + { + unknownTarget(); + } + else if(o instanceof JTextComponent) + { + enableTextEditActions((JTextComponent)o); + } + else if(o instanceof JTree) + { + JTree tree = (JTree)o; + if(tree.getModel().getRoot() instanceof IceGridGUI.Application.Root) + { + enableTreetEditActions(); + } + else + { + disableAllEditMenusAndButtons(); + } + } + else + { + unknownTarget(); + } + } + + private void unknownTarget() + { + if(_copy.getTarget() == _copyText) + { + disableAllEditMenusAndButtons(); + } + // + // Otherwise (for good tree), do nothing. + // + } + + private void disableAllEditMenusAndButtons() + { + _cut.setTarget(null); + _copy.setTarget(null); + _paste.setTarget(null); + _delete.setTarget(null); + _moveUp.setTarget(null); + _moveDown.setTarget(null); + } + + private void enableTextEditActions(JTextComponent target) + { + boolean editable = target.isEditable() && target.isEnabled(); + + _cutText.setEnabled(editable); + _copyText.setEnabled(true); + _pasteText.setEnabled(editable); + _deleteText.setEnabled(editable); + _deleteText.setTarget(target); + + if(_copy.getTarget() != _copyText) + { + _cut.setTarget(_cutText); + _copy.setTarget(_copyText); + _paste.setTarget(_pasteText); + _delete.setTarget(_deleteText); + _moveUp.setTarget(null); + _moveDown.setTarget(null); + } + } + + private void enableTreetEditActions() + { + if(_copy.getTarget() != _appActionsForMenu.get(IceGridGUI.Application.TreeNode.COPY)) + { + _cut.setTarget(null); + _copy.setTarget(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.COPY)); + _paste.setTarget(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.PASTE)); + _delete.setTarget(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.DELETE)); + _moveUp.setTarget(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.MOVE_UP)); + _moveDown.setTarget(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.MOVE_DOWN)); + } + } + } + + private class MenuBar extends JMenuBar { private MenuBar() @@ -196,13 +373,14 @@ public class Coordinator JMenu editMenu = new JMenu("Edit"); editMenu.setMnemonic(java.awt.event.KeyEvent.VK_E); add(editMenu); - editMenu.add(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.COPY)); - editMenu.add(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.PASTE)); - editMenu.addSeparator(); - editMenu.add(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.DELETE)); + + editMenu.add(_cut); + editMenu.add(_copy); + editMenu.add(_paste); + editMenu.add(_delete); editMenu.addSeparator(); - editMenu.add(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.MOVE_UP)); - editMenu.add(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.MOVE_DOWN)); + editMenu.add(_moveUp); + editMenu.add(_moveDown); // // View menu @@ -340,15 +518,15 @@ public class Coordinator addSeparator(); - button = new JButton(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.COPY)); + button = new JButton(_copy); button.setText(null); button.setIcon(Utils.getIcon("/icons/24x24/copy.png")); add(button); - button = new JButton(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.PASTE)); + button = new JButton(_paste); button.setText(null); button.setIcon(Utils.getIcon("/icons/24x24/paste.png")); add(button); - button = new JButton(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.DELETE)); + button = new JButton(_delete); button.setText(null); button.setIcon(Utils.getIcon("/icons/24x24/delete.png")); add(button); @@ -1709,6 +1887,30 @@ public class Coordinator }; _patchApplication.setEnabled(false); + + _cut = new ActionWrapper("Cut"); + _cut.putValue(Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_X, MENU_MASK)); + _cut.putValue(Action.SHORT_DESCRIPTION, "Cut"); + + _copy = new ActionWrapper("Copy"); + _copy.putValue(Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_C, MENU_MASK)); + _copy.putValue(Action.SHORT_DESCRIPTION, "Copy"); + + _paste = new ActionWrapper("Paste"); + _paste.putValue(Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_V, MENU_MASK)); + _paste.putValue(Action.SHORT_DESCRIPTION, "Paste"); + + _delete = new ActionWrapper("Delete"); + _delete.putValue(Action.ACCELERATOR_KEY, + KeyStroke.getKeyStroke("DELETE")); + _delete.putValue(Action.SHORT_DESCRIPTION, "Delete"); + + _moveUp = new ActionWrapper("Move up"); + _moveDown = new ActionWrapper("Move down"); + _showVarsMenuItem = new JCheckBoxMenuItem(_appActionsForMenu.get(IceGridGUI.Application.TreeNode.SHOW_VARS)); _showVarsTool = new @@ -1742,6 +1944,11 @@ public class Coordinator _mainFrame.getContentPane().add((StatusBarI)_statusBar, BorderLayout.PAGE_END); + + java.awt.KeyboardFocusManager kbm = java.awt.KeyboardFocusManager. + getCurrentKeyboardFocusManager(); + kbm.addPropertyChangeListener("permanentFocusOwner", new FocusListener()); + _liveDeploymentPane = new LiveDeploymentPane(_liveDeploymentRoot); _mainPane = new MainPane(this); _mainFrame.getContentPane().add(_mainPane, BorderLayout.CENTER); @@ -2081,6 +2288,21 @@ public class Coordinator private Action _about; private Action _patchApplication; + private Action _cutText = new javax.swing.text.DefaultEditorKit.CutAction(); + private Action _copyText = new javax.swing.text.DefaultEditorKit.CopyAction(); + private Action _pasteText = new javax.swing.text.DefaultEditorKit.PasteAction(); + private DeleteTextAction _deleteText = new DeleteTextAction("Delete"); + + // + // These actions delegate to the "active" action + // + private ActionWrapper _cut; + private ActionWrapper _copy; + private ActionWrapper _paste; + private ActionWrapper _delete; + private ActionWrapper _moveUp; + private ActionWrapper _moveDown; + // // Two sets of actions because the popup's target and the menu/toolbar's target // can be different. @@ -2096,7 +2318,6 @@ public class Coordinator private JCheckBoxMenuItem _substituteMenuItem; private JCheckBoxMenuItem _showVarsMenuItem; - private JMenu _newMenu; private JMenu _newServerMenu; private JMenu _newServiceMenu; |