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 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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user