org.eclipse.egit.ui.internal.commit.CommitEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.ui.internal.commit.CommitEditor.java

Source

/*******************************************************************************
 *  Copyright (c) 2011, 2012 GitHub Inc. 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:
 *    Kevin Sawicki (GitHub Inc.) - initial API and implementation
 *    Daniel Megert <daniel_megert@ch.ibm.com> - Added context menu to the Commit Editor's header text
 *    Tomasz Zarna <Tomasz.Zarna@pl.ibm.com> - Add "Revert" action to Commit Editor
 *******************************************************************************/
package org.eclipse.egit.ui.internal.commit;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.commit.command.CheckoutHandler;
import org.eclipse.egit.ui.internal.commit.command.CreateBranchHandler;
import org.eclipse.egit.ui.internal.commit.command.CreateTagHandler;
import org.eclipse.egit.ui.internal.commit.command.CherryPickHandler;
import org.eclipse.egit.ui.internal.commit.command.RevertHandler;
import org.eclipse.egit.ui.internal.repository.RepositoriesView;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jgit.events.ListenerHandle;
import org.eclipse.jgit.events.RefsChangedEvent;
import org.eclipse.jgit.events.RefsChangedListener;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.SharedHeaderFormEditor;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.part.IShowInSource;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.progress.UIJob;

/**
 * Editor class to view a commit in a form editor.
 */
public class CommitEditor extends SharedHeaderFormEditor implements RefsChangedListener, IShowInSource {

    /**
     * ID - editor id
     */
    public static final String ID = "org.eclipse.egit.ui.commitEditor"; //$NON-NLS-1$

    private static final String TOOLBAR_HEADER_ID = ID + ".header.toolbar"; //$NON-NLS-1$

    /**
     * Open commit in editor
     *
     * @param commit
     * @return opened editor part
     * @throws PartInitException
     */
    public static final IEditorPart open(RepositoryCommit commit) throws PartInitException {
        return open(commit, true);
    }

