/*******************************************************************************
 * Copyright (c) 2001, 2009 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.xml.ui.internal.actions;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.Path;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.xml.core.internal.contentmodel.util.DOMNamespaceInfoManager;
import org.eclipse.wst.xml.core.internal.contentmodel.util.NamespaceInfo;
import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
import org.eclipse.wst.xml.ui.internal.XMLUIPlugin;
import org.eclipse.wst.xml.ui.internal.dialogs.EditSchemaInfoDialog;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * EditDoctypeAction
 */
public class EditSchemaInfoAction extends NodeAction {
	protected AbstractNodeActionManager manager;
	protected DOMNamespaceInfoManager namespaceInfoManager = new DOMNamespaceInfoManager();
	protected Node node;
	protected String resourceLocation;
	protected String title;

	public EditSchemaInfoAction(AbstractNodeActionManager manager, Node node, String resourceLocation, String title) {
		this.manager = manager;
		this.node = node;
		setText(title);
		this.resourceLocation = resourceLocation;
		this.title = title;
	}

	protected Map createPrefixMapping(List oldList, List newList) {
		Map map = new Hashtable();

		Hashtable oldURIToPrefixTable = new Hashtable();
		for (Iterator i = oldList.iterator(); i.hasNext();) {
			NamespaceInfo oldInfo = (NamespaceInfo) i.next();
			oldURIToPrefixTable.put(oldInfo.uri, oldInfo);
		}

		for (Iterator i = newList.iterator(); i.hasNext();) {
			NamespaceInfo newInfo = (NamespaceInfo) i.next();
			NamespaceInfo oldInfo = (NamespaceInfo) oldURIToPrefixTable.get(newInfo.uri != null ? newInfo.uri : ""); //$NON-NLS-1$


			// if oldInfo is non null ... there's a matching URI in the old
			// set
			// we can use its prefix to detemine out mapping
			//
			// if oldInfo is null ... we use the 'oldCopy' we stashed away
			// assuming that the user changed the URI and the prefix
			if (oldInfo == null) {
				oldInfo = (NamespaceInfo) newInfo.getProperty("oldCopy"); //$NON-NLS-1$
			}

			if (oldInfo != null) {
				String newPrefix = newInfo.prefix != null ? newInfo.prefix : ""; //$NON-NLS-1$
				String oldPrefix = oldInfo.prefix != null ? oldInfo.prefix : ""; //$NON-NLS-1$
				if (!oldPrefix.equals(newPrefix)) {
					map.put(oldPrefix, newPrefix);
				}
			}
		}
		return map;
	}

	public Element getElement(Node node) {
		Element result = null;
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			result = (Element) node;
		} else if (node.getNodeType() == Node.DOCUMENT_NODE) {
			result = getRootElement((Document) node);
		}
		return result;
	}


	public Element getRootElement(Document document) {
		Element rootElement = null;
		NodeList nodeList = document.getChildNodes();
		int nodeListLength = nodeList.getLength();
		for (int i = 0; i < nodeListLength; i++) {
			Node childNode = nodeList.item(i);
			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
				rootElement = (Element) childNode;
				break;
			}
		}
		return rootElement;
	}

	public String getUndoDescription() {
		return title;
	}

	public void run() {
		Shell shell = XMLUIPlugin.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
		if (validateEdit(manager.getModel(), shell)) {
			manager.beginNodeAction(this);
	
			// todo... change constructor to take an element
			Element element = getElement(node);
			if (element != null) {
				EditSchemaInfoDialog dialog = new EditSchemaInfoDialog(shell, new Path(resourceLocation));
	
				List namespaceInfoList = namespaceInfoManager.getNamespaceInfoList(element);
				List oldNamespaceInfoList = NamespaceInfo.cloneNamespaceInfoList(namespaceInfoList);
	
				// here we store a copy of the old info for each NamespaceInfo
				// this info will be used in createPrefixMapping() to figure out
				// how to update the document
				// in response to these changes
				for (Iterator i = namespaceInfoList.iterator(); i.hasNext();) {
					NamespaceInfo info = (NamespaceInfo) i.next();
					NamespaceInfo oldCopy = new NamespaceInfo(info);
					info.setProperty("oldCopy", oldCopy); //$NON-NLS-1$
				}
	
				dialog.setNamespaceInfoList(namespaceInfoList);
				dialog.create();
				//dialog.getShell().setSize(500, 300);
				dialog.getShell().setText(XMLUIMessages._UI_MENU_EDIT_SCHEMA_INFORMATION_TITLE); //$NON-NLS-1$
				dialog.setBlockOnOpen(true);
				dialog.open();
	
				if (dialog.getReturnCode() == Window.OK) {
					List newInfoList = dialog.getNamespaceInfoList();
					namespaceInfoManager.removeNamespaceInfo(element);
					namespaceInfoManager.addNamespaceInfo(element, newInfoList, true);
	
					// see if we need to rename any prefixes
					Map prefixMapping = createPrefixMapping(oldNamespaceInfoList, namespaceInfoList);
					if (prefixMapping.size() > 0) {
						try {
							manager.getModel().aboutToChangeModel();
							ReplacePrefixAction replacePrefixAction = new ReplacePrefixAction(manager, element, prefixMapping);
							replacePrefixAction.run();
						} finally {
							manager.getModel().changedModel();
						}
					}
				}
			}
			manager.endNodeAction(this);
		}
	}
}
