/*******************************************************************************
 * Copyright (c) 2004, 2005 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.html.ui.internal.contentoutline;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.wst.html.core.internal.HTMLContentBuilder;
import org.eclipse.wst.html.core.internal.HTMLCorePlugin;
import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames;
import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMContentBuilder;
import org.eclipse.wst.xml.ui.internal.contentoutline.XMLNodeActionManager;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

/**
 * 
 */
public class HTMLNodeActionManager extends XMLNodeActionManager {
	protected int fTagCase;
	protected int fAttrCase;

	public HTMLNodeActionManager(IStructuredModel model, Viewer viewer) {
		super(model, viewer);
		updateCase();
	}

	/**
	 * If neccessary, employ a DOMContentBuilder that understands how to
	 * change the case of HTML tags (but NOT taglib derived tags).
	 */
	public DOMContentBuilder createDOMContentBuilder(Document document) {
		DOMContentBuilder builder = null;
		String one = fModel.getModelHandler().getAssociatedContentTypeId();
		String modelContentTypeId = fModel.getContentTypeIdentifier();
		if (one != modelContentTypeId) {
			System.out.println("not equal"); //$NON-NLS-1$
		}
		if (modelContentTypeId.equals(ContentTypeIdForHTML.ContentTypeID_HTML))
			builder = new HTMLContentBuilder(document);
		else
			builder = super.createDOMContentBuilder(document);

		return builder;
	}

	private boolean shouldIgnoreCase(CMNode cmnode) {
		if (!cmnode.supports(HTMLCMProperties.SHOULD_IGNORE_CASE))
			return false;
		return ((Boolean) cmnode.getProperty(HTMLCMProperties.SHOULD_IGNORE_CASE)).booleanValue();
	}

	/**
	 * Modify the displayed menuitem label to change the case of HTML children
	 * but neither XML nor taglib-derived children.
	 */
	public String getLabel(Node parent, CMNode cmnode) {
		String result = null;
		// CMNode cmnode = action.getCMNode();
		// don't change the case unless we're certain it is meaningless
		if (shouldIgnoreCase(cmnode)) {
			String name = cmnode.getNodeName();
			if (cmnode.getNodeType() == CMNode.ELEMENT_DECLARATION) {
				if (fTagCase == HTMLCorePreferenceNames.LOWER)
					name = name.toLowerCase();
				else if (fTagCase == HTMLCorePreferenceNames.UPPER)
					name = name.toUpperCase();
				// else do nothing
			}
			else if (cmnode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION) {
				if (fAttrCase == HTMLCorePreferenceNames.LOWER)
					name = name.toLowerCase();
				else if (fAttrCase == HTMLCorePreferenceNames.UPPER)
					name = name.toUpperCase();
				// else do nothing
			}
			result = name;
		}
		else {
			result = super.getLabel(parent, cmnode);
		}

		return result;
	}

	/**
	 * Another HTML specific detail.
	 */
	protected void updateCase() {
		if (fModel != null) {
			String modelContentTypeId = fModel.getContentTypeIdentifier();
			if (modelContentTypeId != null) {
				if (modelContentTypeId.equals(ContentTypeIdForHTML.ContentTypeID_HTML)) {
					Preferences prefs = HTMLCorePlugin.getDefault().getPluginPreferences(); //$NON-NLS-1$
					fTagCase = prefs.getInt(HTMLCorePreferenceNames.TAG_NAME_CASE);
					fAttrCase = prefs.getInt(HTMLCorePreferenceNames.ATTR_NAME_CASE);
				}
			}
		}
	}

	public void reformat(Node newElement, boolean deep) {
		try {
			// tell the model that we are about to make a big model change
			fModel.aboutToChangeModel();

			// format selected node
			IStructuredFormatProcessor formatProcessor = new HTMLFormatProcessorImpl();
			formatProcessor.formatNode(newElement);
		}
		finally {
			// tell the model that we are done with the big model change
			fModel.changedModel();
		}
	}
}
