From 6adffa0c033da92ff2f7944e32116bc529ef1824 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sat, 15 Mar 2014 08:14:36 +0000 Subject: [PATCH] Implement MasterTextPropAtom, which provides the indents for a run of text, needed for #56260 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1577802 13f79535-47bb-0310-9956-ffa450edef68 --- .../hslf/model/textproperties/IndentProp.java | 65 ++++++++ .../poi/hslf/record/MasterTextPropAtom.java | 152 ++++++++++++++++++ .../apache/poi/hslf/record/RecordTypes.java | 2 +- .../poi/hslf/record/TxMasterStyleAtom.java | 15 +- 4 files changed, 226 insertions(+), 8 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java new file mode 100644 index 0000000000..662833203f --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java @@ -0,0 +1,65 @@ +/* ==================================================================== + 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.apache.poi.hslf.model.textproperties; + +import org.apache.poi.hslf.record.TxMasterStyleAtom; + +/** + * Definition of the indent level of some text. Defines how many + * characters it applies to, and what indent level they share. + * + * This is defined by the slightly confusingly named MasterTextPropRun + */ +public class IndentProp { + private int charactersCovered; + private short indentLevel; + + /** + * Generate the definition of a given text indent + */ + public IndentProp(int charactersCovered, short indentLevel) { + this.charactersCovered = charactersCovered; + this.indentLevel = indentLevel; + } + + /** Fetch the number of characters this styling applies to */ + public int getCharactersCovered() { return charactersCovered; } + + public int getIndentLevel() { + return (int)indentLevel; + } + + /** + * Sets the indent level, which can be between 0 and 4 + */ + public void setIndentLevel(int indentLevel) { + if (indentLevel >= TxMasterStyleAtom.MAX_INDENT || + indentLevel < 0) { + throw new IllegalArgumentException("Indent must be between 0 and 4"); + } + this.indentLevel = (short)indentLevel; + } + + /** + * Update the size of the text that this set of properties + * applies to + */ + public void updateTextSize(int textSize) { + charactersCovered = textSize; + } +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java new file mode 100644 index 0000000000..dd942133ee --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java @@ -0,0 +1,152 @@ +/* ==================================================================== + 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.apache.poi.hslf.record; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.poi.hslf.model.textproperties.IndentProp; +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.POILogger; + +/** + * Specifies the Indent Level for the text + */ +public final class MasterTextPropAtom extends RecordAtom { + /** + * Record header. + */ + private byte[] _header; + + /** + * Record data. + */ + private byte[] _data; + + // indent details + private List indents; + + /** + * Constructs a new empty master text prop atom. + */ + public MasterTextPropAtom() { + _header = new byte[8]; + _data = new byte[0]; + + LittleEndian.putShort(_header, 2, (short)getRecordType()); + LittleEndian.putInt(_header, 4, _data.length); + + indents = new ArrayList(); + } + + /** + * Constructs the ruler atom record from its + * source data. + * + * @param source the source data as a byte array. + * @param start the start offset into the byte array. + * @param len the length of the slice in the byte array. + */ + protected MasterTextPropAtom(byte[] source, int start, int len) { + // Get the header. + _header = new byte[8]; + System.arraycopy(source,start,_header,0,8); + + // Get the record data. + _data = new byte[len-8]; + System.arraycopy(source,start+8,_data,0,len-8); + + try { + read(); + } catch (Exception e){ + logger.log(POILogger.ERROR, "Failed to parse MasterTextPropAtom: " + e.getMessage()); + e.printStackTrace(); + } + } + + /** + * Gets the record type. + * + * @return the record type. + */ + public long getRecordType() { + return RecordTypes.MasterTextPropAtom.typeID; + } + + /** + * Write the contents of the record back, so it can be written + * to disk. + * + * @param out the output stream to write to. + * @throws java.io.IOException if an error occurs. + */ + public void writeOut(OutputStream out) throws IOException { + write(); + out.write(_header); + out.write(_data); + } + + /** + * Write the internal variables to the record bytes + */ + private void write() { + int pos = 0; + _data = new byte[indents.size()*6]; + for (IndentProp prop : indents) { + LittleEndian.putInt(_data, pos, prop.getCharactersCovered()); + LittleEndian.putShort(_data, pos+4, (short)prop.getIndentLevel()); + pos += 6; + } + } + + /** + * Read the record bytes and initialize the internal variables + */ + private void read() { + int pos = 0; + indents = new ArrayList(_data.length/6); + + while (pos <= _data.length - 6) { + int count = LittleEndian.getInt(_data, pos); + short indent = LittleEndian.getShort(_data, pos+4); + indents.add(new IndentProp(count, indent)); + pos += 6; + } + } + + /** + * Returns the indent that applies at the given text offset + */ + public int getIndentAt(int offset) { + int charsUntil = 0; + for (IndentProp prop : indents) { + charsUntil += prop.getCharactersCovered(); + if (offset < charsUntil) { + return prop.getIndentLevel(); + } + } + return -1; + } + + public List getIndents() { + return Collections.unmodifiableList(indents); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java index 51b8f26a89..fca49baced 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java @@ -85,7 +85,7 @@ public final class RecordTypes { public static final Type TextHeaderAtom = new Type(3999,TextHeaderAtom.class); public static final Type TextCharsAtom = new Type(4000,TextCharsAtom.class); public static final Type StyleTextPropAtom = new Type(4001, StyleTextPropAtom.class);//0x0fa1 RT_StyleTextPropAtom - public static final Type BaseTextPropAtom = new Type(4002,null); + public static final Type MasterTextPropAtom = new Type(4002, MasterTextPropAtom.class); public static final Type TxMasterStyleAtom = new Type(4003,TxMasterStyleAtom.class); public static final Type TxCFStyleAtom = new Type(4004,null); public static final Type TxPFStyleAtom = new Type(4005,null); diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java index aca0427ddb..966c8eb8e3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java @@ -17,12 +17,14 @@ package org.apache.poi.hslf.record; -import org.apache.poi.util.LittleEndian; - -import java.io.OutputStream; import java.io.IOException; +import java.io.OutputStream; -import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; +import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; +import org.apache.poi.hslf.model.textproperties.TextProp; +import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.util.LittleEndian; /** * TxMasterStyleAtom atom (4003). @@ -41,11 +43,10 @@ import org.apache.poi.hslf.model.textproperties.*; * @author Yegor Kozlov */ public final class TxMasterStyleAtom extends RecordAtom { - /** - * Maximum number of indentatio levels allowed in PowerPoint documents + * Maximum number of indentation levels allowed in PowerPoint documents */ - private static final int MAX_INDENT = 5; + public static final int MAX_INDENT = 5; private byte[] _header; private static long _type = 4003; -- 2.39.5