/*******************************************************************************
 * Copyright (c) 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
 *     
 *******************************************************************************/
package org.eclipse.wst.xml.ui.internal;

import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;

/**
 * This is just an adapter that sits on a document node to allow clients
 * limited access to the DOMObserver. Clients who handle their own content
 * model document loading (as opposed to letting the DOMObserver do it) may
 * use this class to stop the DOMObserver from loading and possibly
 * interfering with the client's document loading. When clients are getting
 * the DOMObserverAdapter, they should only call
 * INodeNotifier.getExistingAdapter(). Attempting to create their own new
 * DOMObserverAdapter will not work since there will be no associated
 * DOMObserver.
 */
public class DOMObserverAdapter implements INodeAdapter {
	private DOMObserver fObserver = null;

	public boolean isAdapterForType(Object type) {
		return type == DOMObserverAdapter.class;
	}

	public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
		// do nothing
	}

	/**
	 * The DOMObserver is the one that adds the adapter to the document node,
	 * so it'll set itself up here as well.
	 * 
	 * @param observer
	 */
	void setDOMObserver(DOMObserver observer) {
		fObserver = observer;
	}

	/**
	 * Disable the DOMObserver to prevent it from future content model loading
	 * for this document.
	 * 
	 * @param disable
	 *            true if caller wants DOMObserver disabled. false if caller
	 *            wants DOMObserver enabled.
	 * @param force
	 *            if true, DOMObserver will forcibly be disabled (if the
	 *            DOMObserver model loading job is scheduled, it will be
	 *            cancelled)
	 * @return true if DOMObserver was successfully disabled. false if
	 *         DOMObserver was already in the process of loading and was
	 *         unable to stop
	 */
	public boolean disableObserver(boolean disable, boolean force) {
		return fObserver.setDisabled(disable, force);
	}

	/**
	 * Returns whether or not DOMObserver is currently attempting to load the
	 * content model.
	 * 
	 * @return true if DOMObserver is currently in the process of loading the
	 *         content models. false otherwise.
	 */
	public boolean isObserverLoading() {
		return fObserver.isLoading();
	}
}
