Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 259048 | Differences between
and this patch

Collapse All | Expand All

(-)Eclipse UI/org/eclipse/ui/internal/menus/MenuAdditionCacheEntry.java (-31 / +6 lines)
Lines 24-29 Link Here
24
import org.eclipse.core.runtime.CoreException;
24
import org.eclipse.core.runtime.CoreException;
25
import org.eclipse.core.runtime.IConfigurationElement;
25
import org.eclipse.core.runtime.IConfigurationElement;
26
import org.eclipse.core.runtime.InvalidRegistryObjectException;
26
import org.eclipse.core.runtime.InvalidRegistryObjectException;
27
import org.eclipse.jface.action.ContributionItem;
27
import org.eclipse.jface.action.GroupMarker;
28
import org.eclipse.jface.action.GroupMarker;
28
import org.eclipse.jface.action.IContributionItem;
29
import org.eclipse.jface.action.IContributionItem;
29
import org.eclipse.jface.action.MenuManager;
30
import org.eclipse.jface.action.MenuManager;
Lines 37-48 Link Here
37
import org.eclipse.ui.internal.provisional.presentations.IActionBarPresentationFactory;
38
import org.eclipse.ui.internal.provisional.presentations.IActionBarPresentationFactory;
38
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
39
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
39
import org.eclipse.ui.internal.services.IWorkbenchLocationService;
40
import org.eclipse.ui.internal.services.IWorkbenchLocationService;
40
import org.eclipse.ui.internal.util.Util;
41
import org.eclipse.ui.menus.CommandContributionItem;
41
import org.eclipse.ui.menus.CommandContributionItem;
42
import org.eclipse.ui.menus.CommandContributionItemParameter;
42
import org.eclipse.ui.menus.CommandContributionItemParameter;
43
import org.eclipse.ui.menus.IContributionRoot;
43
import org.eclipse.ui.menus.IContributionRoot;
44
import org.eclipse.ui.menus.IMenuService;
44
import org.eclipse.ui.menus.IMenuService;
45
import org.eclipse.ui.menus.IWorkbenchContribution;
46
import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
45
import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
47
import org.eclipse.ui.plugin.AbstractUIPlugin;
46
import org.eclipse.ui.plugin.AbstractUIPlugin;
48
import org.eclipse.ui.services.IServiceLocator;
47
import org.eclipse.ui.services.IServiceLocator;
Lines 269-283 Link Here
269
		return new GroupMarker(getName(sepAddition));
268
		return new GroupMarker(getName(sepAddition));
270
	}
269
	}
271
270
272
	/**
273
	 * @return
274
	 */
275
	private IContributionItem createDynamicAdditionContribution(
271
	private IContributionItem createDynamicAdditionContribution(
276
			final IServiceLocator locator,
272
			final IServiceLocator locator,
277
			final IConfigurationElement dynamicAddition) {
273
			final IConfigurationElement dynamicAddition) {
278
		
274
		
279
		return new DynamicMenuContributionItem(getId(dynamicAddition), locator,
275
		return new DynamicContributionItem(getId(dynamicAddition), locator,
280
				dynamicAddition);
276
				dynamicAddition, ContributionItem.class);
281
		
277
		
282
	}
278
	}
283
279
Lines 287-316 Link Here
287
		if (!inToolbar()) {
283
		if (!inToolbar()) {
288
			return null;
284
			return null;
289
		}
285
		}
290
		// If we've already tried (and failed) to load the
286
		
291
		// executable extension then skip this addirion.
287
		return new DynamicContributionItem(getId(widgetAddition), locator, 
292
		if (failedLoads.contains(widgetAddition))
288
				widgetAddition, WorkbenchWindowControlContribution.class);
293
			return null;
294
295
		// Attempt to load the addition's EE (creates a new instance)
296
		final WorkbenchWindowControlContribution loadedWidget = (WorkbenchWindowControlContribution) Util
297
				.safeLoadExecutableExtension(widgetAddition,
298
						IWorkbenchRegistryConstants.ATT_CLASS,
299
						WorkbenchWindowControlContribution.class);
300
301
		// Cache failures
302
		if (loadedWidget == null) {
303
			failedLoads.add(widgetAddition);
304
			return null;
305
		}
306
307
		// explicitly set the id
308
		loadedWidget.setId(getId(widgetAddition));
309
		if (loadedWidget instanceof IWorkbenchContribution) {
310
			((IWorkbenchContribution)loadedWidget).initialize(locator);
311
		}
312
313
		return loadedWidget;
314
	}
289
	}
