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
This commit is contained in:
parent
adb98e1073
commit
488647cb43
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -85,7 +85,7 @@ public final class RecordTypes {
|
|||||||
public static final Type TextHeaderAtom = new Type(3999,TextHeaderAtom.class);
|
public static final Type TextHeaderAtom = new Type(3999,TextHeaderAtom.class);
|
||||||
public static final Type TextCharsAtom = new Type(4000,TextCharsAtom.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 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 TxMasterStyleAtom = new Type(4003,TxMasterStyleAtom.class);
|
||||||
public static final Type TxCFStyleAtom = new Type(4004,null);
|
public static final Type TxCFStyleAtom = new Type(4004,null);
|
||||||
public static final Type TxPFStyleAtom = new Type(4005,null);
|
public static final Type TxPFStyleAtom = new Type(4005,null);
|
||||||
|
@ -17,12 +17,14 @@
|
|||||||
|
|
||||||
package org.apache.poi.hslf.record;
|
package org.apache.poi.hslf.record;
|
||||||
|
|
||||||
import org.apache.poi.util.LittleEndian;
|
|
||||||
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.io.IOException;
|
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).
|
* TxMasterStyleAtom atom (4003).
|
||||||
@ -41,11 +43,10 @@ import org.apache.poi.hslf.model.textproperties.*;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public final class TxMasterStyleAtom extends RecordAtom {
|
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 byte[] _header;
|
||||||
private static long _type = 4003;
|
private static long _type = 4003;
|
||||||
|
Loading…
Reference in New Issue
Block a user