/*******************************************************************************
 * 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.commands.nav;

import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
import org.eclipse.jst.pagedesigner.validation.caret.Target;
import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
import org.eclipse.jst.pagedesigner.viewer.DesignRange;
import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.eclipse.swt.widgets.Caret;

/**
 * @author mengbo
 */
public class VerticalMoveCommand extends Command {
	private static Logger _log = PDPlugin
			.getLogger(HorizontalMoveCommand.class);

	IHTMLGraphicalViewer _viewer;

	boolean _up;

	boolean _onlyMoveEnd;

	/**
	 * @param viewer
	 * @param b
	 * @param c
	 */
	public VerticalMoveCommand(IHTMLGraphicalViewer viewer, boolean up,
			boolean c) {
		_viewer = viewer;
		_up = up;
		_onlyMoveEnd = c;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#execute()
	 */
	public void execute() {
		int OFFSET = 2;
		DesignRange range = _viewer.getRangeSelection();
		if (range == null || !range.isValid()) {
			_log.error("invalud range");
			return;
		}
		IMovementMediator moveMediator = new InlineEditingNavigationMediator(
				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
		DesignPosition position = range.getEndPosition();
		Caret caret = _viewer.getCaret();
		Point point = null;
		DesignPosition newPos = position;
		EditPart containerpart = null, rootpart1;
		if (_up) {
			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
					caret.getBounds().y);
		} else {
			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
					caret.getBounds().y + caret.getBounds().height);

		}
		rootpart1 = getRootEditablePart(position.getContainerPart(),
				moveMediator);// position.getContainerPart();
		if (rootpart1 == null) {
			return;
		}
        
        point = adjustLocation(rootpart1, point);
		Rectangle bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
		// get current according to the point.
		// FlowBoxLine line =
		// getCurrentLine(moveMediator.getEditableContainer(new
		// Target(rootpart)), point, moveMediator);
		while (true) {
			// try to change offset and then to search for new point.
			if (_up) {
				point.y -= OFFSET;
				if (point.y <= bound.y) {
					newPos = position;
					break;
				}
			} else {
				point.y += OFFSET;
				if (point.y >= bound.y + bound.height) {
					newPos = position;
					break;
				}
			}
			containerpart = ((InlineEditingNavigationMediator) moveMediator)
					.getConstainedEditableContainer(position, point, _viewer);
			if (containerpart != null) {
				if (!EditModelQuery.isChild(Target.resolveNode(rootpart1),
						Target.resolveNode(containerpart))) {
					containerpart = rootpart1;
				}
				bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
				newPos = EditPartPositionHelper
						.findEditPartPositionConstrained(containerpart, point,
								moveMediator);
			} else {
				newPos = position;
				break;
			}
			if (newPos != null) {
				if (found(newPos, position)) {
					break;
				}
			}
		}
		setRange(position, newPos);
	}

	private void setRange(DesignPosition position, DesignPosition newPos) {
		if (!EditModelQuery.isSame(position, newPos)) {
			{
				if (_onlyMoveEnd) {
					_viewer.setRangeEndPosition(newPos);
				} else {
					_viewer.setRange(newPos, newPos);
				}
			}
		}
	}

	/*
	 * We should change this, it is too tricky to do in this way.
	 */
	private Point adjustLocation(EditPart rootPart, Point point) {
		Point result = point.getCopy();
		Rectangle bounds = EditPartPositionHelper.getAbsoluteBounds(rootPart);
		if (!bounds.contains(point)) {
			if (bounds.getLeft().x > point.x) {
				result.x = bounds.getLeft().x;
			} else if (bounds.getRight().x < point.x) {
				result.x = bounds.getRight().x;
			}
		}
		return result;
	}

	private EditPart getRootEditablePart(EditPart part,
			IMovementMediator moveMediator) {
		EditPart rootpart = null;
		if ((rootpart = ((InlineEditingNavigationMediator) moveMediator)
				.getRootConstainedEditableContainer(new Target(part))) == null) {
			rootpart = moveMediator.getEditableContainer(new Target(part));
		}
		return rootpart;
	}

	private boolean found(DesignPosition newPos, DesignPosition prevPos) {
		Rectangle newRec = EditPartPositionHelper
				.convertToAbsoluteCaretRect(newPos);
		Rectangle prevRec = EditPartPositionHelper
				.convertToAbsoluteCaretRect(prevPos);
		if (_up) {
			return getYDistance(newRec, prevRec, _up) < 0;
		}
        return getYDistance(newRec, prevRec, _up) > 0;
	}

	/**
	 * Distance from rec1 to rec2 at y coordination, if top, compare top,
	 * otherwise compare bottom.
	 * 
	 * @param rec1
	 * @param rec2
	 * @param up
	 * @return
	 */
	private int getYDistance(Rectangle rec1, Rectangle rec2, boolean top) {
		if (rec1.getCopy().intersect(rec2).height > 0) {
			return 0;
		}
        if (top) {
        	return rec1.getTop().y - rec2.getTop().y;
        }
        return rec1.getBottom().y - rec2.getBottom().y;
	}
}
