package com.adobe.dp.office.word;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
public class NumberingDefinitionInstance {
private AbstractNumberingDefinition abstractNumbering;
Hashtable startOverrides = new Hashtable();
int numId;
boolean instantiated;
// overrides
Hashtable numberingLevelDefinitions = new Hashtable();
WordDocument doc;
NumberingDefinitionInstance(WordDocument doc, int numId) {
this.doc = doc;
this.numId = numId;
}
static void fillDefsFrom(Hashtable to, Hashtable from) {
Enumeration keys = from.keys();
while (keys.hasMoreElements()) {
Integer key = (Integer) keys.nextElement();
if (to.get(key) == null) {
NumberingLevelDefinition levelDef = (NumberingLevelDefinition) from.get(key);
to.put(key, levelDef.cloneLevel());
}
}
}
Hashtable getNumberingLevelDefinitions() {
if (!instantiated) {
instantiated = true;
Hashtable defs = abstractNumbering.getNumberingLevelDefinitions(doc);
fillDefsFrom(numberingLevelDefinitions, defs);
}
return numberingLevelDefinitions;
}
public Iterator iteratorForLevel(int lvl) {
Integer key = new Integer(lvl);
Hashtable defs = getNumberingLevelDefinitions();
NumberingLevelDefinition levelDef = (NumberingLevelDefinition) defs.get(key);
if (levelDef == null)
return null;
if (levelDef.iterator == null)
levelDef.iterator = new NumberingLabelIterator(this, levelDef);
return levelDef.iterator;
}
void resetLevels(int lvl) {
Enumeration keys = numberingLevelDefinitions.keys();
while (keys.hasMoreElements()) {
Integer key = (Integer) keys.nextElement();
NumberingLevelDefinition def = (NumberingLevelDefinition) numberingLevelDefinitions.get(key);
if (def == null)
continue;
if (key.intValue() <= lvl) {
if (def.iterator == null)
def.iterator = new NumberingLabelIterator(this, def);
def.iterator.first = false;
} else {
if (def.lvlRestart == lvl && def.iterator != null)
def.iterator.reset();
}
}
}
String formatText(String text, int maxLevel) {
int index = text.indexOf('%');
if (index < 0)
return text;
StringBuffer res = new StringBuffer();
int prevIndex = 0;
while (true) {
res.append(text.substring(prevIndex, index));
index++;
if (index >= text.length())
break;
char c = text.charAt(index);
if ('1' <= c && c <= '9') {
int level = c - '1'; // one-based in Microsoft infinite wisdom
if (level <= maxLevel) {
NumberingLabelIterator it = (NumberingLabelIterator) iteratorForLevel(level);
if (it != null)
res.append(it.getNumberStr());
}
} else {
res.append(c);
}
prevIndex = index + 1;
index = text.indexOf('%', index);
if (index < 0)
index = text.length();
}
return res.toString();
}
void setAbstractNumbering(AbstractNumberingDefinition abstractNumbering) {
if (abstractNumbering != null) {
this.abstractNumbering = abstractNumbering;
abstractNumbering.instances.add(this);
}
}
}