@@ -4629,14 +4629,22 @@ public static OptionsButton ColorTableButton(final float scalingFactor,
46294629 }
46304630
46314631 public static OptionsButton OptionsButton (final IconFactory .GLYPH glyph , final float scalingFactor , final JPopupMenu menu ) {
4632- return new OptionsButton (glyph , scalingFactor , menu );
4632+ return OptionsButton (glyph , scalingFactor , menu , true );
4633+ }
4634+
4635+ public static OptionsButton OptionsButton (final IconFactory .GLYPH glyph , final float scalingFactor , final JPopupMenu menu ,
4636+ final boolean dropdownIndicator ) {
4637+ return new OptionsButton (glyph , scalingFactor , menu , dropdownIndicator );
46334638 }
46344639
46354640 public static class OptionsButton extends JButton {
46364641 public final JPopupMenu popupMenu ;
46374642
4638- private OptionsButton (final IconFactory .GLYPH glyph , final float scalingFactor , final JPopupMenu popupMenu ) {
4639- super (IconFactory .dropdownMenuIcon (glyph , scalingFactor , IconFactory .defaultColor ()));
4643+ private OptionsButton (final IconFactory .GLYPH glyph , final float scalingFactor , final JPopupMenu popupMenu ,
4644+ final boolean dropdownIndicator ) {
4645+ super ( (dropdownIndicator )
4646+ ? IconFactory .dropdownMenuIcon (glyph , scalingFactor , IconFactory .defaultColor ())
4647+ : IconFactory .buttonIcon (glyph , scalingFactor ));
46404648 this .popupMenu = popupMenu ;
46414649 setDisabledIcon (IconFactory .dropdownMenuIcon (glyph , scalingFactor , GuiUtils .getDisabledComponentColor ()));
46424650 // Store a back-reference so callers can locate this button from the popup alone
@@ -4812,8 +4820,52 @@ else if (current instanceof Container) {
48124820 }
48134821 return null ;
48144822 }
4823+
4824+ public static class StackedButton extends JPanel {
4825+
4826+ public final JButton topButton ;
4827+ public final JButton bottomButton ;
4828+
4829+ public StackedButton (final GLYPH top , final GLYPH bottom ,
4830+ final ActionListener topActionListener ,
4831+ final ActionListener bottomActionListener ) {
4832+ super (new GridLayout (2 , 1 , 0 , 0 ));
4833+ setOpaque (false );
4834+ setBorder (new JButton ().getBorder ());
4835+ setFocusable (false );
4836+ topButton = makeHalfButton (top , topActionListener );
4837+ bottomButton = makeHalfButton (bottom , bottomActionListener );
4838+ add (topButton );
4839+ add (bottomButton );
4840+ }
4841+
4842+ private static JButton makeHalfButton (final GLYPH glyph , final ActionListener listener ) {
4843+ final JButton btn = new JButton ();
4844+ IconFactory .assignIcon (btn , glyph , IconFactory .defaultColor (), getDisabledComponentColor (), 1f );
4845+ if (listener != null ) btn .addActionListener (listener );
4846+ btn .setMargin (new Insets (0 , 0 , 0 , 0 ));
4847+ makeBorderless (btn );
4848+ btn .setFocusable (false );
4849+ return btn ;
4850+ }
4851+
4852+ @ Override
4853+ public void setToolTipText (final String text ) {
4854+ if (topButton != null ) topButton .setToolTipText (text );
4855+ if (bottomButton != null ) bottomButton .setToolTipText (text );
4856+ }
4857+
4858+ @ Override
4859+ public void setEnabled (final boolean enabled ) {
4860+ super .setEnabled (enabled );
4861+ if (topButton != null ) topButton .setEnabled (enabled );
4862+ if (bottomButton != null ) bottomButton .setEnabled (enabled );
4863+ }
4864+ }
4865+
48154866 }
48164867
4868+
48174869 public static class SplitPanes {
48184870
48194871 public static JSplitPane nonDraggableRightSplitPane () {
0 commit comments