[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
tkent at chromium.org
tkent at chromium.org
Wed Dec 22 13:59:52 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit f7f56599183ba47d96fc9feb6b311e420b0657d0
Author: tkent at chromium.org <tkent at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Fri Oct 1 05:09:08 2010 +0000
2010-09-30 Kent Tamura <tkent at chromium.org>
Reviewed by Chris Fleizach.
[Windows] Implement <input type=number> UI
https://bugs.webkit.org/show_bug.cgi?id=38381
Implement theme drawing for inner-spin-button.
No new tests. Existing tests for type=number will cover this change.
* rendering/RenderThemeWin.cpp:
(WebCore::RenderThemeWin::RenderThemeWin):
Handle m_spinButtonTheme.
(WebCore::RenderThemeWin::spinButtonTheme): ditto.
(WebCore::RenderThemeWin::close): ditto.
(WebCore::RenderThemeWin::determineClassicState):
Add ControlSubPart parameter, and add support for InnerSpinButtonPart.
(WebCore::RenderThemeWin::determineSpinButtonState): Added.
(WebCore::RenderThemeWin::getClassicThemeData):
Add ControlSubPart parameter, and handle InnerSpinButtonPart.
(WebCore::RenderThemeWin::getThemeData): ditto.
(WebCore::RenderThemeWin::adjustInnerSpinButtonStyle):
Set SM_CXVSCROLL value to the width.
(WebCore::RenderThemeWin::paintInnerSpinButton):
Call drawControl() for the upper part and the lower part.
* rendering/RenderThemeWin.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68864 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 9ebe856..677874f 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,5 +1,32 @@
2010-09-30 Kent Tamura <tkent at chromium.org>
+ Reviewed by Chris Fleizach.
+
+ [Windows] Implement <input type=number> UI
+ https://bugs.webkit.org/show_bug.cgi?id=38381
+
+ Implement theme drawing for inner-spin-button.
+ No new tests. Existing tests for type=number will cover this change.
+
+ * rendering/RenderThemeWin.cpp:
+ (WebCore::RenderThemeWin::RenderThemeWin):
+ Handle m_spinButtonTheme.
+ (WebCore::RenderThemeWin::spinButtonTheme): ditto.
+ (WebCore::RenderThemeWin::close): ditto.
+ (WebCore::RenderThemeWin::determineClassicState):
+ Add ControlSubPart parameter, and add support for InnerSpinButtonPart.
+ (WebCore::RenderThemeWin::determineSpinButtonState): Added.
+ (WebCore::RenderThemeWin::getClassicThemeData):
+ Add ControlSubPart parameter, and handle InnerSpinButtonPart.
+ (WebCore::RenderThemeWin::getThemeData): ditto.
+ (WebCore::RenderThemeWin::adjustInnerSpinButtonStyle):
+ Set SM_CXVSCROLL value to the width.
+ (WebCore::RenderThemeWin::paintInnerSpinButton):
+ Call drawControl() for the upper part and the lower part.
+ * rendering/RenderThemeWin.h:
+
+2010-09-30 Kent Tamura <tkent at chromium.org>
+
Unreviewed, Windows build fix for r68854
* WebCore.vcproj/copyForwardingHeaders.cmd:
diff --git a/WebCore/rendering/RenderThemeWin.cpp b/WebCore/rendering/RenderThemeWin.cpp
index b4fb8eb..f0f8268 100644
--- a/WebCore/rendering/RenderThemeWin.cpp
+++ b/WebCore/rendering/RenderThemeWin.cpp
@@ -92,6 +92,21 @@
#define PBS_DISABLED 4
#define PBS_DEFAULTED 5
+// Spin button parts
+#define SPNP_UP 1
+#define SPNP_DOWN 2
+
+// Spin button states
+#define DNS_NORMAL 1
+#define DNS_HOT 2
+#define DNS_PRESSED 3
+#define DNS_DISABLED 4
+#define UPS_NORMAL 1
+#define UPS_HOT 2
+#define UPS_PRESSED 3
+#define UPS_DISABLED 4
+
+
SOFT_LINK_LIBRARY(uxtheme)
SOFT_LINK(uxtheme, OpenThemeData, HANDLE, WINAPI, (HWND hwnd, LPCWSTR pszClassList), (hwnd, pszClassList))
SOFT_LINK(uxtheme, CloseThemeData, HRESULT, WINAPI, (HANDLE hTheme), (hTheme))
@@ -154,6 +169,7 @@ RenderThemeWin::RenderThemeWin()
, m_textFieldTheme(0)
, m_menuListTheme(0)
, m_sliderTheme(0)
+ , m_spinButtonTheme(0)
{
haveTheme = uxthemeLibrary() && IsThemeActive();
}
@@ -194,6 +210,13 @@ HANDLE RenderThemeWin::sliderTheme() const
return m_sliderTheme;
}
+HANDLE RenderThemeWin::spinButtonTheme() const
+{
+ if (haveTheme && !m_spinButtonTheme)
+ m_spinButtonTheme = OpenThemeData(0, L"Spin");
+ return m_spinButtonTheme;
+}
+
void RenderThemeWin::close()
{
// This method will need to be called when the OS theme changes to flush our cached themes.
@@ -205,7 +228,9 @@ void RenderThemeWin::close()
CloseThemeData(m_menuListTheme);
if (m_sliderTheme)
CloseThemeData(m_sliderTheme);
- m_buttonTheme = m_textFieldTheme = m_menuListTheme = m_sliderTheme = 0;
+ if (m_spinButtonTheme)
+ CloseThemeData(m_spinButtonTheme);
+ m_buttonTheme = m_textFieldTheme = m_menuListTheme = m_sliderTheme = m_spinButtonTheme = 0;
haveTheme = uxthemeLibrary() && IsThemeActive();
}
@@ -368,7 +393,7 @@ bool RenderThemeWin::supportsFocusRing(const RenderStyle* style) const
return supportsFocus(style->appearance());
}
-unsigned RenderThemeWin::determineClassicState(RenderObject* o)
+unsigned RenderThemeWin::determineClassicState(RenderObject* o, ControlSubPart subPart)
{
unsigned state = 0;
switch (o->style()->appearance()) {
@@ -397,6 +422,18 @@ unsigned RenderThemeWin::determineClassicState(RenderObject* o)
state |= DFCS_INACTIVE;
else if (isPressed(o))
state |= DFCS_PUSHED;
+ break;
+ case InnerSpinButtonPart: {
+ bool isUpButton = subPart == SpinButtonUp;
+ state = isUpButton ? DFCS_SCROLLUP : DFCS_SCROLLDOWN;
+ if (!isEnabled(o) || isReadOnlyControl(o))
+ state |= DFCS_INACTIVE;
+ else if (isPressed(o) && isUpButton == isSpinUpButtonPartPressed(o))
+ state |= DFCS_PUSHED;
+ else if (isHovered(o) && isUpButton == isSpinUpButtonPartHovered(o))
+ state |= DFCS_HOT;
+ break;
+ }
default:
break;
}
@@ -452,7 +489,20 @@ unsigned RenderThemeWin::determineButtonState(RenderObject* o)
return result;
}
-ThemeData RenderThemeWin::getClassicThemeData(RenderObject* o)
+unsigned RenderThemeWin::determineSpinButtonState(RenderObject* o, ControlSubPart subPart)
+{
+ bool isUpButton = subPart == SpinButtonUp;
+ unsigned result = isUpButton ? UPS_NORMAL : DNS_NORMAL;
+ if (!isEnabled(o) || isReadOnlyControl(o))
+ result = isUpButton ? UPS_DISABLED : DNS_DISABLED;
+ else if (isPressed(o) && isUpButton == isSpinUpButtonPartPressed(o))
+ result = isUpButton ? UPS_PRESSED : DNS_PRESSED;
+ else if (isHovered(o) && isUpButton == isSpinUpButtonPartHovered(o))
+ result = isUpButton ? UPS_HOT : DNS_HOT;
+ return result;
+}
+
+ThemeData RenderThemeWin::getClassicThemeData(RenderObject* o, ControlSubPart subPart)
{
ThemeData result;
switch (o->style()->appearance()) {
@@ -490,16 +540,20 @@ ThemeData RenderThemeWin::getClassicThemeData(RenderObject* o)
result.m_part = TKP_THUMBRIGHT;
result.m_state = determineSliderThumbState(o);
break;
+ case InnerSpinButtonPart:
+ result.m_part = DFC_SCROLL;
+ result.m_state = determineClassicState(o, subPart);
+ break;
default:
break;
}
return result;
}
-ThemeData RenderThemeWin::getThemeData(RenderObject* o)
+ThemeData RenderThemeWin::getThemeData(RenderObject* o, ControlSubPart subPart)
{
if (!haveTheme)
- return getClassicThemeData(o);
+ return getClassicThemeData(o, subPart);
ThemeData result;
switch (o->style()->appearance()) {
@@ -549,6 +603,10 @@ ThemeData RenderThemeWin::getThemeData(RenderObject* o)
result.m_part = TKP_THUMBRIGHT;
result.m_state = determineSliderThumbState(o);
break;
+ case InnerSpinButtonPart:
+ result.m_part = subPart == SpinButtonUp ? SPNP_UP : SPNP_DOWN;
+ result.m_state = determineSpinButtonState(o, subPart);
+ break;
}
return result;
@@ -618,6 +676,31 @@ bool RenderThemeWin::paintButton(RenderObject* o, const PaintInfo& i, const IntR
return false;
}
+void RenderThemeWin::adjustInnerSpinButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
+{
+ int width = ::GetSystemMetrics(SM_CXVSCROLL);
+ if (width <= 0)
+ width = 17; // Vista's default.
+ style->setWidth(Length(width, Fixed));
+ style->setMinWidth(Length(width, Fixed));
+}
+
+bool RenderThemeWin::paintInnerSpinButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
+{
+ // We split the specified rectangle into two vertically. We can't draw a
+ // spin button of which height is less than 2px.
+ if (r.height() < 2)
+ return false;
+ IntRect upRect(r);
+ upRect.setHeight(r.height() / 2);
+ IntRect downRect(r);
+ downRect.setY(upRect.bottom());
+ downRect.setHeight(r.height() - upRect.height());
+ drawControl(i.context, o, spinButtonTheme(), getThemeData(o, SpinButtonUp), upRect);
+ drawControl(i.context, o, spinButtonTheme(), getThemeData(o, SpinButtonDown), downRect);
+ return false;
+}
+
void RenderThemeWin::setCheckboxSize(RenderStyle* style) const
{
// If the width and height are both specified, then we have nothing to do.
diff --git a/WebCore/rendering/RenderThemeWin.h b/WebCore/rendering/RenderThemeWin.h
index 1efb117..c05d2ee 100644
--- a/WebCore/rendering/RenderThemeWin.h
+++ b/WebCore/rendering/RenderThemeWin.h
@@ -77,6 +77,9 @@ public:
virtual bool paintButton(RenderObject*, const PaintInfo&, const IntRect&);
+ virtual void adjustInnerSpinButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
+ virtual bool paintInnerSpinButton(RenderObject*, const PaintInfo&, const IntRect&);
+
virtual bool paintTextField(RenderObject*, const PaintInfo&, const IntRect&);
virtual bool paintTextArea(RenderObject* o, const PaintInfo& i, const IntRect& r)
@@ -139,6 +142,12 @@ public:
#endif
private:
+ enum ControlSubPart {
+ None,
+ SpinButtonDown,
+ SpinButtonUp,
+ };
+
RenderThemeWin();
~RenderThemeWin();
@@ -146,24 +155,27 @@ private:
void close();
unsigned determineState(RenderObject*);
- unsigned determineClassicState(RenderObject*);
+ unsigned determineClassicState(RenderObject*, ControlSubPart = None);
unsigned determineSliderThumbState(RenderObject*);
unsigned determineButtonState(RenderObject*);
+ unsigned determineSpinButtonState(RenderObject*, ControlSubPart = None);
bool supportsFocus(ControlPart) const;
- ThemeData getThemeData(RenderObject*);
- ThemeData getClassicThemeData(RenderObject* o);
+ ThemeData getThemeData(RenderObject*, ControlSubPart = None);
+ ThemeData getClassicThemeData(RenderObject* o, ControlSubPart = None);
HANDLE buttonTheme() const;
HANDLE textFieldTheme() const;
HANDLE menuListTheme() const;
HANDLE sliderTheme() const;
+ HANDLE spinButtonTheme() const;
mutable HANDLE m_buttonTheme;
mutable HANDLE m_textFieldTheme;
mutable HANDLE m_menuListTheme;
mutable HANDLE m_sliderTheme;
+ mutable HANDLE m_spinButtonTheme;
};
};
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list