diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 72fca631b56..615d649fee4 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -447,6 +447,9 @@
displayName="Kotlin Compiler"
parentId="project.propCompiler"/>
+
+
diff --git a/idea/src/META-INF/plugin.xml.172 b/idea/src/META-INF/plugin.xml.172
index 723e8e3deac..52de155e6e3 100644
--- a/idea/src/META-INF/plugin.xml.172
+++ b/idea/src/META-INF/plugin.xml.172
@@ -447,6 +447,9 @@
displayName="Kotlin Compiler"
parentId="project.propCompiler"/>
+
+
diff --git a/idea/src/META-INF/plugin.xml.181 b/idea/src/META-INF/plugin.xml.181
index 7fb872bc835..b76c7b42b65 100644
--- a/idea/src/META-INF/plugin.xml.181
+++ b/idea/src/META-INF/plugin.xml.181
@@ -447,6 +447,9 @@
displayName="Kotlin Compiler"
parentId="project.propCompiler"/>
+
+
diff --git a/idea/src/META-INF/plugin.xml.182 b/idea/src/META-INF/plugin.xml.182
index ddad10d2f2e..2f4b30d5e1e 100644
--- a/idea/src/META-INF/plugin.xml.182
+++ b/idea/src/META-INF/plugin.xml.182
@@ -448,6 +448,9 @@
displayName="Kotlin Compiler"
parentId="project.propCompiler"/>
+
+
diff --git a/idea/src/META-INF/plugin.xml.as31 b/idea/src/META-INF/plugin.xml.as31
index f1240d2baea..ca1958bec0c 100644
--- a/idea/src/META-INF/plugin.xml.as31
+++ b/idea/src/META-INF/plugin.xml.as31
@@ -447,6 +447,9 @@
displayName="Kotlin Compiler"
parentId="project.propCompiler"/>
+
+
diff --git a/idea/src/META-INF/plugin.xml.as32 b/idea/src/META-INF/plugin.xml.as32
index acf73307133..3c7332c2128 100644
--- a/idea/src/META-INF/plugin.xml.as32
+++ b/idea/src/META-INF/plugin.xml.as32
@@ -447,6 +447,9 @@
displayName="Kotlin Compiler"
parentId="project.propCompiler"/>
+
+
diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesAction.kt
index 01f1169ef76..201497dea95 100644
--- a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesAction.kt
+++ b/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesAction.kt
@@ -16,115 +16,15 @@
package org.jetbrains.kotlin.idea.actions
+import com.intellij.ide.actions.ShowSettingsUtilImpl
import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.project.DumbAwareAction
-import com.intellij.openapi.project.Project
-import com.intellij.openapi.ui.DialogWrapper
-import com.intellij.openapi.updateSettings.impl.UpdateSettings
-import org.jetbrains.kotlin.idea.KotlinPluginUpdater
-import org.jetbrains.kotlin.idea.KotlinPluginUtil
-import org.jetbrains.kotlin.idea.PluginUpdateStatus
-import org.jetbrains.kotlin.idea.actions.ConfigurePluginUpdatesDialog.EAPChannels.EAP_1_2
-import org.jetbrains.kotlin.idea.actions.ConfigurePluginUpdatesDialog.EAPChannels.EAP_1_3
-import javax.swing.JComponent
+import org.jetbrains.kotlin.idea.configuration.KotlinUpdatesSettingsConfigurable
class ConfigurePluginUpdatesAction : DumbAwareAction() {
override fun actionPerformed(e: AnActionEvent) {
- ConfigurePluginUpdatesDialog(e.project).show()
- }
-}
-
-class ConfigurePluginUpdatesDialog(project: Project?) : DialogWrapper(project, false) {
- private val form = ConfigurePluginUpdatesForm()
- private val initialSelectedChannel: Int
- private var update: PluginUpdateStatus.Update? = null
-
- init {
- title = "Configure Kotlin Plugin Updates"
- form.updateCheckProgressIcon.suspend()
- form.updateCheckProgressIcon.setPaintPassiveIcon(false)
-
- form.checkForUpdatesNowButton.addActionListener {
- saveSettings()
- form.updateCheckProgressIcon.resume()
- resetUpdateStatus()
- KotlinPluginUpdater.getInstance().runUpdateCheck{ pluginUpdateStatus ->
- form.updateCheckProgressIcon.suspend()
- when (pluginUpdateStatus) {
- PluginUpdateStatus.LatestVersionInstalled ->
- form.updateStatusLabel.text = "You have the latest version of the plugin (${KotlinPluginUtil.getPluginVersion()}) installed."
-
- is PluginUpdateStatus.Update -> {
- update = pluginUpdateStatus
- form.installButton.isVisible = true
- form.updateStatusLabel.text = "A new version ${pluginUpdateStatus.pluginDescriptor.version} is available"
- }
-
- is PluginUpdateStatus.CheckFailed ->
- form.updateStatusLabel.text = "Update check failed: ${pluginUpdateStatus.message}"
- }
-
- false // do not auto-retry update check
- }
- }
-
- form.installButton.isVisible = false
- form.installButton.addActionListener {
- update?.let {
- close(OK_EXIT_CODE)
- KotlinPluginUpdater.getInstance().installPluginUpdate(it)
- }
- }
-
- form.channelCombo.addActionListener {
- resetUpdateStatus()
- }
-
- fun EAPChannels.indexIfAvailable() = if (hasChannel) uiIndex else null
- initialSelectedChannel = EAP_1_3.indexIfAvailable() ?:
- EAP_1_2.indexIfAvailable() ?: 0
-
- form.channelCombo.selectedIndex = initialSelectedChannel
- init()
- }
-
- private fun resetUpdateStatus() {
- form.updateStatusLabel.text = " "
- form.installButton.isVisible = false
- }
-
- override fun createCenterPanel(): JComponent = form.mainPanel
-
- private fun saveSettings() {
- saveSelectedChannel(form.channelCombo.selectedIndex)
- }
-
- private fun saveSelectedChannel(channel: Int) {
- val hosts = UpdateSettings.getInstance().storedPluginHosts
- hosts.removeIf {
- it.startsWith("https://plugins.jetbrains.com/plugins/") &&
- (it.endsWith("/6954") || it.endsWith(KotlinPluginUtil.KOTLIN_PLUGIN_ID.idString))
- }
- when (channel) {
- EAP_1_3.uiIndex -> hosts.add(EAP_1_3.url)
- EAP_1_2.uiIndex -> hosts.add(EAP_1_2.url)
- }
- }
-
- override fun doOKAction() {
- saveSettings()
- super.doOKAction()
- }
-
- override fun doCancelAction() {
- saveSelectedChannel(initialSelectedChannel)
- super.doCancelAction()
- }
-
- enum class EAPChannels(val url: String, val uiIndex: Int) {
- EAP_1_2("https://plugins.jetbrains.com/plugins/eap-1.2/${KotlinPluginUtil.KOTLIN_PLUGIN_ID.idString}", 1),
- EAP_1_3("https://plugins.jetbrains.com/plugins/eap-next/${KotlinPluginUtil.KOTLIN_PLUGIN_ID.idString}", 2);
-
- val hasChannel: Boolean get() = url in UpdateSettings.getInstance().pluginHosts
+ val project = e.getData(CommonDataKeys.PROJECT)
+ ShowSettingsUtilImpl.showSettingsDialog(project, KotlinUpdatesSettingsConfigurable.ID, "")
}
}
diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesForm.java b/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesForm.java
deleted file mode 100644
index 6c72a2143ac..00000000000
--- a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesForm.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2010-2015 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 org.jetbrains.kotlin.idea.actions;
-
-import com.intellij.util.ui.AsyncProcessIcon;
-
-import javax.swing.*;
-
-public class ConfigurePluginUpdatesForm {
- public JComboBox channelCombo;
- public JButton checkForUpdatesNowButton;
- public JPanel mainPanel;
- public AsyncProcessIcon updateCheckProgressIcon;
- public JLabel updateStatusLabel;
- public JButton installButton;
-
- private void createUIComponents() {
- updateCheckProgressIcon = new AsyncProcessIcon("Plugin update check progress");
- }
-}
diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinLanguageConfiguration.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinLanguageConfiguration.kt
new file mode 100644
index 00000000000..810c0302537
--- /dev/null
+++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinLanguageConfiguration.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
+ * that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.idea.configuration
+
+import com.intellij.openapi.options.Configurable
+import com.intellij.openapi.options.SearchableConfigurable
+import com.intellij.openapi.updateSettings.impl.UpdateSettings
+import org.jetbrains.kotlin.idea.KotlinPluginUpdater
+import org.jetbrains.kotlin.idea.KotlinPluginUtil
+import org.jetbrains.kotlin.idea.PluginUpdateStatus
+import org.jetbrains.kotlin.idea.configuration.ui.ConfigurePluginUpdatesForm
+import javax.swing.JComponent
+
+class KotlinUpdatesSettingsConfigurable() : SearchableConfigurable, Configurable.NoScroll {
+ companion object {
+ const val ID = "preferences.language.Kotlin"
+
+ private fun saveSelectedChannel(channel: Int) {
+ val hosts = UpdateSettings.getInstance().storedPluginHosts
+ hosts.removeIf {
+ it.startsWith("https://plugins.jetbrains.com/plugins/") &&
+ (it.endsWith("/6954") || it.endsWith(KotlinPluginUtil.KOTLIN_PLUGIN_ID.idString))
+ }
+ when (channel) {
+ EAPChannels.EAP_1_3.uiIndex -> hosts.add(EAPChannels.EAP_1_3.url)
+ EAPChannels.EAP_1_2.uiIndex -> hosts.add(EAPChannels.EAP_1_2.url)
+ }
+ }
+
+ enum class EAPChannels(val url: String, val uiIndex: Int) {
+ EAP_1_2("https://plugins.jetbrains.com/plugins/eap-1.2/${KotlinPluginUtil.KOTLIN_PLUGIN_ID.idString}", 1),
+ EAP_1_3("https://plugins.jetbrains.com/plugins/eap-next/${KotlinPluginUtil.KOTLIN_PLUGIN_ID.idString}", 2);
+
+ private val hasChannel: Boolean get() = url in UpdateSettings.getInstance().pluginHosts
+
+ fun indexIfAvailable() = if (hasChannel) uiIndex else null
+ }
+ }
+
+ private val form = ConfigurePluginUpdatesForm()
+ private var update: PluginUpdateStatus.Update? = null
+
+ private var savedChannel: Int = EAPChannels.EAP_1_3.indexIfAvailable() ?: EAPChannels.EAP_1_2.indexIfAvailable() ?: 0
+
+ override fun getId(): String = ID
+
+ override fun getDisplayName(): String = "Kotlin Updates"
+
+ override fun isModified(): Boolean {
+ return savedChannel != form.channelCombo.selectedIndex
+ }
+
+ override fun apply() {
+ saveSettings()
+ }
+
+ override fun createComponent(): JComponent? {
+ form.updateCheckProgressIcon.suspend()
+ form.updateCheckProgressIcon.setPaintPassiveIcon(false)
+
+ form.checkForUpdatesNowButton.addActionListener {
+ saveSettings()
+ form.updateCheckProgressIcon.resume()
+ form.resetUpdateStatus()
+ KotlinPluginUpdater.getInstance().runUpdateCheck{ pluginUpdateStatus ->
+ form.updateCheckProgressIcon.suspend()
+ when (pluginUpdateStatus) {
+ PluginUpdateStatus.LatestVersionInstalled ->
+ form.updateStatusLabel.text = "You have the latest version of the plugin (${KotlinPluginUtil.getPluginVersion()}) installed."
+
+ is PluginUpdateStatus.Update -> {
+ update = pluginUpdateStatus
+ form.installButton.isVisible = true
+ form.updateStatusLabel.text = "A new version ${pluginUpdateStatus.pluginDescriptor.version} is available"
+ }
+
+ is PluginUpdateStatus.CheckFailed ->
+ form.updateStatusLabel.text = "Update check failed: ${pluginUpdateStatus.message}"
+ }
+
+ false // do not auto-retry update check
+ }
+ }
+
+ form.installButton.isVisible = false
+ form.installButton.addActionListener {
+ update?.let {
+ KotlinPluginUpdater.getInstance().installPluginUpdate(it)
+ }
+ }
+
+ form.channelCombo.addActionListener {
+ form.resetUpdateStatus()
+ }
+
+ form.channelCombo.selectedIndex = savedChannel
+
+ return form.mainPanel
+ }
+
+ private fun saveSettings() {
+ savedChannel = form.channelCombo.selectedIndex
+ saveSelectedChannel(savedChannel)
+ }
+}
+
diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesForm.form b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.form
similarity index 97%
rename from idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesForm.form
rename to idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.form
index d0316e0783e..6b1a891c511 100644
--- a/idea/src/org/jetbrains/kotlin/idea/actions/ConfigurePluginUpdatesForm.form
+++ b/idea/src/org/jetbrains/kotlin/idea/configuration/ui/ConfigurePluginUpdatesForm.form
@@ -1,5 +1,5 @@
-