com.microsoft.tfs.client.common.ui.controls.connect.ServerListControl.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.common.ui.controls.connect.ServerListControl.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.controls.connect;

import java.net.URI;
import java.text.MessageFormat;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;

import com.microsoft.tfs.client.common.credentials.CredentialsHelper;
import com.microsoft.tfs.client.common.credentials.EclipseCredentialsManagerFactory;
import com.microsoft.tfs.client.common.ui.Messages;
import com.microsoft.tfs.client.common.ui.controls.generic.BaseControl;
import com.microsoft.tfs.client.common.ui.dialogs.connect.AddServerDialog;
import com.microsoft.tfs.client.common.ui.framework.helper.SWTUtil;
import com.microsoft.tfs.client.common.ui.framework.layout.GridDataBuilder;
import com.microsoft.tfs.client.common.ui.framework.validation.ButtonValidatorBinding;
import com.microsoft.tfs.client.common.ui.helpers.AutomationIDHelper;
import com.microsoft.tfs.client.common.ui.helpers.UIConnectionPersistence;
import com.microsoft.tfs.core.TFSConnection;
import com.microsoft.tfs.core.config.persistence.DefaultPersistenceStoreProvider;
import com.microsoft.tfs.core.credentials.CredentialsManager;
import com.microsoft.tfs.core.util.ServerURIUtils;
import com.microsoft.tfs.core.util.serverlist.ServerList;
import com.microsoft.tfs.core.util.serverlist.ServerListConfigurationEntry;
import com.microsoft.tfs.util.listeners.SingleListenerFacade;

public class ServerListControl extends BaseControl {
    public static final String SERVERS_TABLE_ID = "ServerListControl.profilesTable"; //$NON-NLS-1$
    public static final String ADD_BUTTON_ID = "ServerListControl.addButton"; //$NON-NLS-1$
    public static final String DELETE_BUTTON_ID = "ServerListControl.deleteButton"; //$NON-NLS-1$
    public static final String CLEAR_BUTTON_ID = "ServerListControl.clearButton"; //$NON-NLS-1$

    private final ServerListTable serverListTable;

    private ServerList serverList;

    private ServerListConfigurationEntry lastAddedServerListEntry;
    private TFSConnection lastAddedConnection;

    private final SingleListenerFacade doubleClickListeners = new SingleListenerFacade(IDoubleClickListener.class);

