[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