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"
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));
31 MOZ_ASSERT_UNREACHABLE("Unhandled color space!");
35 void nsLookAndFeel::NativeInit() { EnsureInit(); }
37 void nsLookAndFeel::RefreshImpl() {
38 nsXPLookAndFeel::RefreshImpl();
43 nsresult nsLookAndFeel::NativeGetColor(const ColorID aID, nscolor &aResult) {
49 case eColorID_WindowBackground:
50 aResult = NS_RGB(0xff, 0xff, 0xff);
52 case eColorID_WindowForeground:
53 aResult = NS_RGB(0x00, 0x00, 0x00);
55 case eColorID_WidgetBackground:
56 aResult = NS_RGB(0xdd, 0xdd, 0xdd);
58 case eColorID_WidgetForeground:
59 aResult = NS_RGB(0x00, 0x00, 0x00);
61 case eColorID_WidgetSelectBackground:
62 aResult = NS_RGB(0x80, 0x80, 0x80);
64 case eColorID_WidgetSelectForeground:
65 aResult = NS_RGB(0x00, 0x00, 0x80);
67 case eColorID_Widget3DHighlight:
68 aResult = NS_RGB(0xa0, 0xa0, 0xa0);
70 case eColorID_Widget3DShadow:
71 aResult = NS_RGB(0x40, 0x40, 0x40);
73 case eColorID_TextBackground:
74 aResult = NS_RGB(0xff, 0xff, 0xff);
76 case eColorID_TextForeground:
77 aResult = NS_RGB(0x00, 0x00, 0x00);
79 case eColorID_TextSelectBackground:
80 case eColorID_highlight: // CSS2 color
81 aResult = NS_RGB(0xaa, 0xaa, 0xaa);
83 case eColorID__moz_menuhover:
84 aResult = NS_RGB(0xee, 0xee, 0xee);
86 case eColorID_TextSelectForeground:
87 case eColorID_highlighttext: // CSS2 color
88 case eColorID__moz_menuhovertext:
89 aResult = mColorTextSelectForeground;
91 case eColorID_IMESelectedRawTextBackground:
92 case eColorID_IMESelectedConvertedTextBackground:
93 case eColorID_IMERawInputBackground:
94 case eColorID_IMEConvertedTextBackground:
95 aResult = NS_TRANSPARENT;
97 case eColorID_IMESelectedRawTextForeground:
98 case eColorID_IMESelectedConvertedTextForeground:
99 case eColorID_IMERawInputForeground:
100 case eColorID_IMEConvertedTextForeground:
101 aResult = NS_SAME_AS_FOREGROUND_COLOR;
103 case eColorID_IMERawInputUnderline:
104 case eColorID_IMEConvertedTextUnderline:
105 aResult = NS_40PERCENT_FOREGROUND_COLOR;
107 case eColorID_IMESelectedRawTextUnderline:
108 case eColorID_IMESelectedConvertedTextUnderline:
109 aResult = NS_SAME_AS_FOREGROUND_COLOR;
111 case eColorID_SpellCheckerUnderline:
112 aResult = NS_RGB(0xff, 0, 0);
116 // css2 system colors http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
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;
127 case eColorID_activecaption:
128 aResult = NS_RGB(0xff, 0xff, 0xff);
130 case eColorID_activeborder:
131 aResult = NS_RGB(0x00, 0x00, 0x00);
133 case eColorID_appworkspace:
134 aResult = NS_RGB(0xFF, 0xFF, 0xFF);
136 case eColorID_background:
137 aResult = NS_RGB(0x63, 0x63, 0xCE);
139 case eColorID_buttonface:
140 case eColorID__moz_buttonhoverface:
141 aResult = NS_RGB(0xF0, 0xF0, 0xF0);
143 case eColorID_buttonhighlight:
144 aResult = NS_RGB(0xFF, 0xFF, 0xFF);
146 case eColorID_buttonshadow:
147 aResult = NS_RGB(0xDC, 0xDC, 0xDC);
149 case eColorID_graytext:
150 aResult = NS_RGB(0x44, 0x44, 0x44);
152 case eColorID_inactiveborder:
153 aResult = NS_RGB(0xff, 0xff, 0xff);
155 case eColorID_inactivecaption:
156 aResult = NS_RGB(0xaa, 0xaa, 0xaa);
158 case eColorID_inactivecaptiontext:
159 aResult = NS_RGB(0x45, 0x45, 0x45);
161 case eColorID_scrollbar:
162 aResult = NS_RGB(0, 0, 0); // XXX
164 case eColorID_threeddarkshadow:
165 aResult = NS_RGB(0xDC, 0xDC, 0xDC);
167 case eColorID_threedshadow:
168 aResult = NS_RGB(0xE0, 0xE0, 0xE0);
170 case eColorID_threedface:
171 aResult = NS_RGB(0xF0, 0xF0, 0xF0);
173 case eColorID_threedhighlight:
174 aResult = NS_RGB(0xff, 0xff, 0xff);
176 case eColorID_threedlightshadow:
177 aResult = NS_RGB(0xDA, 0xDA, 0xDA);
180 aResult = NS_RGB(0xff, 0xff, 0xff);
182 case eColorID_infobackground:
183 aResult = NS_RGB(0xFF, 0xFF, 0xC7);
185 case eColorID_windowframe:
186 aResult = NS_RGB(0xaa, 0xaa, 0xaa);
188 case eColorID_window:
189 case eColorID__moz_field:
190 case eColorID__moz_combobox:
191 aResult = NS_RGB(0xff, 0xff, 0xff);
193 case eColorID__moz_fieldtext:
194 case eColorID__moz_comboboxtext:
195 aResult = mColorDarkText;
197 case eColorID__moz_dialog:
198 aResult = NS_RGB(0xaa, 0xaa, 0xaa);
200 case eColorID__moz_dialogtext:
201 case eColorID__moz_cellhighlighttext:
202 case eColorID__moz_html_cellhighlighttext:
203 aResult = mColorDarkText;
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);
210 case eColorID__moz_mac_focusring:
211 aResult = NS_RGB(0x3F, 0x98, 0xDD);
213 case eColorID__moz_mac_menushadow:
214 aResult = NS_RGB(0xA3, 0xA3, 0xA3);
216 case eColorID__moz_mac_menutextdisable:
217 aResult = NS_RGB(0x88, 0x88, 0x88);
219 case eColorID__moz_mac_menutextselect:
220 aResult = NS_RGB(0xaa, 0xaa, 0xaa);
222 case eColorID__moz_mac_disabledtoolbartext:
223 aResult = NS_RGB(0x3F, 0x3F, 0x3F);
225 case eColorID__moz_mac_menuselect:
226 aResult = NS_RGB(0xaa, 0xaa, 0xaa);
228 case eColorID__moz_buttondefault:
229 aResult = NS_RGB(0xDC, 0xDC, 0xDC);
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);
237 case eColorID__moz_eventreerow:
238 // Background color of even list rows.
239 aResult = NS_RGB(0xff, 0xff, 0xff);
241 case eColorID__moz_oddtreerow:
242 // Background color of odd list rows.
243 aResult = NS_TRANSPARENT;
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);
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;
260 nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult) {
261 nsresult res = nsXPLookAndFeel::GetIntImpl(aID, aResult);
262 if (NS_SUCCEEDED(res)) return res;
266 case eIntID_CaretBlinkTime:
269 case eIntID_CaretWidth:
272 case eIntID_ShowCaretDuringSelection:
275 case eIntID_SelectTextfieldsOnKeyFocus:
276 // Select textfield content when focused by kbd
277 // used by nsEventStateManager::sTextfieldSelectModel
280 case eIntID_SubmenuDelay:
283 case eIntID_MenusCanOverlapOSBar:
284 // xul popups are not allowed to overlap the menubar.
287 case eIntID_SkipNavigatingDisabledMenuItem:
290 case eIntID_DragThresholdX:
291 case eIntID_DragThresholdY:
294 case eIntID_ScrollArrowStyle:
295 aResult = eScrollArrow_None;
297 case eIntID_ScrollSliderStyle:
298 aResult = eScrollThumbStyle_Proportional;
300 case eIntID_TreeOpenDelay:
303 case eIntID_TreeCloseDelay:
306 case eIntID_TreeLazyScrollDelay:
309 case eIntID_TreeScrollDelay:
312 case eIntID_TreeScrollLinesMax:
315 case eIntID_DWMCompositor:
316 case eIntID_WindowsClassic:
317 case eIntID_WindowsDefaultTheme:
318 case eIntID_TouchEnabled:
320 res = NS_ERROR_NOT_IMPLEMENTED;
322 case eIntID_MacGraphiteTheme:
325 case eIntID_TabFocusModel:
326 aResult = 1; // default to just textboxes
328 case eIntID_ScrollToClick:
331 case eIntID_ChosenMenuItemsShouldBlink:
334 case eIntID_IMERawInputUnderlineStyle:
335 case eIntID_IMEConvertedTextUnderlineStyle:
336 case eIntID_IMESelectedRawTextUnderlineStyle:
337 case eIntID_IMESelectedConvertedTextUnderline:
338 aResult = NS_STYLE_TEXT_DECORATION_STYLE_SOLID;
340 case eIntID_SpellCheckerUnderlineStyle:
341 aResult = NS_STYLE_TEXT_DECORATION_STYLE_DOTTED;
343 case eIntID_ContextMenuOffsetVertical:
344 case eIntID_ContextMenuOffsetHorizontal:
349 res = NS_ERROR_FAILURE;
355 nsLookAndFeel::GetFloatImpl(FloatID aID, float &aResult) {
356 nsresult res = nsXPLookAndFeel::GetFloatImpl(aID, aResult);
357 if (NS_SUCCEEDED(res)) return res;
361 case eFloatID_IMEUnderlineRelativeSize:
364 case eFloatID_SpellCheckerUnderlineRelativeSize:
369 res = NS_ERROR_FAILURE;
375 bool nsLookAndFeel::GetFontImpl(FontID aID, nsString &aFontName, gfxFontStyle &aFontStyle) {
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");
388 // TODO: implement more here?
392 void nsLookAndFeel::EnsureInit() {
399 GetColor(eColorID_TextSelectBackground, color);
400 if (color == 0x000000) {
401 mColorTextSelectForeground = NS_RGB(0xff, 0xff, 0xff);
403 mColorTextSelectForeground = NS_DONT_CHANGE_COLOR;
406 mColorDarkText = GetColorFromUIColor([UIColor darkTextColor]);