/*******************************************************************************
 * 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.ui.actions;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.LegacyActionTools;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.PropertyChangeEvent;

/**
 * A <code>LabelRetargetAction</code> extends the behavior of
 * RetargetAction.  It will track the enable state, label, and 
 * tool tip text of the target action..
 * <p>
 * This class may be instantiated. It is not intented to be subclassed.
 * </p>
 *
 * @since 1.0 
 * @noextend This class is not intended to be subclassed by clients.
 */
public class LabelRetargetAction extends RetargetAction {
    private String defaultText;

    private String defaultToolTipText;

    private ImageDescriptor defaultHoverImage;

    private ImageDescriptor defaultImage;

    private ImageDescriptor defaultDisabledImage;

    private String acceleratorText;

    /**
     * Constructs a LabelRetargetAction with the given action id and text.
     * 
     * @param actionID the retargetable action id
     * @param text the action's text, or <code>null</code> if there is no text
     */
    public LabelRetargetAction(String actionID, String text) {
        this(actionID, text, IAction.AS_UNSPECIFIED);
    }

    /**
     * Constructs a RetargetAction with the given action id, text and style.
     * 
     * @param actionID the retargetable action id
     * @param text the action's text, or <code>null</code> if there is no text
     * @param style one of <code>AS_PUSH_BUTTON</code>, <code>AS_CHECK_BOX</code>,
     * 		<code>AS_DROP_DOWN_MENU</code>, <code>AS_RADIO_BUTTON</code>, and
     * 		<code>AS_UNSPECIFIED</code>.
     * @since 3.0
     */
    public LabelRetargetAction(String actionID, String text, int style) {
        super(actionID, text, style);
        this.defaultText = text;
        this.defaultToolTipText = text;
        acceleratorText = LegacyActionTools.extractAcceleratorText(text);
    }

    /**
     * The action handler has changed.  Update self.
     */
    protected void propagateChange(PropertyChangeEvent event) {
        super.propagateChange(event);
        String prop = event.getProperty();
        if (prop.equals(IAction.TEXT)) {
            String str = (String) event.getNewValue();
            super.setText(appendAccelerator(str));
        } else if (prop.equals(IAction.TOOL_TIP_TEXT)) {
            String str = (String) event.getNewValue();
            super.setToolTipText(str);
        } else if (prop.equals(IAction.IMAGE)) {
            updateImages(getActionHandler());
        }
    }

    /**
     * Sets the action handler.  Update self.
     */
    protected void setActionHandler(IAction handler) {
        // Run the default behavior.
        super.setActionHandler(handler);

        // Now update the label, tooltip and images.
        if (handler == null) {
            super.setText(defaultText);
            super.setToolTipText(defaultToolTipText);
        } else {
            // If no text is specified by the handler, use the default text.  Fixes 22529.
            String handlerText = handler.getText();
            if (handlerText == null || handlerText.length() == 0) {
                handlerText = defaultText;
            }
            super.setText(appendAccelerator(handlerText));
            super.setToolTipText(handler.getToolTipText());
        }
        updateImages(handler);
    }

    /* (non-Javadoc)
     * Method declared on IAction.
     */
    public void setDisabledImageDescriptor(ImageDescriptor image) {
        super.setDisabledImageDescriptor(image);
        defaultDisabledImage = image;
    }

    /* (non-Javadoc)
     * Method declared on IAction.
     */
    public void setHoverImageDescriptor(ImageDescriptor image) {
        super.setHoverImageDescriptor(image);
        defaultHoverImage = image;
    }

    /* (non-Javadoc)
     * Method declared on IAction.
     */
    public void setImageDescriptor(ImageDescriptor image) {
        super.setImageDescriptor(image);
        defaultImage = image;
    }

    /**
     * Sets the action's label text to the given value.
     */
    public void setText(String text) {
        super.setText(text);
        acceleratorText = LegacyActionTools.extractAcceleratorText(text);
        defaultText = text;
    }

    /**
     * Sets the tooltip text to the given text.
     * The value <code>null</code> clears the tooltip text.
     */
    public void setToolTipText(String text) {
        super.setToolTipText(text);
        defaultToolTipText = text;
    }

    /**
     * Ensures the accelerator is correct in the text (handlers are not
     * allowed to change the accelerator).
     */
    private String appendAccelerator(String newText) {
        if (newText == null) {
			return null;
		}

        // Remove any accelerator
        String str = removeAcceleratorText(newText);
        // Append our accelerator
        if (acceleratorText != null) {
			str = str + acceleratorText;
		}
        return str;
    }

    /**
     * Updates the images for this action based on the given handler.
     */
    private void updateImages(IAction handler) {
        if (handler == null) {
            super.setHoverImageDescriptor(defaultHoverImage);
            super.setImageDescriptor(defaultImage);
            super.setDisabledImageDescriptor(defaultDisabledImage);
        } else {
            // use the default images if the handler has no images set
            ImageDescriptor hoverImage = handler.getHoverImageDescriptor();
            ImageDescriptor image = handler.getImageDescriptor();
            ImageDescriptor disabledImage = handler
                    .getDisabledImageDescriptor();
            if (hoverImage != null || image != null || disabledImage != null) {
                super.setHoverImageDescriptor(hoverImage);
                super.setImageDescriptor(image);
                super.setDisabledImageDescriptor(disabledImage);
            } else {
                super.setHoverImageDescriptor(defaultHoverImage);
                super.setImageDescriptor(defaultImage);
                super.setDisabledImageDescriptor(defaultDisabledImage);
            }
        }
    }

}
