All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jidesoft.plaf.basic.BasicJideButtonUI Maven / Gradle / Ivy

/*
 * @(#)JideButtonUI.java	Nov 20, 2002
 *
 * Copyright 2002 JIDE Software Inc. All rights reserved.
 */

package com.jidesoft.plaf.basic;

import com.jidesoft.icons.IconsFactory;
import com.jidesoft.plaf.JideButtonUI;
import com.jidesoft.plaf.LookAndFeelFactory;
import com.jidesoft.plaf.UIDefaultsLookup;
import com.jidesoft.swing.ComponentStateSupport;
import com.jidesoft.swing.JideButton;
import com.jidesoft.swing.JideSwingUtilities;
import com.jidesoft.utils.SecurityUtils;

import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.InsetsUIResource;
import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicButtonListener;
import javax.swing.plaf.basic.BasicGraphicsUtils;
import javax.swing.plaf.basic.BasicHTML;
import javax.swing.plaf.synth.Region;
import javax.swing.plaf.synth.SynthContext;
import javax.swing.plaf.synth.SynthLookAndFeel;
import javax.swing.plaf.synth.SynthStyle;
import javax.swing.text.View;
import java.awt.*;

/**
 * JideButtonUI implementation
 */
public class BasicJideButtonUI extends JideButtonUI {
    // Visual constants
    protected int defaultTextIconGap;

    // Offset controlled by set method
    private int shiftOffset = 0;
    protected int defaultTextShiftOffset;

    // Has the shared instance defaults been initialized?
    private boolean defaults_initialized = false;

    private static final String propertyPrefix = "JideButton" + ".";

    protected ThemePainter _painter;

    protected Color _shadowColor;
    protected Color _darkShadowColor;
    protected Color _highlight;
    protected Color _lightHighlightColor;

    protected Color _focusColor;

    protected boolean _isFloatingIcon = false;

    // ********************************
    //          Create PLAF
    // ********************************

    @SuppressWarnings({"UnusedDeclaration"})
    public static ComponentUI createUI(JComponent c) {
        return new BasicJideButtonUI();
    }

    protected String getPropertyPrefix() {
        return propertyPrefix;
    }


    // ********************************
    //          Install PLAF
    // ********************************

    @Override
    public void installUI(JComponent c) {
        installDefaults((AbstractButton) c);
        installListeners((AbstractButton) c);
        installKeyboardActions((AbstractButton) c);
        BasicHTML.updateRenderer(c, ((AbstractButton) c).getText());
    }

    protected void installDefaults(AbstractButton b) {
        // load shared instance defaults
        Object o = UIDefaultsLookup.get("Theme.painter");
        if (o instanceof ThemePainter) {
            _painter = (ThemePainter) o;
        }
        else {
            _painter = new BasicPainter();
        }

        String pp = getPropertyPrefix();
        if (!defaults_initialized) {
            defaultTextIconGap = UIDefaultsLookup.getInt(pp + "textIconGap");
            defaultTextShiftOffset = UIDefaultsLookup.getInt(pp + "textShiftOffset");

            _focusColor = UIDefaultsLookup.getColor("Button.focus"); // use Button.focus since we didn't install JideButton.focus.

            // next four lines part of optimized component defaults installation
            /* defaultForeground = UIManagerLookup.getColor(pp + "foreground");
             defaultBackground = UIManagerLookup.getColor(pp + "background");
             defaultFont = UIManagerLookup.getFont(pp + "font");
             defaultBorder = UIManagerLookup.getBorder(pp + "border");*/

            _shadowColor = UIDefaultsLookup.getColor("JideButton.shadow");
            _darkShadowColor = UIDefaultsLookup.getColor("JideButton.darkShadow");
            _highlight = UIDefaultsLookup.getColor("JideButton.highlight");
            _lightHighlightColor = UIDefaultsLookup.getColor("JideButton.light");

            defaults_initialized = true;
        }

//        // set the following defaults on the button
//        if (b.isContentAreaFilled()) {
//            b.setOpaque(true);
//        }
//        else {
//            b.setOpaque(false);
//        }

        updateMargin(b);

        // *** begin optimized defaults install ***

/*	Color currentForeground = b.getForeground();
	Color currentBackground = b.getBackground();
	Font currentFont = b.getFont();
	Border currentBorder = b.getBorder();

	if (currentForeground == null || currentForeground instanceof UIResource) {
	      b.setForeground(defaultForeground);
	}

	if (currentBackground == null || currentBackground instanceof UIResource) {
              b.setBackground(defaultBackground);
	}

	if (currentFont == null || currentFont instanceof UIResource) {
	      b.setFont(defaultFont);
	}

	if (currentBorder == null || currentBorder instanceof UIResource) {
	      b.setBorder(defaultBorder);
	} */

        // *** end optimized defaults install ***

        // old code below works for component defaults installation, but it is slow
        LookAndFeel.installColorsAndFont(b, pp + "background", pp + "foreground", pp + "font");
        LookAndFeel.installBorder(b, pp + "border");

        _isFloatingIcon = UIDefaultsLookup.getBoolean("Icon.floating");
    }

