/*******************************************************************************
 * 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;

import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editparts.ScalableRootEditPart;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
import org.w3c.dom.Element;

/**
 * @author mengbo
 */
public class DesignResizeComponentCommand extends Command {
	private EditPart _part;

	private Object _constraint;

	private SourceViewer _viewer;

	/**
	 * @param child
	 * @param constraint
	 */
	public DesignResizeComponentCommand(EditPart child, Object constraint) {
		this._part = child;
		this._constraint = constraint;
		EditPart part = child;
		if (part instanceof ScalableRootEditPart) {
            // TODO: eh?
            // do nothing I guess...
		} else {
			while (part != null
					&& !(part.getParent() instanceof ScalableRootEditPart)) {
				part = part.getParent();
			}
		}
		if (part != null) {
			EditPartViewer viewer = ((ScalableRootEditPart) part.getParent())
					.getViewer();
			HTMLEditor editor = ((HTMLEditor) ((DefaultEditDomain) ((HTMLGraphicalViewer) viewer)
					.getEditDomain()).getEditorPart());
			_viewer = editor.getTextEditor().getTextViewer();
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#execute()
	 */
	public void execute() {
		Element element = ((Element) _part.getModel());
		String width = element.getAttribute(ICSSPropertyID.ATTR_WIDTH);
		// String height = element.getAttribute(ICSSPropertyID.ATTR_HEIGHT);
		String originalStyle = element.getAttribute(ICSSPropertyID.ATTR_STYLE);
		StringBuffer style;
		if (originalStyle != null) {
			originalStyle = this.removeOthers(originalStyle,
					ICSSPropertyID.ATTR_WIDTH);
			originalStyle = this.removeOthers(originalStyle,
					ICSSPropertyID.ATTR_HEIGHT);
			style = new StringBuffer(originalStyle);
		} else {
			style = new StringBuffer(50);
		}
		if (null == width) {
			style.append(";").append(ICSSPropertyID.ATTR_WIDTH).append(":")
					.append(((Rectangle) _constraint).width).append(";");
			style.append(ICSSPropertyID.ATTR_HEIGHT).append(":").append(
					((Rectangle) _constraint).height).append("");
		}
		element.setAttribute(ICSSPropertyID.ATTR_STYLE, style.toString());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#redo()
	 */
	public void redo() {
		_viewer.doOperation(ITextOperationTarget.REDO);
	}

	/**
	 * @param style
	 * @param item
	 * @return ?
	 */
	public String removeOthers(String style, String item) {
		String result = null;
		int pos = style.indexOf(item);
		if (pos < 0) {
			return style;
		}
		int pos1 = pos;
		if (pos > 0) {
			if (style.charAt(pos - 1) == ';') {
				pos--;
			}
		}
		char ch = style.charAt(pos1);
		while (!(ch == ';' || ch == '"' || ch == '\'')) {
			pos1++;
			if (pos1 >= style.length()) {
				break;
			}
			ch = style.charAt(pos1);
		}
		if (pos1 < style.length()) {
			result = style.substring(0, pos)
					+ style.substring(pos1 + 1, style.length());
		} else {
			result = style.substring(0, pos);
		}
		if (result.indexOf(item) >= 0) {
			return removeOthers(result, item);
		}
        return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.commands.Command#undo()
	 */
	public void undo() {
		_viewer.doOperation(ITextOperationTarget.UNDO);
	}
}
