diff --git a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.form b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.form index dbba60dfb506..f9b21bfc6251 100644 --- a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.form +++ b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.form @@ -1,27 +1,24 @@
- + - - + - - + - - + @@ -30,8 +27,7 @@ - - + @@ -41,8 +37,7 @@ - - + @@ -52,8 +47,7 @@ - - + @@ -65,8 +59,7 @@ - - + @@ -74,31 +67,25 @@ - + - - + - + - - + - - - - - + @@ -106,8 +93,7 @@ - - + @@ -115,33 +101,27 @@ - + - - + - - - - + - - + - - + @@ -151,8 +131,7 @@ - - + @@ -162,8 +141,7 @@ - - + @@ -171,8 +149,7 @@ - - + @@ -182,28 +159,25 @@ - + - - + - + - - + - - + @@ -211,8 +185,7 @@ - - + @@ -220,17 +193,15 @@ - - + - + - - + @@ -240,28 +211,25 @@ - + - - + - - + - + - - + @@ -269,29 +237,26 @@ - + - - + - - + - + - - + @@ -307,15 +272,14 @@ - - + - - + + diff --git a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java index 1e18431d0d03..f115ee03a3d0 100644 --- a/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java +++ b/java/execution/impl/src/com/intellij/execution/applet/AppletConfigurable.java @@ -26,6 +26,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.ui.EditorTextFieldWithBrowseButton; import com.intellij.ui.RawCommandLineEditor; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.table.TableView; @@ -50,7 +51,7 @@ public class AppletConfigurable extends SettingsEditor impl private JPanel myHTMLOptions; private LabeledComponent myPolicyFile; private LabeledComponent myVMParameters; - private TextFieldWithBrowseButton myClassName; + private EditorTextFieldWithBrowseButton myClassName; private TextFieldWithBrowseButton myHtmlFile; private JTextField myWidth; private JTextField myHeight; @@ -63,7 +64,7 @@ public class AppletConfigurable extends SettingsEditor impl private JLabel myWidthLabel; private JLabel myHeightLabel; private AlternativeJREPanel myAlternativeJREPanel; - private final ButtonGroup myAppletRadioButtonGroup = new ButtonGroup(); + private final ButtonGroup myAppletRadioButtonGroup; private final Project myProject; private final ConfigurationModuleSelector myModuleSelector; @@ -88,7 +89,7 @@ public class AppletConfigurable extends SettingsEditor impl } } }; - private final ListTableModel myParameters = new ListTableModel(PARAMETER_COLUMNS); + private final ListTableModel myParameters; private final TableView myTable; @NonNls protected static final String HTTP_PREFIX = "http:/"; @@ -105,17 +106,20 @@ public class AppletConfigurable extends SettingsEditor impl } public AppletConfigurable(final Project project) { - myClassNameLabel.setLabelFor(myClassName.getTextField()); + myProject = project; + myClassNameLabel.setLabelFor(myClassName.getChildComponent()); myHtmlFileLabel.setLabelFor(myHtmlFile.getTextField()); myWidthLabel.setLabelFor(myWidth); myHeightLabel.setLabelFor(myHeight); - myProject = project; + myModuleSelector = new ConfigurationModuleSelector(project, getModuleComponent()); myTablePlace.setLayout(new BorderLayout()); + myParameters = new ListTableModel(PARAMETER_COLUMNS); myTable = new TableView(myParameters); myTable.getEmptyText().setText(ExecutionBundle.message("no.parameters")); myTablePlace.add(ScrollPaneFactory.createScrollPane(myTable), BorderLayout.CENTER); + myAppletRadioButtonGroup = new ButtonGroup(); myAppletRadioButtonGroup.add(myMainClass); myAppletRadioButtonGroup.add(myURL); getVMParametersComponent().setDialogCaption(myVMParameters.getRawText()); @@ -192,7 +196,7 @@ public class AppletConfigurable extends SettingsEditor impl return myWidth; } - private TextFieldWithBrowseButton getClassNameComponent() { + private EditorTextFieldWithBrowseButton getClassNameComponent() { return myClassName; } @@ -277,6 +281,10 @@ public class AppletConfigurable extends SettingsEditor impl configuration.ALTERNATIVE_JRE_PATH_ENABLED = myAlternativeJREPanel.isPathEnabled(); } + private void createUIComponents() { + myClassName = new EditorTextFieldWithBrowseButton(myProject, true); + } + private static abstract class MyColumnInfo extends ColumnInfo { public MyColumnInfo(final String name) { super(name); diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.form b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.form index 4b5d8c2fcbbe..a70c36b0911a 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.form +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.form @@ -19,12 +19,11 @@ - + - diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java index 16a435893cf8..02e61e4c6572 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java @@ -26,6 +26,7 @@ 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.ui.EditorTextFieldWithBrowseButton; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -34,16 +35,18 @@ import java.awt.event.ActionListener; public class ApplicationConfigurable extends SettingsEditor { private CommonJavaParametersPanel myCommonProgramParameters; - private LabeledComponent myMainClass; + private LabeledComponent myMainClass; private LabeledComponent myModule; private JPanel myWholePanel; private final ConfigurationModuleSelector myModuleSelector; private AlternativeJREPanel myAlternativeJREPanel; private JCheckBox myShowSwingInspectorCheckbox; - private final JreVersionDetector myVersionDetector = new JreVersionDetector(); + private final JreVersionDetector myVersionDetector; + private final Project myProject; public ApplicationConfigurable(final Project project) { + myProject = project; myModuleSelector = new ConfigurationModuleSelector(project, myModule.getComponent()); myCommonProgramParameters.setModuleContext(myModuleSelector.getModule()); myModule.getComponent().addActionListener(new ActionListener() { @@ -52,6 +55,7 @@ public class ApplicationConfigurable extends SettingsEditor(); + myMainClass.setComponent(new EditorTextFieldWithBrowseButton(myProject, true)); + } } diff --git a/java/java-impl/src/com/intellij/ui/EditorTextFieldWithBrowseButton.java b/java/java-impl/src/com/intellij/ui/EditorTextFieldWithBrowseButton.java new file mode 100644 index 000000000000..541b7d7fc8e9 --- /dev/null +++ b/java/java-impl/src/com/intellij/ui/EditorTextFieldWithBrowseButton.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2011 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.ui; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ComponentWithBrowseButton; +import com.intellij.psi.*; + +/** + * User: anna + */ +public class EditorTextFieldWithBrowseButton extends ComponentWithBrowseButton implements TextAccessor { + public EditorTextFieldWithBrowseButton(Project project, boolean isClassAccepted) { + super(new EditorTextField(createDocument("", PsiManager.getInstance(project), isClassAccepted), project, StdFileTypes.JAVA), null); + } + + private static Document createDocument(final String text, PsiManager manager, boolean isClassesAccepted) { + PsiElement defaultPackage = JavaPsiFacade.getInstance(manager.getProject()).findPackage(""); + final JavaCodeFragment fragment = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory() + .createReferenceCodeFragment(text, defaultPackage, true, isClassesAccepted); + fragment.setVisibilityChecker(JavaCodeFragment.VisibilityChecker.EVERYTHING_VISIBLE); + return PsiDocumentManager.getInstance(manager.getProject()).getDocument(fragment); + } + + @Override + public void setText(String text) { + if (text == null) text = ""; + getChildComponent().setText(text); + } + + @Override + public String getText() { + return getChildComponent().getText(); + } +} diff --git a/platform/lang-impl/src/com/intellij/execution/configuration/BrowseModuleValueActionListener.java b/platform/lang-impl/src/com/intellij/execution/configuration/BrowseModuleValueActionListener.java index e5baa9ae9ace..efbf472aa631 100644 --- a/platform/lang-impl/src/com/intellij/execution/configuration/BrowseModuleValueActionListener.java +++ b/platform/lang-impl/src/com/intellij/execution/configuration/BrowseModuleValueActionListener.java @@ -17,21 +17,24 @@ package com.intellij.execution.configuration; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.ui.TextAccessor; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -public abstract class BrowseModuleValueActionListener implements ActionListener { - private TextFieldWithBrowseButton myField; +public abstract class BrowseModuleValueActionListener implements ActionListener { + private ComponentWithBrowseButton myField; private final Project myProject; protected BrowseModuleValueActionListener(final Project project) { myProject = project; } - public void setField(final TextFieldWithBrowseButton field) { + public void setField(final ComponentWithBrowseButton field) { myField = field; myField.addActionListener(this); myField.setButtonEnabled(!myProject.isDefault()); @@ -39,14 +42,14 @@ public abstract class BrowseModuleValueActionListener implements ActionListener public void actionPerformed(final ActionEvent e) { final String text = showDialog(); - if (text != null) myField.getTextField().setText(text); + if (text != null) ((TextAccessor)myField).setText(text); } public String getText() { - return myField.getText(); + return ((TextAccessor)myField).getText(); } - public TextFieldWithBrowseButton getField() { return myField; } + public JComponent getField() { return myField; } @Nullable protected abstract String showDialog(); diff --git a/platform/platform-api/src/com/intellij/openapi/ui/TextFieldWithBrowseButton.java b/platform/platform-api/src/com/intellij/openapi/ui/TextFieldWithBrowseButton.java index eac4406aea03..1b2eb71e9af4 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/TextFieldWithBrowseButton.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/TextFieldWithBrowseButton.java @@ -24,12 +24,13 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.project.Project; +import com.intellij.ui.TextAccessor; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.ActionListener; -public class TextFieldWithBrowseButton extends ComponentWithBrowseButton { +public class TextFieldWithBrowseButton extends ComponentWithBrowseButton implements TextAccessor { public TextFieldWithBrowseButton(){ this((ActionListener)null); } diff --git a/platform/platform-impl/src/com/intellij/ui/TextAccessor.java b/platform/platform-api/src/com/intellij/ui/TextAccessor.java similarity index 99% rename from platform/platform-impl/src/com/intellij/ui/TextAccessor.java rename to platform/platform-api/src/com/intellij/ui/TextAccessor.java index 1ad45870aecc..954e5310cf26 100644 --- a/platform/platform-impl/src/com/intellij/ui/TextAccessor.java +++ b/platform/platform-api/src/com/intellij/ui/TextAccessor.java @@ -25,4 +25,4 @@ package com.intellij.ui; public interface TextAccessor { void setText(String text); String getText(); -} \ No newline at end of file +} diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form index b56735197988..f081e0dc1669 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form @@ -91,16 +91,13 @@ - - - - + - + @@ -117,12 +114,11 @@ - + - @@ -192,12 +188,11 @@ - + - diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java index c192bdd3bc2f..1b14eb34f816 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java @@ -16,7 +16,10 @@ package com.intellij.execution.junit2.configuration; +import com.intellij.codeInsight.completion.CompletionResultSet; +import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.execution.ExecutionBundle; +import com.intellij.execution.JavaExecutionUtil; import com.intellij.execution.configuration.BrowseModuleValueActionListener; import com.intellij.execution.junit.JUnitConfiguration; import com.intellij.execution.junit.JUnitConfigurationType; @@ -35,11 +38,10 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.FixedSizeButton; -import com.intellij.openapi.ui.LabeledComponent; -import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.ui.*; import com.intellij.openapi.ui.ex.MessagesEx; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.io.FileUtil; @@ -47,8 +49,9 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiPackage; -import com.intellij.ui.InsertPathAction; +import com.intellij.ui.*; import com.intellij.util.PlatformIcons; +import com.intellij.util.TextFieldCompletionProvider; import gnu.trove.TIntArrayList; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -57,10 +60,12 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.Document; +import javax.swing.text.PlainDocument; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; +import java.util.LinkedHashSet; import java.util.List; public class JUnitConfigurable extends SettingsEditor { @@ -79,11 +84,11 @@ public class JUnitConfigurable extends SettingsEditor { private JRadioButton myTestPatternButton; private JRadioButton myTestDirButton; private JComponent myPackagePanel; - private LabeledComponent myPackage; + private LabeledComponent myPackage; private LabeledComponent myDir; private LabeledComponent myPattern; - private LabeledComponent myClass; - private LabeledComponent myMethod; + private LabeledComponent myClass; + private LabeledComponent myMethod; // Fields private JPanel myWholePanel; @@ -107,8 +112,10 @@ public class JUnitConfigurable extends SettingsEditor { @NonNls private static final String KLASS = "class"; private static final String[] FORK_MODE_ALL = {NONE, METHOD, KLASS}; private static final String[] FORK_MODE = {NONE, METHOD}; + private Project myProject; public JUnitConfigurable(final Project project) { + myProject = project; myModel = new JUnitConfigurationModel(project); myModuleSelector = new ConfigurationModuleSelector(project, getModulesComponent()); myCommonJavaParameters.setModuleContext(myModuleSelector.getModule()); @@ -257,7 +264,7 @@ public class JUnitConfigurable extends SettingsEditor { myForkCb.setModel(new DefaultComboBoxModel(FORK_MODE_ALL)); myForkCb.setSelectedItem(selectedItem); } - else if (myClassButton.isSelected()){ + else if (myClassButton.isSelected()) { myPackagePanel.setVisible(false); myPattern.setVisible(false); myDir.setVisible(false); @@ -299,14 +306,24 @@ public class JUnitConfigurable extends SettingsEditor { for (int i = 0; i < myTestLocations.length; i++) { final LabeledComponent testLocation = getTestLocation(i); final JComponent component = testLocation.getComponent(); - final TextFieldWithBrowseButton field; + final ComponentWithBrowseButton field; + final Object document; if (component instanceof TextFieldWithBrowseButton) { field = (TextFieldWithBrowseButton)component; - } else { + document = new PlainDocument(); + ((TextFieldWithBrowseButton)field).getTextField().setDocument((Document)document); + myModel.setJUnitDocument(i, document); + } else if (component instanceof EditorTextFieldWithBrowseButton) { + field = (ComponentWithBrowseButton)component; + document = ((EditorTextField)field.getChildComponent()).getDocument(); + myModel.setJUnitDocument(i, document); + } + else { field = myPatternTextField; + document = new PlainDocument(); + ((TextFieldWithBrowseButton)field).getTextField().setDocument((Document)document); + myModel.setJUnitDocument(i, document); } - final Document document = myModel.getJUnitDocument(i); - field.getTextField().setDocument(document); myBrowsers[i].setField(field); } } @@ -315,6 +332,35 @@ public class JUnitConfigurable extends SettingsEditor { return myTestLocations[index]; } + private void createUIComponents() { + myPackage = new LabeledComponent(); + myPackage.setComponent(new EditorTextFieldWithBrowseButton(myProject, false)); + + myClass = new LabeledComponent(); + myClass.setComponent(new EditorTextFieldWithBrowseButton(myProject, true)); + + myMethod = new LabeledComponent(); + final EditorTextFieldWithBrowseButton textFieldWithBrowseButton = new EditorTextFieldWithBrowseButton(myProject, true); + new TextFieldCompletionProvider() { + @Override + protected void addCompletionVariants(@NotNull String text, int offset, @NotNull String prefix, @NotNull CompletionResultSet result) { + final String className = getClassName(); + if (className.trim().length() == 0) { + return; + } + final PsiClass testClass = getModuleSelector().findClass(className); + if (testClass == null) return; + final JUnitUtil.TestMethodFilter filter = new JUnitUtil.TestMethodFilter(testClass); + for (PsiMethod psiMethod : testClass.getAllMethods()) { + if (filter.value(psiMethod)) { + result.addElement(LookupElementBuilder.create(psiMethod.getName())); + } + } + } + }.apply(textFieldWithBrowseButton.getChildComponent()); + myMethod.setComponent(textFieldWithBrowseButton); + } + private static void addRadioButtonsListeners(final JRadioButton[] radioButtons, ChangeListener listener) { final ButtonGroup group = new ButtonGroup(); for (final JRadioButton radioButton : radioButtons) { @@ -405,9 +451,12 @@ public class JUnitConfigurable extends SettingsEditor { } final ClassFilter.ClassFilterWithScope classFilter; try { - final JUnitConfiguration configurationCopy = new JUnitConfiguration(ExecutionBundle.message("default.junit.configuration.name"), getProject(), JUnitConfigurationType.getInstance().getConfigurationFactories()[0]); + final JUnitConfiguration configurationCopy = + new JUnitConfiguration(ExecutionBundle.message("default.junit.configuration.name"), getProject(), + JUnitConfigurationType.getInstance().getConfigurationFactories()[0]); applyEditorTo(configurationCopy); - classFilter = TestClassFilter.create(configurationCopy.getTestObject().getSourceScope(), configurationCopy.getConfigurationModule().getModule()); + classFilter = TestClassFilter + .create(configurationCopy.getTestObject().getSourceScope(), configurationCopy.getConfigurationModule().getModule()); } catch (JUnitUtil.NoJUnitException e) { throw NoFilterException.noJUnitInModule(module); @@ -424,12 +473,14 @@ public class JUnitConfigurable extends SettingsEditor { protected String showDialog() { final String className = getClassName(); if (className.trim().length() == 0) { - Messages.showMessageDialog(getField(), ExecutionBundle.message("set.class.name.message"), ExecutionBundle.message("cannot.browse.method.dialog.title"), Messages.getInformationIcon()); + Messages.showMessageDialog(getField(), ExecutionBundle.message("set.class.name.message"), + ExecutionBundle.message("cannot.browse.method.dialog.title"), Messages.getInformationIcon()); return null; } final PsiClass testClass = getModuleSelector().findClass(className); if (testClass == null) { - Messages.showMessageDialog(getField(), ExecutionBundle.message("class.does.not.exists.error.message", className), ExecutionBundle.message("cannot.browse.method.dialog.title"), + Messages.showMessageDialog(getField(), ExecutionBundle.message("class.does.not.exists.error.message", className), + ExecutionBundle.message("cannot.browse.method.dialog.title"), Messages.getInformationIcon()); return null; } @@ -446,12 +497,13 @@ public class JUnitConfigurable extends SettingsEditor { } private String getClassName() { - return ((LabeledComponent)getTestLocation(JUnitConfigurationModel.CLASS)).getComponent().getText(); + return ((LabeledComponent)getTestLocation(JUnitConfigurationModel.CLASS)).getComponent().getText(); } private void setPackage(final PsiPackage aPackage) { if (aPackage == null) return; - ((LabeledComponent)getTestLocation(JUnitConfigurationModel.ALL_IN_PACKAGE)).getComponent().setText(aPackage.getQualifiedName()); + ((LabeledComponent)getTestLocation(JUnitConfigurationModel.ALL_IN_PACKAGE)).getComponent() + .setText(aPackage.getQualifiedName()); } @NotNull diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurationModel.java b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurationModel.java index f4faffdf2636..8e2a57a1eed5 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurationModel.java +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurationModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -19,6 +19,8 @@ package com.intellij.execution.junit2.configuration; import com.intellij.execution.JavaExecutionUtil; import com.intellij.execution.junit.JUnitConfiguration; import com.intellij.execution.junit.JUnitUtil; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.module.Module; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.IndexNotReadyException; @@ -26,7 +28,6 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import javax.swing.text.BadLocationException; -import javax.swing.text.Document; import javax.swing.text.PlainDocument; import java.util.Arrays; import java.util.LinkedHashSet; @@ -42,19 +43,20 @@ public class JUnitConfigurationModel { public static final int DIR = 4; private static final List ourTestObjects; + static { - ourTestObjects = Arrays.asList(JUnitConfiguration.TEST_PACKAGE, JUnitConfiguration.TEST_CLASS, JUnitConfiguration.TEST_METHOD, JUnitConfiguration.TEST_PATTERN, + ourTestObjects = Arrays.asList(JUnitConfiguration.TEST_PACKAGE, JUnitConfiguration.TEST_CLASS, JUnitConfiguration.TEST_METHOD, + JUnitConfiguration.TEST_PATTERN, JUnitConfiguration.TEST_DIRECTORY); } private JUnitConfigurable myListener; private int myType = -1; - private final Document[] myJUnitDocuments = new Document[5]; + private final Object[] myJUnitDocuments = new Object[5]; private final Project myProject; public JUnitConfigurationModel(final Project project) { - for (int i = 0; i < myJUnitDocuments.length; i++) myJUnitDocuments[i] = new PlainDocument(); myProject = project; } @@ -70,12 +72,18 @@ public class JUnitConfigurationModel { myListener.onTypeChanged(newType); } - public void setListener(final JUnitConfigurable listener) { myListener = listener; } + public void setListener(final JUnitConfigurable listener) { + myListener = listener; + } - public Document getJUnitDocument(final int i) { + public Object getJUnitDocument(final int i) { return myJUnitDocuments[i]; } + public void setJUnitDocument(final int i, Object doc) { + myJUnitDocuments[i] = doc; + } + public void apply(final Module module, final JUnitConfiguration configuration) { final boolean shouldUpdateName = configuration.isGeneratedName(); applyTo(configuration.getPersistentData(), module); @@ -88,7 +96,9 @@ public class JUnitConfigurationModel { final String testObject = getTestObject(); final String className = getJUnitTextValue(CLASS); data.TEST_OBJECT = testObject; - if (testObject != JUnitConfiguration.TEST_PACKAGE && testObject != JUnitConfiguration.TEST_PATTERN && testObject != JUnitConfiguration.TEST_DIRECTORY) { + if (testObject != JUnitConfiguration.TEST_PACKAGE && + testObject != JUnitConfiguration.TEST_PATTERN && + testObject != JUnitConfiguration.TEST_DIRECTORY) { try { data.METHOD_NAME = getJUnitTextValue(METHOD); final PsiClass testClass = JUnitUtil.findPsiClass(className, module, myProject); @@ -136,14 +146,17 @@ public class JUnitConfigurationModel { return getDocumentText(index, myJUnitDocuments); } - private static String getDocumentText(final int index, final Document[] documents) { - final Document document = documents[index]; - try { - return document.getText(0, document.getLength()); - } - catch (BadLocationException e) { - throw new RuntimeException(e); + private static String getDocumentText(final int index, final Object[] documents) { + final Object document = documents[index]; + if (document instanceof PlainDocument) { + try { + return ((PlainDocument)document).getText(0, ((PlainDocument)document).getLength()); + } + catch (BadLocationException e) { + throw new RuntimeException(e); + } } + return ((Document)document).getText(); } public void reset(final JUnitConfiguration configuration) { @@ -160,14 +173,23 @@ public class JUnitConfigurationModel { setDocumentText(index, text, myJUnitDocuments); } - private static void setDocumentText(final int index, final String text, final Document[] documents) { - final Document document = documents[index]; - try { - document.remove(0, document.getLength()); - document.insertString(0, text, null); + private static void setDocumentText(final int index, final String text, final Object[] documents) { + final Object document = documents[index]; + if (document instanceof PlainDocument) { + try { + ((PlainDocument)document).remove(0, ((PlainDocument)document).getLength()); + ((PlainDocument)document).insertString(0, text, null); + } + catch (BadLocationException e) { + throw new RuntimeException(e); + } } - catch (BadLocationException e) { - throw new RuntimeException(e); + else { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + public void run() { + ((Document)document).replaceString(0, ((Document)document).getTextLength(), text); + } + }); } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.form b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.form index 04a0c81e6a9a..41548148da4d 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.form +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.form @@ -38,9 +38,6 @@ - - - diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java index 1e45f59ea5ac..63550baae323 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java @@ -22,9 +22,12 @@ */ package com.theoryinpractice.testng.configuration; +import com.intellij.codeInsight.completion.CompletionResultSet; +import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.JavaExecutionUtil; import com.intellij.execution.configuration.BrowseModuleValueActionListener; +import com.intellij.execution.junit.JUnitUtil; import com.intellij.execution.testframework.TestSearchScope; import com.intellij.execution.ui.AlternativeJREPanel; import com.intellij.execution.ui.CommonJavaParametersPanel; @@ -36,15 +39,20 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.ui.EditorTextFieldWithBrowseButton; import com.intellij.ui.table.TableView; +import com.intellij.util.TextFieldCompletionProvider; import com.theoryinpractice.testng.configuration.browser.*; import com.theoryinpractice.testng.model.*; +import com.theoryinpractice.testng.util.TestNGUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,6 +60,7 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.Document; +import javax.swing.text.PlainDocument; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -65,7 +74,7 @@ public class TestNGConfigurationEditor extends SettingsEditor classField; + private LabeledComponent classField; private LabeledComponent moduleClasspath; private AlternativeJREPanel alternateJDK; private final ConfigurationModuleSelector moduleSelector; @@ -75,9 +84,9 @@ public class TestNGConfigurationEditor extends SettingsEditor methodField; - private LabeledComponent packageField; - private LabeledComponent groupField; + private LabeledComponent methodField; + private LabeledComponent packageField; + private LabeledComponent groupField; private LabeledComponent suiteField; private JRadioButton packagesInProject; private JRadioButton packagesInModule; @@ -144,9 +153,14 @@ public class TestNGConfigurationEditor extends SettingsEditor