com.ebmwebsourcing.petals.common.internal.provisional.ui.LibrariesExportWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for com.ebmwebsourcing.petals.common.internal.provisional.ui.LibrariesExportWizardPage.java

Source

/******************************************************************************
 * Copyright (c) 2009-2013, Linagora
 *
 * 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:
 *       Linagora - initial API and implementation
 *******************************************************************************/

package com.ebmwebsourcing.petals.common.internal.provisional.ui;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.ui.JavaElementLabelProvider;
import org.eclipse.jdt.ui.ProblemsLabelDecorator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.DecoratingLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

import com.ebmwebsourcing.petals.common.internal.PetalsCommonPlugin;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.JavaUtils;

/**
 * A wizard page to select Java libraries from the dependencies of a Java project.
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class LibrariesExportWizardPage extends WizardPage implements IWizardPage {

    private Image jarImage;
    private CheckboxTreeViewer libViewer;
    private final Map<IJavaProject, Set<JavaProjectLibrary>> dependencies;
    private final Set<File> librariesToImport;

    /**
     * @param pageName
     */
    public LibrariesExportWizardPage(String pageName) {
        super(pageName);

        this.dependencies = new HashMap<IJavaProject, Set<JavaProjectLibrary>>();
        this.librariesToImport = new HashSet<File>();

        ImageDescriptor desc = PetalsCommonPlugin.getImageDescriptor("icons/obj16/jar_l_obj.gif");
        if (desc != null)
            this.jarImage = desc.createImage();
    }

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.IDialogPage
     * #createControl(org.eclipse.swt.widgets.Composite)
     */
    public void createControl(Composite parent) {

        Composite container = new Composite(parent, SWT.NONE);
        container.setLayout(new GridLayout());
        container.setLayoutData(new GridData(GridData.FILL_BOTH));
        new Label(container, SWT.NONE).setText("Select the dependencies to export.");

        this.libViewer = new CheckboxTreeViewer(container,
                SWT.CHECK | SWT.BORDER | SWT.HIDE_SELECTION | SWT.SINGLE);

        this.libViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
        this.libViewer.setContentProvider(new JavaLibaryContentProvider());

        int labelFlags = JavaElementLabelProvider.SHOW_BASICS | JavaElementLabelProvider.SHOW_OVERLAY_ICONS
                | JavaElementLabelProvider.SHOW_SMALL_ICONS;

        final DecoratingLabelProvider labelProvider = new DecoratingLabelProvider(
                new JavaElementLabelProvider(labelFlags), new ProblemsLabelDecorator(null)) {

            /*
             * (non-Javadoc)
             * @see org.eclipse.jface.viewers.DecoratingLabelProvider
             * #getText(java.lang.Object)
             */
            @Override
            public String getText(Object element) {
                if (element instanceof JavaProjectLibrary)
                    return ((JavaProjectLibrary) element).library.getName();
                return super.getText(element);
            }

            /*
             * (non-Javadoc)
             * @see org.eclipse.jface.viewers.DecoratingLabelProvider
             * #getImage(java.lang.Object)
             */
            @Override
            public Image getImage(Object element) {
                if (element instanceof JavaProjectLibrary)
                    return LibrariesExportWizardPage.this.jarImage;
                return super.getImage(element);
            }
        };

        this.libViewer.setLabelProvider(labelProvider);
        this.libViewer.setInput(new Object());
        this.libViewer.addCheckStateListener(new LibraryTreeCheckStateListener());
        this.libViewer.getTree().addMouseMoveListener(new MouseMoveListener() {
            public void mouseMove(MouseEvent e) {

                TreeItem item = ((Tree) e.widget).getItem(new Point(e.x, e.y));
                if (item != null && item.getData() != null && item.getData() instanceof JavaProjectLibrary) {
                    JavaProjectLibrary jpl = (JavaProjectLibrary) item.getData();
                    String tooltip = jpl.library.getAbsolutePath();
                    item.getParent().setToolTipText(tooltip);
                } else
                    LibrariesExportWizardPage.this.libViewer.getTree().setToolTipText(null);
            }
        });

        setControl(container);
    }

    /**
     * @param selectedProject the selectedProject to set
     */
    public void setSelectedJavaProject(IJavaProject selectedProject) {

        this.dependencies.clear();
        if (selectedProject != null) {
            List<IJavaProject> proj = JavaUtils.getJavaProjectDependencies(selectedProject);
            for (IJavaProject jp : proj) {

                List<String> locations = JavaUtils.getClasspath(jp, false, false);
                Set<JavaProjectLibrary> libs = new HashSet<JavaProjectLibrary>();
                for (String loc : locations) {
                    if (!loc.endsWith(".jar") && !loc.endsWith(".zip"))
                        continue;

                    File f = new File(loc);
                    JavaProjectLibrary jpl = new JavaProjectLibrary();
                    jpl.javaProject = jp;
                    jpl.library = f;
                    libs.add(jpl);
                }

                this.dependencies.put(jp, libs);
            }
        }

        if (this.libViewer != null) {
            this.libViewer.refresh();
            if (selectedProject != null) {
                this.libViewer.expandToLevel(selectedProject, 1);
                this.libViewer.setSelection(new StructuredSelection(selectedProject));
            }
        }
    }

    /**
     * @return the librariesToImport
     */
    public Set<File> getLibariesToImport() {
        return this.librariesToImport;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.DialogPage#dispose()
     */
    @Override
    public void dispose() {

        if (this.jarImage != null)
            this.jarImage.dispose();
        super.dispose();
    }

    /**
     * 
     */
    private class JavaLibaryContentProvider implements ITreeContentProvider {

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITreeContentProvider
         * #getChildren(java.lang.Object)
         */
        public Object[] getChildren(Object parentElement) {

            if (parentElement instanceof IJavaProject) {
                IJavaProject jp = (IJavaProject) parentElement;
                Set<JavaProjectLibrary> libs = LibrariesExportWizardPage.this.dependencies.get(jp);
                return libs.toArray();
            }
            return new Object[0];
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITreeContentProvider
         * #getParent(java.lang.Object)
         */
        public Object getParent(Object element) {

            if (element instanceof JavaProjectLibrary)
                return ((JavaProjectLibrary) element).javaProject;
            return null;
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.viewers.ITreeContentProvider
         * #hasChildren(java.lang.Object)
         */
        public boolean hasChildren(Object element) {
            return getChildren(element).length > 0;
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.viewers.IStructuredContentProvider
         * #getElements(java.lang.Object)
         */
        public Object[] getElements(Object inputElement) {
            return LibrariesExportWizardPage.this.dependencies.keySet().toArray();
        }

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.viewers.IContentProvider
         * #dispose()
         */
        public void dispose() {
            // nothing
        }

        /*
         * (non-Javadoc)
         * @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) {
            // nothing
        }
    }

    /**
     * 
     */
    private static class JavaProjectLibrary {
        IJavaProject javaProject;
        File library;
    }

    /**
     * 
     */
    private class LibraryTreeCheckStateListener implements ICheckStateListener {

        /*
         * (non-Javadoc)
         * @see org.eclipse.jface.viewers.ICheckStateListener
         * #checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
         */
        public void checkStateChanged(CheckStateChangedEvent event) {

            // JavaProjectLibrary
            if (event.getElement() instanceof JavaProjectLibrary) {

                JavaProjectLibrary jpl = (JavaProjectLibrary) event.getElement();
                updateHierarchyState(jpl);

                if (event.getChecked())
                    LibrariesExportWizardPage.this.librariesToImport.add(jpl.library);
                else
                    LibrariesExportWizardPage.this.librariesToImport.remove(jpl.library);
            }

            // IJavaProject
            else if (event.getElement() instanceof IJavaProject) {

                IJavaProject jp = (IJavaProject) event.getElement();
                LibrariesExportWizardPage.this.libViewer.setSubtreeChecked(jp, event.getChecked());
                Set<JavaProjectLibrary> jpls = LibrariesExportWizardPage.this.dependencies.get(jp);

                List<File> libs = new ArrayList<File>();
                for (JavaProjectLibrary jpl : jpls)
                    libs.add(jpl.library);
                if (event.getChecked())
                    LibrariesExportWizardPage.this.librariesToImport.addAll(libs);
                else
                    LibrariesExportWizardPage.this.librariesToImport.removeAll(libs);
            }
        }

        /**
         * Update the check state in the tree.
         * 
         * @param jpl
         * @param checked
         */
        private void updateHierarchyState(JavaProjectLibrary jpl) {

            Set<JavaProjectLibrary> jpls = LibrariesExportWizardPage.this.dependencies.get(jpl.javaProject);
            int childrenCount = jpls.size();
            int checkedChildren = 0;
            for (JavaProjectLibrary jp : jpls) {
                if (LibrariesExportWizardPage.this.libViewer.getChecked(jp))
                    checkedChildren++;
            }

            if (checkedChildren == 0)
                LibrariesExportWizardPage.this.libViewer.setGrayChecked(jpl.javaProject, false);
            else if (checkedChildren == childrenCount) {
                LibrariesExportWizardPage.this.libViewer.setGrayed(jpl.javaProject, false);
                LibrariesExportWizardPage.this.libViewer.setChecked(jpl.javaProject, true);
            } else
                LibrariesExportWizardPage.this.libViewer.setGrayChecked(jpl.javaProject, true);
        }
    }
}