blob: ebf170ebe565f7d217544ded01d1061c639543be [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2019 CEA LIST, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.gitlight.compare.ui.contentmergeviewer.provider;
import java.util.ResourceBundle;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.compare.ide.ui.internal.contentmergeviewer.tree.provider.TreeContentMergeViewerItemLabelProvider;
import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide;
import org.eclipse.emf.compare.rcp.ui.mergeviewer.item.IMergeViewerItem;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.EObjectTreeElement;
import org.eclipse.papyrus.emf.facet.custom.metamodel.v0_2_0.internal.treeproxy.TreeproxyFactory;
import org.eclipse.papyrus.gitlight.compare.ui.PapyrusCompareUIPlugin;
import org.eclipse.papyrus.infra.gmfdiag.css.notation.CSSDiagram;
import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
import org.eclipse.swt.graphics.Image;
import org.eclipse.uml2.uml.UMLPackage;
/**
* The label provider for the {@link PyprusTreeContentMergeViewer}.
*/
@SuppressWarnings("restriction")
public class PapyrusTreeContentMergeViewerItemLabelProvider extends TreeContentMergeViewerItemLabelProvider {
/**
* The {@link MergeViewerSide}.
*/
private MergeViewerSide side;
/**
* Constructor.
*
* @param resourceBundle
* the {@link ResourceBundle}.
* @param adapterFactory
* the {@link AdapterFactory}.
* @param side
* the {@link MergeViewerSide}.
*/
public PapyrusTreeContentMergeViewerItemLabelProvider(ResourceBundle resourceBundle,
AdapterFactory adapterFactory, MergeViewerSide side) {
super(resourceBundle, adapterFactory, side);
this.side = side;
}
@Override
public Image getImage(Object object) {
if (!IMergeViewerItem.class.isInstance(object)) {
return super.getImage(object);
}
final Image image;
final IMergeViewerItem mergeViewerItem = IMergeViewerItem.class.cast(object);
// For all special cases fall back to parent to keep consistency
if (mergeViewerItem.isInsertionPoint()) {
image = super.getImage(object);
} else if (mergeViewerItem.getSideValue(side) == null
&& mergeViewerItem.getSideValue(side.opposite()) instanceof Resource) {
image = super.getImage(mergeViewerItem.getSideValue(side.opposite()));
} else if (mergeViewerItem.getLeft() == null && mergeViewerItem.getRight() == null
&& mergeViewerItem.getAncestor() instanceof Resource) {
image = super.getImage(mergeViewerItem.getAncestor());
} else {
final Object value = mergeViewerItem.getSideValue(side);
if (hasModelExplorerLabel(value)) {
final LabelProviderService labelProviderService = PapyrusCompareUIPlugin
.getDefault().getLabelProviderService();
if (value instanceof EObject) {
EObjectTreeElement treeElement = TreeproxyFactory.eINSTANCE.createEObjectTreeElement();
treeElement.setEObject(EObject.class.cast(value));
image = labelProviderService.getLabelProvider().getImage(treeElement);
} else {
image = labelProviderService.getLabelProvider().getImage(value);
}
} else {
image = super.getImage(object);
}
}
return image;
}
@Override
public String getText(Object object) {
if (!IMergeViewerItem.class.isInstance(object)) {
return super.getText(object);
}
final String text;
final IMergeViewerItem mergeViewerItem = (IMergeViewerItem)object;
final Object value = mergeViewerItem.getSideValue(side);
// For all special cases fall back to parent to keep consistency
if (value instanceof EObject && ((EObject)value).eIsProxy()) {
text = super.getText(object);
} else if (mergeViewerItem.isInsertionPoint()) {
text = super.getText(object);
} else if (value == null && mergeViewerItem.getSideValue(side.opposite()) instanceof Resource) {
text = super.getText(object);
} else if (value == null && mergeViewerItem.getLeft() == null && mergeViewerItem.getRight() == null
&& mergeViewerItem.getAncestor() instanceof Resource) {
text = super.getText(object);
} else {
if (hasModelExplorerLabel(value)) {
final LabelProviderService labelProviderService = PapyrusCompareUIPlugin
.getDefault().getLabelProviderService();
if (value instanceof EObject) {
EObjectTreeElement treeElement = TreeproxyFactory.eINSTANCE.createEObjectTreeElement();
treeElement.setEObject(EObject.class.cast(value));
text = labelProviderService.getLabelProvider().getText(treeElement);
} else {
text = labelProviderService.getLabelProvider().getText(value);
}
} else {
text = super.getText(object);
}
}
return text;
}
/**
* Determines if a given object has a label within the Papyrus ModelExplorer.
*
* @param object
* the object to check
* @return {@code true} if the {@code object} has a Papyrus ModelExplorer label, {@code false} otherwise.
*/
protected boolean hasModelExplorerLabel(Object object) {
if (EObject.class.isInstance(object)) {
final EObject eObject = EObject.class.cast(object);
if (UMLPackage.class.isInstance(eObject.eClass().getEPackage())) {
return true;
}
if (CSSDiagram.class.isInstance(eObject)) {
return true;
}
}
return false;
}
}