/*
 * @(#)$RCSfile: TextPanelSettings.java,v $ $Revision: 1.2 $ $Date: 2002/02/16 03:06:48 $
 *
 * (C) Copyright IBM Corp. 1998-1999.  All Rights Reserved.
 *
 * The program is provided "as is" without any warranty express or
 * implied, including the warranty of non-infringement and the implied
 * warranties of merchantibility and fitness for a particular purpose.
 * IBM will not be liable for any damages suffered by you as a result
 * of using the Program. In no event will IBM be liable for any
 * special, indirect or consequential damages or lost profits even if
 * IBM has been advised of the possibility of their occurrence. IBM
 * will not be liable for any third party claims against you.
 */
package com.ibm.richtext.textpanel;

import java.awt.Color;
import java.io.Serializable;
import java.util.Hashtable;

import com.ibm.richtext.textlayout.attributes.AttributeMap;
import com.ibm.richtext.textlayout.attributes.TextAttribute;
import com.ibm.richtext.styledtext.StandardTabRuler;

/**
 * This class contains settings used when constructing an MTextPanel.
 * The settings controled by this class include:
 * <ul>
 * <li>whether the text in the MTextPanel can be scrolled</li>
 * <li>whether scroll bars in the MTextPanel are visible</li>
 * <li>whether the text in the MTextPanel can be selected</li>
 * <li>whether the text in the MTextPanel can be edited</li>
 * <li>whether lines of text wrap to the MTextPanel's width, or
 * only end at paragraph separators</li>
 * <li>the default values for unspecified styles</li>
 * </ul>
 * Some settings are dependent on others.  Scroll bars are visible
 * only if the text is scrollable.  Also, text which is not editable
 * if it is not selectable.
 * <p>
 *
 * @see MTextPanel
 */
public final class TextPanelSettings implements Cloneable, Serializable {

    static final String COPYRIGHT =
                "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";
    
    private static final AttributeMap DEFAULTS;
    static {
        final Float floatZero = new Float(0.0f);

        Hashtable defaults = new Hashtable();
        defaults.put(TextAttribute.FAMILY, "Serif");
        defaults.put(TextAttribute.WEIGHT, new Float(1.0f));
        defaults.put(TextAttribute.POSTURE, floatZero);
        defaults.put(TextAttribute.SIZE, new Float(18.0f));
        defaults.put(TextAttribute.SUPERSCRIPT, new Integer(0));
        defaults.put(TextAttribute.FOREGROUND, Color.black);
        defaults.put(TextAttribute.UNDERLINE, new Integer(-1));
        defaults.put(TextAttribute.STRIKETHROUGH, Boolean.FALSE);

        defaults.put(TextAttribute.EXTRA_LINE_SPACING, floatZero);
        defaults.put(TextAttribute.FIRST_LINE_INDENT, floatZero);
        defaults.put(TextAttribute.MIN_LINE_SPACING, floatZero);
        defaults.put(TextAttribute.LINE_FLUSH, TextAttribute.FLUSH_LEADING);
        defaults.put(TextAttribute.LEADING_MARGIN, floatZero);
        defaults.put(TextAttribute.TRAILING_MARGIN, floatZero);
        defaults.put(TextAttribute.TAB_RULER, new StandardTabRuler());

        DEFAULTS = new AttributeMap(defaults);
    }
    
    private boolean fScrollable = true;
    private boolean fScrollBarsVisible = true;
    private boolean fSelectable = true;
    private boolean fEditable = true;
    private boolean fWraps = true;
    private AttributeMap fDefaultValues = DEFAULTS;
    
    /**
     * Create a TextPanelSettings instance with all settings
     * set to true.
     */
    public TextPanelSettings() {
    }

    /**
     * Return a new TextPanelSettings instance with the
     * same settings as this.
     * @return a new TextPanelSettings instance
     */
    public Object clone() {

        TextPanelSettings rhs = new TextPanelSettings();

        rhs.fScrollable = fScrollable;
        rhs.fScrollBarsVisible = fScrollBarsVisible;
        rhs.fSelectable = fSelectable;
        rhs.fEditable = fEditable;
        rhs.fWraps = fWraps;
        rhs.fDefaultValues = fDefaultValues;
        
        return rhs;
    }

