/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.ui.widget.editor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Adapters;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.internal.util.Util;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.jboss.tools.common.EclipseUtil;
import org.jboss.tools.common.ui.CommonUIMessages;
import org.jboss.tools.common.ui.CommonUIPlugin;
import org.jboss.tools.common.ui.IValidator;
import org.jboss.tools.common.ui.ValidatorFactory;
import org.jboss.tools.common.ui.widget.editor.ButtonFieldEditor.ButtonPressedAction;
import org.jboss.tools.common.ui.wizard.IParameter;
/**
*
* @author eskimo
*
*/
public class SwtFieldEditorFactory implements IFieldEditorFactory {
/**
*
*/
public IFieldEditor createCheckboxEditor(String name, String label,
boolean defaultValue) {
return createCheckboxEditor(name, label, defaultValue, null);
}
public IFieldEditor createCheckboxEditor(String name, String label,
boolean defaultValue, String description) {
CompositeEditor editor = new CompositeEditor(name,label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,label, description),
new CheckBoxFieldEditor(name,label,Boolean.valueOf(defaultValue))});
return editor;
}
/*
* Starting from 4022 revision it creates standart combo box, if it be necessary
* to use custom combo box, use another implementation of this method.
* PS. custom combo box looks ugly under mac os.
*/
public ITaggedFieldEditor createComboEditor(String name, String label,
List values, Object defaultValue) {
TaggedComboFieldEditor editor = new TaggedComboFieldEditor(name,label,values, defaultValue,false);
return editor;
}
/**
*
*/
public ITaggedFieldEditor createComboEditor(String name, String label,
List values, Object defaultValue, boolean editable) {
TaggedComboFieldEditor editor = new TaggedComboFieldEditor(name,label,values, defaultValue,editable);
return editor;
}
public ITaggedFieldEditor createComboEditor(String name, String label,
List values, Object defaultValue, boolean editable, String description) {
TaggedComboFieldEditor editor = new TaggedComboFieldEditor(name,label,values, defaultValue,editable, description);
return editor;
}
public ITaggedFieldEditor createRadioEditor(String name, String label,
List<String> labels, List values, Object defaultValue) {
return createRadioEditor(name, label, labels, values, defaultValue, null);
}
public ITaggedFieldEditor createRadioEditor(String name, String label,
List<String> labels, List values, Object defaultValue, String description) {
TaggedRadioFieldEditor editor = new TaggedRadioFieldEditor(name,label, labels, values, defaultValue, description);
return editor;
}
public ITaggedFieldEditor createRadioEditor(String name, String label,
List<String> labels, List values, Object defaultValue, String description, List<String> valueDescriptions) {
TaggedRadioFieldEditor editor = new TaggedRadioFieldEditor(name,label, labels, values, defaultValue, description, valueDescriptions);
return editor;
}
/**
*
*/
public IFieldEditor createTextEditor(String name, String label, String defaultValue) {
return createTextEditor(name, label, defaultValue, null);
}
public IFieldEditor createTextEditor(String name, String label, String defaultValue, String description) {
CompositeEditor editor = new CompositeEditor(name,label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,label, description),
new TextFieldEditor(name,label, defaultValue)});
return editor;
}
/**
*
*/
public IFieldEditor createUneditableTextEditor(String name, String label, String defaultValue) {
CompositeEditor editor = new CompositeEditor(name, label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,label),
new TextFieldEditor(name,label, defaultValue,false)});
return editor;
}
/**
*
*/
public IFieldEditor createBrowseFolderEditor(String name, String label, String defaultValue) {
CompositeEditor editor = new CompositeEditor(name, label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,label),
new TextFieldEditor(name,label, defaultValue),
new ButtonFieldEditor(name,createSelectFolderAction(CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_BROWS),defaultValue)});
return editor;
}
/**
*
*/
public IFieldEditor createBrowseWorkspaceFolderEditor(String name, String label, String defaultValue) {
ButtonFieldEditor.ButtonPressedAction action = createSelectWorkspaceFolderAction(CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_BROWS, defaultValue);
CompositeEditor editor = new CompositeEditor(name, label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,label),
new TextFieldEditor(name,label, defaultValue),
new ButtonFieldEditor(name, action, defaultValue)});
action.setFieldEditor(editor);
return editor;
}
/* (non-Javadoc)
* @see org.jboss.tools.seam.ui.widget.editor.IFieldEditorFactory#createBrowseSourceFolderEditor(java.lang.String, java.lang.String, java.lang.String)
*/
public IFieldEditor createBrowseSourceFolderEditor(String name, String label, String defaultValue) {
ButtonFieldEditor.ButtonPressedAction action = createSelectSourceFolderAction(CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_BROWS, defaultValue);
CompositeEditor editor = new CompositeEditor(name, label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name, label),
new TextFieldEditor(name, label, defaultValue),
new ButtonFieldEditor(name, action, defaultValue)});
action.setFieldEditor(editor);
return editor;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.seam.ui.widget.editor.IFieldEditorFactory#createBrowsePackageEditor(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
*/
public IFieldEditor createBrowsePackageEditor(String name, String label, String initSourceFolderPath, String defaultValue) {
ButtonFieldEditor.ButtonPressedAction action = new SelectJavaPackageAction(CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_BROWS, initSourceFolderPath, defaultValue);
IFieldEditor editor = createButtonFieldEditor(
name, label, defaultValue,
action, ValidatorFactory.NO_ERRORS_VALIDATOR);
return editor;
}
/**
* @param buttonName
* @return
*/
public ButtonFieldEditor.ButtonPressedAction createSelectSourceFolderAction(String buttonName, final String initPath) {
ButtonFieldEditor.ButtonPressedAction action = new ButtonFieldEditor.ButtonPressedAction(buttonName) {
private String inerInitPath;
/*
* (non-Javadoc)
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
final ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
Display.getCurrent().getActiveShell(),
new JavaElementLabelProvider(), new JavaSourceContentProvider());
dialog.setInput(ResourcesPlugin.getWorkspace());
String path = inerInitPath!=null?inerInitPath:initPath;
IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if (resource!=null) {
IProject project = resource.getProject();
if (project!=null && project.isOpen()) {
IJavaProject javaProject = EclipseUtil.getJavaProject(project);
try {
IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots();
for (int i= 0; i < roots.length; i++) {
if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE && roots[i].getResource().equals(resource)) {
dialog.setInitialSelection(roots[i]);
break;
}
}
} catch (JavaModelException e) {
CommonUIPlugin.getDefault().logError(e);
}
}
}
dialog.setValidator(new ISelectionStatusValidator(){
public IStatus validate(Object[] selection) {
if(selection.length>0) {
if(selection[0] instanceof IPackageFragmentRoot) {
return new Status(IStatus.OK, CommonUIPlugin.PLUGIN_ID, IStatus.OK, null, null);
}
}
return new Status(IStatus.ERROR, CommonUIPlugin.PLUGIN_ID, IStatus.ERROR, null, null);
}
});
dialog.setAllowMultiple(false);
dialog.setTitle(CommonUIMessages.SELECT_WORKSPACE_FOLDER_DIALOG_TITLE);
dialog.setMessage(CommonUIMessages.SELECT_WORKSPACE_FOLDER_DIALOG_MESSAGE);
if (dialog.open() == Window.OK) {
IPackageFragmentRoot pack = (IPackageFragmentRoot) dialog.getFirstResult();
IPath newPath = pack.getResource().getFullPath();
String value = newPath.toString();
inerInitPath = value;
getFieldEditor().setValue(value);
}
}
};
return action;
}
/**
* @author Alexey Kazakov
*/
private static class JavaSourceContentProvider extends StandardJavaElementContentProvider {
boolean providePackages = false;
public JavaSourceContentProvider() {
super(false);
}
public JavaSourceContentProvider(boolean providePackages) {
this();
this.providePackages = providePackages;
}
/*
* (non-Javadoc)
* @see org.eclipse.jdt.ui.StandardJavaElementContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren(Object element) {
if (element instanceof IPackageFragmentRoot) {
return providePackages;
} else if(element instanceof IPackageFragment) {
return false;
}
return true;
}
/*
* (non-Javadoc)
* @see org.eclipse.jdt.ui.StandardJavaElementContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren(Object element) {
if (!exists(element)) {
return NO_CHILDREN;
}
if (element instanceof IWorkspace) {
IWorkbenchAdapter adapter = Adapters.adapt(element, IWorkbenchAdapter.class);
if (adapter != null) {
Object[] children = adapter.getChildren(element);
List<Object> result = new ArrayList<Object>();
for (int i = 0; i < children.length; i++) {
if(children[i] instanceof IProject) {
if(EclipseUtil.getJavaProject((IProject)children[i])!=null) {
result.add(children[i]);
}
}
}
return result.toArray(new Object[]{});
}
return new Object[0];
}
if (element instanceof IProject) {
element = EclipseUtil.getJavaProject((IProject)element);
if(element==null) {
return NO_CHILDREN;
}
}
if (element instanceof IJavaProject) {
try {
return getPackageFragmentRoots((IJavaProject)element);
} catch (JavaModelException e) {
CommonUIPlugin.getDefault().logError(e);
return NO_CHILDREN;
}
}
if (element instanceof IPackageFragmentRoot) {
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot)element;
try {
return pkgRoot.getChildren();
} catch (JavaModelException e) {
return NO_CHILDREN;
}
}
return super.getChildren(element);
}
protected Object[] getPackageFragmentRoots(IJavaProject project) throws JavaModelException {
if (!project.getProject().isOpen()) {
return NO_CHILDREN;
}
IPackageFragmentRoot[] roots= project.getPackageFragmentRoots();
List<IPackageFragmentRoot> list= new ArrayList<IPackageFragmentRoot>(roots.length);
for (int i= 0; i < roots.length; i++) {
IPackageFragmentRoot root = roots[i];
if (!isProjectPackageFragmentRoot(root) && root.getKind() == IPackageFragmentRoot.K_SOURCE) {
list.add(root);
}
}
return list.toArray();
}
}
/**
*
*/
public IFieldEditor createBrowseFileEditor(String name, String label, String defaultValue) {
CompositeEditor editor = new CompositeEditor(name, label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,label),
new TextFieldEditor(name,label, defaultValue),
new ButtonFieldEditor(name,createSelectFileAction(CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_BROWS),defaultValue)});
return editor;
}
/**
*
*/
public IFieldEditor createButtonFieldEditor(String name, String label, String defaultValue, ButtonFieldEditor.ButtonPressedAction action, IValidator validator ) {
return createButtonFieldEditor(name, label, defaultValue, action, validator, null);
}
public IFieldEditor createButtonFieldEditor(String name, String label, String defaultValue, ButtonFieldEditor.ButtonPressedAction action, IValidator validator, String description) {
CompositeEditor editor = new CompositeEditor(name,label, defaultValue);
editor.addFieldEditors(new IFieldEditor[]{new LabelFieldEditor(name,label, description),
new TextFieldEditor(name,label, defaultValue),
new ButtonFieldEditor(name,action,defaultValue)});
return editor;
}
public IFieldEditor createButtonFieldEditor(String name, String label, String defaultValue, ButtonFieldEditor.ButtonPressedAction[] actions, IValidator validator ) {
CompositeEditor editor = new CompositeEditor(name,label, defaultValue);
List<IFieldEditor> editors = new ArrayList<IFieldEditor>();
editors.add(new LabelFieldEditor(name,label));
editors.add(new TextFieldEditor(name,label, defaultValue));
for (int i = 0; i < actions.length; i++) {
editors.add(new ButtonFieldEditor(name,actions[i],defaultValue));
}
editor.addFieldEditors(editors.toArray(new IFieldEditor[0]));
return editor;
}
public IFieldEditor createButtonAndLinkFieldEditor(String name, String label, String defaultValue, ButtonFieldEditor.ButtonPressedAction buttonAction, ButtonFieldEditor.ButtonPressedAction linkAction, IValidator validator) {
CompositeEditor editor = new CompositeEditor(name,label, defaultValue);
List<IFieldEditor> editors = new ArrayList<IFieldEditor>();
editors.add(new LabelFieldEditor(name,label));
editors.add(new TextFieldEditor(name,label, defaultValue));
editors.add(new ButtonFieldEditor(name, buttonAction, defaultValue));
editors.add(new LinkFieldEditor(name, linkAction, defaultValue));
editor.addFieldEditors(editors.toArray(new IFieldEditor[0]));
return editor;
}
/**
* @param buttonName
* @return
*/
public ButtonFieldEditor.ButtonPressedAction createSelectFolderAction(String buttonName) {
return new ButtonFieldEditor.ButtonPressedAction(buttonName) {
@Override
public void run() {
DirectoryDialog dialog = new DirectoryDialog(Display.getCurrent().getActiveShell());
dialog.setFilterPath(getFieldEditor().getValueAsString());
dialog.setMessage(CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_SELECT_SEAM_HOME_FOLDER);
dialog.setFilterPath(getFieldEditor().getValueAsString());
String directory = dialog.open();
if(directory!=null) {
getFieldEditor().setValue(directory);
}
}
};
}
/**
* @param buttonName
* @return
*/
public ButtonFieldEditor.ButtonPressedAction createSelectWorkspaceFolderAction(String buttonName, final String initPath) {
ButtonFieldEditor.ButtonPressedAction action = new ButtonFieldEditor.ButtonPressedAction(buttonName) {
private String inerInitPath;
/*
* (non-Javadoc)
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
Display.getCurrent().getActiveShell(),
new WorkbenchLabelProvider(), new WorkbenchContentProvider());
dialog.setInput(ResourcesPlugin.getWorkspace());
String path = inerInitPath!=null?inerInitPath:initPath;
IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if (resource!=null) {
dialog.setInitialSelection(resource);
}
dialog.addFilter(new ViewerFilter() {
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IFolder || element instanceof IProject) {
return true;
}
return false;
}
});
dialog.setAllowMultiple(false);
dialog.setTitle(CommonUIMessages.SELECT_WORKSPACE_FOLDER_DIALOG_TITLE);
dialog.setMessage(CommonUIMessages.SELECT_WORKSPACE_FOLDER_DIALOG_MESSAGE);
if (dialog.open() == Window.OK) {
IResource res = (IResource) dialog.getFirstResult();
IPath newPath = res.getFullPath();
String value = newPath.toString();
inerInitPath = value;
getFieldEditor().setValue(value);
}
}
};
return action;
}
private static class SelectJavaPackageAction extends ButtonFieldEditor.ButtonPressedAction {
private String defaultSourceFolderPath;
public SelectJavaPackageAction(String buttonName, String defaultSourceFolderPath, String defaultPackageName) {
super(buttonName);
this.defaultSourceFolderPath = defaultSourceFolderPath;
}
@Override
public void run() {
String sourceFolder = (String)getFieldEditor().getData(IParameter.SOURCE_FOLDER_PATH);
if(sourceFolder==null) {
sourceFolder = defaultSourceFolderPath;
}
if(sourceFolder == null) {
CommonUIPlugin.getDefault().logError("Can't init source folder");
return;
}
IResource initSourceFolder = ResourcesPlugin.getWorkspace().getRoot().findMember(sourceFolder);
if(initSourceFolder == null) {
CommonUIPlugin.getDefault().logError("Can't find source folder: " + defaultSourceFolderPath);
return;
}
IProject project = initSourceFolder.getProject();
if(project == null) {
CommonUIPlugin.getDefault().logError("Can't find project for: " + defaultSourceFolderPath);
return;
}
IJavaProject javaProject = EclipseUtil.getJavaProject(project);
if(javaProject == null) {
CommonUIPlugin.getDefault().logError("Can't find java project for: " + defaultSourceFolderPath);
return;
}
IPackageFragmentRoot packageFragmentRoot = null;
IPackageFragmentRoot[] roots;
try {
roots = javaProject.getPackageFragmentRoots();
for (int i = 0; i < roots.length; i++) {
if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE && roots[i].getResource().equals(initSourceFolder)) {
packageFragmentRoot = roots[i];
break;
}
}
} catch (JavaModelException e) {
CommonUIPlugin.getDefault().logError(e);
}
if (packageFragmentRoot == null) {
packageFragmentRoot = javaProject.getPackageFragmentRoot(javaProject.getResource());
}
if (packageFragmentRoot == null) {
CommonUIPlugin.getDefault().logError("Can't find source folder for project " + project.getName());
return;
}
IJavaElement[] packages = null;
try {
packages = packageFragmentRoot.getChildren();
} catch (JavaModelException e) {
CommonUIPlugin.getDefault().logError(e);
}
if (packages == null) {
packages = new IJavaElement[0];
}
String initialValue = getFieldEditor().getValue().toString();
IJavaElement initialElement = null;
ArrayList<IJavaElement> packagesWithoutDefaultPackage = new ArrayList<IJavaElement>();
for (IJavaElement packageElement : packages) {
String packageName = packageElement.getElementName();
if(packageName.length()>0) {
packagesWithoutDefaultPackage.add(packageElement);
if(packageName.equals(initialValue)) {
initialElement = packageElement;
}
}
}
packages = (IJavaElement[])packagesWithoutDefaultPackage.toArray(new IJavaElement[packagesWithoutDefaultPackage.size()]);
ElementListSelectionDialog dialog = new ElementListSelectionDialog(Display.getCurrent().getActiveShell(), new JavaElementLabelProvider(
JavaElementLabelProvider.SHOW_DEFAULT));
dialog.setTitle(J2EEUIMessages.PACKAGE_SELECTION_DIALOG_TITLE);
dialog.setMessage(J2EEUIMessages.PACKAGE_SELECTION_DIALOG_DESC);
dialog.setEmptyListMessage(J2EEUIMessages.PACKAGE_SELECTION_DIALOG_MSG_NONE);
dialog.setElements(packages);
if(initialElement!=null) {
dialog.setInitialSelections(new Object[]{initialElement});
}
if (dialog.open() == Window.OK) {
IPackageFragment fragment = (IPackageFragment) dialog.getFirstResult();
if (fragment != null) {
getFieldEditor().setValue(fragment.getElementName());
} else {
getFieldEditor().setValue("");
}
}
}
}
/**
*
* @param buttonName
* @return
*/
public ButtonFieldEditor.ButtonPressedAction createSelectFileAction(String buttonName) {
return new ButtonFieldEditor.ButtonPressedAction(buttonName) {
@Override
public void run() {
FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell());
dialog.setFilterPath(getFieldEditor().getValueAsString());
dialog.setText(CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_SELECT_SEAM_HOME_FOLDER);
dialog.setFilterPath(getFieldEditor().getValueAsString());
String directory = dialog.open();
if(directory!=null) {
getFieldEditor().setValue(directory);
}
}
};
}
/**
*
*/
public ButtonFieldEditor.ButtonPressedAction createNotImplementedYetAction(String buttonName) {
return new ButtonFieldEditor.ButtonPressedAction(buttonName) {
@Override
public void run() {
new MessageDialog(Display.getCurrent().getActiveShell(), CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_ERROR,
null, CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_NOT_IMPLEMENTED_YET, MessageDialog.ERROR, new String[]{CommonUIMessages.SWT_FIELD_EDITOR_FACTORY_OK},1)
.open();
}
};
}
/**
*
*/
public IFieldEditor createComboWithTwoButtons(String name, String label,
List values, Object defaultValue, boolean flat,
ButtonPressedAction action1, ButtonPressedAction action2,
IValidator validator) {
CompositeEditor editor = new CompositeEditor(name,label,defaultValue);
editor.addFieldEditors(new IFieldEditor[]{
new LabelFieldEditor(name,label),
new ComboFieldEditor(name,label, values, defaultValue, false),
new ButtonFieldEditor(name, action1, defaultValue),
new ButtonFieldEditor(name, action2, defaultValue)
});
return editor;
}
/**
*
*/
public IFieldEditor createComboWithButton(String name, String label,
List values, Object defaultValue, boolean flat,
ButtonPressedAction action1,
IValidator validator) {
CompositeEditor editor = new CompositeEditor(name,label,defaultValue);
editor.addFieldEditors(new IFieldEditor[]{
new LabelFieldEditor(name,label),
new ComboFieldEditor(name,label, values, defaultValue, false),
new ButtonFieldEditor(name, action1, defaultValue)
});
return editor;
}
}