ext.org.eclipse.jdt.internal.ui.jarpackager.JarPackageWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for ext.org.eclipse.jdt.internal.ui.jarpackager.JarPackageWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     Ferenc Hechler, ferenc_hechler@users.sourceforge.net - 83258 [jar exporter] Deploy java application as executable jar
 *******************************************************************************/
package ext.org.eclipse.jdt.internal.ui.jarpackager;

import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
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.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.TreeItem;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;

import org.eclipse.core.resources.IFile;
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.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.IWizardPage;

import org.eclipse.ui.PlatformUI;

import org.eclipse.ltk.core.refactoring.RefactoringCore;
import org.eclipse.ltk.core.refactoring.history.IRefactoringHistoryService;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistory;

import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.refactoring.descriptors.JavaRefactoringDescriptor;
import org.eclipse.jdt.ui.JavaElementComparator;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.ProblemsLabelDecorator;
import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
import org.eclipse.jdt.ui.jarpackager.JarPackageData;

import ext.org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
import ext.org.eclipse.jdt.internal.ui.filters.EmptyInnerPackageFilter;
import ext.org.eclipse.jdt.internal.ui.util.ExceptionHandler;
import ext.org.eclipse.jdt.internal.ui.util.SWTUtil;

/**
 *   Page 1 of the JAR Package wizard
 */
class JarPackageWizardPage extends AbstractJarDestinationWizardPage {

    private JarPackageData fJarPackage;
    private IStructuredSelection fInitialSelection;
    private CheckboxTreeAndListGroup fInputGroup;

    // widgets
    private Button fExportClassFilesCheckbox;
    private Button fExportOutputFoldersCheckbox;
    private Button fExportJavaFilesCheckbox;
    private Button fExportRefactoringsCheckbox;
    private Link fRefactoringLink;

    private Button fCompressCheckbox;
    private Button fOverwriteCheckbox;
    private Button fIncludeDirectoryEntriesCheckbox;
    private boolean fInitiallySelecting = true;

    // dialog store id constants
    private static final String PAGE_NAME = "JarPackageWizardPage"; //$NON-NLS-1$

    private static final String STORE_EXPORT_CLASS_FILES = PAGE_NAME + ".EXPORT_CLASS_FILES"; //$NON-NLS-1$
    private static final String STORE_EXPORT_OUTPUT_FOLDERS = PAGE_NAME + ".EXPORT_OUTPUT_FOLDER"; //$NON-NLS-1$
    private static final String STORE_EXPORT_JAVA_FILES = PAGE_NAME + ".EXPORT_JAVA_FILES"; //$NON-NLS-1$

    private static final String STORE_REFACTORINGS = PAGE_NAME + ".REFACTORINGS"; //$NON-NLS-1$
    private static final String STORE_COMPRESS = PAGE_NAME + ".COMPRESS"; //$NON-NLS-1$
    private final static String STORE_OVERWRITE = PAGE_NAME + ".OVERWRITE"; //$NON-NLS-1$
    private final static String STORE_INCLUDE_DIRECTORY_ENTRIES = PAGE_NAME + ".INCLUDE_DIRECTORY_ENTRIES"; //$NON-NLS-1$

    // other constants
    private static final int SIZING_SELECTION_WIDGET_WIDTH = 480;
    private static final int SIZING_SELECTION_WIDGET_HEIGHT = 150;

    /**
     *   Create an instance of this class
     *
     * @param jarPackage an object containing all required information to make an export
     * @param selection the initial selection
     */
    public JarPackageWizardPage(JarPackageData jarPackage, IStructuredSelection selection) {
        super(PAGE_NAME, selection, jarPackage);
        setTitle(JarPackagerMessages.JarPackageWizardPage_title);
        setDescription(JarPackagerMessages.JarPackageWizardPage_description);
        fJarPackage = jarPackage;
        fInitialSelection = selection;
    }

