Adapt original SashLayout class to work in RAP
RAP doesn't support mouse track/move listeners. Use real Sash widgets on
top of SashRects for sash drag processing. Only single sash can be
dragged at a time.
Change-Id: I65c371bfe022ee2b111efa889e1e3266ba9e1108
Signed-off-by: Ivan Furnadjiev <ivan@eclipsesource.com>
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SashLayout.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SashLayout.java
index 1f58307..f00bc49 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SashLayout.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/SashLayout.java
@@ -15,11 +15,16 @@
import org.eclipse.e4.ui.model.application.ui.MGenericTile;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.workbench.IPresentationEngine;
+import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.Shell;
public class SashLayout extends Layout {
@@ -60,7 +65,7 @@
public SashLayout(final Composite host, MUIElement root) {
this.root = root;
this.host = host;
- // FIXME RAP does not support this
+ // RAP does not support mouse track/move listeners
// host.addMouseTrackListener(new MouseTrackListener() {
// @Override
// public void mouseHover(MouseEvent e) {
@@ -171,8 +176,60 @@
sashes.clear();
tileSubNodes(bounds, root);
+ // RAP: Use real Sash widgets instead of mouse track/move listeners
+ updateSashWidgets();
+ // RAPEND
}
+ // RAP: Use real Sash widgets instead of mouse track/move listeners
+ List<Sash> sashWidgets = new ArrayList<Sash>();
+
+ private void updateSashWidgets() {
+ for (int i = 0; i < sashes.size(); i++) {
+ SashRect sashRect = sashes.get(i);
+ if (i < sashWidgets.size()) {
+ Sash sashWidget = sashWidgets.get(i);
+ if (isSameOrientation(sashWidget, sashRect)) {
+ sashWidget.setBounds(sashRect.rect);
+ } else {
+ sashWidgets.set(i, createSash(sashRect)).dispose();
+ }
+ } else {
+ sashWidgets.add(createSash(sashRect));
+ }
+ }
+ while (sashWidgets.size() > sashes.size()) {
+ sashWidgets.remove(sashWidgets.size() - 1).dispose();
+ }
+ }
+
+ private Sash createSash(final SashRect sashRect) {
+ boolean horizontal = !sashRect.container.isHorizontal();
+ Sash sash = new Sash(host, horizontal ? SWT.HORIZONTAL : SWT.VERTICAL);
+ sash.setBounds(sashRect.rect);
+ sash.addListener(SWT.Selection, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ Display display = host.getDisplay();
+ Point cursorLocation = display.getCursorLocation();
+ Point mapped = display.map(null, host, cursorLocation);
+ sashesToDrag = new ArrayList<SashLayout.SashRect>();
+ sashesToDrag.add(sashRect);
+ adjustWeights(sashesToDrag, mapped.x, mapped.y);
+ host.layout();
+ host.update();
+ }
+ });
+ return sash;
+ }
+
+ private boolean isSameOrientation(Sash sash, SashRect sashRect) {
+ boolean isSashHorizontal = (sash.getStyle() & SWT.HORIZONTAL) != 0;
+ boolean isSashContainerHorizontal = sashRect.container.isHorizontal();
+ return isSashHorizontal != isSashContainerHorizontal;
+ }
+ // RAPEND
+
protected void adjustWeights(List<SashRect> sashes, int curX, int curY) {
for (SashRect sr : sashes) {
int totalWeight = getWeight(sr.left) + getWeight(sr.right);
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 fb993f3..777beee 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
@@ -31,7 +31,6 @@
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.workbench.renderers.swt.rap.RAPSashRenderer;
import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
public class WorkbenchRendererFactory implements IRendererFactory {
@@ -45,12 +44,11 @@
private ElementReferenceRenderer elementRefRenderer;
private PerspectiveStackRenderer perspStackRenderer;
private PerspectiveRenderer perspRenderer;
- // private SashRenderer partSashRenderer;
+ private SashRenderer partSashRenderer;
private LazyStackRenderer stackRenderer;
private TrimBarRenderer trimBarRenderer;
private ToolControlRenderer toolControlRenderer;
private WBWRenderer wbwRenderer;
- private RAPSashRenderer rapSashRenderer;
private IEclipseContext context;
@@ -108,16 +106,11 @@
}
return perspStackRenderer;
} else if (uiElement instanceof MPartSashContainer) {
- if (rapSashRenderer == null) {
- rapSashRenderer = new RAPSashRenderer();
- initRenderer(rapSashRenderer);
+ if (partSashRenderer == null) {
+ partSashRenderer = new SashRenderer();
+ initRenderer(partSashRenderer);
}
- return rapSashRenderer;
- // if (partSashRenderer == null) {
- // partSashRenderer = new SashRenderer();
- // initRenderer(partSashRenderer);
- // }
- // return partSashRenderer;
+ return partSashRenderer;
} else if (uiElement instanceof MPartStack) {
if (stackRenderer == null) {
stackRenderer = new StackRenderer();
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/rap/RAPSashRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/rap/RAPSashRenderer.java
deleted file mode 100644
index e0338dc..0000000
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/rap/RAPSashRenderer.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014 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.rap;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.inject.Inject;
-import org.eclipse.e4.core.services.events.IEventBroker;
-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.MPartSashContainer;
-import org.eclipse.e4.ui.model.application.ui.basic.MPartSashContainerElement;
-import org.eclipse.e4.ui.workbench.UIEvents;
-import org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Widget;
-import org.osgi.service.event.EventHandler;
-
-/**
- *
- */
-public class RAPSashRenderer extends SWTPartRenderer {
- private Set<MElementContainer<MUIElement>> contentProcessing = new HashSet<MElementContainer<MUIElement>>();
- private boolean layoutUpdateInProgress = false;
-
- @Inject
- private IEventBroker broker;
-
- private EventHandler orientationHandler;
- private EventHandler containerDataHandler;
-
-
- private Listener resizeListener = new Listener() {
-
- public void handleEvent(Event event) {
- if (contentProcessing.isEmpty()) {
- return;
- }
- try {
- layoutUpdateInProgress = true;
- MUIElement e = (MUIElement) event.widget.getData(OWNING_ME);
- if (e instanceof MPartSashContainerElement
- && ((EObject) e).eContainer() instanceof MPartSashContainer
- && ((MPartSashContainer) ((EObject) e).eContainer())
- .getRenderer() == RAPSashRenderer.this) {
- updateWeight((MPartSashContainerElement) e);
- }
- } finally {
- layoutUpdateInProgress = false;
- }
- }
- };
-
- private void updateWeight(MPartSashContainerElement e) {
- SashForm s = (SashForm) e.getParent().getWidget();
- Widget child = (Widget) e.getWidget();
-
- int[] weights = s.getWeights();
- Control[] children = s.getChildren();
- for (int i = 0; i < children.length; i++) {
- if (children[i] == child) {
- e.setContainerData(Integer.toString(weights[i]));
- }
- }
- }
-
- @PostConstruct
- void postConstruct() {
- orientationHandler = new EventHandler() {
-
- public void handleEvent(org.osgi.service.event.Event event) {
- MUIElement element = (MUIElement) event
- .getProperty(UIEvents.EventTags.ELEMENT);
- if (element.getRenderer() == RAPSashRenderer.this) {
- MPartSashContainer c = (MPartSashContainer) element;
- ((SashForm) element.getWidget()).setOrientation(c
- .isHorizontal() ? SWT.HORIZONTAL : SWT.VERTICAL);
- }
- }
- };
- containerDataHandler = new EventHandler() {
-
- public void handleEvent(org.osgi.service.event.Event arg0) {
- if (!layoutUpdateInProgress) {
- // TODO Update the weights
- }
- }
- };
-
- broker.subscribe(UIEvents.GenericTile.TOPIC_HORIZONTAL, orientationHandler);
- broker.subscribe(UIEvents.UIElement.TOPIC_CONTAINERDATA,
- containerDataHandler);
- }
-
- @PreDestroy
- void preDestroy() {
-
- }
-
- @Override
- public Object createWidget(MUIElement element, Object parent) {
- MPartSashContainer sashElement = (MPartSashContainer) element;
- SashForm sashForm = new SashForm((Composite) parent,
- sashElement.isHorizontal() ? SWT.HORIZONTAL : SWT.VERTICAL);
- return sashForm;
- }
-
- @Override
- public void processContents(MElementContainer<MUIElement> container) {
- try {
- contentProcessing.add(container);
- super.processContents(container);
- } finally {
- contentProcessing.remove(container);
- }
-
- int vIdx = 0;
- int[] weights = new int[container.getChildren().size()];
- for (MUIElement c : container.getChildren()) {
- if (c.isToBeRendered()) {
- weights[vIdx++] = getWeight(c);
- }
- }
- if (weights.length != vIdx) {
- int[] newWeights = new int[vIdx];
- System.arraycopy(weights, 0, newWeights, 0, vIdx);
- weights = newWeights;
- }
- ((SashForm) container.getWidget()).setWeights(weights);
- }
-
- @Override
- public void childRendered(MElementContainer<MUIElement> parentElement,
- MUIElement element) {
- super.childRendered(parentElement, element);
- Widget widget = (Widget) element.getWidget();
- widget.addListener(SWT.Resize, resizeListener);
-
- if (!contentProcessing.contains(parentElement)) {
- SashForm w = (SashForm) parentElement.getWidget();
- int[] weights = w.getWeights();
- int idx = calcVisibleIndex(element);
- weights[idx] = getWeight(element);
- w.setWeights(weights);
- }
- }
-
- @Override
- public void hideChild(MElementContainer<MUIElement> parentElement,
- MUIElement child) {
- super.hideChild(parentElement, child);
- // TODO Anything to be done??
- }
-
- private static int getWeight(MUIElement element) {
- String info = element.getContainerData();
- if (info == null || info.length() == 0) {
- element.setContainerData(Integer.toString(10000));
- info = element.getContainerData();
- }
-
- try {
- int value = Integer.parseInt(info);
- return value;
- } catch (NumberFormatException e) {
- return 0;
- }
- }
-}