/******************************************************************************* * Copyright (c) 2015, 2016 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.compare.tooltip; import static org.eclipse.emf.compare.internal.EMFCompareEditMessages.getString; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.internal.merge.MergeMode; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; /** * This class handle the tooltips computation for Resource Attachment changes. * * @author <a href="mailto:mathieu.cartaud@obeo.fr">Mathieu Cartaud</a> */ public class ResourceAttachmentChangeTooltipProvider extends AbstractTooltipProvider<ResourceAttachmentChange> { /** * The constructor. * * @param adapterFactory * The composed adapter factory */ public ResourceAttachmentChangeTooltipProvider(ComposedAdapterFactory adapterFactory) { this.adapterFactory = adapterFactory; this.labelProvider = new AdapterFactoryItemDelegator(adapterFactory); } /** * {@inheritDoc} * * @see org.eclipse.emf.compare.provider.ITooltipLabelProvider#getTooltip(MergeMode) */ public String getTooltip(MergeMode mode) throws IllegalArgumentException { String tooltip; ResourceAttachmentChange diff = (ResourceAttachmentChange)target; boolean isFromLeft = isFromLeft(diff); switch (diff.getKind()) { case ADD: tooltip = addResourceAttachmentChangeTooltip(mode, diff, isFromLeft); break; case DELETE: tooltip = deleteResourceAttachmentChangeTooltip(mode, diff, isFromLeft); break; case MOVE: tooltip = setResourceLocationChangeTooltip(mode, diff, isFromLeft); break; case CHANGE: tooltip = setResourceLocationChangeTooltip(mode, diff, isFromLeft); break; default: throw new IllegalArgumentException(); } return tooltip; } /** * Compute the tooltip for the addition of a resource attachment change. * * @param mode * The comparison mode * @param diff * The diff * @param isFromLeft * True if the modification come from the left side * @return the tooltip */ private String addResourceAttachmentChangeTooltip(MergeMode mode, ResourceAttachmentChange diff, boolean isFromLeft) { String value = getLabel(diff); EObject left = diff.getMatch().getLeft(); EObject right = diff.getMatch().getRight(); EObject origin = diff.getMatch().getOrigin(); String leftUri = ""; //$NON-NLS-1$ if (left != null) { leftUri = left.eResource().getURI().toString(); } String rightUri = ""; //$NON-NLS-1$ if (right != null) { rightUri = right.eResource().getURI().toString(); } String originUri = ""; //$NON-NLS-1$ if (origin != null) { originUri = origin.eResource().getURI().toString(); } String tooltip; String body; switch (mode) { case LEFT_TO_RIGHT: if (isFromLeft) { body = getString("ContextualTooltip.rac.control.left.leftToRight", value, //$NON-NLS-1$ leftUri); } else { body = getString("ContextualTooltip.rac.control.right.leftToRight", value, //$NON-NLS-1$ leftUri); } tooltip = rightChanged(body); break; case RIGHT_TO_LEFT: if (isFromLeft) { body = getString("ContextualTooltip.rac.control.left.rightToLeft", value, //$NON-NLS-1$ rightUri); } else { body = getString("ContextualTooltip.rac.control.right.rightToLeft", value, //$NON-NLS-1$ rightUri); } tooltip = rightUnchanged(body); break; case ACCEPT: if (isFromLeft) { body = getString("ContextualTooltip.rac.control.left.accept", value, //$NON-NLS-1$ leftUri); tooltip = acceptAndUnchanged(body); } else { body = getString("ContextualTooltip.rac.control.right.accept", value, //$NON-NLS-1$ rightUri); tooltip = acceptAndChanged(body); } break; case REJECT: if (isFromLeft) { if (originUri == null || "".equals(originUri)) { //$NON-NLS-1$ originUri = leftUri; } body = getString("ContextualTooltip.rac.control.left.reject", value, //$NON-NLS-1$ originUri); tooltip = rejectAndChanged(body); } else { if (originUri == null || "".equals(originUri)) { //$NON-NLS-1$ originUri = rightUri; } body = getString("ContextualTooltip.rac.control.right.reject", value, //$NON-NLS-1$ originUri); tooltip = rejectAndUnchanged(body); } break; default: throw new IllegalStateException(); } return tooltip; } /** * Compute the tooltip for the deletion of a resource attachment change. * * @param mode * The comparison mode * @param diff * The diff * @param isFromLeft * True if the modification come from the left side * @return the tooltip */ private String deleteResourceAttachmentChangeTooltip(MergeMode mode, ResourceAttachmentChange diff, boolean isFromLeft) { String value = getLabel(diff); EObject left = diff.getMatch().getLeft(); EObject right = diff.getMatch().getRight(); EObject origin = diff.getMatch().getOrigin(); String leftUri = getResourceUri(left); String rightUri = getResourceUri(right); String tooltip; String body; switch (mode) { case LEFT_TO_RIGHT: if (isFromLeft) { body = getString("ContextualTooltip.rac.uncontrol.left.leftToRight", value, //$NON-NLS-1$ leftUri); } else { body = getString("ContextualTooltip.rac.uncontrol.right.leftToRight", value, //$NON-NLS-1$ leftUri); } tooltip = rightChanged(body); break; case RIGHT_TO_LEFT: if (isFromLeft) { body = getString("ContextualTooltip.rac.uncontrol.left.rightToLeft", value, //$NON-NLS-1$ rightUri); } else { body = getString("ContextualTooltip.rac.uncontrol.right.rightToLeft", value, //$NON-NLS-1$ rightUri); } tooltip = rightUnchanged(body); break; case ACCEPT: if (isFromLeft) { body = getString("ContextualTooltip.rac.uncontrol.left.accept", value, //$NON-NLS-1$ leftUri); tooltip = acceptAndUnchanged(body); } else { body = getString("ContextualTooltip.rac.uncontrol.right.accept", value, //$NON-NLS-1$ rightUri); tooltip = acceptAndChanged(body); } break; case REJECT: String originUri = getResourceUri(origin); if (isFromLeft) { if ("".equals(originUri)) { //$NON-NLS-1$ originUri = rightUri; } body = getString("ContextualTooltip.rac.uncontrol.left.reject", value, //$NON-NLS-1$ originUri); tooltip = rejectAndChanged(body); } else { if ("".equals(originUri)) { //$NON-NLS-1$ originUri = leftUri; } body = getString("ContextualTooltip.rac.uncontrol.right.reject", value, //$NON-NLS-1$ originUri); tooltip = rejectAndUnchanged(body); } break; default: throw new IllegalStateException(); } return tooltip; } /** * Provides a String representation of the given object's resource URI, never <code>null</code>. * * @param o * The EObject we want the resource URI of * @return A String representation of the given object's resource URI, or an empty String. Never * <code>null</code>. */ private String getResourceUri(EObject o) { if (o != null) { Resource resource = o.eResource(); if (resource != null) { URI uri = resource.getURI(); if (uri != null) { return uri.toString(); } } } return ""; //$NON-NLS-1$ } }