FileDocCategorySizeDatePackage
WindowsButtonUI.javaAPI DocJava SE 6 API9618Tue Jun 10 00:21:58 BST 2008com.sun.java.swing.plaf.windows

WindowsButtonUI

public class WindowsButtonUI extends BasicButtonUI
Windows button.

Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. A future release of Swing will provide support for long term persistence.

version
1.45 09/11/06
author
Jeff Dinkins

Fields Summary
private static final WindowsButtonUI
windowsButtonUI
protected int
dashedRectGapX
protected int
dashedRectGapY
protected int
dashedRectGapWidth
protected int
dashedRectGapHeight
protected Color
focusColor
private boolean
defaults_initialized
private static Rectangle
viewRect
Constructors Summary
Methods Summary
public static javax.swing.plaf.ComponentUIcreateUI(javax.swing.JComponent c)

    

    // ********************************
    //          Create PLAF
    // ********************************
        
	return windowsButtonUI;
    
protected java.awt.ColorgetFocusColor()

	return focusColor;
    
private static java.awt.InsetsgetOpaqueInsets(javax.swing.border.Border b, java.awt.Component c)
returns - b.getBorderInsets(c) if border is opaque - null if border is completely non-opaque - somewhere inbetween if border is compound and outside border is opaque and inside isn't

	if (b == null) {
	    return null;
	}
	if (b.isBorderOpaque()) {
	    return b.getBorderInsets(c);
	} else if (b instanceof CompoundBorder) {
	    CompoundBorder cb = (CompoundBorder)b;
	    Insets iOut = getOpaqueInsets(cb.getOutsideBorder(), c);
	    if (iOut != null && iOut.equals(cb.getOutsideBorder().getBorderInsets(c))) {
		// Outside border is opaque, keep looking
		Insets iIn = getOpaqueInsets(cb.getInsideBorder(), c);
		if (iIn == null) {
		    // Inside is non-opaque, use outside insets
		    return iOut;
		} else {
		    // Found non-opaque somewhere in the inside (which is
		    // also compound).
		    return new Insets(iOut.top + iIn.top, iOut.left + iIn.left,
				      iOut.bottom + iIn.bottom, iOut.right + iIn.right);
		}
	    } else {
		// Outside is either all non-opaque or has non-opaque
		// border inside another compound border
		return iOut;
	    }
	} else {
	    return null;
	}
    
public java.awt.DimensiongetPreferredSize(javax.swing.JComponent c)

	Dimension d = super.getPreferredSize(c);
	
	/* Ensure that the width and height of the button is odd,
	 * to allow for the focus line if focus is painted
	 */
        AbstractButton b = (AbstractButton)c;
	if (d != null && b.isFocusPainted()) {
	    if(d.width % 2 == 0) { d.width += 1; }
	    if(d.height % 2 == 0) { d.height += 1; }
	}
	return d;
    
static StategetXPButtonState(javax.swing.AbstractButton b)

        Part part = getXPButtonType(b);
        ButtonModel model = b.getModel();
        State state = State.NORMAL;
        switch (part) {
        case BP_RADIOBUTTON:
            /* falls through */            
        case BP_CHECKBOX:
            if (! model.isEnabled()) {
                state = (model.isSelected()) ? State.CHECKEDDISABLED 
                    : State.UNCHECKEDDISABLED;
            } else if (model.isPressed() && model.isArmed()) {
                state = (model.isSelected()) ? State.CHECKEDPRESSED 
                    : State.UNCHECKEDPRESSED;
            } else if (model.isRollover()) {
                state = (model.isSelected()) ? State.CHECKEDHOT 
                    : State.UNCHECKEDHOT;
            } else {
                state = (model.isSelected()) ? State.CHECKEDNORMAL
                    : State.UNCHECKEDNORMAL;
            }
            break;
        case BP_PUSHBUTTON:
            /* falls through */            
        case TP_BUTTON:
            boolean toolbar = (b.getParent() instanceof JToolBar);
            if (toolbar) {
                if (model.isArmed() && model.isPressed()) {
                    state = State.PRESSED;
                } else if (!model.isEnabled()) {
                    state = State.DISABLED;
                } else if (model.isSelected() && model.isRollover()) {
                    state = State.HOTCHECKED;
                } else if (model.isSelected()) {
                    state = State.CHECKED;
                } else if (model.isRollover()) {
                    state = State.HOT;
                } else if (b.hasFocus()) {
                    state = State.HOT;
                }
            } else {
                if ((model.isArmed() && model.isPressed()) 
                      || model.isSelected()) {
                    state = State.PRESSED;
                } else if (!model.isEnabled()) {
                    state = State.DISABLED;
                } else if (model.isRollover() || model.isPressed()) {
                    state = State.HOT;
                } else if (b instanceof JButton 
                           && ((JButton)b).isDefaultButton()) {
                    state = State.DEFAULTED;
                } else if (b.hasFocus()) {
                    state = State.HOT;
                }
            }
            break;
        default : 
            state = State.NORMAL;
        }

        return state;
    
