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 325392 | Differences between
and this patch

Collapse All | Expand All

(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java (+412 lines)
Added Link Here
1
package org.eclipse.e4.ui.workbench.renderers.swt;
2
3
import javax.inject.Inject;
4
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
5
import org.eclipse.e4.core.contexts.IEclipseContext;
6
import org.eclipse.e4.core.di.annotations.CanExecute;
7
import org.eclipse.e4.core.di.annotations.Execute;
8
import org.eclipse.e4.core.services.contributions.IContributionFactory;
9
import org.eclipse.e4.ui.internal.workbench.Activator;
10
import org.eclipse.e4.ui.internal.workbench.Policy;
11
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
12
import org.eclipse.e4.ui.model.application.MContribution;
13
import org.eclipse.e4.ui.model.application.ui.MContext;
14
import org.eclipse.e4.ui.model.application.ui.MUIElement;
15
import org.eclipse.e4.ui.model.application.ui.MUILabel;
16
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
17
import org.eclipse.e4.ui.model.application.ui.menu.MItem;
18
import org.eclipse.e4.ui.workbench.IResourceUtilities;
19
import org.eclipse.e4.ui.workbench.modeling.EModelService;
20
import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
21
import org.eclipse.emf.common.util.URI;
22
import org.eclipse.jface.action.ContributionItem;
23
import org.eclipse.jface.action.IContributionManager;
24
import org.eclipse.jface.action.IMenuListener;
25
import org.eclipse.jface.action.IMenuManager;
26
import org.eclipse.jface.resource.DeviceResourceException;
27
import org.eclipse.jface.resource.ImageDescriptor;
28
import org.eclipse.jface.resource.JFaceResources;
29
import org.eclipse.jface.resource.LocalResourceManager;
30
import org.eclipse.swt.SWT;
31
import org.eclipse.swt.widgets.Event;
32
import org.eclipse.swt.widgets.Listener;
33
import org.eclipse.swt.widgets.Menu;
34
import org.eclipse.swt.widgets.MenuItem;
35
import org.eclipse.swt.widgets.ToolBar;
36
import org.eclipse.swt.widgets.ToolItem;
37
import org.eclipse.swt.widgets.Widget;
38
39
public class DirectContributionItem extends ContributionItem {
40
	private MItem model;
41
	private Widget widget;
42
	private Listener menuItemListener;
43
	private LocalResourceManager localResourceManager;
44
45
	@Inject
46
	private IContributionFactory contribFactory;
47
48
	@Inject
49
	private EModelService modelService;
50
51
	private ISWTResourceUtilities resUtils = null;
52
53
	@Inject
54
	void setResourceUtils(IResourceUtilities utils) {
55
		resUtils = (ISWTResourceUtilities) utils;
56
	}
57
58
	private IMenuListener menuListener = new IMenuListener() {
59
		public void menuAboutToShow(IMenuManager manager) {
60
			update(null);
61
		}
62
	};
63
64
	public void setModel(MItem item) {
65
		model = item;
66
		setId(model.getElementId());
67
		updateVisible();
68
	}
69
70
	/*
71
	 * (non-Javadoc)
72
	 * 
73
	 * @see
74
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
75
	 * .Menu, int)
76
	 */
77
	@Override
78
	public void fill(Menu menu, int index) {
79
		if (model == null) {
80
			return;
81
		}
82
		if (widget != null) {
83
			return;
84
		}
85
		int style = SWT.PUSH;
86
		if (model.getType() == ItemType.PUSH)
87
			style = SWT.PUSH;
88
		else if (model.getType() == ItemType.CHECK)
89
			style = SWT.CHECK;
90
		else if (model.getType() == ItemType.RADIO)
91
			style = SWT.RADIO;
92
		MenuItem item = null;
93
		if (index >= 0) {
94
			item = new MenuItem(menu, style, index);
95
		} else {
96
			item = new MenuItem(menu, style);
97
		}
98
		item.setData(this);
99
100
		item.addListener(SWT.Dispose, getItemListener());
101
		item.addListener(SWT.Selection, getItemListener());
102
		item.addListener(SWT.DefaultSelection, getItemListener());
103
104
		widget = item;
105
		model.setWidget(widget);
106
		widget.setData(AbstractPartRenderer.OWNING_ME, model);
107
108
		update(null);
109
		updateIcons();
110
	}
111
112
	/*
113
	 * (non-Javadoc)
114
	 * 
115
	 * @see
116
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
117
	 * .ToolBar, int)
118
	 */
119
	@Override
120
	public void fill(ToolBar parent, int index) {
121
		if (model == null) {
122
			return;
123
		}
124
		if (widget != null) {
125
			return;
126
		}
127
		int style = SWT.PUSH;
128
		if (model.getType() == ItemType.PUSH)
129
			style = SWT.PUSH;
130
		else if (model.getType() == ItemType.CHECK)
131
			style = SWT.CHECK;
132
		else if (model.getType() == ItemType.RADIO)
133
			style = SWT.RADIO;
134
		ToolItem item = null;
135
		if (index >= 0) {
136
			item = new ToolItem(parent, style, index);
137
		} else {
138
			item = new ToolItem(parent, style);
139
		}
140
		item.setData(this);
141
142
		item.addListener(SWT.Dispose, getItemListener());
143
		item.addListener(SWT.Selection, getItemListener());
144
		item.addListener(SWT.DefaultSelection, getItemListener());
145
146
		widget = item;
147
		model.setWidget(widget);
148
		widget.setData(AbstractPartRenderer.OWNING_ME, model);
149
150
		update(null);
151
		updateIcons();
152
	}
153
154
	private void updateVisible() {
155
		setVisible((model).isVisible());
156
		final IContributionManager parent = getParent();
157
		if (parent != null) {
158
			parent.markDirty();
159
		}
160
	}
161
162
	/*
163
	 * (non-Javadoc)
164
	 * 
165
	 * @see org.eclipse.jface.action.ContributionItem#update()
166
	 */
167
	@Override
168
	public void update() {
169
		update(null);
170
	}
171
172
	/*
173
	 * (non-Javadoc)
174
	 * 
175
	 * @see org.eclipse.jface.action.ContributionItem#update(java.lang.String)
176
	 */
177
	@Override
178
	public void update(String id) {
179
		if (widget instanceof MenuItem) {
180
			updateMenuItem();
181
		} else if (widget instanceof ToolItem) {
182
			updateToolItem();
183
		}
184
	}
185
186
	private void updateMenuItem() {
187
		MenuItem item = (MenuItem) widget;
188
		String text = model.getLabel();
189
		if (text != null) {
190
			item.setText(text);
191
		} else {
192
			item.setText(""); //$NON-NLS-1$
193
		}
194
		item.setSelection(model.isSelected());
195
		item.setEnabled(model.isEnabled());
196
	}
197
198
	private void updateToolItem() {
199
		ToolItem item = (ToolItem) widget;
200
		final String text = model.getLabel();
201
		if (text != null) {
202
			item.setText(text);
203
		} else {
204
			item.setText(""); //$NON-NLS-1$
205
		}
206
		final String tooltip = model.getTooltip();
207
		item.setToolTipText(tooltip);
208
209
		item.setSelection(model.isSelected());
210
		item.setEnabled(model.isEnabled());
211
	}
212
213
	private void updateIcons() {
214
		if (widget instanceof MenuItem) {
215
			MenuItem item = (MenuItem) widget;
216
			LocalResourceManager m = new LocalResourceManager(
217
					JFaceResources.getResources());
218
			String iconURI = model.getIconURI();
219
			ImageDescriptor icon = getImageDescriptor(model);
220
			try {
221
				item.setImage(icon == null ? null : m.createImage(icon));
222
			} catch (DeviceResourceException e) {
223
				icon = ImageDescriptor.getMissingImageDescriptor();
224
				item.setImage(m.createImage(icon));
225
				// as we replaced the failed icon, log the message once.
226
				Activator.trace(Policy.DEBUG_MENUS,
227
						"failed to create image " + iconURI, e); //$NON-NLS-1$
228
			}
229
			disposeOldImages();
230
			localResourceManager = m;
231
		} else if (widget instanceof ToolItem) {
232
			ToolItem item = (ToolItem) widget;
233
			LocalResourceManager m = new LocalResourceManager(
234
					JFaceResources.getResources());
235
			String iconURI = model.getIconURI();
236
			ImageDescriptor icon = getImageDescriptor(model);
237
			try {
238
				item.setImage(icon == null ? null : m.createImage(icon));
239
			} catch (DeviceResourceException e) {
240
				icon = ImageDescriptor.getMissingImageDescriptor();
241
				item.setImage(m.createImage(icon));
242
				// as we replaced the failed icon, log the message once.
243
				Activator.trace(Policy.DEBUG_MENUS,
244
						"failed to create image " + iconURI, e); //$NON-NLS-1$
245
			}
246
			disposeOldImages();
247
			localResourceManager = m;
248
		}
249
	}
250
251
	private void disposeOldImages() {
252
		if (localResourceManager != null) {
253
			localResourceManager.dispose();
254
			localResourceManager = null;
255
		}
256
	}
257
258
	private Listener getItemListener() {
259
		if (menuItemListener == null) {
260
			menuItemListener = new Listener() {
261
				public void handleEvent(Event event) {
262
					switch (event.type) {
263
					case SWT.Dispose:
264
						handleWidgetDispose(event);
265
						break;
266
					case SWT.DefaultSelection:
267
					case SWT.Selection:
268
						if (event.widget != null) {
269
							handleWidgetSelection(event);
270
						}
271
						break;
272
					}
273
				}
274
			};
275
		}
276
		return menuItemListener;
277
	}
278
279
	private void handleWidgetDispose(Event event) {
280
		if (event.widget == widget) {
281
			widget.removeListener(SWT.Selection, getItemListener());
282
			widget.removeListener(SWT.Dispose, getItemListener());
283
			widget.removeListener(SWT.DefaultSelection, getItemListener());
284
			widget = null;
285
			model.setWidget(null);
286
			disposeOldImages();
287
		}
288
	}
289
290
	/*
291
	 * (non-Javadoc)
292
	 * 
293
	 * @see org.eclipse.jface.action.ContributionItem#dispose()
294
	 */
295
	@Override
296
	public void dispose() {
297
		if (widget != null) {
298
			widget.dispose();
299
			widget = null;
300
			model.setWidget(null);
301
		}
302
	}
303
304
	private void handleWidgetSelection(Event event) {
305
		if (widget != null && !widget.isDisposed()) {
306
			if (model.getType() == ItemType.CHECK
307
					|| model.getType() == ItemType.RADIO) {
308
				boolean selection = false;
309
				if (widget instanceof MenuItem) {
310
					selection = ((MenuItem) widget).getSelection();
311
				} else if (widget instanceof ToolItem) {
312
					selection = ((ToolItem) widget).getSelection();
313
				}
314
				model.setSelected(selection);
315
			}
316
			if (canExecuteItem()) {
317
				executeItem();
318
			}
319
		}
320
	}
321
322
	private void executeItem() {
323
		final IEclipseContext lclContext = getContext(model);
324
		if (!checkContribution(lclContext)) {
325
			return;
326
		}
327
		MContribution contrib = (MContribution) model;
328
		lclContext.set(MItem.class, model);
329
		ContextInjectionFactory.invoke(contrib.getObject(), Execute.class,
330
				lclContext);
331
		lclContext.remove(MItem.class);
332
	}
333
334
	private boolean canExecuteItem() {
335
		final IEclipseContext lclContext = getContext(model);
336
		if (!checkContribution(lclContext)) {
337
			return false;
338
		}
339
		MContribution contrib = (MContribution) model;
340
		lclContext.set(MItem.class, model);
341
		try {
342
			Boolean result = ((Boolean) ContextInjectionFactory.invoke(
343
					contrib.getObject(), CanExecute.class, lclContext,
344
					Boolean.TRUE));
345
			return result.booleanValue();
346
		} finally {
347
			lclContext.remove(MItem.class);
348
		}
349
	}
350
351
	private boolean checkContribution(IEclipseContext lclContext) {
352
		if (!(model instanceof MContribution)) {
353
			return false;
354
		}
355
		MContribution contrib = (MContribution) model;
356
		if (contrib.getObject() == null) {
357
			contrib.setObject(contribFactory.create(
358
					contrib.getContributionURI(), lclContext));
359
		}
360
		return contrib.getObject() != null;
361
	}
362
363
	public void setParent(IContributionManager parent) {
364
		if (getParent() instanceof IMenuManager) {
365
			IMenuManager menuMgr = (IMenuManager) getParent();
366
			menuMgr.removeMenuListener(menuListener);
367
		}
368
		if (parent instanceof IMenuManager) {
369
			IMenuManager menuMgr = (IMenuManager) parent;
370
			menuMgr.addMenuListener(menuListener);
371
		}
372
		super.setParent(parent);
373
	}
374
375
	private ImageDescriptor getImageDescriptor(MUILabel element) {
376
		String iconURI = element.getIconURI();
377
		if (iconURI != null && iconURI.length() > 0) {
378
			return resUtils.imageDescriptorFromURI(URI.createURI(iconURI));
379
		}
380
		return null;
381
	}
382
383
	/**
384
	 * Return a parent context for this part.
385
	 * 
386
	 * @param element
387
	 *            the part to start searching from
388
	 * @return the parent's closest context, or global context if none in the
389
	 *         hierarchy
390
	 */
391
	protected IEclipseContext getContextForParent(MUIElement element) {
392
		return modelService.getContainingContext(element);
393
	}
394
395
	/**
396
	 * Return a context for this part.
397
	 * 
398
	 * @param part
399
	 *            the part to start searching from
400
	 * @return the closest context, or global context if none in the hierarchy
401
	 */
402
	protected IEclipseContext getContext(MUIElement part) {
403
		if (part instanceof MContext) {
404
			return ((MContext) part).getContext();
405
		}
406
		return getContextForParent(part);
407
	}
408
409
	public Widget getWidget() {
410
		return widget;
411
	}
412
}
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java (+443 lines)
Added Link Here
1
package org.eclipse.e4.ui.workbench.renderers.swt;
2
3
import java.util.HashMap;
4
import java.util.List;
5
import javax.inject.Inject;
6
import org.eclipse.core.commands.ParameterizedCommand;
7
import org.eclipse.e4.core.commands.ECommandService;
8
import org.eclipse.e4.core.commands.EHandlerService;
9
import org.eclipse.e4.core.contexts.IEclipseContext;
10
import org.eclipse.e4.ui.bindings.EBindingService;
11
import org.eclipse.e4.ui.internal.workbench.Activator;
12
import org.eclipse.e4.ui.internal.workbench.Policy;
13
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
14
import org.eclipse.e4.ui.model.application.commands.MParameter;
15
import org.eclipse.e4.ui.model.application.ui.MContext;
16
import org.eclipse.e4.ui.model.application.ui.MUIElement;
17
import org.eclipse.e4.ui.model.application.ui.MUILabel;
18
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
19
import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem;
20
import org.eclipse.e4.ui.model.application.ui.menu.MItem;
21
import org.eclipse.e4.ui.workbench.IResourceUtilities;
22
import org.eclipse.e4.ui.workbench.modeling.EModelService;
23
import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
24
import org.eclipse.emf.common.util.URI;
25
import org.eclipse.jface.action.ContributionItem;
26
import org.eclipse.jface.action.IContributionManager;
27
import org.eclipse.jface.action.IMenuListener;
28
import org.eclipse.jface.action.IMenuManager;
29
import org.eclipse.jface.bindings.TriggerSequence;
30
import org.eclipse.jface.resource.DeviceResourceException;
31
import org.eclipse.jface.resource.ImageDescriptor;
32
import org.eclipse.jface.resource.JFaceResources;
33
import org.eclipse.jface.resource.LocalResourceManager;
34
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.widgets.Event;
36
import org.eclipse.swt.widgets.Listener;
37
import org.eclipse.swt.widgets.Menu;
38
import org.eclipse.swt.widgets.MenuItem;
39
import org.eclipse.swt.widgets.ToolBar;
40
import org.eclipse.swt.widgets.ToolItem;
41
import org.eclipse.swt.widgets.Widget;
42
43
public class HandledContributionItem extends ContributionItem {
44
	private MHandledItem model;
45
	private Widget widget;
46
	private Listener menuItemListener;
47
	private LocalResourceManager localResourceManager;
48
49
	@Inject
50
	private ECommandService commandService;
51
52
	@Inject
53
	private EModelService modelService;
54
55
	@Inject
56
	private EBindingService bindingService;
57
58
	private ISWTResourceUtilities resUtils = null;
59
60
	@Inject
61
	void setResourceUtils(IResourceUtilities utils) {
62
		resUtils = (ISWTResourceUtilities) utils;
63
	}
64
65
	private IMenuListener menuListener = new IMenuListener() {
66
		public void menuAboutToShow(IMenuManager manager) {
67
			update(null);
68
		}
69
	};
70
71
	public void setModel(MHandledItem item) {
72
		model = item;
73
		setId(model.getElementId());
74
		generateCommand();
75
		updateVisible();
76
	}
77
78
	/**
79
	 * 
80
	 */
81
	private void generateCommand() {
82
		if (model.getCommand() == null) {
83
			return;
84
		}
85
		if (model.getWbCommand() == null) {
86
			String cmdId = model.getCommand().getElementId();
87
			final List<MParameter> modelParms = model.getParameters();
88
			if (modelParms.isEmpty()) {
89
				final ParameterizedCommand parmCmd = commandService
90
						.createCommand(cmdId, null);
91
				Activator
92
						.trace(Policy.DEBUG_MENUS, "command: " + parmCmd, null); //$NON-NLS-1$
93
				model.setWbCommand(parmCmd);
94
				return;
95
			}
96
			HashMap<String, String> parms = new HashMap<String, String>();
97
			for (MParameter parm : modelParms) {
98
				parms.put(parm.getName(), parm.getValue());
99
			}
100
			final ParameterizedCommand parmCmd = commandService.createCommand(
101
					cmdId, parms);
102
			Activator.trace(Policy.DEBUG_MENUS, "command: " + parmCmd, null); //$NON-NLS-1$
103
			model.setWbCommand(parmCmd);
104
		}
105
	}
106
107
	/*
108
	 * (non-Javadoc)
109
	 * 
110
	 * @see
111
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
112
	 * .Menu, int)
113
	 */
114
	@Override
115
	public void fill(Menu menu, int index) {
116
		if (model == null) {
117
			return;
118
		}
119
		if (widget != null) {
120
			return;
121
		}
122
		int style = SWT.PUSH;
123
		if (model.getType() == ItemType.PUSH)
124
			style = SWT.PUSH;
125
		else if (model.getType() == ItemType.CHECK)
126
			style = SWT.CHECK;
127
		else if (model.getType() == ItemType.RADIO)
128
			style = SWT.RADIO;
129
		MenuItem item = null;
130
		if (index >= 0) {
131
			item = new MenuItem(menu, style, index);
132
		} else {
133
			item = new MenuItem(menu, style);
134
		}
135
		item.setData(this);
136
137
		item.addListener(SWT.Dispose, getItemListener());
138
		item.addListener(SWT.Selection, getItemListener());
139
		item.addListener(SWT.DefaultSelection, getItemListener());
140
141
		widget = item;
142
		model.setWidget(widget);
143
		widget.setData(AbstractPartRenderer.OWNING_ME, model);
144
145
		update(null);
146
		updateIcons();
147
	}
148
149
	/*
150
	 * (non-Javadoc)
151
	 * 
152
	 * @see
153
	 * org.eclipse.jface.action.ContributionItem#fill(org.eclipse.swt.widgets
154
	 * .ToolBar, int)
155
	 */
156
	@Override
157
	public void fill(ToolBar parent, int index) {
158
		if (model == null) {
159
			return;
160
		}
161
		if (widget != null) {
162
			return;
163
		}
164
		int style = SWT.PUSH;
165
		if (model.getType() == ItemType.PUSH)
166
			style = SWT.PUSH;
167
		else if (model.getType() == ItemType.CHECK)
168
			style = SWT.CHECK;
169
		else if (model.getType() == ItemType.RADIO)
170
			style = SWT.RADIO;
171
		ToolItem item = null;
172
		if (index >= 0) {
173
			item = new ToolItem(parent, style, index);
174
		} else {
175
			item = new ToolItem(parent, style);
176
		}
177
		item.setData(this);
178
179
		item.addListener(SWT.Dispose, getItemListener());
180
		item.addListener(SWT.Selection, getItemListener());
181
		item.addListener(SWT.DefaultSelection, getItemListener());
182
183
		widget = item;
184
		model.setWidget(widget);
185
		widget.setData(AbstractPartRenderer.OWNING_ME, model);
186
187
		update(null);
188
		updateIcons();
189
	}
190
191
	private void updateVisible() {
192
		setVisible((model).isVisible());
193
		final IContributionManager parent = getParent();
194
		if (parent != null) {
195
			parent.markDirty();
196
		}
197
	}
198
199
	/*
200
	 * (non-Javadoc)
201
	 * 
202
	 * @see org.eclipse.jface.action.ContributionItem#update()
203
	 */
204
	@Override
205
	public void update() {
206
		update(null);
207
	}
208
209
	/*
210
	 * (non-Javadoc)
211
	 * 
212
	 * @see org.eclipse.jface.action.ContributionItem#update(java.lang.String)
213
	 */
214
	@Override
215
	public void update(String id) {
216
		if (widget instanceof MenuItem) {
217
			updateMenuItem();
218
		} else if (widget instanceof ToolItem) {
219
			updateToolItem();
220
		}
221
	}
222
223
	private void updateMenuItem() {
224
		MenuItem item = (MenuItem) widget;
225
		String text = model.getLabel();
226
		ParameterizedCommand parmCmd = model.getWbCommand();
227
		String keyBindingText = null;
228
		if (parmCmd != null) {
229
			if (bindingService != null) {
230
				TriggerSequence binding = bindingService
231
						.getBestSequenceFor(parmCmd);
232
				if (binding != null)
233
					keyBindingText = binding.format();
234
			}
235
		}
236
		if (text != null) {
237
			if (keyBindingText == null)
238
				item.setText(text);
239
			else
240
				item.setText(text + '\t' + keyBindingText);
241
		} else {
242
			item.setText(""); //$NON-NLS-1$
243
		}
244
		item.setSelection(model.isSelected());
245
		item.setEnabled(model.isEnabled());
246
	}
247
248
	private void updateToolItem() {
249
		ToolItem item = (ToolItem) widget;
250
		final String text = model.getLabel();
251
		if (text != null) {
252
			item.setText(text);
253
		} else {
254
			item.setText(""); //$NON-NLS-1$
255
		}
256
		final String tooltip = model.getTooltip();
257
		item.setToolTipText(tooltip);
258
		item.setSelection(model.isSelected());
259
		item.setEnabled(model.isEnabled());
260
	}
261
262
	private void updateIcons() {
263
		if (widget instanceof MenuItem) {
264
			MenuItem item = (MenuItem) widget;
265
			LocalResourceManager m = new LocalResourceManager(
266
					JFaceResources.getResources());
267
			String iconURI = model.getIconURI();
268
			ImageDescriptor icon = getImageDescriptor(model);
269
			try {
270
				item.setImage(icon == null ? null : m.createImage(icon));
271
			} catch (DeviceResourceException e) {
272
				icon = ImageDescriptor.getMissingImageDescriptor();
273
				item.setImage(m.createImage(icon));
274
				// as we replaced the failed icon, log the message once.
275
				Activator.trace(Policy.DEBUG_MENUS,
276
						"failed to create image " + iconURI, e); //$NON-NLS-1$
277
			}
278
			disposeOldImages();
279
			localResourceManager = m;
280
		} else if (widget instanceof ToolItem) {
281
			ToolItem item = (ToolItem) widget;
282
			LocalResourceManager m = new LocalResourceManager(
283
					JFaceResources.getResources());
284
			String iconURI = model.getIconURI();
285
			ImageDescriptor icon = getImageDescriptor(model);
286
			try {
287
				item.setImage(icon == null ? null : m.createImage(icon));
288
			} catch (DeviceResourceException e) {
289
				icon = ImageDescriptor.getMissingImageDescriptor();
290
				item.setImage(m.createImage(icon));
291
				// as we replaced the failed icon, log the message once.
292
				Activator.trace(Policy.DEBUG_MENUS,
293
						"failed to create image " + iconURI, e); //$NON-NLS-1$
294
			}
295
			disposeOldImages();
296
			localResourceManager = m;
297
		}
298
	}
299
300
	private void disposeOldImages() {
301
		if (localResourceManager != null) {
302
			localResourceManager.dispose();
303
			localResourceManager = null;
304
		}
305
	}
306
307
	private Listener getItemListener() {
308
		if (menuItemListener == null) {
309
			menuItemListener = new Listener() {
310
				public void handleEvent(Event event) {
311
					switch (event.type) {
312
					case SWT.Dispose:
313
						handleWidgetDispose(event);
314
						break;
315
					case SWT.DefaultSelection:
316
					case SWT.Selection:
317
						if (event.widget != null) {
318
							handleWidgetSelection(event);
319
						}
320
						break;
321
					}
322
				}
323
			};
324
		}
325
		return menuItemListener;
326
	}
327
328
	private void handleWidgetDispose(Event event) {
329
		if (event.widget == widget) {
330
			widget.removeListener(SWT.Selection, getItemListener());
331
			widget.removeListener(SWT.Dispose, getItemListener());
332
			widget.removeListener(SWT.DefaultSelection, getItemListener());
333
			widget = null;
334
			model.setWidget(null);
335
			disposeOldImages();
336
		}
337
	}
338
339
	/*
340
	 * (non-Javadoc)
341
	 * 
342
	 * @see org.eclipse.jface.action.ContributionItem#dispose()
343
	 */
344
	@Override
345
	public void dispose() {
346
		if (widget != null) {
347
			widget.dispose();
348
			widget = null;
349
			model.setWidget(null);
350
		}
351
	}
352
353
	private void handleWidgetSelection(Event event) {
354
		if (widget != null && !widget.isDisposed()) {
355
			if (model.getType() == ItemType.CHECK
356
					|| model.getType() == ItemType.RADIO) {
357
				boolean selection = false;
358
				if (widget instanceof MenuItem) {
359
					selection = ((MenuItem) widget).getSelection();
360
				} else if (widget instanceof ToolItem) {
361
					selection = ((ToolItem) widget).getSelection();
362
				}
363
				model.setSelected(selection);
364
			}
365
			if (canExecuteItem()) {
366
				executeItem();
367
			}
368
		}
369
	}
370
371
	private void executeItem() {
372
		ParameterizedCommand cmd = model.getWbCommand();
373
		if (cmd == null) {
374
			return;
375
		}
376
		final IEclipseContext lclContext = getContext(model);
377
		EHandlerService service = (EHandlerService) lclContext
378
				.get(EHandlerService.class.getName());
379
		lclContext.set(MItem.class.getName(), model);
380
		service.executeHandler(cmd);
381
		lclContext.remove(MItem.class.getName());
382
	}
383
384
	private boolean canExecuteItem() {
385
		ParameterizedCommand cmd = model.getWbCommand();
386
		if (cmd == null) {
387
			return false;
388
		}
389
		final IEclipseContext lclContext = getContext(model);
390
		EHandlerService service = lclContext.get(EHandlerService.class);
391
		return service.canExecute(cmd);
392
	}
393
394
	public void setParent(IContributionManager parent) {
395
		if (getParent() instanceof IMenuManager) {
396
			IMenuManager menuMgr = (IMenuManager) getParent();
397
			menuMgr.removeMenuListener(menuListener);
398
		}
399
		if (parent instanceof IMenuManager) {
400
			IMenuManager menuMgr = (IMenuManager) parent;
401
			menuMgr.addMenuListener(menuListener);
402
		}
403
		super.setParent(parent);
404
	}
405
406
	private ImageDescriptor getImageDescriptor(MUILabel element) {
407
		String iconURI = element.getIconURI();
408
		if (iconURI != null && iconURI.length() > 0) {
409
			return resUtils.imageDescriptorFromURI(URI.createURI(iconURI));
410
		}
411
		return null;
412
	}
413
414
	/**
415
	 * Return a parent context for this part.
416
	 * 
417
	 * @param element
418
	 *            the part to start searching from
419
	 * @return the parent's closest context, or global context if none in the
420
	 *         hierarchy
421
	 */
422
	protected IEclipseContext getContextForParent(MUIElement element) {
423
		return modelService.getContainingContext(element);
424
	}
425
426
	/**
427
	 * Return a context for this part.
428
	 * 
429
	 * @param part
430
	 *            the part to start searching from
431
	 * @return the closest context, or global context if none in the hierarchy
432
	 */
433
	protected IEclipseContext getContext(MUIElement part) {
434
		if (part instanceof MContext) {
435
			return ((MContext) part).getContext();
436
		}
437
		return getContextForParent(part);
438
	}
439
440
	public Widget getWidget() {
441
		return widget;
442
	}
443
}
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/MenuItemRenderer.java (-2 / +1 lines)
Lines 10-17 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.e4.ui.workbench.renderers.swt;
11
package org.eclipse.e4.ui.workbench.renderers.swt;
12
12
13
import org.eclipse.e4.ui.internal.workbench.swt.WorkbenchSWTActivator;
14
15
import java.util.HashMap;
13
import java.util.HashMap;
16
import javax.annotation.PostConstruct;
14
import javax.annotation.PostConstruct;
17
import javax.annotation.PreDestroy;
15
import javax.annotation.PreDestroy;
Lines 24-29 import org.eclipse.e4.core.contexts.IEclipseContext; Link Here
24
import org.eclipse.e4.core.contexts.RunAndTrack;
22
import org.eclipse.e4.core.contexts.RunAndTrack;
25
import org.eclipse.e4.core.services.events.IEventBroker;
23
import org.eclipse.e4.core.services.events.IEventBroker;
26
import org.eclipse.e4.core.services.log.Logger;
24
import org.eclipse.e4.core.services.log.Logger;
25
import org.eclipse.e4.ui.internal.workbench.swt.WorkbenchSWTActivator;
27
import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
26
import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
28
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
27
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
29
import org.eclipse.e4.ui.model.application.ui.MUIElement;
28
import org.eclipse.e4.ui.model.application.ui.MUIElement;
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/NewHandledMenuItemRenderer.java (+151 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 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.e4.ui.workbench.renderers.swt;
13
14
import javax.annotation.PostConstruct;
15
import javax.annotation.PreDestroy;
16
import javax.inject.Inject;
17
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
18
import org.eclipse.e4.core.contexts.IEclipseContext;
19
import org.eclipse.e4.core.services.events.IEventBroker;
20
import org.eclipse.e4.core.services.log.Logger;
21
import org.eclipse.e4.ui.model.application.ui.MUIElement;
22
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
23
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
24
import org.eclipse.e4.ui.workbench.UIEvents;
25
import org.eclipse.jface.action.IContributionItem;
26
import org.eclipse.jface.action.MenuManager;
27
import org.eclipse.swt.widgets.Menu;
28
import org.eclipse.swt.widgets.MenuItem;
29
import org.osgi.service.event.Event;
30
import org.osgi.service.event.EventHandler;
31
32
/**
33
 *
34
 */
35
public class NewHandledMenuItemRenderer extends SWTPartRenderer {
36
37
	@Inject
38
	Logger logger;
39
	@Inject
40
	IEventBroker eventBroker;
41
	private EventHandler itemUpdater = new EventHandler() {
42
		public void handleEvent(Event event) {
43
			// Ensure that this event is for a MMenuItem
44
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MMenuItem))
45
				return;
46
47
			MMenuItem itemModel = (MMenuItem) event
48
					.getProperty(UIEvents.EventTags.ELEMENT);
49
			MenuItem menuItem = (MenuItem) itemModel.getWidget();
50
51
			// No widget == nothing to update
52
			if (menuItem == null)
53
				return;
54
			Object data = menuItem.getData();
55
			if (!(data instanceof IContributionItem)) {
56
				return;
57
			}
58
59
			IContributionItem ici = (IContributionItem) data;
60
			String attName = (String) event
61
					.getProperty(UIEvents.EventTags.ATTNAME);
62
			if (UIEvents.UILabel.LABEL.equals(attName)) {
63
				ici.update();
64
			} else if (UIEvents.UILabel.ICONURI.equals(attName)) {
65
				ici.update();
66
			}
67
		}
68
	};
69
70
	private EventHandler selectionUpdater = new EventHandler() {
71
		public void handleEvent(Event event) {
72
			// Ensure that this event is for a MToolItem
73
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MMenuItem))
74
				return;
75
76
			MMenuItem itemModel = (MMenuItem) event
77
					.getProperty(UIEvents.EventTags.ELEMENT);
78
			MenuItem menuItem = (MenuItem) itemModel.getWidget();
79
			if (menuItem != null) {
80
				Object data = menuItem.getData();
81
				if (data instanceof IContributionItem) {
82
					((IContributionItem) data).update();
83
				}
84
			}
85
		}
