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

com.jtattoo.plaf.texture.TextureBorders Maven / Gradle / Ivy

The newest version!
/*
* Copyright (c) 2002 and later by MH Software-Entwicklung. All Rights Reserved.
*  
* JTattoo is multiple licensed. If your are an open source developer you can use
* it under the terms and conditions of the GNU General Public License version 2.0
* or later as published by the Free Software Foundation.
*  
* see: gpl-2.0.txt
* 
* If you pay for a license you will become a registered user who could use the
* software under the terms and conditions of the GNU Lesser General Public License
* version 2.0 or later with classpath exception as published by the Free Software
* Foundation.
* 
* see: lgpl-2.0.txt
* see: classpath-exception.txt
* 
* Registered users could also use JTattoo under the terms and conditions of the 
* Apache License, Version 2.0 as published by the Apache Software Foundation.
*  
* see: APACHE-LICENSE-2.0.txt
 */
package com.jtattoo.plaf.texture;

import com.jtattoo.plaf.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.AbstractBorder;
import javax.swing.border.Border;
import javax.swing.plaf.UIResource;

/**
 * @author Michael Hagen
 */
public class TextureBorders extends BaseBorders {

//------------------------------------------------------------------------------------
// Lazy access methods
//------------------------------------------------------------------------------------
    public static Border getButtonBorder() {
        if (buttonBorder == null) {
            buttonBorder = new ButtonBorder();
        }
        return buttonBorder;
    }

    public static Border getToggleButtonBorder() {
        return getButtonBorder();
    }

    public static Border getRolloverToolButtonBorder() {
        if (rolloverToolButtonBorder == null) {
            rolloverToolButtonBorder = new RolloverToolButtonBorder();
        }
        return rolloverToolButtonBorder;
    }

    public static Border getMenuItemBorder() {
        if (menuItemBorder == null) {
            menuItemBorder = new MenuItemBorder();
        }
        return menuItemBorder;
    }

    public static Border getPopupMenuBorder() {
        if (popupMenuBorder == null) {
            popupMenuBorder = new PopupMenuBorder();
        }
        return popupMenuBorder;
    }

    public static Border getInternalFrameBorder() {
        if (internalFrameBorder == null) {
            internalFrameBorder = new InternalFrameBorder();
        }
        return internalFrameBorder;
    }

    public static Border getToolBarBorder() {
        if (toolBarBorder == null) {
            toolBarBorder = new ToolBarBorder();
        }
        return toolBarBorder;
    }

//------------------------------------------------------------------------------------
// Inner classes
//------------------------------------------------------------------------------------
    public static class ButtonBorder implements Border, UIResource {

        private static final Color DEFAULT_COLOR_HI = new Color(220, 230, 245);
        private static final Color DEFAULT_COLOR_LO = new Color(212, 224, 243);
        private static final Insets INSETS = new Insets(3, 4, 3, 4);

        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
            Graphics2D g2D = (Graphics2D) g;
            AbstractButton button = (AbstractButton) c;
            Color frameColor = AbstractLookAndFeel.getTheme().getFrameColor();
            if (AbstractLookAndFeel.getTheme().doShowFocusFrame() && button.hasFocus()) {
                frameColor = AbstractLookAndFeel.getTheme().getFocusFrameColor();
            }
            if (!button.isEnabled()) {
                frameColor = ColorHelper.brighter(frameColor, 20);
            } else if (button.getModel().isRollover()) {
                frameColor = ColorHelper.darker(frameColor, 20);
            }
            if (AbstractLookAndFeel.getTheme().doDrawSquareButtons()) {
                Composite savedComposite = g2D.getComposite();
                AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
                g2D.setComposite(alpha);
                g2D.setColor(Color.white);
                g2D.drawLine(x, h - 1, x + w, h - 1);
                g2D.setComposite(savedComposite);
                if (button.getRootPane() != null && button.equals(button.getRootPane().getDefaultButton()) && !button.hasFocus()) {
                    g2D.setColor(ColorHelper.darker(frameColor, 20));
                    g2D.drawRect(x, y, w - 1, h - 2);
                    if (!button.getModel().isRollover()) {
                        g2D.setColor(DEFAULT_COLOR_HI);
                        g2D.drawRect(x + 1, y + 1, w - 3, h - 4);
                        g2D.setColor(DEFAULT_COLOR_LO);
                        g2D.drawRect(x + 2, y + 2, w - 5, h - 6);
                    }
                } else {
                    g2D.setColor(frameColor);
                    g2D.drawRect(x, y, w - 1, h - 2);
                }
            } else {

                Object savedRederingHint = g2D.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
                g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

                Composite saveComposite = g2D.getComposite();
                AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f);
                g2D.setComposite(alpha);
                g2D.setColor(Color.white);
                g2D.drawRoundRect(x, y, w - 1, h - 1, 6, 6);
                g2D.setComposite(saveComposite);

