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

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.common.ui.dialogs.vc.MultipleConflictResolutionDialog.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 java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

import com.microsoft.tfs.client.common.ui.Messages;
import com.microsoft.tfs.client.common.ui.controls.vc.MultipleConflictResolutionControl;
import com.microsoft.tfs.client.common.ui.framework.dialog.BaseDialog;
import com.microsoft.tfs.core.clients.versioncontrol.conflicts.ConflictCategory;
import com.microsoft.tfs.core.clients.versioncontrol.conflicts.ConflictDescription;
import com.microsoft.tfs.core.clients.versioncontrol.conflicts.resolutions.ConflictResolution;

/**
 * MultipleConflictResolutionDialog offers resolution of multiple conflicts
 * (which may be multiple types of conflicts: eg, version, writable, etc.)
 */
public class MultipleConflictResolutionDialog extends BaseDialog {
    private final Map descriptionsByCategory = new TreeMap();
    private final Map controlsByCategory = new HashMap();

    private final Map resolutionsByCategory = new HashMap();

    public MultipleConflictResolutionDialog(final Shell parentShell, final ConflictDescription[] descriptions) {
        super(parentShell);

        setOptionResizable(false);
        setOptionPersistGeometry(false);

        setConflictDescriptions(descriptions);
    }

    public void setConflictDescriptions(final ConflictDescription[] descriptions) {
        descriptionsByCategory.clear();

        for (int i = 0; i < descriptions.length; i++) {
            final ConflictCategory conflictCategory = descriptions[i].getConflictCategory();
            List descriptionList = (List) descriptionsByCategory.get(conflictCategory);

            if (descriptionList == null) {
                descriptionList = new ArrayList();
                descriptionsByCategory.put(conflictCategory, descriptionList);
            }

            descriptionList.add(descriptions[i]);
        }
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.microsoft.tfs.client.common.ui.shared.dialog.BaseDialog#
     * hookAddToDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected void hookAddToDialogArea(final Composite dialogArea) {
        final GridLayout dialogLayout = new GridLayout(1, true);
        dialogLayout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
        dialogLayout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        dialogLayout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        dialogArea.setLayout(dialogLayout);

        controlsByCategory.clear();

        final Label explanationLabel = new Label(dialogArea, SWT.WRAP);
        explanationLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        explanationLabel.setText(Messages.getString("MultipleConflictResolutionDialog.ExplainLabelText")); //$NON-NLS-1$

        /* Add some additional spacing */
        final Composite spacer = new Composite(dialogArea, SWT.NONE);
        spacer.setLayoutData(new GridData(1, 1));

        // get the conflict types...
        final Iterator i = descriptionsByCategory.keySet().iterator();
        while (i.hasNext()) {
            final ConflictCategory conflictCategory = (ConflictCategory) i.next();
            final List descriptions = (List) descriptionsByCategory.get(conflictCategory);

            final ConflictCategory category = ((ConflictDescription) descriptions.get(0)).getConflictCategory();

            final MultipleConflictResolutionControl resolveControl = new MultipleConflictResolutionControl(
                    dialogArea, SWT.NONE);

            resolveControl.setConflictCategory(category);
            resolveControl.setConflictCount(descriptions.size());

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

            resolveControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

            controlsByCategory.put(conflictCategory, resolveControl);
        }
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.microsoft.tfs.client.common.ui.shared.dialog.BaseDialog#
     * hookDialogAboutToClose()
     */
    @Override
    protected void hookDialogAboutToClose() {
        final Iterator i = controlsByCategory.keySet().iterator();
        while (i.hasNext()) {
            final ConflictCategory conflictCategory = (ConflictCategory) i.next();

            final MultipleConflictResolutionControl resolveControl = (MultipleConflictResolutionControl) controlsByCategory
                    .get(conflictCategory);

            resolutionsByCategory.put(conflictCategory, resolveControl.getResolution());
        }
    }

    public ConflictResolution getResolution(final ConflictDescription description) {
        final ConflictCategory conflictCategory = description.getConflictCategory();
        final ConflictResolution dummyResolution = (ConflictResolution) resolutionsByCategory.get(conflictCategory);

        if (dummyResolution == null) {
            return null;
        }

        return dummyResolution.newForConflictDescription(description);
    }

    @Override
    protected void hookAfterButtonsCreated() {
        getButton(IDialogConstants.OK_ID).setEnabled(false);
    }

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

    private void updateSelection() {
        boolean okEnabled = false;

        for (final Iterator i = controlsByCategory.keySet().iterator(); i.hasNext();) {
            final MultipleConflictResolutionControl control = (MultipleConflictResolutionControl) controlsByCategory
                    .get(i.next());

            if (control.getSelection()) {
                okEnabled = true;
                break;
            }
        }

        getButton(IDialogConstants.OK_ID).setEnabled(okEnabled);
    }
}