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

Collapse All | Expand All

(-)src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java (-3 / +35 lines)
Lines 69-77 Link Here
69
import org.eclipse.swt.widgets.Widget;
69
import org.eclipse.swt.widgets.Widget;
70
70
71
public class HandledContributionItem extends ContributionItem {
71
public class HandledContributionItem extends ContributionItem {
72
	/**
72
	private static final String DISPOSABLE_CHECK = "IDisposable"; //$NON-NLS-1$
73
	 * 
74
	 */
75
	private static final String HCI_STATIC_CONTEXT = "HCI-staticContext"; //$NON-NLS-1$
73
	private static final String HCI_STATIC_CONTEXT = "HCI-staticContext"; //$NON-NLS-1$
76
	private MHandledItem model;
74
	private MHandledItem model;
77
	private Widget widget;
75
	private Widget widget;
Lines 217-222 Link Here
217
		}
215
		}
218
		item.setData(this);
216
		item.setData(this);
219
217
218
		hookCheckListener();
219
220
		item.addListener(SWT.Dispose, getItemListener());
220
		item.addListener(SWT.Dispose, getItemListener());
221
		item.addListener(SWT.Selection, getItemListener());
221
		item.addListener(SWT.Selection, getItemListener());
222
		item.addListener(SWT.DefaultSelection, getItemListener());
222
		item.addListener(SWT.DefaultSelection, getItemListener());
Lines 267-272 Link Here
267
		updateIcons();
267
		updateIcons();
268
	}
268
	}
269
269
270
	private void hookCheckListener() {
271
		if (model.getType() != ItemType.CHECK) {
272
			return;
273
		}
274
		Object obj = model.getTransientData().get(ItemType.CHECK.toString());
275
		if (obj instanceof IContextFunction) {
276
			IEclipseContext context = getContext(model);
277
			IContextFunction func = (IContextFunction) obj;
278
			try {
279
				context.set(MHandledItem.class, model);
280
				obj = func.compute(context);
281
				if (obj != null) {
282
					model.getTransientData().put(DISPOSABLE_CHECK, obj);
283
				}
284
			} finally {
285
				context.remove(MHandledItem.class);
286
			}
287
		}
288
	}
289
290
	private void unhookCheckListener() {
291
		if (model.getType() != ItemType.CHECK) {
292
			return;
293
		}
294
		final Object obj = model.getTransientData().remove(DISPOSABLE_CHECK);
295
		if (obj == null) {
296
			return;
297
		}
298
		((Runnable) obj).run();
299
	}
300
270
	private void updateVisible() {
301
	private void updateVisible() {
271
		setVisible((model).isVisible());
302
		setVisible((model).isVisible());
272
		final IContributionManager parent = getParent();
303
		final IContributionManager parent = getParent();
Lines 459-464 Link Here
459
490
460
	private void handleWidgetDispose(Event event) {
491
	private void handleWidgetDispose(Event event) {
461
		if (event.widget == widget) {
492
		if (event.widget == widget) {
493
			unhookCheckListener();
462
			widget.removeListener(SWT.Selection, getItemListener());
494
			widget.removeListener(SWT.Selection, getItemListener());
463
			widget.removeListener(SWT.Dispose, getItemListener());
495
			widget.removeListener(SWT.Dispose, getItemListener());
464
			widget.removeListener(SWT.DefaultSelection, getItemListener());
496
			widget.removeListener(SWT.DefaultSelection, getItemListener());
(-)Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java (+49 lines)
Lines 43-48 Link Here
43
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
43
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
44
import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
44
import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
45
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
45
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
46
import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem;
46
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
47
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
47
import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
48
import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
48
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
49
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
Lines 58-63 Link Here
58
import org.eclipse.jface.action.IMenuCreator;
59
import org.eclipse.jface.action.IMenuCreator;
59
import org.eclipse.jface.action.MenuManager;
60
import org.eclipse.jface.action.MenuManager;
60
import org.eclipse.jface.resource.ImageDescriptor;
61
import org.eclipse.jface.resource.ImageDescriptor;
62
import org.eclipse.jface.util.IPropertyChangeListener;
63
import org.eclipse.jface.util.PropertyChangeEvent;
61
import org.eclipse.swt.widgets.Control;
64
import org.eclipse.swt.widgets.Control;
62
import org.eclipse.swt.widgets.Menu;
65
import org.eclipse.swt.widgets.Menu;
63
import org.eclipse.ui.IActionDelegate;
66
import org.eclipse.ui.IActionDelegate;
Lines 475-480 Link Here
475
			item.setType(ItemType.PUSH);
478
			item.setType(ItemType.PUSH);
476
		} else if (IWorkbenchRegistryConstants.STYLE_TOGGLE.equals(style)) {
479
		} else if (IWorkbenchRegistryConstants.STYLE_TOGGLE.equals(style)) {
477
			item.setType(ItemType.CHECK);
480
			item.setType(ItemType.CHECK);
481
			IContextFunction generator = new ContextFunction() {
482
				private ActionDescriptor descriptor = null;
483
484
				private ActionDescriptor getDescriptor(IWorkbenchWindow window) {
485
					if (descriptor == null) {
486
						descriptor = new ActionDescriptor(element, ActionDescriptor.T_WORKBENCH,
487
								window);
488
					}
489
					return descriptor;
490
				}
491
492
				@Override
493
				public Object compute(IEclipseContext context) {
494
					IWorkbenchWindow window = context.get(IWorkbenchWindow.class);
495
					if (window == null) {
496
						return null;
497
					}
498
					final MHandledItem model = context.get(MHandledItem.class);
499
					if (model == null) {
500
						return null;
501
					}
502
					ActionDescriptor desc = getDescriptor(window);
503
					final IAction action = desc.getAction();
504
					final IPropertyChangeListener propListener = new IPropertyChangeListener() {
505
						public void propertyChange(PropertyChangeEvent event) {
506
							if (IAction.CHECKED.equals(event.getProperty())) {
507
								boolean checked = false;
508
								if (event.getNewValue() instanceof Boolean) {
509
									checked = ((Boolean) event.getNewValue()).booleanValue();
510
								}
511
								model.setSelected(checked);
512
							}
513
						}
514
					};
515
					action.addPropertyChangeListener(propListener);
516
					Runnable obj = new Runnable() {
517
						@Execute
518
						public void run() {
519
							action.removePropertyChangeListener(propListener);
520
						}
521
					};
522
					model.setSelected(action.isChecked());
523
					return obj;
524
				}
525
			};
526
			item.getTransientData().put(ItemType.CHECK.toString(), generator);
478
		} else if (IWorkbenchRegistryConstants.STYLE_RADIO.equals(style)) {
527
		} else if (IWorkbenchRegistryConstants.STYLE_RADIO.equals(style)) {
479
			item.setType(ItemType.RADIO);
528
			item.setType(ItemType.RADIO);
480
		} else if (IWorkbenchRegistryConstants.STYLE_PULLDOWN.equals(style)) {
529
		} else if (IWorkbenchRegistryConstants.STYLE_PULLDOWN.equals(style)) {

Return to bug 325768