package org.testng.eclipse.ui.preferences;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
import org.eclipse.jdt.internal.ui.wizards.buildpaths.FolderSelectionDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.dialogs.PropertyPage;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.views.navigator.ResourceSorter;
import org.testng.eclipse.TestNGPlugin;
import org.testng.eclipse.ui.util.Utils;
import org.testng.eclipse.ui.util.Utils.Widgets;
import org.testng.eclipse.util.JDTUtil;
import org.testng.eclipse.util.PreferenceStoreUtil;
import org.testng.eclipse.util.ResourceUtil;
import org.testng.eclipse.util.SWTUtil;
import org.testng.reporters.XMLReporter;
/**
* Project specific properties.
*
* @author Cedric Beust <cedric@beust.com>
*/
public class ProjectPropertyPage extends PropertyPage {
private Text m_outputdir;
private Button m_absolutePath;
private Button m_disabledDefaultListeners;
private Text m_xmlTemplateFile;
private Text m_preDefinedListeners;
private IProject m_workingProject;
private Text m_watchResultText;
private Button m_watchResultRadio;
public void createControl(Composite parent) {
setDescription("Project TestNG settings");
super.createControl(parent);
}
/**
* @see PreferencePage#createContents(Composite)
*/
protected Control createContents(Composite parent) {
Composite parentComposite = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().applyTo(parentComposite);
GridDataFactory.fillDefaults().grab(true, true).applyTo(parentComposite);
//
// Output directory
//
{
Group g = new Group(parentComposite, SWT.SHADOW_ETCHED_IN);
g.setLayout(new GridLayout());
SelectionAdapter buttonListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
DirectoryDialog dlg= new DirectoryDialog(m_outputdir.getShell());
dlg.setMessage("Select TestNG output directory");
String selectedDir= dlg.open();
m_outputdir.setText(selectedDir != null ? selectedDir : "");
m_absolutePath.setSelection(true);
}
};
Widgets w = Utils.createTextBrowseControl(g, null,
"TestNGPropertyPage.outputDir", buttonListener, null, null, true);
m_outputdir = w.text;
m_absolutePath = new Button(g, SWT.CHECK);
m_absolutePath.setText("Absolute output path");
m_absolutePath.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1));
g.setLayoutData(SWTUtil.createGridData());
}
//
// XML template file
//
{
SelectionAdapter buttonListener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
String result = Utils.selectTemplateFile(getShell());
if (result != null) {
m_xmlTemplateFile.setText(result);
}
}
};
Widgets w = Utils.createTextBrowseControl(parentComposite, null,
"TestNGPropertyPage.templateXml", buttonListener, null, null, true);
m_xmlTemplateFile = w.text;
}
//
// Disable default listeners
//
m_disabledDefaultListeners = new Button(parentComposite, SWT.CHECK);
m_disabledDefaultListeners.setText(ResourceUtil.getString("TestNGPropertyPage.disableDefaultListeners"));
// m_disabledDefaultListeners.setLayoutData(SWTUtil.createGridData());//new GridData(SWT.FILL, SWT.NONE, true, false, 4, 1));
// m_disabledDefaultListeners.setBackground(new Color(parent.getDisplay(), 0xcc, 0, 0));
//Create a string editor control: A label and a text area
{
Widgets w = Utils.createStringEditorControl(parentComposite, "TestNGPropertyPage.preDefinedListeners", null, true);
m_preDefinedListeners = w.text;
m_preDefinedListeners.setToolTipText(ResourceUtil.getString("TestNGPropertyPage.disableDefaultListeners.tips"));
}
Label sepLabel = new Label(parentComposite, SWT.SEPARATOR | SWT.HORIZONTAL);
GridDataFactory.fillDefaults().applyTo(sepLabel);
//
// Watch testng-results.xml
//
{
// Group g = new Group(parentComposite, SWT.SHADOW_ETCHED_IN);
// m_watchResults = new Button(g, SWT.CHECK);
// m_watchResults.setText("Watch testng-results.xml");
SelectionAdapter listener = new SelectionAdapter() {
public void widgetSelected(SelectionEvent evt) {
DirectoryDialog dlg= new DirectoryDialog(m_xmlTemplateFile.getShell());
dlg.setMessage("Select TestNG Output Directory");
String selectedDir = dlg.open();
if (new File(selectedDir).isDirectory()) {
selectedDir = selectedDir + File.separator + XMLReporter.FILE_NAME;
}
m_watchResultText.setText(selectedDir != null ? selectedDir : "");
}
};
Widgets w = Utils.createTextBrowseControl(parentComposite,
"TestNGPropertyPage.watchResultXml",
"TestNGPropertyPage.resultXmlDirectory",
listener, null, null,
true);
m_watchResultText = w.text;
m_watchResultRadio = w.radio;
}
loadDefaults();
return parentComposite;
}
public void dispose() {
m_outputdir.dispose();
m_absolutePath.dispose();
m_disabledDefaultListeners.dispose();
m_xmlTemplateFile.dispose();
m_preDefinedListeners.dispose();
super.dispose();
}
private void loadDefaults() {
m_workingProject = (IProject) getElement().getAdapter(IProject.class);
// Populate the owner text field with the default value
PreferenceStoreUtil storage= TestNGPlugin.getPluginPreferenceStore();
String projectName = m_workingProject.getName();
m_outputdir.setText(storage.getOutputDir(projectName, true));
m_absolutePath.setSelection(storage.isOutputAbsolutePath(projectName, true));
m_disabledDefaultListeners.setSelection(storage.hasDisabledListeners(projectName, true));
m_xmlTemplateFile.setText(storage.getXmlTemplateFile(projectName, true));
m_watchResultRadio.setSelection(storage.getWatchResults(projectName));
String dir = storage.getWatchResultDirectory(projectName);
m_watchResultText.setText(dir);
m_preDefinedListeners.setText(storage.getPreDefinedListeners(projectName, false));
}
protected void performDefaults() {
loadDefaults();
super.performDefaults();
}
public boolean performOk() {
PreferenceStoreUtil storage= TestNGPlugin.getPluginPreferenceStore();
String projectName = m_workingProject.getName();
storage.storeOutputDir(projectName, m_outputdir.getText(), m_absolutePath.getSelection());
storage.storeDisabledListeners(projectName, m_disabledDefaultListeners.getSelection());
storage.storeXmlTemplateFile(projectName, m_xmlTemplateFile.getText());
storage.storePreDefinedListeners(projectName, m_preDefinedListeners.getText());
storage.storeWatchResults(projectName, m_watchResultRadio.getSelection());
storage.storeWatchResultLocation(projectName, m_watchResultText.getText());
if(super.performOk()) {
setMessage("Project preferences are saved", INFORMATION);
return true;
}
return false;
}
private void handleBrowseAction() {
Class[] acceptedClasses = new Class[] { IProject.class, IFolder.class };
ISelectionStatusValidator validator = new ISelectionStatusValidator() {
public IStatus validate(Object[] selection) {
if ((null == selection) || (selection.length == 0)) {
return TestNGPlugin.createError("empty selection is not allowed");
}
if (selection.length > 1) {
return TestNGPlugin.createError("multiple selection is not allowed");
}
if (IFolder.class.isInstance(selection[0]) || IProject.class.isInstance(selection[0])) {
return TestNGPlugin.createStatus(IStatus.OK, "");
}
return TestNGPlugin.createError("not accepted type");
}
};
IWorkspaceRoot workspaceRoot = JDTUtil.getWorkspaceRoot();
IProject[] allProjects = workspaceRoot.getProjects();
List<IProject> rejectedElements = new ArrayList<>(allProjects.length);
IProject currProject = m_workingProject.getProject();
for (int i = 0; i < allProjects.length; i++) {
if (!allProjects[i].equals(currProject)) {
rejectedElements.add(allProjects[i]);
}
}
ViewerFilter filter = new TypedViewerFilter(acceptedClasses, rejectedElements.toArray());
ILabelProvider lp = new WorkbenchLabelProvider();
ITreeContentProvider cp = new ProjectContentProvider();
IResource initSelection = null;
// if (!"".equals(m_outdirPath.getText())) {
// initSelection= workspaceRoot.findMember(new Path(m_outdirPath.getText()));
// }
FolderSelectionDialog dialog = new FolderSelectionDialog(getShell(), lp, cp);
dialog.setTitle("Select TestNG output artifacts directory");
dialog.setValidator(validator);
dialog.setMessage("a message");
dialog.addFilter(filter);
dialog.setInput(workspaceRoot);
dialog.setInitialSelection(initSelection);
dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
if (dialog.open() == Window.OK) {
m_outputdir.setText(((IContainer) dialog.getFirstResult()).getProjectRelativePath()
.toPortableString());
m_absolutePath.setSelection(false);
}
}
public static class ProjectContentProvider implements ITreeContentProvider {
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof IContainer) {
try {
return ((IContainer) parentElement).members();
}
catch (CoreException ce) {
;
}
}
return null;
}
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object element) {
return ((IResource) element).getParent();
}
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
public boolean hasChildren(Object element) {
IResource resource = (IResource) element;
if (IResource.FILE == resource.getType()) {
return false;
}
else {
return true;
}
}
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
}