org.controlsfx.control.HiddenSidesPane Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of controlsfx Show documentation
Show all versions of controlsfx Show documentation
High quality UI controls and other tools to complement the core JavaFX distribution
/**
* Copyright (c) 2014, 2015, 2018 ControlsFX
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of ControlsFX, any associated website, nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.controlsfx.control;
import impl.org.controlsfx.skin.HiddenSidesPaneSkin;
import java.util.Objects;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Side;
import javafx.scene.Node;
import javafx.scene.control.Skin;
import javafx.util.Duration;
/**
* A pane used to display a full-size content node and four initially hidden
* nodes on the four sides. The hidden nodes can be made visible by moving the
* mouse cursor to the edges (see {@link #setTriggerDistance(double)}) of the
* pane. The hidden node will appear (at its preferred width or height) with a
* short slide-in animation. The node will disappear again as soon as the mouse
* cursor exits it. A hidden node / side can also be pinned by calling
* {@link #setPinnedSide(Side)}. It will remain visible as long as it stays
* pinned.
*
* Screenshot
The following screenshots shows the right side node
* hovering over a table after it was made visible:
*
*
*
* Code Sample
*
*
* HiddenSidesPane pane = new HiddenSidesPane();
* pane.setContent(new TableView());
* pane.setRight(new ListView());
*
*/
public class HiddenSidesPane extends ControlsFXControl {
/**
* Constructs a new pane with the given content node and the four side
* nodes. Each one of the side nodes may be null.
*
* @param content
* the primary node that will fill the entire width and height of
* the pane
* @param top
* the hidden node on the top side
* @param right
* the hidden node on the right side
* @param bottom
* the hidden node on the bottom side
* @param left
* the hidden node on the left side
*/
public HiddenSidesPane(Node content, Node top, Node right, Node bottom,
Node left) {
setContent(content);
setTop(top);
setRight(right);
setBottom(bottom);
setLeft(left);
}
/**
* Constructs a new pane with no content and no side nodes.
*/
public HiddenSidesPane() {
this(null, null, null, null, null);
}
@Override
protected Skin> createDefaultSkin() {
return new HiddenSidesPaneSkin(this);
}
private DoubleProperty triggerDistance = new SimpleDoubleProperty(this,
"triggerDistance", 16); //$NON-NLS-1$
/**
* The property that stores the distance to the pane's edges that will
* trigger the appearance of the hidden side nodes.
* Setting the property to zero or a negative value will disable this
* functionality, so a hidden side can only be made visible with
* {@link #setPinnedSide(Side)}.
*
* @return the trigger distance property
*/
public final DoubleProperty triggerDistanceProperty() {
return triggerDistance;
}
/**
* Returns the value of the trigger distance property.
*
* @return the trigger distance property value
*/
public final double getTriggerDistance() {
return triggerDistance.get();
}
/**
* Set the value of the trigger distance property.
* Setting the property to zero or a negative value will disable this
* functionality, so a hidden side can only be made visible with
* {@link #setPinnedSide(Side)}.
*
* @param distance
* the new value for the trigger distance property
*/
public final void setTriggerDistance(double distance) {
triggerDistance.set(distance);
}
// Content node support.
private ObjectProperty content = new SimpleObjectProperty<>(this,
"content"); //$NON-NLS-1$
/**
* The property that is used to store a reference to the content node. The
* content node will fill the entire width and height of the pane.
*
* @return the content node property
*/
public final ObjectProperty contentProperty() {
return content;
}
/**
* Returns the value of the content node property.
*
* @return the content node property value
*/
public final Node getContent() {
return contentProperty().get();
}
/**
* Sets the value of the content node property.
*
* @param content
* the new content node
*/
public final void setContent(Node content) {
contentProperty().set(content);
}
// Top node support.
private ObjectProperty top = new SimpleObjectProperty<>(this,
"top"); //$NON-NLS-1$
/**
* The property used to store a reference to the node shown at the top side
* of the pane.
*
* @return the hidden node at the top side of the pane
*/
public final ObjectProperty topProperty() {
return top;
}
/**
* Returns the value of the top node property.
*
* @return the top node property value
*/
public final Node getTop() {
return topProperty().get();
}
/**
* Sets the value of the top node property.
*
* @param top
* the top node value
*/
public final void setTop(Node top) {
topProperty().set(top);
}
// Right node support.
/**
* The property used to store a reference to the node shown at the right
* side of the pane.
*
* @return the hidden node at the right side of the pane
*/
private ObjectProperty right = new SimpleObjectProperty<>(this,
"right"); //$NON-NLS-1$
/**
* Returns the value of the right node property.
*
* @return the right node property value
*/
public final ObjectProperty rightProperty() {
return right;
}
/**
* Returns the value of the right node property.
*
* @return the right node property value
*/
public final Node getRight() {
return rightProperty().get();
}
/**
* Sets the value of the right node property.
*
* @param right
* the right node value
*/
public final void setRight(Node right) {
rightProperty().set(right);
}
// Bottom node support.
/**
* The property used to store a reference to the node shown at the bottom
* side of the pane.
*
* @return the hidden node at the bottom side of the pane
*/
private ObjectProperty bottom = new SimpleObjectProperty<>(this,
"bottom"); //$NON-NLS-1$
/**
* Returns the value of the bottom node property.
*
* @return the bottom node property value
*/
public final ObjectProperty bottomProperty() {
return bottom;
}
/**
* Returns the value of the bottom node property.
*
* @return the bottom node property value
*/
public final Node getBottom() {
return bottomProperty().get();
}
/**
* Sets the value of the bottom node property.
*
* @param bottom
* the bottom node value
*/
public final void setBottom(Node bottom) {
bottomProperty().set(bottom);
}
// Left node support.
/**
* The property used to store a reference to the node shown at the left side
* of the pane.
*
* @return the hidden node at the left side of the pane
*/
private ObjectProperty left = new SimpleObjectProperty<>(this,
"left"); //$NON-NLS-1$
/**
* Returns the value of the left node property.
*
* @return the left node property value
*/
public final ObjectProperty leftProperty() {
return left;
}
/**
* Returns the value of the left node property.
*
* @return the left node property value
*/
public final Node getLeft() {
return leftProperty().get();
}
/**
* Sets the value of the left node property.
*
* @param left
* the left node value
*/
public final void setLeft(Node left) {
leftProperty().set(left);
}
// Pinned side support.
private ObjectProperty pinnedSide = new SimpleObjectProperty<>(
this, "pinnedSide"); //$NON-NLS-1$
/**
* Returns the pinned side property. The value of this property determines
* if one of the four hidden sides stays visible all the time.
*
* @return the pinned side property
*/
public final ObjectProperty pinnedSideProperty() {
return pinnedSide;
}
/**
* Returns the value of the pinned side property.
*
* @return the pinned side property value
*/
public final Side getPinnedSide() {
return pinnedSideProperty().get();
}
/**
* Sets the value of the pinned side property.
*
* @param side
* the new pinned side value
*/
public final void setPinnedSide(Side side) {
pinnedSideProperty().set(side);
}
// slide in animation delay
private final ObjectProperty animationDelay = new SimpleObjectProperty<>(
this, "animationDelay", Duration.millis(300)); //$NON-NLS-1$
/**
* Returns the animation delay property. The value of this property
* determines the delay before the hidden side slide in / slide out
* animation starts to play.
*
* @return animation delay property
*/
public final ObjectProperty animationDelayProperty() {
return animationDelay;
}
/**
* Returns the animation delay
*
* @return animation delay
*/
public final Duration getAnimationDelay() {
return animationDelay.get();
}
/**
* Set the animation delay
*
* @param duration
* slide in animation delay
*/
public final void setAnimationDelay(Duration duration) {
animationDelay.set(duration);
}
// slide in / slide out duration
private final ObjectProperty animationDuration = new SimpleObjectProperty<>(
this, "animationDuration", Duration.millis(200)); //$NON-NLS-1$
/**
* Returns the animation duration property. The value of this property
* determines the fade in time for a hidden side to become visible.
*
* @return animation delay property
*/
public final ObjectProperty animationDurationProperty() {
return animationDuration;
}
/**
* Returns the animation delay
*
* @return animation delay
*/
public final Duration getAnimationDuration() {
return animationDuration.get();
}
/**
* Set the animation delay
*
* @param duration
* animation duration
*/
public final void setAnimationDuration(Duration duration) {
animationDuration.set(duration);
}
/**
* Shows a specific side
*
* @param side
* the side to show
*/
public void show(Side side) {
Objects.requireNonNull(side, "side cannot be null");
getProperties().put("showPane", side);
}
/**
* Hides the currently showing side
*/
public void hide() {
getProperties().put("showPane", null);
}
}