patch and latest bug fixes

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353541 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Said Ryan Ackley 2004-04-08 11:51:15 +00:00
parent ad71becd4b
commit 89101ac1da
10 changed files with 163 additions and 129 deletions

View File

@ -69,8 +69,7 @@ public class Word2Forrest
{ {
int cruns = p.numCharacterRuns (); int cruns = p.numCharacterRuns ();
CharacterRun run = p.getCharacterRun (0); CharacterRun run = p.getCharacterRun (0);
int ftcAscii = run.getFontNameIndex (); String fontName = run.getFontName();
String fontName = doc.getFontTable().getMainFont(ftcAscii);
if (fontName.startsWith ("Courier")) if (fontName.startsWith ("Courier"))
{ {
if (!inCode) if (!inCode)

View File

@ -156,7 +156,7 @@ public class HWPFDocument
_pbt.adjustForDelete(0, 0, cpMin); _pbt.adjustForDelete(0, 0, cpMin);
} }
_st = new SectionTable(_mainStream, _tableStream, _fib.getFcPlcfsed(), _fib.getLcbPlcfsed(), fcMin); _st = new SectionTable(_mainStream, _tableStream, _fib.getFcPlcfsed(), _fib.getLcbPlcfsed(), fcMin, getTextTable().getTextPieces());
_ss = new StyleSheet(_tableStream, _fib.getFcStshf()); _ss = new StyleSheet(_tableStream, _fib.getFcStshf());
_ft = new FontTable(_tableStream, _fib.getFcSttbfffn(), _fib.getLcbSttbfffn()); _ft = new FontTable(_tableStream, _fib.getFcSttbfffn(), _fib.getLcbSttbfffn());

View File

@ -1,56 +1,20 @@
/* ==================================================================== /* ====================================================================
* The Apache Software License, Version 1.1 Copyright 2002-2004 Apache Software Foundation
*
* Copyright (c) 2003 The Apache Software Foundation. All rights Licensed under the Apache License, Version 2.0 (the "License");
* reserved. you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions http://www.apache.org/licenses/LICENSE-2.0
* are met:
* Unless required by applicable law or agreed to in writing, software
* 1. Redistributions of source code must retain the above copyright distributed under the License is distributed on an "AS IS" BASIS,
* notice, this list of conditions and the following disclaimer. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* 2. Redistributions in binary form must reproduce the above copyright limitations under the License.
* notice, this list of conditions and the following disclaimer in ==================================================================== */
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hwpf.model; package org.apache.poi.hwpf.model;
@ -66,6 +30,9 @@ import java.util.NoSuchElementException;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
/**
* @author Ryan Ackley
*/
public class ListTables public class ListTables
{ {
private static final int LIST_DATA_SIZE = 28; private static final int LIST_DATA_SIZE = 28;

View File

@ -19,6 +19,7 @@ package org.apache.poi.hwpf.model;
import java.util.ArrayList; import java.util.ArrayList;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.hwpf.model.io.*; import org.apache.poi.hwpf.model.io.*;
@ -31,16 +32,19 @@ public class SectionTable
private static final int SED_SIZE = 12; private static final int SED_SIZE = 12;
private ArrayList _sections = new ArrayList(); private ArrayList _sections = new ArrayList();
private List _text;
public SectionTable() public SectionTable()
{ {
} }
public SectionTable(byte[] documentStream, byte[] tableStream, int offset, public SectionTable(byte[] documentStream, byte[] tableStream, int offset,
int size, int fcMin) int size, int fcMin,
List tpt)
{ {
PlexOfCps sedPlex = new PlexOfCps(tableStream, offset, size, SED_SIZE); PlexOfCps sedPlex = new PlexOfCps(tableStream, offset, size, SED_SIZE);
_text = tpt;
int length = sedPlex.length(); int length = sedPlex.length();
for (int x = 0; x < length; x++) for (int x = 0; x < length; x++)
@ -53,7 +57,7 @@ public class SectionTable
// check for the optimization // check for the optimization
if (fileOffset == 0xffffffff) if (fileOffset == 0xffffffff)
{ {
_sections.add(new SEPX(sed, node.getStart(), node.getEnd(), new byte[0])); _sections.add(new SEPX(sed, CPtoFC(node.getStart()), CPtoFC(node.getEnd()), new byte[0]));
} }
else else
{ {
@ -62,7 +66,7 @@ public class SectionTable
byte[] buf = new byte[sepxSize]; byte[] buf = new byte[sepxSize];
fileOffset += LittleEndian.SHORT_SIZE; fileOffset += LittleEndian.SHORT_SIZE;
System.arraycopy(documentStream, fileOffset, buf, 0, buf.length); System.arraycopy(documentStream, fileOffset, buf, 0, buf.length);
_sections.add(new SEPX(sed, node.getStart(), node.getEnd(), buf)); _sections.add(new SEPX(sed, CPtoFC(node.getStart()), CPtoFC(node.getEnd()), buf));
} }
} }
} }
@ -81,6 +85,50 @@ public class SectionTable
} }
} }
private int CPtoFC(int cp)
{
int size = _text.size();
int x = 0;
int end = 0;
int fc = 0;
for (; x < size; x++)
{
TextPiece piece = (TextPiece)_text.get(x);
int currentStart = end;
end += ((piece.getEnd()- piece.getStart())/(piece.usesUnicode() ? 2 : 1));
if (cp <= end)
{
fc += ((cp - currentStart) * (piece.usesUnicode() ? 2 : 1));
break;
}
else
{
fc += (piece.getEnd() - piece.getStart());
}
}
return fc;
}
private int FCtoCP(int fc)
{
int size = _text.size();
int cp = 0;
for (int x = 0; x < size; x++)
{
TextPiece piece = (TextPiece)_text.get(x);
if (fc <= piece.getEnd())
{
cp += ((fc - piece.getStart())/ (piece.usesUnicode() ? 2 : 1));
break;
}
else
{
cp += ((piece.getEnd() - piece.getStart())/ (piece.usesUnicode() ? 2 : 1));
}
}
return cp;
}
public ArrayList getSections() public ArrayList getSections()
{ {
@ -115,7 +163,7 @@ public class SectionTable
sed.setFc(offset); sed.setFc(offset);
// add the section descriptor bytes to the PlexOfCps. // add the section descriptor bytes to the PlexOfCps.
GenericPropertyNode property = new GenericPropertyNode(sepx.getStart(), sepx.getEnd(), sed.toByteArray()); GenericPropertyNode property = new GenericPropertyNode(FCtoCP(sepx.getStart()), FCtoCP(sepx.getEnd()), sed.toByteArray());
plex.addProperty(property); plex.addProperty(property);
offset = docStream.getOffset(); offset = docStream.getOffset();

View File

@ -1,56 +1,20 @@
/* ==================================================================== /* ====================================================================
* The Apache Software License, Version 1.1 Copyright 2002-2004 Apache Software Foundation
*
* Copyright (c) 2003 The Apache Software Foundation. All rights Licensed under the Apache License, Version 2.0 (the "License");
* reserved. you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions http://www.apache.org/licenses/LICENSE-2.0
* are met:
* Unless required by applicable law or agreed to in writing, software
* 1. Redistributions of source code must retain the above copyright distributed under the License is distributed on an "AS IS" BASIS,
* notice, this list of conditions and the following disclaimer. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* 2. Redistributions in binary form must reproduce the above copyright limitations under the License.
* notice, this list of conditions and the following disclaimer in ==================================================================== */
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hwpf.usermodel; package org.apache.poi.hwpf.usermodel;
@ -59,6 +23,9 @@ import org.apache.poi.hwpf.model.StyleDescription;
import org.apache.poi.hwpf.sprm.SprmBuffer; import org.apache.poi.hwpf.sprm.SprmBuffer;
/**
* @author Ryan Ackley
*/
public class CharacterProperties public class CharacterProperties
extends CHPAbstractType implements Cloneable extends CHPAbstractType implements Cloneable
{ {

View File

@ -428,9 +428,9 @@ public class CharacterRun
_chpx.addSprm(SPRM_HIGHLIGHT, color); _chpx.addSprm(SPRM_HIGHLIGHT, color);
} }
public int getFontNameIndex() public String getFontName()
{ {
return _props.getFtcAscii(); return _doc.getFontTable().getMainFont(_props.getFtcAscii());
} }

View File

@ -252,7 +252,7 @@ public class Range
TextPiece piece = (TextPiece)_text.get(x); TextPiece piece = (TextPiece)_text.get(x);
int start = _start > piece.getStart() ? _start - piece.getStart() : 0; int start = _start > piece.getStart() ? _start - piece.getStart() : 0;
int end = _end <= piece.getEnd() ? _end - piece.getStart() : piece.getEnd() - piece.getStart(); int end = _end <= piece.getEnd() ? _end - piece.getStart() : piece.getEnd() - piece.getStart();
sb.append(piece.getStringBuffer().substring(start, end)); sb.append(piece.substring(start, end));
} }
return sb.toString(); return sb.toString();
} }
@ -312,9 +312,9 @@ public class Range
int insertIndex = _start - tp.getStart(); int insertIndex = _start - tp.getStart();
sb.insert(insertIndex, text); sb.insert(insertIndex, text);
int adjustedLength = _doc.getTextTable().adjustForInsert(_textStart, text.length()); int adjustedLength = _doc.getTextTable().adjustForInsert(_textStart, text.length());
_doc.getCharacterTable().adjustForInsert(_textStart, adjustedLength); _doc.getCharacterTable().adjustForInsert(_charStart, adjustedLength);
_doc.getParagraphTable().adjustForInsert(_textStart, adjustedLength); _doc.getParagraphTable().adjustForInsert(_parStart, adjustedLength);
_doc.getSectionTable().adjustForInsert(_textStart, adjustedLength); _doc.getSectionTable().adjustForInsert(_sectionStart, adjustedLength);
adjustForInsert(text.length()); adjustForInsert(text.length());
return getCharacterRun(0); return getCharacterRun(0);
@ -329,11 +329,17 @@ public class Range
public CharacterRun insertAfter(String text) public CharacterRun insertAfter(String text)
{ {
initAll(); initAll();
int listIndex = _textEnd - 1; int listIndex = _textEnd - 1;
TextPiece tp = (TextPiece)_text.get(listIndex); TextPiece tp = (TextPiece)_text.get(listIndex);
StringBuffer sb = (StringBuffer)tp.getStringBuffer(); StringBuffer sb = (StringBuffer)tp.getStringBuffer();
int insertIndex = _end - tp.getStart(); int insertIndex = _end - tp.getStart();
if (tp.getStringBuffer().charAt(_end - 1) == '\r')
{
insertIndex--;
}
sb.insert(insertIndex, text); sb.insert(insertIndex, text);
int adjustedLength = _doc.getTextTable().adjustForInsert(listIndex, text.length()); int adjustedLength = _doc.getTextTable().adjustForInsert(listIndex, text.length());
_doc.getCharacterTable().adjustForInsert(_charEnd - 1, adjustedLength); _doc.getCharacterTable().adjustForInsert(_charEnd - 1, adjustedLength);
@ -567,6 +573,31 @@ public class Range
return (ListEntry)insertBefore(props, styleIndex); return (ListEntry)insertBefore(props, styleIndex);
} }
/**
* Inserts a list into the beginning of this range.
*
* @param props The properties of the list entry. All list entries are
* paragraphs.
* @param listID The id of the list that contains the properties.
* @param level The indentation level of the list.
* @param styleIndex The base style's index in the stylesheet.
* @return The empty ListEntry that is now part of the document.
*/
public ListEntry insertAfter(ParagraphProperties props, int listID, int level, int styleIndex)
{
ListTables lt = _doc.getListTables();
if (lt.getLevel(listID, level) == null)
{
throw new NoSuchElementException("The specified list and level do not exist");
}
int ilfo = lt.getOverrideIndexFromListID(listID);
props.setIlfo(ilfo);
props.setIlvl((byte)level);
return (ListEntry)insertAfter(props, styleIndex);
}
/** /**
* Gets the character run at index. The index is relative to this range. * Gets the character run at index. The index is relative to this range.
* *

View File

@ -30,7 +30,7 @@ public class HWPFDocFixture
filename = "c:"; filename = "c:";
} }
filename = filename + "/test99.doc"; filename = filename + "/blankplus.doc";
POIFSFileSystem filesystem = new POIFSFileSystem(new FileInputStream( POIFSFileSystem filesystem = new POIFSFileSystem(new FileInputStream(

View File

@ -22,19 +22,25 @@ public class TestListTables
FileInformationBlock fib = _hWPFDocFixture._fib; FileInformationBlock fib = _hWPFDocFixture._fib;
byte[] tableStream = _hWPFDocFixture._tableStream; byte[] tableStream = _hWPFDocFixture._tableStream;
ListTables listTables = new ListTables(tableStream, fib.getFcPlcfLst(), fib.getFcPlfLfo()); int listOffset = fib.getFcPlcfLst();
int lfoOffset = fib.getFcPlfLfo();
if (listOffset != 0 && fib.getLcbPlcfLst() != 0)
{
ListTables listTables = new ListTables (tableStream, fib.getFcPlcfLst (),
fib.getFcPlfLfo ());
HWPFFileSystem fileSys = new HWPFFileSystem ();
HWPFFileSystem fileSys = new HWPFFileSystem(); HWPFOutputStream tableOut = fileSys.getStream ("1Table");
HWPFOutputStream tableOut = fileSys.getStream("1Table"); listTables.writeListDataTo (tableOut);
int offset = tableOut.getOffset ();
listTables.writeListOverridesTo (tableOut);
listTables.writeListDataTo(tableOut); ListTables newTables = new ListTables (tableOut.toByteArray (), 0, offset);
int offset = tableOut.getOffset();
listTables.writeListOverridesTo(tableOut);
ListTables newTables = new ListTables(tableOut.toByteArray(), 0, offset); assertEquals(listTables, newTables);
assertEquals(listTables, newTables); }
} }
} }

View File

@ -80,10 +80,13 @@ public class TestSectionTable
byte[] tableStream = _hWPFDocFixture._tableStream; byte[] tableStream = _hWPFDocFixture._tableStream;
int fcMin = fib.getFcMin(); int fcMin = fib.getFcMin();
ComplexFileTable cft = new ComplexFileTable(mainStream, tableStream, fib.getFcClx(), fcMin);
TextPieceTable tpt = cft.getTextPieceTable();
SectionTable sectionTable = new SectionTable(mainStream, tableStream, SectionTable sectionTable = new SectionTable(mainStream, tableStream,
fib.getFcPlcfsed(), fib.getFcPlcfsed(),
fib.getLcbPlcfsed(), fib.getLcbPlcfsed(),
fcMin); fcMin, tpt.getTextPieces());
HWPFFileSystem fileSys = new HWPFFileSystem(); HWPFFileSystem fileSys = new HWPFFileSystem();
sectionTable.writeTo(fileSys, 0); sectionTable.writeTo(fileSys, 0);
@ -93,13 +96,26 @@ public class TestSectionTable
byte[] newTableStream = tableOut.toByteArray(); byte[] newTableStream = tableOut.toByteArray();
byte[] newMainStream = mainOut.toByteArray(); byte[] newMainStream = mainOut.toByteArray();
SectionTable newSectionTable = new SectionTable(newMainStream, newTableStream, 0, newTableStream.length, 0); SectionTable newSectionTable = new SectionTable(newMainStream, newTableStream, 0, newTableStream.length, 0, tpt.getTextPieces());
ArrayList oldSections = sectionTable.getSections(); ArrayList oldSections = sectionTable.getSections();
ArrayList newSections = newSectionTable.getSections(); ArrayList newSections = newSectionTable.getSections();
assertEquals(oldSections.size(), newSections.size()); assertEquals(oldSections.size(), newSections.size());
//test for proper char offset conversions
PlexOfCps oldSedPlex = new PlexOfCps(tableStream, fib.getFcPlcfsed(),
fib.getLcbPlcfsed(), 12);
PlexOfCps newSedPlex = new PlexOfCps(newTableStream, 0,
newTableStream.length, 12);
assertEquals(oldSedPlex.length(), newSedPlex.length());
for (int x = 0; x < oldSedPlex.length(); x++)
{
assertEquals(oldSedPlex.getProperty(x).getStart(), newSedPlex.getProperty(x).getStart());
assertEquals(oldSedPlex.getProperty(x).getEnd(), newSedPlex.getProperty(x).getEnd());
}
int size = oldSections.size(); int size = oldSections.size();
for (int x = 0; x < size; x++) for (int x = 0; x < size; x++)
{ {