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}