package bluej.stride.generic;

import java.util.List;
import javafx.animation.FadeTransition;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.DoubleBinding;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.css.CssMetaData;
import javafx.css.SimpleStyleableDoubleProperty;
import javafx.css.Styleable;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.OverrunStyle;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.Translate;
import javafx.util.Duration;

import bluej.utility.javafx.JavaFXUtil;

public class Sidebar
{       
private final Node node;
   
   private final Label label;

   
   public Sidebar(Label label, Node node)
   {        
      this.label = label;
       
      this.node = node;     
      }

   
   public Node getNode()
   {        
      return node;     
      }

   
   public StringProperty textProperty()
   {
      return label.textProperty();     
      }

   
   public void setText(String value)
   {
      label.setText(value);     
      }

   
   public Node getStyleable()
   {        
      return label;     
      }

   
   private static class SidebarLabel
extends Label
   {        
      private final SimpleStyleableDoubleProperty leftMarginProperty = new SimpleStyleableDoubleProperty(SIDEBAR_LABEL_LEFT_MARGIN_META_DATA);
       
      private final SimpleStyleableDoubleProperty leftMarginProperty()
{
return leftMarginProperty; 
         }

       
      private final SimpleStyleableDoubleProperty topMarginProperty = new SimpleStyleableDoubleProperty(SIDEBAR_LABEL_TOP_MARGIN_META_DATA);
       
      private final SimpleStyleableDoubleProperty topMarginProperty()
{
return topMarginProperty; 
         }

       
      private static final CssMetaData<SidebarLabel, Number> SIDEBAR_LABEL_LEFT_MARGIN_META_DATA =
      JavaFXUtil.cssSize("-bj-left-margin", SidebarLabel::leftMarginProperty);
       
      private static final CssMetaData<SidebarLabel, Number> SIDEBAR_LABEL_TOP_MARGIN_META_DATA =
      JavaFXUtil.cssSize("-bj-top-margin", SidebarLabel::topMarginProperty);
    
       
      private static final List<CssMetaData <? extends Styleable, ? > > cssMetaDataList =
      JavaFXUtil.extendCss(Label.getClassCssMetaData())
      .add(SIDEBAR_LABEL_LEFT_MARGIN_META_DATA)
      .add(SIDEBAR_LABEL_TOP_MARGIN_META_DATA)
      .build();

       
      public static List  > getClassCssMetaData()
{
return cssMetaDataList; 
         }
       
      @Override public List> getControlCssMetaData()
{
return getClassCssMetaData(); 
         }      
      }

   p.public static Sidebar addSidebar(final InteractionManager editor,
           
   final Pane containedPane,
           
   final Observable observableBounds,
           
   String stylePrefix) {        
      final SidebarLabel sidebar = new SidebarLabel();
       
      
      
      
      Group g = new Group(sidebar);
      g.setManaged(false);
      sidebar.getStyleClass().addAll("sidelabel", stylePrefix + "sidelabel");
      sidebar.setOpacity(0.0);
      containedPane.getChildren().add(g);
      if (editor == null || editor.getWindowOverlayPane() == null)
       {
         sidebar.setVisible(false);         
         }
       

      else
       {            
         DoubleBinding containedPaneOffset = new DoubleBinding() {{ super.bind(editor.getObservableScroll()); 
               super.bind(editor.getObservableViewportHeight());
               super.bind(observableBounds);
                 
               super.bind(containedPane.localToSceneTransformProperty()); 
               }
                
               
            @Override
               
            protected double computeValue()
               {                    
               
               return (int) -(editor.getWindowOverlayPane().sceneYToWindowOverlayY(containedPane.localToScene(0, 0).getY()));                 
               }             
            };
         containedPaneOffset.addListener(new ChangeListener<Number>() {                     
            @Override
               
            public void changed(ObservableValue<? extends Number> arg0,
                       
            Number oldVal, Number newVal)
               {                    
               
               if ((oldVal.doubleValue() <= 0 && newVal.doubleValue() > 0) || (oldVal.doubleValue() > 0 && newVal.doubleValue() <= 0))
                   {                        
                  FadeTransition ft = new FadeTransition(Duration.millis(200), sidebar);
                  ft.setToValue(newVal.doubleValue() <= 0 ? 0.0 : 1.0);
                  ft.play();                     
                  }                 
               }             
            });
         sidebar.setEllipsisString("\u22EF");
           
         
         
         
         sidebar.setTextOverrun(OverrunStyle.CENTER_ELLIPSIS);
            
           
         
         
         
         DoubleBinding sidebarOffset = Bindings.max(0.0, containedPaneOffset).add(sidebar.topMarginProperty());
            
         
         
         sidebar.maxWidthProperty().bind(
         Bindings.min(
         containedPane.heightProperty().subtract(sidebarOffset)
         , editor.getObservableViewportHeight().subtract(sidebar.topMarginProperty())
         ).subtract(25.0) 
| bottom margin
|
;
           
         
            Rotate r = new Rotate(-90.0, 0.0, 0.0);
               
            Translate t = new Translate();
               
            
            t.xProperty().bind(sidebar.widthProperty().add(sidebarOffset).negate());
            t.yProperty().bind(sidebar.leftMarginProperty());
            sidebar.getTransforms().addAll(r, t);             
            }
            
           
         
         
         sidebar.visibleProperty().bind(sidebar.maxWidthProperty().greaterThanOrEqualTo(10.0));         
         }
       
      return new Sidebar(sidebar, g);     
      } 
   }
top, use, map, class Sidebar

.   Sidebar
.   getNode
.   textProperty
.   setText
.   getStyleable

top, use, map, class Sidebar . SidebarLabel

.   leftMarginProperty
.   topMarginProperty
.   getClassCssMetaData
.   getControlCssMetaData
.   addSidebar
.   computeValue
.   changed




200 neLoCode + 1 LoComm