Bug 330119 - render toolbar contributions using the ContributionManagers
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
index 64e66e3..119fbd0 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
@@ -2,6 +2,7 @@
import javax.inject.Inject;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IContextFunction;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.CanExecute;
import org.eclipse.e4.core.di.annotations.Execute;
@@ -15,12 +16,16 @@
import org.eclipse.e4.ui.model.application.ui.MUILabel;
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
import org.eclipse.e4.ui.model.application.ui.menu.MItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
import org.eclipse.e4.ui.workbench.IResourceUtilities;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.resource.DeviceResourceException;
@@ -28,6 +33,11 @@
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
@@ -124,9 +134,14 @@
if (widget != null) {
return;
}
+ boolean isDropdown = false;
+ if (model instanceof MToolItem) {
+ MMenu menu = ((MToolItem) model).getMenu();
+ isDropdown = menu != null;
+ }
int style = SWT.PUSH;
- if (model.getType() == ItemType.PUSH)
- style = SWT.PUSH;
+ if (isDropdown)
+ style = SWT.DROP_DOWN;
else if (model.getType() == ItemType.CHECK)
style = SWT.CHECK;
else if (model.getType() == ItemType.RADIO)
@@ -205,7 +220,6 @@
}
final String tooltip = model.getLocalizedTooltip();
item.setToolTipText(tooltip);
-
item.setSelection(model.isSelected());
item.setEnabled(model.isEnabled());
}
@@ -303,6 +317,9 @@
private void handleWidgetSelection(Event event) {
if (widget != null && !widget.isDisposed()) {
+ if (dropdownEvent(event)) {
+ return;
+ }
if (model.getType() == ItemType.CHECK
|| model.getType() == ItemType.RADIO) {
boolean selection = false;
@@ -319,6 +336,69 @@
}
}
+ private boolean dropdownEvent(Event event) {
+ if (event.detail == SWT.ARROW && model instanceof MToolItem) {
+ ToolItem ti = (ToolItem) event.widget;
+ MMenu mmenu = ((MToolItem) model).getMenu();
+ if (mmenu == null) {
+ return false;
+ }
+ Menu menu = getMenu(mmenu, ti);
+ if (menu == null) {
+ return true;
+ }
+ Rectangle itemBounds = ti.getBounds();
+ Point displayAt = ti.getParent().toDisplay(itemBounds.x,
+ itemBounds.y + itemBounds.height);
+ menu.setLocation(displayAt);
+ menu.setVisible(true);
+
+ Display display = menu.getDisplay();
+ while (menu.isVisible()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ protected Menu getMenu(final MMenu mmenu, ToolItem toolItem) {
+ Object obj = mmenu.getWidget();
+ if (obj instanceof Menu && !((Menu) obj).isDisposed()) {
+ return (Menu) obj;
+ }
+ // this is a temporary passthrough of the IMenuCreator
+ if (mmenu instanceof MRenderedMenu) {
+ obj = ((MRenderedMenu) mmenu).getContributionManager();
+ if (obj instanceof IContextFunction) {
+ final IEclipseContext lclContext = getContext(mmenu);
+ obj = ((IContextFunction) obj).compute(lclContext);
+ ((MRenderedMenu) mmenu).setContributionManager(obj);
+ }
+ if (obj instanceof IMenuCreator) {
+ final IMenuCreator creator = (IMenuCreator) obj;
+ final Menu menu = creator.getMenu(toolItem.getParent()
+ .getShell());
+ if (menu != null) {
+ toolItem.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ if (menu != null && !menu.isDisposed()) {
+ creator.dispose();
+ ((MRenderedMenu) mmenu).setWidget(null);
+ }
+ }
+ });
+ // mmenu.setWidget(menu);
+ menu.setData(AbstractPartRenderer.OWNING_ME, menu);
+ return menu;
+ }
+ }
+ }
+ return null;
+ }
+
private void executeItem() {
final IEclipseContext lclContext = getContext(model);
if (!checkContribution(lclContext)) {
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
index 9380b9a..df0e560 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
@@ -2,11 +2,13 @@
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import javax.inject.Inject;
import org.eclipse.core.commands.ParameterizedCommand;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.e4.core.commands.ECommandService;
import org.eclipse.e4.core.commands.EHandlerService;
+import org.eclipse.e4.core.contexts.IContextFunction;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.bindings.EBindingService;
import org.eclipse.e4.ui.internal.workbench.Activator;
@@ -19,12 +21,16 @@
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem;
import org.eclipse.e4.ui.model.application.ui.menu.MItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
import org.eclipse.e4.ui.workbench.IResourceUtilities;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.bindings.TriggerSequence;
@@ -33,6 +39,11 @@
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
@@ -162,9 +173,14 @@
if (widget != null) {
return;
}
+ boolean isDropdown = false;
+ if (model instanceof MToolItem) {
+ MMenu menu = ((MToolItem) model).getMenu();
+ isDropdown = menu != null;
+ }
int style = SWT.PUSH;
- if (model.getType() == ItemType.PUSH)
- style = SWT.PUSH;
+ if (isDropdown)
+ style = SWT.DROP_DOWN;
else if (model.getType() == ItemType.CHECK)
style = SWT.CHECK;
else if (model.getType() == ItemType.RADIO)
@@ -261,12 +277,58 @@
} else {
item.setText(""); //$NON-NLS-1$
}
- final String tooltip = model.getLocalizedTooltip();
+ final String tooltip = getToolTipText(model);
item.setToolTipText(tooltip);
item.setSelection(model.isSelected());
item.setEnabled(model.isEnabled());
}
+ private String getToolTipText(MItem item) {
+ String text = item.getLocalizedTooltip();
+ if (item instanceof MHandledItem) {
+ MHandledItem handledItem = (MHandledItem) item;
+ IEclipseContext context = getContext(item);
+ EBindingService bs = (EBindingService) context
+ .get(EBindingService.class.getName());
+ ParameterizedCommand cmd = handledItem.getWbCommand();
+ if (cmd == null) {
+ cmd = generateParameterizedCommand(handledItem, context);
+ }
+ TriggerSequence sequence = bs.getBestSequenceFor(handledItem
+ .getWbCommand());
+ if (sequence != null) {
+ if (text == null) {
+ try {
+ text = cmd.getName();
+ } catch (NotDefinedException e) {
+ return null;
+ }
+ }
+ text = text + " (" + sequence.format() + ')'; //$NON-NLS-1$
+ }
+ return text;
+ }
+ return text;
+ }
+
+ private ParameterizedCommand generateParameterizedCommand(
+ final MHandledItem item, final IEclipseContext lclContext) {
+ ECommandService cmdService = (ECommandService) lclContext
+ .get(ECommandService.class.getName());
+ Map<String, Object> parameters = null;
+ List<MParameter> modelParms = item.getParameters();
+ if (modelParms != null && !modelParms.isEmpty()) {
+ parameters = new HashMap<String, Object>();
+ for (MParameter mParm : modelParms) {
+ parameters.put(mParm.getName(), mParm.getValue());
+ }
+ }
+ ParameterizedCommand cmd = cmdService.createCommand(item.getCommand()
+ .getElementId(), parameters);
+ item.setWbCommand(cmd);
+ return cmd;
+ }
+
private void updateIcons() {
if (widget instanceof MenuItem) {
MenuItem item = (MenuItem) widget;
@@ -360,6 +422,9 @@
private void handleWidgetSelection(Event event) {
if (widget != null && !widget.isDisposed()) {
+ if (dropdownEvent(event)) {
+ return;
+ }
if (model.getType() == ItemType.CHECK
|| model.getType() == ItemType.RADIO) {
boolean selection = false;
@@ -376,6 +441,73 @@
}
}
+ /**
+ * @param event
+ * @return
+ */
+ private boolean dropdownEvent(Event event) {
+ if (event.detail == SWT.ARROW && model instanceof MToolItem) {
+ ToolItem ti = (ToolItem) event.widget;
+ MMenu mmenu = ((MToolItem) model).getMenu();
+ if (mmenu == null) {
+ return false;
+ }
+ Menu menu = getMenu(mmenu, ti);
+ if (menu == null) {
+ return true;
+ }
+ Rectangle itemBounds = ti.getBounds();
+ Point displayAt = ti.getParent().toDisplay(itemBounds.x,
+ itemBounds.y + itemBounds.height);
+ menu.setLocation(displayAt);
+ menu.setVisible(true);
+
+ Display display = menu.getDisplay();
+ while (menu.isVisible()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ protected Menu getMenu(final MMenu mmenu, ToolItem toolItem) {
+ Object obj = mmenu.getWidget();
+ if (obj instanceof Menu && !((Menu) obj).isDisposed()) {
+ return (Menu) obj;
+ }
+ // this is a temporary passthrough of the IMenuCreator
+ if (mmenu instanceof MRenderedMenu) {
+ obj = ((MRenderedMenu) mmenu).getContributionManager();
+ if (obj instanceof IContextFunction) {
+ final IEclipseContext lclContext = getContext(mmenu);
+ obj = ((IContextFunction) obj).compute(lclContext);
+ ((MRenderedMenu) mmenu).setContributionManager(obj);
+ }
+ if (obj instanceof IMenuCreator) {
+ final IMenuCreator creator = (IMenuCreator) obj;
+ final Menu menu = creator.getMenu(toolItem.getParent()
+ .getShell());
+ if (menu != null) {
+ toolItem.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ if (menu != null && !menu.isDisposed()) {
+ creator.dispose();
+ ((MRenderedMenu) mmenu).setWidget(null);
+ }
+ }
+ });
+ // mmenu.setWidget(menu);
+ menu.setData(AbstractPartRenderer.OWNING_ME, menu);
+ return menu;
+ }
+ }
+ }
+ return null;
+ }
+
private void executeItem() {
ParameterizedCommand cmd = model.getWbCommand();
if (cmd == null) {
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java
new file mode 100644
index 0000000..8f5f9a2
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.e4.ui.workbench.renderers.swt;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer;
+import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
+import org.eclipse.e4.ui.model.application.ui.MElementContainer;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
+import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jface.action.ToolBarManager;
+
+public class ToolBarContributionRecord {
+ MToolBar toolbarModel;
+ MToolBarContribution toolbarContribution;
+ ArrayList<MToolBarElement> generatedElements = new ArrayList<MToolBarElement>();
+ HashSet<MToolBarElement> sharedElements = new HashSet<MToolBarElement>();
+ ToolBarManagerRenderer renderer;
+ boolean isVisible = true;
+
+ public ToolBarContributionRecord(MToolBar model,
+ MToolBarContribution contribution, ToolBarManagerRenderer renderer) {
+ this.toolbarModel = model;
+ this.toolbarContribution = contribution;
+ this.renderer = renderer;
+ }
+
+ public ToolBarManager getManagerForModel() {
+ return renderer.getManager(toolbarModel);
+ }
+
+ /**
+ * @param context
+ */
+ public void updateVisibility(IEclipseContext context) {
+ ExpressionContext exprContext = new ExpressionContext(context);
+ updateIsVisible(exprContext);
+ HashSet<ToolBarContributionRecord> recentlyUpdated = new HashSet<ToolBarContributionRecord>();
+ recentlyUpdated.add(this);
+ for (MToolBarElement item : generatedElements) {
+ boolean currentVisibility = computeVisibility(recentlyUpdated,
+ item, exprContext);
+ item.setVisible(currentVisibility);
+ }
+ for (MToolBarElement item : sharedElements) {
+ boolean currentVisibility = computeVisibility(recentlyUpdated,
+ item, exprContext);
+ item.setVisible(currentVisibility);
+ }
+ getManagerForModel().markDirty();
+ }
+
+ public void updateIsVisible(ExpressionContext exprContext) {
+ isVisible = ContributionsAnalyzer.isVisible(toolbarContribution,
+ exprContext);
+ }
+
+ public boolean computeVisibility(
+ HashSet<ToolBarContributionRecord> recentlyUpdated,
+ MToolBarElement item, ExpressionContext exprContext) {
+ boolean currentVisibility = isVisible;
+ if (item instanceof MToolBarSeparator) {
+ ArrayList<ToolBarContributionRecord> list = renderer.getList(item);
+ if (list != null) {
+ Iterator<ToolBarContributionRecord> cr = list.iterator();
+ while (!currentVisibility && cr.hasNext()) {
+ ToolBarContributionRecord rec = cr.next();
+ if (!recentlyUpdated.contains(rec)) {
+ rec.updateIsVisible(exprContext);
+ recentlyUpdated.add(rec);
+ }
+ currentVisibility |= rec.isVisible;
+ }
+ }
+ }
+ if (currentVisibility
+ && item.getVisibleWhen() instanceof MCoreExpression) {
+ boolean val = ContributionsAnalyzer.isVisible(
+ (MCoreExpression) item.getVisibleWhen(), exprContext);
+ currentVisibility = val;
+ }
+ return currentVisibility;
+ }
+
+ public boolean anyVisibleWhen() {
+ if (toolbarContribution.getVisibleWhen() != null) {
+ return true;
+ }
+ for (MToolBarElement child : toolbarContribution.getChildren()) {
+ if (child.getVisibleWhen() != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean mergeIntoModel() {
+ int idx = getIndex(toolbarModel,
+ toolbarContribution.getPositionInParent());
+ if (idx == -1) {
+ return false;
+ }
+
+ for (MToolBarElement item : toolbarContribution.getChildren()) {
+ MToolBarElement copy = (MToolBarElement) EcoreUtil
+ .copy((EObject) item);
+ if (copy instanceof MToolBarSeparator) {
+ MToolBarSeparator shared = findExistingSeparator(copy
+ .getElementId());
+ if (shared == null) {
+ shared = (MToolBarSeparator) copy;
+ renderer.linkElementToContributionRecord(copy, this);
+ toolbarModel.getChildren().add(idx++, copy);
+ } else {
+ copy = shared;
+ }
+ sharedElements.add(shared);
+ } else {
+ generatedElements.add(copy);
+ renderer.linkElementToContributionRecord(copy, this);
+ toolbarModel.getChildren().add(idx++, copy);
+ }
+ if (copy instanceof MToolBarSeparator) {
+ ArrayList<ToolBarContributionRecord> array = renderer
+ .getList(copy);
+ array.add(this);
+ }
+ }
+ return true;
+ }
+
+ MToolBarSeparator findExistingSeparator(String id) {
+ if (id == null) {
+ return null;
+ }
+ for (MToolBarElement item : toolbarModel.getChildren()) {
+ if (item instanceof MToolBarSeparator
+ && id.equals(item.getElementId())) {
+ return (MToolBarSeparator) item;
+ }
+ }
+ return null;
+ }
+
+ public void dispose() {
+ for (MToolBarElement copy : generatedElements) {
+ toolbarModel.getChildren().remove(copy);
+ }
+ for (MToolBarElement shared : sharedElements) {
+ ArrayList<ToolBarContributionRecord> array = renderer
+ .getList(shared);
+ array.remove(this);
+ if (array.isEmpty()) {
+ toolbarModel.getChildren().remove(shared);
+ }
+ }
+ }
+
+ private static int getIndex(MElementContainer<?> model,
+ String positionInParent) {
+ String id = null;
+ String modifier = null;
+ if (positionInParent != null && positionInParent.length() > 0) {
+ String[] array = positionInParent.split("="); //$NON-NLS-1$
+ modifier = array[0];
+ id = array[1];
+ }
+ if (id == null) {
+ return model.getChildren().size();
+ }
+
+ int idx = 0;
+ int size = model.getChildren().size();
+ while (idx < size) {
+ if (id.equals(model.getChildren().get(idx).getElementId())) {
+ if ("after".equals(modifier)) { //$NON-NLS-1$
+ idx++;
+ }
+ return idx;
+ }
+ idx++;
+ }
+ return id.equals("additions") ? model.getChildren().size() : -1; //$NON-NLS-1$
+ }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java
index be7e7f1..f23a271 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java
@@ -11,8 +11,8 @@
package org.eclipse.e4.ui.workbench.renderers.swt;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
@@ -41,13 +41,12 @@
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
-import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.action.AbstractGroupMarker;
import org.eclipse.jface.action.ContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.layout.RowLayoutFactory;
@@ -78,18 +77,24 @@
*/
public class ToolBarManagerRenderer extends SWTPartRenderer {
+ private static final String TOOL_BAR_MANAGER_RENDERER_VIEW_MENU = "ToolBarManagerRenderer.viewMenu"; //$NON-NLS-1$
+ private static final String TOOL_BAR_MANAGER_RENDERER_DRAG_HANDLE = "ToolBarManagerRenderer.dragHandle"; //$NON-NLS-1$
private Map<MToolBar, ToolBarManager> modelToManager = new HashMap<MToolBar, ToolBarManager>();
private Map<ToolBarManager, MToolBar> managerToModel = new HashMap<ToolBarManager, MToolBar>();
private Map<MToolBarElement, IContributionItem> modelToContribution = new HashMap<MToolBarElement, IContributionItem>();
+ private Map<IContributionItem, MToolBarElement> contributionToModel = new HashMap<IContributionItem, MToolBarElement>();
- private ArrayList<ContributionRecord> contributionRecords = new ArrayList<ContributionRecord>();
+ private Map<MToolBarElement, ToolBarContributionRecord> modelContributionToRecord = new HashMap<MToolBarElement, ToolBarContributionRecord>();
+
+ private Map<MToolBarElement, ArrayList<ToolBarContributionRecord>> sharedElementToRecord = new HashMap<MToolBarElement, ArrayList<ToolBarContributionRecord>>();
// @Inject
// private Logger logger;
@Inject
- IPresentationEngine renderer;
+ private IPresentationEngine renderer;
+
@Inject
private MApplication application;
@Inject
@@ -218,8 +223,10 @@
eventBroker
.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
UIEvents.Item.ENABLED), enabledUpdater);
- eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC,
- UIEvents.UIElement.TOBERENDERED), toBeRenderedUpdater);
+ eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC),
+ toBeRenderedUpdater);
+
+ context.set(ToolBarManagerRenderer.class, this);
}
@@ -243,15 +250,65 @@
if (!(element instanceof MToolBar) || !(parent instanceof Composite))
return null;
- // HACK!! This should be done using a separate renderer
- Composite intermediate = new Composite((Composite) parent, SWT.NONE);
- createToolbar(element, intermediate);
- processContribution((MToolBar) element);
-
+ final MToolBar toolbarModel = (MToolBar) element;
+ Composite intermediate = createIntermediate(toolbarModel,
+ (Composite) parent);
+ createToolbar(toolbarModel, intermediate);
+ setupMenuButton(toolbarModel, intermediate);
+ processContribution(toolbarModel);
return intermediate;
}
/**
+ * @param toolbarModel
+ * @param intermediate
+ */
+ private void setupMenuButton(MToolBar toolbarModel, Composite intermediate) {
+ if (needsViewMenu(toolbarModel)) {
+ MPart part = (MPart) ((EObject) toolbarModel).eContainer();
+ MMenu viewMenu = getViewMenu(part);
+
+ // View menu (if any)
+ if (viewMenu != null) {
+ addMenuButton(part, intermediate, viewMenu);
+ }
+ }
+ }
+
+ /**
+ * @param toolbarModel
+ * @param parent
+ * @return an intermediate composite or simply the parent.
+ */
+ private Composite createIntermediate(MToolBar toolbarModel, Composite parent) {
+ Composite intermediate = new Composite((Composite) parent, SWT.NONE);
+ intermediate.setData(AbstractPartRenderer.OWNING_ME, toolbarModel);
+ int orientation = getOrientation(toolbarModel);
+ RowLayout layout = RowLayoutFactory.fillDefaults().wrap(false)
+ .spacing(0).type(orientation).create();
+ layout.marginLeft = 3;
+ layout.center = true;
+ intermediate.setLayout(layout);
+ if (needsDragHandle(toolbarModel)) {
+ ToolBar separatorToolBar = new ToolBar(intermediate, orientation
+ | SWT.WRAP | SWT.FLAT | SWT.RIGHT);
+ separatorToolBar.setData(TOOL_BAR_MANAGER_RENDERER_DRAG_HANDLE);
+ new ToolItem(separatorToolBar, SWT.SEPARATOR);
+ }
+ return intermediate;
+ }
+
+ private boolean needsDragHandle(MToolBar toolbarModel) {
+ return toolbarModel != null
+ && ((EObject) toolbarModel).eContainer() instanceof MTrimBar;
+ }
+
+ private boolean needsViewMenu(MToolBar toolbarModel) {
+ return toolbarModel != null
+ && ((EObject) toolbarModel).eContainer() instanceof MPart;
+ }
+
+ /**
* @param element
*/
private void processContribution(MToolBar toolbarModel) {
@@ -268,13 +325,6 @@
*/
private void generateContributions(MToolBar toolbarModel,
ArrayList<MToolBarContribution> toContribute) {
- HashSet<String> existingSeparatorNames = new HashSet<String>();
- for (MToolBarElement child : toolbarModel.getChildren()) {
- String elementId = child.getElementId();
- if (child instanceof MToolBarSeparator && elementId != null) {
- existingSeparatorNames.add(elementId);
- }
- }
ToolBarManager manager = getManager(toolbarModel);
boolean done = toContribute.size() == 0;
@@ -285,8 +335,7 @@
toContribute.clear();
for (final MToolBarContribution contribution : curList) {
- if (!processAddition(toolbarModel, manager, contribution,
- existingSeparatorNames)) {
+ if (!processAddition(toolbarModel, manager, contribution)) {
toContribute.add(contribution);
}
}
@@ -297,44 +346,6 @@
}
}
- static class ContributionRecord {
- public ContributionRecord(MToolBar toolbarModel,
- MToolBarContribution contribution, ToolBarManager manager) {
- this.toolbarModel = toolbarModel;
- this.contribution = contribution;
- this.manager = manager;
- }
-
- MToolBar toolbarModel;
- MToolBarContribution contribution;
- ToolBarManager manager;
- ArrayList<MToolBarElement> generatedElements = new ArrayList<MToolBarElement>();
-
- public void generate() {
- for (MToolBarElement element : contribution.getChildren()) {
- MToolBarElement copy = (MToolBarElement) EcoreUtil
- .copy((EObject) element);
- generatedElements.add(copy);
- }
- }
-
- public void updateVisibility(IEclipseContext context) {
- ExpressionContext exprContext = new ExpressionContext(context);
- boolean isVisible = ContributionsAnalyzer.isVisible(contribution,
- exprContext);
- for (MToolBarElement item : generatedElements) {
- item.setVisible(isVisible);
- }
- manager.markDirty();
- }
-
- public void dispose() {
- for (MToolBarElement copy : generatedElements) {
- toolbarModel.getChildren().remove(copy);
- }
- }
- }
-
/**
* @param toolbarModel
* @param manager
@@ -343,36 +354,20 @@
* @return <code>true</code> if the contribution was successfuly processed
*/
private boolean processAddition(MToolBar toolbarModel,
- final ToolBarManager manager, MToolBarContribution contribution,
- HashSet<String> existingSeparatorNames) {
- int idx = getIndex(toolbarModel, contribution.getPositionInParent());
- if (idx == -1) {
+ final ToolBarManager manager, MToolBarContribution contribution) {
+ final ToolBarContributionRecord record = new ToolBarContributionRecord(
+ toolbarModel, contribution, this);
+ if (!record.mergeIntoModel()) {
return false;
}
- final ContributionRecord record = new ContributionRecord(toolbarModel,
- contribution, manager);
- contributionRecords.add(record);
- record.generate();
- for (MToolBarElement copy : record.generatedElements) {
- if (copy instanceof MToolBarSeparator
- && existingSeparatorNames.contains(copy.getElementId())) {
- // skip this, it's already there
- continue;
- }
- toolbarModel.getChildren().add(idx++, copy);
- if (copy instanceof MToolBarSeparator
- && copy.getElementId() != null) {
- existingSeparatorNames.add(copy.getElementId());
- }
- }
- if (contribution.getVisibleWhen() != null) {
+ if (record.anyVisibleWhen()) {
final IEclipseContext parentContext = modelService
.getContainingContext(toolbarModel);
parentContext.runAndTrack(new RunAndTrack() {
@Override
public boolean changed(IEclipseContext context) {
record.updateVisibility(parentContext.getActiveLeaf());
- manager.update(false);
+ manager.update(true);
return true;
}
});
@@ -381,54 +376,16 @@
return true;
}
- private static int getIndex(MElementContainer<?> menuModel,
- String positionInParent) {
- String id = null;
- String modifier = null;
- if (positionInParent != null && positionInParent.length() > 0) {
- String[] array = positionInParent.split("="); //$NON-NLS-1$
- modifier = array[0];
- id = array[1];
- }
- if (id == null) {
- return menuModel.getChildren().size();
- }
-
- int idx = 0;
- int size = menuModel.getChildren().size();
- while (idx < size) {
- if (id.equals(menuModel.getChildren().get(idx).getElementId())) {
- if ("after".equals(modifier)) { //$NON-NLS-1$
- idx++;
- }
- return idx;
- }
- idx++;
- }
- return id.equals("additions") ? menuModel.getChildren().size() : -1; //$NON-NLS-1$
- }
-
- private ToolBar createToolbar(final MUIElement element,
- Composite intermediate) {
+ private ToolBar createToolbar(final MUIElement element, Composite parent) {
int orientation = getOrientation(element);
- RowLayout layout = RowLayoutFactory.fillDefaults().wrap(false)
- .spacing(0).type(orientation).create();
- layout.marginLeft = 3;
- layout.center = true;
- intermediate.setLayout(layout);
- // new Label(intermediate, (orientation == SWT.HORIZONTAL ? SWT.VERTICAL
- // : SWT.HORIZONTAL) | SWT.SEPARATOR);
- ToolBar separatorToolBar = new ToolBar(intermediate, orientation
- | SWT.WRAP | SWT.FLAT | SWT.RIGHT);
- new ToolItem(separatorToolBar, SWT.SEPARATOR);
ToolBarManager manager = getManager((MToolBar) element);
if (manager == null) {
manager = new ToolBarManager(orientation | SWT.WRAP | SWT.FLAT
| SWT.RIGHT);
linkModelToManager((MToolBar) element, manager);
}
- ToolBar bar = manager.createControl(intermediate);
+ ToolBar bar = manager.createControl(parent);
bar.setData(manager);
bar.getShell().layout(new Control[] { bar }, SWT.DEFER);
bar.addDisposeListener(new DisposeListener() {
@@ -443,22 +400,34 @@
* @param element
*/
protected void cleanUp(MToolBar toolbarModel) {
- for (ContributionRecord record : contributionRecords
- .toArray(new ContributionRecord[contributionRecords.size()])) {
+ Collection<ToolBarContributionRecord> vals = modelContributionToRecord
+ .values();
+ for (ToolBarContributionRecord record : vals
+ .toArray(new ToolBarContributionRecord[vals.size()])) {
if (record.toolbarModel == toolbarModel) {
record.dispose();
- contributionRecords.remove(record);
for (MToolBarElement copy : record.generatedElements) {
- IContributionItem ici = modelToContribution.remove(copy);
- if (ici != null) {
- record.manager.remove(ici);
- }
+ cleanUpCopy(record, copy);
+ }
+ for (MToolBarElement copy : record.sharedElements) {
+ cleanUpCopy(record, copy);
}
record.generatedElements.clear();
+ record.sharedElements.clear();
}
}
}
+ public void cleanUpCopy(ToolBarContributionRecord record,
+ MToolBarElement copy) {
+ modelContributionToRecord.remove(copy);
+ IContributionItem ici = getContribution(copy);
+ clearModelToContribution(copy, ici);
+ if (ici != null) {
+ record.getManagerForModel().remove(ici);
+ }
+ }
+
int getOrientation(final MUIElement element) {
MUIElement theParent = element.getParent();
if (theParent instanceof MTrimBar) {
@@ -503,14 +472,7 @@
parentManager.update(false);
ToolBar tb = getToolbarFrom(container.getWidget());
- if (tb != null && ((EObject) container).eContainer() instanceof MPart) {
- MPart part = (MPart) ((EObject) container).eContainer();
- MMenu viewMenu = getViewMenu(part);
-
- // View menu (if any)
- if (viewMenu != null) {
- addMenuButton(part, tb, viewMenu);
- }
+ if (tb != null) {
tb.getShell().layout(new Control[] { tb }, SWT.DEFER);
}
}
@@ -527,19 +489,19 @@
Composite intermediate = (Composite) widget;
if (!intermediate.isDisposed()) {
Control[] children = intermediate.getChildren();
- int length = children.length;
- if (length > 0 && children[length - 1] instanceof ToolBar) {
- return (ToolBar) children[length - 1];
+ for (Control control : children) {
+ if (control.getData() instanceof ToolBarManager) {
+ return (ToolBar) control;
+ }
}
}
}
return null;
}
- /**
- * @param tb
- */
- private void addMenuButton(MPart part, ToolBar tb, MMenu menu) {
+ private void addMenuButton(MPart part, Composite intermediate, MMenu menu) {
+ ToolBar tb = new ToolBar(intermediate, SWT.FLAT | SWT.RIGHT);
+ tb.setData(TOOL_BAR_MANAGER_RENDERER_VIEW_MENU);
ToolItem ti = new ToolItem(tb, SWT.PUSH);
ti.setImage(getViewMenuImage());
ti.setHotImage(null);
@@ -564,10 +526,30 @@
protected void showMenu(ToolItem item) {
// Create the UI for the menu
final MMenu menuModel = (MMenu) item.getData("theMenu"); //$NON-NLS-1$
- MPart part = (MPart) item.getData("thePart"); //$NON-NLS-1$
- Control ctrl = (Control) part.getWidget();
- Menu menu = (Menu) renderer.createGui(menuModel, ctrl.getShell(),
- part.getContext());
+ Menu menu = null;
+ Object obj = menuModel.getWidget();
+ if (obj instanceof Menu) {
+ menu = (Menu) obj;
+ }
+ if (menu == null || menu.isDisposed()) {
+ MPart part = (MPart) item.getData("thePart"); //$NON-NLS-1$
+ Control ctrl = (Control) part.getWidget();
+ final Menu tmpMenu = (Menu) renderer.createGui(menuModel,
+ ctrl.getShell(), part.getContext());
+ menu = tmpMenu;
+ if (tmpMenu != null) {
+ ctrl.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ if (!tmpMenu.isDisposed()) {
+ tmpMenu.dispose();
+ }
+ }
+ });
+ }
+ }
+ if (menu == null) {
+ return;
+ }
// ...and Show it...
Rectangle ib = item.getBounds();
@@ -580,7 +562,12 @@
if (!display.readAndDispatch())
display.sleep();
}
- menu.dispose();
+ if (menu.getData() instanceof MenuManager) {
+ MenuManager manager = (MenuManager) menu.getData();
+ manager.dispose();
+ } else {
+ menu.dispose();
+ }
}
private Image getViewMenuImage() {
@@ -625,7 +612,7 @@
return viewMenuImage;
}
- private MMenu getViewMenu(MPart part) {
+ MMenu getViewMenu(MPart part) {
if (part.getMenus() == null) {
return null;
}
@@ -653,36 +640,46 @@
@Override
public void postProcess(MUIElement element) {
super.postProcess(element);
- // disposeToolbarIfNecessary(element);
+ disposeToolbarIfNecessary((MToolBar) element);
ToolBar tb = getToolbarFrom(element.getWidget());
if (tb != null && !tb.isDisposed()) {
- tb.getShell().layout(new Control[] { tb }, SWT.DEFER);
tb.setVisible(true);
+ tb.getShell().layout(new Control[] { tb }, SWT.DEFER);
}
}
- public Object getUIContainer(MUIElement childElement) {
- if (childElement.getWidget() instanceof ToolBar) {
- return childElement.getWidget();
+ /**
+ * @param element
+ */
+ private void disposeToolbarIfNecessary(MToolBar element) {
+ ToolBar tb = getToolbarFrom(element.getWidget());
+ Composite parent = null;
+ if (tb != null) {
+ parent = tb.getParent();
}
-
- Object obj = super.getUIContainer(childElement);
- if (obj instanceof ToolBar) {
- return obj;
+ boolean cleanUp = tb == null || tb.isDisposed();
+ if (!cleanUp) {
+ cleanUp = tb.getItemCount() == 0 || hasOnlySeparators(tb);
}
-
- if (obj instanceof Composite) {
- Composite intermediate = (Composite) obj;
- if (intermediate == null || intermediate.isDisposed()) {
- return null;
+ if (cleanUp) {
+ if (tb != null && !tb.isDisposed()) {
+ tb.dispose();
}
- ToolBar toolbar = getToolbarFrom(intermediate);
- if (toolbar == null) {
- toolbar = createToolbar(childElement.getParent(), intermediate);
+ if (parent != null) {
+ for (Control child : parent.getChildren()) {
+ if (TOOL_BAR_MANAGER_RENDERER_DRAG_HANDLE.equals(child
+ .getData())) {
+ child.dispose();
+ } else if (TOOL_BAR_MANAGER_RENDERER_VIEW_MENU.equals(child
+ .getData()) && !needsViewMenu(element)) {
+ child.dispose();
+ }
+ }
+ if (parent.getChildren().length == 0) {
+ parent.dispose();
+ }
}
- return toolbar;
}
- return null;
}
@Override
@@ -721,6 +718,27 @@
}
}
+ public Object getUIContainer(MUIElement childElement) {
+ Composite intermediate = (Composite) super.getUIContainer(childElement);
+ if (intermediate == null || intermediate.isDisposed()) {
+ return null;
+ }
+ ToolBar toolbar = findToolbar(intermediate);
+ if (toolbar == null) {
+ toolbar = createToolbar(childElement.getParent(), intermediate);
+ }
+ return toolbar;
+ }
+
+ private ToolBar findToolbar(Composite intermediate) {
+ for (Control child : intermediate.getChildren()) {
+ if (child.getData() instanceof ToolBarManager) {
+ return (ToolBar) child;
+ }
+ }
+ return null;
+ }
+
/**
* @param parentManager
* @param childME
@@ -757,7 +775,8 @@
marker = new GroupMarker(itemModel.getElementId());
}
}
- parentManager.add(marker);
+ addToManager(parentManager, itemModel, marker);
+ linkModelToContribution(itemModel, marker);
}
/**
@@ -770,8 +789,9 @@
ToolControlContribution ci = ContextInjectionFactory.make(
ToolControlContribution.class, lclContext);
ci.setModel(itemModel);
- parentManager.add(ci);
- modelToContribution.put(itemModel, ci);
+ ci.setVisible(itemModel.isVisible());
+ addToManager(parentManager, itemModel, ci);
+ linkModelToContribution(itemModel, ci);
}
/**
@@ -784,8 +804,9 @@
DirectContributionItem ci = ContextInjectionFactory.make(
DirectContributionItem.class, lclContext);
ci.setModel(itemModel);
- parentManager.add(ci);
- modelToContribution.put(itemModel, ci);
+ ci.setVisible(itemModel.isVisible());
+ addToManager(parentManager, itemModel, ci);
+ linkModelToContribution(itemModel, ci);
}
/**
@@ -794,12 +815,39 @@
*/
private void processHandledItem(ToolBarManager parentManager,
MHandledToolItem itemModel) {
+ IContributionItem ici = getContribution(itemModel);
+ if (ici != null) {
+ return;
+ }
final IEclipseContext lclContext = getContext(itemModel);
HandledContributionItem ci = ContextInjectionFactory.make(
HandledContributionItem.class, lclContext);
ci.setModel(itemModel);
- parentManager.add(ci);
- modelToContribution.put(itemModel, ci);
+ ci.setVisible(itemModel.isVisible());
+ addToManager(parentManager, itemModel, ci);
+ linkModelToContribution(itemModel, ci);
+ }
+
+ /**
+ * @param parentManager
+ * @param itemModel
+ * @param ci
+ */
+ private void addToManager(ToolBarManager parentManager,
+ MToolBarElement model, IContributionItem ci) {
+ MElementContainer<MUIElement> parent = model.getParent();
+ // technically this shouldn't happen
+ if (parent == null) {
+ parentManager.add(ci);
+ } else {
+ int index = parent.getChildren().indexOf(model);
+ // shouldn't be -1, but better safe than sorry
+ if (index > parentManager.getSize() || index == -1) {
+ parentManager.add(ci);
+ } else {
+ parentManager.insert(index, ci);
+ }
+ }
}
public ToolBarManager getManager(MToolBar model) {
@@ -823,4 +871,41 @@
public IContributionItem getContribution(MToolBarElement element) {
return modelToContribution.get(element);
}
+
+ public MToolBarElement getToolElement(IContributionItem item) {
+ return contributionToModel.get(item);
+ }
+
+ public void linkModelToContribution(MToolBarElement model,
+ IContributionItem item) {
+ modelToContribution.put(model, item);
+ contributionToModel.put(item, model);
+ }
+
+ public void clearModelToContribution(MToolBarElement model,
+ IContributionItem item) {
+ modelToContribution.remove(model);
+ contributionToModel.remove(item);
+ }
+
+ public ArrayList<ToolBarContributionRecord> getList(MToolBarElement item) {
+ ArrayList<ToolBarContributionRecord> tmp = sharedElementToRecord
+ .get(item);
+ if (tmp == null) {
+ tmp = new ArrayList<ToolBarContributionRecord>();
+ sharedElementToRecord.put(item, tmp);
+ }
+ return tmp;
+ }
+
+ public void linkElementToContributionRecord(MToolBarElement element,
+ ToolBarContributionRecord record) {
+ modelContributionToRecord.put(element, record);
+ }
+
+ public ToolBarContributionRecord getContributionRecord(
+ MToolBarElement element) {
+ return modelContributionToRecord.get(element);
+ }
+
}
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java
index 094661e..2eb48ff 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java
@@ -26,6 +26,7 @@
import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.e4.ui.model.application.ui.menu.MTrimContribution;
+import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
@@ -120,6 +121,7 @@
default:
return null;
}
+ processContents(trimModel);
result.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
cleanUp(trimModel);
@@ -128,6 +130,19 @@
return result;
}
+ /**
+ * @param trimModel
+ */
+ private void processContents(MTrimBar trimModel) {
+ IEclipseContext ctx = getContext(trimModel);
+ ExpressionContext eContext = new ExpressionContext(ctx);
+ ArrayList<MTrimContribution> toContribute = new ArrayList<MTrimContribution>();
+ ContributionsAnalyzer.gatherTrimContributions(trimModel,
+ application.getTrimContributions(), trimModel.getElementId(),
+ toContribute, eContext);
+ addTrimContributions(trimModel, toContribute, ctx, eContext);
+ }
+
@Override
public void hideChild(MElementContainer<MUIElement> parentElement,
MUIElement child) {
@@ -145,19 +160,25 @@
* (org.eclipse.e4.ui.model.application.MPart)
*/
@Override
- public void processContents(MElementContainer<MUIElement> me) {
- if (!(((MUIElement) me) instanceof MTrimBar))
+ public void processContents(MElementContainer<MUIElement> container) {
+ if (!(((MUIElement) container) instanceof MTrimBar))
return;
- super.processContents(me);
- IEclipseContext ctx = getContext(me);
- ExpressionContext eContext = new ExpressionContext(ctx);
- MElementContainer<?> trimObj = me;
- MTrimBar trimModel = (MTrimBar) trimObj;
- ArrayList<MTrimContribution> toContribute = new ArrayList<MTrimContribution>();
- ContributionsAnalyzer.gatherTrimContributions(trimModel,
- application.getTrimContributions(), trimModel.getElementId(),
- toContribute, eContext);
- addTrimContributions(trimModel, toContribute, ctx, eContext);
+
+ // Process any contents of the newly created ME
+ List<MUIElement> parts = container.getChildren();
+ if (parts != null) {
+ // loading a legacy app will add children to the window while it is
+ // being rendered.
+ // this is *not* the correct place for this
+ // hope that the ADD event will pick up the new part.
+ IPresentationEngine renderer = (IPresentationEngine) context
+ .get(IPresentationEngine.class.getName());
+ MUIElement[] plist = parts.toArray(new MUIElement[parts.size()]);
+ for (int i = 0; i < plist.length; i++) {
+ MUIElement childME = plist[i];
+ renderer.createGui(childME);
+ }
+ }
}
private void addTrimContributions(final MTrimBar trimModel,
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java
index e59a869..88a8d1e 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java
@@ -20,15 +20,14 @@
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
public class WorkbenchRendererFactory implements IRendererFactory {
private AreaRenderer areaRenderer;
private MenuManagerRenderer menuRenderer;
- private ToolBarRenderer toolbarRenderer;
- private ToolItemRenderer toolItemRenderer;
+ private ToolBarManagerRenderer toolbarRenderer;
+ // private ToolItemRenderer toolItemRenderer;
private SeparatorRenderer separatorRenderer;
private ContributedPartRenderer contributedPartRenderer;
private ElementReferenceRenderer elementRefRenderer;
@@ -70,16 +69,10 @@
return renderedToolbarRenderer;
} else if (uiElement instanceof MToolBar) {
if (toolbarRenderer == null) {
- toolbarRenderer = new ToolBarRenderer();
+ toolbarRenderer = new ToolBarManagerRenderer();
initRenderer(toolbarRenderer);
}
return toolbarRenderer;
- } else if (uiElement instanceof MToolItem) {
- if (toolItemRenderer == null) {
- toolItemRenderer = new ToolItemRenderer();
- initRenderer(toolItemRenderer);
- }
- return toolItemRenderer;
} else if (uiElement instanceof MMenuSeparator
|| uiElement instanceof MToolBarSeparator) {
if (separatorRenderer == null) {
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java
index 18505de..97e2116 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java
@@ -917,6 +917,7 @@
} else if (item instanceof AbstractGroupMarker) {
MToolBarSeparator separator = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
separator.setToBeRendered(item.isVisible());
+ separator.setVisible(item.isVisible());
separator.setElementId(item.getId());
container.getChildren().add(separator);
} else if (item instanceof ActionContributionItem) {
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml b/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml
index deb81ec..8e6694b 100644
--- a/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml
+++ b/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml
@@ -67,6 +67,22 @@
style="push">
</command>
</menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.ui.workbench.file?after=additions">
+ <command
+ commandId="org.eclipse.e4.ui.menu.tests.commandOne"
+ style="push">
+ </command>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.ui.workbench.file?after=print.ext">
+ <command
+ commandId="org.eclipse.e4.ui.menu.tests.commandTwo"
+ style="push">
+ </command>
+ </menuContribution>
</extension>
</plugin>
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml b/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml
index e7a03e9..8fda429 100644
--- a/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml
+++ b/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml
@@ -131,4 +131,19 @@
</actionSet>
</extension>
+ <extension
+ point="org.eclipse.ui.actionSets">
+ <actionSet
+ id="org.eclipse.e4.ui.menu.tests.p3.toolSet"
+ label="ToolActionSet"
+ visible="true">
+ <action
+ class="org.eclipse.e4.ui.menu.tests.p3.TestActionDelegate"
+ id="org.eclipse.e4.ui.menu.tests.p3.toolAction1"
+ label="ToolActionOne"
+ style="push"
+ toolbarPath="org.eclipse.ui.workbench.file/save.group">
+ </action>
+ </actionSet>
+ </extension>
</plugin>
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p3/src/org/eclipse/e4/ui/menu/tests/p3/TestActionDelegate.java b/tests/org.eclipse.e4.ui.menu.tests.p3/src/org/eclipse/e4/ui/menu/tests/p3/TestActionDelegate.java
new file mode 100644
index 0000000..1a22771
--- /dev/null
+++ b/tests/org.eclipse.e4.ui.menu.tests.p3/src/org/eclipse/e4/ui/menu/tests/p3/TestActionDelegate.java
@@ -0,0 +1,12 @@
+package org.eclipse.e4.ui.menu.tests.p3;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.actions.ActionDelegate;
+
+
+public class TestActionDelegate extends ActionDelegate {
+ @Override
+ public void runWithEvent(IAction action, Event event) {
+ System.out.println("runWithEvent");
+ }
+}
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml b/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml
index 0f1c35b..9729a59 100644
--- a/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml
+++ b/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml
@@ -93,6 +93,32 @@
</visibleWhen>
</command>
</menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="toolbar:org.eclipse.ui.workbench.file?after=print.ext">
+ <command
+ commandId="org.eclipse.e4.ui.menu.tests.commandOne"
+ id="p4.invisible.commandOne"
+ label="Invisible Command One"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="selection">
+ <count
+ value="1">
+ </count>
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <equals
+ value="show.p4.invisible.commandOne">
+ </equals>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
</extension>
</plugin>
diff --git a/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs
index 129b1f4..bdad8a9 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs
+++ b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,15 @@
-#Wed Jan 26 10:07:53 EST 2011
+#Tue Mar 01 09:23:04 EST 2011
eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
diff --git a/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..3a8980c
--- /dev/null
+++ b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,112 @@
+#Tue Mar 01 09:23:04 EST 2011
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=false
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=true
+sp_cleanup.sort_members_all=true
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java
index 000f4de..5e447ca 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java
@@ -8,12 +8,21 @@
*/
public class Activator extends AbstractUIPlugin {
+ // The shared instance
+ private static Activator plugin;
+
// The plug-in ID
public static final String PLUGIN_ID = "org.eclipse.e4.ui.menu.tests"; //$NON-NLS-1$
- // The shared instance
- private static Activator plugin;
-
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
/**
* The constructor
*/
@@ -22,7 +31,10 @@
/*
* (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ *
+ * @see
+ * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
+ * )
*/
public void start(BundleContext context) throws Exception {
super.start(context);
@@ -31,20 +43,14 @@
/*
* (non-Javadoc)
- * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ *
+ * @see
+ * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
+ * )
*/
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
- /**
- * Returns the shared instance
- *
- * @return the shared instance
- */
- public static Activator getDefault() {
- return plugin;
- }
-
}
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java
index 19c24f0..2bb2e84 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java
@@ -22,26 +22,26 @@
class CmdService implements ICommandService {
private Category category;
-
+
@Inject
private CommandManager manager;
-
+
@Override
public void addExecutionListener(IExecutionListener listener) {
// TODO Auto-generated method stub
-
+
}
-
+
@Override
public void defineUncategorizedCategory(String name, String description) {
// TODO Auto-generated method stub
-
+
}
@Override
public ParameterizedCommand deserialize(
- String serializedParameterizedCommand)
- throws NotDefinedException, SerializationException {
+ String serializedParameterizedCommand) throws NotDefinedException,
+ SerializationException {
// TODO Auto-generated method stub
return null;
}
@@ -49,7 +49,7 @@
@Override
public void dispose() {
// TODO Auto-generated method stub
-
+
}
@Override
@@ -97,15 +97,13 @@
}
@Override
- public String getHelpContextId(Command command)
- throws NotDefinedException {
+ public String getHelpContextId(Command command) throws NotDefinedException {
// TODO Auto-generated method stub
return null;
}
@Override
- public String getHelpContextId(String commandId)
- throws NotDefinedException {
+ public String getHelpContextId(String commandId) throws NotDefinedException {
// TODO Auto-generated method stub
return null;
}
@@ -124,19 +122,19 @@
@Override
public void readRegistry() {
// TODO Auto-generated method stub
-
+
}
@Override
public void refreshElements(String commandId, Map filter) {
// TODO Auto-generated method stub
-
+
}
@Override
public void registerElement(IElementReference elementReference) {
// TODO Auto-generated method stub
-
+
}
@Override
@@ -150,19 +148,19 @@
@Override
public void removeExecutionListener(IExecutionListener listener) {
// TODO Auto-generated method stub
-
+
}
@Override
public void setHelpContextId(IHandler handler, String helpContextId) {
// TODO Auto-generated method stub
-
+
}
@Override
public void unregisterElement(IElementReference elementReference) {
// TODO Auto-generated method stub
-
+
}
-
+
}
\ No newline at end of file
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java
index 6c371aa..22b529d 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java
@@ -1,74 +1,49 @@
package org.eclipse.e4.ui.menu.tests;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.util.List;
import junit.framework.TestCase;
-import org.eclipse.core.commands.contexts.Context;
import org.eclipse.e4.core.commands.CommandServiceAddon;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.bindings.BindingServiceAddon;
import org.eclipse.e4.ui.internal.workbench.E4Workbench;
-import org.eclipse.e4.ui.internal.workbench.UIEventPublisher;
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
import org.eclipse.e4.ui.model.application.MApplication;
-import org.eclipse.e4.ui.model.application.commands.MBindingContext;
import org.eclipse.e4.ui.model.application.commands.MCommand;
import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
-import org.eclipse.e4.ui.model.application.ui.MUILabel;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
import org.eclipse.e4.ui.model.application.ui.impl.UiFactoryImpl;
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
-import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
-import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
-import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
-import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
import org.eclipse.e4.ui.services.ContextServiceAddon;
import org.eclipse.e4.ui.services.EContextService;
-import org.eclipse.e4.ui.workbench.IResourceUtilities;
import org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord;
import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer;
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
-import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.equinox.log.Logger;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.commands.ICommandImageService;
-import org.eclipse.ui.internal.commands.CommandImageManager;
-import org.eclipse.ui.internal.commands.CommandImageService;
import org.eclipse.ui.internal.menus.MenuPersistence;
-import org.osgi.framework.ServiceReference;
public class MMenuItemTest extends TestCase {
@@ -146,76 +121,6 @@
return (MenuManagerRenderer) renderer;
}
- private void printContributions(MApplication application) {
- for (MMenuContribution mc : application.getMenuContributions()) {
- System.out.print("\n\nMC: " + mc.getParentId() + "?"
- + mc.getPositionInParent());
- printMenuOut(1, mc);
- }
-
- for (MToolBarContribution tbc : application.getToolBarContributions()) {
- System.out.print("\n\nTC: " + tbc.getParentId() + "?"
- + tbc.getPositionInParent());
- printToolOut(1, tbc);
- }
- }
-
- private void printIcon(int level, MUILabel item) {
- printTabs(level + 2);
- System.out.print("icon: " + item.getIconURI());
- }
-
- private void printMenuOut(int level,
- MElementContainer<MMenuElement> container) {
- for (MMenuElement child : container.getChildren()) {
- printTabs(level);
- System.out.print(child.getClass().getSimpleName() + ": "
- + child.getElementId());
- if (child instanceof MMenu) {
- printMenuOut(level + 1, (MElementContainer<MMenuElement>) child);
- } else if (child instanceof MHandledMenuItem) {
- System.out.print(": cmd "
- + ((MHandledMenuItem) child).getCommand()
- .getElementId());
- printIcon(level, (MUILabel) child);
- } else if (child instanceof MDirectMenuItem) {
- System.out.print(": cmd "
- + ((MDirectMenuItem) child).getContributionURI());
- printIcon(level, (MUILabel) child);
- } else if (child instanceof MMenuSeparator) {
- System.out.print(": label "
- + ((MMenuSeparator) child).getLabel());
- }
- }
- }
-
- private void printTabs(int level) {
- System.out.print("\n");
- for (int i = 0; i < level; i++) {
- System.out.print(" ");
- }
- }
-
- private void printToolOut(int level, MToolBarContribution tbc) {
- for (MToolBarElement child : tbc.getChildren()) {
- printTabs(level);
- System.out.print(child.getClass().getSimpleName() + ": "
- + child.getElementId());
- if (child instanceof MDirectToolItem) {
- System.out.print(": cmd "
- + ((MDirectToolItem) child).getContributionURI());
- printIcon(level, (MUILabel) child);
- } else if (child instanceof MHandledToolItem) {
- System.out.print(": cmd "
- + ((MHandledToolItem) child).getCommand()
- .getElementId());
- printIcon(level, (MUILabel) child);
- } else if (child instanceof MToolBarSeparator) {
- System.out.print(": separator ");
- }
- }
- }
-
@Override
protected void setUp() throws Exception {
appContext = E4Application.createDefaultContext();
@@ -408,7 +313,7 @@
MenuPersistence mp = new MenuPersistence(application, appContext,
"org.eclipse.e4.ui.menu.tests.p3");
mp.reRead();
- printContributions(application);
+ // printContributions(application);
// render the main menu bar
Shell shell = new Shell();
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java
index 4b57d82..14221f1 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java
@@ -11,18 +11,30 @@
import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
+import org.eclipse.e4.ui.model.application.ui.MElementContainer;
+import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
+import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
-import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
import org.eclipse.e4.ui.services.ContextServiceAddon;
-import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer;
+import org.eclipse.e4.ui.services.EContextService;
+import org.eclipse.e4.ui.workbench.renderers.swt.DirectContributionItem;
+import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.internal.menus.MenuPersistence;
@@ -30,6 +42,15 @@
protected IEclipseContext appContext;
protected E4Workbench wb;
+ private ToolBar getToolBar(Composite intermediate) {
+ for (Control child : intermediate.getChildren()) {
+ if (child.getData() instanceof ToolBarManager) {
+ return (ToolBar) child;
+ }
+ }
+ return null;
+ }
+
@Override
protected void setUp() throws Exception {
appContext = E4Application.createDefaultContext();
@@ -48,24 +69,286 @@
appContext.dispose();
}
- public void testActionSetGeneration() throws Exception {
+ public void test01Children() throws Exception {
+ MToolBar toolbarModel = MenuFactoryImpl.eINSTANCE.createToolBar();
+ toolbarModel.setElementId("p2.tb1");
+
+ MToolBar toolbarModel2 = MenuFactoryImpl.eINSTANCE.createToolBar();
+ toolbarModel2.setElementId("p2.tb2");
+
+ MToolBarSeparator sep = MenuFactoryImpl.eINSTANCE
+ .createToolBarSeparator();
+ sep.setElementId("additions");
+ toolbarModel.getChildren().add(sep);
+ assertEquals(1, toolbarModel.getChildren().size());
+ assertEquals(0, toolbarModel2.getChildren().size());
+
+ toolbarModel2.getChildren().addAll(toolbarModel.getChildren());
+ assertEquals(0, toolbarModel.getChildren().size());
+ assertEquals(1, toolbarModel2.getChildren().size());
+ }
+
+ public void testActionSetAddedToFile() throws Exception {
MApplication application = TestUtil.setupRenderer(appContext);
-// MenuManagerRenderer renderer = appContext
-// .get(MenuManagerRenderer.class);
- MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(0);
+ // MenuManagerRenderer renderer = appContext
+ // .get(MenuManagerRenderer.class);
+ MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+ 0);
MTrimBar coolbar = window.getTrimBars().get(0);
assertNotNull(coolbar);
-
// setup structure for actionSet test
TestUtil.setupActionBuilderStructure(coolbar);
+ MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+ assertEquals(5, coolbar.getChildren().size());
+
+ // read in the relevant extensions.
+ MenuPersistence mp = new MenuPersistence(application, appContext,
+ "org.eclipse.e4.ui.menu.tests.p3");
+ mp.reRead();
+
+ ToolBarManagerRenderer renderer = appContext
+ .get(ToolBarManagerRenderer.class);
+ Shell shell = new Shell();
+ Composite parent = new Composite(shell, SWT.NONE);
+ Composite intermediate = (Composite) renderer
+ .createWidget(file, parent);
+
+ ToolBar toolbar = getToolBar(intermediate);
+ assertNotNull(toolbar);
+ Object obj = file;
+ renderer.processContents((MElementContainer<MUIElement>) obj);
+
+ ToolBarManager tbm = renderer.getManager(file);
+ assertNotNull(tbm);
+
+ IContributionItem[] tbItems = tbm.getItems();
+ assertEquals(12, tbItems.length);
+
+ IContributionItem actionSetAction = tbItems[2];
+ assertEquals("org.eclipse.e4.ui.menu.tests.p3.toolAction1",
+ actionSetAction.getId());
+ assertFalse(actionSetAction.isVisible());
+
+ IEclipseContext windowContext = window.getContext();
+ EContextService ecs = windowContext.get(EContextService.class);
+ ecs.activateContext("org.eclipse.e4.ui.menu.tests.p3.toolSet");
+ assertTrue(actionSetAction.isVisible());
+
+ ecs.deactivateContext("org.eclipse.e4.ui.menu.tests.p3.toolSet");
+ assertFalse(actionSetAction.isVisible());
+ }
+
+ public void testActionSetAddedToMyToolbar() throws Exception {
+ MApplication application = TestUtil.setupRenderer(appContext);
+ // MenuManagerRenderer renderer = appContext
+ // .get(MenuManagerRenderer.class);
+ MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+ 0);
+ MTrimBar coolbar = window.getTrimBars().get(0);
+ assertNotNull(coolbar);
+
+ // setup structure for actionSet test
+ TestUtil.setupActionBuilderStructure(coolbar);
+
+ int idx = 0;
+ for (MTrimElement child : coolbar.getChildren()) {
+ if (child.getElementId().equals("additions")) {
+ break;
+ }
+ idx++;
+ }
+
+ MToolBar toolbarModel = MenuFactoryImpl.eINSTANCE.createToolBar();
+ toolbarModel.setElementId("p2.tb1");
+ coolbar.getChildren().add(idx, toolbarModel);
+
// read in the relevant extensions.
MenuPersistence mp = new MenuPersistence(application, appContext,
"org.eclipse.e4.ui.menu.tests.p2");
mp.reRead();
-
- assertEquals(7, application.getToolBarContributions().size());
+
+ TestUtil.printContributions(application);
+
+ ToolBarManagerRenderer renderer = appContext
+ .get(ToolBarManagerRenderer.class);
+ Shell shell = new Shell();
+ Composite parent = new Composite(shell, SWT.NONE);
+ Composite intermediate = (Composite) renderer.createWidget(
+ toolbarModel, parent);
+
+ ToolBar toolbar = getToolBar(intermediate);
+ assertNotNull(toolbar);
+ Object obj = toolbarModel;
+ renderer.processContents((MElementContainer<MUIElement>) obj);
+
+ ToolBarManager tbm = renderer.getManager(toolbarModel);
+ assertNotNull(tbm);
+
+ IContributionItem[] tbItems = tbm.getItems();
+ assertEquals(7, tbItems.length);
+
+ assertEquals("group2", tbItems[0].getId());
+ assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb5", tbItems[1].getId());
+ assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb4", tbItems[2].getId());
+ assertEquals("group1", tbItems[3].getId());
+ assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb3", tbItems[4].getId());
+ assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb2", tbItems[5].getId());
+ assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb1", tbItems[6].getId());
+ }
+
+ public void testFileItemContributionVisibility() throws Exception {
+ MApplication application = TestUtil.setupRenderer(appContext);
+ // MenuManagerRenderer renderer = appContext
+ // .get(MenuManagerRenderer.class);
+ MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+ 0);
+ MTrimBar coolbar = window.getTrimBars().get(0);
+ assertNotNull(coolbar);
+
+ // setup structure for actionSet test
+ TestUtil.setupActionBuilderStructure(coolbar);
+
+ MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+ assertEquals(5, coolbar.getChildren().size());
+
+ // read in the relevant extensions.
+ MenuPersistence mp = new MenuPersistence(application, appContext,
+ "org.eclipse.e4.ui.menu.tests.p4");
+ mp.reRead();
+
+ ToolBarManagerRenderer renderer = appContext
+ .get(ToolBarManagerRenderer.class);
+ Shell shell = new Shell();
+ Composite parent = new Composite(shell, SWT.NONE);
+ Composite intermediate = (Composite) renderer
+ .createWidget(file, parent);
+
+ ToolBar toolbar = getToolBar(intermediate);
+ assertNotNull(toolbar);
+ Object obj = file;
+ renderer.processContents((MElementContainer<MUIElement>) obj);
+
+ ToolBarManager tbm = renderer.getManager(file);
+ assertNotNull(tbm);
+
+ IContributionItem[] tbItems = tbm.getItems();
+ assertEquals(12, tbItems.length);
+ IContributionItem p4InvOne = tbItems[8];
+ assertEquals("p4.invisible.commandOne", p4InvOne.getId());
+ assertFalse(p4InvOne.isVisible());
+
+ IEclipseContext context = window.getContext();
+
+ context.set("selection", new StructuredSelection(
+ "show.p4.invisible.commandOne"));
+
+ assertTrue(p4InvOne.isVisible());
+
+ context.set("selection", new StructuredSelection(
+ new Object[] { "show.p4.invisible.commandOne",
+ "show.p4.invisible.commandOne" }));
+ assertFalse(p4InvOne.isVisible());
+
+ context.set("selection", new StructuredSelection(
+ "show.p4.invisible.commandOne"));
+ assertTrue(p4InvOne.isVisible());
+
+ context.set("selection", new StructuredSelection(
+ "hide.p4.invisible.commandOne"));
+ assertFalse(p4InvOne.isVisible());
+ context.set("selection", new StructuredSelection(
+ "show.p4.invisible.commandOne"));
+ assertTrue(p4InvOne.isVisible());
+
+ context.remove("selection");
+ assertFalse(p4InvOne.isVisible());
+ }
+
+ public void testFileItemGeneration() throws Exception {
+ MApplication application = TestUtil.setupRenderer(appContext);
+ // MenuManagerRenderer renderer = appContext
+ // .get(MenuManagerRenderer.class);
+ MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+ 0);
+ MTrimBar coolbar = window.getTrimBars().get(0);
+ assertNotNull(coolbar);
+
+ // setup structure for actionSet test
+ TestUtil.setupActionBuilderStructure(coolbar);
+
+ MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+ assertEquals(5, coolbar.getChildren().size());
+
+ // read in the relevant extensions.
+ MenuPersistence mp = new MenuPersistence(application, appContext,
+ "org.eclipse.e4.ui.menu.tests.p1");
+ mp.reRead();
+
+ ToolBarManagerRenderer renderer = appContext
+ .get(ToolBarManagerRenderer.class);
+ Shell shell = new Shell();
+ Composite parent = new Composite(shell, SWT.NONE);
+ Composite intermediate = (Composite) renderer
+ .createWidget(file, parent);
+
+ ToolBar toolbar = getToolBar(intermediate);
+ assertNotNull(toolbar);
+ Object obj = file;
+ renderer.processContents((MElementContainer<MUIElement>) obj);
+
+ ToolBarManager tbm = renderer.getManager(file);
+ assertNotNull(tbm);
+
+ assertEquals(13, tbm.getItems().length);
+ IContributionItem saveAll = tbm.find("saveAll");
+ assertNotNull(saveAll);
+ assertTrue(saveAll instanceof DirectContributionItem);
+
+ IContributionItem cmdTwo = tbm.getItems()[8];
+ assertEquals("org.eclipse.e4.ui.menu.tests.commandTwo", cmdTwo.getId());
+
+ IContributionItem cmdOne = tbm.getItems()[12];
+ assertEquals("org.eclipse.e4.ui.menu.tests.commandOne", cmdOne.getId());
+ }
+
+ public void testFileToolbarRendered() throws Exception {
+ MApplication application = TestUtil.setupRenderer(appContext);
+ // MenuManagerRenderer renderer = appContext
+ // .get(MenuManagerRenderer.class);
+ MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+ 0);
+ MTrimBar coolbar = window.getTrimBars().get(0);
+ assertNotNull(coolbar);
+
+ // setup structure for actionSet test
+ TestUtil.setupActionBuilderStructure(coolbar);
+
+ MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+ assertEquals(5, coolbar.getChildren().size());
+
+ // read in the relevant extensions.
+
+ ToolBarManagerRenderer renderer = appContext
+ .get(ToolBarManagerRenderer.class);
+ Shell shell = new Shell();
+ Composite parent = new Composite(shell, SWT.NONE);
+ Composite intermediate = (Composite) renderer
+ .createWidget(file, parent);
+
+ ToolBar toolbar = getToolBar(intermediate);
+ assertNotNull(toolbar);
+ Object obj = file;
+ renderer.processContents((MElementContainer<MUIElement>) obj);
+
+ ToolBarManager tbm = renderer.getManager(file);
+ assertNotNull(tbm);
+
+ assertEquals(11, tbm.getItems().length);
+ IContributionItem saveAll = tbm.find("saveAll");
+ assertNotNull(saveAll);
+ assertTrue(saveAll instanceof DirectContributionItem);
}
public void testMToolItem_RadioItems() {
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java
index d520070..f01ba49 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java
@@ -9,24 +9,35 @@
import org.eclipse.e4.ui.internal.workbench.UIEventPublisher;
import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.MApplicationElement;
import org.eclipse.e4.ui.model.application.commands.MBindingContext;
import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
+import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
+import org.eclipse.e4.ui.model.application.ui.MUILabel;
import org.eclipse.e4.ui.model.application.ui.SideValue;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
import org.eclipse.e4.ui.services.EContextService;
+import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.IResourceUtilities;
import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer;
+import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer;
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
import org.eclipse.emf.common.notify.Notifier;
@@ -43,38 +54,107 @@
class TestUtil {
public static final String ORG_ECLIPSE_UI_CONTEXTS_ACTION_SET = "org.eclipse.ui.contexts.actionSet";
+ public static void printContributions(MApplication application) {
+ for (MMenuContribution mc : application.getMenuContributions()) {
+ System.out.print("\n\nMC: " + mc.getParentId() + "?"
+ + mc.getPositionInParent());
+ printMenuOut(1, mc);
+ }
+
+ for (MToolBarContribution tbc : application.getToolBarContributions()) {
+ System.out.print("\n\nTC: " + tbc.getParentId() + "?"
+ + tbc.getPositionInParent());
+ printToolOut(1, tbc);
+ }
+ }
+
+ public static void printIcon(int level, MUILabel item) {
+ printTabs(level + 2);
+ System.out.print("icon: " + item.getIconURI());
+ }
+
+ public static void printMenuOut(int level,
+ MElementContainer<MMenuElement> container) {
+ for (MMenuElement child : container.getChildren()) {
+ printTabs(level);
+ System.out.print(child.getClass().getSimpleName() + ": "
+ + child.getElementId());
+ if (child instanceof MMenu) {
+ printMenuOut(level + 1, (MElementContainer<MMenuElement>) child);
+ } else if (child instanceof MHandledMenuItem) {
+ System.out.print(": cmd "
+ + ((MHandledMenuItem) child).getCommand()
+ .getElementId());
+ printIcon(level, child);
+ } else if (child instanceof MDirectMenuItem) {
+ System.out.print(": cmd "
+ + ((MDirectMenuItem) child).getContributionURI());
+ printIcon(level, child);
+ } else if (child instanceof MMenuSeparator) {
+ System.out.print(": label "
+ + ((MMenuSeparator) child).getLabel());
+ }
+ }
+ }
+
+ public static void printTabs(int level) {
+ System.out.print("\n");
+ for (int i = 0; i < level; i++) {
+ System.out.print(" ");
+ }
+ }
+
+ public static void printToolOut(int level, MToolBarContribution tbc) {
+ for (MToolBarElement child : tbc.getChildren()) {
+ printTabs(level);
+ System.out.print(child.getClass().getSimpleName() + ": "
+ + child.getElementId());
+ if (child instanceof MDirectToolItem) {
+ System.out.print(": cmd "
+ + ((MDirectToolItem) child).getContributionURI());
+ printIcon(level, (MUILabel) child);
+ } else if (child instanceof MHandledToolItem) {
+ System.out.print(": cmd "
+ + ((MHandledToolItem) child).getCommand()
+ .getElementId());
+ printIcon(level, (MUILabel) child);
+ } else if (child instanceof MToolBarSeparator) {
+ System.out.print(": separator ");
+ }
+ }
+ }
+
public static void setupActionBuilderStructure(MMenu menuBar) {
MMenu file = MenuFactoryImpl.eINSTANCE.createMenu();
file.setElementId("file");
file.setLabel("&File");
menuBar.getChildren().add(file);
-
+
MDirectMenuItem item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
item.setElementId("refresh");
item.setLabel("Re&fresh");
file.getChildren().add(item);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
item.setElementId("exit");
item.setLabel("&Exit");
file.getChildren().add(item);
-
+
MMenu edit = MenuFactoryImpl.eINSTANCE.createMenu();
edit.setElementId("edit");
edit.setLabel("&Edit");
menuBar.getChildren().add(edit);
-
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
item.setElementId("cut");
item.setLabel("Cu&t");
edit.getChildren().add(item);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
item.setElementId("copy");
item.setLabel("&Copy");
edit.getChildren().add(item);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
item.setElementId("paste");
item.setLabel("&Paste");
@@ -84,42 +164,43 @@
sep.setElementId("copy.ext");
sep.setVisible(false);
edit.getChildren().add(sep);
-
+
sep = MenuFactoryImpl.eINSTANCE.createMenuSeparator();
sep.setElementId("additions");
sep.setVisible(false);
menuBar.getChildren().add(sep);
-
+
MMenu window = MenuFactoryImpl.eINSTANCE.createMenu();
window.setElementId("window");
window.setLabel("&Window");
menuBar.getChildren().add(window);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
item.setElementId("newWindow");
item.setLabel("&New Window");
window.getChildren().add(item);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
item.setElementId("preferences");
item.setLabel("&Preferences");
window.getChildren().add(item);
}
-
+
public static void setupActionBuilderStructure(MTrimBar coolbar) {
MToolBar groupFile = MenuFactoryImpl.eINSTANCE.createToolBar();
groupFile.setElementId("group.file");
groupFile.setVisible(false);
-
+
coolbar.getChildren().add(groupFile);
-
+
MToolBar fileToolBar = MenuFactoryImpl.eINSTANCE.createToolBar();
fileToolBar.setElementId(IWorkbenchActionConstants.TOOLBAR_FILE);
-
- MToolBarSeparator sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
+
+ MToolBarSeparator sep = MenuFactoryImpl.eINSTANCE
+ .createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.NEW_GROUP);
fileToolBar.getChildren().add(sep);
- //fileToolBar.add(newWizardDropDownAction);
+ // fileToolBar.add(newWizardDropDownAction);
sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.SAVE_GROUP);
sep.setVisible(false);
@@ -128,27 +209,27 @@
sep.setElementId(IWorkbenchActionConstants.NEW_EXT);
sep.setVisible(false);
fileToolBar.getChildren().add(sep);
-
+
MDirectToolItem item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
item.setElementId("save");
item.setLabel("S&ave");
fileToolBar.getChildren().add(item);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
item.setElementId("saveAll");
item.setLabel("Sa&ve All");
fileToolBar.getChildren().add(item);
-
+
sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.SAVE_EXT);
sep.setVisible(false);
fileToolBar.getChildren().add(sep);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
item.setElementId("print");
item.setLabel("&Print");
fileToolBar.getChildren().add(item);
-
+
sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.PRINT_EXT);
sep.setVisible(false);
@@ -163,65 +244,66 @@
sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.MB_ADDITIONS);
fileToolBar.getChildren().add(sep);
-
- coolbar.getChildren().add(fileToolBar);
-
- MToolBar add = MenuFactoryImpl.eINSTANCE.createToolBar();
- add.setElementId(IWorkbenchActionConstants.MB_ADDITIONS);
- add.setVisible(false);
-
+
+ coolbar.getChildren().add(fileToolBar);
+
+ MToolBar add = MenuFactoryImpl.eINSTANCE.createToolBar();
+ add.setElementId(IWorkbenchActionConstants.MB_ADDITIONS);
+ add.setVisible(false);
+
coolbar.getChildren().add(add);
-
+
MToolBar groupNav = MenuFactoryImpl.eINSTANCE.createToolBar();
groupNav.setElementId("group.nav");
groupNav.setVisible(false);
-
+
coolbar.getChildren().add(groupNav);
-
-
+
MToolBar navToolBar = MenuFactoryImpl.eINSTANCE.createToolBar();
navToolBar.setElementId(IWorkbenchActionConstants.TOOLBAR_NAVIGATE);
-
+
sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.HISTORY_GROUP);
navToolBar.getChildren().add(sep);
-
+
sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.GROUP_APP);
sep.setVisible(false);
navToolBar.getChildren().add(sep);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
item.setElementId("backwardHistory");
item.setLabel("Backward");
navToolBar.getChildren().add(item);
-
+
item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
item.setElementId("forwardHistory");
item.setLabel("Forward");
navToolBar.getChildren().add(item);
-
+
sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
sep.setElementId(IWorkbenchActionConstants.PIN_GROUP);
navToolBar.getChildren().add(sep);
-
- coolbar.getChildren().add(navToolBar);
+
+ coolbar.getChildren().add(navToolBar);
}
public static void setupCommandImageService(IEclipseContext ctx) {
CmdService cs = ContextInjectionFactory.make(CmdService.class, ctx);
- CommandImageService service = new CommandImageService(new CommandImageManager(), cs);
+ CommandImageService service = new CommandImageService(
+ new CommandImageManager(), cs);
service.readRegistry();
ctx.set(ICommandImageService.class, service);
}
-
+
public static MApplication setupRenderer(IEclipseContext appContext) {
MApplication application = ApplicationFactoryImpl.eINSTANCE
.createApplication();
application.setContext(appContext);
appContext.set(MApplication.class, application);
-
- MBindingContext rootContext = CommandsFactoryImpl.eINSTANCE.createBindingContext();
+
+ MBindingContext rootContext = CommandsFactoryImpl.eINSTANCE
+ .createBindingContext();
rootContext.setElementId(ORG_ECLIPSE_UI_CONTEXTS_ACTION_SET);
rootContext.setName("ActionSets");
application.getRootContext().add(rootContext);
@@ -234,12 +316,13 @@
TestUtil.setupRendererServices(appContext);
TestUtil.setupCommandImageService(appContext);
- MTrimmedWindow window = BasicFactoryImpl.eINSTANCE.createTrimmedWindow();
+ MTrimmedWindow window = BasicFactoryImpl.eINSTANCE
+ .createTrimmedWindow();
window.setContext(appContext.createChild("MWindowContext"));
MMenu menuBar = MenuFactoryImpl.eINSTANCE.createMenu();
menuBar.setElementId("org.eclipse.ui.main.menu");
window.setMainMenu(menuBar);
-
+
MTrimBar coolbar = BasicFactoryImpl.eINSTANCE.createTrimBar();
coolbar.setElementId("org.eclipse.ui.main.toolbar");
coolbar.setSide(SideValue.TOP);
@@ -248,27 +331,34 @@
application.getChildren().add(window);
application.setSelectedElement(window);
window.getContext().activate();
-
+
Display display = Display.getDefault();
appContext.set(Display.class, display);
-
- final MenuManagerRenderer renderer = new MenuManagerRenderer();
+
+ final MenuManagerRenderer menuRenderer = new MenuManagerRenderer();
+ final ToolBarManagerRenderer tbRenderer = new ToolBarManagerRenderer();
appContext.set(IRendererFactory.class, new IRendererFactory() {
@Override
- public AbstractPartRenderer getRenderer(MUIElement uiElement, Object parent) {
- return renderer;
+ public AbstractPartRenderer getRenderer(MUIElement uiElement,
+ Object parent) {
+ if (uiElement instanceof MMenu) {
+ return menuRenderer;
+ } else if (uiElement instanceof MToolBar) {
+ return tbRenderer;
+ }
+ return null;
}
});
- renderer.init(appContext);
- ContextInjectionFactory.inject(renderer, appContext);
+ menuRenderer.init(appContext);
+ ContextInjectionFactory.inject(menuRenderer, appContext);
+ tbRenderer.init(appContext);
+ ContextInjectionFactory.inject(tbRenderer, appContext);
((Notifier) application).eAdapters().add(
new UIEventPublisher(appContext));
return application;
}
-
-
public static void setupRendererServices(IEclipseContext appContext) {
appContext.set(Logger.class, new Logger() {
@@ -287,52 +377,89 @@
@Override
public void log(int level, String message) {
// TODO Auto-generated method stub
-
+
}
@Override
public void log(int level, String message, Throwable exception) {
// TODO Auto-generated method stub
-
+
}
@Override
public void log(Object context, int level, String message) {
// TODO Auto-generated method stub
-
+
}
@Override
public void log(Object context, int level, String message,
Throwable exception) {
// TODO Auto-generated method stub
-
+
}
@Override
public void log(ServiceReference<?> sr, int level, String message) {
// TODO Auto-generated method stub
-
+
}
@Override
public void log(ServiceReference<?> sr, int level, String message,
Throwable exception) {
// TODO Auto-generated method stub
-
- }});
+
+ }
+ });
appContext.set(IResourceUtilities.class, new ISWTResourceUtilities() {
@Override
public ImageDescriptor imageDescriptorFromURI(URI iconPath) {
try {
- return ImageDescriptor.createFromURL(new URL(iconPath.toString()));
+ return ImageDescriptor.createFromURL(new URL(iconPath
+ .toString()));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
- } });
+ }
+ });
+ appContext.set(IPresentationEngine.class, new IPresentationEngine() {
+
+ @Override
+ public Object createGui(MUIElement element) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Object createGui(MUIElement element, Object parentWidget,
+ IEclipseContext parentContext) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void removeGui(MUIElement element) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Object run(MApplicationElement uiRoot,
+ IEclipseContext appContext) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void stop() {
+ // TODO Auto-generated method stub
+
+ }
+ });
}
private TestUtil() {