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

Java tutorial

Introduction

Here is the source code for com.ebmwebsourcing.petals.common.internal.provisional.ui.WorkspaceExplorer.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.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
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.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.model.WorkbenchLabelProvider;

import com.ebmwebsourcing.petals.common.internal.provisional.utils.ResourceUtils;

/**
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class WorkspaceExplorer extends TitleAreaDialog {

    private TreeViewer wkViewer;
    private final List<String> extensions;
    private IResource selectedResource;

    public WorkspaceExplorer(Shell parentShell, String[] extensions) {
        super(parentShell);
        setShellStyle(SWT.PRIMARY_MODAL | SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX);
        this.extensions = extensions != null ? Arrays.asList(extensions) : new ArrayList<String>(0);
    }

    /**
     * @return the selectedResource
     */
    public IResource getSelectedResource() {
        return this.selectedResource;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.TitleAreaDialog
     * #createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createDialogArea(Composite parent) {

        Composite bigContainer = (Composite) super.createDialogArea(parent);
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        bigContainer.setLayout(layout);
        bigContainer.setLayoutData(new GridData(GridData.FILL_BOTH));

        Composite container = new Composite(bigContainer, SWT.NONE);
        layout = new GridLayout();
        layout.marginWidth = layout.marginHeight = 0;
        container.setLayout(layout);
        container.setLayoutData(new GridData(GridData.FILL_BOTH));

        addWorkspaceExplorer(container);
        this.wkViewer.setInput(ResourcesPlugin.getWorkspace().getRoot());

        getShell().setText("Workspace Explorer");
        setTitle("Workspace Explorer");
        setMessage("Browse the workspace.");

        return bigContainer;
    }

    /**
     * Add an explorer for the workspace resources.
     * @param container
     */
    private void addWorkspaceExplorer(Composite container) {

        int style = SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.HIDE_SELECTION;
        this.wkViewer = new TreeViewer(container, style);

        GridData layoutData = new GridData(GridData.FILL_BOTH);
        layoutData.heightHint = 100;
        this.wkViewer.getTree().setLayoutData(layoutData);
        this.wkViewer.setLabelProvider(new WorkbenchLabelProvider());
        this.wkViewer.setContentProvider(new ITreeContentProvider() {

            /**
             * @param container
             * @return the list of sub-containers having resources with one of the filtered extension.
             * <p>
             * The result does not include binary folders from Java projects,
             * and skips resources to hide.
             * </p>
             */
            private Object[] getContainerElements(IContainer container) {
                IResource[] res = ResourceUtils.getDirectValidChildren(container, WorkspaceExplorer.this.extensions,
                        new ArrayList<IResource>());
                return res;
            }

            /*
             * (non-Javadoc)
             * @see org.eclipse.jface.viewers.ITreeContentProvider
             * #getChildren(java.lang.Object)
             */
            @Override
            public Object[] getChildren(Object o) {
                if (o instanceof IContainer)
                    return getContainerElements((IContainer) o);
                return new Object[0];
            }

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

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

                if (element instanceof IResource) {
                    IContainer parent = ((IResource) element).getParent();
                    if (parent instanceof IWorkspaceRoot)
                        return null;

                    return parent;
                }

                return null;
            }

            /*
             * (non-Javadoc)
             * @see org.eclipse.jface.viewers.IStructuredContentProvider
             * #getElements(java.lang.Object)
             */
            @Override
            public Object[] getElements(Object inputElement) {

                if (inputElement instanceof IWorkspaceRoot)
                    return ((IWorkspaceRoot) inputElement).getProjects();
                else if (inputElement instanceof String) {
                    //               IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject((String) inputElement);
                    //               if( p != null ) {
                    //                  List<IProject> dependencies = JDTUtils.getJavaProjectDependencies( p );
                    //                  return dependencies.toArray();
                    //               }
                }

                return new Object[0];
            }

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

            /*
             * (non-Javadoc)
             * @see org.eclipse.jface.viewers.IContentProvider
             * #inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
             */
            @Override
            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
                // nothing
            }
        });

        // Selection listener
        this.wkViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {

                if (event.getSelection().isEmpty())
                    return;

                Button b = getButton(IDialogConstants.OK_ID);
                Object res = ((IStructuredSelection) event.getSelection()).getFirstElement();
                if (res instanceof IFile) {
                    WorkspaceExplorer.this.selectedResource = (IFile) res;
                    if (b != null)
                        b.setEnabled(true);
                } else {
                    WorkspaceExplorer.this.selectedResource = null;
                    if (b != null)
                        b.setEnabled(false);
                }
            }
        });

        // Double-clic means selection
        this.wkViewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {

                if (event.getSelection().isEmpty())
                    return;

                Button b = getButton(IDialogConstants.OK_ID);
                Object res = ((IStructuredSelection) event.getSelection()).getFirstElement();
                if (res instanceof IFile) {
                    WorkspaceExplorer.this.selectedResource = (IFile) res;
                    if (b != null)
                        b.setEnabled(true);
                    close();
                }
            }
        });
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#getInitialSize()
     */
    @Override
    protected Point getInitialSize() {
        return new Point(400, 500);
    }
}