package jp.ac.aiit.jointry.models.blocks; import java.lang.reflect.InvocationTargetException; import java.util.logging.Level; import java.util.logging.Logger; import javafx.event.EventHandler; import javafx.scene.Cursor; import javafx.scene.control.Label; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import jp.ac.aiit.jointry.controllers.ResizePane; import jp.ac.aiit.jointry.services.broker.app.BlockDialog; import static jp.ac.aiit.jointry.services.broker.app.JointryCommon.M_BLOCK_CREATE; public class MenuItem extends AnchorPane { public MenuItem(final Class blockClass) { Rectangle rect = new Rectangle(); rect.setWidth(140); rect.setHeight(30); rect.setArcWidth(15); rect.setArcHeight(15); rect.setStroke(Color.GRAY); Block block = null; try { // TODO: Node#getStyleClassでObservableListにクラスaddすれば、 // sytle.cssで色を管理できる……と思う。 rect.setFill((Color) blockClass.getMethod("getColor").invoke(null)); block = (Block) blockClass.newInstance(); } catch (InstantiationException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } catch (SecurityException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalArgumentException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchMethodException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } catch (InvocationTargetException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } Label label = block.getLabel(); AnchorPane.setTopAnchor(rect, 0.0); AnchorPane.setTopAnchor(label, 10.0); AnchorPane.setLeftAnchor(label, 0.0); getChildren().addAll(rect, label); setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { try { final Block block = (Block) blockClass.newInstance(); addToScriptPane(block); BlockDialog.sendMessage(M_BLOCK_CREATE, block); setCursor(Cursor.MOVE); } catch (InstantiationException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(MenuItem.class.getName()).log(Level.SEVERE, null, ex); } } }); setOnMouseReleased(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { setCursor(Cursor.HAND); } }); setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { } }); setOnMouseEntered(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent mouseEvent) { setCursor(Cursor.HAND); } }); } private void addToScriptPane(Block block) { BorderPane root = (BorderPane) getScene().getRoot(); TabPane centerPane = (TabPane) root.getCenter(); for (Tab t : centerPane.getTabs()) { if ("scriptContent".equals(t.getContent().getId())) { ResizePane pane = (ResizePane) t.getContent(); Pane ap = (Pane) pane.getContent(); // calc position pane.resizeContent(); double h = pane.getContentHeight(); if (h != 0) { h += 10; } block.setLayoutY(h); ap.getChildren().add(block); } } } }