com.alee.managers.style.skin.web.WebScrollBarButtonPainter Maven / Gradle / Ivy
/*
* This file is part of WebLookAndFeel library.
*
* WebLookAndFeel library is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* WebLookAndFeel library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with WebLookAndFeel library. If not, see .
*/
package com.alee.managers.style.skin.web;
import com.alee.extended.painter.AbstractPainter;
import com.alee.laf.button.WebButtonUI;
import com.alee.laf.scroll.ScrollBarButtonPainter;
import com.alee.laf.scroll.ScrollBarButtonType;
import com.alee.laf.scroll.WebScrollBarStyle;
import com.alee.utils.ShapeCache;
import com.alee.utils.swing.DataProvider;
import javax.swing.*;
import javax.swing.plaf.ButtonUI;
import java.awt.*;
import java.awt.geom.GeneralPath;
/**
* Base painter for JScrollBar arrow buttons.
*
* @author Mikle Garin
*/
public class WebScrollBarButtonPainter extends AbstractPainter implements ScrollBarButtonPainter
{
/**
* todo 1. On rollover=false make the same animation scroll bar thumb has -> requires WebButtonUI full painter support
*/
/**
* Shape cache key.
*/
protected static final String ARROW_BUTTON_SHAPE = "arrow-button";
/**
* Style settings.
*/
protected Color borderColor = WebScrollBarStyle.thumbBorderColor;
protected Color backgroundColor = WebScrollBarStyle.thumbBackgroundColor;
protected Color disabledBorderColor = WebScrollBarStyle.thumbDisabledBorderColor;
protected Color disabledBackgroundColor = WebScrollBarStyle.thumbDisabledBackgroundColor;
protected Color rolloverBorderColor = WebScrollBarStyle.thumbRolloverBorderColor;
protected Color rolloverBackgroundColor = WebScrollBarStyle.thumbRolloverBackgroundColor;
protected Color pressedBorderColor = WebScrollBarStyle.thumbPressedBorderColor;
protected Color pressedBackgroundColor = WebScrollBarStyle.thumbPressedBackgroundColor;
/**
* Runtime variables.
*/
protected ScrollBarButtonType buttonType;
protected JScrollBar scrollbar;
/**
* Constructs new scroll bar button painter.
*/
public WebScrollBarButtonPainter ()
{
super ();
setPreferredSize ( new Dimension ( WebScrollBarStyle.buttonsSize ) );
}
/**
* Returns button border color.
*
* @return button border color
*/
public Color getBorderColor ()
{
return borderColor;
}
/**
* Sets button border color.
*
* @param color new button border color
*/
public void setBorderColor ( final Color color )
{
if ( this.borderColor != color )
{
this.borderColor = color;
repaint ();
}
}
/**
* Returns button background color.
*
* @return button background color
*/
public Color getBackgroundColor ()
{
return backgroundColor;
}
/**
* Sets button background color.
*
* @param color new button background color
*/
public void setBackgroundColor ( final Color color )
{
if ( this.backgroundColor != color )
{
this.backgroundColor = color;
repaint ();
}
}
/**
* Returns disabled button border color.
*
* @return disabled button border color
*/
public Color getDisabledBorderColor ()
{
return disabledBorderColor;
}
/**
* Sets disabled button border color.
*
* @param color new disabled button border color
*/
public void setDisabledBorderColor ( final Color color )
{
if ( this.disabledBorderColor != color )
{
this.disabledBorderColor = color;
repaint ();
}
}
/**
* Returns disabled button background color.
*
* @return disabled button background color
*/
public Color getDisabledBackgroundColor ()
{
return disabledBackgroundColor;
}
/**
* Sets disabled button background color.
*
* @param color new disabled button background color
*/
public void setDisabledBackgroundColor ( final Color color )
{
if ( this.disabledBackgroundColor != color )
{
this.disabledBackgroundColor = color;
repaint ();
}
}
/**
* Returns rollover button border color.
*
* @return rollover button border color
*/
public Color getRolloverBorderColor ()
{
return rolloverBorderColor;
}
/**
* Sets rollover button border color.
*
* @param color new rollover button border color
*/
public void setRolloverBorderColor ( final Color color )
{
if ( this.rolloverBorderColor != color )
{
this.rolloverBorderColor = color;
repaint ();
}
}
/**
* Returns rollover button background color.
*
* @return rollover button background color
*/
public Color getRolloverBackgroundColor ()
{
return rolloverBackgroundColor;
}
/**
* Sets rollover button background color.
*
* @param color new rollover button background color
*/
public void setRolloverBackgroundColor ( final Color color )
{
if ( this.rolloverBackgroundColor != color )
{
this.rolloverBackgroundColor = color;
repaint ();
}
}
/**
* Returns pressed button border color.
*
* @return pressed button border color
*/
public Color getPressedBorderColor ()
{
return pressedBorderColor;
}
/**
* Sets pressed button border color.
*
* @param color new pressed button border color
*/
public void setPressedBorderColor ( final Color color )
{
if ( this.pressedBorderColor != color )
{
this.pressedBorderColor = color;
repaint ();
}
}
/**
* Returns pressed button background color.
*
* @return pressed button background color
*/
public Color getPressedBackgroundColor ()
{
return pressedBackgroundColor;
}
/**
* Sets pressed button background color.
*
* @param color new pressed button background color
*/
public void setPressedBackgroundColor ( final Color color )
{
if ( this.pressedBackgroundColor != color )
{
this.pressedBackgroundColor = color;
repaint ();
}
}
/**
* Sets scroll bar button type.
*
* @param type scroll bar button type
*/
@Override
public void setButtonType ( final ScrollBarButtonType type )
{
this.buttonType = type;
}
/**
* Sets scroll bar which uses this button.
*
* @param scrollbar scroll bar which uses this button
*/
@Override
public void setScrollbar ( final JScrollBar scrollbar )
{
this.scrollbar = scrollbar;
}
/**
* {@inheritDoc}
*/
@Override
public Insets getMargin ( final E button )
{
final boolean ver = scrollbar.getOrientation () == SwingConstants.VERTICAL;
final boolean decr = buttonType == ScrollBarButtonType.decrease;
if ( ver )
{
return new Insets ( decr ? 1 : 0, 1, decr ? 0 : 1, 1 );
}
else
{
return new Insets ( 1, decr ? 1 : 0, 1, decr ? 0 : 1 );
}
}
/**
* {@inheritDoc}
*/
@Override
public void paint ( final Graphics2D g2d, final Rectangle bounds, final E button )
{
// Button model state
final ButtonModel model = button.getModel ();
final ButtonUI ui = button.getUI ();
final boolean enabled = button.isEnabled ();
final boolean pressed = model.isPressed () || model.isSelected ();
final boolean rollover = ui instanceof WebButtonUI ? ( ( WebButtonUI ) ui ).isRollover () : model.isRollover ();
// Retrieving button shape
final Shape shape = getArrowButtonShape ( bounds, button );
// Painting button
g2d.setPaint ( enabled ? ( pressed ? pressedBackgroundColor : ( rollover ? rolloverBackgroundColor : backgroundColor ) ) :
disabledBackgroundColor );
g2d.fill ( shape );
g2d.setPaint (
enabled ? ( pressed ? pressedBorderColor : ( rollover ? rolloverBorderColor : borderColor ) ) : disabledBorderColor );
g2d.draw ( shape );
}
/**
* Returns popup border shape.
*
* @param bounds button bounds
* @param button button component
* @return popup border shape
*/
protected Shape getArrowButtonShape ( final Rectangle bounds, final E button )
{
return ShapeCache.getShape ( button, ARROW_BUTTON_SHAPE, new DataProvider ()
{
@Override
public Shape provide ()
{
return createArrowButtonShape ( bounds, button );
}
}, getCachedShapeSettings ( button ) );
}
/**
* Returns an array of shape settings cached along with the shape.
*
* @param button button component
* @return an array of shape settings cached along with the shape
*/
protected Object[] getCachedShapeSettings ( final E button )
{
return new Object[]{ button.getSize (), button.getInsets (), buttonType, button.getComponentOrientation ().isLeftToRight (),
scrollbar.getOrientation () };
}
/**
* Returns arrow button shape.
*
* @param bounds button bounds
* @param button button component
* @return arrow button shape
*/
protected Shape createArrowButtonShape ( final Rectangle bounds, final E button )
{
final int orientation = scrollbar.getOrientation ();
final Insets i = button.getInsets ();
final int x = bounds.x + i.left;
final int y = bounds.y + i.top;
final int w = bounds.width - i.left - i.right - 1;
final int h = bounds.height - i.top - i.bottom - 1;
final GeneralPath shape;
if ( orientation == SwingConstants.VERTICAL )
{
if ( buttonType == ScrollBarButtonType.decrease )
{
shape = new GeneralPath ( GeneralPath.WIND_EVEN_ODD );
shape.moveTo ( x, y + h );
shape.quadTo ( x + w / 2f, y + h * 2 / 3f, x + w, y + h );
shape.lineTo ( x + w / 2f, y );
shape.closePath ();
}
else
{
shape = new GeneralPath ( GeneralPath.WIND_EVEN_ODD );
shape.moveTo ( x, y );
shape.quadTo ( x + w / 2f, y + h / 3f, x + w, y );
shape.lineTo ( x + w / 2f, y + h );
shape.closePath ();
}
}
else
{
final boolean ltr = scrollbar.getComponentOrientation ().isLeftToRight ();
if ( ltr ? buttonType == ScrollBarButtonType.decrease : buttonType == ScrollBarButtonType.increase )
{
shape = new GeneralPath ( GeneralPath.WIND_EVEN_ODD );
shape.moveTo ( x + w, y );
shape.quadTo ( x + w * 2 / 3f, y + h / 2f, x + w, y + h );
shape.lineTo ( x, y + h / 2f );
shape.closePath ();
}
else
{
shape = new GeneralPath ( GeneralPath.WIND_EVEN_ODD );
shape.moveTo ( x, y );
shape.quadTo ( x + w / 3f, y + h / 2f, x, y + h );
shape.lineTo ( x + w, y + h / 2f );
shape.closePath ();
}
}
return shape;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy