Merge branch 'master' into adapt-sash-layout
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;
-		}
-	}
-}