swingx-master/swingx-core/src/main/java/org/jdesktop/swingx/plaf/SafeBorder.java
/*
 * Created on 04.11.2010
 *
 */
package org.jdesktop.swingx.plaf;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Component.BaselineResizeBehavior;

import javax.swing.border.AbstractBorder;
import javax.swing.plaf.UIResource;

/**
 * Wrapper around a delegate with the same behaviour as the delegate except that
 * it catches null insets (hack around Issue 1297-swingx which is core bug
 * 6739738)
 */
public class SafeBorder extends AbstractBorder implements UIResource {

    private AbstractBorder delegate;

    public SafeBorder(AbstractBorder delegate) {
        this.delegate = delegate;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int getBaseline(Component c, int width, int height) {
        return delegate.getBaseline(c, width, height);
    }

    /** 
     * {@inheritDoc}
     */
    @Override
    public BaselineResizeBehavior getBaselineResizeBehavior(Component c) {
        return delegate.getBaselineResizeBehavior(c);
    }

    /** 
     * {@inheritDoc}
     */
    @Override
    public Insets getBorderInsets(Component c, Insets insets) {
        Insets result = delegate.getBorderInsets(c, safeInsets(insets));
        return safeInsets(result);
    }

    /**
     * @param insets
     *            the insets to query
     * @return the insets supplied or an empty insets if the value is {@code null}
     */
    private Insets safeInsets(Insets insets) {
        return insets != null ? insets : new Insets(0, 0, 0, 0);
    }

    /** 
     * {@inheritDoc}
     */
    @Override
    public Insets getBorderInsets(Component c) {
        Insets result = delegate.getBorderInsets(c);
        return safeInsets(result);
    }

    /** 
     * {@inheritDoc}
     */
    @Override
    public Rectangle getInteriorRectangle(Component c, int x, int y, int width,
            int height) {
        return delegate.getInteriorRectangle(c, x, y, width, height);
    }

    /** 
     * {@inheritDoc}
     */
    @Override
    public boolean isBorderOpaque() {
        return delegate.isBorderOpaque();
    }

    /** 
     * {@inheritDoc}
     */
    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width,
            int height) {
        delegate.paintBorder(c, g, x, y, width, height);
    }
   
    
}
