/*
* Copyright (c) 2016 Fraunhofer IGD
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Fraunhofer IGD <http://www.igd.fraunhofer.de/>
*/
package de.fhg.igd.swingrcp;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.widgets.Display;
/**
* SWT ActionAdapter for Swing Actions
*
* @author Simon Templer
*/
public class ActionAdapter extends Action implements PropertyChangeListener {
private static final Log log = LogFactory.getLog(ActionAdapter.class);
private final javax.swing.Action action;
/**
* The display
*/
protected final Display display;
/**
* Creates an ActionAdapter
*
* @param action the internal swing action
*/
public ActionAdapter(final javax.swing.Action action) {
this(action, Action.AS_PUSH_BUTTON);
}
/**
* Creates an ActionAdapter
*
* @param action the internal swing action
* @param style the action style
*/
public ActionAdapter(final javax.swing.Action action, int style) {
super(null, style);
if (action == null)
throw new IllegalArgumentException();
this.action = action;
this.display = Display.getCurrent();
if (this.display == null)
throw new IllegalArgumentException("ActionAdapter has to be created in display thread");
action.addPropertyChangeListener(this);
loadImage();
}
/**
* Set the actions icon as {@link ImageDescriptor} if possible
*/
private void loadImage() {
Object icon = action.getValue(javax.swing.Action.SMALL_ICON);
if (icon instanceof ImageIcon) {
try {
setImageDescriptor(ImageDescriptor
.createFromImageData(SwingRCPUtilities.convertToSWT((ImageIcon) icon)));
} catch (Exception e) {
log.warn("Error converting action icon", e);
}
}
}
/**
* @see Action#getDescription()
*/
@Override
public String getDescription() {
return (String) action.getValue(javax.swing.Action.LONG_DESCRIPTION);
}
/**
* @see Action#getText()
*/
@Override
public String getText() {
Object text = action.getValue(javax.swing.Action.NAME);
if (text == null)
return null;
else
return text.toString();
}
/**
* @see Action#getToolTipText()
*/
@Override
public String getToolTipText() {
return (String) action.getValue(javax.swing.Action.SHORT_DESCRIPTION);
}
/**
* @see Action#isEnabled()
*/
@Override
public boolean isEnabled() {
return action.isEnabled();
}
/**
* @see Action#setEnabled(boolean)
*/
@Override
public void setEnabled(final boolean enabled) {
final boolean old = isEnabled();
action.setEnabled(enabled);
display.asyncExec(new Runnable() {
@Override
public void run() {
firePropertyChange("enabled", old, enabled);
}
});
}
/**
* @see Action#setText(java.lang.String)
*/
@Override
public void setText(final String text) {
if (action != null) {
final String old = getText();
action.putValue(javax.swing.Action.NAME, text);
display.asyncExec(new Runnable() {
@Override
public void run() {
firePropertyChange("text", old, text);
}
});
}
}
/**
* @see Action#setToolTipText(java.lang.String)
*/
@Override
public void setToolTipText(final String toolTipText) {
final String old = getToolTipText();
action.putValue(javax.swing.Action.SHORT_DESCRIPTION, toolTipText);
display.asyncExec(new Runnable() {
@Override
public void run() {
firePropertyChange(Action.TOOL_TIP_TEXT, old, toolTipText);
}
});
}
/**
* @see Action#run()
*/
@Override
public void run() {
// execute action
SwingUtilities.invokeLater(new Runnable() {
/**
* @see Runnable#run()
*/
@Override
public void run() {
action.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null));
}
});
}
/**
* @see PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
@Override
public void propertyChange(final PropertyChangeEvent evt) {
// propagate property change event
// -> enabled
if (evt.getPropertyName().equals("enabled"))
display.asyncExec(new Runnable() {
@Override
public void run() {
firePropertyChange(Action.ENABLED, evt.getOldValue(), evt.getNewValue());
}
});
}
}