blob: 3de52997346b165d7bb10d8b5c0465b57d476713 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Tasktop Technologies 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:
* Tasktop Technologies - initial API and implementation
* Kilian Matt (Research Group for Industrial Software (INSO), Vienna University of Technology) - improvements
*******************************************************************************/
package org.eclipse.mylyn.versions.ui;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.ITypedElement;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.util.OpenStrategy;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.versions.core.spi.ScmConnector;
import org.eclipse.mylyn.versions.ui.spi.ScmConnectorUi;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.team.core.history.IFileRevision;
import org.eclipse.team.internal.core.history.LocalFileRevision;
import org.eclipse.team.internal.ui.history.CompareFileRevisionEditorInput;
import org.eclipse.team.internal.ui.history.FileRevisionTypedElement;
import org.eclipse.team.ui.synchronize.SaveableCompareEditorInput;
import org.eclipse.ui.IWorkbenchPage;
/**
* @author Steffen Pingel
* @author Kilian Matt
*/
public class ScmUi {
private static HashMap<String, ScmConnectorUi> connectorById = new HashMap<String, ScmConnectorUi>();
private static final String ID_PLUGIN = "org.eclipse.mylyn.versions.ui"; //$NON-NLS-1$
private static class EmptyTypedElement implements ITypedElement {
private final String name;
public EmptyTypedElement(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Image getImage() {
return null;
}
public String getType() {
return ITypedElement.UNKNOWN_TYPE;
}
}
protected static ITypedElement getElementFor(IResource resource) {
return SaveableCompareEditorInput.createFileElement((IFile) resource);
}
private static IResource getResource(IFileRevision revision) {
if (revision instanceof LocalFileRevision) {
LocalFileRevision local = (LocalFileRevision) revision;
return local.getFile();
}
return null;
}
/**
* @param page
* @param file1
* @param file2
*/
public static void openCompareEditor(IWorkbenchPage page, IFileRevision file1, IFileRevision file2) {
Assert.isNotNull(file2);
IResource resource = getResource(file2);
if (resource != null) {
IFileRevision temp = file1;
file1 = file2;
file2 = temp;
}
ITypedElement left;
if (file1 != null) {
resource = getResource(file1);
if (resource != null) {
left = getElementFor(resource);
} else {
left = new FileRevisionTypedElement(file1, null);
}
} else {
left = new EmptyTypedElement(file2.getName());
}
ITypedElement right = new FileRevisionTypedElement(file2, null);
CompareFileRevisionEditorInput input = new CompareFileRevisionEditorInput(left, right, page);
CompareUI.openCompareEditor(input, OpenStrategy.activateOnOpen());
}
/**
* @return
*/
public static List<ScmConnectorUi> getAllRegisteredUiConnectors() {
List<ScmConnectorUi> scmUiConnectors = new ArrayList<ScmConnectorUi>();
String[] teamProviderIds = RepositoryProvider.getAllProviderTypeIds();
for (String providerId : teamProviderIds) {
ScmConnectorUi connector = getScmUiConnectorById(providerId);
if (connector != null) {
scmUiConnectors.add(connector);
}
}
return scmUiConnectors;
}
/**
* Returns the UI connector that corresponds to <code>resource</code>.
*
* @return the connector instance or null, if no connector could be found for <code>resource</code>
*/
public static ScmConnectorUi getUiConnector(IResource resource) {
if (!RepositoryProvider.isShared(resource.getProject())) {
return null;
}
RepositoryProvider provider = RepositoryProvider.getProvider(resource.getProject());
return getScmUiConnectorById(provider.getID());
}
/**
* Returns the UI connector that corresponds to <code>coreConnector</code>.
*
* @return the connector instance or null if no UI connector is registered for <code>coreConnector</code>
*/
public static ScmConnectorUi getUiConnector(ScmConnector coreConnector) {
return getScmUiConnectorById(coreConnector.getProviderId());
}
private synchronized static ScmConnectorUi getScmUiConnectorById(String id) {
ScmConnectorUi connector = connectorById.get(id);
if (connector == null) {
connector = loadConnector(id);
connectorById.put(id, connector);
}
return connector;
}
private static ScmConnectorUi loadConnector(String id) {
Assert.isNotNull(id);
MultiStatus result = new MultiStatus(ScmUi.ID_PLUGIN, 0, "Scm ui connectors failed to load.", null); //$NON-NLS-1$
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint connectorsExtensionPoint = registry.getExtensionPoint(ScmUi.ID_PLUGIN + ".connectors"); //$NON-NLS-1$
IExtension[] extensions = connectorsExtensionPoint.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement[] elements = extension.getConfigurationElements();
for (IConfigurationElement element : elements) {
if (id.equals(element.getAttribute("id"))) { //$NON-NLS-1$
try {
Object object = element.createExecutableExtension("ui"); //$NON-NLS-1$
if (object instanceof ScmConnectorUi) {
return (ScmConnectorUi) object;
} else {
result.add(new Status(
IStatus.ERROR,
ScmUi.ID_PLUGIN,
NLS.bind(
"Connector ui ''{0}'' does not extend expected class for extension contributed by {1}", //$NON-NLS-1$
object.getClass().getCanonicalName(), element.getContributor().getName())));
}
} catch (Throwable e) {
result.add(new Status(
IStatus.ERROR,
ScmUi.ID_PLUGIN,
NLS.bind(
"Connector core failed to load for extension contributed by {0}", element.getContributor().getName()), e)); //$NON-NLS-1$
}
}
}
}
if (!result.isOK()) {
StatusHandler.log(result);
}
return null;
}
}