86
	};
87
88
	private EventHandler enabledUpdater = new EventHandler() {
89
		public void handleEvent(Event event) {
90
			// Ensure that this event is for a MMenuItem
91
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MMenuItem))
92
				return;
93
94
			MMenuItem itemModel = (MMenuItem) event
95
					.getProperty(UIEvents.EventTags.ELEMENT);
96
			MenuItem menuItem = (MenuItem) itemModel.getWidget();
97
			if (menuItem != null) {
98
				Object data = menuItem.getData();
99
				if (data instanceof IContributionItem) {
100
					((IContributionItem) data).update();
101
				}
102
			}
103
		}
104
	};
105
106
	@PostConstruct
107
	public void init() {
108
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UILabel.TOPIC),
109
				itemUpdater);
110
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
111
				UIEvents.Item.SELECTED), selectionUpdater);
112
		eventBroker
113
				.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
114
						UIEvents.Item.ENABLED), enabledUpdater);
115
	}
116
117
	@PreDestroy
118
	public void contextDisposed() {
119
		eventBroker.unsubscribe(itemUpdater);
120
		eventBroker.unsubscribe(selectionUpdater);
121
		eventBroker.unsubscribe(enabledUpdater);
122
	}
123
124
	/*
125
	 * (non-Javadoc)
126
	 * 
127
	 * @see
128
	 * org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer#createWidget
129
	 * (org.eclipse.e4.ui.model.application.ui.MUIElement, java.lang.Object)
130
	 */
131
	@Override
132
	public Object createWidget(MUIElement element, Object parent) {
133
		if (!(element instanceof MHandledMenuItem) || !(parent instanceof Menu))
134
			return null;
135
136
		Object data = ((Menu) parent).getData();
137
		if (!(data instanceof MenuManager)) {
138
			return null;
139
		}
140
		MenuManager parentManager = (MenuManager) data;
141
		MHandledMenuItem itemModel = (MHandledMenuItem) element;
142
		final IEclipseContext lclContext = getContext(itemModel);
143
		HandledContributionItem ci = ContextInjectionFactory.make(
144
				HandledContributionItem.class, lclContext);
145
		ci.setModel(itemModel);
146
		parentManager.add(ci);
147
		// parentManager.update(false);
148
		return ci.getWidget();
149
	}
150
151
}
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/NewMenuRenderer.java (+576 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 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.e4.ui.workbench.renderers.swt;
13
14
import java.util.ArrayList;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.List;
18
import java.util.Map;
19
import javax.annotation.PostConstruct;
20
import javax.annotation.PreDestroy;
21
import javax.inject.Inject;
22
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
23
import org.eclipse.e4.core.contexts.IEclipseContext;
24
import org.eclipse.e4.core.services.events.IEventBroker;
25
import org.eclipse.e4.core.services.log.Logger;
26
import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer;
27
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
28
import org.eclipse.e4.ui.model.application.MApplication;
29
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
30
import org.eclipse.e4.ui.model.application.ui.MUIElement;
31
import org.eclipse.e4.ui.model.application.ui.MUILabel;
32
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
33
import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
34
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
35
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
36
import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
37
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
38
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
39
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
40
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu;
41
import org.eclipse.e4.ui.workbench.IResourceUtilities;
42
import org.eclipse.e4.ui.workbench.UIEvents;
43
import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
44
import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
45
import org.eclipse.emf.common.util.URI;
46
import org.eclipse.emf.ecore.EObject;
47
import org.eclipse.emf.ecore.util.EcoreUtil;
48
import org.eclipse.jface.action.AbstractGroupMarker;
49
import org.eclipse.jface.action.GroupMarker;
50
import org.eclipse.jface.action.IContributionItem;
51
import org.eclipse.jface.action.IMenuListener;
52
import org.eclipse.jface.action.IMenuManager;
53
import org.eclipse.jface.action.MenuManager;
54
import org.eclipse.jface.action.Separator;
55
import org.eclipse.jface.resource.ImageDescriptor;
56
import org.eclipse.swt.widgets.Control;
57
import org.eclipse.swt.widgets.Decorations;
58
import org.eclipse.swt.widgets.Menu;
59
import org.osgi.service.event.Event;
60
import org.osgi.service.event.EventHandler;
61
62
/**
63
 *
64
 */
65
public class NewMenuRenderer extends SWTPartRenderer {
66
	private static final String NO_LABEL = "UnLabled"; //$NON-NLS-1$
67
68
	private Map<MMenu, MenuManager> modelToManager = new HashMap<MMenu, MenuManager>();
69
70
	private Map<MMenuItem, IContributionItem> modelToContribution = new HashMap<MMenuItem, IContributionItem>();
71
72
	private Map<MMenuElement, ContributionRecord> modelContributionToRecord = new HashMap<MMenuElement, ContributionRecord>();
73
74
	@Inject
75
	private Logger logger;
76
77
	@Inject
78
	private MApplication application;
79
80
	@Inject
81
	IEventBroker eventBroker;
82
	private EventHandler itemUpdater = new EventHandler() {
83
		public void handleEvent(Event event) {
84
			// Ensure that this event is for a MMenuItem
85
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MMenuItem))
86
				return;
87
88
			MMenuItem itemModel = (MMenuItem) event
89
					.getProperty(UIEvents.EventTags.ELEMENT);
90
91
			IContributionItem ici = modelToContribution.get(itemModel);
92
			if (ici == null) {
93
				return;
94
			}
95
96
			String attName = (String) event
97
					.getProperty(UIEvents.EventTags.ATTNAME);
98
			if (UIEvents.UILabel.LABEL.equals(attName)) {
99
				ici.update();
100
			} else if (UIEvents.UILabel.ICONURI.equals(attName)) {
101
				ici.update();
102
			}
103
		}
104
	};
