/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.model;

import java.util.HashMap;
import java.util.Iterator;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
import org.eclipse.ui.internal.WorkbenchImages;
import org.eclipse.ui.internal.WorkbenchMessages;

/**
 * A table label provider implementation for showing workbench perspectives 
 * (objects of type <code>IPerspectiveDescriptor</code>) in table- and 
 * tree-structured viewers.
 * <p>
 * Clients may instantiate this class. It is not intended to be subclassed.
 * </p>
 * 
 * @since 3.0
 */
public final class PerspectiveLabelProvider
		extends LabelProvider
		implements ITableLabelProvider {
	
	/**
	 * List of all Image objects this label provider is responsible for.
	 */
	private HashMap imageCache = new HashMap(5);
	
	/**
	 * Indicates whether the default perspective is visually marked.
	 */
	private boolean markDefault;

	/**
	 * Creates a new label provider for perspectives.
	 * The default perspective is visually marked.
	 */
	public PerspectiveLabelProvider() {
		this(true);
	}

	/**
	 * Creates a new label provider for perspectives.
	 * 
	 * @param markDefault <code>true</code> if the default perspective is to be
	 * visually marked, and <code>false</code> if the default perspective is
	 * not treated as anything special
	 */
	public PerspectiveLabelProvider(boolean markDefault) {
		super();
		this.markDefault = markDefault;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ILabelProvider
	 */
	public final Image getImage(Object element) {
		if (element instanceof IPerspectiveDescriptor) {
			IPerspectiveDescriptor desc = (IPerspectiveDescriptor) element;
			ImageDescriptor imageDescriptor = desc.getImageDescriptor();
			if (imageDescriptor == null) {
				imageDescriptor =
					WorkbenchImages.getImageDescriptor(
						IWorkbenchGraphicConstants
							.IMG_ETOOL_DEF_PERSPECTIVE_HOVER);
			}
			Image image = (Image) imageCache.get(imageDescriptor);
			if (image == null) {
				image = imageDescriptor.createImage();
				imageCache.put(imageDescriptor, image);
			}
			return image;
		}
		return null;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ILabelProvider
	 */
	public final void dispose() {
		for (Iterator i = imageCache.values().iterator(); i.hasNext();) {
			((Image) i.next()).dispose();
		}
		imageCache.clear();
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ILabelProvider
	 */
	public final String getText(Object element) {
		if (element instanceof IPerspectiveDescriptor) {
			IPerspectiveDescriptor desc = (IPerspectiveDescriptor) element;
			String label = desc.getLabel();
			if (markDefault) {
				String def =
					PlatformUI
						.getWorkbench()
						.getPerspectiveRegistry()
						.getDefaultPerspective();
				if (desc.getId().equals(def)) {
					label = WorkbenchMessages.format("PerspectivesPreference.defaultLabel", new Object[] { label }); //$NON-NLS-1$
				}
			}
			return label;
		}
		return WorkbenchMessages.getString("PerspectiveLabelProvider.unknown"); //$NON-NLS-1$
	}
	
	/**
	 * @see ITableLabelProvider#getColumnImage
	 */
	public final Image getColumnImage(Object element, int columnIndex) {
		return getImage(element);
	}

	/**
	 * @see ITableLabelProvider#getColumnText
	 */
	public final String getColumnText(Object element, int columnIndex) {
		return getText(element);
	}
}
