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

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.common.ui.dialogs.vc.SetWorkingFolderDialog.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.io.File;
import java.text.MessageFormat;

import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import com.microsoft.tfs.client.common.ui.Messages;
import com.microsoft.tfs.client.common.ui.framework.dialog.BaseDialog;
import com.microsoft.tfs.client.common.ui.framework.helper.ButtonHelper;
import com.microsoft.tfs.client.common.ui.framework.helper.SWTUtil;
import com.microsoft.tfs.client.common.ui.framework.sizing.ControlSize;
import com.microsoft.tfs.client.common.ui.helpers.AutomationIDHelper;
import com.microsoft.tfs.core.clients.versioncontrol.SupportedFeatures;
import com.microsoft.tfs.core.clients.versioncontrol.path.LocalPath;
import com.microsoft.tfs.core.clients.versioncontrol.path.ServerPath;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.RecursionType;
import com.microsoft.tfs.core.clients.versioncontrol.soapextensions.Workspace;
import com.microsoft.tfs.core.clients.versioncontrol.specs.WorkspaceSpec;
import com.microsoft.tfs.util.Check;

public class SetWorkingFolderDialog extends BaseDialog {
    public static final String LOCALFOLDER_TEXT_ID = "SetWorkingFolderDialog.localFolderField"; //$NON-NLS-1$

    private String purpose = null;
    private String mappingStatus = null;

    private String localFolder;
    private String repositoryFolder;
    private final Workspace workspace;

    private Button browseLocalFolder;
    private Text statusText;
    private Text localFolderField;
    private Text repositoryFolderField;
    private boolean isRecursive = true;

    public SetWorkingFolderDialog(final Shell shell, final Workspace workspace, final String serverPath,
            final String purpose) {
        this(shell, workspace, serverPath, purpose, null, false);
    }

    public SetWorkingFolderDialog(final Shell shell, final Workspace workspace, final String serverPath,
            final String purpose, final String localPathHint, final boolean showStatus) {
        super(shell);

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

        this.workspace = workspace;
        this.repositoryFolder = serverPath;
        this.purpose = purpose;
        this.localFolder = (localPathHint == null) ? "" : localPathHint; //$NON-NLS-1$

        if (showStatus) {
            this.mappingStatus = ModifyFolderMappingDialog.getMappingStatusText(workspace, serverPath);
        }
        setOptionResizableDirections(SWT.HORIZONTAL);
    }

