blob: 6b4a12f9fd2b3cc276fa4310658cd2786a634d95 [file] [log] [blame]
/************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
*
* Use is subject to license terms.
*
* Licensed 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. You can also
* obtain a copy of the License at http://odftoolkit.org/docs/license.txt
*
* 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.odftoolkit.odfdom.incubator.doc.office;
import java.util.ArrayList;
import java.util.HashMap;
import org.odftoolkit.odfdom.pkg.OdfElement;
import org.odftoolkit.odfdom.pkg.OdfFileDom;
import org.odftoolkit.odfdom.dom.element.draw.DrawFillImageElement;
import org.odftoolkit.odfdom.dom.element.draw.DrawGradientElement;
import org.odftoolkit.odfdom.dom.element.draw.DrawHatchElement;
import org.odftoolkit.odfdom.dom.element.draw.DrawMarkerElement;
import org.odftoolkit.odfdom.dom.element.number.NumberBooleanStyleElement;
import org.odftoolkit.odfdom.dom.element.number.NumberTextStyleElement;
import org.odftoolkit.odfdom.dom.element.office.OfficeStylesElement;
import org.odftoolkit.odfdom.dom.style.OdfStyleFamily;
import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberCurrencyStyle;
import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberDateStyle;
import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberPercentageStyle;
import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberStyle;
import org.odftoolkit.odfdom.incubator.doc.number.OdfNumberTimeStyle;
import org.odftoolkit.odfdom.incubator.doc.style.OdfDefaultStyle;
import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
import org.odftoolkit.odfdom.incubator.doc.text.OdfTextOutlineStyle;
import org.w3c.dom.Node;
/**
* Convenient functionalty for the parent ODF OpenDocument element
*
*/
public class OdfOfficeStyles extends OfficeStylesElement {
private static final long serialVersionUID = 700763983193326060L;
// styles that are only in OdfOfficeStyles
private HashMap<OdfStyleFamily, OdfDefaultStyle> mDefaultStyles;
private HashMap<String, DrawMarkerElement> mMarker;
private HashMap<String, DrawGradientElement> mGradients;
private HashMap<String, DrawHatchElement> mHatches;
private HashMap<String, DrawFillImageElement> mFillImages;
private OdfTextOutlineStyle mOutlineStyle;
// styles that are common for OdfOfficeStyles and OdfOfficeAutomaticStyles
private OdfStylesBase mStylesBaseImpl;
public OdfOfficeStyles(OdfFileDom ownerDoc) {
super(ownerDoc);
mStylesBaseImpl = new OdfStylesBase();
}
/**
* Create an ODF style with style name and family
*
* @param name The style name
* @param family The style family
* @return The <code>OdfStyle</code> element
*/
public OdfStyle newStyle(String name, OdfStyleFamily family) {
OdfStyle newStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(OdfStyle.class);
newStyle.setStyleNameAttribute(name);
newStyle.setStyleFamilyAttribute(family.getName());
this.appendChild(newStyle);
return newStyle;
}
/**
* Retrieve or create ODF default style
*
* @param family The style family
* @return The code>OdfDefaultStyle</code> element
*/
public OdfDefaultStyle getOrCreateDefaultStyle(OdfStyleFamily family) {
OdfDefaultStyle style = getDefaultStyle(family);
if (style == null) {
style = ((OdfFileDom) this.ownerDocument).newOdfElement(OdfDefaultStyle.class);
style.setStyleFamilyAttribute(family.getName());
this.appendChild(style);
}
return style;
}
/**
* Create ODF TextListStyle
*
* @param name The style name
* @return The code>OdfTextListStyle</code> element
*/
public OdfTextListStyle newListStyle(String name) {
OdfTextListStyle newStyle = ((OdfFileDom) this.ownerDocument).newOdfElement(OdfTextListStyle.class);
newStyle.setStyleNameAttribute(name);
this.appendChild(newStyle);
return newStyle;
}
/**
* Retrieve or create ODF OutlineStyle
*
* @return The code>OdfTextOutlineStyle</code> element
*/
public OdfTextOutlineStyle getOrCreateOutlineStyle() {
if (mOutlineStyle == null) {
this.appendChild(((OdfFileDom) this.ownerDocument).newOdfElement(OdfTextOutlineStyle.class));
}
return mOutlineStyle;
}
/**
* Returns the <code>OdfTextOutlineStyle</code> element.
*
* @return a pointer to the outline stye or null if there is no such element
*/
public OdfTextOutlineStyle getOutlineStyle() {
return mOutlineStyle;
}
/**
* Returns the <code>OdfStyleDefaultStyle</code> element.
*
* @param familyType is the family for the default style
* @return the default style with the given family or null if there is no such default style
*/
public OdfDefaultStyle getDefaultStyle(OdfStyleFamily familyType) {
if (mDefaultStyles != null) {
return mDefaultStyles.get(familyType);
} else {
return null;
}
}
/**
* Returns an iterator for all <code>OdfStyleDefaultStyle</code> elements.
*
* @return iterator for all <code>OdfStyleDefaultStyle</code> elements
*/
public Iterable<OdfDefaultStyle> getDefaultStyles() {
if (mDefaultStyles != null) {
return mDefaultStyles.values();
} else {
return new ArrayList<OdfDefaultStyle>();
}
}
/**
* Returns the <code>DrawMarkerElement</code> element with the given name.
*
* @param name is the name of the marker
* @return the marker or null if there is no such marker
*/
public DrawMarkerElement getMarker(String name) {
if (mMarker != null) {
return mMarker.get(name);
} else {
return null;
}
}
/**
* Returns an iterator for all <code>DrawMarkerElement</code> elements.
*
* @return an iterator for all <code>DrawMarkerElement</code> elements
*/
public Iterable<DrawMarkerElement> getMarker() {
if (mMarker != null) {
return mMarker.values();
} else {
return new ArrayList<DrawMarkerElement>();
}
}
/**
* Returns the <code>DrawGradientElement</code> element with the given name.
*
* @param name is the name of the gradient
* @return the gradient or null if there is no such gradient
*/
public DrawGradientElement getGradient(String name) {
if (mGradients != null) {
return mGradients.get(name);
} else {
return null;
}
}
/**
* Returns an iterator for all <code>DrawGradientElement</code> elements.
*
* @return an iterator for all <code>DrawGradientElement</code> elements
*/
public Iterable<DrawGradientElement> getGradients() {
if (mGradients != null) {
return mGradients.values();
} else {
return new ArrayList<DrawGradientElement>();
}
}
/**
* Returns the <code>DrawHatchElement</code> element with the given name.
*
* @param name is the name of the hatch
* @return the hatch or null if there is no such hatch
*/
public DrawHatchElement getHatch(String name) {
if (mHatches != null) {
return mHatches.get(name);
} else {
return null;
}
}
/**
* Returns an iterator for all <code>DrawHatchElement</code> elements.
*
* @return an iterator for all <code>DrawHatchElement</code> elements
*/
public Iterable<DrawHatchElement> getHatches() {
if (mHatches != null) {
return mHatches.values();
} else {
return new ArrayList<DrawHatchElement>();
}
}
/**
* Returns the <code>DrawFillImageElement</code> element with the given name.
*
* @param name is the name of the fill image
* @return the fill image or null if there is no such fill image
*/
public DrawFillImageElement getFillImage(String name) {
if (mFillImages != null) {
return mFillImages.get(name);
} else {
return null;
}
}
/**
* Returns an iterator for all <code>DrawFillImageElement</code> elements.
*
* @return an iterator for all <code>DrawFillImageElement</code> elements
*/
public Iterable<DrawFillImageElement> getFillImages() {
if (mFillImages != null) {
return mFillImages.values();
} else {
return new ArrayList<DrawFillImageElement>();
}
}
/**
* Returns the <code>OdfStyle</code> element with the given name and family.
*
* @param name is the name of the style
* @param familyType is the family of the style
* @return the style or null if there is no such style
*/
public OdfStyle getStyle(String name, OdfStyleFamily familyType) {
return mStylesBaseImpl.getStyle(name, familyType);
}
/**
* Returns an iterator for all <code>OdfStyle</code> elements for the given family.
*
* @param familyType
* @return an iterator for all <code>OdfStyle</code> elements for the given family
*/
public Iterable<OdfStyle> getStylesForFamily(OdfStyleFamily familyType) {
return mStylesBaseImpl.getStylesForFamily(familyType);
}
/**
* Returns the <code>OdfTextListStyle</code> element with the given name.
*
* @param name is the name of the list style
* @return the list style or null if there is no such list style
*/
public OdfTextListStyle getListStyle(String name) {
return mStylesBaseImpl.getListStyle(name);
}
/**
* Returns an iterator for all <code>OdfTextListStyle</code> elements.
*
* @return an iterator for all <code>OdfTextListStyle</code> elements
*/
public Iterable<OdfTextListStyle> getListStyles() {
return mStylesBaseImpl.getListStyles();
}
/**
* Returns the <code>OdfNumberNumberStyle</code> element with the given name.
*
* @param name is the name of the number style
* @return the number style or null if there is no such number style
*/
public OdfNumberStyle getNumberStyle(String name) {
return mStylesBaseImpl.getNumberStyle(name);
}
/**
* Returns an iterator for all <code>OdfNumberNumberStyle</code> elements.
*
* @return an iterator for all <code>OdfNumberNumberStyle</code> elements
*/
public Iterable<OdfNumberStyle> getNumberStyles() {
return mStylesBaseImpl.getNumberStyles();
}
/**
* Returns the <code>OdfNumberDateStyle</code> element with the given name.
*
* @param name is the name of the date style
* @return the date style or null if there is no such date style
*/
public OdfNumberDateStyle getDateStyle(String name) {
return mStylesBaseImpl.getDateStyle(name);
}
/**
* Returns an iterator for all <code>OdfNumberDateStyle</code> elements.
*
* @return an iterator for all <code>OdfNumberDateStyle</code> elements
*/
public Iterable<OdfNumberDateStyle> getDateStyles() {
return mStylesBaseImpl.getDateStyles();
}
/**
* Returns the <code>OdfNumberPercentageStyle</code> element with the given name.
*
* @param name is the name of the percentage style
* @return the percentage style null if there is no such percentage style
*/
public OdfNumberPercentageStyle getPercentageStyle(String name) {
return mStylesBaseImpl.getPercentageStyle(name);
}
/**
* Returns an iterator for all <code>OdfNumberPercentageStyle</code> elements.
*
* @return an iterator for all <code>OdfNumberPercentageStyle</code> elements
*/
public Iterable<OdfNumberPercentageStyle> getPercentageStyles() {
return mStylesBaseImpl.getPercentageStyles();
}
/**
* Returns the <code>OdfNumberCurrencyStyle</code> element with the given name.
*
* @param name is the name of the currency style
* @return the currency style null if there is no such currency style
*/
public OdfNumberCurrencyStyle getCurrencyStyle(String name) {
return mStylesBaseImpl.getCurrencyStyle(name);
}
/**
* Returns an iterator for all <code>OdfNumberCurrencyStyle</code> elements.
*
* @return an iterator for all <code>OdfNumberCurrencyStyle</code> elements
*/
public Iterable<OdfNumberCurrencyStyle> getCurrencyStyles() {
return mStylesBaseImpl.getCurrencyStyles();
}
/**
* Returns the <code>OdfNumberTimeStyle</code> element with the given name.
*
* @param name is the name of the time style
* @return the time style null if there is no such time style
*/
public OdfNumberTimeStyle getTimeStyle(String name) {
return mStylesBaseImpl.getTimeStyle(name);
}
/**
* Returns an iterator for all <code>OdfNumberTimeStyle</code> elements.
*
* @return an iterator for all <code>OdfNumberTimeStyle</code> elements
*/
public Iterable<OdfNumberTimeStyle> getTimeStyles() {
return mStylesBaseImpl.getTimeStyles();
}
/**
* Returns the <code>NumberBooleanStyleElement</code> element with the given name.
*
* @param name is the name of the boolean style
* @return the boolean style null if there is no such boolean style
*/
public NumberBooleanStyleElement getBooleanStyle(String name) {
return mStylesBaseImpl.getBooleanStyle(name);
}
/**
* Returns an iterator for all <code>NumberBooleanStyleElement</code> elements.
*
* @return an iterator for all <code>NumberBooleanStyleElement</code> elements
*/
public Iterable<NumberBooleanStyleElement> getBooleanStyles() {
return mStylesBaseImpl.getBooleanStyles();
}
/**
* Returns the <code>OdfNumberTextStyle</code> element with the given name.
*
* @param name is the name of the text style
* @return the text style null if there is no such text style
*/
public NumberTextStyleElement getTextStyle(String name) {
return mStylesBaseImpl.getTextStyle(name);
}
/**
* Returns an iterator for all <code>OdfNumberTextStyle</code> elements.
*
* @return an iterator for all <code>OdfNumberTextStyle</code> elements
*/
public Iterable<NumberTextStyleElement> getTextStyles() {
return mStylesBaseImpl.getTextStyles();
}
@Override
protected void onOdfNodeInserted(OdfElement node, Node refNode) {
if (node instanceof OdfDefaultStyle) {
OdfDefaultStyle defaultStyle = (OdfDefaultStyle) node;
if (mDefaultStyles == null) {
mDefaultStyles = new HashMap<OdfStyleFamily, OdfDefaultStyle>();
}
mDefaultStyles.put(defaultStyle.getFamily(), defaultStyle);
} else if (node instanceof DrawMarkerElement) {
DrawMarkerElement marker = (DrawMarkerElement) node;
if (mMarker == null) {
mMarker = new HashMap<String, DrawMarkerElement>();
}
mMarker.put(marker.getDrawNameAttribute(), marker);
} else if (node instanceof DrawGradientElement) {
DrawGradientElement gradient = (DrawGradientElement) node;
if (mGradients == null) {
mGradients = new HashMap<String, DrawGradientElement>();
}
mGradients.put(gradient.getDrawNameAttribute(), gradient);
} else if (node instanceof DrawHatchElement) {
DrawHatchElement hatch = (DrawHatchElement) node;
if (mHatches == null) {
mHatches = new HashMap<String, DrawHatchElement>();
}
mHatches.put(hatch.getDrawNameAttribute(), hatch);
} else if (node instanceof DrawFillImageElement) {
DrawFillImageElement fillImage = (DrawFillImageElement) node;
if (mFillImages == null) {
mFillImages = new HashMap<String, DrawFillImageElement>();
}
mFillImages.put(fillImage.getDrawNameAttribute(), fillImage);
} else if (node instanceof OdfTextOutlineStyle) {
mOutlineStyle = (OdfTextOutlineStyle) node;
} else {
mStylesBaseImpl.onOdfNodeInserted(node, refNode);
}
}
@Override
protected void onOdfNodeRemoved(OdfElement node) {
if (node instanceof OdfDefaultStyle) {
if (mDefaultStyles != null) {
OdfDefaultStyle defaultStyle = (OdfDefaultStyle) node;
mDefaultStyles.remove(defaultStyle.getFamily());
}
} else if (node instanceof DrawMarkerElement) {
if (mMarker != null) {
DrawMarkerElement marker = (DrawMarkerElement) node;
mMarker.remove(marker.getDrawNameAttribute());
}
} else if (node instanceof DrawGradientElement) {
if (mGradients != null) {
DrawGradientElement gradient = (DrawGradientElement) node;
mGradients.remove(gradient.getDrawNameAttribute());
}
} else if (node instanceof DrawHatchElement) {
if (mHatches != null) {
DrawHatchElement hatch = (DrawHatchElement) node;
mHatches.remove(hatch.getDrawNameAttribute());
}
} else if (node instanceof DrawFillImageElement) {
if (mFillImages != null) {
DrawFillImageElement fillImage = (DrawFillImageElement) node;
mFillImages.remove(fillImage.getDrawNameAttribute());
}
} else if (node instanceof OdfTextOutlineStyle) {
if (mOutlineStyle == (OdfTextOutlineStyle) node) {
mOutlineStyle = null;
}
} else {
mStylesBaseImpl.onOdfNodeRemoved(node);
}
}
}