package org.eclipse.uml2.diagram.common.editpolicies;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.preferences.IPreferenceConstants;
import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;
import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
import org.eclipse.gmf.runtime.notation.LineStyle;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.uml2.diagram.common.preferences.UMLPreferencesConstants;
import org.eclipse.uml2.uml.Port;
import org.eclipse.uml2.uml.UMLPackage;
public class PortVisualEffectEditPolicy extends AbstractVisualEffectEditPolicy {
@Override
protected boolean shouldHandleNotificationEvent(Notification event) {
return UMLPackage.eINSTANCE.getTypedElement_Type() == event.getFeature();
}
@Override
protected void installVisualEffect() {
ensureHasStyle(NotationPackage.eINSTANCE.getLineStyle());
}
@Override
protected void refreshVisualEffect() {
EObject semanticHost = getSemanticHost();
if (false == semanticHost instanceof Port) {
return;
}
Port port = (Port) semanticHost;
IGraphicalEditPart editPart = getHostImpl();
View view = editPart.getNotationView();
LineStyle lineStyle = (LineStyle) view.getStyle(NotationPackage.eINSTANCE.getLineStyle());
boolean hasType = port.getType() != null;
IPreferenceStore store = (IPreferenceStore) editPart.getDiagramPreferencesHint().getPreferenceStore();
int highlightColor = getColor(store, UMLPreferencesConstants.HIGHLIGHT_COLOR);
boolean isMarkedInvalid = (lineStyle.getLineColor() == highlightColor);
if (hasType && isMarkedInvalid) {
int usualColor = getColor(store, IPreferenceConstants.PREF_LINE_COLOR);
setLineColor(editPart, lineStyle, usualColor);
} else if (!hasType && !isMarkedInvalid) {
setLineColor(editPart, lineStyle, highlightColor);
}
}
private int getColor(IPreferenceStore store, String name) {
RGB rgb = PreferenceConverter.getColor(store, name);
return FigureUtilities.RGBToInteger(rgb).intValue();
}
private void setLineColor(IGraphicalEditPart editPart, LineStyle lineStyle, int color) {
SetRequest request = new SetRequest(editPart.getEditingDomain(), lineStyle,//
NotationPackage.eINSTANCE.getLineStyle_LineColor(), color);
executeCommand(new ICommandProxy(new SetValueCommand(request)));
}
}