    @Override
    protected Control createDialogArea(final Composite parent) {
        final Composite container = (Composite) super.createDialogArea(parent);

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

        if (purpose != null) {
            final Label purposeLabel = new Label(container, SWT.NONE);
            purposeLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 3, 1));
            purposeLabel.setText(purpose);
        }

        if (mappingStatus != null) {
            final Label statusLabel = new Label(container, SWT.NONE);
            statusLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 3, 1));
            statusLabel.setText(Messages.getString("SetWorkingFolderDialog.CurrentStatusHeaderLabel")); //$NON-NLS-1$

            statusText = new Text(container, SWT.BORDER);
            statusText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
            statusText.setText(mappingStatus);
            statusText.setEnabled(false);
        }

        final Label label = new Label(container, SWT.NONE);
        label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 3, 1));
        label.setText(provideServerFolderLabelText());

        repositoryFolderField = new Text(container, SWT.BORDER);
        repositoryFolderField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        repositoryFolderField.setText(repositoryFolder);
        repositoryFolderField.setEditable(false);

        // fill the last cell on this grid row with a spacer.
        SWTUtil.createGridLayoutSpacer(container);

        final Label label_1 = new Label(container, SWT.NONE);
        label_1.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 3, 1));
        label_1.setText(Messages.getString("SetWorkingFolderDialog.LocalFolderLabelText")); //$NON-NLS-1$

        localFolderField = new Text(container, SWT.BORDER);
        AutomationIDHelper.setWidgetID(localFolderField, LOCALFOLDER_TEXT_ID);
        localFolderField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        localFolderField.setText(localFolder);
        localFolderField.addModifyListener(new ModifyListener() {
            @Override
            public void modifyText(final ModifyEvent e) {
                validate();
            }
        });

        browseLocalFolder = new Button(container, SWT.NONE);
        browseLocalFolder.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
        browseLocalFolder.setText(Messages.getString("SetWorkingFolderDialog.BrowseLocalButtonText")); //$NON-NLS-1$
        browseLocalFolder.addSelectionListener(new SelectionListener() {
            @Override
            public void widgetDefaultSelected(final SelectionEvent e) {
                browseLocalFolderClicked();
            }

            @Override
            public void widgetSelected(final SelectionEvent e) {
                browseLocalFolderClicked();
            }
        });

        if (workspace.getClient().getServerSupportedFeatures().contains(SupportedFeatures.ONE_LEVEL_MAPPING)) {
            final Button checkRecursive = new Button(container, SWT.CHECK);
            checkRecursive.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
            checkRecursive.setText(Messages.getString("SetWorkingFolderDialog.RecursiveCheckboxText")); //$NON-NLS-1$
            checkRecursive.setSelection(isRecursive);
            checkRecursive.addSelectionListener(new SelectionListener() {
                @Override
                public void widgetSelected(final SelectionEvent e) {
                    isRecursive = checkRecursive.getSelection();
                }

                @Override
                public void widgetDefaultSelected(final SelectionEvent e) {
                    isRecursive = checkRecursive.getSelection();
                }
            });
        }

        ControlSize.setCharWidthHint(repositoryFolderField, 80);

        localFolderField.setFocus();

        ButtonHelper.setButtonsToButtonBarSize(new Button[] { browseLocalFolder });

        return container;
    }

    /*
     * (non-Javadoc)
     *
     * @seecom.microsoft.tfs.client.common.ui.shared.dialog.BaseDialog#
     * hookAfterButtonsCreated()
     */
    @Override
    protected void hookAfterButtonsCreated() {
        validate();
    }

    private void browseLocalFolderClicked() {
        final DirectoryDialog dirDialog = new DirectoryDialog(getShell());

        dirDialog.setMessage(Messages.getString("SetWorkingFolderDialog.SelectLocalDialogText")); //$NON-NLS-1$

        final String selectedDir = dirDialog.open();

        if (selectedDir != null && selectedDir.length() > 0) {
            /*
             * Append the last segment of the server path to the local path.
             * There are some exceptions: if the repository path is invalid, or
             * is root, or the local path already ends with the exact same last
             * segment, we don't append (just use the browsed path).
             */
            final String browsedPath = new Path(selectedDir).toOSString();

            /*
             * Canonicalize strips any final slash, getFileName just gets the
             * last path part (doesn't know if it's a file or folder).
             */
            final String lastRepositoryPathSegment = ServerPath
                    .getFileName(ServerPath.canonicalize(repositoryFolder));

            if (ServerPath.isServerPath(repositoryFolder) == false
                    || ServerPath.equals(repositoryFolder, ServerPath.ROOT)
                    || LocalPath.equals(LocalPath.getFileName(browsedPath), lastRepositoryPathSegment)) {
                localFolder = browsedPath;
            } else if (ServerPath.isServerPath(repositoryFolder)) {
                // Valid path which needs the last segment appended.
                localFolder = new File(browsedPath, lastRepositoryPathSegment).getAbsolutePath();
            }

            localFolderField.setText(localFolder);
        }
        validate();
    }

    public String getLocalFolder() {
        return localFolder;
    }

    public String getRepositoryFolder() {
        return repositoryFolder;
    }

    public RecursionType getRecursionType() {
        return (isRecursive) ? RecursionType.FULL : RecursionType.ONE_LEVEL;
    }

    public void setPurpose(final String purpose) {
        this.purpose = purpose;
    }

    public void setMappingStatus(final String status) {
        this.mappingStatus = status;
    }

    private void validate() {
        final Button okButton = getButton(IDialogConstants.OK_ID);
        if (okButton != null) {
            okButton.setEnabled(isValid());
        }
    }

    private boolean isValid() {
        if (repositoryFolderField.getText().trim().length() < 1) {
            // No Server path specified
            return false;
        }

        if (localFolderField.getText().trim().length() < 1) {
            // No local path for an "Active" working folder mapping.
            return false;
        }

        localFolder = localFolderField.getText().trim();
        repositoryFolder = repositoryFolderField.getText().trim();

        return repositoryFolder.startsWith("$/"); //$NON-NLS-1$
    }

    /*
     * (non-Javadoc)
     *
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
    protected void okPressed() {
        localFolder = localFolderField.getText().trim();
        repositoryFolder = repositoryFolderField.getText().trim();

        // Verify we don't already have a mapping for this local path.
        if (localFolderAlreadyMapped()) {
            final WorkspaceSpec spec = new WorkspaceSpec(workspace.getName(), workspace.getOwnerDisplayName());

            final String title = Messages.getString("SetWorkingFolderDialog.ErrorDialogTitle"); //$NON-NLS-1$
            final String messageFormat = Messages.getString("SetWorkingFolderDialog.ErrorDialogTextFormat"); //$NON-NLS-1$
            final String message = MessageFormat.format(messageFormat, spec.toString(), localFolder);
            MessageDialog.openWarning(getShell(), title, message);

            // Don't exit the dialog.
            return;
        }

        super.okPressed();
    }

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

    protected String provideServerFolderLabelText() {
        return Messages.getString("SetWorkingFolderDialog.RepositoryFolderLabelText"); //$NON-NLS-1$
    }

    protected boolean localFolderAlreadyMapped() {
        return workspace.getExactMappingForLocalPath(localFolder) != null;
    }
}