ScrollingStateNode.cpp [plain text]
#include "config.h"
#include "ScrollingStateNode.h"
#if ENABLE(THREADED_SCROLLING) || USE(COORDINATED_GRAPHICS)
#include "ScrollingStateFixedNode.h"
#include "ScrollingStateTree.h"
#include "TextStream.h"
#include <wtf/text/WTFString.h>
namespace WebCore {
ScrollingStateNode::ScrollingStateNode(ScrollingStateTree* scrollingStateTree, ScrollingNodeID nodeID)
: m_scrollingStateTree(scrollingStateTree)
, m_nodeID(nodeID)
, m_changedProperties(0)
, m_parent(0)
{
}
ScrollingStateNode::ScrollingStateNode(const ScrollingStateNode& stateNode)
: m_scrollingStateTree(0)
, m_nodeID(stateNode.scrollingNodeID())
, m_changedProperties(stateNode.changedProperties())
, m_parent(0)
{
setScrollPlatformLayer(stateNode.platformScrollLayer());
}
ScrollingStateNode::~ScrollingStateNode()
{
}
PassOwnPtr<ScrollingStateNode> ScrollingStateNode::cloneAndReset()
{
OwnPtr<ScrollingStateNode> clone = this->clone();
resetChangedProperties();
cloneAndResetChildren(clone.get());
return clone.release();
}
void ScrollingStateNode::cloneAndResetChildren(ScrollingStateNode* clone)
{
if (!m_children)
return;
size_t size = m_children->size();
for (size_t i = 0; i < size; ++i)
clone->appendChild(m_children->at(i)->cloneAndReset());
}
void ScrollingStateNode::appendChild(PassOwnPtr<ScrollingStateNode> childNode)
{
childNode->setParent(this);
if (!m_children)
m_children = adoptPtr(new Vector<OwnPtr<ScrollingStateNode> >);
m_children->append(childNode);
}
void ScrollingStateNode::removeChild(ScrollingStateNode* node)
{
if (!m_children)
return;
size_t index = m_children->find(node);
if (index != notFound) {
node->willBeRemovedFromStateTree();
m_children->remove(index);
return;
}
size_t size = m_children->size();
for (size_t i = 0; i < size; ++i)
m_children->at(i)->removeChild(node);
}
void ScrollingStateNode::willBeRemovedFromStateTree()
{
ASSERT(m_scrollingStateTree);
m_scrollingStateTree->didRemoveNode(scrollingNodeID());
if (!m_children)
return;
size_t size = m_children->size();
for (size_t i = 0; i < size; ++i)
m_children->at(i)->willBeRemovedFromStateTree();
}
void ScrollingStateNode::writeIndent(TextStream& ts, int indent)
{
for (int i = 0; i != indent; ++i)
ts << " ";
}
void ScrollingStateNode::dump(TextStream& ts, int indent) const
{
writeIndent(ts, indent);
dumpProperties(ts, indent);
if (m_children) {
writeIndent(ts, indent + 1);
size_t size = children()->size();
ts << "(children " << size << "\n";
for (size_t i = 0; i < size; i++)
m_children->at(i)->dump(ts, indent + 2);
writeIndent(ts, indent + 1);
ts << ")\n";
}
writeIndent(ts, indent);
ts << ")\n";
}
String ScrollingStateNode::scrollingStateTreeAsText() const
{
TextStream ts;
dump(ts, 0);
return ts.release();
}
}
#endif // ENABLE(THREADED_SCROLLING) || USE(COORDINATED_GRAPHICS)