void (Project project, final Editor editor) { if (!ourActionsRegistered) { EditorActionManager actionManager = EditorActionManager.getInstance(); TypedAction typedAction = TypedAction.getInstance(); typedAction.setupRawHandler(new MyTypedHandler(typedAction.getRawHandler())); actionManager.setActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE, new BackSpaceHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_BACKSPACE))); actionManager.setActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARET_UP, new UpHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARET_UP))); actionManager.setActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN, new DownHandler(actionManager.getActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN))); ourActionsRegistered = true; } FeatureUsageTracker.getInstance().triggerFeatureUsed("editing.incremental.search"); String selection = editor.getSelectionModel().getSelectedText(); JLabel label2 = new MyLabel(selection == null ? "" : selection); PerEditorSearchData data = editor.getUserData(SEARCH_DATA_IN_EDITOR_VIEW_KEY); if (data == null) { data = new PerEditorSearchData(); } else { if (data.hint != null) { if (data.lastSearch != null) { PerHintSearchData hintData = data.hint.getUserData(SEARCH_DATA_IN_HINT_KEY); //The user has not started typing if ("".equals(hintData.label.getText())) { label2 = new MyLabel(data.lastSearch); } } data.hint.hide(); } } JLabel label1 = new MyLabel(" " + CodeInsightBundle.message("incremental.search.tooltip.prefix")); label1.setFont(StartupUiUtil.getLabelFont().deriveFont(Font.BOLD)); JPanel panel = new MyPanel(label1); panel.add(label1, BorderLayout.WEST); panel.add(label2, BorderLayout.CENTER); panel.setBorder(BorderFactory.createLineBorder(Color.black)); final DocumentListener[] documentListener = new DocumentListener[1]; final CaretListener[] caretListener = new CaretListener[1]; final Document document = editor.getDocument(); final LightweightHint hint = new LightweightHint(panel) { @Override public void hide() { PerHintSearchData data = getUserData(SEARCH_DATA_IN_HINT_KEY); LOG.assertTrue(data != null); String prefix = data.label.getText(); super.hide(); if (data.segmentHighlighter != null){ data.segmentHighlighter.dispose(); } PerEditorSearchData editorData = editor.getUserData(SEARCH_DATA_IN_EDITOR_VIEW_KEY); editorData.hint = null; editorData.lastSearch = prefix; if (documentListener[0] != null){ document.removeDocumentListener(documentListener[0]); documentListener[0] = null; } if (caretListener[0] != null){ CaretListener listener = caretListener[0]; editor.getCaretModel().removeCaretListener(listener); } } }; documentListener[0] = new DocumentListener() { @Override public void documentChanged(@NotNull DocumentEvent e) { if (!hint.isVisible()) return; hint.hide(); } }; document.addDocumentListener(documentListener[0]); caretListener[0] = new CaretListener() { @Override public void caretPositionChanged(@NotNull CaretEvent e) { PerHintSearchData data = hint.getUserData(SEARCH_DATA_IN_HINT_KEY); if (data != null && data.ignoreCaretMove) return; if (!hint.isVisible()) return; hint.hide(); } }; CaretListener listener = caretListener[0]; editor.getCaretModel().addCaretListener(listener); final JComponent component = editor.getComponent(); int x = SwingUtilities.convertPoint(component,0,0,component).x; int y = - hint.getComponent().getPreferredSize().height; Point p = SwingUtilities.convertPoint(component,x,y,component.getRootPane().getLayeredPane()); HintManagerImpl.getInstanceImpl().showEditorHint(hint, editor, p, HintManagerImpl.HIDE_BY_ESCAPE | HintManagerImpl.HIDE_BY_TEXT_CHANGE, 0, false, new HintHint(editor, p).setAwtTooltip(false)); PerHintSearchData hintData = new PerHintSearchData(project, label2); hintData.searchStart = editor.getCaretModel().getOffset(); hint.putUserData(SEARCH_DATA_IN_HINT_KEY, hintData); data.hint = hint; editor.putUserData(SEARCH_DATA_IN_EDITOR_VIEW_KEY, data); if (!hintData.label.getText().isEmpty()) { updatePosition(editor, hintData, true, false); } }