com.microsoft.tfs.client.common.ui.views.TeamExplorerView.java Source code

Java tutorial

Introduction

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

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;

import com.microsoft.tfs.client.common.autoconnect.AutoConnector;
import com.microsoft.tfs.client.common.codemarker.CodeMarker;
import com.microsoft.tfs.client.common.codemarker.CodeMarkerDispatch;
import com.microsoft.tfs.client.common.repository.RepositoryManagerAdapter;
import com.microsoft.tfs.client.common.repository.RepositoryManagerEvent;
import com.microsoft.tfs.client.common.ui.Messages;
import com.microsoft.tfs.client.common.ui.TFSCommonUIClientPlugin;
import com.microsoft.tfs.client.common.ui.controls.teamexplorer.TeamExplorerControl;
import com.microsoft.tfs.client.common.ui.feedback.FeedbackAction;
import com.microsoft.tfs.client.common.ui.framework.action.ToolbarPulldownAction;
import com.microsoft.tfs.client.common.ui.framework.image.ImageHelper;
import com.microsoft.tfs.client.common.ui.productplugin.TFSProductPlugin;
import com.microsoft.tfs.client.common.ui.teamexplorer.TeamExplorerContext;
import com.microsoft.tfs.client.common.ui.teamexplorer.TeamExplorerNavigationListener;
import com.microsoft.tfs.client.common.ui.teamexplorer.TeamExplorerNavigator;
import com.microsoft.tfs.client.common.ui.teamexplorer.helpers.ConnectHelpers;
import com.microsoft.tfs.client.common.ui.teamexplorer.helpers.WebAccessHelper;
import com.microsoft.tfs.client.common.ui.teamexplorer.internal.TeamExplorerConfig;
import com.microsoft.tfs.client.common.ui.teamexplorer.internal.TeamExplorerNavigationItemConfig;
import com.microsoft.tfs.core.ConnectivityFailureStatusChangeListener;
import com.microsoft.tfs.core.clients.versioncontrol.events.WorkspaceUpdatedEvent;
import com.microsoft.tfs.core.clients.versioncontrol.events.WorkspaceUpdatedListener;

public class TeamExplorerView extends ViewPart implements ITeamExplorerView {
    public static final String ID = "com.microsoft.tfs.client.common.ui.views.TeamExplorerView"; //$NON-NLS-1$

    public static final CodeMarker FINISH_TEAM_EXPLORER_LOADING = new CodeMarker(
            "com.microsoft.tfs.client.common.ui.views.TeamExplorerView#loaded"); //$NON-NLS-1$

    private final TeamExplorerConfig configuration;
    private final TeamExplorerContext context;
    private final TeamExplorerNavigator navigator;

    private final RepositoryListener repositoryListener = new RepositoryListener();
    private final NavigationListener navigationListener = new NavigationListener();

    private IAction backAction;
    private IAction forwardAction;
    final ImageHelper imageHelper = new ImageHelper(TFSCommonUIClientPlugin.PLUGIN_ID);

    private TeamExplorerControl control;

    public TeamExplorerView() {
        configuration = new TeamExplorerConfig();
        context = new TeamExplorerContext(this);
        navigator = new TeamExplorerNavigator();

        final TFSProductPlugin plugin = TFSCommonUIClientPlugin.getDefault().getProductPlugin();
        plugin.getRepositoryManager().addListener(repositoryListener);
        final AutoConnector connector = plugin.getAutoConnector();
        if (!connector.isStarted()) {
            connector.start();
        }
    }

    @Override
    public void dispose() {
        super.dispose();
        imageHelper.dispose();
        final TFSProductPlugin plugin = TFSCommonUIClientPlugin.getDefault().getProductPlugin();
        plugin.getRepositoryManager().removeListener(repositoryListener);
    }

