Bug 1464538 [wpt PR 11173] - [testdriver] Enable manual interaction, a=testonly
[gecko.git] / widget / uikit / nsLookAndFeel.mm
blobe33f432beca209e253cc286364748ea16f1e532f
1 /* -*- Mode: C++; tab-width: 4; 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/. */
6 #import <UIKit/UIColor.h>
7 #import <UIKit/UIInterface.h>
9 #include "nsLookAndFeel.h"
11 #include "mozilla/FontPropertyTypes.h"
12 #include "nsStyleConsts.h"
13 #include "gfxFont.h"
14 #include "gfxFontConstants.h"
16 nsLookAndFeel::nsLookAndFeel() : nsXPLookAndFeel(), mInitialized(false) {}
18 nsLookAndFeel::~nsLookAndFeel() {}
20 static nscolor GetColorFromUIColor(UIColor *aColor) {
21   CGColorRef cgColor = [aColor CGColor];
22   CGColorSpaceModel model = CGColorSpaceGetModel(CGColorGetColorSpace(cgColor));
23   const CGFloat *components = CGColorGetComponents(cgColor);
24   if (model == kCGColorSpaceModelRGB) {
25     return NS_RGB((unsigned int)(components[0] * 255.0), (unsigned int)(components[1] * 255.0),
26                   (unsigned int)(components[2] * 255.0));
27   } else if (model == kCGColorSpaceModelMonochrome) {
28     unsigned int val = (unsigned int)(components[0] * 255.0);
29     return NS_RGBA(val, val, val, (unsigned int)(components[1] * 255.0));
30   }
31   MOZ_ASSERT_UNREACHABLE("Unhandled color space!");
32   return 0;
35 void nsLookAndFeel::NativeInit() { EnsureInit(); }
37 void nsLookAndFeel::RefreshImpl() {
38   nsXPLookAndFeel::RefreshImpl();
40   mInitialized = false;
43 nsresult nsLookAndFeel::NativeGetColor(const ColorID aID, nscolor &aResult) {
44   EnsureInit();
46   nsresult res = NS_OK;
48   switch (aID) {
49     case eColorID_WindowBackground:
50       aResult = NS_RGB(0xff, 0xff, 0xff);
51       break;
52     case eColorID_WindowForeground:
53       aResult = NS_RGB(0x00, 0x00, 0x00);
54       break;
55     case eColorID_WidgetBackground:
56       aResult = NS_RGB(0xdd, 0xdd, 0xdd);
57       break;
58     case eColorID_WidgetForeground:
59       aResult = NS_RGB(0x00, 0x00, 0x00);
60       break;
61     case eColorID_WidgetSelectBackground:
62       aResult = NS_RGB(0x80, 0x80, 0x80);
63       break;
64     case eColorID_WidgetSelectForeground:
65       aResult = NS_RGB(0x00, 0x00, 0x80);
66       break;
67     case eColorID_Widget3DHighlight:
68       aResult = NS_RGB(0xa0, 0xa0, 0xa0);
69       break;
70     case eColorID_Widget3DShadow:
71       aResult = NS_RGB(0x40, 0x40, 0x40);
72       break;
73     case eColorID_TextBackground:
74       aResult = NS_RGB(0xff, 0xff, 0xff);
75       break;
76     case eColorID_TextForeground:
77       aResult = NS_RGB(0x00, 0x00, 0x00);
78       break;
79     case eColorID_TextSelectBackground:
80     case eColorID_highlight:  // CSS2 color
81       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
82       break;
83     case eColorID__moz_menuhover:
84       aResult = NS_RGB(0xee, 0xee, 0xee);
85       break;
86     case eColorID_TextSelectForeground:
87     case eColorID_highlighttext:  // CSS2 color
88     case eColorID__moz_menuhovertext:
89       aResult = mColorTextSelectForeground;
90       break;
91     case eColorID_IMESelectedRawTextBackground:
92     case eColorID_IMESelectedConvertedTextBackground:
93     case eColorID_IMERawInputBackground:
94     case eColorID_IMEConvertedTextBackground:
95       aResult = NS_TRANSPARENT;
96       break;
97     case eColorID_IMESelectedRawTextForeground:
98     case eColorID_IMESelectedConvertedTextForeground:
99     case eColorID_IMERawInputForeground:
100     case eColorID_IMEConvertedTextForeground:
101       aResult = NS_SAME_AS_FOREGROUND_COLOR;
102       break;
103     case eColorID_IMERawInputUnderline:
104     case eColorID_IMEConvertedTextUnderline:
105       aResult = NS_40PERCENT_FOREGROUND_COLOR;
106       break;
107     case eColorID_IMESelectedRawTextUnderline:
108     case eColorID_IMESelectedConvertedTextUnderline:
109       aResult = NS_SAME_AS_FOREGROUND_COLOR;
110       break;
111     case eColorID_SpellCheckerUnderline:
112       aResult = NS_RGB(0xff, 0, 0);
113       break;
115     //
116     // css2 system colors http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
117     //
118     case eColorID_buttontext:
119     case eColorID__moz_buttonhovertext:
120     case eColorID_captiontext:
121     case eColorID_menutext:
122     case eColorID_infotext:
123     case eColorID__moz_menubartext:
124     case eColorID_windowtext:
125       aResult = mColorDarkText;
126       break;
127     case eColorID_activecaption:
128       aResult = NS_RGB(0xff, 0xff, 0xff);
129       break;
130     case eColorID_activeborder:
131       aResult = NS_RGB(0x00, 0x00, 0x00);
132       break;
133     case eColorID_appworkspace:
134       aResult = NS_RGB(0xFF, 0xFF, 0xFF);
135       break;
136     case eColorID_background:
137       aResult = NS_RGB(0x63, 0x63, 0xCE);
138       break;
139     case eColorID_buttonface:
140     case eColorID__moz_buttonhoverface:
141       aResult = NS_RGB(0xF0, 0xF0, 0xF0);
142       break;
143     case eColorID_buttonhighlight:
144       aResult = NS_RGB(0xFF, 0xFF, 0xFF);
145       break;
146     case eColorID_buttonshadow:
147       aResult = NS_RGB(0xDC, 0xDC, 0xDC);
148       break;
149     case eColorID_graytext:
150       aResult = NS_RGB(0x44, 0x44, 0x44);
151       break;
152     case eColorID_inactiveborder:
153       aResult = NS_RGB(0xff, 0xff, 0xff);
154       break;
155     case eColorID_inactivecaption:
156       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
157       break;
158     case eColorID_inactivecaptiontext:
159       aResult = NS_RGB(0x45, 0x45, 0x45);
160       break;
161     case eColorID_scrollbar:
162       aResult = NS_RGB(0, 0, 0);  // XXX
163       break;
164     case eColorID_threeddarkshadow:
165       aResult = NS_RGB(0xDC, 0xDC, 0xDC);
166       break;
167     case eColorID_threedshadow:
168       aResult = NS_RGB(0xE0, 0xE0, 0xE0);
169       break;
170     case eColorID_threedface:
171       aResult = NS_RGB(0xF0, 0xF0, 0xF0);
172       break;
173     case eColorID_threedhighlight:
174       aResult = NS_RGB(0xff, 0xff, 0xff);
175       break;
176     case eColorID_threedlightshadow:
177       aResult = NS_RGB(0xDA, 0xDA, 0xDA);
178       break;
179     case eColorID_menu:
180       aResult = NS_RGB(0xff, 0xff, 0xff);
181       break;
182     case eColorID_infobackground:
183       aResult = NS_RGB(0xFF, 0xFF, 0xC7);
184       break;
185     case eColorID_windowframe:
186       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
187       break;
188     case eColorID_window:
189     case eColorID__moz_field:
190     case eColorID__moz_combobox:
191       aResult = NS_RGB(0xff, 0xff, 0xff);
192       break;
193     case eColorID__moz_fieldtext:
194     case eColorID__moz_comboboxtext:
195       aResult = mColorDarkText;
196       break;
197     case eColorID__moz_dialog:
198       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
199       break;
200     case eColorID__moz_dialogtext:
201     case eColorID__moz_cellhighlighttext:
202     case eColorID__moz_html_cellhighlighttext:
203       aResult = mColorDarkText;
204       break;
205     case eColorID__moz_dragtargetzone:
206     case eColorID__moz_mac_chrome_active:
207     case eColorID__moz_mac_chrome_inactive:
208       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
209       break;
210     case eColorID__moz_mac_focusring:
211       aResult = NS_RGB(0x3F, 0x98, 0xDD);
212       break;
213     case eColorID__moz_mac_menushadow:
214       aResult = NS_RGB(0xA3, 0xA3, 0xA3);
215       break;
216     case eColorID__moz_mac_menutextdisable:
217       aResult = NS_RGB(0x88, 0x88, 0x88);
218       break;
219     case eColorID__moz_mac_menutextselect:
220       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
221       break;
222     case eColorID__moz_mac_disabledtoolbartext:
223       aResult = NS_RGB(0x3F, 0x3F, 0x3F);
224       break;
225     case eColorID__moz_mac_menuselect:
226       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
227       break;
228     case eColorID__moz_buttondefault:
229       aResult = NS_RGB(0xDC, 0xDC, 0xDC);
230       break;
231     case eColorID__moz_cellhighlight:
232     case eColorID__moz_html_cellhighlight:
233     case eColorID__moz_mac_secondaryhighlight:
234       // For inactive list selection
235       aResult = NS_RGB(0xaa, 0xaa, 0xaa);
236       break;
237     case eColorID__moz_eventreerow:
238       // Background color of even list rows.
239       aResult = NS_RGB(0xff, 0xff, 0xff);
240       break;
241     case eColorID__moz_oddtreerow:
242       // Background color of odd list rows.
243       aResult = NS_TRANSPARENT;
244       break;
245     case eColorID__moz_nativehyperlinktext:
246       // There appears to be no available system defined color. HARDCODING to the appropriate color.
247       aResult = NS_RGB(0x14, 0x4F, 0xAE);
248       break;
249     default:
250       NS_WARNING("Someone asked nsILookAndFeel for a color I don't know about");
251       aResult = NS_RGB(0xff, 0xff, 0xff);
252       res = NS_ERROR_FAILURE;
253       break;
254   }
256   return res;
259 NS_IMETHODIMP
260 nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult) {
261   nsresult res = nsXPLookAndFeel::GetIntImpl(aID, aResult);
262   if (NS_SUCCEEDED(res)) return res;
263   res = NS_OK;
265   switch (aID) {
266     case eIntID_CaretBlinkTime:
267       aResult = 567;
268       break;
269     case eIntID_CaretWidth:
270       aResult = 1;
271       break;
272     case eIntID_ShowCaretDuringSelection:
273       aResult = 0;
274       break;
275     case eIntID_SelectTextfieldsOnKeyFocus:
276       // Select textfield content when focused by kbd
277       // used by nsEventStateManager::sTextfieldSelectModel
278       aResult = 1;
279       break;
280     case eIntID_SubmenuDelay:
281       aResult = 200;
282       break;
283     case eIntID_MenusCanOverlapOSBar:
284       // xul popups are not allowed to overlap the menubar.
285       aResult = 0;
286       break;
287     case eIntID_SkipNavigatingDisabledMenuItem:
288       aResult = 1;
289       break;
290     case eIntID_DragThresholdX:
291     case eIntID_DragThresholdY:
292       aResult = 4;
293       break;
294     case eIntID_ScrollArrowStyle:
295       aResult = eScrollArrow_None;
296       break;
297     case eIntID_ScrollSliderStyle:
298       aResult = eScrollThumbStyle_Proportional;
299       break;
300     case eIntID_TreeOpenDelay:
301       aResult = 1000;
302       break;
303     case eIntID_TreeCloseDelay:
304       aResult = 1000;
305       break;
306     case eIntID_TreeLazyScrollDelay:
307       aResult = 150;
308       break;
309     case eIntID_TreeScrollDelay:
310       aResult = 100;
311       break;
312     case eIntID_TreeScrollLinesMax:
313       aResult = 3;
314       break;
315     case eIntID_DWMCompositor:
316     case eIntID_WindowsClassic:
317     case eIntID_WindowsDefaultTheme:
318     case eIntID_TouchEnabled:
319       aResult = 0;
320       res = NS_ERROR_NOT_IMPLEMENTED;
321       break;
322     case eIntID_MacGraphiteTheme:
323       aResult = 0;
324       break;
325     case eIntID_TabFocusModel:
326       aResult = 1;  // default to just textboxes
327       break;
328     case eIntID_ScrollToClick:
329       aResult = 0;
330       break;
331     case eIntID_ChosenMenuItemsShouldBlink:
332       aResult = 1;
333       break;
334     case eIntID_IMERawInputUnderlineStyle:
335     case eIntID_IMEConvertedTextUnderlineStyle:
336     case eIntID_IMESelectedRawTextUnderlineStyle:
337     case eIntID_IMESelectedConvertedTextUnderline:
338       aResult = NS_STYLE_TEXT_DECORATION_STYLE_SOLID;
339       break;
340     case eIntID_SpellCheckerUnderlineStyle:
341       aResult = NS_STYLE_TEXT_DECORATION_STYLE_DOTTED;
342       break;
343     case eIntID_ContextMenuOffsetVertical:
344     case eIntID_ContextMenuOffsetHorizontal:
345       aResult = 2;
346       break;
347     default:
348       aResult = 0;
349       res = NS_ERROR_FAILURE;
350   }
351   return res;
354 NS_IMETHODIMP
355 nsLookAndFeel::GetFloatImpl(FloatID aID, float &aResult) {
356   nsresult res = nsXPLookAndFeel::GetFloatImpl(aID, aResult);
357   if (NS_SUCCEEDED(res)) return res;
358   res = NS_OK;
360   switch (aID) {
361     case eFloatID_IMEUnderlineRelativeSize:
362       aResult = 2.0f;
363       break;
364     case eFloatID_SpellCheckerUnderlineRelativeSize:
365       aResult = 2.0f;
366       break;
367     default:
368       aResult = -1.0;
369       res = NS_ERROR_FAILURE;
370   }
372   return res;
375 bool nsLookAndFeel::GetFontImpl(FontID aID, nsString &aFontName, gfxFontStyle &aFontStyle) {
376   // hack for now
377   if (aID == eFont_Window || aID == eFont_Document) {
378     aFontStyle.style = FontSlantStyle::Normal();
379     aFontStyle.weight = FontWeight::Normal();
380     aFontStyle.stretch = FontStretch::Normal();
381     aFontStyle.size = 14;
382     aFontStyle.systemFont = true;
384     aFontName.AssignLiteral("sans-serif");
385     return true;
386   }
388   // TODO: implement more here?
389   return false;
392 void nsLookAndFeel::EnsureInit() {
393   if (mInitialized) {
394     return;
395   }
396   mInitialized = true;
398   nscolor color;
399   GetColor(eColorID_TextSelectBackground, color);
400   if (color == 0x000000) {
401     mColorTextSelectForeground = NS_RGB(0xff, 0xff, 0xff);
402   } else {
403     mColorTextSelectForeground = NS_DONT_CHANGE_COLOR;
404   }
406   mColorDarkText = GetColorFromUIColor([UIColor darkTextColor]);