diff --git a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form
deleted file mode 100644
index 7b0ef242459f..000000000000
--- a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
diff --git a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.kt b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.kt
index fa91bf4024e5..5f43cf93dcff 100644
--- a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.kt
+++ b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.kt
@@ -1,175 +1,102 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
-package com.intellij.application.options.emmet;
+package com.intellij.application.options.emmet
-import com.intellij.codeInsight.template.emmet.filters.ZenCodingFilter;
-import com.intellij.openapi.Disposable;
-import com.intellij.openapi.options.Configurable;
-import com.intellij.openapi.options.ConfigurationException;
-import com.intellij.openapi.options.SearchableConfigurable;
-import com.intellij.openapi.util.Disposer;
-import com.intellij.ui.IdeBorderFactory;
-import com.intellij.ui.components.JBCheckBox;
-import com.intellij.ui.components.JBTextField;
-import com.intellij.util.ui.JBInsets;
-import com.intellij.util.ui.UIUtil;
-import com.intellij.xml.XmlBundle;
-import org.jetbrains.annotations.Nls;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import com.intellij.codeInsight.template.emmet.filters.ZenCodingFilter
+import com.intellij.openapi.options.BoundSearchableConfigurable
+import com.intellij.openapi.ui.DialogPanel
+import com.intellij.ui.components.JBCheckBox
+import com.intellij.ui.dsl.builder.*
+import com.intellij.ui.layout.selected
+import com.intellij.xml.XmlBundle
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.List;
-import java.util.*;
+class XmlEmmetConfigurable : BoundSearchableConfigurable(XmlBundle.message("configurable.XmlEmmetConfigurable.display.name"),
+ "reference.idesettings.emmet.xml") {
-public class XmlEmmetConfigurable implements SearchableConfigurable, Disposable, Configurable.NoScroll {
- private JPanel myPanel;
- private JBCheckBox myEnableEmmetJBCheckBox;
- private JBCheckBox myEnablePreviewJBCheckBox;
- private JPanel myFiltersListPanel;
- private JBCheckBox myEnableHrefAutodetectJBCheckBox;
- private JBCheckBox myAddEditPointAtTheEndOfTemplateJBCheckBox;
- private JBTextField myBemElementSeparatorTextField;
- private JBTextField myBemModifierSeparatorTextField;
- private JBTextField myBemShortElementPrefixTextField;
- private JPanel myBemPanel;
+ private val filtersCheckBoxes = mutableMapOf()
- private Map myFilterCheckboxes = new HashMap<>();
-
- public XmlEmmetConfigurable() {
- myEnableEmmetJBCheckBox.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- boolean selected = myEnableEmmetJBCheckBox.isSelected();
- myEnablePreviewJBCheckBox.setEnabled(selected);
- myFiltersListPanel.setEnabled(selected);
- myEnableHrefAutodetectJBCheckBox.setEnabled(selected);
- myAddEditPointAtTheEndOfTemplateJBCheckBox.setEnabled(selected);
- UIUtil.setEnabled(myBemPanel, selected, true);
- for (JBCheckBox checkBox : myFilterCheckboxes.values()) {
- checkBox.setEnabled(selected);
+ override fun createPanel(): DialogPanel {
+ return panel {
+ val settings = EmmetOptions.getInstance()
+ lateinit var cbEmmetEnabled: JBCheckBox
+ row {
+ cbEmmetEnabled = checkBox(XmlBundle.message("emmet.enable.label"))
+ .bindSelected(settings::isEmmetEnabled, settings::setEmmetEnabled)
+ .component
+ }
+ rowsRange {
+ row {
+ checkBox(XmlBundle.message("emmet.enable.preview"))
+ .bindSelected(settings::isPreviewEnabled, settings::setPreviewEnabled)
+ }
+ row {
+ checkBox(XmlBundle.message("emmet.href.autodetect"))
+ .bindSelected(settings::isHrefAutoDetectEnabled, settings::setHrefAutoDetectEnabled)
+ }
+ row {
+ checkBox(XmlBundle.message("emmet.add.edit.point.at.the.end.of.template"))
+ .bindSelected(settings::isAddEditPointAtTheEndOfTemplate, settings::setAddEditPointAtTheEndOfTemplate)
}
- }
- });
- myFiltersListPanel.setBorder(IdeBorderFactory.createTitledBorder(XmlBundle.message("emmet.filters.enabled.by.default")));
- myBemPanel.setBorder(IdeBorderFactory.createTitledBorder(XmlBundle.message("emmet.bem.title")));
- createFiltersCheckboxes();
- }
+ group(XmlBundle.message("xml.options.border.title.bem")) {
+ row(XmlBundle.message("emmet.bem.class.name.element.separator.label")) {
+ textField()
+ .bindText(settings::getBemElementSeparator, settings::setBemElementSeparator)
+ .columns(COLUMNS_TINY)
+ }
+ row(XmlBundle.message("emmet.bem.class.name.modifier.separator.label")) {
+ textField()
+ .bindText(settings::getBemModifierSeparator, settings::setBemModifierSeparator)
+ .columns(COLUMNS_TINY)
+ }
+ row(XmlBundle.message("emmet.bem.short.element.prefix.label")) {
+ textField()
+ .bindText(settings::getBemShortElementPrefix, settings::setBemShortElementPrefix)
+ .columns(COLUMNS_TINY)
+ }
+ }
- public void createFiltersCheckboxes() {
- final List filters = ZenCodingFilter.getInstances();
- final GridBagLayout layoutManager = new GridBagLayout();
- final GridBagConstraints constraints = new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
- JBInsets.emptyInsets(), 0, 0);
- myFiltersListPanel.setLayout(layoutManager);
- int added = 0;
- for (ZenCodingFilter filter : filters) {
- if (filter.isSystem()) continue;
+ group(XmlBundle.message("emmet.filters.enabled.by.default")) {
+ val filters = ZenCodingFilter.getInstances()
+ for (filter in filters) {
+ if (filter.isSystem || filtersCheckBoxes.containsKey(filter.getSuffix())) {
+ continue
+ }
- if (myFilterCheckboxes.containsKey(filter.getSuffix())) continue;
- final JBCheckBox checkBox = new JBCheckBox(filter.getDisplayName());
- myFilterCheckboxes.put(filter.getSuffix(), checkBox);
- constraints.gridy = added;
- myFiltersListPanel.add(checkBox, constraints);
- added++;
- }
- myFiltersListPanel.revalidate();
- }
-
- @Override
- public void dispose() {
- myFilterCheckboxes.clear();
- myFilterCheckboxes = null;
- }
-
- @Override
- public @Nullable JComponent createComponent() {
- return myPanel;
- }
-
- @Override
- public boolean isModified() {
- EmmetOptions emmetOptions = EmmetOptions.getInstance();
- return emmetOptions.isEmmetEnabled() != myEnableEmmetJBCheckBox.isSelected() ||
- emmetOptions.isPreviewEnabled() != myEnablePreviewJBCheckBox.isSelected() ||
- emmetOptions.isHrefAutoDetectEnabled() != myEnableHrefAutodetectJBCheckBox.isSelected() ||
- emmetOptions.isAddEditPointAtTheEndOfTemplate() != myAddEditPointAtTheEndOfTemplateJBCheckBox.isSelected() ||
- !emmetOptions.getFiltersEnabledByDefault().equals(enabledFilters()) ||
- !emmetOptions.getBemElementSeparator().equals(myBemElementSeparatorTextField.getText()) ||
- !emmetOptions.getBemModifierSeparator().equals(myBemModifierSeparatorTextField.getText()) ||
- !emmetOptions.getBemShortElementPrefix().equals(myBemShortElementPrefixTextField.getText());
- }
-
- @Override
- public void apply() throws ConfigurationException {
- EmmetOptions emmetOptions = EmmetOptions.getInstance();
- emmetOptions.setEmmetEnabled(myEnableEmmetJBCheckBox.isSelected());
- emmetOptions.setPreviewEnabled(myEnablePreviewJBCheckBox.isSelected());
- emmetOptions.setHrefAutoDetectEnabled(myEnableHrefAutodetectJBCheckBox.isSelected());
- emmetOptions.setAddEditPointAtTheEndOfTemplate(myAddEditPointAtTheEndOfTemplateJBCheckBox.isSelected());
- emmetOptions.setFiltersEnabledByDefault(enabledFilters());
- emmetOptions.setBemElementSeparator(myBemElementSeparatorTextField.getText());
- emmetOptions.setBemModifierSeparator(myBemModifierSeparatorTextField.getText());
- emmetOptions.setBemShortElementPrefix(myBemShortElementPrefixTextField.getText());
- }
-
- @Override
- public void reset() {
- EmmetOptions emmetOptions = EmmetOptions.getInstance();
- myEnableEmmetJBCheckBox.setSelected(emmetOptions.isEmmetEnabled());
- myEnablePreviewJBCheckBox.setEnabled(emmetOptions.isEmmetEnabled());
- myEnablePreviewJBCheckBox.setSelected(emmetOptions.isPreviewEnabled());
- myEnableHrefAutodetectJBCheckBox.setEnabled(emmetOptions.isEmmetEnabled());
- myEnableHrefAutodetectJBCheckBox.setSelected(emmetOptions.isHrefAutoDetectEnabled());
- myAddEditPointAtTheEndOfTemplateJBCheckBox.setEnabled(emmetOptions.isEmmetEnabled());
- myAddEditPointAtTheEndOfTemplateJBCheckBox.setSelected(emmetOptions.isAddEditPointAtTheEndOfTemplate());
-
- myBemElementSeparatorTextField.setText(emmetOptions.getBemElementSeparator());
- myBemModifierSeparatorTextField.setText(emmetOptions.getBemModifierSeparator());
- myBemShortElementPrefixTextField.setText(emmetOptions.getBemShortElementPrefix());
-
- Set enabledByDefault = emmetOptions.getFiltersEnabledByDefault();
- for (ZenCodingFilter filter : ZenCodingFilter.getInstances()) {
- if (filter.isSystem()) continue;
- final String filterSuffix = filter.getSuffix();
- final JBCheckBox checkBox = myFilterCheckboxes.get(filterSuffix);
- if (checkBox != null) {
- checkBox.setEnabled(emmetOptions.isEmmetEnabled());
- checkBox.setSelected(enabledByDefault.contains(filterSuffix));
- }
+ row {
+ val checkBox = checkBox(filter.getDisplayName()).component
+ filtersCheckBoxes[filter.getSuffix()] = checkBox
+ }
+ }
+ }
+ }.enabledIf(cbEmmetEnabled.selected)
}
}
- @Override
- public void disposeUIResources() {
- Disposer.dispose(this);
+ override fun disposeUIResources() {
+ filtersCheckBoxes.clear()
+ super.disposeUIResources()
}
- private @NotNull Set enabledFilters() {
- Set result = new HashSet<>();
- for (Map.Entry checkbox : myFilterCheckboxes.entrySet()) {
- if (checkbox.getValue().isSelected()) {
- result.add(checkbox.getKey());
- }
+ override fun isModified(): Boolean {
+ return super.isModified() || EmmetOptions.getInstance().filtersEnabledByDefault != enabledFilters()
+ }
+
+ override fun apply() {
+ super.apply()
+ EmmetOptions.getInstance().filtersEnabledByDefault = enabledFilters()
+ }
+
+ override fun reset() {
+ super.reset()
+
+ val enabledByDefault = EmmetOptions.getInstance().filtersEnabledByDefault
+ for (filter in ZenCodingFilter.getInstances()) {
+ if (filter.isSystem) continue
+ filtersCheckBoxes[filter.getSuffix()]?.setSelected(enabledByDefault.contains(filter.getSuffix()))
}
- return result;
}
- @Override
- public @Nls String getDisplayName() {
- return XmlBundle.message("configurable.XmlEmmetConfigurable.display.name");
- }
-
- @Override
- public @Nullable String getHelpTopic() {
- return getId();
- }
-
- @Override
- public @NotNull String getId() {
- return "reference.idesettings.emmet.xml";
+ private fun enabledFilters(): Set {
+ return filtersCheckBoxes.filterValues { it.isSelected }.keys
}
}
diff --git a/xml/openapi/resources/messages/XmlBundle.properties b/xml/openapi/resources/messages/XmlBundle.properties
index 63a7946774f4..d601db563c2d 100644
--- a/xml/openapi/resources/messages/XmlBundle.properties
+++ b/xml/openapi/resources/messages/XmlBundle.properties
@@ -2,7 +2,6 @@ emmet.title=Emmet
emmet.configuration.title=Emmet
emmet.enable.label=&Enable XML/HTML Emmet
emmet.filters.enabled.by.default=Filters enabled by default
-emmet.bem.title=BEM
emmet.enable.preview=Enable &abbreviation preview
emmet.expand.abbreviation.with=Expand &abbreviation with
emmet.href.autodetect=Enable automatic &URL recognition while wrapping text with tag