    protected void installListeners(AbstractButton b) {
        BasicButtonListener listener = createButtonListener(b);
        if (listener != null) {
            // put the listener in the button's client properties so that
            // we can get at it later
            b.putClientProperty(this, listener);

            b.addMouseListener(listener);
            b.addMouseMotionListener(listener);
            b.addFocusListener(listener);
            b.addPropertyChangeListener(listener);
            b.addChangeListener(listener);
        }
    }

    protected void installKeyboardActions(AbstractButton b) {
        BasicButtonListener listener = (BasicButtonListener) b.getClientProperty(this);
        if (listener != null) {
            listener.installKeyboardActions(b);
        }
    }


    // ********************************
    //         Uninstall PLAF
    // ********************************

    @Override
    public void uninstallUI(JComponent c) {
        uninstallKeyboardActions((AbstractButton) c);
        uninstallListeners((AbstractButton) c);
        uninstallDefaults((AbstractButton) c);
        BasicHTML.updateRenderer(c, "");
    }

    protected void uninstallKeyboardActions(AbstractButton b) {
        BasicButtonListener listener = (BasicButtonListener) b.getClientProperty(this);
        if (listener != null) {
            listener.uninstallKeyboardActions(b);
        }
    }

    protected void uninstallListeners(AbstractButton b) {
        BasicButtonListener listener = (BasicButtonListener) b.getClientProperty(this);
        b.putClientProperty(this, null);
        if (listener != null) {
            b.removeMouseListener(listener);
            b.removeMouseMotionListener(listener);
            b.removeFocusListener(listener);
            b.removeChangeListener(listener);
            b.removePropertyChangeListener(listener);
        }
    }

    @SuppressWarnings({"UnusedDeclaration"})
    protected void uninstallDefaults(AbstractButton b) {
        _painter = null;
        _focusColor = null;


        _shadowColor = null;
        _highlight = null;
        _lightHighlightColor = null;
        _darkShadowColor = null;
        defaults_initialized = false;
    }

    // ********************************
    //        Create Listeners
    // ********************************

    protected BasicButtonListener createButtonListener(AbstractButton b) {
        return new BasicJideButtonListener(b);
    }

    @SuppressWarnings({"UnusedDeclaration"})
    public int getDefaultTextIconGap(AbstractButton b) {
        return defaultTextIconGap;
    }

    protected Color getFocusColor() {
        return _focusColor;
    }

    /* These rectangles/insets are allocated once for all
     * ButtonUI.paint() calls.  Re-using rectangles rather than
     * allocating them in each paint call substantially reduced the time
     * it took paint to run.  Obviously, this method can't be re-entered.
     */
    protected static Rectangle viewRect = new Rectangle();
    protected static Rectangle textRect = new Rectangle();
    protected static Rectangle iconRect = new Rectangle();

    // ********************************
    //          Paint Methods
    // ********************************

