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