Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1060 lines
34 KiB

  1. // =================================================================================
  2. // S T A T W I Z . C P P
  3. // =================================================================================
  4. #include "pch.hxx"
  5. #include <prsht.h>
  6. #include "strconst.h"
  7. #include "goptions.h"
  8. #include "error.h"
  9. #include "resource.h"
  10. #include "url.h"
  11. #include "bodyutil.h"
  12. #include "mailutil.h"
  13. #include "statnery.h"
  14. #include "wininet.h"
  15. #include "options.h"
  16. #include <shlwapi.h>
  17. #include <shlwapip.h>
  18. #include "regutil.h"
  19. #include "thumb.h"
  20. #include "optres.h"
  21. #include "statwiz.h"
  22. #include "url.h"
  23. #include "fontnsc.h"
  24. #include "fonts.h"
  25. #include <mshtml.h>
  26. #include <oleutil.h>
  27. #include "demand.h"
  28. #define TMARGIN_MAX 500
  29. #define LMARGIN_MAX 500
  30. #define MARGIN_MIN 0
  31. void _EnableBackgroundWindows(HWND hDlg, int id, BOOL enable);
  32. void _ShowBackgroundPreview(HWND hDlg, LPSTATWIZ pApp);
  33. void _ShowFontPreview(HWND hDlg, LPSTATWIZ pApp);
  34. void _ShowMarginPreview(HWND hDlg, LPSTATWIZ pApp);
  35. void _ShowFinalPreveiew(HWND hDlg, LPSTATWIZ pApp);
  36. void _PaintFontSample(HWND hwnd, HDC hdc, LPSTATWIZ pApp);
  37. LRESULT CALLBACK _FontSampleSubProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
  38. BOOL _CopyFileToStationeryDir(LPWSTR pwszFileSrc);
  39. BOOL _FillCombo(HWND, ULONG id);
  40. void SetupFonts( HINSTANCE, HWND, HFONT *pBigBoldFont);
  41. VOID SetControlFont(HFONT, HWND,INT nId);
  42. BOOL CALLBACK _WelcomeOKProc(CStatWiz *,HWND,UINT,UINT *,BOOL *);
  43. BOOL CALLBACK _BackgroundOKProc(CStatWiz *,HWND,UINT,UINT *,BOOL *);
  44. BOOL CALLBACK _FontOKProc(CStatWiz *,HWND,UINT,UINT *,BOOL *);
  45. BOOL CALLBACK _MarginOKProc(CStatWiz *,HWND,UINT,UINT *,BOOL *);
  46. BOOL CALLBACK _FinalOKProc(CStatWiz *,HWND,UINT,UINT *,BOOL *);
  47. INT_PTR CALLBACK _GenDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
  48. BOOL CALLBACK _WelcomeInitProc(CStatWiz *,HWND,BOOL);
  49. BOOL CALLBACK _BackgroundInitProc(CStatWiz *,HWND,BOOL);
  50. BOOL CALLBACK _FontInitProc(CStatWiz *,HWND,BOOL);
  51. BOOL CALLBACK _MarginInitProc(CStatWiz *,HWND,BOOL);
  52. BOOL CALLBACK _FinalInitProc(CStatWiz *,HWND,BOOL);
  53. BOOL CALLBACK _BackgroundCmdProc(CStatWiz *,HWND,WPARAM,LPARAM);
  54. BOOL CALLBACK _FontCmdProc(CStatWiz *,HWND,WPARAM,LPARAM);
  55. BOOL CALLBACK _MarginCmdProc(CStatWiz *,HWND,WPARAM,LPARAM);
  56. #define idTimerEditChange 666
  57. const static PAGEINFO s_rgPageInfo[NUM_WIZARD_PAGES] =
  58. {
  59. { iddStatWelcome, 0, 0, _WelcomeInitProc, _WelcomeOKProc, NULL },
  60. { iddStatBackground,idsStatBackHeader, idsStatBackMsg, _BackgroundInitProc, _BackgroundOKProc, _BackgroundCmdProc },
  61. { iddStatFont, idsStatFontHeader, idsStatFontMsg, _FontInitProc, _FontOKProc, _FontCmdProc },
  62. { iddStatMargin, idsStatMarginHeader, idsStatMarginMsg, _MarginInitProc, _MarginOKProc, _MarginCmdProc },
  63. { iddStatFinal, idsStatFinalHeader, idsStatCompleteMsg, _FinalInitProc, _FinalOKProc, NULL }
  64. };
  65. CStatWiz::CStatWiz()
  66. {
  67. m_cRef = 1;
  68. m_iCurrentPage = 0;
  69. m_cPagesCompleted = 0;
  70. *m_rgHistory = 0;
  71. *m_wszHtmlFileName = 0;
  72. *m_wszFontFace = 0;
  73. *m_wszBkColor = 0;
  74. *m_wszFontColor = 0;
  75. *m_wszBkPictureFileName = 0;
  76. m_iFontSize = 0;
  77. m_fBold = FALSE;
  78. m_fItalic = FALSE;
  79. m_iLeftMargin = 0;
  80. m_iTopMargin = 0;
  81. m_iVertPos = 0;
  82. m_iHorzPos = 0;
  83. m_iTile = 0;
  84. m_hBigBoldFont = NULL;
  85. SetupFonts( g_hLocRes, NULL, &m_hBigBoldFont );
  86. }
  87. CStatWiz::~CStatWiz()
  88. {
  89. Assert (m_cRef == 0);
  90. if (m_hBigBoldFont != NULL)
  91. DeleteObject(m_hBigBoldFont);
  92. }
  93. ULONG CStatWiz::AddRef(VOID)
  94. {
  95. return ++m_cRef;
  96. }
  97. ULONG CStatWiz::Release(VOID)
  98. {
  99. if (--m_cRef == 0)
  100. {
  101. delete this;
  102. return 0;
  103. }
  104. return m_cRef;
  105. }
  106. int CALLBACK PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
  107. {
  108. DLGTEMPLATE *pDlg;
  109. if (uMsg == PSCB_PRECREATE)
  110. {
  111. pDlg = (DLGTEMPLATE *)lParam;
  112. if (!!(pDlg->style & DS_CONTEXTHELP))
  113. pDlg->style &= ~DS_CONTEXTHELP;
  114. }
  115. return(0);
  116. }
  117. HRESULT CStatWiz::DoWizard(HWND hwnd)
  118. {
  119. int nPageIndex,
  120. cPages,
  121. iRet;
  122. PROPSHEETPAGEW psPage = {0};
  123. PROPSHEETHEADERW psHeader = {0};
  124. HRESULT hr;
  125. HPROPSHEETPAGE rgPage[NUM_WIZARD_PAGES] = {0};
  126. INITWIZINFO rgInit[NUM_WIZARD_PAGES] = {0};
  127. WCHAR wsz[CCHMAX_STRINGRES];
  128. psPage.dwSize = sizeof(psPage);
  129. psPage.hInstance = g_hLocRes;
  130. psPage.pfnDlgProc = _GenDlgProc;
  131. hr = S_OK;
  132. cPages = 0;
  133. // create a property sheet page for each page in the wizard
  134. for (nPageIndex = 0; nPageIndex < NUM_WIZARD_PAGES; nPageIndex++)
  135. {
  136. rgInit[cPages].pPageInfo = &s_rgPageInfo[nPageIndex];
  137. rgInit[cPages].pApp = this;
  138. psPage.lParam = (LPARAM)&rgInit[cPages];
  139. psPage.pszTemplate = MAKEINTRESOURCEW(s_rgPageInfo[nPageIndex].uDlgID);
  140. psPage.pszHeaderTitle = MAKEINTRESOURCEW(s_rgPageInfo[nPageIndex].uHdrID);
  141. psPage.pszHeaderSubTitle = MAKEINTRESOURCEW(s_rgPageInfo[nPageIndex].uSubHdrID);
  142. if( nPageIndex == 0 )
  143. {
  144. psPage.dwFlags = PSP_DEFAULT | PSP_HIDEHEADER;
  145. }
  146. else
  147. psPage.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
  148. rgPage[cPages] = CreatePropertySheetPageW(&psPage);
  149. if (rgPage[cPages] == NULL)
  150. {
  151. hr = E_FAIL;
  152. break;
  153. }
  154. cPages++;
  155. }
  156. if (SUCCEEDED(hr))
  157. {
  158. psHeader.dwSize = sizeof(psHeader);
  159. psHeader.dwFlags = PSH_WIZARD | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER | PSH_USECALLBACK;
  160. psHeader.hwndParent = hwnd;
  161. psHeader.hInstance = g_hLocRes;
  162. psHeader.nPages = cPages;
  163. psHeader.phpage = rgPage;
  164. psHeader.pszbmWatermark = MAKEINTRESOURCEW(IDB_STATWIZ_WATERMARK);
  165. psHeader.pszbmHeader = MAKEINTRESOURCEW(IDB_STATWIZ_HEADER);
  166. psHeader.nStartPage = 0;
  167. psHeader.nPages = NUM_WIZARD_PAGES;
  168. psHeader.pfnCallback = PropSheetProc;
  169. iRet = (int) PropertySheetW(&psHeader);
  170. if (iRet == -1)
  171. hr = E_FAIL;
  172. else if (iRet == 0)
  173. hr = S_FALSE;
  174. else
  175. hr = S_OK;
  176. }
  177. else
  178. {
  179. for (nPageIndex = 0; nPageIndex < cPages; nPageIndex++)
  180. {
  181. if (rgPage[nPageIndex] != NULL)
  182. DestroyPropertySheetPage(rgPage[nPageIndex]);
  183. }
  184. }
  185. return(hr);
  186. }
  187. INT_PTR CALLBACK _GenDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  188. {
  189. INITWIZINFO *pInitInfo;
  190. BOOL fRet, fKeepHistory;
  191. HWND hwndParent;
  192. LPPROPSHEETPAGE lpsp;
  193. const PAGEINFO *pPageInfo;
  194. CStatWiz *pApp=0;
  195. NMHDR *lpnm;
  196. UINT iNextPage;
  197. LPNMUPDOWN lpupdwn;
  198. fRet = TRUE;
  199. hwndParent = GetParent(hDlg);
  200. switch (uMsg)
  201. {
  202. case WM_INITDIALOG:
  203. // get propsheet page struct passed in
  204. lpsp = (LPPROPSHEETPAGE)lParam;
  205. Assert(lpsp != NULL);
  206. // fetch our private page info from propsheet struct
  207. pInitInfo = (INITWIZINFO *)lpsp->lParam;
  208. Assert(pInitInfo != NULL);
  209. pApp = pInitInfo->pApp;
  210. Assert(pApp != NULL);
  211. SetWindowLongPtr(hDlg, DWLP_USER, (LPARAM)pApp);
  212. pPageInfo = pInitInfo->pPageInfo;
  213. Assert(pPageInfo != NULL);
  214. SetWindowLongPtr(hDlg, GWLP_USERDATA, (LPARAM)pPageInfo);
  215. // initialize 'back' and 'next' wizard buttons, if
  216. // page wants something different it can fix in init proc below
  217. PropSheet_SetWizButtons(hwndParent, PSWIZB_NEXT | PSWIZB_BACK);
  218. // call init proc for this page if one is specified
  219. if (pPageInfo->InitProc != NULL)
  220. {
  221. pPageInfo->InitProc(pApp, hDlg, TRUE);
  222. }
  223. return(FALSE);
  224. case WM_DRAWITEM:
  225. LPDRAWITEMSTRUCT pdis;
  226. pdis = (LPDRAWITEMSTRUCT)lParam;
  227. Assert(pdis);
  228. Color_WMDrawItem(pdis, iColorCombo, GetDlgItem(hDlg, IDC_STATWIZ_COMBOFONT)?FALSE:TRUE);
  229. break;
  230. case WM_MEASUREITEM:
  231. HDC hdc;
  232. LPMEASUREITEMSTRUCT pmis;
  233. pmis = (LPMEASUREITEMSTRUCT)lParam;
  234. hdc = GetDC(hDlg);
  235. if(hdc)
  236. {
  237. Color_WMMeasureItem(hdc, pmis, iColorCombo);
  238. ReleaseDC(hDlg, hdc);
  239. }
  240. break;
  241. case WM_NOTIFY:
  242. lpnm = (NMHDR *)lParam;
  243. pApp = (CStatWiz *)GetWindowLongPtr(hDlg, DWLP_USER);
  244. Assert(pApp != NULL);
  245. pPageInfo = (const PAGEINFO *)GetWindowLongPtr(hDlg, GWLP_USERDATA);
  246. Assert(pPageInfo != NULL);
  247. switch (lpnm->code)
  248. {
  249. case PSN_SETACTIVE:
  250. // initialize 'back' and 'next' wizard buttons, if
  251. // page wants something different it can fix in init proc below
  252. PropSheet_SetWizButtons(hwndParent, PSWIZB_NEXT | PSWIZB_BACK);
  253. // call init proc for this page if one is specified
  254. if (pPageInfo->InitProc != NULL)
  255. {
  256. // TODO: what about the return value for this????
  257. pPageInfo->InitProc(pApp, hDlg, FALSE);
  258. }
  259. pApp->m_iCurrentPage = pPageInfo->uDlgID;
  260. break;
  261. case PSN_WIZNEXT:
  262. case PSN_WIZBACK:
  263. case PSN_WIZFINISH:
  264. Assert((ULONG)pApp->m_iCurrentPage == pPageInfo->uDlgID);
  265. fKeepHistory = TRUE;
  266. iNextPage = 0;
  267. Assert(pPageInfo->OKProc != NULL) ;
  268. if (!pPageInfo->OKProc(pApp, hDlg, lpnm->code, &iNextPage, &fKeepHistory))
  269. {
  270. // stay on this page
  271. SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
  272. break;
  273. }
  274. if (lpnm->code != PSN_WIZBACK)
  275. {
  276. // 'next' pressed
  277. Assert(pApp->m_cPagesCompleted < NUM_WIZARD_PAGES);
  278. // save the current page index in the page history,
  279. // unless this page told us not to when we called
  280. // its OK proc above
  281. if (fKeepHistory)
  282. {
  283. pApp->m_rgHistory[pApp->m_cPagesCompleted] = pApp->m_iCurrentPage;
  284. pApp->m_cPagesCompleted++;
  285. }
  286. }
  287. else
  288. {
  289. // 'back' pressed
  290. Assert(pApp->m_cPagesCompleted > 0);
  291. // get the last page from the history list
  292. pApp->m_cPagesCompleted--;
  293. iNextPage = pApp->m_rgHistory[pApp->m_cPagesCompleted];
  294. }
  295. // set next page, only if 'next' or 'back' button was pressed
  296. if (lpnm->code != PSN_WIZFINISH)
  297. {
  298. // tell the prop sheet mgr what the next page to display is
  299. Assert(iNextPage != 0);
  300. SetWindowLongPtr(hDlg, DWLP_MSGRESULT, iNextPage);
  301. }
  302. break;
  303. case PSN_QUERYCANCEL:
  304. SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
  305. break;
  306. case UDN_DELTAPOS:
  307. if (lpnm->idFrom == IDC_STATWIZ_SPINLEFTMARGIN ||
  308. lpnm->idFrom == IDC_STATWIZ_SPINTOPMARGIN)
  309. {
  310. ((LPNMUPDOWN)lpnm)->iDelta *= 25;
  311. }
  312. break;
  313. }
  314. break;
  315. case WM_TIMER:
  316. if (wParam == idTimerEditChange)
  317. {
  318. pApp = (CStatWiz *)GetWindowLongPtr(hDlg, DWLP_USER);
  319. if (!pApp)
  320. return FALSE;
  321. KillTimer(hDlg, idTimerEditChange);
  322. _ShowMarginPreview(hDlg, pApp);
  323. return TRUE;
  324. }
  325. break;
  326. case WM_COMMAND:
  327. pApp = (CStatWiz *)GetWindowLongPtr(hDlg, DWLP_USER);
  328. if (!pApp)
  329. return FALSE;
  330. pPageInfo = (const PAGEINFO *)GetWindowLongPtr(hDlg, GWLP_USERDATA);
  331. Assert(pPageInfo != NULL);
  332. // if this page has a command handler proc, call it
  333. if (pPageInfo->CmdProc != NULL)
  334. {
  335. fRet = pPageInfo->CmdProc(pApp, hDlg, wParam, lParam);
  336. }
  337. break;
  338. default:
  339. fRet = FALSE;
  340. break;
  341. }
  342. return(fRet);
  343. }
  344. const static WCHAR c_wszUrlFile[] = L"file://";
  345. BOOL _CopyFileToStationeryDir(LPWSTR pwszFileSrc)
  346. {
  347. BOOL fRet = FALSE;
  348. WCHAR wszDestFile[MAX_PATH];
  349. LPWSTR pwsz=0;
  350. // skip file://
  351. pwsz = StrStrIW(pwszFileSrc, c_wszUrlFile);
  352. if (pwsz)
  353. {
  354. pwsz = pwszFileSrc + lstrlenW(c_wszUrlFile);
  355. if (*pwsz == L'/')
  356. pwsz++;
  357. }
  358. else
  359. pwsz = pwszFileSrc;
  360. StrCpyNW(wszDestFile, pwsz, ARRAYSIZE(wszDestFile));
  361. PathStripPathW(wszDestFile);
  362. InsertStationeryDir(wszDestFile);
  363. if (StrCmpIW(pwsz, wszDestFile) && (CopyFileWrapW(pwsz, wszDestFile, FALSE)))
  364. fRet = TRUE;
  365. return fRet;
  366. }
  367. BOOL CALLBACK _BackgroundInitProc(CStatWiz *pApp, HWND hDlg, BOOL fFirstInit)
  368. {
  369. Assert(pApp != NULL);
  370. if (fFirstInit)
  371. {
  372. HrFillStationeryCombo(GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE), TRUE, NULL);
  373. _FillCombo(GetDlgItem(hDlg, IDC_STATWIZ_VERTCOMBO), idsStatWizVertPos);
  374. _FillCombo(GetDlgItem(hDlg, IDC_STATWIZ_HORZCOMBO), idsStatWizHorzPos);
  375. _FillCombo(GetDlgItem(hDlg, IDC_STATWIZ_TILECOMBO), idsStatWizTile);
  376. HrCreateComboColor(GetDlgItem(hDlg, IDC_STATWIZ_COMBOCOLOR));
  377. CheckDlgButton(hDlg, IDC_STATWIZ_CHECKPICTURE, BST_CHECKED);
  378. _EnableBackgroundWindows(hDlg, IDC_STATWIZ_CHECKPICTURE, TRUE);
  379. _EnableBackgroundWindows(hDlg, IDC_STATWIZ_CHECKCOLOR, FALSE);
  380. if (*pApp->m_wszBkColor)
  381. {
  382. Assert(*pApp->m_wszBkPictureFileName == 0);
  383. CheckDlgButton(hDlg, IDC_STATWIZ_CHECKCOLOR, BST_CHECKED);
  384. _EnableBackgroundWindows(hDlg, IDC_STATWIZ_CHECKCOLOR, TRUE);
  385. }
  386. else if (*pApp->m_wszBkPictureFileName)
  387. {
  388. StationeryComboBox_SelectString(GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE), pApp->m_wszBkPictureFileName);
  389. }
  390. else
  391. {
  392. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE), 0);
  393. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOCOLOR), 0);
  394. }
  395. GetWindowTextWrapW(GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE), pApp->m_wszBkPictureFileName, ARRAYSIZE(pApp->m_wszBkPictureFileName));
  396. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_VERTCOMBO),pApp->m_iVertPos);
  397. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_HORZCOMBO),pApp->m_iHorzPos);
  398. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_TILECOMBO),pApp->m_iTile);
  399. _ShowBackgroundPreview(hDlg, pApp);
  400. }
  401. return(TRUE);
  402. }
  403. BOOL CALLBACK _BackgroundCmdProc(CStatWiz *pApp, HWND hDlg, WPARAM wParam, LPARAM lParam)
  404. {
  405. UINT id, code;
  406. id = GET_WM_COMMAND_ID(wParam,lParam);
  407. switch (id)
  408. {
  409. case IDC_STATWIZ_CHECKPICTURE:
  410. case IDC_STATWIZ_CHECKCOLOR:
  411. code = GET_WM_COMMAND_CMD(wParam, lParam);
  412. if (code == BN_CLICKED)
  413. {
  414. _EnableBackgroundWindows(hDlg, id, IsDlgButtonChecked(hDlg, id));
  415. _ShowBackgroundPreview(hDlg, pApp);
  416. }
  417. return TRUE;
  418. case IDC_STATWIZ_COMBOPICTURE:
  419. case IDC_STATWIZ_COMBOCOLOR:
  420. case IDC_STATWIZ_HORZCOMBO:
  421. case IDC_STATWIZ_VERTCOMBO:
  422. case IDC_STATWIZ_TILECOMBO:
  423. if (HIWORD(wParam) == CBN_SELCHANGE)
  424. _ShowBackgroundPreview(hDlg, pApp);
  425. return TRUE;
  426. case IDC_STATWIZ_BROWSEBACKGROUND:
  427. HrBrowsePicture(hDlg, GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE));
  428. _ShowBackgroundPreview(hDlg, pApp);
  429. return TRUE;
  430. default:
  431. return FALSE;
  432. }
  433. return FALSE;
  434. }
  435. void _ShowBackgroundPreview(HWND hDlg, LPSTATWIZ pApp)
  436. {
  437. HWND hwnd;
  438. INT cch;
  439. INT iCurSel;
  440. WCHAR wszBuf[MAX_PATH];
  441. *wszBuf = 0;
  442. pApp->m_wszBkColor[0]=0;
  443. pApp->m_wszBkPictureFileName[0]=0;
  444. if( (iCurSel = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_VERTCOMBO)) ) != CB_ERR )
  445. {
  446. Assert( iCurSel >= 0 && iCurSel < 3 );
  447. pApp->m_iVertPos = iCurSel;
  448. }
  449. if( (iCurSel = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_HORZCOMBO)) ) != CB_ERR )
  450. {
  451. Assert( iCurSel >= 0 && iCurSel < 3 );
  452. pApp->m_iHorzPos = iCurSel;
  453. }
  454. if( (iCurSel = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_TILECOMBO)) ) != CB_ERR )
  455. {
  456. Assert( iCurSel >= 0 && iCurSel < 4 );
  457. pApp->m_iTile = iCurSel;
  458. }
  459. if (IsDlgButtonChecked(hDlg, IDC_STATWIZ_CHECKPICTURE))
  460. {
  461. hwnd = GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE);
  462. cch = GetWindowTextLength(hwnd);
  463. if (cch != 0)
  464. GetWindowTextWrapW(hwnd, pApp->m_wszBkPictureFileName, ARRAYSIZE(pApp->m_wszBkPictureFileName));
  465. }
  466. if( IsDlgButtonChecked(hDlg, IDC_STATWIZ_CHECKCOLOR) )
  467. {
  468. if (SUCCEEDED(HrFromIDToRBG(ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOCOLOR)), wszBuf, TRUE)))
  469. StrCpyNW(pApp->m_wszBkColor, wszBuf, ARRAYSIZE(pApp->m_wszBkColor));
  470. }
  471. ShowPreview(GetDlgItem(hDlg, IDC_STATWIZ_PREVIEWBACKGROUND), pApp, NULL);
  472. return;
  473. }
  474. void _EnableBackgroundWindows(HWND hDlg, int id, BOOL enable)
  475. {
  476. if( id == IDC_STATWIZ_CHECKPICTURE )
  477. {
  478. EnableWindow(GetDlgItem(hDlg, IDC_STATWIZ_BROWSEBACKGROUND), enable);
  479. EnableWindow(GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE), enable);
  480. EnableWindow(GetDlgItem(hDlg, IDC_STATWIZ_VERTCOMBO), enable);
  481. EnableWindow(GetDlgItem(hDlg, IDC_STATWIZ_HORZCOMBO), enable);
  482. EnableWindow(GetDlgItem(hDlg, IDC_STATWIZ_TILECOMBO), enable);
  483. }
  484. else if ( id == IDC_STATWIZ_CHECKCOLOR)
  485. EnableWindow(GetDlgItem(hDlg, IDC_STATWIZ_COMBOCOLOR), enable);
  486. }
  487. BOOL CALLBACK _BackgroundOKProc(CStatWiz *pApp, HWND hDlg, UINT code, UINT *puNextPage, BOOL *pfKeepHistory)
  488. {
  489. BOOL fForward;
  490. HWND hwnd;
  491. int cch;
  492. WCHAR wszBuf[MAX_PATH];
  493. Assert(pApp != NULL);
  494. fForward = code != PSN_WIZBACK;
  495. if (fForward)
  496. {
  497. if (IsDlgButtonChecked(hDlg, IDC_STATWIZ_CHECKPICTURE))
  498. {
  499. hwnd = GetDlgItem(hDlg, IDC_STATWIZ_COMBOPICTURE);
  500. cch = GetWindowTextLength(hwnd);
  501. if (cch == 0)
  502. {
  503. AthMessageBoxW(hDlg, MAKEINTRESOURCEW(idsStationery), MAKEINTRESOURCEW(idsBackgroundEmptyWarning),
  504. NULL, MB_OK | MB_ICONEXCLAMATION);
  505. SetFocus(hDlg);
  506. return (FALSE);
  507. }
  508. GetWindowTextWrapW(hwnd, pApp->m_wszBkPictureFileName, ARRAYSIZE(pApp->m_wszBkPictureFileName));
  509. }
  510. if( IsDlgButtonChecked(hDlg, IDC_STATWIZ_CHECKCOLOR) )
  511. {
  512. if( SUCCEEDED( HrFromIDToRBG(ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOCOLOR)), wszBuf, TRUE)) )
  513. {
  514. StrCpyNW(pApp->m_wszBkColor, wszBuf, ARRAYSIZE(pApp->m_wszBkColor));
  515. }
  516. }
  517. *puNextPage = iddStatFont;
  518. }
  519. return(TRUE);
  520. }
  521. BOOL CALLBACK _FontInitProc(CStatWiz *pApp, HWND hDlg, BOOL fFirstInit)
  522. {
  523. HWND hIDC;
  524. FARPROC pfnFontSampleWndProc;
  525. Assert(pApp != NULL);
  526. if (fFirstInit)
  527. {
  528. FillFontNames(GetDlgItem(hDlg, IDC_STATWIZ_COMBOFONT));
  529. HrCreateComboColor(GetDlgItem(hDlg, IDC_STATWIZ_COMBOFONTCOLOR));
  530. FillSizes(GetDlgItem(hDlg, IDC_STATWIZ_COMBOSIZE));
  531. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOFONT), 0);
  532. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOSIZE), 1);
  533. ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOFONTCOLOR), 0);
  534. hIDC = GetDlgItem(hDlg, IDC_STATWIZ_PREVIEWFONT);
  535. pfnFontSampleWndProc = (FARPROC)SetWindowLongPtr(hIDC, GWLP_WNDPROC, (LPARAM)_FontSampleSubProc);
  536. SetWindowLongPtr(hIDC, GWLP_USERDATA, (LPARAM)pfnFontSampleWndProc);
  537. _ShowFontPreview(hDlg, pApp);
  538. }
  539. return(TRUE);
  540. }
  541. LRESULT CALLBACK _FontSampleSubProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  542. {
  543. LPSTATWIZ pApp=0;
  544. WNDPROC pfn;
  545. HDC hdc;
  546. PAINTSTRUCT ps;
  547. pApp = (LPSTATWIZ)GetWindowLongPtr(GetParent(hwnd), DWLP_USER);
  548. Assert(pApp);
  549. if (msg == WM_PAINT)
  550. {
  551. hdc=BeginPaint (hwnd, &ps);
  552. _PaintFontSample(hwnd, hdc, pApp);
  553. EndPaint (hwnd, &ps);
  554. return(0);
  555. }
  556. pfn = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA);
  557. Assert(pfn != NULL);
  558. return(CallWindowProc(pfn, hwnd, msg, wParam, lParam));
  559. }
  560. void _PaintFontSample(HWND hwnd, HDC hdc, LPSTATWIZ pApp)
  561. {
  562. int dcSave=SaveDC(hdc);
  563. RECT rc;
  564. SIZE rSize;
  565. INT x, y, cbSample;
  566. HFONT hFont, hOldFont;
  567. LOGFONT lf={0};
  568. TCHAR szBuf[LF_FACESIZE+1];
  569. DWORD dw;
  570. INT rgb;
  571. BOOL fBold=FALSE,
  572. fItalic=FALSE,
  573. fUnderline=FALSE;
  574. INT yPerInch = GetDeviceCaps(hdc, LOGPIXELSY);
  575. *szBuf = 0;
  576. lf.lfHeight =-(INT)((pApp->m_iFontSize*10*2*yPerInch)/1440);
  577. lf.lfWeight = pApp->m_fBold ? FW_BOLD : FW_NORMAL;
  578. lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
  579. lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  580. lf.lfQuality = DRAFT_QUALITY;
  581. lf.lfCharSet = DEFAULT_CHARSET;
  582. lf.lfItalic = !!pApp->m_fItalic;
  583. lf.lfUnderline = FALSE;
  584. if (*pApp->m_wszFontFace != 0)
  585. {
  586. WideCharToMultiByte(CP_ACP, 0, pApp->m_wszFontFace, -1, lf.lfFaceName, ARRAYSIZE(lf.lfFaceName), NULL, NULL);
  587. }
  588. else
  589. {
  590. if(LoadString(g_hLocRes, idsComposeFontFace, szBuf, LF_FACESIZE))
  591. StrCpyN(lf.lfFaceName, szBuf, ARRAYSIZE(lf.lfFaceName));
  592. }
  593. hFont=CreateFontIndirect(&lf);
  594. hOldFont = (HFONT)SelectObject (hdc, hFont);
  595. GetClientRect(hwnd, &rc);
  596. DrawEdge (hdc, &rc, EDGE_SUNKEN, BF_RECT);
  597. InflateRect(&rc, -2, -2);
  598. FillRect (hdc, &rc, GetSysColorBrush(COLOR_3DFACE));
  599. // pull in the drawing rect by 2 pixels all around
  600. InflateRect(&rc, -2, -2);
  601. SetBkMode (hdc, TRANSPARENT); // So the background shows through the text.
  602. HrGetRBGFromString(&rgb, pApp->m_wszFontColor);
  603. rgb = ((rgb & 0x00ff0000) >> 16 ) | (rgb & 0x0000ff00) | ((rgb & 0x000000ff) << 16);
  604. SetTextColor(hdc, rgb);
  605. *szBuf = 0;
  606. LoadString(g_hLocRes, idsFontSample, szBuf, LF_FACESIZE);
  607. GetTextExtentPoint32 (hdc, szBuf, lstrlen(szBuf), &rSize);
  608. x = rc.left + (((rc.right-rc.left) / 2) - (rSize.cx / 2));
  609. y = rc.top + (((rc.bottom-rc.top) / 2) - (rSize.cy / 2));
  610. ExtTextOut (hdc, x, y, ETO_CLIPPED, &rc, szBuf, lstrlen(szBuf), NULL);
  611. DeleteObject(SelectObject (hdc, hOldFont));
  612. RestoreDC(hdc, dcSave);
  613. }
  614. void _ShowFontPreview(HWND hDlg, LPSTATWIZ pApp)
  615. {
  616. TCHAR szBuf[COLOR_SIZE];
  617. INT id;
  618. HRESULT hr;
  619. GetWindowTextWrapW(GetDlgItem(hDlg, IDC_STATWIZ_COMBOFONT), pApp->m_wszFontFace, ARRAYSIZE(pApp->m_wszFontFace));
  620. id = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOSIZE));
  621. if (id >= 0)
  622. pApp->m_iFontSize = HTMLSizeToPointSize(id + 1);
  623. id = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_STATWIZ_COMBOFONTCOLOR));
  624. HrFromIDToRBG(id, pApp->m_wszFontColor, FALSE);
  625. pApp->m_fBold = IsDlgButtonChecked(hDlg, IDC_STATWIZ_CHECKBOLD);
  626. pApp->m_fItalic = IsDlgButtonChecked(hDlg, IDC_STATWIZ_CHECKITALIC);
  627. InvalidateRect(GetDlgItem(hDlg, IDC_STATWIZ_PREVIEWFONT), NULL, TRUE);
  628. }
  629. BOOL CALLBACK _FontCmdProc(CStatWiz *pApp, HWND hDlg, WPARAM wParam, LPARAM lParam)
  630. {
  631. UINT id, code;
  632. id = GET_WM_COMMAND_ID(wParam,lParam);
  633. switch (id)
  634. {
  635. case IDC_STATWIZ_COMBOFONT:
  636. case IDC_STATWIZ_COMBOSIZE:
  637. case IDC_STATWIZ_COMBOFONTCOLOR:
  638. if (HIWORD(wParam) == CBN_SELCHANGE)
  639. _ShowFontPreview(hDlg, pApp);
  640. return TRUE;
  641. case IDC_STATWIZ_CHECKBOLD:
  642. case IDC_STATWIZ_CHECKITALIC:
  643. code = GET_WM_COMMAND_CMD(wParam, lParam);
  644. if (code == BN_CLICKED)
  645. _ShowFontPreview(hDlg, pApp);
  646. return TRUE;
  647. default:
  648. return FALSE;
  649. }
  650. return FALSE;
  651. }
  652. BOOL CALLBACK _FontOKProc(CStatWiz *pApp, HWND hDlg, UINT code, UINT *puNextPage, BOOL *pfKeepHistory)
  653. {
  654. Assert(pApp != NULL);
  655. BOOL fForward;
  656. fForward = code != PSN_WIZBACK;
  657. if (fForward)
  658. {
  659. *puNextPage = iddStatMargin;
  660. }
  661. return(TRUE);
  662. }
  663. BOOL CALLBACK _MarginInitProc(CStatWiz *pApp, HWND hDlg, BOOL fFirstInit)
  664. {
  665. Assert(pApp != NULL);
  666. TCHAR szBuf[16];
  667. if (fFirstInit)
  668. {
  669. // limit the text to 7 characters
  670. SendDlgItemMessage( hDlg, IDC_STATWIZ_EDITLEFTMARGIN, EM_LIMITTEXT, 7, 0);
  671. SendDlgItemMessage( hDlg, IDC_STATWIZ_EDITTOPMARGIN, EM_LIMITTEXT, 7, 0);
  672. SendDlgItemMessage( hDlg, IDC_STATWIZ_SPINLEFTMARGIN, UDM_SETRANGE, 0L, MAKELONG(LMARGIN_MAX, MARGIN_MIN));
  673. SendDlgItemMessage( hDlg, IDC_STATWIZ_SPINTOPMARGIN, UDM_SETRANGE, 0L, MAKELONG(TMARGIN_MAX, MARGIN_MIN));
  674. SendDlgItemMessage( hDlg, IDC_STATWIZ_SPINLEFTMARGIN, UDM_SETPOS, 0L, (LPARAM) MAKELONG((short) 0, 0));
  675. SendDlgItemMessage( hDlg, IDC_STATWIZ_SPINTOPMARGIN, UDM_SETPOS, 0L, (LPARAM) MAKELONG((short) 0, 0));
  676. }
  677. _ShowMarginPreview(hDlg, pApp);
  678. return(TRUE);
  679. }
  680. void _ShowMarginPreview(HWND hDlg, LPSTATWIZ pApp)
  681. {
  682. TCHAR szBuf[MAX_PATH];
  683. *szBuf=0;
  684. if( GetWindowText(GetDlgItem(hDlg, IDC_STATWIZ_EDITLEFTMARGIN), szBuf, sizeof(szBuf)) > 0)
  685. pApp->m_iLeftMargin = StrToInt(szBuf);
  686. else
  687. pApp->m_iLeftMargin = 0;
  688. if( GetWindowText(GetDlgItem(hDlg, IDC_STATWIZ_EDITTOPMARGIN), szBuf, sizeof(szBuf)) > 0 )
  689. pApp->m_iTopMargin = StrToInt(szBuf);
  690. else
  691. pApp->m_iTopMargin = StrToInt(szBuf);
  692. ShowPreview(GetDlgItem(hDlg, IDC_STATWIZ_PREVIEWMARGIN), pApp, idsStationerySample);
  693. }
  694. BOOL CALLBACK _MarginCmdProc(CStatWiz *pApp, HWND hDlg, WPARAM wParam, LPARAM lParam)
  695. {
  696. UINT id, code;
  697. WORD cmd;
  698. id = GET_WM_COMMAND_ID(wParam,lParam);
  699. cmd = GET_WM_COMMAND_CMD(wParam,lParam);
  700. switch (cmd)
  701. {
  702. case EN_CHANGE:
  703. KillTimer(hDlg, idTimerEditChange);
  704. SetTimer(hDlg, idTimerEditChange, 200, NULL);
  705. return TRUE;
  706. default:
  707. return FALSE;
  708. }
  709. return FALSE;
  710. }
  711. BOOL CALLBACK _MarginOKProc(CStatWiz *pApp, HWND hDlg, UINT code, UINT *puNextPage, BOOL *pfKeepHistory)
  712. {
  713. Assert(pApp != NULL);
  714. BOOL fForward;
  715. fForward = code != PSN_WIZBACK;
  716. // this also stores the values of the fields in the event they are invalid and need to be updated
  717. _ShowMarginPreview(hDlg, pApp);
  718. if (fForward)
  719. {
  720. *puNextPage = iddStatFinal;
  721. }
  722. return(TRUE);
  723. }
  724. void _ShowFinalPreview(HWND hDlg, LPSTATWIZ pApp)
  725. {
  726. // in case we want to do more fancy stuff with final preview I put this is separate
  727. // function
  728. ShowPreview(GetDlgItem(hDlg, IDC_STATWIZ_PREVIEWFINAL), pApp, idsStationerySample);
  729. }
  730. BOOL CALLBACK _FinalInitProc(CStatWiz *pApp, HWND hDlg, BOOL fFirstInit)
  731. {
  732. Assert(pApp != NULL);
  733. _ShowFinalPreview(hDlg,pApp);
  734. // looks better if buttons initialize as page is being shown rather than before (IMHO)
  735. PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_FINISH | PSWIZB_BACK);
  736. if (fFirstInit)
  737. {
  738. SendDlgItemMessage(hDlg, IDC_STATWIZ_EDITNAME, EM_LIMITTEXT, 60, 0);
  739. }
  740. return(TRUE);
  741. }
  742. BOOL CALLBACK _FinalOKProc(CStatWiz *pApp, HWND hDlg, UINT code, UINT *puNextPage, BOOL *pfKeepHistory)
  743. {
  744. int cch;
  745. HWND hwnd;
  746. BOOL fForward;
  747. WCHAR wszBuf[MAX_PATH];
  748. HANDLE hFile;
  749. Assert(pApp != NULL);
  750. fForward = code != PSN_WIZBACK;
  751. if (fForward)
  752. {
  753. // check to see if file name is valid
  754. hwnd = GetDlgItem(hDlg, IDC_STATWIZ_EDITNAME);
  755. cch = GetWindowTextWrapW(hwnd, wszBuf, ARRAYSIZE(wszBuf));
  756. if (cch == 0 || FIsEmptyW(wszBuf))
  757. {
  758. AthMessageBoxW(hDlg, MAKEINTRESOURCEW(idsStationery), MAKEINTRESOURCEW(idsStationeryEmptyWarning),
  759. NULL, MB_OK | MB_ICONEXCLAMATION);
  760. SendMessage(hwnd, EM_SETSEL, 0, -1);
  761. SetFocus(hwnd);
  762. return(FALSE);
  763. }
  764. else
  765. {
  766. LPWSTR pwszExt = PathFindExtensionW( wszBuf );
  767. if ( pwszExt != NULL )
  768. {
  769. if( PathIsHTMLFileW( wszBuf ) )
  770. {
  771. DebugTrace("this is an html file\n");
  772. }
  773. else
  774. {
  775. PathRemoveExtensionW( wszBuf );
  776. if( !SetWindowTextWrapW(hwnd, wszBuf) )
  777. DebugTrace("could not set text\n");
  778. }
  779. }
  780. }
  781. if (IsValidCreateFileName(wszBuf))
  782. {
  783. AthMessageBoxW(hDlg, MAKEINTRESOURCEW(idsStationery), MAKEINTRESOURCEW(idsStationeryExistWarning),
  784. NULL, MB_OK | MB_ICONEXCLAMATION);
  785. SendMessage(hwnd, EM_SETSEL, 0, -1);
  786. SetFocus(hwnd);
  787. return(FALSE);
  788. }
  789. StrCpyNW(pApp->m_wszHtmlFileName, wszBuf, ARRAYSIZE(pApp->m_wszHtmlFileName));
  790. hFile = CreateFileWrapW(pApp->m_wszHtmlFileName,GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
  791. if (hFile != INVALID_HANDLE_VALUE)
  792. {
  793. FillHtmlToFile(pApp, hFile, 0, FALSE);
  794. CloseHandle(hFile);
  795. if (*pApp->m_wszBkPictureFileName)
  796. {
  797. InsertStationeryDir(pApp->m_wszBkPictureFileName);
  798. _CopyFileToStationeryDir(pApp->m_wszBkPictureFileName);
  799. }
  800. }
  801. }
  802. return(TRUE);
  803. }
  804. BOOL CALLBACK _WelcomeOKProc(CStatWiz *pApp, HWND hDlg, UINT code, UINT *puNextPage, BOOL *pfKeepHistory)
  805. {
  806. Assert(pApp != NULL);
  807. BOOL fForward;
  808. fForward = code != PSN_WIZBACK;
  809. if (fForward)
  810. {
  811. *puNextPage = iddStatBackground;
  812. }
  813. return(TRUE);
  814. }
  815. BOOL CALLBACK _WelcomeInitProc(CStatWiz *pApp, HWND hDlg, BOOL fFirstInit)
  816. {
  817. Assert(pApp != NULL);
  818. PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_NEXT);
  819. if( fFirstInit)
  820. {
  821. SetControlFont( pApp->m_hBigBoldFont, hDlg, IDC_STATWIZ_BIGBOLDTITLE);
  822. }
  823. return(TRUE);
  824. }
  825. BOOL _FillCombo(HWND hComboDlg, ULONG ulStrId)
  826. {
  827. TCHAR szBuf[CCHMAX_STRINGRES];
  828. LPTSTR pch;
  829. LoadStringReplaceSpecial(ulStrId, szBuf, sizeof(szBuf) );
  830. pch = szBuf;
  831. while(*pch != 0 )
  832. {
  833. if( SendMessage(hComboDlg, CB_ADDSTRING, 0, (LPARAM)pch) < 0 )
  834. return FALSE;
  835. pch+=lstrlen(pch)+1;
  836. }
  837. return TRUE;
  838. }
  839. // from wiz97 example on MSDN
  840. void
  841. SetupFonts(
  842. IN HINSTANCE hInstance,
  843. IN HWND hwnd,
  844. IN HFONT *pBigBoldFont
  845. )
  846. {
  847. //
  848. // Create the fonts we need based on the dialog font
  849. //
  850. NONCLIENTMETRICS ncm;
  851. ncm.cbSize = sizeof(ncm);
  852. SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
  853. LOGFONT BigBoldLogFont = ncm.lfMessageFont;
  854. //
  855. // Create Big Bold Font and Bold Font
  856. //
  857. BigBoldLogFont.lfWeight = FW_BOLD;
  858. TCHAR FontSizeString[MAX_PATH];
  859. INT FontSize;
  860. //
  861. // Load size and name from resources, since these may change
  862. // from locale to locale based on the size of the system font, etc.
  863. //
  864. StrCpyN(BigBoldLogFont.lfFaceName,TEXT("MS Shell Dlg"), ARRAYSIZE(BigBoldLogFont.lfFaceName));
  865. FontSize = 12;
  866. HDC hdc = GetDC( hwnd );
  867. if( hdc )
  868. {
  869. BigBoldLogFont.lfHeight = 0 - (GetDeviceCaps(hdc,LOGPIXELSY) * FontSize / 72);
  870. *pBigBoldFont = CreateFontIndirect(&BigBoldLogFont);
  871. ReleaseDC(hwnd,hdc);
  872. }
  873. }
  874. VOID
  875. SetControlFont(
  876. IN HFONT hFont,
  877. IN HWND hwnd,
  878. IN INT nId)
  879. {
  880. if( hFont )
  881. {
  882. HWND hwndControl = GetDlgItem(hwnd, nId);
  883. if( hwndControl )
  884. {
  885. SetWindowFont(hwndControl, hFont, TRUE);
  886. }
  887. }
  888. }