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