You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2014/03/15 09:14:36 UTC

svn commit: r1577802 - in /poi/trunk/src/scratchpad/src/org/apache/poi/hslf: model/textproperties/IndentProp.java record/MasterTextPropAtom.java record/RecordTypes.java record/TxMasterStyleAtom.java

Author: nick
Date: Sat Mar 15 08:14:36 2014
New Revision: 1577802

URL: http://svn.apache.org/r1577802
Log:
Implement MasterTextPropAtom, which provides the indents for a run of text, needed for #56260

Added:
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java
Modified:
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java

Added: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java?rev=1577802&view=auto
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java (added)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/IndentProp.java Sat Mar 15 08:14:36 2014
@@ -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

Added: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java?rev=1577802&view=auto
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java (added)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/MasterTextPropAtom.java Sat Mar 15 08:14:36 2014
@@ -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<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);
+    }
+}

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java?rev=1577802&r1=1577801&r2=1577802&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/RecordTypes.java Sat Mar 15 08:14:36 2014
@@ -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);

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java?rev=1577802&r1=1577801&r2=1577802&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/record/TxMasterStyleAtom.java Sat Mar 15 08:14:36 2014
@@ -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.textpro
  *  @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;



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org