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();
}
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);
}
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();
}
};
}
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()));
}
}
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());
}
Aggregations