IDEA-81481 Recent Files: when I press navigate to... shortcut open the 'navigate to' popup and copy speed search content in it.

This commit is contained in:
Konstantin Bulenkov
2012-02-17 07:04:37 +01:00
parent 4d6bca3326
commit 1d5b82afd7
6 changed files with 67 additions and 14 deletions
@@ -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;
}
@@ -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<String, Integer> getInitialText(Editor editor) {
private static Pair<String, Integer> 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<String, Integer> 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<String, Integer> start = getInitialText(useSelectionFromEditor ? e.getData(PlatformDataKeys.EDITOR) : null);
Pair<String, Integer> start = getInitialText(useSelectionFromEditor, e);
final ChooseByNamePopup popup = ChooseByNamePopup.createPopup(project, model, getPsiContext(e), start.first, mayRequestOpenInCurrentWindow, start.second);
popup.setCheckBoxShortcut(getShortcutSet());
popup.setFindUsagesTitle(findUsagesTitle);
@@ -80,6 +80,7 @@ public class PopupChooserBuilder {
private Function<Object,String> 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);
@@ -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<T> extends JPanel {
public class ListWithFilter<T> extends JPanel implements DataProvider {
private final JList myList;
private final JTextField mySpeedSearchPatternField;
private final NameFilteringListModel<T> 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));
}
@@ -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<String> SPEED_SEARCH_CURRENT_QUERY = DataKey.create("SPEED_SEARCH_CURRENT_QUERY");
@Nullable
public static SpeedSearchSupply getSupply(@NotNull final JComponent component) {
@@ -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<Object, String>() {
final PopupChooserBuilder builder = new PopupChooserBuilder(list)
.setTitle(getTitle())
.setAdText(" ")
.setMovable(true)
.setItemChoosenCallback(runnable)
.setModalContext(false)
.addAdditionalChooseKeystroke(getAdditionalSelectKeystroke())
.setFilteringEnabled(new Function<Object, String>() {
public String fun(Object o) {
return o instanceof VirtualFile ? ((VirtualFile)o).getName() : "";
}