From cf737339fe1330b8228a4c7d3d04ddffb9ce2409 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 9 Sep 2010 16:18:46 +0400 Subject: [PATCH] cs gestures: esc action --- .../JavaChangeSignatureDetector.java | 6 +- .../highlighting/EscapeHandler.java | 40 ++++++++---- .../ChangeSignatureGestureDetector.java | 21 +++++++ ...ava => ChangeSignatureGestureVisitor.java} | 4 +- .../changeSignature/EditorEscapeHandler.java | 63 +++++++++++++++++++ .../LanguageChangeSignatureDetector.java | 2 + .../LanguageChangeSignatureDetectors.java | 5 ++ .../src/META-INF/LangExtensions.xml | 3 +- 8 files changed, 129 insertions(+), 15 deletions(-) rename platform/lang-impl/src/com/intellij/refactoring/changeSignature/{ChangeSignatureGestureVisistor.java => ChangeSignatureGestureVisitor.java} (96%) create mode 100644 platform/lang-impl/src/com/intellij/refactoring/changeSignature/EditorEscapeHandler.java diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java index 27e9f1e5f3b1..92995c8fd09d 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java @@ -44,7 +44,6 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec @Override public ChangeInfo createCurrentChangeSignature(final @NotNull PsiElement element, final @Nullable ChangeInfo changeInfo) { - PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class); if (method != null && isInsideMethodSignature(element, method.getBody())) { final String newVisibility = VisibilityUtil.getVisibilityModifier(method.getModifierList()); @@ -204,6 +203,11 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec return null; } + @Override + public boolean wasBanned(PsiElement element, @NotNull ChangeInfo bannedInfo) { + return Comparing.equal(PsiTreeUtil.getParentOfType(element, PsiMethod.class), bannedInfo.getMethod()); + } + private static boolean isInsideMethodSignature(PsiElement element, PsiCodeBlock body) { return body == null || element.getTextOffset() < body.getTextOffset(); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java index 547a608e9783..d62e438a6351 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java @@ -16,6 +16,8 @@ package com.intellij.codeInsight.highlighting; +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; +import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.markup.RangeHighlighter; @@ -25,6 +27,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.WindowManager; import com.intellij.find.FindManager; import com.intellij.find.FindModel; +import com.intellij.psi.PsiFile; +import com.intellij.refactoring.changeSignature.ChangeSignatureGestureDetector; import java.util.Map; @@ -39,19 +43,29 @@ public class EscapeHandler extends EditorActionHandler { Project project = PlatformDataKeys.PROJECT.getData(dataContext); editor.setHeaderComponent(null); - if (project != null && ((HighlightManagerImpl)HighlightManager.getInstance(project)).hideHighlights(editor, HighlightManager.HIDE_BY_ESCAPE | - HighlightManager .HIDE_BY_ANY_KEY)) { - WindowManager.getInstance().getStatusBar(project).setInfo(""); //?? - FindManager findManager = FindManager.getInstance(project); - FindModel model = findManager.getFindNextModel(editor); - if (model != null) { - model.setSearchHighlighters(false); - findManager.setFindNextModel(model); + if (project != null) { + if (((HighlightManagerImpl)HighlightManager.getInstance(project)).hideHighlights(editor, HighlightManager.HIDE_BY_ESCAPE | + HighlightManager.HIDE_BY_ANY_KEY)) { + WindowManager.getInstance().getStatusBar(project).setInfo(""); //?? + FindManager findManager = FindManager.getInstance(project); + FindModel model = findManager.getFindNextModel(editor); + if (model != null) { + model.setSearchHighlighters(false); + findManager.setFindNextModel(model); + } + return; + } + else { + final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext); + final ChangeSignatureGestureDetector detector = ChangeSignatureGestureDetector.getInstance(project); + if (file != null && detector.containsChangeSignatureChange(file)) { + detector.clearSignatureChange(file); + DaemonCodeAnalyzer.getInstance(project).restart(); + return; + } } } - else{ - myOriginalHandler.execute(editor, dataContext); - } + myOriginalHandler.execute(editor, dataContext); } public boolean isEnabled(Editor editor, DataContext dataContext) { @@ -70,6 +84,10 @@ public class EscapeHandler extends EditorActionHandler { } } } + final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext); + if (file != null && ChangeSignatureGestureDetector.getInstance(project).containsChangeSignatureChange(file)) { + return true; + } } return myOriginalHandler.isEnabled(editor, dataContext); diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java index 0432e1fe55ac..f4c76779cf22 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java @@ -58,6 +58,11 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme return false; } + public boolean containsChangeSignatureChange(@NotNull PsiFile file) { + final MyDocumentChangeAdapter adapter = myListenerMap.get(file); + return adapter != null && adapter.getCurrentInfo() != null; + } + public void changeSignature(PsiFile file) { try { myDeaf = true; @@ -137,9 +142,19 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme } } + public void clearSignatureChange(PsiFile file) { + final MyDocumentChangeAdapter adapter = myListenerMap.get(file); + if (adapter != null) { + adapter.setBannedChangeInfo(adapter.getCurrentInfo()); + adapter.setCurrentInfo(null); + adapter.setInitialText(null); + } + } + private class MyDocumentChangeAdapter extends DocumentAdapter { private String myInitialText; private ChangeInfo myCurrentInfo; + private ChangeInfo myBannedChangeInfo; public void setCurrentInfo(ChangeInfo currentInfo) { myCurrentInfo = currentInfo; @@ -168,6 +183,8 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme if (file != null) { final PsiElement element = file.findElementAt(e.getOffset()); if (element != null) { + if (myBannedChangeInfo != null && LanguageChangeSignatureDetectors.wasBanned(element, myBannedChangeInfo)) return; + myBannedChangeInfo = null; final ChangeInfo info = LanguageChangeSignatureDetectors.createCurrentChangeInfo(element, myCurrentInfo); if (info != null) { myInitialText = document.getText(); @@ -178,6 +195,10 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme } } } + + public void setBannedChangeInfo(ChangeInfo bannedChangeInfo) { + myBannedChangeInfo = bannedChangeInfo; + } } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisistor.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisitor.java similarity index 96% rename from platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisistor.java rename to platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisitor.java index 66f033af4d92..85e654498eb0 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisistor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisitor.java @@ -36,7 +36,7 @@ import java.awt.*; * User: anna * Date: Sep 8, 2010 */ -public class ChangeSignatureGestureVisistor implements HighlightVisitor { +public class ChangeSignatureGestureVisitor implements HighlightVisitor { private static final Logger LOG = Logger.getInstance("#" + ChangeSignatureGestureDetector.class.getName()); @NonNls private static final String SIGNATURE_SHOULD_BE_POSSIBLY_CHANGED = "Signature should be possibly changed"; @@ -68,7 +68,7 @@ public class ChangeSignatureGestureVisistor implements HighlightVisitor { @Override public HighlightVisitor clone() { - return new ChangeSignatureGestureVisistor(); + return new ChangeSignatureGestureVisitor(); } @Override diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/EditorEscapeHandler.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/EditorEscapeHandler.java new file mode 100644 index 000000000000..b80fd7591366 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/EditorEscapeHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2000-2010 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.refactoring.changeSignature; + +import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.actionSystem.EditorActionHandler; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; + +/** + * User: anna + * Date: Sep 9, 2010 + */ +public class EditorEscapeHandler extends EditorActionHandler { + private final EditorActionHandler myOriginalHandler; + + public EditorEscapeHandler(EditorActionHandler originalHandler) { + myOriginalHandler = originalHandler; + } + + @Override + public void execute(Editor editor, DataContext dataContext) { + final Project project = PlatformDataKeys.PROJECT.getData(dataContext); + final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext); + final ChangeSignatureGestureDetector detector = ChangeSignatureGestureDetector.getInstance(project); + if (file != null && detector.containsChangeSignatureChange(file)) { + detector.clearSignatureChange(file); + DaemonCodeAnalyzer.getInstance(project).restart(); + } + else { + myOriginalHandler.execute(editor, dataContext); + } + } + + @Override + public boolean isEnabled(Editor editor, DataContext dataContext) { + final Project project = PlatformDataKeys.PROJECT.getData(dataContext); + if (project != null) { + final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext); + if (file != null && ChangeSignatureGestureDetector.getInstance(project).containsChangeSignatureChange(file)) { + return true; + } + } + return myOriginalHandler.isEnabled(editor, dataContext); + } +} diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java index 3084336b0947..58f8cd5f4829 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java @@ -37,4 +37,6 @@ public interface LanguageChangeSignatureDetector { @Nullable TextRange getHighlightingRange(PsiElement element); + + boolean wasBanned(PsiElement element, @NotNull ChangeInfo bannedInfo); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java index 757f18d54a37..3e6fa220e3ca 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java @@ -47,4 +47,9 @@ class LanguageChangeSignatureDetectors extends LanguageExtension - + +