    @Override
    public void paint(Graphics g, JComponent c) {
        AbstractButton b = (AbstractButton) c;
        boolean isHorizontal = true;

        if (JideSwingUtilities.getOrientationOf(c) == SwingConstants.VERTICAL) {
            isHorizontal = false;
        }


        FontMetrics fm = g.getFontMetrics();

        Insets i = c.getInsets();

        viewRect.x = i.left;
        viewRect.y = i.top;
        viewRect.width = b.getWidth() - (i.right + viewRect.x);
        viewRect.height = b.getHeight() - (i.bottom + viewRect.y);

        textRect.x = textRect.y = textRect.width = textRect.height = 0;
        iconRect.x = iconRect.y = iconRect.width = iconRect.height = 0;

        paintBackground(g, b);

        Font f = c.getFont();
        g.setFont(f);

        // layout the text and icon
        String text = JideSwingUtilities.layoutCompoundLabel(c, fm, b.getText(), b.getIcon(),
                isHorizontal,
                b.getVerticalAlignment(), b.getHorizontalAlignment(),
                b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
                viewRect, iconRect, textRect,
                // JDK PORTING HINT
                // JDK1.3: getIconTextGap, use defaultTextIconGap
                b.getText() == null ? 0 : b.getIconTextGap()); // use the bigger one of both gaps. Not really the best way.

        clearTextShiftOffset();

        paintIcon(b, g);

        Boolean highContrast = UIManager.getBoolean("Theme.highContrast");
        if (highContrast && JideSwingUtilities.getButtonState(b) == ThemePainter.STATE_PRESSED) {
            textRect.x += 1;
            textRect.y += 1;
        }
        if (text != null && !text.equals("")) {
            View v = (View) c.getClientProperty(BasicHTML.propertyKey);
            if (v != null) {
                v.paint(g, textRect);
            }
            else {
                paintText(g, b, textRect, text);
            }
        }
    }

    protected void paintIcon(AbstractButton b, Graphics g) {
        // Paint the Icon
        if (b.getIcon() != null) {
            Icon icon = getIcon(b);

            ButtonModel model = b.getModel();
            if (icon != null) {
                if (isFloatingIcon() && model.isEnabled()) {
                    if (model.isRollover() && !model.isPressed() && !model.isSelected()) {
                        if (!"true".equals(SecurityUtils.getProperty("shadingtheme", "false")) && b instanceof JideButton && ((JideButton) b).getButtonStyle() == JideButton.TOOLBAR_STYLE) {
                            if (icon instanceof ImageIcon) {
                                ImageIcon shadow = IconsFactory.createGrayImage(((ImageIcon) icon).getImage());
                                shadow.paintIcon(b, g, iconRect.x + 1, iconRect.y + 1);
                            }
                            else {
                                ImageIcon shadow = IconsFactory.createGrayImage(b, icon);
                                shadow.paintIcon(b, g, iconRect.x + 1, iconRect.y + 1);
                            }
                            icon.paintIcon(b, g, iconRect.x - 1, iconRect.y - 1);
                        }
                        else {
                            icon.paintIcon(b, g, iconRect.x, iconRect.y);
                        }
                    }
                    else {
                        icon.paintIcon(b, g, iconRect.x, iconRect.y);
                    }
                }
                else {
                    icon.paintIcon(b, g, iconRect.x, iconRect.y);
                }
            }
        }
    }

    protected Icon getIcon(AbstractButton b) {
        ButtonModel model = b.getModel();
        Icon icon = b.getIcon();
        Icon tmpIcon = null;
        if (!model.isEnabled()) {
            if (model.isSelected()) {
                tmpIcon = b.getDisabledSelectedIcon();
            }
            else {
                tmpIcon = b.getDisabledIcon();
            }

            // create default disabled icon
            if (tmpIcon == null) {
                if (icon instanceof ImageIcon) {
                    icon = IconsFactory.createGrayImage(((ImageIcon) icon).getImage());
                }
                else {
                    icon = IconsFactory.createGrayImage(b, icon);
                }
            }
        }
        else if (model.isPressed() && model.isArmed()) {
            tmpIcon = b.getPressedIcon();
            if (tmpIcon != null) {
                // revert back to 0 offset
                clearTextShiftOffset();
            }
        }
        else if (b.isRolloverEnabled() && model.isRollover()) {
            if (model.isSelected()) {
                tmpIcon = b.getRolloverSelectedIcon();
            }
            else {
                tmpIcon = b.getRolloverIcon();
            }
        }
        else if (model.isSelected()) {
            tmpIcon = b.getSelectedIcon();
        }

        if (tmpIcon != null) {
            icon = tmpIcon;
        }
        return icon;
    }

    protected boolean isFloatingIcon() {
        return _isFloatingIcon;
    }

