diff --git a/build.gradle.kts b/build.gradle.kts
index 9a3c0a36..b02b9a48 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -95,7 +95,7 @@ tasks {
patchPluginXml {
version.set(project.version.toString())
sinceBuild.set("231")
- untilBuild.set("233.*")
+ untilBuild.set("")
changeNotes.set("""
Meet the new Feature: Advanced Search! (since v4.5)
diff --git a/src/main/java/ir/mmd/intellijDev/Actionable/caret/editing/settings/UI.kt b/src/main/java/ir/mmd/intellijDev/Actionable/caret/editing/settings/UI.kt
index 931591c1..1098f3ff 100644
--- a/src/main/java/ir/mmd/intellijDev/Actionable/caret/editing/settings/UI.kt
+++ b/src/main/java/ir/mmd/intellijDev/Actionable/caret/editing/settings/UI.kt
@@ -1,5 +1,6 @@
package ir.mmd.intellijDev.Actionable.caret.editing.settings
+import com.intellij.openapi.observable.properties.ObservableMutableProperty
import com.intellij.ui.dsl.builder.*
import ir.mmd.intellijDev.Actionable.ActionableBundle
import ir.mmd.intellijDev.Actionable.util.observableMutablePropertyOf
@@ -11,7 +12,7 @@ class UI {
val component = panel {
row {
checkBox(ActionableBundle.string("caretEditingPanel.showPasteActionHintsCheckBox.label"))
- .bindSelected(isPasteActionHintsShownProperty)
+ .bindSelected(isPasteActionHintsShownProperty as ObservableMutableProperty)
.align(Align.FILL)
.comment(ActionableBundle.string("caretEditingPanel.showPasteActionHintsCheckBox.comment"))
diff --git a/src/main/java/ir/mmd/intellijDev/Actionable/caret/movement/settings/UI.form b/src/main/java/ir/mmd/intellijDev/Actionable/caret/movement/settings/UI.form
deleted file mode 100644
index 5d96fd7d..00000000
--- a/src/main/java/ir/mmd/intellijDev/Actionable/caret/movement/settings/UI.form
+++ /dev/null
@@ -1,277 +0,0 @@
-
-
diff --git a/src/main/java/ir/mmd/intellijDev/Actionable/caret/movement/settings/UI.kt b/src/main/java/ir/mmd/intellijDev/Actionable/caret/movement/settings/UI.kt
index 607ca9a0..330382c6 100644
--- a/src/main/java/ir/mmd/intellijDev/Actionable/caret/movement/settings/UI.kt
+++ b/src/main/java/ir/mmd/intellijDev/Actionable/caret/movement/settings/UI.kt
@@ -1,133 +1,154 @@
-package ir.mmd.intellijDev.Actionable.caret.movement.settings;
+package ir.mmd.intellijDev.Actionable.caret.movement.settings
-import ir.mmd.intellijDev.Actionable.caret.movement.settings.SettingsState.SEMBehaviour;
-import ir.mmd.intellijDev.Actionable.caret.movement.settings.SettingsState.WSBehaviour;
-import org.jetbrains.annotations.NotNull;
+import com.intellij.openapi.observable.properties.ObservableMutableProperty
+import com.intellij.ui.dsl.builder.Align
+import com.intellij.ui.dsl.builder.bindSelected
+import com.intellij.ui.dsl.builder.bindText
+import com.intellij.ui.dsl.builder.panel
+import ir.mmd.intellijDev.Actionable.ActionableBundle
+import ir.mmd.intellijDev.Actionable.util.observableMutablePropertyOf
-import javax.swing.*;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-public class UI {
- private JPanel component;
- private JTextField wordSeparatorsField;
- private JCheckBox newLineIncluded;
- private JCheckBox tabIncluded;
- private ButtonGroup wordSeparatorsBehaviourGroup;
- private JRadioButton stopAtCharacterTypeChangeRadioButton;
- private JRadioButton stopAtNextSameCharacterTypeRadioButton;
- private JButton wordSeparatorsFieldDefault;
- private JButton wordSeparatorsBehaviourDefault;
- private JTextField hardStopCharactersField;
- private JButton hardStopCharactersDefault;
- private JCheckBox hardStopCharactersIncludeNewLine;
- private JCheckBox hardStopCharactersIncludeTab;
- private ButtonGroup sameElementMovementBehaviourGroup;
- private JRadioButton startRadioButton;
- private JRadioButton offsetBasedRadioButton;
- private JRadioButton endRadioButton;
- private JButton sameElementMovementBehaviourDefault;
+class UI {
+ private val newLineIncludedProperty = observableMutablePropertyOf('\n' in SettingsState.Defaults.wordSeparators)
+ private var newLineIncluded by newLineIncludedProperty
- public UI() {
- stopAtCharacterTypeChangeRadioButton.setActionCommand(WSBehaviour.StopAtCharTypeChange.name());
- stopAtNextSameCharacterTypeRadioButton.setActionCommand(WSBehaviour.StopAtNextSameCharType.name());
- startRadioButton.setActionCommand(SEMBehaviour.Start.name());
- offsetBasedRadioButton.setActionCommand(SEMBehaviour.Offset.name());
- endRadioButton.setActionCommand(SEMBehaviour.End.name());
-
- initListeners();
- }
+ private val tabIncludedProperty = observableMutablePropertyOf('\t' in SettingsState.Defaults.wordSeparators)
+ private var tabIncluded by tabIncludedProperty
- private void initListeners() {
- wordSeparatorsFieldDefault.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- UI.this.setWordSeparators(SettingsState.Defaults.wordSeparators);
- }
- });
-
- wordSeparatorsBehaviourDefault.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- UI.this.setWordSeparatorsBehaviour(SettingsState.Defaults.wordSeparatorsBehaviour);
- }
- });
-
- hardStopCharactersDefault.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- UI.this.setHardStopCharacters(SettingsState.Defaults.hardStopSeparators);
- }
- });
-
- sameElementMovementBehaviourDefault.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- UI.this.setSameElementMovementBehaviour(SettingsState.Defaults.sameElementMovementBehaviour);
- }
- });
- }
-
- public JPanel getComponent() {
- return component;
- }
+ private val wordSeparatorsProperty = observableMutablePropertyOf(SettingsState.Defaults.wordSeparators.replace("[\n\t]".toRegex(), ""))
+ var wordSeparators: String
+ get() {
+ return StringBuilder(wordSeparatorsProperty.get()).apply {
+ if (newLineIncluded) {
+ append("\n")
+ }
+
+ if (tabIncluded) {
+ append("\t")
+ }
+ }.toString()
+ }
+ set(value) {
+ newLineIncluded = value.indexOf('\n') != -1
+ tabIncluded = value.indexOf('\t') != -1
+ wordSeparatorsProperty.set(value.replace("[\n\t]".toRegex(), ""))
+ }
- public String getWordSeparators() {
- var ws = wordSeparatorsField.getText();
- if (newLineIncluded.isSelected()) ws += '\n';
- if (tabIncluded.isSelected()) ws += '\t';
- return ws;
- }
+ private val wordSeparatorsBehaviourProperty = observableMutablePropertyOf(SettingsState.Defaults.wordSeparatorsBehaviour)
+ var wordSeparatorsBehaviour by wordSeparatorsBehaviourProperty
- public void setWordSeparators(@NotNull String s) {
- var newLine = s.contains("\n");
- var tab = s.contains("\t");
-
- wordSeparatorsField.setText(s.replaceAll("[\n\t]", ""));
- newLineIncluded.setSelected(newLine);
- tabIncluded.setSelected(tab);
- }
+ private val hardStopNewLineIncludedProperty = observableMutablePropertyOf('\n' in SettingsState.Defaults.hardStopSeparators)
+ private var hardStopNewLineIncluded by newLineIncludedProperty
- public WSBehaviour getWordSeparatorsBehaviour() {
- return WSBehaviour.valueOf(wordSeparatorsBehaviourGroup.getSelection().getActionCommand());
- }
+ private val hardStopTabIncludedProperty = observableMutablePropertyOf('\t' in SettingsState.Defaults.hardStopSeparators)
+ private var hardStopTabIncluded by tabIncludedProperty
- public void setWordSeparatorsBehaviour(WSBehaviour behaviour) {
- final var targetModel = switch (behaviour) {
- case StopAtCharTypeChange -> stopAtCharacterTypeChangeRadioButton.getModel();
- case StopAtNextSameCharType -> stopAtNextSameCharacterTypeRadioButton.getModel();
- };
-
- wordSeparatorsBehaviourGroup.setSelected(targetModel, true);
- }
+ private val hardStopCharactersProperty = observableMutablePropertyOf(SettingsState.Defaults.hardStopSeparators.replace("[\n\t]".toRegex(), ""))
+ var hardStopCharacters: String
+ get() {
+ return StringBuilder(hardStopCharactersProperty.get()).apply {
+ if (hardStopNewLineIncluded) {
+ append("\n")
+ }
+
+ if (hardStopTabIncluded) {
+ append("\t")
+ }
+ }.toString()
+ }
+ set(value) {
+ hardStopNewLineIncluded = value.indexOf('\n') != -1
+ hardStopTabIncluded = value.indexOf('\t') != -1
+ hardStopCharactersProperty.set(value.replace("[\n\t]".toRegex(), ""))
+ }
- public String getHardStopCharacters() {
- var hs = hardStopCharactersField.getText();
- if (hardStopCharactersIncludeNewLine.isSelected()) hs += "\n";
- if (hardStopCharactersIncludeTab.isSelected()) hs += "\t";
- return hs;
- }
+ private val sameElementMovementBehaviourProperty = observableMutablePropertyOf(SettingsState.Defaults.sameElementMovementBehaviour)
+ var sameElementMovementBehaviour by sameElementMovementBehaviourProperty
- public void setHardStopCharacters(@NotNull String s) {
- final var newLine = s.contains("\n");
- final var tab = s.contains("\t");
+ val component = panel {// todo add default button
+ group(ActionableBundle.string("caretMovementPanel.wordSeparators.label")) {
+ row {
+ textField()
+ .bindText(wordSeparatorsProperty as ObservableMutableProperty)
+ .align(Align.FILL)
+ }
+
+ row {
+ checkBox(ActionableBundle.string("caretMovementPanel.wordSeparators.newLineIncluded.label"))
+ .bindSelected(newLineIncludedProperty as ObservableMutableProperty)
+ .align(Align.FILL)
+ }
+
+ row {
+ checkBox(ActionableBundle.string("caretMovementPanel.wordSeparators.tabIncluded.label"))
+ .bindSelected(tabIncludedProperty as ObservableMutableProperty)
+ .align(Align.FILL)
+ }
+
+ row {
+ comment(ActionableBundle.string("caretMovementPanel.wordSeparators.comment"))
+ }
+
+ row {
+ comment(ActionableBundle.string("caretMovementPanel.wordSeparatorsBehaviour.comment"))
+ }
+ }
- hardStopCharactersField.setText(s.replaceAll("[\n\t]", ""));
- hardStopCharactersIncludeNewLine.setSelected(newLine);
- hardStopCharactersIncludeTab.setSelected(tab);
- }
-
- public SEMBehaviour getSameElementMovementBehaviour() {
- return SEMBehaviour.valueOf(sameElementMovementBehaviourGroup.getSelection().getActionCommand());
- }
-
- public void setSameElementMovementBehaviour(SEMBehaviour behaviour) {
- final var targetModel = switch (behaviour) {
- case Start -> startRadioButton.getModel();
- case Offset -> offsetBasedRadioButton.getModel();
- case End -> endRadioButton.getModel();
- };
+ group(ActionableBundle.string("caretMovementPanel.wordSeparatorsBehaviour.label")) {
+ buttonsGroup {
+ row {
+ radioButton(ActionableBundle.string("caretMovementPanel.wordSeparatorsBehaviour.option1.label"), SettingsState.WSBehaviour.StopAtCharTypeChange)
+ .comment(ActionableBundle.string("caretMovementPanel.wordSeparatorsBehaviour.option1.comment"))
+ }
+
+ row {
+ radioButton(ActionableBundle.string("caretMovementPanel.wordSeparatorsBehaviour.option2.label"), SettingsState.WSBehaviour.StopAtNextSameCharType)
+ .comment(ActionableBundle.string("caretMovementPanel.wordSeparatorsBehaviour.option2.comment"))
+ }
+ }.bind(wordSeparatorsBehaviourProperty, SettingsState.WSBehaviour::class.java)
+ }
+
+ group(ActionableBundle.string("caretMovementPanel.hardStopSeparators.label")) {
+ row {
+ textField()
+ .bindText(hardStopCharactersProperty as ObservableMutableProperty)
+ .align(Align.FILL)
+ }
+
+ row {
+ checkBox(ActionableBundle.string("caretMovementPanel.wordSeparators.newLineIncluded.label"))
+ .bindSelected(hardStopNewLineIncludedProperty as ObservableMutableProperty)
+ .align(Align.FILL)
+ }
+
+ row {
+ checkBox(ActionableBundle.string("caretMovementPanel.wordSeparators.tabIncluded.label"))
+ .bindSelected(hardStopTabIncludedProperty as ObservableMutableProperty)
+ .align(Align.FILL)
+ }
+
+ row {
+ comment(ActionableBundle.string("caretMovementPanel.hardStopSeparators.comment"))
+ }
+ }
- sameElementMovementBehaviourGroup.setSelected(targetModel, true);
+ group(ActionableBundle.string("caretMovementPanel.sameElementMovementBehaviour.label")) {
+ buttonsGroup {
+ row {
+ radioButton(ActionableBundle.string("caretMovementPanel.sameElementMovementBehaviour.option1.label"), SettingsState.SEMBehaviour.Start)
+ .comment(ActionableBundle.string("caretMovementPanel.sameElementMovementBehaviour.option1.comment"))
+ }
+
+ row {
+ radioButton(ActionableBundle.string("caretMovementPanel.sameElementMovementBehaviour.option2.label"), SettingsState.SEMBehaviour.Offset)
+ .comment(ActionableBundle.string("caretMovementPanel.sameElementMovementBehaviour.option2.comment"))
+ }
+
+ row {
+ radioButton(ActionableBundle.string("caretMovementPanel.sameElementMovementBehaviour.option3.label"), SettingsState.SEMBehaviour.End)
+ .comment(ActionableBundle.string("caretMovementPanel.sameElementMovementBehaviour.option3.comment"))
+ }
+ }.bind(sameElementMovementBehaviourProperty, SettingsState.SEMBehaviour::class.java)
+ }
}
}
diff --git a/src/main/java/ir/mmd/intellijDev/Actionable/find/settings/UI.kt b/src/main/java/ir/mmd/intellijDev/Actionable/find/settings/UI.kt
index bebdb005..f3f271ba 100644
--- a/src/main/java/ir/mmd/intellijDev/Actionable/find/settings/UI.kt
+++ b/src/main/java/ir/mmd/intellijDev/Actionable/find/settings/UI.kt
@@ -1,5 +1,6 @@
package ir.mmd.intellijDev.Actionable.find.settings
+import com.intellij.openapi.observable.properties.ObservableMutableProperty
import com.intellij.ui.dsl.builder.*
import ir.mmd.intellijDev.Actionable.ActionableBundle
import ir.mmd.intellijDev.Actionable.util.observableMutablePropertyOf
@@ -11,7 +12,7 @@ class UI {
val component = panel {
row {
checkBox(ActionableBundle.string("findPanel.caseSensitiveCheckBox.label"))
- .bindSelected(isCaseSensitiveProperty)
+ .bindSelected(isCaseSensitiveProperty as ObservableMutableProperty)
.align(Align.FILL)
.comment(ActionableBundle.string("findPanel.caseSensitiveCheckBox.comment"))
diff --git a/src/main/java/ir/mmd/intellijDev/Actionable/text/settings/UI.kt b/src/main/java/ir/mmd/intellijDev/Actionable/text/settings/UI.kt
index 6e9e1c68..c2d4352b 100644
--- a/src/main/java/ir/mmd/intellijDev/Actionable/text/settings/UI.kt
+++ b/src/main/java/ir/mmd/intellijDev/Actionable/text/settings/UI.kt
@@ -1,5 +1,6 @@
package ir.mmd.intellijDev.Actionable.text.settings
+import com.intellij.openapi.observable.properties.ObservableMutableProperty
import com.intellij.ui.dsl.builder.*
import ir.mmd.intellijDev.Actionable.ActionableBundle
import ir.mmd.intellijDev.Actionable.util.observableMutablePropertyOf
@@ -11,7 +12,7 @@ class UI {
val component = panel {
row {
checkBox(ActionableBundle.string("textPanel.preserveCase.label"))
- .bindSelected(preserveCaseProperty)
+ .bindSelected(preserveCaseProperty as ObservableMutableProperty)
.align(Align.FILL)
button(ActionableBundle.string("global.defaultButton.label")) {
diff --git a/src/main/java/ir/mmd/intellijDev/Actionable/util/Helpers.kt b/src/main/java/ir/mmd/intellijDev/Actionable/util/Helpers.kt
index 90c7f376..d980f91a 100644
--- a/src/main/java/ir/mmd/intellijDev/Actionable/util/Helpers.kt
+++ b/src/main/java/ir/mmd/intellijDev/Actionable/util/Helpers.kt
@@ -3,6 +3,7 @@ package ir.mmd.intellijDev.Actionable.util
import com.intellij.openapi.Disposable
import com.intellij.openapi.observable.properties.ObservableMutableProperty
import com.intellij.openapi.util.Disposer
+import com.intellij.ui.dsl.builder.MutableProperty
import com.intellij.util.application
/**
@@ -49,7 +50,7 @@ inline infix fun Boolean.then(block: () -> Unit) = also { if (this) block() }
@Suppress("NOTHING_TO_INLINE")
inline fun service(clazz: Class): T = application.getService(clazz)
-fun observableMutablePropertyOf(initialValue: T) = object : ObservableMutableProperty {
+class ObservableMutablePropertyImpl(initialValue: T) : ObservableMutableProperty, MutableProperty {
private var v = initialValue
private var listener: ((T) -> Unit)? = null
@@ -68,3 +69,5 @@ fun observableMutablePropertyOf(initialValue: T) = object : ObservableMutabl
}
}
}
+
+fun observableMutablePropertyOf(initialValue: T) = ObservableMutablePropertyImpl(initialValue)
diff --git a/src/main/resources/strings.properties b/src/main/resources/strings.properties
index 5575d24e..b99d8be6 100644
--- a/src/main/resources/strings.properties
+++ b/src/main/resources/strings.properties
@@ -1,30 +1,30 @@
global.defaultButton.label=Default
#############################################################
-caretMovementPanel.wordSeparators.label=Word separators:
+caretMovementPanel.wordSeparators.label=Word Separators:
caretMovementPanel.wordSeparators.newLineIncluded.label=Include new line character (\\n)
caretMovementPanel.wordSeparators.tabIncluded.label=Include tab character (\\t)
caretMovementPanel.wordSeparators.comment=Word separators will be used to determine where the caret should stop.
caretMovementPanel.wordSeparatorsBehaviour.label=Behaviour:
caretMovementPanel.wordSeparatorsBehaviour.option1.label=Stop at character type change
-caretMovementPanel.wordSeparatorsBehaviour.option1.comment=If caret movement begins at a word character, it should go until next word separator character.
If caret movement begins at a word separator character, it should go until next word character.
+caretMovementPanel.wordSeparatorsBehaviour.option1.comment=If caret movement begins at a word character, it should go until next word separator character.
If caret movement begins at a word separator character, it should go until next word character.
caretMovementPanel.wordSeparatorsBehaviour.option2.label=Stop at next same character type
-caretMovementPanel.wordSeparatorsBehaviour.option2.comment=If caret movement begins at a word character, it should go until next word character, after passing word separator characters.
If caret movement begins at a word separator character, it should go until next word separator character, after passing word characters.
-caretMovementPanel.wordSeparatorsBehaviour.comment=Glossary:
Word separator character: any character that you've defined in the word separators field.
Word character: all characters except those defined in the word separators field.
+caretMovementPanel.wordSeparatorsBehaviour.option2.comment=If caret movement begins at a word character, it should go until next word character, after passing word separator characters.
If caret movement begins at a word separator character, it should go until next word separator character, after passing word characters.
+caretMovementPanel.wordSeparatorsBehaviour.comment=Glossary:
Word separator character: any character that you've defined in the word separators field.
Word character: all characters except those defined in the word separators field.
caretMovementPanel.hardStopSeparators.label=Hard Stop Characters:
-caretMovementPanel.hardStopSeparators.comment=If caret reaches any of these characters, no matter where, it will stop.
If there are more than one hard stop characters in front/back of the caret, it will move one by one.
+caretMovementPanel.hardStopSeparators.comment=If caret reaches any of these characters, no matter where, it will stop.
If there are more than one hard stop characters in front/back of the caret, it will move one by one.
caretMovementPanel.sameElementMovementBehaviour.label=Same Element Movement Behaviour:
caretMovementPanel.sameElementMovementBehaviour.option1.label=Start
-caretMovementPanel.sameElementMovementBehaviour.option1.comment=Place caret at the start of the target PsiElement
-caretMovementPanel.sameElementMovementBehaviour.option2.label=Offset Based
-caretMovementPanel.sameElementMovementBehaviour.option2.comment=Place caret at the same offset (or end if offset overflows target PsiElement) of the target PsiElement
+caretMovementPanel.sameElementMovementBehaviour.option1.comment=Place caret at the start of the target PsiElement
+caretMovementPanel.sameElementMovementBehaviour.option2.label=Offset based
+caretMovementPanel.sameElementMovementBehaviour.option2.comment=Place caret at the same offset (or end if offset overflows target PsiElement) of the target PsiElement
caretMovementPanel.sameElementMovementBehaviour.option3.label=End
-caretMovementPanel.sameElementMovementBehaviour.option3.comment=Place caret at the end of the target PsiElement
+caretMovementPanel.sameElementMovementBehaviour.option3.comment=Place caret at the end of the target PsiElement
#############################################################
findPanel.caseSensitiveCheckBox.label=Is find case-sensitive?
-findPanel.caseSensitiveCheckBox.comment=Whether find-actions should be case-sensitive or not.
e.g. add selection to next occurrence.
+findPanel.caseSensitiveCheckBox.comment=Whether find-actions should be case-sensitive or not.
e.g. add selection to next occurrence.
#############################################################
caretEditingPanel.showPasteActionHintsCheckBox.label=Show highlighter hints for paste actions?
-caretEditingPanel.showPasteActionHintsCheckBox.comment=Whether to show highlighter hints for paste actions (e.g. Set copy-paste word offset) or not.
+caretEditingPanel.showPasteActionHintsCheckBox.comment=Whether to show highlighter hints for paste actions (e.g. Set copy-paste word offset) or not.
#############################################################
macroPanel.addButton.label=Create New Macro
macroPanel.removeButton.label=Remove Selected Macro