105
106
	private EventHandler toBeRenderedUpdater = new EventHandler() {
107
		public void handleEvent(Event event) {
108
			// Ensure that this event is for a MMenuItem
109
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MMenuItem))
110
				return;
111
112
			MMenuItem itemModel = (MMenuItem) event
113
					.getProperty(UIEvents.EventTags.ELEMENT);
114
			String attName = (String) event
115
					.getProperty(UIEvents.EventTags.ATTNAME);
116
			if (UIEvents.UIElement.TOBERENDERED.equals(attName)) {
117
				Object obj = itemModel.getParent();
118
				if (!(obj instanceof MMenu)) {
119
					return;
120
				}
121
				MenuManager parent = modelToManager.get(obj);
122
				if (itemModel.isToBeRendered()) {
123
					if (parent != null) {
124
						modelProcessSwitch(parent, itemModel);
125
					}
126
				} else {
127
					IContributionItem ici = modelToContribution
128
							.remove(itemModel);
129
					if (ici != null && parent != null) {
130
						parent.remove(ici);
131
					}
132
					if (ici != null) {
133
						ici.dispose();
134
					}
135
				}
136
			} else if (UIEvents.UIElement.VISIBLE.equals(attName)) {
137
				IContributionItem ici = modelToContribution.get(itemModel);
138
				if (ici == null) {
139
					return;
140
				}
141
				ici.setVisible(itemModel.isVisible());
142
			}
143
		}
144
	};
145
146
	private EventHandler selectionUpdater = new EventHandler() {
147
		public void handleEvent(Event event) {
148
			// Ensure that this event is for a MToolItem
149
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MMenuItem))
150
				return;
151
152
			MMenuItem itemModel = (MMenuItem) event
153
					.getProperty(UIEvents.EventTags.ELEMENT);
154
			IContributionItem ici = modelToContribution.get(itemModel);
155
			if (ici != null) {
156
				ici.update();
157
			}
158
		}
159
	};
160
161
	private EventHandler enabledUpdater = new EventHandler() {
162
		public void handleEvent(Event event) {
163
			// Ensure that this event is for a MMenuItem
164
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MMenuItem))
165
				return;
166
167
			MMenuItem itemModel = (MMenuItem) event
168
					.getProperty(UIEvents.EventTags.ELEMENT);
169
			IContributionItem ici = modelToContribution.get(itemModel);
170
			if (ici != null) {
171
				ici.update();
172
			}
173
		}
174
	};
175
176
	private IMenuListener visibilityCalculationListener = new IMenuListener() {
177
		public void menuAboutToShow(IMenuManager manager) {
178
			MenuManager menuManager = (MenuManager) manager;
179
			if (menuManager.getMenu() == null) {
180
				return;
181
			}
182
			Menu menu = menuManager.getMenu();
183
			Object obj = menu.getData(AbstractPartRenderer.OWNING_ME);
184
			if (obj == null && menu.getParentItem() != null) {
185
				obj = menu.getParentItem().getData(
186
						AbstractPartRenderer.OWNING_ME);
187
			}
188
			if (!(obj instanceof MMenu)) {
189
				return;
190
			}
191
			MMenu menuModel = (MMenu) obj;
192
			final IEclipseContext parentContext = modelService
193
					.getContainingContext(menuModel);
194
			HashSet<ContributionRecord> records = new HashSet<ContributionRecord>();
195
			for (MMenuElement element : menuModel.getChildren()) {
196
				ContributionRecord record = modelContributionToRecord
197
						.get(element);
198
				if (records.add(record)) {
199
					record.updateVisibility(parentContext);
200
				}
201
			}
202
		}
203
	};
204
205
	@PostConstruct
206
	public void init() {
207
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UILabel.TOPIC),
208
				itemUpdater);
209
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
210
				UIEvents.Item.SELECTED), selectionUpdater);
211
		eventBroker
212
				.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
213
						UIEvents.Item.ENABLED), enabledUpdater);
214
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC,
215
				UIEvents.UIElement.TOBERENDERED), toBeRenderedUpdater);
216
217
	}
218
219
	@PreDestroy
220
	public void contextDisposed() {
221
		eventBroker.unsubscribe(itemUpdater);
222
		eventBroker.unsubscribe(selectionUpdater);
223
		eventBroker.unsubscribe(enabledUpdater);
224
		eventBroker.unsubscribe(toBeRenderedUpdater);
225
	}
226
227
	/*
228
	 * (non-Javadoc)
229
	 * 
230
	 * @see
231
	 * org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer#createWidget
232
	 * (org.eclipse.e4.ui.model.application.ui.MUIElement, java.lang.Object)
233
	 */
234
	@Override
235
	public Object createWidget(MUIElement element, Object parent) {
236
		if (!(element instanceof MMenu))
237
			return null;
238
239
		final MMenu menuModel = (MMenu) element;
240
		Menu newMenu = null;
241
242
		if (parent instanceof Decorations) {
243
			MUIElement container = (MUIElement) ((EObject) element)
244
					.eContainer();
245
			if (container instanceof MWindow) {
246
				MenuManager menuBarManager = new MenuManager(NO_LABEL,
247
						menuModel.getElementId());
248
				modelToManager.put(menuModel, menuBarManager);
249
				menuBarManager.addMenuListener(visibilityCalculationListener);
250
				newMenu = menuBarManager.createMenuBar((Decorations) parent);
251
				((Decorations) parent).setMenuBar(newMenu);
252
				newMenu.setData(menuBarManager);
253
			} else {
254
				MenuManager popupManager = new MenuManager(NO_LABEL,
255
						menuModel.getElementId());
256
				modelToManager.put(menuModel, popupManager);
257
				popupManager.addMenuListener(visibilityCalculationListener);
258
				newMenu = popupManager.createContextMenu((Control) parent);
259
				((Control) parent).setMenu(newMenu);
260
				newMenu.setData(popupManager);
261
			}
262
		} else if (parent instanceof Menu) {
263
			// Object data = ((Menu) parent).getData();
264
			logger.debug(new Exception(), "Trying to render a sub menu " //$NON-NLS-1$
265
					+ menuModel + "\n\t" + parent); //$NON-NLS-1$
266
267
		} else if (parent instanceof Control) {
268
			MenuManager popupManager = new MenuManager(NO_LABEL,
269
					menuModel.getElementId());
270
			modelToManager.put(menuModel, popupManager);
271
			popupManager.addMenuListener(visibilityCalculationListener);
272
			newMenu = popupManager.createContextMenu((Control) parent);
273
			((Control) parent).setMenu(newMenu);
274
			newMenu.setData(popupManager);
275
		}
276
		processContributions(menuModel);
277
		return newMenu;
278
	}
279
280
	/**
281
	 * @param menuModel
282
	 */
283
	private void processContributions(MMenu menuModel) {
284
		final ArrayList<MMenuContribution> toContribute = new ArrayList<MMenuContribution>();
285
		ContributionsAnalyzer.XXXgatherMenuContributions(menuModel,
286
				application.getMenuContributions(), menuModel.getElementId(),
287
				toContribute, null, menuModel instanceof MPopupMenu);
288
		generateContributions(menuModel, toContribute);
289
	}
290
291
	/**
292
	 * @param menuModel
293
	 * @param toContribute
294
	 */
295
	private void generateContributions(MMenu menuModel,
296
			ArrayList<MMenuContribution> toContribute) {
297
		HashSet<String> existingMenuIds = new HashSet<String>();
298
		HashSet<String> existingSeparatorNames = new HashSet<String>();
299
		for (MMenuElement child : menuModel.getChildren()) {
300
			String elementId = child.getElementId();
301
			if (child instanceof MMenu && elementId != null) {
302
				existingMenuIds.add(elementId);
303
			} else if (child instanceof MMenuSeparator && elementId != null) {
304
				existingSeparatorNames.add(elementId);
305
			}
306
		}
307
308
		MenuManager manager = modelToManager.get(menuModel);
309
		boolean done = toContribute.size() == 0;
310
		while (!done) {
311
			ArrayList<MMenuContribution> curList = new ArrayList<MMenuContribution>(
312
					toContribute);
313
			int retryCount = toContribute.size();
314
			toContribute.clear();
315
316
			for (MMenuContribution menuContribution : curList) {
317
				if (!processAddition(menuModel, manager, menuContribution,
318
						existingMenuIds, existingSeparatorNames)) {
319
					toContribute.add(menuContribution);
320
				}
321
			}
322
323
			// We're done if the retryList is now empty (everything done) or
324
			// if the list hasn't changed at all (no hope)
325
			done = (toContribute.size() == 0)
326
					|| (toContribute.size() == retryCount);
327
		}
328
	}
329
330
	/**
331
	 * @param menuModel
332
	 * @param manager
333
	 * @param menuContribution
334
	 * @return true if the menuContribution was processed
335
	 */
336
	private boolean processAddition(MMenu menuModel, MenuManager manager,
337
			MMenuContribution menuContribution,
338
			final HashSet<String> existingMenuIds,
339
			HashSet<String> existingSeparatorNames) {
340
		int idx = getIndex(menuModel, menuContribution.getPositionInParent());
341
		if (idx == -1) {
342
			return false;
343
		}
344
		ContributionRecord record = new ContributionRecord(menuModel,
345
				menuContribution);
346
		record.generate();
347
		for (MMenuElement copy : record.generatedElements) {
348
			modelContributionToRecord.put(copy, record);
349
			if (copy instanceof MMenu
350
					&& existingMenuIds.contains(copy.getElementId())) {
351
				// skip this, it's already there
352
				continue;
353
			} else if (copy instanceof MMenuSeparator
354
					&& existingSeparatorNames.contains(copy.getElementId())) {
355
				// skip this, it's already there
356
				continue;
357
			}
358
			menuModel.getChildren().add(idx++, copy);
359
			if (copy instanceof MMenu && copy.getElementId() != null) {
360
				existingMenuIds.add(copy.getElementId());
361
			} else if (copy instanceof MMenuSeparator
362
					&& copy.getElementId() != null) {
363
				existingSeparatorNames.add(copy.getElementId());
364
			}
365
		}
366
		return true;
367
	}
368
369
	private static int getIndex(MElementContainer<?> menuModel,
370
			String positionInParent) {
371
		String id = null;
372
		String modifier = null;
373
		if (positionInParent != null && positionInParent.length() > 0) {
374
			String[] array = positionInParent.split("="); //$NON-NLS-1$
375
			modifier = array[0];
376
			id = array[1];
377
		}
378
		if (id == null) {
379
			return menuModel.getChildren().size();
380
		}
381
382
		int idx = 0;
383
		int size = menuModel.getChildren().size();
384
		while (idx < size) {
385
			if (id.equals(menuModel.getChildren().get(idx).getElementId())) {
386
				if ("after".equals(modifier)) { //$NON-NLS-1$
387
					idx++;
388
				}
389
				return idx;
390
			}
391
			idx++;
392
		}
393
		return id.equals("additions") ? menuModel.getChildren().size() : -1; //$NON-NLS-1$
394
	}
395
396
	static class ContributionRecord {
397
		MMenu menuModel;
398
		MMenuContribution menuContribution;
399
		ArrayList<MMenuElement> generatedElements = new ArrayList<MMenuElement>();
400
401
		public ContributionRecord(MMenu menuModel,
402
				MMenuContribution contribution) {
403
			this.menuModel = menuModel;
404
			this.menuContribution = contribution;
405
		}
406
407
		/**
408
		 * @param context
409
		 */
410
		public void updateVisibility(IEclipseContext context) {
411
			ExpressionContext exprContext = new ExpressionContext(context);
412
			boolean isVisible = ContributionsAnalyzer.isVisible(
413
					menuContribution, exprContext);
414
			for (MMenuElement item : generatedElements) {
415
				item.setVisible(isVisible);
416
			}
417
		}
418
419
		public void generate() {
420
			for (MMenuElement item : menuContribution.getChildren()) {
421
				MMenuElement copy = (MMenuElement) EcoreUtil
422
						.copy((EObject) item);
423
				generatedElements.add(copy);
424
			}
425
		}
426
	}
427
428
	void removeMenuContributions(final MMenu menuModel,
429
			final ArrayList<MMenuElement> menuContributionsToRemove) {
430
		for (MMenuElement item : menuContributionsToRemove) {
431
			menuModel.getChildren().remove(item);
432
		}
433
	}
434
435
	/*
436
	 * (non-Javadoc)
437
	 * 
438
	 * @see
439
	 * org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer#processContents
440
	 * (org.eclipse.e4.ui.model.application.ui.MElementContainer)
441
	 */
442
	@Override
443
	public void processContents(MElementContainer<MUIElement> container) {
444
		// I can either simply stop processing, or we can walk the model
445
		// ourselves like the "old" days
446
		// EMF gives us null lists if empty
447
		if (container == null)
448
			return;
449
450
		MenuManager parentManager = modelToManager.get(container);
451
		if (parentManager == null) {
452
			return;
453
		}
454
		// Process any contents of the newly created ME
455
		List<MUIElement> parts = container.getChildren();
456
		if (parts != null) {
457
			MUIElement[] plist = parts.toArray(new MUIElement[parts.size()]);
458
			for (int i = 0; i < plist.length; i++) {
459
				MUIElement childME = plist[i];
460
				modelProcessSwitch(parentManager, (MMenuElement) childME);
461
			}
462
		}
463
		parentManager.update(false);
464
	}
465
466
	/**
467
	 * @param parentManager
468
	 * @param menuModel
469
	 */
470
	private void processMenu(MenuManager parentManager, MMenu menuModel) {
471
		String menuText = getText(menuModel);
472
		ImageDescriptor desc = getImageDescriptor(menuModel);
473
		MenuManager menuManager = new MenuManager(menuText, desc,
474
				menuModel.getElementId());
475
		modelToManager.put(menuModel, menuManager);
476
		menuManager.addMenuListener(visibilityCalculationListener);
477
		parentManager.add(menuManager);
478
		processContributions(menuModel);
479
		List<MMenuElement> parts = menuModel.getChildren();
480
		if (parts != null) {
481
			MMenuElement[] plist = parts
482
					.toArray(new MMenuElement[parts.size()]);
483
			for (int i = 0; i < plist.length; i++) {
484
				MMenuElement childME = plist[i];
485
				modelProcessSwitch(menuManager, childME);
486
			}
487
		}
488
	}
489
490
	/**
491
	 * @param menuManager
492
	 * @param childME
493
	 */
494
	void modelProcessSwitch(MenuManager menuManager, MMenuElement childME) {
495
		if (childME instanceof MHandledMenuItem) {
496
			MHandledMenuItem itemModel = (MHandledMenuItem) childME;
497
			processHandledItem(menuManager, itemModel);
498
		} else if (childME instanceof MDirectMenuItem) {
499
			MDirectMenuItem itemModel = (MDirectMenuItem) childME;
500
			processDirectItem(menuManager, itemModel, null);
501
		} else if (childME instanceof MMenuSeparator) {
502
			MMenuSeparator sep = (MMenuSeparator) childME;
503
			processSeparator(menuManager, sep);
504
		} else if (childME instanceof MMenu) {
505
			MMenu itemModel = (MMenu) childME;
506
			processMenu(menuManager, itemModel);
507
		}
508
	}
509
510
	/**
511
	 * @param menuManager
512
	 * @param itemModel
513
	 */
514
	private void processSeparator(MenuManager menuManager,
515
			MMenuSeparator itemModel) {
516
		AbstractGroupMarker marker = null;
517
		if (itemModel.isVisible()) {
518
			marker = new Separator();
519
			marker.setId(itemModel.getElementId());
520
		} else {
521
			if (itemModel.getElementId() != null) {
522
				marker = new GroupMarker(itemModel.getElementId());
523
			}
524
		}
525
		menuManager.add(marker);
526
	}
527
528
	/**
529
	 * @param parentManager
530
	 * @param itemModel
531
	 * @param id
532
	 *            TODO
533
	 */
534
	void processDirectItem(MenuManager parentManager,
535
			MDirectMenuItem itemModel, String id) {
536
		final IEclipseContext lclContext = getContext(itemModel);
537
		DirectContributionItem ci = ContextInjectionFactory.make(
538
				DirectContributionItem.class, lclContext);
539
		ci.setModel(itemModel);
540
		parentManager.add(ci);
541
		modelToContribution.put(itemModel, ci);
542
	}
543
544
	/**
545
	 * @param parentManager
546
	 * @param itemModel
547
	 */
548
	void processHandledItem(MenuManager parentManager,
549
			MHandledMenuItem itemModel) {
550
		final IEclipseContext lclContext = getContext(itemModel);
551
		HandledContributionItem ci = ContextInjectionFactory.make(
552
				HandledContributionItem.class, lclContext);
553
		ci.setModel(itemModel);
554
		parentManager.add(ci);
555
		modelToContribution.put(itemModel, ci);
556
	}
557
558
	private String getText(MMenu menuModel) {
559
		String text = menuModel.getLabel();
560
		if (text == null || text.length() == 0) {
561
			return NO_LABEL;
562
		}
563
		return text;
564
	}
