From 42f96d3a1e5aced7984417cc8bde76ef14531ff1 Mon Sep 17 00:00:00 2001 From: Rustam Vishnyakov Date: Wed, 20 Sep 2017 20:36:48 +0300 Subject: [PATCH] ValueEditor listener --- .../options/codeStyle/RightMarginForm.java | 21 +++++++++++-------- .../ui/components/fields/IntegerField.java | 17 +++------------ .../valueEditors/AbstractValueEditor.java | 13 ++++++++++++ .../valueEditors/TextFieldValueEditor.java | 8 ++----- .../fields/valueEditors/ValueEditor.java | 6 ++++++ 5 files changed, 36 insertions(+), 29 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/RightMarginForm.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/RightMarginForm.java index 0bb2bd561ec6..516c0b173bff 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/RightMarginForm.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/RightMarginForm.java @@ -25,6 +25,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.ui.components.fields.CommaSeparatedIntegersField; import com.intellij.ui.components.fields.IntegerField; +import com.intellij.ui.components.fields.valueEditors.ValueEditor; import com.intellij.ui.components.labels.ActionLink; import org.jetbrains.annotations.NotNull; @@ -52,7 +53,7 @@ public class RightMarginForm { private CommaSeparatedIntegersField myVisualGuidesField; @SuppressWarnings("unused") private ActionLink myResetLink; private final Language myLanguage; - private CodeStyleSettings mySettings; + private final CodeStyleSettings mySettings; public RightMarginForm(@NotNull Language language, @NotNull CodeStyleSettings settings) { myLanguage = language; @@ -65,14 +66,14 @@ public class RightMarginForm { } void createUIComponents() { - //noinspection ConstantConditions - myRightMarginField = new IntegerField(ApplicationBundle.message("editbox.right.margin.columns"), 0, CodeStyleSettings.MAX_RIGHT_MARGIN) { - @NotNull + myRightMarginField = new IntegerField(ApplicationBundle.message("editbox.right.margin.columns"), 0, CodeStyleSettings.MAX_RIGHT_MARGIN); + myRightMarginField.getValueEditor().addListener(new ValueEditor.Listener() { @Override - protected String getEmptyValueText() { - return getDefaultRightMarginText(); + public void valueChanged(@NotNull Integer newValue) { + myResetLink.setVisible(!newValue.equals(myRightMarginField.getDefaultValue())); + myRightMarginField.getEmptyText().setText(getDefaultRightMarginText(mySettings)); } - }; + }); myRightMarginField.setCanBeEmpty(true); myRightMarginField.setDefaultValue(-1); myVisualGuidesField = new CommaSeparatedIntegersField(ApplicationBundle.message("settings.code.style.visual.guides"), 0, CodeStyleSettings.MAX_RIGHT_MARGIN, "Optional"); @@ -96,6 +97,8 @@ public class RightMarginForm { } } myVisualGuidesField.setValue(settings.getSoftMargins(myLanguage)); + myResetLink.setVisible(langSettings.RIGHT_MARGIN >= 0); + myRightMarginField.getEmptyText().setText(getDefaultRightMarginText(settings)); } public void apply(@NotNull CodeStyleSettings settings) throws ConfigurationException { @@ -129,7 +132,7 @@ public class RightMarginForm { return myTopPanel; } - private String getDefaultRightMarginText() { - return "Default: " + mySettings.getDefaultRightMargin(); + private static String getDefaultRightMarginText(@NotNull CodeStyleSettings settings) { + return "Default: " + settings.getDefaultRightMargin(); } } diff --git a/platform/platform-api/src/com/intellij/ui/components/fields/IntegerField.java b/platform/platform-api/src/com/intellij/ui/components/fields/IntegerField.java index f5e8015ff9b8..53af1fdc45a2 100644 --- a/platform/platform-api/src/com/intellij/ui/components/fields/IntegerField.java +++ b/platform/platform-api/src/com/intellij/ui/components/fields/IntegerField.java @@ -33,15 +33,9 @@ public class IntegerField extends JBTextField { } public IntegerField(@Nullable String valueName, int minValue, int maxValue) { - myValueEditor = new IntegerValueEditor(this, valueName, minValue) { - @Override - protected void onEmptyValue() { - updateEmptyValueText(); - } - }; + myValueEditor = new IntegerValueEditor(this, valueName, minValue); myValueEditor.setMinValue(minValue); myValueEditor.setMaxValue(maxValue); - updateEmptyValueText(); } public int getMinValue() { @@ -104,12 +98,7 @@ public class IntegerField extends JBTextField { myValueEditor.setValue(myValueEditor.getDefaultValue()); } - public void updateEmptyValueText() { - getEmptyText().setText(getEmptyValueText()); - } - - @NotNull - protected String getEmptyValueText() { - return ""; + public IntegerValueEditor getValueEditor() { + return myValueEditor; } } diff --git a/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/AbstractValueEditor.java b/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/AbstractValueEditor.java index 25b751681dc6..f79ca05a617e 100644 --- a/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/AbstractValueEditor.java +++ b/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/AbstractValueEditor.java @@ -20,10 +20,14 @@ import com.intellij.openapi.util.InvalidDataException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + public abstract class AbstractValueEditor implements ValueEditor { private @NotNull T myDefaultValue; private @Nullable String myValueName; + private final List> myListeners = new ArrayList<>(); protected AbstractValueEditor(@Nullable String valueName, @NotNull T defaultValue) { @@ -90,4 +94,13 @@ public abstract class AbstractValueEditor implements ValueEditor { public T getDefaultValue() { return myDefaultValue; } + + @Override + public void addListener(@NotNull Listener editorListener) { + myListeners.add(editorListener); + } + + public void fireValueChanged(@NotNull T newValue) { + for (Listener listener : myListeners) listener.valueChanged(newValue); + } } diff --git a/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/TextFieldValueEditor.java b/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/TextFieldValueEditor.java index 9cd58aee5480..4945a4f5665e 100644 --- a/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/TextFieldValueEditor.java +++ b/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/TextFieldValueEditor.java @@ -46,10 +46,8 @@ public abstract class TextFieldValueEditor extends AbstractValueEditor { @SuppressWarnings("unused") protected String validateTextOnChange(String text, DocumentEvent e) { try { - if (StringUtil.isEmptyOrSpaces(text)) { - onEmptyValue(); - } - parseValue(text); + T newValue = parseValue(text); + fireValueChanged(newValue); return null; } catch (InvalidDataException ex) { @@ -77,6 +75,4 @@ public abstract class TextFieldValueEditor extends AbstractValueEditor { myField.setText(text); } - protected void onEmptyValue() {} - } diff --git a/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/ValueEditor.java b/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/ValueEditor.java index c9b13841d023..54d074d49d20 100644 --- a/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/ValueEditor.java +++ b/platform/platform-api/src/com/intellij/ui/components/fields/valueEditors/ValueEditor.java @@ -84,4 +84,10 @@ public interface ValueEditor { * @param value The value to check. */ void assertValid(@NotNull T value); + + void addListener(@NotNull Listener editorListener); + + interface Listener { + void valueChanged(@NotNull T newValue); + } }