/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* 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:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.util.swing;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ImageIcon;
import javax.swing.SwingUtilities;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.widgets.Display;
import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
/**
* This class provides a SWT Adapter for Swing Actions.
*
* @author Simon Templer, Thorsten Reitz
* @partner 01 / Fraunhofer Institute for Computer Graphics Research
*/
public class RcpActionAdapter extends Action implements PropertyChangeListener {
private static final ALogger _log = ALoggerFactory.getLogger(RcpActionAdapter.class);
private final javax.swing.Action action;
/**
* The display
*/
protected final Display display;
/**
* Creates an ActionAdapter
*
* @param action the Swing action to wrap
*/
public RcpActionAdapter(final javax.swing.Action action) {
this(action, Action.AS_PUSH_BUTTON);
}
/**
* Creates an ActionAdapter
*
* @param action the Swing action to wrap
* @param style the JFace action style
*
* @see Action#Action(String, int)
*/
public RcpActionAdapter(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"); //$NON-NLS-1$
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); //$NON-NLS-1$
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#getDescription()
*/
@Override
public String getDescription() {
return (String) action.getValue(javax.swing.Action.LONG_DESCRIPTION);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#getText()
*/
@Override
public String getText() {
Object text = action.getValue(javax.swing.Action.NAME);
if (text == null)
return null;
else
return text.toString();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#getToolTipText()
*/
@Override
public String getToolTipText() {
return (String) action.getValue(javax.swing.Action.SHORT_DESCRIPTION);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#isEnabled()
*/
@Override
public boolean isEnabled() {
return action.isEnabled();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.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); //$NON-NLS-1$
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.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); //$NON-NLS-1$
}
});
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.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);
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
// execute action
SwingUtilities.invokeLater(new Runnable() {
/*
* (non-Javadoc)
*
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
action.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null));
}
});
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.
* PropertyChangeEvent)
*/
@Override
public void propertyChange(final PropertyChangeEvent evt) {
// propagate property change event
// -> enabled
if (evt.getPropertyName().equals("enabled")) //$NON-NLS-1$
display.asyncExec(new Runnable() {
@Override
public void run() {
firePropertyChange(Action.ENABLED, evt.getOldValue(), evt.getNewValue());
}
});
}
}