1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        src/os2/settings.cpp
3 // Purpose:     wxSettings
4 // Author:      David Webster
5 // Modified by:
6 // Created:     10/15/99
7 // Copyright:   (c) David Webster
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
13 
14 #ifndef WX_PRECOMP
15     #include <stdio.h>
16     #include "wx/pen.h"
17     #include "wx/brush.h"
18     #include "wx/gdicmn.h"
19     #include "wx/window.h"
20     #include "wx/settings.h"
21     #include "wx/module.h"
22 #endif
23 
24 #include "wx/fontutil.h"
25 
26 #include "wx/os2/private.h"
27 
28 // the module which is used to clean up wxSystemSettings data (this is a
29 // singleton class so it can't be done in the dtor)
30 class wxSystemSettingsModule : public wxModule
31 {
32     friend class wxSystemSettings;
33 public:
34     virtual bool OnInit();
35     virtual void OnExit();
36 
37 private:
38     DECLARE_DYNAMIC_CLASS(wxSystemSettingsModule)
39 
40     static wxArrayString   sm_optionNames;
41     static wxArrayString   sm_optionValues;
42 };
43 
44 // ----------------------------------------------------------------------------
45 // global data
46 // ----------------------------------------------------------------------------
47 
48 static wxFont *gs_fontDefault = NULL;
49 
50 // ============================================================================
51 // implementation
52 // ============================================================================
53 
54 // ----------------------------------------------------------------------------
55 // wxSystemSettingsModule
56 // ----------------------------------------------------------------------------
57 
58 IMPLEMENT_DYNAMIC_CLASS(wxSystemSettingsModule, wxModule)
59 
60 wxArrayString wxSystemSettingsModule::sm_optionNames;
61 wxArrayString wxSystemSettingsModule::sm_optionValues;
62 
OnInit()63 bool wxSystemSettingsModule::OnInit()
64 {
65     return true;
66 }
67 
OnExit()68 void wxSystemSettingsModule::OnExit()
69 {
70     sm_optionNames.Clear();
71     sm_optionValues.Clear();
72     wxDELETE(gs_fontDefault);
73 }
74 
GetColour(wxSystemColour nIndex)75 wxColour wxSystemSettingsNative::GetColour(
76   wxSystemColour                    nIndex
77 )
78 {
79     COLORREF                        vRef;
80     wxColour                        vCol;
81     LONG                            vSysClr;
82     switch (nIndex)
83     {
84         //
85         // PM actually has values for these
86         //
87         case wxSYS_COLOUR_WINDOW:
88             vSysClr = SYSCLR_WINDOW;
89             break;
90 
91         case wxSYS_COLOUR_WINDOWFRAME:
92             vSysClr = SYSCLR_WINDOWFRAME;
93             break;
94 
95         case wxSYS_COLOUR_MENUTEXT:
96             vSysClr = SYSCLR_MENUTEXT;
97             break;
98 
99         case wxSYS_COLOUR_MENUHILIGHT:
100             vSysClr = SYSCLR_MENUHILITE;
101             break;
102 
103         case wxSYS_COLOUR_BTNFACE:
104             vSysClr = SYSCLR_BUTTONMIDDLE;
105             break;
106 
107         case wxSYS_COLOUR_BTNSHADOW:
108             vSysClr = SYSCLR_BUTTONDARK;
109             break;
110 
111         case wxSYS_COLOUR_BTNHIGHLIGHT:
112             vSysClr = SYSCLR_BUTTONLIGHT;
113             break;
114 
115         case wxSYS_COLOUR_BACKGROUND:
116             vSysClr = SYSCLR_BACKGROUND;
117             break;
118 
119         case wxSYS_COLOUR_APPWORKSPACE:
120             vSysClr = SYSCLR_APPWORKSPACE;
121             break;
122 
123         case wxSYS_COLOUR_MENUBAR:
124         case wxSYS_COLOUR_MENU:
125             vSysClr = SYSCLR_MENU;
126             break;
127 
128         case wxSYS_COLOUR_INACTIVECAPTION:
129             vSysClr = SYSCLR_INACTIVETITLE;
130             break;
131 
132         case wxSYS_COLOUR_INACTIVEBORDER:
133             vSysClr = SYSCLR_INACTIVEBORDER;
134             break;
135 
136         case wxSYS_COLOUR_LISTBOX:
137             vSysClr = SYSCLR_ENTRYFIELD;
138             break;
139 
140         case wxSYS_COLOUR_CAPTIONTEXT:
141             vSysClr = SYSCLR_TITLETEXT;
142             break;
143 
144         case wxSYS_COLOUR_INACTIVECAPTIONTEXT:
145             vSysClr = SYSCLR_INACTIVETITLETEXT;
146             break;
147 
148         case wxSYS_COLOUR_WINDOWTEXT:
149         case wxSYS_COLOUR_BTNTEXT:
150             vSysClr = SYSCLR_WINDOWTEXT;
151             break;
152 
153         case wxSYS_COLOUR_INFOTEXT:
154             vSysClr = SYSCLR_HELPTEXT;
155             break;
156 
157         case wxSYS_COLOUR_ACTIVECAPTION:
158             vSysClr = SYSCLR_ACTIVETITLE;
159             break;
160 
161         case wxSYS_COLOUR_ACTIVEBORDER:
162             vSysClr = SYSCLR_ACTIVEBORDER;
163             break;
164 
165         case wxSYS_COLOUR_HIGHLIGHT:
166             vSysClr = SYSCLR_HILITEBACKGROUND;
167             break;
168 
169         case wxSYS_COLOUR_SCROLLBAR:
170             vSysClr = SYSCLR_SCROLLBAR;
171             break;
172 
173         case wxSYS_COLOUR_HIGHLIGHTTEXT:
174         case wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT:
175             vSysClr = SYSCLR_HILITEFOREGROUND;
176             break;
177 
178         case wxSYS_COLOUR_INFOBK:
179             vSysClr = SYSCLR_HELPBACKGROUND;
180             break;
181 
182         // Don't know what these should be, so leave them grey (normally)
183         case wxSYS_COLOUR_GRAYTEXT:
184         case wxSYS_COLOUR_3DDKSHADOW:
185         case wxSYS_COLOUR_3DLIGHT:
186         case wxSYS_COLOUR_HOTLIGHT:
187         case wxSYS_COLOUR_GRADIENTACTIVECAPTION:
188         case wxSYS_COLOUR_GRADIENTINACTIVECAPTION:
189             vSysClr = SYSCLR_BUTTONMIDDLE;
190             break;
191 
192         default:
193             vSysClr = SYSCLR_WINDOW;
194             break;
195     }
196     vRef = (ULONG)::WinQuerySysColor(   HWND_DESKTOP,
197                                         vSysClr,
198                                         0L  );
199     vCol.Set(   GetRValue(vRef),
200                 GetGValue(vRef),
201                 GetBValue(vRef)  );
202     return(vCol);
203 } // end of wxSystemSettingsNative::GetColour
204 
205 // ----------------------------------------------------------------------------
206 // fonts
207 // ----------------------------------------------------------------------------
208 
GetFont(wxSystemFont index)209 wxFont wxSystemSettingsNative::GetFont(
210   wxSystemFont                      index
211 )
212 {
213     const bool isDefaultRequested = index == wxSYS_DEFAULT_GUI_FONT;
214     if ( isDefaultRequested )
215     {
216         if ( gs_fontDefault )
217             return *gs_fontDefault;
218     }
219 
220     wxFont font;
221     // FIXME: The mapping could be improved and also OS/2 system fonts
222     // should be taken into account e.g. by using PrfQueryProfileString
223     // to look for PM_System_Fonts in HINI_USERPROFILE.
224     // FIXME2: Creating a font from the native font info does not
225     // seem to work properly.
226     switch (index)
227     {
228         case wxSYS_SYSTEM_FIXED_FONT:
229         case wxSYS_OEM_FIXED_FONT:
230         case wxSYS_ANSI_FIXED_FONT:
231                 font.Create(  10,
232                               wxFONTFAMILY_TELETYPE,
233                               wxFONTSTYLE_NORMAL,
234                               wxFONTWEIGHT_NORMAL   );
235                 break;
236         case wxSYS_ANSI_VAR_FONT:
237                 font.Create(  10,
238                               wxFONTFAMILY_MODERN,
239                               wxFONTSTYLE_NORMAL,
240                               wxFONTWEIGHT_NORMAL   );
241                 break;
242         case wxSYS_SYSTEM_FONT:
243         case wxSYS_DEFAULT_GUI_FONT:
244                 font.Create(  10,
245                               wxFONTFAMILY_SWISS,
246                               wxFONTSTYLE_NORMAL,
247                               wxFONTWEIGHT_NORMAL   );
248                 break;
249         default:
250                 wxFAIL_MSG( wxT("stock font not found") );
251                 return GetFont(wxSYS_ANSI_VAR_FONT);
252     }
253 
254 
255     if ( isDefaultRequested )
256     {
257         // if we got here it means we hadn't cached it yet - do now
258         gs_fontDefault = new wxFont(font);
259     }
260 
261     return font;
262 }
263 
264 // Get a system metric, e.g. scrollbar size
GetMetric(wxSystemMetric index,wxWindow * WXUNUSED (win))265 int wxSystemSettingsNative::GetMetric( wxSystemMetric index,
266                                        wxWindow*      WXUNUSED(win) )
267 {
268     switch ( index)
269     {
270         // TODO case wxSYS_MOUSE_BUTTONS:
271         // TODO case wxSYS_BORDER_X:
272         // TODO case wxSYS_BORDER_Y:
273         // TODO case wxSYS_CURSOR_X:
274         // TODO case wxSYS_CURSOR_Y:
275         // TODO case wxSYS_DCLICK_X:
276         // TODO case wxSYS_DCLICK_Y:
277         // TODO case wxSYS_DRAG_X:
278         // TODO case wxSYS_DRAG_Y:
279         // TODO case wxSYS_EDGE_X:
280         // TODO case wxSYS_EDGE_Y:
281         // TODO case wxSYS_HSCROLL_ARROW_X:
282         // TODO case wxSYS_HSCROLL_ARROW_Y:
283         // TODO case wxSYS_HTHUMB_X:
284         // TODO case wxSYS_ICON_X:
285         // TODO case wxSYS_ICON_Y:
286         // TODO case wxSYS_ICONSPACING_X:
287         // TODO case wxSYS_ICONSPACING_Y:
288         // TODO case wxSYS_WINDOWMIN_X:
289         // TODO case wxSYS_WINDOWMIN_Y:
290 
291         case wxSYS_SCREEN_X:
292             return ::WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN);
293         case wxSYS_SCREEN_Y:
294             return ::WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN);
295 
296         // TODO case wxSYS_FRAMESIZE_X:
297         // TODO case wxSYS_FRAMESIZE_Y:
298         // TODO case wxSYS_SMALLICON_X:
299         // TODO case wxSYS_SMALLICON_Y:
300 
301         case wxSYS_HSCROLL_Y:
302             return ::WinQuerySysValue(HWND_DESKTOP,SV_CYHSCROLL);
303         case wxSYS_VSCROLL_X:
304             return ::WinQuerySysValue(HWND_DESKTOP,SV_CXVSCROLL);
305 
306         // TODO case wxSYS_VSCROLL_ARROW_X:
307         // TODO case wxSYS_VSCROLL_ARROW_Y:
308         // TODO case wxSYS_VTHUMB_Y:
309         // TODO case wxSYS_CAPTION_Y:
310         // TODO case wxSYS_MENU_Y:
311         // TODO case wxSYS_NETWORK_PRESENT:
312         // TODO case wxSYS_PENWINDOWS_PRESENT:
313         // TODO case wxSYS_SHOW_SOUNDS:
314         // TODO case wxSYS_SWAP_BUTTONS:
315 
316         default:
317             break;
318     }
319     return -1;  // unsupported metric
320 }
321 
HasFeature(wxSystemFeature index)322 bool wxSystemSettingsNative::HasFeature( wxSystemFeature index )
323 {
324     switch (index)
325     {
326         case wxSYS_CAN_ICONIZE_FRAME:
327             return true;
328 
329         // TODO case wxSYS_CAN_DRAW_FRAME_DECORATIONS:
330         // TODO case wxSYS_TABLET_PRESENT:
331 
332         default:
333             break;
334     }
335 
336     return false;
337 }
338