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

org.flexdock.plaf.theme.ButtonUI Maven / Gradle / Ivy

/*
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package org.flexdock.plaf.theme;

import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.ButtonModel;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicButtonListener;
import javax.swing.plaf.basic.BasicButtonUI;

import org.flexdock.plaf.IFlexViewComponentUI;
import org.flexdock.plaf.PropertySet;
import org.flexdock.plaf.icons.IconResource;
import org.flexdock.view.Button;
import org.flexdock.view.Titlebar;

/**
 * @author Christopher Butler
 */
public class ButtonUI extends BasicButtonUI implements IFlexViewComponentUI {
    public static final String BORDER = "border";
    public static final String BORDER_HOVER = "border.hover";
    public static final String BORDER_ACTIVE = "border.active";
    public static final String BORDER_ACTIVE_HOVER = "border.active.hover";
    public static final String BORDER_PRESSED = "border.pressed";

    protected PropertySet creationParameters;
    protected Border borderDefault;
    protected Border borderDefaultHover;
    protected Border borderActive;
    protected Border borderActiveHover;
    protected Border borderPressed;

    @Override
    public void paint(Graphics g, JComponent c) {
        AbstractButton b = (AbstractButton) c;
        ButtonModel model = b.getModel();
        updateTooltip(b);

        boolean active = isParentActive(b);
        boolean pressed = isPressed(b);
        boolean hover = pressed || model.isRollover();

        paintBackground(g, b, active, hover, pressed);
        paintIcon(g, b);
        paintBorder(g, b);
    }

    protected void paintBackground(Graphics g, AbstractButton b, boolean active, boolean hover, boolean pressed) {
        // do nothing
    }

    protected void paintBorder(Graphics g, AbstractButton b) {
        Border border = getBorder(b);
        if(border!=null) {
            border.paintBorder(b, g, 0, 0, b.getWidth(), b.getHeight());
        }
    }

    protected Border getBorder(AbstractButton button) {
        if(isPressed(button)) {
            return getPressedBorder(button);
        }

        boolean active = isParentActive(button);
        if(button.getModel().isRollover()) {
            return getHoverBorder(button, active);
        }

        return getDefaultBorder(button, active);
    }

    protected Border getPressedBorder(AbstractButton button) {
        Border border = borderPressed;
        if(border==null) {
            border = getHoverBorder(button, true);
        }
        return border;
    }

    protected Border getHoverBorder(AbstractButton button, boolean active) {
        Border border = active? borderActiveHover: borderDefaultHover;
        if(border==null) {
            border = getDefaultBorder(button, active);
        }
        return border;
    }

    protected Border getDefaultBorder(AbstractButton button, boolean active) {
        return active? borderActive: borderDefault;
    }




    protected void paintIcon(Graphics g, AbstractButton b) {
        Icon icon = getIcon(b);
        if(icon==null) {
            return;
        }

        int h = icon.getIconHeight();
        int w = icon.getIconWidth();
        int x = b.getWidth()/2 - w/2;
        int y = b.getHeight()/2 - h/2;

        icon.paintIcon(b, g, x, y);
    }

    protected Icon getIcon(AbstractButton button) {
        boolean active = isParentActive(button);

        if(!button.isEnabled() || !button.getModel().isEnabled()) {
            return getDisabledIcon(button, active);
        }

        if(isPressed(button)) {
            return getPressedIcon(button);
        }

        if(button.getModel().isRollover()) {
            return getHoverIcon(button, active);
        }

        return getDefaultIcon(button, active);
    }

    protected Icon getDisabledIcon(AbstractButton button, boolean active) {
        Icon icon = button.getDisabledIcon();
        if(icon==null) {
            icon = getActionIcon(button, false, active, false);
        }
        if(icon==null) {
            icon = getDefaultIcon(button, active);
        }
        return icon;
    }

    protected Icon getPressedIcon(AbstractButton button) {
        Icon icon = button.getPressedIcon();
        if(icon==null) {
            icon = getActionIcon(button, true, true, true);
        }
        if(icon==null) {
            icon = getHoverIcon(button, true);
        }
        return icon;
    }

    protected Icon getHoverIcon(AbstractButton button, boolean active) {
        Icon icon = button.getRolloverIcon();
        if(icon==null) {
            icon = getActionIcon(button, false, active, true);
        }
        if(icon==null) {
            icon = getDefaultIcon(button, active);
        }
        return icon;
    }

    protected Icon getDefaultIcon(AbstractButton button, boolean active) {
        Icon icon = button.getIcon();
        if(icon==null) {
            icon = getActionIcon(button, false, active, false);
        }
        return icon;
    }

