org.eclipse.team.internal.ui.synchronize.SynchronizeModelManager.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.team.internal.ui.synchronize.SynchronizeModelManager.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.team.internal.ui.synchronize;

import java.util.*;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Display;
import org.eclipse.team.core.synchronize.SyncInfoSet;
import org.eclipse.team.internal.ui.*;
import org.eclipse.team.ui.synchronize.*;
import org.eclipse.ui.IActionBars;

/**
 * Manages the models that can be displayed by a synchronize page
 */
public abstract class SynchronizeModelManager extends SynchronizePageActionGroup {

    private static final String P_LAST_PROVIDER = TeamUIPlugin.ID + ".P_LAST_MODELPROVIDER"; //$NON-NLS-1$

    private ISynchronizeModelProvider modelProvider;
    private List toggleModelProviderActions;
    private ISynchronizePageConfiguration configuration;
    private TreeViewerAdvisor advisor;

    /**
     * Action that allows changing the model providers supported by this advisor.
     */
    private class ToggleModelProviderAction extends Action implements IPropertyChangeListener {
        private ISynchronizeModelProviderDescriptor descriptor;

        protected ToggleModelProviderAction(ISynchronizeModelProviderDescriptor descriptor) {
            super(descriptor.getName(), IAction.AS_RADIO_BUTTON);
            setImageDescriptor(descriptor.getImageDescriptor());
            setToolTipText(descriptor.getName());
            this.descriptor = descriptor;
            update();
            configuration.addPropertyChangeListener(this);
        }

        public void run() {
            if (!getSelectedProviderId().equals(descriptor.getId())) {
                setInput(descriptor.getId(), null);
            }
        }

        public void update() {
            setChecked(getSelectedProviderId().equals(descriptor.getId()));
        }

        /* (non-Javadoc)
         * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
         */
        public void propertyChange(PropertyChangeEvent event) {
            if (event.getProperty().equals(SynchronizePageConfiguration.P_MODEL)) {
                update();
            }
        }
    }

    public SynchronizeModelManager(ISynchronizePageConfiguration configuration) {
        Assert.isNotNull(configuration, "configuration cannot be null"); //$NON-NLS-1$
        this.configuration = configuration;
        configuration.addActionContribution(this);
    }

    /**
     * Initialize the model manager to be used with the provided advisor.
     * @param advisor the tree viewer advisor
     */
    public void setViewerAdvisor(TreeViewerAdvisor advisor) {
        this.advisor = advisor;
    }

    /**
     * Return the list of supported model providers for this advisor.
     * @return the supported models
     */
    protected abstract ISynchronizeModelProviderDescriptor[] getSupportedModelProviders();

    /**
     * Get the model provider that will be used to create the input
     * for the adviser's viewer.
     * @return the model provider
     */
    protected abstract ISynchronizeModelProvider createModelProvider(String id);

    /**
     * Return the provider that is currently active.
     * @return the provider that is currently active
     */
    public ISynchronizeModelProvider getActiveModelProvider() {
        return modelProvider;
    }

    protected String getDefaultProviderId() {
        String defaultLayout = TeamUIPlugin.getPlugin().getPreferenceStore()
                .getString(IPreferenceIds.SYNCVIEW_DEFAULT_LAYOUT);
        if (defaultLayout.equals(IPreferenceIds.TREE_LAYOUT)) {
            return HierarchicalModelProvider.HierarchicalModelProviderDescriptor.ID;
        }
        if (defaultLayout.equals(IPreferenceIds.FLAT_LAYOUT)) {
            return FlatModelProvider.FlatModelProviderDescriptor.ID;
        }
        // Return compressed folder is the others were not a match
        return CompressedFoldersModelProvider.CompressedFolderModelProviderDescriptor.ID;
    }

    /**
     * Return the id of the selected provider. By default, this is the 
     * id of the active provider. However, subclasses that use a composite
     * may return an id that differs from that of the active provider
     * and return an id of a sub-provider instead.
     * @return the id of the selected provider
     */
    protected String getSelectedProviderId() {
        ISynchronizeModelProvider provider = getActiveModelProvider();
        if (provider != null) {
            return provider.getDescriptor().getId();
        }
        return getDefaultProviderId();
    }

    /**
     * Replace the active provider with a provider for the given id.
     * The new provider is created and initialized and assigned
     * as the input of the viewer.
     * @param id the id used to configure the new model provider
     * @param monitor a progress monitor
     */
    protected void setInput(String id, IProgressMonitor monitor) {
        if (modelProvider != null) {
            modelProvider.saveState();
            modelProvider.dispose();
        }
        modelProvider = createModelProvider(id);
        saveProviderSettings(id);
        modelProvider.prepareInput(monitor);
        setInput();
    }

