Package com.salas.bb.views.mainframe

Source Code of com.salas.bb.views.mainframe.BBToolBarButton

// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program 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 2 of the License, or (at your option) any later version.
//
// This program 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 this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: BBToolBarButton.java,v 1.19 2007/09/18 12:23:08 spyromus Exp $
//

package com.salas.bb.views.mainframe;

import com.jgoodies.uif.action.ActionManager;
import com.jgoodies.uif.util.Mode;
import com.jgoodies.uif.util.Modes;
import com.jgoodies.uif.util.SystemUtils;
import com.salas.bb.core.actions.IToolbarCommandAction;
import com.salas.bb.utils.i18n.Strings;

import javax.swing.*;
import javax.swing.plaf.InsetsUIResource;
import javax.swing.plaf.UIResource;
import java.awt.*;

/**
* A <code>JButton</code> subclass for use in tool bars.
* Adds a special configuration to its superclass; useful in toolbars.
*
* @author Karsten Lentzsch
*/
public final class BBToolBarButton extends JButton
{
    /**
     * Reused for tool bar buttons.
     */
    private static final Insets EMPTY_INSETS = new InsetsUIResource(0, 0, 0, 0);

    /**
     * Holds the mode that is used to set the <em>borderPainted</em>
     * property if the UI changes.
     *
     * @see #getBorderPaintedMode()
     * @see #setBorderPaintedMode(Mode)
     */
    private Mode borderPaintedMode = Modes.LAF_NON_AQUA;

    /**
     * Holds the mode that is used to determine the margin size
     * if the button is configured.
     *
     * @see #getWideMarginMode()
     * @see #setWideMarginMode(Mode)
     */
//    private Mode wideMarginMode = Modes.LAF_AQUA;
    private Mode wideMarginMode = Modes.NEVER;


    // Instance Creation ******************************************************

    /**
     * Constructs tool bar button and sets properties as described
     * by the given action.
     *
     * @param action provides the properties for this button
     */
    public BBToolBarButton(Action action)
    {
        super(action);
        configureButton();
    }


    // Accessing Properties ***************************************************

    /**
     * Returns this button's border painted mode that can be used to
     * change the <em>borderPainted</em> property if the UI changes.
     *
     * @return the current border painted mode
     */
    public Mode getBorderPaintedMode()
    {
        return borderPaintedMode;
    }


    /**
     * Sets a new border painted mode that can be used to change the
     * <em>borderPainted</em> property if the UI changes.
     *
     * @param newMode the mode to be set
     *
     * @throws NullPointerException if the new mode is <code>null</code>
     */
    public void setBorderPaintedMode(Mode newMode)
    {
        if (newMode == null)
            throw new NullPointerException(Strings.error("unspecified.ui.border.painted.mode"));
        borderPaintedMode = newMode;
        configureButton();
    }


    /**
     * Returns this button's wide margin mode that can be used
     * to change the button's margin during the configuration.
     *
     * @return the current wide margin mode
     */
    public Mode getWideMarginMode()
    {
        return wideMarginMode;
    }


    /**
     * Sets a new border painted mode that can be used to change
     * the <em>borderPainted</em> property if the UI changes.
     *
     * @param newMode the mode to be set
     *
     * @throws NullPointerException if the new mode is <code>null</code>
     */
    public void setWideMarginMode(Mode newMode)
    {
        if (newMode == null)
            throw new NullPointerException(Strings.error("unspecified.ui.wide.margin.mode"));
        wideMarginMode = newMode;
        configureButton();
    }


    // Updating the UI ******************************************************
    /**
     * In addition to the superclass behavior that updates the UI
     * this method configures several button properties. For details see
     * {@link BBToolBarButton#configureBBToolbarButton(AbstractButton, boolean, boolean)}.
     * This configuration honors the border painted mode
     * and the wide margin mode.<p>
     *
     * This method is invoked during the superclass construction
     * and therefore we check for an uninitialized field.
     */
    public void updateUI()
    {
        super.updateUI();
        if (getBorderPaintedMode() != null)
        {
            configureButton();
        }
    }


    /**
     * Configures an <code>AbstractButton</code> for being used
     * in a tool bar.
     *
     * @param button        - Button being configured
     * @param borderPainted - true if we want border painted
     * @param wideMargin    - true if we want a wide margin
     */
    public static void configureBBToolbarButton(AbstractButton button,
                                       boolean borderPainted,
                                       boolean wideMargin)
    {
        button.setHorizontalTextPosition(CENTER);
        button.setVerticalTextPosition(BOTTOM);
        button.setAlignmentY(CENTER_ALIGNMENT);
        button.setFocusPainted(false);
        button.setBorderPainted(borderPainted);
        if (button.getMargin() instanceof UIResource)
        {
            button.setMargin(getButtonMargin(button, wideMargin));
        }
        button.setMnemonic(0);
        button.setFocusable(false);
        if (SystemUtils.IS_OS_MAC)
        {
            button.setIconTextGap(0);
        }
    }

    /**
     * Returns the button's margin.
     *
     * @param button     - Button being configured
     * @param wideMargin - true to indicate wide margin desired.
     * @return - indicated insets
     */
    private static Insets getButtonMargin(AbstractButton button, boolean wideMargin)
    {
        Dimension defaultIconSize =
                UIManager.getDimension("jgoodies.defaultIconSize");
        Icon icon = button.getIcon();
        if (defaultIconSize == null || icon == null)
            return EMPTY_INSETS;

        int hpad = Math.max(0, defaultIconSize.width - icon.getIconWidth());
        int vpad = Math.max(0, defaultIconSize.height - icon.getIconHeight());
        int top = vpad / 2;
        int left = hpad / 2;
        int bottom = top + vpad % 2;
        int right = left + hpad % 2;
        if (wideMargin)
        {
            top += 2;
            left += 2;
            bottom += 2;
            right += 2;
        }
        return new InsetsUIResource(top, left, bottom, right);
    }

    /*
     * Configures this button.
     */
    private void configureButton()
    {
        configureBBToolbarButton(this,
            getBorderPaintedMode().enabled(),
            getWideMarginMode().enabled());
        setDefaultCapable(false);
    }

    /**
     * Configures the button's properties from the given Action. Note that these are (also)
     * <code>ToolbarCommandAction</code>, which can return the special pressed icon for toolbar
     * buttons.
     *
     * @param a - Action to be used. (Class Action, implements ToolbarCommandAction)
     */
    protected void configurePropertiesFromAction(Action a)
    {
        super.configurePropertiesFromAction(a);
        Icon icon = getIcon();
        Icon grayIcon = (Icon)a.getValue(ActionManager.SMALL_GRAY_ICON);
        if (grayIcon != null)
        {
            setRolloverIcon(icon);
            setIcon(grayIcon);
        }
        if (icon != null)
        {
            putClientProperty("hideActionText", Boolean.TRUE);
        }

        if (a instanceof IToolbarCommandAction)
        {
            Icon pressedIcon = ((IToolbarCommandAction) a).getPressedIcon();
            if (pressedIcon != null) setPressedIcon(pressedIcon);
        }
    }
}
TOP

Related Classes of com.salas.bb.views.mainframe.BBToolBarButton

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.