565
566
	private ImageDescriptor getImageDescriptor(MUILabel element) {
567
		IEclipseContext localContext = context;
568
		String iconURI = element.getIconURI();
569
		if (iconURI != null && iconURI.length() > 0) {
570
			ISWTResourceUtilities resUtils = (ISWTResourceUtilities) localContext
571
					.get(IResourceUtilities.class.getName());
572
			return resUtils.imageDescriptorFromURI(URI.createURI(iconURI));
573
		}
574
		return null;
575
	}
576
}
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/NewToolBarRenderer.java (+337 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 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.e4.ui.workbench.renderers.swt;
13
14
import java.util.HashMap;
15
import java.util.List;
16
import java.util.Map;
17
import javax.annotation.PostConstruct;
18
import javax.annotation.PreDestroy;
19
import javax.inject.Inject;
20
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
21
import org.eclipse.e4.core.contexts.IEclipseContext;
22
import org.eclipse.e4.core.services.events.IEventBroker;
23
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
24
import org.eclipse.e4.ui.model.application.ui.MUIElement;
25
import org.eclipse.e4.ui.model.application.ui.SideValue;
26
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
27
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
28
import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
29
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
30
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
31
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
32
import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
33
import org.eclipse.e4.ui.workbench.UIEvents;
34
import org.eclipse.jface.action.AbstractGroupMarker;
35
import org.eclipse.jface.action.GroupMarker;
36
import org.eclipse.jface.action.IContributionItem;
37
import org.eclipse.jface.action.Separator;
38
import org.eclipse.jface.action.ToolBarManager;
39
import org.eclipse.jface.layout.RowLayoutFactory;
40
import org.eclipse.swt.SWT;
41
import org.eclipse.swt.layout.RowLayout;
42
import org.eclipse.swt.widgets.Composite;
43
import org.eclipse.swt.widgets.ToolBar;
44
import org.eclipse.swt.widgets.ToolItem;
45
import org.osgi.service.event.Event;
46
import org.osgi.service.event.EventHandler;
47
48
/**
49
 *
50
 */
51
public class NewToolBarRenderer extends SWTPartRenderer {
52
53
	private Map<MToolBar, ToolBarManager> modelToManager = new HashMap<MToolBar, ToolBarManager>();
54
	private Map<MToolBarElement, IContributionItem> modelToContribution = new HashMap<MToolBarElement, IContributionItem>();
55
56
	// @Inject
57
	// private Logger logger;
58
59
	@Inject
60
	IEventBroker eventBroker;
61
	private EventHandler itemUpdater = new EventHandler() {
62
		public void handleEvent(Event event) {
63
			// Ensure that this event is for a MMenuItem
64
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MToolBarElement))
65
				return;
66
67
			MToolBarElement itemModel = (MToolBarElement) event
68
					.getProperty(UIEvents.EventTags.ELEMENT);
69
70
			IContributionItem ici = modelToContribution.get(itemModel);
71
			if (ici == null) {
72
				return;
73
			}
74
75
			String attName = (String) event
76
					.getProperty(UIEvents.EventTags.ATTNAME);
77
			if (UIEvents.UILabel.LABEL.equals(attName)) {
78
				ici.update();
79
			} else if (UIEvents.UILabel.ICONURI.equals(attName)) {
80
				ici.update();
81
			} else if (UIEvents.UILabel.TOOLTIP.equals(attName)) {
82
				ici.update();
83
			}
84
		}
85
	};
86
87
	private EventHandler toBeRenderedUpdater = new EventHandler() {
88
		public void handleEvent(Event event) {
89
			// Ensure that this event is for a MMenuItem
90
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MToolBarElement))
91
				return;
92
93
			MToolBarElement itemModel = (MToolBarElement) event
94
					.getProperty(UIEvents.EventTags.ELEMENT);
95
			String attName = (String) event
96
					.getProperty(UIEvents.EventTags.ATTNAME);
97
			if (UIEvents.UIElement.TOBERENDERED.equals(attName)) {
98
				Object obj = itemModel.getParent();
99
				if (!(obj instanceof MToolBar)) {
100
					return;
101
				}
102
				ToolBarManager parent = modelToManager.get(obj);
103
				if (itemModel.isToBeRendered()) {
104
					if (parent != null) {
105
						modelProcessSwitch(parent, itemModel);
106
					}
107
				} else {
108
					IContributionItem ici = modelToContribution
109
							.remove(itemModel);
110
					if (ici != null && parent != null) {
111
						parent.remove(ici);
112
					}
113
					if (ici != null) {
114
						ici.dispose();
115
					}
116
				}
117
			}
118
		}
119
	};
120
121
	private EventHandler selectionUpdater = new EventHandler() {
122
		public void handleEvent(Event event) {
123
			// Ensure that this event is for a MToolItem
124
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MToolBarElement))
125
				return;
126
127
			MToolBarElement itemModel = (MToolBarElement) event
128
					.getProperty(UIEvents.EventTags.ELEMENT);
129
			IContributionItem ici = modelToContribution.get(itemModel);
130
			if (ici != null) {
131
				ici.update();
132
			}
133
		}
134
	};
135
136
	private EventHandler enabledUpdater = new EventHandler() {
137
		public void handleEvent(Event event) {
138
			// Ensure that this event is for a MMenuItem
139
			if (!(event.getProperty(UIEvents.EventTags.ELEMENT) instanceof MToolBarElement))
140
				return;
141
142
			MToolBarElement itemModel = (MToolBarElement) event
143
					.getProperty(UIEvents.EventTags.ELEMENT);
144
			IContributionItem ici = modelToContribution.get(itemModel);
145
			if (ici != null) {
146
				ici.update();
147
			}
148
		}
149
	};
150
151
	@PostConstruct
152
	public void init() {
153
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UILabel.TOPIC),
154
				itemUpdater);
155
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
156
				UIEvents.Item.SELECTED), selectionUpdater);
157
		eventBroker
158
				.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
159
						UIEvents.Item.ENABLED), enabledUpdater);
160
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC,
161
				UIEvents.UIElement.TOBERENDERED), toBeRenderedUpdater);
162
163
	}
164
165
	@PreDestroy
166
	public void contextDisposed() {
167
		eventBroker.unsubscribe(itemUpdater);
168
		eventBroker.unsubscribe(selectionUpdater);
169
		eventBroker.unsubscribe(enabledUpdater);
170
		eventBroker.unsubscribe(toBeRenderedUpdater);
171
	}
172
173
	/*
174
	 * (non-Javadoc)
175
	 * 
176
	 * @see
177
	 * org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer#createWidget
178
	 * (org.eclipse.e4.ui.model.application.ui.MUIElement, java.lang.Object)
179
	 */
180
	@Override
181
	public Object createWidget(final MUIElement element, Object parent) {
182
		if (!(element instanceof MToolBar) || !(parent instanceof Composite))
183
			return null;
184
185
		// HACK!! This should be done using a separate renderer
186
		Composite intermediate = new Composite((Composite) parent, SWT.NONE);
187
		createToolbar(element, intermediate);
188
189
		return intermediate;
190
	}
191
192
	ToolBar createToolbar(final MUIElement element, Composite intermediate) {
193
		int orientation = getOrientation(element);
194
		RowLayout layout = RowLayoutFactory.fillDefaults().wrap(false)
195
				.spacing(0).type(orientation).create();
196
		layout.marginLeft = 3;
197
		layout.center = true;
198
		intermediate.setLayout(layout);
199
		// new Label(intermediate, (orientation == SWT.HORIZONTAL ? SWT.VERTICAL
200
		// : SWT.HORIZONTAL) | SWT.SEPARATOR);
201
202
		ToolBar separatorToolBar = new ToolBar(intermediate, orientation
203
				| SWT.WRAP | SWT.FLAT | SWT.RIGHT);
204
		new ToolItem(separatorToolBar, SWT.SEPARATOR);
205
		ToolBarManager manager = new ToolBarManager(orientation | SWT.WRAP
206
				| SWT.FLAT | SWT.RIGHT);
207
		modelToManager.put((MToolBar) element, manager);
208
		ToolBar bar = manager.createControl(intermediate);
209
		bar.setData(manager);
210
		return bar;
211
	}
212
213
	int getOrientation(final MUIElement element) {
214
		MUIElement theParent = element.getParent();
215
		if (theParent instanceof MTrimBar) {
216
			MTrimBar trimContainer = (MTrimBar) theParent;
217
			SideValue side = trimContainer.getSide();
218
			if (side.getValue() == SideValue.LEFT_VALUE
219
					|| side.getValue() == SideValue.RIGHT_VALUE)
220
				return SWT.VERTICAL;
221
		}
222
		return SWT.HORIZONTAL;
223
	}
224
225
	/*
226
	 * (non-Javadoc)
227
	 * 
228
	 * @see
229
	 * org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer#processContents
230
	 * (org.eclipse.e4.ui.model.application.ui.MElementContainer)
231
	 */
232
	@Override
233
	public void processContents(MElementContainer<MUIElement> container) {
234
		// I can either simply stop processing, or we can walk the model
235
		// ourselves like the "old" days
236
		// EMF gives us null lists if empty
237
		if (container == null)
238
			return;
239
240
		ToolBarManager parentManager = modelToManager.get(container);
241
		if (parentManager == null) {
242
			return;
243
		}
244
		// Process any contents of the newly created ME
245
		List<MUIElement> parts = container.getChildren();
246
		if (parts != null) {
247
			MUIElement[] plist = parts.toArray(new MUIElement[parts.size()]);
248
			for (int i = 0; i < plist.length; i++) {
249
				MUIElement childME = plist[i];
250
				modelProcessSwitch(parentManager, (MToolBarElement) childME);
251
			}
252
		}
253
		parentManager.update(false);
254
	}
255
256
	/**
257
	 * @param parentManager
258
	 * @param childME
259
	 */
260
	private void modelProcessSwitch(ToolBarManager parentManager,
261
			MToolBarElement childME) {
262
		if (childME instanceof MHandledToolItem) {
263
			MHandledToolItem itemModel = (MHandledToolItem) childME;
264
			processHandledItem(parentManager, itemModel);
265
		} else if (childME instanceof MDirectToolItem) {
266
			MDirectToolItem itemModel = (MDirectToolItem) childME;
267
			processDirectItem(parentManager, itemModel);
268
		} else if (childME instanceof MToolBarSeparator) {
269
			MToolBarSeparator itemModel = (MToolBarSeparator) childME;
270
			processSeparator(parentManager, itemModel);
271
		} else if (childME instanceof MToolControl) {
272
			MToolControl itemModel = (MToolControl) childME;
273
			processToolControl(parentManager, itemModel);
274
		}
275
	}
276
277
	/**
278
	 * @param parentManager
279
	 * @param itemModel
280
	 */
281
	private void processSeparator(ToolBarManager parentManager,
282
			MToolBarSeparator itemModel) {
283
		AbstractGroupMarker marker = null;
284
		if (itemModel.isVisible()) {
285
			marker = new Separator();
286
			marker.setId(itemModel.getElementId());
287
		} else {
288
			if (itemModel.getElementId() != null) {
289
				marker = new GroupMarker(itemModel.getElementId());
290
			}
291
		}
292
		parentManager.add(marker);
293
	}
294
295
	/**
296
	 * @param parentManager
297
	 * @param itemModel
298
	 */
299
	private void processToolControl(ToolBarManager parentManager,
300
			MToolControl itemModel) {
301
		final IEclipseContext lclContext = getContext(itemModel);
302
		ToolControlContribution ci = ContextInjectionFactory.make(
303
				ToolControlContribution.class, lclContext);
304
		ci.setModel(itemModel);
305
		parentManager.add(ci);
306
		modelToContribution.put(itemModel, ci);
307
	}
308
309
	/**
310
	 * @param parentManager
311
	 * @param itemModel
312
	 */
313
	private void processDirectItem(ToolBarManager parentManager,
314
			MDirectToolItem itemModel) {
315
		final IEclipseContext lclContext = getContext(itemModel);
316
		DirectContributionItem ci = ContextInjectionFactory.make(
317
				DirectContributionItem.class, lclContext);
318
		ci.setModel(itemModel);
319
		parentManager.add(ci);
320
		modelToContribution.put(itemModel, ci);
321
	}
322
323
	/**
324
	 * @param parentManager
325
	 * @param itemModel
326
	 */
327
	private void processHandledItem(ToolBarManager parentManager,
328
			MHandledToolItem itemModel) {
329
		final IEclipseContext lclContext = getContext(itemModel);
330
		HandledContributionItem ci = ContextInjectionFactory.make(
331
				HandledContributionItem.class, lclContext);
332
		ci.setModel(itemModel);
333
		parentManager.add(ci);
334
		modelToContribution.put(itemModel, ci);
335
	}
