1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
|
/*
* PopupToolBoxButton.java
*
* Created on 15 February 2003, 20:27
*/
package org.tigris.toolbar.toolbutton;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Action;
import javax.swing.ButtonModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPopupMenu;
import javax.swing.UIManager;
import javax.swing.event.MouseInputAdapter;
import org.tigris.toolbar.ToolBarManager;
/**
* An extension of JButton to which alternative actions can be added.
* The button to trigger these actions become available when a
* dropdown icon is pressed on this button.
*
* @author Bob Tarling
*/
public class PopupToolBoxButton extends ToolButton {
private static final long serialVersionUID = -684520584458885655L;
private PopupToolBox _popupToolBox;
private Icon _standardIcon;
private String tooltip;
private boolean _showSplitter;
/**
* Creates a new instance of PopupToolboxButton
* @param a The default action when pressing this button
* @param rows The number of rows of buttons to display in the popup toolbox
* @param cols The number of columns of buttons to display in the popup toolbox
*/
public PopupToolBoxButton(Action a, int rows, int cols, boolean rollover) {
super(a);
setAction(a);
_popupToolBox = new PopupToolBox(rows, cols, rollover);
MyMouseListener myMouseListener = new MyMouseListener();
addMouseMotionListener(myMouseListener);
addMouseListener(myMouseListener);
}
/**
* Provide a new default action for this button
* @param a The new default action
*/
public void setAction(Action a) {
// Create an invisible button to contain the new action.
// We can use this button to find out various info for the
// current plaf (eg preferred button size) so we can emulate
// whatever plaf the user is set to.
_button = new JButton(a);
Icon realIcon = _button.getIcon();
if (a instanceof AbstractButtonAction) {
realIcon = ((AbstractButtonAction)a).getIcon();
}
tooltip = _button.getToolTipText();
if (tooltip == null || tooltip.trim().length() == 0) {
tooltip = _button.getText();
}
_button.setText(null);
_standardIcon = new DropDownIcon((ImageIcon)realIcon);
// Remove any knowledge of the action to perform from the ancestor
// we take control of performing the action and displaying the icon.
super.setAction(new ToolButtonAction());
setIcon(_standardIcon);
setText(null);
setToolTipText(tooltip);
}
private void popup() {
final JPopupMenu popup = new JPopupMenu();
MouseAdapter m = (new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
Component c = e.getComponent();
if (c instanceof ModalButton) {
Action a = ((ModalButton)c).getRealAction();
setAction(a);
a.putValue("popped", Boolean.valueOf(true));
setSelected(true);
ButtonModel bm = getModel();
bm.setRollover(true);
if (!ToolBarManager.alwaysUseStandardRollover()) {
setBorderPainted(true);
}
bm.setArmed(true);
}
popup.setVisible(false);
}
});
_popupToolBox.setButtonMouseListener(m);
_popupToolBox.rebuild();
popup.add(_popupToolBox);
popup.show(this, 0, getHeight());
}
/** Add a new action to appear as a button on the
* popup toolbox
* @param a The action to be added
* @return The button generated to trigger the action
*/
public JButton add(Action a) {
if (a.getValue("isDefault") instanceof Boolean) {
if(((Boolean)a.getValue("isDefault")).booleanValue()) {
setAction(a);
}
}
return _popupToolBox.add(a);
}
private int getSplitterPosn() {
return getIconPosn() + _button.getIcon().getIconWidth() + 3;
}
/**
* Get the xy position of the icon.
* TODO
* For the moment this assumes that the button has the icon centered.
*/
private int getIconPosn() {
int x = (this.getWidth() - _standardIcon.getIconWidth()) / 2;
return x;
}
public void paint(Graphics g) {
super.paint(g);
Color[] colors = {
getBackground(),
UIManager.getColor("controlDkShadow"),
UIManager.getColor("controlText"),
UIManager.getColor("controlHighlight")
};
if (_showSplitter) {
showSplitter(colors[1], g, getSplitterPosn(), 1, getHeight()-4);
showSplitter(colors[3], g, getSplitterPosn() + 1, 1, getHeight()-4);
}
}
public void showSplitter(Color c, Graphics g, int x, int y, int height) {
g.setColor(c);
g.drawLine(x, y + 0, x, y + height);
}
public void showSplitter(boolean show) {
if (show && !_showSplitter) {
_showSplitter = true;
repaint();
String tt = null;
Container parent = getParent();
if (parent instanceof JComponent) {
/* This allows i18n of this tooltip: */
tt = (String) ((JComponent) parent).getClientProperty(
"ToolBar.toolTipSelectTool");
}
if (tt == null) {
tt = "Select Tool";
}
setToolTipText(tt);
} else if (!show && _showSplitter) {
_showSplitter = false;
repaint();
setToolTipText(tooltip);
}
}
protected void performAction(java.awt.event.ActionEvent actionEvent) {
if (_showSplitter) {
popup();
} else {
super.performAction(actionEvent);
}
}
private class MyMouseListener extends MouseInputAdapter {
/**
* If the mouse movement occurs within the PopupToolBoxButton.
* If the mouse moves in and out of the area of the button that has the dropdown
* then change the icon.
*/
public void mouseMoved(MouseEvent me) {
showSplitter(me.getX() >= getSplitterPosn());
}
/**
* Empty method to satisy interface only, there is no special
* action to take place when the mouse first enters the
* PopupToolBoxButton area
*/
public void mouseEntered(MouseEvent me) {
showSplitter(me.getX() >= getSplitterPosn());
}
/**
* Be double sure the dropdowns rollover divider is removed when we leave the
* button.
*/
public void mouseExited(MouseEvent me) {
showSplitter(false);
}
}
}
|