Search in sources :

Example 16 with IndexRange

use of javafx.scene.control.IndexRange in project Gargoyle by callakrsos.

the class PagedCodeAreaFindAndReplaceHelper method findReplaceEvent.

/**
	 * 찾기 바꾸기 이벤트
	 *
	 * @작성자 : KYJ
	 * @작성일 : 2016. 10. 13.
	 * @param e
	 */
protected void findReplaceEvent(Event e) {
    if (e.isConsumed())
        return;
    SimpleTextView currentPageView = view.getCurrentPageView();
    CodeArea codeArea = currentPageView.getCodeArea();
    ObservableValue<String> textProperty = codeArea.textProperty();
    TextSearchAndReplaceView textSearchView = new TextSearchAndReplaceView(codeArea, textProperty);
    textSearchView.setOnSearchResultListener((vo) -> {
        switch(vo.getSearchType()) {
            case SEARCH_SIMPLE:
                {
                    int startIndex = vo.getStartIndex();
                    int endIndex = vo.getEndIndex();
                    codeArea.selectRange(startIndex, endIndex);
                    LOGGER.debug(String.format("find text : %s startIdx :%d endIdx :%d", vo.getSearchText(), startIndex, endIndex));
                    break;
                }
            case SEARCH_ALL:
                {
                    int startIndex = vo.getStartIndex();
                    String searchText = vo.getSearchText();
                    String replaceText = vo.getReplaceText();
                    // codeArea.getUndoManager().mark();
                    // codeArea.replaceText(startIndex, (startIndex +
                    // searchText.length()), replaceText);
                    setContent(startIndex, startIndex + searchText.length(), replaceText);
                    break;
                }
        }
    });
    textSearchView.setOnReplaceResultListener(vo -> {
        switch(vo.getReaplceType()) {
            case SIMPLE:
                {
                    String reaplceResult = vo.getReaplceResult();
                    setContent(reaplceResult);
                    break;
                }
            case ALL:
                {
                    String reaplceResult = vo.getReaplceResult();
                    setContent(reaplceResult);
                    break;
                }
        }
    });
    textSearchView.setOnSelectionMoveListener(vo -> {
        codeArea.selectRange(vo.getStartIndex(), vo.getEndIndex());
    });
    textSearchView.isSelectScopePropertyProperty().addListener((oba, oldval, newval) -> {
        if (newval)
            LOGGER.debug("User Select Locale Scope..");
        else
            LOGGER.debug("User Select Gloval Scope..");
    });
    codeArea.setOnMouseClicked(event -> {
        IndexRange selection = codeArea.getSelection();
        int start = selection.getStart();
        textSearchView.setSlidingStartIndexProperty(start);
    });
    textSearchView.show();
    //		codeArea.setOnMouseClicked(defaultSelectionHandler);
    e.consume();
}
Also used : IndexRange(javafx.scene.control.IndexRange) TextSearchAndReplaceView(com.kyj.fx.voeditor.visual.component.popup.TextSearchAndReplaceView) CodeArea(org.fxmisc.richtext.CodeArea)

Example 17 with IndexRange

use of javafx.scene.control.IndexRange in project RichTextFX by FXMisc.

the class GenericStyledArea method getParagraphSelection.

@Override
public IndexRange getParagraphSelection(Selection selection, int paragraph) {
    int startPar = selection.getStartParagraphIndex();
    int endPar = selection.getEndParagraphIndex();
    if (paragraph < startPar || paragraph > endPar) {
        return EMPTY_RANGE;
    }
    int start = paragraph == startPar ? selection.getStartColumnPosition() : 0;
    int end = paragraph == endPar ? selection.getEndColumnPosition() : getParagraphLength(paragraph) + 1;
    // force rangeProperty() to be valid
    selection.getRange();
    return new IndexRange(start, end);
}
Also used : IndexRange(javafx.scene.control.IndexRange) Paint(javafx.scene.paint.Paint)

Example 18 with IndexRange

use of javafx.scene.control.IndexRange in project RichTextFX by FXMisc.

the class GenericStyledArea method createCell.

