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)); } }