001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jface.dialogs;
011:
012: import java.util.ArrayList;
013: import java.util.List;
014:
015: import org.eclipse.swt.widgets.Composite;
016: import org.eclipse.swt.widgets.Control;
017:
018: /**
019: * Helper class to save the enable/disable state of a control including all its
020: * descendent controls.
021: */
022: public class ControlEnableState {
023: /**
024: * List of exception controls (element type: <code>Control</code>);
025: * <code>null</code> if none.
026: */
027: private List exceptions = null;
028:
029: /**
030: * List of saved states (element type: <code>ItemState</code>).
031: */
032: private List states;
033:
034: /**
035: * Internal class for recording the enable/disable state of a single
036: * control.
037: */
038: private class ItemState {
039: /** the control */
040: protected Control item;
041:
042: /** the state */
043: protected boolean state;
044:
045: /**
046: * Create a new instance of the receiver.
047: *
048: * @param item
049: * @param state
050: */
051: public ItemState(Control item, boolean state) {
052: this .item = item;
053: this .state = state;
054: }
055:
056: /**
057: * Restore the enabled state to the original value.
058: *
059: */
060: public void restore() {
061: if (item == null || item.isDisposed()) {
062: return;
063: }
064: item.setEnabled(state);
065: }
066: }
067:
068: /**
069: * Creates a new object and saves in it the current enable/disable state of
070: * the given control and its descendents; the controls that are saved are
071: * also disabled.
072: *
073: * @param w
074: * the control
075: */
076: protected ControlEnableState(Control w) {
077: this (w, null);
078: }
079:
080: /**
081: * Creates a new object and saves in it the current enable/disable state of
082: * the given control and its descendents except for the given list of
083: * exception cases; the controls that are saved are also disabled.
084: *
085: * @param w
086: * the control
087: * @param exceptions
088: * the list of controls to not disable (element type:
089: * <code>Control</code>), or <code>null</code> if none
090: */
091: protected ControlEnableState(Control w, List exceptions) {
092: super ();
093: states = new ArrayList();
094: this .exceptions = exceptions;
095: readStateForAndDisable(w);
096: }
097:
098: /**
099: * Saves the current enable/disable state of the given control and its
100: * descendents in the returned object; the controls are all disabled.
101: *
102: * @param w
103: * the control
104: * @return an object capturing the enable/disable state
105: */
106: public static ControlEnableState disable(Control w) {
107: return new ControlEnableState(w);
108: }
109:
110: /**
111: * Saves the current enable/disable state of the given control and its
112: * descendents in the returned object except for the given list of exception
113: * cases; the controls that are saved are also disabled.
114: *
115: * @param w
116: * the control
117: * @param exceptions
118: * the list of controls to not disable (element type:
119: * <code>Control</code>)
120: * @return an object capturing the enable/disable state
121: */
122: public static ControlEnableState disable(Control w, List exceptions) {
123: return new ControlEnableState(w, exceptions);
124: }
125:
126: /**
127: * Recursively reads the enable/disable state for the given window and
128: * disables all controls.
129: * @param control Control
130: */
131: private void readStateForAndDisable(Control control) {
132: if ((exceptions != null && exceptions.contains(control))) {
133: return;
134: }
135: if (control instanceof Composite) {
136: Composite c = (Composite) control;
137: Control[] children = c.getChildren();
138: for (int i = 0; i < children.length; i++) {
139: readStateForAndDisable(children[i]);
140: }
141: }
142: // XXX: Workaround for 1G2Q8SS: ITPUI:Linux - Combo box is not enabled
143: // in "File->New->Solution"
144: states.add(new ItemState(control, control.getEnabled()));
145: control.setEnabled(false);
146: }
147:
148: /**
149: * Restores the window enable state saved in this object.
150: */
151: public void restore() {
152: int size = states.size();
153: for (int i = 0; i < size; i++) {
154: ((ItemState) states.get(i)).restore();
155: }
156: }
157: }
|