From 511e8e11f067f82f5ba9eed76df59fb5371aa955 Mon Sep 17 00:00:00 2001 From: Jurgen Date: Thu, 16 Jan 2020 14:10:47 +0200 Subject: [PATCH] Improved placeholder implementation (#900) --- .../fxmisc/richtext/GenericStyledArea.java | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java b/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java index 55a3ec05e..488fa3511 100644 --- a/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java +++ b/richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java @@ -16,6 +16,7 @@ import java.util.function.IntSupplier; import java.util.function.IntUnaryOperator; +import javafx.application.Platform; import javafx.beans.NamedArg; import javafx.beans.binding.Bindings; import javafx.beans.property.BooleanProperty; @@ -53,7 +54,6 @@ import javafx.scene.shape.PathElement; import javafx.scene.text.TextFlow; -import javafx.application.Platform; import org.fxmisc.flowless.Cell; import org.fxmisc.flowless.VirtualFlow; import org.fxmisc.flowless.VirtualFlowHit; @@ -802,21 +802,29 @@ public GenericStyledArea( () -> getLength() == 0 && ! isFocused(), lengthProperty(), focusedProperty() ); - - placeHolderProp.addListener( (ob,oldNode,newNode) -> { - if ( oldNode != null ) { - oldNode.visibleProperty().unbind(); - oldNode.layoutXProperty().unbind(); - oldNode.layoutYProperty().unbind(); - getChildren().remove( oldNode ); - setClip( null ); - } - if ( newNode != null ) { - newNode.visibleProperty().bind( showPlaceholder ); - configurePlaceholder( newNode ); - getChildren().add( newNode ); - } - }); + + placeHolderProp.addListener( (ob,ov,newNode) -> displayPlaceHolder( showPlaceholder.getValue(), newNode ) ); + showPlaceholder.addListener( (ob,ov,show) -> displayPlaceHolder( show, getPlaceholder() ) ); + } + + private Node placeholder; + + private void displayPlaceHolder( boolean show, Node newNode ) + { + if ( placeholder != null && (! show || newNode != placeholder) ) + { + placeholder.layoutXProperty().unbind(); + placeholder.layoutYProperty().unbind(); + getChildren().remove( placeholder ); + placeholder = null; + setClip( null ); + } + if ( newNode != null && show && newNode != placeholder ) + { + configurePlaceholder( newNode ); + getChildren().add( newNode ); + placeholder = newNode; + } } protected void configurePlaceholder( Node placeholder ) @@ -1442,9 +1450,9 @@ protected void layoutChildren() { paging = false; }); - Node node = getPlaceholder(); - if (node != null && node.isResizable() && node.isManaged()) { - node.autosize(); + Node holder = placeholder; + if (holder != null && holder.isResizable() && holder.isManaged()) { + holder.autosize(); } }