blob: 4a0a5e3a73294d927f60217a8b3e673dcf37f4f4 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package org.openoffice.xmerge.converter.xml.sxc;
import java.awt.Color;
/**
* This class specifies the format for a given spreadsheet cell.
*
* @author Mark Murnane
* @author Martin Maher (Extended Style Support)
*/
public class Format implements Cloneable {
/** Horizontal Alignment Constants. */
final public static int RIGHT_ALIGN = 0x01;
final public static int CENTER_ALIGN = 0x02;
final public static int LEFT_ALIGN = 0x03;
final public static int JUST_ALIGN = 0x04;
/** Vertical Alignment Constants. */
final public static int TOP_ALIGN = 0x01;
final public static int MIDDLE_ALIGN = 0x02;
final public static int BOTTOM_ALIGN = 0x03;
/** Indicates <i>bold</i> text. */
final public static int BOLD = 0x01;
/** Indicates <i>italic</i> text. */
final public static int ITALIC = 0x02;
/** Indicates <i>underlined</i> text. */
final public static int UNDERLINE = 0x04;
/** Indicates <i>strike-through</i> in the text. */
final public static int STRIKETHRU = 0x08;
/** Indicates <i>superscripted</i> text. */
final public static int SUPERSCRIPT = 0x10;
/** Indicates <i>subscripted</i> text. */
final public static int SUBSCRIPT = 0x20;
final public static int LEFT_BORDER = 0x40;
final public static int RIGHT_BORDER = 0x80;
final public static int TOP_BORDER = 0x100;
final public static int BOTTOM_BORDER = 0x200;
final public static int WORD_WRAP = 0x400;
private int align;
private int vertAlign;
private String category;
private String value;
private String formatSpecifier;
private int decimalPlaces;
/** Font name. */
private String fontName;
/** Font size in points. */
protected int sizeInPoints;
private Color foreground, background;
/** Values of text attributes. */
protected int attributes = 0;
/** Bitwise mask of text attributes. */
protected int mask = 0;
/**
* Constructor for creating a new <code>Format</code>.
*/
public Format() {
clearFormatting();
}
/**
* Constructor that creates a new <code>Format</code> object
* by setting all the format attributes.
*
*/
public Format(int attributes, int fontSize, String fontName) {
this.attributes = attributes;
sizeInPoints = fontSize;
this.fontName = fontName;
}
/**
* Constructor for creating a new <code>Format</code> object
* based on an existing one.
*
* @param fmt <code>Format</code> to copy.
*/
public Format(Format fmt) {
category = fmt.getCategory();
value = fmt.getValue();
formatSpecifier = fmt.getFormatSpecifier();
decimalPlaces = fmt.getDecimalPlaces();
attributes = fmt.attributes;
mask = fmt.mask;
fontName = fmt.getFontName();
align = fmt.getAlign();
vertAlign = fmt.getVertAlign();
foreground = fmt.getForeground();
background = fmt.getBackground();
sizeInPoints = fmt.sizeInPoints;
}
/**
* Reset this <code>Format</code> description.
*/
public void clearFormatting() {
category = "";
value = "";
formatSpecifier = "";
decimalPlaces = 0;
attributes = 0;
mask = 0;
sizeInPoints = 10;
align = LEFT_ALIGN;
vertAlign = BOTTOM_ALIGN;
fontName = "";
foreground = null;
background = null;
}
/**
* Set one or more text attributes to <i>on</i>.
*
* @param flags Flag attributes to set <i>on</i>.
*/
public void setAttribute(int flags, boolean toggle) {
mask |= flags;
if(toggle) {
attributes |= flags;
} else {
attributes &= ~flags;
}
}
/**
* Return true if the <code>attribute</code> is set to <i>on</i>
*
* @param attribute Attribute to check ({@link #BOLD},
* {@link #ITALIC}, etc.)
*
* @return true if <code>attribute</code> is set to <i>on</i>,
* otherwise false.
*/
public boolean getAttribute(int attribute) {
if ((mask & attribute) == 0)
return false;
return (!((attributes & attribute) == 0));
}
/**
* Return true if text <code>attribute</code> is set in this
* <code>Style</code>.An attribute that is set may have a
* value of <i>on</i> or <i>off</i>.
*
* @param attribute The attribute to check ({@link #BOLD},
* {@link #ITALIC}, etc.).
*
* @return true if text <code>attribute</code> is set in this
* <code>Style</code>, false otherwise.
*/
public boolean isSet(int attribute) {
return (!((mask & attribute) == 0));
}
/**
* Set the formatting category of this object, ie number, date,
* currency.The <code>OfficeConstants</code> class contains string
* constants for the category types.
*
* @see org.openoffice.xmerge.converter.xml.OfficeConstants
*
* @param newCategory The name of the category to be set.
*/
public void setCategory(String newCategory) {
category = newCategory;
}
/**
* Return the formatting category of the object.
*
* @see org.openoffice.xmerge.converter.xml.OfficeConstants
*
* @return The formatting category of the object.
*/
public String getCategory() {
return category;
}
/**
* In the case of Formula returns the value of the formula.
*
* @return The value of the formula
*/
public String getValue() {
return value;
}
/**
* In the case of formula the contents are set as the formula string and
* the value of the formula is a formatting attribute.
*
* @param newValue the formuala value
*/
public void setValue(String newValue) {
value = newValue;
}
/**
* Set the <code>Format</code> specifier for this category.
*
* @param formatString The new <code>Format</code> specifier.
*/
public void setFormatSpecifier(String formatString) {
formatSpecifier = formatString;
}
/**
* Get the <code>Format</code> specifier for this category.
*
* @return <code>Format</code> specifier for this category.
*/
public String getFormatSpecifier() {
return formatSpecifier;
}
/**
* Set the precision of the number to be displayed.
*
* @param precision The number of decimal places to display.
*/
public void setDecimalPlaces(int precision) {
decimalPlaces = precision;
}
/**
* Get the number of decimal places displayed.
*
* @return Number of decimal places.
*/
public int getDecimalPlaces() {
return decimalPlaces;
}
/**
* Set the font used for this cell.
*
* @param fontName The name of the font.
*/
public void setFontName(String fontName) {
this.fontName = fontName;
}
/**
* Get the font used for this cell.
*
* @return The font name.
*/
public String getFontName() {
return fontName;
}
/**
* Set the font used for this cell.
*
* @param fontName The name of the font.
*/
public void setFontSize(int fontSize) {
sizeInPoints = fontSize;
}
/**
* Get the font used for this cell.
*
* @return The font name.
*/
public int getFontSize() {
return sizeInPoints;
}
/**
* Set the alignmen used for this cell.
*
* @param fontName The name of the font.
*/
public void setVertAlign(int vertAlign) {
this.vertAlign = vertAlign;
}
/**
* Get the alignment used for this cell.
*
* @return The font name.
*/
public int getVertAlign() {
return vertAlign;
}
/**
* Set the alignmen used for this cell.
*
* @param fontName The name of the font.
*/
public void setAlign(int align) {
this.align = align;
}
/**
* Get the alignment used for this cell.
*
* @return The font name.
*/
public int getAlign() {
return align;
}
/**
* Set the Foreground <code>Color</code> for this cell.
*
* @param color A <code>Color</code> object representing the
* foreground color.
*/
public void setForeground(Color c) {
if(c!=null)
foreground = new Color(c.getRGB());
}
/**
* Get the Foreground <code>Color</code> for this cell.
*
* @return Foreground <code>Color</code> value.
*/
public Color getForeground() {
return foreground;
}
/**
* Set the Background <code>Color</code> for this cell
*
* @param color A <code>Color</code> object representing
* the background color.
*/
public void setBackground(Color c) {
if(c!=null)
background = new Color(c.getRGB());
}
/**
* Get the Foreground <code>Color</code> for this cell
*
* @return Background <code>Color</code> value
*/
public Color getBackground() {
return background;
}
/**
* Get the Foreground <code>Color</code> for this cell
*
* @return Background <code>Color</code> value
*/
public String toString() {
return new String("Value : " + getValue() + " Category : " + getCategory());
}
/**
* Tests if the current <code>Format</code> object has default attribute
* values.
*
* @return true if it contains default value
*/
public boolean isDefault() {
Format rhs = new Format();
if (rhs.attributes!= attributes)
return false;
if (foreground!=rhs.foreground)
return false;
if (background!=rhs.background)
return false;
if (rhs.align!= align)
return false;
if (rhs.vertAlign!= vertAlign)
return false;
return true;
}
/**
* Return true if <code>style</code> specifies as much or less
* than this <code>Style</code>, and nothing it specifies
* contradicts this <code>Style</code>.
*
* @param style The <code>Style</code> to check.
*
* @return true if <code>style</code> is a subset, false
* otherwise.
*/
public boolean isSubset(Format rhs) {
if (rhs.getClass() != this.getClass())
return false;
if (rhs.attributes!= attributes)
return false;
if (rhs.sizeInPoints != 0) {
if (sizeInPoints != rhs.sizeInPoints)
return false;
}
if (fontName!=rhs.fontName)
return false;
if (foreground!=rhs.foreground)
return false;
if (background!=rhs.background)
return false;
if (rhs.align!= align)
return false;
if (rhs.vertAlign!= vertAlign)
return false;
return true;
}
}