org.eclipse.jst.jsf.common.ui.internal.dialogfield.SourceFolderButtonDialogField.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jst.jsf.common.ui.internal.dialogfield.SourceFolderButtonDialogField.java

Source

/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.dialogfield;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.JavaElementComparator;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;

/**
 * This class provides a source folder selection DialogFiled. There are two
 * conditions: 1. If you set the IProject instance, the source folder selection
 * will only be limited in the specified project 2. If you set null, the source
 * folder selection is allowed in all workspaces
 * 
 * 
 * @author mengbo
 * @version 1.5
 */
public class SourceFolderButtonDialogField extends StringButtonDialogField {
    /** Create the logger for this class */
    private static Logger _log = JSFUICommonPlugin.getLogger(SourceFolderButtonDialogField.class);

    /**
     * package fragment root corresponding to the input type (can be null)
     */
    private IPackageFragmentRoot _fCurrRoot;

    private IProject _project;

    /**
     * @param project 
     */
    public SourceFolderButtonDialogField(IProject project) {
        super(null);

        _project = project;

        setLabelText(DialogFieldResources.getInstance().getString("SourceFolderButtonDialogField.container.label")); //$NON-NLS-1$

        setButtonLabel(
                DialogFieldResources.getInstance().getString("SourceFolderButtonDialogField.container.button")); //$NON-NLS-1$

        setStringButtonAdapter(new IStringButtonAdapter() {
            public void changeControlPressed(DialogField field) {
                containerChangeControlPressed(field);
            }

        });
    }

    /**
     * @return Returns the project.
     */
    public IProject getProject() {
        return _project;
    }

    /**
     * @param project
     *            The project to set.
     */
    public void setProject(IProject project) {
        this._project = project;
    }

    /**
     * @param field
     */
    protected void containerChangeControlPressed(DialogField field) {
        // take the current jproject as init element of the dialog
        IPackageFragmentRoot root = getPackageFragmentRoot();
        root = chooseSourceContainer(root);
        if (root != null) {
            setPackageFragmentRoot(root, true);
        }
    }

    /**
     * Sets the current source folder (model and text field) to the given
     * package fragment root.
     * 
     * @param root
     *            The new root.
     * @param canBeModified
     *            if <code>false</code> the source folder field can not be
     *            changed by the user. If <code>true</code> the field is
     *            editable
     */
    public void setPackageFragmentRoot(IPackageFragmentRoot root, boolean canBeModified) {
        _fCurrRoot = root;
        String str = (root == null) ? "" : root.getPath().makeRelative().toString(); //$NON-NLS-1$
        setText(str);
        setEnabled(canBeModified);
    }

    /**
     * Returns the <code>IPackageFragmentRoot</code> that corresponds to the
     * current value of the source folder field.
     * 
     * @return the IPackageFragmentRoot or <code>null</code> if the current
     *         source folder value is not a valid package fragment root
     * 
     */
    public IPackageFragmentRoot getPackageFragmentRoot() {
        return _fCurrRoot;
    }

    /**
     * Returns the current text of source folder text field.
     * 
     * @return the text of the source folder text field
     */
    public String getPackageFragmentRootText() {
        return getText();
    }

    /**
     * choose source container dialog
     * 
     * @param initElement
     * @return
     */
    private IPackageFragmentRoot chooseSourceContainer(IJavaElement initElement) {
        Class[] acceptedClasses = new Class[] { IPackageFragmentRoot.class, IJavaProject.class, };

        TypedElementSelectionValidator validator = new TypedElementSelectionValidator(acceptedClasses, false) {
            // TODO: never used
            //         public boolean isSelectedValid(Object element) {
            //            try {
            //               if (element instanceof IJavaProject) {
            //                  IJavaProject jproject = (IJavaProject) element;
            //                  IPath path = jproject.getProject().getFullPath();
            //                  return (jproject.findPackageFragmentRoot(path) != null);
            //               } else if (element instanceof IPackageFragmentRoot) {
            //                  return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
            //               }
            //               return true;
            //            } catch (JavaModelException e) {
            //               _log.error("JavaModelException"); // just log, no ui in
            //               // validation
            //            }
            //            return false;
            //         }
        };

        acceptedClasses = new Class[] { IJavaModel.class, IPackageFragmentRoot.class, IJavaProject.class, };
        ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
            public boolean select(Viewer viewer, Object parent, Object element) {
                if (element instanceof IPackageFragmentRoot) {
                    try {
                        return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
                    } catch (JavaModelException e) {
                        _log.error(e); // just log, no ui
                        // in validation
                        return false;
                    }
                }
                return super.select(viewer, parent, element);
            }
        };

