org.eclipse.egit.ui.internal.actions.StashesMenu.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.ui.internal.actions.StashesMenu.java

Source

/*******************************************************************************
 * Copyright (C) 2014 Robin Stocker <robin@nibor.org> 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
 *******************************************************************************/
package org.eclipse.egit.ui.internal.actions;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.CommonUtils;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.commit.CommitEditor;
import org.eclipse.egit.ui.internal.commit.RepositoryCommit;
import org.eclipse.egit.ui.internal.selection.SelectionUtils;
import org.eclipse.egit.ui.internal.stash.StashCreateUI;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.Separator;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.CompoundContributionItem;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.menus.IWorkbenchContribution;
import org.eclipse.ui.services.IServiceLocator;

/**
 * The "Stashes" submenu, for stashing changes and listing the existing stashes.
 */
public class StashesMenu extends CompoundContributionItem implements IWorkbenchContribution {

    private IServiceLocator serviceLocator;

    @Override
    public void initialize(IServiceLocator locator) {
        this.serviceLocator = locator;
    }

    @Override
    protected IContributionItem[] getContributionItems() {
        Repository repository = getRepository();

        List<IContributionItem> items = new ArrayList<>();

        items.add(createStashChangesItem(repository));
        items.add(new Separator());
        items.addAll(createStashItems(repository));

        return items.toArray(new IContributionItem[0]);
    }

    private static IContributionItem createStashChangesItem(final Repository repository) {
        Action action = new Action(UIText.StashesMenu_StashChangesActionText) {
            @Override
            public void run() {
                StashCreateUI stashCreateUI = new StashCreateUI(repository);
                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
                stashCreateUI.createStash(shell);
            }

            @Override
            public boolean isEnabled() {
                return StashCreateHandler.isEnabled(repository);
            }
        };
        return new ActionContributionItem(action);
    }

    private static Collection<IContributionItem> createStashItems(Repository repository) {
        if (repository == null)
            return Collections.singleton(createNoStashedChangesItem());

        try {
            Collection<RevCommit> stashCommits = Git.wrap(repository).stashList().call();

            if (stashCommits.isEmpty())
                return Collections.singleton(createNoStashedChangesItem());

            List<IContributionItem> items = new ArrayList<>(stashCommits.size());

            int index = 0;
            for (final RevCommit stashCommit : stashCommits)
                items.add(createStashItem(repository, stashCommit, index++));

            return items;
        } catch (GitAPIException e) {
            String repoName = repository.getWorkTree().getName();
            String message = MessageFormat.format(UIText.StashesMenu_StashListError, repoName);
            Activator.logError(message, e);
            return Collections.singleton(createNoStashedChangesItem());
        }
    }

    private static IContributionItem createNoStashedChangesItem() {
        Action action = new Action(UIText.StashesMenu_NoStashedChangesText) {
            @Override
            public boolean isEnabled() {
                return false;
            }
        };
        return new ActionContributionItem(action);
    }

    private Repository getRepository() {
        if (serviceLocator == null)
            return null;

        IHandlerService handlerService = CommonUtils.getService(serviceLocator, IHandlerService.class);
        if (handlerService == null)
            return null;

        IEvaluationContext evaluationContext = handlerService.getCurrentState();
        return SelectionUtils.getRepository(evaluationContext);
    }

    private static ActionContributionItem createStashItem(final Repository repo, final RevCommit stashCommit,
            int index) {
        String text = MessageFormat.format(UIText.StashesMenu_StashItemText, Integer.valueOf(index),
                stashCommit.getShortMessage());
        Action action = new Action(text) {
            @Override
            public void run() {
                RepositoryCommit repositoryCommit = new RepositoryCommit(repo, stashCommit);
                repositoryCommit.setStash(true);
                CommitEditor.openQuiet(repositoryCommit);
            }
        };
        return new ActionContributionItem(action);
    }

}