/* ********************************************************************** *
     *                                                                        *
     * Private methods                                                        *
     *                                                                        *
     * ********************************************************************** */
private Cell<Paragraph<PS, SEG, S>, ParagraphBox<PS, SEG, S>> createCell(Paragraph<PS, SEG, S> paragraph, BiConsumer<TextFlow, PS> applyParagraphStyle, Function<StyledSegment<SEG, S>, Node> nodeFactory) {
    ParagraphBox<PS, SEG, S> box = new ParagraphBox<>(paragraph, applyParagraphStyle, nodeFactory);
    box.highlightTextFillProperty().bind(highlightTextFill);
    box.wrapTextProperty().bind(wrapTextProperty());
    box.graphicFactoryProperty().bind(paragraphGraphicFactoryProperty());
    box.graphicOffset.bind(virtualFlow.breadthOffsetProperty());
    EventStream<Integer> boxIndexValues = box.indexProperty().values().filter(i -> i != -1);
    Subscription firstParPseudoClass = boxIndexValues.subscribe(idx -> box.pseudoClassStateChanged(FIRST_PAR, idx == 0));
    Subscription lastParPseudoClass = EventStreams.combine(boxIndexValues, getParagraphs().sizeProperty().values()).subscribe(in -> in.exec((i, n) -> box.pseudoClassStateChanged(LAST_PAR, i == n - 1)));
    // set up caret
    Function<CaretNode, Subscription> subscribeToCaret = caret -> {
        EventStream<Integer> caretIndexStream = EventStreams.nonNullValuesOf(caret.paragraphIndexProperty());
        // a new event stream needs to be created for each caret added, so that it will immediately
        // fire the box's current index value as an event, thereby running the code in the subscribe block
        // Reusing boxIndexValues will not fire its most recent event, leading to a caret not being added
        // Thus, we'll call the new event stream "fresh" box index values
        EventStream<Integer> freshBoxIndexValues = box.indexProperty().values().filter(i -> i != -1);
        return EventStreams.combine(caretIndexStream, freshBoxIndexValues).subscribe(t -> {
            int caretParagraphIndex = t.get1();
            int boxIndex = t.get2();
            if (caretParagraphIndex == boxIndex) {
                box.caretsProperty().add(caret);
            } else {
                box.caretsProperty().remove(caret);
            }
        });
    };
    Subscription caretSubscription = caretSet.addSubscriber(subscribeToCaret);
    // TODO: how should 'hasCaret' be handled now?
    Subscription hasCaretPseudoClass = EventStreams.combine(boxIndexValues, Val.wrap(currentParagraphProperty()).values()).map(t -> t.get1().equals(t.get2())).subscribe(value -> box.pseudoClassStateChanged(HAS_CARET, value));
    Function<Selection<PS, SEG, S>, Subscription> subscribeToSelection = selection -> {
        EventStream<Integer> startParagraphValues = EventStreams.nonNullValuesOf(selection.startParagraphIndexProperty());
        EventStream<Integer> endParagraphValues = EventStreams.nonNullValuesOf(selection.endParagraphIndexProperty());
        // see comment in caret section about why a new box index EventStream is needed
        EventStream<Integer> freshBoxIndexValues = box.indexProperty().values().filter(i -> i != -1);
        return EventStreams.combine(startParagraphValues, endParagraphValues, freshBoxIndexValues).subscribe(t -> {
            int startPar = t.get1();
            int endPar = t.get2();
            int boxIndex = t.get3();
            if (startPar <= boxIndex && boxIndex <= endPar) {
                // So that we don't add multiple paths for the same selection,
                // which leads to not removing the additional paths when selection is removed,
                // this is a `Map#putIfAbsent(Key, Value)` implementation that creates the path lazily
                SelectionPath p = box.selectionsProperty().get(selection);
                if (p == null) {
                    // create & configure path
                    Val<IndexRange> range = Val.create(() -> boxIndex != -1 ? getParagraphSelection(selection, boxIndex) : EMPTY_RANGE, selection.rangeProperty());
                    SelectionPath path = new SelectionPath(range);
                    selection.configureSelectionPath(path);
                    box.selectionsProperty().put(selection, path);
                }
            } else {
                box.selectionsProperty().remove(selection);
            }
        });
    };
    Subscription selectionSubscription = selectionSet.addSubscriber(subscribeToSelection);
    return new Cell<Paragraph<PS, SEG, S>, ParagraphBox<PS, SEG, S>>() {

        @Override
        public ParagraphBox<PS, SEG, S> getNode() {
            return box;
        }

        @Override
        public void updateIndex(int index) {
            box.setIndex(index);
        }

        @Override
        public void dispose() {
            box.highlightTextFillProperty().unbind();
            box.wrapTextProperty().unbind();
            box.graphicFactoryProperty().unbind();
            box.graphicOffset.unbind();
            firstParPseudoClass.unsubscribe();
            lastParPseudoClass.unsubscribe();
            caretSubscription.unsubscribe();
            hasCaretPseudoClass.unsubscribe();
            selectionSubscription.unsubscribe();
        }
    };
}
Also used : EventHandler(javafx.event.EventHandler) NamedArg(javafx.beans.NamedArg) SuspendableNo(org.reactfx.SuspendableNo) IntUnaryOperator(java.util.function.IntUnaryOperator) PseudoClass(javafx.css.PseudoClass) Cell(org.fxmisc.flowless.Cell) BiFunction(java.util.function.BiFunction) TextOps(org.fxmisc.richtext.model.TextOps) SuspendableEventStream(org.reactfx.SuspendableEventStream) PlainTextChange(org.fxmisc.richtext.model.PlainTextChange) StyleConverter(javafx.css.StyleConverter) ContextMenu(javafx.scene.control.ContextMenu) GenericEditableStyledDocument(org.fxmisc.richtext.model.GenericEditableStyledDocument) Duration(java.time.Duration) TwoDimensional(org.fxmisc.richtext.model.TwoDimensional) Point2D(javafx.geometry.Point2D) UndoManager(org.fxmisc.undo.UndoManager) VirtualFlowHit(org.fxmisc.flowless.VirtualFlowHit) SubscribeableContentsObsSet(org.fxmisc.richtext.util.SubscribeableContentsObsSet) Guard(org.reactfx.Guard) ObservableSet(javafx.collections.ObservableSet) UndoUtils(org.fxmisc.richtext.util.UndoUtils) LiveList(org.reactfx.collection.LiveList) CssMetaData(javafx.css.CssMetaData) Event(javafx.event.Event) Virtualized(org.fxmisc.flowless.Virtualized) List(java.util.List) BooleanProperty(javafx.beans.property.BooleanProperty) Region(javafx.scene.layout.Region) TwoLevelNavigator(org.fxmisc.richtext.model.TwoLevelNavigator) Subscription(org.reactfx.Subscription) Tuple2(org.reactfx.util.Tuple2) Paint(javafx.scene.paint.Paint) EventStreams(org.reactfx.EventStreams) Optional(java.util.Optional) SimpleDoubleProperty(javafx.beans.property.SimpleDoubleProperty) Suspendable(org.reactfx.Suspendable) Styleable(javafx.css.Styleable) Bounds(javafx.geometry.Bounds) CornerRadii(javafx.scene.layout.CornerRadii) Val(org.reactfx.value.Val) BoundingBox(javafx.geometry.BoundingBox) MouseEvent(javafx.scene.input.MouseEvent) StyleSpans(org.fxmisc.richtext.model.StyleSpans) FXCollections(javafx.collections.FXCollections) Codec(org.fxmisc.richtext.model.Codec) DoubleProperty(javafx.beans.property.DoubleProperty) TextFlow(javafx.scene.text.TextFlow) Function(java.util.function.Function) MouseOverTextEvent(org.fxmisc.richtext.event.MouseOverTextEvent) ArrayList(java.util.ArrayList) IndexRange(javafx.scene.control.IndexRange) Paragraph(org.fxmisc.richtext.model.Paragraph) Insets(javafx.geometry.Insets) BackgroundFill(javafx.scene.layout.BackgroundFill) BiConsumer(java.util.function.BiConsumer) IntSupplier(java.util.function.IntSupplier) IntFunction(java.util.function.IntFunction) Color(javafx.scene.paint.Color) ObjectProperty(javafx.beans.property.ObjectProperty) ReadOnlyStyledDocument(org.fxmisc.richtext.model.ReadOnlyStyledDocument) Node(javafx.scene.Node) RichTextChange(org.fxmisc.richtext.model.RichTextChange) Replacement(org.fxmisc.richtext.model.Replacement) Tuples(org.reactfx.util.Tuples) Background(javafx.scene.layout.Background) Consumer(java.util.function.Consumer) StyledDocument(org.fxmisc.richtext.model.StyledDocument) SimpleBooleanProperty(javafx.beans.property.SimpleBooleanProperty) StyleableObjectProperty(javafx.css.StyleableObjectProperty) VirtualizedScrollPane(org.fxmisc.flowless.VirtualizedScrollPane) StyledSegment(org.fxmisc.richtext.model.StyledSegment) SimpleObjectProperty(javafx.beans.property.SimpleObjectProperty) SuspendableList(org.reactfx.collection.SuspendableList) ObservableValue(javafx.beans.value.ObservableValue) EditableStyledDocument(org.fxmisc.richtext.model.EditableStyledDocument) VirtualFlow(org.fxmisc.flowless.VirtualFlow) Var(org.reactfx.value.Var) EventStream(org.reactfx.EventStream) Collections(java.util.Collections) Val(org.reactfx.value.Val) SuspendableEventStream(org.reactfx.SuspendableEventStream) EventStream(org.reactfx.EventStream) Subscription(org.reactfx.Subscription) Cell(org.fxmisc.flowless.Cell)

