package org.eclipse.uml2.diagram.clazz.edit.policies;

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.emf.type.core.commands.SetValueCommand;
import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
import org.eclipse.gmf.runtime.notation.FontStyle;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.uml2.diagram.common.editpolicies.AbstractVisualEffectEditPolicy;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.UMLPackage;

public class ClassNameVisualEffectEditPolicy extends AbstractVisualEffectEditPolicy {

	@Override
	protected boolean shouldHandleNotificationEvent(Notification event) {
		return UMLPackage.eINSTANCE.getClassifier_IsAbstract() == event.getFeature();
	}

	@Override
	protected void refreshVisualEffect() {
		EObject semanticHost = getSemanticHost();
		if (false == semanticHost instanceof Classifier) {
			return;
		}
		Classifier classifier = (Classifier) semanticHost;
		IGraphicalEditPart editPart = getHostImpl();
		View view = editPart.getNotationView();
		FontStyle fontStyle = (FontStyle) view.getStyle(NotationPackage.eINSTANCE.getFontStyle());
		if (fontStyle != null && fontStyle.isItalic() != classifier.isAbstract()) {
			SetRequest request = new SetRequest(editPart.getEditingDomain(), fontStyle, NotationPackage.eINSTANCE.getFontStyle_Italic(), classifier.isAbstract());
			executeCommand(new ICommandProxy(new SetValueCommand(request)));
		}
	}

	@Override
	protected void installVisualEffect() {
		ensureHasStyle(NotationPackage.eINSTANCE.getFontStyle());
		ensureHasBoldType();
	}

	private void ensureHasBoldType() {
		IGraphicalEditPart editPart = getHostImpl();
		View view = editPart.getNotationView();
		FontStyle fontStyle = (FontStyle) view.getStyle(NotationPackage.eINSTANCE.getFontStyle());
		if (false == fontStyle.isBold()){
			SetRequest request = new SetRequest(editPart.getEditingDomain(), fontStyle, NotationPackage.eINSTANCE.getFontStyle_Bold(), true);
			executeCommand(new ICommandProxy(new SetValueCommand(request)));
		}
	}
}
