package com.google.jstestdriver.idea.execution.settings.ui;
import com.intellij.javascript.testFramework.TestFileStructureManager;
import com.intellij.javascript.testFramework.TestFileStructurePack;
import com.google.jstestdriver.idea.execution.settings.JstdRunSettings;
import com.google.jstestdriver.idea.util.SwingUtils;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiManager;
import com.intellij.ui.ListCellRendererWrapper;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.util.List;
public class TestMethodRunSettingsSection extends AbstractRunSettingsSection {
private final TestCaseRunSettingsSection myTestCaseRunSettingsSection;
private final JComboBox myTestMethodNameComboBox;
private final JBLabel myLabel;
TestMethodRunSettingsSection() {
myTestCaseRunSettingsSection = new TestCaseRunSettingsSection(this);
myTestMethodNameComboBox = createComboBox();
myLabel = new JBLabel("Method:");
setAnchor(SwingUtils.getWiderComponent(myLabel, myTestCaseRunSettingsSection));
}
private String getTestMethodName() {
Object value = myTestMethodNameComboBox.getSelectedItem();
return value == null ? "" : value.toString();
}
public void stateChanged(@NotNull Project project,
@NotNull String jsTestFilePath,
@NotNull String testCaseName) {
String oldValue = getTestMethodName();
try {
updateTestMethodVariants(project, jsTestFilePath, testCaseName);
}
finally {
myTestMethodNameComboBox.setSelectedItem(oldValue);
}
}
private void updateTestMethodVariants(@NotNull Project project,
@NotNull String jsTestFilePath,
@NotNull String testCaseName) {
myTestMethodNameComboBox.removeAllItems();
VirtualFile jsTestVirtualFile = VfsUtil.findFileByIoFile(new File(jsTestFilePath), false);
if (jsTestVirtualFile == null) {
return;
}
JSFile jsFile = ObjectUtils.tryCast(PsiManager.getInstance(project).findFile(jsTestVirtualFile), JSFile.class);
if (jsFile == null) {
return;
}
TestFileStructurePack pack = TestFileStructureManager.fetchTestFileStructurePackByJsFile(jsFile);
if (pack != null) {
List<String> testMethodNames = pack.getChildrenOf(testCaseName);
for (String testMethodName : testMethodNames) {
myTestMethodNameComboBox.addItem(testMethodName);
}
}
}
private static JComboBox createComboBox() {
JComboBox comboBox = new JComboBox();
comboBox.setRenderer(new ListCellRendererWrapper<String>() {
@Override
public void customize(JList list, String value, int index, boolean selected, boolean hasFocus) {
setText(value);
}
});
comboBox.setEditable(true);
return comboBox;
}
@Override
public void resetFrom(@NotNull JstdRunSettings runSettings) {
myTestCaseRunSettingsSection.resetFrom(runSettings);
myTestMethodNameComboBox.setSelectedItem(runSettings.getTestMethodName());
}
@Override
public void applyTo(@NotNull JstdRunSettings.Builder runSettingsBuilder) {
myTestCaseRunSettingsSection.applyTo(runSettingsBuilder);
String testMethodName = getTestMethodName();
runSettingsBuilder.setTestMethodName(testMethodName);
}
@NotNull
@Override
protected JComponent createComponent(@NotNull CreationContext creationContext) {
JPanel panel = new JPanel(new GridBagLayout());
{
GridBagConstraints c = new GridBagConstraints(
0, 0,
2, 1,
0.0, 0.0,
GridBagConstraints.NORTHWEST,
GridBagConstraints.HORIZONTAL,
new Insets(0, 0, 0, 0),
0, 0
);
JComponent testCaseComponent = myTestCaseRunSettingsSection.getComponent(creationContext);
panel.add(testCaseComponent, c);
}
{
myLabel.setDisplayedMnemonic('M');
myLabel.setLabelFor(myTestMethodNameComboBox);
myLabel.setHorizontalAlignment(SwingConstants.RIGHT);
GridBagConstraints c = new GridBagConstraints(
0, 1,
1, 1,
0.0, 0.0,
GridBagConstraints.WEST,
GridBagConstraints.NONE,
new Insets(UIUtil.DEFAULT_VGAP, 0, 0, UIUtil.DEFAULT_HGAP),
0, 0
);
panel.add(myLabel, c);
}
{
GridBagConstraints c = new GridBagConstraints(
1, 1,
1, 1,
1.0, 0.0,
GridBagConstraints.WEST,
GridBagConstraints.HORIZONTAL,
new Insets(UIUtil.DEFAULT_VGAP, 0, 0, 0),
0, 0
);
panel.add(myTestMethodNameComboBox, c);
myLabel.setLabelFor(myTestMethodNameComboBox);
}
SwingUtils.addGreedyBottomRow(panel);
return panel;
}
@Override
public void setAnchor(@Nullable JComponent anchor) {
super.setAnchor(anchor);
myLabel.setAnchor(anchor);
myTestCaseRunSettingsSection.setAnchor(anchor);
}
}