1/*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * Copyright (C) 2010 Apple Inc. All rights reserved.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB.  If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23#include "config.h"
24#include "HTMLOListElement.h"
25
26#include "Attribute.h"
27#include "CSSPropertyNames.h"
28#include "CSSValueKeywords.h"
29#include "HTMLNames.h"
30#include "RenderListItem.h"
31
32namespace WebCore {
33
34using namespace HTMLNames;
35
36HTMLOListElement::HTMLOListElement(const QualifiedName& tagName, Document* document)
37    : HTMLElement(tagName, document)
38    , m_start(0xBADBEEF)
39    , m_itemCount(0)
40    , m_hasExplicitStart(false)
41    , m_isReversed(false)
42    , m_shouldRecalculateItemCount(false)
43{
44    ASSERT(hasTagName(olTag));
45}
46
47PassRefPtr<HTMLOListElement> HTMLOListElement::create(Document* document)
48{
49    return adoptRef(new HTMLOListElement(olTag, document));
50}
51
52PassRefPtr<HTMLOListElement> HTMLOListElement::create(const QualifiedName& tagName, Document* document)
53{
54    return adoptRef(new HTMLOListElement(tagName, document));
55}
56
57bool HTMLOListElement::isPresentationAttribute(const QualifiedName& name) const
58{
59    if (name == typeAttr)
60        return true;
61    return HTMLElement::isPresentationAttribute(name);
62}
63
64void HTMLOListElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
65{
66    if (name == typeAttr) {
67        if (value == "a")
68            addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueLowerAlpha);
69        else if (value == "A")
70            addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueUpperAlpha);
71        else if (value == "i")
72            addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueLowerRoman);
73        else if (value == "I")
74            addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueUpperRoman);
75        else if (value == "1")
76            addPropertyToPresentationAttributeStyle(style, CSSPropertyListStyleType, CSSValueDecimal);
77    } else
78        HTMLElement::collectStyleForPresentationAttribute(name, value, style);
79}
80
81void HTMLOListElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
82{
83    if (name == startAttr) {
84        int oldStart = start();
85        bool canParse;
86        int parsedStart = value.toInt(&canParse);
87        m_hasExplicitStart = canParse;
88        m_start = canParse ? parsedStart : 0xBADBEEF;
89        if (oldStart == start())
90            return;
91        updateItemValues();
92    } else if (name == reversedAttr) {
93        bool reversed = !value.isNull();
94        if (reversed == m_isReversed)
95            return;
96        m_isReversed = reversed;
97        updateItemValues();
98    } else
99        HTMLElement::parseAttribute(name, value);
100}
101
102void HTMLOListElement::setStart(int start)
103{
104    setAttribute(startAttr, String::number(start));
105}
106
107void HTMLOListElement::updateItemValues()
108{
109    RenderListItem::updateItemValuesForOrderedList(this);
110}
111
112void HTMLOListElement::recalculateItemCount()
113{
114    m_itemCount = RenderListItem::itemCountForOrderedList(this);
115    m_shouldRecalculateItemCount = false;
116}
117
118}
119