Fix for Bug 284388 - [Compatibility] editor action bar contributions appear at the end of the top trim
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ElementReferenceRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ElementReferenceRenderer.java
index 809686f..b01bf4b 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ElementReferenceRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ElementReferenceRenderer.java
@@ -19,8 +19,6 @@
import org.eclipse.e4.ui.model.application.ui.MContext;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
@@ -147,20 +145,6 @@
// Reparent the widget
refCtrl.setParent(phComp);
- if (refElement instanceof MPart) {
- MToolBar tb = ((MPart) refElement).getToolbar();
- if (tb != null
- && tb.getTransientData()
- .containsKey(
- LazyStackRenderer.TOOL_BAR_INTERMEDIATE)) {
- Composite compTB = (Composite) tb
- .getTransientData()
- .get(LazyStackRenderer.TOOL_BAR_INTERMEDIATE);
- if (compTB != null && !compTB.isDisposed()) {
- compTB.setParent(phComp);
- }
- }
- }
break;
}
} else if (currentRef != null) {
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/LazyStackRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/LazyStackRenderer.java
index c5455f7..41482af 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/LazyStackRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/LazyStackRenderer.java
@@ -12,10 +12,8 @@
import java.util.ArrayList;
import java.util.List;
-import javax.inject.Inject;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.services.events.IEventBroker;
-import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.model.application.ui.MContext;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MGenericStack;
@@ -23,33 +21,13 @@
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
+import org.eclipse.e4.ui.model.application.ui.basic.MPartStack;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
-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.widgets.CTabFolder;
-import org.eclipse.e4.ui.workbench.IPresentationEngine;
import org.eclipse.e4.ui.workbench.UIEvents;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.layout.RowLayoutFactory;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
@@ -64,10 +42,6 @@
*
*/
public abstract class LazyStackRenderer extends SWTPartRenderer {
- public static final String TAG_VIEW_MENU = "ViewMenu"; //$NON-NLS-1$
- static final String TOOL_BAR_MANAGER_RENDERER_VIEW_MENU = "StackRenderer.viewMenu"; //$NON-NLS-1$
- static final String TOOL_BAR_INTERMEDIATE = "StackRenderer.intermediate"; //$NON-NLS-1$
-
private EventHandler lazyLoader = new EventHandler() {
public void handleEvent(Event event) {
Object element = event.getProperty(UIEvents.EventTags.ELEMENT);
@@ -91,11 +65,7 @@
if (stack.getSelectedElement() != null)
lsr.showTab(stack.getSelectedElement());
}
- };
- Image viewMenuImage;
-
- @Inject
- IPresentationEngine renderer;
+ };;
public LazyStackRenderer() {
super();
@@ -173,35 +143,16 @@
if (element == null || element.getWidget() == null)
return;
+ if (element instanceof MPartStack
+ && element.getRenderer() instanceof StackRenderer) {
+ StackRenderer sr = (StackRenderer) element.getRenderer();
+ CTabFolder ctf = (CTabFolder) element.getWidget();
+ sr.clearTR(ctf);
+ }
+
if (element instanceof MPlaceholder) {
MPlaceholder ph = (MPlaceholder) element;
- MUIElement ref = ph.getRef();
- if (ref instanceof MPart && ph.getParent() != null
- && ph.getParent().getWidget() instanceof CTabFolder) {
- // Reparent the existing Toolbar
- // MPart part = (MPart) ref;
- CTabFolder ctf = (CTabFolder) ph.getParent().getWidget();
- // IPresentationEngine renderer = part.getContext().get(
- // IPresentationEngine.class);
-
- // Dispose the existing toolbar
- if (ctf.getTopRight() != null) {
- Control curTB = ctf.getTopRight();
- ctf.setTopRight(null);
- if (!curTB.isDisposed()) {
- MUIElement tbME = (MUIElement) curTB
- .getData(AbstractPartRenderer.OWNING_ME);
- if (tbME instanceof MToolBar) {
- curTB.setVisible(false);
- curTB.moveBelow(null);
- //tbME.setVisible(false);
- } else
- curTB.dispose();
- }
- }
- }
-
- element = ((MPlaceholder) element).getRef();
+ element = ph.getRef();
}
// Hide any floating windows
@@ -240,6 +191,18 @@
if (!element.isToBeRendered())
return;
+ if (element instanceof MPartStack
+ && element.getRenderer() instanceof StackRenderer) {
+ MPartStack stackModel = (MPartStack) element;
+ StackRenderer sr = (StackRenderer) element.getRenderer();
+ CTabFolder ctf = (CTabFolder) element.getWidget();
+
+ MUIElement curSel = stackModel.getSelectedElement();
+ MPart part = (MPart) ((curSel instanceof MPlaceholder) ? ((MPlaceholder) curSel)
+ .getRef() : curSel);
+ sr.adjustTR(ctf, part);
+ }
+
if (element instanceof MPlaceholder && element.getWidget() != null) {
MPlaceholder ph = (MPlaceholder) element;
MUIElement ref = ph.getRef();
@@ -250,49 +213,6 @@
refCtrl.setParent(phComp);
phComp.layout(new Control[] { refCtrl }, SWT.DEFER);
- if (ref instanceof MPart
- && ph.getParent().getWidget() instanceof CTabFolder) {
- // Reparent the existing Toolbar
- MPart part = (MPart) ref;
- CTabFolder ctf = (CTabFolder) ph.getParent().getWidget();
- // IPresentationEngine renderer = modelService
- // .getContainingContext(ph)
- // .get(IPresentationEngine.class);
-
- MToolBar tbModel = part.getToolbar();
-
- // Dispose the existing toolbar
- if (ctf.getTopRight() != null) {
- Control curTB = ctf.getTopRight();
- ctf.setTopRight(null);
- if (!curTB.isDisposed()) {
- MUIElement tbME = (MUIElement) curTB
- .getData(AbstractPartRenderer.OWNING_ME);
- if (tbME instanceof MToolBar) {
- curTB.setVisible(false);
- curTB.moveBelow(null);
- //tbME.setVisible(false);
- } else
- curTB.dispose();
- }
- }
-
- if (tbModel != null) {
- tbModel.setVisible(true);
- MMenu viewMenu = getViewMenu(part);
- final Composite intermediate = createIntermediate(part,
- tbModel, viewMenu, ctf);
-
- if (intermediate != null && !intermediate.isDisposed()) {
- intermediate.setVisible(true);
- intermediate.moveAbove(null);
- intermediate.pack();
- ctf.setTopRight(intermediate, SWT.RIGHT | SWT.WRAP);
- ctf.layout();
- }
- }
- }
-
element = ref;
}
@@ -350,164 +270,4 @@
}
}
}
-
- protected Composite createIntermediate(MPart part, MUIElement tbModel,
- MMenu viewMenu, Composite parent) {
- Composite tbi = (Composite) tbModel.getTransientData().get(
- TOOL_BAR_INTERMEDIATE);
- if (tbi != null && !tbi.isDisposed()) {
- tbi.setParent(parent);
- return tbi;
- }
- final Composite intermediate = new Composite((Composite) parent,
- SWT.NONE);
- intermediate.setData(AbstractPartRenderer.OWNING_ME, tbModel);
- int orientation = SWT.HORIZONTAL;
- RowLayout layout = RowLayoutFactory.fillDefaults().wrap(false)
- .spacing(0).type(orientation).create();
- layout.marginLeft = 3;
- layout.center = true;
- intermediate.setLayout(layout);
- tbModel.getTransientData().put(TOOL_BAR_INTERMEDIATE, intermediate);
- Control c = (Control) renderer.createGui(tbModel, intermediate,
- part.getContext());
- if (c == null) {
- intermediate.dispose();
- } else {
- c.addListener(SWT.Dispose, new Listener() {
- public void handleEvent(org.eclipse.swt.widgets.Event event) {
- intermediate.dispose();
- }
- });
- if (viewMenu != null) {
- addMenuButton(part, intermediate, viewMenu);
- }
- }
- return intermediate;
- }
-
- protected MMenu getViewMenu(MPart part) {
- if (part.getMenus() == null) {
- return null;
- }
- for (MMenu menu : part.getMenus()) {
- if (menu.getTags().contains(TAG_VIEW_MENU) && menu.isToBeRendered()) {
- return menu;
- }
- }
- return null;
- }
-
- protected 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);
- ti.setToolTipText("View Menu"); //$NON-NLS-1$
- ti.setData("theMenu", menu); //$NON-NLS-1$
- ti.setData("thePart", part); //$NON-NLS-1$
-
- ti.addSelectionListener(new SelectionListener() {
- public void widgetSelected(SelectionEvent e) {
- showMenu((ToolItem) e.widget);
- }
-
- public void widgetDefaultSelected(SelectionEvent e) {
- showMenu((ToolItem) e.widget);
- }
- });
- }
-
- /**
- * @param item
- */
- protected void showMenu(ToolItem item) {
- // Create the UI for the menu
- final MMenu menuModel = (MMenu) item.getData("theMenu"); //$NON-NLS-1$
- 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();
- Point displayAt = item.getParent().toDisplay(ib.x, ib.y + ib.height);
- menu.setLocation(displayAt);
- menu.setVisible(true);
-
- Display display = Display.getCurrent();
- while (!menu.isDisposed() && menu.isVisible()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
- if (menu.getData() instanceof MenuManager) {
- MenuManager manager = (MenuManager) menu.getData();
- manager.dispose();
- } else {
- menu.dispose();
- }
- }
-
- private Image getViewMenuImage() {
- if (viewMenuImage == null) {
- Display d = Display.getCurrent();
-
- Image viewMenu = new Image(d, 16, 16);
- Image viewMenuMask = new Image(d, 16, 16);
-
- Display display = Display.getCurrent();
- GC gc = new GC(viewMenu);
- GC maskgc = new GC(viewMenuMask);
- gc.setForeground(display
- .getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
- gc.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-
- int[] shapeArray = new int[] { 6, 1, 15, 1, 11, 5, 10, 5 };
- gc.fillPolygon(shapeArray);
- gc.drawPolygon(shapeArray);
-
- Color black = display.getSystemColor(SWT.COLOR_BLACK);
- Color white = display.getSystemColor(SWT.COLOR_WHITE);
-
- maskgc.setBackground(black);
- maskgc.fillRectangle(0, 0, 16, 16);
-
- maskgc.setBackground(white);
- maskgc.setForeground(white);
- maskgc.fillPolygon(shapeArray);
- maskgc.drawPolygon(shapeArray);
- gc.dispose();
- maskgc.dispose();
-
- ImageData data = viewMenu.getImageData();
- data.transparentPixel = data.getPixel(0, 0);
-
- viewMenuImage = new Image(d, viewMenu.getImageData(),
- viewMenuMask.getImageData());
- viewMenu.dispose();
- viewMenuMask.dispose();
- }
- return viewMenuImage;
- }
}
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java
index 7d1d532..e858bc9 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/StackRenderer.java
@@ -31,7 +31,6 @@
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
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.impl.MenuFactoryImpl;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.e4.ui.widgets.CTabFolder;
import org.eclipse.e4.ui.widgets.CTabFolder2Adapter;
@@ -42,7 +41,10 @@
import org.eclipse.e4.ui.workbench.modeling.EModelService;
import org.eclipse.e4.ui.workbench.modeling.EPartService;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.action.MenuManager;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.MouseAdapter;
@@ -51,12 +53,21 @@
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Widget;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
@@ -67,18 +78,35 @@
private static final String SHELL_CLOSE_EDITORS_MENU = "shell_close_editors_menu"; //$NON-NLS-1$
private static final String STACK_SELECTED_PART = "stack_selected_part"; //$NON-NLS-1$
+ // View Menu / TB data constants
+ private static final String TOP_RIGHT = "topRight"; //$NON-NLS-1$
+ //private static final String MENU_TB = "menuTB"; //$NON-NLS-1$
+ //private static final String PART_TB = "partTB"; //$NON-NLS-1$
+
+ Image viewMenuImage;
+
@Inject
IStylingEngine stylingEngine;
@Inject
IEventBroker eventBroker;
+ @Inject
+ IPresentationEngine renderer;
+
private EventHandler itemUpdater;
private EventHandler dirtyUpdater;
private boolean ignoreTabSelChanges = false;
+ private ActivationJob activationJob = null;
+
+ // private ToolBar menuTB;
+ // private boolean menuButtonShowing = false;
+
+ // private Control partTB;
+
private class ActivationJob implements Runnable {
public MElementContainer<MUIElement> stackToActivate = null;
@@ -132,8 +160,6 @@
return isValid(parent);
}
- private ActivationJob activationJob = null;
-
synchronized private void activateStack(MElementContainer<MUIElement> stack) {
CTabFolder ctf = (CTabFolder) stack.getWidget();
if (ctf == null || ctf.isDisposed())
@@ -314,9 +340,100 @@
| styleModifier);
bindWidget(element, ctf); // ?? Do we need this ?
+ // Add a composite to manage the view's TB and Menu
+ addTopRight(ctf);
+
return ctf;
}
+ /**
+ * @param ctf
+ */
+ private void addTopRight(CTabFolder ctf) {
+ Composite trComp = new Composite(ctf, SWT.NONE);
+ trComp.setBackground(Display.getCurrent().getSystemColor(
+ SWT.COLOR_DARK_CYAN));
+ RowLayout rl = new RowLayout();
+ trComp.setLayout(rl);
+ rl.marginBottom = rl.marginTop = rl.marginRight = rl.marginLeft = 0;
+ ctf.setData(TOP_RIGHT, trComp);
+ ctf.addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ Composite c = (Composite) e.widget.getData(TOP_RIGHT);
+ if (c != null && !c.isDisposed())
+ c.dispose();
+ }
+ });
+ }
+
+ private Composite getTRComposite(CTabFolder ctf) {
+ return (Composite) ctf.getData(TOP_RIGHT);
+ }
+
+ public void clearTR(CTabFolder ctf) {
+ ToolBar vmTB = getViewMenuTB(ctf);
+ if (vmTB != null && !vmTB.isDisposed())
+ vmTB.dispose();
+
+ MToolBar viewTBModel = getViewTB(ctf);
+ if (viewTBModel != null && viewTBModel.getWidget() != null)
+ viewTBModel.setVisible(false);
+
+ ctf.setTopRight(null);
+ getTRComposite(ctf).setVisible(false);
+ }
+
+ public void adjustTR(CTabFolder ctf, MPart part) {
+ // Clear the current info
+ clearTR(ctf);
+
+ if (part == null)
+ return;
+
+ // Show the TB, create one if necessary
+ if (part.getToolbar() != null && part.getToolbar().isToBeRendered()) {
+ part.getToolbar().setVisible(true);
+ renderer.createGui(part.getToolbar(), getTRComposite(ctf),
+ part.getContext());
+ }
+
+ setupMenuButton(part, ctf);
+
+ Composite trComp = getTRComposite(ctf);
+ if (trComp.getChildren().length > 0) {
+ trComp.setVisible(true);
+ ctf.setTopRight(trComp, SWT.RIGHT | SWT.WRAP);
+ } else {
+ ctf.setTopRight(null);
+ trComp.setVisible(false);
+ }
+
+ trComp.pack();
+ ctf.layout();
+ }
+
+ private MToolBar getViewTB(CTabFolder ctf) {
+ Composite trComp = (Composite) ctf.getData(TOP_RIGHT);
+
+ // The view menu TB *is* modeled so it's OWNING_ME != null
+ for (Control kid : trComp.getChildren()) {
+ if (kid.getData(OWNING_ME) instanceof MToolBar)
+ return (MToolBar) kid.getData(OWNING_ME);
+ }
+ return null;
+ }
+
+ private ToolBar getViewMenuTB(CTabFolder ctf) {
+ Composite trComp = (Composite) ctf.getData(TOP_RIGHT);
+
+ // The view menu TB is not modeled so it's OWNING_ME == null
+ for (Control kid : trComp.getChildren()) {
+ if (kid.getData(OWNING_ME) == null)
+ return (ToolBar) kid;
+ }
+ return null;
+ }
+
protected void createTab(MElementContainer<MUIElement> stack,
MUIElement element) {
MPart part = null;
@@ -420,20 +537,7 @@
// Check if we have to reset the currently active child for the stack
if (parentElement.getSelectedElement() == child) {
- if (ctf.getTopRight() != null) {
- Control curTB = ctf.getTopRight();
- ctf.setTopRight(null);
- if (!curTB.isDisposed()) {
- MUIElement tbME = (MUIElement) curTB
- .getData(AbstractPartRenderer.OWNING_ME);
- if (tbME instanceof MToolBar) {
- curTB.setVisible(false);
- curTB.moveBelow(null);
- //tbME.setVisible(false);
- } else
- curTB.dispose();
- }
- }
+ clearTR(ctf);
} else {
if (child instanceof MPlaceholder) {
MPlaceholder placeholder = (MPlaceholder) child;
@@ -450,7 +554,7 @@
if (child instanceof MPart) {
MToolBar toolbar = ((MPart) child).getToolbar();
if (toolbar != null) {
- // toolbar.setVisible(false);
+ toolbar.setVisible(false);
}
}
}
@@ -559,48 +663,10 @@
ctf.setSelection(cti);
ignoreTabSelChanges = false;
- // Dispose the existing toolbar
- if (ctf.getTopRight() != null) {
- Control curTB = ctf.getTopRight();
- ctf.setTopRight(null);
- if (!curTB.isDisposed()) {
- MUIElement tbME = (MUIElement) curTB
- .getData(AbstractPartRenderer.OWNING_ME);
- if (tbME instanceof MToolBar) {
- curTB.setVisible(false);
- curTB.moveBelow(null);
- //tbME.setVisible(false);
- } else
- curTB.dispose();
- }
- }
-
- // Show the TB, create one if necessary
+ // Clear out the current Top Right info
MPart part = (MPart) ((element instanceof MPart) ? element
: ((MPlaceholder) element).getRef());
- MMenu viewMenu = getViewMenu(part);
- final MToolBar partToolbar = part.getToolbar();
- MToolBar toolbar = partToolbar;
- if (toolbar == null) {
- if (viewMenu != null) {
- toolbar = MenuFactoryImpl.eINSTANCE.createToolBar();
- toolbar.setElementId(part.getElementId());
- part.setToolbar(toolbar);
- }
- }
-
- if (partToolbar != null && partToolbar.isToBeRendered()) {
- partToolbar.setVisible(true);
- final Composite intermediate = createIntermediate(part,
- partToolbar, viewMenu, ctf);
- if (intermediate != null && !intermediate.isDisposed()) {
- intermediate.setVisible(true);
- intermediate.moveAbove(null);
- intermediate.pack();
- ctf.setTopRight(intermediate, SWT.RIGHT | SWT.WRAP);
- ctf.layout();
- }
- }
+ adjustTR(ctf, part);
ctf.addMenuDetectListener(new MenuDetectListener() {
public void menuDetected(MenuDetectEvent e) {
@@ -619,6 +685,138 @@
});
}
+ private void setupMenuButton(MPart part, CTabFolder ctf) {
+ MMenu viewMenu = getViewMenu(part);
+
+ // View menu (if any)
+ if (viewMenu != null) {
+ showMenuButton(part, ctf, viewMenu);
+ } else {
+ // hide the menu's TB
+ ToolBar menuTB = getViewMenuTB(ctf);
+ if (menuTB != null) {
+ menuTB.dispose();
+ }
+ }
+ }
+
+ private void showMenuButton(MPart part, CTabFolder ctf, MMenu menu) {
+ ToolBar menuTB = getViewMenuTB(ctf);
+ if (menuTB == null) {
+ menuTB = new ToolBar(getTRComposite(ctf), SWT.FLAT | SWT.RIGHT);
+ ToolItem ti = new ToolItem(menuTB, SWT.PUSH);
+ ti.setImage(getViewMenuImage());
+ ti.setHotImage(null);
+ ti.setToolTipText("View Menu"); //$NON-NLS-1$
+
+ ti.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ showMenu((ToolItem) e.widget);
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ showMenu((ToolItem) e.widget);
+ }
+ });
+ }
+
+ ToolItem ti = menuTB.getItem(0);
+ ti.setData("theMenu", menu); //$NON-NLS-1$
+ ti.setData("thePart", part); //$NON-NLS-1$
+ }
+
+ /**
+ * @param item
+ */
+ protected void showMenu(ToolItem item) {
+ // Create the UI for the menu
+ final MMenu menuModel = (MMenu) item.getData("theMenu"); //$NON-NLS-1$
+ 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();
+ Point displayAt = item.getParent().toDisplay(ib.x, ib.y + ib.height);
+ menu.setLocation(displayAt);
+ menu.setVisible(true);
+
+ Display display = Display.getCurrent();
+ while (!menu.isDisposed() && menu.isVisible()) {
+ if (!display.readAndDispatch())
+ display.sleep();
+ }
+ if (menu.getData() instanceof MenuManager) {
+ MenuManager manager = (MenuManager) menu.getData();
+ manager.dispose();
+ } else {
+ menu.dispose();
+ }
+ }
+
+ private Image getViewMenuImage() {
+ if (viewMenuImage == null) {
+ Display d = Display.getCurrent();
+
+ Image viewMenu = new Image(d, 16, 16);
+ Image viewMenuMask = new Image(d, 16, 16);
+
+ Display display = Display.getCurrent();
+ GC gc = new GC(viewMenu);
+ GC maskgc = new GC(viewMenuMask);
+ gc.setForeground(display
+ .getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
+ gc.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+
+ int[] shapeArray = new int[] { 6, 1, 15, 1, 11, 5, 10, 5 };
+ gc.fillPolygon(shapeArray);
+ gc.drawPolygon(shapeArray);
+
+ Color black = display.getSystemColor(SWT.COLOR_BLACK);
+ Color white = display.getSystemColor(SWT.COLOR_WHITE);
+
+ maskgc.setBackground(black);
+ maskgc.fillRectangle(0, 0, 16, 16);
+
+ maskgc.setBackground(white);
+ maskgc.setForeground(white);
+ maskgc.fillPolygon(shapeArray);
+ maskgc.drawPolygon(shapeArray);
+ gc.dispose();
+ maskgc.dispose();
+
+ ImageData data = viewMenu.getImageData();
+ data.transparentPixel = data.getPixel(0, 0);
+
+ viewMenuImage = new Image(d, viewMenu.getImageData(),
+ viewMenuMask.getImageData());
+ viewMenu.dispose();
+ viewMenuMask.dispose();
+ }
+ return viewMenuImage;
+ }
+
private void openMenuFor(MPart part, CTabFolder folder, Point point) {
Menu tabMenu = createTabMenu(folder, part);
tabMenu.setData(STACK_SELECTED_PART, part);
@@ -761,4 +959,16 @@
partService.hidePart(otherPart);
}
}
+
+ private MMenu getViewMenu(MPart part) {
+ if (part.getMenus() == null) {
+ return null;
+ }
+ for (MMenu menu : part.getMenus()) {
+ if (menu.getTags().contains(TAG_VIEW_MENU) && menu.isToBeRendered()) {
+ return menu;
+ }
+ }
+ return null;
+ }
}
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 8f1d388..43e1ef0 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
@@ -28,11 +28,9 @@
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.SideValue;
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
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.MToolBar;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
@@ -41,18 +39,23 @@
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.UIEvents.ElementContainer;
import org.eclipse.e4.ui.workbench.modeling.EModelService;
+import org.eclipse.emf.ecore.EObject;
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.Separator;
import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.layout.RowLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Widget;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
@@ -62,6 +65,7 @@
*/
public class ToolBarManagerRenderer extends SWTPartRenderer {
+ 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>();
@@ -154,6 +158,9 @@
.getParent();
if (parent != null) {
parent.markDirty();
+ parent.update(true);
+ // MUIElement tbModel = itemModel.getParent();
+ // disposeToolbarIfNecessary((MToolBar) tbModel);
ToolBar tb = parent.getControl();
if (tb != null && !tb.isDisposed()) {
tb.getShell().layout(new Control[] { tb }, SWT.DEFER);
@@ -249,12 +256,41 @@
return null;
final MToolBar toolbarModel = (MToolBar) element;
- // Composite intermediate = createIntermediate(toolbarModel,
- // (Composite) parent);
- final ToolBar toolbar = createToolbar(toolbarModel, (Composite) parent);
- // setupMenuButton(toolbarModel, intermediate);
+ Composite intermediate = createIntermediate(toolbarModel,
+ (Composite) parent);
+ createToolbar(toolbarModel, intermediate);
processContribution(toolbarModel);
- return toolbar;
+ return intermediate;
+ }
+
+ /**
+ * @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);
+ ToolItem ti = new ToolItem(separatorToolBar, SWT.SEPARATOR);
+ ti.setWidth(0);
+ }
+ return intermediate;
+ }
+
+ private boolean needsDragHandle(MToolBar toolbarModel) {
+ // Only if it's in the trim
+ return toolbarModel != null
+ && ((EObject) toolbarModel).eContainer() instanceof MTrimBar;
}
/**
@@ -302,7 +338,7 @@
* @param existingSeparatorNames
* @return <code>true</code> if the contribution was successfuly processed
*/
- private boolean processAddition(MToolBar toolbarModel,
+ private boolean processAddition(final MToolBar toolbarModel,
final ToolBarManager manager, MToolBarContribution contribution) {
final ToolBarContributionRecord record = new ToolBarContributionRecord(
toolbarModel, contribution, this);
@@ -317,6 +353,7 @@
public boolean changed(IEclipseContext context) {
record.updateVisibility(parentContext.getActiveLeaf());
manager.update(true);
+ // disposeToolbarIfNecessary(toolbarModel);
return true;
}
});
@@ -452,21 +489,23 @@
return null;
}
- MMenu getViewMenu(MPart part) {
- if (part.getMenus() == null) {
- return null;
- }
- for (MMenu menu : part.getMenus()) {
- if (menu.getTags().contains(StackRenderer.TAG_VIEW_MENU)) {
- return menu;
+ boolean hasOnlySeparators(ToolBar toolbar) {
+ ToolItem[] children = toolbar.getItems();
+ for (ToolItem toolItem : children) {
+ if ((toolItem.getStyle() & SWT.SEPARATOR) == 0) {
+ return false;
+ } else if (toolItem.getControl() != null
+ && toolItem.getControl().getData(OWNING_ME) instanceof MToolControl) {
+ return false;
}
}
- return null;
+ return true;
}
@Override
public void postProcess(MUIElement element) {
super.postProcess(element);
+ disposeToolbarIfNecessary((MToolBar) element);
ToolBar tb = getToolbarFrom(element.getWidget());
if (tb != null && !tb.isDisposed()) {
tb.setVisible(true);
@@ -476,6 +515,29 @@
}
}
+ /**
+ * @param element
+ */
+ private void disposeToolbarIfNecessary(final MToolBar element) {
+ Display.getCurrent().asyncExec(new Runnable() {
+ public void run() {
+ doDisposeToolbarIfNecessary(element);
+ }
+ });
+ }
+
+ /**
+ * @param element
+ */
+ private void doDisposeToolbarIfNecessary(MToolBar element) {
+ ToolBar tb = getToolbarFrom(element.getWidget());
+ boolean cleanUp = tb == null || tb.isDisposed();
+ if (!cleanUp) {
+ cleanUp = tb.getItemCount() == 0 || hasOnlySeparators(tb);
+ }
+ element.setVisible(!cleanUp);
+ }
+
@Override
public void disposeWidget(MUIElement element) {
Object widget = element.getWidget();
@@ -530,9 +592,6 @@
}
private ToolBar findToolbar(Composite intermediate) {
- if (intermediate instanceof ToolBar) {
- return (ToolBar) intermediate;
- }
for (Control child : intermediate.getChildren()) {
if (child.getData() instanceof ToolBarManager) {
return (ToolBar) child;
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 20e3265..094661e 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
@@ -18,7 +18,6 @@
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.contexts.RunAndTrack;
import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer;
-import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
import org.eclipse.e4.ui.model.application.MApplication;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
@@ -27,19 +26,11 @@
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.jface.layout.RowLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.Widget;
/**
*
@@ -79,7 +70,6 @@
}
private HashMap<MTrimBar, ArrayList<ArrayList<MTrimElement>>> pendingCleanup = new HashMap<MTrimBar, ArrayList<ArrayList<MTrimElement>>>();
- static final String TRIM_BAR_MANAGER_RENDERER_DRAG_HANDLE = "TrimBarRenderer.dragHandle"; //$NON-NLS-1$
/*
* (non-Javadoc)
@@ -130,7 +120,6 @@
default:
return null;
}
- processContents(trimModel);
result.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
cleanUp(trimModel);
@@ -139,35 +128,6 @@
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);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer#childRendered
- * (org.eclipse.e4.ui.model.application.ui.MElementContainer,
- * org.eclipse.e4.ui.model.application.ui.MUIElement)
- */
- @Override
- public void childRendered(MElementContainer<MUIElement> parentElement,
- MUIElement element) {
- super.childRendered(parentElement, element);
- Object downCast = parentElement;
- layoutTrim((MTrimBar) downCast);
- }
-
@Override
public void hideChild(MElementContainer<MUIElement> parentElement,
MUIElement child) {
@@ -185,67 +145,19 @@
* (org.eclipse.e4.ui.model.application.MPart)
*/
@Override
- public void processContents(MElementContainer<MUIElement> container) {
- if (!(((MUIElement) container) instanceof MTrimBar))
+ public void processContents(MElementContainer<MUIElement> me) {
+ if (!(((MUIElement) me) instanceof MTrimBar))
return;
-
- // Process any contents of the newly created ME
- List<MUIElement> parts = container.getChildren();
- final Composite parent = (Composite) container.getWidget();
- 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];
- final Composite intermediate = createIntermediate(childME,
- parent);
- final Object newObj = renderer.createGui(childME, intermediate,
- null);
- if (newObj == null) {
- intermediate.dispose();
- } else {
- ((Widget) newObj).addListener(SWT.Dispose, new Listener() {
- public void handleEvent(Event event) {
- intermediate.dispose();
- }
- });
- }
- }
- }
- }
-
- private Composite createIntermediate(MUIElement 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);
- ToolBar separatorToolBar = new ToolBar(intermediate, orientation
- | SWT.WRAP | SWT.FLAT | SWT.RIGHT);
- separatorToolBar.setData(TRIM_BAR_MANAGER_RENDERER_DRAG_HANDLE);
- new ToolItem(separatorToolBar, SWT.SEPARATOR);
- return intermediate;
- }
-
- private int getOrientation(final MUIElement element) {
- MUIElement theParent = element.getParent();
- if (theParent instanceof MTrimBar) {
- MTrimBar trimContainer = (MTrimBar) theParent;
- SideValue side = trimContainer.getSide();
- if (side.getValue() == SideValue.LEFT_VALUE
- || side.getValue() == SideValue.RIGHT_VALUE)
- return SWT.VERTICAL;
- }
- return SWT.HORIZONTAL;
+ 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);
}
private void addTrimContributions(final MTrimBar trimModel,
@@ -286,7 +198,6 @@
for (MTrimElement child : toRemove) {
child.setToBeRendered(rc);
}
- layoutTrim(trimModel);
return true;
}
});