/*******************************************************************************
 * Copyright (c) 2001, 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 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.xml.core.internal.document;



import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * 
 * XMLModelNotifier manages the notification process. Clients should not use
 * extend or reference.
 * 
 * ISSUE: should be internalized.
 */

public interface XMLModelNotifier {

	/**
	 * attrReplaced method
	 * 
	 * @param element
	 *            org.w3c.dom.Element
	 * @param newAttr
	 *            org.w3c.dom.Attr
	 * @param oldAttr
	 *            org.w3c.dom.Attr
	 */
	void attrReplaced(Element element, Attr newAttr, Attr oldAttr);

	/**
	 * Signal that changing is starting.
	 * 
	 */
	void beginChanging();

	/**
	 * Signal that changing is starting with a brand new model.
	 * 
	 */
	void beginChanging(boolean newModel);

	/**
	 * Cancel pending notifications. This is called in the context of
	 * "reinitialization" so is assumed ALL notifications can be safely
	 * canceled, assuming that once factories and adapters are re-initialized
	 * they will be re-notified as text is set in model, if still appropriate.
	 */
	void cancelPending();

	/**
	 * childReplaced method
	 * 
	 * @param parentNode
	 *            org.w3c.dom.Node
	 * @param newChild
	 *            org.w3c.dom.Node
	 * @param oldChild
	 *            org.w3c.dom.Node
	 */
	void childReplaced(Node parentNode, Node newChild, Node oldChild);

	/**
	 * Editable state changed for node.
	 * 
	 */
	void editableChanged(Node node);

	/**
	 * Signal changing is finished.
	 * 
	 */
	void endChanging();

	/**
	 * Signal end tag changed.
	 * 
	 * @param element
	 * 
	 */
	void endTagChanged(Element element);

	/**
	 * Used to reflect state of model.
	 * 
	 * @return true if model had changed.
	 * 
	 */
	boolean hasChanged();

	/**
	 * Used to reflect state of parsing process.
	 * 
	 * @return true if model is currently changing.
	 */
	boolean isChanging();

	/**
	 * signal property changed
	 * 
	 * @param node
	 */
	void propertyChanged(Node node);

	/**
	 * signal start tag changed
	 * 
	 * @param element
	 */
	void startTagChanged(Element element);

	/**
	 * signal structured changed.
	 * 
	 * @param node
	 */
	void structureChanged(Node node);

	/**
	 * valueChanged method
	 * 
	 * @param node
	 *            org.w3c.dom.Node
	 */
	void valueChanged(Node node);

}
