bool RenderThemeWinCE::paintMenuListButton(RenderObject* o, const PaintInfo& i, const IntRect& r) { IntRect buttonRect(r.maxX() - dropDownButtonWidth - 1, r.y(), dropDownButtonWidth, r.height()); buttonRect.inflateY(-1); i.context->drawFrameControl(buttonRect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX | determineClassicState(o)); return true; }
ThemeData RenderThemeWinCE::getThemeData(RenderObject* o) { ThemeData result; switch (o->style()->appearance()) { case PushButtonPart: case ButtonPart: result.m_part = BP_BUTTON; result.m_classicState = DFCS_BUTTONPUSH; break; case CheckboxPart: result.m_part = BP_CHECKBOX; result.m_classicState = DFCS_BUTTONCHECK; break; case RadioPart: result.m_part = BP_RADIO; result.m_classicState = DFCS_BUTTONRADIO; break; case ListboxPart: case MenulistPart: case TextFieldPart: case TextAreaPart: result.m_part = TFP_TEXTFIELD; break; } result.m_classicState |= determineClassicState(o); return result; }
ThemeData RenderThemeChromiumWin::getThemeData(RenderObject* o, ControlSubPart subPart) { ThemeData result; switch (o->style()->appearance()) { case CheckboxPart: result.m_part = BP_CHECKBOX; result.m_state = determineState(o); result.m_classicState = DFCS_BUTTONCHECK; break; case RadioPart: result.m_part = BP_RADIOBUTTON; result.m_state = determineState(o); result.m_classicState = DFCS_BUTTONRADIO; break; case SquareButtonPart: case PushButtonPart: case ButtonPart: result.m_part = BP_PUSHBUTTON; result.m_state = determineState(o); result.m_classicState = DFCS_BUTTONPUSH; break; case SliderHorizontalPart: result.m_part = TKP_TRACK; result.m_state = TRS_NORMAL; break; case SliderVerticalPart: result.m_part = TKP_TRACKVERT; result.m_state = TRVS_NORMAL; break; case SliderThumbHorizontalPart: result.m_part = TKP_THUMBBOTTOM; result.m_state = determineSliderThumbState(o); break; case SliderThumbVerticalPart: result.m_part = TKP_THUMBVERT; result.m_state = determineSliderThumbState(o); break; case ListboxPart: case MenulistPart: case MenulistButtonPart: case SearchFieldPart: case TextFieldPart: case TextAreaPart: result.m_part = EP_EDITTEXT; result.m_state = determineState(o); break; case InnerSpinButtonPart: result.m_part = subPart == SpinButtonUp ? SPNP_UP : SPNP_DOWN; result.m_state = determineState(o, subPart); result.m_classicState = subPart == SpinButtonUp ? DFCS_SCROLLUP : DFCS_SCROLLDOWN; break; } result.m_classicState |= determineClassicState(o, subPart); return result; }
// Used to paint unstyled menulists (i.e. with the default border) bool RenderThemeChromiumWin::paintMenuList(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r) { if (!o->isBox()) return false; const RenderBox* box = toRenderBox(o); int borderRight = box->borderRight(); int borderLeft = box->borderLeft(); int borderTop = box->borderTop(); int borderBottom = box->borderBottom(); // If all the borders are 0, then tell skia not to paint the border on the // textfield. FIXME: http://b/1210017 Figure out how to get Windows to not // draw individual borders and then pass that to skia so we can avoid // drawing any borders that are set to 0. For non-zero borders, we draw the // border, but webkit just draws over it. bool drawEdges = !(borderRight == 0 && borderLeft == 0 && borderTop == 0 && borderBottom == 0); paintTextFieldInternal(o, i, r, drawEdges); // Take padding and border into account. If the MenuList is smaller than // the size of a button, make sure to shrink it appropriately and not put // its x position to the left of the menulist. const int buttonWidth = GetSystemMetrics(SM_CXVSCROLL); int spacingLeft = borderLeft + box->paddingLeft(); int spacingRight = borderRight + box->paddingRight(); int spacingTop = borderTop + box->paddingTop(); int spacingBottom = borderBottom + box->paddingBottom(); int buttonX; if (r.right() - r.x() < buttonWidth) buttonX = r.x(); else buttonX = o->style()->direction() == LTR ? r.right() - spacingRight - buttonWidth : r.x() + spacingLeft; // Compute the rectangle of the button in the destination image. IntRect rect(buttonX, r.y() + spacingTop, std::min(buttonWidth, r.right() - r.x()), r.height() - (spacingTop + spacingBottom)); // Get the correct theme data for a textfield and paint the menu. WebCore::ThemePainter painter(i.context, rect); ChromiumBridge::paintMenuList(painter.context(), CP_DROPDOWNBUTTON, determineState(o), determineClassicState(o), painter.drawRect()); return false; }
bool RenderThemeWin::paintMenuListButton(RenderObject* o, const RenderObject::PaintInfo& i, const IntRect& r) { HDC hdc = prepareForDrawing(i.context); RECT widgetRect = r; if (m_themeDLL && !m_menuListTheme) m_menuListTheme = openTheme(0, L"Combobox"); if (m_menuListTheme && drawThemeBG) drawThemeBG(m_menuListTheme, hdc, CP_DROPDOWNBUTTON, determineState(o), &widgetRect, NULL); else DrawFrameControl(hdc, &widgetRect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX | determineClassicState(o)); doneDrawing(i.context, hdc); return false; }
bool RenderThemeChromiumWin::paintMenuListButton(RenderObject* o, const PaintInfo& i, const IntRect& r) { if (!o->isBox()) return false; const RenderBox* box = toRenderBox(o); // Take padding and border into account. If the MenuList is smaller than // the size of a button, make sure to shrink it appropriately and not put // its x position to the left of the menulist. const int buttonWidth = menuListButtonWidth(); int spacingLeft = box->borderLeft() + box->paddingLeft(); int spacingRight = box->borderRight() + box->paddingRight(); int spacingTop = box->borderTop() + box->paddingTop(); int spacingBottom = box->borderBottom() + box->paddingBottom(); int buttonX; if (r.maxX() - r.x() < buttonWidth) buttonX = r.x(); else buttonX = o->style()->direction() == LTR ? r.maxX() - spacingRight - buttonWidth : r.x() + spacingLeft; // Compute the rectangle of the button in the destination image. IntRect rect(buttonX, r.y() + spacingTop, std::min(buttonWidth, r.maxX() - r.x()), r.height() - (spacingTop + spacingBottom)); // Get the correct theme data for a textfield and paint the menu. ThemePainter painter(i.context, rect); WebKit::WebCanvas* canvas = painter.context()->platformContext()->canvas(); WebKit::Platform::current()->themeEngine()->paintMenuList(canvas, CP_DROPDOWNBUTTON, determineState(o), determineClassicState(o), WebKit::WebRect(painter.drawRect())); return false; }