/* * @(#)WindowsToggleButtonUI.java 1.29 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.java.swing.plaf.windows; import javax.swing.plaf.basic.*; import javax.swing.border.*; import javax.swing.plaf.*; import javax.swing.*; import java.awt.*; /** * A Windows toggle 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.29 12/19/03 * @author Jeff Dinkins */ public class WindowsToggleButtonUI extends BasicToggleButtonUI { protected static int dashedRectGapX; protected static int dashedRectGapY; protected static int dashedRectGapWidth; protected static int dashedRectGapHeight; protected Color focusColor; private final static WindowsToggleButtonUI windowsToggleButtonUI = new WindowsToggleButtonUI(); private boolean defaults_initialized = false; public static ComponentUI createUI(JComponent b) { return windowsToggleButtonUI; } // ******************************** // Defaults // ******************************** protected void installDefaults(AbstractButton b) { super.installDefaults(b); if(!defaults_initialized) { String pp = getPropertyPrefix(); dashedRectGapX = ((Integer)UIManager.get("Button.dashedRectGapX")).intValue(); dashedRectGapY = ((Integer)UIManager.get("Button.dashedRectGapY")).intValue(); dashedRectGapWidth = ((Integer)UIManager.get("Button.dashedRectGapWidth")).intValue(); dashedRectGapHeight = ((Integer)UIManager.get("Button.dashedRectGapHeight")).intValue(); focusColor = UIManager.getColor(pp + "focus"); defaults_initialized = true; } XPStyle xp = XPStyle.getXP(); if (xp != null) { b.setBorder(xp.getBorder("button.pushbutton")); LookAndFeel.installProperty(b, "opaque", Boolean.FALSE); LookAndFeel.installProperty(b, "rolloverEnabled", Boolean.TRUE); } } protected void uninstallDefaults(AbstractButton b) { super.uninstallDefaults(b); defaults_initialized = false; } protected Color getFocusColor() { return focusColor; } // ******************************** // Paint Methods // ******************************** protected void paintButtonPressed(Graphics g, AbstractButton b) { if (XPStyle.getXP() == null && b.isContentAreaFilled() && !(b.getBorder() instanceof UIResource)) { // This is a special case in which the toggle button in the // Rollover JToolBar will render the button in a pressed state Color oldColor = g.getColor(); int w = b.getWidth(); int h = b.getHeight(); UIDefaults table = UIManager.getLookAndFeelDefaults(); Color shade = table.getColor("ToggleButton.shadow"); Component p = b.getParent(); if (p != null && p.getBackground().equals(shade)) { shade = table.getColor("ToggleButton.darkShadow"); } g.setColor(shade); g.drawRect(0, 0, w-1, h-1); g.setColor(table.getColor("ToggleButton.highlight")); g.drawLine(w-1, 0, w-1, h-1); g.drawLine(0, h-1, w-1, h-1); g.setColor(oldColor); } } public void paint(Graphics g, JComponent c) { if (XPStyle.getXP() != null) { WindowsButtonUI.paintXPButtonBackground(g, c); } super.paint(g, c); } /** * Overridden method to render the text without the mnemonic */ protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { WindowsGraphicsUtils.paintText(g, b, textRect, text, getTextShiftOffset()); } protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect) { if (b.getParent() instanceof JToolBar) { // Windows doesn't draw the focus rect for buttons in a toolbar. return; } g.setColor(getFocusColor()); BasicGraphicsUtils.drawDashedRect(g, dashedRectGapX, dashedRectGapY, b.getWidth() - dashedRectGapWidth, b.getHeight() - dashedRectGapHeight); } // ******************************** // Layout Methods // ******************************** public Dimension getPreferredSize(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; } }