com.microsoft.tfs.client.eclipse.ui.egit.importwizard.GitImportWizardSelectFoldersPage.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.eclipse.ui.egit.importwizard.GitImportWizardSelectFoldersPage.java

Source

// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See License.txt in the repository root.

package com.microsoft.tfs.client.eclipse.ui.egit.importwizard;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IWorkspace;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;

import com.microsoft.tfs.client.common.git.EclipseProjectInfo;
import com.microsoft.tfs.client.common.ui.framework.helper.UIHelpers;
import com.microsoft.tfs.client.common.ui.framework.layout.GridDataBuilder;
import com.microsoft.tfs.client.common.ui.framework.wizard.ExtendedWizardPage;
import com.microsoft.tfs.client.eclipse.ui.egit.Messages;
import com.microsoft.tfs.client.eclipse.ui.wizard.importwizard.ImportWizard;
import com.microsoft.tfs.client.eclipse.ui.wizard.importwizard.support.ImportEclipseProject;
import com.microsoft.tfs.client.eclipse.ui.wizard.importwizard.support.ImportGitRepository;
import com.microsoft.tfs.client.eclipse.ui.wizard.importwizard.support.ImportGitRepositoryCollection;
import com.microsoft.tfs.client.eclipse.ui.wizard.importwizard.support.ImportItemCollectionBase;
import com.microsoft.tfs.client.eclipse.ui.wizard.importwizard.support.ImportOptions;
import com.microsoft.tfs.util.Check;

public class GitImportWizardSelectFoldersPage extends ExtendedWizardPage {
    public static final String PAGE_NAME = "GitImportWizardSelectFoldersPage"; //$NON-NLS-1$
    public static final String SELECTED_FOLDERS = "GitImportWizardSelectFoldersPage.SelectedFolders"; //$NON-NLS-1$
    public static final String IMPORT_EXISTSING_PROJECTS = "GitImportWizardSelectFoldersPage.ImportExisitingProjects"; //$NON-NLS-1$

    private final static int TREE_STYLES = SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION
            | SWT.VIRTUAL;
    private TreeViewer treeViewer;
    private Tree treeControl;
    private TreeColumn folderColumn;

    private Button importExistingProjectsButton;
    private Button createGenericProjectsButton;

    private ImportWizard wizard;
    private ImportOptions options;
    private IWorkspace workspace;

    private ImportGitRepository[] repositories;

    public GitImportWizardSelectFoldersPage() {
        super(PAGE_NAME, Messages.getString("GitImportWizardSelectFoldersPage.PageTitle"), //$NON-NLS-1$
                Messages.getString("GitImportWizardSelectFoldersPage.PageDescription")); //$NON-NLS-1$
    }

    @Override
    protected void doCreateControl(final Composite parent, final IDialogSettings dialogSettings) {
        wizard = (ImportWizard) getExtendedWizard();
        options = (ImportOptions) wizard.getPageData(ImportOptions.class);
        workspace = options.getEclipseWorkspace();

        final Composite container = new Composite(parent, SWT.NONE);
        setControl(container);

        final GridLayout layout = new GridLayout(1, false);
        layout.marginWidth = getHorizontalMargin();
        layout.marginHeight = getVerticalMargin();
        layout.horizontalSpacing = getHorizontalSpacing();
        layout.verticalSpacing = getVerticalSpacing();
        container.setLayout(layout);

        createWizardSelctionOptions(container);
        createRepositoriesTreeControl(container);

        refresh();
    }

