/******************************************************************************
 * Copyright (c) 2003, 2010 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.geoshapes.internal.editparts;

import java.util.Iterator;

import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LineBorder;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
import org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.draw2d.figures.GeoShapeFigure;
import org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.draw2d.figures.GeoShapeRoundedRectangleFigure;
import org.eclipse.gmf.runtime.draw2d.ui.figures.RoundedRectangleBorder;
import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.gmf.runtime.notation.RoundedCornersStyle;
import org.eclipse.gmf.runtime.notation.ShapeStyle;
import org.eclipse.gmf.runtime.notation.View;

/**
 * @author jschofie, lgrahek
 *
 * Controls the interactions between the figure and
 * its underlying view 
 */
public class RoundedRectangleEditPart extends GeoShapeEditPart {

	/**
	 * Constructor - Create an EditPart for a given model object (View)
	 * 
	 * @param shapeView model object that represents the associated figure
	 */	
	public RoundedRectangleEditPart(View shapeView) {
				
		super(shapeView);
	}
				
	/* (non-Javadoc)
	 * @see org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.editparts.GeoShapeEditPart#createNodeFigure()
	 */
	protected NodeFigure createNodeFigure() {
		NodeFigure nodeFigure = new GeoShapeRoundedRectangleFigure(getMapMode()
				.DPtoLP(100), getMapMode().DPtoLP(50), getMapMode().DPtoLP(5));
		RoundedRectangleBorder border = new RoundedRectangleBorder(getMapMode()
				.DPtoLP(8), getMapMode().DPtoLP(8));
		border.setWidth(getMapMode().DPtoLP(getLineWidth()));
		border.setStyle(getLineType());
		nodeFigure.setBorder(border);	
		return nodeFigure;
	}	
		
	/* (non-Javadoc)
	 * @see org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.editparts.GeoShapeEditPart#handleNotificationEvent(org.eclipse.emf.common.notify.Notification)
	 * @since 1.4
	 */
	@Override
	protected void handleNotificationEvent(Notification notification) {
		Object feature = notification.getFeature();
		if (NotationPackage.Literals.ROUNDED_CORNERS_STYLE__ROUNDED_BENDPOINTS_RADIUS == feature) {
            refreshRoundedCorners();
		}
		super.handleNotificationEvent(notification);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.gmf.runtime.diagram.ui.geoshapes.internal.editparts.GeoShapeEditPart#refreshVisuals()
	 * @since 1.4
	 */
	@Override
	protected void refreshVisuals() {
		super.refreshVisuals();
		refreshRoundedCorners();
	}

	/**
	 * Refreshes radius for rounded corners (radius smaller than 1 indicates
	 * that corners should not be rounded).
	 * 
	 * @since 1.4
	 */
    protected void refreshRoundedCorners() {
		RoundedCornersStyle style = (RoundedCornersStyle) ((View) getModel())
				.getStyle(NotationPackage.Literals.ROUNDED_CORNERS_STYLE);
		if (style != null && (getNodeFigure().getBorder() instanceof RoundedRectangleBorder)) {
			RoundedRectangleBorder border = (RoundedRectangleBorder)getNodeFigure().getBorder();
			int radius = getMapMode().DPtoLP(style.getRoundedBendpointsRadius());
			// user enters radius, while diameter is expected when drawing rounded rectangle, so multiply by 2
			border.setArcWidth(radius*2);
			border.setArcHeight(radius*2);
			getFigure().repaint();
		}
		refreshConnections();
    }	
    
	/**
	 * Refreshes all connectors. This is needed when the border changes (corners
	 * become more or less rounded)
	 * 
	 * @since 1.4
	 */
    protected void refreshConnections() {
    	Iterator<?> conns = getTargetConnections().iterator();
    	while (conns.hasNext()) {
    		((Connection)((ConnectionEditPart)conns.next()).getFigure()).revalidate();
    	}
    	conns = getSourceConnections().iterator();
    	while (conns.hasNext()) {
    		((Connection)((ConnectionEditPart)conns.next()).getFigure()).revalidate();
    	}    	
    }
    
	/*
	 * @see org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart#setLineWidth(int)
	 * @since 1.4
	 */
	protected void setLineWidth(int width) {
		if (width < 0) {
			width = 1;
		}
		super.setLineWidth(width);
		LineBorder lineBorder = (LineBorder)getNodeFigure().getBorder();
		lineBorder.setWidth(getMapMode().DPtoLP(width));
		getFigure().revalidate();
	}

	/*
	 * @see org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart#setLineType(int)
	 * @since 1.4
	 */
	protected void setLineType(int lineType) {
		super.setLineType(lineType);
		LineBorder lineBorder = (LineBorder)getNodeFigure().getBorder();
		lineBorder.setStyle(lineType);
	}    

	public IFigure getContentPane() {
		return ((GeoShapeFigure) getFigure()).getContentPane();
	}

	@Override
	public boolean supportsRoundedCorners() {
		return true;
	}
}
