blob: f2827c43d82105f4f9ff9a76f421990df4bfe95e [file] [log] [blame]
/*******************************************************************************
* 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 2.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);
}
}
}
}