com.microsoft.tfs.client.eclipse.ui.filemodification.TFSFileModificationUIOptionsProvider.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.eclipse.ui.filemodification.TFSFileModificationUIOptionsProvider.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.filemodification;

import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.widgets.Shell;

import com.microsoft.tfs.client.common.ui.TFSCommonUIClientPlugin;
import com.microsoft.tfs.client.common.ui.dialogs.vc.CheckoutDialog;
import com.microsoft.tfs.client.common.ui.prefs.UIPreferenceConstants;
import com.microsoft.tfs.client.common.vc.TypedItemSpec;
import com.microsoft.tfs.client.eclipse.filemodification.TFSFileModificationOptions;
import com.microsoft.tfs.client.eclipse.filemodification.TFSFileModificationOptionsProvider;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.ItemType;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.LockLevel;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.RecursionType;
import com.microsoft.tfs.util.Check;

public class TFSFileModificationUIOptionsProvider implements TFSFileModificationOptionsProvider {
    private final Shell shell;

    public TFSFileModificationUIOptionsProvider(final Shell shell) {
        Check.notNull(shell, "shell"); //$NON-NLS-1$

        this.shell = shell;
    }

    @Override
    public TFSFileModificationOptions getOptions(String[] serverPaths, final LockLevel forcedLockLevel) {
        final LockLevel defaultLockLevel = CheckoutDialog.getDefaultLockLevel();

        final IPreferenceStore preferenceStore = TFSCommonUIClientPlugin.getDefault().getPreferenceStore();

        final boolean isSynchronous = preferenceStore.getBoolean(UIPreferenceConstants.CHECKOUT_SYNCHRONOUS);
        final boolean isForeground = preferenceStore.getBoolean(UIPreferenceConstants.CHECKOUT_FOREGROUND);
        final boolean isGetLatest = preferenceStore.getBoolean(UIPreferenceConstants.GET_LATEST_ON_CHECKOUT);

        if (!preferenceStore.getBoolean(UIPreferenceConstants.PROMPT_BEFORE_CHECKOUT)) {
            final LockLevel lockLevel = forcedLockLevel != null ? forcedLockLevel : defaultLockLevel;

            return new TFSFileModificationOptions(Status.OK_STATUS, serverPaths, lockLevel, isSynchronous,
                    isForeground, isGetLatest);
        }

        TypedItemSpec[] serverItems = new TypedItemSpec[serverPaths.length];

        for (int i = 0; i < serverPaths.length; i++) {
            serverItems[i] = new TypedItemSpec(serverPaths[i], RecursionType.NONE, ItemType.FILE);
        }

        final CheckoutDialogRunnable dialogRunnable = new CheckoutDialogRunnable(shell, serverItems,
                forcedLockLevel);

        shell.getDisplay().syncExec(new Runnable() {
            @Override
            public void run() {
                dialogRunnable.run();
            }
        });

        if (dialogRunnable.getResult() != IDialogConstants.OK_ID) {
            return new TFSFileModificationOptions(Status.CANCEL_STATUS);
        }

        serverItems = dialogRunnable.getItemSpecs();
        final LockLevel lockLevel = dialogRunnable.getLockLevel();

        serverPaths = new String[serverItems.length];

        for (int i = 0; i < serverItems.length; i++) {
            serverPaths[i] = serverItems[i].getItem();
        }

        return new TFSFileModificationOptions(Status.OK_STATUS, serverPaths, lockLevel, true, true, isGetLatest);
    }

    private static final class CheckoutDialogRunnable implements Runnable {
        /* Synchronize for visibility */
        private final Object lock = new Object();

        private final Shell shell;
        private TypedItemSpec[] itemSpecs;
        private LockLevel lockLevel;
        private int result;

        public CheckoutDialogRunnable(final Shell shell, final TypedItemSpec[] itemSpecs,
                final LockLevel lockLevel) {
            this.shell = shell;
            this.itemSpecs = itemSpecs;
            this.lockLevel = lockLevel;
        }

        @Override
        public void run() {
            synchronized (lock) {
                final CheckoutDialog checkoutDialog = new CheckoutDialog(shell, itemSpecs, lockLevel);

                if ((result = checkoutDialog.open()) != IDialogConstants.OK_ID) {
                    return;
                }

                itemSpecs = checkoutDialog.getCheckedTypedItemSpecs();
                lockLevel = checkoutDialog.getLockLevel();
            }
        }

        public int getResult() {
            synchronized (lock) {
                return result;
            }
        }

        public TypedItemSpec[] getItemSpecs() {
            synchronized (lock) {
                return itemSpecs;
            }
        }

        public LockLevel getLockLevel() {
            synchronized (lock) {
                return lockLevel;
            }
        }
    }
}