[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-bugs-dist
Subject:    [Bug 59508] list-style-type: decimal-leading-zero was ignorred
From:       Allan Sandfeld <kde () carewolf ! com>
Date:       2004-12-01 0:31:12
Message-ID: 20041201003112.21632.qmail () ktown ! kde ! org
[Download RAW message or body]

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
        
http://bugs.kde.org/show_bug.cgi?id=59508        
kde carewolf com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED



------- Additional Comments From kde carewolf com  2004-12-01 01:31 -------
CVS commit by carewolf: 

Implement decimal-leading-zero list-style-type.
(Throwing in the code to do arabic and persian numerics as a bonus)
FEATURE: 59508


  M +4 -0      ChangeLog   1.345
  M +66 -3     rendering/render_list.cpp   1.98
  M +3 -1      rendering/render_list.h   1.38


--- kdelibs/khtml/ChangeLog  #1.344:1.345
 @ -1,2 +1,6  @
+2004-12-01  Allan Sandfeld Jensen <kde carewolf com>
+
+        * render/render_list.{cpp,h}: Implement list-style-type: decimal-leading-zero
+
 2004-11-30  Germain Garand  <germain ebooksfrance org>
 

--- kdelibs/khtml/rendering/render_list.cpp  #1.97:1.98
 @ -118,4 +118,19  @ static QString toHebrew( int number ) {
 }
 
+static QString toNumeric( int number, int base ) {
+    QString letter = QString::number(number);
+    for(int i = 0; i < letter.length(); i++) {
+        letter[i] = QChar(letter[i].digitValue()+base);
+    }
+}
+
+inline static QString toArabicIndic( int number ) {
+    return toNumeric(number, 0x660);
+}
+
+inline static QString toPersianUrdu( int number ) {
+    return toNumeric(number, 0x6F0);
+}
+
 // -------------------------------------------------------------------------
 
 @ -273,8 +288,42  @ void RenderListItem::calcListValue()
 }
 
+void RenderListItem::calcListTotal()
+{
+    // only called from the marker so..
+    KHTMLAssert(m_marker);
+
+    // first see if our siblings have already counted the total
+    RenderObject *o = previousSibling();
+    while ( o && (!o->isListItem() || o->style()->listStyleType() == LNONE) )
+        o = o->previousSibling();
+    if( o && o->isListItem() && o->style()->listStyleType() != LNONE ) {
+        RenderListItem *item = static_cast<RenderListItem *>(o);
+        m_marker->m_total = item->m_marker->m_total;
+    }
+    else {
+        // count total number of sibling items
+        const RenderObject* o = parent();
+        while ( o && o->isAnonymous() )
+            o = o->parent();
+
+        unsigned int count;
+        if (o->element() && o->element()->id() == ID_OL)
+            count = static_cast<DOM::HTMLOListElementImpl*>(o->element())->start() - 1;
+        else
+            count = 0;
+
+        o = o->firstChild();
+        while (o) {
+            if (o->isListItem()) count++;
+            o = o->nextSibling();
+        }
+        m_marker->m_total = count;
+    }
+}
+
 // -----------------------------------------------------------
 
 RenderListMarker::RenderListMarker(DOM::DocumentImpl* node)
-    : RenderBox(node), m_listImage(0), m_value(-1)
+    : RenderBox(node), m_listImage(0), m_value(-1), m_total(-1)
 {
     // init RenderObject attributes
 @ -498,9 +547,23  @ void RenderListMarker::calcMinMaxWidth()
     case HIRAGANA_IROHA:
     case KATAKANA_IROHA:
-    case DECIMAL_LEADING_ZERO:
         // ### unsupported, we use decimal instead
     case LDECIMAL:
-        m_item.sprintf( "%2ld", m_value );
+        m_item.setNum ( m_value );
         break;
+    case DECIMAL_LEADING_ZERO: {
+        if (m_total < 0)
+            m_listItem->calcListTotal();
+        int decimals = 2;
+        int t = m_total/100;
+        while (t>0) {
+            t = t/10;
+            decimals++;
+        }
+        decimals = kMax(decimals, 2);
+        QString num = QString::number(m_value);
+        m_item.fill('0',decimals-num.length());
+        m_item.append(num);
+        break;
+    }
     case LOWER_ROMAN:
         m_item = toRoman( m_value, false );

--- kdelibs/khtml/rendering/render_list.h  #1.37:1.38
 @ -55,4 +55,5  @ public:
     void setValue( long v ) { predefVal = v; }
     void calcListValue();
+    void calcListTotal();
 
     virtual void layout( );
 @ -110,5 +111,6  @ protected:
     QString m_item;
     CachedImage *m_listImage;
-    long m_value;
+    int m_value;
+    int m_total;
     RenderListItem* m_listItem;
 };
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic