1 /* 2 * PROJECT: ReactOS Timedate Control Panel 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: dll/cpl/timedate/timedate.c 5 * PURPOSE: ReactOS Timedate Control Panel 6 * COPYRIGHT: Copyright 2004-2005 Eric Kohl 7 * Copyright 2006 Ged Murphy <gedmurphy@gmail.com> 8 * 9 */ 10 11 #include "timedate.h" 12 13 #define NUM_APPLETS 1 14 15 static LONG APIENTRY Applet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam); 16 17 HINSTANCE hApplet; 18 19 /* Applets */ 20 APPLET Applets[NUM_APPLETS] = 21 { 22 {IDC_CPLICON, IDS_CPLNAME, IDS_CPLDESCRIPTION, Applet} 23 }; 24 25 #if DBG 26 VOID DisplayWin32ErrorDbg(DWORD dwErrorCode, const char *file, int line) 27 #else 28 VOID DisplayWin32Error(DWORD dwErrorCode) 29 #endif 30 { 31 LPVOID lpMsgBuf; 32 #if DBG 33 WCHAR szMsg[255]; 34 #endif 35 36 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | 37 FORMAT_MESSAGE_FROM_SYSTEM | 38 FORMAT_MESSAGE_IGNORE_INSERTS, 39 NULL, 40 dwErrorCode, 41 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 42 (LPWSTR) &lpMsgBuf, 43 0, 44 NULL ); 45 46 #if DBG 47 if (swprintf(szMsg, L"%hs:%d: %s", file, line, lpMsgBuf)) 48 { 49 MessageBoxW(NULL, szMsg, NULL, MB_OK | MB_ICONERROR); 50 } 51 #else 52 MessageBox(NULL, lpMsgBuf, NULL, MB_OK | MB_ICONERROR); 53 #endif 54 55 LocalFree(lpMsgBuf); 56 } 57 58 59 static VOID 60 InitPropSheetPage(PROPSHEETPAGEW *psp, WORD idDlg, DLGPROC DlgProc) 61 { 62 ZeroMemory(psp, sizeof(PROPSHEETPAGEW)); 63 psp->dwSize = sizeof(PROPSHEETPAGEW); 64 psp->dwFlags = PSP_DEFAULT; 65 psp->hInstance = hApplet; 66 psp->pszTemplate = MAKEINTRESOURCEW(idDlg); 67 psp->pfnDlgProc = DlgProc; 68 } 69 70 71 static LONG APIENTRY 72 Applet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam) 73 { 74 PROPSHEETHEADER psh; 75 PROPSHEETPAGEW psp[3]; 76 WCHAR Caption[256]; 77 LONG Ret = 0; 78 79 UNREFERENCED_PARAMETER(uMsg); 80 UNREFERENCED_PARAMETER(wParam); 81 UNREFERENCED_PARAMETER(lParam); 82 83 if (RegisterMonthCalControl(hApplet) && 84 RegisterClockControl()) 85 { 86 LoadStringW(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(WCHAR)); 87 88 ZeroMemory(&psh, sizeof(PROPSHEETHEADERW)); 89 psh.dwSize = sizeof(PROPSHEETHEADERW); 90 psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE; 91 psh.hwndParent = hwnd; 92 psh.hInstance = hApplet; 93 psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCEW(IDC_CPLICON)); 94 psh.pszCaption = Caption; 95 psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGEW); 96 psh.nStartPage = 0; 97 psh.ppsp = psp; 98 99 InitPropSheetPage(&psp[0], IDD_DATETIMEPAGE, DateTimePageProc); 100 InitPropSheetPage(&psp[1], IDD_TIMEZONEPAGE, TimeZonePageProc); 101 InitPropSheetPage(&psp[2], IDD_INETTIMEPAGE, InetTimePageProc); 102 103 Ret = (LONG)(PropertySheetW(&psh) != -1); 104 105 UnregisterMonthCalControl(hApplet); 106 UnregisterClockControl(); 107 } 108 109 return Ret; 110 } 111 112 113 /* Control Panel Callback */ 114 LONG CALLBACK 115 CPlApplet(HWND hwndCpl, 116 UINT uMsg, 117 LPARAM lParam1, 118 LPARAM lParam2) 119 { 120 INT i = (INT)lParam1; 121 122 switch (uMsg) 123 { 124 case CPL_INIT: 125 return TRUE; 126 127 case CPL_GETCOUNT: 128 return NUM_APPLETS; 129 130 case CPL_INQUIRE: 131 { 132 CPLINFO *CPlInfo = (CPLINFO*)lParam2; 133 CPlInfo->lData = 0; 134 CPlInfo->idIcon = Applets[i].idIcon; 135 CPlInfo->idName = Applets[i].idName; 136 CPlInfo->idInfo = Applets[i].idDescription; 137 } 138 break; 139 140 case CPL_DBLCLK: 141 { 142 Applets[i].AppletProc(hwndCpl, uMsg, lParam1, lParam2); 143 } 144 break; 145 } 146 return FALSE; 147 } 148 149 150 BOOL WINAPI 151 DllMain(HINSTANCE hinstDLL, 152 DWORD dwReason, 153 LPVOID lpReserved) 154 { 155 UNREFERENCED_PARAMETER(lpReserved); 156 157 switch (dwReason) 158 { 159 case DLL_PROCESS_ATTACH: 160 { 161 INITCOMMONCONTROLSEX InitControls; 162 163 InitControls.dwSize = sizeof(INITCOMMONCONTROLSEX); 164 InitControls.dwICC = ICC_DATE_CLASSES | ICC_PROGRESS_CLASS | ICC_UPDOWN_CLASS; 165 InitCommonControlsEx(&InitControls); 166 167 hApplet = hinstDLL; 168 } 169 break; 170 } 171 172 return TRUE; 173 } 174