org.eclipse.sirius.common.ui.tools.api.wizard.SelectFilesWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.sirius.common.ui.tools.api.wizard.SelectFilesWizardPage.java

Source

/*
 * Copyright (c) 2005-2008 Obeo
 * 
 * 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:
 *    Obeo - initial API and implementation
 */

package org.eclipse.sirius.common.ui.tools.api.wizard;

import java.net.URL;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.osgi.framework.Bundle;

import com.google.common.collect.Lists;

// Disable checkstyle. This class comes from Acceleo.
// CHECKSTYLE:OFF

/**
 * The role of this wizard page is to make a collection of all of the checked
 * resources.
 * 
 * @author www.obeo.fr
 */
public class SelectFilesWizardPage extends WizardPage {

    private static final String JOKER = "*";

    // Constants
    private static final int SELECTION_WIDGET_WIDTH = 400;

    private static final int SELECTION_WIDGET_HEIGHT = 300;

    /**
     * The selection group.
     */
    private CheckboxTreeAndListGroup checkboxGroup;

    /**
     * The min length of the selection.
     */
    private int lower;

    /**
     * The max length of the selection.
     */
    private int upper;

    /**
     * The extensions.
     */
    private String[] extensions;

    private IResource initialResourceSelection;

    /**
     * Constructor.
     * 
     * @param pageName
     *            is the name of the page
     * @param lower
     *            is the min length of the selection
     * @param upper
     *            is the max length of the selection
     * @param extensions
     *            is a table of extensions
     */
    public SelectFilesWizardPage(final String pageName, final int lower, final int upper,
            final String[] extensions) {
        super(pageName);
        setTitle(pageName);
        setDescription("This page is used to select file(s) in the workspace."); //$NON-NLS-1$
        this.lower = lower;
        this.upper = upper;
        this.extensions = extensions;
    }

    public void setInitialSelection(final IStructuredSelection selection) {
        final Object element = selection.getFirstElement();
        if (element instanceof IResource) {
            initialResourceSelection = (IResource) element;
        }
    }

    /**
     * {@inheritDoc}
     * 
     * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(final Composite parent) {
        final Composite container = new Composite(parent, SWT.NULL);
        final GridLayout containerLayout = new GridLayout();
        containerLayout.numColumns = 1;
        containerLayout.marginTop = 14;
        containerLayout.verticalSpacing = 9;
        containerLayout.marginLeft = 7;
        containerLayout.marginRight = 7;
        container.setLayout(containerLayout);
        final WorkbenchLabelProvider treeLabelProvider = new WorkbenchLabelProvider();
        final WorkbenchLabelProvider listLabelProvider = new WorkbenchLabelProvider();
        checkboxGroup = new CheckboxTreeAndListGroup(container, ResourcesPlugin.getWorkspace().getRoot(),
                getContentProvider(IResource.FOLDER | IResource.PROJECT | IResource.ROOT), treeLabelProvider,
                getContentProvider(IResource.FILE), listLabelProvider, SWT.NONE, SELECTION_WIDGET_WIDTH,
                SELECTION_WIDGET_HEIGHT);
        checkboxGroup.addCheckStateListener(new ICheckStateListener() {
            public void checkStateChanged(CheckStateChangedEvent event) {
                dialogChanged();
            }
        });
        checkboxGroup.getTreeViewer().addOpenListener(new IOpenListener() {
            public void open(OpenEvent event) {
                ISelection selection = event.getSelection();
                if (!selection.isEmpty() && selection instanceof StructuredSelection) {
                    checkboxGroup.getTreeViewer().expandToLevel(((StructuredSelection) selection).getFirstElement(),
                            AbstractTreeViewer.ALL_LEVELS);
                }
            }
        });

        if (initialResourceSelection != null) {
            checkboxGroup.initialCheckListItem(initialResourceSelection);
        }

        container.addControlListener(new ControlListener() {
            public void controlMoved(ControlEvent e) {
            }

            public void controlResized(ControlEvent e) {
                TableColumn[] columns = checkboxGroup.getListTable().getColumns();
                for (TableColumn column : columns) {
                    column.pack();
                }
            }
        });

        dialogChanged();
        setControl(container);
    }

    /**
     * Returns the content provider.
     * 
     * @param resourceType
     *            is the type of the resource
     * @return the content provider
     */
    private ITreeContentProvider getContentProvider(final int resourceType) {
        return new WorkbenchContentProvider() {
            @Override
            public Object[] getChildren(Object o) {
                if (resourceType != IResource.FILE && o instanceof IExtensionRegistry) {
                    Set<Bundle> result = new TreeSet<Bundle>(new Comparator<Bundle>() {
                        public int compare(Bundle bundle0, Bundle bundle1) {
                            return bundle0.getSymbolicName().compareTo(bundle1.getSymbolicName());
                        }
                    });
                    return result.toArray();
                } else if (resourceType == IResource.FILE && o instanceof Bundle) {
                    final Bundle bundle = (Bundle) o;
                    final List<IPath> result = new ArrayList<IPath>();
                    for (String extension : extensions) {
                        if (JOKER.equals(extension)) {
                            result.clear();
                            final Enumeration<?> enumeration = bundle.findEntries("/", JOKER, true); //$NON-NLS-1$ 
                            while (enumeration != null && enumeration.hasMoreElements()) {
                                final Object child = enumeration.nextElement();
                                if (child instanceof URL) {
                                    result.add(new Path(bundle.getSymbolicName()).append(((URL) child).getPath()));
                                }
                            }
                            break;
                        } else {
                            final Enumeration<?> enumeration = bundle.findEntries("/", "*." + extension, true); //$NON-NLS-1$ //$NON-NLS-2$
                            while (enumeration != null && enumeration.hasMoreElements()) {
                                final Object child = enumeration.nextElement();
                                if (child instanceof URL) {
                                    result.add(new Path(bundle.getSymbolicName()).append(((URL) child).getPath()));
                                }
                            }
                        }
                    }
                    return result.toArray();
                } else if (resourceType == IResource.FILE && o instanceof IPath) {
                    return new Object[0];
                } else if (o instanceof IContainer) {
                    IResource[] members = null;
                    try {
                        members = ((IContainer) o).members();
                    } catch (final CoreException e) {
                        return new Object[0];
                    }
                    final ArrayList<IResource> results = new ArrayList<IResource>();
                    for (IResource member : members) {
                        if ((member.getType() & resourceType) > 0 && isSignificant(member)) {
                            if (member instanceof IFile) {
                                String extension = member.getFileExtension();
                                if (extension == null) {
                                    extension = ""; //$NON-NLS-1$
                                }
                                for (String extension2 : extensions) {
                                    if (JOKER.equals(extension2) || extension.equals(extension2)) {
                                        results.add(member);
                                        break;
                                    }
                                }
                            } else if (member instanceof IContainer && countMembers((IContainer) member) > 0) {
                                results.add(member);
                            }
                        }
                    }
                    return results.toArray();
                } else if (o instanceof List) {
                    List<Object> result = Lists.newArrayList();
                    Iterator<?> it = ((List<?>) o).iterator();
                    while (it.hasNext()) {
                        Object element = it.next();
                        if (element instanceof IContainer) {
                            if (((IContainer) element).isAccessible() && countMembers((IContainer) element) > 0) {
                                result.add(element);
                            }
                        } else {
                            result.add(element);
                        }
                    }
                    return result.toArray();
                } else {
                    return new Object[0];
                }
            }
        };
    }

