Bug 464382 - Add support to show lightweight dialogs
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WCompositePart.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WCompositePart.java
index 82251e8..6dcd818 100644
--- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WCompositePart.java
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WCompositePart.java
@@ -22,7 +22,7 @@
  * @param <N>
  *            the native widget
  */
-public interface WCompositePart<N> extends WLayoutedWidget<MCompositePart> {
+public interface WCompositePart<N> extends WLayoutedWidget<MCompositePart>, WDialogHost {
 	/**
 	 * PersistatedState Key to fix the layout.
 	 * <p>
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPart.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPart.java
index 46e9a76..2a32960 100755
--- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPart.java
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPart.java
@@ -23,7 +23,7 @@
  * @param <M>
  *            the menu widget
  */
-public interface WPart<N, T, M> extends WLayoutedWidget<MPart> {
+public interface WPart<N, T, M> extends WLayoutedWidget<MPart>, WDialogHost {
 	/**
 	 * Set a toolbar
 	 * 
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPerspective.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPerspective.java
index ad34941..3002279 100755
--- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPerspective.java
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.base/src/org/eclipse/fx/ui/workbench/renderers/base/widget/WPerspective.java
@@ -23,7 +23,7 @@
  * @param <N>

  *            the native

  */

-public interface WPerspective<N> extends WLayoutedWidget<MPerspective> {

+public interface WPerspective<N> extends WLayoutedWidget<MPerspective>, WDialogHost {

 

 	/**

 	 * Append widgets

diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java
index 3fa5d39..7737560 100644
--- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefCompositePartRenderer.java
@@ -27,6 +27,7 @@
 import javafx.scene.input.MouseEvent;
 import javafx.scene.layout.AnchorPane;
 import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.Pane;
 import javafx.scene.layout.StackPane;
 
 import javax.inject.Inject;
@@ -219,7 +220,35 @@
 	}
 
 	static class WFixedSashImpl extends AbstractCompositePartImpl<GridLayoutPane> {
-
+		private StackPane overlayContainer;
+		
+		@Override
+		public void setDialog(Object dialogNode) {
+			@NonNull
+			Pane staticLayoutNode = (@NonNull Pane) getStaticLayoutNode();
+			if (dialogNode == null) {
+				if (this.overlayContainer != null) {
+					((Pane) staticLayoutNode).getChildren().remove(this.overlayContainer);
+					this.overlayContainer.getChildren().clear();
+				}
+			} else {
+				if (this.overlayContainer == null) {
+					this.overlayContainer = new StackPane();
+					this.overlayContainer.getStyleClass().add("overlay-container"); //$NON-NLS-1$
+					this.overlayContainer.setManaged(false);
+					this.overlayContainer.setMouseTransparent(false);
+					staticLayoutNode.layoutBoundsProperty().addListener( o -> {
+						staticLayoutNode.layoutBoundsProperty().get();
+						this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
+					});
+				}
+				
+				this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
+				this.overlayContainer.getChildren().setAll((Node)dialogNode);
+				((Pane) staticLayoutNode).getChildren().add(this.overlayContainer);
+			}
+		}
+		
 		private static @NonNull GridData toGridData(Map<String, String> dataMap) {
 			GridData gd = new GridData();
 			if (dataMap.containsKey(WCompositePart.FIXED_LAYOUT_WIDTH)) {
@@ -355,6 +384,35 @@
 	static class WResizableSashImpl extends AbstractCompositePartImpl<SplitPane> {
 		private List<WLayoutedWidget<MPartSashContainerElement>> items = new ArrayList<WLayoutedWidget<MPartSashContainerElement>>();
 
+		private StackPane overlayContainer;
+		
+		@Override
+		public void setDialog(Object dialogNode) {
+			@NonNull
+			Pane staticLayoutNode = (@NonNull Pane) getStaticLayoutNode();
+			if (dialogNode == null) {
+				if (this.overlayContainer != null) {
+					((Pane) staticLayoutNode).getChildren().remove(this.overlayContainer);
+					this.overlayContainer.getChildren().clear();
+				}
+			} else {
+				if (this.overlayContainer == null) {
+					this.overlayContainer = new StackPane();
+					this.overlayContainer.getStyleClass().add("overlay-container"); //$NON-NLS-1$
+					this.overlayContainer.setManaged(false);
+					this.overlayContainer.setMouseTransparent(false);
+					staticLayoutNode.layoutBoundsProperty().addListener( o -> {
+						staticLayoutNode.layoutBoundsProperty().get();
+						this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
+					});
+				}
+				
+				this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
+				this.overlayContainer.getChildren().setAll((Node)dialogNode);
+				((Pane) staticLayoutNode).getChildren().add(this.overlayContainer);
+			}
+		}
+		
 		ChangeListener<Number> listener = new ChangeListener<Number>() {
 			boolean queueing;
 
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPartRenderer.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPartRenderer.java
index 5fa1aa2..3f039b4 100755
--- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPartRenderer.java
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPartRenderer.java
@@ -113,6 +113,8 @@
 		private WMenu<Node> viewMenuWidget;
 		private WToolBar<Node> viewToolbarWidget;
 		
+		private StackPane overlayContainer;
+		
 		@Override
 		protected Pane createWidget() {
 			Pane tmp = CustomContainerSupport.createContainerPane(this.logger, this.context);
@@ -294,6 +296,33 @@
 		public @Nullable WToolBar<Node> getToolbar() {
 			return this.viewToolbarWidget;
 		}
+		
+		@Override
+		public void setDialog(Object dialogNode) {
+			@NonNull
+			Pane staticLayoutNode = (@NonNull Pane) getStaticLayoutNode();
+			if (dialogNode == null) {
+				if (this.overlayContainer != null) {
+					((Pane) staticLayoutNode).getChildren().remove(this.overlayContainer);
+					this.overlayContainer.getChildren().clear();
+				}
+			} else {
+				if (this.overlayContainer == null) {
+					this.overlayContainer = new StackPane();
+					this.overlayContainer.getStyleClass().add("overlay-container"); //$NON-NLS-1$
+					this.overlayContainer.setManaged(false);
+					this.overlayContainer.setMouseTransparent(false);
+					staticLayoutNode.layoutBoundsProperty().addListener( o -> {
+						staticLayoutNode.layoutBoundsProperty().get();
+						this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
+					});
+				}
+				
+				this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());
+				this.overlayContainer.getChildren().setAll((Node)dialogNode);
+				((Pane) staticLayoutNode).getChildren().add(this.overlayContainer);
+			}
+		}
 	}
 
 	static class HandleGroup extends Group {
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPerspectiveRenderer.java b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPerspectiveRenderer.java
index 038e0c0..73135d2 100755
--- a/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPerspectiveRenderer.java
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.renderers.fx/src/org/eclipse/fx/ui/workbench/renderers/fx/DefPerspectiveRenderer.java
@@ -14,6 +14,8 @@
 import java.util.List;

 

 import javafx.scene.Node;

+import javafx.scene.layout.Pane;

+import javafx.scene.layout.StackPane;

 

 import org.eclipse.e4.ui.model.application.ui.MUIElement;

 import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;

@@ -23,19 +25,21 @@
 import org.eclipse.fx.ui.workbench.renderers.base.widget.WLayoutedWidget;

 import org.eclipse.fx.ui.workbench.renderers.base.widget.WPerspective;

 import org.eclipse.fx.ui.workbench.renderers.fx.widget.WLayoutedWidgetImpl;

+import org.eclipse.jdt.annotation.NonNull;

 

 /**

  * default renderer for {@link MPerspective}

  */

 public class DefPerspectiveRenderer extends BasePerspectiveRenderer<FillLayoutPane> {

-

+	

 	@Override

 	protected Class<? extends WPerspective<FillLayoutPane>> getWidgetClass(MPerspective perspective) {

 		return PerspectiveWidgetImpl.class;

 	}

 

 	static class PerspectiveWidgetImpl extends WLayoutedWidgetImpl<FillLayoutPane, FillLayoutPane, MPerspective> implements WPerspective<FillLayoutPane> {

-

+		private StackPane overlayContainer;

+		

 		@Override

 		protected FillLayoutPane getWidgetNode() {

 			return getWidget();

@@ -65,5 +69,32 @@
 			getWidget().getChildren().remove(widget.getStaticLayoutNode());

 		}

 

+		@Override

+		public void setDialog(Object dialogNode) {

+			@NonNull

+			Pane staticLayoutNode = (@NonNull Pane) getStaticLayoutNode();

+			if (dialogNode == null) {

+				if (this.overlayContainer != null) {

+					((Pane) staticLayoutNode).getChildren().remove(this.overlayContainer);

+					this.overlayContainer.getChildren().clear();

+				}

+			} else {

+				if (this.overlayContainer == null) {

+					this.overlayContainer = new StackPane();

+					this.overlayContainer.getStyleClass().add("overlay-container"); //$NON-NLS-1$

+					this.overlayContainer.setManaged(false);

+					this.overlayContainer.setMouseTransparent(false);

+					staticLayoutNode.layoutBoundsProperty().addListener( o -> {

+						staticLayoutNode.layoutBoundsProperty().get();

+						this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());

+					});

+				}

+				

+				this.overlayContainer.resize(staticLayoutNode.getWidth(), staticLayoutNode.getHeight());

+				this.overlayContainer.getChildren().setAll((Node)dialogNode);

+				((Pane) staticLayoutNode).getChildren().add(this.overlayContainer);

+			}

+		}

+

 	}

 }