content: /*******************************************************************************
   * Copyright (c) 2000, 2008 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.wst.jsdt.ui;
  
  import org.eclipse.core.resources.IStorage;
  import org.eclipse.jface.viewers.LabelProvider;
  import org.eclipse.swt.graphics.Image;
  import org.eclipse.wst.jsdt.internal.ui.viewsupport.JavaElementImageProvider;
  import org.eclipse.wst.jsdt.internal.ui.viewsupport.StorageLabelProvider;
  
  /**
   * Standard label provider for JavaScript elements.
   * Use this class when you want to present the JavaScript elements in a viewer.
   * <p>
   * The implementation also handles non-JavaScript elements by forwarding the requests to the
   * <code>IWorkbenchAdapter</code> of the element.
   * </p>
   * <p>
   * This class may be instantiated; it is not intended to be subclassed.
   * </p>
   *  * Provisional API: This class/interface is part of an interim API that is still under development and expected to
   * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
   * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
   * (repeatedly) as the API evolves.
   */
  public class JavaScriptElementLabelProvider extends LabelProvider {
  	
  	/**
  	 * Flag (bit mask) indicating that methods labels include the method return type (appended).
  	 */
  	public final static int SHOW_RETURN_TYPE=				0x001;
  	
  	/**
  	 * Flag (bit mask) indicating that method label include parameter types.
  	 */
  	public final static int SHOW_PARAMETERS=				0x002;
  	
  	/**
  	 * Flag (bit mask) indicating that the label of a member should include the container.
  	 * For example, include the name of the type enclosing a field.
  	 * @deprecated Use SHOW_QUALIFIED or SHOW_ROOT instead
  	 */
  	public final static int SHOW_CONTAINER=				0x004;
  
  	/**
  	 * Flag (bit mask) indicating that the label of a type should be fully qualified.
  	 * For example, include the fully qualified name of the type enclosing a type.
  	 * @deprecated Use SHOW_QUALIFIED instead
  	 */
  	public final static int SHOW_CONTAINER_QUALIFICATION=	0x008;
  
  	/**
  	 * Flag (bit mask) indicating that the label should include overlay icons
  	 * for element type and modifiers.
  	 */
  	public final static int SHOW_OVERLAY_ICONS=			0x010;
  
  	/**
  	 * Flag (bit mask) indicating that a field label should include the declared type.
  	 */
  	public final static int SHOW_TYPE=					0x020;
  
  	/**
  	 * Flag (bit mask) indicating that the label should include the name of the
  	 * package fragment root (appended).
  	 */
  	public final static int SHOW_ROOT=					0x040;
  	
  	/**
  	 * Flag (bit mask) indicating that the label qualification of a type should
  	 * be shown after the name.
  	 * @deprecated SHOW_POST_QUALIFIED instead
  	 */
  	public final static int SHOW_POSTIFIX_QUALIFICATION=		0x080;
  
  	/**
  	 * Flag (bit mask) indicating that the label should show the icons with no space
  	 * reserved for overlays.
  	 */
  	public final static int SHOW_SMALL_ICONS= 			0x100;
  	
  	/**
  	 * Flag (bit mask) indicating that the package fragment roots from class path variables should
  	 * be rendered with the variable in the name
  	 */
  	public final static int SHOW_VARIABLE= 			0x200;
  	
  	/**
  	 * Flag (bit mask) indicating that compilation units, class files, types, declarations and members
  	 * should be rendered qualified.
  	 * Examples: <code>java.lang.String</code>, <code>java.util.Vector.size()</code>
  	 * 
  	 * 
  	 */
  	public final static int SHOW_QUALIFIED=				0x400;
  
  	/**
  	 * Flag (bit mask) indicating that compilation units, class files, types, declarations and members
  	 * should be rendered qualified.The qualification is appended.
  	 * Examples: <code>String - java.lang</code>, <code>size() - java.util.Vector</code>
  	 * 
  	 * 
  	 */
  	public final static int SHOW_POST_QUALIFIED=	0x800;	
  	
  	
  	/**
  	 * Constant (value <code>0</code>) indicating that the label should show 
  	 * the basic images only.
  	 */
  	public final static int SHOW_BASICS= 0x000;
  	
  	
  	/**
  	 * Constant indicating the default label rendering.
  	 * Currently the default is equivalent to
  	 * <code>SHOW_PARAMETERS | SHOW_OVERLAY_ICONS</code>.
  	 */
  	public final static int SHOW_DEFAULT= SHOW_PARAMETERS | SHOW_OVERLAY_ICONS;
  
  	private JavaElementImageProvider fImageLabelProvider;
  	
  	private StorageLabelProvider fStorageLabelProvider;
  	private int fFlags;
  	private int fImageFlags;
  	private long fTextFlags;
  	
  	/**
  	 * Creates a new label provider with <code>SHOW_DEFAULT</code> flag.
  	 *
  	 * @see #SHOW_DEFAULT
  	 * 
  	 */
  	public JavaScriptElementLabelProvider() {
  		this(SHOW_DEFAULT);
  	}
  
  	/**
  	 * Creates a new label provider.
  	 *
  	 * @param flags the initial options; a bitwise OR of <code>SHOW_* </code> constants
  	 */
  	public JavaScriptElementLabelProvider(int flags) {
  		fImageLabelProvider= new JavaElementImageProvider();
  		fStorageLabelProvider= new StorageLabelProvider();
  		fFlags= flags;
  		updateImageProviderFlags();
  		updateTextProviderFlags();		
  	}
  	
  	private boolean getFlag( int flag) {
  		return (fFlags & flag) != 0;
  	}
  	
  	/**
  	 * Turns on the rendering options specified in the given flags.
  	 *
  	 * @param flags the options; a bitwise OR of <code>SHOW_* </code> constants
  	 */
  	public void turnOn(int flags) {
  		fFlags |= flags;
  		updateImageProviderFlags();
  		updateTextProviderFlags();
  	}
  	
  	/**
  	 * Turns off the rendering options specified in the given flags.
  	 *
  	 * @param flags the initial options; a bitwise OR of <code>SHOW_* </code> constants
  	 */
  	public void turnOff(int flags) {
  		fFlags &= (~flags);
  		updateImageProviderFlags();
  		updateTextProviderFlags();
  	}
  	
  	private void updateImageProviderFlags() {
  		fImageFlags= 0;
  		if (getFlag(SHOW_OVERLAY_ICONS)) {
  			fImageFlags |= JavaElementImageProvider.OVERLAY_ICONS;
  		}
  		if (getFlag(SHOW_SMALL_ICONS)) {
  			fImageFlags |= JavaElementImageProvider.SMALL_ICONS;
  		}
  	}	
  	
  	private void updateTextProviderFlags() {
  		fTextFlags= JavaScriptElementLabels.T_TYPE_PARAMETERS;
  		if (getFlag(SHOW_RETURN_TYPE)) {
  			fTextFlags |= JavaScriptElementLabels.M_APP_RETURNTYPE;
  		}
  		if (getFlag(SHOW_PARAMETERS)) {
  			fTextFlags |= JavaScriptElementLabels.M_PARAMETER_TYPES;
  		}		
  		if (getFlag(SHOW_CONTAINER)) {
  			fTextFlags |= JavaScriptElementLabels.P_POST_QUALIFIED | JavaScriptElementLabels.T_POST_QUALIFIED | JavaScriptElementLabels.CF_POST_QUALIFIED  | JavaScriptElementLabels.CU_POST_QUALIFIED | JavaScriptElementLabels.M_POST_QUALIFIED | JavaScriptElementLabels.F_POST_QUALIFIED;
  		}
  		if (getFlag(SHOW_POSTIFIX_QUALIFICATION)) {
  			fTextFlags |= (JavaScriptElementLabels.T_POST_QUALIFIED | JavaScriptElementLabels.CF_POST_QUALIFIED  | JavaScriptElementLabels.CU_POST_QUALIFIED);
  		} else if (getFlag(SHOW_CONTAINER_QUALIFICATION)) {
  			fTextFlags |=(JavaScriptElementLabels.T_FULLY_QUALIFIED | JavaScriptElementLabels.CF_QUALIFIED  | JavaScriptElementLabels.CU_QUALIFIED);
  		}
  		if (getFlag(SHOW_TYPE)) {
  			fTextFlags |= JavaScriptElementLabels.F_APP_TYPE_SIGNATURE;
  		}
  		if (getFlag(SHOW_ROOT)) {
  			fTextFlags |= JavaScriptElementLabels.APPEND_ROOT_PATH;
  		}			
  		if (getFlag(SHOW_VARIABLE)) {
  			fTextFlags |= JavaScriptElementLabels.ROOT_VARIABLE;
  		}
  		if (getFlag(SHOW_QUALIFIED)) {
  			fTextFlags |= (JavaScriptElementLabels.F_FULLY_QUALIFIED | JavaScriptElementLabels.M_FULLY_QUALIFIED | JavaScriptElementLabels.I_FULLY_QUALIFIED 
  				| JavaScriptElementLabels.T_FULLY_QUALIFIED | JavaScriptElementLabels.D_QUALIFIED | JavaScriptElementLabels.CF_QUALIFIED  | JavaScriptElementLabels.CU_QUALIFIED);
  		}
  		if (getFlag(SHOW_POST_QUALIFIED)) {
  			fTextFlags |= (JavaScriptElementLabels.F_POST_QUALIFIED | JavaScriptElementLabels.M_POST_QUALIFIED | JavaScriptElementLabels.I_POST_QUALIFIED 
  			| JavaScriptElementLabels.T_POST_QUALIFIED | JavaScriptElementLabels.D_POST_QUALIFIED | JavaScriptElementLabels.CF_POST_QUALIFIED  | JavaScriptElementLabels.CU_POST_QUALIFIED);
  		}		
  	}
  
  	/* (non-Javadoc)
  	 * @see ILabelProvider#getImage
  	 */
  	public Image getImage(Object element) {
  		Image result= fImageLabelProvider.getImageLabel(element, fImageFlags);
  		if (result != null) {
  			return result;
  		}
  
  		if (element instanceof IStorage) 
  			return fStorageLabelProvider.getImage(element);
  
  		return result;
  	}
  
  	/* (non-Javadoc)
  	 * @see ILabelProvider#getText
  	 */
  	public String getText(Object element) {
  		String text= JavaScriptElementLabels.getTextLabel(element, fTextFlags);
  		if (text.length() > 0) {
  			return text;
  		}
  
  		if (element instanceof IStorage)
  			return fStorageLabelProvider.getText(element);
  
  		return text;
  	}
  
  	/* (non-Javadoc)
  	 * 
  	 * @see IBaseLabelProvider#dispose
  	 */
  	public void dispose() {
  		fStorageLabelProvider.dispose();
  		fImageLabelProvider.dispose();
  	}
  }
  