/******************************************************************************
 * Copyright (c) 2002, 2006 IBM Corporation and others.
 * 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:
 *    IBM Corporation - initial API and implementation 
 ****************************************************************************/

package org.eclipse.gmf.runtime.diagram.ui.providers.internal;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.properties.Properties;
import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry;
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.draw2d.ui.figures.HashedCircle;
import org.eclipse.gmf.runtime.draw2d.ui.mapmode.MapModeUtil;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.LineStyle;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.View;


/**
 * Provides the unresolved view adornment for the views 
 * on a diagram that expect a non-null model reference.
 * 
 * @author cmahoney
 */
public class UnresolvedViewDecorator
	extends AbstractDecorator {

	/**
	 * Creates a new <code>UnresolvedViewDecorator</code>.
	 * @param decoratorTarget
	 */
	public UnresolvedViewDecorator(IDecoratorTarget decoratorTarget) {
		super(decoratorTarget);
	}

	/**
	 * Creates the appropriate unresolved view decoration if all the
	 * criteria is satisfied by the view passed in.
	 * @see org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecorator#refresh()
	 */
	public void refresh() {
		removeDecoration();
		EditPart editPart  = (EditPart)getDecoratorTarget().getAdapter(EditPart.class);
		View view = (View) getDecoratorTarget().getAdapter(View.class);
		if (!(editPart instanceof IPrimaryEditPart)) {
			return;
		}

		EObject element = ViewUtil.resolveSemanticElement(view);

		int radius = MapModeUtil.getMapMode(((GraphicalEditPart)editPart).getFigure()).DPtoLP(8);

		if (editPart instanceof ShapeEditPart && element == null) {
			HashedCircle circle = new HashedCircle(HashedCircle.HashType.X,
				radius);
			circle.setFill(false);
			setDecoration(getDecoratorTarget().addShapeDecoration(circle,
				IDecoratorTarget.Direction.NORTH_EAST, MapModeUtil.getMapMode(((ShapeEditPart)editPart).getFigure()).DPtoLP(-4),
				false));

		} else if (view instanceof Edge) {
			Edge connectorView = (Edge)view;
			if (element == null) {
				HashedCircle circle = new HashedCircle(HashedCircle.HashType.X,
					radius);
				circle.setFill(false);
				setDecoration(getDecoratorTarget().addConnectionDecoration(
					circle, 50, false));
			} else if ((connectorView.getTarget() != null)&&(ViewUtil
				.resolveSemanticElement(connectorView.getTarget()) == null)) {
				HashedCircle circle = new HashedCircle(
					HashedCircle.HashType.BACKSLASH, radius);
				circle.setFill(false);
				setDecoration(getDecoratorTarget().addConnectionDecoration(
					circle, 70, false));
			}

		}

		if (getDecoration() == null) {
			return;
		}

		if (ViewUtil.isPropertySupported(view,Properties.ID_LINECOLOR)) {
			LineStyle style = (LineStyle) view.getStyle(NotationPackage.eINSTANCE.getLineStyle());
			getDecoration().setForegroundColor(
				DiagramColorRegistry.getInstance().getColor(new Integer(style.getLineColor())));
		}
	}

	/** 
	 * Adds decoration if applicable.
	 * @see org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecorator#activate()
	 */
	public void activate() {
		refresh();
	}

}
