blob: 787118668cfe7c38a89924ae4a30b15d200dac96 [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;
import org.w3c.dom.Node;
import org.w3c.dom.NamedNodeMap;
/**
* An object of class <code>Style</code> represents a <i>style</i>
* in an OpenOffice document. In practice subclasses of this
* <code>Style</code>, such as <code>TextStyle</code>,
* <code>ParaStyle</code> are used.
*
* @author David Proulx
* @see <a href="TextStyle.html">TextStyle</a>,
* <a href="ParaStyle.html">ParaStyle</a>
*/
public class Style {
/** Name of the <code>Style</code>. */
protected String name = null;
/** Family of the <code>Style</code>. */
protected String family = null;
/** Parent of the <code>Style</code>. */
protected String parent = null;
/**
* A reference to the <code>StyleCatalog</code> to be used for
* looking up ancestor <code>Style</code> objects.
*/
protected StyleCatalog sc;
/**
* Constructor for use when going from DOM to client device format.
*
* @param node A <i>style:style</i> or <i>style:default-style</i>
* <code>Node</code> from the document being parsed.
* No checking of <code>Node</code> is done, so if it
* is not of the proper type the results will be
* unpredictable.
* @param sc The <code>StyleCatalog</code>, which is used for
* looking up ancestor <code>Style</code> objects.
*/
public Style(Node node, StyleCatalog sc) {
this.sc = sc;
// Run through the attributes of this node, saving
// the ones we're interested in.
if (node.getNodeName().equals("style:default-style"))
name = "DEFAULT_STYLE";
NamedNodeMap attrNodes = node.getAttributes();
if (attrNodes != null) {
int len = attrNodes.getLength();
for (int i = 0; i < len; i++) {
Node attr = attrNodes.item(i);
if (attr.getNodeName().equals("style:family"))
family = attr.getNodeValue();
else if (attr.getNodeName().equals("style:name")) {
name = attr.getNodeValue();
} else if (attr.getNodeName().equals("style:parent-style-name"))
parent = attr.getNodeValue();
}
}
}
/**
* Constructor for use when going from client device format to DOM.
*
* @param name Name of the <code>Style</code>. Can be null.
* @param family Family of the <code>Style</code> - usually
* <i>paragraph</i>, <i>text</i>, etc. Can be null.
* @param parent Name of the parent <code>Style</code>, or null if none.
* @param sc The <code>StyleCatalog</code>, which is used for
* looking up ancestor <code>Style</code> objects.
*/
public Style(String name, String family, String parent, StyleCatalog sc) {
this.sc = sc;
this.name = name;
this.family = family;
this.parent = parent;
}
/**
* Set the <code>StyleCatalog</code> to be used when looking up the
* <code>Style</code> parent.
*
* @param sc The <code>StyleCatalog</code>, which is used for
* looking up ancestor <code>Style</code> objects.
*/
public void setCatalog(StyleCatalog sc) {
this.sc = sc;
}
/**
* Returns the name of this <code>Style</code>.
*
* @return The name of this <code>Style</code>.
*/
public String getName() {
return name;
}
/**
* Sets the name of this <code>Style</code>.
*
* @param newName The new name of this <code>Style</code>.
*/
public void setName(String newName) {
name = newName;
}
/**
* Return the family of this <code>Style</code>.
*
* @return The family of this <code>Style</code>.
*/
public String getFamily() {
return family;
}
/**
* Return the name of the parent of this <code>Style</code>.
*
* @return The parent of this <code>Style</code>.
*/
public String getParent() {
return parent;
}
/**
* Return a <code>Style</code> object corresponding to this one, but with
* all of the inherited information from parent <code>Style</code>
* objects filled in. The object returned will be a new object, not a
* reference to this object, even if it does not need any information
* added.
*
* @return A resolved <code>Style</code> object in which to look up
* ancestors.
*/
public Style getResolved() {
return new Style(name, family, parent, sc);
}
/**
* Write a <code>Node</code> in <code>parentDoc</code>
* representing this <code>Style</code>. Note that the
* <code>Node</code> is returned unconnected.
*
* @param parentDoc Document to which new <code>Node</code> will
* belong.
* @param name Name to use for new <code>Node</code>.
*/
public Node createNode(org.w3c.dom.Document parentDoc, String name) {
// DJP: write this! Should call writeAttributes()
return null;
}
/**
* Write this <code>Style</code> object's attributes to the given
* <code>Node</code>. This may involve writing child
* <code>Node</code> objects as well. This is similar to the
* <code>writeNode</code> method, but the <code>Node</code>
* already exists, and this does <b>not</b> write the name,
* family, and parent attributes, which are assumed to already
* exist in the <code>Node</code>.
*
* @param node The <code>Node</code> to add style attributes.
*/
public void writeAttributes(Node node) {
}
/**
* Return true if <code>Style</code> is a subset of this one. Note
* that this will return true even if <code>Style</code> is less
* specific than this <code>Style</code>, so long as it does not
* contradict this <code>Style</code> in any way.
*
* This always returns true since only subclasses of
* <code>Style</code> contain any actual <code>Style</code>
* information.
*
* @param style The <code>Style</code> to check
*
* @return true if the <code>Style</code> is a subset, false otherwise.
*/
public boolean isSubset(Style style) {
return true;
}
}