    @Override
    public void createPartControl(final Composite parent) {
        control = new TeamExplorerControl(configuration, context, navigator, parent, SWT.NONE);

        final IActionBars bars = getViewSite().getActionBars();
        final IToolBarManager toolbarManager = bars.getToolBarManager();

        backAction = new BackAction();
        forwardAction = new ForwardAction();

        toolbarManager.add(backAction);
        toolbarManager.add(forwardAction);
        toolbarManager.add(new HomeAction());
        toolbarManager.add(new Separator());
        toolbarManager.add(new WebPortalAction());
        toolbarManager.add(new ConnectToServerAction());
        toolbarManager.add(new Separator());
        toolbarManager.add(new RefreshAction());
        toolbarManager.add(new Separator());
        toolbarManager.add(buildFeedbackAction());

        navigator.addListener(navigationListener);
        navigator.navigateToItem(configuration.getHomeNavigationItem());

        control.addDisposeListener(new DisposeListener() {
            @Override
            public void widgetDisposed(final DisposeEvent e) {
                navigator.removeListener(navigationListener);
            }
        });

        CodeMarkerDispatch.dispatch(FINISH_TEAM_EXPLORER_LOADING);

    }

    @Override
    public TeamExplorerContext getContext() {
        return context;
    }

    @Override
    public void refresh() {
        TeamExplorerNavigationItemConfig item = navigator.getCurrentItem();
        if (item == null) {
            item = configuration.getHomeNavigationItem();
        }

        control.refreshModelAndView(item);
    }

    @Override
    public void setFocus() {
        control.setFocus();
    }

    public void navigateToPageID(final String pageID) {
        final TeamExplorerNavigationItemConfig currentItem = navigator.getCurrentItem();
        if (currentItem == null || currentItem.getTargetPageID().equals(pageID)) {
            return;
        }

        for (final TeamExplorerNavigationItemConfig configItem : configuration.getNavigationItems()) {
            if (configItem.getTargetPageID().equals(pageID)) {
                navigator.navigateToItem(configItem);
                return;
            }
        }
    }

    private final class NavigationListener implements TeamExplorerNavigationListener {
        @Override
        public void navigateToItem(TeamExplorerNavigationItemConfig item) {
            if (item == null) {
                item = configuration.getHomeNavigationItem();
            }

            control.showPageForItem(item);
        }

        @Override
        public void navigationHistoryChanged() {
            backAction.setEnabled(navigator.hasPrevious());
            forwardAction.setEnabled(navigator.hasNext());
        }
    }

    private final class RepositoryListener extends RepositoryManagerAdapter {
        private class UpdatedListener implements WorkspaceUpdatedListener {
            @Override
            public void onWorkspaceUpdated(final WorkspaceUpdatedEvent e) {
                /*
                 * Refresh the control if the workspace location changed.
                 *
                 * The original location will be null when this event comes from
                 * IPC, so don't consider that a change.
                 */
                if (e.getOriginalLocation() != null && e.getOriginalLocation() != e.getWorkspace().getLocation()) {
                    context.refresh();
                    navigator.resetNavigation(context);
                }
            }
        }

        private class CoreConnectivityFailureStatusChangeListener
                implements ConnectivityFailureStatusChangeListener {
            @Override
            public void onConnectivityFailureStatusChange() {
                TeamExplorerNavigationItemConfig item = navigator.getCurrentItem();
                if (item == null) {
                    item = configuration.getHomeNavigationItem();
                }

                control.refreshView(item);
            }
        }

        private final UpdatedListener updatedListener = new UpdatedListener();
        private final ConnectivityFailureStatusChangeListener connectivityListener = new CoreConnectivityFailureStatusChangeListener();

        @Override
        public void onRepositoryAdded(final RepositoryManagerEvent event) {
            event.getRepository().getVersionControlClient().getEventEngine()
                    .addWorkspaceUpdatedListener(updatedListener);
            event.getRepository().getConnection().addConnectivityFailureStatusChangeListener(connectivityListener);
        }

        @Override
        public void onRepositoryRemoved(final RepositoryManagerEvent event) {
            event.getRepository().getVersionControlClient().getEventEngine()
                    .removeWorkspaceUpdatedListener(updatedListener);
            event.getRepository().getConnection()
                    .removeConnectivityFailureStatusChangeListener(connectivityListener);
        }

        @Override
        public void onDefaultRepositoryChanged(final RepositoryManagerEvent event) {
            context.refresh();
            navigator.resetNavigation(context);
        }
    }

    private final class RefreshAction extends Action {
        public RefreshAction() {
            setText(Messages.getString("TeamExplorerView.RefershActionText")); //$NON-NLS-1$
            setToolTipText(Messages.getString("TeamExplorerView.RefreshActionTooltip")); //$NON-NLS-1$

            setImageDescriptor(imageHelper.getImageDescriptor("/images/common/refresh.gif")); //$NON-NLS-1$
            setDisabledImageDescriptor(imageHelper.getImageDescriptor("/images/common/refresh_disabled.gif")); //$NON-NLS-1$
        }

