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