/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation 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:
 *    Kentarou FUKUDA - initial API and implementation
 *******************************************************************************/

package org.eclipse.actf.model.ui.editors.ie.impl;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import org.eclipse.actf.model.dom.dombycom.IElementEx;
import org.eclipse.actf.model.ui.ModelServiceSizeInfo;
import org.eclipse.actf.model.ui.editor.browser.ICurrentStyles;
import org.eclipse.actf.model.ui.editor.browser.IWebBrowserStyleInfo;
import org.eclipse.actf.util.dom.TreeWalkerImpl;
import org.eclipse.swt.graphics.RGB;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.NodeFilter;

public class WebBrowserStyleInfoImpl implements IWebBrowserStyleInfo {
	private static final String TAG_HEAD = "HEAD";
	private final WebBrowserIEImpl browser;

	public WebBrowserStyleInfoImpl(WebBrowserIEImpl browser) {
		this.browser = browser;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.actf.model.ui.editor.browser.IWebBrowserStyleInfo#getCurrentStyles()
	 */
	public HashMap<String, ICurrentStyles> getCurrentStyles() {
		HashMap<String, ICurrentStyles> currentStyles = new HashMap<String, ICurrentStyles>(512);
		Document doc = browser.getLiveDocument();
		TreeWalkerImpl treeWalker = new TreeWalkerImpl(doc,
				NodeFilter.SHOW_ELEMENT, new NodeFilter() {

					public short acceptNode(Node arg0) {
						if (TAG_HEAD.equalsIgnoreCase(arg0.getNodeName())) {
							return FILTER_REJECT;
						}
						return FILTER_ACCEPT;
					}
				}, false);
		Node tmpN = treeWalker.nextNode();
		URL base = null;
		try {
			base = new URL(browser.getURL());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		while (tmpN != null) {
			if (tmpN instanceof IElementEx) {
				ICurrentStyles curStyle = new CurrentStylesImpl(
						(IElementEx) tmpN, base);
				currentStyles.put(curStyle.getXPath(), curStyle);
			}
			tmpN = (IElementEx) treeWalker.nextNode();
		}

		return currentStyles;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.actf.model.ui.editor.browser.IWebBrowserStyleInfo#getUnvisitedLinkColor()
	 */
	public RGB getUnvisitedLinkColor() {
		return browser.getAnchorColor();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.actf.model.ui.editor.browser.IWebBrowserStyleInfo#getVisitedLinkColor()
	 */
	public RGB getVisitedLinkColor() {
		return browser.getVisitedAnchorColor();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.actf.model.ui.editor.browser.IWebBrowserStyleInfo#getSizeInfo()
	 */
	public ModelServiceSizeInfo getSizeInfo(boolean isWhole) {
		return browser.getBrowserSize(isWhole);
	}
}
