diff options
Diffstat (limited to 'java/src/IceGrid/TreeNode/TemplateEditor.java')
-rwxr-xr-x | java/src/IceGrid/TreeNode/TemplateEditor.java | 120 |
1 files changed, 116 insertions, 4 deletions
diff --git a/java/src/IceGrid/TreeNode/TemplateEditor.java b/java/src/IceGrid/TreeNode/TemplateEditor.java index abab7d965c2..4e68ea07491 100755 --- a/java/src/IceGrid/TreeNode/TemplateEditor.java +++ b/java/src/IceGrid/TreeNode/TemplateEditor.java @@ -9,6 +9,9 @@ package IceGrid.TreeNode;
import javax.swing.JTextField;
+import javax.swing.text.*;
+
+import java.util.regex.Pattern;
import com.jgoodies.forms.builder.DefaultFormBuilder;
@@ -18,10 +21,43 @@ import IceGrid.Utils; class TemplateEditor extends Editor
{
+ static class ParametersFilter extends DocumentFilter
+ {
+ public void insertString(DocumentFilter.FilterBypass fb,
+ int offset,
+ String string,
+ AttributeSet attr)
+ throws BadLocationException
+ {
+ if(_pattern.matcher(string).matches())
+ {
+ super.insertString(fb, offset, string, attr);
+ }
+ }
+
+ public void replace(DocumentFilter.FilterBypass fb,
+ int offset,
+ int length,
+ String text,
+ AttributeSet attrs)
+ throws BadLocationException
+ {
+ if(_pattern.matcher(text).matches())
+ {
+ super.replace(fb, offset, length, text, attrs);
+ }
+ }
+
+ private Pattern _pattern = Pattern.compile("[\\w\\s]*");
+ }
+
TemplateEditor()
{
_template.getDocument().addDocumentListener(_updateListener);
_parameters.getDocument().addDocumentListener(_updateListener);
+
+ AbstractDocument doc = (AbstractDocument)_parameters.getDocument();
+ doc.setDocumentFilter(_parametersFilter);
}
TemplateDescriptor getDescriptor()
@@ -42,10 +78,8 @@ class TemplateEditor extends Editor boolean isSimpleUpdate()
{
- //
- // Not used since we have our own applyUpdate()
- //
- return false;
+ TemplateDescriptor descriptor = getDescriptor();
+ return _parameters.getText().equals(descriptor.parameters);
}
void append(DefaultFormBuilder builder)
@@ -66,9 +100,86 @@ class TemplateEditor extends Editor {
TemplateDescriptor descriptor = getDescriptor();
_template.setText(_target.getId());
+ _template.setEditable(_target.isEphemeral());
_parameters.setText(parametersToString(descriptor.parameters));
}
+ protected void applyUpdate()
+ {
+ Model model = _target.getModel();
+
+ if(model.canUpdate())
+ {
+ model.disableDisplay();
+
+ try
+ {
+ if(_target.isEphemeral())
+ {
+ writeDescriptor();
+ TemplateDescriptor descriptor = getDescriptor();
+ Templates parent = (Templates)_target.getParent();
+ _target.destroy(); // just removes the child
+
+ if(!parent.tryAdd(_template.getText(), descriptor))
+ {
+ try
+ {
+ parent.addChild(_target, true);
+ }
+ catch(UpdateFailedException die)
+ {
+ assert false;
+ }
+ return;
+ }
+ else
+ {
+ _target = parent.findChildWithDescriptor(descriptor);
+ model.setSelectionPath(_target.getPath());
+ _template.setEditable(false);
+ }
+ }
+ else if(isSimpleUpdate())
+ {
+ writeDescriptor();
+ }
+ else
+ {
+ //
+ // Save to be able to rollback
+ //
+ Object savedDescriptor = _target.saveDescriptor();
+ Templates parent = (Templates)_target.getParent();
+ writeDescriptor();
+
+ if(!parent.tryUpdate(_target))
+ {
+ _target.restoreDescriptor(savedDescriptor);
+
+ //
+ // Everything was restored, user must deal with error
+ //
+ return;
+ }
+ else
+ {
+ _target = parent.findChildWithDescriptor(getDescriptor());
+ model.setSelectionPath(_target.getPath());
+ }
+ }
+
+ _target.getEditable().markModified();
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ model.enableDisplay();
+ }
+ }
+ }
+
static private java.util.LinkedList stringToParameters(String s)
{
java.util.List params = java.util.Arrays.asList(s.split("\\s+"));
@@ -97,4 +208,5 @@ class TemplateEditor extends Editor private JTextField _template = new JTextField(20);
private JTextField _parameters = new JTextField(20);
+ private DocumentFilter _parametersFilter = new ParametersFilter();
}
|