static PartgetXPButtonType(javax.swing.AbstractButton b)

        if(b instanceof JCheckBox) {
            return Part.BP_CHECKBOX;
        }
        if(b instanceof JRadioButton) {
            return Part.BP_RADIOBUTTON;
        }
        boolean toolbar = (b.getParent() instanceof JToolBar);
        return toolbar ? Part.TP_BUTTON : Part.BP_PUSHBUTTON;
    
protected voidinstallDefaults(javax.swing.AbstractButton b)

	super.installDefaults(b);
	if(!defaults_initialized) {
	    String pp = getPropertyPrefix();
	    dashedRectGapX = UIManager.getInt(pp + "dashedRectGapX");
	    dashedRectGapY = UIManager.getInt(pp + "dashedRectGapY");
	    dashedRectGapWidth = UIManager.getInt(pp + "dashedRectGapWidth");
	    dashedRectGapHeight = UIManager.getInt(pp + "dashedRectGapHeight");
	    focusColor = UIManager.getColor(pp + "focus");
	    defaults_initialized = true;
	}

	XPStyle xp = XPStyle.getXP();
	if (xp != null) {
            b.setBorder(xp.getBorder(b, getXPButtonType(b)));
            LookAndFeel.installProperty(b, "rolloverEnabled", Boolean.TRUE);
	}
    
public voidpaint(java.awt.Graphics g, javax.swing.JComponent c)


          
	if (XPStyle.getXP() != null) {
	    WindowsButtonUI.paintXPButtonBackground(g, c);
	}
	super.paint(g, c);
    
protected voidpaintButtonPressed(java.awt.Graphics g, javax.swing.AbstractButton b)

	setTextShiftOffset();
    
protected voidpaintFocus(java.awt.Graphics g, javax.swing.AbstractButton b, java.awt.Rectangle viewRect, java.awt.Rectangle textRect, java.awt.Rectangle iconRect)


	// focus painted same color as text on Basic??
	int width = b.getWidth();
	int height = b.getHeight();
	g.setColor(getFocusColor());
	BasicGraphicsUtils.drawDashedRect(g, dashedRectGapX, dashedRectGapY,
					  width - dashedRectGapWidth, height - dashedRectGapHeight);
    
protected voidpaintText(java.awt.Graphics g, javax.swing.AbstractButton b, java.awt.Rectangle textRect, java.lang.String text)
Overridden method to render the text without the mnemonic

	WindowsGraphicsUtils.paintText(g, b, textRect, text, getTextShiftOffset());
    
static voidpaintXPButtonBackground(java.awt.Graphics g, javax.swing.JComponent c)

	AbstractButton b = (AbstractButton)c;

	XPStyle xp = XPStyle.getXP();

        Part part = getXPButtonType(b);

	if (b.isContentAreaFilled() && xp != null) {

	    Skin skin = xp.getSkin(b, part);

            State state = getXPButtonState(b);
	    Dimension d = c.getSize();
	    int dx = 0;
	    int dy = 0;
	    int dw = d.width;
	    int dh = d.height;

	    Border border = c.getBorder();
	    Insets insets;
	    if (border != null) {
		// Note: The border may be compound, containing an outer
		// opaque border (supplied by the application), plus an
		// inner transparent margin border. We want to size the
		// background to fill the transparent part, but stay
		// inside the opaque part.
		insets = WindowsButtonUI.getOpaqueInsets(border, c);
	    } else {
		insets = c.getInsets();
	    }
	    if (insets != null) {
		dx += insets.left;
		dy += insets.top;
		dw -= (insets.left + insets.right);
		dh -= (insets.top + insets.bottom);
	    }
	    skin.paintSkin(g, dx, dy, dw, dh, state);
	}
    
protected voiduninstallDefaults(javax.swing.AbstractButton b)

	super.uninstallDefaults(b);
	defaults_initialized = false;