content: /*
   * Copyright 2015-2016 Alessio Vinerbi. All rights reserved.
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * This library is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with this library; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   * MA 02110-1301  USA
   */
  /*
   * To change this license header, choose License Headers in Project Properties.
   * To change this template file, choose Tools | Templates
   * and open the template in the editor.
   */
  package com.anchorage.docks.node.ui;
  
  import com.anchorage.docks.node.DockNode;
  import com.anchorage.system.AnchorageSystem;
  import java.util.Objects;
  import javafx.beans.property.StringProperty;
  import javafx.geometry.Bounds;
  import javafx.geometry.Point2D;
  import javafx.scene.CacheHint;
  import javafx.scene.Node;
  import javafx.scene.control.Label;
  import javafx.scene.image.Image;
  import javafx.scene.image.ImageView;
  import javafx.scene.input.MouseButton;
  import javafx.scene.input.MouseEvent;
  import javafx.scene.layout.Pane;
  import javafx.scene.layout.StackPane;
  
  /**
   *
   * @author Alessio
   */
  public final class DockUIPanel extends Pane {
  
      public static final double BAR_HEIGHT = 25;
  
      private Node nodeContent;
      private Label titleLabel;
  
      private Pane barPanel;
      private StackPane contentPanel;
  
      private DockCommandsBox commandsBox;
  
      private DockNode node;
  
      private Point2D deltaDragging;
  
      private boolean subStationStype;
      
      private ImageView iconView;
  
      private DockUIPanel() {
  
      }
  
      public DockUIPanel(String title, Node nodeContent, boolean subStationStype, Image imageIcon) {
  
          getStylesheets().add("anchorfx.css");
          
          this.subStationStype = subStationStype;
  
          Objects.requireNonNull(nodeContent);
          Objects.requireNonNull(title);
  
          this.nodeContent = nodeContent;
  
          buildNode(title,imageIcon);
  
          installDragEventMananger();
  
      }
      
      public void setIcon(Image icon)
      {
          Objects.requireNonNull(icon);
          iconView.setImage(icon);
      }
  
      private void makeCommands() {
          commandsBox = new DockCommandsBox(node);
          barPanel.getChildren().add(commandsBox);
  
          commandsBox.layoutXProperty().bind(barPanel.prefWidthProperty().subtract(commandsBox.getChildren().size() * 30 + 10));
          commandsBox.setLayoutY(0);
  
          titleLabel.prefWidthProperty().bind(commandsBox.layoutXProperty().subtract(10));
      }
  
      public void setDockNode(DockNode node) {
          this.node = node;
          makeCommands();
      }
  
      public StringProperty titleProperty() {
          return titleLabel.textProperty();
      }
  
      private void installDragEventMananger() {
          
          barPanel.setOnMouseClicked(event -> {
              if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) {
                   node.maximizeOrRestore();
              }
          });
  
          barPanel.setOnMouseDragged(event -> {
              if (event.getButton() == MouseButton.PRIMARY) {
                  manageDragEvent(event);
              }
          });
          barPanel.setOnMouseReleased(event -> {
              if (event.getButton() == MouseButton.PRIMARY) {
                  manageReleaseEvent();
              }
          });
      }
  
      private void manageDragEvent(MouseEvent event) {
          if (!node.draggingProperty().get()) {
  
              if (!node.maximizingProperty().get()) {
                  Bounds bounds = node.localToScreen(barPanel.getBoundsInLocal());
  
                  deltaDragging = new Point2D(event.getScreenX() - bounds.getMinX(),
                                              event.getScreenY() - bounds.getMinY());
  
                  node.enableDraggingOnPosition(event.getScreenX() - deltaDragging.getX(), event.getScreenY() - deltaDragging.getY());
              }
  
          }
          else {
              if (node.getFloatableStage() != null && !node.getFloatableStage().inResizing() && node.draggingProperty().get()) {
  
                  if (!node.maximizingProperty().get()) {
                      node.moveFloatable(event.getScreenX() - deltaDragging.getX(),
                                         event.getScreenY() - deltaDragging.getY());
  
                      //node.stationProperty().get().searchTargetNode(event.getScreenX(), event.getScreenY());
                      AnchorageSystem.searchTargetNode(event.getScreenX(), event.getScreenY());
                  }
              }
          }
      }
  
      private void manageReleaseEvent() {
          if (node.draggingProperty().get() && !node.maximizingProperty().get()) {
              AnchorageSystem.finalizeDragging();
          }
      }
  
      private void buildNode(String title, Image iconImage) {
  
          Objects.requireNonNull(iconImage);
          Objects.requireNonNull(title);
          
          barPanel = new Pane();
  
          String titleBarStyle = (!subStationStype) ? "docknode-title-bar" : "substation-title-bar";
  
          barPanel.getStyleClass().add(titleBarStyle);
  
          barPanel.setPrefHeight(BAR_HEIGHT);
          barPanel.relocate(0, 0);
          barPanel.prefWidthProperty().bind(widthProperty());
  
          titleLabel = new Label(title);
  
          String titleTextStyle = (!subStationStype) ? "docknode-title-text" : "substation-title-text";
          
          iconView = new ImageView(iconImage);
          iconView.setFitWidth(15);
          iconView.setFitHeight(15);
          iconView.setPreserveRatio(false);
          iconView.setSmooth(true);
          iconView.relocate(1,(BAR_HEIGHT-iconView.getFitHeight()) / 2);
           
          titleLabel.getStyleClass().add(titleTextStyle);
          barPanel.getChildren().addAll(iconView,titleLabel);
          titleLabel.relocate(25, 5);
  
          contentPanel = new StackPane();
          contentPanel.getStyleClass().add("docknode-content-panel");
          contentPanel.relocate(0, BAR_HEIGHT);
          contentPanel.prefWidthProperty().bind(widthProperty());
          contentPanel.prefHeightProperty().bind(heightProperty().subtract(BAR_HEIGHT));
          contentPanel.getChildren().add(nodeContent);
          
          contentPanel.setCache(true);
          contentPanel.setCacheHint(CacheHint.SPEED);
          
          if (nodeContent instanceof Pane)
          {
              Pane nodeContentPane = (Pane)nodeContent;
              nodeContentPane.setMinHeight(USE_COMPUTED_SIZE);
              nodeContentPane.setMinWidth(USE_COMPUTED_SIZE);
              nodeContentPane.setMaxWidth(USE_COMPUTED_SIZE);
              nodeContentPane.setMaxHeight(USE_COMPUTED_SIZE);
          }
  
          getChildren().addAll(barPanel, contentPanel);
      }
  
      public StackPane getContentContainer()
      {
          return contentPanel;
      }
      /**
       * Get the value of nodeContent
       *
       * @return the value of nodeContent
       */
      public Node getNodeContent() {
          return nodeContent;
      }
   
      public boolean isMenuButtonEnable(){
          return commandsBox.isMenuButtonEnable();
      }
   
  }
  