Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(336)

Unified Diff: WebCore/rendering/RenderMeter.cpp

Issue 5772004: Merge 73488 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/597/
Patch Set: Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « WebCore/rendering/RenderMeter.h ('k') | WebCore/rendering/RenderProgress.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: WebCore/rendering/RenderMeter.cpp
===================================================================
--- WebCore/rendering/RenderMeter.cpp (revision 73789)
+++ WebCore/rendering/RenderMeter.cpp (working copy)
@@ -35,6 +35,61 @@
using namespace HTMLNames;
+class MeterPartElement : public ShadowBlockElement {
+public:
+ static PassRefPtr<MeterPartElement> createForPart(HTMLElement*, PseudoId);
+
+ void hide();
+ void restoreVisibility();
+
+ virtual void updateStyleForPart(PseudoId);
+
+private:
+ MeterPartElement(HTMLElement*);
+ void saveVisibility();
+
+ EVisibility m_originalVisibility;
+};
+
+MeterPartElement::MeterPartElement(HTMLElement* shadowParent)
+ : ShadowBlockElement(shadowParent)
+{
+}
+
+PassRefPtr<MeterPartElement> MeterPartElement::createForPart(HTMLElement* shadowParent, PseudoId pseudoId)
+{
+ RefPtr<MeterPartElement> ret = adoptRef(new MeterPartElement(shadowParent));
+ ret->initAsPart(pseudoId);
+ ret->saveVisibility();
+ return ret;
+}
+
+void MeterPartElement::hide()
+{
+ if (renderer())
+ renderer()->style()->setVisibility(HIDDEN);
+}
+
+void MeterPartElement::restoreVisibility()
+{
+ if (renderer())
+ renderer()->style()->setVisibility(m_originalVisibility);
+}
+
+void MeterPartElement::updateStyleForPart(PseudoId pseudoId)
+{
+ if (renderer()->style()->styleType() == pseudoId)
+ return;
+
+ ShadowBlockElement::updateStyleForPart(pseudoId);
+ saveVisibility();
+}
+
+void MeterPartElement::saveVisibility()
+{
+ m_originalVisibility = renderer()->style()->visibility();
+}
+
RenderMeter::RenderMeter(HTMLMeterElement* element)
: RenderIndicator(element)
{
@@ -42,12 +97,38 @@
RenderMeter::~RenderMeter()
{
- if (m_valuePart)
- m_valuePart->detach();
- if (m_barPart)
- m_barPart->detach();
+ if (shadowAttached()) {
+ m_verticalValuePart->detach();
+ m_verticalBarPart->detach();
+ m_horizontalValuePart->detach();
+ m_horizontalBarPart->detach();
+ }
}
+PassRefPtr<MeterPartElement> RenderMeter::createPart(PseudoId pseudoId)
+{
+ RefPtr<MeterPartElement> element = MeterPartElement::createForPart(static_cast<HTMLElement*>(node()), pseudoId);
+ if (element->renderer())
+ addChild(element->renderer());
+ return element;
+}
+
+void RenderMeter::updateFromElement()
+{
+ if (!shadowAttached()) {
+ m_horizontalBarPart = createPart(barPseudoId(HORIZONTAL));
+ m_horizontalValuePart = createPart(valuePseudoId(HORIZONTAL));
+ m_verticalBarPart = createPart(barPseudoId(VERTICAL));
+ m_verticalValuePart = createPart(valuePseudoId(VERTICAL));
+ }
+
+ m_horizontalBarPart->updateStyleForPart(barPseudoId(HORIZONTAL));
+ m_horizontalValuePart->updateStyleForPart(valuePseudoId(HORIZONTAL));
+ m_verticalBarPart->updateStyleForPart(barPseudoId(VERTICAL));
+ m_verticalValuePart->updateStyleForPart(valuePseudoId(VERTICAL));
+ RenderIndicator::updateFromElement();
+}
+
void RenderMeter::computeLogicalWidth()
{
RenderBox::computeLogicalWidth();
@@ -62,21 +143,38 @@
void RenderMeter::layoutParts()
{
- // We refresh shadow node here because the state can depend
- // on the frame size of this render object.
- updatePartsState();
- if (m_valuePart)
- m_valuePart->layoutAsPart(valuePartRect());
- if (m_barPart)
- m_barPart->layoutAsPart(barPartRect());
+ m_horizontalBarPart->layoutAsPart(barPartRect());
+ m_horizontalValuePart->layoutAsPart(valuePartRect(HORIZONTAL));
+ m_verticalBarPart->layoutAsPart(barPartRect());
+ m_verticalValuePart->layoutAsPart(valuePartRect(VERTICAL));
+
+ if (shouldHaveParts()) {
+ if (HORIZONTAL == orientation()) {
+ m_verticalBarPart->hide();
+ m_verticalValuePart->hide();
+ m_horizontalBarPart->restoreVisibility();
+ m_horizontalValuePart->restoreVisibility();
+ } else {
+ m_verticalBarPart->restoreVisibility();
+ m_verticalValuePart->restoreVisibility();
+ m_horizontalBarPart->hide();
+ m_horizontalValuePart->hide();
+ }
+ } else {
+ m_verticalBarPart->hide();
+ m_verticalValuePart->hide();
+ m_horizontalBarPart->hide();
+ m_horizontalValuePart->hide();
+ }
}
bool RenderMeter::shouldHaveParts() const
{
- bool hasTheme = theme()->supportsMeter(style()->appearance(), isHorizontal());
+ EBoxOrient currentOrientation = orientation();
+ bool hasTheme = theme()->supportsMeter(style()->appearance(), HORIZONTAL == currentOrientation);
if (!hasTheme)
return true;
- bool shadowsHaveStyle = ShadowBlockElement::partShouldHaveStyle(this, barPseudoId()) || ShadowBlockElement::partShouldHaveStyle(this, valuePseudoId());
+ bool shadowsHaveStyle = ShadowBlockElement::partShouldHaveStyle(this, barPseudoId(currentOrientation)) || ShadowBlockElement::partShouldHaveStyle(this, valuePseudoId(currentOrientation));
if (shadowsHaveStyle)
return true;
return false;
@@ -99,11 +197,11 @@
return IntRect(borderLeft() + paddingLeft(), borderTop() + paddingTop(), lround(width() - borderLeft() - paddingLeft() - borderRight() - paddingRight()), height() - borderTop() - paddingTop() - borderBottom() - paddingBottom());
}
-IntRect RenderMeter::valuePartRect() const
+IntRect RenderMeter::valuePartRect(EBoxOrient asOrientation) const
{
IntRect rect = barPartRect();
- if (rect.height() <= rect.width()) {
+ if (HORIZONTAL == asOrientation) {
int width = static_cast<int>(rect.width()*valueRatio());
if (!style()->isLeftToRightDirection()) {
rect.setX(rect.x() + (rect.width() - width));
@@ -119,17 +217,17 @@
return rect;
}
-bool RenderMeter::isHorizontal() const
+EBoxOrient RenderMeter::orientation() const
{
IntRect rect = barPartRect();
- return rect.height() <= rect.width();
+ return rect.height() <= rect.width() ? HORIZONTAL : VERTICAL;
}
-PseudoId RenderMeter::valuePseudoId() const
+PseudoId RenderMeter::valuePseudoId(EBoxOrient asOrientation) const
{
HTMLMeterElement* element = static_cast<HTMLMeterElement*>(node());
- if (isHorizontal()) {
+ if (HORIZONTAL == asOrientation) {
switch (element->gaugeRegion()) {
case HTMLMeterElement::GaugeRegionOptimum:
return METER_HORIZONTAL_OPTIMUM;
@@ -153,34 +251,11 @@
return NOPSEUDO;
}
-PseudoId RenderMeter::barPseudoId() const
+PseudoId RenderMeter::barPseudoId(EBoxOrient asOrientation) const
{
- return isHorizontal() ? METER_HORIZONTAL_BAR : METER_VERTICAL_BAR;
+ return HORIZONTAL == asOrientation ? METER_HORIZONTAL_BAR : METER_VERTICAL_BAR;
}
-void RenderMeter::updatePartsState()
-{
- if (shouldHaveParts() && !m_barPart) {
- ASSERT(!m_valuePart);
- m_barPart = ShadowBlockElement::createForPart(static_cast<HTMLElement*>(node()), barPseudoId());
- addChild(m_barPart->renderer());
- m_valuePart = ShadowBlockElement::createForPart(static_cast<HTMLElement*>(node()), valuePseudoId());
- addChild(m_valuePart->renderer());
- } else if (!shouldHaveParts() && m_barPart) {
- ASSERT(m_valuePart);
- m_barPart->detach();
- m_barPart = 0;
- m_valuePart->detach();
- m_valuePart = 0;
- }
-
- if (m_barPart) {
- ASSERT(m_valuePart);
- m_barPart->updateStyleForPart(barPseudoId());
- m_valuePart->updateStyleForPart(valuePseudoId());
- }
-}
-
} // namespace WebCore
#endif
« no previous file with comments | « WebCore/rendering/RenderMeter.h ('k') | WebCore/rendering/RenderProgress.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698