Java 类javafx.scene.control.IndexRange 实例源码
项目:CSS-Editor-FX
文件:AutoCompletionCodeAreaBind.java
/**
*
* @param codeArea
* @param suggestionProvider
* @param replaceTextProvider
* When a suggestion entered, which range of text should be replaced.
*/
public AutoCompletionCodeAreaBind(CodeArea codeArea,
BiFunction<String, Integer, Collection<String>> suggestionProvider,
BiFunction<String, Integer, IndexRange> replaceTextProvider) {
this.codeArea = codeArea;
this.suggestionProvider = suggestionProvider;
this.replaceTextProvider = replaceTextProvider;
this.popup = new AutoCompletePopup<>();
codeArea.textProperty().addListener(textChangeListener);
codeArea.focusedProperty().addListener(focusChangedListener);
codeArea.setPopupWindow(popup);
codeArea.setPopupAlignment(PopupAlignment.CARET_BOTTOM);
popup.setOnSuggestion(sce -> {
completeUserInput(sce.getSuggestion());
hidePopup();
});
}
项目:Example.EMA.Java.SpeedGuide
文件:SpeedGuideViewController.java
/**
* Add Event Listener handler for the TextArea:
* 1. detect double click on <> and obtain (RIC) text inside of <>
* 2. subscribe to RIC
*/
@FXML
private void clickedTextArea(MouseEvent event) {
if (event.getClickCount() == 2) {
// Get the range of the selected text
IndexRange range = textArea.getSelection();
if ( findRegion(range, '<', '>') ) { // Check if region is embedded within < > brackets
String ric = textArea.getSelectedText().trim();
if (m_debug) System.out.println("Selected text: [" + ric + "]");
m_consumer.subscribe(ric);
} else {
if ( findRegion(range, '[', ']') ) { // Check if region is embedded within [ ] brackets
String news = textArea.getSelectedText().trim();
if (m_debug) System.out.println("Selected text: [" + news + "]");
updateStatus("Only text within < > supported.", StatusIndicator.RESPONSE_ERROR);
}
}
// Unmark region
textArea.selectRange(0,0);
}
}
项目:dragdropfx
文件:TextDragListenerContext.java
private EventHandler<MouseEvent> makeOnButtonDownListener(){
return new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if(event.getButton() == MouseButton.PRIMARY){
HitInfo i = DnDTextInput.getHitInfo((TextInputControl) event.getSource(), event);
IndexRange r = textInput.getSelection();
if(DnDTextInput.isInRange(i.getInsertionIndex(), r)){
currentSelection = r;
}
inClick = true;
}
}
};
}
项目:Gargoyle
文件:CodeAreaDefaultSelectionHandler.java
@Override
public void handle(MouseEvent event) {
if (event.getClickCount() == 1) {
// codeArea.setStyleSpans(0,
// groupBackgroundColor(codeArea.getText(),
// codeArea.getCaretPosition()));
} else if (event.getClickCount() == 2) {
String selectedText = codeArea.getSelectedText();
if (ValueUtil.isNotEmpty(selectedText)) {
IndexRange selection = codeArea.getSelection();
String ltrimText = selectedText.replaceAll("^\\s+", "");
String firstStr = ltrimText.substring(0, 1).replaceAll(CHARACTERS_MATCH, "");
int start = selection.getStart();
int end = selection.getEnd();
codeArea.selectRange(start + (selectedText.length() - ltrimText.length() + 1 - firstStr.length()), end);
}
}
}
项目:JFXC
文件:TimeTextField.java
@Override
public boolean deleteNextChar() {
boolean success = false;
// If there's a selection, delete it:
final IndexRange selection = getSelection();
if (selection.getLength() > 0) {
int selectionEnd = selection.getEnd();
this.deleteText(selection);
this.positionCaret(selectionEnd);
success = true;
} else {
// If the caret preceeds a digit, replace that digit with a zero and move the caret forward. Else just move the caret forward.
int caret = this.getCaretPosition();
if (caret % 3 != 2) { // not preceeding a colon
String currentText = this.getText();
setText(currentText.substring(0, caret) + "0" + currentText.substring(caret + 1));
success = true;
}
this.positionCaret(Math.min(caret + 1, this.getText().length()));
}
return success;
}
项目:JFXC
文件:TimeTextField.java
@Override
public boolean deletePreviousChar() {
boolean success = false;
// If there's a selection, delete it:
final IndexRange selection = getSelection();
if (selection.getLength() > 0) {
int selectionStart = selection.getStart();
this.deleteText(selection);
this.positionCaret(selectionStart);
success = true;
} else {
// If the caret is after a digit, replace that digit with a zero and move the caret backward. Else just move the caret back.
int caret = this.getCaretPosition();
if (caret % 3 != 0) { // not following a colon
String currentText = this.getText();
setText(currentText.substring(0, caret - 1) + "0" + currentText.substring(caret));
success = true;
}
this.positionCaret(Math.max(caret - 1, 0));
}
return success;
}
项目:CSS-Editor-FX
文件:AutoCompletionCodeAreaBind.java
/**
*
* @param codeArea
* @param suggestionProvider
* @param replaceTextProvider
* When a suggestion entered, which range of text should be replaced.
*/
public AutoCompletionCodeAreaBind(CodeArea codeArea,
BiFunction<String, Integer, Collection<String>> suggestionProvider,
BiFunction<String, Integer, IndexRange> replaceTextProvider) {
this.codeArea = codeArea;
this.suggestionProvider = suggestionProvider;
this.replaceTextProvider = replaceTextProvider;
this.popup = new AutoCompletePopup<>();
codeArea.textProperty().addListener(textChangeListener);
codeArea.focusedProperty().addListener(focusChangedListener);
codeArea.setPopupWindow(popup);
codeArea.setPopupAlignment(PopupAlignment.CARET_BOTTOM);
popup.setOnSuggestion(sce -> {
completeUserInput(sce.getSuggestion());
hidePopup();
});
}
项目:markdown-writer-fx
文件:MarkdownPreviewPane.java
public MarkdownPreviewPane() {
pane.getStyleClass().add("preview-pane");
previewContext = new PreviewContext() {
@Override public Renderer getRenderer() { return activeRenderer; }
@Override public String getMarkdownText() { return markdownText.get(); }
@Override public Node getMarkdownAST() { return markdownAST.get(); }
@Override public Path getPath() { return path.get(); }
@Override public IndexRange getEditorSelection() { return editorSelection.get(); }
};
path.addListener((observable, oldValue, newValue) -> update() );
markdownText.addListener((observable, oldValue, newValue) -> update() );
markdownAST.addListener((observable, oldValue, newValue) -> update() );
scrollY.addListener((observable, oldValue, newValue) -> scrollY());
editorSelection.addListener((observable, oldValue, newValue) -> editorSelectionChanged());
}
项目:markdown-writer-fx
文件:PreviewStyledTextArea.java
void replaceText(String text, StyleSpans<? extends Collection<String>> styleSpans) {
// remember old selection range and scrollY
IndexRange oldSelection = getSelection();
double oldScrollY = getEstimatedScrollY();
// replace text and styles
doReplaceText(text);
if (styleSpans != null)
setStyleSpans(0, styleSpans);
// restore old selection range and scrollY
int newLength = getLength();
selectRange(Math.min(oldSelection.getStart(), newLength), Math.min(oldSelection.getEnd(), newLength));
Platform.runLater(() -> {
estimatedScrollYProperty().setValue(oldScrollY);
});
}
项目:markdown-writer-fx
文件:MarkdownEditorPane.java
public void setMarkdown(String markdown) {
// remember old selection range and scrollY
IndexRange oldSelection = textArea.getSelection();
double oldScrollY = textArea.getEstimatedScrollY();
// replace text
lineSeparator = determineLineSeparator(markdown);
textArea.replaceText(markdown);
// restore old selection range and scrollY
int newLength = textArea.getLength();
textArea.selectRange(Math.min(oldSelection.getStart(), newLength), Math.min(oldSelection.getEnd(), newLength));
Platform.runLater(() -> {
textArea.estimatedScrollYProperty().setValue(oldScrollY);
});
}
项目:markdown-writer-fx
文件:SmartEdit.java
private void moveLinesUp(KeyEvent e) {
IndexRange selRange = getSelectedLinesRange(true);
int selStart = selRange.getStart();
int selEnd = selRange.getEnd();
if (selStart == 0)
return;
int before = offsetToLine(selStart - 1);
IndexRange beforeRange = linesToRange(before, before, true);
int beforeStart = beforeRange.getStart();
int beforeEnd = beforeRange.getEnd();
String beforeText = textArea.getText(beforeStart, beforeEnd);
String selText = textArea.getText(selStart, selEnd);
if (!selText.endsWith("\n")) {
selText += "\n";
if (beforeText.endsWith("\n"))
beforeText = beforeText.substring(0, beforeText.length() - 1);
}
// Note: using single textArea.replaceText() to avoid multiple changes in undo history
replaceText(textArea, beforeStart, selEnd, selText + beforeText);
selectRange(textArea, beforeStart, beforeStart + selText.length() - 1);
}
项目:markdown-writer-fx
文件:SmartEdit.java
private void duplicateLines(boolean up) {
IndexRange selRange = getSelectedLinesRange(true);
int selStart = selRange.getStart();
int selEnd = selRange.getEnd();
String selText = textArea.getText(selStart, selEnd);
if (!selText.endsWith("\n"))
selText += "\n";
replaceText(textArea, selStart, selStart, selText);
if (up)
selectRange(textArea, selStart, selStart + selText.length() - 1);
else {
int newSelStart = selStart + selText.length();
int newSelEnd = newSelStart + selText.length();
if (selText.endsWith("\n"))
newSelEnd--;
selectRange(textArea, newSelStart, newSelEnd);
}
}
项目:RichTextFX
文件:ParagraphText.java
/**
* Calculates the range of a value (background color, underline, etc.) that is shared between multiple
* consecutive {@link TextExt} nodes
*/
private void updateSharedShapeRange(T value, int start, int end) {
Runnable addNewValueRange = () -> ranges.add(Tuples.t(value, new IndexRange(start, end)));
if (ranges.isEmpty()) {
addNewValueRange.run();;
} else {
int lastIndex = ranges.size() - 1;
Tuple2<T, IndexRange> lastShapeValueRange = ranges.get(lastIndex);
T lastShapeValue = lastShapeValueRange._1;
// calculate smallest possible position which is consecutive to the given start position
final int prevEndNext = lastShapeValueRange.get2().getEnd() + 1;
if (start <= prevEndNext && // Consecutive?
lastShapeValue.equals(value)) { // Same style?
IndexRange lastRange = lastShapeValueRange._2;
IndexRange extendedRange = new IndexRange(lastRange.getStart(), end);
ranges.set(lastIndex, Tuples.t(lastShapeValue, extendedRange));
} else {
addNewValueRange.run();
}
}
}
项目:RichTextFX
文件:GenericStyledArea.java
@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);
}
项目:RichTextFX
文件:GenericStyledArea.java
final Optional<Bounds> getSelectionBoundsOnScreen(Selection selection) {
if (selection.getLength() == 0) {
return Optional.empty();
}
List<Bounds> bounds = new ArrayList<>(selection.getParagraphSpan());
for (int i = selection.getStartParagraphIndex(); i <= selection.getEndParagraphIndex(); i++) {
final int i0 = i;
virtualFlow.getCellIfVisible(i).ifPresent(c -> {
IndexRange rangeWithinPar = getParagraphSelection(selection, i0);
Bounds b = c.getNode().getRangeBoundsOnScreen(rangeWithinPar);
bounds.add(b);
});
}
if(bounds.size() == 0) {
return Optional.empty();
}
double minX = bounds.stream().mapToDouble(Bounds::getMinX).min().getAsDouble();
double maxX = bounds.stream().mapToDouble(Bounds::getMaxX).max().getAsDouble();
double minY = bounds.stream().mapToDouble(Bounds::getMinY).min().getAsDouble();
double maxY = bounds.stream().mapToDouble(Bounds::getMaxY).max().getAsDouble();
return Optional.of(new BoundingBox(minX, minY, maxX-minX, maxY-minY));
}
项目:RichTextFX
文件:CaretSelectionBindImpl.java
@Override
public void moveTo(int pos, NavigationActions.SelectionPolicy selectionPolicy) {
switch(selectionPolicy) {
case CLEAR:
selectRangeExpl(pos, pos);
break;
case ADJUST:
selectRangeExpl(getAnchorPosition(), pos);
break;
case EXTEND:
IndexRange sel = getRange();
int anchor;
if (pos <= sel.getStart()) {
anchor = sel.getEnd();
} else if(pos >= sel.getEnd()) {
anchor = sel.getStart();
} else {
anchor = getAnchorPosition();
}
selectRangeExpl(anchor, pos);
break;
}
}
项目:RichTextFX
文件:SelectionImpl.java
private void moveBoundary(Direction direction, int amount, int oldBoundaryPosition,
Function<Integer, IndexRange> updatedRange) {
switch (direction) {
case LEFT:
moveBoundary(
() -> oldBoundaryPosition - amount,
(pos) -> 0 <= pos,
updatedRange
);
break;
default: case RIGHT:
moveBoundary(
() -> oldBoundaryPosition + amount,
(pos) -> pos <= area.getLength(),
updatedRange
);
}
}
项目:RichTextFX
文件:CaretSelectionBind.java
/**
* Moves the caret to the position indicated by {@code pos}.
* Based on the selection policy, the selection is either <em>cleared</em>
* (i.e. anchor is set to the same position as caret), <em>adjusted</em>
* (i.e. anchor is not moved at all), or <em>extended</em>
* (i.e. {@code pos} becomes the new caret and, if {@code pos} points
* outside the current selection, the far end of the current selection
* becomes the anchor.
*/
default void moveTo(int pos, NavigationActions.SelectionPolicy selectionPolicy) {
switch(selectionPolicy) {
case CLEAR:
selectRange(pos, pos);
break;
case ADJUST:
selectRange(getAnchorPosition(), pos);
break;
case EXTEND:
IndexRange sel = getRange();
int anchor;
if(pos <= sel.getStart())
anchor = sel.getEnd();
else if(pos >= sel.getEnd())
anchor = sel.getStart();
else
anchor = getAnchorPosition();
selectRangeExpl(anchor, pos);
break;
}
}
项目:RichTextFX
文件:ClipboardActions.java
/**
* Transfers the currently selected text to the clipboard,
* leaving the current selection.
*/
default void copy() {
IndexRange selection = getSelection();
if(selection.getLength() > 0) {
ClipboardContent content = new ClipboardContent();
content.putString(getSelectedText());
getStyleCodecs().ifPresent(codecs -> {
Codec<StyledDocument<PS, SEG, S>> codec = ReadOnlyStyledDocument.codec(codecs._1, codecs._2, getSegOps());
DataFormat format = dataFormat(codec.getName());
StyledDocument<PS, SEG, S> doc = subDocument(selection.getStart(), selection.getEnd());
ByteArrayOutputStream os = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(os);
try {
codec.encode(dos, doc);
content.put(format, os.toByteArray());
} catch (IOException e) {
System.err.println("Codec error: Exception in encoding '" + codec.getName() + "':");
e.printStackTrace();
}
});
Clipboard.getSystemClipboard().setContent(content);
}
}
项目:RichTextFX
文件:EditActions.java
/**
* If something is currently selected and the given position is outside of the selection, moves the selected
* rich-text document to the given position by deleting it from the area and re-inserting it at the given position.
* If nothing is selected, moves the caret ot that position.
*/
default void moveSelectedText(int position) {
IndexRange sel = getSelection();
if((position >= sel.getStart() && position <= sel.getEnd()) || sel.equals(GenericStyledArea.EMPTY_RANGE)) {
// no move, just position the caret
selectRange(position, position);
} else {
StyledDocument<PS, SEG, S> text = this.subDocument(sel.getStart(), sel.getEnd());
if(position > sel.getEnd())
position -= sel.getLength();
deleteText(sel);
insert(position, text);
// select moved text
selectRange(position, position + text.length());
}
}
项目:RichTextFX
文件:GenericStyledAreaBehavior.java
private void handleFirstPrimaryPress(MouseEvent e) {
// ensure focus
view.requestFocus();
CharacterHit hit = view.hit(e.getX(), e.getY());
view.clearTargetCaretOffset();
IndexRange selection = view.getSelection();
if(view.isEditable() &&
selection.getLength() != 0 &&
hit.getCharacterIndex().isPresent() &&
hit.getCharacterIndex().getAsInt() >= selection.getStart() &&
hit.getCharacterIndex().getAsInt() < selection.getEnd()) {
// press inside selection
dragSelection = DragState.POTENTIAL_DRAG;
dragNewSelection = DragState.NO_DRAG;
} else {
dragSelection = DragState.NO_DRAG;
dragNewSelection = DragState.NO_DRAG;
view.getOnOutsideSelectionMousePressed().handle(e);
}
}
项目:ReactFX
文件:ListRangeReductionTest.java
@Test
public void test() {
LiveList<Integer> list = new LiveArrayList<>(1, 2, 4);
Var<IndexRange> range = Var.newSimpleVar(new IndexRange(0, 0));
Val<Integer> rangeSum = list.reduceRange(range, (a, b) -> a + b);
assertNull(rangeSum.getValue());
List<Integer> observed = new ArrayList<>();
rangeSum.values().subscribe(sum -> {
observed.add(sum);
if(sum == null) {
range.setValue(new IndexRange(0, 2));
} else if(sum == 3) {
list.addAll(1, Arrays.asList(8, 16));
} else if(sum == 9) {
range.setValue(new IndexRange(2, 4));
}
});
assertEquals(Arrays.asList(null, 3, 9, 18), observed);
}
项目:ReactFX
文件:ListRangeReductionTest.java
/**
* Tests the case when both list and range have been modified and range
* change notification arrived first.
*/
@Test
public void testLateListNotifications() {
SuspendableList<Integer> list = new LiveArrayList<Integer>(1, 2, 3).suspendable();
SuspendableVar<IndexRange> range = Var.newSimpleVar(new IndexRange(0, 3)).suspendable();
Val<Integer> rangeSum = list.reduceRange(range, (a, b) -> a + b);
list.suspendWhile(() -> {
range.suspendWhile(() -> {
list.addAll(4, 5, 6);
range.setValue(new IndexRange(3, 6));
});
});
assertEquals(15, rangeSum.getValue().intValue());
// most importantly, this test tests that no IndexOutOfBoundsException is thrown
}
项目:Example.EMA.Java.SpeedGuide
文件:SpeedGuideViewController.java
private boolean findRegion(IndexRange startingRange, int openToken, int closeToken)
{
if ( findStartPoint(startingRange, openToken, closeToken) ) {
int start = textArea.getSelection().getStart();
if ( findEndPoint(startingRange, openToken, closeToken) ) {
textArea.selectRange(start, textArea.getSelection().getEnd());
return(true);
}
}
// Selected text not embedded with open/close tokens
return(false);
}
项目:Example.EMA.Java.SpeedGuide
文件:SpeedGuideViewController.java
private boolean findStartPoint(IndexRange range, int openToken, int closeToken)
{
int start = range.getStart();
int end = range.getEnd();
while (true) {
textArea.selectRange(start-10, end);
IndexRange selection = textArea.getSelection();
// Determine if we've reached the start of the text area
if ( selection.getStart() == start ) return(false);
// Extract the text region of interest
String region = textArea.getSelectedText();
// Determine if we've encountered a close token
int cpos = region.lastIndexOf(closeToken);
// Determine if we've encountered an Open token
int opos = region.lastIndexOf(openToken);
if (cpos > opos || opos >= 0) {
textArea.selectRange(selection.getStart()+opos+1, end);
return(true);
}
// We should not be on the previous line
if ( region.indexOf('\n') >= 0 ) return(false);
start = selection.getStart();
}
}
项目:Example.EMA.Java.SpeedGuide
文件:SpeedGuideViewController.java
private boolean findEndPoint(IndexRange range, int openToken, int closeToken)
{
int start = range.getStart();
int end = range.getEnd();
while (true) {
textArea.selectRange(start, end+10);
IndexRange selection = textArea.getSelection();
// Determine if we've reached the end of the text area
if ( selection.getEnd() == end ) return(false);
// Extract the text region of interest
String region = textArea.getSelectedText();
// Determine if we've encountered a close token
int cpos = region.indexOf(closeToken);
// Determine if we've encountered an Open token
int opos = region.indexOf(openToken);
if (opos >= 0) {
if ( cpos < 0 || opos < cpos ) return(false);
}
if (cpos >= 0) {
textArea.selectRange(range.getStart(), start+cpos);
return(true);
}
// We should not be on the previous line
if ( region.indexOf('\n') >= 0 ) return(false);
end = selection.getEnd();
}
}
项目:dragdropfx
文件:DnDTextInput.java
static void onSelectedPosition(TextInputControl textinput,
Dragboard dragboard) {
IndexRange selection = textinput.getSelection();
String t1 = textinput.getText().substring(0, selection.getStart());
String t2 = textinput.getText().substring(selection.getEnd(), textinput.getText().length());
textinput.setText(t1 + dragboard.getString() + t2);
}
项目:CSS-Editor-FX
文件:CSSSuggestion.java
private static Collection<String> getSuggestionSimply(String text, int caretPos, CSSContext context) {
String prePart = text.substring(0, caretPos);
IndexRange replaceRange = getReplaceRange(text, caretPos);
char c;
int index = replaceRange.getStart();
while (true) {
index--;
c = text.charAt(index);
if (c != ' ' && c != '\t') {
break;
}
}
String keyWord = text.substring(replaceRange.getStart(), caretPos);
boolean inBrace = prePart.lastIndexOf('{') > prePart.lastIndexOf('}');
if (inBrace) {
if (c == ':') {
// XXX Can be smarter?
// return filterSuggestion(CSSRepository.GLOBAL.getKeys(), keyWord);
return Collections.emptyList();
} else if (c == ' ' || c == '\t' || c == '\n' | c == '{') {
return filterSuggestion(context.getKeys(), keyWord);
} else {
return Collections.emptyList();
}
} else {
if (c == '.') {
return filterSuggestion(context.getClasses(), keyWord);
} else if (c == '#') {
return filterSuggestion(context.getIds(), keyWord);
} else if (c == ':') {
return filterSuggestion(context.getStates(), keyWord);
} else {
return filterSuggestion(context.getJavaClasses(), keyWord);
}
}
}
项目:CSS-Editor-FX
文件:CSSSuggestion.java
private static IndexRange getReplaceRangeSimply(String text, int caretPos) {
int start = caretPos - 1;
int end = caretPos;
while (start > -1 && CSSConstants.LEGAL_CHARS.contains(text.charAt(start))) {
start--;
}
while (end < text.length() && CSSConstants.LEGAL_CHARS.contains(text.charAt(end))) {
end++;
}
return new IndexRange(start + 1, end);
}
项目:CSS-Editor-FX
文件:CodeAreaManager.java
public void comment() {
selectLines(codeArea);
String selectedText = codeArea.getSelectedText();
IndexRange selection = codeArea.getSelection();
codeArea.getUndoManager().preventMerge();
codeArea.replaceSelection(CSSFormat.toggleComment(selectedText));
codeArea.getUndoManager().preventMerge();
codeArea.moveTo(selection.getStart(), SelectionPolicy.EXTEND);
}
项目:CSS-Editor-FX
文件:CodeAreaManager.java
private static void selectLines(CodeArea area) {
IndexRange origin = area.getSelection();
area.moveTo(origin.getStart());
area.lineStart(SelectionPolicy.CLEAR);
int start = area.getCaretPosition();
area.moveTo(origin.getEnd());
area.lineEnd(SelectionPolicy.CLEAR);
int end = area.getCaretPosition();
area.selectRange(start, end);
}
项目:xdat_editor
文件:NumericField.java
@Override
public void replaceSelection(String text) {
IndexRange range = getSelection();
if (replaceValid(range.getStart(), range.getEnd(), text)) {
super.replaceSelection(text);
}
}
项目:openjfx-8u-dev-tests
文件:TextInputChanger.java
protected static void unselect(final TextInputControlWrapInterface text_input) {
new GetAction() {
@Override
public void run(Object... parameters) {
IndexRange selection = text_input.getControl().getSelection();
text_input.getControl().selectRange(selection.getStart(), selection.getStart());
}
}.dispatch(getEnvironment(text_input));
}
项目:JFXC
文件:TimeTextField.java
@Override
public void replaceSelection(String replacement) {
final IndexRange selection = this.getSelection();
if (selection.getLength() == 0) {
this.insertText(selection.getStart(), replacement);
} else {
this.replaceText(selection.getStart(), selection.getEnd(), replacement);
}
}
项目:qupath
文件:DefaultScriptEditor.java
/**
* Handle the press of the tab key, with/without shift.
* This either inserts getTabString() at the current caret position (if no text is selected,
* or either indents or removes the indentation from all selected rows if a selection is made.
*
* @param component
* @param shiftDown
*/
void handleTabPress(final ScriptEditorControl textArea, final boolean shiftDown) {
String selected = textArea.getSelectedText();
int pos = textArea.getCaretPosition();
if (selected == null || selected.length() == 0) {
textArea.insertText(pos, tabString);
return;
}
String text = textArea.getText();
IndexRange range = textArea.getSelection();
int startRowPos = getRowStartPosition(text, range.getStart());
int endRowPos = getRowEndPosition(text, range.getEnd());
String textBetween = text.substring(startRowPos, endRowPos);
String replaceText;
if (shiftDown) {
// Remove tabs at start of selected rows
replaceText = textBetween.replace("\n"+tabString, "\n");
if (replaceText.startsWith(tabString))
replaceText = replaceText.substring(tabString.length());
} else {
replaceText = tabString + textBetween.replace("\n", "\n"+tabString);
}
// System.out.println("LENGTH: " + textArea.getText().length() + ", POSITION: " + endRowPos);
String newText = text.substring(0, startRowPos) + replaceText;
if (endRowPos < text.length()) {
newText = newText + text.substring(endRowPos);
textArea.setText(newText);
} else {
// For reasons that aren't clear to me, I need to clear the text first to make this work (for now)
// TODO: Check if this bug still applies
textArea.deselect();
textArea.setText(newText);
}
// textArea.replaceText(startRowPos, endRowPos, replaceText);
textArea.selectRange(startRowPos, startRowPos+replaceText.length());
}
项目:CSS-Editor-FX
文件:CSSSuggestion.java
private static Collection<String> getSuggestionSimply(String text, int caretPos, CSSContext context) {
String prePart = text.substring(0, caretPos);
IndexRange replaceRange = getReplaceRange(text, caretPos);
char c;
int index = replaceRange.getStart();
while (true) {
index--;
c = text.charAt(index);
if (c != ' ' && c != '\t') {
break;
}
}
String keyWord = text.substring(replaceRange.getStart(), caretPos);
boolean inBrace = prePart.lastIndexOf('{') > prePart.lastIndexOf('}');
if (inBrace) {
if (c == ':') {
// XXX Can be smarter?
// return filterSuggestion(CSSRepository.GLOBAL.getKeys(), keyWord);
return Collections.emptyList();
} else if (c == ' ' || c == '\t' || c == '\n' | c == '{') {
return filterSuggestion(context.getKeys(), keyWord);
} else {
return Collections.emptyList();
}
} else {
if (c == '.') {
return filterSuggestion(context.getClasses(), keyWord);
} else if (c == '#') {
return filterSuggestion(context.getIds(), keyWord);
} else if (c == ':') {
return filterSuggestion(context.getStates(), keyWord);
} else {
return filterSuggestion(context.getJavaClasses(), keyWord);
}
}
}
项目:CSS-Editor-FX
文件:CSSSuggestion.java
private static IndexRange getReplaceRangeSimply(String text, int caretPos) {
int start = caretPos - 1;
int end = caretPos;
while (start > -1 && CSSConstants.LEGAL_CHARS.contains(text.charAt(start))) {
start--;
}
while (end < text.length() && CSSConstants.LEGAL_CHARS.contains(text.charAt(end))) {
end++;
}
return new IndexRange(start + 1, end);
}
项目:CSS-Editor-FX
文件:CodeAreaManager.java
public void comment() {
selectLines(codeArea);
String selectedText = codeArea.getSelectedText();
IndexRange selection = codeArea.getSelection();
codeArea.getUndoManager().preventMerge();
codeArea.replaceSelection(CSSFormat.toggleComment(selectedText));
codeArea.getUndoManager().preventMerge();
codeArea.moveTo(selection.getStart(), SelectionPolicy.EXTEND);
}
项目:CSS-Editor-FX
文件:CodeAreaManager.java
private static void selectLines(CodeArea area) {
IndexRange origin = area.getSelection();
area.moveTo(origin.getStart());
area.lineStart(SelectionPolicy.CLEAR);
int start = area.getCaretPosition();
area.moveTo(origin.getEnd());
area.lineEnd(SelectionPolicy.CLEAR);
int end = area.getCaretPosition();
area.selectRange(start, end);
}
项目:markdown-writer-fx
文件:WebViewPreview.java
@Override
public void editorSelectionChanged(PreviewContext context, IndexRange range) {
if (range.equals(lastEditorSelection))
return;
lastEditorSelection = range;
runWhenLoaded(() -> {
webView.getEngine().executeScript(highlightNodesAt(range));
});
}