blob: 8a4f10e20fd904860aa156455a77b02a9c1057dc [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.sxw.wordsmith;
import java.io.IOException;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Element;
import org.openoffice.xmerge.Document;
import org.openoffice.xmerge.ConverterCapabilities;
import org.openoffice.xmerge.converter.xml.OfficeDocument;
import org.openoffice.xmerge.converter.xml.sxw.SxwDocument;
import org.openoffice.xmerge.converter.xml.*;
/**
* This class represents a paragraph in a WordSmith document.
* (A paragraph is "5" followed by 12 bytes of attributes.)
*
* @author David Proulx
*/
class WsePara extends Wse {
private byte spaceBefore = 0;
private byte spaceAfter = 0;
private byte leftIndent = 0;
private byte firstIndent = 0;
private byte rightIndent = 0;
private byte misc = 0;
private byte style = 0;
private byte lineSpace = 0;
private byte outline = 0;
private byte reserved = 0;
private static final byte LS_EXACTLY = (byte)0xC0;
private static final byte LS_ATLEAST = (byte)0x80;
private static final byte LS_MULTIPLE = (byte)0x40;
private static final byte LS_VALUEMASK = (byte)0x3F;
private static final byte ALIGN_RIGHT = (byte)2;
private static final byte ALIGN_LEFT = (byte)0;
private static final byte ALIGN_CENTER = (byte)1;
private static final byte ALIGN_JUST = (byte)3;
private StyleCatalog sc = null;
/**
* Constructor for use when going from DOM to WordSmith.
*
* @param p The paragraph style.
* @param sc The <code>StyleCatalog</code>.
*/
public WsePara(ParaStyle p, StyleCatalog sc) {
this.sc = sc;
ParaStyle ps = (ParaStyle)p.getResolved();
if (ps.isAttributeSet(ParaStyle.MARGIN_LEFT)) {
double temp = ps.getAttribute(ParaStyle.MARGIN_LEFT) * 1.6 / 100;
leftIndent = (byte) temp;
if ((temp - leftIndent) > 0.5) leftIndent++;
}
if (ps.isAttributeSet(ParaStyle.MARGIN_RIGHT)) {
double temp = ps.getAttribute(ParaStyle.MARGIN_RIGHT) * 1.6 / 100;
rightIndent = (byte) temp;
if ((temp - rightIndent) > 0.5) rightIndent++;
}
if (ps.isAttributeSet(ParaStyle.TEXT_INDENT)) {
double temp = ps.getAttribute(ParaStyle.TEXT_INDENT) * 1.6 / 100;
firstIndent = (byte) temp;
if ((temp - firstIndent) > 0.5) firstIndent++;
}
if (ps.isAttributeSet(ParaStyle.MARGIN_TOP)) {
double temp = ps.getAttribute(ParaStyle.MARGIN_TOP) * 1.6 / 100;
spaceBefore = (byte) temp;
if ((temp - spaceBefore) > 0.5) spaceBefore++;
}
if (ps.isAttributeSet(ParaStyle.MARGIN_BOTTOM)) {
double temp = ps.getAttribute(ParaStyle.MARGIN_BOTTOM) * 1.6 / 100;
spaceAfter = (byte) temp;
if ((temp - spaceAfter) > 0.5) spaceAfter++;
}
if (ps.isAttributeSet(ParaStyle.LINE_HEIGHT)) {
int lh = ps.getAttribute(ParaStyle.LINE_HEIGHT);
if ((lh & ~ParaStyle.LH_VALUEMASK) == 0)
lineSpace = (byte)(LS_MULTIPLE | (lh * 2));
else if ((lh & ParaStyle.LH_PCT) != 0) {
lh = (lh & ParaStyle.LH_VALUEMASK) / 100;
lineSpace = (byte)(LS_MULTIPLE | (lh * 2));
}
// DJP: handle other cases....
}
if (ps.isAttributeSet(ParaStyle.TEXT_ALIGN)) {
int val = ps.getAttribute(ParaStyle.TEXT_ALIGN);
switch (val) {
case ParaStyle.ALIGN_RIGHT:
misc = ALIGN_RIGHT;
break;
case ParaStyle.ALIGN_LEFT:
misc = ALIGN_LEFT;
break;
case ParaStyle.ALIGN_CENTER:
misc = ALIGN_CENTER;
break;
case ParaStyle.ALIGN_JUST:
misc = ALIGN_JUST;
break;
}
}
}
/**
* Constructor for use when going from WordSmith to DOM.
* Assumes <code>dataArray[startIndex]</code> is the first
* <code>byte</code> of a valid WordSmith paragraph descriptor.
*
* @param dataArray <code>byte</code> array.
* @param startIndex The start index.
*/
public WsePara(byte dataArray[], int startIndex) {
spaceBefore = dataArray[startIndex + 1];
spaceAfter = dataArray[startIndex + 2];
leftIndent = dataArray[startIndex + 3];
firstIndent = dataArray[startIndex + 4];
rightIndent = dataArray[startIndex + 5];
misc = dataArray[startIndex + 6];
style = dataArray[startIndex + 7];
lineSpace = dataArray[startIndex + 8];
outline = dataArray[startIndex + 9];
}
/**
* Compute the index of the first <code>byte</code> following the
* paragraph descriptor, assuming that
* <code>dataArray[startIndex]</code> is the beginning of a valid
* paragraph descriptor.
*
* @param dataArray <code>byte</code> array.
* @param startIndex The start index.
*
* @return The index of the first <code>byte</code> following the
* paragraph description.
*/
static int computeNewIndex(byte dataArray[], int startIndex) {
return startIndex + 13;
}
/**
* Return true if <code>dataArray[startIndex]</code> is the start
* of a valid paragraph descriptor.
*
* @param dataArray <code>byte</code> array.
* @param startIndex The start index.
*
* @return true if <code>dataArray[startIndex]</code> is the start
* of a valid paragraph descriptor, false otherwise.
*/
static boolean isValid(byte dataArray[], int startIndex) {
return (dataArray[startIndex] == 5);
}
/**
* Return the number of bytes needed to represent this paragraph.
*
* @return The number of bytes needed to represent this paragraph.
*/
int getByteCount() {
return 13;
}
/**
* Return an <code>byte</code> array representing this paragraph.
*
* @return An <code>byte</code> array representing this paragraph.
*/
byte[] getBytes() {
byte b[] = new byte[13];
b[0] = 5;
b[1] = spaceBefore;
b[2] = spaceAfter;
b[3] = leftIndent;
b[4] = firstIndent;
b[5] = rightIndent;
b[6] = misc;
b[7] = style;
b[8] = lineSpace;
b[9] = outline;
b[10] = reserved;
b[11] = 0;
b[12] = 0;
return b;
}
/**
* Return a <code>ParaStyle</code> that reflects the formatting of
* this run.
*
* @return A <code>ParaStyle</code> that reflects the formatting
* of this run.
*/
ParaStyle makeStyle() {
/* Csaba: Commented out the LINE_HEIGHT syle, because there was no
incoming data for that style. It was resulting a zero line
height in the xml document, ie. the doc looked empty.
*/
int attrs[] = { ParaStyle.MARGIN_LEFT, ParaStyle.MARGIN_RIGHT,
ParaStyle.TEXT_INDENT, //ParaStyle.LINE_HEIGHT,
ParaStyle.MARGIN_TOP, ParaStyle.MARGIN_BOTTOM,
ParaStyle.TEXT_ALIGN };
String values[] = new String[attrs.length];
double temp;
temp = leftIndent / 1.6;
values[0] = (new Double(temp)).toString() + "mm";
temp = rightIndent / 1.6;
values[1] = (new Double(temp)).toString() + "mm";
temp = firstIndent / 1.6;
values[2] = (new Double(temp)).toString() + "mm";
/* if ((lineSpace & LS_MULTIPLE) != 0) {
temp = (lineSpace & LS_VALUEMASK) / 2;
temp *= 100;
values[3] = (new Double(temp)).toString() + "%";
} else {
values[3] = (new Double(temp)).toString() + "mm";
// DJP: handle other cases
}
*/
temp = spaceBefore / 1.6;
// values[4] = (new Double(temp)).toString() + "mm";
values[3] = (new Double(temp)).toString() + "mm";
temp = spaceAfter / 1.6;
// values[5] = (new Double(temp)).toString() + "mm";
values[4] = (new Double(temp)).toString() + "mm";
switch (misc) {
// case ALIGN_RIGHT: values[6] = "right"; break;
// case ALIGN_LEFT: values[6] = "left"; break;
// case ALIGN_CENTER:values[6] = "center"; break;
// case ALIGN_JUST: values[6] = "justified"; break;
case ALIGN_RIGHT: values[5] = "right"; break;
case ALIGN_LEFT: values[5] = "left"; break;
case ALIGN_CENTER:values[5] = "center"; break;
case ALIGN_JUST: values[5] = "justified"; break;
}
ParaStyle x = new ParaStyle(null, "paragraph", null, attrs,
values, sc);
return x;
}
}