    public ServerListControl(final Composite parent, final int style) {
        super(parent, style);

        final GridLayout layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.horizontalSpacing = getHorizontalSpacing();
        layout.verticalSpacing = getVerticalSpacing();
        setLayout(layout);

        serverListTable = new ServerListTable(this, SWT.FULL_SELECTION | SWT.MULTI);
        AutomationIDHelper.setWidgetID(serverListTable.getTable(), SERVERS_TABLE_ID);
        GridDataBuilder.newInstance().grab().fill().vSpan(5).applyTo(serverListTable);

        serverListTable.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(final DoubleClickEvent event) {
                ServerListControl.this.onTableDoubleClick(event);
            }
        });

        final Button addButton = SWTUtil.createButton(this, Messages.getString("ServerListControl.AddButtonText")); //$NON-NLS-1$
        AutomationIDHelper.setWidgetID(addButton, ADD_BUTTON_ID);
        GridDataBuilder.newInstance().hFill().wButtonHint(addButton).applyTo(addButton);
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                ServerListControl.this.onAddButtonSelected(e);
            }
        });

        final Button deleteButton = SWTUtil.createButton(this,
                Messages.getString("ServerListControl.DeleteButtonText")); //$NON-NLS-1$
        AutomationIDHelper.setWidgetID(deleteButton, DELETE_BUTTON_ID);
        GridDataBuilder.newInstance().hFill().wButtonHint(deleteButton).applyTo(deleteButton);
        deleteButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                ServerListControl.this.onDeleteButtonSelected(e);
            }
        });
        new ButtonValidatorBinding(deleteButton).bind(serverListTable.getSelectionValidator());

        final Button clearButton = SWTUtil.createButton(this,
                Messages.getString("ServerListControl.ClearButtonText")); //$NON-NLS-1$
        AutomationIDHelper.setWidgetID(deleteButton, CLEAR_BUTTON_ID);
        GridDataBuilder.newInstance().hFill().wButtonHint(clearButton).applyTo(clearButton);
        clearButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(final SelectionEvent e) {
                ServerListControl.this.onClearButtonSelected(e);
            }
        });
        new ButtonValidatorBinding(clearButton).bind(serverListTable.getSelectionValidator());

        serverListTable.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                final ServerListConfigurationEntry[] selectedEntries = serverListTable
                        .getSelectedServerListEntries();
                boolean currentServerSelected = false;
                for (final ServerListConfigurationEntry selectedEntry : selectedEntries) {
                    if (selectedEntry.getURI()
                            .equals(UIConnectionPersistence.getInstance().getLastUsedServerURI())) {
                        currentServerSelected = true;
                        break;
                    }
                }

                // Disable the delete button in case the currently used server
                // is selected
                deleteButton.setEnabled(!currentServerSelected);

            }
        });
    }

    public void setServerList(final ServerList serverList) {
        this.serverList = serverList;
        refreshTable();
    }

    public ServerListConfigurationEntry[] getSelectedServerListEntries() {
        return serverListTable.getSelectedServerListEntries();
    }

    public ServerListConfigurationEntry getLastAddedServerListEntry() {
        return lastAddedServerListEntry;
    }

    public TFSConnection getLastAddedConnection() {
        return lastAddedConnection;
    }

    private void refreshTable() {
        final ServerListConfigurationEntry[] serverListEntries = serverList.getServers()
                .toArray(new ServerListConfigurationEntry[serverList.getServers().size()]);
        serverListTable.setServerListEntries(serverListEntries);
    }

    private void onAddButtonSelected(final SelectionEvent e) {
        final AddServerDialog dialog = new AddServerDialog(getShell());
        dialog.setServerList(serverList);

        if (dialog.open() == IDialogConstants.OK_ID) {
            lastAddedServerListEntry = dialog.getServerListEntry();
            lastAddedConnection = dialog.getConnection();

            serverList.add(lastAddedServerListEntry);
            refreshTable();
            serverListTable.setFocus();
        }
    }

    private void onDeleteButtonSelected(final SelectionEvent e) {
        final ServerListConfigurationEntry[] serverListEntries = serverListTable.getSelectedServerListEntries();

        final String title;
        final String message;

        if (serverListEntries.length == 1) {
            title = Messages.getString("ServerListControl.RemoveServerTitle"); //$NON-NLS-1$
            message = MessageFormat.format(Messages.getString("ServerListControl.RemoveServerPromptFormat"), //$NON-NLS-1$
                    serverListEntries[0].getName());
        } else {
            title = Messages.getString("ServerListControl.RemoveServersTitle"); //$NON-NLS-1$
            message = Messages.getString("ServerListControl.RemoveServersPrompt"); //$NON-NLS-1$
        }

        if (MessageDialog.openQuestion(getShell(), title, message) == false) {
            return;
        }

        removeCredentials(serverListEntries);

        for (int i = 0; i < serverListEntries.length; i++) {
            final ServerListConfigurationEntry serverListEntry = serverListEntries[i];

            serverList.remove(serverListEntry);

            if (lastAddedServerListEntry == serverListEntry) {
                lastAddedServerListEntry = null;
                lastAddedConnection = null;
            }
        }

        refreshTable();
        serverListTable.setFocus();
    }

    private void onClearButtonSelected(final SelectionEvent e) {
        final ServerListConfigurationEntry[] serverListEntries = serverListTable.getSelectedServerListEntries();

        final String title;
        final String message;

        if (serverListEntries.length == 1) {
            title = Messages.getString("ServerListControl.ClearServersTitle"); //$NON-NLS-1$
            message = MessageFormat.format(Messages.getString("ServerListControl.ClearServerPromptFormat"), //$NON-NLS-1$
                    serverListEntries[0].getName());
        } else {
            title = Messages.getString("ServerListControl.ClearServersTitle"); //$NON-NLS-1$
            message = Messages.getString("ServerListControl.ClearServersPrompt"); //$NON-NLS-1$
        }

        if (!MessageDialog.openQuestion(getShell(), title, message)) {
            return;
        }

        removeCredentials(serverListEntries);

        refreshTable();
        serverListTable.setFocus();
    }

    private void removeCredentials(final ServerListConfigurationEntry[] serverListEntries) {

        final CredentialsManager teeCredentialsProvider = EclipseCredentialsManagerFactory
                .getCredentialsManager(DefaultPersistenceStoreProvider.INSTANCE);
        final CredentialsManager gitCredentialsProvider = EclipseCredentialsManagerFactory
                .getGitCredentialsManager();

        boolean removeOAuth2Token = false;
        for (int i = 0; i < serverListEntries.length; i++) {
            final ServerListConfigurationEntry serverListEntry = serverListEntries[i];
            final URI url = serverListEntry.getURI();

            teeCredentialsProvider.removeCredentials(url);
            gitCredentialsProvider.removeCredentials(url);

            // Remove from OAuth2 access token from the internal store
            removeOAuth2Token = removeOAuth2Token || ServerURIUtils.isHosted(url);
        }

        if (removeOAuth2Token) {
            /*
             * Removing the token pair from the internal store. Next time we
             * connect to a VSTS account that does not have saved PAT, the user
             * will be prompted for credentials.
             */
            CredentialsHelper.removeOAuth2Token(true);
        }
    }

    private void onTableDoubleClick(final DoubleClickEvent event) {
        ((IDoubleClickListener) doubleClickListeners.getListener()).doubleClick(event);
    }

    public void addDoubleClickListener(final IDoubleClickListener listener) {
        doubleClickListeners.addListener(listener);
    }

    public void removeDoubleClickListener(final IDoubleClickListener listener) {
        doubleClickListeners.removeListener(listener);
    }
}