EditorSettings should be PersistentStateComponent

This commit is contained in:
Vladimir Krivosheev
2014-09-23 14:53:30 +02:00
parent 0b614c916f
commit ff29583e90
4 changed files with 41 additions and 84 deletions
@@ -15,31 +15,30 @@
*/
package com.intellij.openapi.editor.ex;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.ExportableApplicationComponent;
import com.intellij.openapi.components.*;
import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces;
import com.intellij.openapi.options.OptionsBundle;
import com.intellij.openapi.util.DefaultJDOMExternalizer;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.NamedJDOMExternalizable;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.text.StringUtil;
import org.intellij.lang.annotations.MagicConstant;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.File;
import java.lang.reflect.Field;
import java.util.EnumSet;
import java.util.Set;
public class EditorSettingsExternalizable implements NamedJDOMExternalizable, ExportableApplicationComponent, Cloneable {
@State(
name = "EditorSettings",
storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/editor.xml")}
)
public class EditorSettingsExternalizable implements PersistentStateComponent<EditorSettingsExternalizable.OptionSet>, ExportableComponent {
//Q: make it interface?
public static class OptionSet implements Cloneable {
public static final class OptionSet {
public String LINE_SEPARATOR;
public String USE_SOFT_WRAPS;
public boolean USE_CUSTOM_SOFT_WRAP_INDENT = false;
@@ -64,6 +63,7 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
public boolean IS_LEADING_WHITESPACES_SHOWN = true;
public boolean IS_INNER_WHITESPACES_SHOWN = true;
public boolean IS_TRAILING_WHITESPACES_SHOWN = true;
@SuppressWarnings("SpellCheckingInspection")
public boolean IS_ALL_SOFTWRAPS_SHOWN = false;
public boolean IS_INDENT_GUIDES_SHOWN = true;
public boolean IS_ANIMATED_SCROLLING = true;
@@ -71,6 +71,7 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
public boolean ADDITIONAL_PAGE_AT_BOTTOM = false;
public boolean IS_DND_ENABLED = true;
@SuppressWarnings("SpellCheckingInspection")
public boolean IS_WHEEL_FONTCHANGE_ENABLED = false;
public boolean IS_MOUSE_CLICK_SELECTION_HONORS_CAMEL_WORDS = true;
@@ -81,16 +82,8 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
public boolean REFRAIN_FROM_SCROLLING = false;
public boolean SHOW_REFORMAT_DIALOG = true;
@SuppressWarnings("SpellCheckingInspection")
public boolean SHOW_OPIMIZE_IMPORTS_DIALOG = true;
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
private static final String COMPOSITE_PROPERTY_SEPARATOR = ":";
@@ -104,7 +97,7 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
//private boolean myUseTabCharacter = false;
private int myAdditionalLinesCount = 10;
private int myAdditinalColumnsCount = 20;
private int myAdditionalColumnsCount = 20;
private boolean myLineMarkerAreaShown = true;
@NonNls public static final String STRIP_TRAILING_SPACES_NONE = "None";
@@ -117,16 +110,12 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
@NonNls public static final String DEFAULT_FONT_NAME = "Courier";
public static EditorSettingsExternalizable getInstance() {
final Application app = ApplicationManager.getApplication();
if (app.isDisposed()) return new EditorSettingsExternalizable();
return app.getComponent(EditorSettingsExternalizable.class);
}
@Override
public void initComponent() { }
@Override
public void disposeComponent() {
if (ApplicationManager.getApplication().isDisposed()) {
return new EditorSettingsExternalizable();
}
else {
return ServiceManager.getService(EditorSettingsExternalizable.class);
}
}
public void addPropertyChangeListener(PropertyChangeListener listener){
@@ -137,24 +126,20 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
myPropertyChangeSupport.removePropertyChangeListener(listener);
}
@Nullable
@Override
public void readExternal(Element element) throws InvalidDataException {
DefaultJDOMExternalizer.readExternal(myOptions, element);
public OptionSet getState() {
return myOptions;
}
@Override
public void loadState(OptionSet state) {
myOptions = state;
parseRawSoftWraps();
}
@Override
public void writeExternal(Element element) throws WriteExternalException {
DefaultJDOMExternalizer.writeExternal(myOptions, element, new DefaultJDOMExternalizer.JDOMFilter() {
@Override
public boolean isAccept(@NotNull final Field field) {
return !field.getName().equals("IS_NATIVE2ASCII_FOR_PROPERTIES_FILES") && !field.getName().equals("DEFAULT_PROPERTIES_FILES_CHARSET_NAME");
}
});
}
private void parseRawSoftWraps() {
if (myOptions.USE_SOFT_WRAPS == null || myOptions.USE_SOFT_WRAPS.isEmpty()) {
if (StringUtil.isEmpty(myOptions.USE_SOFT_WRAPS)) {
return;
}
@@ -188,11 +173,6 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
myOptions.USE_SOFT_WRAPS = buffer.toString();
}
@Override
public String getExternalFileName() {
return "editor";
}
public OptionSet getOptions() {
return myOptions;
}
@@ -221,12 +201,13 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
myAdditionalLinesCount = additionalLinesCount;
}
@SuppressWarnings({"UnusedDeclaration", "SpellCheckingInspection"})
public int getAdditinalColumnsCount() {
return myAdditinalColumnsCount;
return myAdditionalColumnsCount;
}
public void setAdditionalColumnsCount(int additinalColumnsCount) {
myAdditinalColumnsCount = additinalColumnsCount;
public void setAdditionalColumnsCount(int value) {
myAdditionalColumnsCount = value;
}
public boolean isLineMarkerAreaShown() {
@@ -408,30 +389,10 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
myOptions.REFRAIN_FROM_SCROLLING = b;
}
@Override
public Object clone() {
EditorSettingsExternalizable copy = new EditorSettingsExternalizable();
copy.myOptions = (OptionSet) myOptions.clone();
copy.myBlockIndent = myBlockIndent;
//copy.myTabSize = myTabSize;
//copy.myUseTabCharacter = myUseTabCharacter;
copy.myAdditionalLinesCount = myAdditionalLinesCount;
copy.myAdditinalColumnsCount = myAdditinalColumnsCount;
copy.myLineMarkerAreaShown = myLineMarkerAreaShown;
return copy;
}
@Override
@NotNull
public String getComponentName() {
return "EditorSettings";
}
@Override
@NotNull
public File[] getExportFiles() {
return new File[]{PathManager.getOptionsFile(this)};
return new File[]{PathManager.getOptionsFile("editor")};
}
@Override
@@ -559,6 +520,4 @@ public class EditorSettingsExternalizable implements NamedJDOMExternalizable, Ex
public void setShowInlineLocalDialog(final boolean val) {
myOptions.SHOW_INLINE_DIALOG = val;
}
}
@@ -247,6 +247,10 @@
serviceImplementation="com.intellij.openapi.actionSystem.impl.AbbreviationManagerImpl"/>
<exportable serviceInterface="com.intellij.openapi.actionSystem.AbbreviationManager"/>
<applicationService serviceInterface="com.intellij.openapi.editor.ex.EditorSettingsExternalizable"
serviceImplementation="com.intellij.openapi.editor.ex.EditorSettingsExternalizable"/>
<exportable serviceInterface="com.intellij.openapi.editor.ex.EditorSettingsExternalizable"/>
<scopeParserExtension implementation="com.intellij.psi.search.scope.packageSet.FilePackageSetParserExtension"/>
<applicationService serviceInterface="com.intellij.openapi.ui.popup.StackingPopupDispatcher" serviceImplementation="com.intellij.ui.popup.StackingPopupDispatcherImpl"/>
@@ -1,9 +1,5 @@
<components>
<application-components>
<component>
<interface-class>com.intellij.openapi.editor.ex.EditorSettingsExternalizable</interface-class>
<implementation-class>com.intellij.openapi.editor.ex.EditorSettingsExternalizable</implementation-class>
</component>
<component>
<implementation-class>com.intellij.ide.actionMacro.ActionMacroManager</implementation-class>
</component>
@@ -23,7 +23,6 @@ import com.intellij.openapi.editor.ex.DocumentEx;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.testFramework.LightPlatformCodeInsightTestCase;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import java.awt.event.FocusEvent;
@@ -34,25 +33,24 @@ import java.io.IOException;
* User: cdr
*/
public class StripTrailingSpacesTest extends LightPlatformCodeInsightTestCase {
private final Element oldSettings = new Element("temp");
private EditorSettingsExternalizable.OptionSet oldSettings;
@Override
protected void setUp() throws Exception {
super.setUp();
EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance();
settings.writeExternal(oldSettings);
oldSettings = settings.getState();
settings.setStripTrailingSpaces(EditorSettingsExternalizable.STRIP_TRAILING_SPACES_CHANGED);
settings.setVirtualSpace(false);
}
@Override
protected void tearDown() throws Exception {
EditorSettingsExternalizable settings = EditorSettingsExternalizable.getInstance();
settings.readExternal(oldSettings);
EditorSettingsExternalizable.getInstance().loadState(oldSettings);
super.tearDown();
}
private void doTest(@NonNls String before, @NonNls String after) throws IOException {
private void doTest(@NonNls String before, @NonNls String after) {
configureFromFileText("x.txt", before);
type(' ');
backspace();