| /******************************************************************************* |
| * Copyright (c) 2004, 2009 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 |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.internal.team.ui; |
| |
| import org.eclipse.compare.structuremergeviewer.IDiffElement; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.core.runtime.IAdapterFactory; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; |
| import org.eclipse.mylyn.tasks.core.TaskRepository; |
| import org.eclipse.mylyn.team.ui.AbstractTaskReference; |
| import org.eclipse.mylyn.team.ui.IContextChangeSet; |
| import org.eclipse.team.core.history.IFileRevision; |
| import org.eclipse.team.internal.core.subscribers.ChangeSet; |
| import org.eclipse.team.internal.core.subscribers.DiffChangeSet; |
| import org.eclipse.team.internal.ui.synchronize.ChangeSetDiffNode; |
| import org.eclipse.team.internal.ui.synchronize.SynchronizeModelElement; |
| |
| /** |
| * Adapter factory used to create adapters for <code>LinkedTaskInfo</code> |
| * |
| * @author Eugene Kuleshov |
| */ |
| public class LinkedTaskInfoAdapterFactory implements IAdapterFactory { |
| |
| private static final Class<?>[] ADAPTER_TYPES = new Class[] { AbstractTaskReference.class }; |
| |
| @SuppressWarnings("rawtypes") |
| public Object getAdapter(Object object, Class adapterType) { |
| if (!AbstractTaskReference.class.equals(adapterType)) { |
| return null; |
| } |
| |
| if (object instanceof ChangeSetDiffNode) { |
| return adaptChangeSetDiffNode(object); |
| } |
| |
| // TODO add other adapted types |
| |
| return adaptFromComment(object); |
| } |
| |
| @SuppressWarnings("rawtypes") |
| public Class[] getAdapterList() { |
| return ADAPTER_TYPES; |
| } |
| |
| private AbstractTaskReference adaptChangeSetDiffNode(Object object) { |
| ChangeSetDiffNode diffNode = (ChangeSetDiffNode) object; |
| ChangeSet set = diffNode.getSet(); |
| |
| Object adapter = null; |
| if (set instanceof IAdaptable) { |
| adapter = ((IAdaptable) set).getAdapter(AbstractTaskReference.class); |
| } |
| if (adapter == null) { |
| adapter = Platform.getAdapterManager().getAdapter(set, AbstractTaskReference.class); |
| } |
| if (adapter != null) { |
| return (AbstractTaskReference) adapter; |
| } |
| |
| return adaptFromComment(object); |
| } |
| |
| private AbstractTaskReference adaptFromComment(Object object) { |
| String comment = getCommentForElement(object); |
| if (comment == null) { |
| return null; |
| } |
| |
| IResource resource = getResourceForElement(object); |
| if (resource != null) { |
| TaskRepository repository = TasksUiPlugin.getDefault().getRepositoryForResource(resource); |
| if (repository != null) { |
| return new LinkedTaskInfo(repository.getRepositoryUrl(), null, null, comment); |
| } |
| } |
| |
| return new LinkedTaskInfo(null, null, null, comment); |
| } |
| |
| private static String getCommentForElement(Object element) { |
| if (element instanceof IContextChangeSet) { |
| return ((IContextChangeSet) element).getComment(false); |
| } else if (element instanceof DiffChangeSet) { |
| return ((DiffChangeSet) element).getComment(); |
| } else if (element instanceof ChangeSetDiffNode) { |
| return ((ChangeSetDiffNode) element).getName(); |
| } else if (element instanceof IFileRevision) { |
| return ((IFileRevision) element).getComment(); |
| } |
| return null; |
| } |
| |
| private static IResource getResourceForElement(Object element) { |
| if (element instanceof DiffChangeSet) { |
| IResource[] resources = ((DiffChangeSet) element).getResources(); |
| if (resources.length > 0) { |
| // TODO: only checks first resource |
| return resources[0]; |
| } |
| } |
| if (element instanceof SynchronizeModelElement) { |
| SynchronizeModelElement modelElement = (SynchronizeModelElement) element; |
| IResource resource = modelElement.getResource(); |
| if (resource != null) { |
| return resource; |
| } else { |
| IDiffElement[] elements = modelElement.getChildren(); |
| if (elements.length > 0) { |
| // TODO: only checks first diff |
| if (elements[0] instanceof SynchronizeModelElement) { |
| return ((SynchronizeModelElement) elements[0]).getResource(); |
| } |
| } |
| } |
| } |
| |
| // TODO any other resource types? |
| |
| return null; |
| } |
| |
| } |