diff options
Diffstat (limited to 'java/src/IceGrid/TreeNode/Editor.java')
-rwxr-xr-x | java/src/IceGrid/TreeNode/Editor.java | 169 |
1 files changed, 165 insertions, 4 deletions
diff --git a/java/src/IceGrid/TreeNode/Editor.java b/java/src/IceGrid/TreeNode/Editor.java index 0350b10df55..9588c9cb619 100755 --- a/java/src/IceGrid/TreeNode/Editor.java +++ b/java/src/IceGrid/TreeNode/Editor.java @@ -8,20 +8,37 @@ // **********************************************************************
package IceGrid.TreeNode;
+import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import javax.swing.tree.TreePath;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+
+import IceGrid.Model;
+import IceGrid.PropertyDescriptor;
+
//
// Base class for all editors
//
abstract class Editor
-{
+{
+ abstract void writeDescriptor();
+ abstract boolean isSimpleUpdate();
+ void postUpdate() {}
+
protected Editor()
{
//
@@ -67,6 +84,31 @@ abstract class Editor };
}
+ protected void setTarget(CommonBase target)
+ {
+ _target = target;
+ }
+
+ protected JPanel buildPanel(JPanel innerPanel)
+ {
+ JScrollPane scrollPane =
+ new JScrollPane(innerPanel,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+
+ scrollPane.setBorder(Borders.DIALOG_BORDER);
+
+ JPanel outerPanel = new JPanel(new BorderLayout());
+ outerPanel.add(scrollPane, BorderLayout.CENTER);
+
+ JComponent buttonBar =
+ ButtonBarFactory.buildRightAlignedBar(_applyButton,
+ _discardButton);
+ buttonBar.setBorder(Borders.DIALOG_BORDER);
+ outerPanel.add(buttonBar, BorderLayout.SOUTH);
+ return outerPanel;
+ }
+
protected void updated()
{
if(_detectUpdates)
@@ -81,18 +123,137 @@ abstract class Editor _detectUpdates = val;
}
- abstract protected CommonBase getTarget();
+ //
+ // Update when parent is a SimpleContainer
+ //
+ protected void applyUpdate()
+ {
+ Model model = _target.getModel();
- abstract protected void applyUpdate();
+ if(model.canUpdate())
+ {
+ model.disableDisplay();
+ try
+ {
+ if(_target.isEphemeral())
+ {
+ SimpleContainer parent = (SimpleContainer)_target.getParent();
+ writeDescriptor();
+ parent.addDescriptor(_target.getDescriptor());
+ _target.destroy(); // just removes the child
+
+ if(!_target.getApplication().applyUpdate())
+ {
+ //
+ // Restores old display
+ //
+ parent = (SimpleContainer)model.findNewNode(parent.getPath());
+ parent.removeDescriptor(_target.getDescriptor());
+ try
+ {
+ parent.addChild(_target, true);
+ }
+ catch(DuplicateIdException die)
+ {
+ assert false;
+ }
+ _target.setParent(parent);
+ model.setSelectionPath(_target.getPath());
+ return;
+ }
+ else
+ {
+ parent = (SimpleContainer)model.findNewNode(parent.getPath());
+ _target = parent.findChildWithDescriptor(_target.getDescriptor());
+ model.setSelectionPath(_target.getPath());
+ }
+ }
+ else if(isSimpleUpdate())
+ {
+ writeDescriptor();
+ }
+ else
+ {
+ //
+ // Save to be able to rollback
+ //
+ Object savedDescriptor = _target.saveDescriptor();
+ SimpleContainer parent = (SimpleContainer)_target.getParent();
+ writeDescriptor();
+
+ if(!_target.getApplication().applyUpdate())
+ {
+ _target.restoreDescriptor(savedDescriptor);
+
+ //
+ // Need to find new node!
+ //
+ _target = model.findNewNode(_target.getPath());
+ model.setSelectionPath(_target.getPath());
+ //
+ //
+ // Everything was restored, user must deal with error
+ //
+ return;
+ }
+ else
+ {
+ parent = (SimpleContainer)model.findNewNode(parent.getPath());
+ _target = parent.findChildWithDescriptor(_target.getDescriptor());
+ model.setSelectionPath(_target.getPath());
+ }
+ }
+
+ postUpdate();
+
+ _target.getEditable().markModified();
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ model.enableDisplay();
+ }
+ }
+ }
+
protected void discardUpdate()
{
- getTarget().getModel().refreshDisplay();
+ _target.getModel().refreshDisplay();
+ }
+
+ static java.util.Map propertiesToMap(java.util.List props)
+ {
+ java.util.Map result = new java.util.HashMap(props.size());
+ java.util.Iterator p = props.iterator();
+ while(p.hasNext())
+ {
+ PropertyDescriptor pd = (PropertyDescriptor)p.next();
+ result.put(pd.name, pd.value);
+ }
+ return result;
+ }
+
+ static java.util.LinkedList mapToProperties(java.util.Map map)
+ {
+ java.util.LinkedList result = new java.util.LinkedList();
+ java.util.Iterator p = map.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ String name = (String)entry.getKey();
+ String value = (String)entry.getValue();
+ result.add(new PropertyDescriptor(name, value));
+ }
+ return result;
}
protected JButton _applyButton;
protected JButton _discardButton;
protected DocumentListener _updateListener;
+ protected CommonBase _target;
+
private boolean _detectUpdates = true;
}
|