    protected Icon getActionIcon(AbstractButton button, boolean pressed, boolean active, boolean hover) {
        Action action = button.getAction();
        IconResource resource = action==null? null: (IconResource)action.getValue(ICON_RESOURCE);
        if(resource==null) {
            return null;
        }

        boolean disabled = !button.isEnabled() || !button.getModel().isEnabled();
        boolean selected = button.isSelected();


        if(pressed && !disabled) {
            Icon icon = selected? resource.getIconSelectedPressed(): null;
            if(icon==null) {
                icon = resource.getIconPressed();
            }
            return icon;
        }

        if(active) {
            if(disabled) {
                Icon icon = selected? resource.getIconSelectedActiveDisabled(): null;
                if(icon==null) {
                    icon = resource.getIconActiveDisabled();
                }
                return icon==null? resource.getIconActive(): icon;
            }

            if(hover) {
                Icon icon = selected? resource.getIconSelectedActiveHover(): null;
                if(icon==null) {
                    icon = resource.getIconActiveHover();
                }
                return icon;
            }

            Icon icon = selected? resource.getIconSelectedActive(): null;
            if(icon==null) {
                icon = resource.getIconActive();
            }
            return icon;
        }

        if(disabled) {
            Icon icon = selected? resource.getIconSelectedDisabled(): null;
            if(icon==null) {
                icon = resource.getIconDisabled();
            }
            return icon==null? resource.getIcon(): icon;
        }

        if(hover) {
            Icon icon = selected? resource.getIconSelectedHover(): null;
            if(icon==null) {
                icon = resource.getIconHover();
            }
            return icon;
        }

        Icon icon = selected? resource.getIconSelected(): null;
        if(icon==null) {
            icon = resource.getIcon();
        }
        return icon;
    }

    protected boolean isPressed(AbstractButton button) {
        ButtonModel model = button.getModel();
        return model.isArmed() && model.isPressed();
    }

    protected boolean isParentActive(AbstractButton button) {
        Container parent = button.getParent();
        return parent instanceof Titlebar? ((Titlebar)parent).isActive(): false;
    }


    @Override
    public void installUI(JComponent c) {
        super.installUI(c);
        AbstractButton button = (AbstractButton)c;
        button.setRolloverEnabled(true);
        button.setRequestFocusEnabled(false);
        button.setOpaque(false);
        button.setBorder(null);

        // add the toggle listener
        button.addItemListener(new ToggleListener());
        updateTooltip(button);
    }

    @Override
    public void uninstallUI(JComponent c) {
        AbstractButton button = (AbstractButton)c;
        super.uninstallUI(c);
    }

    @Override
    protected void installKeyboardActions(AbstractButton b) {
        // do nothing
    }

    @Override
    protected BasicButtonListener createButtonListener(AbstractButton b) {
        return new ButtonListener(b);
    }

    protected static class ButtonListener extends BasicButtonListener {
        protected ButtonListener(AbstractButton b) {
            super(b);
        }
        @Override
        public void focusGained(FocusEvent e) {
        }
        @Override
        public void focusLost(FocusEvent e) {
        }
    }

    public void setBorderActive(Border borderActive) {
        this.borderActive = borderActive;
    }

    public void setBorderActiveHover(Border borderActiveHover) {
        this.borderActiveHover = borderActiveHover;
    }

    public void setBorderDefault(Border borderDefault) {
        this.borderDefault = borderDefault;
    }

    public void setBorderDefaultHover(Border borderDefaultHover) {
        this.borderDefaultHover = borderDefaultHover;
    }

    public void setBorderPressed(Border borderPressed) {
        this.borderPressed = borderPressed;
    }

    @Override
    public PropertySet getCreationParameters() {
        return creationParameters;
    }
    @Override
    public void setCreationParameters(PropertySet creationParameters) {
        this.creationParameters = creationParameters;
        initializeCreationParameters();
    }

    @Override
    public void initializeCreationParameters() {
        setBorderDefault(creationParameters.getBorder(BORDER));
        setBorderDefaultHover(creationParameters.getBorder(BORDER_HOVER));
        setBorderActive(creationParameters.getBorder(BORDER_ACTIVE));
        setBorderActiveHover(creationParameters.getBorder(BORDER_ACTIVE_HOVER));
        setBorderPressed(creationParameters.getBorder(BORDER_PRESSED));
    }

    private class ToggleListener implements ItemListener {
        @Override
        public void itemStateChanged(ItemEvent e) {
            if(e.getStateChange()!=ItemEvent.SELECTED && e.getStateChange()!=ItemEvent.DESELECTED) {
                return;
            }

            Button button = (Button)e.getSource();
            updateTooltip(button);
        }
    }

    private void updateTooltip(AbstractButton button) {
        Action action = button.getAction();
        if(action==null) {
            return;
        }

        String toolTip = (String)action.getValue(Action.SHORT_DESCRIPTION);
        if(toolTip!=null) {
            return;
        }

        IconResource resource = action==null? null: (IconResource)action.getValue(ICON_RESOURCE);
        if(resource==null) {
            return;
        }

        toolTip = button.isSelected()? resource.getTooltipSelected(): resource.getTooltip();
        if(toolTip==null) {
            toolTip = resource.getTooltip();
        }

        if(toolTip!=null) {
            button.setToolTipText(toolTip);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy