package com.google.jstestdriver.idea.execution.settings.ui;
import com.google.jstestdriver.idea.config.JstdConfigFileType;
import com.google.jstestdriver.idea.config.JstdConfigFileUtils;
import com.google.jstestdriver.idea.execution.JstdSettingsUtil;
import com.google.jstestdriver.idea.execution.settings.JstdRunSettings;
import com.google.jstestdriver.idea.util.SwingUtils;
import com.intellij.ide.util.TreeFileChooser;
import com.intellij.ide.util.TreeFileChooserDialog;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.io.FileUtil;
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.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.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
public class ConfigFileRunSettingsSection extends AbstractRunSettingsSection {
private final TextFieldWithBrowseButton myConfigFileTextFieldWithBrowseButton;
private final JBLabel myLabel = new JBLabel("Configuration file:");
ConfigFileRunSettingsSection() {
myConfigFileTextFieldWithBrowseButton = new TextFieldWithBrowseButton();
setAnchor(myLabel);
}
@Override
public void resetFrom(@NotNull JstdRunSettings runSettings) {
myConfigFileTextFieldWithBrowseButton.setText(runSettings.getConfigFile());
}
@Override
public void applyTo(@NotNull JstdRunSettings.Builder runSettingsBuilder) {
runSettingsBuilder.setConfigFile(ObjectUtils.notNull(myConfigFileTextFieldWithBrowseButton.getText(), ""));
}
@NotNull
@Override
protected JComponent createComponent(@NotNull CreationContext creationContext) {
JPanel panel = new JPanel(new GridBagLayout());
{
GridBagConstraints c = new GridBagConstraints(
0, 0,
1, 1,
0.0, 0.0,
GridBagConstraints.EAST,
GridBagConstraints.NONE,
new Insets(UIUtil.DEFAULT_VGAP, 0, 0, UIUtil.DEFAULT_HGAP),
0, 0
);
myLabel.setDisplayedMnemonic('C');
myLabel.setHorizontalAlignment(SwingConstants.RIGHT);
myLabel.setLabelFor(myConfigFileTextFieldWithBrowseButton.getTextField());
panel.add(myLabel, c);
}
{
GridBagConstraints c = new GridBagConstraints(
1, 0,
1, 1,
1.0, 0.0,
GridBagConstraints.WEST,
GridBagConstraints.HORIZONTAL,
new Insets(UIUtil.DEFAULT_VGAP, 0, 0, 0),
0, 0
);
final Project project = creationContext.getProject();
final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
boolean visible = super.isFileVisible(file, showHiddenFiles);
if (visible && !file.isDirectory() && !showHiddenFiles) {
visible = JstdConfigFileUtils.isJstdConfigFile(file);
}
return visible;
}
};
final JTextField configFileTextField = myConfigFileTextFieldWithBrowseButton.getTextField();
FileChooserFactory.getInstance().installFileCompletion(configFileTextField, descriptor, false, null);
myConfigFileTextFieldWithBrowseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PsiFile initialPsiFile = getConfigFile(project);
TreeFileChooserDialog fileChooser = new TreeFileChooserDialog(
project,
"Select JsTestDriver configuration file",
initialPsiFile,
JstdConfigFileType.INSTANCE,
new TreeFileChooser.PsiFileFilter() {
@Override
public boolean accept(PsiFile psiFile) {
return true;
}
},
false,
false
);
boolean jstdConfigFilesExists = JstdSettingsUtil.areJstdConfigFilesInProject(project);
if (jstdConfigFilesExists) {
fileChooser.selectSearchByNameTab();
}
fileChooser.showDialog();
PsiFile psiFile = fileChooser.getSelectedFile();
if (psiFile != null) {
VirtualFile vFile = psiFile.getVirtualFile();
if (vFile != null) {
String path = FileUtil.toSystemDependentName(vFile.getPath());
configFileTextField.setText(path);
}
}
}
});
panel.add(myConfigFileTextFieldWithBrowseButton, c);
}
SwingUtils.addGreedyBottomRow(panel);
return panel;
}
@Nullable
private PsiFile getConfigFile(@NotNull Project project) {
String directoryName = myConfigFileTextFieldWithBrowseButton.getText();
if (directoryName.length() == 0) return null;
directoryName = directoryName.replace(File.separatorChar, '/');
VirtualFile path = LocalFileSystem.getInstance().findFileByPath(directoryName);
while (path == null && directoryName.length() > 0) {
int pos = directoryName.lastIndexOf('/');
if (pos <= 0) break;
directoryName = directoryName.substring(0, pos);
path = LocalFileSystem.getInstance().findFileByPath(directoryName);
}
if (path != null) {
PsiManager psiManager = PsiManager.getInstance(project);
if (!path.isDirectory()) {
return psiManager.findFile(path);
}
}
return null;
}
@Override
public void setAnchor(@Nullable JComponent anchor) {
super.setAnchor(anchor);
myLabel.setAnchor(anchor);
}
}