    /**
     * Return the scrollable setting, which determines whether text
     * in an MTextPanel can be scrolled.
     * @return the scrollable setting
     */
    public boolean getScrollable() {

        return fScrollable;
    }

    /**
     * Set the scrollable setting.
     * @param scrollable the scrollable setting.  If false,
     * the scrollBarsVisible setting is also set to false.
     */
    public void setScrollable(boolean scrollable) {

        fScrollable = scrollable;
        fScrollBarsVisible &= scrollable;
    }

    /**
     * Return the scrollBarsVisible setting, which determines whether
     * scroll bars in an MTextPanel are visible.
     * @return the scrollBarsVisible setting
     */
    public boolean getScrollBarsVisible() {

        return fScrollBarsVisible;
    }

    /**
     * Set the scrollBarsVisible setting.
     * @param vis the scrollBarsVisible setting.  If true,
     * the scrollable setting is also set to true.
     */
    public void setScrollBarsVisible(boolean vis) {

        fScrollBarsVisible = vis;
        fScrollable |= vis;
    }

    /**
     * Return the selectable setting, which determines whether
     * text in an MTextPanel can be selected.
     * @return the selectable setting
     */
    public boolean getSelectable() {

        return fSelectable;
    }

    /**
     * Set the selectable setting.
     * @param selectable the selectable setting.  If false,
     * the editable setting is also set to false.
     */
    public void setSelectable(boolean selectable) {

        fSelectable = selectable;
        fEditable &= selectable;
    }

    /**
     * Return the editable setting, which determines whether
     * text in an MTextPanel can be edited.
     * @return the editable setting
     */
    public boolean getEditable() {

        return fEditable;
    }

    /**
     * Set the editable setting.
     * @param selectable the selectable setting.  If true,
     * the selectable setting is also set to true.
     */
    public void setEditable(boolean editable) {

        fEditable = editable;
        fSelectable |= editable;
    }

    /**
     * Return the wraps setting, which determines whether
     * lines of text wrap to the length of the MTextPanel,
     * or only at paragraph separators.
     * @return the wraps setting
     */
    public boolean getWraps() {

        return fWraps;
    }

    /**
     * Set the wraps setting.
     * @param wraps the wraps setting
     */
    public void setWraps(boolean wraps) {

        fWraps = wraps;
    }
    
    /**
     * Return the AttributeMap of default values for certain keys.
     * When a key in this AttributeMap is not specified, its value
     * is taken from this AttributeMap.
     * @return the AttributeMap of default values
     * @see MTextPanel#getDefaultValues
     */
    public AttributeMap getDefaultValues() {
    
        return fDefaultValues;
    }
    
    /**
     * Add the key-value pairs in the given AttributeMap to the
     * default values.  If a key does not appear in the given
     * AttributeMap, its value in the default value map is
     * unchanged.
     * @param map an AttributeMap containing new default values
     */
    public void addDefaultValues(AttributeMap map) {
    
        fDefaultValues = fDefaultValues.addAttributes(map);
    }
    
    /**
     * Compare this to another Object.  This is equal
     * to another Object if the other Object is a
     * TextPanelSettings instance with the same
     * settings as this one.
     * @param rhs the Object to compare to
     */
    public boolean equals(Object rhs) {

        if (rhs == this) {
            return true;
        }

        if (rhs == null) {
            return false;
        }

        TextPanelSettings other;
        try {
            other = (TextPanelSettings) rhs;
        }
        catch(ClassCastException e) {
            return false;
        }
        
        return other.fScrollable == this.fScrollable &&
               other.fScrollBarsVisible == this.fScrollBarsVisible &&
               other.fSelectable == this.fSelectable &&
               other.fEditable == this.fEditable &&
               other.fWraps == this.fWraps &&
               other.fDefaultValues.equals(this.fDefaultValues);
    }

    /**
     * Return the hash code for this Object.
     * @return the hash code for this Object
     */
    public int hashCode() {

        int code = fDefaultValues.hashCode();
        code = code*2 + (fScrollable? 1:0);
        code = code*2 + (fScrollBarsVisible? 1:0);
        code = code*2 + (fSelectable? 1:0);
        code = code*2 + (fEditable? 1:0);
        code = code*2 + (fWraps? 1:0);

        return code;
    }
}