com.codenvy.eclipse.ui.wizard.importer.pages.ProjectWizardPage.java Source code

Java tutorial

Introduction

Here is the source code for com.codenvy.eclipse.ui.wizard.importer.pages.ProjectWizardPage.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Codenvy, S.A.
 * 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:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package com.codenvy.eclipse.ui.wizard.importer.pages;

import static org.eclipse.core.runtime.IProgressMonitor.UNKNOWN;
import static org.eclipse.jface.viewers.CheckboxTableViewer.newCheckList;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IPageChangedListener;
import org.eclipse.jface.dialogs.PageChangedEvent;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.dialogs.WorkingSetGroup;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.registry.WorkingSetDescriptor;

import com.codenvy.client.Codenvy;
import com.codenvy.client.CodenvyAPI;
import com.codenvy.client.auth.Credentials;
import com.codenvy.client.model.ProjectReference;
import com.codenvy.client.model.WorkspaceReference;
import com.codenvy.eclipse.core.CodenvyPlugin;
import com.codenvy.eclipse.ui.CodenvyUIPlugin;
import com.codenvy.eclipse.ui.Images;
import com.codenvy.eclipse.ui.wizard.common.CredentialsProviderWizard;
import com.codenvy.eclipse.ui.wizard.common.jobs.LoadWorkspacesJob;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;

/**
 * Project wizard page. In this wizard page the user selects the projects to import in Eclipse.
 *
 * @author Kevin Pollet
 * @author Stphane Daviet
 */
@SuppressWarnings("restriction")
public final class ProjectWizardPage extends WizardPage implements IPageChangedListener {
    private static final String NO_SELECTED_PROJECTS_ERROR_MESSAGE = "Select a Codenvy project to import.";

    private ComboViewer workspaceComboViewer;
    private CheckboxTableViewer projectTableViewer;
    private WorkingSetGroup workingSetGroup;

    /**
     * Constructs an instance of {@link ProjectWizardPage}.
     */
    public ProjectWizardPage() {
        super(ProjectWizardPage.class.getSimpleName());

        setTitle("Codenvy Projects");
        setDescription("Select Codenvy projects to import");
        setImageDescriptor(CodenvyUIPlugin.getDefault().getImageRegistry().getDescriptor(Images.WIZARD_LOGO));
        setPageComplete(false);
    }