    private int countMembers(final IContainer container) {
        try {
            final IResource[] members = container.members();
            int result = 0;
            for (IResource member : members) {
                if (isSignificant(member)) {
                    if (member instanceof IFile) {
                        String extension = member.getFileExtension();
                        if (extension == null) {
                            extension = ""; //$NON-NLS-1$
                        }
                        for (String extension2 : extensions) {
                            if (JOKER.equals(extension2) || extension.equals(extension2)) {
                                result++;
                                break;
                            }
                        }
                    } else if (member instanceof IContainer) {
                        result += countMembers((IContainer) member);
                    }
                }
            }
            return result;
        } catch (final CoreException e) {
            return 0;
        }
    }

    private boolean isSignificant(final IResource resource) {
        return !(resource instanceof IFolder && (resource.getName().startsWith("."))); //$NON-NLS-1$
    }

    /**
     * Validates the changes on the page.
     */
    private void dialogChanged() {
        final List<IPath> items = getAllCheckedListItems();
        if (items.size() < lower) {
            updateStatus("Not enough files were selected."); //$NON-NLS-1$
            return;
        } else if (items.size() > upper && upper != -1) {
            updateStatus("Too many files were selected."); //$NON-NLS-1$
            return;
        }
        updateStatus(null);
    }

    /**
     * Updates the status of the page.
     * 
     * @param message
     *            is the error message.
     */
    private void updateStatus(String message) {
        setMessage(message);
        setPageComplete(message == null);
    }

    /**
     * Returns the selected files.
     * 
     * @return the selected files
     */
    public IPath[] getSelection() {
        List<IPath> items = getAllCheckedListItems();
        return items.toArray(new IPath[items.size()]);
    }

    private List<IPath> getAllCheckedListItems() {
        List<IPath> items = new ArrayList<IPath>();
        Iterator<?> resultEnum = checkboxGroup.getAllCheckedListItems();
        while (resultEnum.hasNext()) {
            Object member = resultEnum.next();
            if (member instanceof IFile) {
                items.add(((IFile) member).getFullPath());
            } else if (member instanceof IPath) {
                items.add((IPath) member);
            }
        }
        return items;
    }

}

// CHECKSTYLE:ON