From 8554717972276730db2a121adc39fe6fdc58b6c4 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 3 Jul 2019 17:14:17 +0200 Subject: [PATCH] Convert system settings configurable to UI DSL GitOrigin-RevId: 7e6a5d3a14407ebbeaf9271795af4d6f24a3a1fb --- .../ide/GeneralSettingsConfigurable.java | 253 --------------- .../ide/GeneralSettingsConfigurable.kt | 152 +++++++++ .../intellij/ide/GeneralSettingsPanel.form | 294 ------------------ .../ide/ui/SystemOptionsTopHitProvider.java | 24 +- 4 files changed, 164 insertions(+), 559 deletions(-) delete mode 100644 platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.java create mode 100644 platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.kt delete mode 100644 platform/platform-impl/src/com/intellij/ide/GeneralSettingsPanel.form diff --git a/platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.java b/platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.java deleted file mode 100644 index d168904add8f..000000000000 --- a/platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.ide; - -import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; -import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; -import com.intellij.openapi.fileChooser.PathChooserDialog; -import com.intellij.openapi.options.CompositeConfigurable; -import com.intellij.openapi.options.Configurable; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.openapi.options.ex.ConfigurableWrapper; -import com.intellij.openapi.ui.TextFieldWithBrowseButton; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.IdeUICustomization; -import com.intellij.ui.components.JBLabel; -import com.intellij.ui.components.JBRadioButton; -import com.intellij.util.PlatformUtils; -import com.intellij.util.ui.UIUtil; -import org.jetbrains.annotations.NotNull; - -import javax.swing.*; -import javax.swing.border.TitledBorder; -import java.awt.*; -import java.util.List; - -/** - * To provide additional options in General section register implementation of {@link SearchableConfigurable} in the plugin.xml: - *

- * <extensions defaultExtensionNs="com.intellij">
- *   <generalOptionsProvider instance="class-name"/>
- * </extensions> - *

- * A new instance of the specified class will be created each time then the Settings dialog is opened - */ -public class GeneralSettingsConfigurable extends CompositeConfigurable implements SearchableConfigurable { - private static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.generalOptionsProvider"); - - private MyComponent myComponent; - - public GeneralSettingsConfigurable() { - myComponent = new MyComponent(); - } - - @Override - public void apply() throws ConfigurationException { - super.apply(); - GeneralSettings settings = GeneralSettings.getInstance(); - - settings.setReopenLastProject(myComponent.myChkReopenLastProject.isSelected()); - settings.setSyncOnFrameActivation(myComponent.myChkSyncOnFrameActivation.isSelected()); - settings.setSaveOnFrameDeactivation(myComponent.myChkSaveOnFrameDeactivation.isSelected()); - settings.setConfirmExit(myComponent.myConfirmExit.isSelected()); - settings.setShowWelcomeScreen(myComponent.myShowWelcomeScreen.isSelected()); - settings.setConfirmOpenNewProject(getConfirmOpenNewProject()); - settings.setProcessCloseConfirmation(getProcessCloseConfirmation()); - - settings.setAutoSaveIfInactive(myComponent.myChkAutoSaveIfInactive.isSelected()); - try { - settings.setInactiveTimeout(Integer.parseInt(myComponent.myTfInactiveTimeout.getText()));//See range validation inside settings - } - catch (NumberFormatException ignored) { } - settings.setUseSafeWrite(myComponent.myChkUseSafeWrite.isSelected()); - settings.setDefaultProjectDirectory(myComponent.myProjectDirectoryTextField.getText()); - } - - private GeneralSettings.ProcessCloseConfirmation getProcessCloseConfirmation() { - if (myComponent.myTerminateProcessJBRadioButton.isSelected()) { - return GeneralSettings.ProcessCloseConfirmation.TERMINATE; - } - else if (myComponent.myDisconnectJBRadioButton.isSelected()) { - return GeneralSettings.ProcessCloseConfirmation.DISCONNECT; - } - else { - return GeneralSettings.ProcessCloseConfirmation.ASK; - } - } - - @GeneralSettings.OpenNewProjectOption - private int getConfirmOpenNewProject() { - if (myComponent.myConfirmWindowToOpenProject.isSelected()) { - return GeneralSettings.OPEN_PROJECT_ASK; - } - else if (myComponent.myOpenProjectInNewWindow.isSelected()) { - return GeneralSettings.OPEN_PROJECT_NEW_WINDOW; - } - else { - return GeneralSettings.OPEN_PROJECT_SAME_WINDOW; - } - } - - @Override - public boolean isModified() { - if (super.isModified()) return true; - GeneralSettings settings = GeneralSettings.getInstance(); - boolean isModified = settings.isReopenLastProject() != myComponent.myChkReopenLastProject.isSelected(); - isModified |= settings.isSyncOnFrameActivation() != myComponent.myChkSyncOnFrameActivation.isSelected(); - isModified |= settings.isSaveOnFrameDeactivation() != myComponent.myChkSaveOnFrameDeactivation.isSelected(); - isModified |= settings.isAutoSaveIfInactive() != myComponent.myChkAutoSaveIfInactive.isSelected(); - isModified |= settings.isConfirmExit() != myComponent.myConfirmExit.isSelected(); - isModified |= settings.isShowWelcomeScreen() != myComponent.myShowWelcomeScreen.isSelected(); - isModified |= settings.getConfirmOpenNewProject() != getConfirmOpenNewProject(); - isModified |= settings.getProcessCloseConfirmation() != getProcessCloseConfirmation(); - isModified |= isModified(myComponent.myTfInactiveTimeout, settings.getInactiveTimeout(), GeneralSettings.SAVE_FILES_AFTER_IDLE_SEC); - - isModified |= settings.isUseSafeWrite() != myComponent.myChkUseSafeWrite.isSelected(); - isModified |= !settings.getDefaultProjectDirectory().equals(myComponent.myProjectDirectoryTextField.getText()); - - return isModified; - } - - @Override - public JComponent createComponent() { - if (myComponent == null) { - myComponent = new MyComponent(); - } - myComponent.myShowWelcomeScreen.setVisible(PlatformUtils.isDataGrip()); - - myComponent.myChkAutoSaveIfInactive.addChangeListener( - e -> myComponent.myTfInactiveTimeout.setEditable(myComponent.myChkAutoSaveIfInactive.isSelected())); - - List list = getConfigurables(); - if (!list.isEmpty()) { - myComponent.myPluginOptionsPanel.setLayout(new GridLayout(list.size(), 1)); - for (Configurable c : list) { - myComponent.myPluginOptionsPanel.add(c.createComponent()); - } - } - - return myComponent.myPanel; - } - - @Override - public String getDisplayName() { - return IdeBundle.message("title.general"); - } - - @Override - public void reset() { - super.reset(); - GeneralSettings settings = GeneralSettings.getInstance(); - myComponent.myChkReopenLastProject.setSelected(settings.isReopenLastProject()); - myComponent.myChkSyncOnFrameActivation.setSelected(settings.isSyncOnFrameActivation()); - myComponent.myChkSaveOnFrameDeactivation.setSelected(settings.isSaveOnFrameDeactivation()); - myComponent.myChkAutoSaveIfInactive.setSelected(settings.isAutoSaveIfInactive()); - myComponent.myTfInactiveTimeout.setText(Integer.toString(settings.getInactiveTimeout())); - myComponent.myTfInactiveTimeout.setEditable(settings.isAutoSaveIfInactive()); - myComponent.myChkUseSafeWrite.setSelected(settings.isUseSafeWrite()); - myComponent.myConfirmExit.setSelected(settings.isConfirmExit()); - myComponent.myShowWelcomeScreen.setSelected(settings.isShowWelcomeScreen()); - switch (settings.getConfirmOpenNewProject()) { - case GeneralSettings.OPEN_PROJECT_ASK: - myComponent.myConfirmWindowToOpenProject.setSelected(true); - break; - case GeneralSettings.OPEN_PROJECT_NEW_WINDOW: - myComponent.myOpenProjectInNewWindow.setSelected(true); - break; - case GeneralSettings.OPEN_PROJECT_SAME_WINDOW: - myComponent.myOpenProjectInSameWindow.setSelected(true); - break; - } - switch (settings.getProcessCloseConfirmation()) { - case TERMINATE: - myComponent.myTerminateProcessJBRadioButton.setSelected(true); - break; - case DISCONNECT: - myComponent.myDisconnectJBRadioButton.setSelected(true); - break; - case ASK: - myComponent.myAskJBRadioButton.setSelected(true); - break; - } - myComponent.myProjectDirectoryTextField.setText(settings.getDefaultProjectDirectory()); - } - - @Override - public void disposeUIResources() { - super.disposeUIResources(); - myComponent = null; - } - - @Override - @NotNull - public String getHelpTopic() { - return "preferences.general"; - } - - private static class MyComponent { - private JPanel myPanel; - private JCheckBox myChkReopenLastProject; - private JCheckBox myChkSyncOnFrameActivation; - private JCheckBox myChkSaveOnFrameDeactivation; - private JCheckBox myChkAutoSaveIfInactive; - private JTextField myTfInactiveTimeout; - private JCheckBox myChkUseSafeWrite; - private JCheckBox myConfirmExit; - private JCheckBox myShowWelcomeScreen; - private JPanel myPluginOptionsPanel; - private JBRadioButton myOpenProjectInNewWindow; - private JBRadioButton myOpenProjectInSameWindow; - private JBRadioButton myConfirmWindowToOpenProject; - private JBRadioButton myTerminateProcessJBRadioButton; - private JBRadioButton myDisconnectJBRadioButton; - private JBRadioButton myAskJBRadioButton; - private TextFieldWithBrowseButton myProjectDirectoryTextField; - private JPanel myProjectOpeningPanel; - private JBLabel myProjectDirComment; - - MyComponent() { - String conceptName = IdeUICustomization.getInstance().getProjectConceptName(); - myChkReopenLastProject.setText(IdeBundle.message("checkbox.reopen.last.project.on.startup", conceptName)); - ((TitledBorder) myProjectOpeningPanel.getBorder()).setTitle(IdeBundle.message("border.title.project.opening", - StringUtil.capitalize(conceptName))); - myOpenProjectInNewWindow.setText(IdeBundle.message("radio.button.open.project.in.the.new.window", conceptName)); - myOpenProjectInSameWindow.setText(IdeBundle.message("radio.button.open.project.in.the.same.window", conceptName)); - myConfirmWindowToOpenProject.setText(IdeBundle.message("radio.button.confirm.window.to.open.project.in", conceptName)); - myProjectDirComment.setComponentStyle(UIUtil.ComponentStyle.SMALL); - } - - private void createUIComponents() { - myProjectDirectoryTextField = new TextFieldWithBrowseButton(); - FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor(); - descriptor.putUserData(PathChooserDialog.PREFER_LAST_OVER_EXPLICIT, false); - myProjectDirectoryTextField.addBrowseFolderListener(null, null, null, descriptor); - } - } - - @Override - @NotNull - public String getId() { - return getHelpTopic(); - } - - @NotNull - @Override - protected List createConfigurables() { - return ConfigurableWrapper.createConfigurables(EP_NAME); - } -} diff --git a/platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.kt b/platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.kt new file mode 100644 index 000000000000..b10ea2157c3e --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ide/GeneralSettingsConfigurable.kt @@ -0,0 +1,152 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.ide + +import com.intellij.application.options.editor.CheckboxDescriptor +import com.intellij.application.options.editor.checkBox +import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory +import com.intellij.openapi.fileChooser.PathChooserDialog +import com.intellij.openapi.options.BoundCompositeConfigurable +import com.intellij.openapi.options.SearchableConfigurable +import com.intellij.openapi.options.ex.ConfigurableWrapper +import com.intellij.openapi.ui.DialogPanel +import com.intellij.ui.IdeUICustomization +import com.intellij.ui.layout.* +import com.intellij.util.PlatformUtils + +val model = GeneralSettings.getInstance() +val myChkReopenLastProject = CheckboxDescriptor(IdeBundle.message("checkbox.reopen.last.project.on.startup", IdeUICustomization.getInstance().projectConceptName), + PropertyBinding(model::isReopenLastProject, model::setReopenLastProject)) +val myConfirmExit = CheckboxDescriptor(IdeBundle.message("checkbox.confirm.application.exit"), + PropertyBinding(model::isConfirmExit, model::setConfirmExit)) +val myShowWelcomeScreen = CheckboxDescriptor(IdeBundle.message("checkbox.show.welcome.screen"), + PropertyBinding(model::isShowWelcomeScreen, model::setShowWelcomeScreen)) +val myChkSyncOnFrameActivation = CheckboxDescriptor(IdeBundle.message("checkbox.synchronize.files.on.frame.activation"), + PropertyBinding(model::isSyncOnFrameActivation, model::setSyncOnFrameActivation)) +val myChkSaveOnFrameDeactivation = CheckboxDescriptor(IdeBundle.message("checkbox.save.files.on.frame.deactivation"), + PropertyBinding(model::isSyncOnFrameActivation, model::setSyncOnFrameActivation)) +val myChkAutoSaveIfInactive = CheckboxDescriptor(IdeBundle.message("checkbox.save.files.automatically"), + PropertyBinding(model::isAutoSaveIfInactive, model::setAutoSaveIfInactive)) +val myChkUseSafeWrite = CheckboxDescriptor("Use \"safe write\" (save changes to a temporary file first)", + PropertyBinding(model::isUseSafeWrite, model::setUseSafeWrite)) + +val allOptionDescriptors = listOf( + myChkReopenLastProject, + myConfirmExit, + myChkSyncOnFrameActivation, + myChkSaveOnFrameDeactivation, + myChkAutoSaveIfInactive, + myChkUseSafeWrite +).map { it.asOptionDescriptor() } + +/** + * To provide additional options in General section register implementation of {@link SearchableConfigurable} in the plugin.xml: + *

+ * <extensions defaultExtensionNs="com.intellij">
+ *   <generalOptionsProvider instance="class-name"/>
+ * </extensions> + *

+ * A new instance of the specified class will be created each time then the Settings dialog is opened + */ +class GeneralSettingsConfigurable: BoundCompositeConfigurable( + IdeBundle.message("title.general"), + "preferences.general" +), SearchableConfigurable { + private val model = GeneralSettings.getInstance() + + override fun createPanel(): DialogPanel { + val projectConceptName = IdeUICustomization.getInstance().projectConceptName + + return panel { + row { + titledRow("Startup/Shutdown") { + row { + checkBox(myChkReopenLastProject) + } + row { + checkBox(myConfirmExit) + } + + if (PlatformUtils.isDataGrip()) { + row { + checkBox(myShowWelcomeScreen) + } + } + } + } + row { + titledRow(IdeBundle.message("border.title.project.opening", projectConceptName.capitalize())) { + row("Default directory:") { + textFieldWithBrowseButton(model::getDefaultProjectDirectory, model::setDefaultProjectDirectory, + fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor() + .also { it.putUserData(PathChooserDialog.PREFER_LAST_OVER_EXPLICIT, false) }, + growPolicy = GrowPolicy.MEDIUM_TEXT) + .comment("This directory is preselected in \"Open...\" and \"New | Project...\" dialogs.", 80) + } + buttonGroup(model::getConfirmOpenNewProject, model::setConfirmOpenNewProject) { + row { + radioButton(IdeBundle.message("radio.button.open.project.in.the.new.window", projectConceptName), GeneralSettings.OPEN_PROJECT_NEW_WINDOW) + } + row { + radioButton(IdeBundle.message("radio.button.open.project.in.the.same.window", projectConceptName), GeneralSettings.OPEN_PROJECT_SAME_WINDOW) + } + row { + radioButton(IdeBundle.message("radio.button.confirm.window.to.open.project.in", projectConceptName), GeneralSettings.OPEN_PROJECT_ASK) + } + } + } + } + row { + titledRow("Synchronization") { + row { + checkBox(myChkSyncOnFrameActivation) + } + row { + checkBox(myChkSaveOnFrameDeactivation) + } + row { + cell(isFullWidth = true) { + val autoSaveCheckbox = checkBox(myChkAutoSaveIfInactive) + intTextField(model::getInactiveTimeout, model::setInactiveTimeout, columns = 4).enableIf(autoSaveCheckbox.selected) + label(IdeBundle.message("label.inactive.timeout.sec")) + } + } + row { + checkBox(myChkUseSafeWrite) + } + } + } + row { + titledRow(IdeBundle.message("group.settings.process.tab.close")) { + buttonGroup(model::getProcessCloseConfirmation, model::setProcessCloseConfirmation) { + row { + radioButton(IdeBundle.message("radio.process.close.terminate"), GeneralSettings.ProcessCloseConfirmation.TERMINATE) + } + row { + radioButton(IdeBundle.message("radio.process.close.disaconnect"), GeneralSettings.ProcessCloseConfirmation.DISCONNECT) + } + row { + radioButton(IdeBundle.message("radio.process.close.ask"), GeneralSettings.ProcessCloseConfirmation.ASK) + } + } + } + } + + for (configurable in createConfigurables()) { + row { + configurable.createComponent()?.invoke() + } + } + } + } + + override fun getId(): String = helpTopic!! + + override fun createConfigurables(): List { + return ConfigurableWrapper.createConfigurables(EP_NAME) + } + + companion object { + private val EP_NAME = ExtensionPointName.create("com.intellij.generalOptionsProvider") + } +} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/GeneralSettingsPanel.form b/platform/platform-impl/src/com/intellij/ide/GeneralSettingsPanel.form deleted file mode 100644 index 8dd609a48f32..000000000000 --- a/platform/platform-impl/src/com/intellij/ide/GeneralSettingsPanel.form +++ /dev/null @@ -1,294 +0,0 @@ - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/platform/platform-impl/src/com/intellij/ide/ui/SystemOptionsTopHitProvider.java b/platform/platform-impl/src/com/intellij/ide/ui/SystemOptionsTopHitProvider.java index 1bf0f5b40315..1e1856bcb29c 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/SystemOptionsTopHitProvider.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/SystemOptionsTopHitProvider.java @@ -2,10 +2,10 @@ package com.intellij.ide.ui; import com.intellij.ide.GeneralSettings; -import com.intellij.ide.IdeBundle; +import com.intellij.ide.GeneralSettingsConfigurableKt; import com.intellij.ide.ui.search.BooleanOptionDescription; import com.intellij.ide.ui.search.OptionDescription; -import com.intellij.ui.IdeUICustomization; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -18,18 +18,18 @@ import static com.intellij.ide.ui.OptionsTopHitProvider.messageIde; * @author Sergey.Malenkov */ final class SystemOptionsTopHitProvider implements OptionsTopHitProvider.ApplicationLevelProvider { - private static final Collection ourOptions = Collections.unmodifiableCollection(Arrays.asList( - option(messageIde("checkbox.show.tips.on.startup"), "showTipsOnStartup", "setShowTipsOnStartup"), - option(IdeBundle.message("checkbox.reopen.last.project.on.startup", IdeUICustomization.getInstance().getProjectConceptName()), "isReopenLastProject", "setReopenLastProject"), - option(messageIde("checkbox.support.screen.readers"), "isSupportScreenReaders", "setSupportScreenReaders"), - option(messageIde("checkbox.confirm.application.exit"), "isConfirmExit", "setConfirmExit"), - option(messageIde("checkbox.synchronize.files.on.frame.activation"), "isSyncOnFrameActivation", "setSyncOnFrameActivation"), - option(messageIde("checkbox.save.files.on.frame.deactivation"), "isSaveOnFrameDeactivation", "setSaveOnFrameDeactivation"), - option(messageIde("checkbox.save.files.automatically"), "isAutoSaveIfInactive", "setAutoSaveIfInactive"), - option("Use \"safe write\" (save changes to a temporary file first)", "isUseSafeWrite", "setUseSafeWrite"), + private static final Collection ourOptions = Collections.unmodifiableCollection( + ContainerUtil.concat( + GeneralSettingsConfigurableKt.getAllOptionDescriptors(), + Arrays.asList( + option(messageIde("checkbox.show.tips.on.startup"), "showTipsOnStartup", "setShowTipsOnStartup"), + option(messageIde("checkbox.support.screen.readers"), "isSupportScreenReaders", "setSupportScreenReaders"), + option("Start search in background", "isSearchInBackground", "setSearchInBackground") + ) + )); + //option("Use default browser", "isUseDefaultBrowser", "setUseDefaultBrowser"), //option("Show confirmation before extracting files", "isConfirmExtractFiles", "setConfirmExtractFiles"), - option("Start search in background", "isSearchInBackground", "setSearchInBackground"))); @NotNull @Override