From d94dace5b602ca031c7a49c85fd1d9bf940e7ab4 Mon Sep 17 00:00:00 2001 From: Kushal Munir < kmunir@ca.ibm.com> Date: Fri, 29 Sep 2006 22:38:45 +0000 Subject: [PATCH] The port inheritable entry field does not remember the inheritable text because the text could not be set as it was rejected by the numeric verifier (the inheritable text is not all numeric). --- .../SystemNumericVerifyListener.java | 52 ++++++++++++++----- ...eritableEntryFieldStateChangeListener.java | 31 +++++++++++ .../rse/ui/widgets/InheritableEntryField.java | 45 ++++++++++++++++ .../rse/ui/widgets/SystemPortPrompt.java | 37 +++++++++++-- 4 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/IInheritableEntryFieldStateChangeListener.java diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/validators/SystemNumericVerifyListener.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/validators/SystemNumericVerifyListener.java index c255a680789..8c2006867a3 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/validators/SystemNumericVerifyListener.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/validators/SystemNumericVerifyListener.java @@ -20,27 +20,55 @@ import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; /** - * A class that only allows keys representing numeric values to be entered. + * A class that only allows keys representing numeric values to be entered. It can be turned off if necessary. */ public class SystemNumericVerifyListener implements VerifyListener { + + private boolean isOff; + + /** + * Constructor. The verifier is on by default. + */ + public SystemNumericVerifyListener() { + isOff = false; + } /** + * Verifies the event text if it is not turned off. * @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent) */ public void verifyText(VerifyEvent e) { - String text = e.text; - boolean doit = true; - - for (int i = 0; i < text.length(); i++) { - char c = text.charAt(i); - - if (!Character.isDigit(c)) { - doit = false; - break; + if (!isOff) { + String text = e.text; + boolean doit = true; + + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + + if (!Character.isDigit(c)) { + doit = false; + break; + } } + + e.doit = doit; } - - e.doit = doit; + } + + /** + * Turns the verifier on or off. + * @param isOff true to turn the verifier off, false to turn it on. + */ + public void setOff(boolean isOff) { + this.isOff = isOff; + } + + /** + * Returns whether the verifier is on or off. + * @return true if the verifier is off, false if it is on. + */ + public boolean isOff() { + return isOff; } } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/IInheritableEntryFieldStateChangeListener.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/IInheritableEntryFieldStateChangeListener.java new file mode 100644 index 00000000000..21b634a5de7 --- /dev/null +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/IInheritableEntryFieldStateChangeListener.java @@ -0,0 +1,31 @@ +/******************************************************************************** + * Copyright (c) 2006 IBM Corporation. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Initial Contributors: + * The following IBM employees contributed to the Remote System Explorer + * component that contains this file: David McKnight, Kushal Munir, + * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson, + * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley. + * + * Contributors: + * {Name} (company) - description of contribution. + ********************************************************************************/ + +package org.eclipse.rse.ui.widgets; + +/** + * Any listener that wants to be notified of state changes to the inheritable + * entry field widget must implement this interface. + */ +public interface IInheritableEntryFieldStateChangeListener { + + /** + * Called when the state of the inheritable field has changed. The new state of the field can be queried by calling + * isLocal on on the entry field. + * @param field the inheritable field which has changed state. + */ + public void stateChanged(InheritableEntryField field); +} \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/InheritableEntryField.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/InheritableEntryField.java index aaa0e9cd3c2..ccf229f7a82 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/InheritableEntryField.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/InheritableEntryField.java @@ -16,6 +16,10 @@ package org.eclipse.rse.ui.widgets; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; @@ -57,6 +61,7 @@ public class InheritableEntryField extends Composite implements KeyListener { private String localValue = ""; private boolean isLocal = true; private boolean allowEditOfInherited = false; + private List listeners; /** * Constructor @@ -88,6 +93,10 @@ public class InheritableEntryField extends Composite implements KeyListener { */ public InheritableEntryField(Composite parent, int style, int buttonStyle, int textStyle, boolean showToggleButton) { super(parent, style); + + // must initialize list of listeners before anything else + listeners = new Vector(); + prepareComposite(2); if (showToggleButton) { createToggleButton(this, buttonStyle); @@ -103,6 +112,11 @@ public class InheritableEntryField extends Composite implements KeyListener { public void setLocal(boolean local) { boolean wasLocal = isLocal; isLocal = local; + + if (isLocal != wasLocal) { + notifyStateChangeListeners(); + } + if (isLocal) { // from inherit to local if (allowEditOfInherited && !wasLocal) inheritValue = entryField.getText(); entryField.setEnabled(true); @@ -342,4 +356,35 @@ public class InheritableEntryField extends Composite implements KeyListener { setLocal(true); } } + + /** + * Adds a state change listener. If the listener was already added, it will not be added again. + * @param l the listener to add. + */ + public void addStateChangeListener(IInheritableEntryFieldStateChangeListener l) { + + if (!listeners.contains(l)) { + listeners.add(l); + } + } + + /** + * Removes a state change listener. + * @param l the listener to remove. + */ + public void removeStateChangeListener(IInheritableEntryFieldStateChangeListener l) { + listeners.remove(l); + } + + /** + * Notifies all state change listeners. + */ + private void notifyStateChangeListeners() { + Iterator iter = listeners.iterator(); + + while (iter.hasNext()) { + IInheritableEntryFieldStateChangeListener listener = (IInheritableEntryFieldStateChangeListener)(iter.next()); + listener.stateChanged(this); + } + } } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/SystemPortPrompt.java b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/SystemPortPrompt.java index 21de976f680..dfdcc6e75c5 100644 --- a/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/SystemPortPrompt.java +++ b/rse/plugins/org.eclipse.rse.ui/UI/org/eclipse/rse/ui/widgets/SystemPortPrompt.java @@ -57,7 +57,37 @@ public class SystemPortPrompt // validators protected ISystemValidator portValidator; // Inputs from caller - protected ISystemMessageLine msgLine; + protected ISystemMessageLine msgLine; + + /** + * A listener for state changes to the port entry inheritable field. + */ + private class PortFieldStateChangeListener implements IInheritableEntryFieldStateChangeListener { + + private SystemNumericVerifyListener verifyListener; + + /** + * Constructor. + * @param verifyListener the verify listener for the port field. + */ + private PortFieldStateChangeListener(SystemNumericVerifyListener verifyListener) { + this.verifyListener = verifyListener; + } + + /** + * Turns the verifier off if the state of the inheritable entry field is not local, turns it on otherwise. + * @see org.eclipse.rse.ui.widgets.IInheritableEntryFieldStateChangeListener#stateChanged(org.eclipse.rse.ui.widgets.InheritableEntryField) + */ + public void stateChanged(InheritableEntryField field) { + + if (field.isLocal()) { + verifyListener.setOff(false); + } + else { + verifyListener.setOff(true); + } + } + } /** * Constructor when you want a new composite to hold the child controls @@ -258,8 +288,9 @@ public class SystemPortPrompt } }); - textPort.getTextField().addVerifyListener(new SystemNumericVerifyListener()); - //textPort.addSelectionListener(this); Removed for defect 44132 + SystemNumericVerifyListener verifyListener = new SystemNumericVerifyListener(); + textPort.getTextField().addVerifyListener(verifyListener); + textPort.addStateChangeListener(new PortFieldStateChangeListener(verifyListener)); } }