    @Override
    public void createControl(Composite parent) {
        final Composite wizardContainer = new Composite(parent, SWT.NONE);
        wizardContainer.setLayout(new GridLayout(2, false));
        wizardContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Composite workspaceSelectionContainer = new Composite(wizardContainer, SWT.NONE);
        workspaceSelectionContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        workspaceSelectionContainer.setLayout(new GridLayout(2, false));

        final Label workspaceLabel = new Label(workspaceSelectionContainer, SWT.NONE);
        workspaceLabel.setText("Workspace:");

        workspaceComboViewer = new ComboViewer(workspaceSelectionContainer, SWT.DROP_DOWN | SWT.READ_ONLY);
        workspaceComboViewer.getCombo().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        workspaceComboViewer.setContentProvider(new ArrayContentProvider());
        workspaceComboViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                return element instanceof WorkspaceReference ? ((WorkspaceReference) element).name()
                        : super.getText(element);
            }
        });
        workspaceComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                if (!selection.isEmpty()) {
                    loadWorkspaceProjects((WorkspaceReference) selection.getFirstElement());
                }
            }
        });

        final Label projectTableLabel = new Label(wizardContainer, SWT.NONE);
        projectTableLabel.setText("Projects:");
        projectTableLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));

        projectTableViewer = newCheckList(wizardContainer,
                SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);

        final TableViewerColumn projectNameColumn = new TableViewerColumn(projectTableViewer, SWT.NONE);
        projectNameColumn.getColumn().setWidth(150);
        projectNameColumn.getColumn().setText("Name");
        projectNameColumn.setLabelProvider(new ColumnLabelProviderWithGreyElement() {
            @Override
            public String getText(Object element) {
                return element instanceof ProjectReference ? ((ProjectReference) element).name()
                        : super.getText(element);
            }
        });

        final TableViewerColumn projectTypeNameColumn = new TableViewerColumn(projectTableViewer, SWT.NONE);
        projectTypeNameColumn.getColumn().setWidth(150);
        projectTypeNameColumn.getColumn().setText("Type");
        projectTypeNameColumn.setLabelProvider(new ColumnLabelProviderWithGreyElement() {
            @Override
            public String getText(Object element) {
                return element instanceof ProjectReference ? ((ProjectReference) element).typeName()
                        : super.getText(element);
            }
        });

        final TableViewerColumn projectDescriptionColumn = new TableViewerColumn(projectTableViewer, SWT.NONE);
        projectDescriptionColumn.getColumn().setWidth(150);
        projectDescriptionColumn.getColumn().setText("Description");
        projectDescriptionColumn.setLabelProvider(new ColumnLabelProviderWithGreyElement() {
            @Override
            public String getText(Object element) {
                return element instanceof ProjectReference ? ((ProjectReference) element).description()
                        : super.getText(element);
            }
        });
        projectTableViewer.setContentProvider(ArrayContentProvider.getInstance());
        projectTableViewer.addCheckStateListener(new ICheckStateListener() {
            @Override
            public void checkStateChanged(CheckStateChangedEvent event) {
                setCheckedProjects();
                validatePage();
            }
        });

        final Table projectTable = projectTableViewer.getTable();
        projectTable.getHorizontalBar().setEnabled(true);
        projectTable.setHeaderVisible(true);
        projectTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Composite projectTableButtonsContainer = new Composite(wizardContainer, SWT.NONE);
        projectTableButtonsContainer.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, true));
        projectTableButtonsContainer.setLayout(new GridLayout());

        final Button selectAll = new Button(projectTableButtonsContainer, SWT.NONE);
        selectAll.setText("Select All");
        selectAll.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
        selectAll.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                projectTableViewer.setAllChecked(true);

                setCheckedProjects();
                validatePage();
            }
        });

        final Button deselectAll = new Button(projectTableButtonsContainer, SWT.NONE);
        deselectAll.setText("Deselect All");
        deselectAll.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
        deselectAll.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                projectTableViewer.setAllChecked(false);

                setCheckedProjects();
                validatePage();
            }
        });

        // TODO remove when https://bugs.eclipse.org/bugs/show_bug.cgi?id=245106 is fixed
        final WorkingSetDescriptor[] descriptors = WorkbenchPlugin.getDefault().getWorkingSetRegistry()
                .getWorkingSetDescriptors();
        final List<String> workingSetTypes = FluentIterable.from(Arrays.asList(descriptors))
                .transform(new Function<WorkingSetDescriptor, String>() {
                    @Override
                    public String apply(WorkingSetDescriptor descriptor) {
                        return descriptor.getId();
                    }
                }).toList();

        workingSetGroup = new WorkingSetGroup(wizardContainer, null,
                workingSetTypes.toArray(new String[workingSetTypes.size()]));

        setControl(wizardContainer);
    }

    @Override
    public void pageChanged(PageChangedEvent event) {
        if (isCurrentPage()) {
            projectTableViewer.setInput(null);
            workspaceComboViewer.setInput(null);
            loadWorkspaces();
            validatePage();
        }
    }

    /**
     * Method used to load the workspaces asynchronously when the wizard page is displayed.
     */
    private void loadWorkspaces() {
        try {

            getContainer().run(true, false, new LoadWorkspacesJob(getWizard()) {
                @Override
                public void postLoadCallback(List<? extends WorkspaceReference> workspaceReferences) {
                    workspaceComboViewer.setInput(workspaceReferences.toArray());
                    if (!workspaceReferences.isEmpty()) {
                        workspaceComboViewer.setSelection(new StructuredSelection(workspaceReferences.get(0)));
                    }
                    workspaceComboViewer.refresh();
                }
            });

        } catch (InvocationTargetException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Method used to load the workspace projects asynchronously when the workspace is selected.
     */
    private void loadWorkspaceProjects(final WorkspaceReference workspaceRef) {
        try {

            projectTableViewer.setInput(null);
            validatePage();

            getContainer().run(true, false, new IRunnableWithProgress() {
                @Override
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    final CredentialsProviderWizard wizard = getWizard();

                    try {

                        monitor.beginTask("Fetch workspace projects from Codenvy", UNKNOWN);

                        Display.getDefault().syncExec(new Runnable() {
                            @Override
                            public void run() {
                                final String platformURL = wizard.getUrl();
                                final String username = wizard.getUsername();
                                final String password = wizard.getPassword();
                                final boolean isStoreUserCredentials = wizard.isStoreUserCredentials();
                                final Credentials credentials = CodenvyAPI.getClient().newCredentialsBuilder()
                                        .withUsername(username).withPassword(password)
                                        .storeOnlyToken(!isStoreUserCredentials).build();

                                final Codenvy codenvy = CodenvyPlugin.getDefault()
                                        .getCodenvyBuilder(platformURL, username).withCredentials(credentials)
                                        .build();

                                final List<ProjectReference> projects = codenvy.project()
                                        .getWorkspaceProjects(workspaceRef.id()).execute();

                                projectTableViewer.setInput(projects);

                                final IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
                                for (ProjectReference oneProject : projects) {
                                    final IProject workspaceProject = workspaceRoot.getProject(oneProject.name());
                                    projectTableViewer.setGrayed(oneProject, workspaceProject.exists());
                                }

                                projectTableViewer.refresh();
                            }
                        });

                    } finally {
                        monitor.done();
                    }
                }
            });

        } catch (InvocationTargetException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * Defines checked projects in UI and shared data.
     *
     * @see ImportWizardSharedData
     */
    private void setCheckedProjects() {
        for (Object oneCheckedElement : projectTableViewer.getCheckedElements()) {
            final boolean isGrayed = projectTableViewer.getGrayed(oneCheckedElement);
            if (isGrayed) {
                projectTableViewer.setChecked(oneCheckedElement, false);
            }
        }
    }

    /**
     * Returns the selected working sets.
     *
     * @return the selected working sets
     */
    public List<IWorkingSet> getWorkingSets() {
        final List<IWorkingSet> selectedWorkingSets = ImmutableList
                .copyOf(workingSetGroup.getSelectedWorkingSets());
        return selectedWorkingSets;
    }

    /**
     * Returns the selected Codenvy projects.
     *
     * @return the selected Codenvy projects never {@code null}.
     */
    public List<ProjectReference> getProjects() {
        final List<ProjectReference> selectedProjects = new ArrayList<>();
        for (Object oneProject : projectTableViewer.getCheckedElements()) {
            selectedProjects.add((ProjectReference) oneProject);
        }
        return selectedProjects;
    }

    private void validatePage() {
        setErrorMessage(
                projectTableViewer.getCheckedElements().length <= 0 ? NO_SELECTED_PROJECTS_ERROR_MESSAGE : null);
        setPageComplete(projectTableViewer.getCheckedElements().length > 0);
    }

    /**
     * Custom label provider displaying grayed elements in grey.
     *
     * @author Kevin Pollet
     */
    private class ColumnLabelProviderWithGreyElement extends ColumnLabelProvider {
        @Override
        public Color getForeground(Object element) {
            final boolean isGrayed = projectTableViewer.getGrayed(element);
            return isGrayed ? Display.getCurrent().getSystemColor(SWT.COLOR_GRAY) : super.getForeground(element);
        }
    }

    @Override
    public CredentialsProviderWizard getWizard() {
        return (CredentialsProviderWizard) super.getWizard();
    }
}