[Kotlin UI DSL] Ported XmlEmmetConfigurable to Kotlin UI DSL

GitOrigin-RevId: b0fb825986b685d0f2f63ac7258ca3f7510785dc
This commit is contained in:
Pavel Porvatov
2023-09-26 10:05:44 +02:00
committed by intellij-monorepo-bot
parent bea82d00c9
commit 223b8e5a59
3 changed files with 83 additions and 282 deletions

View File

@@ -1,125 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.application.options.emmet.XmlEmmetConfigurable">
<grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="7" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="1797" height="282"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="446a3" class="com.intellij.ui.components.JBCheckBox" binding="myEnableEmmetJBCheckBox" default-binding="true">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/XmlBundle" key="emmet.enable.label"/>
</properties>
</component>
<component id="c52c1" class="com.intellij.ui.components.JBCheckBox" binding="myEnablePreviewJBCheckBox">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/XmlBundle" key="emmet.enable.preview"/>
</properties>
</component>
<grid id="cdbb7" binding="myFiltersListPanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="5" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="1" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children/>
</grid>
<component id="d49b0" class="com.intellij.ui.components.JBCheckBox" binding="myEnableHrefAutodetectJBCheckBox">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/XmlBundle" key="emmet.href.autodetect"/>
</properties>
</component>
<component id="8349b" class="com.intellij.ui.components.JBCheckBox" binding="myAddEditPointAtTheEndOfTemplateJBCheckBox">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/XmlBundle" key="emmet.add.edit.point.at.the.end.of.template"/>
</properties>
</component>
<grid id="fb640" binding="myBemPanel" layout-manager="GridLayoutManager" row-count="3" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="1" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none" title-resource-bundle="messages/XmlBundle" title-key="xml.options.border.title.bem"/>
<children>
<component id="48744" class="com.intellij.ui.components.JBLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="525"/>
<text resource-bundle="messages/XmlBundle" key="emmet.bem.class.name.element.separator.label"/>
</properties>
</component>
<hspacer id="2356c">
<constraints>
<grid row="0" column="2" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
<component id="3083" class="com.intellij.ui.components.JBLabel">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="fddbf"/>
<text resource-bundle="messages/XmlBundle" key="emmet.bem.class.name.modifier.separator.label"/>
</properties>
</component>
<component id="9b3ce" class="com.intellij.ui.components.JBLabel">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<labelFor value="2659b"/>
<text resource-bundle="messages/XmlBundle" key="emmet.bem.short.element.prefix.label"/>
</properties>
</component>
<component id="525" class="com.intellij.ui.components.JBTextField" binding="myBemElementSeparatorTextField">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="50" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
<component id="fddbf" class="com.intellij.ui.components.JBTextField" binding="myBemModifierSeparatorTextField">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="50" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
<component id="2659b" class="com.intellij.ui.components.JBTextField" binding="myBemShortElementPrefixTextField">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="50" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
</children>
</grid>
<vspacer id="922eb">
<constraints>
<grid row="6" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
</children>
</grid>
</form>

View File

@@ -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<String, JBCheckBox>()
private Map<String, JBCheckBox> 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<ZenCodingFilter> 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<String> 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<String> enabledFilters() {
Set<String> result = new HashSet<>();
for (Map.Entry<String, JBCheckBox> 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<String> {
return filtersCheckBoxes.filterValues { it.isSelected }.keys
}
}

View File

@@ -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 <a> tag