| /* |
| * Copyright 2000-2013 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.openapi.externalSystem.service.execution; |
| |
| import com.intellij.openapi.externalSystem.ExternalSystemManager; |
| import com.intellij.openapi.externalSystem.ExternalSystemUiAware; |
| import com.intellij.openapi.externalSystem.model.ProjectSystemId; |
| import com.intellij.openapi.externalSystem.model.execution.ExternalSystemTaskExecutionSettings; |
| import com.intellij.openapi.externalSystem.service.ui.ExternalProjectPathField; |
| import com.intellij.openapi.externalSystem.util.*; |
| import com.intellij.openapi.fileChooser.FileChooserDescriptor; |
| import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.Comparing; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.ui.RawCommandLineEditor; |
| import com.intellij.ui.components.JBLabel; |
| import com.intellij.ui.components.JBTextField; |
| import com.intellij.util.ui.GridBag; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.awt.*; |
| |
| import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.normalizePath; |
| |
| /** |
| * @author Denis Zhdanov |
| * @since 23.05.13 18:46 |
| */ |
| public class ExternalSystemTaskSettingsControl implements ExternalSystemSettingsControl<ExternalSystemTaskExecutionSettings> { |
| |
| @NotNull private final ProjectSystemId myExternalSystemId; |
| @NotNull private final Project myProject; |
| |
| @SuppressWarnings("FieldCanBeLocal") // Used via reflection at showUi() and disposeResources() |
| private JBLabel myProjectPathLabel; |
| private ExternalProjectPathField myProjectPathField; |
| @SuppressWarnings("FieldCanBeLocal") // Used via reflection at showUi() and disposeResources() |
| private JBLabel myTasksLabel; |
| private JBTextField myTasksTextField; |
| @SuppressWarnings("FieldCanBeLocal") // Used via reflection at showUi() and disposeResources() |
| private JBLabel myVmOptionsLabel; |
| private RawCommandLineEditor myVmOptionsEditor; |
| |
| @Nullable private ExternalSystemTaskExecutionSettings myOriginalSettings; |
| |
| public ExternalSystemTaskSettingsControl(@NotNull Project project, @NotNull ProjectSystemId externalSystemId) { |
| myProject = project; |
| myExternalSystemId = externalSystemId; |
| } |
| |
| public void setOriginalSettings(@Nullable ExternalSystemTaskExecutionSettings originalSettings) { |
| myOriginalSettings = originalSettings; |
| } |
| |
| @Override |
| public void fillUi(@NotNull final PaintAwarePanel canvas, int indentLevel) { |
| myProjectPathLabel = new JBLabel(ExternalSystemBundle.message( |
| "run.configuration.settings.label.project", myExternalSystemId.getReadableName() |
| )); |
| ExternalSystemManager<?, ?, ?, ?, ?> manager = ExternalSystemApiUtil.getManager(myExternalSystemId); |
| FileChooserDescriptor projectPathChooserDescriptor = null; |
| if (manager instanceof ExternalSystemUiAware) { |
| projectPathChooserDescriptor = ((ExternalSystemUiAware)manager).getExternalProjectConfigDescriptor(); |
| } |
| if (projectPathChooserDescriptor == null) { |
| projectPathChooserDescriptor = FileChooserDescriptorFactory.createSingleLocalFileDescriptor(); |
| } |
| String title = ExternalSystemBundle.message("settings.label.select.project", myExternalSystemId.getReadableName()); |
| myProjectPathField = new ExternalProjectPathField(myProject, myExternalSystemId, projectPathChooserDescriptor, title) { |
| @Override |
| public Dimension getPreferredSize() { |
| return myVmOptionsEditor == null ? super.getPreferredSize() : myVmOptionsEditor.getTextField().getPreferredSize(); |
| } |
| }; |
| canvas.add(myProjectPathLabel, ExternalSystemUiUtil.getLabelConstraints(0)); |
| canvas.add(myProjectPathField, ExternalSystemUiUtil.getFillLineConstraints(0)); |
| |
| myTasksLabel = new JBLabel(ExternalSystemBundle.message("run.configuration.settings.label.tasks")); |
| myTasksTextField = new JBTextField(ExternalSystemConstants.TEXT_FIELD_WIDTH_IN_COLUMNS); |
| canvas.add(myTasksLabel, ExternalSystemUiUtil.getLabelConstraints(0)); |
| GridBag c = ExternalSystemUiUtil.getFillLineConstraints(0); |
| c.insets.right = myProjectPathField.getButton().getPreferredSize().width + 8 /* street magic, sorry */; |
| canvas.add(myTasksTextField, c); |
| |
| myVmOptionsLabel = new JBLabel(ExternalSystemBundle.message("run.configuration.settings.label.vmoptions")); |
| myVmOptionsEditor = new RawCommandLineEditor(); |
| myVmOptionsEditor.setDialogCaption(ExternalSystemBundle.message("run.configuration.settings.caption.vmoptions")); |
| canvas.add(myVmOptionsLabel, ExternalSystemUiUtil.getLabelConstraints(0)); |
| canvas.add(myVmOptionsEditor, ExternalSystemUiUtil.getFillLineConstraints(0)); |
| } |
| |
| @Override |
| public void reset() { |
| myProjectPathField.setText(""); |
| myTasksTextField.setText(""); |
| myVmOptionsEditor.setText(""); |
| showUi(true); |
| |
| if (myOriginalSettings == null) { |
| return; |
| } |
| |
| String path = myOriginalSettings.getExternalProjectPath(); |
| if (StringUtil.isEmpty(path)) { |
| path = ""; |
| } |
| myProjectPathField.setText(path); |
| myTasksTextField.setText(StringUtil.join(myOriginalSettings.getTaskNames(), " ")); |
| myVmOptionsEditor.setText(myOriginalSettings.getVmOptions()); |
| } |
| |
| @Override |
| public boolean isModified() { |
| if (myOriginalSettings == null) { |
| return false; |
| } |
| |
| return !Comparing.equal(normalizePath(myProjectPathField.getText()), |
| normalizePath(myOriginalSettings.getExternalProjectPath())) |
| || !Comparing.equal(normalizePath(myTasksTextField.getText()), |
| normalizePath(StringUtil.join(myOriginalSettings.getTaskNames(), " "))) |
| || !Comparing.equal(normalizePath(myVmOptionsEditor.getText()), |
| normalizePath(myOriginalSettings.getVmOptions())); |
| } |
| |
| @Nullable |
| @Override |
| public String apply(@NotNull ExternalSystemTaskExecutionSettings settings) { |
| String projectPath = myProjectPathField.getText(); |
| if (myOriginalSettings == null) { |
| return String.format( |
| "Can't store external task settings into run configuration. Reason: target run configuration is undefined. Tasks: '%s', " + |
| "external project: '%s', vm options: '%s'", myTasksTextField.getText(), projectPath, myVmOptionsEditor.getText() |
| ); |
| } |
| settings.setExternalProjectPath(projectPath); |
| settings.setTaskNames(StringUtil.split(myTasksTextField.getText(), " ")); |
| settings.setVmOptions(myVmOptionsEditor.getText()); |
| return null; |
| } |
| |
| @Override |
| public void disposeUIResources() { |
| ExternalSystemUiUtil.disposeUi(this); |
| } |
| |
| @Override |
| public void showUi(boolean show) { |
| ExternalSystemUiUtil.showUi(this, show); |
| } |
| } |