/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.tableedit;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.tools.DragEditPartsTracker;
import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;

/**
 * This is the drag tracker for the small resize item on the
 * TableSideResizeHandle. used to adjust a single column/row size.
 * 
 * @author mengbo
 * @version 1.5
 */
public class TableSideResizeDragTracker extends DragEditPartsTracker {
	private boolean _isrow;

	private int _index;

	private MarqueeRectangleFigure _marqueeFigure;

	/**
	 * @param sourceEditPart
	 */
	public TableSideResizeDragTracker(EditPart sourceEditPart, boolean isrow,
			int index) {
		super(sourceEditPart);
		this._isrow = isrow;
		this._index = index;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.tools.DragEditPartsTracker#showSourceFeedback()
	 */
	protected void showSourceFeedback() {
		Rectangle rect = getFeedbackRect();
		if (rect != null) {
			rect = rect.getCopy();
			getMarqueeRectangleFigure().setBounds(rect);
		} else {
			// ignore.
		}
	}

	private int calculateDelta() {
		int delta;
		// FIXME: TODO: XXX: when delta is too small (<0) to make previous
		// column/row
		// to have negative size, then we need adjust delta.
		if (_isrow) {
			delta = getLocation().y - getStartLocation().y;
		} else {
			delta = getLocation().x - getStartLocation().x;
		}
		return delta;
	}

	/**
	 * @return null if this is not a table.
	 */
	private Rectangle getFeedbackRect() {
		ITableEditAdapter adapter = getTableEditAdapter();
		if (adapter == null) {
			return null;
		}

		IFigure figure = ((GraphicalEditPart) this.getSourceEditPart())
				.getFigure();
		Rectangle bounds = figure.getBounds();
		Insets insets = figure.getInsets();
		Rectangle rect;
		if (_isrow) {
			int delta = calculateDelta();
			rect = new Rectangle(0, adapter.getRowResizeStart(_index) + delta,
					bounds.width - insets.getWidth(), adapter
							.getRowResizeWidth());
		} else {
			int delta = calculateDelta();
			rect = new Rectangle(adapter.getColumnResizeStart(_index) + delta,
					0, adapter.getColumnResizeWidth(), bounds.height
							- insets.getHeight());
		}
		rect.translate(bounds.x + insets.left, bounds.y + insets.top);

		figure.translateToAbsolute(rect);
		getMarqueeRectangleFigure().translateToRelative(rect);
		return rect;
	}

	/**
	 * 
	 * @return null if this is not a table.
	 */
	private ITableEditAdapter getTableEditAdapter() {
		return TableEditHelper.getTableEditAdapter((GraphicalEditPart) this
				.getSourceEditPart());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.tools.DragEditPartsTracker#eraseSourceFeedback()
	 */
	protected void eraseSourceFeedback() {
		super.eraseSourceFeedback();
		if (_marqueeFigure != null) {
			removeFeedback(_marqueeFigure);
			_marqueeFigure = null;
		}
	}

	protected MarqueeRectangleFigure getMarqueeRectangleFigure() {
		if (this._marqueeFigure == null) {
			this._marqueeFigure = new MarqueeRectangleFigure();
			addFeedback(this._marqueeFigure);
		}
		return this._marqueeFigure;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.tools.DragEditPartsTracker#createTargetRequest()
	 */
	protected Request createTargetRequest() {
		return new TableResizeRequest(this._isrow, this._index);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.tools.DragEditPartsTracker#updateTargetRequest()
	 */
	protected void updateTargetRequest() {
		TableResizeRequest req = (TableResizeRequest) getTargetRequest();
		req.setDelta(calculateDelta());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int)
	 */
	protected boolean handleButtonDown(int button) {
		lockTargetEditPart(getSourceEditPart());
		return super.handleButtonDown(button);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.tools.DragEditPartsTracker#getCommand()
	 */
	protected Command getCommand() {
		return getTargetEditPart().getCommand(getTargetRequest());
	}
}
