blob: 3de8eb5c2cb6d591d44beaa53f0cd2ec685c1cc5 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2013, 2017 CEA LIST.
*
* 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:
* CEA LIST - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.cdo.internal.ui.decorators;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.dawn.appearance.DawnElementStylizer;
import org.eclipse.emf.cdo.dawn.spi.DawnState;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeEditPart;
import org.eclipse.gmf.runtime.diagram.ui.services.decorator.AbstractDecorator;
import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget.Direction;
import org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeUtil;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.papyrus.cdo.internal.core.CDOUtils;
import org.eclipse.swt.graphics.Image;
/**
* A GMF-based label decorator for diagram views, to annotate them to indicate
* CDO locking and transaction conflict states.
*/
public class CDOStateDiagramDecorator
extends AbstractDecorator {
private DawnElementStylizer stylizer;
public CDOStateDiagramDecorator(IDecoratorTarget decoratorTarget,
DawnElementStylizer stylizer) {
super(decoratorTarget);
this.stylizer = stylizer;
}
@Override
public void activate() {
// pass
}
@Override
public void refresh() {
removeDecoration();
View view = (View) getDecoratorTarget().getAdapter(View.class);
EObject element = ((view == null) || !view.isSetElement())
? null
: view.getElement();
CDOObject cdo = (element == null)
? null
: CDOUtils.getCDOObject(element);
if (cdo != null) {
EditPart editPart = (EditPart) getDecoratorTarget().getAdapter(
EditPart.class);
// does the view, itself, have a conflict or lock state?
DawnState state = CDOStateAdapter.getState(view);
if (state == DawnState.CLEAN) {
// infer a state from the semantic element, then
state = CDOStateAdapter.getState(element);
}
Image image = stylizer.getImage(editPart, state);
if (image != null) {
if (editPart instanceof ShapeEditPart) {
int margin = MapModeUtil.getMapMode(
((GraphicalEditPart) editPart).getFigure()).DPtoLP(-1);
setDecoration(getDecoratorTarget().addShapeDecoration(
image, Direction.SOUTH_EAST, margin, true));
} else if (view instanceof Edge) {
int percent = 50;
setDecoration(getDecoratorTarget().addConnectionDecoration(
image, percent, true));
}
}
}
}
}