blob: 3082aae25c7c9162e32269d482f2b77bc50ccd3f [file] [log] [blame]
/*
* Copyright 2010-2017 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.nodejs.protractor
import com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton
import com.intellij.javascript.nodejs.interpreter.NodeJsInterpreterField
import com.intellij.javascript.nodejs.util.NodePackageField
import com.intellij.javascript.protractor.ProtractorUtil
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.options.SettingsEditor
import com.intellij.openapi.options.ex.SingleConfigurableEditor
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.openapi.util.io.FileUtil
import com.intellij.ui.RawCommandLineEditor
import com.intellij.ui.TextFieldWithHistoryWithBrowseButton
import com.intellij.util.containers.ContainerUtil
import com.intellij.util.ui.FormBuilder
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.SwingHelper
import javax.swing.*
import java.util.Collections
// Based com.intellij.javascript.protractor.ProtractorRunConfigurationEditor
class KotlinProtractorRunConfigurationEditor(private val myProject: Project) : SettingsEditor<KotlinProtractorRunConfiguration>() {
private val testFilePathTextFieldWithBrowseButton: TextFieldWithHistoryWithBrowseButton
private val seleniumAddressTextField: JTextField
private val extraOptionsEditor: RawCommandLineEditor
private val configPathTextFieldWithBrowseButton: TextFieldWithHistoryWithBrowseButton
private val interpreterField: NodeJsInterpreterField
private val protractorPackageField: NodePackageField
private val envVarsComponent: EnvironmentVariablesTextFieldWithBrowseButton
private val panel: JPanel
init {
testFilePathTextFieldWithBrowseButton = createTestFileTextField(myProject)
seleniumAddressTextField = JTextField()
extraOptionsEditor = RawCommandLineEditor().apply { dialogCaption = "Extra Protractor Options" }
configPathTextFieldWithBrowseButton = createConfigurationFileTextField(myProject)
interpreterField = NodeJsInterpreterField(myProject, false)
protractorPackageField = NodePackageField(myProject, ProtractorUtil.PACKAGE_NAME) { interpreterField.interpreter }
envVarsComponent = EnvironmentVariablesTextFieldWithBrowseButton()
panel = FormBuilder()
.setAlignLabelOnRight(false)
.addLabeledComponent("&Test file:", testFilePathTextFieldWithBrowseButton)
.addLabeledComponent("&Selenium address:", seleniumAddressTextField)
.addLabeledComponent("E&xtra Protractor options:", extraOptionsEditor)
.addComponent(JSeparator(), JBUI.scale(8))
.addLabeledComponent("&Configuration file:", configPathTextFieldWithBrowseButton)
.addComponent(JSeparator(), JBUI.scale(8))
.addLabeledComponent("Node &interpreter:", interpreterField, JBUI.scale(8))
.addLabeledComponent("&Protractor package:", protractorPackageField)
.addLabeledComponent("&Environment variables:", envVarsComponent)
.panel
}
private fun createConfigurationFileTextField(project: Project) = TextFieldWithHistoryWithBrowseButton().apply {
val textFieldWithHistory = childComponent
textFieldWithHistory.setHistorySize(-1)
textFieldWithHistory.setMinimumAndPreferredWidth(0)
SwingHelper.addHistoryOnExpansion(textFieldWithHistory) {
val newFiles = ProtractorUtil.listPossibleConfigFilesInProject(project)
val newFilePaths = ContainerUtil.map(newFiles) { file -> FileUtil.toSystemDependentName(file.path) }
Collections.sort(newFilePaths)
newFilePaths
}
SwingHelper.installFileCompletionAndBrowseDialog(
project,
this,
"Select Protractor Configuration File",
FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()
)
}
private fun createTestFileTextField(project: Project) = TextFieldWithHistoryWithBrowseButton().apply {
val textFieldWithHistory = childComponent
textFieldWithHistory.setHistorySize(-1)
textFieldWithHistory.setMinimumAndPreferredWidth(0)
SwingHelper.installFileCompletionAndBrowseDialog(
project,
this,
"Select Protractor Configuration File",
FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()
)
}
override fun resetEditorFrom(runConfiguration: KotlinProtractorRunConfiguration) {
with(runConfiguration.runSettings) {
testFilePathTextFieldWithBrowseButton.setTextAndAddToHistory(testFileSystemDependentPath)
seleniumAddressTextField.text = seleniumAddress
extraOptionsEditor.text = extraOptions
configPathTextFieldWithBrowseButton.setTextAndAddToHistory(configFileSystemDependentPath)
interpreterField.interpreterRef = interpreterRef
protractorPackageField.selected = runConfiguration.protractorPackage
envVarsComponent.data = envData
}
updatePreferredWidth()
}
private fun updatePreferredWidth() {
val dialogWrapper = DialogWrapper.findInstance(panel)
if (dialogWrapper is SingleConfigurableEditor) {
// dialog for single run configuration
interpreterField.setPreferredWidthToFitText()
protractorPackageField.setPreferredWidthToFitText()
SwingHelper.setPreferredWidthToFitText(testFilePathTextFieldWithBrowseButton)
SwingHelper.setPreferredWidthToFitText(seleniumAddressTextField)
SwingHelper.setPreferredWidthToFitText(configPathTextFieldWithBrowseButton)
ApplicationManager.getApplication().invokeLater { SwingHelper.adjustDialogSizeToFitPreferredSize(dialogWrapper) }
}
}
override fun applyEditorTo(runConfiguration: KotlinProtractorRunConfiguration) {
ProtractorUtil.setProtractorPackage(myProject, protractorPackageField.selected)
runConfiguration.runSettings = runConfiguration.runSettings.copy(
interpreterRef = interpreterField.interpreterRef,
configFilePath = configPathTextFieldWithBrowseButton.text,
testFilePath = testFilePathTextFieldWithBrowseButton.text,
seleniumAddress = seleniumAddressTextField.text,
extraOptions = extraOptionsEditor.text,
envData = envVarsComponent.data
)
}
override fun createEditor() = panel
}