315
290
316
	private IContributionItem createCommandAdditionContribution(
291
	private IContributionItem createCommandAdditionContribution(
(-)Eclipse (+215 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.ui.internal.menus;
13
14
import org.eclipse.core.runtime.IConfigurationElement;
15
import org.eclipse.jface.action.ContributionItem;
16
import org.eclipse.jface.action.IContributionItem;
17
import org.eclipse.jface.action.IContributionManager;
18
import org.eclipse.swt.widgets.Composite;
19
import org.eclipse.swt.widgets.CoolBar;
20
import org.eclipse.swt.widgets.Menu;
21
import org.eclipse.swt.widgets.ToolBar;
22
import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants;
23
import org.eclipse.ui.internal.util.Util;
24
import org.eclipse.ui.menus.IWorkbenchContribution;
25
import org.eclipse.ui.services.IServiceLocator;
26
27
/**
28
 * A contribution item which proxies a dynamic menu or tool contribution.
29
 * <p>
30
 * It currently supports placement in menus.
31
 * </p>
32
 * <p>
33
 * 
34
 * @author Prakash G.R.
35
 * 
36
 * @since 3.5
37
 * 
38
 */
39
public class DynamicContributionItem extends ContributionItem {
40
41
	private final IConfigurationElement dynamicAddition;
42
	private final IServiceLocator locator;
43
	private boolean alreadyFailed;
44
	private ContributionItem loadedDynamicContribution;
45
	private final Class classSpec;
46
47
	/**
48
	 * Creates a DynamicMenuContributionItem
49
	 * 
50
	 * @param id
51
	 *            - Id of the menu item
52
	 * @param locator
53
	 *            - The Service Locator
54
	 * @param dynamicAddition
55
	 *            - The Configuration Element defined in the plugin.xml
56
	 * @param classSpec
57
	 * 			  - The castable class of the expected contribution item
58
	 * 
59
	 */
60
	public DynamicContributionItem(String id, IServiceLocator locator,
61
			IConfigurationElement dynamicAddition, Class classSpec) {
62
		super(id);
63
64
		this.locator = locator;
65
		this.dynamicAddition = dynamicAddition;
66
		this.classSpec = classSpec;
67
	}
68
69
	/*
70
	 * (non-Javadoc)
71
	 * 
72
	 * @see org.eclipse.jface.action.ContributionItem#isDynamic()
73
	 */
74
	public boolean isDynamic() {
75
		if (loadedDynamicContribution != null) {
76
			return loadedDynamicContribution.isDynamic();
77
		}
78
		return true;
79
	}
80
81
	/*
82
	 * (non-Javadoc)
83
	 * 
84
	 * @see org.eclipse.jface.action.ContributionItem#isDirty()
85
	 */
86
	public boolean isDirty() {
87
		if (loadedDynamicContribution != null) {
88
			return loadedDynamicContribution.isDirty();
89
		}
90
		return super.isDirty();
91
	}
92
93
	/*
94
	 * (non-Javadoc)
95
	 * 
96
	 * @see
97
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
98
	 * .Composite)
99
	 */
100
	public void fill(Composite parent) {
101
		IContributionItem contributionItem = getContributionItem();
102
		if (contributionItem != null)
103
			contributionItem.fill(parent);
104
	}
105
106
	/*
107
	 * (non-Javadoc)
108
	 * 
109
	 * @see
110
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
111
	 * .CoolBar, int)
112
	 */
113
	public void fill(CoolBar parent, int index) {
114
		IContributionItem contributionItem = getContributionItem();
115
		if (contributionItem != null)
116
			contributionItem.fill(parent, index);
117
	}
118
119
	/*
120
	 * (non-Javadoc)
121
	 * 
122
	 * @see
123
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
124
	 * .Menu, int)
125
	 */
126
	public void fill(Menu menu, int index) {
127
		IContributionItem contributionItem = getContributionItem();
128
		if (contributionItem != null)
129
			contributionItem.fill(menu, index);
130
	}
131
132
	/*
133
	 * (non-Javadoc)
134
	 * 
135
	 * @see
136
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
137
	 * .ToolBar, int)
138
	 */
139
	public void fill(ToolBar parent, int index) {
140
		IContributionItem contributionItem = getContributionItem();
141
		if (contributionItem != null)
142
			contributionItem.fill(parent, index);
143
	}
144
145
	private IContributionItem getContributionItem() {
146
		if (loadedDynamicContribution == null && !alreadyFailed)
147
			createContributionItem();
148
		return loadedDynamicContribution;
149
	}
150
151
	private void createContributionItem() {
152
153
		loadedDynamicContribution = (ContributionItem) Util
154
				.safeLoadExecutableExtension(dynamicAddition,
155
						IWorkbenchRegistryConstants.ATT_CLASS,
156
						classSpec);
157
158
		if (loadedDynamicContribution == null) {
159
			alreadyFailed = true;
160
			return;
161
		}
162
163
		loadedDynamicContribution.setId(getId());
164
		loadedDynamicContribution.setParent(getParent());
165
		if (loadedDynamicContribution instanceof IWorkbenchContribution) {
166
			((IWorkbenchContribution) loadedDynamicContribution)
167
					.initialize(locator);
168
		}
169
	}
170
171
	/*
172
	 * (non-Javadoc)
173
	 * 
174
	 * @see org.eclipse.jface.action.ContributionItem#dispose()
175
	 */
176
	public void dispose() {
177
		if (loadedDynamicContribution != null) {
178
			loadedDynamicContribution.dispose();
179
			loadedDynamicContribution = null;
180
		}
181
		super.dispose();
182
	}
183
184
	/*
185
	 * (non-Javadoc)
186
	 * 
187
	 * @see org.eclipse.jface.action.ContributionItem#update()
188
	 */
189
	public void update() {
190
		if (loadedDynamicContribution != null) {
191
			loadedDynamicContribution.update();
192
		}
193
	}
194
195
	public void update(String id) {
196
		if (loadedDynamicContribution != null) {
197
			loadedDynamicContribution.update(id);
198
		}
199
	}
200
201
	/*
202
	 * (non-Javadoc)
203
	 * 
204
	 * @see
205
	 * org.eclipse.jface.action.ContributionItem#setParent(org.eclipse.jface
206
	 * .action.IContributionManager)
207
	 */
208
	public void setParent(IContributionManager parent) {
209
		super.setParent(parent);
210
		if (loadedDynamicContribution != null) {
211
			loadedDynamicContribution.setParent(parent);
212
		}
213
	}
214
215
}

Return to bug 259048