/*******************************************************************************
 * Copyright (c) 2000, 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 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.wst.jsdt.astview.views;

import java.util.ArrayList;

import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;

import org.eclipse.wst.jsdt.core.dom.IBinding;
import org.eclipse.wst.jsdt.core.dom.IFunctionBinding;
import org.eclipse.wst.jsdt.core.dom.ITypeBinding;


public class TrayContentProvider implements ITreeContentProvider {
	
	public static final int DEFAULT_CHILDREN_COUNT= 7;
	
	protected static final String N_A= "N/A"; //$NON-NLS-1$
	protected static final Object[] EMPTY= new Object[0];
	
	/*
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
	 */
	public Object[] getChildren(Object parentElement) {
		ArrayList result= new ArrayList();
		if (parentElement instanceof ExceptionAttribute)
			return EMPTY;
		
		addObjectComparisons(result, parentElement);
		
		if (parentElement instanceof Binding) {
			Binding trayElement= (Binding) parentElement;
			IBinding trayBinding= trayElement.getBinding();
			
			addBindingComparisons(result, trayElement);
			if (trayBinding instanceof ITypeBinding)
				addTypeBindingComparions(result, trayElement);
			if (trayBinding instanceof IFunctionBinding)
				addMethodBindingComparions(result, trayElement);
			
		} else {
		}
		
		return result.toArray();
	}
	
	private void addObjectComparisons(ArrayList result, Object trayElement) {
		class IdentityProperty extends DynamicAttributeProperty {
			public IdentityProperty(Object parent) {
				super(parent, "* == this: ");
			}
			protected String executeQuery(Object viewerObject, Object trayObject) {
				return Boolean.toString(viewerObject == trayObject);
			}
		} 
		result.add(new IdentityProperty(trayElement));
		
		class EqualsProperty extends DynamicAttributeProperty {
			public EqualsProperty(Object parent) {
				super(parent, "*.equals(this): ");
			}
			protected String executeQuery(Object viewerObject, Object trayObject) {
				if (viewerObject != null)
					return Boolean.toString(viewerObject.equals(trayObject));
				else
					return "* is null";
			}
		} 
		result.add(new EqualsProperty(trayElement));
	}

	private void addBindingComparisons(ArrayList result, Binding trayElement) {
		class IsEqualToProperty extends DynamicBindingProperty {
			public IsEqualToProperty(Binding parent) {
				super(parent);
			}
			protected String getName() {
				return "*.isEqualTo(this): "; //$NON-NLS-1$
			}
			protected String executeQuery(IBinding viewerBinding, IBinding trayBinding) {
				if (viewerBinding != null)
					return Boolean.toString(viewerBinding.isEqualTo(trayBinding));
				else
					return "* is null"; //$NON-NLS-1$
			}
		} 
		result.add(new IsEqualToProperty(trayElement));
		
		class KeysEqualProperty extends DynamicBindingProperty {
			public KeysEqualProperty(Binding parent) {
				super(parent);
			}
			protected String getName() {
				return "*.getKey().equals(this.getKey()): "; //$NON-NLS-1$
			}
			protected String executeQuery(IBinding viewerBinding, IBinding trayBinding) {
				if (viewerBinding == null)
					return "* is null"; //$NON-NLS-1$
				else if (viewerBinding.getKey() == null)
					return "*.getKey() is null"; //$NON-NLS-1$
				else if (trayBinding.getKey() == null)
					return "this.getKey() is null"; //$NON-NLS-1$
				else
					return Boolean.toString(viewerBinding.getKey().equals(trayBinding.getKey()));
			}
		} 
		result.add(new KeysEqualProperty(trayElement));
	}

	private void addTypeBindingComparions(ArrayList result, Binding trayElement) {
		class IsSubTypeCompatibleProperty extends DynamicBindingProperty {
			public IsSubTypeCompatibleProperty(Binding parent) {
				super(parent);
			}
			protected String getName() {
				return "*.isSubTypeCompatible(this): "; //$NON-NLS-1$
			}
			protected String executeQuery(IBinding viewerBinding, IBinding trayBinding) {
				if (viewerBinding instanceof ITypeBinding) {
					ITypeBinding viewerTB= (ITypeBinding) viewerBinding;
					ITypeBinding trayTB= (ITypeBinding) trayBinding;
					return Boolean.toString(viewerTB.isSubTypeCompatible(trayTB));
				} else {
					return "* not an ITypeBinding"; //$NON-NLS-1$
				}
			}
		} 
		result.add(new IsSubTypeCompatibleProperty(trayElement));
		
		class IsCastCompatibleProperty extends DynamicBindingProperty {
			public IsCastCompatibleProperty(Binding parent) {
				super(parent);
			}
			protected String getName() {
				return "*.isCastCompatible(this): "; //$NON-NLS-1$
			}
			protected String executeQuery(IBinding viewerBinding, IBinding trayBinding) {
				if (viewerBinding instanceof ITypeBinding) {
					ITypeBinding viewerTB= (ITypeBinding) viewerBinding;
					ITypeBinding trayTB= (ITypeBinding) trayBinding;
					return Boolean.toString(viewerTB.isCastCompatible(trayTB));
				} else {
					return "* not an ITypeBinding"; //$NON-NLS-1$
				}
			}
		} 
		result.add(new IsCastCompatibleProperty(trayElement));
		
		class IsAssignmentCompatibleProperty extends DynamicBindingProperty {
			public IsAssignmentCompatibleProperty(Binding parent) {
				super(parent);
			}
			protected String getName() {
				return "*.isAssignmentCompatible(this): "; //$NON-NLS-1$
			}
			protected String executeQuery(IBinding viewerBinding, IBinding trayBinding) {
				if (viewerBinding instanceof ITypeBinding) {
					ITypeBinding viewerTB= (ITypeBinding) viewerBinding;
					ITypeBinding trayTB= (ITypeBinding) trayBinding;
					return Boolean.toString(viewerTB.isAssignmentCompatible(trayTB));
				} else {
					return "* not an ITypeBinding"; //$NON-NLS-1$
				}
			}
		} 
		result.add(new IsAssignmentCompatibleProperty(trayElement));
	}

	private void addMethodBindingComparions(ArrayList result, Binding trayElement) {
		class OverridesProperty extends DynamicBindingProperty {
			public OverridesProperty(Binding parent) {
				super(parent);
			}
			protected String getName() {
				return "*.overrides(this): "; //$NON-NLS-1$
			}
			protected String executeQuery(IBinding viewerBinding, IBinding trayBinding) {
				if (viewerBinding instanceof IFunctionBinding) {
					IFunctionBinding viewerMB= (IFunctionBinding) viewerBinding;
					IFunctionBinding trayMB= (IFunctionBinding) trayBinding;
					return Boolean.toString(viewerMB.overrides(trayMB));
				} else {
					return "* not an IFunctionBinding"; //$NON-NLS-1$
				}
			}
		} 
		result.add(new OverridesProperty(trayElement));
		
		class IsSubsignatureProperty extends DynamicBindingProperty {
			public IsSubsignatureProperty(Binding parent) {
				super(parent);
			}
			protected String getName() {
				return "*.isSubsignature(this): "; //$NON-NLS-1$
			}
			protected String executeQuery(IBinding viewerBinding, IBinding trayBinding) {
				if (viewerBinding instanceof IFunctionBinding) {
					IFunctionBinding viewerMB= (IFunctionBinding) viewerBinding;
					IFunctionBinding trayMB= (IFunctionBinding) trayBinding;
					return Boolean.toString(viewerMB.isSubsignature(trayMB));
				} else {
					return "* not an IFunctionBinding"; //$NON-NLS-1$
				}
			}
		} 
		result.add(new IsSubsignatureProperty(trayElement));
	}

	/*
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
	 */
	public Object getParent(Object element) {
		if (element instanceof ASTAttribute) {
			return ((ASTAttribute) element).getParent();
		} else {
			return null;
		}
	}
	
	/*
	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
	 */
	public boolean hasChildren(Object element) {
		return ! (element instanceof DynamicAttributeProperty || element instanceof DynamicBindingProperty);
	}
	
	/*
	 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
	 */
	public Object[] getElements(Object inputElement) {
		if (inputElement instanceof ArrayList)
			return ((ArrayList) inputElement).toArray();
		return EMPTY;
	}
	
	/*
	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
	 */
	public void dispose() {
		// do nothing
	}
	
	/*
	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
	 */
	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
		// do nothing
	}
}