    /*
     * Method declared on IDialogPage.
     */
    @Override
    public void createControl(final Composite parent) {

        initializeDialogUnits(parent);

        Composite composite = new Composite(parent, SWT.NULL);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));

        createPlainLabel(composite, JarPackagerMessages.JarPackageWizardPage_whatToExport_label);
        createInputGroup(composite);

        createExportTypeGroup(composite);

        new Label(composite, SWT.NONE); // vertical spacer

        createPlainLabel(composite, JarPackagerMessages.JarPackageWizardPage_whereToExport_label);
        createDestinationGroup(composite);

        createPlainLabel(composite, JarPackagerMessages.JarPackageWizardPage_options_label);
        createOptionsGroup(composite);

        restoreResourceSpecificationWidgetValues(); // superclass API defines this hook
        restoreWidgetValues();
        if (fInitialSelection != null)
            BusyIndicator.showWhile(parent.getDisplay(), new Runnable() {
                public void run() {
                    setupBasedOnInitialSelections();
                }
            });

        setControl(composite);
        update();
        fRefactoringLink.setEnabled(fExportRefactoringsCheckbox.getSelection());
        giveFocusToDestination();

        Dialog.applyDialogFont(composite);
        PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IJavaHelpContextIds.JARPACKAGER_WIZARD_PAGE);
    }

    /**
     *   Create the export options specification widgets.
     *
     *   @param parent org.eclipse.swt.widgets.Composite
     */
    @Override
    protected void createOptionsGroup(Composite parent) {
        Composite optionsGroup = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        optionsGroup.setLayout(layout);

        fCompressCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fCompressCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_compress_text);
        fCompressCheckbox.addListener(SWT.Selection, this);

        fIncludeDirectoryEntriesCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fIncludeDirectoryEntriesCheckbox
                .setText(JarPackagerMessages.JarPackageWizardPage_includeDirectoryEntries_text);
        fIncludeDirectoryEntriesCheckbox.addListener(SWT.Selection, this);

        fOverwriteCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fOverwriteCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_overwrite_text);
        fOverwriteCheckbox.addListener(SWT.Selection, this);
    }

    /**
     * Returns an iterator over this page's collection of currently-specified
     * elements to be exported. This is the primary element selection facility
     * accessor for subclasses.
     *
     * @return an iterator over the collection of elements currently selected for export
     */
    @Override
    protected Iterator<Object> getSelectedResourcesIterator() {
        return fInputGroup.getAllCheckedListItems();
    }

    /**
     * Persists resource specification control setting that are to be restored
     * in the next instance of this page. Subclasses wishing to persist
     * settings for their controls should extend the hook method
     * <code>internalSaveWidgetValues</code>.
     */
    @Override
    public final void saveWidgetValues() {
        super.saveWidgetValues();
        // update directory names history
        IDialogSettings settings = getDialogSettings();
        if (settings != null) {
            settings.put(STORE_EXPORT_CLASS_FILES, fJarPackage.areClassFilesExported());
            settings.put(STORE_EXPORT_OUTPUT_FOLDERS, fJarPackage.areOutputFoldersExported());
            settings.put(STORE_EXPORT_JAVA_FILES, fJarPackage.areJavaFilesExported());

            // options
            settings.put(STORE_REFACTORINGS, fJarPackage.isRefactoringAware());
            settings.put(STORE_COMPRESS, fJarPackage.isCompressed());
            settings.put(STORE_INCLUDE_DIRECTORY_ENTRIES, fJarPackage.areDirectoryEntriesIncluded());
            settings.put(STORE_OVERWRITE, fJarPackage.allowOverwrite());
        }
        // Allow subclasses to save values
        internalSaveWidgetValues();
    }

    /**
     * Hook method for subclasses to persist their settings.
     */
    @Override
    protected void internalSaveWidgetValues() {
    }

    /**
     *   Hook method for restoring widget values to the values that they held
     *   last time this wizard was used to completion.
     */
    @Override
    protected void restoreWidgetValues() {
        if (!((JarPackageWizard) getWizard()).isInitializingFromJarPackage())
            initializeJarPackage();

        fExportClassFilesCheckbox.setSelection(fJarPackage.areClassFilesExported());
        fExportOutputFoldersCheckbox.setSelection(fJarPackage.areOutputFoldersExported());
        fExportJavaFilesCheckbox.setSelection(fJarPackage.areJavaFilesExported());

        super.restoreWidgetValues();

        // options
        if (fExportRefactoringsCheckbox != null)
            fExportRefactoringsCheckbox.setSelection(fJarPackage.isRefactoringAware());
        fCompressCheckbox.setSelection(fJarPackage.isCompressed());
        fIncludeDirectoryEntriesCheckbox.setSelection(fJarPackage.areDirectoryEntriesIncluded());
        fOverwriteCheckbox.setSelection(fJarPackage.allowOverwrite());
    }

    /**
     *   Initializes the JAR package from last used wizard page values.
     */
    @Override
    protected void initializeJarPackage() {
        super.initializeJarPackage();

        IDialogSettings settings = getDialogSettings();
        if (settings != null) {
            // source
            fJarPackage.setElements(getSelectedElements());
            fJarPackage.setExportClassFiles(settings.getBoolean(STORE_EXPORT_CLASS_FILES));
            fJarPackage.setExportOutputFolders(settings.getBoolean(STORE_EXPORT_OUTPUT_FOLDERS));
            fJarPackage.setExportJavaFiles(settings.getBoolean(STORE_EXPORT_JAVA_FILES));

            // options
            fJarPackage.setRefactoringAware(settings.getBoolean(STORE_REFACTORINGS));
            fJarPackage.setCompress(settings.getBoolean(STORE_COMPRESS));
            fJarPackage.setIncludeDirectoryEntries(settings.getBoolean(STORE_INCLUDE_DIRECTORY_ENTRIES));
            fJarPackage.setOverwrite(settings.getBoolean(STORE_OVERWRITE));
        }
    }

    /**
     *   Stores the widget values in the JAR package.
     */
    @Override
    protected void updateModel() {
        if (getControl() == null)
            return;

        // source
        if (fExportClassFilesCheckbox.getSelection() && !fJarPackage.areClassFilesExported())
            fExportOutputFoldersCheckbox.setSelection(false);
        if (fExportOutputFoldersCheckbox.getSelection() && !fJarPackage.areOutputFoldersExported())
            fExportClassFilesCheckbox.setSelection(false);
        fJarPackage.setExportClassFiles(fExportClassFilesCheckbox.getSelection());
        fJarPackage.setExportOutputFolders(fExportOutputFoldersCheckbox.getSelection());
        fJarPackage.setExportJavaFiles(fExportJavaFilesCheckbox.getSelection());
        fJarPackage.setElements(getSelectedElements());

        super.updateModel();
        // options
        if (fExportRefactoringsCheckbox != null)
            fJarPackage.setRefactoringAware(fExportRefactoringsCheckbox.getSelection());
        else
            fJarPackage.setRefactoringAware(false);
        fJarPackage.setCompress(fCompressCheckbox.getSelection());
        fJarPackage.setIncludeDirectoryEntries(fIncludeDirectoryEntriesCheckbox.getSelection());
        fJarPackage.setOverwrite(fOverwriteCheckbox.getSelection());
    }

    /**
     * Returns the resource for the specified path.
     *
     * @param path   the path for which the resource should be returned
     * @return the resource specified by the path or <code>null</code>
     */
    protected IResource findResource(IPath path) {
        IWorkspace workspace = ResourcesPlugin.getWorkspace();
        IStatus result = workspace.validatePath(path.toString(),
                IResource.ROOT | IResource.PROJECT | IResource.FOLDER | IResource.FILE);
        if (result.isOK() && workspace.getRoot().exists(path))
            return workspace.getRoot().findMember(path);
        return null;
    }

    /**
     * Creates the checkbox tree and list for selecting resources.
     *
     * @param parent the parent control
     */
    protected void createInputGroup(Composite parent) {
        int labelFlags = JavaElementLabelProvider.SHOW_BASICS | JavaElementLabelProvider.SHOW_OVERLAY_ICONS
                | JavaElementLabelProvider.SHOW_SMALL_ICONS;
        ITreeContentProvider treeContentProvider = new StandardJavaElementContentProvider() {
            @Override
            public boolean hasChildren(Object element) {
                // prevent the + from being shown in front of packages
                return !(element instanceof IPackageFragment) && super.hasChildren(element);
            }
        };
        final DecoratingLabelProvider provider = new DecoratingLabelProvider(
                new JavaElementLabelProvider(labelFlags), new ProblemsLabelDecorator(null));
        fInputGroup = new CheckboxTreeAndListGroup(parent,
                JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()), treeContentProvider, provider,
                new StandardJavaElementContentProvider(), provider, SWT.NONE, SIZING_SELECTION_WIDGET_WIDTH,
                SIZING_SELECTION_WIDGET_HEIGHT) {

            @Override
            protected void setTreeChecked(final Object element, final boolean state) {
                if (fInitiallySelecting && element instanceof IResource) {
                    final IResource resource = (IResource) element;
                    if (resource.getName().charAt(0) == '.')
                        return;
                }
                super.setTreeChecked(element, state);
            }
        };
        fInputGroup.addTreeFilter(new EmptyInnerPackageFilter());
        fInputGroup.setTreeComparator(new JavaElementComparator());
        fInputGroup.setListComparator(new JavaElementComparator());
        fInputGroup.addTreeFilter(new ContainerFilter(ContainerFilter.FILTER_NON_CONTAINERS));
        fInputGroup.addTreeFilter(new ViewerFilter() {
            @Override
            public boolean select(Viewer viewer, Object p, Object element) {
                if (element instanceof IPackageFragmentRoot) {
                    IPackageFragmentRoot root = (IPackageFragmentRoot) element;
                    return !root.isArchive() && !root.isExternal();
                }
                return true;
            }
        });
        fInputGroup.addListFilter(new ContainerFilter(ContainerFilter.FILTER_CONTAINERS));
        fInputGroup.getTree().addListener(SWT.MouseUp, this);
        fInputGroup.getTable().addListener(SWT.MouseUp, this);

        SWTUtil.setAccessibilityText(fInputGroup.getTree(),
                JarPackagerMessages.JarPackageWizardPage_tree_accessibility_message);
        SWTUtil.setAccessibilityText(fInputGroup.getTable(),
                JarPackagerMessages.JarPackageWizardPage_table_accessibility_message);

        ICheckStateListener listener = new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                update();
            }
        };

        fInputGroup.addCheckStateListener(listener);
    }

    /**
     * Creates the export type controls.
     *
     * @param parent
     *            the parent control
     */
    protected void createExportTypeGroup(Composite parent) {
        Composite optionsGroup = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        optionsGroup.setLayout(layout);

        fExportClassFilesCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fExportClassFilesCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_exportClassFiles_text);
        fExportClassFilesCheckbox.addListener(SWT.Selection, this);

        fExportOutputFoldersCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fExportOutputFoldersCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_exportOutputFolders_text);
        fExportOutputFoldersCheckbox.addListener(SWT.Selection, this);

        fExportJavaFilesCheckbox = new Button(optionsGroup, SWT.CHECK | SWT.LEFT);
        fExportJavaFilesCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_exportJavaFiles_text);
        fExportJavaFilesCheckbox.addListener(SWT.Selection, this);

        Composite refactoringsGroup = new Composite(optionsGroup, SWT.NONE);
        layout = new GridLayout();
        layout.horizontalSpacing = 0;
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.numColumns = 2;
        refactoringsGroup.setLayout(layout);

        fExportRefactoringsCheckbox = new Button(refactoringsGroup, SWT.CHECK | SWT.LEFT);
        fExportRefactoringsCheckbox.setText(JarPackagerMessages.JarPackageWizardPage_refactorings_text);
        fExportRefactoringsCheckbox.addListener(SWT.Selection, this);

        fRefactoringLink = new Link(refactoringsGroup, SWT.WRAP);
        fRefactoringLink.setText(JarPackagerMessages.JarPackageWizardPage_configure_label);
        fRefactoringLink.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent event) {
                openRefactoringDialog();
            }

        });
        fRefactoringLink.setToolTipText(JarPackagerMessages.JarPackageWizardPage_configure_tooltip);
        GridData data = new GridData(GridData.BEGINNING | GridData.GRAB_HORIZONTAL);
        fRefactoringLink.setLayoutData(data);

        fExportRefactoringsCheckbox.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent event) {
                fRefactoringLink.setEnabled(fExportRefactoringsCheckbox.getSelection());
            }
        });
    }

    /**
     * Opens the dialog to configure refactorings.
     */
    protected void openRefactoringDialog() {
        final RefactoringHistory[] history = { null };
        final IRefactoringHistoryService service = RefactoringCore.getHistoryService();
        try {
            service.connect();
            final Set<IProject> set = new HashSet<IProject>();
            final Object[] elements = fJarPackage.getElements();
            for (int index = 0; index < elements.length; index++) {
                if (elements[index] instanceof IAdaptable) {
                    final IAdaptable adaptable = (IAdaptable) elements[index];
                    final IResource resource = (IResource) adaptable.getAdapter(IResource.class);
                    if (resource != null)
                        set.add(resource.getProject());
                }
            }
            try {
                getContainer().run(false, true, new IRunnableWithProgress() {

                    public void run(final IProgressMonitor monitor)
                            throws InvocationTargetException, InterruptedException {
                        history[0] = service.getRefactoringHistory(set.toArray(new IProject[set.size()]), 0,
                                Long.MAX_VALUE, JavaRefactoringDescriptor.JAR_MIGRATION, monitor);
                    }
                });
            } catch (InvocationTargetException exception) {
                ExceptionHandler.handle(exception, getShell(),
                        JarPackagerMessages.JarPackageWizardPage_error_caption,
                        JarPackagerMessages.JarPackageWizardPage_error_label);
                return;
            } catch (InterruptedException exception) {
                return;
            }
            new JarRefactoringDialog(getShell(), getDialogSettings(), fJarPackage, history[0]).open();
            updatePageCompletion();
        } finally {
            service.disconnect();
        }
    }

    /**
     * Updates the enablement of this page's controls. Subclasses may extend.
     */
    @Override
    protected void updateWidgetEnablements() {
        if (fExportRefactoringsCheckbox != null) {
            final boolean selection = fExportRefactoringsCheckbox.getSelection();
            fIncludeDirectoryEntriesCheckbox.setEnabled(!selection);
            if (selection) {
                fIncludeDirectoryEntriesCheckbox.setSelection(true);
                fJarPackage.setIncludeDirectoryEntries(true);
            }
        }
    }

    /*
     * Overrides method from IJarPackageWizardPage
     */
    @Override
    public boolean isPageComplete() {
        boolean complete = validateSourceGroup();
        complete = validateDestinationGroup() && complete;
        complete = validateOptionsGroup() && complete;
        if (complete)
            setErrorMessage(null);
        return complete;
    }

    @Override
    protected void updatePageCompletion() {
        boolean pageComplete = isPageComplete();
        setPageComplete(pageComplete);
        if (pageComplete)
            setErrorMessage(null);
        updateRefactoringMessage();
    }

    protected void updateRefactoringMessage() {
        String currentMessage = getMessage();
        if (fJarPackage.isRefactoringAware() && fJarPackage.getRefactoringDescriptors().length == 0) {
            if (currentMessage == null)
                setMessage(JarPackagerMessages.JarPackageWizardPage_no_refactorings_selected,
                        IMessageProvider.INFORMATION);
        } else if (JarPackagerMessages.JarPackageWizardPage_no_refactorings_selected.equals(currentMessage))
            setMessage(null);
    }

    /*
     * Overrides method from WizardDataTransferPage
     */
    @Override
    protected boolean validateOptionsGroup() {
        return true;
    }

    /*
     * Overrides method from WizardDataTransferPage
     */
    @Override
    protected boolean validateSourceGroup() {
        if (!(fExportClassFilesCheckbox.getSelection() || fExportOutputFoldersCheckbox.getSelection()
                || fExportJavaFilesCheckbox.getSelection())) {
            setErrorMessage(JarPackagerMessages.JarPackageWizardPage_error_noExportTypeChecked);
            return false;
        }

        if (getSelectedResources().size() == 0) {
            if (getErrorMessage() != null)
                setErrorMessage(null);
            return false;
        }
        if (fExportClassFilesCheckbox.getSelection() || fExportOutputFoldersCheckbox.getSelection())
            return true;

        // Source file only export - check if there are source files
        Iterator<Object> iter = getSelectedResourcesIterator();
        while (iter.hasNext()) {
            Object element = iter.next();
            if (element instanceof IClassFile) {
                IPackageFragmentRoot root = (IPackageFragmentRoot) ((IClassFile) element)
                        .getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
                if (root == null)
                    continue;
                IClasspathEntry cpEntry;
                try {
                    cpEntry = root.getRawClasspathEntry();
                } catch (JavaModelException e) {
                    continue;
                }
                if (cpEntry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
                    return true;
                }
            } else {
                return true;
            }
        }

        if (getErrorMessage() != null)
            setErrorMessage(null);
        return false;
    }

    /**
     * Creates a file resource handle for the file with the given workspace path.
     * This method does not create the file resource; this is the responsibility
     * of <code>createFile</code>.
     *
     * @param filePath the path of the file resource to create a handle for
     * @return the new file resource handle
     */
    protected IFile createFileHandle(IPath filePath) {
        if (filePath.isValidPath(filePath.toString()) && filePath.segmentCount() >= 2)
            return ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
        else
            return null;
    }

    /*
     * Overrides method from WizardExportResourcePage
     */
    @Override
    protected void setupBasedOnInitialSelections() {
        Iterator<?> iterator = fInitialSelection.iterator();
        while (iterator.hasNext()) {
            Object selectedElement = iterator.next();

            if (selectedElement instanceof IResource && !((IResource) selectedElement).isAccessible())
                continue;

            if (selectedElement instanceof IJavaElement && !((IJavaElement) selectedElement).exists())
                continue;

            if (selectedElement instanceof ICompilationUnit || selectedElement instanceof IClassFile
                    || selectedElement instanceof IFile)
                fInputGroup.initialCheckListItem(selectedElement);
            else {
                if (selectedElement instanceof IFolder) {
                    // Convert resource to Java element if possible
                    IJavaElement je = JavaCore.create((IResource) selectedElement);
                    if (je != null && je.exists() && je.getJavaProject().isOnClasspath((IResource) selectedElement))
                        selectedElement = je;
                }
                try {
                    fInputGroup.initialCheckTreeItem(selectedElement);
                } finally {
                    fInitiallySelecting = false;
                }
            }
        }

        TreeItem[] items = fInputGroup.getTree().getItems();
        int i = 0;
        while (i < items.length && !items[i].getChecked())
            i++;
        if (i < items.length) {
            fInputGroup.getTree().setSelection(new TreeItem[] { items[i] });
            fInputGroup.getTree().showSelection();
            fInputGroup.populateListViewer(items[i].getData());
        }
    }

    /*
     * Method declared on IWizardPage.
     */
    @Override
    public void setPreviousPage(IWizardPage page) {
        super.setPreviousPage(page);
        if (getControl() != null)
            updatePageCompletion();
    }

    Object[] getSelectedElementsWithoutContainedChildren() {
        Set<Object> closure = removeContainedChildren(fInputGroup.getWhiteCheckedTreeItems());
        closure.addAll(getExportedNonContainers());
        return closure.toArray();
    }

    private Set<Object> removeContainedChildren(Set<Object> elements) {
        Set<Object> newList = new HashSet<Object>(elements.size());
        Set<Object> javaElementResources = getCorrespondingContainers(elements);
        Iterator<Object> iter = elements.iterator();
        boolean removedOne = false;
        while (iter.hasNext()) {
            Object element = iter.next();
            Object parent;
            if (element instanceof IResource)
                parent = ((IResource) element).getParent();
            else if (element instanceof IJavaElement) {
                parent = ((IJavaElement) element).getParent();
                if (parent instanceof IPackageFragmentRoot) {
                    IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) parent;
                    try {
                        if (pkgRoot.getCorrespondingResource() instanceof IProject)
                            parent = pkgRoot.getJavaProject();
                    } catch (JavaModelException ex) {
                        // leave parent as is
                    }
                }
            } else {
                // unknown type
                newList.add(element);
                continue;
            }
            if (element instanceof IJavaModel || ((!(parent instanceof IJavaModel))
                    && (elements.contains(parent) || javaElementResources.contains(parent))))
                removedOne = true;
            else
                newList.add(element);
        }
        if (removedOne)
            return removeContainedChildren(newList);
        else
            return newList;
    }

    private Set<Object> getExportedNonContainers() {
        Set<Object> whiteCheckedTreeItems = fInputGroup.getWhiteCheckedTreeItems();
        Set<Object> exportedNonContainers = new HashSet<Object>(whiteCheckedTreeItems.size());
        Set<Object> javaElementResources = getCorrespondingContainers(whiteCheckedTreeItems);
        Iterator<Object> iter = fInputGroup.getAllCheckedListItems();
        while (iter.hasNext()) {
            Object element = iter.next();
            Object parent = null;
            if (element instanceof IResource)
                parent = ((IResource) element).getParent();
            else if (element instanceof IJavaElement)
                parent = ((IJavaElement) element).getParent();
            if (!whiteCheckedTreeItems.contains(parent) && !javaElementResources.contains(parent))
                exportedNonContainers.add(element);
        }
        return exportedNonContainers;
    }

    /*
     * Create a list with the folders / projects that correspond
     * to the Java elements (Java project, package, package root)
     */
    private Set<Object> getCorrespondingContainers(Set<Object> elements) {
        Set<Object> javaElementResources = new HashSet<Object>(elements.size());
        Iterator<Object> iter = elements.iterator();
        while (iter.hasNext()) {
            Object element = iter.next();
            if (element instanceof IJavaElement) {
                IJavaElement je = (IJavaElement) element;
                int type = je.getElementType();
                if (type == IJavaElement.JAVA_PROJECT || type == IJavaElement.PACKAGE_FRAGMENT
                        || type == IJavaElement.PACKAGE_FRAGMENT_ROOT) {
                    // exclude default package since it is covered by the root
                    if (!(type == IJavaElement.PACKAGE_FRAGMENT
                            && ((IPackageFragment) element).isDefaultPackage())) {
                        Object resource;
                        try {
                            resource = je.getCorrespondingResource();
                        } catch (JavaModelException ex) {
                            resource = null;
                        }
                        if (resource != null)
                            javaElementResources.add(resource);
                    }
                }
            }
        }
        return javaElementResources;
    }

    private Object[] getSelectedElements() {
        return getSelectedResources().toArray();
    }
}