1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*
2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is free software; you can redistribute it and/or
5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modify it under the terms of the GNU Library General Public
6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * License as published by the Free Software Foundation; either
7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * version 2 of the License, or (at your option) any later version.
8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * This library is distributed in the hope that it will be useful,
10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * but WITHOUT ANY WARRANTY; without even the implied warranty of
11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Library General Public License for more details.
13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * You should have received a copy of the GNU Library General Public License
15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * along with this library; see the file COPYING.LIB.  If not, write to
16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Boston, MA 02110-1301, USA.
18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block *
19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */
20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h"
225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(PROGRESS_TAG)
24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderProgress.h"
2606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
27545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "HTMLNames.h"
28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLProgressElement.h"
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PaintInfo.h"
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderTheme.h"
3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "ShadowElement.h"
32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/CurrentTime.h>
3321939df44de1705786c545cd1bf519d47250322dBen Murdoch#include <wtf/RefPtr.h>
34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace std;
36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore {
38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRenderProgress::RenderProgress(HTMLProgressElement* element)
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    : RenderBlock(element)
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    , m_position(HTMLProgressElement::InvalidPosition)
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_animationStartTime(0)
43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_animationRepeatInterval(0)
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_animationDuration(0)
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_animating(false)
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    , m_animationTimer(this, &RenderProgress::animationTimerFired)
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5021939df44de1705786c545cd1bf519d47250322dBen MurdochRenderProgress::~RenderProgress()
5121939df44de1705786c545cd1bf519d47250322dBen Murdoch{
5221939df44de1705786c545cd1bf519d47250322dBen Murdoch}
5321939df44de1705786c545cd1bf519d47250322dBen Murdoch
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderProgress::updateFromElement()
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    HTMLProgressElement* element = progressElement();
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_position == element->position())
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_position = element->position();
60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    updateAnimationState();
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RenderBlock::updateFromElement();
6321939df44de1705786c545cd1bf519d47250322dBen Murdoch}
6421939df44de1705786c545cd1bf519d47250322dBen Murdoch
656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsendouble RenderProgress::animationProgress() const
66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return m_animating ? (fmod((currentTime() - m_animationStartTime), m_animationDuration) / m_animationDuration) : 0;
68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool RenderProgress::isDeterminate() const
716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return (HTMLProgressElement::IndeterminatePosition != position()
732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            && HTMLProgressElement::InvalidPosition != position());
746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderProgress::animationTimerFired(Timer<RenderProgress>*)
77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    repaint();
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!m_animationTimer.isActive() && m_animating)
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_animationTimer.startOneShot(m_animationRepeatInterval);
8106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
8206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderProgress::updateAnimationState()
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_animationDuration = theme()->animationDurationForProgressBar(this);
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_animationRepeatInterval = theme()->animationRepeatIntervalForProgressBar(this);
87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
8821939df44de1705786c545cd1bf519d47250322dBen Murdoch    bool animating = style()->hasAppearance() && m_animationDuration > 0;
89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (animating == m_animating)
90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_animating = animating;
93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_animating) {
94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_animationStartTime = currentTime();
95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_animationTimer.startOneShot(m_animationRepeatInterval);
96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    } else
97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_animationTimer.stop();
98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockHTMLProgressElement* RenderProgress::progressElement() const
101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return static_cast<HTMLProgressElement*>(node());
103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebCore
1065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
108