void (VisibleAreaEvent e, LightweightHint hint, boolean hideIfOutOfEditor) { if (hint.getComponent() instanceof ScrollAwareHint) { ((ScrollAwareHint)hint.getComponent()).editorScrolled(); } if (!hint.isVisible()) return; Editor editor = e.getEditor(); if (!editor.getComponent().isShowing() || editor.isOneLineMode()) return; Rectangle newRectangle = e.getOldRectangle(); Rectangle oldRectangle = e.getNewRectangle(); Point location = hint.getLocationOn(editor.getContentComponent()); Dimension size = hint.getSize(); int xOffset = location.x - oldRectangle.x; int yOffset = location.y - oldRectangle.y; Point locationOnEditor = hint.getLocationOn(editor.getComponent()); if (oldRectangle.y == newRectangle.y && oldRectangle.height < newRectangle.height) { Integer previousYPosition = hint.getUserData(LAST_HINT_ON_EDITOR_Y_POSITION); // editor size decreased, and if a hint goes up, then it means editor top side going down if (previousYPosition != null && previousYPosition > locationOnEditor.y) { yOffset += newRectangle.height - oldRectangle.height; } } hint.putUserData(LAST_HINT_ON_EDITOR_Y_POSITION, locationOnEditor.y); location = new Point(newRectangle.x + xOffset, newRectangle.y + yOffset); Rectangle newBounds = new Rectangle(location.x, location.y, size.width, size.height); //in some rare cases lookup can appear just on the edge with the editor, so don't hide it on every typing Rectangle newBoundsForIntersectionCheck = new Rectangle(location.x - 1, location.y - 1, size.width + 2, size.height + 2); final boolean okToUpdateBounds = hideIfOutOfEditor ? oldRectangle.contains(newBounds) : oldRectangle.intersects(newBoundsForIntersectionCheck); if (okToUpdateBounds || hint.vetoesHiding()) { hint.setLocation(new RelativePoint(editor.getContentComponent(), location)); } else { hint.hide(); } }