From d22bc305fcc27c173b34cf980137d3caa479d185 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 29 Mar 2011 13:51:40 +0400 Subject: [PATCH] GotoRelatedFileAction for forms: reverse navigation --- .../ide/actions/GotoRelatedFileAction.java | 12 ++++++---- .../uiDesigner/FormFileTypeFactory.java | 3 ++- .../intellij/uiDesigner/GuiFormFileType.java | 3 +++ .../binding/FormRelatedFilesProvider.java | 23 +++++++++++++++++++ 4 files changed, 35 insertions(+), 6 deletions(-) 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 ed927538c584..1bce641bc154 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedFileAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedFileAction.java @@ -43,7 +43,7 @@ public class GotoRelatedFileAction extends AnAction { DataContext context = e.getDataContext(); Editor editor = PlatformDataKeys.EDITOR.getData(context); PsiFile psiFile = LangDataKeys.PSI_FILE.getData(context); - if (editor == null || psiFile == null) return; + if (psiFile == null) return; List items = getItems(editor, psiFile); if (items.isEmpty()) return; @@ -72,8 +72,11 @@ public class GotoRelatedFileAction extends AnAction { } public static List getItems(Editor editor, PsiFile psiFile) { - PsiElement psiElement = psiFile.findElementAt(editor.getCaretModel().getOffset()); - if (psiElement == null) psiElement = psiFile; + + PsiElement psiElement = psiFile; + if (editor != null) { + psiElement = psiFile.findElementAt(editor.getCaretModel().getOffset()); + } List items = new ArrayList(); @@ -85,8 +88,7 @@ public class GotoRelatedFileAction extends AnAction { @Override public void update(AnActionEvent e) { - e.getPresentation().setEnabled(PlatformDataKeys.EDITOR.getData(e.getDataContext()) != null && - LangDataKeys.PSI_FILE.getData(e.getDataContext()) != null); + e.getPresentation().setEnabled(LangDataKeys.PSI_FILE.getData(e.getDataContext()) != null); } private static class ItemCellRenderer extends JPanel implements ListCellRenderer { diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/FormFileTypeFactory.java b/plugins/ui-designer/src/com/intellij/uiDesigner/FormFileTypeFactory.java index bb36249ac376..c360a994332e 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/FormFileTypeFactory.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/FormFileTypeFactory.java @@ -23,7 +23,8 @@ import org.jetbrains.annotations.NotNull; * @author yole */ public class FormFileTypeFactory extends FileTypeFactory { + public void createFileTypes(@NotNull FileTypeConsumer consumer) { - consumer.consume(new GuiFormFileType(), GuiFormFileType.DEFAULT_EXTENSION); + consumer.consume(GuiFormFileType.INSTANCE); } } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/GuiFormFileType.java b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiFormFileType.java index 5d6d1b5dd50d..9d9693ed5d55 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/GuiFormFileType.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiFormFileType.java @@ -26,6 +26,9 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; public class GuiFormFileType implements FileType { + + public static final GuiFormFileType INSTANCE = new GuiFormFileType(); + @NonNls public static final String DEFAULT_EXTENSION = "form"; @NonNls public static final String DOT_DEFAULT_EXTENSION = "." + DEFAULT_EXTENSION; 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 46e4dd1a351a..6723d414c4ba 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormRelatedFilesProvider.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/binding/FormRelatedFilesProvider.java @@ -18,10 +18,15 @@ package com.intellij.uiDesigner.binding; import com.intellij.navigation.GotoRelatedItem; import com.intellij.navigation.GotoRelatedProvider; import com.intellij.navigation.PsiGotoRelatedItem; +import com.intellij.openapi.project.Project; +import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; +import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.uiDesigner.GuiFormFileType; +import com.intellij.uiDesigner.compiler.Utils; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -47,6 +52,24 @@ public class FormRelatedFilesProvider extends GotoRelatedProvider { } }); } + else { + PsiFile file = context.getContainingFile(); + if (file.getFileType() == GuiFormFileType.INSTANCE) { + try { + String className = Utils.getBoundClassName(file.getText()); + if (className != null) { + Project project = file.getProject(); + PsiClass aClass = JavaPsiFacade.getInstance(project).findClass(className, GlobalSearchScope.allScope(project)); + if (aClass != null) { + return Collections.singletonList(new PsiGotoRelatedItem(aClass)); + } + } + } + catch (Exception ignore) { + + } + } + } return Collections.emptyList(); } }