Example 19 with IndexRange

use of javafx.scene.control.IndexRange in project RichTextFX by FXMisc.

the class RichText method updateParagraphStyleInSelection.

private void updateParagraphStyleInSelection(Function<ParStyle, ParStyle> updater) {
    IndexRange selection = area.getSelection();
    int startPar = area.offsetToPosition(selection.getStart(), Forward).getMajor();
    int endPar = area.offsetToPosition(selection.getEnd(), Backward).getMajor();
    for (int i = startPar; i <= endPar; ++i) {
        Paragraph<ParStyle, Either<String, LinkedImage>, TextStyle> paragraph = area.getParagraph(i);
        area.setParagraphStyle(i, updater.apply(paragraph.getParagraphStyle()));
    }
}
Also used : IndexRange(javafx.scene.control.IndexRange) Either(org.reactfx.util.Either)

Example 20 with IndexRange

use of javafx.scene.control.IndexRange in project RichTextFX by FXMisc.

the class ClipboardHelper method cut.

/**
 * Transfers the currently selected text to the clipboard,
 * removing the current selection.
 */
default void cut() {
    copy();
    IndexRange selection = getSelection();
    deleteText(selection.getStart(), selection.getEnd());
}
Also used : IndexRange(javafx.scene.control.IndexRange)

Aggregations

IndexRange (javafx.scene.control.IndexRange)20 TextSearchAndReplaceView (com.kyj.fx.voeditor.visual.component.popup.TextSearchAndReplaceView)2 DataOutputStream (java.io.DataOutputStream)2 IOException (java.io.IOException)2 List (java.util.List)2 Optional (java.util.Optional)2 BiConsumer (java.util.function.BiConsumer)2 Function (java.util.function.Function)2 FXCollections (javafx.collections.FXCollections)2 Node (javafx.scene.Node)2 Paint (javafx.scene.paint.Paint)2 ReadOnlyStyledDocument (org.fxmisc.richtext.model.ReadOnlyStyledDocument)2 StyledDocument (org.fxmisc.richtext.model.StyledDocument)2 TableOpenResourceView (com.kyj.fx.voeditor.visual.component.popup.TableOpenResourceView)1 TextSearchComposite (com.kyj.fx.voeditor.visual.component.popup.TextSearchComposite)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 DataInputStream (java.io.DataInputStream)1 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 FileOutputStream (java.io.FileOutputStream)1