diff --git a/platform/lang-api/src/com/intellij/lang/folding/CustomFoldingBuilder.java b/platform/lang-api/src/com/intellij/lang/folding/CustomFoldingBuilder.java index 7f7567838869..b215fad80285 100644 --- a/platform/lang-api/src/com/intellij/lang/folding/CustomFoldingBuilder.java +++ b/platform/lang-api/src/com/intellij/lang/folding/CustomFoldingBuilder.java @@ -6,7 +6,6 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiComment; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -132,7 +131,7 @@ public abstract class CustomFoldingBuilder extends FoldingBuilderEx implements D * @param node The node which may contain custom region start. * @return True if the node marks a custom region start. */ - protected final boolean isCustomRegionStart(ASTNode node) { + public final boolean isCustomRegionStart(ASTNode node) { if (isCustomFoldingCandidate(node)) { String nodeText = node.getText(); CustomFoldingProvider defaultProvider = getDefaultProvider(nodeText); diff --git a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java new file mode 100644 index 000000000000..9a45520091ef --- /dev/null +++ b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionAction.java @@ -0,0 +1,88 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.customFolding; + +import com.intellij.ide.IdeBundle; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.ScrollType; +import com.intellij.openapi.fileEditor.ex.IdeDocumentHistory; +import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; + +/** + * @author Rustam Vishnyakov + */ +public class GotoCustomRegionAction extends AnAction implements DumbAware { + @Override + public void actionPerformed(AnActionEvent e) { + final Project project = e.getProject(); + final Editor editor = e.getData(PlatformDataKeys.EDITOR); + if (Boolean.TRUE.equals(e.getData(PlatformDataKeys.IS_MODAL_CONTEXT))) { + return; + } + if (project != null && editor != null) { + if (DumbService.getInstance(project).isDumb()) { + DumbService.getInstance(project).showDumbModeNotification(IdeBundle.message("goto.custom.region.message.dumb.mode")); + return; + } + CommandProcessor processor = CommandProcessor.getInstance(); + processor.executeCommand( + project, + new Runnable() { + public void run() { + GotoCustomRegionDialog dialog = new GotoCustomRegionDialog(project, editor); + dialog.show(); + if (dialog.isOK()) { + PsiElement navigationElement = dialog.getNavigationElement(); + if (navigationElement != null) { + navigateTo(editor, navigationElement); + IdeDocumentHistory.getInstance(project).includeCurrentCommandAsNavigation(); + } + } + } + }, + IdeBundle.message("goto.custom.region.command"), + null); + } + } + + @Override + public void update(AnActionEvent e) { + Presentation presentation = e.getPresentation(); + presentation.setText("Custom Region..."); + final Editor editor = e.getData(PlatformDataKeys.EDITOR); + final Project project = e.getProject(); + boolean isAvailable = editor != null && project != null; + presentation.setEnabled(isAvailable); + presentation.setVisible(isAvailable); + } + + private static void navigateTo(Editor editor, PsiElement element) { + int offset = element.getTextRange().getStartOffset(); + if (offset >= 0 && offset < editor.getDocument().getTextLength()) { + editor.getCaretModel().moveToOffset(offset); + editor.getScrollingModel().scrollToCaret(ScrollType.CENTER); + editor.getSelectionModel().removeSelection(); + } + } +} diff --git a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.form b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.form new file mode 100644 index 000000000000..cf1369bd01a7 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.form @@ -0,0 +1,25 @@ + +
diff --git a/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.java b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.java new file mode 100644 index 000000000000..8873074402e3 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/lang/customFolding/GotoCustomRegionDialog.java @@ -0,0 +1,169 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.customFolding; + +import com.intellij.ide.IdeBundle; +import com.intellij.lang.Language; +import com.intellij.lang.folding.*; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.ui.components.JBList; +import com.intellij.ui.components.JBScrollPane; +import com.intellij.util.containers.HashSet; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; +import java.util.*; +import java.util.List; + +/** + * @author Rustam Vishnyakov + */ +public class GotoCustomRegionDialog extends DialogWrapper { + private JBList myRegionsList; + private JPanel myContentPane; + private JBScrollPane myScrollPane; + private final Editor myEditor; + private final Project myProject; + + protected GotoCustomRegionDialog(@Nullable Project project, @NotNull Editor editor) { + super(project); + myEditor = editor; + myProject = project; + Collection