Changeset 1747 for trunk/docx4j


Ignore:
Timestamp:
01/11/12 01:25:00 (5 months ago)
Author:
jharrop
Message:

Reinstate SetOverrides?(lvl), and document w:isLgl behaviour.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/model/listnumbering/ListNumberingDefinition.java

    r1746 r1747  
    161161 
    162162            List<Numbering.Num.LvlOverride> levelOverrideNodes = numNode.getLvlOverride();  
    163             if (levelOverrideNodes != null) 
    164             { 
    165                 /* 
    166                  *     <w:lvlOverride w:ilvl="0"> 
    167                                               <w:startOverride w:val="10"/> 
    168                                             </w:lvlOverride> 
    169                  */ 
    170                 for (Numbering.Num.LvlOverride overrideNode : levelOverrideNodes) 
    171                 { 
    172                         log.debug("found LvlOverride " + XmlUtils.marshaltoString(overrideNode, true)); 
    173                     if (overrideNode.getIlvl() != null) 
    174                     { 
    175                         String overrideLevelId = overrideNode.getIlvl().toString(); //getAttributeValue(node, "w:ilvl"); 
    176                         log.debug(".. " + overrideLevelId ); 
    177  
    178                         if (!overrideLevelId.equals("") ) 
    179                         {                             
    180                             // Is there a w:startOverride? 
    181                                 // This is given effect the first time the instance is encountered in the document 
    182                             StartOverride startOverride = overrideNode.getStartOverride(); 
    183                             if (startOverride!=null 
    184                                         && startOverride.getVal()!=null) { 
    185                                 this.levels.get(overrideLevelId).setStartValue(startOverride.getVal().subtract(BigInteger.ONE)); 
    186                                 log.debug("level " + overrideLevelId + "starts at " + startOverride.getVal() ); 
    187                             } 
    188                         } 
    189                     } 
    190 //                      Lvl ilvl = overrideNode.getLvl(); 
    191 //                    if (ilvl != null) 
    192 //                    { 
    193 //                    this.levels.get(overrideLevelId).SetOverrides(overrideLevelId); 
    194 //                    }                     
    195                 } 
    196             } 
     163                        if (levelOverrideNodes != null) { 
     164                                /* 
     165                                 * <w:lvlOverride w:ilvl="0"> <w:startOverride w:val="10"/> 
     166                                 * </w:lvlOverride> 
     167                                 */ 
     168                                for (Numbering.Num.LvlOverride overrideNode : levelOverrideNodes) { 
     169                                        log.debug("found LvlOverride " 
     170                                                        + XmlUtils.marshaltoString(overrideNode, true)); 
     171                                         
     172                                        if (overrideNode.getIlvl() == null) { 
     173                                                log.warn("Missing @w:ilvl! " + XmlUtils.marshaltoString(overrideNode, true)); 
     174                                        } else { 
     175                                                String overrideLevelId = overrideNode.getIlvl().toString();  
     176                                                log.debug(".. " + overrideLevelId); 
     177 
     178                                                if (!overrideLevelId.equals("")) { 
     179                                                        // Is there a w:startOverride? 
     180                                                        // This is only given effect the first time the instance 
     181                                                        // is encountered in the document 
     182                                                        StartOverride startOverride = overrideNode.getStartOverride(); 
     183                                                        if (startOverride != null 
     184                                                                        && startOverride.getVal() != null) { 
     185                                                                 
     186                                                                this.levels.get(overrideLevelId).setStartValue( 
     187                                                                                startOverride.getVal().subtract(BigInteger.ONE)); 
     188                                                                log.debug("level " + overrideLevelId + "starts at " + startOverride.getVal()); 
     189                                                        } 
     190                                                } 
     191 
     192                                                Lvl lvl = overrideNode.getLvl(); 
     193                                                if (lvl != null) { 
     194                                                        this.levels.get(overrideLevelId).SetOverrides(lvl); 
     195                                                } 
     196                                                 
     197                                        } 
     198 
     199                                } 
     200                        } 
    197201        } 
    198202    } 
     
    246250        } 
    247251 
    248     /// <summary> 
    249     /// returns a String containing the current state of the counters, up to the indicated level 
    250     /// </summary> 
    251     /// <param name="level"></param> 
    252     /// <returns></returns> 
     252    /** 
     253     * returns a String containing the current state of the counters, up to the indicated level 
     254     *  
     255     * @param level 
     256     * @return 
     257     */ 
    253258    public String GetCurrentNumberString(String level) 
    254259    { 
    255260        ListLevel controllingLvl = this.levels.get( level );  
    256261         
    257         boolean isLegal = controllingLvl.getJaxbAbstractLvl().getIsLgl() !=null  
     262        boolean isLegal = level.equals("1") 
     263                                                && controllingLvl.getJaxbAbstractLvl().getIsLgl() !=null  
    258264                                                && controllingLvl.getJaxbAbstractLvl().getIsLgl().isVal(); 
    259         log.debug("isLegal: " + isLegal); 
     265        /* 
     266         * Explanation of <w:isLgl/> 
     267         *  
     268         * COnsider Word (2010)'s built-in legal numbering: 
     269         *  
     270         *   <w:abstractNum w:abstractNumId="2"> 
     271                            <w:nsid w:val="78220137"/> 
     272                            <w:multiLevelType w:val="multilevel"/> 
     273                            <w:tmpl w:val="0DE0BCC2"/> 
     274                            <w:lvl w:ilvl="0"> 
     275                              <w:start w:val="1"/> 
     276                              <w:numFmt w:val="upperRoman"/> 
     277                              <w:pStyle w:val="Heading1"/> 
     278                              <w:lvlText w:val="Article %1."/> 
     279                              <w:lvlJc w:val="left"/> 
     280                              <w:pPr> 
     281                                <w:ind w:left="0" w:firstLine="0"/> 
     282                              </w:pPr> 
     283                            </w:lvl> 
     284                            <w:lvl w:ilvl="1"> 
     285                              <w:start w:val="1"/> 
     286                              <w:numFmt w:val="decimalZero"/> 
     287                              <w:pStyle w:val="Heading2"/> 
     288                              <w:isLgl/>                        <---------------- 
     289                              <w:lvlText w:val="Section %1.%2"/> 
     290                              <w:lvlJc w:val="left"/> 
     291                              <w:pPr> 
     292                                <w:ind w:left="0" w:firstLine="0"/> 
     293                              </w:pPr> 
     294                            </w:lvl> 
     295                            <w:lvl w:ilvl="2"> 
     296                              <w:start w:val="1"/> 
     297                              <w:numFmt w:val="lowerLetter"/> 
     298                              <w:pStyle w:val="Heading3"/> 
     299                              <w:lvlText w:val="(%3)"/> 
     300                              <w:lvlJc w:val="left"/> 
     301                              <w:pPr> 
     302                                <w:ind w:left="720" w:hanging="432"/> 
     303                              </w:pPr> 
     304                            </w:lvl> 
     305                                                   
     306         * Notice <w:isLgl/> at @w:ilvl="1".  This produces: 
     307         *  
     308         *   Article I. 
     309         *   Section 1.01 
     310         *    
     311         * Without it, you'd get: 
     312         *  
     313         *   Article I. 
     314         *   Section I.01 
     315         *   
     316         * In other words, the default numbering behaviour is to  
     317         * format a level using the w:numFmt specified in that level. 
     318         * w:isLgl overrides that behaviour, and uses decimal 
     319         * numbering for ilvl 0.  w:isLgl only seems to have  
     320         * any effect in Word 2010 when specified at ilvl 1 
     321         * (I tried it at a deeper level, and is behaved as if 
     322         *  not present at all). 
     323         */ 
    260324         
    261325        String formatString = controllingLvl.getLevelText(); 
     
    277341                    int levelId =  Integer.parseInt(formatStringLevel) - 1; 
    278342                    ListLevel lvl = this.levels.get( Integer.toString(levelId) ); 
    279                     if (level.equals("" + levelId) // this bit is the actual level  
    280                                 && lvl.getNumFmt().equals( NumberFormat.DECIMAL_ZERO )) { // Where this level sets <w:isLgl>, what other formats are to be respected? 
    281                         result.append(lvl.getCurrentValueFormatted() );                          
    282                     } else if (isLegal ) { 
    283                         // Use normal decimal numbering 
     343                    if (levelId==0  && isLegal ) { 
     344                        // Special case: Use normal decimal numbering 
    284345                        result.append(lvl.getCurrentValueUnformatted() ); 
    285346                         
Note: See TracChangeset for help on using the changeset viewer.