@Override public Dimension getPreferredSize() { if (myPreferredSize == null) { int maxLineLength = 0; int linesCount = 0; for (LineTokenizer lt = new LineTokenizer(myRawText); !lt.atEnd(); lt.advance()) { maxLineLength = Math.max(maxLineLength, lt.getLength()); linesCount++; } FontMetrics fontMetrics = ((EditorImpl) getEditor()) .getFontMetrics( myTextAttributes != null ? myTextAttributes.getFontType() : Font.PLAIN); int preferredHeight = getEditor().getLineHeight() * Math.max(1, linesCount); int preferredWidth = fontMetrics.charWidth('m') * maxLineLength; Insets insets = getInsets(); if (insets != null) { preferredHeight += insets.top + insets.bottom; preferredWidth += insets.left + insets.right; } myPreferredSize = new Dimension(preferredWidth, preferredHeight); } return myPreferredSize; }
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); }
private LogicalPosition fitInsideEditor(LogicalPosition pos) { int lineCount = myDocumentWindow.getLineCount(); if (pos.line >= lineCount) { pos = new LogicalPosition(lineCount - 1, pos.column); } int lineLength = myDocumentWindow.getLineEndOffset(pos.line) - myDocumentWindow.getLineStartOffset(pos.line); if (pos.column >= lineLength) { pos = new LogicalPosition(pos.line, Math.max(0, lineLength - 1)); } return pos; }
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; }