/*
 * $Id: LabelProperties.java,v 1.2 2008/07/12 11:36:53 dbarashev Exp $
 *
 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library 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
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package org.jdesktop.swingx;

import java.awt.Color;
import java.awt.Font;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.table.TableCellRenderer;

/**
 * Class used to store label properties in a single object so that they
 * may be applied as a set on renderers.
 * @author Amy Fowler
 * @version 1.0
 */

public class LabelProperties extends JLabel {
    private static final int BACKGROUND_SET = 1;
    private static final int FOREGROUND_SET = 2;
    private static final int FONT_SET = 4;
    private static final int HORIZONTAL_ALIGNMENT_SET = 8;
    private static final int HORIZONTAL_TEXT_POSITION_SET = 16;
    private static final int ICON_SET = 32;
    private static final int ICON_TEXT_GAP_SET = 64;
    private static final int TEXT_SET = 128;
    private static final int VERTICAL_ALIGNMENT_SET = 256;
    private static final int VERTICAL_TEXT_POSITION_SET = 512;

    private int setFlags = 0;

    public LabelProperties() {
        super();
        addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent e) {
                String propertyName = e.getPropertyName();
                Object value = e.getNewValue();
                if (propertyName.equals("background")) {
                    if (value != null) {
                        setFlags |= BACKGROUND_SET;
                    } else {
                        setFlags &= (~BACKGROUND_SET);
                    }
                }
                else if (propertyName.equals("font")) {
                    if (value != null) {
                        setFlags |= FONT_SET;
                    } else {
                        setFlags &= (~FONT_SET);
                    }
                }
                else if (propertyName.equals("foreground")) {
                    if (value != null) {
                        setFlags |= FOREGROUND_SET;
                    } else {
                        setFlags &= (~FOREGROUND_SET);
                    }
                }
                else if (propertyName.equals("horizontalAlignment")) {
                    if (value != null && ((Integer)value).intValue() != -1) {
                        setFlags |= HORIZONTAL_ALIGNMENT_SET;
                    } else {
                        setFlags &= (~HORIZONTAL_ALIGNMENT_SET);
                    }
                }
                else if (propertyName.equals("horizontalTextPosition")) {
                    if (value != null && ((Integer)value).intValue() != -1) {
                        setFlags |= HORIZONTAL_TEXT_POSITION_SET;
                    } else {
                        setFlags &= (~HORIZONTAL_TEXT_POSITION_SET);
                    }
                }
                else if (propertyName.equals("icon")) {
                    if (value != null) {
                        setFlags |= ICON_SET;
                    } else {
                        setFlags &= (~ICON_SET);
                    }
                }
                else if (propertyName.equals("iconTextGap")) {
                    if (value != null && ((Integer)value).intValue() != -1) {
                        setFlags |= ICON_TEXT_GAP_SET;
                    } else {
                        setFlags &= (~ICON_TEXT_GAP_SET);
                    }
                }
                else if (propertyName.equals("text")) {
                    if (value != null) {
                        setFlags |= TEXT_SET;
                    } else {
                        setFlags &= (~TEXT_SET);
                    }
                }
                else if (propertyName.equals("verticalAlignment")) {
                    if (value != null && ((Integer)value).intValue() != -1) {
                        setFlags |= VERTICAL_ALIGNMENT_SET;
                    } else {
                        setFlags &= (~VERTICAL_ALIGNMENT_SET);
                    }
                }
                else if (propertyName.equals("verticalTextPosition")) {
                    if (value != null && ((Integer)value).intValue() != -1) {
                        setFlags |= VERTICAL_TEXT_POSITION_SET;
                    } else {
                        setFlags &= (~VERTICAL_TEXT_POSITION_SET);
                    }
                }
            }
        });
    }

    public LabelProperties(Color background, Color foreground, Font font,
                           int horizontalAlignment, int horizontalTextPosition,
                           int verticalAlignment, int verticalTextPosition,
                           Icon icon, int iconTextGap, String text) {
        this();
        setBackground(background);
        setForeground(foreground);
        setFont(font);
        setHorizontalAlignment(horizontalAlignment);
        setHorizontalTextPosition(horizontalTextPosition);
        setVerticalAlignment(verticalAlignment);
        setVerticalTextPosition(verticalTextPosition);
        setIcon(icon);
        setIconTextGap(iconTextGap);
        setText(text);
    }

    @Override
    public boolean isBackgroundSet() {
        return (setFlags & BACKGROUND_SET) > 0;
    }

    @Override
    public boolean isForegroundSet() {
        return (setFlags & FOREGROUND_SET) > 0;
    }

    @Override
    public boolean isFontSet() {
        return (setFlags & FONT_SET) > 0;
    }

    public boolean isHorizontalAlignmentSet() {
        return (setFlags & HORIZONTAL_ALIGNMENT_SET) > 0;
    }

    public boolean isHorizontalTextPositionSet() {
        return (setFlags & HORIZONTAL_TEXT_POSITION_SET) > 0;
    }

    public boolean isIconSet() {
        return (setFlags & ICON_SET) > 0;
    }

    public boolean isIconTextGapSet() {
        return (setFlags & ICON_TEXT_GAP_SET) > 0;
    }

    public boolean isTextSet() {
        return (setFlags & TEXT_SET) > 0;
    }

    public boolean isVerticalAlignmentSet() {
        return (setFlags & VERTICAL_ALIGNMENT_SET) > 0;
    }

    public boolean isVerticalTextPositionSet() {
        return (setFlags & VERTICAL_TEXT_POSITION_SET) > 0;
    }

    public boolean noPropertiesSet() {
        return setFlags == 0;
    }

    public void applyPropertiesTo(JLabel label) {
        if (noPropertiesSet()) {
            return;
        }
        if (isBackgroundSet()) {
            label.setBackground(getBackground());
        }
        if (isForegroundSet()) {
            label.setForeground(getForeground());
        }
        if (isFontSet()) {
            label.setFont(getFont());
        }
        if (isHorizontalAlignmentSet()) {
            label.setHorizontalAlignment(getHorizontalAlignment());
        }
        if (isHorizontalTextPositionSet()) {
            label.setHorizontalTextPosition(getHorizontalTextPosition());
        }
        if (isIconSet()) {
            label.setIcon(getIcon());
        }
        if (isIconTextGapSet()) {
            label.setIconTextGap(getIconTextGap());
        }
        if (isTextSet()) {
            label.setText(getText());
        }
        if (isVerticalAlignmentSet()) {
            label.setVerticalAlignment(getVerticalAlignment());
        }
        if (isVerticalTextPositionSet()) {
            label.setVerticalTextPosition(getVerticalTextPosition());
        }
    }

    public void applyPropertiesTo(AbstractButton button) {
         if (noPropertiesSet()) {
             return;
         }
         if (isBackgroundSet()) {
             button.setBackground(getBackground());
         }
         if (isForegroundSet()) {
             button.setForeground(getForeground());
         }
         if (isFontSet()) {
             button.setFont(getFont());
         }
         if (isHorizontalAlignmentSet()) {
             button.setHorizontalAlignment(getHorizontalAlignment());
         }
         if (isHorizontalTextPositionSet()) {
             button.setHorizontalTextPosition(getHorizontalTextPosition());
         }
         if (isIconSet()) {
             button.setIcon(getIcon());
         }
         if (isIconTextGapSet()) {
             button.setIconTextGap(getIconTextGap());
         }
         if (isTextSet()) {
             button.setText(getText());
         }
         if (isVerticalAlignmentSet()) {
             button.setVerticalAlignment(getVerticalAlignment());
         }
         if (isVerticalTextPositionSet()) {
             button.setVerticalTextPosition(getVerticalTextPosition());
         }
     }

     public void applyPropertiesTo(LabelProperties props) {
         if (noPropertiesSet()) {
             return;
         }
         if (isBackgroundSet()) {
             props.setBackground(getBackground());
         }
         if (isForegroundSet()) {
             props.setForeground(getForeground());
         }
         if (isFontSet()) {
             props.setFont(getFont());
         }
         if (isHorizontalAlignmentSet()) {
             props.setHorizontalAlignment(getHorizontalAlignment());
         }
         if (isHorizontalTextPositionSet()) {
             props.setHorizontalTextPosition(getHorizontalTextPosition());
         }
         if (isIconSet()) {
             props.setIcon(getIcon());
         }
         if (isIconTextGapSet()) {
             props.setIconTextGap(getIconTextGap());
         }
         if (isTextSet()) {
             props.setText(getText());
         }
         if (isVerticalAlignmentSet()) {
             props.setVerticalAlignment(getVerticalAlignment());
         }
         if (isVerticalTextPositionSet()) {
             props.setVerticalTextPosition(getVerticalTextPosition());
         }
     }

     public void applyPropertiesTo(TableCellRenderer renderer) {
         if (renderer instanceof JLabel) {
             applyPropertiesTo( (JLabel) renderer);
         }
         else if (renderer instanceof AbstractButton) {
             applyPropertiesTo( (AbstractButton) renderer);
         }
     }
}
