blob: 6398c69d41ae155e81e980c130d56e6942066c2a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.java.testrunner.ui;
import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collection;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.TitledBorder;
import javax.swing.text.JTextComponent;
import org.netbeans.api.annotations.common.NonNull;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.modules.gsf.testrunner.plugin.CommonSettingsProvider;
import org.netbeans.modules.gsf.testrunner.plugin.GuiUtilsProvider;
import org.netbeans.modules.gsf.testrunner.ui.spi.TestCreatorConfiguration;
import org.netbeans.modules.java.testrunner.GuiUtils;
import org.netbeans.modules.java.testrunner.JavaUtils;
import org.openide.filesystems.FileObject;
import org.openide.util.Lookup;
import org.openide.util.Pair;
/**
*
* @author Theofanis Oikonomou
*/
public class JavaTestCreatorConfiguration extends TestCreatorConfiguration {
private JCheckBox chkAbstractImpl;
private JCheckBox chkComments;
private JCheckBox chkContent;
private JCheckBox chkExceptions;
private JCheckBox chkGenerateSuites;
private JCheckBox chkJavaDoc;
private JCheckBox chkPackage;
private JCheckBox chkPackagePrivateClasses;
private JCheckBox chkProtected;
private JCheckBox chkPublic;
private JCheckBox chkSetUp;
private JCheckBox chkTearDown;
private JCheckBox chkBeforeClass;
private JCheckBox chkAfterClass;
/** resource bundle used during initialization of this panel */
private ResourceBundle bundle;
private final FileObject[] activatedFileObjects;
JavaTestCreatorConfiguration(FileObject[] activatedFileObjects) {
assert activatedFileObjects != null;
this.activatedFileObjects = activatedFileObjects;
}
@Override
public boolean canHandleProject(@NonNull String framework) {
return framework.startsWith("JUnit") || GuiUtils.TESTNG_TEST_FRAMEWORK.equals(framework);
}
@Override
public JTextComponent getMessagePanel(Context context) {
Color color = UIManager.getColor("nb.errorForeground"); //NOI18N
if (color == null) {
color = new Color(89, 79, 191); //RGB suggested by Bruce in #28466
}
return GuiUtils.createMultilineLabel("", color);
}
@Override
public Component getConfigurationPanel(TestCreatorConfiguration.Context context) {
initBundle();
JPanel jpCodeGen;
try {
/* create the components: */
String[] chkBoxIDs = new String[14];
JCheckBox[] chkBoxes;
Collection<? extends GuiUtilsProvider> providers = Lookup.getDefault().lookupAll(GuiUtilsProvider.class);
if (context.isMultipleClasses()) {
for (GuiUtilsProvider provider : providers) {
chkBoxIDs = new String[]{
provider.getCheckboxText("CHK_PUBLIC"),
provider.getCheckboxText("CHK_PROTECTED"),
provider.getCheckboxText("CHK_PACKAGE"),
provider.getCheckboxText("CHK_PACKAGE_PRIVATE_CLASSES"),
provider.getCheckboxText("CHK_ABSTRACT_CLASSES"),
provider.getCheckboxText("CHK_EXCEPTION_CLASSES"),
provider.getCheckboxText("CHK_SUITES"),
provider.getCheckboxText("CHK_SETUP"),
provider.getCheckboxText("CHK_TEARDOWN"),
provider.getCheckboxText("CHK_BEFORE_CLASS"),
provider.getCheckboxText("CHK_AFTER_CLASS"),
provider.getCheckboxText("CHK_METHOD_BODIES"),
provider.getCheckboxText("CHK_JAVADOC"),
provider.getCheckboxText("CHK_HINTS")
};
break;
}
} else {
for (GuiUtilsProvider provider : providers) {
chkBoxIDs = new String[]{
provider.getCheckboxText("CHK_PUBLIC"),
provider.getCheckboxText("CHK_PROTECTED"),
provider.getCheckboxText("CHK_PACKAGE"),
null, // CHK_PACKAGE_PRIVATE_CLASSES,
null, // CHK_ABSTRACT_CLASSES,
null, // CHK_EXCEPTION_CLASSES,
null, // CHK_SUITES,
provider.getCheckboxText("CHK_SETUP"),
provider.getCheckboxText("CHK_TEARDOWN"),
provider.getCheckboxText("CHK_BEFORE_CLASS"),
provider.getCheckboxText("CHK_AFTER_CLASS"),
provider.getCheckboxText("CHK_METHOD_BODIES"),
provider.getCheckboxText("CHK_JAVADOC"),
provider.getCheckboxText("CHK_HINTS")
};
break;
}
}
chkBoxes = new JCheckBox[chkBoxIDs.length];
for (GuiUtilsProvider provider : providers) {
chkBoxes = provider.createCheckBoxes(chkBoxIDs);
break;
}
int i = 0;
chkPublic = chkBoxes[i++];
chkProtected = chkBoxes[i++];
chkPackage = chkBoxes[i++];
chkPackagePrivateClasses = chkBoxes[i++]; //may be null
chkAbstractImpl = chkBoxes[i++]; //may be null
chkExceptions = chkBoxes[i++]; //may be null
chkGenerateSuites = chkBoxes[i++]; //may be null
chkSetUp = chkBoxes[i++];
chkTearDown = chkBoxes[i++];
chkBeforeClass = chkBoxes[i++];
chkAfterClass = chkBoxes[i++];
chkContent = chkBoxes[i++];
chkJavaDoc = chkBoxes[i++];
chkComments = chkBoxes[i++];
/* create groups of checkboxes: */
JComponent methodAccessLevels = null;
for (GuiUtilsProvider provider : providers) {
methodAccessLevels = provider.createChkBoxGroup(
bundle.getString("CommonTestsCfgOfCreate.groupAccessLevels"), //NOI18N
new JCheckBox[]{chkPublic, chkProtected, chkPackage});
break;
}
JComponent classTypes = null;
JComponent optionalClasses = null;
if (context.isMultipleClasses()) {
for (GuiUtilsProvider provider : providers) {
classTypes = provider.createChkBoxGroup(
bundle.getString("CommonTestsCfgOfCreate.groupClassTypes"), //NOI18N
new JCheckBox[]{chkPackagePrivateClasses,
chkAbstractImpl, chkExceptions});
optionalClasses = provider.createChkBoxGroup(
bundle.getString("CommonTestsCfgOfCreate.groupOptClasses"), //NOI18N
new JCheckBox[]{chkGenerateSuites});
break;
}
}
JComponent optionalCode = null;
JComponent optionalComments = null;
for (GuiUtilsProvider provider : providers) {
optionalCode = provider.createChkBoxGroup(
bundle.getString("CommonTestsCfgOfCreate.groupOptCode"), //NOI18N
new JCheckBox[]{chkSetUp, chkTearDown, chkBeforeClass, chkAfterClass, chkContent});
optionalComments = provider.createChkBoxGroup(
bundle.getString("CommonTestsCfgOfCreate.groupOptComments"), //NOI18N
new JCheckBox[]{chkJavaDoc, chkComments});
break;
}
/* create the left column of options: */
Box leftColumn = Box.createVerticalBox();
leftColumn.add(methodAccessLevels);
if (context.isMultipleClasses()) {
leftColumn.add(Box.createVerticalStrut(11));
leftColumn.add(classTypes);
} else {
/*
* This strut ensures that width of the left column is not limited.
* If it was limited, the rigth column would not move when the
* dialog is horizontally resized.
*/
leftColumn.add(Box.createVerticalStrut(0));
}
leftColumn.add(Box.createVerticalGlue());
/* create the right column of options: */
Box rightColumn = Box.createVerticalBox();
if (context.isMultipleClasses()) {
rightColumn.add(optionalClasses);
rightColumn.add(Box.createVerticalStrut(11));
}
rightColumn.add(optionalCode);
rightColumn.add(Box.createVerticalStrut(11));
rightColumn.add(optionalComments);
rightColumn.add(Box.createVerticalGlue());
jpCodeGen = new JPanel();
jpCodeGen.setLayout(new BoxLayout(jpCodeGen, BoxLayout.X_AXIS));
jpCodeGen.add(leftColumn);
jpCodeGen.add(Box.createHorizontalStrut(24));
jpCodeGen.add(rightColumn);
/* decorate the panel: */
addTitledBorder(jpCodeGen,
new Insets(12, 12, 11, 12),
bundle.getString("CommonTestsCfgOfCreate.jpCodeGen.title"));//NOI18N
/* tune the layout: */
methodAccessLevels.setAlignmentX(0.0f);
if (context.isMultipleClasses()) {
classTypes.setAlignmentX(0.0f);
optionalClasses.setAlignmentX(0.0f);
}
optionalCode.setAlignmentX(0.0f);
optionalComments.setAlignmentX(0.0f);
initializeCheckBoxStates(context.isMultipleClasses());
setupUserInteraction(context.getCallback());
} finally {
unlinkBundle();
}
return jpCodeGen;
}
private void setupUserInteraction(Callback callback) {
final ItemListener listener = new CheckBoxListener(callback);
chkPublic.addItemListener(listener);
chkProtected.addItemListener(listener);
chkPackage.addItemListener(listener);
}
/**
* Listener object that listens on state changes of some check-boxes.
*/
private final class CheckBoxListener implements ItemListener {
private final Callback callback;
public CheckBoxListener (Callback callback) {
this.callback = callback;
}
@Override
public void itemStateChanged(ItemEvent e) {
final Object source = e.getSource();
assert source == chkPublic
|| source == chkProtected
|| source == chkPackage;
callback.checkAcceptability();
}
}
@Override
public void persistConfigurationPanel(Context context) {
rememberCheckBoxStates(context.isMultipleClasses());
}
/**
* Loads a resource bundle so that it can be used during intialization
* of this panel.
*
* @see #unlinkBundle
*/
private void initBundle() {
Collection<? extends GuiUtilsProvider> providers = Lookup.getDefault().lookupAll(GuiUtilsProvider.class);
for (GuiUtilsProvider provider : providers) {
bundle = provider.getBundle();
break;
}
}
/**
* Nulls the resource bundle so that it is not held in memory when it is
* not used.
*
* @see #initBundle
*/
private void unlinkBundle() {
bundle = null;
}
/**
* Adds a border and a title around a given component.
* If the component already has some border, it is overridden (not kept).
*
* @param component component the border and title should be added to
* @param insets insets between the component and the titled border
* @param title text of the title
*/
private static void addTitledBorder(JComponent component,
Insets insets,
String title) {
Border insideBorder = BorderFactory.createEmptyBorder(
insets.top, insets.left, insets.bottom, insets.right);
Border outsideBorder = new TitledBorder(
BorderFactory.createEtchedBorder(), title);
component.setBorder(new CompoundBorder(outsideBorder, insideBorder));
}
/**
* Reads JUnit settings and initializes checkboxes accordingly.
*
* @see #persistConfigurationPanel
*/
private void initializeCheckBoxStates(boolean multipleClasses) {
boolean chkPublicB = true;
boolean chkProtectedB = true;
boolean chkPackageB = true;
boolean chkCommentsB = true;
boolean chkContentB = true;
boolean chkJavaDocB = true;
boolean chkGenerateSuitesB = true;
boolean chkPackagePrivateClassesB = true;
boolean chkAbstractImplB = true;
boolean chkExceptionsB = true;
boolean chkSetUpB = true;
boolean chkTearDownB = true;
boolean chkBeforeClassB = true;
boolean chkAfterClassB = true;
Collection<? extends CommonSettingsProvider> providers = Lookup.getDefault().lookupAll(CommonSettingsProvider.class);
for (CommonSettingsProvider provider : providers) {
chkPublicB = provider.isMembersPublic();
chkProtectedB = provider.isMembersProtected();
chkPackageB = provider.isMembersPackage();
chkCommentsB = provider.isBodyComments();
chkContentB = provider.isBodyContent();
chkJavaDocB = provider.isJavaDoc();
chkGenerateSuitesB = provider.isGenerateSuiteClasses();
chkPackagePrivateClassesB = provider.isIncludePackagePrivateClasses();
chkAbstractImplB = provider.isGenerateAbstractImpl();
chkExceptionsB = provider.isGenerateExceptionClasses();
chkSetUpB = provider.isGenerateSetUp();
chkTearDownB = provider.isGenerateTearDown();
chkBeforeClassB = provider.isGenerateClassSetUp();
chkAfterClassB = provider.isGenerateClassTearDown();
break;
}
chkPublic.setSelected(chkPublicB);
chkProtected.setSelected(chkProtectedB);
chkPackage.setSelected(chkPackageB);
chkComments.setSelected(chkCommentsB);
chkContent.setSelected(chkContentB);
chkJavaDoc.setSelected(chkJavaDocB);
if (multipleClasses) {
chkGenerateSuites.setSelected(chkGenerateSuitesB);
chkPackagePrivateClasses.setSelected(chkPackagePrivateClassesB);
chkAbstractImpl.setSelected(chkAbstractImplB);
chkExceptions.setSelected(chkExceptionsB);
}
chkSetUp.setSelected(chkSetUpB);
chkTearDown.setSelected(chkTearDownB);
chkBeforeClass.setSelected(chkBeforeClassB);
chkAfterClass.setSelected(chkAfterClassB);
}
/**
* Stores settings given by checkbox states to JUnit settings.
*
* @see #initializeCheckBoxStatesf
*/
private void rememberCheckBoxStates(boolean multipleClasses) {
Collection<? extends CommonSettingsProvider> providers = Lookup.getDefault().lookupAll(CommonSettingsProvider.class);
for (CommonSettingsProvider provider : providers) {
provider.setMembersPublic(chkPublic.isSelected());
provider.setMembersProtected(chkProtected.isSelected());
provider.setMembersPackage(chkPackage.isSelected());
provider.setBodyComments(chkComments.isSelected());
provider.setBodyContent(chkContent.isSelected());
provider.setJavaDoc(chkJavaDoc.isSelected());
if (multipleClasses) {
provider.setGenerateSuiteClasses(chkGenerateSuites.isSelected());
provider.setIncludePackagePrivateClasses(
chkPackagePrivateClasses.isSelected());
provider.setGenerateAbstractImpl(chkAbstractImpl.isSelected());
provider.setGenerateExceptionClasses(chkExceptions.isSelected());
}
provider.setGenerateSetUp(chkSetUp.isSelected());
provider.setGenerateTearDown(chkTearDown.isSelected());
provider.setGenerateClassSetUp(chkBeforeClass.isSelected());
provider.setGenerateClassTearDown(chkAfterClass.isSelected());
break;
}
}
@Override
public Pair<String, String> getSourceAndTestClassNames(FileObject fileObj, boolean isTestNG, boolean isSelenium) {
String[] sourceAndTestClassNames = JavaUtils.getSourceAndTestClassNames(fileObj, isTestNG, isSelenium);
return Pair.of(sourceAndTestClassNames[0], sourceAndTestClassNames[1]);
}
@Override
public Object[] getTestSourceRoots(Collection<SourceGroup> createdSourceRoots, FileObject fo) {
return JavaUtils.getTestSourceRoots(createdSourceRoots, fo);
}
}