fix loosing settings on IDE restart

Resolves #186
Resolves #164
This commit is contained in:
marhali 2022-10-14 16:02:20 +02:00
parent bf1f1d4e35
commit 38f5bcb900
4 changed files with 235 additions and 35 deletions

View File

@ -3,6 +3,8 @@
# easy-i18n Changelog # easy-i18n Changelog
## [Unreleased] ## [Unreleased]
### Fixed
- Some settings are not retained on IDE restarts
## [4.2.3] ## [4.2.3]
### Changed ### Changed

View File

@ -1,5 +1,7 @@
package de.marhali.easyi18n.settings; package de.marhali.easyi18n.settings;
import com.intellij.util.xmlb.annotations.Property;
import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.parser.ParserStrategyType;
import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType;
import de.marhali.easyi18n.settings.presets.DefaultPreset; import de.marhali.easyi18n.settings.presets.DefaultPreset;
@ -7,87 +9,112 @@ import de.marhali.easyi18n.settings.presets.DefaultPreset;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Objects;
/** /**
* Represents the project-specific configuration of this plugin. * Represents the project-specific configuration of this plugin.
* @author marhali * @author marhali
*/ */
public class ProjectSettingsState implements ProjectSettings { public class ProjectSettingsState implements ProjectSettings {
private static final ProjectSettings defaults = new DefaultPreset();
// Resource Configuration // Resource Configuration
private String localesDirectory; @Property private String localesDirectory;
private FolderStrategyType folderStrategy; @Property private FolderStrategyType folderStrategy;
private ParserStrategyType parserStrategy; @Property private ParserStrategyType parserStrategy;
private String filePattern; @Property private String filePattern;
private Boolean includeSubDirs; @Property private Boolean includeSubDirs;
private Boolean sorting; @Property private boolean sorting;
// Editor configuration // Editor configuration
private String namespaceDelimiter; @Property private String namespaceDelimiter;
private String sectionDelimiter; @Property private String sectionDelimiter;
private String contextDelimiter; @Property private String contextDelimiter;
private String pluralDelimiter; @Property private String pluralDelimiter;
private String defaultNamespace; @Property private String defaultNamespace;
private String previewLocale; @Property private String previewLocale;
private Boolean nestedKeys; @Property private Boolean nestedKeys;
private Boolean assistance; @Property private Boolean assistance;
// Experimental configuration // Experimental configuration
private Boolean alwaysFold; @Property private Boolean alwaysFold;
public ProjectSettingsState() {} public ProjectSettingsState() {
this(new DefaultPreset());
}
public ProjectSettingsState(ProjectSettings defaults) {
// Apply defaults on initialization
this.localesDirectory = defaults.getLocalesDirectory();
this.folderStrategy = defaults.getFolderStrategy();
this.parserStrategy = defaults.getParserStrategy();
this.filePattern = defaults.getFilePattern();
this.includeSubDirs = defaults.isIncludeSubDirs();
this.sorting = defaults.isSorting();
this.namespaceDelimiter = defaults.getNamespaceDelimiter();
this.sectionDelimiter = defaults.getSectionDelimiter();
this.contextDelimiter = defaults.getContextDelimiter();
this.pluralDelimiter = defaults.getPluralDelimiter();
this.defaultNamespace = defaults.getDefaultNamespace();
this.previewLocale = defaults.getPreviewLocale();
this.nestedKeys = defaults.isNestedKeys();
this.assistance = defaults.isAssistance();
this.alwaysFold = defaults.isAlwaysFold();
}
@Override @Override
public @Nullable String getLocalesDirectory() { public @Nullable String getLocalesDirectory() {
return localesDirectory != null ? localesDirectory : defaults.getLocalesDirectory(); return localesDirectory;
} }
@Override @Override
public @NotNull FolderStrategyType getFolderStrategy() { public @NotNull FolderStrategyType getFolderStrategy() {
return folderStrategy != null ? folderStrategy : defaults.getFolderStrategy(); return folderStrategy;
} }
@Override @Override
public @NotNull ParserStrategyType getParserStrategy() { public @NotNull ParserStrategyType getParserStrategy() {
return parserStrategy != null ? parserStrategy : defaults.getParserStrategy(); return parserStrategy;
} }
@Override @Override
public @NotNull String getFilePattern() { public @NotNull String getFilePattern() {
return filePattern != null ? filePattern : defaults.getFilePattern(); return filePattern;
} }
@Override @Override
public boolean isIncludeSubDirs() { public boolean isIncludeSubDirs() {
return includeSubDirs != null ? includeSubDirs : defaults.isIncludeSubDirs(); return includeSubDirs;
} }
@Override @Override
public boolean isSorting() { public boolean isSorting() {
return sorting != null ? sorting : defaults.isSorting(); return sorting;
} }
@Override @Override
public @Nullable String getNamespaceDelimiter() { public @Nullable String getNamespaceDelimiter() {
return namespaceDelimiter != null ? namespaceDelimiter : defaults.getNamespaceDelimiter(); return namespaceDelimiter;
} }
@Override @Override
public @NotNull String getSectionDelimiter() { public @NotNull String getSectionDelimiter() {
return sectionDelimiter != null ? sectionDelimiter : defaults.getSectionDelimiter(); return sectionDelimiter;
} }
@Override @Override
public @Nullable String getContextDelimiter() { public @Nullable String getContextDelimiter() {
return contextDelimiter != null ? contextDelimiter : defaults.getContextDelimiter(); return contextDelimiter;
} }
@Override @Override
public @Nullable String getPluralDelimiter() { public @Nullable String getPluralDelimiter() {
return pluralDelimiter != null ? pluralDelimiter : defaults.getPluralDelimiter(); return pluralDelimiter;
} }
@Nullable @Nullable
@ -98,22 +125,22 @@ public class ProjectSettingsState implements ProjectSettings {
@Override @Override
public @NotNull String getPreviewLocale() { public @NotNull String getPreviewLocale() {
return previewLocale != null ? previewLocale : defaults.getPreviewLocale(); return previewLocale;
} }
@Override @Override
public boolean isNestedKeys() { public boolean isNestedKeys() {
return nestedKeys != null ? nestedKeys : defaults.isNestedKeys(); return nestedKeys;
} }
@Override @Override
public boolean isAssistance() { public boolean isAssistance() {
return assistance != null ? assistance : defaults.isAssistance(); return assistance;
} }
@Override @Override
public boolean isAlwaysFold() { public boolean isAlwaysFold() {
return alwaysFold != null ? alwaysFold : defaults.isAlwaysFold(); return alwaysFold;
} }
public void setLocalesDirectory(String localesDirectory) { public void setLocalesDirectory(String localesDirectory) {
@ -175,4 +202,56 @@ public class ProjectSettingsState implements ProjectSettings {
public void setAlwaysFold(Boolean alwaysFold) { public void setAlwaysFold(Boolean alwaysFold) {
this.alwaysFold = alwaysFold; this.alwaysFold = alwaysFold;
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ProjectSettingsState that = (ProjectSettingsState) o;
return sorting == that.sorting
&& folderStrategy == that.folderStrategy
&& parserStrategy == that.parserStrategy
&& Objects.equals(localesDirectory, that.localesDirectory)
&& Objects.equals(filePattern, that.filePattern)
&& Objects.equals(includeSubDirs, that.includeSubDirs)
&& Objects.equals(namespaceDelimiter, that.namespaceDelimiter)
&& Objects.equals(sectionDelimiter, that.sectionDelimiter)
&& Objects.equals(contextDelimiter, that.contextDelimiter)
&& Objects.equals(pluralDelimiter, that.pluralDelimiter)
&& Objects.equals(defaultNamespace, that.defaultNamespace)
&& Objects.equals(previewLocale, that.previewLocale)
&& Objects.equals(nestedKeys, that.nestedKeys)
&& Objects.equals(assistance, that.assistance)
&& Objects.equals(alwaysFold, that.alwaysFold);
}
@Override
public int hashCode() {
return Objects.hash(
localesDirectory, folderStrategy, parserStrategy, filePattern, includeSubDirs,
sorting, namespaceDelimiter, sectionDelimiter, contextDelimiter, pluralDelimiter,
defaultNamespace, previewLocale, nestedKeys, assistance, alwaysFold
);
}
@Override
public String toString() {
return "ProjectSettingsState{" +
"localesDirectory='" + localesDirectory + '\'' +
", folderStrategy=" + folderStrategy +
", parserStrategy=" + parserStrategy +
", filePattern='" + filePattern + '\'' +
", includeSubDirs=" + includeSubDirs +
", sorting=" + sorting +
", namespaceDelimiter='" + namespaceDelimiter + '\'' +
", sectionDelimiter='" + sectionDelimiter + '\'' +
", contextDelimiter='" + contextDelimiter + '\'' +
", pluralDelimiter='" + pluralDelimiter + '\'' +
", defaultNamespace='" + defaultNamespace + '\'' +
", previewLocale='" + previewLocale + '\'' +
", nestedKeys=" + nestedKeys +
", assistance=" + assistance +
", alwaysFold=" + alwaysFold +
'}';
}
} }

View File

@ -0,0 +1,31 @@
package de.marhali.easyi18n.settings;
import com.intellij.testFramework.fixtures.BasePlatformTestCase;
import com.intellij.util.xmlb.XmlSerializerUtil;
import de.marhali.easyi18n.settings.presets.DefaultPreset;
/**
* Tests for the project settings service itself.
* @author marhali
*/
public class ProjectSettingsServiceTest extends BasePlatformTestCase {
public void testSettingsDefaultPreset() {
ProjectSettingsState state = ProjectSettingsService.get(getProject()).getState();
assertEquals(state, new ProjectSettingsState(new DefaultPreset()));
}
public void testPersistenceState() {
ProjectSettingsState previous = new ProjectSettingsState(new SettingsTestPreset());
ProjectSettingsState after = XmlSerializerUtil.createCopy(previous);
assertEquals(previous, after);
}
public void testPersistenceSingle() {
ProjectSettingsState previous = new ProjectSettingsState();
previous.setLocalesDirectory("mySinglePropTest");
ProjectSettingsState after = XmlSerializerUtil.createCopy(previous);
assertEquals("mySinglePropTest", after.getLocalesDirectory());
}
}

View File

@ -0,0 +1,88 @@
package de.marhali.easyi18n.settings;
import de.marhali.easyi18n.io.folder.FolderStrategyType;
import de.marhali.easyi18n.io.parser.ParserStrategyType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Settings preset to test the functionality of the settings service.
* @author marhali
*/
public class SettingsTestPreset implements ProjectSettings {
@Override
public @Nullable String getLocalesDirectory() {
return "myCustomLocalesDirectory";
}
@Override
public @NotNull FolderStrategyType getFolderStrategy() {
return FolderStrategyType.MODULARIZED_NAMESPACE;
}
@Override
public @NotNull ParserStrategyType getParserStrategy() {
return ParserStrategyType.JSON5;
}
@Override
public @NotNull String getFilePattern() {
return "*.testfile.json5";
}
@Override
public boolean isIncludeSubDirs() {
return true;
}
@Override
public boolean isSorting() {
return false;
}
@Override
public @Nullable String getNamespaceDelimiter() {
return "nsDelim";
}
@Override
public @NotNull String getSectionDelimiter() {
return "sctDelim";
}
@Override
public @Nullable String getContextDelimiter() {
return "ctxDelim";
}
@Override
public @Nullable String getPluralDelimiter() {
return "plDelim";
}
@Override
public @Nullable String getDefaultNamespace() {
return "defNs";
}
@Override
public @NotNull String getPreviewLocale() {
return "prevLocale";
}
@Override
public boolean isNestedKeys() {
return true;
}
@Override
public boolean isAssistance() {
return false;
}
@Override
public boolean isAlwaysFold() {
return false;
}
}