/*******************************************************************************
 * Copyright (c) 2000, 2003 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.texteditor;



import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;

import org.eclipse.ui.help.WorkbenchHelp;


/**
 * An action which configures its label, image, tooltip, and description from
 * a resource bundle using known keys.
 * <p>
 * Clients may subclass this abstract class to define new kinds of actions. As
 * with <code>Action</code>, subclasses must implement the 
 * <code>IAction.run</code> method to carry out the action's semantics.
 * </p>
 */
public abstract class ResourceAction extends Action {
	
	/**
	 * Retrieves and returns the value with the given key from the given resource 
	 * bundle, or returns the given default value if there is no such resource.
	 * Convenience method for dealing gracefully with missing resources.
	 *
	 * @param bundle the resource bundle
	 * @param key the resource key
	 * @param defaultValue the default value, or <code>null</code>
	 * @return the resource value, or the given default value (which may be
	 *   <code>null</code>)
	 */
	protected static String getString(ResourceBundle bundle, String key, String defaultValue) {
		
		String value= defaultValue;
		try {
			value= bundle.getString(key);
		} catch (MissingResourceException x) {
		}
		
		return value;
	}

	/**
	 * Creates a new action that configures itself from the given resource
	 * bundle.
	 * <p>
	 * The following keys, prepended by the given option prefix,
	 * are used for retrieving resources from the given bundle:
	 * <ul>
	 *   <li><code>"label"</code> - <code>setText</code></li>
	 *   <li><code>"tooltip"</code> - <code>setToolTipText</code></li>
	 *   <li><code>"image"</code> - <code>setImageDescriptor</code></li>
	 *   <li><code>"description"</code> - <code>setDescription</code></li>
	 * </ul>
	 * </p>
	 *
	 * @param bundle the resource bundle
	 * @param prefix a prefix to be prepended to the various resource keys, or 
	 *   <code>null</code> if none
 	 * @param	style one of <code>IAction.AS_PUSH_BUTTON</code>, <code>IAction.AS_CHECK_BOX</code>,
 	 *			and <code>IAction.AS_RADIO_BUTTON</code>.
	 *
	 * @see ResourceAction#ResourceAction
	 * @see org.eclipse.jface.action.IAction#AS_CHECK_BOX
	 * @see org.eclipse.jface.action.IAction#AS_DROP_DOWN_MENU
	 * @see org.eclipse.jface.action.IAction#AS_PUSH_BUTTON
	 * @see org.eclipse.jface.action.IAction#AS_RADIO_BUTTON
	 * @since 2.1
	 */
	public ResourceAction(ResourceBundle bundle, String prefix, int style) {
		super(null, style);
		initialize(bundle, prefix);
	}
	
	/**
	 * Creates a new action that configures itself from the given resource
	 * bundle.
	 * <p>
	 * The following keys, prepended by the given option prefix,
	 * are used for retrieving resources from the given bundle:
	 * <ul>
	 *   <li><code>"label"</code> - <code>setText</code></li>
	 *   <li><code>"tooltip"</code> - <code>setToolTipText</code></li>
	 *   <li><code>"image"</code> - <code>setImageDescriptor</code></li>
	 *   <li><code>"description"</code> - <code>setDescription</code></li>
	 * </ul>
	 * </p>
	 *
	 * @param bundle the resource bundle
	 * @param prefix a prefix to be prepended to the various resource keys, or 
	 *   <code>null</code> if none
	 */
	public ResourceAction(ResourceBundle bundle, String prefix) {
		super();
		initialize(bundle, prefix);
	}
	
	/**
	 * Sets the action's help context id.
	 * 
	 * @param contextId the help context id
	 */
	public final void setHelpContextId(String contextId) {
		WorkbenchHelp.setHelp(this, contextId);
	}	

	/**
	 * Initializes this action using the given bundle and prefix.
	 * 
	 * @param bundle the resource bundle
	 * @param prefix a prefix to be prepended to the various resource keys, or <code>null</code> if none
	 * @since 2.1
	 */
	private void initialize(ResourceBundle bundle, String prefix) {
		String labelKey= "label"; //$NON-NLS-1$
		String tooltipKey= "tooltip"; //$NON-NLS-1$
		String imageKey= "image"; //$NON-NLS-1$
		String descriptionKey= "description"; //$NON-NLS-1$
		
		if (prefix != null && prefix.length() > 0) {
			labelKey= prefix + labelKey;
			tooltipKey= prefix + tooltipKey;
			imageKey= prefix + imageKey;
			descriptionKey= prefix + descriptionKey;
		}
		
		setText(getString(bundle, labelKey, labelKey));
		setToolTipText(getString(bundle, tooltipKey, null));
		setDescription(getString(bundle, descriptionKey, null));
		
		String file= getString(bundle, imageKey, null);
		if (file != null && file.trim().length() > 0)
			setImageDescriptor(ImageDescriptor.createFromFile(getClass(), file));
	}
}