                if (button.getRootPane() != null && button.equals(button.getRootPane().getDefaultButton()) && !button.hasFocus()) {
                    g2D.setColor(ColorHelper.darker(frameColor, 20));
                    g2D.drawRoundRect(x, y, w - 1, h - 2, 6, 6);
                    if (!button.getModel().isRollover()) {
                        g2D.setColor(DEFAULT_COLOR_HI);
                        g2D.drawRoundRect(x + 1, y + 1, w - 3, h - 4, 6, 6);
                        g2D.setColor(DEFAULT_COLOR_LO);
                        g2D.drawRoundRect(x + 2, y + 2, w - 5, h - 6, 6, 6);
                    }
                } else {
                    g2D.setColor(frameColor);
                    g2D.drawRoundRect(x, y, w - 1, h - 2, 6, 6);
                    g2D.setColor(ColorHelper.brighter(frameColor, 20));
                    g2D.drawLine(x + 2, y, w - 3, y);
                    g2D.setColor(ColorHelper.darker(frameColor, 10));
                    g2D.drawLine(x + 2, h - 2, w - 3, h - 2);
                }

                g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, savedRederingHint);
            }
        }

        @Override
        public Insets getBorderInsets(Component c) {
            return INSETS;
        }

        public Insets getBorderInsets(Component c, Insets borderInsets) {
            borderInsets.left = INSETS.left;
            borderInsets.top = INSETS.top;
            borderInsets.right = INSETS.right;
            borderInsets.bottom = INSETS.bottom;
            return borderInsets;
        }

        @Override
        public boolean isBorderOpaque() {
            return true;
        }
        
    } // end of class ButtonBorder

    public static class RolloverToolButtonBorder implements Border, UIResource {

        private static final Insets INSETS = new Insets(1, 1, 1, 1);

        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
            AbstractButton button = (AbstractButton) c;
            ButtonModel model = button.getModel();
            Color loColor = ColorHelper.brighter(AbstractLookAndFeel.getFrameColor(), 50);
            if (model.isEnabled()) {
                if ((model.isPressed() && model.isArmed()) || model.isSelected()) {
                    Graphics2D g2D = (Graphics2D) g;
                    Composite composite = g2D.getComposite();
                    g.setColor(loColor);
                    g.drawRect(x, y, w - 1, h - 1);
                    AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.15f);
                    g2D.setComposite(alpha);
                    g.setColor(Color.black);
                    g.fillRect(x + 1, y + 1, w - 2, h - 2);
                    g2D.setComposite(composite);
                } else if (model.isRollover()) {
                    Graphics2D g2D = (Graphics2D) g;
                    Composite composite = g2D.getComposite();
                    g.setColor(loColor);
                    g.drawRect(x, y, w - 1, h - 1);
                    AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.4f);
                    g2D.setComposite(alpha);
                    g.setColor(Color.white);
                    g.fillRect(x + 1, y + 1, w - 2, h - 2);
                    g2D.setComposite(composite);
                }
            }
        }

        @Override
        public Insets getBorderInsets(Component c) {
            return new Insets(INSETS.top, INSETS.left, INSETS.bottom, INSETS.right);
        }

        public Insets getBorderInsets(Component c, Insets borderInsets) {
            borderInsets.left = INSETS.left;
            borderInsets.top = INSETS.top;
            borderInsets.right = INSETS.right;
            borderInsets.bottom = INSETS.bottom;
            return borderInsets;
        }

        @Override
        public boolean isBorderOpaque() {
            return true;
        }
        
    } // end of class RolloverToolButtonBorder

    public static class PopupMenuBorder extends BasePopupMenuBorder {

        private static final float SHOW_ALPHA[] = {0.6f, 0.4f, 0.2f, 0.1f};

        public PopupMenuBorder() {
            shadowSize = 4;
            leftLogoInsets = new Insets(1, 18, 1, 1);
            rightLogoInsets = new Insets(1, 1, 1, 18);
            insets = new Insets(1, 1, 1, 1);
        }

        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
            Graphics2D g2D = (Graphics2D) g;
            Color frameColor = AbstractLookAndFeel.getFrameColor();
            g.setColor(frameColor);
            if (JTattooUtilities.isLeftToRight(c)) {
                int dx = getBorderInsets(c).left;
                // Top

                if (hasLogo(c)) {
                    TextureUtils.fillComponent(g, c, x, y, dx, h - 1 - shadowSize, TextureUtils.ROLLOVER_TEXTURE_TYPE);
                    paintLogo(c, g, x, y, w, h);
                }
                g.setColor(frameColor);
                if (isMenuBarPopup(c)) {
                    g.drawLine(x + dx, y, x + w - shadowSize - 1, y);
                } else {
                    g.drawLine(x, y, x + w - shadowSize - 1, y);
                }
                // Left
                g.drawLine(x, y, x, y + h - shadowSize - 1);
                // Bottom
                g.drawLine(x, y + h - shadowSize - 1, x + w - shadowSize - 1, y + h - shadowSize - 1);
                // Right
                g.drawLine(x + w - shadowSize - 1, y, x + w - shadowSize - 1, y + h - shadowSize - 1);
            } else {
                int dx = getBorderInsets(c).right - shadowSize;
                // Top
                if (hasLogo(c)) {
                    TextureUtils.fillComponent(g, c, x + w - dx - shadowSize, y, dx - 1, h - 1 - shadowSize, TextureUtils.ROLLOVER_TEXTURE_TYPE);
                    paintLogo(c, g, x, y, w, h);
                }
                g.setColor(frameColor);
                if (isMenuBarPopup(c)) {
                    g.drawLine(x, y, x + w - dx - shadowSize - 1, y);
                } else {
                    g.drawLine(x, y, x + w - shadowSize - 1, y);
                }

                // Left
                g.drawLine(x, y, x, y + h - shadowSize - 1);
                // Bottom
                g.drawLine(x, y + h - shadowSize - 1, x + w - shadowSize - 1, y + h - shadowSize - 1);
                // Right
                g.drawLine(x + w - shadowSize - 1, y, x + w - shadowSize - 1, y + h - shadowSize - 1);
            }

            // paint the shadow
            Composite savedComposite = g2D.getComposite();
            g2D.setColor(Color.black);
            for (int i = 0; i < shadowSize; i++) {
                AlphaComposite alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, SHOW_ALPHA[i]);
                g2D.setComposite(alpha);
                // bottom
                g.drawLine(x + shadowSize, y + h - shadowSize + i, x + w - shadowSize + i, y + h - shadowSize + i);
                // right
                g.drawLine(x + w - shadowSize + i, y + shadowSize, x + w - shadowSize + i, y + h - shadowSize - 1 + i);
            }
            g2D.setComposite(savedComposite);
        }
        
    } // end of class PopupMenuTextureBorder

    public static class MenuItemBorder extends AbstractBorder implements UIResource {

        private static final Insets INSETS = new Insets(2, 2, 2, 2);

        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
            JMenuItem b = (JMenuItem) c;
            ButtonModel model = b.getModel();
            Color frameColor = AbstractLookAndFeel.getFrameColor();
            if (c.getParent() instanceof JMenuBar) {
                if (model.isArmed() || model.isSelected()) {
                    g.setColor(frameColor);
                    g.drawLine(x, y, x + w - 1, y);
                    g.drawLine(x, y, x, y + h - 1);
                    g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1);
                }
            } else {
                if (model.isArmed() || (c instanceof JMenu && model.isSelected())) {
                    g.setColor(frameColor);
                    g.drawLine(x, y, x + w - 1, y);
                    g.drawLine(x, y + h - 1, x + w - 1, y + h - 1);
                }
            }
        }

        @Override
        public Insets getBorderInsets(Component c) {
            return new Insets(INSETS.top, INSETS.left, INSETS.bottom, INSETS.right);
        }

        @Override
        public Insets getBorderInsets(Component c, Insets borderInsets) {
            borderInsets.left = INSETS.left;
            borderInsets.top = INSETS.top;
            borderInsets.right = INSETS.right;
            borderInsets.bottom = INSETS.bottom;
            return borderInsets;
        }

        @Override
        public boolean isBorderOpaque() {
            return false;
        }
        
    } // end of class MenuItemBorder

    public static class InternalFrameBorder extends BaseInternalFrameBorder {

        private static final Color FRAME_BORDER_COLOR = new Color(128, 128, 128);
        private static final Color FRAME_COLORS[] = new Color[]{new Color(144, 144, 144), new Color(180, 180, 180), new Color(216, 216, 216), new Color(236, 236, 236), new Color(164, 164, 164), new Color(196, 196, 196), new Color(184, 184, 184), new Color(172, 172, 172)};

        @Override
        public Insets getBorderInsets(Component c) {
            if (isResizable(c)) {
                return new Insets(5, 8, 6, 8);
            } else {
                return new Insets(PALETTE_INSETS.top, PALETTE_INSETS.left, PALETTE_INSETS.bottom, PALETTE_INSETS.right);
            }
        }

        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
            boolean isJFrameBorder = false;
            if (c instanceof JRootPane) {
                JRootPane jp = (JRootPane) c;
                if (jp.getParent() instanceof JFrame) {
                    isJFrameBorder = true;
                }
            }
            Graphics2D g2D = (Graphics2D) g;
            Composite savedComposite = g2D.getComposite();
//            if (!AbstractLookAndFeel.getTheme().isDarkTexture()) {
//                if (isActive(c)) {
//                    g.setColor(AbstractLookAndFeel.getTheme().getWindowBorderColor());
//                } else {
//                    g.setColor(AbstractLookAndFeel.getTheme().getWindowInactiveBorderColor());
//                }
//                g.drawRect(0, 0, w - 1, h - 1);
//                if (isActive(c)) {
//                    g.setColor(AbstractLookAndFeel.getTheme().getWindowTitleBackgroundColor());
//                } else {
//                    g.setColor(AbstractLookAndFeel.getTheme().getWindowInactiveTitleBackgroundColor());
//                }
//                g.drawRect(1, 1, w - 3, h - 3);
//                g.drawRect(2, 2, w - 5, h - 5);
//                g.drawRect(3, 3, w - 7, h - 7);
//                if (isActive(c)) {
//                    g.setColor(AbstractLookAndFeel.getTheme().getWindowBorderColor());
//                } else {
//                    g.setColor(AbstractLookAndFeel.getTheme().getWindowInactiveBorderColor());
//                }
//                g.drawRect(4, 4, w - 9, h - 9);
//                return;
//            } else
            if (!isJFrameBorder) {
                TextureUtils.fillComponent(g, c, 1, 1, w - 1, h - 1, TextureUtils.WINDOW_TEXTURE_TYPE);
                g.setColor(AbstractLookAndFeel.getTheme().getWindowBorderColor());
                g.drawRect(0, 0, w - 1, h - 1);
            } else {
                Insets bi = getBorderInsets(c);
                Color frameColor = AbstractLookAndFeel.getTheme().getWindowBorderColor();
                // top
                g.setColor(frameColor);
                g.drawLine(x, y, w, y);
                TextureUtils.fillComponent(g, c, 1, 1, w, bi.top - 1, TextureUtils.WINDOW_TEXTURE_TYPE);
                // bottom
                g.setColor(frameColor);
                g.drawLine(x, y + h - 1, w, y + h - 1);
                TextureUtils.fillComponent(g, c, 1, h - bi.bottom, w, bi.bottom - 1, TextureUtils.WINDOW_TEXTURE_TYPE);

                g.setColor(FRAME_BORDER_COLOR);
                g.drawLine(x, y, x, y + h);
                g.drawLine(x + w - 1, y, x + w - 1, y + h);
                // left
                for (int i = 1; i < FRAME_COLORS.length; i++) {
                    g2D.setColor(FRAME_COLORS[i]);
                    g2D.drawLine(i, 0, i, h);
                }
                // right
                for (int i = 0; i < FRAME_COLORS.length - 1; i++) {
                    g2D.setColor(FRAME_COLORS[i]);
                    g2D.drawLine(w - 8 + i, 0, w - 8 + i, h);
                }
                g.setColor(ColorHelper.brighter(FRAME_BORDER_COLOR, 20));
                g.drawLine(x, y, x + bi.left - 1, y);
                g.drawLine(x + w - bi.right, y, x + w - 1, y);

            } // JFrame border
            if (isResizable(c)) {
                // top
                float alphaValue = 0.4f;
                float alphaDelta = 0.1f;
                g2D.setColor(Color.white);
                if (!AbstractLookAndFeel.getTheme().isDarkTexture()) {
                    alphaValue = 0.8f;
                    alphaDelta = 0.2f;
                }
                for (int i = 1; i < 5; i++) {
                    g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alphaValue));
                    g2D.drawLine(1, i, w - 2, i);
                    alphaValue -= alphaDelta;
                }
                // bottom
                alphaValue = 0.3f;
                alphaDelta = 0.05f;
                g2D.setColor(Color.black);
                if (!AbstractLookAndFeel.getTheme().isDarkTexture()) {
                    alphaValue = 0.14f;
                    alphaDelta = 0.02f;
                }
                for (int i = 1; i < 6; i++) {
                    g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alphaValue));
                    g2D.drawLine(1, h - i, w - 2, h - i);
                    alphaValue -= alphaDelta;
                }
            }
            g2D.setComposite(savedComposite);
        }
        
    } // end of class InternalFrameBorder

    public static class ToolBarBorder extends AbstractBorder implements UIResource, SwingConstants {

        private static final LazyImageIcon HOR_RUBBER_ICON = new LazyImageIcon("texture/icons/HorRubber.gif");
        private static final LazyImageIcon VER_RUBBER_ICON = new LazyImageIcon("texture/icons/VerRubber.gif");

        @Override
        public void paintBorder(Component c, Graphics g, int x, int y, int w, int h) {
            if (((JToolBar) c).isFloatable()) {
                if (((JToolBar) c).getOrientation() == HORIZONTAL) {
                    int x1 = 4;
                    int y1 = (h - HOR_RUBBER_ICON.getIconHeight()) / 2;
                    HOR_RUBBER_ICON.paintIcon(c, g, x1, y1);
                } else {
                    int x1 = (w - VER_RUBBER_ICON.getIconWidth()) / 2 + 2;
                    int y1 = 4;
                    VER_RUBBER_ICON.paintIcon(c, g, x1, y1);
                }
            }
        }

        @Override
        public Insets getBorderInsets(Component c) {
            Insets insets = new Insets(2, 2, 2, 2);
            if (((JToolBar) c).isFloatable()) {
                if (((JToolBar) c).getOrientation() == HORIZONTAL) {
                    if (JTattooUtilities.isLeftToRight(c)) {
                        insets.left = 15;
                    } else {
                        insets.right = 15;
                    }
                } else {
                    insets.top = 15;
                }
            }
            Insets margin = ((JToolBar) c).getMargin();
            if (margin != null) {
                insets.left += margin.left;
                insets.top += margin.top;
                insets.right += margin.right;
                insets.bottom += margin.bottom;
            }
            return insets;
        }

        public Insets getBorderInsets(Component c, Insets borderInsets) {
            Insets insets = getBorderInsets(c);
            borderInsets.left = insets.left;
            borderInsets.top = insets.top;
            borderInsets.right = insets.right;
            borderInsets.bottom = insets.bottom;
            return borderInsets;
        }
    } // end of class ToolBarBorder
    
} // end of class TextureBorders





© 2015 - 2024 Weber Informatics LLC | Privacy Policy