/* (non-Javadoc)
  * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
  */
 protected void paintComponent(Graphics g) {
   g.setColor(Color.BLACK);
   HTMLElementImpl rootElement = this.rootElement;
   String type = rootElement.getAttribute("type");
   int bulletType = 0;
   boolean numbered = rootElement instanceof HTMLOListElement;
   FontMetrics fm = null;
   int bulletNumber = 0;
   if (numbered) {
     HTMLOListElementImpl oList = (HTMLOListElementImpl) rootElement;
     bulletNumber = oList.getStart();
     Font f = g.getFont();
     fm = this.getFontMetrics(f);
   } else {
     if ("disc".equalsIgnoreCase(type)) {
       bulletType = 0;
     } else if ("circle".equalsIgnoreCase(type)) {
       bulletType = 1;
     } else if ("square".equals(type)) {
       bulletType = 2;
     } else {
       bulletType = this.nesting;
     }
   }
   int ncomponents = this.getComponentCount();
   for (int i = 0; i < ncomponents; i++) {
     Object c = this.getComponent(i);
     if (c instanceof HtmlBlock) {
       HtmlBlock hp = (HtmlBlock) c;
       Rectangle bounds = hp.getBounds();
       int lineHeight = hp.getFirstLineHeight();
       int bulletRight = bounds.x - BULLET_SPACING;
       int bulletBottom = bounds.y + lineHeight;
       if (numbered) {
         // TODO: value attribute from LI element
         // TODO: type attribute from LI element
         String numberText = bulletNumber + ".";
         int bulletLeft = bulletRight - fm.stringWidth(numberText);
         int bulletY = bulletBottom - fm.getDescent();
         g.drawString(numberText, bulletLeft, bulletY);
       } else {
         bulletBottom -= BULLET_BOTTOM_PADDING;
         int bulletTop = bulletBottom - BULLET_HEIGHT;
         int bulletLeft = bulletRight - BULLET_WIDTH;
         if (bulletType == 0) {
           g.fillOval(bulletLeft, bulletTop, BULLET_WIDTH, BULLET_HEIGHT);
         } else if (bulletType == 1) {
           g.drawOval(bulletLeft, bulletTop, BULLET_WIDTH, BULLET_HEIGHT);
         } else {
           g.fillRect(bulletLeft, bulletTop, BULLET_WIDTH, BULLET_HEIGHT);
         }
       }
       bulletNumber++;
     }
   }
 }
 private void doLayoutImpl(int availWidth, int availHeight) {
   if (availHeight != this.lastAvailHeight && availWidth != this.lastAvailWidth) {
     this.lastAvailHeight = availHeight;
     this.lastAvailWidth = availWidth;
     Insets insets = this.getInsets();
     int extraWidth = insets.right + insets.left;
     int blockWidth = availWidth - INDENT - extraWidth;
     int maxBlockWidth = blockWidth;
     ArrayList liDescendents = this.rootElement.getDescendents(new LiFilter());
     int size = liDescendents.size();
     this.removeAll();
     int y = insets.top;
     int newNesting = this.nesting + 1;
     for (int i = 0; i < size; i++) {
       HTMLElementImpl liElement = (HTMLElementImpl) liDescendents.get(i);
       HtmlBlock block = new HtmlBlock(newNesting, layoutArgs);
       this.add(block);
       block.setRootNode(liElement);
       Dimension renderSize = block.layoutFor(blockWidth, 0);
       int actualBlockWidth;
       if (renderSize.width > blockWidth) {
         actualBlockWidth = renderSize.width;
       } else {
         actualBlockWidth = blockWidth;
       }
       int blockHeight = renderSize.height;
       block.setBounds(insets.left + INDENT, y, actualBlockWidth, blockHeight);
       y += blockHeight + ITEM_SPACING;
       if (actualBlockWidth > maxBlockWidth) {
         maxBlockWidth = actualBlockWidth;
       }
     }
     this.preferredHeight = y - ITEM_SPACING + insets.bottom;
     this.preferredWidth = maxBlockWidth + INDENT + insets.left + insets.right;
   }
 }