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

import java.util.List;

import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * ITagConverter is used to convert a custom tag to a HTML tag. Each
 * ITagConverter instance will be dedicated to a single custom tag element.
 * 
 * @author mengbo
 * @version 1.5
 */
public interface ITagConverter {
	/**
	 * Set the target document where the converted node should belong to.
	 * 
	 * @param document
	 */
	public void setDestDocument(IDOMDocument document);

	/**
	 * refresh the internal state of this ITagConverter. This method normally is
	 * called when the host element change.
	 * 
	 * @param context
	 */
	public void convertRefresh(Object context);

	/**
	 * The host element being converted.
	 * 
	 * @return
	 */
	public Element getHostElement();

	/**
	 * for some tags, they don't convert to HTML. In that case, this method
	 * should return false for them. And if this method return false, then
	 * should return an image in <code>getVisualImage()</code> for displaying
	 * in the designer.
	 * 
	 * @return
	 */
	public boolean isVisualByHTML();

	/**
	 * if isVisualByHTML() return false, then this method should return an image
	 * to be displayed in designer.
	 * 
	 * Normally this image will be a shared image for those hidden elements. It
	 * is this class's responsibility to dispose the image if the image is not a
	 * shared one.
	 * 
	 * @return
	 */
	public Image getVisualImage();

	/**
	 * the element after conversion.
	 * 
	 * @return
	 */
	public Element getResultElement();

	/**
	 * get the list of children that should be continuely converted.
	 * 
	 * @return
	 */
	public List getChildModeList();
    
    /**
     * @return a list of Element tags that map to non-visual children
     * Type should be always be Element.
     */
    public List getNonVisualChildren();

	/**
	 * For child nodes that need further convert, return their position in the
	 * converted DOM tree.
	 * 
	 * @param childModel
	 * @return
	 */
	public ConvertPosition getChildVisualPosition(Node childModel);

	/**
	 * When the convert result in multi-level element. If this method return
	 * false, then the caller should not use child nodes of
	 * <code>getHostElement()</code>
	 * 
	 * @return
	 */
	public boolean isMultiLevel();

	/**
	 * 
	 * @return
	 */
	public boolean isWidget();

	/**
	 * 
	 * 
	 */
	public void dispose();

	/**
	 * @param mode
	 */
	public void setMode(int mode);
}
