/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle 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:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.details.providers;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.jface.viewers.IStructuredContentProvider;

/**
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Jul 18, 2006
 *
 */
public class CompositeContentProvider extends AbstractContentProvider {
	

	List fList = new LinkedList();

	
	/**
	 * 
	 */
	public CompositeContentProvider() {
		super();
	}

	/**
	 * @param providers
	 */
	
	public CompositeContentProvider (IStructuredContentProvider[] providers) {
		super();
		if (providers != null) {
			for(int i=0; i<providers.length; i++) {
				fList.add(providers[i]);
			}
		}		
	}

	public void add ( IStructuredContentProvider provider ) {
		fList.add ( provider );
	}
	
	
	@Override
	public void collectElements (Object input, List list) {
		
		// Check if the input element is a complex one
		if (collectComplex(input, list)) {
			return ;
		}
		
		
		Iterator it = fList.iterator();
		
		while (it.hasNext()) {
			
			Object next = it.next();
			
			if (next instanceof AbstractContentProvider) {
				AbstractContentProvider provider = (AbstractContentProvider) next;
				provider.collectElements(input, list);
				
			} else if (next instanceof IStructuredContentProvider) {
				
				IStructuredContentProvider provider = (IStructuredContentProvider) next;
				Object objs [] = provider.getElements(input);			
				if (objs.length > 0) {
					for(int j=0; j<objs.length;j++) {
						list.add(objs[j]);
					}
				}
			} 
			// silently ignore non-conformists ?
			
		}				
	}
	
}
