1// Windows/Control/PropertyPage.cpp
2
3#include "StdAfx.h"
4
5#ifndef _UNICODE
6#include "../../Common/StringConvert.h"
7#endif
8
9#include "PropertyPage.h"
10
11extern HINSTANCE g_hInstance;
12#ifndef _UNICODE
13extern bool g_IsNT;
14#endif
15
16namespace NWindows {
17namespace NControl {
18
19static INT_PTR APIENTRY MyProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
20{
21  CWindow tempDialog(dialogHWND);
22  if (message == WM_INITDIALOG)
23    tempDialog.SetUserDataLongPtr(((PROPSHEETPAGE *)lParam)->lParam);
24  CDialog *dialog = (CDialog *)(tempDialog.GetUserDataLongPtr());
25  if (dialog == NULL)
26    return FALSE;
27  if (message == WM_INITDIALOG)
28    dialog->Attach(dialogHWND);
29  try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); }
30  catch(...) { return TRUE; }
31}
32
33bool CPropertyPage::OnNotify(UINT /* controlID */, LPNMHDR lParam)
34{
35  switch (lParam->code)
36  {
37    case PSN_APPLY: SetMsgResult(OnApply(LPPSHNOTIFY(lParam))); break;
38    case PSN_KILLACTIVE: SetMsgResult(BoolToBOOL(OnKillActive(LPPSHNOTIFY(lParam)))); break;
39    case PSN_SETACTIVE: SetMsgResult(OnSetActive(LPPSHNOTIFY(lParam))); break;
40    case PSN_RESET: OnReset(LPPSHNOTIFY(lParam)); break;
41    case PSN_HELP: OnNotifyHelp(LPPSHNOTIFY(lParam)); break;
42    default: return false;
43  }
44  return true;
45}
46
47INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndParent, const UString &title)
48{
49  #ifndef _UNICODE
50  AStringVector titles;
51  #endif
52  #ifndef _UNICODE
53  CRecordVector<PROPSHEETPAGEA> pagesA;
54  #endif
55  CRecordVector<PROPSHEETPAGEW> pagesW;
56
57  unsigned i;
58  #ifndef _UNICODE
59  for (i = 0; i < pagesInfo.Size(); i++)
60    titles.Add(GetSystemString(pagesInfo[i].Title));
61  #endif
62
63  for (i = 0; i < pagesInfo.Size(); i++)
64  {
65    const CPageInfo &pageInfo = pagesInfo[i];
66    #ifndef _UNICODE
67    {
68      PROPSHEETPAGE page;
69      page.dwSize = sizeof(page);
70      page.dwFlags = PSP_HASHELP;
71      page.hInstance = g_hInstance;
72      page.pszTemplate = MAKEINTRESOURCE(pageInfo.ID);
73      page.pszIcon = NULL;
74      page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
75
76      if (titles[i].IsEmpty())
77        page.pszTitle = NULL;
78      else
79      {
80        page.dwFlags |= PSP_USETITLE;
81        page.pszTitle = titles[i];
82      }
83      page.lParam = (LPARAM)pageInfo.Page;
84      page.pfnCallback = NULL;
85      pagesA.Add(page);
86    }
87    #endif
88    {
89      PROPSHEETPAGEW page;
90      page.dwSize = sizeof(page);
91      page.dwFlags = PSP_HASHELP;
92      page.hInstance = g_hInstance;
93      page.pszTemplate = MAKEINTRESOURCEW(pageInfo.ID);
94      page.pszIcon = NULL;
95      page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
96
97      if (pageInfo.Title.IsEmpty())
98        page.pszTitle = NULL;
99      else
100      {
101        page.dwFlags |= PSP_USETITLE;
102        page.pszTitle = pageInfo.Title;
103      }
104      page.lParam = (LPARAM)pageInfo.Page;
105      page.pfnCallback = NULL;
106      pagesW.Add(page);
107    }
108  }
109
110  #ifndef _UNICODE
111  if (!g_IsNT)
112  {
113    PROPSHEETHEADER sheet;
114    sheet.dwSize = sizeof(sheet);
115    sheet.dwFlags = PSH_PROPSHEETPAGE;
116    sheet.hwndParent = hwndParent;
117    sheet.hInstance = g_hInstance;
118    AString titleA = GetSystemString(title);
119    sheet.pszCaption = titleA;
120    sheet.nPages = pagesInfo.Size();
121    sheet.nStartPage = 0;
122    sheet.ppsp = &pagesA.Front();
123    sheet.pfnCallback = NULL;
124    return ::PropertySheetA(&sheet);
125  }
126  else
127  #endif
128  {
129    PROPSHEETHEADERW sheet;
130    sheet.dwSize = sizeof(sheet);
131    sheet.dwFlags = PSH_PROPSHEETPAGE;
132    sheet.hwndParent = hwndParent;
133    sheet.hInstance = g_hInstance;
134    sheet.pszCaption = title;
135    sheet.nPages = pagesInfo.Size();
136    sheet.nStartPage = 0;
137    sheet.ppsp = &pagesW.Front();
138    sheet.pfnCallback = NULL;
139    return ::PropertySheetW(&sheet);
140  }
141}
142
143}}
144