package jonkoshare.gui;
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;
/**
* Taken from <a href="http://www.jroller.com/santhosh/date/20050528">
* Kumar's Weblog</a>.
*
* @author Santhosh Kumar santhosh@in.fiorano.com
*
*/
public abstract class DropDownButton extends JButton implements ChangeListener,
PopupMenuListener, ActionListener, PropertyChangeListener {
private final JButton mainButton = this;
private final JButton arrowButton = new JButton(new ImageIcon(getClass()
.getResource("/jtrackbase/gui/dropdown.png")));
private boolean popupVisible = false;
public DropDownButton() {
mainButton.getModel().addChangeListener(this);
arrowButton.getModel().addChangeListener(this);
arrowButton.addActionListener(this);
arrowButton.setMargin(new Insets(3, 0, 3, 0));
mainButton.addPropertyChangeListener("enabled", this); // NOI18N
}
/*------------------------------[ PropertyChangeListener ]---------------------------------------------------*/
public void propertyChange(PropertyChangeEvent evt) {
arrowButton.setEnabled(mainButton.isEnabled());
}
/*------------------------------[ ChangeListener ]---------------------------------------------------*/
public void stateChanged(ChangeEvent e) {
if (e.getSource() == mainButton.getModel()) {
if (popupVisible && !mainButton.getModel().isRollover()) {
mainButton.getModel().setRollover(true);
return;
}
arrowButton.getModel().setRollover(
mainButton.getModel().isRollover());
arrowButton.setSelected(mainButton.getModel().isArmed()
&& mainButton.getModel().isPressed());
} else {
if (popupVisible && !arrowButton.getModel().isSelected()) {
arrowButton.getModel().setSelected(true);
return;
}
mainButton.getModel().setRollover(
arrowButton.getModel().isRollover());
}
}
/*------------------------------[ ActionListener ]---------------------------------------------------*/
public void actionPerformed(ActionEvent ae) {
JPopupMenu popup = getPopupMenu();
popup.addPopupMenuListener(this);
popup.show(mainButton, 0, mainButton.getHeight());
}
/*------------------------------[ PopupMenuListener ]---------------------------------------------------*/
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
popupVisible = true;
mainButton.getModel().setRollover(true);
arrowButton.getModel().setSelected(true);
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
popupVisible = false;
mainButton.getModel().setRollover(false);
arrowButton.getModel().setSelected(false);
((JPopupMenu) e.getSource()).removePopupMenuListener(this); // act as
// good
// programmer
// :)
}
public void popupMenuCanceled(PopupMenuEvent e) {
popupVisible = false;
}
/*------------------------------[ Other Methods ]---------------------------------------------------*/
protected abstract JPopupMenu getPopupMenu();
public JButton addToToolBar(JToolBar toolbar) {
toolbar.add(mainButton);
toolbar.add(arrowButton);
return mainButton;
}
protected JButton getMainButton() {
return mainButton;
}
}