private ProperTextRange offsetToYPosition(int start, int end) { if (myEditorScrollbarTop == -1 || myEditorTargetHeight == -1) { recalcEditorDimensions(); } Document document = myEditor.getDocument(); int startLineNumber = offsetToLine(start, document); int startY; int lineCount; if (myEditorSourceHeight < myEditorTargetHeight) { lineCount = 0; startY = myEditorScrollbarTop + startLineNumber * myEditor.getLineHeight(); } else { lineCount = myEditorSourceHeight / myEditor.getLineHeight(); startY = myEditorScrollbarTop + (int) ((float) startLineNumber / lineCount * myEditorTargetHeight); } int endY; if (document.getLineNumber(start) == document.getLineNumber(end)) { endY = startY; // both offsets are on the same line, no need to recalc Y position } else { int endLineNumber = offsetToLine(end, document); if (myEditorSourceHeight < myEditorTargetHeight) { endY = myEditorScrollbarTop + endLineNumber * myEditor.getLineHeight(); } else { endY = myEditorScrollbarTop + (int) ((float) endLineNumber / lineCount * myEditorTargetHeight); } if (endY < startY) endY = startY; } return new ProperTextRange(startY, endY); }
public void setErrorStripeVisible(boolean val) { if (val) { myEditor.getVerticalScrollBar().setPersistentUI(new MyErrorPanel()); } else { myEditor.getVerticalScrollBar().setPersistentUI(ButtonlessScrollBarUI.createNormal()); } }
private void recalcEditorDimensions() { EditorImpl.MyScrollBar scrollBar = myEditor.getVerticalScrollBar(); int scrollBarHeight = scrollBar.getSize().height; myEditorScrollbarTop = scrollBar.getDecScrollButtonHeight() /* + 1*/; int editorScrollbarBottom = scrollBar.getIncScrollButtonHeight(); myEditorTargetHeight = scrollBarHeight - myEditorScrollbarTop - editorScrollbarBottom; myEditorSourceHeight = myEditor.getPreferredHeight(); }
void repaint(int startOffset, int endOffset) { markDirtied(); ProperTextRange range = offsetToYPosition(startOffset, endOffset); myEditor .getVerticalScrollBar() .repaint(0, range.getStartOffset(), PREFERRED_WIDTH, range.getLength() + getMinHeight()); }
public void setErrorStripeRenderer(ErrorStripeRenderer renderer) { assertIsDispatchThread(); myErrorStripeRenderer = renderer; // try to not cancel tooltips here, since it is being called after every writeAction, even to // the console // HintManager.getInstance().getTooltipController().cancelTooltips(); myEditor.getVerticalScrollBar().repaint(); }
private void showTooltip(MouseEvent e, final TooltipRenderer tooltipObject, HintHint hintHint) { TooltipController tooltipController = TooltipController.getInstance(); tooltipController.showTooltipByMouseMove( myEditor, new RelativePoint(e), tooltipObject, myEditor.getVerticalScrollbarOrientation() == EditorEx.VERTICAL_SCROLLBAR_RIGHT, ERROR_STRIPE_TOOLTIP_GROUP, hintHint); }
private int yPositionToOffset(int y, boolean beginLine) { if (myEditorScrollbarTop == -1 || myEditorTargetHeight == -1) { recalcEditorDimensions(); } final int safeY = Math.max(0, y - myEditorScrollbarTop); VisualPosition visual; if (myEditorSourceHeight < myEditorTargetHeight) { visual = myEditor.xyToVisualPosition(new Point(0, safeY)); } else { float fraction = Math.max(0, Math.min(1, safeY / (float) myEditorTargetHeight)); final int lineCount = myEditorSourceHeight / myEditor.getLineHeight(); visual = new VisualPosition((int) (fraction * lineCount), 0); } int line = myEditor.visualToLogicalPosition(visual).line; Document document = myEditor.getDocument(); if (line < 0) return 0; if (line >= document.getLineCount()) return document.getTextLength(); return beginLine ? document.getLineStartOffset(line) : document.getLineEndOffset(line); }
public void doClick(final MouseEvent e, final int width) { RangeHighlighter marker = getNearestRangeHighlighter(e, width); if (marker == null) return; int offset = marker.getStartOffset(); final Document doc = myEditor.getDocument(); if (doc.getLineCount() > 0) { // Necessary to expand folded block even if navigating just before one // Very useful when navigating to first unused import statement. int lineEnd = doc.getLineEndOffset(doc.getLineNumber(offset)); myEditor.getCaretModel().moveToOffset(lineEnd); } myEditor.getCaretModel().moveToOffset(offset); myEditor.getSelectionModel().removeSelection(); ScrollingModel scrollingModel = myEditor.getScrollingModel(); scrollingModel.disableAnimation(); scrollingModel.scrollToCaret(ScrollType.CENTER); scrollingModel.enableAnimation(); fireErrorMarkerClicked(marker, e); }
private RangeHighlighter getNearestRangeHighlighter(final MouseEvent e, final int width) { List<RangeHighlighter> highlighters = new ArrayList<RangeHighlighter>(); getNearestHighlighters(this, e, width, highlighters); getNearestHighlighters( (MarkupModelEx) myEditor.getDocument().getMarkupModel(myEditor.getProject()), e, width, highlighters); RangeHighlighter nearestMarker = null; int yPos = 0; for (RangeHighlighter highlighter : highlighters) { final int newYPos = offsetToYPosition(highlighter.getStartOffset(), highlighter.getEndOffset()) .getStartOffset(); if (nearestMarker == null || Math.abs(yPos - e.getY()) > Math.abs(newYPos - e.getY())) { nearestMarker = highlighter; yPos = newYPos; } } return nearestMarker; }
private boolean showToolTipByMouseMove(final MouseEvent e, final double width) { MouseEvent me = e; Set<RangeHighlighter> highlighters = new THashSet<RangeHighlighter>(); getNearestHighlighters(this, me, width, highlighters); getNearestHighlighters( (MarkupModelEx) myEditor.getDocument().getMarkupModel(getEditor().getProject()), me, width, highlighters); if (highlighters.isEmpty()) return false; int minDelta = Integer.MAX_VALUE; int y = e.getY(); for (RangeHighlighter each : highlighters) { ProperTextRange range = offsetToYPosition(each.getStartOffset(), each.getEndOffset()); int eachStartY = range.getStartOffset(); int eachEndY = range.getEndOffset(); int eachY = eachStartY + (eachEndY - eachStartY) / 2; if (Math.abs(e.getY() - eachY) < minDelta) { y = eachY; } } me = new MouseEvent( (Component) e.getSource(), e.getID(), e.getWhen(), e.getModifiers(), e.getX(), y + 1, e.getClickCount(), e.isPopupTrigger()); TooltipRenderer bigRenderer = myTooltipRendererProvider.calcTooltipRenderer(highlighters); if (bigRenderer != null) { showTooltip( me, bigRenderer, new HintHint(me).setAwtTooltip(true).setPreferredPosition(Balloon.Position.atLeft)); return true; } return false; }
private int offsetToLine(int offset, Document document) { if (offset > document.getTextLength()) { return document.getLineCount(); } return myEditor.offsetToVisualLine(offset); }
EditorMarkupModelImpl(@NotNull EditorImpl editor) { super((DocumentImpl) editor.getDocument()); myEditor = editor; }
private boolean isMirrored() { return myEditor.getVerticalScrollbarOrientation() == EditorEx.VERTICAL_SCROLLBAR_LEFT; }
private void assertIsDispatchThread() { ApplicationManagerEx.getApplicationEx().assertIsDispatchThread(myEditor.getComponent()); }
private MyErrorPanel getErrorPanel() { ScrollBarUI ui = myEditor.getVerticalScrollBar().getUI(); return ui instanceof MyErrorPanel ? (MyErrorPanel) ui : null; }