15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CounterNode_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CounterNode_h
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/Forward.h"
2602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/Noncopyable.h"
2702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/RefCounted.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This implements a counter tree that is used for finding parents in counters() lookup,
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// and for propagating count changes when nodes are added or removed.
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Parents represent unique counters and their scope, which are created either explicitly
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// by "counter-reset" style rules or implicitly by referring to a counter that is not in scope.
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Such nodes are tagged as "reset" nodes, although they are not all due to "counter-reset".
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Not that render tree children are often counter tree siblings due to counter scoping rules.
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderObject;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderCounter;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class CounterNode : public RefCounted<CounterNode> {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    static PassRefPtr<CounterNode> create(RenderObject&, bool isReset, int value);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~CounterNode();
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool actsAsReset() const { return m_hasResetType || !m_parent; }
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasResetType() const { return m_hasResetType; }
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int value() const { return m_value; }
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int countInParent() const { return m_countInParent; }
5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RenderObject& owner() const { return m_owner; }
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void addRenderer(RenderCounter*);
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeRenderer(RenderCounter*);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invalidates the text in the renderers of this counter, if any.
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void resetRenderers();
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* parent() const { return m_parent; }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* previousSibling() const { return m_previousSibling; }
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* nextSibling() const { return m_nextSibling; }
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* firstChild() const { return m_firstChild; }
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* lastChild() const { return m_lastChild; }
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* lastDescendant() const;
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* previousInPreOrder() const;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* nextInPreOrder(const CounterNode* stayWithin = 0) const;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* nextInPreOrderAfterChildren(const CounterNode* stayWithin = 0) const;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void insertAfter(CounterNode* newChild, CounterNode* beforeChild, const AtomicString& identifier);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // identifier must match the identifier of this counter.
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeChild(CounterNode*);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
7451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    CounterNode(RenderObject&, bool isReset, int value);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int computeCountInParent() const;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Invalidates the text in the renderer of this counter, if any,
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // and in the renderers of all descendants of this counter, if any.
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void resetThisAndDescendantsRenderers();
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recount();
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasResetType;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_value;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_countInParent;
8451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RenderObject& m_owner;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderCounter* m_rootRenderer;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* m_parent;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* m_previousSibling;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* m_nextSibling;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* m_firstChild;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CounterNode* m_lastChild;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
94c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Outside the WebCore namespace for ease of invocation from gdb.
98c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void showCounterTree(const blink::CounterNode*);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // CounterNode_h
102