    private void createWizardSelctionOptions(final Composite container) {
        importExistingProjectsButton = new Button(container, SWT.RADIO);
        importExistingProjectsButton
                .setText(Messages.getString("GitImportWizardSelectFoldersPage.ImportExistingProjectsButtonText")); //$NON-NLS-1$
        GridDataBuilder.newInstance().hSpan(3).hFill().hGrab().applyTo(importExistingProjectsButton);

        importExistingProjectsButton.setSelection(true);
        importExistingProjectsButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleWizardSelection();
            }
        });

        createGenericProjectsButton = new Button(container, SWT.RADIO);
        createGenericProjectsButton
                .setText(Messages.getString("GitImportWizardSelectFoldersPage.CreateGenericProjectsButtonText")); //$NON-NLS-1$
        GridDataBuilder.newInstance().hSpan(3).hFill().hGrab().applyTo(createGenericProjectsButton);

        createGenericProjectsButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                handleWizardSelection();
            }
        });

        handleWizardSelection();
    }

    private void handleWizardSelection() {
        if (importExistingProjectsButton.getSelection()) {
            wizard.setPageData(IMPORT_EXISTSING_PROJECTS, Boolean.TRUE);
        } else {
            wizard.removePageData(IMPORT_EXISTSING_PROJECTS);
        }
    }

    private void createRepositoriesTreeControl(final Composite container) {

        treeViewer = new TreeViewer(container, TREE_STYLES);
        treeControl = treeViewer.getTree();
        GridDataBuilder.newInstance().fill().grab().hHint(150).applyTo(treeControl);
        treeControl.setHeaderVisible(false);

        folderColumn = new TreeColumn(treeControl, SWT.CENTER);
        folderColumn.setText(Messages.getString("GitImportWizardSelectFoldersPage.FoldersColumnName")); //$NON-NLS-1$

        final TreeViewerColumn nameColumnViewer = new TreeViewerColumn(treeViewer, folderColumn);
        nameColumnViewer.setLabelProvider(new FolderNameLabelProvider());

        treeViewer.setUseHashlookup(true);
        treeViewer.setContentProvider(new FolderTreeContentProvider());
        treeViewer.setAutoExpandLevel(2);

        container.addControlListener(new ControlAdapter() {

            /**
             * {@inheritDoc}
             */
            @Override
            public void controlResized(final ControlEvent e) {
                // super.controlResized(e);
                final Rectangle clientArea = container.getClientArea();
                final Point preferredSize = treeControl.computeSize(SWT.DEFAULT, SWT.DEFAULT);
                final Point oldSize = treeControl.getSize();

                int newColmnWidth = clientArea.width - 2 * (treeControl.getBorderWidth() + getHorizontalMargin());
                if (preferredSize.y > clientArea.height) {
                    // if the vertical scrollbar is required, subtract its width
                    // from the new column width
                    final Point vBarSize = treeControl.getVerticalBar().getSize();
                    newColmnWidth -= vBarSize.x;
                }

                if (oldSize.x > clientArea.width) {
                    // if the table shrinks, make the column
                    // smaller first and then resize the table
                    folderColumn.setWidth(newColmnWidth);
                    treeControl.setSize(clientArea.width, clientArea.height);
                } else {
                    // if table widens, make the table
                    // bigger first and then resize the columns
                    treeControl.setSize(clientArea.width, clientArea.height);
                    folderColumn.setWidth(newColmnWidth);
                }
            }
        });

        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                setPageComplete(isValid());
            }
        });
    }

    @Override
    public void refresh() {
        if (wizard.hasPageData(IMPORT_EXISTSING_PROJECTS)) {
            importExistingProjectsButton.setSelection(true);
        } else {
            createGenericProjectsButton.setSelection(true);
        }

        final ImportGitRepositoryCollection itemCollection = (ImportGitRepositoryCollection) wizard
                .getPageData(ImportItemCollectionBase.class);

        repositories = itemCollection.getRepositories();

        setFoldersInput();
        setPageComplete(isValid());
    }

    private void setFoldersInput() {
        final List<ImportEclipseProject> rootFolders = new ArrayList<ImportEclipseProject>();

        UIHelpers.asyncExec(new Runnable() {
            @Override
            public void run() {
                for (final ImportGitRepository repository : repositories) {
                    final EclipseProjectInfo rootFolder = new EclipseProjectInfo(repository.getWorkingDirectory(),
                            workspace);
                    rootFolders.add(new ImportEclipseProject(rootFolder));
                }

                treeViewer.setInput(rootFolders.toArray(new ImportEclipseProject[rootFolders.size()]));
            }
        });
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public IWizardPage getPreviousPage() {
        return null;
    }

    @Override
    protected boolean onPageFinished() {

        wizard.setPageData(SELECTED_FOLDERS, getSelectedFolders());

        return super.onPageFinished();
    }

    private ImportEclipseProject[] getSelectedFolders() {
        final List<ImportEclipseProject> projects = new ArrayList<ImportEclipseProject>();
        final ITreeSelection selectedElements = (ITreeSelection) treeViewer.getSelection();

        for (final Iterator<?> i = selectedElements.iterator(); i.hasNext();) {
            final ImportEclipseProject folder = (ImportEclipseProject) i.next();
            projects.add(folder);
        }

        return projects.toArray(new ImportEclipseProject[projects.size()]);
    }

    public boolean isValid() {
        final ImportEclipseProject[] selectedFolders = getSelectedFolders();
        return selectedFolders.length > 0;
    }

    private class FolderTreeContentProvider implements ITreeContentProvider {
        @Override
        public Object[] getChildren(final Object parentElement) {
            Check.notNull(parentElement, "parentElement"); //$NON-NLS-1$

            if (parentElement instanceof ImportEclipseProject) {
                final ImportEclipseProject project = (ImportEclipseProject) parentElement;
                return project.getSubfolders();
            }

            return new Object[0];
        }

        @Override
        public boolean hasChildren(final Object element) {
            return true;
        }

        @Override
        public Object[] getElements(final Object inputElement) {
            return (Object[]) inputElement;
        }

        @Override
        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
        }

        @Override
        public Object getParent(final Object element) {
            final ImportEclipseProject project = (ImportEclipseProject) element;
            return project.getParentFolder();
        }

        @Override
        public void dispose() {
        }
    }

    private class FolderNameLabelProvider extends CellLabelProvider {
        @Override
        public void update(final ViewerCell cell) {
            final Object element = cell.getElement();

            if (element instanceof ImportEclipseProject) {
                final ImportEclipseProject project = (ImportEclipseProject) element;

                cell.setText(
                        project.getParentFolder() == null ? project.getProjectPath() : project.getFolderName());
            }
        }
    }
}