//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit;

import java.util.Comparator;

import org.eclipse.epf.library.edit.util.Comparators;
import org.eclipse.epf.library.edit.util.Comparators.TypeComparator;
import org.eclipse.epf.uma.Guidance;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.ProcessPackage;
import org.eclipse.epf.uma.UmaPackage;


/**
 * @author Phong Nguyen Le - Mar 7, 2006
 * @since  1.0
 */
public class PresentationContext {
	public static final PresentationContext INSTANCE = new PresentationContext(); 

	private boolean showPresentationNames = false;
	private Comparator comparator = Comparators.DEFAULT_COMPARATOR;
	private Comparator reverseComparator = Comparators.REVERSE_DEFAULT_COMPARATOR;
	private Comparator methodElementTypeComparator = Comparators.METHOD_TYPE_COMPARATOR;
	
	
	private Comparator guidanceTypeComparator = new TypeComparator() {
		/* (non-Javadoc)
		 * @see org.eclipse.epf.library.edit.util.Comparators.TypeComparator#getDefaultComparator()
		 */
		protected Comparator getDefaultComparator() {
			return comparator;
		}

		protected int getOrderId(Object obj) {
			if (obj instanceof Guidance) {
				int id = ((Guidance) obj).eClass().getClassifierID();
				if (id == UmaPackage.TERM_DEFINITION) {
					id = Integer.MAX_VALUE;
				}
				return id;
			}
			return -1;
		}
	};

	private Comparator processPackageComparator = new TypeComparator() {
		/* (non-Javadoc)
		 * @see org.eclipse.epf.library.edit.util.Comparators.TypeComparator#getDefaultComparator()
		 */
		protected Comparator getDefaultComparator() {
			return comparator;
		}
		
		protected int getOrderId(Object obj) {
			if (obj instanceof ProcessComponent) {
				return Integer.MAX_VALUE;
			} else if (obj instanceof ProcessPackage) {
				return 0;
			}
			return -1;
		}
	};


	
	private PresentationContext() {
		super();
	}

	public boolean isShowPresentationNames() {
		return showPresentationNames;
	}

	public void setShowPresentationNames(boolean showPresentationNames) {
		this.showPresentationNames = showPresentationNames;
		comparator = showPresentationNames ? Comparators.PRESENTATION_NAME_COMPARATOR : Comparators.DEFAULT_COMPARATOR;
		reverseComparator = showPresentationNames ? Comparators.REVERSE_PRESENTATION_NAME_COMPARATOR : Comparators.REVERSE_DEFAULT_COMPARATOR;
		methodElementTypeComparator = showPresentationNames ? Comparators.METHOD_TYPE_PRES_NAME_COMPARATOR : Comparators.METHOD_TYPE_COMPARATOR;
	}

	public Comparator getComparator() {
		return comparator;
	}

	public Comparator getReverseComparator() {
		return reverseComparator;
	}

	public Comparator getGuidanceTypeComparator() {
		return guidanceTypeComparator;
	}

	public Comparator getProcessPackageComparator() {
		return processPackageComparator;
	}
	
	public Comparator getMethodElementTypeComparator() {
		return methodElementTypeComparator;
	}
	
	public Comparator getPresNameComparator() {
		return Comparators.PRESENTATION_NAME_COMPARATOR;
	}

	public Comparator getPresNameReverseComparator() {
		return Comparators.REVERSE_PRESENTATION_NAME_COMPARATOR;
	}
	
	public Comparator getPresNameMethodElementTypeComparator() {
		return Comparators.METHOD_TYPE_PRES_NAME_COMPARATOR;
	}

}
