/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU
* General Public License Version 3 only ("GPL").
* You may not use this file except in compliance with the License.
* You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
* See the License for the specific language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*
*/
package org.jopendocument.io;
import java.util.Stack;
import org.jopendocument.model.office.OfficeAutomaticStyles;
import org.jopendocument.model.office.OfficeMasterStyles;
import org.jopendocument.model.office.OfficeStyles;
import org.jopendocument.model.style.StyleDefaultStyle;
import org.jopendocument.model.style.StyleMasterPage;
import org.jopendocument.model.style.StylePageLayout;
import org.jopendocument.model.style.StylePageLayoutProperties;
import org.jopendocument.model.style.StyleTextProperties;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
public class SaxStylesUnmarshaller extends DefaultHandler {
private OfficeStyles styles = new OfficeStyles();
private OfficeAutomaticStyles autoStyles;
private OfficeMasterStyles masterStyles;
private Stack<Object> stack;
private Object current;
public SaxStylesUnmarshaller() {
stack = new Stack<Object>();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attribs) {
/*
* for (int i = 0; i < this.stack.size(); i++) { System.out.print(" "); }
* System.out.println("Start:" + qName + " " + localName + " +" + attribs.getLocalName(0));
*/// if next element is complex, push a new instance on the stack
// if element has attributes, set them in the new instance
if (qName.equals("office:styles")) {
styles = new OfficeStyles();
push(styles);
} else if (qName.equals("style:default-style")) {
StyleDefaultStyle defaultStyle = new StyleDefaultStyle();
defaultStyle.setStyleFamily(attribs.getValue("style:family"));
if (current instanceof OfficeStyles) {
((OfficeStyles) current).addDefaultStyle(defaultStyle);
} else {
System.err.println("Not OfficeStyles:" + current);
}
push(defaultStyle);
}
// <style:text-properties style:font-name="Arial"
else if (qName.equals("style:text-properties")) {
StyleTextProperties props = new StyleTextProperties();
props.setFontName(attribs.getValue("style:font-name"));
if (current instanceof StyleDefaultStyle) {
((StyleDefaultStyle) current).setStyleTextProperties(props);
} else {
System.err.println("Not StyleDefaultStyle:" + current);
}
push(props);
} else if (qName.equals("office:automatic-styles")) {
autoStyles = new OfficeAutomaticStyles();
push(autoStyles);
} else if (qName.equals("style:page-layout")) {
StylePageLayout layout = new StylePageLayout();
layout.setStyleName(attribs.getValue("style:name"));
if (current instanceof OfficeAutomaticStyles) {
autoStyles.addPageLayout(layout);
} else {
System.err.println("Not OfficeAutomaticStyles:" + current);
}
push(layout);
} else if (qName.equals("style:page-layout-properties")) {
StylePageLayoutProperties props = new StylePageLayoutProperties();
props.setPageWidth(attribs.getValue("fo:page-width"));
props.setPageHeight(attribs.getValue("fo:page-height"));
props.setMarginTop(attribs.getValue("fo:margin-top"));
props.setMarginBottom(attribs.getValue("fo:margin-bottom"));
props.setMarginLeft(attribs.getValue("fo:margin-left"));
props.setMarginRight(attribs.getValue("fo:margin-right"));
props.setShadow(attribs.getValue("style:shadow"));
props.setBackgroundColor(attribs.getValue("fo:background-color"));
props.setScaleTo(attribs.getValue("style:scale-to"));
props.setTableCentering(attribs.getValue("style:table-centering"));
props.setWritingMode(attribs.getValue("style:writing-mode"));
if (current instanceof StylePageLayout) {
((StylePageLayout) current).setPageLayoutProperties(props);
} else {
System.err.println("Not StylePageLayout:" + current);
}
push(props);
} else if (qName.equals("office:master-styles")) {
masterStyles = new OfficeMasterStyles();
push(masterStyles);
} else if (qName.equals("style:master-page")) {
StyleMasterPage page = new StyleMasterPage();
page.setStyleName(attribs.getValue("style:name"));
page.setStylePageLayoutName(attribs.getValue("style:page-layout-name"));
if (current instanceof OfficeMasterStyles) {
masterStyles.addMasterPage(page);
} else {
System.err.println("Not OfficeMasterStyles:" + current);
}
push(page);
}
// if none of the above, it is an unexpected element
else {
push(uri);
}
}
// -----
private void push(Object o) {
this.current = o;
this.stack.push(o);
}
@Override
public void endElement(String uri, String localName, String qName) {
/*
* for (int i = 0; i < this.stack.size() - 1; i++) { System.out.print(" "); }
* System.out.println("End: " + qName + " " + localName);
*/
pop();
}
private void pop() {
if (!stack.isEmpty()) {
stack.pop();
}
if (!stack.isEmpty()) {
current = stack.peek();
}
}
// -----
@Override
public void characters(char[] data, int start, int length) {
}
public OfficeStyles getStyles() {
return styles;
}
public OfficeMasterStyles getMasterStyles() {
return masterStyles;
}
public OfficeAutomaticStyles getAutomaticStyles() {
return autoStyles;
}
}