    /**
     * Save the settings for the currently active provider
     */
    protected void saveProviderSettings(String id) {
        IDialogSettings pageSettings = getConfiguration().getSite().getPageSettings();
        if (pageSettings != null) {
            pageSettings.put(P_LAST_PROVIDER, id);
        }
    }

    /**
     * Set the input of the viewer to the root model element.
     */
    protected void setInput() {
        configuration.setProperty(SynchronizePageConfiguration.P_MODEL, modelProvider.getModelRoot());
        if (advisor != null)
            advisor.setInput(modelProvider);
    }

    /**
     * Return the model root of the currently active model provider.
     * This method will wait until the model is done updating.
     * It is for use by test purposes only.
     * @return the model root
     */
    public ISynchronizeModelElement getModelRoot() {
        if (modelProvider != null && modelProvider instanceof SynchronizeModelProvider) {
            ((SynchronizeModelProvider) modelProvider).waitUntilDone(new IProgressMonitor() {
                public void beginTask(String name, int totalWork) {
                }

                public void done() {
                }

                public void internalWorked(double work) {
                }

                public boolean isCanceled() {
                    return false;
                }

                public void setCanceled(boolean value) {
                }

                public void setTaskName(String name) {
                }

                public void subTask(String name) {
                }

                public void worked(int work) {
                    while (Display.getCurrent().readAndDispatch()) {
                    }
                }
            });
            return modelProvider.getModelRoot();
        } else {
            return null;
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.synchronize.IActionContribution#initialize(org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration)
     */
    public void initialize(ISynchronizePageConfiguration configuration) {
        super.initialize(configuration);
        ISynchronizeModelProviderDescriptor[] providers = getSupportedModelProviders();
        // We only need switching of layouts if there is more than one model provider
        if (providers.length > 1) {
            toggleModelProviderActions = new ArrayList();
            for (int i = 0; i < providers.length; i++) {
                final ISynchronizeModelProviderDescriptor provider = providers[i];
                toggleModelProviderActions.add(new ToggleModelProviderAction(provider));
            }
        }
        // The input may of been set already. In that case, don't change it and
        // simply assign it to the view.
        if (modelProvider == null) {
            String defaultProviderId = getDefaultProviderId(); /* use providers prefered */
            IDialogSettings pageSettings = configuration.getSite().getPageSettings();
            if (pageSettings != null && pageSettings.get(P_LAST_PROVIDER) != null) {
                defaultProviderId = pageSettings.get(P_LAST_PROVIDER);
            }
            setInput(defaultProviderId, null);
        } else {
            setInput();
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.synchronize.IActionContribution#setActionBars(org.eclipse.ui.IActionBars)
     */
    public void fillActionBars(IActionBars actionBars) {
        if (toggleModelProviderActions == null)
            return;
        IToolBarManager toolbar = actionBars.getToolBarManager();
        IMenuManager menu = actionBars.getMenuManager();
        IContributionItem group = findGroup(menu, ISynchronizePageConfiguration.LAYOUT_GROUP);
        if (menu != null && group != null) {
            MenuManager layout = new MenuManager(Utils.getString("action.layout.label", Policy.getActionBundle())); //$NON-NLS-1$
            menu.appendToGroup(group.getId(), layout);
            appendToMenu(null, layout);
        } else if (toolbar != null) {
            group = findGroup(toolbar, ISynchronizePageConfiguration.LAYOUT_GROUP);
            if (group != null) {
                appendToMenu(group.getId(), toolbar);
            }
        }
    }

    private void appendToMenu(String groupId, IContributionManager menu) {
        for (Iterator iter = toggleModelProviderActions.iterator(); iter.hasNext();) {
            if (groupId == null) {
                menu.add((Action) iter.next());
            } else {
                menu.appendToGroup(groupId, (Action) iter.next());
            }
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.synchronize.IActionContribution#dispose()
     */
    public void dispose() {
        if (modelProvider != null) {
            modelProvider.dispose();
        }
        super.dispose();
    }

    /**
     * Returns the configuration
     * @return the configuration.
     */
    public ISynchronizePageConfiguration getConfiguration() {
        return configuration;
    }

    /**
     * Return the sync info set that is contained in the configuration.
     * @return the sync info set that is contained in the configuration
     */
    protected SyncInfoSet getSyncInfoSet() {
        return (SyncInfoSet) getConfiguration().getProperty(ISynchronizePageConfiguration.P_SYNC_INFO_SET);
    }
}