18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc.
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Kenneth Rohde Christiansen
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02111-1307, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderThemeWin.h"
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValueKeywords.h"
265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Element.h"
275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Frame.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "GraphicsContext.h"
295abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#include "LocalWindowsContext.h"
302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "PaintInfo.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderSlider.h"
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Settings.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SoftLinking.h"
345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SystemInfo.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "UserAgentStyleSheets.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(VIDEO)
385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "RenderMediaControls.h"
395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <tchar.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The following constants are used to determine how a widget is drawn using
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Windows' Theme API. For more information on theme parts and states see
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/userex/topics/partsandstates.asp
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Generic state constants
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TS_NORMAL    1
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TS_HOVER     2
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TS_ACTIVE    3
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TS_DISABLED  4
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TS_FOCUSED   5
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Button constants
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define BP_BUTTON    1
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define BP_RADIO     2
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define BP_CHECKBOX  3
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Textfield constants
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TFP_TEXTFIELD 1
635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define EP_EDITBORDER_NOSCROLL 6
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TFS_READONLY  6
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// ComboBox constants (from vsstyle.h)
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CP_DROPDOWNBUTTON 1
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define CP_BORDER 4
695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define CP_READONLY 5
705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define CP_DROPDOWNBUTTONRIGHT 6
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// TrackBar (slider) parts
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TKP_TRACK       1
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TKP_TRACKVERT   2
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// TrackBar (slider) thumb parts
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TKP_THUMBBOTTOM 4
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TKP_THUMBTOP    5
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TKP_THUMBLEFT   7
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TKP_THUMBRIGHT  8
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Trackbar (slider) thumb states
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TUS_NORMAL      1
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TUS_HOT         2
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TUS_PRESSED     3
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TUS_FOCUSED     4
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define TUS_DISABLED    5
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// button states
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PBS_NORMAL      1
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PBS_HOT         2
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PBS_PRESSED     3
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PBS_DISABLED    4
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PBS_DEFAULTED   5
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
96a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch// Spin button parts
97a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define SPNP_UP         1
98a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define SPNP_DOWN       2
99a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
100a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch// Spin button states
101a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define DNS_NORMAL      1
102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define DNS_HOT         2
103a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define DNS_PRESSED     3
104a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define DNS_DISABLED    4
105a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define UPS_NORMAL      1
106a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define UPS_HOT         2
107a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define UPS_PRESSED     3
108a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#define UPS_DISABLED    4
109a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
110a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSOFT_LINK_LIBRARY(uxtheme)
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSOFT_LINK(uxtheme, OpenThemeData, HANDLE, WINAPI, (HWND hwnd, LPCWSTR pszClassList), (hwnd, pszClassList))
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSOFT_LINK(uxtheme, CloseThemeData, HRESULT, WINAPI, (HANDLE hTheme), (hTheme))
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSOFT_LINK(uxtheme, DrawThemeBackground, HRESULT, WINAPI, (HANDLE hTheme, HDC hdc, int iPartId, int iStateId, const RECT* pRect, const RECT* pClipRect), (hTheme, hdc, iPartId, iStateId, pRect, pClipRect))
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSOFT_LINK(uxtheme, IsThemeActive, BOOL, WINAPI, (), ())
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSOFT_LINK(uxtheme, IsThemeBackgroundPartiallyTransparent, BOOL, WINAPI, (HANDLE hTheme, int iPartId, int iStateId), (hTheme, iPartId, iStateId))
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool haveTheme;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const unsigned vistaMenuListButtonOutset = 1;
1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace std;
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// This is the fixed width IE and Firefox use for buttons on dropdown menus
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const int dropDownButtonWidth = 17;
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const int shell32MagnifierIconIndex = 22;
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Default font size to match Firefox.
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float defaultControlFontPixelSize = 13;
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float defaultCancelButtonSize = 9;
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float minCancelButtonSize = 5;
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float maxCancelButtonSize = 21;
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float defaultSearchFieldResultsDecorationSize = 13;
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float minSearchFieldResultsDecorationSize = 9;
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float maxSearchFieldResultsDecorationSize = 30;
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float defaultSearchFieldResultsButtonWidth = 18;
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool gWebKitIsBeingUnloaded;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic bool documentIsInApplicationChromeMode(const Document* document)
1455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
1465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Settings* settings = document->settings();
1475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return settings && settings->inApplicationChromeMode();
1485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::setWebKitIsBeingUnloaded()
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gWebKitIsBeingUnloaded = true;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderTheme> RenderThemeWin::create()
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return adoptRef(new RenderThemeWin);
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !USE(SAFARI_THEME)
1610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static RenderTheme* winTheme = RenderThemeWin::create().releaseRef();
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return winTheme;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderThemeWin::RenderThemeWin()
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : m_buttonTheme(0)
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_textFieldTheme(0)
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_menuListTheme(0)
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_sliderTheme(0)
173a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    , m_spinButtonTheme(0)
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    haveTheme = uxthemeLibrary() && IsThemeActive();
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectRenderThemeWin::~RenderThemeWin()
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If WebKit is being unloaded, then uxtheme.dll is no longer available.
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (gWebKitIsBeingUnloaded || !uxthemeLibrary())
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    close();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE RenderThemeWin::buttonTheme() const
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (haveTheme && !m_buttonTheme)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_buttonTheme = OpenThemeData(0, L"Button");
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_buttonTheme;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE RenderThemeWin::textFieldTheme() const
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (haveTheme && !m_textFieldTheme)
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_textFieldTheme = OpenThemeData(0, L"Edit");
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_textFieldTheme;
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE RenderThemeWin::menuListTheme() const
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (haveTheme && !m_menuListTheme)
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_menuListTheme = OpenThemeData(0, L"ComboBox");
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_menuListTheme;
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHANDLE RenderThemeWin::sliderTheme() const
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (haveTheme && !m_sliderTheme)
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_sliderTheme = OpenThemeData(0, L"TrackBar");
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_sliderTheme;
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
214a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochHANDLE RenderThemeWin::spinButtonTheme() const
215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (haveTheme && !m_spinButtonTheme)
217a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        m_spinButtonTheme = OpenThemeData(0, L"Spin");
218a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return m_spinButtonTheme;
219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
220a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::close()
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This method will need to be called when the OS theme changes to flush our cached themes.
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_buttonTheme)
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CloseThemeData(m_buttonTheme);
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_textFieldTheme)
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CloseThemeData(m_textFieldTheme);
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_menuListTheme)
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CloseThemeData(m_menuListTheme);
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_sliderTheme)
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CloseThemeData(m_sliderTheme);
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (m_spinButtonTheme)
233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        CloseThemeData(m_spinButtonTheme);
234a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_buttonTheme = m_textFieldTheme = m_menuListTheme = m_sliderTheme = m_spinButtonTheme = 0;
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    haveTheme = uxthemeLibrary() && IsThemeActive();
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::themeChanged()
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    close();
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectString RenderThemeWin::extraDefaultStyleSheet()
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return String(themeWinUserAgentStyleSheet, sizeof(themeWinUserAgentStyleSheet));
247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectString RenderThemeWin::extraQuirksStyleSheet()
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return String(themeWinQuirksUserAgentStyleSheet, sizeof(themeWinQuirksUserAgentStyleSheet));
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool RenderThemeWin::supportsHover(const RenderStyle*) const
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The Classic/2k look has no hover effects.
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return haveTheme;
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeWin::platformActiveSelectionBackgroundColor() const
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COLORREF color = GetSysColor(COLOR_HIGHLIGHT);
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return Color(GetRValue(color), GetGValue(color), GetBValue(color));
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeWin::platformInactiveSelectionBackgroundColor() const
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // This color matches Firefox.
269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return Color(176, 176, 176);
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeWin::platformActiveSelectionForegroundColor() const
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COLORREF color = GetSysColor(COLOR_HIGHLIGHTTEXT);
275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return Color(GetRValue(color), GetGValue(color), GetBValue(color));
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeWin::platformInactiveSelectionForegroundColor() const
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return platformActiveSelectionForegroundColor();
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void fillFontDescription(FontDescription& fontDescription, LOGFONT& logFont, float fontSize)
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setIsAbsoluteSize(true);
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setGenericFamily(FontDescription::NoFamily);
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.firstFamily().setFamily(String(logFont.lfFaceName));
288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    fontDescription.setSpecifiedSize(fontSize);
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setWeight(logFont.lfWeight >= 700 ? FontWeightBold : FontWeightNormal); // FIXME: Use real weight.
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    fontDescription.setItalic(logFont.lfItalic);
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void fillFontDescription(FontDescription& fontDescription, LOGFONT& logFont)
294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    fillFontDescription(fontDescription, logFont, abs(logFont.lfHeight));
296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::systemFont(int propId, FontDescription& fontDescription) const
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static FontDescription captionFont;
301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static FontDescription controlFont;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static FontDescription smallCaptionFont;
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static FontDescription menuFont;
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static FontDescription iconFont;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static FontDescription messageBoxFont;
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static FontDescription statusBarFont;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static FontDescription systemFont;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static bool initialized;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NONCLIENTMETRICS ncm;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!initialized) {
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        initialized = true;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ncm.cbSize = sizeof(NONCLIENTMETRICS);
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (propId) {
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueIcon: {
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!iconFont.isAbsoluteSize()) {
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                LOGFONT logFont;
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(logFont), &logFont, 0);
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fillFontDescription(iconFont, logFont);
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription = iconFont;
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueMenu:
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!menuFont.isAbsoluteSize())
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fillFontDescription(menuFont, ncm.lfMenuFont);
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription = menuFont;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueMessageBox:
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!messageBoxFont.isAbsoluteSize())
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fillFontDescription(messageBoxFont, ncm.lfMessageFont);
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription = messageBoxFont;
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueStatusBar:
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!statusBarFont.isAbsoluteSize())
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fillFontDescription(statusBarFont, ncm.lfStatusFont);
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription = statusBarFont;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueCaption:
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!captionFont.isAbsoluteSize())
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fillFontDescription(captionFont, ncm.lfCaptionFont);
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription = captionFont;
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueSmallCaption:
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!smallCaptionFont.isAbsoluteSize())
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                fillFontDescription(smallCaptionFont, ncm.lfSmCaptionFont);
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription = smallCaptionFont;
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case CSSValueWebkitSmallControl:
354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case CSSValueWebkitMiniControl: // Just map to small.
355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case CSSValueWebkitControl: // Just map to small.
356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!controlFont.isAbsoluteSize()) {
357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                HGDIOBJ hGDI = ::GetStockObject(DEFAULT_GUI_FONT);
358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (hGDI) {
359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    LOGFONT logFont;
360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (::GetObject(hGDI, sizeof(logFont), &logFont) > 0)
361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        fillFontDescription(controlFont, logFont, defaultControlFontPixelSize);
362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                }
363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            }
364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            fontDescription = controlFont;
365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            break;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: { // Everything else uses the stock GUI font.
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!systemFont.isAbsoluteSize()) {
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                HGDIOBJ hGDI = ::GetStockObject(DEFAULT_GUI_FONT);
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (hGDI) {
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    LOGFONT logFont;
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (::GetObject(hGDI, sizeof(logFont), &logFont) > 0)
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        fillFontDescription(systemFont, logFont);
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            fontDescription = systemFont;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool RenderThemeWin::supportsFocus(ControlPart appearance) const
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (appearance) {
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PushButtonPart:
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case ButtonPart:
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DefaultButtonPart:
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool RenderThemeWin::supportsFocusRing(const RenderStyle* style) const
393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return supportsFocus(style->appearance());
395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
397a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochunsigned RenderThemeWin::determineClassicState(RenderObject* o, ControlSubPart subPart)
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned state = 0;
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (o->style()->appearance()) {
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PushButtonPart:
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case ButtonPart:
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DefaultButtonPart:
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            state = DFCS_BUTTONPUSH;
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!isEnabled(o))
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state |= DFCS_INACTIVE;
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isPressed(o))
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state |= DFCS_PUSHED;
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case RadioPart:
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CheckboxPart:
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            state = (o->style()->appearance() == RadioPart) ? DFCS_BUTTONRADIO : DFCS_BUTTONCHECK;
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (isChecked(o))
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state |= DFCS_CHECKED;
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!isEnabled(o))
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state |= DFCS_INACTIVE;
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isPressed(o))
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state |= DFCS_PUSHED;
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case MenulistPart:
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            state = DFCS_SCROLLCOMBOBOX;
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!isEnabled(o))
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state |= DFCS_INACTIVE;
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (isPressed(o))
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                state |= DFCS_PUSHED;
426a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            break;
427a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        case InnerSpinButtonPart: {
428a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            bool isUpButton = subPart == SpinButtonUp;
429a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            state = isUpButton ? DFCS_SCROLLUP : DFCS_SCROLLDOWN;
430a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (!isEnabled(o) || isReadOnlyControl(o))
431a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                state |= DFCS_INACTIVE;
432a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            else if (isPressed(o) && isUpButton == isSpinUpButtonPartPressed(o))
433a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                state |= DFCS_PUSHED;
434a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            else if (isHovered(o) && isUpButton == isSpinUpButtonPartHovered(o))
435a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                state |= DFCS_HOT;
436a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            break;
437a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return state;
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned RenderThemeWin::determineState(RenderObject* o)
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned result = TS_NORMAL;
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ControlPart appearance = o->style()->appearance();
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isEnabled(o))
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TS_DISABLED;
450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (isReadOnlyControl(o) && (TextFieldPart == appearance || TextAreaPart == appearance || SearchFieldPart == appearance))
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TFS_READONLY; // Readonly is supported on textfields.
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (isPressed(o)) // Active overrides hover and focused.
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TS_ACTIVE;
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (supportsFocus(appearance) && isFocused(o))
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TS_FOCUSED;
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (isHovered(o))
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TS_HOVER;
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isChecked(o))
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result += 4; // 4 unchecked states, 4 checked states.
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned RenderThemeWin::determineSliderThumbState(RenderObject* o)
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned result = TUS_NORMAL;
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isEnabled(o->parent()))
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TUS_DISABLED;
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (supportsFocus(o->style()->appearance()) && isFocused(o->parent()))
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TUS_FOCUSED;
4700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else if (toRenderSlider(o->parent())->inDragMode())
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TUS_PRESSED;
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (isHovered(o))
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = TUS_HOT;
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned RenderThemeWin::determineButtonState(RenderObject* o)
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned result = PBS_NORMAL;
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!isEnabled(o))
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = PBS_DISABLED;
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (isPressed(o))
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = PBS_PRESSED;
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (supportsFocus(o->style()->appearance()) && isFocused(o))
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = PBS_DEFAULTED;
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (isHovered(o))
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = PBS_HOT;
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (isDefault(o))
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        result = PBS_DEFAULTED;
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
493a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochunsigned RenderThemeWin::determineSpinButtonState(RenderObject* o, ControlSubPart subPart)
494a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
495a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool isUpButton = subPart == SpinButtonUp;
496a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    unsigned result = isUpButton ? UPS_NORMAL : DNS_NORMAL;
497a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!isEnabled(o) || isReadOnlyControl(o))
498a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        result = isUpButton ? UPS_DISABLED : DNS_DISABLED;
499a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    else if (isPressed(o) && isUpButton == isSpinUpButtonPartPressed(o))
500a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        result = isUpButton ? UPS_PRESSED : DNS_PRESSED;
501a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    else if (isHovered(o) && isUpButton == isSpinUpButtonPartHovered(o))
502a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        result = isUpButton ? UPS_HOT : DNS_HOT;
503a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return result;
504a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
505a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
506a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochThemeData RenderThemeWin::getClassicThemeData(RenderObject* o, ControlSubPart subPart)
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ThemeData result;
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (o->style()->appearance()) {
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PushButtonPart:
5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case ButtonPart:
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DefaultButtonPart:
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CheckboxPart:
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case RadioPart:
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = DFC_BUTTON;
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineClassicState(o);
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case MenulistPart:
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = DFC_SCROLL;
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineClassicState(o);
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
522635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SearchFieldPart:
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case TextFieldPart:
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case TextAreaPart:
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TFP_TEXTFIELD;
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineState(o);
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderHorizontalPart:
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_TRACK;
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = TS_NORMAL;
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderVerticalPart:
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_TRACKVERT;
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = TS_NORMAL;
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderThumbHorizontalPart:
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_THUMBBOTTOM;
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineSliderThumbState(o);
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderThumbVerticalPart:
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_THUMBRIGHT;
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineSliderThumbState(o);
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
544a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        case InnerSpinButtonPart:
545a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result.m_part = DFC_SCROLL;
546a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result.m_state = determineClassicState(o, subPart);
547a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            break;
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default:
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
554a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochThemeData RenderThemeWin::getThemeData(RenderObject* o, ControlSubPart subPart)
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!haveTheme)
557a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return getClassicThemeData(o, subPart);
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ThemeData result;
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (o->style()->appearance()) {
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case PushButtonPart:
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case ButtonPart:
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DefaultButtonPart:
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = BP_BUTTON;
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineButtonState(o);
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CheckboxPart:
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = BP_CHECKBOX;
5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineState(o);
5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case MenulistPart:
5722bde8e466a4451c7319e3a072d118917957d6554Steve Block        case MenulistButtonPart: {
5732bde8e466a4451c7319e3a072d118917957d6554Steve Block            const bool isVistaOrLater = (windowsVersion() >= WindowsVista);
5742bde8e466a4451c7319e3a072d118917957d6554Steve Block            result.m_part = isVistaOrLater ? CP_DROPDOWNBUTTONRIGHT : CP_DROPDOWNBUTTON;
5752bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (isVistaOrLater && documentIsInApplicationChromeMode(o->document())) {
5765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                // The "readonly" look we use in application chrome mode
5775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                // only uses a "normal" look for the drop down button.
5785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                result.m_state = TS_NORMAL;
5795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            } else
5805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                result.m_state = determineState(o);
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5822bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case RadioPart:
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = BP_RADIO;
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineState(o);
5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
587635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SearchFieldPart:
5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case TextFieldPart:
5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case TextAreaPart:
5902bde8e466a4451c7319e3a072d118917957d6554Steve Block            result.m_part = (windowsVersion() >= WindowsVista) ? EP_EDITBORDER_NOSCROLL : TFP_TEXTFIELD;
5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineState(o);
5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderHorizontalPart:
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_TRACK;
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = TS_NORMAL;
5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderVerticalPart:
5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_TRACKVERT;
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = TS_NORMAL;
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderThumbHorizontalPart:
6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_THUMBBOTTOM;
6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineSliderThumbState(o);
6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case SliderThumbVerticalPart:
6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_part = TKP_THUMBRIGHT;
6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            result.m_state = determineSliderThumbState(o);
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
609a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        case InnerSpinButtonPart:
610a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result.m_part = subPart == SpinButtonUp ? SPNP_UP : SPNP_DOWN;
611a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result.m_state = determineSpinButtonState(o, subPart);
612a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            break;
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return result;
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void drawControl(GraphicsContext* context, RenderObject* o, HANDLE theme, const ThemeData& themeData, const IntRect& r)
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool alphaBlend = false;
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (theme)
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        alphaBlend = IsThemeBackgroundPartiallyTransparent(theme, themeData.m_part, themeData.m_state);
6235abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    LocalWindowsContext windowsContext(context, r, alphaBlend);
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RECT widgetRect = r;
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (theme)
6265abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        DrawThemeBackground(theme, windowsContext.hdc(), themeData.m_part, themeData.m_state, &widgetRect, 0);
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
6285abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        HDC hdc = windowsContext.hdc();
6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (themeData.m_part == TFP_TEXTFIELD) {
6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::DrawEdge(hdc, &widgetRect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (themeData.m_state == TS_DISABLED || themeData.m_state ==  TFS_READONLY)
6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ::FillRect(hdc, &widgetRect, (HBRUSH)(COLOR_BTNFACE+1));
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ::FillRect(hdc, &widgetRect, (HBRUSH)(COLOR_WINDOW+1));
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (themeData.m_part == TKP_TRACK || themeData.m_part == TKP_TRACKVERT) {
6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::DrawEdge(hdc, &widgetRect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::FillRect(hdc, &widgetRect, (HBRUSH)GetStockObject(GRAY_BRUSH));
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if ((o->style()->appearance() == SliderThumbHorizontalPart ||
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    o->style()->appearance() == SliderThumbVerticalPart) &&
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                   (themeData.m_part == TKP_THUMBBOTTOM || themeData.m_part == TKP_THUMBTOP ||
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    themeData.m_part == TKP_THUMBLEFT || themeData.m_part == TKP_THUMBRIGHT)) {
6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::DrawEdge(hdc, &widgetRect, EDGE_RAISED, BF_RECT | BF_SOFT | BF_MIDDLE | BF_ADJUST);
6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (themeData.m_state == TUS_DISABLED) {
6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                static WORD patternBits[8] = {0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55};
6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                HBITMAP patternBmp = ::CreateBitmap(8, 8, 1, 1, patternBits);
6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (patternBmp) {
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    HBRUSH brush = (HBRUSH) ::CreatePatternBrush(patternBmp);
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    COLORREF oldForeColor = ::SetTextColor(hdc, ::GetSysColor(COLOR_3DFACE));
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    COLORREF oldBackColor = ::SetBkColor(hdc, ::GetSysColor(COLOR_3DHILIGHT));
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    POINT p;
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::GetViewportOrgEx(hdc, &p);
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::SetBrushOrgEx(hdc, p.x + widgetRect.left, p.y + widgetRect.top, NULL);
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    HBRUSH oldBrush = (HBRUSH) ::SelectObject(hdc, brush);
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::FillRect(hdc, &widgetRect, brush);
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::SetTextColor(hdc, oldForeColor);
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::SetBkColor(hdc, oldBackColor);
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::SelectObject(hdc, oldBrush);
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::DeleteObject(brush);
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                } else
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    ::FillRect(hdc, &widgetRect, (HBRUSH)COLOR_3DHILIGHT);
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ::DeleteObject(patternBmp);
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Push buttons, buttons, checkboxes and radios, and the dropdown arrow in menulists.
6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (o->style()->appearance() == DefaultButtonPart) {
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                HBRUSH brush = ::GetSysColorBrush(COLOR_3DDKSHADOW);
6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ::FrameRect(hdc, &widgetRect, brush);
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ::InflateRect(&widgetRect, -1, -1);
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ::DrawEdge(hdc, &widgetRect, BDR_RAISEDOUTER, BF_RECT | BF_MIDDLE);
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ::DrawFrameControl(hdc, &widgetRect, themeData.m_part, themeData.m_state);
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
676ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    drawControl(i.context,  o, buttonTheme(), getThemeData(o), r);
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
682a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid RenderThemeWin::adjustInnerSpinButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
683a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
684a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int width = ::GetSystemMetrics(SM_CXVSCROLL);
685a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (width <= 0)
686a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        width = 17; // Vista's default.
687a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    style->setWidth(Length(width, Fixed));
688a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    style->setMinWidth(Length(width, Fixed));
689a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
690a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
691a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochbool RenderThemeWin::paintInnerSpinButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
692a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{
693a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // We split the specified rectangle into two vertically. We can't draw a
694a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    // spin button of which height is less than 2px.
695a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (r.height() < 2)
696a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        return false;
697a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    IntRect upRect(r);
698a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    upRect.setHeight(r.height() / 2);
699a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    IntRect downRect(r);
7002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    downRect.setY(upRect.maxY());
701a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    downRect.setHeight(r.height() - upRect.height());
702a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    drawControl(i.context, o, spinButtonTheme(), getThemeData(o, SpinButtonUp), upRect);
703a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    drawControl(i.context, o, spinButtonTheme(), getThemeData(o, SpinButtonDown), downRect);
704a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    return false;
705a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch}
706a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::setCheckboxSize(RenderStyle* style) const
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If the width and height are both specified, then we have nothing to do.
7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME:  A hard-coded size of 13 is used.  This is wrong but necessary for now.  It matches Firefox.
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // At different DPI settings on Windows, querying the theme gives you a larger size that accounts for
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the higher DPI.  Until our entire engine honors a DPI setting other than 96, we can't rely on the theme's
7168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // metrics.
7178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->width().isIntrinsicOrAuto())
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setWidth(Length(13, Fixed));
7198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (style->height().isAuto())
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        style->setHeight(Length(13, Fixed));
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
723ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintTextField(RenderObject* o, const PaintInfo& i, const IntRect& r)
7248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    drawControl(i.context,  o, textFieldTheme(), getThemeData(o), r);
7268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
7278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
729ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMenuList(RenderObject* o, const PaintInfo& i, const IntRect& r)
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HANDLE theme;
7325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int part;
7332bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (haveTheme && (windowsVersion() >= WindowsVista)) {
7345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        theme = menuListTheme();
7355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (documentIsInApplicationChromeMode(o->document()))
7365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            part = CP_READONLY;
7375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        else
7385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            part = CP_BORDER;
7395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    } else {
7405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        theme = textFieldTheme();
7415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        part = TFP_TEXTFIELD;
7425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
7435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
7445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    drawControl(i.context,  o, theme, ThemeData(part, determineState(o)), r);
7458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return paintMenuListButton(o, i, r);
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::adjustMenuListStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->resetBorder();
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    adjustMenuListButtonStyle(selector, style, e);
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::adjustMenuListButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // These are the paddings needed to place the text correctly in the <select> box
7588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int dropDownBoxPaddingTop    = 2;
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int dropDownBoxPaddingRight  = style->direction() == LTR ? 4 + dropDownButtonWidth : 4;
7608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int dropDownBoxPaddingBottom = 2;
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int dropDownBoxPaddingLeft   = style->direction() == LTR ? 4 : 4 + dropDownButtonWidth;
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The <select> box must be at least 12px high for the button to render nicely on Windows
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const int dropDownBoxMinHeight = 12;
7648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Position the text correctly within the select box and make the box wide enough to fit the dropdown button
7668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingTop(Length(dropDownBoxPaddingTop, Fixed));
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingRight(Length(dropDownBoxPaddingRight, Fixed));
7688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingBottom(Length(dropDownBoxPaddingBottom, Fixed));
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setPaddingLeft(Length(dropDownBoxPaddingLeft, Fixed));
7708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Height is locked to auto
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setHeight(Length(Auto));
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Calculate our min-height
7752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    int minHeight = style->fontMetrics().height();
7768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    minHeight = max(minHeight, dropDownBoxMinHeight);
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setMinHeight(Length(minHeight, Fixed));
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // White-space is locked to pre
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setWhiteSpace(PRE);
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
784ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMenuListButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Don't make hardcoded assumptions about the thickness of the textfield border.
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int borderThickness = haveTheme ? 1 : 2;
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Paint the dropdown button on the inner edge of the text field,
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // leaving space for the text field's 1px border
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect buttonRect(r);
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buttonRect.inflate(-borderThickness);
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (o->style()->direction() == LTR)
7942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        buttonRect.setX(buttonRect.maxX() - dropDownButtonWidth);
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    buttonRect.setWidth(dropDownButtonWidth);
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7972bde8e466a4451c7319e3a072d118917957d6554Steve Block    if ((windowsVersion() >= WindowsVista)) {
7985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        // Outset the top, right, and bottom borders of the button so that they coincide with the <select>'s border.
7995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        buttonRect.setY(buttonRect.y() - vistaMenuListButtonOutset);
8005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        buttonRect.setHeight(buttonRect.height() + 2 * vistaMenuListButtonOutset);
8015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        buttonRect.setWidth(buttonRect.width() + vistaMenuListButtonOutset);
8025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
8035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    drawControl(i.context, o, menuListTheme(), getThemeData(o), buttonRect);
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int trackWidth = 4;
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
811ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintSliderTrack(RenderObject* o, const PaintInfo& i, const IntRect& r)
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect bounds = r;
8148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (o->style()->appearance() ==  SliderHorizontalPart) {
8168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bounds.setHeight(trackWidth);
8178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bounds.setY(r.y() + r.height() / 2 - trackWidth / 2);
8188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (o->style()->appearance() == SliderVerticalPart) {
8198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bounds.setWidth(trackWidth);
8208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bounds.setX(r.x() + r.width() / 2 - trackWidth / 2);
8218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    drawControl(i.context,  o, sliderTheme(), getThemeData(o), bounds);
8248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
827ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintSliderThumb(RenderObject* o, const PaintInfo& i, const IntRect& r)
8288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
8298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    drawControl(i.context,  o, sliderTheme(), getThemeData(o), r);
8308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int sliderThumbWidth = 7;
8348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst int sliderThumbHeight = 15;
8358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::adjustSliderThumbSize(RenderObject* o) const
8378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
83868513a70bcd92384395513322f1b801e7bf9c729Steve Block    ControlPart part = o->style()->appearance();
83968513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (part == SliderThumbVerticalPart) {
8408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        o->style()->setWidth(Length(sliderThumbHeight, Fixed));
8418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        o->style()->setHeight(Length(sliderThumbWidth, Fixed));
84268513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else if (part == SliderThumbHorizontalPart) {
8438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        o->style()->setWidth(Length(sliderThumbWidth, Fixed));
8448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        o->style()->setHeight(Length(sliderThumbHeight, Fixed));
8458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(VIDEO)
84768513a70bcd92384395513322f1b801e7bf9c729Steve Block    else if (part == MediaSliderThumbPart || part == MediaVolumeSliderThumbPart)
8485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        RenderMediaControls::adjustMediaSliderThumbSize(o);
8495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
851635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
852ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintSearchField(RenderObject* o, const PaintInfo& i, const IntRect& r)
8538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
8548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return paintTextField(o, i, r);
8558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid RenderThemeWin::adjustSearchFieldStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
8585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
8595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Override paddingSize to match AppKit text positioning.
8605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    const int padding = 1;
8615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    style->setPaddingLeft(Length(padding, Fixed));
8625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    style->setPaddingRight(Length(padding, Fixed));
8635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    style->setPaddingTop(Length(padding, Fixed));
8645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    style->setPaddingBottom(Length(padding, Fixed));
8655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (e && e->focused() && e->document()->frame()->selection()->isFocusedAndActive())
8665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        style->setOutlineOffset(-2);
8675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
8685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
869ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintSearchFieldCancelButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
871635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect bounds = r;
872635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(o->parent());
873635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!o->parent() || !o->parent()->isBox())
874635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
875635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
876635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RenderBox* parentRenderBox = toRenderBox(o->parent());
877635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
878635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect parentBox = parentRenderBox->absoluteContentBox();
879635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
880635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Make sure the scaled button stays square and will fit in its parent's box
881635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setHeight(min(parentBox.width(), min(parentBox.height(), bounds.height())));
882635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setWidth(bounds.height());
883635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
884635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Center the button vertically.  Round up though, so if it has to be one pixel off-center, it will
885635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // be one pixel closer to the bottom of the field.  This tends to look better with the text.
886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setY(parentBox.y() + (parentBox.height() - bounds.height() + 1) / 2);
887635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
888635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static Image* cancelImage = Image::loadPlatformResource("searchCancel").releaseRef();
889635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static Image* cancelPressedImage = Image::loadPlatformResource("searchCancelPressed").releaseRef();
890643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    paintInfo.context->drawImage(isPressed(o) ? cancelPressedImage : cancelImage, o->style()->colorSpace(), bounds);
8918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
8928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
8938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::adjustSearchFieldCancelButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
8958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Scale the button size based on the font size
897635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    float fontScale = style->fontSize() / defaultControlFontPixelSize;
898635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int cancelButtonSize = lroundf(min(max(minCancelButtonSize, defaultCancelButtonSize * fontScale), maxCancelButtonSize));
899635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    style->setWidth(Length(cancelButtonSize, Fixed));
900635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    style->setHeight(Length(cancelButtonSize, Fixed));
9018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::adjustSearchFieldDecorationStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
9048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntSize emptySize(1, 11);
9068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setWidth(Length(emptySize.width(), Fixed));
9078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    style->setHeight(Length(emptySize.height(), Fixed));
9088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
909635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
9108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::adjustSearchFieldResultsDecorationStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
9118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
912635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Scale the decoration size based on the font size
913635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    float fontScale = style->fontSize() / defaultControlFontPixelSize;
914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int magnifierSize = lroundf(min(max(minSearchFieldResultsDecorationSize, defaultSearchFieldResultsDecorationSize * fontScale),
915635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                                     maxSearchFieldResultsDecorationSize));
916635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    style->setWidth(Length(magnifierSize, Fixed));
917635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    style->setHeight(Length(magnifierSize, Fixed));
9188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
920ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintSearchFieldResultsDecoration(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
9218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    IntRect bounds = r;
923635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(o->parent());
924635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!o->parent() || !o->parent()->isBox())
925635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
926635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
927635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RenderBox* parentRenderBox = toRenderBox(o->parent());
928635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect parentBox = parentRenderBox->absoluteContentBox();
929635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
930635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Make sure the scaled decoration stays square and will fit in its parent's box
931635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setHeight(min(parentBox.width(), min(parentBox.height(), bounds.height())));
9328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bounds.setWidth(bounds.height());
9338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
934635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Center the decoration vertically.  Round up though, so if it has to be one pixel off-center, it will
935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // be one pixel closer to the bottom of the field.  This tends to look better with the text.
936635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setY(parentBox.y() + (parentBox.height() - bounds.height() + 1) / 2);
9378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static Image* magnifierImage = Image::loadPlatformResource("searchMagnifier").releaseRef();
939643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    paintInfo.context->drawImage(magnifierImage, o->style()->colorSpace(), bounds);
9408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
9418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid RenderThemeWin::adjustSearchFieldResultsButtonStyle(CSSStyleSelector* selector, RenderStyle* style, Element* e) const
9448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
945635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Scale the button size based on the font size
946635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    float fontScale = style->fontSize() / defaultControlFontPixelSize;
947635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int magnifierHeight = lroundf(min(max(minSearchFieldResultsDecorationSize, defaultSearchFieldResultsDecorationSize * fontScale),
948635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                                   maxSearchFieldResultsDecorationSize));
949635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int magnifierWidth = lroundf(magnifierHeight * defaultSearchFieldResultsButtonWidth / defaultSearchFieldResultsDecorationSize);
950635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    style->setWidth(Length(magnifierWidth, Fixed));
951635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    style->setHeight(Length(magnifierHeight, Fixed));
9528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
954ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintSearchFieldResultsButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
9558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
956635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect bounds = r;
957635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(o->parent());
958635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!o->parent())
959635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
960635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!o->parent() || !o->parent()->isBox())
961635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return false;
962635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
963635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RenderBox* parentRenderBox = toRenderBox(o->parent());
964635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    IntRect parentBox = parentRenderBox->absoluteContentBox();
965635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
966635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Make sure the scaled decoration will fit in its parent's box
967635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setHeight(min(parentBox.height(), bounds.height()));
968635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setWidth(min(parentBox.width(), static_cast<int>(bounds.height() * defaultSearchFieldResultsButtonWidth / defaultSearchFieldResultsDecorationSize)));
969635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
970635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Center the button vertically.  Round up though, so if it has to be one pixel off-center, it will
971635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // be one pixel closer to the bottom of the field.  This tends to look better with the text.
972635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bounds.setY(parentBox.y() + (parentBox.height() - bounds.height() + 1) / 2);
973635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
974635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static Image* magnifierImage = Image::loadPlatformResource("searchMagnifierResults").releaseRef();
975643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    paintInfo.context->drawImage(magnifierImage, o->style()->colorSpace(), bounds);
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
9778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Map a CSSValue* system color to an index understood by GetSysColor
9808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int cssValueIdToSysColorIndex(int cssValueId)
9818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
9828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (cssValueId) {
9838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueActiveborder: return COLOR_ACTIVEBORDER;
9848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueActivecaption: return COLOR_ACTIVECAPTION;
9858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueAppworkspace: return COLOR_APPWORKSPACE;
9868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueBackground: return COLOR_BACKGROUND;
9878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueButtonface: return COLOR_BTNFACE;
9888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueButtonhighlight: return COLOR_BTNHIGHLIGHT;
9898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueButtonshadow: return COLOR_BTNSHADOW;
9908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueButtontext: return COLOR_BTNTEXT;
9918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueCaptiontext: return COLOR_CAPTIONTEXT;
9928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueGraytext: return COLOR_GRAYTEXT;
9938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueHighlight: return COLOR_HIGHLIGHT;
9948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueHighlighttext: return COLOR_HIGHLIGHTTEXT;
9958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInactiveborder: return COLOR_INACTIVEBORDER;
9968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInactivecaption: return COLOR_INACTIVECAPTION;
9978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInactivecaptiontext: return COLOR_INACTIVECAPTIONTEXT;
9988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInfobackground: return COLOR_INFOBK;
9998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueInfotext: return COLOR_INFOTEXT;
10008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueMenu: return COLOR_MENU;
10018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueMenutext: return COLOR_MENUTEXT;
10028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueScrollbar: return COLOR_SCROLLBAR;
10038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThreeddarkshadow: return COLOR_3DDKSHADOW;
10048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThreedface: return COLOR_3DFACE;
10058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThreedhighlight: return COLOR_3DHIGHLIGHT;
10068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThreedlightshadow: return COLOR_3DLIGHT;
10078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueThreedshadow: return COLOR_3DSHADOW;
10088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueWindow: return COLOR_WINDOW;
10098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueWindowframe: return COLOR_WINDOWFRAME;
10108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case CSSValueWindowtext: return COLOR_WINDOWTEXT;
10118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        default: return -1; // Unsupported CSSValue
10128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectColor RenderThemeWin::systemColor(int cssValueId) const
10168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int sysColorIndex = cssValueIdToSysColorIndex(cssValueId);
1018635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (sysColorIndex == -1)
1019635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return RenderTheme::systemColor(cssValueId);
1020635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
10218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    COLORREF color = GetSysColor(sysColorIndex);
10228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return Color(GetRValue(color), GetGValue(color), GetBValue(color));
10238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(VIDEO)
1026643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
102768513a70bcd92384395513322f1b801e7bf9c729Steve BlockString RenderThemeWin::extraMediaControlsStyleSheet()
102868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
102968513a70bcd92384395513322f1b801e7bf9c729Steve Block    return String(mediaControlsQuickTimeUserAgentStyleSheet, sizeof(mediaControlsQuickTimeUserAgentStyleSheet));
103068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
103168513a70bcd92384395513322f1b801e7bf9c729Steve Block
10322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochbool RenderThemeWin::supportsClosedCaptioning() const
1033643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1034643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // We rely on QuickTime to render captions so only enable the button for a video element.
1035643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if SAFARI_THEME_VERSION >= 4
10362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return true;
1037643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
10382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    return false;
1039643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
1040643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1041643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1042ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaFullscreenButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
10435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderMediaControls::paintMediaControlsPart(MediaFullscreenButton, o, paintInfo, r);
10455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1047ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaMuteButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
10485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderMediaControls::paintMediaControlsPart(MediaMuteButton, o, paintInfo, r);
10505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1052ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaPlayButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
10535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderMediaControls::paintMediaControlsPart(MediaPlayButton, o, paintInfo, r);
10555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
105768513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool RenderThemeWin::paintMediaRewindButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
105868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
105968513a70bcd92384395513322f1b801e7bf9c729Steve Block    return RenderMediaControls::paintMediaControlsPart(MediaRewindButton, o, paintInfo, r);
106068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
106168513a70bcd92384395513322f1b801e7bf9c729Steve Block
1062ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaSeekBackButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
10635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderMediaControls::paintMediaControlsPart(MediaSeekBackButton, o, paintInfo, r);
10655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1067ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaSeekForwardButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
10685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderMediaControls::paintMediaControlsPart(MediaSeekForwardButton, o, paintInfo, r);
10705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1072ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaSliderTrack(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
10735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderMediaControls::paintMediaControlsPart(MediaSlider, o, paintInfo, r);
10755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1077ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaSliderThumb(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
10785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderMediaControls::paintMediaControlsPart(MediaSliderThumb, o, paintInfo, r);
10805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1081643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1082ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool RenderThemeWin::paintMediaToggleClosedCaptionsButton(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
1083643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1084643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return RenderMediaControls::paintMediaControlsPart(MediaShowClosedCaptionsButton, o, paintInfo, r);
1085643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
1086643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
108768513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool RenderThemeWin::paintMediaControlsBackground(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
108868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
108968513a70bcd92384395513322f1b801e7bf9c729Steve Block    return RenderMediaControls::paintMediaControlsPart(MediaTimelineContainer, o, paintInfo, r);
109068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
109168513a70bcd92384395513322f1b801e7bf9c729Steve Block
109268513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool RenderThemeWin::paintMediaVolumeSliderContainer(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
109368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
109468513a70bcd92384395513322f1b801e7bf9c729Steve Block    return RenderMediaControls::paintMediaControlsPart(MediaVolumeSliderContainer, o, paintInfo, r);
109568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
109668513a70bcd92384395513322f1b801e7bf9c729Steve Block
109768513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool RenderThemeWin::paintMediaVolumeSliderTrack(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
109868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
109968513a70bcd92384395513322f1b801e7bf9c729Steve Block    return RenderMediaControls::paintMediaControlsPart(MediaVolumeSlider, o, paintInfo, r);
110068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
110168513a70bcd92384395513322f1b801e7bf9c729Steve Block
110268513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool RenderThemeWin::paintMediaVolumeSliderThumb(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
110368513a70bcd92384395513322f1b801e7bf9c729Steve Block{
110468513a70bcd92384395513322f1b801e7bf9c729Steve Block    return RenderMediaControls::paintMediaControlsPart(MediaVolumeSliderThumb, o, paintInfo, r);
110568513a70bcd92384395513322f1b801e7bf9c729Steve Block}
110668513a70bcd92384395513322f1b801e7bf9c729Steve Block
110781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochIntPoint RenderThemeWin::volumeSliderOffsetFromMuteButton(RenderBox* muteButtonBox, const IntSize& size) const
110868513a70bcd92384395513322f1b801e7bf9c729Steve Block{
110981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return RenderMediaControls::volumeSliderOffsetFromMuteButton(muteButtonBox, size);
111068513a70bcd92384395513322f1b801e7bf9c729Steve Block}
111168513a70bcd92384395513322f1b801e7bf9c729Steve Block
111268513a70bcd92384395513322f1b801e7bf9c729Steve Block
11135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
11145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1116