package at.bestsolution.e4.ui.workbench.renderers.jfx; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.input.MouseEvent; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; import javafx.stage.Screen; import javafx.stage.Stage; import javafx.stage.StageStyle; 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.MUILabel; 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.basic.MTrimmedWindow; import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.e4.ui.workbench.IPresentationEngine; @SuppressWarnings("restriction") public class WBWRenderer extends JFXPartRenderer { protected double mouseDragOffsetX; protected double mouseDragOffsetY; @Override public Object createWidget(MUIElement element) { if( !(element instanceof MWindow) ) { return null; } MWindow mWindow = (MWindow) element; Stage stage = new Stage(); stage.setX(mWindow.getX()); stage.setY(mWindow.getY()); stage.setWidth(mWindow.getWidth()); stage.setHeight(mWindow.getHeight()); stage.initStyle(StageStyle.UNDECORATED); BorderPane rootPane = new BorderPane(); VBox topPane = new VBox(); topPane.getChildren().add(createTopDecoration(stage)); HBox centerPane = new HBox(); rootPane.setTop(topPane); rootPane.setCenter(centerPane); Scene scene = new Scene(rootPane, mWindow.getWidth(), mWindow.getHeight()); // URL url = Platform.getBundle("at.bestsolution.e4.addressbook.jfx.application").getResource("test.css"); // try { // URL url2 = new URL(url.toString()); // System.err.println("Stream:" +url2.openStream()); // } catch (MalformedURLException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } catch (IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } scene.getStylesheets().add("/css/test.css"); //FIXME This has to be replaced by contributions stage.setScene(scene); setCSSInfo(element, rootPane); stage.setTitle(mWindow.getLocalizedLabel()); return stage; } private Node createTopDecoration(final Stage stage) { HBox box = new HBox(); box.getStyleClass().add("top-decoration"); Region spacer = new Region(); HBox.setHgrow(spacer, Priority.ALWAYS); box.getChildren().add(spacer); HBox windowBtns = new HBox(3); Button close = new Button(); close.getStyleClass().add("window-close-button"); close.setMinSize(16,16); close.setPrefSize(16,16); close.setMaxSize(16,16); close.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { System.exit(0); } }); Button min = new Button(); min.getStyleClass().add("window-min-button"); min.setMinSize(16,16); min.setPrefSize(16,16); min.setMaxSize(16,16); min.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { stage.setIconified(true); } }); Button max = new Button(); max.getStyleClass().add("window-max-button"); max.setMinSize(16,16); max.setPrefSize(16,16); max.setMaxSize(16,16); max.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { Screen screen = Screen.getPrimary(); // todo something more sensible stage.setX(screen.getVisualBounds().getMinX()); stage.setY(screen.getVisualBounds().getMinY()); stage.setWidth(screen.getVisualBounds().getWidth()); stage.setHeight(screen.getVisualBounds().getHeight()); } }); windowBtns.getChildren().addAll(min, max, close); box.getChildren().add(windowBtns); box.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { mouseDragOffsetX = event.getSceneX(); mouseDragOffsetY = event.getSceneY(); } }); box.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { stage.setX(event.getScreenX()-mouseDragOffsetX); stage.setY(event.getScreenY()-mouseDragOffsetY); } }); return box; } @Override public void postProcess(MUIElement childElement) { super.postProcess(childElement); Stage stage = (Stage) childElement.getWidget(); if( childElement.isVisible() ) { stage.setVisible(true); } } @Override public void processContents(MElementContainer<MUIElement> container) { if( !(((MUIElement)container) instanceof MWindow) ) { return; } super.processContents(container); Stage stage = (Stage) container.getWidget(); BorderPane rootPane = (BorderPane) stage.getScene().getRoot(); VBox topPane = (VBox) rootPane.getTop(); HBox centerPane = (HBox) rootPane.getCenter(); for( MUIElement e : container.getChildren() ) { if( e.getWidget() != null ) { Node n = (Node) e.getWidget(); HBox.setHgrow(n, Priority.ALWAYS); centerPane.getChildren().add(n); } } IPresentationEngine engine = (IPresentationEngine) context .get(IPresentationEngine.class.getName()); if ( (MUIElement)container instanceof MTrimmedWindow) { MTrimmedWindow tWindow = (MTrimmedWindow) (MUIElement)container; for (MTrimBar trimBar : tWindow.getTrimBars()) { Object o = engine.createGui(trimBar, null, tWindow.getContext()); if( o != null ) { if( trimBar.getSide() == SideValue.TOP ) { Node n = (Node) o; VBox.setVgrow(n, Priority.ALWAYS); topPane.getChildren().add(n); } } } } } @Override protected Object getParentWidget(MUIElement element) { // TODO Auto-generated method stub return null; } @Override public void disposeWidget(MUIElement part) { // TODO Auto-generated method stub } @Override public void childRendered(MElementContainer<MUIElement> parentElement, MUIElement element) { // TODO Auto-generated method stub } @Override protected Object getImage(MUILabel element) { // TODO Auto-generated method stub return null; } @Override protected boolean requiresFocus(MPart element) { // TODO Auto-generated method stub return false; } @Override public void hookControllerLogic(MUIElement me) { super.hookControllerLogic(me); Object widget = me.getWidget(); if( widget instanceof Stage ) { Stage stage = (Stage) widget; final MWindow window = (MWindow) me; stage.widthProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) { window.setWidth(arg2.intValue()); } }); stage.heightProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) { window.setHeight(arg2.intValue()); } }); stage.xProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) { window.setX(arg2.intValue()); } }); stage.yProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) { window.setY(arg2.intValue()); } }); } } }