com.microsoft.tfs.client.common.ui.dialogs.vc.UnshelveDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.common.ui.dialogs.vc.UnshelveDialog.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.common.ui.dialogs.vc;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;

import com.microsoft.tfs.client.common.repository.TFSRepository;
import com.microsoft.tfs.client.common.ui.Messages;
import com.microsoft.tfs.client.common.ui.controls.vc.ShelvesetSearchControl;
import com.microsoft.tfs.client.common.ui.controls.vc.ShelvesetSearchControl.ShelvesetSearchUnshelveEvent;
import com.microsoft.tfs.client.common.ui.controls.vc.ShelvesetSearchControl.ShelvesetSearchUnshelveListener;
import com.microsoft.tfs.client.common.ui.controls.vc.changes.ChangeItem;
import com.microsoft.tfs.client.common.ui.framework.dialog.ExtendedButtonDialog;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.RecursionType;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Shelveset;
import com.microsoft.tfs.core.clients.versioncontrol.specs.ItemSpec;
import com.microsoft.tfs.util.Check;

/**
 * Lets the user query for shelvesets on the server and choose one to unshelve.
 * Because the user is given a chance to select only some changes in a shelveset
 * to unshelve (via the Details button), the caller must retrieve the selected
 * shelveset via {@link #getSelectedShelveset()} and check for custom checked
 * items {@link #getCheckedItemSpecs()}.
 *
 */
public class UnshelveDialog extends ExtendedButtonDialog {
    private static final int DETAILS_ID = IDialogConstants.CLIENT_ID + 1;
    private static final int DELETE_ID = IDialogConstants.CLIENT_ID + 2;

    private final TFSRepository repository;

    private ShelvesetSearchControl shelvesetSearchControl;

    private Shelveset selectedShelveset;

    private ChangeItem[] checkedChangeItems;
    private boolean preserveShelveset = true;
    private boolean restoreData = true;

    /**
     * @param parentShell
     */
    public UnshelveDialog(final Shell parentShell, final TFSRepository repository) {
        super(parentShell);

        Check.notNull(repository, "repository"); //$NON-NLS-1$

        this.repository = repository;

        // Disable standard OK/Cancel buttons.
        setOptionIncludeDefaultButtons(false);

        /*
         * Add back Unshelve/Close in their place. Order is important here, we
         * want Close (Cancel) on the right so add it last.
         */
        addButtonDescription(IDialogConstants.OK_ID, Messages.getString("UnshelveDialog.UnshelveButtonText"), true); //$NON-NLS-1$
        addButtonDescription(IDialogConstants.CANCEL_ID, Messages.getString("UnshelveDialog.CloseButtonText"), //$NON-NLS-1$
                false);

        // Add extended buttons on the left.
        addExtendedButtonDescription(DETAILS_ID, Messages.getString("UnshelveDialog.DetailsButtonText"), false); //$NON-NLS-1$
        addExtendedButtonDescription(DELETE_ID, Messages.getString("UnshelveDialog.DeleteButtonText"), false); //$NON-NLS-1$
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void hookAddToDialogArea(final Composite dialogArea) {
        final GridLayout dialogLayout = new GridLayout();
        dialogLayout.marginWidth = getHorizontalMargin();
        dialogLayout.marginHeight = getVerticalMargin();
        dialogLayout.horizontalSpacing = getHorizontalSpacing();
        dialogLayout.verticalSpacing = getVerticalSpacing();
        dialogArea.setLayout(dialogLayout);

        shelvesetSearchControl = new ShelvesetSearchControl(dialogArea, SWT.NONE, true, repository);
        shelvesetSearchControl.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
        shelvesetSearchControl.addUnshelveListener(new ShelvesetSearchUnshelveListener() {
            @Override
            public void onShelvesetSearchUnshelve(final ShelvesetSearchUnshelveEvent event) {
                final Shelveset[] shelvesets = shelvesetSearchControl.getSelectedShelvesets();

                Check.notNull(shelvesets, "shelvesets"); //$NON-NLS-1$
                Check.isTrue(shelvesets.length == 1, "shelvesets.length == 1"); //$NON-NLS-1$

                setReturnCode(IDialogConstants.OK_ID);
                close();
            }
        });
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void hookAfterButtonsCreated() {
        /*
         * Disable OK (Unshelve), Details, and Delete initially.
         */
        getButton(IDialogConstants.OK_ID).setEnabled(false);
        getButton(DETAILS_ID).setEnabled(false);
        getButton(DELETE_ID).setEnabled(false);

        shelvesetSearchControl.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                final Shelveset[] selection = shelvesetSearchControl.getSelectedShelvesets();

                final int selectionCount = (selection != null) ? selection.length : 0;

                getButton(IDialogConstants.OK_ID).setEnabled(selectionCount == 1);
                getButton(DETAILS_ID).setEnabled(selectionCount == 1);
                getButton(DELETE_ID).setEnabled(selectionCount >= 1);
            }
        });

