package org.jetbrains.plugins.cucumber.java.run; import com.intellij.application.options.ModulesComboBox; import com.intellij.execution.configurations.ConfigurationUtil; import com.intellij.execution.ui.ClassBrowser; import com.intellij.execution.ui.CommonJavaParametersPanel; import com.intellij.execution.ui.ConfigurationModuleSelector; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.JavaCodeFragment; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiMethodUtil; import com.intellij.ui.EditorTextFieldWithBrowseButton; import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.RawCommandLineEditor; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.cucumber.java.CucumberJavaBundle; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class CucumberJavaApplicationConfigurable extends SettingsEditor<CucumberJavaRunConfiguration> implements PanelWithAnchor { private final Project myProject; private JComponent myAnchor; private final ConfigurationModuleSelector myModuleSelector; private LabeledComponent<EditorTextFieldWithBrowseButton> myMainClass; private JPanel myWholePanel; private LabeledComponent<ModulesComboBox> myModule; private LabeledComponent<RawCommandLineEditor> myGlue; private LabeledComponent<TextFieldWithBrowseButton> myFeatureOrFolder; private CommonJavaParametersPanel myCommonProgramParameters; private Module myModuleContext; public CucumberJavaApplicationConfigurable(Project project) { myProject = project; myModuleSelector = new ConfigurationModuleSelector(project, myModule.getComponent()); ClassBrowser.createApplicationClassBrowser(project, myModuleSelector).setField(myMainClass.getComponent()); myModuleContext = myModuleSelector.getModule(); final ActionListener fileToRunActionListener = new ActionListener() { public void actionPerformed(ActionEvent e) { FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFileOrFolderDescriptor(); fileChooserDescriptor.setTitle(CucumberJavaBundle.message("run.configuration.form.choose.file.or.folder.title")); fileChooserDescriptor.putUserData(LangDataKeys.MODULE_CONTEXT, myModuleContext); Project project = myProject; VirtualFile file = FileChooser.chooseFile(fileChooserDescriptor, project, null); if (file != null) { setFeatureOrFolder(file.getPresentableUrl()); } } }; myFeatureOrFolder.getComponent().getButton().addActionListener(fileToRunActionListener); myAnchor = UIUtil.mergeComponentsWithAnchor(myMainClass, myGlue, myFeatureOrFolder, myModule, myCommonProgramParameters); myGlue.getComponent().setDialogCaption(CucumberJavaBundle.message("run.configuration.form.glue.title")); } public void setFeatureOrFolder(String path) { myFeatureOrFolder.getComponent().setText(path); } private void createUIComponents() { myMainClass = new LabeledComponent<>(); myMainClass.setComponent(new EditorTextFieldWithBrowseButton(myProject, true, new JavaCodeFragment.VisibilityChecker() { @Override public Visibility isDeclarationVisible(PsiElement declaration, PsiElement place) { if (declaration instanceof PsiClass) { final PsiClass aClass = (PsiClass)declaration; if (ConfigurationUtil.MAIN_CLASS.value(aClass) && PsiMethodUtil.findMainMethod(aClass) != null) { return Visibility.VISIBLE; } } return Visibility.NOT_VISIBLE; } })); } @Override public JComponent getAnchor() { return myAnchor; } @Override public void setAnchor(@Nullable JComponent anchor) { myAnchor = anchor; myMainClass.setAnchor(anchor); myGlue.setAnchor(anchor); myFeatureOrFolder.setAnchor(anchor); myModule.setAnchor(anchor); myCommonProgramParameters.setAnchor(anchor); } @Override protected void resetEditorFrom(@NotNull CucumberJavaRunConfiguration configuration) { myModuleSelector.reset(configuration); myCommonProgramParameters.reset(configuration); myMainClass.getComponent().setText(configuration.MAIN_CLASS_NAME); myGlue.getComponent().setText(configuration.getGlue()); myFeatureOrFolder.getComponent().setText(configuration.getFilePath()); } @Override protected void applyEditorTo(@NotNull CucumberJavaRunConfiguration configuration) throws ConfigurationException { myCommonProgramParameters.applyTo(configuration); myModuleSelector.applyTo(configuration); configuration.MAIN_CLASS_NAME = myMainClass.getComponent().getText(); configuration.setGlue(myGlue.getComponent().getText()); configuration.setFilePath(myFeatureOrFolder.getComponent().getText()); Module selectedModule = (Module)myModule.getComponent().getSelectedItem(); configuration.setModule(selectedModule); } @NotNull @Override protected JComponent createEditor() { return myWholePanel; } }