From e9e95238a6bf2164e50214193e4112e3b83c544b Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Sat, 31 May 2014 07:55:25 +0400 Subject: [PATCH] IDEA-125414 DB keys/indices to columns navigation --- .../com/intellij/util/PsiNavigateUtil.java | 8 +++- .../find/actions/ShowUsagesAction.java | 14 ++++-- .../ide/actions/GotoRelatedFileAction.java | 46 ++++++++++--------- .../GotoTestRelatedProvider.java | 9 ++-- .../binding/FormRelatedFilesProvider.java | 2 +- 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/platform/lang-api/src/com/intellij/util/PsiNavigateUtil.java b/platform/lang-api/src/com/intellij/util/PsiNavigateUtil.java index 7daf4db001dc..82ad15e01a79 100644 --- a/platform/lang-api/src/com/intellij/util/PsiNavigateUtil.java +++ b/platform/lang-api/src/com/intellij/util/PsiNavigateUtil.java @@ -18,8 +18,10 @@ package com.intellij.util; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.pom.Navigatable; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiUtilCore; import org.jetbrains.annotations.Nullable; public class PsiNavigateUtil { @@ -27,10 +29,14 @@ public class PsiNavigateUtil { if (psiElement != null && psiElement.isValid()) { final PsiElement navigationElement = psiElement.getNavigationElement(); final int offset = navigationElement instanceof PsiFile ? -1 : navigationElement.getTextOffset(); - final VirtualFile virtualFile = navigationElement.getContainingFile().getVirtualFile(); + + VirtualFile virtualFile = PsiUtilCore.getVirtualFile(psiElement); if (virtualFile != null && virtualFile.isValid()) { new OpenFileDescriptor(navigationElement.getProject(), virtualFile, offset).navigate(true); } + else if (navigationElement instanceof Navigatable) { + ((Navigatable)navigationElement).navigate(true); + } } } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java index f720fe9a71fa..f84fed5a05d9 100644 --- a/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java +++ b/platform/lang-impl/src/com/intellij/find/actions/ShowUsagesAction.java @@ -46,6 +46,7 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.pom.Navigatable; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; @@ -584,7 +585,7 @@ public class ShowUsagesAction extends AnAction implements PopupAction { } builder.setMovable(true).setResizable(true); - final AtomicReference selectedUsage = new AtomicReference(); + final AtomicReference selectedUsage = new AtomicReference(); final AtomicBoolean moreUsages = new AtomicBoolean(); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -601,7 +602,7 @@ public class ShowUsagesAction extends AnAction implements PopupAction { } else { moreUsages.set(false); - selectedUsage.set(usage instanceof UsageInfo2UsageAdapter ? ((UsageInfo2UsageAdapter)usage).getUsageInfo().copy() : null); + selectedUsage.set(usage instanceof UsageInfo2UsageAdapter ? ((UsageInfo2UsageAdapter)usage).getUsageInfo().copy() : usage); } break; } @@ -616,9 +617,12 @@ public class ShowUsagesAction extends AnAction implements PopupAction { appendMoreUsages(editor, popupPosition, handler, maxUsages, options); return; } - UsageInfo usage = selectedUsage.get(); - if (usage != null) { - UsageViewUtil.navigateTo(usage, true); + Object usage = selectedUsage.get(); + if (usage instanceof UsageInfo) { + UsageViewUtil.navigateTo((UsageInfo)usage, true); + } + else if (usage instanceof Navigatable) { + ((Navigatable)usage).navigate(true); } } }); diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedFileAction.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedFileAction.java index f594b6bcb100..83c42610be3d 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedFileAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedFileAction.java @@ -18,8 +18,10 @@ package com.intellij.ide.actions; import com.intellij.ide.util.DefaultPsiElementCellRenderer; import com.intellij.navigation.GotoRelatedItem; import com.intellij.navigation.GotoRelatedProvider; -import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.ui.popup.JBPopup; @@ -36,6 +38,7 @@ import com.intellij.ui.SimpleTextAttributes; import com.intellij.ui.popup.list.ListPopupImpl; import com.intellij.ui.popup.list.PopupListElementRenderer; import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -51,25 +54,28 @@ import java.util.List; */ public class GotoRelatedFileAction extends AnAction { + @Override + public void update(AnActionEvent e) { + PsiFile file = CommonDataKeys.PSI_FILE.getData(e.getDataContext()); + PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(e.getDataContext()); + e.getPresentation().setEnabled(element != null || file != null); + } + @Override public void actionPerformed(AnActionEvent e) { + DataContext dataContext = e.getDataContext(); + PsiFile file = CommonDataKeys.PSI_FILE.getData(e.getDataContext()); + Editor editor = CommonDataKeys.EDITOR.getData(e.getDataContext()); + PsiElement element = CommonDataKeys.PSI_ELEMENT.getData(dataContext); + if (element == null && file == null) return; - DataContext context = e.getDataContext(); - Editor editor = CommonDataKeys.EDITOR.getData(context); - PsiFile psiFile = CommonDataKeys.PSI_FILE.getData(context); - if (psiFile == null) return; - - List items = getItems(psiFile, editor, context); + List items = element == null? getItems(file, editor, dataContext) : getItems(element, dataContext); if (items.isEmpty()) return; if (items.size() == 1 && items.get(0).getElement() != null) { items.get(0).navigate(); return; } - if (ApplicationManager.getApplication().isUnitTestMode()) { - //noinspection UseOfSystemOutOrSystemErr - System.out.println(items); - } - createPopup(items, "Go to Related Files").showInBestPositionFor(context); + createPopup(items, "Choose Target").showInBestPositionFor(dataContext); } public static JBPopup createPopup(final List items, final String title) { @@ -102,8 +108,6 @@ public class GotoRelatedFileAction extends AnAction { final String title, final Processor processor) { final Ref hasMnemonic = Ref.create(false); - final Ref rendererRef = Ref.create(null); - final DefaultPsiElementCellRenderer renderer = new DefaultPsiElementCellRenderer() { { setFocusBorderEnabled(false); @@ -273,9 +277,12 @@ public class GotoRelatedFileAction extends AnAction { contextElement = element; } } + return getItems(contextElement, dataContext); + } - Set items = new LinkedHashSet(); - + @NotNull + public static List getItems(@NotNull PsiElement contextElement, @Nullable DataContext dataContext) { + Set items = ContainerUtil.newLinkedHashSet(); for (GotoRelatedProvider provider : Extensions.getExtensions(GotoRelatedProvider.EP_NAME)) { items.addAll(provider.getItems(contextElement)); if (dataContext != null) { @@ -308,11 +315,6 @@ public class GotoRelatedFileAction extends AnAction { } } - @Override - public void update(AnActionEvent e) { - e.getPresentation().setEnabled(CommonDataKeys.PSI_FILE.getData(e.getDataContext()) != null); - } - private static Action createNumberAction(final int mnemonic, final ListPopupImpl listPopup, final Map itemsMap, diff --git a/platform/lang-impl/src/com/intellij/testIntegration/GotoTestRelatedProvider.java b/platform/lang-impl/src/com/intellij/testIntegration/GotoTestRelatedProvider.java index 3177bfce7c8a..5cb0e7dbf48a 100644 --- a/platform/lang-impl/src/com/intellij/testIntegration/GotoTestRelatedProvider.java +++ b/platform/lang-impl/src/com/intellij/testIntegration/GotoTestRelatedProvider.java @@ -19,12 +19,12 @@ import com.intellij.navigation.GotoRelatedItem; import com.intellij.navigation.GotoRelatedProvider; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -35,11 +35,14 @@ public class GotoTestRelatedProvider extends GotoRelatedProvider { @Override public List getItems(@NotNull DataContext context) { final PsiFile file = CommonDataKeys.PSI_FILE.getData(context); + if (file == null) return Collections.emptyList(); + List result; final boolean isTest = TestFinderHelper.isTest(file); if (isTest) { result = TestFinderHelper.findClassesForTest(file); - } else { + } + else { result = TestFinderHelper.findTestsForClass(file); } @@ -50,6 +53,6 @@ public class GotoTestRelatedProvider extends GotoRelatedProvider { } return items; } - return super.getItems(context); + return Collections.emptyList(); } } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormRelatedFilesProvider.java b/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormRelatedFilesProvider.java index 7918ace54c1d..dbe28385666d 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormRelatedFilesProvider.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormRelatedFilesProvider.java @@ -51,7 +51,7 @@ public class FormRelatedFilesProvider extends GotoRelatedProvider { } else { PsiFile file = context.getContainingFile(); - if (file.getFileType() == GuiFormFileType.INSTANCE) { + if (file != null && file.getFileType() == GuiFormFileType.INSTANCE) { try { String className = Utils.getBoundClassName(file.getText()); if (className != null) {