Sync to trunk revision 61757.
[reactos.git] / base / applications / msconfig / msconfig.c
1 /*
2 * PROJECT: ReactOS Applications
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/msconfig.c
5 * PURPOSE: msconfig main dialog
6 * COPYRIGHT: Copyright 2005-2006 Christoph von Wittich <Christoph@ApiViewer.de>
7 *
8 */
9
10 #include "precomp.h"
11
12 #include "toolspage.h"
13 #include "srvpage.h"
14 #include "startuppage.h"
15 #include "freeldrpage.h"
16 #include "systempage.h"
17 #include "generalpage.h"
18
19 HINSTANCE hInst = 0;
20
21 HWND hMainWnd; /* Main Window */
22 HWND hTabWnd; /* Tab Control Window */
23 UINT uXIcon = 0, uYIcon = 0; /* Icon sizes */
24 HICON hDialogIcon = NULL;
25
26 void MsConfig_OnTabWndSelChange(void);
27
28 ////////////////////////////////////////////////////////////////////////////////
29 // Taken from WinSpy++ 1.7
30 // http://www.catch22.net/software/winspy
31 // Copyright (c) 2002 by J Brown
32 //
33
34 //
35 // Copied from uxtheme.h
36 // If you have this new header, then delete these and
37 // #include <uxtheme.h> instead!
38 //
39 #define ETDT_DISABLE 0x00000001
40 #define ETDT_ENABLE 0x00000002
41 #define ETDT_USETABTEXTURE 0x00000004
42 #define ETDT_ENABLETAB (ETDT_ENABLE | ETDT_USETABTEXTURE)
43
44 //
45 typedef HRESULT (WINAPI * ETDTProc) (HWND, DWORD);
46
47 //
48 // Try to call EnableThemeDialogTexture, if uxtheme.dll is present
49 //
50 BOOL EnableDialogTheme(HWND hwnd)
51 {
52 HMODULE hUXTheme;
53 ETDTProc fnEnableThemeDialogTexture;
54
55 hUXTheme = LoadLibrary(_T("uxtheme.dll"));
56
57 if(hUXTheme)
58 {
59 fnEnableThemeDialogTexture =
60 (ETDTProc)GetProcAddress(hUXTheme, "EnableThemeDialogTexture");
61
62 if(fnEnableThemeDialogTexture)
63 {
64 fnEnableThemeDialogTexture(hwnd, ETDT_ENABLETAB);
65
66 FreeLibrary(hUXTheme);
67 return TRUE;
68 }
69 else
70 {
71 // Failed to locate API!
72 FreeLibrary(hUXTheme);
73 return FALSE;
74 }
75 }
76 else
77 {
78 // Not running under XP? Just fail gracefully
79 return FALSE;
80 }
81 }
82 BOOL OnCreate(HWND hWnd)
83 {
84 TCHAR szTemp[256];
85 TCITEM item;
86
87 hTabWnd = GetDlgItem(hWnd, IDC_TAB);
88 hGeneralPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_GENERAL_PAGE), hWnd, GeneralPageWndProc); EnableDialogTheme(hGeneralPage);
89 hSystemPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_SYSTEM_PAGE), hWnd, SystemPageWndProc); EnableDialogTheme(hSystemPage);
90 hFreeLdrPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_FREELDR_PAGE), hWnd, FreeLdrPageWndProc); EnableDialogTheme(hFreeLdrPage);
91 hServicesPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_SERVICES_PAGE), hWnd, ServicesPageWndProc); EnableDialogTheme(hServicesPage);
92 hStartupPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_STARTUP_PAGE), hWnd, StartupPageWndProc); EnableDialogTheme(hStartupPage);
93 hToolsPage = CreateDialog(hInst, MAKEINTRESOURCE(IDD_TOOLS_PAGE), hWnd, ToolsPageWndProc); EnableDialogTheme(hToolsPage);
94
95 LoadString(hInst, IDS_MSCONFIG, szTemp, 256);
96 SetWindowText(hWnd, szTemp);
97
98 // Insert Tab Pages
99 LoadString(hInst, IDS_TAB_GENERAL, szTemp, 256);
100 memset(&item, 0, sizeof(TCITEM));
101 item.mask = TCIF_TEXT;
102 item.pszText = szTemp;
103 (void)TabCtrl_InsertItem(hTabWnd, 0, &item);
104
105 LoadString(hInst, IDS_TAB_SYSTEM, szTemp, 256);
106 memset(&item, 0, sizeof(TCITEM));
107 item.mask = TCIF_TEXT;
108 item.pszText = szTemp;
109 (void)TabCtrl_InsertItem(hTabWnd, 1, &item);
110
111 LoadString(hInst, IDS_TAB_FREELDR, szTemp, 256);
112 memset(&item, 0, sizeof(TCITEM));
113 item.mask = TCIF_TEXT;
114 item.pszText = szTemp;
115 (void)TabCtrl_InsertItem(hTabWnd, 2, &item);
116
117 LoadString(hInst, IDS_TAB_SERVICES, szTemp, 256);
118 memset(&item, 0, sizeof(TCITEM));
119 item.mask = TCIF_TEXT;
120 item.pszText = szTemp;
121 (void)TabCtrl_InsertItem(hTabWnd, 3, &item);
122
123 LoadString(hInst, IDS_TAB_STARTUP, szTemp, 256);
124 memset(&item, 0, sizeof(TCITEM));
125 item.mask = TCIF_TEXT;
126 item.pszText = szTemp;
127 (void)TabCtrl_InsertItem(hTabWnd, 4, &item);
128
129 LoadString(hInst, IDS_TAB_TOOLS, szTemp, 256);
130 memset(&item, 0, sizeof(TCITEM));
131 item.mask = TCIF_TEXT;
132 item.pszText = szTemp;
133 (void)TabCtrl_InsertItem(hTabWnd, 5, &item);
134
135 MsConfig_OnTabWndSelChange();
136
137 return TRUE;
138 }
139
140
141 void MsConfig_OnTabWndSelChange(void)
142 {
143 switch (TabCtrl_GetCurSel(hTabWnd)) {
144 case 0: //General
145 ShowWindow(hGeneralPage, SW_SHOW);
146 ShowWindow(hSystemPage, SW_HIDE);
147 ShowWindow(hFreeLdrPage, SW_HIDE);
148 ShowWindow(hServicesPage, SW_HIDE);
149 ShowWindow(hStartupPage, SW_HIDE);
150 ShowWindow(hToolsPage, SW_HIDE);
151 BringWindowToTop(hGeneralPage);
152 break;
153 case 1: //SYSTEM.INI
154 ShowWindow(hGeneralPage, SW_HIDE);
155 ShowWindow(hSystemPage, SW_SHOW);
156 ShowWindow(hToolsPage, SW_HIDE);
157 ShowWindow(hStartupPage, SW_HIDE);
158 ShowWindow(hFreeLdrPage, SW_HIDE);
159 ShowWindow(hServicesPage, SW_HIDE);
160 BringWindowToTop(hSystemPage);
161 break;
162 case 2: //Freeldr
163 ShowWindow(hGeneralPage, SW_HIDE);
164 ShowWindow(hSystemPage, SW_HIDE);
165 ShowWindow(hFreeLdrPage, SW_SHOW);
166 ShowWindow(hServicesPage, SW_HIDE);
167 ShowWindow(hStartupPage, SW_HIDE);
168 ShowWindow(hToolsPage, SW_HIDE);
169 BringWindowToTop(hFreeLdrPage);
170 break;
171 case 3: //Services
172 ShowWindow(hGeneralPage, SW_HIDE);
173 ShowWindow(hSystemPage, SW_HIDE);
174 ShowWindow(hFreeLdrPage, SW_HIDE);
175 ShowWindow(hServicesPage, SW_SHOW);
176 ShowWindow(hStartupPage, SW_HIDE);
177 ShowWindow(hToolsPage, SW_HIDE);
178 BringWindowToTop(hServicesPage);
179 break;
180 case 4: //startup
181 ShowWindow(hGeneralPage, SW_HIDE);
182 ShowWindow(hSystemPage, SW_HIDE);
183 ShowWindow(hFreeLdrPage, SW_HIDE);
184 ShowWindow(hServicesPage, SW_HIDE);
185 ShowWindow(hStartupPage, SW_SHOW);
186 ShowWindow(hToolsPage, SW_HIDE);
187 BringWindowToTop(hStartupPage);
188 break;
189 case 5: //Tools
190 ShowWindow(hGeneralPage, SW_HIDE);
191 ShowWindow(hSystemPage, SW_HIDE);
192 ShowWindow(hFreeLdrPage, SW_HIDE);
193 ShowWindow(hServicesPage, SW_HIDE);
194 ShowWindow(hStartupPage, SW_HIDE);
195 ShowWindow(hToolsPage, SW_SHOW);
196 BringWindowToTop(hToolsPage);
197 break;
198 }
199 }
200
201
202 static
203 VOID
204 SetDialogIcon(HWND hDlg)
205 {
206 if (hDialogIcon) DestroyIcon(hDialogIcon);
207
208 hDialogIcon = LoadImage(GetModuleHandle(NULL),
209 MAKEINTRESOURCE(IDI_APPICON),
210 IMAGE_ICON,
211 uXIcon,
212 uYIcon,
213 0);
214 SendMessage(hDlg,
215 WM_SETICON,
216 ICON_SMALL,
217 (LPARAM)hDialogIcon);
218 }
219
220
221 /* Message handler for dialog box. */
222 INT_PTR CALLBACK
223 MsConfigWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
224 {
225 LPNMHDR pnmh;
226 UINT uXIconNew, uYIconNew;
227
228 switch (message)
229 {
230 case WM_INITDIALOG:
231 hMainWnd = hDlg;
232
233 uXIcon = GetSystemMetrics(SM_CXSMICON);
234 uYIcon = GetSystemMetrics(SM_CYSMICON);
235
236 SetDialogIcon(hDlg);
237
238 return OnCreate(hDlg);
239
240 case WM_SETTINGCHANGE:
241 uXIconNew = GetSystemMetrics(SM_CXSMICON);
242 uYIconNew = GetSystemMetrics(SM_CYSMICON);
243
244 if ((uXIcon != uXIconNew) || (uYIcon != uYIconNew))
245 {
246 uXIcon = uXIconNew;
247 uYIcon = uYIconNew;
248 SetDialogIcon(hDlg);
249 }
250 break;
251
252 case WM_COMMAND:
253
254 if (LOWORD(wParam) == IDOK)
255 {
256 //MsConfig_OnSaveChanges();
257 }
258
259 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
260 EndDialog(hDlg, LOWORD(wParam));
261 return TRUE;
262 }
263 break;
264
265 case WM_NOTIFY:
266 pnmh = (LPNMHDR)lParam;
267 if ((pnmh->hwndFrom == hTabWnd) &&
268 (pnmh->idFrom == IDC_TAB) &&
269 (pnmh->code == TCN_SELCHANGE))
270 {
271 MsConfig_OnTabWndSelChange();
272 }
273 break;
274
275 case WM_SYSCOLORCHANGE:
276 /* Forward WM_SYSCOLORCHANGE to common controls */
277 SendMessage(hServicesListCtrl, WM_SYSCOLORCHANGE, 0, 0);
278 SendMessage(hStartupListCtrl, WM_SYSCOLORCHANGE, 0, 0);
279 SendMessage(hToolsListCtrl, WM_SYSCOLORCHANGE, 0, 0);
280 break;
281
282 case WM_DESTROY:
283 if (hToolsPage)
284 DestroyWindow(hToolsPage);
285 if (hGeneralPage)
286 DestroyWindow(hGeneralPage);
287 if (hServicesPage)
288 DestroyWindow(hServicesPage);
289 if (hStartupPage)
290 DestroyWindow(hStartupPage);
291 if (hFreeLdrPage)
292 DestroyWindow(hFreeLdrPage);
293 if (hSystemPage)
294 DestroyWindow(hSystemPage);
295 if (hDialogIcon)
296 DestroyIcon(hDialogIcon);
297 return DefWindowProc(hDlg, message, wParam, lParam);
298 }
299
300 return 0;
301 }
302
303 int APIENTRY _tWinMain(HINSTANCE hInstance,
304 HINSTANCE hPrevInstance,
305 LPTSTR lpCmdLine,
306 int nCmdShow)
307 {
308
309 INITCOMMONCONTROLSEX InitControls;
310
311 UNREFERENCED_PARAMETER(hPrevInstance);
312 UNREFERENCED_PARAMETER(lpCmdLine);
313 UNREFERENCED_PARAMETER(nCmdShow);
314
315 InitControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
316 InitControls.dwICC = ICC_TAB_CLASSES | ICC_LISTVIEW_CLASSES;
317 InitCommonControlsEx(&InitControls);
318
319 hInst = hInstance;
320
321 DialogBox(hInst, (LPCTSTR)IDD_MSCONFIG_DIALOG, NULL, MsConfigWndProc);
322
323 return 0;
324 }
325
326 /* EOF */