Changeset 68864 in webkit


Ignore:
Timestamp:
Sep 30, 2010 10:09:08 PM (14 years ago)
Author:
tkent@chromium.org
Message:

2010-09-30 Kent Tamura <tkent@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:
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r68862 r68864  
     12010-09-30  Kent Tamura  <tkent@chromium.org>
     2
     3        Reviewed by Chris Fleizach.
     4
     5        [Windows] Implement <input type=number> UI
     6        https://bugs.webkit.org/show_bug.cgi?id=38381
     7
     8        Implement theme drawing for inner-spin-button.
     9        No new tests. Existing tests for type=number will cover this change.
     10
     11        * rendering/RenderThemeWin.cpp:
     12        (WebCore::RenderThemeWin::RenderThemeWin):
     13         Handle m_spinButtonTheme.
     14        (WebCore::RenderThemeWin::spinButtonTheme): ditto.
     15        (WebCore::RenderThemeWin::close): ditto.
     16        (WebCore::RenderThemeWin::determineClassicState):
     17         Add ControlSubPart parameter, and add support for InnerSpinButtonPart.
     18        (WebCore::RenderThemeWin::determineSpinButtonState): Added.
     19        (WebCore::RenderThemeWin::getClassicThemeData):
     20         Add ControlSubPart parameter, and handle InnerSpinButtonPart.
     21        (WebCore::RenderThemeWin::getThemeData): ditto.
     22        (WebCore::RenderThemeWin::adjustInnerSpinButtonStyle):
     23         Set SM_CXVSCROLL value to the width.
     24        (WebCore::RenderThemeWin::paintInnerSpinButton):
     25         Call drawControl() for the upper part and the lower part.
     26        * rendering/RenderThemeWin.h:
     27
    1282010-09-30  Kent Tamura  <tkent@chromium.org>
    229
  • trunk/WebCore/rendering/RenderThemeWin.cpp

    r67251 r68864  
    9393#define PBS_DEFAULTED   5
    9494
     95// Spin button parts
     96#define SPNP_UP         1
     97#define SPNP_DOWN       2
     98
     99// Spin button states
     100#define DNS_NORMAL      1
     101#define DNS_HOT         2
     102#define DNS_PRESSED     3
     103#define DNS_DISABLED    4
     104#define UPS_NORMAL      1
     105#define UPS_HOT         2
     106#define UPS_PRESSED     3
     107#define UPS_DISABLED    4
     108
     109
    95110SOFT_LINK_LIBRARY(uxtheme)
    96111SOFT_LINK(uxtheme, OpenThemeData, HANDLE, WINAPI, (HWND hwnd, LPCWSTR pszClassList), (hwnd, pszClassList))
     
    155170    , m_menuListTheme(0)
    156171    , m_sliderTheme(0)
     172    , m_spinButtonTheme(0)
    157173{
    158174    haveTheme = uxthemeLibrary() && IsThemeActive();
     
    193209        m_sliderTheme = OpenThemeData(0, L"TrackBar");
    194210    return m_sliderTheme;
     211}
     212
     213HANDLE RenderThemeWin::spinButtonTheme() const
     214{
     215    if (haveTheme && !m_spinButtonTheme)
     216        m_spinButtonTheme = OpenThemeData(0, L"Spin");
     217    return m_spinButtonTheme;
    195218}
    196219
     
    206229    if (m_sliderTheme)
    207230        CloseThemeData(m_sliderTheme);
    208     m_buttonTheme = m_textFieldTheme = m_menuListTheme = m_sliderTheme = 0;
     231    if (m_spinButtonTheme)
     232        CloseThemeData(m_spinButtonTheme);
     233    m_buttonTheme = m_textFieldTheme = m_menuListTheme = m_sliderTheme = m_spinButtonTheme = 0;
    209234
    210235    haveTheme = uxthemeLibrary() && IsThemeActive();
     
    369394}
    370395
    371 unsigned RenderThemeWin::determineClassicState(RenderObject* o)
     396unsigned RenderThemeWin::determineClassicState(RenderObject* o, ControlSubPart subPart)
    372397{
    373398    unsigned state = 0;
     
    398423            else if (isPressed(o))
    399424                state |= DFCS_PUSHED;
     425            break;
     426        case InnerSpinButtonPart: {
     427            bool isUpButton = subPart == SpinButtonUp;
     428            state = isUpButton ? DFCS_SCROLLUP : DFCS_SCROLLDOWN;
     429            if (!isEnabled(o) || isReadOnlyControl(o))
     430                state |= DFCS_INACTIVE;
     431            else if (isPressed(o) && isUpButton == isSpinUpButtonPartPressed(o))
     432                state |= DFCS_PUSHED;
     433            else if (isHovered(o) && isUpButton == isSpinUpButtonPartHovered(o))
     434                state |= DFCS_HOT;
     435            break;
     436        }
    400437        default:
    401438            break;
     
    453490}
    454491
    455 ThemeData RenderThemeWin::getClassicThemeData(RenderObject* o)
     492unsigned RenderThemeWin::determineSpinButtonState(RenderObject* o, ControlSubPart subPart)
     493{
     494    bool isUpButton = subPart == SpinButtonUp;
     495    unsigned result = isUpButton ? UPS_NORMAL : DNS_NORMAL;
     496    if (!isEnabled(o) || isReadOnlyControl(o))
     497        result = isUpButton ? UPS_DISABLED : DNS_DISABLED;
     498    else if (isPressed(o) && isUpButton == isSpinUpButtonPartPressed(o))
     499        result = isUpButton ? UPS_PRESSED : DNS_PRESSED;
     500    else if (isHovered(o) && isUpButton == isSpinUpButtonPartHovered(o))
     501        result = isUpButton ? UPS_HOT : DNS_HOT;
     502    return result;
     503}
     504
     505ThemeData RenderThemeWin::getClassicThemeData(RenderObject* o, ControlSubPart subPart)
    456506{
    457507    ThemeData result;
     
    491541            result.m_state = determineSliderThumbState(o);
    492542            break;
     543        case InnerSpinButtonPart:
     544            result.m_part = DFC_SCROLL;
     545            result.m_state = determineClassicState(o, subPart);
     546            break;
    493547        default:
    494548            break;
     
    497551}
    498552
    499 ThemeData RenderThemeWin::getThemeData(RenderObject* o)
     553ThemeData RenderThemeWin::getThemeData(RenderObject* o, ControlSubPart subPart)
    500554{
    501555    if (!haveTheme)
    502         return getClassicThemeData(o);
     556        return getClassicThemeData(o, subPart);
    503557
    504558    ThemeData result;
     
    549603            result.m_part = TKP_THUMBRIGHT;
    550604            result.m_state = determineSliderThumbState(o);
     605            break;
     606        case InnerSpinButtonPart:
     607            result.m_part = subPart == SpinButtonUp ? SPNP_UP : SPNP_DOWN;
     608            result.m_state = determineSpinButtonState(o, subPart);
    551609            break;
    552610    }
     
    619677}
    620678
     679void RenderThemeWin::adjustInnerSpinButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
     680{
     681    int width = ::GetSystemMetrics(SM_CXVSCROLL);
     682    if (width <= 0)
     683        width = 17; // Vista's default.
     684    style->setWidth(Length(width, Fixed));
     685    style->setMinWidth(Length(width, Fixed));
     686}
     687
     688bool RenderThemeWin::paintInnerSpinButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
     689{
     690    // We split the specified rectangle into two vertically. We can't draw a
     691    // spin button of which height is less than 2px.
     692    if (r.height() < 2)
     693        return false;
     694    IntRect upRect(r);
     695    upRect.setHeight(r.height() / 2);
     696    IntRect downRect(r);
     697    downRect.setY(upRect.bottom());
     698    downRect.setHeight(r.height() - upRect.height());
     699    drawControl(i.context, o, spinButtonTheme(), getThemeData(o, SpinButtonUp), upRect);
     700    drawControl(i.context, o, spinButtonTheme(), getThemeData(o, SpinButtonDown), downRect);
     701    return false;
     702}
     703
    621704void RenderThemeWin::setCheckboxSize(RenderStyle* style) const
    622705{
  • trunk/WebCore/rendering/RenderThemeWin.h

    r67251 r68864  
    7878    virtual bool paintButton(RenderObject*, const PaintInfo&, const IntRect&);
    7979
     80    virtual void adjustInnerSpinButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const;
     81    virtual bool paintInnerSpinButton(RenderObject*, const PaintInfo&, const IntRect&);
     82
    8083    virtual bool paintTextField(RenderObject*, const PaintInfo&, const IntRect&);
    8184
     
    140143
    141144private:
     145    enum ControlSubPart {
     146        None,
     147        SpinButtonDown,
     148        SpinButtonUp,
     149    };
     150
    142151    RenderThemeWin();
    143152    ~RenderThemeWin();
     
    147156
    148157    unsigned determineState(RenderObject*);
    149     unsigned determineClassicState(RenderObject*);
     158    unsigned determineClassicState(RenderObject*, ControlSubPart = None);
    150159    unsigned determineSliderThumbState(RenderObject*);
    151160    unsigned determineButtonState(RenderObject*);
     161    unsigned determineSpinButtonState(RenderObject*, ControlSubPart = None);
    152162
    153163    bool supportsFocus(ControlPart) const;
    154164
    155     ThemeData getThemeData(RenderObject*);
    156     ThemeData getClassicThemeData(RenderObject* o);
     165    ThemeData getThemeData(RenderObject*, ControlSubPart = None);
     166    ThemeData getClassicThemeData(RenderObject* o, ControlSubPart = None);
    157167
    158168    HANDLE buttonTheme() const;
     
    160170    HANDLE menuListTheme() const;
    161171    HANDLE sliderTheme() const;
     172    HANDLE spinButtonTheme() const;
    162173
    163174    mutable HANDLE m_buttonTheme;
     
    165176    mutable HANDLE m_menuListTheme;
    166177    mutable HANDLE m_sliderTheme;
     178    mutable HANDLE m_spinButtonTheme;
    167179};
    168180
Note: See TracChangeset for help on using the changeset viewer.