/*******************************************************************************
 * 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 v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jem.internal.beaninfo.adapters;
/*


 */

import java.util.Collection;
import java.util.Iterator;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.impl.ESuperAdapter;
import org.eclipse.emf.ecore.util.EcoreUtil;

import org.eclipse.jem.java.JavaClass;
import org.eclipse.jem.java.JavaRefPackage;
import org.eclipse.jem.java.internal.impl.JavaClassImpl;

/**
 * Used to know when events or any of the super classes change so
 * that we can re-construct our all events list next time we need it.
 * @version 	1.0
 * @author
 */
public class BeaninfoSuperAdapter extends AdapterImpl {

	public static final Class ADAPTER_KEY = BeaninfoSuperAdapter.class;

	private boolean allEventsCollectionModified = true;
	private boolean allPropertiesCollectionModified = true;
	private boolean allOperationsCollectionModified = true;

	public BeaninfoSuperAdapter() {
		super();
	}

	public void notifyChanged(Notification msg) {
		if (msg.getEventType() != Notification.REMOVING_ADAPTER)
			setFlags(msg.getFeatureID(JavaClass.class));
	}

	public boolean isAllEventsCollectionModified() {
		return allEventsCollectionModified;
	}

	public void setAllEventsCollectionModified(boolean newEventsModified) {
		allEventsCollectionModified = newEventsModified;
	}

	public boolean isAllOperationsCollectionModified() {
		return allOperationsCollectionModified;
	}

	public void setAllOperationsCollectionModified(boolean newOperationsModified) {
		allOperationsCollectionModified = newOperationsModified;
	}
	
	public void setAllPropertiesCollectionModified(boolean allPropertiesCollectionModified) {
		this.allPropertiesCollectionModified = allPropertiesCollectionModified;
	}

	public boolean isAllPropertiesCollectionModified() {
		return allPropertiesCollectionModified;
	}
	
	public Collection getSubclasses() {
		// Get them from the ESuperAdapter. Easiest to do.
		ESuperAdapter ea = ((JavaClassImpl) getTarget()).getESuperAdapter();
		return ea.getSubclasses();
	}

	public boolean isAdapterForType(Object type) {
		return ADAPTER_KEY.equals(type);
	}

	void setFlags(int featureId) {
		switch (featureId) {
			case JavaRefPackage.JAVA_CLASS__EVENTS :
				setAllEventsCollectionModified(true);
				break;
				
			case JavaRefPackage.JAVA_CLASS__EOPERATIONS:
				setAllOperationsCollectionModified(true);
				break;

			case JavaRefPackage.JAVA_CLASS__ESUPER_TYPES:
				setAllEventsCollectionModified(true);
				setAllPropertiesCollectionModified(true);
				break;				
				
			case JavaRefPackage.JAVA_CLASS__ESTRUCTURAL_FEATURES:
				setAllPropertiesCollectionModified(true);
				break;
				
			default :
				break;
		}
		Iterator i = getSubclasses().iterator();
		while (i.hasNext()) {
			Notifier n = (Notifier) i.next();
			BeaninfoSuperAdapter a = (BeaninfoSuperAdapter) EcoreUtil.getExistingAdapter(n, ADAPTER_KEY);
			if (a != null)
				a.setFlags(featureId);
		}
	}

}