    /**
     * As of Java 2 platform v 1.4 this method should not be used or overridden. Use the paintText method which takes
     * the AbstractButton argument.
     *
     * @param g        the Graphics instance
     * @param c        the component
     * @param textRect the rectangle of the text
     * @param text     the text to paint
     */
    protected void paintText(Graphics g, JComponent c, Rectangle textRect, String text) {
        AbstractButton b = (AbstractButton) c;
        boolean isHorizontal = true;
        if (JideSwingUtilities.getOrientationOf(c) == SwingConstants.VERTICAL) {
            isHorizontal = false;
        }

        ButtonModel model = b.getModel();
        FontMetrics fm = g.getFontMetrics();
        // JDK PORTING HINT
        // JDK1.3: No getDisplayedMnemonicIndex, use getMnemonic
        int mnemonicIndex = b.getDisplayedMnemonicIndex();

        if (!isHorizontal) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.rotate(Math.PI / 2);
            g2d.translate(0, -c.getWidth() + 1);

            /* Draw the Text */
            if (model.isEnabled()) {
                /*** paint the text normally */
                g2d.setColor(getForegroundOfState(b));

                // JDK PORTING HINT
                // JDK1.3: No drawStringUnderlineCharAt, draw the string then draw the underline
                JideSwingUtilities.drawStringUnderlineCharAt(b, g2d, text, mnemonicIndex,
                        textRect.y + getTextShiftOffset(),
                        textRect.x + fm.getAscent() + getTextShiftOffset());
            }
            else {
                /*** paint the text disabled ***/
                /*** paint the text disabled ***/
                Color color = UIDefaultsLookup.getColor("Button.disabledForeground");
                g2d.setColor(color == null ? b.getBackground().darker() : color);

                // JDK PORTING HINT
                // JDK1.3: No drawStringUnderlineCharAt, draw the string then draw the underline
                JideSwingUtilities.drawStringUnderlineCharAt(b, g2d, text, mnemonicIndex,
                        textRect.y, textRect.x + fm.getAscent());
            }
            if (b instanceof JideButton && ((JideButton) b).getButtonStyle() == JideButton.HYPERLINK_STYLE
                    && (((JideButton) b).isAlwaysShowHyperlink() || b.getModel().isRollover())) {
                g.drawLine(textRect.x, textRect.y, textRect.x, textRect.y + textRect.height);
            }

            g2d.dispose();
        }
        else {
            /* Draw the Text */
            Color old = g.getColor();
            if (model.isEnabled()) {
                /*** paint the text normally */
                g.setColor(getForegroundOfState(b));

                // JDK PORTING HINT
                // JDK1.3: No drawStringUnderlineCharAt, draw the string then draw the underline
                JideSwingUtilities.drawStringUnderlineCharAt(b, g, text, mnemonicIndex,
                        textRect.x + getTextShiftOffset(),
                        textRect.y + fm.getAscent() + getTextShiftOffset());
            }
            else {
                /*** paint the text disabled ***/
                Color color = UIDefaultsLookup.getColor("Button.disabledForeground");
                g.setColor(color == null ? b.getBackground().darker() : color);

                // JDK PORTING HINT
                // JDK1.3: No drawStringUnderlineCharAt, draw the string then draw the underline
                JideSwingUtilities.drawStringUnderlineCharAt(b, g, text, mnemonicIndex,
                        textRect.x, textRect.y + fm.getAscent());
            }
            if (b instanceof JideButton && ((JideButton) b).getButtonStyle() == JideButton.HYPERLINK_STYLE
                    && (((JideButton) b).isAlwaysShowHyperlink() || b.getModel().isRollover())) {
                g.drawLine(textRect.x, textRect.y + textRect.height - 2, textRect.x + textRect.width, textRect.y + textRect.height - 2);
            }
            g.setColor(old);
        }
    }

    protected Color getForegroundOfState(AbstractButton b) {
        int state = JideSwingUtilities.getButtonState(b);
        Color foreground = null;
        if (b instanceof ComponentStateSupport) {
            foreground = ((ComponentStateSupport) b).getForegroundOfState(state);
        }
        if (foreground == null || foreground instanceof UIResource) {
            foreground = b.getForeground();
        }
        return foreground;
    }

    /**
     * Method which renders the text of the current button.
     * 

* * @param g Graphics context * @param b Current button to render * @param textRect Bounding rectangle to render the text. * @param text String to render * * @since 1.4 */ protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { paintText(g, (JComponent) b, textRect, text); } protected void paintBackground(Graphics g, AbstractButton b) { boolean paintDefaultBorder = true; boolean paintBackground; Object o = b.getClientProperty("JideButton.paintDefaultBorder"); if (o instanceof Boolean) { paintDefaultBorder = (Boolean) o; } o = b.getClientProperty("JideButton.alwaysPaintBackground"); if (o instanceof Boolean) { paintBackground = (Boolean) o; } else { paintBackground = b.isOpaque(); } if (paintBackground) { g.setColor(b.getBackground()); g.fillRect(0, 0, b.getWidth(), b.getHeight()); } if (b.isContentAreaFilled()) { if (b instanceof JideButton && ((JideButton) b).getButtonStyle() == JideButton.TOOLBAR_STYLE) { Rectangle rect = new Rectangle(0, 0, b.getWidth(), b.getHeight()); int state = JideSwingUtilities.getButtonState(b); if (state != ThemePainter.STATE_DEFAULT) { getPainter().paintButtonBackground(b, g, rect, 0, state); } else { if (paintBackground) { getPainter().paintButtonBackground(b, g, rect, JideSwingUtilities.getOrientationOf(b), state); if ("true".equals(SecurityUtils.getProperty("shadingtheme", "false"))) { JideSwingUtilities.fillGradient(g, rect, JideSwingUtilities.getOrientationOf(b)); } } } } else if (b instanceof JideButton && ((JideButton) b).getButtonStyle() == JideButton.FLAT_STYLE) { paintBackgroundInFlatStyle(g, b, paintBackground); } else if (b instanceof JideButton && ((JideButton) b).getButtonStyle() == JideButton.TOOLBOX_STYLE) { paintBackgroundInToolboxStyle(g, b, paintBackground, paintDefaultBorder); } } } private void paintBackgroundInFlatStyle(Graphics g, AbstractButton b, boolean paintBackground) { Rectangle rect = new Rectangle(0, 0, b.getWidth(), b.getHeight()); int state = JideSwingUtilities.getButtonState(b); switch (state) { case ThemePainter.STATE_SELECTED: JideSwingUtilities.paintBackground(g, rect, _highlight, _highlight); g.setColor(_shadowColor); // inner 3D border g.drawLine(rect.x, rect.y, rect.width - 1, rect.y); g.drawLine(rect.x, rect.y, rect.x, rect.height - 1); g.setColor(_lightHighlightColor); // black drop shadow __| g.drawLine(rect.x, rect.height - 1, rect.width - 1, rect.height - 1); g.drawLine(rect.width - 1, rect.y, rect.width - 1, rect.height - 1); break; case ThemePainter.STATE_PRESSED: JideSwingUtilities.paintBackground(g, rect, _highlight, _highlight); g.setColor(_shadowColor); // inner 3D border g.drawLine(rect.x, rect.y, rect.width - 1, rect.y); g.drawLine(rect.x, rect.y, rect.x, rect.height - 1); g.setColor(_lightHighlightColor); // black drop shadow __| g.drawLine(rect.x, rect.height - 1, rect.width - 1, rect.height - 1); g.drawLine(rect.width - 1, rect.y, rect.width - 1, rect.height - 1); break; case ThemePainter.STATE_ROLLOVER: JideSwingUtilities.paintBackground(g, rect, _highlight, _highlight); g.setColor(_lightHighlightColor); // inner 3D border g.drawLine(rect.x, rect.y, rect.width - 1, rect.y); g.drawLine(rect.x, rect.y, rect.x, rect.height - 1); g.setColor(_shadowColor); // black drop shadow __| g.drawLine(rect.x, rect.height - 1, rect.width - 1, rect.height - 1); g.drawLine(rect.width - 1, rect.y, rect.width - 1, rect.height - 1); break; case ThemePainter.STATE_DISABLE: case ThemePainter.STATE_DISABLE_SELECTED: if (paintBackground) { JideSwingUtilities.paintBackground(g, rect, _highlight, _highlight); g.setColor(_lightHighlightColor); // inner 3D border g.drawLine(rect.x, rect.y, rect.width - 1, rect.y); g.drawLine(rect.x, rect.y, rect.x, rect.height - 1); g.setColor(_shadowColor); // black drop shadow __| g.drawLine(rect.x, rect.height - 1, rect.width - 1, rect.height - 1); g.drawLine(rect.width - 1, rect.y, rect.width - 1, rect.height - 1); } break; case ThemePainter.STATE_DEFAULT: if (paintBackground) { getPainter().paintButtonBackground(b, g, rect, JideSwingUtilities.getOrientationOf(b), state); } break; } } private void paintBackgroundInToolboxStyle(Graphics g, AbstractButton b, boolean paintBackground, boolean paintDefaultBorder) { Rectangle rect = new Rectangle(0, 0, b.getWidth(), b.getHeight()); if (b.getModel().isPressed()) { getPainter().paintButtonBackground(b, g, rect, JideSwingUtilities.getOrientationOf(b), ThemePainter.STATE_PRESSED); if (paintDefaultBorder) { g.setColor(_darkShadowColor); // inner 3D border g.drawLine(0, 0, b.getWidth() - 2, 0); g.drawLine(0, 0, 0, b.getHeight() - 2); g.setColor(_shadowColor); // inner 3D border g.drawLine(1, 1, b.getWidth() - 3, 1); g.drawLine(1, 1, 1, b.getHeight() - 3); g.setColor(_lightHighlightColor); // black drop shadow __| g.drawLine(0, b.getHeight() - 1, b.getWidth() - 1, b.getHeight() - 1); g.drawLine(b.getWidth() - 1, 0, b.getWidth() - 1, b.getHeight() - 1); } } else if (b.getModel().isSelected() && b.getModel().isRollover()) { getPainter().paintButtonBackground(b, g, rect, JideSwingUtilities.getOrientationOf(b), ThemePainter.STATE_PRESSED); if (paintDefaultBorder) { g.setColor(_darkShadowColor); // inner 3D border g.drawLine(0, 0, b.getWidth() - 2, 0); g.drawLine(0, 0, 0, b.getHeight() - 2); g.setColor(_shadowColor); // inner 3D border g.drawLine(1, 1, b.getWidth() - 3, 1); g.drawLine(1, 1, 1, b.getHeight() - 3); g.setColor(_lightHighlightColor); // black drop shadow __| g.drawLine(0, b.getHeight() - 1, b.getWidth() - 1, b.getHeight() - 1); g.drawLine(b.getWidth() - 1, 0, b.getWidth() - 1, b.getHeight() - 1); } } else if (b.getModel().isSelected()) { getPainter().paintButtonBackground(b, g, rect, JideSwingUtilities.getOrientationOf(b), ThemePainter.STATE_SELECTED); if (paintDefaultBorder) { g.setColor(_darkShadowColor); // inner 3D border g.drawLine(0, 0, b.getWidth() - 2, 0); g.drawLine(0, 0, 0, b.getHeight() - 2); g.setColor(_shadowColor); // inner 3D border g.drawLine(1, 1, b.getWidth() - 3, 1); g.drawLine(1, 1, 1, b.getHeight() - 3); g.setColor(_lightHighlightColor); // black drop shadow __| g.drawLine(0, b.getHeight() - 1, b.getWidth() - 1, b.getHeight() - 1); g.drawLine(b.getWidth() - 1, 0, b.getWidth() - 1, b.getHeight() - 1); } } else if (b.getModel().isRollover() || (b.hasFocus() && b.isFocusPainted())) { getPainter().paintButtonBackground(b, g, rect, JideSwingUtilities.getOrientationOf(b), ThemePainter.STATE_ROLLOVER); if (paintDefaultBorder) { g.setColor(_lightHighlightColor); // inner 3D border g.drawLine(0, 0, b.getWidth() - 1, 0); g.drawLine(0, 0, 0, b.getHeight() - 1); g.setColor(_shadowColor); // gray drop shadow __| g.drawLine(1, b.getHeight() - 2, b.getWidth() - 2, b.getHeight() - 2); g.drawLine(b.getWidth() - 2, 1, b.getWidth() - 2, b.getHeight() - 2); g.setColor(_darkShadowColor); // black drop shadow __| g.drawLine(0, b.getHeight() - 1, b.getWidth() - 1, b.getHeight() - 1); g.drawLine(b.getWidth() - 1, 0, b.getWidth() - 1, b.getHeight() - 1); } } else { if (paintBackground) { getPainter().paintButtonBackground(b, g, rect, JideSwingUtilities.getOrientationOf(b), ThemePainter.STATE_DEFAULT); } else { g.setColor(_lightHighlightColor); // inner 3D border g.drawLine(0, 0, b.getWidth() - 1, 0); g.drawLine(0, 0, 0, b.getHeight() - 1); g.setColor(_shadowColor); // black drop shadow __| g.drawLine(0, b.getHeight() - 1, b.getWidth() - 1, b.getHeight() - 1); g.drawLine(b.getWidth() - 1, 0, b.getWidth() - 1, b.getHeight() - 1); } } if (paintBackground) { g.setColor(_lightHighlightColor); // inner 3D border g.drawLine(0, 0, b.getWidth() - 1, 0); g.drawLine(0, 0, 0, b.getHeight() - 1); g.setColor(_shadowColor); // black drop shadow __| g.drawLine(0, b.getHeight() - 1, b.getWidth() - 1, b.getHeight() - 1); g.drawLine(b.getWidth() - 1, 0, b.getWidth() - 1, b.getHeight() - 1); } } protected void clearTextShiftOffset() { this.shiftOffset = 0; } protected void setTextShiftOffset() { this.shiftOffset = defaultTextShiftOffset; } protected int getTextShiftOffset() { return shiftOffset; } // ******************************** // Layout Methods // ******************************** @Override public Dimension getMinimumSize(JComponent c) { Dimension d = getPreferredSize(c); View v = (View) c.getClientProperty(BasicHTML.propertyKey); if (v != null) { if (JideSwingUtilities.getOrientationOf(c) == SwingConstants.HORIZONTAL) d.width -= v.getPreferredSpan(View.X_AXIS) - v.getMinimumSpan(View.X_AXIS); else // TODO: not sure if this is correct d.height -= v.getPreferredSpan(View.X_AXIS) - v.getMinimumSpan(View.X_AXIS); } return d; } @Override public Dimension getPreferredSize(JComponent c) { AbstractButton b = (AbstractButton) c; Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, b.getIconTextGap()); if (JideSwingUtilities.getOrientationOf(c) == SwingConstants.HORIZONTAL) { return d; } else { return new Dimension(d.height, d.width); // swap width and height } } @Override public Dimension getMaximumSize(JComponent c) { Dimension d = getPreferredSize(c); View v = (View) c.getClientProperty(BasicHTML.propertyKey); if (v != null) { d.width += v.getMaximumSpan(View.X_AXIS) - v.getPreferredSpan(View.X_AXIS); } return d; } public ThemePainter getPainter() { return _painter; } protected void updateMargin(AbstractButton b) { String pp = getPropertyPrefix(); if (LookAndFeelFactory.isLnfInUse(LookAndFeelFactory.SYNTH_LNF)) { SynthStyle ss = SynthLookAndFeel.getStyle(b, Region.BUTTON); SynthContext sc = new SynthContext(b, Region.BUTTON, ss, 0); Insets insets = ss.getInsets(sc, new InsetsUIResource(0, 0, 0, 0)); if (insets != null) { b.setMargin(insets); } } else if (b.getMargin() == null || (b.getMargin() instanceof UIResource)) { if (shouldWrapText(b)) { b.setMargin(UIDefaultsLookup.getInsets(pp + "margin.vertical")); } else { b.setMargin(UIDefaultsLookup.getInsets(pp + "margin")); } } } /** * Checks if we should wrap text on a button. If the vertical text position is bottom and horizontal text position * is center, we will wrap the text. * * @param c the component * * @return true or false. */ @SuppressWarnings({"UnusedDeclaration"}) public static boolean shouldWrapText(Component c) { // return false for now before we support the text wrapping return false; // boolean wrapText = false; // if (c instanceof AbstractButton) { // if (((AbstractButton) c).getVerticalTextPosition() == SwingConstants.BOTTOM && ((AbstractButton) c).getHorizontalTextPosition() == SwingConstants.CENTER) { // wrapText = true; // } // } // return wrapText; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy