org.eclipse.team.ui.synchronize.ParticipantPageCompareEditorInput.java Source code

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (c) 2007 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.ui.synchronize;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.compare.*;
import org.eclipse.compare.structuremergeviewer.*;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.team.internal.ui.*;
import org.eclipse.team.internal.ui.synchronize.*;
import org.eclipse.team.ui.PageCompareEditorInput;
import org.eclipse.team.ui.TeamUI;
import org.eclipse.team.ui.mapping.ISynchronizationCompareInput;
import org.eclipse.team.ui.mapping.SaveableComparison;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.part.IPageBookViewPage;

/**
 * Displays a synchronize participant page combined with the compare/merge infrastructure. This only works if the
 * synchronize page viewer provides selections that are of the following types: ITypedElement and ICompareInput
 * or if the participant is a {@link ModelSynchronizeParticipant}.
 * 
 * @since 3.3
 */
public class ParticipantPageCompareEditorInput extends PageCompareEditorInput {

    private ISynchronizeParticipant participant;
    private ISynchronizePageConfiguration pageConfiguration;

    private Image titleImage;
    private IPageBookViewPage page;
    private DialogSynchronizePageSite site;
    private IPropertyChangeListener listener;
    private Button rememberParticipantButton;

    /**
     * Creates a part for the provided participant. The page configuration is used when creating the participant page and the resulting
     * compare/merge panes will be configured with the provided compare configuration.
     * <p>
     * For example, clients can decide if the user can edit the compare panes by calling {@link CompareConfiguration#setLeftEditable(boolean)}
     * or {@link CompareConfiguration#setRightEditable(boolean)}. 
     * </p>
     * @param configuration the compare configuration that will be used to create the compare panes
     * @param pageConfiguration the configuration that will be provided to the participant prior to creating the page
     * @param participant the participant whose page will be displayed in this part
     */
    public ParticipantPageCompareEditorInput(CompareConfiguration configuration,
            ISynchronizePageConfiguration pageConfiguration, ISynchronizeParticipant participant) {
        super(configuration);
        this.pageConfiguration = pageConfiguration;
        this.participant = participant;
        pageConfiguration.setRunnableContext(this);
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#prepareInput(org.eclipse.core.runtime.IProgressMonitor)
     */
    protected Object prepareInput(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        setTitle(Utils.shortenText(SynchronizeView.MAX_NAME_LENGTH, participant.getName()));
        return participant;
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#getTitleImage()
     */
    public Image getTitleImage() {
        if (titleImage == null) {
            titleImage = participant.getImageDescriptor().createImage();
        }
        return titleImage;
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.PageCompareEditorInput#handleDispose()
     */
    protected void handleDispose() {
        if (titleImage != null) {
            titleImage.dispose();
        }
        if (page != null)
            page.dispose();
        if (site != null)
            site.dispose();
        pageConfiguration.removePropertyChangeListener(listener);
        super.handleDispose();
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.PageCompareEditorInput#createPage(org.eclipse.compare.CompareViewerPane, org.eclipse.jface.action.IToolBarManager)
     */
    protected IPage createPage(CompareViewerPane parent, IToolBarManager toolBarManager) {
        listener = new IPropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                if (event.getProperty().equals(ISynchronizePageConfiguration.P_PAGE_DESCRIPTION)) {
                    updateDescription();
                }
            }
        };
        pageConfiguration.addPropertyChangeListener(listener);
        updateDescription();

        page = participant.createPage(pageConfiguration);
        site = new DialogSynchronizePageSite(parent.getShell(), true);
        ((SynchronizePageConfiguration) pageConfiguration).setSite(site);
        site.createActionBars(toolBarManager);
        try {
            ((ISynchronizePage) page).init(pageConfiguration.getSite());
        } catch (PartInitException e1) {
        }

        page.createControl(parent);

        page.setActionBars(site.getActionBars());
        toolBarManager.update(true);
        return page;
    }

    /* private */ void updateDescription() {
        String description = (String) pageConfiguration
                .getProperty(ISynchronizePageConfiguration.P_PAGE_DESCRIPTION);
        if (description != null) {
            setPageDescription(description);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.PageCompareEditorInput#getSelectionProvider()
     */
    protected ISelectionProvider getSelectionProvider() {
        return ((ISynchronizePage) page).getViewer();
    }

    protected ICompareInput asCompareInput(ISelection selection) {
        ICompareInput compareInput = super.asCompareInput(selection);
        if (compareInput != null)
            return compareInput;

        if (selection != null && selection instanceof IStructuredSelection) {
            IStructuredSelection ss = (IStructuredSelection) selection;
            if (ss.size() == 1) {
                Object o = ss.getFirstElement();
                if (participant instanceof ModelSynchronizeParticipant) {
                    ModelSynchronizeParticipant msp = (ModelSynchronizeParticipant) participant;
                    return msp.asCompareInput(o);
                }
            }
        }
        return null;
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.PageCompareEditorInput#prepareInput(org.eclipse.compare.structuremergeviewer.ICompareInput, org.eclipse.compare.CompareConfiguration, org.eclipse.core.runtime.IProgressMonitor)
     */
    protected void prepareInput(ICompareInput input, CompareConfiguration configuration, IProgressMonitor monitor)
            throws InvocationTargetException {
        monitor.beginTask(TeamUIMessages.SyncInfoCompareInput_3, 100);
        monitor.setTaskName(TeamUIMessages.SyncInfoCompareInput_3);
        try {
            // First, see if the active buffer is changing
            checkForBufferChange(pageConfiguration.getSite().getShell(), input, false /* cancel not allowed */,
                    monitor);
            if (input instanceof SyncInfoModelElement) {
                final SyncInfoModelElement node = (SyncInfoModelElement) input;
                IResource resource = node.getResource();
                if (resource != null && resource.getType() == IResource.FILE) {
                    participant.prepareCompareInput(node, configuration, monitor);
                }
            } else {
                ISynchronizationCompareInput adapter = asModelCompareInput(input);
                if (adapter != null) {
                    adapter.prepareInput(configuration, Policy.subMonitorFor(monitor, 90));
                }
            }
        } catch (CoreException e) {
            throw new InvocationTargetException(e);
        } finally {
            monitor.done();
        }
    }

    private void checkForBufferChange(Shell shell, final ICompareInput input, boolean cancelAllowed,
            IProgressMonitor monitor) throws CoreException {
        ISynchronizeParticipant participant = pageConfiguration.getParticipant();
        if (participant instanceof ModelSynchronizeParticipant) {
            ModelSynchronizeParticipant msp = (ModelSynchronizeParticipant) participant;
            if (input instanceof ISynchronizationCompareInput) {
                ISynchronizationCompareInput mci = (ISynchronizationCompareInput) input;
                msp.checkForBufferChange(shell, mci, cancelAllowed, monitor);
            }
        }
    }

    private ISynchronizationCompareInput asModelCompareInput(ICompareInput input) {
        return (ISynchronizationCompareInput) Utils.getAdapter(input, ISynchronizationCompareInput.class);
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#isSaveNeeded()
     */
    public boolean isSaveNeeded() {
        if (participant instanceof ModelSynchronizeParticipant) {
            ModelSynchronizeParticipant msp = (ModelSynchronizeParticipant) participant;
            SaveableComparison currentBuffer = msp.getActiveSaveable();
            if (currentBuffer != null) {
                return currentBuffer.isDirty();
            }
        }
        return super.isSaveNeeded();
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#saveChanges(org.eclipse.core.runtime.IProgressMonitor)
     */
    public void saveChanges(IProgressMonitor monitor) throws CoreException {
        super.saveChanges(monitor);
        Object input = ((ISynchronizePage) page).getViewer().getInput();
        if (input instanceof ISynchronizeModelElement) {
            ISynchronizeModelElement root = (ISynchronizeModelElement) input;
            if (root != null && root instanceof DiffNode) {
                try {
                    commit(monitor, (DiffNode) root);
                } catch (CoreException e) {
                    Utils.handle(e);
                } finally {
                    setDirty(false);
                }
            }
        }
    }

    private static void commit(IProgressMonitor pm, DiffNode node) throws CoreException {
        ITypedElement left = node.getLeft();
        if (left instanceof LocalResourceTypedElement)
            ((LocalResourceTypedElement) left).commit(pm);

        ITypedElement right = node.getRight();
        if (right instanceof LocalResourceTypedElement)
            ((LocalResourceTypedElement) right).commit(pm);

        IDiffElement[] children = node.getChildren();
        for (int i = 0; i < children.length; i++) {
            commit(pm, (DiffNode) children[i]);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.team.ui.PageCompareEditorInput#contentChanged(org.eclipse.compare.IContentChangeNotifier)
     */
    public void contentChanged(IContentChangeNotifier source) {
        super.contentChanged(source);
        try {
            if (source instanceof DiffNode) {
                commit(new NullProgressMonitor(), (DiffNode) source);
            } else if (source instanceof LocalResourceTypedElement) {
                ((LocalResourceTypedElement) source).commit(new NullProgressMonitor());
            }
        } catch (CoreException e) {
            Utils.handle(e);
        }
    }

    /**
     * Return the synchronize page configuration for this part
     * 
     * @return Returns the pageConfiguration.
     */
    public ISynchronizePageConfiguration getPageConfiguration() {
        return pageConfiguration;
    }

    /**
     * Return the Synchronize participant for this part
     * 
     * @return Returns the participant.
     */
    public ISynchronizeParticipant getParticipant() {
        return participant;
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#createContents(org.eclipse.swt.widgets.Composite)
     */
    public Control createContents(Composite parent) {
        if (shouldCreateRememberButton()) {
            Composite composite = new Composite(parent, SWT.NONE);
            composite.setLayout(new GridLayout());
            Control control = super.createContents(composite);
            control.setLayoutData(new GridData(GridData.FILL_BOTH));
            rememberParticipantButton = new Button(composite, SWT.CHECK);
            rememberParticipantButton.setText(TeamUIMessages.ParticipantCompareDialog_1);
            rememberParticipantButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            return composite;
        }
        return super.createContents(parent);
    }

    /**
     * Return whether the ability to remember the participant in the synchronize
     * view should be presented to the user. By default, <code>true</code> is
     * returned. Subclasses may override.
     * @return whether the ability to remember the participant in the synchronize
     * view should be presented to the user
     */
    protected boolean isOfferToRememberParticipant() {
        return true;
    }

    private boolean shouldCreateRememberButton() {
        return isOfferToRememberParticipant() && participant != null
                && !particantRegisteredWithSynchronizeManager(participant);
    }

    private boolean isRememberParticipant() {
        return getParticipant() != null && rememberParticipantButton != null
                && rememberParticipantButton.getSelection();
    }

    private boolean particantRegisteredWithSynchronizeManager(ISynchronizeParticipant participant) {
        return TeamUI.getSynchronizeManager().get(participant.getId(), participant.getSecondaryId()) != null;
    }

    private void rememberParticipant() {
        if (getParticipant() != null) {
            ISynchronizeManager mgr = TeamUI.getSynchronizeManager();
            ISynchronizeView view = mgr.showSynchronizeViewInActivePage();
            mgr.addSynchronizeParticipants(new ISynchronizeParticipant[] { getParticipant() });
            view.display(participant);
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#okPressed()
     */
    public boolean okPressed() {
        if (isEditable()) {
            // If the CompareConfiguration is editable, then OK is Save and we want to leave the dialog open
            super.okPressed();
            return false;
        }
        // If the CompareConfiguration is not editable, then the OK button is the done button
        if (isRememberParticipant())
            rememberParticipant();
        return super.okPressed();
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#cancelPressed()
     */
    public void cancelPressed() {
        // If the CompareConfiguration is editable, then the CANCEL button is the done button
        if (isEditable() && isRememberParticipant())
            rememberParticipant();
        super.cancelPressed();
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#getOKButtonLabel()
     */
    public String getOKButtonLabel() {
        if (isEditable())
            return TeamUIMessages.ParticipantPageCompareEditorInput_0;
        return TeamUIMessages.ResourceMappingMergeOperation_2;
    }

    private boolean isEditable() {
        return getCompareConfiguration().isLeftEditable() || getCompareConfiguration().isRightEditable();
    }

    /* (non-Javadoc)
     * @see org.eclipse.compare.CompareEditorInput#getCancelButtonLabel()
     */
    public String getCancelButtonLabel() {
        return TeamUIMessages.ResourceMappingMergeOperation_2;
    }

}