001package com.hfg.xml.msofficexml.docx.wordprocessingml; 002 003import java.util.ArrayList; 004import java.util.List; 005 006import com.hfg.graphics.units.Twips; 007import com.hfg.xml.XMLName; 008import com.hfg.xml.XMLTag; 009import com.hfg.xml.msofficexml.docx.Docx; 010import com.hfg.xml.msofficexml.docx.wordprocessingml.style.WmlJustification; 011 012//------------------------------------------------------------------------------ 013/** 014 Represents an Office Open XML document abstract numbering (<w:abstractNum>) tag. 015 016 @author J. Alex Taylor, hairyfatguy.com 017 */ 018//------------------------------------------------------------------------------ 019// com.hfg XML/HTML Coding Library 020// 021// This library is free software; you can redistribute it and/or 022// modify it under the terms of the GNU Lesser General Public 023// License as published by the Free Software Foundation; either 024// version 2.1 of the License, or (at your option) any later version. 025// 026// This library is distributed in the hope that it will be useful, 027// but WITHOUT ANY WARRANTY; without even the implied warranty of 028// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 029// Lesser General Public License for more details. 030// 031// You should have received a copy of the GNU Lesser General Public 032// License along with this library; if not, write to the Free Software 033// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 034// 035// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com 036// jataylor@hairyfatguy.com 037//------------------------------------------------------------------------------ 038 039public class WmlAbstractNumbering extends WmlXMLTag 040{ 041 private static int sAbstractNumIdSrc = 1; 042 043 private List<WmlNumberingLevelDef> mLevelTags; 044 045 //--------------------------------------------------------------------------- 046 public WmlAbstractNumbering(Docx inDocx) 047 { 048 super(WmlXML.ABSTRACT_NUM, inDocx); 049 050 setAttribute(WmlXML.ABSTRACT_NUM_ID_ATT, sAbstractNumIdSrc++); 051 } 052 053 054 //--------------------------------------------------------------------------- 055 public int getId() 056 { 057 return Integer.parseInt(getAttributeValue(WmlXML.ABSTRACT_NUM_ID_ATT)); 058 } 059 060 //--------------------------------------------------------------------------- 061 public WmlAbstractNumbering addLevel(WmlNumberingLevelDef inValue) 062 { 063 if (null == mLevelTags) 064 { 065 mLevelTags = new ArrayList<>(3); 066 mLevelTags.add(inValue); 067 } 068 069 addSubtag(inValue); 070 071 return this; 072 } 073 074 //--------------------------------------------------------------------------- 075 public WmlAbstractNumbering setMultiLevelType(WmlNumberingDefinitionType inValue) 076 { 077 XMLName tagName = WmlXML.MULTI_LEVEL_TYPE; 078 XMLTag tag = getOptionalSubtagByName(tagName); 079 if (null == tag) 080 { 081 tag = new WmlXMLTag(tagName, getParentDoc()); 082 addSubtag(tag); 083 } 084 085 tag.setAttribute(WmlXML.VALUE_ATT, inValue); 086 087 return this; 088 } 089 090 //--------------------------------------------------------------------------- 091 public WmlAbstractNumbering setRestartNumberingAfterBreak(boolean inValue) 092 { 093 setAttribute(WmlXML.RESTART_NUM_AFTER_BREAK_ATT, inValue ? 1 : 0); 094 095 return this; 096 } 097 098 //--------------------------------------------------------------------------- 099 /** 100 * Returns the defined level objects. 101 * @return a List of WmlLevel objects 102 */ 103 public List<WmlNumberingLevelDef> getLevels() 104 { 105 if (null == mLevelTags) 106 { 107 // Check if it has been added via addSubtag()... 108 mLevelTags = (List<WmlNumberingLevelDef>) (Object) getSubtagsByName(WmlXML.LEVEL); 109 } 110 111 return mLevelTags; 112 } 113 114 //--------------------------------------------------------------------------- 115 public static List<WmlAbstractNumbering> generateDefaultValues(Docx inParentDoc) 116 { 117 List<WmlAbstractNumbering> defaultValues = new ArrayList<>(5); 118 119 120 WmlNumberingLevelDef level0 = new WmlNumberingLevelDef(inParentDoc) 121 .setLevel(0) 122 .setStartingValue(1) 123 .setNumberingFormat(WmlNumberingFormat.decimal) 124 .setLevelText("%1.") 125 .setJustification(WmlJustification.left); 126 level0.getParagraphProperties().getIndentation().setLeft(new Twips(720)).setHanging(new Twips(360)); 127 128 WmlNumberingLevelDef level1 = new WmlNumberingLevelDef(inParentDoc) 129 .setLevel(1) 130 .setStartingValue(1) 131 .setNumberingFormat(WmlNumberingFormat.lowerLetter) 132 .setLevelText("%2.") 133 .setJustification(WmlJustification.left); 134 level1.getParagraphProperties().getIndentation().setLeft(new Twips(1440)).setHanging(new Twips(360)); 135 136 WmlNumberingLevelDef level2 = new WmlNumberingLevelDef(inParentDoc) 137 .setLevel(2) 138 .setTentative(true) 139 .setStartingValue(1) 140 .setNumberingFormat(WmlNumberingFormat.lowerRoman) 141 .setLevelText("%3.") 142 .setJustification(WmlJustification.right); 143 level2.getParagraphProperties().getIndentation().setLeft(new Twips(2160)).setHanging(new Twips(180)); 144 145 WmlNumberingLevelDef level3 = new WmlNumberingLevelDef(inParentDoc) 146 .setLevel(3) 147 .setTentative(true) 148 .setStartingValue(1) 149 .setNumberingFormat(WmlNumberingFormat.decimal) 150 .setLevelText("%4.") 151 .setJustification(WmlJustification.left); 152 level3.getParagraphProperties().getIndentation().setLeft(new Twips(2880)).setHanging(new Twips(360)); 153 154 WmlNumberingLevelDef level4 = new WmlNumberingLevelDef(inParentDoc) 155 .setLevel(4) 156 .setTentative(true) 157 .setStartingValue(1) 158 .setNumberingFormat(WmlNumberingFormat.lowerLetter) 159 .setLevelText("%5.") 160 .setJustification(WmlJustification.left); 161 level4.getParagraphProperties().getIndentation().setLeft(new Twips(3600)).setHanging(new Twips(360)); 162 163 WmlNumberingLevelDef level5 = new WmlNumberingLevelDef(inParentDoc) 164 .setLevel(5) 165 .setTentative(true) 166 .setStartingValue(1) 167 .setNumberingFormat(WmlNumberingFormat.lowerRoman) 168 .setLevelText("%6.") 169 .setJustification(WmlJustification.right); 170 level5.getParagraphProperties().getIndentation().setLeft(new Twips(4320)).setHanging(new Twips(180)); 171 172 WmlNumberingLevelDef level6 = new WmlNumberingLevelDef(inParentDoc) 173 .setLevel(6) 174 .setTentative(true) 175 .setStartingValue(1) 176 .setNumberingFormat(WmlNumberingFormat.decimal) 177 .setLevelText("%7.") 178 .setJustification(WmlJustification.left); 179 level6.getParagraphProperties().getIndentation().setLeft(new Twips(5040)).setHanging(new Twips(360)); 180 181 WmlNumberingLevelDef level7 = new WmlNumberingLevelDef(inParentDoc) 182 .setLevel(7) 183 .setTentative(true) 184 .setStartingValue(1) 185 .setNumberingFormat(WmlNumberingFormat.lowerLetter) 186 .setLevelText("%8.") 187 .setJustification(WmlJustification.left); 188 level7.getParagraphProperties().getIndentation().setLeft(new Twips(5760)).setHanging(new Twips(360)); 189 190 WmlNumberingLevelDef level8 = new WmlNumberingLevelDef(inParentDoc) 191 .setLevel(8) 192 .setTentative(true) 193 .setStartingValue(1) 194 .setNumberingFormat(WmlNumberingFormat.lowerRoman) 195 .setLevelText("%9.") 196 .setJustification(WmlJustification.right); 197 level8.getParagraphProperties().getIndentation().setLeft(new Twips(6480)).setHanging(new Twips(180)); 198 199 WmlAbstractNumbering value1 = new WmlAbstractNumbering(inParentDoc) 200 .setMultiLevelType(WmlNumberingDefinitionType.hybridMultilevel) 201 .addLevel(level0) 202 .addLevel(level1) 203 .addLevel(level2) 204 .addLevel(level3) 205 .addLevel(level4) 206 .addLevel(level5) 207 .addLevel(level6) 208 .addLevel(level7) 209 .addLevel(level8); 210 211 defaultValues.add(value1); 212 213 214 215 216 217 218 219 level0 = new WmlNumberingLevelDef(inParentDoc) 220 .setLevel(0) 221 .setStartingValue(1) 222 .setNumberingFormat(WmlNumberingFormat.bullet) 223 .setLevelText("\uF0B7") 224 .setJustification(WmlJustification.left); 225 level0.getParagraphProperties().getIndentation().setLeft(new Twips(720)).setHanging(new Twips(360)); 226 level0.getTextRunProperties().setFont("Symbol"); 227 228 level1 = new WmlNumberingLevelDef(inParentDoc) 229 .setLevel(1) 230 .setTentative(true) 231 .setStartingValue(1) 232 .setNumberingFormat(WmlNumberingFormat.bullet) 233 .setLevelText("o") 234 .setJustification(WmlJustification.left); 235 level1.getParagraphProperties().getIndentation().setLeft(new Twips(1440)).setHanging(new Twips(360)); 236 level1.getTextRunProperties().setFont("Courier New"); 237 238 level2 = new WmlNumberingLevelDef(inParentDoc) 239 .setLevel(2) 240 .setTentative(true) 241 .setStartingValue(1) 242 .setNumberingFormat(WmlNumberingFormat.bullet) 243 .setLevelText("\uF0A7") 244 .setJustification(WmlJustification.left); 245 level2.getParagraphProperties().getIndentation().setLeft(new Twips(2160)).setHanging(new Twips(360)); 246 level2.getTextRunProperties().setFont("Wingdings"); 247 248 level3 = new WmlNumberingLevelDef(inParentDoc) 249 .setLevel(3) 250 .setTentative(true) 251 .setStartingValue(1) 252 .setNumberingFormat(WmlNumberingFormat.bullet) 253 .setLevelText("\uF0B7") 254 .setJustification(WmlJustification.left); 255 level3.getParagraphProperties().getIndentation().setLeft(new Twips(2880)).setHanging(new Twips(360)); 256 level3.getTextRunProperties().setFont("Symbol"); 257 258 level4 = new WmlNumberingLevelDef(inParentDoc) 259 .setLevel(4) 260 .setTentative(true) 261 .setStartingValue(1) 262 .setNumberingFormat(WmlNumberingFormat.bullet) 263 .setLevelText("o") 264 .setJustification(WmlJustification.left); 265 level4.getParagraphProperties().getIndentation().setLeft(new Twips(3600)).setHanging(new Twips(360)); 266 level4.getTextRunProperties().setFont("Courier New"); 267 268 level5 = new WmlNumberingLevelDef(inParentDoc) 269 .setLevel(5) 270 .setTentative(true) 271 .setStartingValue(1) 272 .setNumberingFormat(WmlNumberingFormat.bullet) 273 .setLevelText("\uF0A7") 274 .setJustification(WmlJustification.left); 275 level5.getParagraphProperties().getIndentation().setLeft(new Twips(4320)).setHanging(new Twips(360)); 276 level5.getTextRunProperties().setFont("Wingdings"); 277 278 279 level6 = new WmlNumberingLevelDef(inParentDoc) 280 .setLevel(6) 281 .setTentative(true) 282 .setStartingValue(1) 283 .setNumberingFormat(WmlNumberingFormat.bullet) 284 .setLevelText("\uF0B7") 285 .setJustification(WmlJustification.left); 286 level6.getParagraphProperties().getIndentation().setLeft(new Twips(5040)).setHanging(new Twips(360)); 287 level6.getTextRunProperties().setFont("Symbol"); 288 289 level7 = new WmlNumberingLevelDef(inParentDoc) 290 .setLevel(7) 291 .setTentative(true) 292 .setStartingValue(1) 293 .setNumberingFormat(WmlNumberingFormat.bullet) 294 .setLevelText("o") 295 .setJustification(WmlJustification.left); 296 level7.getParagraphProperties().getIndentation().setLeft(new Twips(5760)).setHanging(new Twips(360)); 297 level7.getTextRunProperties().setFont("Courier New"); 298 299 level8 = new WmlNumberingLevelDef(inParentDoc) 300 .setLevel(8) 301 .setTentative(true) 302 .setStartingValue(1) 303 .setNumberingFormat(WmlNumberingFormat.bullet) 304 .setLevelText("\uF0A7") 305 .setJustification(WmlJustification.left); 306 level8.getParagraphProperties().getIndentation().setLeft(new Twips(6480)).setHanging(new Twips(360)); 307 level8.getTextRunProperties().setFont("Wingdings"); 308 309 WmlAbstractNumbering value2 = new WmlAbstractNumbering(inParentDoc) 310 .setMultiLevelType(WmlNumberingDefinitionType.hybridMultilevel) 311 .setRestartNumberingAfterBreak(false) 312 .addLevel(level0) 313 .addLevel(level1) 314 .addLevel(level2) 315 .addLevel(level3) 316 .addLevel(level4) 317 .addLevel(level5) 318 .addLevel(level6) 319 .addLevel(level7) 320 .addLevel(level8); 321 322 defaultValues.add(value2); 323 324 325 326 327 return defaultValues; 328 } 329 330}