com.ibm.team.rtc.extensions.workitem.copy.internal.ProjectAreaSelectionPage.java Source code

Java tutorial

Introduction

Here is the source code for com.ibm.team.rtc.extensions.workitem.copy.internal.ProjectAreaSelectionPage.java

Source

/**
 * The MIT License (MIT)
 *
 * Copyright (c) 2015 Sandeep Somavarapu
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package com.ibm.team.rtc.extensions.workitem.copy.internal;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;

import com.ibm.team.jface.util.UIUpdaterJob;
import com.ibm.team.process.common.IProjectAreaHandle;
import com.ibm.team.process.internal.rcp.ui.RepositoryLabelProvider;
import com.ibm.team.process.rcp.ui.teamnavigator.ConnectedProjectAreaRegistry;
import com.ibm.team.repository.client.ITeamRepository;
import com.ibm.team.repository.client.TeamPlatform;
import com.ibm.team.repository.common.TeamRepositoryException;
import com.ibm.team.repository.common.service.IPermissionService;
import com.ibm.team.workitem.rcp.ui.internal.ProjectAreaPicker;
import com.ibm.team.workitem.rcp.ui.internal.viewer.ItemComparer;

@SuppressWarnings({ "restriction", "unchecked", "rawtypes" })
public class ProjectAreaSelectionPage extends WizardPage {

    private final EvaluationContext fContext;
    private TableViewer fViewer;
    private ComboViewer fComboViewer;

    public ProjectAreaSelectionPage(EvaluationContext context) {
        super("Select Project Area", "Select Project Area", null);
        fContext = context;
    }

    public void createControl(Composite parent) {
        initializeDialogUnits(parent);

        Composite container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        container.setLayout(layout);

        List<ITeamRepository> repos = getRepositories();
        if (repos.isEmpty()) {
            Label label = new Label(container, SWT.NONE);
            label.setText("No repositories available");
        }

        fComboViewer = createRepositoryPart(container, repos);

        Label label = new Label(container, SWT.NONE);
        label.setText("Project Areas");

        fViewer = new TableViewer(container, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        fViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        fViewer.setContentProvider(new SimpleContentProvider());
        fViewer.setSorter(new ViewerSorter());
        fViewer.setComparer(new ItemComparer());

        fComboViewer.setSelection(new StructuredSelection(repos.get(0)));

        setControl(container);
        Dialog.applyDialogFont(container);
    }

    private List<ITeamRepository> getRepositories() {
        return Arrays.asList(TeamPlatform.getTeamRepositoryService().getTeamRepositories());
    }

    private ComboViewer createRepositoryPart(Composite container, final List<ITeamRepository> repos) {
        Label repoLabel = new Label(container, SWT.NONE);
        repoLabel.setText("Repository:");

        Combo repoCombo = new Combo(container, SWT.SINGLE | SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY);
        repoCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        ComboViewer comboViewer = new ComboViewer(repoCombo);
        comboViewer.setContentProvider(new ArrayContentProvider());
        comboViewer.setLabelProvider(new RepositoryLabelProvider());
        comboViewer.setInput(repos);
        comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                withRepository((ITeamRepository) ((IStructuredSelection) event.getSelection()).getFirstElement());
            }
        });
        return comboViewer;
    }

    private void withRepository(ITeamRepository repository) {
        fContext.message = null;
        fContext.targetContext = new RepositoryContext(true, repository);
        setPageComplete(false);
        fViewer.setInput("");
        setErrorMessage(null);

        new UIUpdaterJob("") {
            @Override
            public IStatus runInBackground(IProgressMonitor monitor) {
                try {
                    // Provide a way to override the constraint that user should
                    // be a member of JAZZ_ADMINS
                    boolean allowNonAdminUsers = Boolean.getBoolean("allowNonAdminUsers");
                    fContext.targetContext.isAdmin = allowNonAdminUsers
                            || fContext.targetContext.teamRepository.externalUserRegistryManager().isMember(
                                    fContext.targetContext.teamRepository.getUserId(),
                                    IPermissionService.JAZZ_ADMINS, new SubProgressMonitor(monitor, 200));
                } catch (TeamRepositoryException e) {
                    fContext.message = e.getMessage();
                }
                return Status.OK_STATUS;
            }

            @Override
            public IStatus runInUI(IProgressMonitor monitor) {
                computeProjectAreas();
                return Status.OK_STATUS;
            }
        }.schedule();
    }

    private void computeProjectAreas() {
        if (fContext.message != null) {
            setErrorMessage(fContext.message);
            return;
        }

        if (fContext.targetContext == null) {
            setErrorMessage("Not connected to any project areas");
            return;
        }

        // commented this because was getting this error even though was admin
        // if (!fContext.targetContext.isAdmin) {
        if (fContext.targetContext.isAdmin) {
            setErrorMessage("This operation requires Admin role in the selected repository");
            return;
        }

        List<IProjectAreaHandle> connectedProjectAreas = getProjectAreasToSelect();
        if (connectedProjectAreas.isEmpty()) {
            setErrorMessage("Not connected to any project areas");
            return;
        }

        fViewer.setLabelProvider(new ProjectAreaPicker.ProjectAreaLabelProvider(connectedProjectAreas));
        fViewer.setInput(connectedProjectAreas);
        fViewer.addOpenListener(new IOpenListener() {
            public void open(OpenEvent event) {
                getContainer().showPage(getNextPage());
            }
        });
        fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                fContext.targetContext.projectArea = (IProjectAreaHandle) selection.getFirstElement();
                setPageComplete(true);
            }
        });

        fViewer.setSelection(new StructuredSelection(fViewer.getElementAt(0)));
    }

    @Override
    public boolean canFlipToNextPage() {
        return fContext.targetContext != null && fContext.targetContext.projectArea != null;
    }

    private static class SimpleContentProvider implements IStructuredContentProvider {
        public Object[] getElements(Object inputElement) {
            if (inputElement instanceof Collection)
                return ((Collection) inputElement).toArray();
            return new Object[] { inputElement };
        }

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

        public void dispose() {
        }
    }

    private List<IProjectAreaHandle> getProjectAreasToSelect() {
        List<IProjectAreaHandle> result = new ArrayList<IProjectAreaHandle>();
        for (IProjectAreaHandle projectArea : (List<IProjectAreaHandle>) ConnectedProjectAreaRegistry.getDefault()
                .getConnectedProjectAreas(fContext.targetContext.teamRepository)) {
            if (!fContext.queryDescriptor.getProjectArea().sameItemId(projectArea)) {
                result.add(projectArea);
            }
        }
        return result;
    }
}