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