diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierGlobalSettings.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierGlobalSettings.java new file mode 100644 index 000000000..6d4cb9193 --- /dev/null +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierGlobalSettings.java @@ -0,0 +1,40 @@ +package com.intellij.csharpier; + +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import com.intellij.openapi.project.Project; +import com.intellij.util.xmlb.XmlSerializerUtil; +import org.jetbrains.annotations.NotNull; + +@State( + name = "com.intellij.csharpier.global", + storages = @Storage(file = "$APP_CONFIG$/CSharpierPlugin.xml") +) +public class CSharpierGlobalSettings implements PersistentStateComponent { + + @NotNull + static CSharpierGlobalSettings getInstance(@NotNull Project project) { + return project.getService(CSharpierGlobalSettings.class); + } + + private boolean runOnSave; + + public boolean getRunOnSave() { + return this.runOnSave; + } + + public void setRunOnSave(boolean value) { + this.runOnSave = value; + } + + @Override + public CSharpierGlobalSettings getState() { + return this; + } + + @Override + public void loadState(@NotNull CSharpierGlobalSettings state) { + XmlSerializerUtil.copyBean(state, this); + } +} diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java index 2e49228c1..0bb6bcf90 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettings.java @@ -25,6 +25,17 @@ public void setRunOnSave(boolean value) { this.runOnSave = value; } + private SolutionRunOnSaveOption solutionRunOnSaveOption = + SolutionRunOnSaveOption.UseGlobalSetting; + + public SolutionRunOnSaveOption getSolutionRunOnSave() { + return this.solutionRunOnSaveOption; + } + + public void setSolutionRunOnSave(SolutionRunOnSaveOption value) { + this.solutionRunOnSaveOption = value; + } + private boolean useCustomPath; public boolean getUseCustomPath() { @@ -63,5 +74,21 @@ public CSharpierSettings getState() { @Override public void loadState(@NotNull CSharpierSettings state) { XmlSerializerUtil.copyBean(state, this); + migrate(); } + + private void migrate() { + // If runOnSave was enabled it becomes SolutionRunOnSaveOption.True + // we reset runOnSave to false - this value will never be used after this + if (getRunOnSave()) { + setRunOnSave(false); + setSolutionRunOnSave(SolutionRunOnSaveOption.True); + } + } +} + +enum SolutionRunOnSaveOption { + UseGlobalSetting, + False, + True, } diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java index 8725fb3ef..d097baeb1 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/CSharpierSettingsComponent.java @@ -1,7 +1,9 @@ package com.intellij.csharpier; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ComboBox; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBTextField; @@ -14,8 +16,16 @@ public class CSharpierSettingsComponent implements SearchableConfigurable { + Logger logger = CSharpierLogger.getInstance(); + private final Project project; - private JBCheckBox runOnSaveCheckBox = new JBCheckBox("Run on Save"); + private final String[] runOnSaveOptions = new String[] { + "True", + "Use Global Setting", + "False", + }; + private ComboBox runOnSaveComboBox = new ComboBox(runOnSaveOptions); + private JBCheckBox globalRunOnSaveCheckBox = new JBCheckBox("Run on Save (Global)"); private JBCheckBox disableCSharpierServerCheckBox = new JBCheckBox("Disable CSharpier Server"); private JBCheckBox useCustomPath = new JBCheckBox("Override CSharpier Executable"); private JBTextField customPathTextField = new JBTextField(); @@ -66,7 +76,13 @@ private JComponent createSectionHeader(String label) { return FormBuilder.createFormBuilder() .addComponent(createSectionHeader("General Settings")) .setFormLeftIndent(leftIndent) - .addComponent(this.runOnSaveCheckBox, topInset) + .addLabeledComponent( + new JBLabel("Run on save (Solution):"), + this.runOnSaveComboBox, + topInset, + false + ) + .addComponent(this.globalRunOnSaveCheckBox, topInset) .setFormLeftIndent(0) .addComponent(createSectionHeader("Developer Settings"), 20) .setFormLeftIndent(leftIndent) @@ -85,8 +101,10 @@ private JComponent createSectionHeader(String label) { @Override public boolean isModified() { return ( - CSharpierSettings.getInstance(this.project).getRunOnSave() != - this.runOnSaveCheckBox.isSelected() || + CSharpierSettings.getInstance(this.project).getSolutionRunOnSave() != + this.toRunOnSaveOption() || + CSharpierGlobalSettings.getInstance(this.project).getRunOnSave() != + this.globalRunOnSaveCheckBox.isSelected() || CSharpierSettings.getInstance(this.project).getCustomPath() != this.customPathTextField.getText() || CSharpierSettings.getInstance(this.project).getUseCustomPath() != @@ -100,18 +118,51 @@ public boolean isModified() { public void apply() { var settings = CSharpierSettings.getInstance(this.project); - settings.setRunOnSave(this.runOnSaveCheckBox.isSelected()); + settings.setSolutionRunOnSave(this.toRunOnSaveOption()); settings.setCustomPath(this.customPathTextField.getText()); settings.setDisableCSharpierServer(this.disableCSharpierServerCheckBox.isSelected()); settings.setUseCustomPath(this.useCustomPath.isSelected()); + + var globalSettings = CSharpierGlobalSettings.getInstance(this.project); + globalSettings.setRunOnSave(this.globalRunOnSaveCheckBox.isSelected()); } @Override public void reset() { var settings = CSharpierSettings.getInstance(this.project); - this.runOnSaveCheckBox.setSelected(settings.getRunOnSave()); + this.setSelectedRunOnSave(settings.getSolutionRunOnSave()); this.useCustomPath.setSelected(settings.getUseCustomPath()); this.customPathTextField.setText(settings.getCustomPath()); this.disableCSharpierServerCheckBox.setSelected(settings.getDisableCSharpierServer()); + + var globalSettings = CSharpierGlobalSettings.getInstance(this.project); + this.globalRunOnSaveCheckBox.setSelected(globalSettings.getRunOnSave()); + } + + private SolutionRunOnSaveOption toRunOnSaveOption() { + String selectedItem = (String) runOnSaveComboBox.getSelectedItem(); + + if (selectedItem == runOnSaveOptions[0]) { + return SolutionRunOnSaveOption.True; + } else if (selectedItem == runOnSaveOptions[1]) { + return SolutionRunOnSaveOption.UseGlobalSetting; + } else if (selectedItem == runOnSaveOptions[2]) { + return SolutionRunOnSaveOption.False; + } + + this.logger.debug("invalid runOnSaveComboBox selection: " + selectedItem); + return SolutionRunOnSaveOption.UseGlobalSetting; + } + + private void setSelectedRunOnSave(SolutionRunOnSaveOption saveOption) { + if (saveOption == SolutionRunOnSaveOption.True) { + this.runOnSaveComboBox.setSelectedItem(runOnSaveOptions[0]); + } else if (saveOption == SolutionRunOnSaveOption.UseGlobalSetting) { + this.runOnSaveComboBox.setSelectedItem(runOnSaveOptions[1]); + } else if (saveOption == SolutionRunOnSaveOption.False) { + this.runOnSaveComboBox.setSelectedItem(runOnSaveOptions[2]); + } + + this.logger.debug("tried to set invalid SolutionRunOnSaveOption: " + saveOption); } } diff --git a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierOnSaveListener.java b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierOnSaveListener.java index 44bf333ac..ed52a72cc 100644 --- a/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierOnSaveListener.java +++ b/Src/CSharpier.Rider/src/main/java/com/intellij/csharpier/ReformatWithCSharpierOnSaveListener.java @@ -20,7 +20,16 @@ public void beforeDocumentSaving(@NotNull Document document) { } var cSharpierSettings = CSharpierSettings.getInstance(project); - if (!cSharpierSettings.getRunOnSave()) { + var cSharpierGlobalSettings = CSharpierGlobalSettings.getInstance(project); + + if (cSharpierSettings.getSolutionRunOnSave() == SolutionRunOnSaveOption.False) { + return; + } + + if ( + !(cSharpierSettings.getSolutionRunOnSave() == SolutionRunOnSaveOption.True || + cSharpierGlobalSettings.getRunOnSave()) + ) { return; } diff --git a/Src/CSharpier.Rider/src/main/resources/META-INF/plugin.xml b/Src/CSharpier.Rider/src/main/resources/META-INF/plugin.xml index c2d559fac..6ac8835c1 100644 --- a/Src/CSharpier.Rider/src/main/resources/META-INF/plugin.xml +++ b/Src/CSharpier.Rider/src/main/resources/META-INF/plugin.xml @@ -5,6 +5,7 @@ belav com.intellij.modules.rider +