/*******************************************************************************
 * 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.actions.range;

import org.eclipse.gef.commands.Command;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.Assert;
import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
import org.eclipse.jst.pagedesigner.commands.range.ParagraphApplyStyleCommand;
import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
import org.eclipse.jst.pagedesigner.dom.DOMRange;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * @author mengbo
 */
public class ParagraphStyleAction extends DesignerToolBarAction {
	private String _tagName;

	private Node _applyingNode;

	/**
	 * @param text
	 * @param name
	 * @param image
	 * @param style
	 */
	public ParagraphStyleAction(String text, String name,
			ImageDescriptor image, int style) {
		super(text, style);
		_tagName = name;
		setImageDescriptor(image);
	}

	public ParagraphStyleAction(String text, Node node, ImageDescriptor image,
			int style) {
		super(text, style);
		_applyingNode = node;
		setImageDescriptor(image);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
	 */
	protected boolean isApplied(DOMRange range) {
		Assert.isTrue(getExpectedTag() != null);
		if (range != null) {
			boolean ordered = range.isOrdered();
			IDOMPosition start = ordered ? range.getStartPosition() : range
					.getEndPosition();
			IDOMPosition end = ordered ? range.getEndPosition() : range
					.getStartPosition();
			Node common = null;
			if (EditModelQuery.isSame(range)) {
				ParagraphFinder finder = new ParagraphFinder(start);
				Paragraph p = finder.getParagraph(start);
				common = p.getLowestContainer();
			} else {
				common = EditModelQuery.getInstance().getCommonAncestor(start,
						end);
			}
			// the lowest common block parent is the container to apply style.
			if (containsTag(common)) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	protected boolean containsTag(Node common) {
		// the lowest common block parent is the container to apply style.
		if (_applyingNode == null) {
			return common.getNodeName() != null
					&& getExpectedTag().equalsIgnoreCase(
							common.getNodeName().toLowerCase());
		}
		// return false;
		else {
			String align = ((Element) _applyingNode).getAttribute("align");
			if (!(common instanceof Element)) {
				return false;
			}
			String cAlign = ((Element) common).getAttribute("align");
			if (align == null || cAlign == null) {
				return false;
			}
			if (align.equals(cAlign)) {
				return true;
			} else {
				return false;
			}
		}

	}

	/**
	 * @return Returns the _expectedTag.
	 */
	public String getExpectedTag() {
		if (_tagName == null) {
			return _applyingNode.getNodeName().toLowerCase();
		} else {
			return _tagName.toLowerCase();
		}
	}

	/**
	 * @return Returns the _applyingNode.
	 */
	public Element getApplyingNode() {
		if (_applyingNode != null) {
			return (Element) _applyingNode;
		} else {
			return null;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
	 */
	protected Command getCommand() {
		ParagraphApplyStyleCommand command = null;
		if (getApplyingNode() != null) {
			command = new ParagraphApplyStyleCommand(getViewer(),
					getApplyingNode(), null, null);
		} else {
			command = new ParagraphApplyStyleCommand(getViewer(),
					getExpectedTag(), null, null);
		}
		return command;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#setViewer(org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer)
	 */
	public void setViewer(IHTMLGraphicalViewer viewer) {
		// TODO Auto-generated method stub
		super.setViewer(viewer);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.texteditor.IUpdate#update()
	 */
	public void update() {
		// TODO Auto-generated method stub
		super.update();
	}
}
