/******************************************************************************* * Copyright (C) 2015, Max Hohenegger <eclipse@hohenegger.eu> * * 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.gitflow.ui.internal.menu; import static org.eclipse.egit.gitflow.ui.Activator.error; import java.io.IOException; import org.eclipse.egit.core.internal.Utils; import org.eclipse.egit.gitflow.Activator; import org.eclipse.egit.gitflow.GitFlowRepository; import org.eclipse.egit.gitflow.ui.internal.UIText; import org.eclipse.egit.gitflow.ui.internal.actions.ReleaseStartFromCommitHandler; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; /** * Start GitFlow release from a specified commit */ public class DynamicHistoryMenu extends ContributionItem { @Override public void fill(Menu menu, int index) { GitFlowRepository gfRepo = getRepository(); if (gfRepo == null) { return; } RevCommit selectedCommit = getSelectedCommit(); if (selectedCommit == null) { return; } String startCommitSha1 = selectedCommit.getName(); Shell activeShell = getActiveShell(); ReleaseStartFromCommitHandler listener = new ReleaseStartFromCommitHandler( gfRepo, startCommitSha1, activeShell); MenuItem menuItem = new MenuItem(menu, SWT.PUSH, index); menuItem.setText(NLS.bind( UIText.DynamicHistoryMenu_startGitflowReleaseFrom, abbreviate(selectedCommit))); menuItem.addSelectionListener(listener); boolean isEnabled = false; try { isEnabled = gfRepo.isOnDevelop(selectedCommit); } catch (IOException e) { Activator.getDefault().getLog().log(error(e.getMessage(), e)); } menuItem.setEnabled(isEnabled); } private String abbreviate(RevCommit selectedCommit) { return selectedCommit.getId().abbreviate(7).name(); } /** * @return Selected commit */ private RevCommit getSelectedCommit() { ISelection selection = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage().getActivePart() .getSite().getSelectionProvider().getSelection(); if (!(selection instanceof IStructuredSelection)) { return null; } IStructuredSelection structSelection = (IStructuredSelection) selection; Object firstElement = structSelection.getFirstElement(); if (!(firstElement instanceof RevCommit)) { return null; } return (RevCommit) firstElement; } private Shell getActiveShell() { return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); } private GitFlowRepository getRepository() { IWorkbenchPart activePart = PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getActivePage().getActivePart(); Repository repository = Utils.getAdapter(activePart, Repository.class); if (repository == null) { return null; } return new GitFlowRepository(repository); } }