From 7fa85ad79c144f56b6bb6b2470d9e80926d039db Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Thu, 18 Dec 2014 12:22:07 +0300 Subject: [PATCH] IDEA-87318 Backspace should delete whitespace to chosen indent level, or be configurable following CR-IU-938 --- .../editorActions/BackspaceModeOverride.java | 10 ++++++---- .../editorActions/SmartBackspaceDisabler.java | 2 +- .../editorActions/SmartBackspaceMode.java | 8 ++------ .../editor/EditorSmartKeysConfigurable.java | 17 +++++++++-------- .../codeInsight/CodeInsightSettings.java | 19 +++++++++++++++++-- .../AbstractIndentingBackspaceHandler.java | 10 +++++----- .../SimpleIndentingBackspaceHandlerTest.java | 6 +++--- .../src/messages/ApplicationBundle.properties | 6 +++--- 8 files changed, 46 insertions(+), 32 deletions(-) rename platform/{lang-impl => lang-api}/src/com/intellij/codeInsight/editorActions/SmartBackspaceDisabler.java (90%) diff --git a/platform/lang-api/src/com/intellij/codeInsight/editorActions/BackspaceModeOverride.java b/platform/lang-api/src/com/intellij/codeInsight/editorActions/BackspaceModeOverride.java index a3e676ad8d2d..634c7828fd9c 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/editorActions/BackspaceModeOverride.java +++ b/platform/lang-api/src/com/intellij/codeInsight/editorActions/BackspaceModeOverride.java @@ -15,9 +15,11 @@ */ package com.intellij.codeInsight.editorActions; +/** + * Allows specific languages to override backspace unindent mode set in global editor preferences. + * + * @see SmartBackspaceDisabler + */ public abstract class BackspaceModeOverride { - /** - * @see SmartBackspaceMode - */ - public abstract int getBackspaceMode(int modeFromSettings); + public abstract SmartBackspaceMode getBackspaceMode(SmartBackspaceMode modeFromSettings); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SmartBackspaceDisabler.java b/platform/lang-api/src/com/intellij/codeInsight/editorActions/SmartBackspaceDisabler.java similarity index 90% rename from platform/lang-impl/src/com/intellij/codeInsight/editorActions/SmartBackspaceDisabler.java rename to platform/lang-api/src/com/intellij/codeInsight/editorActions/SmartBackspaceDisabler.java index cb1d3fdb18a6..69492b1e94cf 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/SmartBackspaceDisabler.java +++ b/platform/lang-api/src/com/intellij/codeInsight/editorActions/SmartBackspaceDisabler.java @@ -17,7 +17,7 @@ package com.intellij.codeInsight.editorActions; public class SmartBackspaceDisabler extends BackspaceModeOverride { @Override - public int getBackspaceMode(int modeFromSettings) { + public SmartBackspaceMode getBackspaceMode(SmartBackspaceMode modeFromSettings) { return modeFromSettings == SmartBackspaceMode.AUTOINDENT ? SmartBackspaceMode.INDENT : modeFromSettings; } } diff --git a/platform/lang-api/src/com/intellij/codeInsight/editorActions/SmartBackspaceMode.java b/platform/lang-api/src/com/intellij/codeInsight/editorActions/SmartBackspaceMode.java index 4f15f16318bd..79afbc79d8eb 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/editorActions/SmartBackspaceMode.java +++ b/platform/lang-api/src/com/intellij/codeInsight/editorActions/SmartBackspaceMode.java @@ -15,10 +15,6 @@ */ package com.intellij.codeInsight.editorActions; -public class SmartBackspaceMode { - public static final int OFF = 0; - public static final int AUTOINDENT = 1; - public static final int INDENT = 2; - - private SmartBackspaceMode() {} +public enum SmartBackspaceMode { + OFF, AUTOINDENT, INDENT; } diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysConfigurable.java b/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysConfigurable.java index 92ce93898fea..2125ea3b1d82 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysConfigurable.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/EditorSmartKeysConfigurable.java @@ -170,18 +170,19 @@ public class EditorSmartKeysConfigurable extends CompositeConfigurable, C public boolean SHOW_FULL_SIGNATURES_IN_PARAMETER_INFO = false; - @MagicConstant(intValues = {SmartBackspaceMode.OFF, SmartBackspaceMode.AUTOINDENT, SmartBackspaceMode.INDENT}) - public int SMART_BACKSPACE = SmartBackspaceMode.AUTOINDENT; + @OptionTag + private int SMART_BACKSPACE = SmartBackspaceMode.AUTOINDENT.ordinal(); + + @Transient + @NotNull + public SmartBackspaceMode getBackspaceMode() { + SmartBackspaceMode[] values = SmartBackspaceMode.values(); + return SMART_BACKSPACE >= 0 && SMART_BACKSPACE < values.length ? values[SMART_BACKSPACE] : SmartBackspaceMode.OFF; + } + + @Transient + public void setBackspaceMode(@NotNull SmartBackspaceMode mode) { + SMART_BACKSPACE = mode.ordinal(); + } public boolean SMART_INDENT_ON_ENTER = true; public boolean INSERT_BRACE_ON_ENTER = true; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AbstractIndentingBackspaceHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AbstractIndentingBackspaceHandler.java index 48c11fc0a9c4..7901ac5937a8 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AbstractIndentingBackspaceHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AbstractIndentingBackspaceHandler.java @@ -22,10 +22,10 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; abstract class AbstractIndentingBackspaceHandler extends BackspaceHandlerDelegate { - private final int myMode; + private final SmartBackspaceMode myMode; private boolean myEnabled; - AbstractIndentingBackspaceHandler(int mode) { + AbstractIndentingBackspaceHandler(SmartBackspaceMode mode) { myMode = mode; } @@ -35,7 +35,7 @@ abstract class AbstractIndentingBackspaceHandler extends BackspaceHandlerDelegat if (!StringUtil.isWhiteSpace(c)) { return; } - int mode = getBackspaceMode(file.getLanguage()); + SmartBackspaceMode mode = getBackspaceMode(file.getLanguage()); if (mode != myMode) { return; } @@ -55,8 +55,8 @@ abstract class AbstractIndentingBackspaceHandler extends BackspaceHandlerDelegat protected abstract boolean doCharDeleted(char c, PsiFile file, Editor editor); - private static int getBackspaceMode(Language language) { - int mode = CodeInsightSettings.getInstance().SMART_BACKSPACE; + private static SmartBackspaceMode getBackspaceMode(Language language) { + SmartBackspaceMode mode = CodeInsightSettings.getInstance().getBackspaceMode(); BackspaceModeOverride override = LanguageBackspaceModeOverride.INSTANCE.forLanguage(language); if (override != null) { mode = override.getBackspaceMode(mode); diff --git a/platform/lang-impl/testSources/com/intellij/codeInsight/editorActions/SimpleIndentingBackspaceHandlerTest.java b/platform/lang-impl/testSources/com/intellij/codeInsight/editorActions/SimpleIndentingBackspaceHandlerTest.java index 3dc1145cd308..3be54fa21ada 100644 --- a/platform/lang-impl/testSources/com/intellij/codeInsight/editorActions/SimpleIndentingBackspaceHandlerTest.java +++ b/platform/lang-impl/testSources/com/intellij/codeInsight/editorActions/SimpleIndentingBackspaceHandlerTest.java @@ -31,15 +31,15 @@ public class SimpleIndentingBackspaceHandlerTest extends LightPlatformCodeInsigh } private void doTest(String before, String after) { - int savedMode = CodeInsightSettings.getInstance().SMART_BACKSPACE; + SmartBackspaceMode savedMode = CodeInsightSettings.getInstance().getBackspaceMode(); try { - CodeInsightSettings.getInstance().SMART_BACKSPACE = SmartBackspaceMode.INDENT; + CodeInsightSettings.getInstance().setBackspaceMode(SmartBackspaceMode.INDENT); configureFromFileText(getTestName(false) + ".txt", before); executeAction(IdeActions.ACTION_EDITOR_BACKSPACE); checkResultByText(after); } finally { - CodeInsightSettings.getInstance().SMART_BACKSPACE = savedMode; + CodeInsightSettings.getInstance().setBackspaceMode(savedMode); } } } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 2ebda33e2e4c..725bd00182a7 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -328,9 +328,9 @@ combobox.paste.reformat.indent.block=Indent Block combobox.paste.reformat.indent.each.line=Indent Each Line combobox.paste.reformat.reformat.block=Reformat Block combobox.smart.backspace=Unindent: -combobox.smart.backspace.off=Off -combobox.smart.backspace.simple=Simple -combobox.smart.backspace.smart=Smart +combobox.smart.backspace.off=Disabled +combobox.smart.backspace.simple=To nearest indent position +combobox.smart.backspace.smart=To proper indent position combobox.tab.placement.none=None combobox.tab.placement.top=Top combobox.tab.placement.left=Left