diff --git a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java index de885e7a2b33..80a9869883e1 100644 --- a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java +++ b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java @@ -45,6 +45,7 @@ import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; import com.intellij.ui.components.panels.NonOpaquePanel; +import com.intellij.ui.speedSearch.SpeedSearchSupply; import com.intellij.util.ArrayUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; @@ -169,6 +170,9 @@ public class EditorSearchComponent extends JPanel implements DataProvider, Selec @Override @Nullable public Object getData(@NonNls final String dataId) { + if (SpeedSearchSupply.SPEED_SEARCH_CURRENT_QUERY.is(dataId)) { + return mySearchField.getText(); + } if (PlatformDataKeys.EDITOR_EVEN_IF_INACTIVE.is(dataId)) { return myEditor; } diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java index 0ff7c3f8a7b5..a1528f799cd8 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoActionBase.java @@ -29,13 +29,18 @@ import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.ui.speedSearch.SpeedSearchSupply; import com.intellij.util.containers.CollectionFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; +import java.awt.*; import java.util.Map; /** @@ -104,7 +109,8 @@ public abstract class GotoActionBase extends AnAction { public abstract void elementChosen(ChooseByNamePopup popup, Object element); } - private static Pair getInitialText(Editor editor) { + private static Pair getInitialText(boolean useEditorSelection, AnActionEvent e) { + final Editor editor = e.getData(PlatformDataKeys.EDITOR); if (editor != null) { final String selectedText = editor.getSelectionModel().getSelectedText(); if (selectedText != null && !selectedText.contains("\n")) { @@ -112,6 +118,19 @@ public abstract class GotoActionBase extends AnAction { } } + final String query = e.getData(SpeedSearchSupply.SPEED_SEARCH_CURRENT_QUERY); + if (!StringUtil.isEmpty(query)) { + return Pair.create(query, 0); + } + + final Component focusOwner = IdeFocusManager.getInstance(getEventProject(e)).getFocusOwner(); + if (focusOwner instanceof JComponent) { + final SpeedSearchSupply supply = SpeedSearchSupply.getSupply((JComponent)focusOwner); + if (supply != null) { + return Pair.create(supply.getEnteredPrefix(), 0); + } + } + if (myInAction != null) { final Pair lastString = ourLastStrings.get(myInAction); if (lastString != null) { @@ -136,7 +155,7 @@ public abstract class GotoActionBase extends AnAction { boolean mayRequestOpenInCurrentWindow = model.willOpenEditor() && FileEditorManagerEx.getInstanceEx(project).hasSplitOrUndockedWindows(); final Class startedAction = myInAction; LOG.assertTrue(startedAction != null); - Pair start = getInitialText(useSelectionFromEditor ? e.getData(PlatformDataKeys.EDITOR) : null); + Pair start = getInitialText(useSelectionFromEditor, e); final ChooseByNamePopup popup = ChooseByNamePopup.createPopup(project, model, getPsiContext(e), start.first, mayRequestOpenInCurrentWindow, start.second); popup.setCheckBoxShortcut(getShortcutSet()); popup.setFindUsagesTitle(findUsagesTitle); diff --git a/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java b/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java index 99cdbaa85326..bfb962865369 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/popup/PopupChooserBuilder.java @@ -80,6 +80,7 @@ public class PopupChooserBuilder { private Function myItemsNamer = null; private boolean myMayBeParent; private int myAdAlignment = SwingUtilities.LEFT; + private boolean myModalContext; public PopupChooserBuilder(@NotNull JList list) { myChooserComponent = list; @@ -172,6 +173,11 @@ public class PopupChooserBuilder { return this; } + public PopupChooserBuilder setModalContext(boolean modalContext) { + myModalContext = modalContext; + return this; + } + @NotNull public JBPopup createPopup() { JList list = null; @@ -248,10 +254,21 @@ public class PopupChooserBuilder { builder.addListener(each); } - builder.setDimensionServiceKey(null, myDimensionServiceKey, false).setRequestFocus(myRequestFocus).setResizable(myForceResizable) - .setMovable(myForceMovable).setTitle(myForceMovable ? myTitle : null).setCancelCallback(myCancelCallback).setAlpha(myAlpha) - .setFocusOwners(myFocusOwners).setCancelKeyEnabled(myCancelKeyEnabled && !(myChooserComponent instanceof ListWithFilter)). - setAdText(myAd, myAdAlignment).setKeyboardActions(myKeyboardActions).setMayBeParent(myMayBeParent).setLocateWithinScreenBounds(true); + builder.setDimensionServiceKey(null, myDimensionServiceKey, false) + .setRequestFocus(myRequestFocus) + .setResizable(myForceResizable) + .setMovable(myForceMovable) + .setTitle(myForceMovable ? myTitle : null) + .setCancelCallback(myCancelCallback) + .setAlpha(myAlpha) + .setFocusOwners(myFocusOwners) + .setCancelKeyEnabled(myCancelKeyEnabled && !(myChooserComponent instanceof ListWithFilter)) + .setAdText(myAd, myAdAlignment) + .setKeyboardActions(myKeyboardActions) + .setMayBeParent(myMayBeParent) + .setLocateWithinScreenBounds(true) + .setCancelOnOtherWindowOpen(true) + .setModalContext(myModalContext); if (myCommandButton != null) { builder.setCommandButton(myCommandButton); diff --git a/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java b/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java index d9eaa65d4230..5423add1433a 100644 --- a/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java +++ b/platform/platform-api/src/com/intellij/ui/speedSearch/ListWithFilter.java @@ -19,6 +19,7 @@ */ package com.intellij.ui.speedSearch; +import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.util.PopupUtil; import com.intellij.openapi.util.Condition; @@ -28,19 +29,28 @@ import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.UIBundle; import com.intellij.util.Function; import com.intellij.util.ui.ComponentWithEmptyText; +import org.jetbrains.annotations.NonNls; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -public class ListWithFilter extends JPanel { +public class ListWithFilter extends JPanel implements DataProvider { private final JList myList; private final JTextField mySpeedSearchPatternField; private final NameFilteringListModel myModel; private final JScrollPane myScroller; private final MySpeedSearch mySpeedSearch; + @Override + public Object getData(@NonNls String dataId) { + if (SpeedSearchSupply.SPEED_SEARCH_CURRENT_QUERY.is(dataId)) { + return mySpeedSearchPatternField.getText(); + } + return null; + } + public static JComponent wrap(JList list) { return wrap(list, ScrollPaneFactory.createScrollPane(list), StringUtil.createToStringFunction(Object.class)); } diff --git a/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java b/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java index 9c29c694b6ce..c0ff6ceae658 100644 --- a/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java +++ b/platform/platform-api/src/com/intellij/ui/speedSearch/SpeedSearchSupply.java @@ -15,6 +15,7 @@ */ package com.intellij.ui.speedSearch; +import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import org.jetbrains.annotations.NotNull; @@ -28,6 +29,7 @@ import javax.swing.*; */ public abstract class SpeedSearchSupply { private static final Key SPEED_SEARCH_COMPONENT_MARKER = new Key("SPEED_SEARCH_COMPONENT_MARKER"); + public static final DataKey SPEED_SEARCH_CURRENT_QUERY = DataKey.create("SPEED_SEARCH_CURRENT_QUERY"); @Nullable public static SpeedSearchSupply getSupply(@NotNull final JComponent component) { diff --git a/platform/platform-impl/src/com/intellij/ide/actions/BaseShowRecentFilesAction.java b/platform/platform-impl/src/com/intellij/ide/actions/BaseShowRecentFilesAction.java index f001d2630ba0..3c51473a7696 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/BaseShowRecentFilesAction.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/BaseShowRecentFilesAction.java @@ -160,13 +160,14 @@ public abstract class BaseShowRecentFilesAction extends AnAction implements Dumb footerPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); footerPanel.add(pathLabel); - final PopupChooserBuilder builder = new PopupChooserBuilder(list). - setTitle(getTitle()). - setAdText(" "). - setMovable(true). - setItemChoosenCallback(runnable). - addAdditionalChooseKeystroke(getAdditionalSelectKeystroke()). - setFilteringEnabled(new Function() { + final PopupChooserBuilder builder = new PopupChooserBuilder(list) + .setTitle(getTitle()) + .setAdText(" ") + .setMovable(true) + .setItemChoosenCallback(runnable) + .setModalContext(false) + .addAdditionalChooseKeystroke(getAdditionalSelectKeystroke()) + .setFilteringEnabled(new Function() { public String fun(Object o) { return o instanceof VirtualFile ? ((VirtualFile)o).getName() : ""; }