/*
* This file has been adapted to Jajuk by the Jajuk Team.
*
* Found at http://www.jroller.com/santhosh/date/20050528
* Original copyright information follows:
*
* Copyright santhosh kumar
*
* @author santhosh kumar - santhosh@in.fiorano.com Drop down button
*/
package ext;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPopupMenu;
import javax.swing.JToolBar;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import org.jajuk.ui.widgets.JajukButton;
import org.jajuk.ui.widgets.JajukJToolbar;
import org.jajuk.util.Const;
import org.jajuk.util.IconLoader;
import org.jajuk.util.JajukIcons;
/**
* .
*/
public abstract class DropDownButton extends JajukButton implements ChangeListener,
PopupMenuListener, ActionListener, PropertyChangeListener, Const {
/** Generated serialVersionUID. */
private static final long serialVersionUID = 9126200472940409277L;
private final JButton arrowButton;
private boolean popupVisible = false;
/**
* Instantiates a new drop down button.
*
* @param icon
*/
public DropDownButton(ImageIcon icon) {
super(icon);
if (icon.getIconWidth() < 20) {
arrowButton = new JajukButton(IconLoader.getIcon(JajukIcons.DROP_DOWN_16X16));
} else {
arrowButton = new JajukButton(IconLoader.getIcon(JajukIcons.DROP_DOWN_32X32));
}
getModel().addChangeListener(this);
arrowButton.getModel().addChangeListener(this);
arrowButton.addActionListener(this);
arrowButton.setBorder(null);
arrowButton.setMargin(new Insets(1, 0, 1, 0));
addPropertyChangeListener("enabled", this); // NOI18N
}
/*------------------------------[ PropertyChangeListener ]---------------------------------------------------*/
/* (non-Javadoc)
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
arrowButton.setEnabled(isEnabled());
}
/*------------------------------[ ChangeListener ]---------------------------------------------------*/
/* (non-Javadoc)
* @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
*/
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource() == getModel()) {
if (popupVisible && !getModel().isRollover()) {
getModel().setRollover(true);
return;
}
arrowButton.getModel().setRollover(getModel().isRollover());
arrowButton.setSelected(getModel().isArmed() && getModel().isPressed());
} else {
if (popupVisible && !arrowButton.getModel().isSelected()) {
arrowButton.getModel().setSelected(true);
return;
}
getModel().setRollover(arrowButton.getModel().isRollover());
}
}
/*------------------------------[ ActionListener ]---------------------------------------------------*/
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent ae) {
JPopupMenu popup = getPopupMenu();
popup.addPopupMenuListener(this);
popup.show(this, 0, getHeight());
}
/*------------------------------[ PopupMenuListener ]---------------------------------------------------*/
/* (non-Javadoc)
* @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent)
*/
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
popupVisible = true;
getModel().setRollover(true);
arrowButton.getModel().setSelected(true);
}
/* (non-Javadoc)
* @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent)
*/
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
popupVisible = false;
getModel().setRollover(false);
arrowButton.getModel().setSelected(false);
((JPopupMenu) e.getSource()).removePopupMenuListener(this);
// act as good programmer :)
}
/* (non-Javadoc)
* @see javax.swing.event.PopupMenuListener#popupMenuCanceled(javax.swing.event.PopupMenuEvent)
*/
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
popupVisible = false;
}
/*------------------------------[ Other Methods ]---------------------------------------------------*/
/**
* Gets the popup menu.
*
* @return the popup menu
*/
protected abstract JPopupMenu getPopupMenu();
/**
* Adds the to tool bar.
*
*
* @param toolbar
*
* @return the j button
*/
public JButton addToToolBar(JToolBar toolbar) {
JToolBar tempBar = new JajukJToolbar();
tempBar.setAlignmentX(0.5f);
tempBar.add(this);
tempBar.add(arrowButton);
toolbar.add(tempBar);
return this;
}
}