/*******************************************************************************
 * Copyright (c) 2003, 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.provider;


import java.util.Collection;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.edit.provider.ItemProvider;

public class J2EEItemProvider extends ItemProvider implements IAdaptable {

	protected static final Class IRESOURCE_CLASS = IResource.class;
	protected static final Class IFILE_CLASS = IFile.class;


	/**
	 * Constructor for J2EEItemProvider.
	 */
	public J2EEItemProvider() {
		super();
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param children
	 */
	public J2EEItemProvider(Collection children) {
		super(children);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param text
	 */
	public J2EEItemProvider(String text) {
		super(text);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param text
	 * @param children
	 */
	public J2EEItemProvider(String text, Collection children) {
		super(text, children);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param text
	 * @param image
	 */
	public J2EEItemProvider(String text, Object image) {
		super(text, image);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param text
	 * @param image
	 * @param children
	 */
	public J2EEItemProvider(String text, Object image, Collection children) {
		super(text, image, children);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param text
	 * @param image
	 * @param parent
	 */
	public J2EEItemProvider(String text, Object image, Object parent) {
		super(text, image, parent);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param text
	 * @param image
	 * @param parent
	 * @param children
	 */
	public J2EEItemProvider(String text, Object image, Object parent, Collection children) {
		super(text, image, parent, children);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory) {
		super(adapterFactory);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 * @param text
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory, String text) {
		super(adapterFactory, text);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 * @param text
	 * @param image
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory, String text, Object image) {
		super(adapterFactory, text, image);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 * @param text
	 * @param image
	 * @param parent
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory, String text, Object image, Object parent) {
		super(adapterFactory, text, image, parent);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 * @param children
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory, Collection children) {
		super(adapterFactory, children);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 * @param text
	 * @param children
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory, String text, Collection children) {
		super(adapterFactory, text, children);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 * @param text
	 * @param image
	 * @param children
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory, String text, Object image, Collection children) {
		super(adapterFactory, text, image, children);
	}

	/**
	 * Constructor for J2EEItemProvider.
	 * 
	 * @param adapterFactory
	 * @param text
	 * @param image
	 * @param parent
	 * @param children
	 */
	public J2EEItemProvider(AdapterFactory adapterFactory, String text, Object image, Object parent, Collection children) {
		super(adapterFactory, text, image, parent, children);
	}

	protected boolean notificationOn = true;

	protected void disableNotification() {
		notificationOn = false;
	}

	protected void enableNotification() {
		notificationOn = true;
	}


	@Override
	public void fireNotifyChanged(Notification notification) {
		if (notificationOn)
			super.fireNotifyChanged(notification);
	}

	@Override
	public Collection getChildren(Object object) {
		if (children.isEmpty()) {
			try {
				disableNotification();
				initializeChildren();
			} finally {
				enableNotification();
			}
		}
		return children;
	}

	protected void initializeChildren() {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 */
	public Object getAdapter(Class adapter) {
		if (adapter == IRESOURCE_CLASS || adapter == IFILE_CLASS)
			return null; //return getAssociatedFile();
		return Platform.getAdapterManager().getAdapter(this, adapter);
	}
	
	public IFile getAssociatedFile() {
		return null;		
	}

	/**
	 * @return
	 */
//	private IProject getProjectFromParent() {
//		return ProjectUtilities.getProject(getParent());
//	}

}
