+2006-02-04 Andrew Wellington <proton@wiretapped.net>
+
+ Reviewed and tweaked by Darin.
+
+ - fixed regressions caused by fix for bug 5776 earlier today
+
+ * rendering/render_list.h: Remove m_value from RenderListMarker, add it to RenderListItem.
+ A few other tweaks, including getting rid of "friend" relationship.
+ * rendering/render_list.cpp:
+ (RenderListItem::RenderListItem): Initialize m_value.
+ (RenderListItem::setStyle): Restore old behavior of making no marker for LNONE case.
+ (RenderListItem::calcValue): Work on m_value, not m_marker->m_value.
+ (RenderListItem::resetValue): Reset m_value, even if there's no marker.
+ (RenderListMarker::RenderListMarker): Remove code to set up m_value.
+ (RenderListMarker::calcMinMaxWidth): Get marker value from list item.
+
+ * rendering/RenderContainer.cpp: (updateListMarkerNumbers): Call resetValue by its new name.
+
2006-02-04 Maciej Stachowiak <mjs@apple.com>
Reviewed by Hyatt.
static void updateListMarkerNumbers(RenderObject *child)
{
for (RenderObject *r = child; r && r->isListItem(); r = r->nextSibling())
- static_cast<RenderListItem *>(r)->resetMarkerValue();
+ static_cast<RenderListItem *>(r)->resetValue();
}
void RenderContainer::addChild(RenderObject *newChild, RenderObject *beforeChild)
{
-#ifdef DEBUG_LAYOUT
- kdDebug( 6040 ) << this << ": " << renderName() << "(RenderObject)::addChild( " << newChild << ": " <<
- newChild->renderName() << ", " << (beforeChild ? beforeChild->renderName() : "0") << " )" << endl;
-#endif
-
bool needsTable = false;
if(!newChild->isText() && !newChild->isReplaced()) {
case TABLE_ROW_GROUP:
case TABLE_HEADER_GROUP:
case TABLE_FOOTER_GROUP:
-
- //kdDebug( 6040 ) << "adding section" << endl;
if ( !isTable() )
needsTable = true;
break;
case TABLE_ROW:
- //kdDebug( 6040 ) << "adding row" << endl;
if ( !isTableSection() )
needsTable = true;
break;
case TABLE_CELL:
- //kdDebug( 6040 ) << "adding cell" << endl;
if ( !isTableRow() )
needsTable = true;
// I'm not 100% sure this is the best way to fix this, but without this
if( beforeChild && beforeChild->isAnonymous() && beforeChild->isTable() )
table = static_cast<RenderTable *>(beforeChild);
else {
- //kdDebug( 6040 ) << "creating anonymous table" << endl;
table = new (renderArena()) RenderTable(document() /* is anonymous */);
RenderStyle *newStyle = new (renderArena()) RenderStyle();
newStyle->inheritFrom(style());
// -------------------------------------------------------------------------
RenderListItem::RenderListItem(DOM::NodeImpl* node)
- : RenderBlock(node), _notInList(false)
+ : RenderBlock(node), predefVal(-1), m_marker(0), _notInList(false), m_value(-1)
{
// init RenderObject attributes
setInline(false); // our object is not Inline
-
- predefVal = -1;
- m_marker = 0;
}
void RenderListItem::setStyle(RenderStyle *_style)
{
RenderBlock::setStyle(_style);
- if (!(style()->listStyleImage() && style()->listStyleImage()->isErrorImage())) {
+ if (style()->listStyleType() != LNONE ||
+ (style()->listStyleImage() && !style()->listStyleImage()->isErrorImage())) {
RenderStyle *newStyle = new (renderArena()) RenderStyle();
newStyle->ref();
// The marker always inherits from the list item, regardless of where it might end
}
}
-RenderListItem::~RenderListItem()
-{
-}
-
void RenderListItem::destroy()
{
if (m_marker) {
return 0;
}
-void RenderListItem::calcListValue()
+void RenderListItem::calcValue()
{
- // Called by the marker, so we know there is a marker.
- ASSERT(m_marker);
-
- // Only called when the value is known.
- ASSERT(m_marker->m_value == -1);
-
- int value;
if (predefVal != -1)
- value = predefVal;
+ m_value = predefVal;
else {
NodeImpl* list = enclosingList(node());
RenderListItem* item = previousListItem(list, this);
- if (item)
- value = item->value() + 1;
- else if (list && list->hasTagName(olTag))
- value = static_cast<HTMLOListElementImpl*>(list)->start();
+ if (item) {
+ // FIXME: This recurses to a possible depth of the length of the list.
+ // That's not good -- we need to change this to an iterative algorithm.
+ if (item->value() == -1)
+ item->calcValue();
+ m_value = item->value() + 1;
+ } else if (list && list->hasTagName(olTag))
+ m_value = static_cast<HTMLOListElementImpl*>(list)->start();
else
- value = 1;
+ m_value = 1;
}
- m_marker->m_value = value;
}
bool RenderListItem::isEmpty() const
return 0;
}
-void RenderListItem::resetMarkerValue()
+void RenderListItem::resetValue()
{
- if (!m_marker)
- return;
-
- m_marker->m_value = -1;
- m_marker->setNeedsLayoutAndMinMaxRecalc();
+ m_value = -1;
+ if (m_marker)
+ m_marker->setNeedsLayoutAndMinMaxRecalc();
}
void RenderListItem::updateMarkerLocation()
{
KHTMLAssert( needsLayout() );
KHTMLAssert( minMaxKnown() );
-
+
updateMarkerLocation();
RenderBlock::layout();
}
// -----------------------------------------------------------
RenderListMarker::RenderListMarker(DocumentImpl* document)
- : RenderBox(document), m_listImage(0), m_value(-1)
+ : RenderBox(document), m_listImage(0)
{
// init RenderObject attributes
setInline(true); // our object is Inline
setReplaced(true); // pretend to be replaced
- // val = -1;
- // m_listImage = 0;
}
RenderListMarker::~RenderListMarker()
return;
}
- if (m_value < 0) // not yet calculated
- m_listItem->calcListValue();
+ if (m_listItem->value() < 0) // not yet calculated
+ m_listItem->calcValue();
const QFontMetrics &fm = style()->fontMetrics();
m_height = fm.ascent();
case DECIMAL_LEADING_ZERO:
// ### unsupported, we use decimal instead
case LDECIMAL:
- m_item.sprintf( "%d", m_value );
+ m_item.sprintf( "%d", m_listItem->value() );
break;
case LOWER_ROMAN:
- m_item = toRoman( m_value, false );
+ m_item = toRoman( m_listItem->value(), false );
break;
case UPPER_ROMAN:
- m_item = toRoman( m_value, true );
+ m_item = toRoman( m_listItem->value(), true );
break;
case LOWER_GREEK:
{
- int number = m_value - 1;
+ int number = m_listItem->value() - 1;
int l = (number % 24);
if (l>16) {l++;} // Skip GREEK SMALL LETTER FINAL SIGMA
break;
}
case HEBREW:
- m_item = toHebrew( m_value );
+ m_item = toHebrew( m_listItem->value() );
break;
case LOWER_ALPHA:
case LOWER_LATIN:
- m_item = toLetter( m_value, 'a' );
+ m_item = toLetter( m_listItem->value(), 'a' );
break;
case UPPER_ALPHA:
case UPPER_LATIN:
- m_item = toLetter( m_value, 'A' );
+ m_item = toLetter( m_listItem->value(), 'A' );
break;
case LNONE:
break;
*
* Copyright (C) 1999 Lars Knoll (knoll@kde.org)
* (C) 1999 Antti Koivisto (koivisto@kde.org)
- * Copyright (C) 2003 Apple Computer, Inc.
+ * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
// ### list-style-position, list-style-image is still missing
-namespace khtml
-{
+namespace WebCore {
class RenderListItem;
const QString& text() const { return m_item; }
-protected:
- friend class RenderListItem;
-
bool isInside() const;
+private:
QString m_item;
CachedImage *m_listImage;
- int m_value;
RenderListItem* m_listItem;
};
{
public:
RenderListItem(DOM::NodeImpl*);
- virtual ~RenderListItem();
virtual void destroy();
virtual bool isListItem() const { return true; }
- int value() const { return m_marker->m_value; }
- void setValue( int v ) { predefVal = v; }
- void calcListValue();
-
+ int value() const { return m_value; }
+ void setValue(int v) { predefVal = v; }
+ void calcValue();
+ void resetValue();
+
virtual bool isEmpty() const;
virtual void paint(PaintInfo& i, int xoff, int yoff);
void setNotInList(bool notInList) { _notInList = notInList; }
bool notInList() const { return _notInList; }
- void resetMarkerValue();
- QString markerStringValue() { if (m_marker) return m_marker->m_item; return ""; }
+ QString markerStringValue() { return m_marker ? m_marker->text() : ""; }
-protected:
+private:
int predefVal;
RenderListMarker *m_marker;
bool _notInList;
+ int m_value;
};
-}; //namespace
+} //namespace
#endif