package org.freehep.util.commanddispatcher;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.AbstractButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JToggleButton;
/**
* A class which implements CommandSource and can be
* used to associate any AbstractButton with a command
*
* @author Tony Johnson (tonyj@slac.stanford.edu)
* @version $Id:
*/
public class CommandSourceAdapter implements CommandSource, ActionListener, BooleanCommandState, Observer
{
private AbstractButton m_button;
private CommandTarget m_target;
private boolean m_bool;
public CommandSourceAdapter(AbstractButton button)
{
m_button = button;
m_button.addActionListener(this);
m_button.setEnabled(false);
m_bool = m_button instanceof JCheckBoxMenuItem || m_button instanceof JRadioButtonMenuItem || m_button instanceof JToggleButton;
}
public String getCommand()
{
return m_button.getActionCommand();
}
public void setEnabled(boolean state)
{
m_button.setEnabled(state);
}
public void setSelected(boolean selected)
{
m_button.setSelected(selected);
}
public boolean setTarget(CommandTarget target)
{
if (m_bool && target instanceof SimpleCommandTarget)
{
return false;
}
if (!m_bool && target instanceof BooleanCommandTarget)
{
return false;
}
m_target = target;
m_target.enable(this);
return true;
}
public CommandTarget getTarget()
{
return m_target;
}
public void setText(String text)
{
// NOTE: we only set the text if it was set before, just to make sure
// we do not set text on buttons that appear in a JToolBar
if (!m_button.getText().equals(""))
m_button.setText(text);
}
public void setToolTipText(String text)
{
m_button.setToolTipText(text);
}
public void actionPerformed(ActionEvent evt)
{
if (m_bool)
((BooleanCommandTarget) m_target).invoke(m_button.isSelected());
else
((SimpleCommandTarget) m_target).invoke();
}
public void clearTarget()
{
m_target = null;
setEnabled(false);
}
public void update(Observable o, Object arg)
{
m_target.enable(this);
}
}