/*******************************************************************************
 * Copyright (c) 2010 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.e4.ui.internal.workbench.swt;

import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.expressions.ICountable;
import org.eclipse.core.expressions.IIterable;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;

/**
 * Adapts ISelection instances to either IIterable or ICountable. For use with
 * core expressions.
 * 
 * @since 3.3
 */
public class SelectionAdapterFactory implements IAdapterFactory {
	private static final ICountable ICOUNT_0 = new ICountable() {
		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.core.expressions.ICountable#count()
		 */
		public int count() {
			return 0;
		}
	};
	private static final ICountable ICOUNT_1 = new ICountable() {
		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.core.expressions.ICountable#count()
		 */
		public int count() {
			return 1;
		}
	};
	private static final IIterable ITERATE_EMPTY = new IIterable() {
		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.core.expressions.IIterable#iterator()
		 */
		public Iterator iterator() {
			return Collections.EMPTY_LIST.iterator();
		}
	};

	/**
	 * The classes we can adapt to.
	 */
	private static final Class[] CLASSES = new Class[] { IIterable.class,
			ICountable.class };

	public Object getAdapter(Object adaptableObject, Class adapterType) {
		if (adaptableObject instanceof ISelection) {
			if (adapterType == IIterable.class) {
				return iterable((ISelection) adaptableObject);
			} else if (adapterType == ICountable.class) {
				return countable((ISelection) adaptableObject);
			}
		}
		return null;
	}

	private Object iterable(final ISelection sel) {
		if (sel.isEmpty()) {
			return ITERATE_EMPTY;
		}
		if (sel instanceof IStructuredSelection) {
			return new IIterable() {
				public Iterator iterator() {
					return ((IStructuredSelection) sel).iterator();
				}
			};
		}
		final List list = Arrays.asList(new Object[] { sel });
		return new IIterable() {

			public Iterator iterator() {
				return list.iterator();
			}
		};
	}

	private Object countable(final ISelection sel) {
		if (sel.isEmpty()) {
			return ICOUNT_0;
		}
		if (sel instanceof IStructuredSelection) {
			final IStructuredSelection ss = (IStructuredSelection) sel;
			return new ICountable() {
				public int count() {
					return ss.size();
				}
			};
		}
		return ICOUNT_1;
	}

	public Class[] getAdapterList() {
		return CLASSES;
	}
}
