1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/osx/carbon/settings.cpp
3 // Purpose:     wxSettings
4 // Author:      Stefan Csomor
5 // Modified by:
6 // Created:     1998-01-01
7 // Copyright:   (c) Stefan Csomor
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #include "wx/wxprec.h"
12 
13 #include "wx/settings.h"
14 
15 #ifndef WX_PRECOMP
16     #include "wx/utils.h"
17     #include "wx/gdicmn.h"
18 #endif
19 
20 #include "wx/osx/private.h"
21 #include "wx/fontenum.h"
22 
23 // ----------------------------------------------------------------------------
24 // wxSystemSettingsNative
25 // ----------------------------------------------------------------------------
26 
27 // ----------------------------------------------------------------------------
28 // colours
29 // ----------------------------------------------------------------------------
30 
GetColour(wxSystemColour index)31 wxColour wxSystemSettingsNative::GetColour(wxSystemColour index)
32 {
33     wxColour resultColor;
34 #if wxOSX_USE_COCOA_OR_CARBON
35     ThemeBrush colorBrushID;
36 #endif
37 
38     switch ( index )
39     {
40         case wxSYS_COLOUR_WINDOW:
41 #if wxOSX_USE_COCOA_OR_CARBON
42             resultColor = wxColour(wxMacCreateCGColorFromHITheme( 15 /* kThemeBrushDocumentWindowBackground */ )) ;
43 #else
44             resultColor = *wxWHITE;
45 #endif
46             break ;
47         case wxSYS_COLOUR_SCROLLBAR :
48         case wxSYS_COLOUR_BACKGROUND:
49         case wxSYS_COLOUR_ACTIVECAPTION:
50         case wxSYS_COLOUR_INACTIVECAPTION:
51         case wxSYS_COLOUR_MENU:
52         case wxSYS_COLOUR_WINDOWFRAME:
53         case wxSYS_COLOUR_ACTIVEBORDER:
54         case wxSYS_COLOUR_INACTIVEBORDER:
55         case wxSYS_COLOUR_BTNFACE:
56         case wxSYS_COLOUR_MENUBAR:
57 #if wxOSX_USE_COCOA_OR_CARBON
58             resultColor = wxColour(wxMacCreateCGColorFromHITheme( 3 /* kThemeBrushDialogBackgroundActive */));
59 #else
60             resultColor = wxColour( 0xBE, 0xBE, 0xBE ) ;
61 #endif
62             break ;
63 
64         case wxSYS_COLOUR_LISTBOX :
65             resultColor = *wxWHITE ;
66             break ;
67 
68         case wxSYS_COLOUR_BTNSHADOW:
69             resultColor = wxColour( 0xBE, 0xBE, 0xBE );
70             break ;
71 
72         case wxSYS_COLOUR_BTNTEXT:
73         case wxSYS_COLOUR_MENUTEXT:
74         case wxSYS_COLOUR_WINDOWTEXT:
75         case wxSYS_COLOUR_CAPTIONTEXT:
76         case wxSYS_COLOUR_INFOTEXT:
77         case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
78         case wxSYS_COLOUR_LISTBOXTEXT:
79             resultColor = *wxBLACK;
80             break ;
81 
82         case wxSYS_COLOUR_HIGHLIGHT:
83             {
84 #if wxOSX_USE_COCOA_OR_CARBON
85 #if 0
86             // NB: enable this case as desired
87                 colorBrushID = kThemeBrushAlternatePrimaryHighlightColor;
88 #else
89                 colorBrushID = -3 /* kThemeBrushPrimaryHighlightColor */;
90 #endif
91                 resultColor = wxColour( wxMacCreateCGColorFromHITheme(colorBrushID) );
92 #else
93                 resultColor = wxColor( 0xCC, 0xCC, 0xFF );
94 #endif
95             }
96             break ;
97 
98         case wxSYS_COLOUR_BTNHIGHLIGHT:
99         case wxSYS_COLOUR_GRAYTEXT:
100             resultColor = wxColor( 0xCC, 0xCC, 0xCC );
101             break ;
102 
103         case wxSYS_COLOUR_3DDKSHADOW:
104             resultColor = wxColor( 0x44, 0x44, 0x44 );
105             break ;
106 
107         case wxSYS_COLOUR_3DLIGHT:
108             resultColor = wxColor( 0xCC, 0xCC, 0xCC );
109             break ;
110 
111         case wxSYS_COLOUR_HIGHLIGHTTEXT :
112         case wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT :
113 #if wxOSX_USE_COCOA_OR_CARBON
114             {
115                 wxColour highlightcolor( wxMacCreateCGColorFromHITheme(-3 /* kThemeBrushPrimaryHighlightColor */) );
116                 if ((highlightcolor.Red() + highlightcolor.Green()  + highlightcolor.Blue() ) == 0)
117                     resultColor = *wxWHITE ;
118                 else
119                     resultColor = *wxBLACK ;
120             }
121 #else
122             resultColor = *wxWHITE ;
123 #endif
124             break ;
125 
126         case wxSYS_COLOUR_INFOBK :
127             // we don't have a way to detect tooltip color, so use the
128             // standard value used at least on 10.4:
129             resultColor = wxColour( 0xFF, 0xFF, 0xD3 ) ;
130             break ;
131         case wxSYS_COLOUR_APPWORKSPACE:
132             resultColor =  wxColor( 0x80, 0x80, 0x80 ); ;
133             break ;
134 
135         case wxSYS_COLOUR_HOTLIGHT:
136         case wxSYS_COLOUR_GRADIENTACTIVECAPTION:
137         case wxSYS_COLOUR_GRADIENTINACTIVECAPTION:
138         case wxSYS_COLOUR_MENUHILIGHT:
139             // TODO:
140             resultColor = *wxBLACK;
141             break ;
142 
143         // case wxSYS_COLOUR_MAX:
144         default:
145             resultColor = *wxWHITE;
146             // wxCHECK_MSG( index >= wxSYS_COLOUR_MAX, false, wxT("unknown system colour index") );
147             break ;
148     }
149 
150     //wxASSERT(resultColor.IsOk());
151 
152     return resultColor;
153 }
154 
155 // ----------------------------------------------------------------------------
156 // fonts
157 // ----------------------------------------------------------------------------
158 
GetFont(wxSystemFont index)159 wxFont wxSystemSettingsNative::GetFont(wxSystemFont index)
160 {
161     wxFont font;
162 
163     switch (index)
164     {
165         case wxSYS_ANSI_VAR_FONT :
166         case wxSYS_SYSTEM_FONT :
167         case wxSYS_DEVICE_DEFAULT_FONT :
168         case wxSYS_DEFAULT_GUI_FONT :
169             font = *wxSMALL_FONT ;
170             break ;
171 
172         default :
173             font = *wxNORMAL_FONT ;
174             break ;
175     }
176 
177     //wxASSERT(font.IsOk() && wxFontEnumerator::IsValidFacename(font.GetFaceName()));
178 
179     return font;
180 }
181 
182 // ----------------------------------------------------------------------------
183 // system metrics/features
184 // ----------------------------------------------------------------------------
185 
186 // Get a system metric, e.g. scrollbar size
GetMetric(wxSystemMetric index,wxWindow * WXUNUSED (win))187 int wxSystemSettingsNative::GetMetric(wxSystemMetric index, wxWindow* WXUNUSED(win))
188 {
189     int value;
190 
191     switch ( index )
192     {
193         case wxSYS_MOUSE_BUTTONS:
194             // we emulate a two button mouse (ctrl + click = right button)
195             return 2;
196 
197         // TODO case wxSYS_BORDER_X:
198         // TODO case wxSYS_BORDER_Y:
199         // TODO case wxSYS_CURSOR_X:
200         // TODO case wxSYS_CURSOR_Y:
201         // TODO case wxSYS_DCLICK_X:
202         // TODO case wxSYS_DCLICK_Y:
203         // TODO case wxSYS_DRAG_X:
204         // TODO case wxSYS_DRAG_Y:
205         // TODO case wxSYS_EDGE_X:
206         // TODO case wxSYS_EDGE_Y:
207 
208         case wxSYS_HSCROLL_ARROW_X:
209         case wxSYS_HSCROLL_ARROW_Y:
210         case wxSYS_HTHUMB_X:
211             return 16;
212 
213         // TODO case wxSYS_ICON_X:
214         // TODO case wxSYS_ICON_Y:
215         // TODO case wxSYS_ICONSPACING_X:
216         // TODO case wxSYS_ICONSPACING_Y:
217         // TODO case wxSYS_WINDOWMIN_X:
218         // TODO case wxSYS_WINDOWMIN_Y:
219 
220         case wxSYS_SCREEN_X:
221             wxDisplaySize( &value, NULL );
222             return value;
223 
224         case wxSYS_SCREEN_Y:
225             wxDisplaySize( NULL, &value );
226             return value;
227 
228         // TODO case wxSYS_FRAMESIZE_X:
229         // TODO case wxSYS_FRAMESIZE_Y:
230         // TODO case wxSYS_SMALLICON_X:
231         // TODO case wxSYS_SMALLICON_Y:
232 
233         case wxSYS_HSCROLL_Y:
234         case wxSYS_VSCROLL_X:
235         case wxSYS_VSCROLL_ARROW_X:
236         case wxSYS_VSCROLL_ARROW_Y:
237         case wxSYS_VTHUMB_Y:
238             return 16;
239 
240         case wxSYS_PENWINDOWS_PRESENT:
241             return 0;
242 
243         case wxSYS_SWAP_BUTTONS:
244             return 0;
245 
246         // TODO: case wxSYS_CAPTION_Y:
247         // TODO: case wxSYS_MENU_Y:
248         // TODO: case wxSYS_NETWORK_PRESENT:
249         // TODO: case wxSYS_SHOW_SOUNDS:
250 
251         case wxSYS_DCLICK_MSEC:
252 #if wxOSX_USE_CARBON
253             return (int)(GetDblTime() * 1000. / 60.);
254 #else
255             // default on mac is 30 ticks, we shouldn't really use wxSYS_DCLICK_MSEC anyway
256             // but rather rely on the 'click-count' by the system delivered in a mouse event
257             return 500;
258 #endif
259         default:
260             // unsupported metric
261             break;
262     }
263 
264     return -1;
265 }
266 
HasFeature(wxSystemFeature index)267 bool wxSystemSettingsNative::HasFeature(wxSystemFeature index)
268 {
269     switch (index)
270     {
271         case wxSYS_CAN_ICONIZE_FRAME:
272         case wxSYS_CAN_DRAW_FRAME_DECORATIONS:
273             return true;
274 
275         default:
276             return false;
277     }
278 }
279