Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: cba792b489d2e886e593add52b61dee12f25bd06 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*******************************************************************************
 * Copyright (c) 2000, 2006 IBM Corporation and others.
 * 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
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.dialogs;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * Helper class to save the enable/disable state of a control including all its
 * descendent controls.
 */
public class ControlEnableState {
    /**
     * List of exception controls (element type: <code>Control</code>);
     * <code>null</code> if none.
     */
    private List exceptions = null;

    /**
     * List of saved states (element type: <code>ItemState</code>).
     */
    private List states;

    /**
     * Internal class for recording the enable/disable state of a single
     * control.
     */
    private class ItemState {
    	/** the control */
        protected Control item;

        /** the state */
        protected boolean state;

        /**
         * Create a new instance of the receiver.
         * 
         * @param item
         * @param state
         */
        public ItemState(Control item, boolean state) {
            this.item = item;
            this.state = state;
        }

        /**
         * Restore the enabled state to the original value.
         *  
         */
        public void restore() {
            if (item == null || item.isDisposed()) {
				return;
			}
            item.setEnabled(state);
        }
    }

    /**
     * Creates a new object and saves in it the current enable/disable state of
     * the given control and its descendents; the controls that are saved are
     * also disabled.
     * 
     * @param w
     *            the control
     */
    protected ControlEnableState(Control w) {
        this(w, null);
    }

    /**
     * Creates a new object and saves in it the current enable/disable state of
     * the given control and its descendents except for the given list of
     * exception cases; the controls that are saved are also disabled.
     * 
     * @param w
     *            the control
     * @param exceptions
     *            the list of controls to not disable (element type:
     *            <code>Control</code>), or <code>null</code> if none
     */
    protected ControlEnableState(Control w, List exceptions) {
        super();
        states = new ArrayList();
        this.exceptions = exceptions;
        readStateForAndDisable(w);
    }

    /**
     * Saves the current enable/disable state of the given control and its
     * descendents in the returned object; the controls are all disabled.
     * 
     * @param w
     *            the control
     * @return an object capturing the enable/disable state
     */
    public static ControlEnableState disable(Control w) {
        return new ControlEnableState(w);
    }

    /**
     * Saves the current enable/disable state of the given control and its
     * descendents in the returned object except for the given list of exception
     * cases; the controls that are saved are also disabled.
     * 
     * @param w
     *            the control
     * @param exceptions
     *            the list of controls to not disable (element type:
     *            <code>Control</code>)
     * @return an object capturing the enable/disable state
     */
    public static ControlEnableState disable(Control w, List exceptions) {
        return new ControlEnableState(w, exceptions);
    }

    /**
     * Recursively reads the enable/disable state for the given window and
     * disables all controls.
     * @param control Control
     */
    private void readStateForAndDisable(Control control) {
        if ((exceptions != null && exceptions.contains(control))) {
			return;
		}
        if (control instanceof Composite) {
            Composite c = (Composite) control;
            Control[] children = c.getChildren();
            for (int i = 0; i < children.length; i++) {
                readStateForAndDisable(children[i]);
            }
        }
        // XXX: Workaround for 1G2Q8SS: ITPUI:Linux - Combo box is not enabled
        // in "File->New->Solution"
        states.add(new ItemState(control, control.getEnabled()));
        control.setEnabled(false);
    }

    /**
     * Restores the window enable state saved in this object.
     */
    public void restore() {
        int size = states.size();
        for (int i = 0; i < size; i++) {
            ((ItemState) states.get(i)).restore();
        }
    }
}

Back to the top