        shelvesetSearchControl.addOwnerTextFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(final FocusEvent e) {
                getShell().setDefaultButton(shelvesetSearchControl.getFindButton());
            }

            @Override
            public void focusLost(final FocusEvent e) {
                getShell().setDefaultButton(getButton(DETAILS_ID));
            }
        });
    }

    @Override
    protected void hookDialogIsOpen() {
        shelvesetSearchControl.setFocus();
        shelvesetSearchControl.query();
    }

    @Override
    protected void hookCustomButtonPressed(final int buttonId) {
        if (buttonId == DETAILS_ID) {
            final Shelveset[] selection = shelvesetSearchControl.getSelectedShelvesets();

            if (selection.length != 1) {
                return;
            }

            shelvesetSearchControl.detailsForSelectedShelveset();
        } else if (buttonId == DELETE_ID) {
            shelvesetSearchControl.deleteSelectedShelvesets();
        }
    }

    @Override
    protected void hookDialogAboutToClose() {
        final Shelveset[] selection = shelvesetSearchControl.getSelectedShelvesets();

        selectedShelveset = selection.length == 0 ? null : selection[0];

        /*
         * The checked change items in the search control may be null, because
         * the user hasn't launched the details dialog to check any items, and
         * this is OK. That means the entire shelveset will be unshelved.
         */
        checkedChangeItems = shelvesetSearchControl.getCheckedChangeItems();

        preserveShelveset = shelvesetSearchControl.isPreserveShelveset();
        restoreData = shelvesetSearchControl.isRestoreData();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected String provideDialogTitle() {
        return Messages.getString("UnshelveDialog.DialogTitle"); //$NON-NLS-1$
    }

    /**
     * @return the shelveset the user selected
     */
    public Shelveset getSelectedShelveset() {
        return selectedShelveset;
    }

    /**
     * Gets the items in the shelveset the user wants to unshelve, or
     * <code>null</code> if the entire shelveset should be unshelved.
     *
     * @return the items in the shelveset the user selected which should be
     *         included in the unshelve operation, or <code>null</code> if the
     *         entire shelveset should be unshelved. An empty array indicates
     *         the shelveset should unshelve but no pending changes should be
     *         included (comment, associated work items, etc. will be
     *         unshelved).
     */
    public ItemSpec[] getCheckedItemSpecs() {
        if (checkedChangeItems == null) {
            return null;
        }

        final ItemSpec[] specs = new ItemSpec[checkedChangeItems.length];
        for (int i = 0; i < checkedChangeItems.length; i++) {
            specs[i] = new ItemSpec(checkedChangeItems[i].getServerItem(), RecursionType.NONE);
        }

        return specs;
    }

    /**
     * @return the preserveShelveset
     */
    public boolean isPreserveShelveset() {
        return preserveShelveset;
    }

    /**
     * @param preserveShelveset
     *        the preserveShelveset to set
     */
    public void setPreserveShelveset(final boolean preserveShelveset) {
        this.preserveShelveset = preserveShelveset;
    }

    /**
     * @return the restoreData
     */
    public boolean isRestoreData() {
        return restoreData;
    }

    /**
     * @param restoreData
     *        the restoreData to set
     */
    public void setRestoreData(final boolean restoreData) {
        this.restoreData = restoreData;
    }
}