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