        StandardJavaElementContentProvider provider = new StandardJavaElementContentProvider();
        ILabelProvider labelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
        ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), labelProvider, provider);
        dialog.setValidator(validator);
        dialog.setComparator(new JavaElementComparator());
        // HibernateWizardPage.ChooseSourceContainerDialog.Title = Folder
        // Selection
        dialog.setTitle(DialogFieldResources.getInstance()
                .getString("SourceFolderButtonDialogField.ChooseSourceContainerDialog.Title")); //$NON-NLS-1$
        // HibernateWizardPage.ChooseSourceContainerDialog.Description = Choose
        // a folder:
        dialog.setMessage(DialogFieldResources.getInstance()
                .getString("SourceFolderButtonDialogField.ChooseSourceContainerDialog.Description")); //$NON-NLS-1$
        dialog.addFilter(filter);
        if (_project != null) {
            dialog.setInput(JavaCore.create(_project));
        } else {
            dialog.setInput(JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()));
        }
        dialog.setInitialSelection(initElement);

        if (dialog.open() == Window.OK) {
            Object element = dialog.getFirstResult();
            if (element instanceof IJavaProject) {
                IJavaProject jproject = (IJavaProject) element;
                return jproject.getPackageFragmentRoot(jproject.getProject());
            } else if (element instanceof IPackageFragmentRoot) {
                return (IPackageFragmentRoot) element;
            }
            return null;
        }
        return null;
    }

    /**
     * This method updates the model and returns an error status. The underlying
     * model is only valid if the returned status is OK.
     * 
     * @return the model's error status
     */
    public IStatus getChangedStatus() {
        StatusInfo status = new StatusInfo();

        _fCurrRoot = null;
        String str = getPackageFragmentRootText();
        if (str.length() == 0) {
            // SourceFolderButtonDialogField.error.EnterContainerName = Folder
            // name is empty.
            status.setError(DialogFieldResources.getInstance()
                    .getString("SourceFolderButtonDialogField.error.EnterContainerName")); //$NON-NLS-1$
            return status;
        }
        IPath path = new Path(str);
        IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
        if (res != null) {
            int resType = res.getType();
            if (resType == IResource.PROJECT || resType == IResource.FOLDER) {
                IProject proj = res.getProject();
                if (!proj.isOpen()) {
                    status.setError(DialogFieldResources.getInstance().getString(
                            "SourceFolderButtonDialogField.error.ProjectClosed", proj.getFullPath().toString())); //$NON-NLS-1$
                    return status;
                }
                if (_project != null && proj != _project) {
                    // HibernateWizardPage.error.NotSameProject = The project
                    // should be \''{0}\''.
                    status.setError(DialogFieldResources.getInstance()
                            .getString("SourceFolderButtonDialogField.error.NotSameProject", _project.getName())); //$NON-NLS-1$
                    return status;
                }
                IJavaProject jproject = JavaCore.create(proj);
                _fCurrRoot = jproject.getPackageFragmentRoot(res);
                if (res.exists()) {
                    try {
                        if (!proj.hasNature(JavaCore.NATURE_ID)) {
                            if (resType == IResource.PROJECT) {
                                status.setError(DialogFieldResources.getInstance().getString(
                                        "SourceFolderButtonDialogField.warning.NotAJavaProject", proj.getName())); //$NON-NLS-1$
                            } else {
                                status.setWarning(DialogFieldResources.getInstance().getString(
                                        "SourceFolderButtonDialogField.warning.NotInAJavaProject", proj.getName())); //$NON-NLS-1$
                            }
                            return status;
                        }
                    } catch (CoreException e) {
                        status.setWarning(DialogFieldResources.getInstance().getString(
                                "SourceFolderButtonDialogField.warning.NotAJavaProject", proj.getName())); //$NON-NLS-1$
                    }
                    if (!jproject.isOnClasspath(_fCurrRoot)) {
                        status.setWarning(DialogFieldResources.getInstance()
                                .getString("SourceFolderButtonDialogField.warning.NotOnClassPath", str)); //$NON-NLS-1$
                    }
                    if (_fCurrRoot.isArchive()) {
                        status.setError(DialogFieldResources.getInstance()
                                .getString("SourceFolderButtonDialogField.error.ContainerIsBinary", str)); //$NON-NLS-1$
                        return status;
                    }
                }
                return status;
            }
            status.setError(DialogFieldResources.getInstance()
                    .getString("SourceFolderButtonDialogField.error.NotAFolder", str)); //$NON-NLS-1$
            return status;
        }
        status.setError(DialogFieldResources.getInstance()
                .getString("SourceFolderButtonDialogField.error.ContainerDoesNotExist", str)); //$NON-NLS-1$
        return status;
    }

}