/**
 * 
 */
package org.eclipse.epf.authoring.ui.filters;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
import org.eclipse.epf.library.edit.itemsfilter.FilterHelper;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.jface.viewers.Viewer;

/**
 * Configuration filter that still shows certain elements during process authoring that
 * ProcessConfigurator does not show. Filter elements based on search pattern and type.
 * @author skannoor
 *
 */
public class ExProcessAuthoringConfigurator extends
		ProcessAuthoringConfigurator {

	String filterStr;

	MethodConfiguration methodConfiguration;
	Viewer viewer;
	
	protected FilterHelper helper;
	/**
	 * @param methodConfig
	 * @param viewer
	 */
	public ExProcessAuthoringConfigurator(MethodConfiguration methodConfig,
			Viewer viewer) {
		super(methodConfig);
		this.viewer = viewer;
		//this.filterStr = filterStr;
		this.methodConfiguration = methodConfig;
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
	 */
	public void notifyChanged(final Notification msg) {
		if (viewer == null) {
			return;
		}

		SafeUpdateController.syncExec(new Runnable() {
			public void run() {
				switch (msg.getEventType()) {
				case Notification.ADD:
				case Notification.ADD_MANY:
				case Notification.REMOVE:
				case Notification.REMOVE_MANY:
					viewer.refresh();
				}
			}
		});

	}
	
	public boolean accept(Object obj) {

		if(obj == null) return false;
		
		if (obj instanceof MethodConfiguration) {
			return methodConfiguration.equals(obj);
		}

//		if (!super.accept(obj))
//			return false;
		if (methodConfig == null)
			return true;

		obj = LibraryUtil.unwrap(obj);

//		if (obj instanceof MethodPackage) {
//			return methodConfig.getMethodPackageSelection().contains(obj);
//		} else if (obj instanceof ItemProviderAdapter) {
//			return true;
//		} else {
//			if(Log.DEBUG) {
//				System.out.println("Object filtered: " + (obj == null ? null : obj.toString())); //$NON-NLS-1$
//			}
//		}
		if (helper.isShowPresentationName()) {
			if (!helper.matchPatternOnPresentationName(obj))
				return false;
		} else {
			if (!helper.matchPattern(obj))
				return false;
		}
		if (!helper.isObjectInSelectedItems(obj))
			return false;
		if (childAccept(obj))
			return true;
		return false;

	}

	public boolean childAccept(Object obj) {
		return false;
	}

	public void setHelper(FilterHelper helper) {
		this.helper = helper;
	}
	
	public void setMethodConfiguration(MethodConfiguration config)
	{
		super.setMethodConfiguration(config);
		this.methodConfiguration = config;
	}
}
