IDEA-87318 Backspace should delete whitespace to chosen indent level, or be configurable

following CR-IU-938
This commit is contained in:
Dmitry Batrak
2014-12-18 12:22:50 +03:00
parent 54d0fba094
commit 7fa85ad79c
8 changed files with 46 additions and 32 deletions
@@ -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);
}
@@ -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;
}
}
@@ -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;
}
@@ -170,18 +170,19 @@ public class EditorSmartKeysConfigurable extends CompositeConfigurable<UnnamedCo
myCbSurroundSelectionOnTyping.setSelected(codeInsightSettings.SURROUND_SELECTION_ON_QUOTE_TYPED);
switch (codeInsightSettings.SMART_BACKSPACE) {
case SmartBackspaceMode.OFF:
SmartBackspaceMode backspaceMode = codeInsightSettings.getBackspaceMode();
switch (backspaceMode) {
case OFF:
mySmartBackspaceCombo.setSelectedItem(OFF);
break;
case SmartBackspaceMode.INDENT:
case INDENT:
mySmartBackspaceCombo.setSelectedItem(SIMPLE);
break;
case SmartBackspaceMode.AUTOINDENT:
case AUTOINDENT:
mySmartBackspaceCombo.setSelectedItem(SMART);
break;
default:
LOG.error("Unexpected smart backspace mode value: " + codeInsightSettings.SMART_BACKSPACE);
LOG.error("Unexpected smart backspace mode value: " + backspaceMode);
}
super.reset();
@@ -203,7 +204,7 @@ public class EditorSmartKeysConfigurable extends CompositeConfigurable<UnnamedCo
codeInsightSettings.SURROUND_SELECTION_ON_QUOTE_TYPED = myCbSurroundSelectionOnTyping.isSelected();
editorSettings.setCamelWords(myCbCamelWords.isSelected());
codeInsightSettings.REFORMAT_ON_PASTE = getReformatPastedBlockValue();
codeInsightSettings.SMART_BACKSPACE = getSmartBackspaceModeValue();
codeInsightSettings.setBackspaceMode(getSmartBackspaceModeValue());
super.apply();
}
@@ -229,7 +230,7 @@ public class EditorSmartKeysConfigurable extends CompositeConfigurable<UnnamedCo
isModified |= isModified(myCbSurroundSelectionOnTyping, codeInsightSettings.SURROUND_SELECTION_ON_QUOTE_TYPED);
isModified |= (getSmartBackspaceModeValue() != codeInsightSettings.SMART_BACKSPACE);
isModified |= (getSmartBackspaceModeValue() != codeInsightSettings.getBackspaceMode());
return isModified;
@@ -259,7 +260,7 @@ public class EditorSmartKeysConfigurable extends CompositeConfigurable<UnnamedCo
}
}
private int getSmartBackspaceModeValue() {
private SmartBackspaceMode getSmartBackspaceModeValue() {
Object selectedItem = mySmartBackspaceCombo.getSelectedItem();
if (OFF.equals(selectedItem)){
return SmartBackspaceMode.OFF;
@@ -23,9 +23,12 @@ import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
import com.intellij.util.xmlb.XmlSerializationException;
import com.intellij.util.xmlb.XmlSerializer;
import com.intellij.util.xmlb.annotations.AbstractCollection;
import com.intellij.util.xmlb.annotations.OptionTag;
import com.intellij.util.xmlb.annotations.Property;
import com.intellij.util.xmlb.annotations.Transient;
import org.intellij.lang.annotations.MagicConstant;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@State(
@@ -77,8 +80,20 @@ public class CodeInsightSettings implements PersistentStateComponent<Element>, 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;
@@ -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);
@@ -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);
}
}
}
@@ -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