1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef nsNativeThemeCocoa_h_ 7 #define nsNativeThemeCocoa_h_ 8 9 #import <Carbon/Carbon.h> 10 #import <Cocoa/Cocoa.h> 11 12 #include "mozilla/Variant.h" 13 14 #include "nsITheme.h" 15 #include "nsCOMPtr.h" 16 #include "nsAtom.h" 17 #include "nsNativeTheme.h" 18 19 @class CellDrawView; 20 @class NSProgressBarCell; 21 class nsDeviceContext; 22 struct SegmentedControlRenderSettings; 23 24 namespace mozilla { 25 class EventStates; 26 namespace gfx { 27 class DrawTarget; 28 } // namespace gfx 29 } // namespace mozilla 30 31 class nsNativeThemeCocoa : private nsNativeTheme, public nsITheme { 32 public: 33 enum { 34 eThemeGeometryTypeTitlebar = eThemeGeometryTypeUnknown + 1, 35 eThemeGeometryTypeToolbar, 36 eThemeGeometryTypeToolbox, 37 eThemeGeometryTypeWindowButtons, 38 eThemeGeometryTypeFullscreenButton, 39 eThemeGeometryTypeMenu, 40 eThemeGeometryTypeHighlightedMenuItem, 41 eThemeGeometryTypeVibrancyLight, 42 eThemeGeometryTypeVibrancyDark, 43 eThemeGeometryTypeVibrantTitlebarLight, 44 eThemeGeometryTypeVibrantTitlebarDark, 45 eThemeGeometryTypeTooltip, 46 eThemeGeometryTypeSheet, 47 eThemeGeometryTypeSourceList, 48 eThemeGeometryTypeSourceListSelection, 49 eThemeGeometryTypeActiveSourceListSelection 50 }; 51 52 enum class MenuIcon : uint8_t { 53 eCheckmark, 54 eMenuArrow, 55 eMenuDownScrollArrow, 56 eMenuUpScrollArrow 57 }; 58 59 enum class CheckboxOrRadioState : uint8_t { eOff, eOn, eIndeterminate }; 60 61 enum class ButtonType : uint8_t { 62 eRegularPushButton, 63 eDefaultPushButton, 64 eRegularBevelButton, 65 eDefaultBevelButton, 66 eRoundedBezelPushButton, 67 eSquareBezelPushButton, 68 eArrowButton, 69 eHelpButton, 70 eTreeTwistyPointingRight, 71 eTreeTwistyPointingDown, 72 eDisclosureButtonClosed, 73 eDisclosureButtonOpen 74 }; 75 76 enum class SpinButton : uint8_t { eUp, eDown }; 77 78 enum class SegmentType : uint8_t { eToolbarButton, eTab }; 79 80 enum class OptimumState : uint8_t { eOptimum, eSubOptimum, eSubSubOptimum }; 81 82 struct ControlParams { ControlParamsControlParams83 ControlParams() 84 : disabled(false), insideActiveWindow(false), pressed(false), focused(false), rtl(false) {} 85 86 bool disabled : 1; 87 bool insideActiveWindow : 1; 88 bool pressed : 1; 89 bool focused : 1; 90 bool rtl : 1; 91 }; 92 93 struct MenuBackgroundParams { 94 bool disabled = false; 95 bool submenuRightOfParent = false; 96 }; 97 98 struct MenuIconParams { 99 MenuIcon icon = MenuIcon::eCheckmark; 100 bool disabled = false; 101 bool insideActiveMenuItem = false; 102 bool centerHorizontally = false; 103 bool rtl = false; 104 }; 105 106 struct MenuItemParams { 107 bool backgroundIsVibrant = false; 108 bool checked = false; 109 bool disabled = false; 110 bool selected = false; 111 bool rtl = false; 112 }; 113 114 struct CheckboxOrRadioParams { 115 ControlParams controlParams; 116 CheckboxOrRadioState state = CheckboxOrRadioState::eOff; 117 float verticalAlignFactor = 0.5f; 118 }; 119 120 struct ButtonParams { 121 ControlParams controlParams; 122 ButtonType button = ButtonType::eRegularPushButton; 123 }; 124 125 struct DropdownParams { 126 ControlParams controlParams; 127 bool pullsDown = false; 128 bool editable = false; 129 }; 130 131 struct SpinButtonParams { 132 mozilla::Maybe<SpinButton> pressedButton; 133 bool disabled = false; 134 bool insideActiveWindow = false; 135 }; 136 137 struct SegmentParams { 138 SegmentType segmentType = SegmentType::eToolbarButton; 139 bool insideActiveWindow = false; 140 bool pressed = false; 141 bool selected = false; 142 bool focused = false; 143 bool atLeftEnd = false; 144 bool atRightEnd = false; 145 bool drawsLeftSeparator = false; 146 bool drawsRightSeparator = false; 147 bool rtl = false; 148 }; 149 150 struct UnifiedToolbarParams { 151 float unifiedHeight = 0.0f; 152 bool isMain = false; 153 }; 154 155 struct TextBoxParams { 156 bool disabled = false; 157 bool focused = false; 158 bool borderless = false; 159 }; 160 161 struct SearchFieldParams { 162 float verticalAlignFactor = 0.5f; 163 bool insideToolbar = false; 164 bool disabled = false; 165 bool focused = false; 166 bool rtl = false; 167 }; 168 169 struct ProgressParams { 170 double value = 0.0; 171 double max = 0.0; 172 float verticalAlignFactor = 0.5f; 173 bool insideActiveWindow = false; 174 bool indeterminate = false; 175 bool horizontal = false; 176 bool rtl = false; 177 }; 178 179 struct MeterParams { 180 double value = 0; 181 double min = 0; 182 double max = 0; 183 OptimumState optimumState = OptimumState::eOptimum; 184 float verticalAlignFactor = 0.5f; 185 bool horizontal = true; 186 bool rtl = false; 187 }; 188 189 struct TreeHeaderCellParams { 190 ControlParams controlParams; 191 TreeSortDirection sortDirection = eTreeSortDirection_Natural; 192 bool lastTreeHeaderCell = false; 193 }; 194 195 struct ScaleParams { 196 int32_t value = 0; 197 int32_t min = 0; 198 int32_t max = 0; 199 bool insideActiveWindow = false; 200 bool disabled = false; 201 bool focused = false; 202 bool horizontal = true; 203 bool reverse = false; 204 }; 205 206 struct ScrollbarParams { ScrollbarParamsScrollbarParams207 ScrollbarParams() 208 : overlay(false), 209 rolledOver(false), 210 small(false), 211 horizontal(false), 212 rtl(false), 213 onDarkBackground(false), 214 custom(false) {} 215 216 bool overlay : 1; 217 bool rolledOver : 1; 218 bool small : 1; 219 bool horizontal : 1; 220 bool rtl : 1; 221 bool onDarkBackground : 1; 222 bool custom : 1; 223 // Two colors only used when custom is true. 224 nscolor trackColor = NS_RGBA(0, 0, 0, 0); 225 nscolor faceColor = NS_RGBA(0, 0, 0, 0); 226 }; 227 228 enum Widget : uint8_t { 229 eColorFill, // mozilla::gfx::sRGBColor 230 eSheetBackground, 231 eDialogBackground, 232 eMenuBackground, // MenuBackgroundParams 233 eMenuIcon, // MenuIconParams 234 eMenuItem, // MenuItemParams 235 eMenuSeparator, // MenuItemParams 236 eTooltip, 237 eCheckbox, // CheckboxOrRadioParams 238 eRadio, // CheckboxOrRadioParams 239 eButton, // ButtonParams 240 eDropdown, // DropdownParams 241 eFocusOutline, 242 eSpinButtons, // SpinButtonParams 243 eSpinButtonUp, // SpinButtonParams 244 eSpinButtonDown, // SpinButtonParams 245 eSegment, // SegmentParams 246 eSeparator, 247 eUnifiedToolbar, // UnifiedToolbarParams 248 eToolbar, // bool 249 eNativeTitlebar, // UnifiedToolbarParams 250 eStatusBar, // bool 251 eGroupBox, 252 eTextBox, // TextBoxParams 253 eSearchField, // SearchFieldParams 254 eProgressBar, // ProgressParams 255 eMeter, // MeterParams 256 eTreeHeaderCell, // TreeHeaderCellParams 257 eScale, // ScaleParams 258 eScrollbarThumb, // ScrollbarParams 259 eScrollbarTrack, // ScrollbarParams 260 eScrollCorner, // ScrollbarParams 261 eMultilineTextField, // bool 262 eListBox, 263 eSourceList, // bool 264 eActiveSourceListSelection, // bool 265 eInactiveSourceListSelection, // bool 266 eTabPanel, 267 eResizer 268 }; 269 270 struct WidgetInfo { ColorFillWidgetInfo271 static WidgetInfo ColorFill(const mozilla::gfx::sRGBColor& aParams) { 272 return WidgetInfo(Widget::eColorFill, aParams); 273 } SheetBackgroundWidgetInfo274 static WidgetInfo SheetBackground() { return WidgetInfo(Widget::eSheetBackground, false); } DialogBackgroundWidgetInfo275 static WidgetInfo DialogBackground() { return WidgetInfo(Widget::eDialogBackground, false); } MenuBackgroundWidgetInfo276 static WidgetInfo MenuBackground(const MenuBackgroundParams& aParams) { 277 return WidgetInfo(Widget::eMenuBackground, aParams); 278 } MenuIconWidgetInfo279 static WidgetInfo MenuIcon(const MenuIconParams& aParams) { 280 return WidgetInfo(Widget::eMenuIcon, aParams); 281 } MenuItemWidgetInfo282 static WidgetInfo MenuItem(const MenuItemParams& aParams) { 283 return WidgetInfo(Widget::eMenuItem, aParams); 284 } MenuSeparatorWidgetInfo285 static WidgetInfo MenuSeparator(const MenuItemParams& aParams) { 286 return WidgetInfo(Widget::eMenuSeparator, aParams); 287 } TooltipWidgetInfo288 static WidgetInfo Tooltip() { return WidgetInfo(Widget::eTooltip, false); } CheckboxWidgetInfo289 static WidgetInfo Checkbox(const CheckboxOrRadioParams& aParams) { 290 return WidgetInfo(Widget::eCheckbox, aParams); 291 } RadioWidgetInfo292 static WidgetInfo Radio(const CheckboxOrRadioParams& aParams) { 293 return WidgetInfo(Widget::eRadio, aParams); 294 } ButtonWidgetInfo295 static WidgetInfo Button(const ButtonParams& aParams) { 296 return WidgetInfo(Widget::eButton, aParams); 297 } DropdownWidgetInfo298 static WidgetInfo Dropdown(const DropdownParams& aParams) { 299 return WidgetInfo(Widget::eDropdown, aParams); 300 } FocusOutlineWidgetInfo301 static WidgetInfo FocusOutline() { return WidgetInfo(Widget::eFocusOutline, false); } SpinButtonsWidgetInfo302 static WidgetInfo SpinButtons(const SpinButtonParams& aParams) { 303 return WidgetInfo(Widget::eSpinButtons, aParams); 304 } SpinButtonUpWidgetInfo305 static WidgetInfo SpinButtonUp(const SpinButtonParams& aParams) { 306 return WidgetInfo(Widget::eSpinButtonUp, aParams); 307 } SpinButtonDownWidgetInfo308 static WidgetInfo SpinButtonDown(const SpinButtonParams& aParams) { 309 return WidgetInfo(Widget::eSpinButtonDown, aParams); 310 } SegmentWidgetInfo311 static WidgetInfo Segment(const SegmentParams& aParams) { 312 return WidgetInfo(Widget::eSegment, aParams); 313 } SeparatorWidgetInfo314 static WidgetInfo Separator() { return WidgetInfo(Widget::eSeparator, false); } UnifiedToolbarWidgetInfo315 static WidgetInfo UnifiedToolbar(const UnifiedToolbarParams& aParams) { 316 return WidgetInfo(Widget::eUnifiedToolbar, aParams); 317 } ToolbarWidgetInfo318 static WidgetInfo Toolbar(bool aParams) { return WidgetInfo(Widget::eToolbar, aParams); } NativeTitlebarWidgetInfo319 static WidgetInfo NativeTitlebar(const UnifiedToolbarParams& aParams) { 320 return WidgetInfo(Widget::eNativeTitlebar, aParams); 321 } StatusBarWidgetInfo322 static WidgetInfo StatusBar(bool aParams) { return WidgetInfo(Widget::eStatusBar, aParams); } GroupBoxWidgetInfo323 static WidgetInfo GroupBox() { return WidgetInfo(Widget::eGroupBox, false); } TextBoxWidgetInfo324 static WidgetInfo TextBox(const TextBoxParams& aParams) { 325 return WidgetInfo(Widget::eTextBox, aParams); 326 } SearchFieldWidgetInfo327 static WidgetInfo SearchField(const SearchFieldParams& aParams) { 328 return WidgetInfo(Widget::eSearchField, aParams); 329 } ProgressBarWidgetInfo330 static WidgetInfo ProgressBar(const ProgressParams& aParams) { 331 return WidgetInfo(Widget::eProgressBar, aParams); 332 } MeterWidgetInfo333 static WidgetInfo Meter(const MeterParams& aParams) { 334 return WidgetInfo(Widget::eMeter, aParams); 335 } TreeHeaderCellWidgetInfo336 static WidgetInfo TreeHeaderCell(const TreeHeaderCellParams& aParams) { 337 return WidgetInfo(Widget::eTreeHeaderCell, aParams); 338 } ScaleWidgetInfo339 static WidgetInfo Scale(const ScaleParams& aParams) { 340 return WidgetInfo(Widget::eScale, aParams); 341 } ScrollbarThumbWidgetInfo342 static WidgetInfo ScrollbarThumb(const ScrollbarParams& aParams) { 343 return WidgetInfo(Widget::eScrollbarThumb, aParams); 344 } ScrollbarTrackWidgetInfo345 static WidgetInfo ScrollbarTrack(const ScrollbarParams& aParams) { 346 return WidgetInfo(Widget::eScrollbarTrack, aParams); 347 } ScrollCornerWidgetInfo348 static WidgetInfo ScrollCorner(const ScrollbarParams& aParams) { 349 return WidgetInfo(Widget::eScrollCorner, aParams); 350 } MultilineTextFieldWidgetInfo351 static WidgetInfo MultilineTextField(bool aParams) { 352 return WidgetInfo(Widget::eMultilineTextField, aParams); 353 } ListBoxWidgetInfo354 static WidgetInfo ListBox() { return WidgetInfo(Widget::eListBox, false); } SourceListWidgetInfo355 static WidgetInfo SourceList(bool aParams) { return WidgetInfo(Widget::eSourceList, aParams); } ActiveSourceListSelectionWidgetInfo356 static WidgetInfo ActiveSourceListSelection(bool aParams) { 357 return WidgetInfo(Widget::eActiveSourceListSelection, aParams); 358 } InactiveSourceListSelectionWidgetInfo359 static WidgetInfo InactiveSourceListSelection(bool aParams) { 360 return WidgetInfo(Widget::eInactiveSourceListSelection, aParams); 361 } TabPanelWidgetInfo362 static WidgetInfo TabPanel(bool aParams) { return WidgetInfo(Widget::eTabPanel, aParams); } ResizerWidgetInfo363 static WidgetInfo Resizer(bool aParams) { return WidgetInfo(Widget::eResizer, aParams); } 364 365 template <typename T> ParamsWidgetInfo366 T Params() const { 367 MOZ_RELEASE_ASSERT(mVariant.is<T>()); 368 return mVariant.as<T>(); 369 } 370 WidgetWidgetInfo371 enum Widget Widget() const { return mWidget; } 372 373 private: 374 template <typename T> WidgetInfoWidgetInfo375 WidgetInfo(enum Widget aWidget, const T& aParams) : mVariant(aParams), mWidget(aWidget) {} 376 377 mozilla::Variant<mozilla::gfx::sRGBColor, MenuBackgroundParams, MenuIconParams, MenuItemParams, 378 CheckboxOrRadioParams, ButtonParams, DropdownParams, SpinButtonParams, 379 SegmentParams, UnifiedToolbarParams, TextBoxParams, SearchFieldParams, 380 ProgressParams, MeterParams, TreeHeaderCellParams, ScaleParams, 381 ScrollbarParams, bool> 382 mVariant; 383 384 enum Widget mWidget; 385 }; 386 387 nsNativeThemeCocoa(); 388 389 NS_DECL_ISUPPORTS_INHERITED 390 391 // The nsITheme interface. 392 NS_IMETHOD DrawWidgetBackground(gfxContext* aContext, nsIFrame* aFrame, 393 StyleAppearance aAppearance, const nsRect& aRect, 394 const nsRect& aDirtyRect) override; 395 bool CreateWebRenderCommandsForWidget(mozilla::wr::DisplayListBuilder& aBuilder, 396 mozilla::wr::IpcResourceUpdateQueue& aResources, 397 const mozilla::layers::StackingContextHelper& aSc, 398 mozilla::layers::RenderRootStateManager* aManager, 399 nsIFrame* aFrame, StyleAppearance aAppearance, 400 const nsRect& aRect) override; 401 [[nodiscard]] LayoutDeviceIntMargin GetWidgetBorder(nsDeviceContext* aContext, nsIFrame* aFrame, 402 StyleAppearance aAppearance) override; 403 404 bool GetWidgetPadding(nsDeviceContext* aContext, nsIFrame* aFrame, StyleAppearance aAppearance, 405 LayoutDeviceIntMargin* aResult) override; 406 407 virtual bool GetWidgetOverflow(nsDeviceContext* aContext, nsIFrame* aFrame, 408 StyleAppearance aAppearance, nsRect* aOverflowRect) override; 409 410 NS_IMETHOD GetMinimumWidgetSize(nsPresContext* aPresContext, nsIFrame* aFrame, 411 StyleAppearance aAppearance, 412 mozilla::LayoutDeviceIntSize* aResult, 413 bool* aIsOverridable) override; 414 NS_IMETHOD WidgetStateChanged(nsIFrame* aFrame, StyleAppearance aAppearance, nsAtom* aAttribute, 415 bool* aShouldRepaint, const nsAttrValue* aOldValue) override; 416 NS_IMETHOD ThemeChanged() override; 417 bool ThemeSupportsWidget(nsPresContext* aPresContext, nsIFrame* aFrame, 418 StyleAppearance aAppearance) override; 419 bool WidgetIsContainer(StyleAppearance aAppearance) override; 420 bool ThemeDrawsFocusForWidget(StyleAppearance aAppearance) override; 421 bool ThemeNeedsComboboxDropmarker() override; 422 virtual bool WidgetAppearanceDependsOnWindowFocus(StyleAppearance aAppearance) override; 423 virtual bool NeedToClearBackgroundBehindWidget(nsIFrame* aFrame, 424 StyleAppearance aAppearance) override; 425 virtual ThemeGeometryType ThemeGeometryTypeForWidget(nsIFrame* aFrame, 426 StyleAppearance aAppearance) override; 427 virtual Transparency GetWidgetTransparency(nsIFrame* aFrame, 428 StyleAppearance aAppearance) override; 429 mozilla::Maybe<WidgetInfo> ComputeWidgetInfo(nsIFrame* aFrame, StyleAppearance aAppearance, 430 const nsRect& aRect); 431 void DrawProgress(CGContextRef context, const HIRect& inBoxRect, const ProgressParams& aParams); 432 433 static void DrawNativeTitlebar(CGContextRef aContext, CGRect aTitlebarRect, 434 CGFloat aUnifiedHeight, BOOL aIsMain, BOOL aIsFlipped); 435 436 protected: 437 virtual ~nsNativeThemeCocoa(); 438 439 LayoutDeviceIntMargin DirectionAwareMargin(const LayoutDeviceIntMargin& aMargin, 440 nsIFrame* aFrame); 441 nsIFrame* SeparatorResponsibility(nsIFrame* aBefore, nsIFrame* aAfter); 442 bool IsWindowSheet(nsIFrame* aFrame); 443 ControlParams ComputeControlParams(nsIFrame* aFrame, mozilla::EventStates aEventState); 444 MenuBackgroundParams ComputeMenuBackgroundParams(nsIFrame* aFrame, 445 mozilla::EventStates aEventState); 446 MenuIconParams ComputeMenuIconParams(nsIFrame* aParams, mozilla::EventStates aEventState, 447 MenuIcon aIcon); 448 MenuItemParams ComputeMenuItemParams(nsIFrame* aFrame, mozilla::EventStates aEventState, 449 bool aIsChecked); 450 SegmentParams ComputeSegmentParams(nsIFrame* aFrame, mozilla::EventStates aEventState, 451 SegmentType aSegmentType); 452 SearchFieldParams ComputeSearchFieldParams(nsIFrame* aFrame, mozilla::EventStates aEventState); 453 ProgressParams ComputeProgressParams(nsIFrame* aFrame, mozilla::EventStates aEventState, 454 bool aIsHorizontal); 455 MeterParams ComputeMeterParams(nsIFrame* aFrame); 456 TreeHeaderCellParams ComputeTreeHeaderCellParams(nsIFrame* aFrame, 457 mozilla::EventStates aEventState); 458 ScaleParams ComputeXULScaleParams(nsIFrame* aFrame, mozilla::EventStates aEventState, 459 bool aIsHorizontal); 460 mozilla::Maybe<ScaleParams> ComputeHTMLScaleParams(nsIFrame* aFrame, 461 mozilla::EventStates aEventState); 462 ScrollbarParams ComputeScrollbarParams(nsIFrame* aFrame, bool aIsHorizontal); 463 464 // HITheme drawing routines 465 void DrawTextBox(CGContextRef context, const HIRect& inBoxRect, TextBoxParams aParams); 466 void DrawMeter(CGContextRef context, const HIRect& inBoxRect, const MeterParams& aParams); 467 void DrawSegment(CGContextRef cgContext, const HIRect& inBoxRect, const SegmentParams& aParams); 468 void DrawSegmentBackground(CGContextRef cgContext, const HIRect& inBoxRect, 469 const SegmentParams& aParams); 470 void DrawTabPanel(CGContextRef context, const HIRect& inBoxRect, bool aIsInsideActiveWindow); 471 void DrawScale(CGContextRef context, const HIRect& inBoxRect, const ScaleParams& aParams); 472 void DrawCheckboxOrRadio(CGContextRef cgContext, bool inCheckbox, const HIRect& inBoxRect, 473 const CheckboxOrRadioParams& aParams); 474 void DrawSearchField(CGContextRef cgContext, const HIRect& inBoxRect, 475 const SearchFieldParams& aParams); 476 void DrawRoundedBezelPushButton(CGContextRef cgContext, const HIRect& inBoxRect, 477 ControlParams aControlParams); 478 void DrawSquareBezelPushButton(CGContextRef cgContext, const HIRect& inBoxRect, 479 ControlParams aControlParams); 480 void DrawHelpButton(CGContextRef cgContext, const HIRect& inBoxRect, 481 ControlParams aControlParams); 482 void DrawDisclosureButton(CGContextRef cgContext, const HIRect& inBoxRect, 483 ControlParams aControlParams, NSCellStateValue aState); 484 void DrawMenuBackground(CGContextRef cgContext, const CGRect& inBoxRect, 485 const MenuBackgroundParams& aParams); 486 NSString* GetMenuIconName(const MenuIconParams& aParams); 487 NSSize GetMenuIconSize(MenuIcon aIcon); 488 void DrawMenuIcon(CGContextRef cgContext, const CGRect& aRect, const MenuIconParams& aParams); 489 void DrawMenuItem(CGContextRef cgContext, const CGRect& inBoxRect, const MenuItemParams& aParams); 490 void DrawMenuSeparator(CGContextRef cgContext, const CGRect& inBoxRect, 491 const MenuItemParams& aParams); 492 void DrawHIThemeButton(CGContextRef cgContext, const HIRect& aRect, ThemeButtonKind aKind, 493 ThemeButtonValue aValue, ThemeDrawState aState, 494 ThemeButtonAdornment aAdornment, const ControlParams& aParams); 495 void DrawButton(CGContextRef context, const HIRect& inBoxRect, const ButtonParams& aParams); 496 void DrawTreeHeaderCell(CGContextRef context, const HIRect& inBoxRect, 497 const TreeHeaderCellParams& aParams); 498 void DrawFocusOutline(CGContextRef cgContext, const HIRect& inBoxRect); 499 void DrawDropdown(CGContextRef context, const HIRect& inBoxRect, const DropdownParams& aParams); 500 HIThemeButtonDrawInfo SpinButtonDrawInfo(ThemeButtonKind aKind, const SpinButtonParams& aParams); 501 void DrawSpinButtons(CGContextRef context, const HIRect& inBoxRect, 502 const SpinButtonParams& aParams); 503 void DrawSpinButton(CGContextRef context, const HIRect& inBoxRect, SpinButton aDrawnButton, 504 const SpinButtonParams& aParams); 505 void DrawToolbar(CGContextRef cgContext, const CGRect& inBoxRect, bool aIsMain); 506 void DrawUnifiedToolbar(CGContextRef cgContext, const HIRect& inBoxRect, 507 const UnifiedToolbarParams& aParams); 508 void DrawNativeTitlebar(CGContextRef aContext, CGRect aTitlebarRect, 509 const UnifiedToolbarParams& aParams); 510 void DrawStatusBar(CGContextRef cgContext, const HIRect& inBoxRect, bool aIsMain); 511 void DrawResizer(CGContextRef cgContext, const HIRect& aRect, bool aIsRTL); 512 void DrawScrollbarThumb(CGContextRef cgContext, const CGRect& inBoxRect, ScrollbarParams aParams); 513 void DrawScrollbarTrack(CGContextRef cgContext, const CGRect& inBoxRect, ScrollbarParams aParams); 514 void DrawScrollCorner(CGContextRef cgContext, const CGRect& inBoxRect, ScrollbarParams aParams); 515 void DrawMultilineTextField(CGContextRef cgContext, const CGRect& inBoxRect, bool aIsFocused); 516 void DrawSourceList(CGContextRef cgContext, const CGRect& inBoxRect, bool aIsActive); 517 518 // Scrollbars 519 bool IsParentScrollbarRolledOver(nsIFrame* aFrame); 520 521 void RenderWidget(const WidgetInfo& aWidgetInfo, mozilla::gfx::DrawTarget& aDrawTarget, 522 const mozilla::gfx::Rect& aWidgetRect, const mozilla::gfx::Rect& aDirtyRect, 523 float aScale); 524 525 private: 526 NSButtonCell* mDisclosureButtonCell; 527 NSButtonCell* mHelpButtonCell; 528 NSButtonCell* mPushButtonCell; 529 NSButtonCell* mRadioButtonCell; 530 NSButtonCell* mCheckboxCell; 531 NSSearchFieldCell* mSearchFieldCell; 532 NSSearchFieldCell* mToolbarSearchFieldCell; 533 NSPopUpButtonCell* mDropdownCell; 534 NSComboBoxCell* mComboBoxCell; 535 NSProgressBarCell* mProgressBarCell; 536 NSLevelIndicatorCell* mMeterBarCell; 537 CellDrawView* mCellDrawView; 538 }; 539 540 #endif // nsNativeThemeCocoa_h_ 541