336
337
}
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SWTPartRenderer.java (-3 lines)
Lines 88-96 public abstract class SWTPartRenderer extends AbstractPartRenderer { Link Here
88
		// Create a bi-directional link between the widget and the model
88
		// Create a bi-directional link between the widget and the model
89
		me.setWidget(widget);
89
		me.setWidget(widget);
90
90
91
		// Remember which renderer created this widget
92
		me.setRenderer(this);
93
94
		if (widget instanceof Widget) {
91
		if (widget instanceof Widget) {
95
			((Widget) widget).setData(OWNING_ME, me);
92
			((Widget) widget).setData(OWNING_ME, me);
96
93
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolControlContribution.java (+71 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 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.e4.ui.workbench.renderers.swt;
13
14
import javax.inject.Inject;
15
import org.eclipse.e4.core.contexts.EclipseContextFactory;
16
import org.eclipse.e4.core.contexts.IEclipseContext;
17
import org.eclipse.e4.core.services.contributions.IContributionFactory;
18
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
19
import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
20
import org.eclipse.jface.action.ControlContribution;
21
import org.eclipse.swt.SWT;
22
import org.eclipse.swt.widgets.Composite;
23
import org.eclipse.swt.widgets.Control;
24
25
public class ToolControlContribution extends ControlContribution {
26
27
	private MToolControl model;
28
29
	@Inject
30
	private IContributionFactory contribFactory;
31
32
	@Inject
33
	private IEclipseContext parentContext;
34
35
	public ToolControlContribution() {
36
		super(null);
37
	}
38
39
	/*
40
	 * (non-Javadoc)
41
	 * 
42
	 * @see
43
	 * org.eclipse.jface.action.ControlContribution#createControl(org.eclipse
44
	 * .swt.widgets.Composite)
45
	 */
46
	@Override
47
	protected Control createControl(Composite parent) {
48
		IEclipseContext localContext = EclipseContextFactory.create();
49
50
		final Composite newComposite = new Composite(parent, SWT.NONE);
51
		localContext.set(Composite.class.getName(), newComposite);
52
		localContext.set(MToolControl.class.getName(), model);
53
54
		if (model.getObject() == null) {
55
			Object tcImpl = contribFactory.create(model.getContributionURI(),
56
					parentContext, localContext);
57
			model.setObject(tcImpl);
58
		}
59
60
		model.setWidget(newComposite);
61
		newComposite.setData(AbstractPartRenderer.OWNING_ME, model);
62
		newComposite.setData(this);
63
64
		return newComposite;
65
	}
66
67
	public void setModel(MToolControl c) {
68
		model = c;
69
		setId(model.getElementId());
70
	}
71
}
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java (-46 / +4 lines)
Lines 14-40 import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainer; Link Here
14
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
14
import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
15
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
15
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
16
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
16
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
17
import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
18
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
19
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
17
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
20
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
21
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
18
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
22
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenuItem;
19
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenuItem;
23
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedToolBar;
20
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedToolBar;
24
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
21
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
25
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
26
import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
27
import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
28
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
22
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
29
23
30
public class WorkbenchRendererFactory implements IRendererFactory {
24
public class WorkbenchRendererFactory implements IRendererFactory {
31
25
32
	private AreaRenderer areaRenderer;
26
	private AreaRenderer areaRenderer;
33
	private MenuRenderer menuRenderer;
27
	private NewMenuRenderer menuRenderer;
34
	private HandledMenuItemRenderer handledMenuItemRenderer;
28
	private NewToolBarRenderer toolbarRenderer;
35
	private ToolBarRenderer toolbarRenderer;
36
	private ToolItemRenderer toolItemRenderer;
37
	private SeparatorRenderer separatorRenderer;
38
	private ContributedPartRenderer contributedPartRenderer;
29
	private ContributedPartRenderer contributedPartRenderer;
39
	private ElementReferenceRenderer elementRefRenderer;
30
	private ElementReferenceRenderer elementRefRenderer;
40
	private PerspectiveStackRenderer perspStackRenderer;
31
	private PerspectiveStackRenderer perspStackRenderer;
Lines 42-52 public class WorkbenchRendererFactory implements IRendererFactory { Link Here
42
	private SashRenderer partSashRenderer;
33
	private SashRenderer partSashRenderer;
43
	private StackRenderer stackRenderer;
34
	private StackRenderer stackRenderer;
44
	private TrimBarRenderer trimBarRenderer;
35
	private TrimBarRenderer trimBarRenderer;
45
	private ToolControlRenderer toolControlRenderer;
46
	private WBWRenderer wbwRenderer;
36
	private WBWRenderer wbwRenderer;
47
37
48
	private IEclipseContext context;
38
	private IEclipseContext context;
49
	private DirectMenuItemRenderer directMenuItemRenderer;
50
	private RenderedMenuRenderer renderedMenuRenderer;
39
	private RenderedMenuRenderer renderedMenuRenderer;
51
	private RenderedMenuItemRenderer renderedMenuItemRenderer;
40
	private RenderedMenuItemRenderer renderedMenuItemRenderer;
52
	private RenderedToolBarRenderer renderedToolbarRenderer;
41
	private RenderedToolBarRenderer renderedToolbarRenderer;
Lines 64-81 public class WorkbenchRendererFactory implements IRendererFactory { Link Here
64
				initRenderer(contributedPartRenderer);
53
				initRenderer(contributedPartRenderer);
65
			}
54
			}
66
			return contributedPartRenderer;
55
			return contributedPartRenderer;
67
		} else if (uiElement instanceof MHandledMenuItem) {
68
			if (handledMenuItemRenderer == null) {
69
				handledMenuItemRenderer = new HandledMenuItemRenderer();
70
				initRenderer(handledMenuItemRenderer);
71
			}
72
			return handledMenuItemRenderer;
73
		} else if (uiElement instanceof MDirectMenuItem) {
74
			if (directMenuItemRenderer == null) {
75
				directMenuItemRenderer = new DirectMenuItemRenderer();
76
				initRenderer(directMenuItemRenderer);
77
			}
78
			return directMenuItemRenderer;
79
		} else if (uiElement instanceof MRenderedMenu) {
56
		} else if (uiElement instanceof MRenderedMenu) {
80
			if (renderedMenuRenderer == null) {
57
			if (renderedMenuRenderer == null) {
81
				renderedMenuRenderer = new RenderedMenuRenderer();
58
				renderedMenuRenderer = new RenderedMenuRenderer();
Lines 90-96 public class WorkbenchRendererFactory implements IRendererFactory { Link Here
90
			return renderedMenuItemRenderer;
67
			return renderedMenuItemRenderer;
91
		} else if (uiElement instanceof MMenu) {
68
		} else if (uiElement instanceof MMenu) {
92
			if (menuRenderer == null) {
69
			if (menuRenderer == null) {
93
				menuRenderer = new MenuRenderer();
70
				menuRenderer = new NewMenuRenderer();
94
				initRenderer(menuRenderer);
71
				initRenderer(menuRenderer);
95
			}
72
			}
96
			return menuRenderer;
73
			return menuRenderer;
Lines 102-124 public class WorkbenchRendererFactory implements IRendererFactory { Link Here
102
			return renderedToolbarRenderer;
79
			return renderedToolbarRenderer;
103
		} else if (uiElement instanceof MToolBar) {
80
		} else if (uiElement instanceof MToolBar) {
104
			if (toolbarRenderer == null) {
81
			if (toolbarRenderer == null) {
105
				toolbarRenderer = new ToolBarRenderer();
82
				toolbarRenderer = new NewToolBarRenderer();
106
				initRenderer(toolbarRenderer);
83
				initRenderer(toolbarRenderer);
107
			}
84
			}
108
			return toolbarRenderer;
85
			return toolbarRenderer;
109
		} else if (uiElement instanceof MToolItem) {
110
			if (toolItemRenderer == null) {
111
				toolItemRenderer = new ToolItemRenderer();
112
				initRenderer(toolItemRenderer);
113
			}
114
			return toolItemRenderer;
115
		} else if (uiElement instanceof MMenuSeparator
116
				|| uiElement instanceof MToolBarSeparator) {
117
			if (separatorRenderer == null) {
118
				separatorRenderer = new SeparatorRenderer();
119
				initRenderer(separatorRenderer);
120
			}
121
			return separatorRenderer;
122
		} else if (uiElement instanceof MPlaceholder) {
86
		} else if (uiElement instanceof MPlaceholder) {
123
			if (elementRefRenderer == null) {
87
			if (elementRefRenderer == null) {
124
				elementRefRenderer = new ElementReferenceRenderer();
88
				elementRefRenderer = new ElementReferenceRenderer();
Lines 155-166 public class WorkbenchRendererFactory implements IRendererFactory { Link Here
155
				initRenderer(trimBarRenderer);
119
				initRenderer(trimBarRenderer);
156
			}
120
			}
157
			return trimBarRenderer;
121
			return trimBarRenderer;
158
		} else if (uiElement instanceof MToolControl) {
159
			if (toolControlRenderer == null) {
160
				toolControlRenderer = new ToolControlRenderer();
161
				initRenderer(toolControlRenderer);
162
			}
163
			return toolControlRenderer;
164
		} else if (uiElement instanceof MWindow) {
122
		} else if (uiElement instanceof MWindow) {
165
			if (wbwRenderer == null) {
123
			if (wbwRenderer == null) {
166
				wbwRenderer = new WBWRenderer();
124
				wbwRenderer = new WBWRenderer();
(-)a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/internal/workbench/swt/PartRenderingEngine.java (-4 / +12 lines)
Lines 51-56 import org.eclipse.e4.ui.model.application.ui.MUIElement; Link Here
51
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
51
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
52
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
52
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
53
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
53
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
54
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
54
import org.eclipse.e4.ui.services.IStylingEngine;
55
import org.eclipse.e4.ui.services.IStylingEngine;
55
import org.eclipse.e4.ui.workbench.IPresentationEngine;
56
import org.eclipse.e4.ui.workbench.IPresentationEngine;
56
import org.eclipse.e4.ui.workbench.IResourceUtilities;
57
import org.eclipse.e4.ui.workbench.IResourceUtilities;
Lines 108-115 public class PartRenderingEngine implements IPresentationEngine { Link Here
108
						.eContainer();
109
						.eContainer();
109
			}
110
			}
110
111
112
			boolean menuChild = parent instanceof MMenu;
113
111
			// If the parent isn't displayed who cares?
114
			// If the parent isn't displayed who cares?
112
			if (parent == null || parent.getWidget() == null)
115
			if (parent == null || parent.getWidget() == null || menuChild)
113
				return;
116
				return;
114
117
115
			if (changedElement.isToBeRendered()) {
118
			if (changedElement.isToBeRendered()) {
Lines 162-170 public class PartRenderingEngine implements IPresentationEngine { Link Here
162
			MElementContainer<MUIElement> changedElement = (MElementContainer<MUIElement>) changedObj;
165
			MElementContainer<MUIElement> changedElement = (MElementContainer<MUIElement>) changedObj;
163
			boolean isApplication = changedObj instanceof MApplication;
166
			boolean isApplication = changedObj instanceof MApplication;
164
167
168
			boolean menuChild = changedObj instanceof MMenu;
165
			// If the parent isn't in the UI then who cares?
169
			// If the parent isn't in the UI then who cares?
166
			AbstractPartRenderer renderer = getRendererFor(changedElement);
170
			AbstractPartRenderer renderer = getRendererFor(changedElement);
167
			if (!isApplication && renderer == null)
171
			if ((!isApplication && renderer == null) || menuChild)
168
				return;
172
				return;
169
173
170
			String eventType = (String) event
174
			String eventType = (String) event
Lines 311-316 public class PartRenderingEngine implements IPresentationEngine { Link Here
311
		}
315
		}
312
316
313
		curFactory = factory;
317
		curFactory = factory;
318
		context.set(IRendererFactory.class, curFactory);
314
319
315
		// Hook up the widget life-cycle subscriber
320
		// Hook up the widget life-cycle subscriber
316
		if (eventBroker != null) {
321
		if (eventBroker != null) {
Lines 423-430 public class PartRenderingEngine implements IPresentationEngine { Link Here
423
		Object newWidget = createWidget(element, parentWidget);
428
		Object newWidget = createWidget(element, parentWidget);
424
429
425
		// Remember that we've created the control
430
		// Remember that we've created the control
426
		if (newWidget != null) {
431
		AbstractPartRenderer renderer = getRendererFor(element);
427
			AbstractPartRenderer renderer = getRendererFor(element);
432
		if (renderer != null) {
433
			// AbstractPartRenderer renderer = getRendererFor(element);
428
434
429
			// Have the renderer hook up any widget specific listeners
435
			// Have the renderer hook up any widget specific listeners
430
			renderer.hookControllerLogic(element);
436
			renderer.hookControllerLogic(element);
Lines 578-583 public class PartRenderingEngine implements IPresentationEngine { Link Here
578
	protected Object createWidget(MUIElement element, Object parent) {
584
	protected Object createWidget(MUIElement element, Object parent) {
579
		AbstractPartRenderer renderer = getRenderer(element, parent);
585
		AbstractPartRenderer renderer = getRenderer(element, parent);
580
		if (renderer != null) {
586
		if (renderer != null) {
587
			// Remember which renderer is responsible for this widget
588
			element.setRenderer(renderer);
581
			Object newWidget = renderer.createWidget(element, parent);
589
			Object newWidget = renderer.createWidget(element, parent);
582
			if (newWidget != null) {
590
			if (newWidget != null) {
583
				renderer.bindWidget(element, newWidget);
591
				renderer.bindWidget(element, newWidget);
(-)a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/workbench/swt/modeling/MenuService.java (-14 / +33 lines)
Lines 13-25 package org.eclipse.e4.ui.workbench.swt.modeling; Link Here
13
import javax.inject.Inject;
13
import javax.inject.Inject;
14
import org.eclipse.e4.core.contexts.IEclipseContext;
14
import org.eclipse.e4.core.contexts.IEclipseContext;
15
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
15
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
16
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
17
import org.eclipse.e4.ui.model.application.ui.MUIElement;
16
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
18
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
17
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
19
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
18
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu;
20
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu;
19
import org.eclipse.swt.SWT;
21
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
20
import org.eclipse.swt.widgets.Control;
22
import org.eclipse.swt.widgets.Control;
21
import org.eclipse.swt.widgets.Event;
22
import org.eclipse.swt.widgets.Listener;
23
import org.eclipse.swt.widgets.Menu;
23
import org.eclipse.swt.widgets.Menu;
24
24
25
public class MenuService implements EMenuService {
25
public class MenuService implements EMenuService {
Lines 49-68 public class MenuService implements EMenuService { Link Here
49
		if (mmenu.getWidget() != null) {
49
		if (mmenu.getWidget() != null) {
50
			return false;
50
			return false;
51
		}
51
		}
52
		Menu menu = new Menu(parentControl);
52
		// we need to delegate to the renderer so that it "processes" the
53
		parentControl.setMenu(menu);
53
		// MenuManager correctly
54
		mmenu.setWidget(menu);
54
		IRendererFactory rendererFactory = myPart.getContext().get(
55
		menu.setData(AbstractPartRenderer.OWNING_ME, mmenu);
55
				IRendererFactory.class);
56
		AbstractPartRenderer renderer = rendererFactory.getRenderer(mmenu,
57
				parentControl);
56
		IEclipseContext popupContext = myPart.getContext().createChild(
58
		IEclipseContext popupContext = myPart.getContext().createChild(
57
				"popup:" + mmenu.getElementId());
59
				"popup:" + mmenu.getElementId());
58
		mmenu.setContext(popupContext);
60
		mmenu.setContext(popupContext);
59
		menu.addListener(SWT.Dispose, new Listener() {
61
		Object widget = renderer.createWidget(mmenu, parentControl);
60
			public void handleEvent(Event event) {
62
		if (!(widget instanceof Menu)) {
61
				mmenu.getContext().dispose();
63
			return false;
62
				mmenu.setContext(null);
64
		}
63
				mmenu.setWidget(null);
65
		renderer.bindWidget(mmenu, widget);
64
			}
66
		renderer.hookControllerLogic(mmenu);
65
		});
67
68
		// Process its internal structure through the renderer that created
69
		// it
70
		Object castObject = mmenu;
71
		renderer.processContents((MElementContainer<MUIElement>) castObject);
72
73
		// Allow a final chance to set up
74
		renderer.postProcess(mmenu);
75
76
		// Now that we have a widget let the parent (if any) know
77
		if (mmenu.getParent() instanceof MUIElement) {
78
			MElementContainer<MUIElement> parentElement = mmenu.getParent();
79
			AbstractPartRenderer parentRenderer = rendererFactory.getRenderer(
80
					parentElement, null);
81
			if (parentRenderer != null)
82
				parentRenderer.childRendered(parentElement, mmenu);
83
		}
84
66
		return true;
85
		return true;
67
	}
86
	}
68
}
87
}
(-)a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/workbench/swt/modeling/MenuServiceFilter.java (-203 / +20 lines)
Lines 10-48 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.e4.ui.workbench.swt.modeling;
11
package org.eclipse.e4.ui.workbench.swt.modeling;
12
12
13
import java.lang.reflect.InvocationTargetException;
14
import java.lang.reflect.Method;
13
import java.lang.reflect.Method;
15
import java.util.ArrayList;
16
import java.util.HashMap;
14
import java.util.HashMap;
17
import java.util.List;
18
import javax.inject.Inject;
15
import javax.inject.Inject;
19
import org.eclipse.core.commands.ParameterizedCommand;
20
import org.eclipse.core.runtime.ISafeRunnable;
16
import org.eclipse.core.runtime.ISafeRunnable;
21
import org.eclipse.core.runtime.SafeRunner;
17
import org.eclipse.core.runtime.SafeRunner;
22
import org.eclipse.e4.core.commands.EHandlerService;
23
import org.eclipse.e4.core.contexts.IContextConstants;
24
import org.eclipse.e4.core.contexts.IEclipseContext;
25
import org.eclipse.e4.core.services.log.Logger;
18
import org.eclipse.e4.core.services.log.Logger;
26
import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer;
27
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
19
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
28
import org.eclipse.e4.ui.internal.workbench.swt.Policy;
20
import org.eclipse.e4.ui.internal.workbench.swt.Policy;
29
import org.eclipse.e4.ui.internal.workbench.swt.WorkbenchSWTActivator;
21
import org.eclipse.e4.ui.internal.workbench.swt.WorkbenchSWTActivator;
30
import org.eclipse.e4.ui.model.application.MApplication;
22
import org.eclipse.e4.ui.model.application.MApplication;
31
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
32
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
23
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
33
import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
34
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
35
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu;
24
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu;
36
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
37
import org.eclipse.e4.ui.workbench.IPresentationEngine;
25
import org.eclipse.e4.ui.workbench.IPresentationEngine;
38
import org.eclipse.e4.ui.workbench.modeling.EModelService;
26
import org.eclipse.e4.ui.workbench.modeling.EModelService;
39
import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
40
import org.eclipse.jface.action.MenuManager;
27
import org.eclipse.jface.action.MenuManager;
41
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.SWT;
42
import org.eclipse.swt.widgets.Event;
29
import org.eclipse.swt.widgets.Event;
43
import org.eclipse.swt.widgets.Listener;
30
import org.eclipse.swt.widgets.Listener;
44
import org.eclipse.swt.widgets.Menu;
31
import org.eclipse.swt.widgets.Menu;
45
import org.eclipse.swt.widgets.MenuItem;
46
import org.eclipse.swt.widgets.Widget;
32
import org.eclipse.swt.widgets.Widget;
47
33
48
public class MenuServiceFilter implements Listener {
34
public class MenuServiceFilter implements Listener {
Lines 123-131 public class MenuServiceFilter implements Listener { Link Here
123
		if (obj == null && menu.getParentItem() != null) {
109
		if (obj == null && menu.getParentItem() != null) {
124
			obj = menu.getParentItem().getData(AbstractPartRenderer.OWNING_ME);
110
			obj = menu.getParentItem().getData(AbstractPartRenderer.OWNING_ME);
125
		}
111
		}
126
		if (obj instanceof MRenderedMenu) {
112
		if (obj instanceof MPopupMenu) {
127
			handlerRenderedMenu(event, menu, (MRenderedMenu) obj);
128
		} else if (obj instanceof MPopupMenu) {
129
			handleContextMenu(event, menu, (MPopupMenu) obj);
113
			handleContextMenu(event, menu, (MPopupMenu) obj);
130
		} else if (obj instanceof MMenu) {
114
		} else if (obj instanceof MMenu) {
131
			handleMenu(event, menu, (MMenu) obj);
115
			handleMenu(event, menu, (MMenu) obj);
Lines 140-151 public class MenuServiceFilter implements Listener { Link Here
140
		}
124
		}
141
		switch (event.type) {
125
		switch (event.type) {
142
		case SWT.Show:
126
		case SWT.Show:
143
			trace("handleMenu.Show", menu, menuModel);
144
			cleanUp(menu);
127
			cleanUp(menu);
145
			showMenu(event, menu, menuModel);
128
			showMenu(event, menu, menuModel);
146
			break;
129
			break;
147
		case SWT.Hide:
130
		case SWT.Hide:
148
			trace("handleMenu.Hide", menu, menuModel);
149
			// TODO we'll clean up on show
131
			// TODO we'll clean up on show
150
			break;
132
			break;
151
		}
133
		}
Lines 153-367 public class MenuServiceFilter implements Listener { Link Here
153
135
154
	public void showMenu(final Event event, final Menu menu,
136
	public void showMenu(final Event event, final Menu menu,
155
			final MMenu menuModel) {
137
			final MMenu menuModel) {
156
		final IEclipseContext parentContext = modelService
138
		System.err.println("showMenu: " + menuModel + "\n\t" + menu);
157
				.getContainingContext(menuModel);
158
159
		final ArrayList<MMenuContribution> toContribute = new ArrayList<MMenuContribution>();
160
		final ArrayList<MMenuElement> menuContributionsToRemove = new ArrayList<MMenuElement>();
161
		ExpressionContext eContext = new ExpressionContext(parentContext);
162
		ContributionsAnalyzer.gatherMenuContributions(menuModel,
163
				application.getMenuContributions(), menuModel.getElementId(),
164
				toContribute, eContext, false);
165
		if (menu.getItemCount() == 1) {
166
			MenuItem item = menu.getItem(0);
167
			if (NUL_MENU_ITEM.equals(item.getText())) {
168
				item.dispose();
169
			}
170
		}
171
		ContributionsAnalyzer.addMenuContributions(menuModel, toContribute,
172
				menuContributionsToRemove);
173
174
		// create a cleanup routine for the Hide or next Show
175
		pendingCleanup.put(menu, new Runnable() {
176
			public void run() {
177
				if (!menu.isDisposed()) {
178
					unrender(menuContributionsToRemove);
179
				}
180
				removeMenuContributions(menuModel, menuContributionsToRemove);
181
			}
182
		});
183
		render(menu, menuModel);
184
		if (menu.getItemCount() == 0) {
185
			MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
186
			menuItem.setText(NUL_MENU_ITEM);
187
			menuItem.setEnabled(false);
188
		}
189
	}
139
	}
190
140
191
	private void handleContextMenu(final Event event, final Menu menu,
141
	private void handleContextMenu(final Event event, final Menu menu,
192
			final MPopupMenu menuModel) {
142
			final MPopupMenu menuModel) {
193
		switch (event.type) {
143
		switch (event.type) {
194
		case SWT.Show:
144
		case SWT.Show:
195
			trace("handleContextMenu.Show", menu, menuModel);
196
			cleanUp(menu);
145
			cleanUp(menu);
197
			showPopup(event, menu, menuModel);
146
			showPopup(event, menu, menuModel);
198
			break;
147
			break;
199
		case SWT.Hide:
148
		case SWT.Hide:
200
			trace("handleContextMenu.Hide", menu, menuModel);
201
			hidePopup(event, menu, menuModel);
149
			hidePopup(event, menu, menuModel);
202
			break;
150
			break;
203
		}
151
		}
204
	}
152
	}
205
153
206
	public void hidePopup(Event event, Menu menu, MPopupMenu menuModel) {
154
	public void hidePopup(Event event, Menu menu, MPopupMenu menuModel) {
207
		final IEclipseContext popupContext = menuModel.getContext();
155
		System.err.println("hidePopup: " + menuModel + "\n\t" + menu);
208
		final IEclipseContext parentContext = popupContext.getParent();
156
209
		final IEclipseContext originalChild = (IEclipseContext) popupContext
157
		// final IEclipseContext popupContext = menuModel.getContext();
210
				.get(TMP_ORIGINAL_CONTEXT);
158
		// final IEclipseContext parentContext = popupContext.getParent();
211
		popupContext.remove(TMP_ORIGINAL_CONTEXT);
159
		// final IEclipseContext originalChild = (IEclipseContext) popupContext
212
		if (!menu.isDisposed()) {
160
		// .get(TMP_ORIGINAL_CONTEXT);
213
			menu.getDisplay().asyncExec(new Runnable() {
161
		// popupContext.remove(TMP_ORIGINAL_CONTEXT);
214
				public void run() {
162
		// if (!menu.isDisposed()) {
215
					parentContext.set(IContextConstants.ACTIVE_CHILD,
163
		// menu.getDisplay().asyncExec(new Runnable() {
216
							originalChild);
164
		// public void run() {
217
				}
165
		// parentContext.set(IContextConstants.ACTIVE_CHILD,
218
			});
166
		// originalChild);
219
		}
167
		// }
168
		// });
169
		// }
220
	}
170
	}
221
171
222
	public void showPopup(final Event event, final Menu menu,
172
	public void showPopup(final Event event, final Menu menu,
223
			final MPopupMenu menuModel) {
173
			final MPopupMenu menuModel) {
224
		final IEclipseContext popupContext = menuModel.getContext();
174
		System.err.println("showPopup: " + menuModel + "\n\t" + menu);
225
		final IEclipseContext parentContext = popupContext.getParent();
226
		final IEclipseContext originalChild = (IEclipseContext) parentContext
227
				.getLocal(IContextConstants.ACTIVE_CHILD);
228
		parentContext.set(IContextConstants.ACTIVE_CHILD, popupContext);
229
		popupContext.set(TMP_ORIGINAL_CONTEXT, originalChild);
230
231
		final ArrayList<MMenuContribution> toContribute = new ArrayList<MMenuContribution>();
232
		final ArrayList<MMenuElement> menuContributionsToRemove = new ArrayList<MMenuElement>();
233
		ExpressionContext eContext = new ExpressionContext(popupContext);
234
		ContributionsAnalyzer.gatherMenuContributions(menuModel,
235
				application.getMenuContributions(), menuModel.getElementId(),
236
				toContribute, eContext, true);
237
238
		for (String tag : menuModel.getTags()) {
239
			if (tag.startsWith("popup:") && tag.length() > 6) {
240
				ContributionsAnalyzer.gatherMenuContributions(menuModel,
241
						application.getMenuContributions(), tag.substring(6),
242
						toContribute, eContext, false);
243
			}
244
		}
245
		ContributionsAnalyzer.addMenuContributions(menuModel, toContribute,
246
				menuContributionsToRemove);
247
248
		// create a cleanup routine for the Hide or next Show
249
		pendingCleanup.put(menu, new Runnable() {
250
			public void run() {
251
				if (!menu.isDisposed()) {
252
					unrender(menuContributionsToRemove);
253
				}
254
				removeMenuContributions(menuModel, menuContributionsToRemove);
255
			}
256
		});
257
		render(menu, menuModel);
258
	}
259
260
	private void render(final Menu menu, final MMenu menuModel) {
261
		trace("render", menu, menuModel);
262
		for (MMenuElement element : menuModel.getChildren()) {
263
			renderer.createGui(element, menu, null);
264
			if (element instanceof MHandledMenuItem) {
265
				setEnabled((MHandledMenuItem) element);
266
			}
267
		}
268
	}
269
270
	private void setEnabled(MHandledMenuItem item) {
271
		if (!item.isToBeRendered() || !item.isVisible()
272
				|| item.getWidget() == null) {
273
			return;
274
		}
275
		ParameterizedCommand cmd = item.getWbCommand();
276
		if (cmd == null) {
277
			return;
278
		}
279
		final IEclipseContext lclContext = modelService
280
				.getContainingContext(item);
281
		EHandlerService service = lclContext.get(EHandlerService.class);
282
		item.setEnabled(service.canExecute(cmd));
283
	}
284
285
	private void unrender(final List<MMenuElement> menuModel) {
286
		trace("unrender", null, null);
287
		for (MMenuElement element : menuModel) {
288
			renderer.removeGui(element);
289
		}
290
	}
291
292
	private void removeMenuContributions(final MMenu menuModel,
293
			final ArrayList<MMenuElement> menuContributionsToRemove) {
294
		for (MMenuElement item : menuContributionsToRemove) {
295
			trace("removeMenuContributions " + item,
296
					(Widget) menuModel.getWidget(), menuModel);
297
			menuModel.getChildren().remove(item);
298
		}
299
	}
300
301
	private void handlerRenderedMenu(final Event event, final Menu menu,
302
			final MRenderedMenu menuModel) {
303
		// Do nothing here for the moment, except process any cleanups
304
		switch (event.type) {
305
		case SWT.Show:
306
			trace("handlerRenderedMenu.Show", menu, menuModel);
307
			cleanUp(menu);
308
			showRenderedMenu(event, menu, menuModel);
309
			break;
310
		case SWT.Hide:
311
			trace("handlerRenderedMenu.Hide", menu, menuModel);
312
			// TODO don't care
313
			break;
314
		}
315
	}
316
317
	public void showRenderedMenu(final Event event, final Menu menu,
318
			final MRenderedMenu menuModel) {
319
		if (!(menuModel.getContributionManager() instanceof MenuManager)) {
320
			return;
321
		}
322
323
		MenuManager manager = (MenuManager) menuModel.getContributionManager();
324
		Method handleAboutToShow = getAboutToShow();
325
		try {
326
			handleAboutToShow.invoke(manager);
327
		} catch (IllegalArgumentException e) {
328
			// TODO Auto-generated catch block
329
			e.printStackTrace();
330
		} catch (IllegalAccessException e) {
331
			// TODO Auto-generated catch block
332
			e.printStackTrace();
333
		} catch (InvocationTargetException e) {
334
			// TODO Auto-generated catch block
335
			e.printStackTrace();
336
		}
337
338
		if (menuModel.getChildren().size() == 1
339
				&& menuModel.getChildren().get(0) instanceof MPopupMenu) {
340
			showPopup(event, menu, (MPopupMenu) menuModel.getChildren().get(0));
341
		} else {
342
			showMenu(event, menu, menuModel);
343
		}
344
		event.type = SWT.None;
345
		event.doit = false;
346
	}
175
	}
347
176
348
	public void cleanUp(final Menu menu) {
177
	public void cleanUp(final Menu menu) {
349
		trace("cleanUp", menu, null);
178
		System.err.println("cleanUp: " + menu);
350
		if (pendingCleanup.isEmpty()) {
351
			return;
352
		}
353
		Runnable cleanUp = pendingCleanup.remove(menu);
354
		if (cleanUp != null) {
355
			trace("cleanUp.run()", menu, null);
356
			cleanUp.run();
357
		}
358
	}
179
	}
359
180
360
	public void dispose() {
181
	public void dispose() {
361
		Menu[] keys = pendingCleanup.keySet().toArray(
182
		System.err.println("dispose");
362
				new Menu[pendingCleanup.size()]);
363
		for (Menu menu : keys) {
364
			cleanUp(menu);
365
		}
366
	}
183
	}
367
}
184
}
(-)a/bundles/org.eclipse.e4.ui.workbench.swt/src/org/eclipse/e4/ui/workbench/swt/modeling/OldMenuServiceFilter.java (+367 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2010 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
package org.eclipse.e4.ui.workbench.swt.modeling;
12
13
import java.lang.reflect.InvocationTargetException;
14
import java.lang.reflect.Method;
15
import java.util.ArrayList;
16
import java.util.HashMap;
17
import java.util.List;
18
import javax.inject.Inject;
19
import org.eclipse.core.commands.ParameterizedCommand;
20
import org.eclipse.core.runtime.ISafeRunnable;
21
import org.eclipse.core.runtime.SafeRunner;
22
import org.eclipse.e4.core.commands.EHandlerService;
23
import org.eclipse.e4.core.contexts.IContextConstants;
24
import org.eclipse.e4.core.contexts.IEclipseContext;
25
import org.eclipse.e4.core.services.log.Logger;
26
import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer;
27
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
28
import org.eclipse.e4.ui.internal.workbench.swt.Policy;
29
import org.eclipse.e4.ui.internal.workbench.swt.WorkbenchSWTActivator;
30
import org.eclipse.e4.ui.model.application.MApplication;
31
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
32
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
33
import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
34
import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
35
import org.eclipse.e4.ui.model.application.ui.menu.MPopupMenu;
36
import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
37
import org.eclipse.e4.ui.workbench.IPresentationEngine;
38
import org.eclipse.e4.ui.workbench.modeling.EModelService;
39
import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
40
import org.eclipse.jface.action.MenuManager;
41
import org.eclipse.swt.SWT;
42
import org.eclipse.swt.widgets.Event;
43
import org.eclipse.swt.widgets.Listener;
44
import org.eclipse.swt.widgets.Menu;
45
import org.eclipse.swt.widgets.MenuItem;
46
import org.eclipse.swt.widgets.Widget;
47
48
public class OldMenuServiceFilter implements Listener {
49
	public static final String NUL_MENU_ITEM = "(None Applicable)"; //$NON-NLS-1$
50
51
	private static final String TMP_ORIGINAL_CONTEXT = "MenuServiceFilter.original.context";
52
53
	private static void trace(String msg, Widget menu, MMenu menuModel) {
54
		WorkbenchSWTActivator.trace(Policy.MENUS, msg + ": " + menu + ": "
55
				+ menuModel, null);
56
	}
57
58
	private static Method aboutToShow;
59
60
	public static Method getAboutToShow() {
61
		if (aboutToShow == null) {
62
			try {
63
				aboutToShow = MenuManager.class
64
						.getDeclaredMethod("handleAboutToShow");
65
				aboutToShow.setAccessible(true);
66
			} catch (SecurityException e) {
67
				// TODO Auto-generated catch block
68
				e.printStackTrace();
69
			} catch (NoSuchMethodException e) {
70
				// TODO Auto-generated catch block
71
				e.printStackTrace();
72
			}
73
		}
74
		return aboutToShow;
75
	}
76
77
	@Inject
78
	private MApplication application;
79
80
	@Inject
81
	private IPresentationEngine renderer;
82
83
	@Inject
84
	private Logger logger;
85
86
	@Inject
87
	EModelService modelService;
88
89
	private HashMap<Menu, Runnable> pendingCleanup = new HashMap<Menu, Runnable>();
90
91
	public void handleEvent(final Event event) {
92
		// wrap the handling in a SafeRunner so that exceptions do not prevent
93
		// the menu from being shown
94
		SafeRunner.run(new ISafeRunnable() {
95
			public void handleException(Throwable e) {
96
				if (e instanceof Error) {
97
					// errors are deadly, we shouldn't ignore these
98
					throw (Error) e;
99
				} else {
100
					// log exceptions otherwise
101
					if (logger != null) {
102
						logger.error(e);
103
					}
104
				}
105
			}
106
107
			public void run() throws Exception {
108
				safeHandleEvent(event);
109
			}
110
		});
111
	}
112
113
	private void safeHandleEvent(Event event) {
114
		if (!(event.widget instanceof Menu)) {
115
			return;
116
		}
117
		final Menu menu = (Menu) event.widget;
118
		if (event.type == SWT.Dispose) {
119
			trace("handleMenu.Dispose", menu, null);
120
			cleanUp(menu);
121
		}
122
		Object obj = menu.getData(AbstractPartRenderer.OWNING_ME);
123
		if (obj == null && menu.getParentItem() != null) {
124
			obj = menu.getParentItem().getData(AbstractPartRenderer.OWNING_ME);
125
		}
126
		if (obj instanceof MRenderedMenu) {
127
			handlerRenderedMenu(event, menu, (MRenderedMenu) obj);
128
		} else if (obj instanceof MPopupMenu) {
129
			handleContextMenu(event, menu, (MPopupMenu) obj);
130
		} else if (obj instanceof MMenu) {
131
			handleMenu(event, menu, (MMenu) obj);
132
		}
133
	}
134
135
	private void handleMenu(final Event event, final Menu menu,
136
			final MMenu menuModel) {
137
		if ((menu.getStyle() & SWT.BAR) != 0) {
138
			// don't process the menu bar, it's not fair :-)
139
			return;
140
		}
141
		switch (event.type) {
142
		case SWT.Show:
143
			trace("handleMenu.Show", menu, menuModel);
144
			cleanUp(menu);
145
			showMenu(event, menu, menuModel);
146
			break;
147
		case SWT.Hide:
148
			trace("handleMenu.Hide", menu, menuModel);
149
			// TODO we'll clean up on show
150
			break;
151
		}
152
	}
153
154
	public void showMenu(final Event event, final Menu menu,
155
			final MMenu menuModel) {
156
		final IEclipseContext parentContext = modelService
157
				.getContainingContext(menuModel);
158
159
		final ArrayList<MMenuContribution> toContribute = new ArrayList<MMenuContribution>();
160
		final ArrayList<MMenuElement> menuContributionsToRemove = new ArrayList<MMenuElement>();
161
		ExpressionContext eContext = new ExpressionContext(parentContext);
162
		ContributionsAnalyzer.gatherMenuContributions(menuModel,
163
				application.getMenuContributions(), menuModel.getElementId(),
164
				toContribute, eContext, false);
165
		if (menu.getItemCount() == 1) {
166
			MenuItem item = menu.getItem(0);
167
			if (NUL_MENU_ITEM.equals(item.getText())) {
168
				item.dispose();
169
			}
170
		}
171
		ContributionsAnalyzer.addMenuContributions(menuModel, toContribute,
172
				menuContributionsToRemove);
173
174
		// create a cleanup routine for the Hide or next Show
175
		pendingCleanup.put(menu, new Runnable() {
176
			public void run() {
177
				if (!menu.isDisposed()) {
178
					unrender(menuContributionsToRemove);
179
				}
180
				removeMenuContributions(menuModel, menuContributionsToRemove);
181
			}
182
		});
183
		render(menu, menuModel);
184
		if (menu.getItemCount() == 0) {
185
			MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
186
			menuItem.setText(NUL_MENU_ITEM);
187
			menuItem.setEnabled(false);
188
		}
189
	}
190
191
	private void handleContextMenu(final Event event, final Menu menu,
192
			final MPopupMenu menuModel) {
193
		switch (event.type) {
194
		case SWT.Show:
195
			trace("handleContextMenu.Show", menu, menuModel);
196
			cleanUp(menu);
197
			showPopup(event, menu, menuModel);
198
			break;
199
		case SWT.Hide:
200
			trace("handleContextMenu.Hide", menu, menuModel);
201
			hidePopup(event, menu, menuModel);
202
			break;
203
		}
204
	}
205
206
	public void hidePopup(Event event, Menu menu, MPopupMenu menuModel) {
207
		final IEclipseContext popupContext = menuModel.getContext();
208
		final IEclipseContext parentContext = popupContext.getParent();
209
		final IEclipseContext originalChild = (IEclipseContext) popupContext
210
				.get(TMP_ORIGINAL_CONTEXT);
211
		popupContext.remove(TMP_ORIGINAL_CONTEXT);
212
		if (!menu.isDisposed()) {
213
			menu.getDisplay().asyncExec(new Runnable() {
214
				public void run() {
215
					parentContext.set(IContextConstants.ACTIVE_CHILD,
216
							originalChild);
217
				}
218
			});
219
		}
220
	}
221
222
	public void showPopup(final Event event, final Menu menu,
223
			final MPopupMenu menuModel) {
224
		final IEclipseContext popupContext = menuModel.getContext();
225
		final IEclipseContext parentContext = popupContext.getParent();
226
		final IEclipseContext originalChild = (IEclipseContext) parentContext
227
				.getLocal(IContextConstants.ACTIVE_CHILD);
228
		parentContext.set(IContextConstants.ACTIVE_CHILD, popupContext);
229
		popupContext.set(TMP_ORIGINAL_CONTEXT, originalChild);
230
231
		final ArrayList<MMenuContribution> toContribute = new ArrayList<MMenuContribution>();
232
		final ArrayList<MMenuElement> menuContributionsToRemove = new ArrayList<MMenuElement>();
233
		ExpressionContext eContext = new ExpressionContext(popupContext);
234
		ContributionsAnalyzer.gatherMenuContributions(menuModel,
235
				application.getMenuContributions(), menuModel.getElementId(),
236
				toContribute, eContext, true);
237
238
		for (String tag : menuModel.getTags()) {
239
			if (tag.startsWith("popup:") && tag.length() > 6) {
240
				ContributionsAnalyzer.gatherMenuContributions(menuModel,
241
						application.getMenuContributions(), tag.substring(6),
242
						toContribute, eContext, false);
243
			}
244
		}
245
		ContributionsAnalyzer.addMenuContributions(menuModel, toContribute,
246
				menuContributionsToRemove);
247
248
		// create a cleanup routine for the Hide or next Show
249
		pendingCleanup.put(menu, new Runnable() {
250
			public void run() {
251
				if (!menu.isDisposed()) {
252
					unrender(menuContributionsToRemove);
253
				}
254
				removeMenuContributions(menuModel, menuContributionsToRemove);
255
			}
256
		});
257
		render(menu, menuModel);
258
	}
259
260
	private void render(final Menu menu, final MMenu menuModel) {
261
		trace("render", menu, menuModel);
262
		for (MMenuElement element : menuModel.getChildren()) {
263
			renderer.createGui(element, menu, null);
264
			if (element instanceof MHandledMenuItem) {
265
				setEnabled((MHandledMenuItem) element);
266
			}
267
		}
268
	}
269
270
	private void setEnabled(MHandledMenuItem item) {
271
		if (!item.isToBeRendered() || !item.isVisible()
272
				|| item.getWidget() == null) {
273
			return;
274
		}
275
		ParameterizedCommand cmd = item.getWbCommand();
276
		if (cmd == null) {
277
			return;
278
		}
279
		final IEclipseContext lclContext = modelService
280
				.getContainingContext(item);
281
		EHandlerService service = lclContext.get(EHandlerService.class);
282
		item.setEnabled(service.canExecute(cmd));
283
	}
284
285
	private void unrender(final List<MMenuElement> menuModel) {
286
		trace("unrender", null, null);
287
		for (MMenuElement element : menuModel) {
288
			renderer.removeGui(element);
289
		}
290
	}
291
292
	private void removeMenuContributions(final MMenu menuModel,
293
			final ArrayList<MMenuElement> menuContributionsToRemove) {
294
		for (MMenuElement item : menuContributionsToRemove) {
295
			trace("removeMenuContributions " + item,
296
					(Widget) menuModel.getWidget(), menuModel);
297
			menuModel.getChildren().remove(item);
298
		}
299
	}
300
301
	private void handlerRenderedMenu(final Event event, final Menu menu,
302
			final MRenderedMenu menuModel) {
303
		// Do nothing here for the moment, except process any cleanups
304
		switch (event.type) {
305
		case SWT.Show:
306
			trace("handlerRenderedMenu.Show", menu, menuModel);
307
			cleanUp(menu);
308
			showRenderedMenu(event, menu, menuModel);
309
			break;
310
		case SWT.Hide:
311
			trace("handlerRenderedMenu.Hide", menu, menuModel);
312
			// TODO don't care
313
			break;
314
		}
315
	}
316
317
	public void showRenderedMenu(final Event event, final Menu menu,
318
			final MRenderedMenu menuModel) {
319
		if (!(menuModel.getContributionManager() instanceof MenuManager)) {
320
			return;
321
		}
322
323
		MenuManager manager = (MenuManager) menuModel.getContributionManager();
324
		Method handleAboutToShow = getAboutToShow();
325
		try {
326
			handleAboutToShow.invoke(manager);
327
		} catch (IllegalArgumentException e) {
328
			// TODO Auto-generated catch block
329
			e.printStackTrace();
330
		} catch (IllegalAccessException e) {
331
			// TODO Auto-generated catch block
332
			e.printStackTrace();
333
		} catch (InvocationTargetException e) {
334
			// TODO Auto-generated catch block
335
			e.printStackTrace();
336
		}
337
338
		if (menuModel.getChildren().size() == 1
339
				&& menuModel.getChildren().get(0) instanceof MPopupMenu) {
340
			showPopup(event, menu, (MPopupMenu) menuModel.getChildren().get(0));
341
		} else {
342
			showMenu(event, menu, menuModel);
343
		}
344
		event.type = SWT.None;
345
		event.doit = false;
346
	}
347
348
	public void cleanUp(final Menu menu) {
349
		trace("cleanUp", menu, null);
350
		if (pendingCleanup.isEmpty()) {
351
			return;
352
		}
353
		Runnable cleanUp = pendingCleanup.remove(menu);
354
		if (cleanUp != null) {
355
			trace("cleanUp.run()", menu, null);
356
			cleanUp.run();
357
		}
358
	}
359
360
	public void dispose() {
361
		Menu[] keys = pendingCleanup.keySet().toArray(
362
				new Menu[pendingCleanup.size()]);
363
		for (Menu menu : keys) {
364
			cleanUp(menu);
365
		}
366
	}
367
}
(-)a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ContributionsAnalyzer.java (+20 lines)
Lines 87-92 public final class ContributionsAnalyzer { Link Here
87
		return false;
87
		return false;
88
	}
88
	}
89
89
90
	public static void XXXgatherMenuContributions(final MMenu menuModel,
91
			final List<MMenuContribution> menuContributionList, final String id,
92
			final ArrayList<MMenuContribution> toContribute, final ExpressionContext eContext,
93
			boolean includePopups) {
94
		for (MMenuContribution menuContribution : menuContributionList) {
95
			String parentID = menuContribution.getParentId();
96
			if (parentID == null) {
97
				// it doesn't make sense for this to be null, temporary workaround for bug 320790
98
				continue;
99
			}
100
			boolean popup = parentID.equals(POPUP_PARENT_ID) && (menuModel instanceof MPopupMenu)
101
					&& includePopups;
102
			boolean filtered = isFiltered(menuModel, menuContribution);
103
			if (filtered || (!popup && !parentID.equals(id)) || !menuContribution.isToBeRendered()) {
104
				continue;
105
			}
106
			toContribute.add(menuContribution);
107
		}
108
	}
109
90
	public static void gatherMenuContributions(final MMenu menuModel,
110
	public static void gatherMenuContributions(final MMenu menuModel,
91
			final List<MMenuContribution> menuContributionList, final String id,
111
			final List<MMenuContribution> menuContributionList, final String id,
92
			final ArrayList<MMenuContribution> toContribute, final ExpressionContext eContext,
112
			final ArrayList<MMenuContribution> toContribute, final ExpressionContext eContext,
(-)a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/MMenuItemTest.java (+13 lines)
Lines 28-36 import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem; Link Here
28
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
28
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
29
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
29
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
30
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
30
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
31
import org.eclipse.jface.action.MenuManager;
31
import org.eclipse.swt.SWT;
32
import org.eclipse.swt.SWT;
32
import org.eclipse.swt.widgets.Event;
33
import org.eclipse.swt.widgets.Event;
34
import org.eclipse.swt.widgets.Menu;
33
import org.eclipse.swt.widgets.MenuItem;
35
import org.eclipse.swt.widgets.MenuItem;
36
import org.eclipse.swt.widgets.Widget;
34
37
35
public class MMenuItemTest extends TestCase {
38
public class MMenuItemTest extends TestCase {
36
	protected IEclipseContext appContext;
39
	protected IEclipseContext appContext;
Lines 74-79 public class MMenuItemTest extends TestCase { Link Here
74
		wb = new E4Workbench(window, appContext);
77
		wb = new E4Workbench(window, appContext);
75
		wb.createAndRunUI(window);
78
		wb.createAndRunUI(window);
76
79
80
		((MenuManager) ((Widget) menu.getWidget()).getData()).updateAll(true);
81
77
		Object widget = menuItem.getWidget();
82
		Object widget = menuItem.getWidget();
78
		assertNotNull(widget);
83
		assertNotNull(widget);
79
		assertTrue(widget instanceof MenuItem);
84
		assertTrue(widget instanceof MenuItem);
Lines 149-154 public class MMenuItemTest extends TestCase { Link Here
149
		wb = new E4Workbench(window, appContext);
154
		wb = new E4Workbench(window, appContext);
150
		wb.createAndRunUI(window);
155
		wb.createAndRunUI(window);
151
156
157
		((MenuManager) ((Widget) menu.getWidget()).getData()).updateAll(true);
158
152
		Object widget1 = menuItem1.getWidget();
159
		Object widget1 = menuItem1.getWidget();
153
		assertNotNull(widget1);
160
		assertNotNull(widget1);
154
		assertTrue(widget1 instanceof MenuItem);
161
		assertTrue(widget1 instanceof MenuItem);
Lines 204-209 public class MMenuItemTest extends TestCase { Link Here
204
		wb = new E4Workbench(window, appContext);
211
		wb = new E4Workbench(window, appContext);
205
		wb.createAndRunUI(window);
212
		wb.createAndRunUI(window);
206
213
214
		((MenuManager) ((Widget) menu.getWidget()).getData()).updateAll(true);
215
207
		Object widget1 = menuItem.getWidget();
216
		Object widget1 = menuItem.getWidget();
208
		assertNotNull(widget1);
217
		assertNotNull(widget1);
209
		assertTrue(widget1 instanceof MenuItem);
218
		assertTrue(widget1 instanceof MenuItem);
Lines 237-242 public class MMenuItemTest extends TestCase { Link Here
237
		wb = new E4Workbench(window, appContext);
246
		wb = new E4Workbench(window, appContext);
238
		wb.createAndRunUI(window);
247
		wb.createAndRunUI(window);
239
248
249
		MenuManager barManager = (MenuManager) ((Menu) menu.getWidget())
250
				.getData();
251
		barManager.updateAll(true);
252
240
		Object widget1 = menuItem.getWidget();
253
		Object widget1 = menuItem.getWidget();
241
		assertNotNull(widget1);
254
		assertNotNull(widget1);
242
		assertTrue(widget1 instanceof MenuItem);
255
		assertTrue(widget1 instanceof MenuItem);
(-)a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/MWindowTest.java (-1 / +3 lines)
Lines 31-36 import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem; Link Here
31
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
31
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
32
import org.eclipse.e4.ui.services.IServiceConstants;
32
import org.eclipse.e4.ui.services.IServiceConstants;
33
import org.eclipse.e4.ui.widgets.CTabFolder;
33
import org.eclipse.e4.ui.widgets.CTabFolder;
34
import org.eclipse.jface.action.MenuManager;
34
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.graphics.Rectangle;
36
import org.eclipse.swt.graphics.Rectangle;
36
import org.eclipse.swt.widgets.Composite;
37
import org.eclipse.swt.widgets.Composite;
Lines 234-239 public class MWindowTest extends TestCase { Link Here
234
235
235
		wb = new E4Workbench(application, appContext);
236
		wb = new E4Workbench(application, appContext);
236
		wb.createAndRunUI(window);
237
		wb.createAndRunUI(window);
238
		((MenuManager) ((Widget) window.getMainMenu().getWidget()).getData())
239
				.updateAll(true);
237
240
238
		Widget topWidget = (Widget) window.getWidget();
241
		Widget topWidget = (Widget) window.getWidget();
239
		assertNotNull(topWidget);
242
		assertNotNull(topWidget);
240
- 
(-)a/bundles/org.eclipse.e4.core.commands/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.core.contexts/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.core.di.extensions/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.core.di/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.core.javascript/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.core.services.annotations/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.core.services/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ide.application/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.pde.ui/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.pde.webui/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.bindings/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.css.core/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.css.jface/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.css.legacy/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.css.nebula/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.css.swt.theme/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.css.swt/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.di/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.gadgets/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.model.workbench.edit/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.model.workbench/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.selection/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.services/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.web/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.widgets.fragment/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.widgets/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench.addons.swt/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench.fragment/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt.cocoa/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt.contributions/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench.swt/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.eclipse.e4.ui.workbench3/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/bundles/org.pushingpixels.trident/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.contacts/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.e4photo.flickr.mock/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.e4photo.flickr.service.rest/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.e4photo.flickr.service/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.e4photo.flickr/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.e4photo/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.log/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.minimal/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.modifier/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.dialogs/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.e4editor/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.editor.text/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.editor/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.iconview/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.jdt/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.model/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.navigator/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.outline/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.services/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide.sharedimages/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.tools.simpleide/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.tools.simpleide3x/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.demo.views/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.examples.services/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.ui.examples.css.nebula/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.ui.examples.css.rcp/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.ui.examples.css/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/examples/org.eclipse.e4.ui.examples.legacy.workbench/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.master/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.sdk.runtime.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.sdk.source.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.ui.compatibility.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.ui.css.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.ui.examples.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.ui.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.ui.tests.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/features/org.eclipse.e4.ui.web.feature/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/com.google.code.atinject.tck/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.core.commands.tests/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.core.tests.services.annotations/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.core.tests.services.atinject/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.core.tests.services/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.core.tests/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.ui.bindings.tests/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.ui.compatibility.tests/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.ui.selection.tests/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.ui.tests.css.core/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.ui.tests.css.swt/.gitignore (+1 lines)
Added Link Here
1
bin/
(-)a/tests/org.eclipse.e4.ui.tests/.gitignore (-1 / +1 lines)
Added Link Here
0
- 
1
bin/
(-)a/.gitignore (-1 / +1 lines)
Added Link Here
0
- 
1
bin/
(-)a/examples/org.eclipse.e4.demo.simpleide/src/snippet/Snippet.java (-7 lines)
Lines 1-6 Link Here
1
package snippet;
2
3
public class Snippet {
4
	 Bug 312938 -  [Demo] Add example of a Simple-IDE
5
}
6
7
- 
8
Added basically visibility based on MenuManager aboutToShow
0
Added basically visibility based on MenuManager aboutToShow
(-)a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/NewMenuRenderer.java (-19 / +49 lines)
Lines 66-71 public class NewMenuRenderer extends SWTPartRenderer { Link Here
66
	private static final String NO_LABEL = "UnLabled"; //$NON-NLS-1$
66
	private static final String NO_LABEL = "UnLabled"; //$NON-NLS-1$
67
67
68
	private Map<MMenu, MenuManager> modelToManager = new HashMap<MMenu, MenuManager>();
68
	private Map<MMenu, MenuManager> modelToManager = new HashMap<MMenu, MenuManager>();
69
	private Map<MenuManager, MMenu> managerToModel = new HashMap<MenuManager, MMenu>();
69
70
70
	private Map<MMenuItem, IContributionItem> modelToContribution = new HashMap<MMenuItem, IContributionItem>();
71
	private Map<MMenuItem, IContributionItem> modelToContribution = new HashMap<MMenuItem, IContributionItem>();
71
72
Lines 118-124 public class NewMenuRenderer extends SWTPartRenderer { Link Here
118
				if (!(obj instanceof MMenu)) {
119
				if (!(obj instanceof MMenu)) {
119
					return;
120
					return;
120
				}
121
				}
121
				MenuManager parent = modelToManager.get(obj);
122
				MenuManager parent = getManager((MMenu) obj);
122
				if (itemModel.isToBeRendered()) {
123
				if (itemModel.isToBeRendered()) {
123
					if (parent != null) {
124
					if (parent != null) {
124
						modelProcessSwitch(parent, itemModel);
125
						modelProcessSwitch(parent, itemModel);
Lines 179-201 public class NewMenuRenderer extends SWTPartRenderer { Link Here
179
			if (menuManager.getMenu() == null) {
180
			if (menuManager.getMenu() == null) {
180
				return;
181
				return;
181
			}
182
			}
182
			Menu menu = menuManager.getMenu();
183
			MMenu menuModel = getMenuModel(menuManager);
183
			Object obj = menu.getData(AbstractPartRenderer.OWNING_ME);
184
			if (menuModel == null) {
184
			if (obj == null && menu.getParentItem() != null) {
185
				Menu menu = menuManager.getMenu();
185
				obj = menu.getParentItem().getData(
186
				Object obj = menu.getData(AbstractPartRenderer.OWNING_ME);
186
						AbstractPartRenderer.OWNING_ME);
187
				if (obj == null && menu.getParentItem() != null) {
187
			}
188
					obj = menu.getParentItem().getData(
188
			if (!(obj instanceof MMenu)) {
189
							AbstractPartRenderer.OWNING_ME);
189
				return;
190
				}
191
				if (!(obj instanceof MMenu)) {
192
					return;
193
				}
194
				menuModel = (MMenu) obj;
190
			}
195
			}
191
			MMenu menuModel = (MMenu) obj;
192
			final IEclipseContext parentContext = modelService
196
			final IEclipseContext parentContext = modelService
193
					.getContainingContext(menuModel);
197
					.getContainingContext(menuModel);
194
			HashSet<ContributionRecord> records = new HashSet<ContributionRecord>();
198
			HashSet<ContributionRecord> records = new HashSet<ContributionRecord>();
195
			for (MMenuElement element : menuModel.getChildren()) {
199
			for (MMenuElement element : menuModel.getChildren()) {
196
				ContributionRecord record = modelContributionToRecord
200
				ContributionRecord record = modelContributionToRecord
197
						.get(element);
201
						.get(element);
198
				if (records.add(record)) {
202
				if (record != null && records.add(record)) {
199
					record.updateVisibility(parentContext);
203
					record.updateVisibility(parentContext);
200
				}
204
				}
201
			}
205
			}
Lines 211-218 public class NewMenuRenderer extends SWTPartRenderer { Link Here
211
		eventBroker
215
		eventBroker
212
				.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
216
				.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
213
						UIEvents.Item.ENABLED), enabledUpdater);
217
						UIEvents.Item.ENABLED), enabledUpdater);
214
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC,
218
		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC),
215
				UIEvents.UIElement.TOBERENDERED), toBeRenderedUpdater);
219
				toBeRenderedUpdater);
216
220
217
	}
221
	}
218
222
Lines 245-251 public class NewMenuRenderer extends SWTPartRenderer { Link Here
245
			if (container instanceof MWindow) {
249
			if (container instanceof MWindow) {
246
				MenuManager menuBarManager = new MenuManager(NO_LABEL,
250
				MenuManager menuBarManager = new MenuManager(NO_LABEL,
247
						menuModel.getElementId());
251
						menuModel.getElementId());
248
				modelToManager.put(menuModel, menuBarManager);
252
				linkModelToManager(menuModel, menuBarManager);
249
				menuBarManager.addMenuListener(visibilityCalculationListener);
253
				menuBarManager.addMenuListener(visibilityCalculationListener);
250
				newMenu = menuBarManager.createMenuBar((Decorations) parent);
254
				newMenu = menuBarManager.createMenuBar((Decorations) parent);
251
				((Decorations) parent).setMenuBar(newMenu);
255
				((Decorations) parent).setMenuBar(newMenu);
Lines 253-259 public class NewMenuRenderer extends SWTPartRenderer { Link Here
253
			} else {
257
			} else {
254
				MenuManager popupManager = new MenuManager(NO_LABEL,
258
				MenuManager popupManager = new MenuManager(NO_LABEL,
255
						menuModel.getElementId());
259
						menuModel.getElementId());
256
				modelToManager.put(menuModel, popupManager);
260
				linkModelToManager(menuModel, popupManager);
257
				popupManager.addMenuListener(visibilityCalculationListener);
261
				popupManager.addMenuListener(visibilityCalculationListener);
258
				newMenu = popupManager.createContextMenu((Control) parent);
262
				newMenu = popupManager.createContextMenu((Control) parent);
259
				((Control) parent).setMenu(newMenu);
263
				((Control) parent).setMenu(newMenu);
Lines 267-273 public class NewMenuRenderer extends SWTPartRenderer { Link Here
267
		} else if (parent instanceof Control) {
271
		} else if (parent instanceof Control) {
268
			MenuManager popupManager = new MenuManager(NO_LABEL,
272
			MenuManager popupManager = new MenuManager(NO_LABEL,
269
					menuModel.getElementId());
273
					menuModel.getElementId());
270
			modelToManager.put(menuModel, popupManager);
274
			linkModelToManager(menuModel, popupManager);
271
			popupManager.addMenuListener(visibilityCalculationListener);
275
			popupManager.addMenuListener(visibilityCalculationListener);
272
			newMenu = popupManager.createContextMenu((Control) parent);
276
			newMenu = popupManager.createContextMenu((Control) parent);
273
			((Control) parent).setMenu(newMenu);
277
			((Control) parent).setMenu(newMenu);
Lines 305-311 public class NewMenuRenderer extends SWTPartRenderer { Link Here
305
			}
309
			}
306
		}
310
		}
307
311
308
		MenuManager manager = modelToManager.get(menuModel);
312
		MenuManager manager = getManager(menuModel);
309
		boolean done = toContribute.size() == 0;
313
		boolean done = toContribute.size() == 0;
310
		while (!done) {
314
		while (!done) {
311
			ArrayList<MMenuContribution> curList = new ArrayList<MMenuContribution>(
315
			ArrayList<MMenuContribution> curList = new ArrayList<MMenuContribution>(
Lines 447-453 public class NewMenuRenderer extends SWTPartRenderer { Link Here
447
		if (container == null)
451
		if (container == null)
448
			return;
452
			return;
449
453
450
		MenuManager parentManager = modelToManager.get(container);
454
		// this is in direct violation of good programming
455
		MenuManager parentManager = getManager((MMenu) ((Object) container));
451
		if (parentManager == null) {
456
		if (parentManager == null) {
452
			return;
457
			return;
453
		}
458
		}
Lines 472-478 public class NewMenuRenderer extends SWTPartRenderer { Link Here
472
		ImageDescriptor desc = getImageDescriptor(menuModel);
477
		ImageDescriptor desc = getImageDescriptor(menuModel);
473
		MenuManager menuManager = new MenuManager(menuText, desc,
478
		MenuManager menuManager = new MenuManager(menuText, desc,
474
				menuModel.getElementId());
479
				menuModel.getElementId());
475
		modelToManager.put(menuModel, menuManager);
480
		linkModelToManager(menuModel, menuManager);
476
		menuManager.addMenuListener(visibilityCalculationListener);
481
		menuManager.addMenuListener(visibilityCalculationListener);
477
		parentManager.add(menuManager);
482
		parentManager.add(menuManager);
478
		processContributions(menuModel);
483
		processContributions(menuModel);
Lines 492-497 public class NewMenuRenderer extends SWTPartRenderer { Link Here
492
	 * @param childME
497
	 * @param childME
493
	 */
498
	 */
494
	void modelProcessSwitch(MenuManager menuManager, MMenuElement childME) {
499
	void modelProcessSwitch(MenuManager menuManager, MMenuElement childME) {
500
		if (!childME.isToBeRendered()) {
501
			return;
502
		}
495
		if (childME instanceof MHandledMenuItem) {
503
		if (childME instanceof MHandledMenuItem) {
496
			MHandledMenuItem itemModel = (MHandledMenuItem) childME;
504
			MHandledMenuItem itemModel = (MHandledMenuItem) childME;
497
			processHandledItem(menuManager, itemModel);
505
			processHandledItem(menuManager, itemModel);
Lines 573-576 public class NewMenuRenderer extends SWTPartRenderer { Link Here
573
		}
581
		}
574
		return null;
582
		return null;
575
	}
583
	}
584
585
	public MenuManager getManager(MMenu model) {
586
		return modelToManager.get(model);
587
	}
588
589
	public MMenu getMenuModel(MenuManager manager) {
590
		return managerToModel.get(manager);
591
	}
592
593
	public void linkModelToManager(MMenu model, MenuManager manager) {
594
		modelToManager.put(model, manager);
595
		managerToModel.put(manager, model);
596
	}
597
598
	public void clearModelToManager(MMenu model, MenuManager manager) {
599
		modelToManager.remove(model);
600
		managerToModel.remove(manager);
601
	}
602
603
	public IContributionItem getContribution(MMenuElement model) {
604
		return modelToContribution.get(model);
605
	}
576
}
606
}
(-)a/tests/org.eclipse.e4.ui.tests/META-INF/MANIFEST.MF (-1 / +2 lines)
Lines 28-34 Require-Bundle: org.eclipse.emf.ecore.xmi;bundle-version="2.4.0", Link Here
28
 org.eclipse.emf.ecore.change;bundle-version="2.5.0",
28
 org.eclipse.emf.ecore.change;bundle-version="2.5.0",
29
 org.eclipse.e4.ui.di;bundle-version="0.9.0",
29
 org.eclipse.e4.ui.di;bundle-version="0.9.0",
30
 org.eclipse.e4.core.di.extensions;bundle-version="0.9.0",
30
 org.eclipse.e4.core.di.extensions;bundle-version="0.9.0",
31
 org.eclipse.e4.ui.widgets;bundle-version="1.0.0"
31
 org.eclipse.e4.ui.widgets;bundle-version="1.0.0",
32
 org.eclipse.core.expressions;bundle-version="3.4.200"
32
Bundle-RequiredExecutionEnvironment: J2SE-1.5
33
Bundle-RequiredExecutionEnvironment: J2SE-1.5
33
Bundle-ActivationPolicy: lazy
34
Bundle-ActivationPolicy: lazy
34
Import-Package: javax.annotation;version="1.0.0",
35
Import-Package: javax.annotation;version="1.0.0",
(-)a/tests/org.eclipse.e4.ui.tests/plugin.xml (+12 lines)
Lines 48-52 Link Here
48
         </element>
48
         </element>
49
      </processor>
49
      </processor>
50
   </extension>
50
   </extension>
51
   <extension
52
         point="org.eclipse.core.expressions.definitions">
53
      <definition
54
            id="org.eclipse.e4.ui.tests.withMmc1">
55
         <with
56
               variable="mmc1">
57
            <equals
58
                  value="true">
59
            </equals>
60
         </with>
61
      </definition>
62
   </extension>
51
63
52
</plugin>
64
</plugin>
(-)a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/MMenuItemTest.java (-1 / +309 lines)
Lines 15-33 import junit.framework.TestCase; Link Here
15
import org.eclipse.e4.core.contexts.IEclipseContext;
15
import org.eclipse.e4.core.contexts.IEclipseContext;
16
import org.eclipse.e4.core.di.IDisposable;
16
import org.eclipse.e4.core.di.IDisposable;
17
import org.eclipse.e4.ui.internal.workbench.E4Workbench;
17
import org.eclipse.e4.ui.internal.workbench.E4Workbench;
18
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
18
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
19
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
19
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
20
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
20
import org.eclipse.e4.ui.model.application.MApplication;
21
import org.eclipse.e4.ui.model.application.MApplication;
21
import org.eclipse.e4.ui.model.application.commands.MCommand;
22
import org.eclipse.e4.ui.model.application.commands.MCommand;
22
import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
23
import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
23
import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
24
import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
25
import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
26
import org.eclipse.e4.ui.model.application.ui.MUIElement;
24
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
27
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
25
import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
28
import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
29
import org.eclipse.e4.ui.model.application.ui.impl.UiFactoryImpl;
26
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
30
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
27
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
31
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
28
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
32
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
33
import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
29
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
34
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
35
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
30
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
36
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
37
import org.eclipse.e4.ui.workbench.renderers.swt.NewMenuRenderer;
38
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
39
import org.eclipse.jface.action.IContributionItem;
31
import org.eclipse.jface.action.MenuManager;
40
import org.eclipse.jface.action.MenuManager;
32
import org.eclipse.swt.SWT;
41
import org.eclipse.swt.SWT;
33
import org.eclipse.swt.widgets.Event;
42
import org.eclipse.swt.widgets.Event;
Lines 257-260 public class MMenuItemTest extends TestCase { Link Here
257
		MenuItem menuItemWidget = (MenuItem) widget1;
266
		MenuItem menuItemWidget = (MenuItem) widget1;
258
		assertTrue(menuItemWidget.getSelection());
267
		assertTrue(menuItemWidget.getSelection());
259
	}
268
	}
269
270
	public void testSubMenuCreation() throws Exception {
271
		MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
272
		MMenu menuBar = MenuFactoryImpl.eINSTANCE.createMenu();
273
		menuBar.setElementId("org.eclipse.ui.main.menu");
274
		window.setMainMenu(menuBar);
275
276
		MMenu fileMenu = MenuFactoryImpl.eINSTANCE.createMenu();
277
		fileMenu.setElementId("file");
278
		fileMenu.setLabel("File");
279
		menuBar.getChildren().add(fileMenu);
280
281
		MMenuItem item1 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
282
		item1.setElementId("item1");
283
		item1.setLabel("item1");
284
		fileMenu.getChildren().add(item1);
285
286
		MMenuSeparator sep = MenuFactoryImpl.eINSTANCE.createMenuSeparator();
287
		sep.setElementId("group1");
288
		fileMenu.getChildren().add(sep);
289
290
		MMenuItem item2 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
291
		item2.setElementId("item2");
292
		item2.setLabel("item2");
293
		fileMenu.getChildren().add(item2);
294
295
		MApplication application = ApplicationFactoryImpl.eINSTANCE
296
				.createApplication();
297
		application.getChildren().add(window);
298
		application.setContext(appContext);
299
		appContext.set(MApplication.class.getName(), application);
300
301
		wb = new E4Workbench(window, appContext);
302
		wb.createAndRunUI(window);
303
304
		NewMenuRenderer renderer = getRenderer(appContext, menuBar);
305
		MenuManager manager = renderer.getManager(menuBar);
306
		assertNotNull("failed to create menu bar manager", manager);
307
308
		assertEquals(1, manager.getSize());
309
310
		MenuManager fileManager = (MenuManager) manager.getItems()[0];
311
		MenuManager fileR = renderer.getManager(fileMenu);
312
		assertEquals(fileManager, fileR);
313
314
		assertEquals(3, fileManager.getSize());
315
	}
316
317
	public void testTbrItem() throws Exception {
318
		MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
319
		MMenu menuBar = MenuFactoryImpl.eINSTANCE.createMenu();
320
		menuBar.setElementId("org.eclipse.ui.main.menu");
321
		window.setMainMenu(menuBar);
322
323
		MMenu fileMenu = MenuFactoryImpl.eINSTANCE.createMenu();
324
		fileMenu.setElementId("file");
325
		fileMenu.setLabel("File");
326
		menuBar.getChildren().add(fileMenu);
327
328
		MMenuItem item1 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
329
		item1.setElementId("item1");
330
		item1.setLabel("item1");
331
		fileMenu.getChildren().add(item1);
332
333
		MMenuSeparator sep = MenuFactoryImpl.eINSTANCE.createMenuSeparator();
334
		sep.setElementId("group1");
335
		fileMenu.getChildren().add(sep);
336
337
		MMenuItem item2 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
338
		item2.setElementId("item2");
339
		item2.setLabel("item2");
340
		fileMenu.getChildren().add(item2);
341
		item2.setToBeRendered(false);
342
343
		MApplication application = ApplicationFactoryImpl.eINSTANCE
344
				.createApplication();
345
		application.getChildren().add(window);
346
		application.setContext(appContext);
347
		appContext.set(MApplication.class.getName(), application);
348
349
		wb = new E4Workbench(window, appContext);
350
		wb.createAndRunUI(window);
351
352
		NewMenuRenderer renderer = getRenderer(appContext, menuBar);
353
		MenuManager manager = renderer.getManager(menuBar);
354
		assertNotNull("failed to create menu bar manager", manager);
355
356
		assertEquals(1, manager.getSize());
357
358
		MenuManager fileManager = (MenuManager) manager.getItems()[0];
359
		MenuManager fileR = renderer.getManager(fileMenu);
360
		assertEquals(fileManager, fileR);
361
362
		assertEquals(2, fileManager.getSize());
363
	}
364
365
	public void testInvisibleItem() throws Exception {
366
		MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
367
		MMenu menuBar = MenuFactoryImpl.eINSTANCE.createMenu();
368
		menuBar.setElementId("org.eclipse.ui.main.menu");
369
		window.setMainMenu(menuBar);
370
371
		MMenu fileMenu = MenuFactoryImpl.eINSTANCE.createMenu();
372
		fileMenu.setElementId("file");
373
		fileMenu.setLabel("File");
374
		menuBar.getChildren().add(fileMenu);
375
376
		MMenuItem item1 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
377
		item1.setElementId("item1");
378
		item1.setLabel("item1");
379
		fileMenu.getChildren().add(item1);
380
381
		MMenuSeparator sep = MenuFactoryImpl.eINSTANCE.createMenuSeparator();
382
		sep.setElementId("group1");
383
		fileMenu.getChildren().add(sep);
384
385
		MMenuItem item2 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
386
		item2.setElementId("item2");
387
		item2.setLabel("item2");
388
		fileMenu.getChildren().add(item2);
389
		item2.setVisible(false);
390
391
		MApplication application = ApplicationFactoryImpl.eINSTANCE
392
				.createApplication();
393
		application.getChildren().add(window);
394
		application.setContext(appContext);
395
		appContext.set(MApplication.class.getName(), application);
396
397
		wb = new E4Workbench(window, appContext);
398
		wb.createAndRunUI(window);
399
400
		NewMenuRenderer renderer = getRenderer(appContext, menuBar);
401
		MenuManager manager = renderer.getManager(menuBar);
402
		assertNotNull("failed to create menu bar manager", manager);
403
404
		assertEquals(1, manager.getSize());
405
406
		MenuManager fileManager = (MenuManager) manager.getItems()[0];
407
		MenuManager fileR = renderer.getManager(fileMenu);
408
		assertEquals(fileManager, fileR);
409
410
		assertEquals(3, fileManager.getSize());
411
412
		assertEquals(false, fileManager.getItems()[2].isVisible());
413
	}
414
415
	public void testMenuContribution() throws Exception {
416
		MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
417
		MMenu menuBar = MenuFactoryImpl.eINSTANCE.createMenu();
418
		menuBar.setElementId("org.eclipse.ui.main.menu");
419
		window.setMainMenu(menuBar);
420
421
		MMenu fileMenu = MenuFactoryImpl.eINSTANCE.createMenu();
422
		fileMenu.setElementId("file");
423
		fileMenu.setLabel("File");
424
		menuBar.getChildren().add(fileMenu);
425
426
		MMenuItem item1 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
427
		item1.setElementId("item1");
428
		item1.setLabel("item1");
429
		fileMenu.getChildren().add(item1);
430
431
		MMenuSeparator sep = MenuFactoryImpl.eINSTANCE.createMenuSeparator();
432
		sep.setElementId("group1");
433
		fileMenu.getChildren().add(sep);
434
435
		MMenuItem item2 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
436
		item2.setElementId("item2");
437
		item2.setLabel("item2");
438
		fileMenu.getChildren().add(item2);
439
440
		MApplication application = ApplicationFactoryImpl.eINSTANCE
441
				.createApplication();
442
		application.getChildren().add(window);
443
		application.setContext(appContext);
444
		appContext.set(MApplication.class.getName(), application);
445
		application.getMenuContributions().add(createContribution(false));
446
447
		wb = new E4Workbench(window, appContext);
448
		wb.createAndRunUI(window);
449
450
		NewMenuRenderer renderer = getRenderer(appContext, menuBar);
451
452
		MenuManager fileManager = renderer.getManager(fileMenu);
453
		assertNotNull("No file menu?", fileManager);
454
455
		assertEquals(4, fileManager.getSize());
456
457
		assertEquals("mmc.item1", fileManager.getItems()[3].getId());
458
	}
459
460
	public void testWithVisible() throws Exception {
461
		MWindow window = BasicFactoryImpl.eINSTANCE.createWindow();
462
		MMenu menuBar = MenuFactoryImpl.eINSTANCE.createMenu();
463
		menuBar.setElementId("org.eclipse.ui.main.menu");
464
		window.setMainMenu(menuBar);
465
466
		MMenu fileMenu = MenuFactoryImpl.eINSTANCE.createMenu();
467
		fileMenu.setElementId("file");
468
		fileMenu.setLabel("File");
469
		menuBar.getChildren().add(fileMenu);
470
471
		MMenuItem item1 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
472
		item1.setElementId("item1");
473
		item1.setLabel("item1");
474
		fileMenu.getChildren().add(item1);
475
476
		MMenuSeparator sep = MenuFactoryImpl.eINSTANCE.createMenuSeparator();
477
		sep.setElementId("group1");
478
		fileMenu.getChildren().add(sep);
479
480
		MMenuItem item2 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
481
		item2.setElementId("item2");
482
		item2.setLabel("item2");
483
		fileMenu.getChildren().add(item2);
484
485
		MApplication application = ApplicationFactoryImpl.eINSTANCE
486
				.createApplication();
487
		application.getChildren().add(window);
488
		application.setContext(appContext);
489
		appContext.set(MApplication.class.getName(), application);
490
		application.getMenuContributions().add(createContribution(true));
491
492
		wb = new E4Workbench(window, appContext);
493
		wb.createAndRunUI(window);
494
495
		NewMenuRenderer renderer = getRenderer(appContext, menuBar);
496
497
		MenuManager fileManager = renderer.getManager(fileMenu);
498
		assertNotNull("No file menu?", fileManager);
499
500
		assertEquals(4, fileManager.getSize());
501
502
		IContributionItem mmcItem = fileManager.getItems()[3];
503
		assertEquals("mmc.item1", mmcItem.getId());
504
		assertEquals("before the first show, we have no context to evaluate",
505
				true, mmcItem.isVisible());
506
507
		MenuManager manager = renderer.getManager(menuBar);
508
		manager.updateAll(true);
509
		Menu fileWidget = fileManager.getMenu();
510
		assertNotNull(fileWidget);
511
512
		Event show = new Event();
513
		show.widget = fileWidget;
514
		show.type = SWT.Show;
515
516
		Event hide = new Event();
517
		hide.widget = fileWidget;
518
		hide.type = SWT.Hide;
519
520
		fileWidget.notifyListeners(SWT.Show, show);
521
522
		assertEquals("after the first show, it should not be visible", false,
523
				mmcItem.isVisible());
524
525
		fileWidget.notifyListeners(SWT.Hide, hide);
526
527
		appContext.set("mmc1", Boolean.TRUE);
528
529
		assertEquals("Change should not show up until next show", false,
530
				mmcItem.isVisible());
531
532
		fileWidget.notifyListeners(SWT.Show, show);
533
534
		assertEquals(true, mmcItem.isVisible());
535
536
		fileWidget.notifyListeners(SWT.Hide, hide);
537
	}
538
539
	private MMenuContribution createContribution(boolean withVisibleWhen) {
540
		MMenuContribution mmc = MenuFactoryImpl.eINSTANCE
541
				.createMenuContribution();
542
		mmc.setElementId("test.contrib1");
543
		mmc.setParentId("file");
544
		mmc.setPositionInParent("after=additions");
545
546
		MMenuItem item1 = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
547
		item1.setElementId("mmc.item1");
548
		item1.setLabel("mmc.item1");
549
		mmc.getChildren().add(item1);
550
551
		if (withVisibleWhen) {
552
			MCoreExpression exp = UiFactoryImpl.eINSTANCE
553
					.createCoreExpression();
554
			exp.setCoreExpressionId("org.eclipse.e4.ui.tests.withMmc1");
555
			mmc.setVisibleWhen(exp);
556
		}
557
558
		return mmc;
559
	}
560
561
	private NewMenuRenderer getRenderer(IEclipseContext context,
562
			MUIElement element) {
563
		IRendererFactory rendererFactory = context.get(IRendererFactory.class);
564
		AbstractPartRenderer renderer = rendererFactory.getRenderer(element,
565
				null);
566
		assertEquals(NewMenuRenderer.class, renderer.getClass());
567
		return (NewMenuRenderer) renderer;
568
	}
260
}
569
}
261
- 

Return to bug 325392