/******************************************************************************* * Copyright (c) 2016 itemis AG 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: * Matthias Wienand (itemis AG) - initial API and implementation * *******************************************************************************/ package org.eclipse.gef.mvc.examples.logo; import org.eclipse.gef.fx.nodes.InfiniteCanvas; import org.eclipse.gef.mvc.examples.logo.behaviors.PaletteFocusBehavior; import org.eclipse.gef.mvc.fx.viewer.IViewer; import org.eclipse.gef.mvc.fx.viewer.InfiniteCanvasViewer; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; import javafx.geometry.Bounds; import javafx.scene.Parent; import javafx.scene.control.ScrollPane.ScrollBarPolicy; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Pane; import javafx.scene.layout.Priority; public class MvcLogoExampleViewersComposite { private static final double PALETTE_INDICATOR_WIDTH = 10d; private final HBox composite; public MvcLogoExampleViewersComposite(IViewer contentViewer, IViewer paletteViewer) { // determine viewers' root nodes Parent contentRootNode = contentViewer.getCanvas(); final InfiniteCanvas paletteRootNode = ((InfiniteCanvasViewer) paletteViewer).getCanvas(); // arrange viewers above each other AnchorPane viewersPane = new AnchorPane(); viewersPane.getChildren().addAll(contentRootNode, paletteRootNode); // create palette indicator Pane paletteIndicator = new Pane(); paletteIndicator.setStyle("-fx-background-color: rgba(128,128,128,1);"); paletteIndicator.setMaxSize(PALETTE_INDICATOR_WIDTH, Double.MAX_VALUE); paletteIndicator.setMinSize(PALETTE_INDICATOR_WIDTH, 0d); // show palette indicator next to the viewer area composite = new HBox(); // XXX: Set transparent background for the composite HBox, because // otherwise, the HBox will have a grey background. composite.setStyle("-fx-background-color: transparent;"); composite.getChildren().addAll(paletteIndicator, viewersPane); // ensure composite fills the whole space composite.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); composite.setMinSize(0, 0); composite.setFillHeight(true); // no spacing between viewers and palette indicator composite.setSpacing(0d); // ensure viewers fill the space HBox.setHgrow(viewersPane, Priority.ALWAYS); viewersPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); AnchorPane.setBottomAnchor(contentRootNode, 0d); AnchorPane.setLeftAnchor(contentRootNode, 0d); AnchorPane.setRightAnchor(contentRootNode, 0d); AnchorPane.setTopAnchor(contentRootNode, 0d); AnchorPane.setBottomAnchor(paletteRootNode, 0d); AnchorPane.setLeftAnchor(paletteRootNode, 0d); AnchorPane.setTopAnchor(paletteRootNode, 0d); // disable grid layer for palette paletteRootNode.setZoomGrid(false); paletteRootNode.setShowGrid(false); // disable horizontal scrollbar for palette paletteRootNode.setHorizontalScrollBarPolicy(ScrollBarPolicy.NEVER); // set palette background paletteRootNode.setStyle(PaletteFocusBehavior.DEFAULT_STYLE); // hide palette at first paletteRootNode.setVisible(false); // register listener to show/hide palette paletteIndicator.setOnMouseEntered(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { paletteRootNode.setVisible(true); } }); paletteRootNode.setOnMouseExited(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { paletteRootNode.setVisible(false); } }); // register listeners to update the palette width paletteRootNode.getContentGroup().layoutBoundsProperty().addListener(new ChangeListener<Bounds>() { @Override public void changed(ObservableValue<? extends Bounds> observable, Bounds oldValue, Bounds newValue) { double scrollBarWidth = paletteRootNode.getVerticalScrollBar().isVisible() ? paletteRootNode.getVerticalScrollBar().getLayoutBounds().getWidth() : 0; paletteRootNode.setPrefWidth(newValue.getWidth() + scrollBarWidth); } }); paletteRootNode.getVerticalScrollBar().visibleProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { double contentWidth = paletteRootNode.getContentGroup().getLayoutBounds().getWidth(); double scrollBarWidth = newValue ? paletteRootNode.getVerticalScrollBar().getLayoutBounds().getWidth() : 0; paletteRootNode.setPrefWidth(contentWidth + scrollBarWidth); } }); // hide palette when a palette element is pressed paletteRootNode.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (event.getTarget() != paletteRootNode) { paletteRootNode.setVisible(false); } } }); } public Parent getComposite() { return composite; } }