mirror of https://github.com/apache/poi.git
Start to support friendly usermodel interface to rich text character properties
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@377215 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
30fa7996ac
commit
c5edf4cb53
|
@ -285,9 +285,9 @@ public class TextRun
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure a StyleTextPropAtom is present for this run,
|
* Ensure a StyleTextPropAtom is present for this run,
|
||||||
* by adding if required
|
* by adding if required. Normally for internal TextRun use.
|
||||||
*/
|
*/
|
||||||
private synchronized void ensureStyleAtomPresent() {
|
public synchronized void ensureStyleAtomPresent() {
|
||||||
if(_styleAtom != null) {
|
if(_styleAtom != null) {
|
||||||
// All there
|
// All there
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -84,8 +84,8 @@ public class StyleTextPropAtom extends RecordAtom
|
||||||
public void setCharacterStyles(LinkedList cs) { charStyles = cs; }
|
public void setCharacterStyles(LinkedList cs) { charStyles = cs; }
|
||||||
|
|
||||||
/** All the different kinds of paragraph properties we might handle */
|
/** All the different kinds of paragraph properties we might handle */
|
||||||
public TextProp[] paragraphTextPropTypes = new TextProp[] {
|
public static TextProp[] paragraphTextPropTypes = new TextProp[] {
|
||||||
new BitMaskTextProp(2, 0xF, new String[] {
|
new BitMaskTextProp(2, 0xF, "paragraph_flags", new String[] {
|
||||||
"bullet", "bullet.hardfont",
|
"bullet", "bullet.hardfont",
|
||||||
"bullet.hardcolor", "bullet.hardsize"}
|
"bullet.hardcolor", "bullet.hardsize"}
|
||||||
),
|
),
|
||||||
|
@ -105,7 +105,7 @@ public class StyleTextPropAtom extends RecordAtom
|
||||||
new TextProp(2, 0xA0000, "para_unknown_6")
|
new TextProp(2, 0xA0000, "para_unknown_6")
|
||||||
};
|
};
|
||||||
/** All the different kinds of character properties we might handle */
|
/** All the different kinds of character properties we might handle */
|
||||||
public TextProp[] characterTextPropTypes = new TextProp[] {
|
public static TextProp[] characterTextPropTypes = new TextProp[] {
|
||||||
new CharFlagsTextProp(),
|
new CharFlagsTextProp(),
|
||||||
new TextProp(2, 0x10000, "font.index"),
|
new TextProp(2, 0x10000, "font.index"),
|
||||||
new TextProp(2, 0x20000, "font.size"),
|
new TextProp(2, 0x20000, "font.size"),
|
||||||
|
@ -330,6 +330,48 @@ public class StyleTextPropAtom extends RecordAtom
|
||||||
/** Fetch the TextProps that define this styling */
|
/** Fetch the TextProps that define this styling */
|
||||||
public LinkedList getTextPropList() { return textPropList; }
|
public LinkedList getTextPropList() { return textPropList; }
|
||||||
|
|
||||||
|
/** Fetch the TextProp with this name, or null if it isn't present */
|
||||||
|
public TextProp findByName(String textPropName) {
|
||||||
|
for(int i=0; i<textPropList.size(); i++) {
|
||||||
|
TextProp prop = (TextProp)textPropList.get(i);
|
||||||
|
if(prop.getName().equals(textPropName)) {
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Add the TextProp with this name to the list */
|
||||||
|
public TextProp addWithName(String name) {
|
||||||
|
// Find the base TextProp to base on
|
||||||
|
TextProp base = null;
|
||||||
|
for(int i=0; i < StyleTextPropAtom.characterTextPropTypes.length; i++) {
|
||||||
|
if(StyleTextPropAtom.characterTextPropTypes[i].getName().equals(name)) {
|
||||||
|
base = StyleTextPropAtom.characterTextPropTypes[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i=0; i < StyleTextPropAtom.paragraphTextPropTypes.length; i++) {
|
||||||
|
if(StyleTextPropAtom.paragraphTextPropTypes[i].getName().equals(name)) {
|
||||||
|
base = StyleTextPropAtom.paragraphTextPropTypes[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(base == null) {
|
||||||
|
throw new IllegalArgumentException("No TextProp with name " + name + " is defined to add from");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a copy of this property, in the right place to the list
|
||||||
|
TextProp textProp = (TextProp)base.clone();
|
||||||
|
int pos = 0;
|
||||||
|
for(int i=0; i<textPropList.size(); i++) {
|
||||||
|
TextProp curProp = (TextProp)textPropList.get(i);
|
||||||
|
if(textProp.getMask() > curProp.getMask()) {
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textPropList.add(pos, textProp);
|
||||||
|
return textProp;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new collection of text properties (be they paragraph
|
* Create a new collection of text properties (be they paragraph
|
||||||
* or character) which will be groked via a subsequent call to
|
* or character) which will be groked via a subsequent call to
|
||||||
|
@ -504,9 +546,10 @@ public class StyleTextPropAtom extends RecordAtom
|
||||||
/** Fetch the list of if the sub properties match or not */
|
/** Fetch the list of if the sub properties match or not */
|
||||||
public boolean[] getSubPropMatches() { return subPropMatches; }
|
public boolean[] getSubPropMatches() { return subPropMatches; }
|
||||||
|
|
||||||
private BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String[] subPropNames) {
|
private BitMaskTextProp(int sizeOfDataBlock, int maskInHeader, String overallName, String[] subPropNames) {
|
||||||
super(sizeOfDataBlock,maskInHeader,"bitmask");
|
super(sizeOfDataBlock,maskInHeader,"bitmask");
|
||||||
this.subPropNames = subPropNames;
|
this.subPropNames = subPropNames;
|
||||||
|
this.propName = overallName;
|
||||||
subPropMasks = new int[subPropNames.length];
|
subPropMasks = new int[subPropNames.length];
|
||||||
subPropMatches = new boolean[subPropNames.length];
|
subPropMatches = new boolean[subPropNames.length];
|
||||||
}
|
}
|
||||||
|
@ -545,6 +588,7 @@ public class StyleTextPropAtom extends RecordAtom
|
||||||
} else {
|
} else {
|
||||||
dataValue -= subPropMasks[idx];
|
dataValue -= subPropMasks[idx];
|
||||||
}
|
}
|
||||||
|
subPropMatches[idx] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object clone(){
|
public Object clone(){
|
||||||
|
@ -575,7 +619,7 @@ public class StyleTextPropAtom extends RecordAtom
|
||||||
public static final int ENABLE_NUMBERING_2_IDX = 12;
|
public static final int ENABLE_NUMBERING_2_IDX = 12;
|
||||||
|
|
||||||
private CharFlagsTextProp() {
|
private CharFlagsTextProp() {
|
||||||
super(2,0xffff, new String[] {
|
super(2,0xffff, "char_flags", new String[] {
|
||||||
"bold", // 0x0001
|
"bold", // 0x0001
|
||||||
"italic", // 0x0002
|
"italic", // 0x0002
|
||||||
"underline", // 0x0004
|
"underline", // 0x0004
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
package org.apache.poi.hslf.usermodel;
|
package org.apache.poi.hslf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.hslf.model.TextRun;
|
import org.apache.poi.hslf.model.TextRun;
|
||||||
|
import org.apache.poi.hslf.record.StyleTextPropAtom.CharFlagsTextProp;
|
||||||
import org.apache.poi.hslf.record.StyleTextPropAtom.TextPropCollection;
|
import org.apache.poi.hslf.record.StyleTextPropAtom.TextPropCollection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,6 +125,39 @@ public class RichTextRun
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------- Internal helpers on rich text properties -------
|
||||||
|
private boolean isCharFlagsTextPropVal(int index) {
|
||||||
|
if(characterStyle == null) { return false; }
|
||||||
|
|
||||||
|
CharFlagsTextProp cftp = (CharFlagsTextProp)
|
||||||
|
characterStyle.findByName("char_flags");
|
||||||
|
|
||||||
|
if(cftp == null) { return false; }
|
||||||
|
return cftp.getSubValue(index);
|
||||||
|
}
|
||||||
|
private void setCharFlagsTextPropVal(int index, boolean value) {
|
||||||
|
if(characterStyle == null) {
|
||||||
|
parentRun.ensureStyleAtomPresent();
|
||||||
|
}
|
||||||
|
|
||||||
|
CharFlagsTextProp cftp = (CharFlagsTextProp)
|
||||||
|
characterStyle.findByName("char_flags");
|
||||||
|
if(cftp == null) {
|
||||||
|
cftp = (CharFlagsTextProp)characterStyle.addWithName("char_flags");
|
||||||
|
}
|
||||||
|
|
||||||
|
cftp.setSubValue(value,index);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------- Friendly getters / setters on rich text properties -------
|
||||||
|
public boolean isBold() {
|
||||||
|
return isCharFlagsTextPropVal(CharFlagsTextProp.BOLD_IDX);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBold(boolean bold) {
|
||||||
|
setCharFlagsTextPropVal(CharFlagsTextProp.BOLD_IDX, bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal Use Only - get the underlying paragraph style collection.
|
* Internal Use Only - get the underlying paragraph style collection.
|
||||||
|
|
Loading…
Reference in New Issue