package com.jetbrains.lang.dart.ide.runner.server.ui;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.configuration.EnvironmentVariablesComponent;
import com.intellij.ide.util.TreeFileChooser;
import com.intellij.ide.util.TreeFileChooserFactory;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.ui.RawCommandLineEditor;
import com.intellij.ui.components.JBCheckBox;
import com.jetbrains.lang.dart.DartBundle;
import com.jetbrains.lang.dart.DartFileType;
import com.jetbrains.lang.dart.ide.DartWritingAccessProvider;
import com.jetbrains.lang.dart.ide.runner.server.DartCommandLineRunConfiguration;
import com.jetbrains.lang.dart.ide.runner.server.DartCommandLineRunnerParameters;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
public class DartCommandLineConfigurationEditorForm extends SettingsEditor<DartCommandLineRunConfiguration> {
private JPanel myMainPanel;
private JLabel myDartFileLabel;
private TextFieldWithBrowseButton myFileField;
private RawCommandLineEditor myVMOptions;
private JBCheckBox myCheckedModeCheckBox;
private RawCommandLineEditor myArguments;
private TextFieldWithBrowseButton myWorkingDirectory;
private EnvironmentVariablesComponent myEnvironmentVariables;
public DartCommandLineConfigurationEditorForm(final Project project) {
initDartFileTextWithBrowse(project, myFileField);
myWorkingDirectory.addBrowseFolderListener(ExecutionBundle.message("select.working.directory.message"), null, project,
FileChooserDescriptorFactory.createSingleFolderDescriptor());
myVMOptions.setDialogCaption(DartBundle.message("config.vmoptions.caption"));
myArguments.setDialogCaption(DartBundle.message("config.progargs.caption"));
// 'Environment variables' is the widest label, anchored by myDartFileLabel
myDartFileLabel.setPreferredSize(myEnvironmentVariables.getLabel().getPreferredSize());
myEnvironmentVariables.setAnchor(myDartFileLabel);
}
public static void initDartFileTextWithBrowse(final @NotNull Project project,
final @NotNull TextFieldWithBrowseButton textWithBrowse) {
textWithBrowse.getButton().addActionListener(e -> {
final String initialPath = FileUtil.toSystemIndependentName(textWithBrowse.getText().trim());
final VirtualFile initialFile = initialPath.isEmpty() ? null : LocalFileSystem.getInstance().findFileByPath(initialPath);
final PsiFile initialPsiFile = initialFile == null ? null : PsiManager.getInstance(project).findFile(initialFile);
TreeFileChooser fileChooser = TreeFileChooserFactory.getInstance(project).createFileChooser(
DartBundle.message("choose.dart.main.file"),
initialPsiFile,
DartFileType.INSTANCE,
file -> !DartWritingAccessProvider.isInDartSdkOrDartPackagesFolder(file)
);
fileChooser.showDialog();
final PsiFile selectedFile = fileChooser.getSelectedFile();
final VirtualFile virtualFile = selectedFile == null ? null : selectedFile.getVirtualFile();
if (virtualFile != null) {
final String path = FileUtil.toSystemDependentName(virtualFile.getPath());
textWithBrowse.setText(path);
}
});
}
@Override
protected void resetEditorFrom(@NotNull final DartCommandLineRunConfiguration configuration) {
final DartCommandLineRunnerParameters parameters = configuration.getRunnerParameters();
myFileField.setText(FileUtil.toSystemDependentName(StringUtil.notNullize(parameters.getFilePath())));
myArguments.setText(StringUtil.notNullize(parameters.getArguments()));
myVMOptions.setText(StringUtil.notNullize(parameters.getVMOptions()));
myCheckedModeCheckBox.setSelected(parameters.isCheckedMode());
myWorkingDirectory.setText(FileUtil.toSystemDependentName(StringUtil.notNullize(parameters.getWorkingDirectory())));
myEnvironmentVariables.setEnvs(parameters.getEnvs());
myEnvironmentVariables.setPassParentEnvs(parameters.isIncludeParentEnvs());
}
@Override
protected void applyEditorTo(@NotNull final DartCommandLineRunConfiguration configuration) throws ConfigurationException {
final DartCommandLineRunnerParameters parameters = configuration.getRunnerParameters();
parameters.setFilePath(StringUtil.nullize(FileUtil.toSystemIndependentName(myFileField.getText().trim()), true));
parameters.setArguments(StringUtil.nullize(myArguments.getText(), true));
parameters.setVMOptions(StringUtil.nullize(myVMOptions.getText(), true));
parameters.setCheckedMode(myCheckedModeCheckBox.isSelected());
parameters.setWorkingDirectory(StringUtil.nullize(FileUtil.toSystemIndependentName(myWorkingDirectory.getText().trim()), true));
parameters.setEnvs(myEnvironmentVariables.getEnvs());
parameters.setIncludeParentEnvs(myEnvironmentVariables.isPassParentEnvs());
}
@NotNull
@Override
protected JComponent createEditor() {
return myMainPanel;
}
}