// Path: src/main/java/com/athaydes/logfx/binding/BindableValue.java
// public class BindableValue<T> extends ObservableValueBase<T> {
// 
//     private T value;
// 
//     public BindableValue( T value ) {
//         this.value = value;
//     }
// 
//     public void setValue( T value ) {
//         this.value = value;
//         fireValueChangedEvent();
//     }
// 
//     @Override
//     public T getValue() {
//         return value;
//     }
// 
// }
// 
// Path: src/main/java/com/athaydes/logfx/data/LogLineColors.java
// public class LogLineColors {
// 
//     private final Paint background;
//     private final Paint fill;
// 
//     public LogLineColors( Paint background, Paint fill ) {
//         this.background = background;
//         this.fill = fill;
//     }
// 
//     public Paint getBackground() {
//         return background;
//     }
// 
//     public Paint getFill() {
//         return fill;
//     }
// }


import com.athaydes.logfx.binding.BindableValue;
import com.athaydes.logfx.data.LogLineColors;
import javafx.animation.Animation;
import javafx.animation.Interpolator;
import javafx.animation.Transition;
import javafx.application.Platform;
import javafx.beans.binding.NumberBinding;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.text.Font;
import javafx.util.Duration;
import java.util.List;
        return this;
    }

    @Override
    public int getLineIndex() {
        return lineIndex;
    }

    @Override
    public String getText() {
        return fullText;
    }

    private void swapSelectableText() {
        var child = getChildren().remove( 0 );
        if ( child == stdLine ) {
            var textField = new TextField( fullText );
            textField.setFont( fontValue.getValue() );
            textField.minWidthProperty().bind( stdLine.minWidthProperty() );
            textField.focusedProperty().addListener( ( ignore ) -> {
                if ( !textField.isFocused() ) swapSelectableText();
            } );
            getChildren().add( textField );
            Platform.runLater( textField::requestFocus );
        } else {
            getChildren().add( stdLine );
        }
    }

    @MustCallOnJavaFXThread
// Path: src/main/java/com/athaydes/logfx/binding/BindableValue.java
// public class BindableValue<T> extends ObservableValueBase<T> {
// 
//     private T value;
// 
//     public BindableValue( T value ) {
//         this.value = value;
//     }
// 
//     public void setValue( T value ) {
//         this.value = value;
//         fireValueChangedEvent();
//     }
// 
//     @Override
//     public T getValue() {
//         return value;
//     }
// 
// }
// 
// Path: src/main/java/com/athaydes/logfx/data/LogLineColors.java
// public class LogLineColors {
// 
//     private final Paint background;
//     private final Paint fill;
// 
//     public LogLineColors( Paint background, Paint fill ) {
//         this.background = background;
//         this.fill = fill;
//     }
// 
//     public Paint getBackground() {
//         return background;
//     }
// 
//     public Paint getFill() {
//         return fill;
//     }
// }


// Path: src/main/java/com/athaydes/logfx/ui/LogLine.java
import com.athaydes.logfx.binding.BindableValue;
import com.athaydes.logfx.data.LogLineColors;
import javafx.animation.Animation;
import javafx.animation.Interpolator;
import javafx.animation.Transition;
import javafx.application.Platform;
import javafx.beans.binding.NumberBinding;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.text.Font;
import javafx.util.Duration;
import java.util.List;

        return this;
    }

    @Override
    public int getLineIndex() {
        return lineIndex;
    }

    @Override
    public String getText() {
        return fullText;
    }

    private void swapSelectableText() {
        var child = getChildren().remove( 0 );
        if ( child == stdLine ) {
            var textField = new TextField( fullText );
            textField.setFont( fontValue.getValue() );
            textField.minWidthProperty().bind( stdLine.minWidthProperty() );
            textField.focusedProperty().addListener( ( ignore ) -> {
                if ( !textField.isFocused() ) swapSelectableText();
            } );
            getChildren().add( textField );
            Platform.runLater( textField::requestFocus );
        } else {
            getChildren().add( stdLine );
        }
    }

    @MustCallOnJavaFXThread
    void setText( String text, LogLineColors colors ) {