/** * Get the line index for the caret * * @param caretOffset * the caret offset * @return the line index */ public int getLineAtOffset(int caretOffset) { return getContent().getLineAtOffset(caretOffset); }
/** * Get the line index for the caret * * @param caretOffset * the caret offset * @return the line index */ public int getLineAtOffset(int caretOffset) { return getContent().getLineAtOffset(caretOffset); }
private Range<Integer> getAffectedLines(TextSelection selection) { int firstLine = getContent().getLineAtOffset(selection.offset); int lastLine = getContent().getLineAtOffset(selection.offset + selection.length); if (lastLine == -1) { lastLine = this.numberOfLines.get(); } return Range.closed(Integer.valueOf(firstLine), Integer.valueOf(Math.min(lastLine, this.numberOfLines.get()))); }
private void bindCaretListener() { this.caretOffset.addListener((x, o, n)-> { int oldCaretLine = getContent().getLineAtOffset(o.intValue()); int newCaretLine = getContent().getLineAtOffset(n.intValue()); RangeSet<Integer> toUpdate = TreeRangeSet.create(); toUpdate.add(Range.closed(Integer.valueOf(oldCaretLine), Integer.valueOf(oldCaretLine))); toUpdate.add(Range.closed(Integer.valueOf(newCaretLine), Integer.valueOf(newCaretLine))); updateNodesNow(toUpdate); }); }
public void refreshStyles(int start, int length) { int startLine = getSkinnable().getContent().getLineAtOffset(start); int endLine = getSkinnable().getContent().getLineAtOffset(start+length); TreeRangeSet<Integer> set = TreeRangeSet.create(); set.add(Range.closed(startLine, endLine)); this.content.updatelines(set); }
private int computeFirstUnchangedLine(TextChangingEvent event) { int endOffset = event.offset + event.replaceCharCount; int endLineIndex = getContent().getLineAtOffset(endOffset); int endLineBegin = getContent().getOffsetAtLine(endLineIndex); // int endLineLength = ContentView.this.lineHelper.getLength(endLineIndex); int firstSafeLine; if (endLineBegin == event.offset) { // offset at beginning of line firstSafeLine = endLineIndex; } else { // offset in middle or at end of line firstSafeLine = endLineIndex + 1; } return firstSafeLine; }
private Node annotationFactory(StyledTextLine l) { //TODO Should use IAnnotationExtension2 @SuppressWarnings("unchecked") Iterator<Annotation> annotationIterator = this.fVisualAnnotationModel.getAnnotationIterator(); while( annotationIterator.hasNext() ) { Annotation a = annotationIterator.next(); Position position = this.fVisualAnnotationModel.getPosition(a); if( l.getLineIndex() == getTextWidget().getContent().getLineAtOffset(position.offset) ) { AnnotationPresenter annotationPresenter = this.presenterMap.get(a.getType()); if( annotationPresenter != null ) { return annotationPresenter.getPresentation(a); } return null; } } return null; }
@Override public void textChanging(TextChangingEvent event) { final int changeBeginLine = getContent().getLineAtOffset(event.offset);
/** * The line height at the care position * * @param caretPosition * the position * @return the line height */ public double getLineHeight(int caretPosition) { int lineIndex = getSkinnable().getContent().getLineAtOffset(caretPosition); Line lineObject = this.lineList.get(lineIndex); for (LineCell c : getCurrentVisibleCells()) { if (c.domainElement == lineObject) { return c.getHeight(); } } return 0; }
private int calculatePageUpOffset() { final int linesPerPage = ((StyledTextSkin)getControl().getSkin()).getVisibleLineCount(); final int globalOffset = getControl().getCaretOffset(); final int lineIndex = getControl().getContent().getLineAtOffset(globalOffset); final int lineLocalOffset = globalOffset - getControl().getContent().getOffsetAtLine(lineIndex); final int newLineIndex = Math.max(0, lineIndex - linesPerPage); final int newLineLocalOffset = Math.min(getControl().getContent().getLine(newLineIndex).length(), lineLocalOffset); return getControl().getOffsetAtLine(newLineIndex) + newLineLocalOffset; }
private int calculatePageDownOffset() { final int linesPerPage = ((StyledTextSkin)getControl().getSkin()).getVisibleLineCount(); final int globalOffset = getControl().getCaretOffset(); final int lineIndex = getControl().getContent().getLineAtOffset(globalOffset); final int lineLocalOffset = globalOffset - getControl().getContent().getOffsetAtLine(lineIndex); final int newLineIndex = Math.min(getControl().getContent().getLineCount()-1, lineIndex + linesPerPage); final int newLineLocalOffset = Math.min(getControl().getContent().getLine(newLineIndex).length(), lineLocalOffset); return getControl().getOffsetAtLine(newLineIndex) + newLineLocalOffset; }
/** * default implementation for {@link DefaultTextEditActions#LINE_END} */ protected void defaultSelectLineEnd() { int caretLine = getControl().getContent().getLineAtOffset(getControl().getCaretOffset()); int end = getControl().getContent().getOffsetAtLine(caretLine) + getControl().getContent().getLine(caretLine).length(); moveCaretAbsolute(end, true); }
public void scrollOffsetIntoView(int offset, int verticalOffset, int horizontalOffset) { if( offset >= 0 ) { int lineIdx = getSkinnable().getContent().getLineAtOffset(offset); Range<Integer> visibleLines = this.content.getVisibleLines(); if( ! visibleLines.contains(Integer.valueOf(lineIdx)) ) { int linesVisible = visibleLines.upperEndpoint().intValue(); int delta = linesVisible - verticalOffset; int scrollLine = Math.min(lineIdx+delta, getSkinnable().getContent().getLineCount()-1); scrollLineIntoView(scrollLine); } int colIdx = offset - getSkinnable().getContent().getOffsetAtLine(lineIdx); String line = getSkinnable().getContent().getLine(lineIdx).substring(0, colIdx); int tabCount = (int)line.chars().filter(c -> c == '\t').count(); scrollColumnIntoView(colIdx + tabCount * (getSkinnable().tabAvanceProperty().get() - 1), horizontalOffset); } else { scrollLineIntoView(0); scrollColumnIntoView(0, 0); } }
public Optional<Point2D> getLocationInScene(int globalOffset, LineLocation locationHint) { applyCss(); layout(); int lineIndex = getContent().getLineAtOffset(globalOffset); Optional<LineNode> node = this.lineLayer.getVisibleNode(lineIndex); return node.map(n->{ double x = n.getCharLocation(globalOffset - n.getStartOffset()); double y = 0; switch (locationHint) { case BELOW: y = 0; break; case ABOVE: y = -getLineHeight(); break; case CENTER: y = -getLineHeight() / 2.0; break; } Point2D p = new Point2D(x, y); return n.localToScene(p); }); }
@Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) { int lineIndex = getSkinnable().getContent().getLineAtOffset(newValue.intValue()); Line lineObject = StyledTextSkin.this.lineList.get(lineIndex); getFlow().show(lineIndex); for (LineCell c : getCurrentVisibleCells()) { if (c.domainElement == lineObject) { // Adjust the selection if (StyledTextSkin.this.contentView.getSelectionModel().getSelectedItem() != c.domainElement) { StyledTextSkin.this.contentView.getSelectionModel().select(lineObject); } StyledTextLayoutContainer p = (StyledTextLayoutContainer) c.getGraphic(); p.setCaretIndex(newValue.intValue() - p.getStartOffset()); p.requestLayout(); updateCurrentCursorNode(p); return; } } } });
/** * default implementation for {@link DefaultTextEditActions#MOVE_UP} and * {@link DefaultTextEditActions#SELECT_UP} * * @param select * whether to change the selection */ protected void defaultUp(boolean select) { int currentRowIndex = getControl().getContent().getLineAtOffset(getControl().getCaretOffset()); final int offset = getControl().getCaretOffset(); int rowIndex = currentRowIndex; if (rowIndex == 0) { return; } int colIdx = offset - getControl().getContent().getOffsetAtLine(rowIndex); rowIndex -= 1; int lineOffset = getControl().getContent().getOffsetAtLine(rowIndex); int newCaretPosition = lineOffset + colIdx; int maxPosition = lineOffset + getControl().getContent().getLine(rowIndex).length(); moveCaretAbsolute(Math.min(newCaretPosition, maxPosition), select); }
/** * default implementation for {@link DefaultTextEditActions#MOVE_DOWN} and * {@link DefaultTextEditActions#SELECT_DOWN} * * @param select * whether to change the selection */ protected void defaultDown(boolean select) { int currentRowIndex = getControl().getContent().getLineAtOffset(getControl().getCaretOffset()); final int offset = getControl().getCaretOffset(); int rowIndex = currentRowIndex; if (rowIndex + 1 == getControl().getContent().getLineCount()) { return; } int colIdx = offset - getControl().getContent().getOffsetAtLine(rowIndex); rowIndex += 1; int lineOffset = getControl().getContent().getOffsetAtLine(rowIndex); int newCaretPosition = lineOffset + colIdx; int maxPosition = lineOffset + getControl().getContent().getLine(rowIndex).length(); moveCaretAbsolute(Math.min(newCaretPosition, maxPosition), select); }
/** * default implementation for {@link DefaultTextEditActions#NEW_LINE} */ protected void defaultNewLine() { int offset = getControl().getCaretOffset(); int line = getControl().getContent().getLineAtOffset(offset); int lineOffset = offset - getControl().getContent().getOffsetAtLine(line); String lineContent = getControl().getContent().getLine(line); // Should we make this configurable char[] chars = lineContent.toCharArray(); String prefix = ""; //$NON-NLS-1$ for (int i = 0; i < Math.min(lineOffset, chars.length); i++) { if (chars[i] == ' ' || chars[i] == '\t') { prefix += chars[i]; } else { break; } } if (getControl().getSelection().length > 0) { int caretPos = getControl().getSelection().offset + getControl().getLineSeparator().getValue().length() + prefix.length(); getControl().getContent().replaceTextRange(getControl().getSelection().offset, getControl().getSelection().length, getControl().getLineSeparator().getValue() + prefix); getControl().setCaretOffset( caretPos ); } else { getControl().getContent().replaceTextRange(getControl().getCaretOffset(), 0, getControl().getLineSeparator().getValue() + prefix); getControl().setCaretOffset(offset + getControl().getLineSeparator().getValue().length() + prefix.length()); } }
/** * Get the point for the caret position * * @param caretPosition * the position * @return the point */ public Point2D getCaretLocation(int caretPosition) { if (caretPosition < 0) { return null; } int lineIndex = getSkinnable().getContent().getLineAtOffset(caretPosition); Line lineObject = this.lineList.get(lineIndex); for (LineCell c : getCurrentVisibleCells()) { if (c.domainElement == lineObject) { StyledTextLayoutContainer b = (StyledTextLayoutContainer) c.getGraphic(); Point2D careLocation = b.getCareLocation(caretPosition - b.getStartOffset()); Point2D tmp = getSkinnable().sceneToLocal(b.localToScene(careLocation)); return new Point2D(tmp.getX(), getSkinnable().sceneToLocal(b.localToScene(0, b.getHeight())).getY()); } } return null; }
int currentRowIndex = getControl().getContent().getLineAtOffset(getControl().getCaretOffset()); int currentLine = getControl().getContent().getLineAtOffset(offset); @SuppressWarnings("unused") int newLine = getControl().getContent().getLineAtOffset(newOffset); getControl().impl_setCaretOffset(newOffset, event.isShiftDown()); event.consume(); invokeAction(ActionType.WORD_NEXT); } else if (event.isMetaDown()) { int currentLine = getControl().getContent().getLineAtOffset(offset); int lineOffset = getControl().getContent().getOffsetAtLine(currentLine); String lineContent = getControl().getContent().getLine(currentLine); int line = getControl().getContent().getLineAtOffset(getControl().getCaretOffset()); String lineContent = getControl().getContent().getLine(line);