Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: ffea561126b4c665e12c431e9f547659e14a32a0 (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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/*******************************************************************************
 * Copyright (c) 2004, 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.bindings;

import java.util.Collection;
import java.util.Map;

import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.AbstractBitSetEvent;
import org.eclipse.jface.util.Util;

/**
 * An instance of this class describes changes to an instance of
 * <code>BindingManager</code>.
 * <p>
 * This class is not intended to be extended by clients.
 * </p>
 * 
 * @since 3.1
 * @see IBindingManagerListener#bindingManagerChanged(BindingManagerEvent)
 */
public final class BindingManagerEvent extends AbstractBitSetEvent {
	
	private final static TriggerSequence[] EMTPY_SEQUENCE = new TriggerSequence[0];

	/**
	 * The bit used to represent whether the map of active bindings has changed.
	 */
	private static final int CHANGED_ACTIVE_BINDINGS = 1;

	/**
	 * The bit used to represent whether the active scheme has changed.
	 */
	private static final int CHANGED_ACTIVE_SCHEME = 1 << 1;

	/**
	 * The bit used to represent whether the active locale has changed.
	 */
	private static final int CHANGED_LOCALE = 1 << 2;

	/**
	 * The bit used to represent whether the active platform has changed.
	 */
	private static final int CHANGED_PLATFORM = 1 << 3;

	/**
	 * The bit used to represent whether the scheme's defined state has changed.
	 */
	private static final int CHANGED_SCHEME_DEFINED = 1 << 4;

	/**
	 * The binding manager that has changed; this value is never
	 * <code>null</code>.
	 */
	private final BindingManager manager;

	/**
	 * The map of triggers (<code>Collection</code> of
	 * <code>TriggerSequence</code>) by parameterized command (<code>ParameterizedCommand</code>)
	 * before the change occurred. This map may be empty and it may be
	 * <code>null</code>.
	 */
	private final Map previousTriggersByParameterizedCommand;

	/**
	 * The scheme that became defined or undefined. This value may be
	 * <code>null</code> if no scheme changed its defined state.
	 */
	private final Scheme scheme;

	/**
	 * Creates a new instance of this class.
	 * 
	 * @param manager
	 *            the instance of the binding manager that changed; must not be
	 *            <code>null</code>.
	 * @param activeBindingsChanged
	 *            Whether the active bindings have changed.
	 * @param previousTriggersByParameterizedCommand
	 *            The map of triggers (<code>TriggerSequence</code>) by
	 *            fully-parameterized command (<code>ParameterizedCommand</code>)
	 *            before the change occured. This map may be <code>null</code>
	 *            or empty.
	 * @param activeSchemeChanged
	 *            true, iff the active scheme changed.
	 * @param scheme
	 *            The scheme that became defined or undefined; <code>null</code>
	 *            if no scheme changed state.
	 * @param schemeDefined
	 *            <code>true</code> if the given scheme became defined;
	 *            <code>false</code> otherwise.
	 * @param localeChanged
	 *            <code>true</code> iff the active locale changed
	 * @param platformChanged
	 *            <code>true</code> iff the active platform changed
	 */
	public BindingManagerEvent(final BindingManager manager,
			final boolean activeBindingsChanged,
			final Map previousTriggersByParameterizedCommand,
			final boolean activeSchemeChanged, final Scheme scheme,
			final boolean schemeDefined, final boolean localeChanged,
			final boolean platformChanged) {
		if (manager == null) {
			throw new NullPointerException(
					"A binding manager event needs a binding manager"); //$NON-NLS-1$
		}
		this.manager = manager;

		if (schemeDefined && (scheme == null)) {
			throw new NullPointerException(
					"If a scheme changed defined state, then there should be a scheme identifier"); //$NON-NLS-1$
		}
		this.scheme = scheme;

		this.previousTriggersByParameterizedCommand = previousTriggersByParameterizedCommand;

		if (activeBindingsChanged) {
			changedValues |= CHANGED_ACTIVE_BINDINGS;
		}
		if (activeSchemeChanged) {
			changedValues |= CHANGED_ACTIVE_SCHEME;
		}
		if (localeChanged) {
			changedValues |= CHANGED_LOCALE;
		}
		if (platformChanged) {
			changedValues |= CHANGED_PLATFORM;
		}
		if (schemeDefined) {
			changedValues |= CHANGED_SCHEME_DEFINED;
		}
	}

	/**
	 * Returns the instance of the manager that changed.
	 * 
	 * @return the instance of the manager that changed. Guaranteed not to be
	 *         <code>null</code>.
	 */
	public final BindingManager getManager() {
		return manager;
	}

	/**
	 * Returns the scheme that changed.
	 * 
	 * @return The changed scheme
	 */
	public final Scheme getScheme() {
		return scheme;
	}

	/**
	 * Returns whether the active bindings have changed.
	 * 
	 * @return <code>true</code> if the active bindings have changed;
	 *         <code>false</code> otherwise.
	 */
	public final boolean isActiveBindingsChanged() {
		return ((changedValues & CHANGED_ACTIVE_BINDINGS) != 0);
	}

	/**
	 * Computes whether the active bindings have changed for a given command
	 * identifier.
	 * 
	 * @param parameterizedCommand
	 *            The fully-parameterized command whose bindings might have
	 *            changed; must not be <code>null</code>.
	 * @return <code>true</code> if the active bindings have changed for the
	 *         given command identifier; <code>false</code> otherwise.
	 */
	public final boolean isActiveBindingsChangedFor(
			final ParameterizedCommand parameterizedCommand) {
		final TriggerSequence[] currentBindings = manager
				.getActiveBindingsFor(parameterizedCommand);
		final TriggerSequence[] previousBindings;
		if (previousTriggersByParameterizedCommand != null) {
			final Collection previousBindingCollection = (Collection) previousTriggersByParameterizedCommand
					.get(parameterizedCommand);
			if (previousBindingCollection == null) {
				previousBindings = EMTPY_SEQUENCE;
			} else {
				previousBindings = (TriggerSequence[]) previousBindingCollection
						.toArray(new TriggerSequence[previousBindingCollection
								.size()]);
			}
		} else {
			previousBindings = EMTPY_SEQUENCE;
		}

		return !Util.equals(currentBindings, previousBindings);
	}

	/**
	 * Returns whether or not the active scheme changed.
	 * 
	 * @return true, iff the active scheme property changed.
	 */
	public final boolean isActiveSchemeChanged() {
		return ((changedValues & CHANGED_ACTIVE_SCHEME) != 0);
	}

	/**
	 * Returns whether the locale has changed
	 * 
	 * @return <code>true</code> if the locale changed; <code>false</code>
	 *         otherwise.
	 */
	public boolean isLocaleChanged() {
		return ((changedValues & CHANGED_LOCALE) != 0);
	}

	/**
	 * Returns whether the platform has changed
	 * 
	 * @return <code>true</code> if the platform changed; <code>false</code>
	 *         otherwise.
	 */
	public boolean isPlatformChanged() {
		return ((changedValues & CHANGED_PLATFORM) != 0);
	}

	/**
	 * Returns whether the list of defined scheme identifiers has changed.
	 * 
	 * @return <code>true</code> if the list of scheme identifiers has
	 *         changed; <code>false</code> otherwise.
	 */
	public final boolean isSchemeChanged() {
		return (scheme != null);
	}

	/**
	 * Returns whether or not the scheme became defined
	 * 
	 * @return <code>true</code> if the scheme became defined.
	 */
	public final boolean isSchemeDefined() {
		return (((changedValues & CHANGED_SCHEME_DEFINED) != 0) && (scheme != null));
	}
}

Back to the top