        @Override
        public void run() {
            refresh();
        }
    }

    private final class HomeAction extends Action {
        public HomeAction() {
            setText(Messages.getString("TeamExplorerView.HomeText")); //$NON-NLS-1$
            setToolTipText(Messages.getString("TeamExplorerView.HomeToolTip")); //$NON-NLS-1$

            final ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
            setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_ETOOL_HOME_NAV));
        }

        @Override
        public void run() {
            if (navigator.getCurrentItem() != configuration.getHomeNavigationItem()) {
                navigator.navigateToItem(configuration.getHomeNavigationItem());
            }
        }
    }

    private final class WebPortalAction extends Action {
        public WebPortalAction() {
            setText(Messages.getString("TeamExplorerView.WebPortalName")); //$NON-NLS-1$
            setToolTipText(Messages.getString("TeamExplorerView.WebPortalName")); //$NON-NLS-1$
            setImageDescriptor(imageHelper.getImageDescriptor("images/common/internal_browser.gif")); //$NON-NLS-1$
        }

        @Override
        public void run() {
            WebAccessHelper.openWebAccess(context);
        }
    }

    private class ConnectToServerAction extends Action {
        public ConnectToServerAction() {
            setText(Messages.getString("TeamExplorerView.ConnectToServerText")); //$NON-NLS-1$
            setToolTipText(Messages.getString("TeamExplorerView.ConnectToServerText")); //$NON-NLS-1$
            setImageDescriptor(imageHelper.getImageDescriptor("images/common/ConnectToTfs.png")); //$NON-NLS-1$
        }

        @Override
        public void run() {
            ConnectHelpers.connectToServer(control.getShell());
        }
    }

    private final class ForwardAction extends Action {
        public ForwardAction() {
            setText(Messages.getString("TeamExplorerView.ForwardText")); //$NON-NLS-1$
            setToolTipText(Messages.getString("TeamExplorerView.ForwardToolTip")); //$NON-NLS-1$

            final ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
            setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD));
            setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_FORWARD_DISABLED));
        }

        @Override
        public void run() {
            navigator.navigateForward();
        }
    }

    private final class BackAction extends Action {
        public BackAction() {
            setText(Messages.getString("TeamExplorerView.BackText")); //$NON-NLS-1$
            setToolTipText(Messages.getString("TeamExplorerView.BackToolTip")); //$NON-NLS-1$

            final ISharedImages images = PlatformUI.getWorkbench().getSharedImages();
            setImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_BACK));
            setDisabledImageDescriptor(images.getImageDescriptor(ISharedImages.IMG_TOOL_BACK_DISABLED));
        }

        @Override
        public void run() {
            navigator.navigateBack();
        }
    }

    private IAction buildFeedbackAction() {
        final ToolbarPulldownAction feedbackAction = new ToolbarPulldownAction(true);
        feedbackAction.setToolTipText(Messages.getString("FeedbackButton.Tooltip")); //$NON-NLS-1$
        feedbackAction.setImageDescriptor(imageHelper.getImageDescriptor("images/common/smile.png")); //$NON-NLS-1$

        feedbackAction.addSubAction(new Action() {
            @Override
            public String getText() {
                return Messages.getString("FeedbackButton.SendSmile"); //$NON-NLS-1$
            }

            @Override
            public ImageDescriptor getImageDescriptor() {
                return imageHelper.getImageDescriptor("images/common/smile.png"); //$NON-NLS-1$
            }

            @Override
            public void run() {
                feedbackPressed(true);
            }
        });
        feedbackAction.addSubAction(new Action() {
            @Override
            public String getText() {
                return Messages.getString("FeedbackButton.SendFrown"); //$NON-NLS-1$
            }

            @Override
            public ImageDescriptor getImageDescriptor() {
                return imageHelper.getImageDescriptor("images/common/frown.png"); //$NON-NLS-1$
            }

            @Override
            public void run() {
                feedbackPressed(false);
            }
        });

        return feedbackAction;
    }

    private void feedbackPressed(final boolean smile) {
        final String viewContext = navigator.getCurrentItem().getID();
        new FeedbackAction(viewContext, smile).run(null);
    }

}