    /**
     * Open commit in editor
     *
     * @param commit
     * @param activateOnOpen <code>true</code> if the newly opened editor should be activated
     * @return opened editor part
     * @throws PartInitException
     * @since 2.1
     */
    public static final IEditorPart open(RepositoryCommit commit, boolean activateOnOpen) throws PartInitException {
        CommitEditorInput input = new CommitEditorInput(commit);
        return IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), input, ID,
                activateOnOpen);
    }

    /**
     * Open commit in editor
     *
     * @param commit
     * @param activateOnOpen <code>true</code> if the newly opened editor should be activated
     * @return opened editor part or null if opening fails
     * @since 2.1
     */
    public static final IEditorPart openQuiet(RepositoryCommit commit, boolean activateOnOpen) {
        try {
            return open(commit, activateOnOpen);
        } catch (PartInitException e) {
            Activator.logError(e.getMessage(), e);
            return null;
        }
    }

    /**
     * Open commit in editor
     *
     * @param commit
     * @return opened editor part or null if opening fails
     */
    public static final IEditorPart openQuiet(RepositoryCommit commit) {
        return openQuiet(commit, true);
    }

    private CommitEditorPage commitPage;

    private DiffEditorPage diffPage;

    private NotesEditorPage notePage;

    private ListenerHandle refListenerHandle;

    /**
     * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
     */
    protected void addPages() {
        try {
            commitPage = new CommitEditorPage(this);
            addPage(commitPage);
            if (getCommit().getRevCommit().getParentCount() <= 1) {
                diffPage = new DiffEditorPage(this);
                addPage(diffPage);
            }
            if (getCommit().getNotes().length > 0) {
                notePage = new NotesEditorPage(this);
                addPage(notePage);
            }
        } catch (PartInitException e) {
            Activator.error("Error adding page", e); //$NON-NLS-1$
        }
        refListenerHandle = Repository.getGlobalListenerList().addRefsChangedListener(this);
    }

    private CommandContributionItem createCommandContributionItem(String commandId) {
        CommandContributionItemParameter parameter = new CommandContributionItemParameter(getSite(), commandId,
                commandId, CommandContributionItem.STYLE_PUSH);
        return new CommandContributionItem(parameter);
    }

    /**
     * @see org.eclipse.ui.forms.editor.SharedHeaderFormEditor#createHeaderContents(org.eclipse.ui.forms.IManagedForm)
     */
    protected void createHeaderContents(IManagedForm headerForm) {
        RepositoryCommit commit = getCommit();
        ScrolledForm form = headerForm.getForm();
        new HeaderText(form.getForm(), commit.getRevCommit().name());
        form.setToolTipText(commit.getRevCommit().name());
        getToolkit().decorateFormHeading(form.getForm());

        IToolBarManager toolbar = form.getToolBarManager();

        ControlContribution repositoryLabelControl = new ControlContribution("repositoryLabel") { //$NON-NLS-1$
            @Override
            protected Control createControl(Composite parent) {
                FormToolkit toolkit = getHeaderForm().getToolkit();
                Composite composite = toolkit.createComposite(parent);
                RowLayout layout = new RowLayout();
                composite.setLayout(layout);
                composite.setBackground(null);
                String label = getCommit().getRepositoryName();

                ImageHyperlink link = new ImageHyperlink(composite, SWT.NONE);
                link.setText(label);
                link.setFont(JFaceResources.getBannerFont());
                link.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
                link.setToolTipText(UIText.CommitEditor_showGitRepo);
                link.addHyperlinkListener(new HyperlinkAdapter() {
                    @Override
                    public void linkActivated(HyperlinkEvent event) {
                        RepositoriesView view;
                        try {
                            view = (RepositoriesView) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                                    .getActivePage().showView(RepositoriesView.VIEW_ID);
                            view.showRepository(getCommit().getRepository());
                        } catch (PartInitException e) {
                            Activator.handleError(UIText.CommitEditor_couldNotShowRepository, e, false);
                        }
                    }
                });

                return composite;
            }
        };
        toolbar.add(repositoryLabelControl);
        toolbar.add(createCommandContributionItem(CreateTagHandler.ID));
        toolbar.add(createCommandContributionItem(CreateBranchHandler.ID));
        toolbar.add(createCommandContributionItem(CheckoutHandler.ID));
        toolbar.add(createCommandContributionItem(CherryPickHandler.ID));
        toolbar.add(createCommandContributionItem(RevertHandler.ID));
        addContributions(toolbar);
        toolbar.update(true);
        getSite().setSelectionProvider(new ISelectionProvider() {

            public void setSelection(ISelection selection) {
                // Ignored
            }

            public void removeSelectionChangedListener(ISelectionChangedListener listener) {
                // Ignored
            }

            public ISelection getSelection() {
                return new StructuredSelection(getCommit());
            }

            public void addSelectionChangedListener(ISelectionChangedListener listener) {
                // Ignored
            }
        });
    }

    /**
     * @see org.eclipse.ui.forms.editor.SharedHeaderFormEditor#setFocus()
     * @since 2.0
     */
    @Override
    public void setFocus() {
        commitPage.getPartControl().setFocus();
    }

    private void addContributions(IToolBarManager toolBarManager) {
        IMenuService menuService = (IMenuService) getSite().getService(IMenuService.class);
        if (menuService != null && toolBarManager instanceof ContributionManager) {
            ContributionManager contributionManager = (ContributionManager) toolBarManager;
            String toolbarUri = "toolbar:" + TOOLBAR_HEADER_ID; //$NON-NLS-1$
            menuService.populateContributionManager(contributionManager, toolbarUri);
        }
    }

    private RepositoryCommit getCommit() {
        return (RepositoryCommit) getAdapter(RepositoryCommit.class);
    }

    /**
     * @see org.eclipse.ui.part.MultiPageEditorPart#getAdapter(java.lang.Class)
     */
    public Object getAdapter(Class adapter) {
        if (RepositoryCommit.class == adapter)
            return getEditorInput().getAdapter(adapter);

        return super.getAdapter(adapter);
    }

    /**
     * @see org.eclipse.ui.forms.editor.FormEditor#init(org.eclipse.ui.IEditorSite,
     *      org.eclipse.ui.IEditorInput)
     */
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        if (input.getAdapter(RepositoryCommit.class) == null)
            throw new PartInitException("Input could not be adapted to commit object"); //$NON-NLS-1$
        super.init(site, input);
        setPartName(input.getName());
        setTitleToolTip(input.getToolTipText());
    }

    public void dispose() {
        refListenerHandle.remove();
        super.dispose();
    }

    /**
     * @see org.eclipse.ui.part.EditorPart#doSave(org.eclipse.core.runtime.IProgressMonitor)
     */
    public void doSave(IProgressMonitor monitor) {
        // Save not supported
    }

    /**
     * @see org.eclipse.ui.part.EditorPart#doSaveAs()
     */
    public void doSaveAs() {
        // Save as not supported
    }

    /**
     * @see org.eclipse.ui.part.EditorPart#isSaveAsAllowed()
     */
    public boolean isSaveAsAllowed() {
        return false;
    }

    public void onRefsChanged(RefsChangedEvent event) {
        if (getCommit().getRepository().getDirectory().equals(event.getRepository().getDirectory())) {
            UIJob job = new UIJob("Refreshing editor") { //$NON-NLS-1$

                public IStatus runInUIThread(IProgressMonitor monitor) {
                    if (!getContainer().isDisposed())
                        commitPage.refresh();
                    return Status.OK_STATUS;
                }
            };
            job.schedule();
        }
    }

    public ShowInContext getShowInContext() {
        if (commitPage != null && commitPage.isActive())
            return commitPage.getShowInContext();
        else
            return null;
    }
}