--- /dev/null
+/* ====================================================================
+ 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
--- /dev/null
+/* ====================================================================
+ 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<IndentProp> 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<IndentProp>();
+ }
+
+ /**
+ * 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<IndentProp>(_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<IndentProp> getIndents() {
+ return Collections.unmodifiableList(indents);
+ }
+}
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).
* @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;