/******************************************************************************* * Copyright (C) 2011, 2012 Dariusz Luksza <dariusz@luksza.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 * * Contributors: * IBM Corporation - implementation of getWorkbenchPage *******************************************************************************/ package org.eclipse.egit.ui.internal.synchronize.action; import static org.eclipse.ui.PlatformUI.getWorkbench; import java.io.IOException; import java.util.Iterator; import org.eclipse.compare.ITypedElement; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.egit.core.internal.util.ResourceUtil; import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.egit.ui.internal.CompareUtils; import org.eclipse.egit.ui.internal.revision.GitCompareFileRevisionEditorInput; import org.eclipse.egit.ui.internal.synchronize.compare.LocalNonWorkspaceTypedElement; import org.eclipse.egit.ui.internal.synchronize.model.GitModelBlob; import org.eclipse.egit.ui.internal.synchronize.model.GitModelCacheFile; import org.eclipse.egit.ui.internal.synchronize.model.GitModelObject; import org.eclipse.egit.ui.internal.synchronize.model.GitModelRepository; import org.eclipse.egit.ui.internal.synchronize.model.GitModelWorkingFile; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jgit.lib.Repository; import org.eclipse.team.internal.ui.synchronize.actions.OpenInCompareAction; import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration; import org.eclipse.team.ui.synchronize.ISynchronizePageSite; import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; /** * Action to open a compare editor from a SyncInfo object. */ public class GitOpenInCompareAction extends Action { private final Action oldAction; private final ISynchronizePageConfiguration conf; /** * @param configuration * @param oldAction */ public GitOpenInCompareAction(ISynchronizePageConfiguration configuration, Action oldAction) { this.conf = configuration; this.oldAction = oldAction; } @Override public void run() { ISelection selection = conf.getSite().getSelectionProvider() .getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection sel = ((IStructuredSelection) selection); boolean reuseEditor = sel.size() == 1; for (Iterator iterator = sel.iterator(); iterator.hasNext();) { Object obj = iterator.next(); if (obj instanceof GitModelBlob) handleGitObjectComparison((GitModelBlob) obj, reuseEditor); else { oldAction.run(); // we assume here that oldAction is instance of // org.eclipse.team.internal.ui.synchronize.actions.OpenInCompareAction // with in it's run method will also iterate over selected // resources therefore we need to brake this loop when we // meet not know object break; } } } } private void handleGitObjectComparison(GitModelBlob obj, boolean reuseEditor) { ITypedElement left; ITypedElement right; if (obj instanceof GitModelWorkingFile) { IPath location = obj.getLocation(); if (location == null) { return; } IFile file = ResourceUtil.getFileForLocation(location, false); if (file == null) { Repository repository = null; GitModelObject modelObject = obj; while (modelObject != null) { if (modelObject instanceof GitModelRepository) { repository = ((GitModelRepository) modelObject) .getRepository(); break; } modelObject = modelObject.getParent(); } if (repository == null) { return; } left = new LocalNonWorkspaceTypedElement(repository, location); } else { left = SaveableCompareEditorInput.createFileElement(file); } right = getCachedFileElement(obj); } else if (obj instanceof GitModelCacheFile) { left = getCachedFileElement(obj); right = getHeadFileElement(obj); if (right == null) return; } else { oldAction.run(); return; } GitCompareFileRevisionEditorInput in = new GitCompareFileRevisionEditorInput( left, right, null); IWorkbenchPage page = getWorkbenchPage(conf.getSite()); OpenInCompareAction.openCompareEditor(in, page, reuseEditor); } private static IWorkbenchPage getWorkbenchPage(ISynchronizePageSite site) { IWorkbenchPage page = null; if (site == null || site.getWorkbenchSite() == null) { IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow(); if (window != null) page = window.getActivePage(); } else page = site.getWorkbenchSite().getPage(); return page; } private ITypedElement getCachedFileElement(GitModelBlob blob) { try { IPath location = blob.getLocation(); RepositoryMapping mapping = RepositoryMapping.getMapping(location); if (mapping == null) { return null; } Repository repo = mapping.getRepository(); String repoRelativePath = mapping.getRepoRelativePath(location); return CompareUtils.getIndexTypedElement(repo, repoRelativePath); } catch (IOException e) { return null; } } private ITypedElement getHeadFileElement(GitModelBlob blob) { RepositoryMapping mapping = RepositoryMapping.getMapping(blob.getLocation()); if (mapping == null) { return null; } Repository repo = mapping.getRepository(); String gitPath = mapping.getRepoRelativePath(blob.getLocation()); return CompareUtils.getHeadTypedElement(repo, gitPath); } }