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
20#ifdef Z7_OLD_WIN_SDK
21  BOOL
22#else
23  INT_PTR
24#endif
25APIENTRY MyProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
26{
27  CWindow tempDialog(dialogHWND);
28  if (message == WM_INITDIALOG)
29    tempDialog.SetUserDataLongPtr(((PROPSHEETPAGE *)lParam)->lParam);
30  CDialog *dialog = (CDialog *)(tempDialog.GetUserDataLongPtr());
31  if (dialog == NULL)
32    return FALSE;
33  if (message == WM_INITDIALOG)
34    dialog->Attach(dialogHWND);
35  try { return BoolToBOOL(dialog->OnMessage(message, wParam, lParam)); }
36  catch(...) { return TRUE; }
37}
38
39bool CPropertyPage::OnNotify(UINT /* controlID */, LPNMHDR lParam)
40{
41  switch (lParam->code)
42  {
43    case PSN_APPLY: SetMsgResult(OnApply2(LPPSHNOTIFY(lParam))); break;
44    case PSN_KILLACTIVE: SetMsgResult(BoolToBOOL(OnKillActive2(LPPSHNOTIFY(lParam)))); break;
45    case PSN_SETACTIVE: SetMsgResult(OnSetActive2(LPPSHNOTIFY(lParam))); break;
46    case PSN_RESET: OnReset2(LPPSHNOTIFY(lParam)); break;
47    case PSN_HELP: OnNotifyHelp2(LPPSHNOTIFY(lParam)); break;
48    default: return false;
49  }
50  return true;
51}
52
53/*
54PROPSHEETPAGE fields depend from
55#if   (_WIN32_WINNT >= 0x0600)
56#elif (_WIN32_WINNT >= 0x0501)
57#elif (_WIN32_IE >= 0x0400)
58PROPSHEETHEADER fields depend from
59#if (_WIN32_IE >= 0x0400)
60*/
61#if defined(PROPSHEETPAGEA_V1_SIZE) && !defined(Z7_OLD_WIN_SDK)
62#ifndef _UNICODE
63#define my_compatib_PROPSHEETPAGEA PROPSHEETPAGEA_V1
64#endif
65#define my_compatib_PROPSHEETPAGEW PROPSHEETPAGEW_V1
66#else
67// for old mingw:
68#ifndef _UNICODE
69#define my_compatib_PROPSHEETPAGEA PROPSHEETPAGEA
70#endif
71#define my_compatib_PROPSHEETPAGEW PROPSHEETPAGEW
72#endif
73
74INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndParent, const UString &title)
75{
76  unsigned i;
77  #ifndef _UNICODE
78  AStringVector titles;
79  for (i = 0; i < pagesInfo.Size(); i++)
80    titles.Add(GetSystemString(pagesInfo[i].Title));
81  CRecordVector<my_compatib_PROPSHEETPAGEA> pagesA;
82  #endif
83  CRecordVector<my_compatib_PROPSHEETPAGEW> pagesW;
84
85  for (i = 0; i < pagesInfo.Size(); i++)
86  {
87    const CPageInfo &pageInfo = pagesInfo[i];
88    #ifndef _UNICODE
89    {
90      my_compatib_PROPSHEETPAGEA page;
91      memset(&page, 0, sizeof(page));
92      page.dwSize = sizeof(page);
93      page.dwFlags = PSP_HASHELP;
94      page.hInstance = g_hInstance;
95      page.pszTemplate = MAKEINTRESOURCEA(pageInfo.ID);
96      // page.pszIcon = NULL;
97      page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
98
99      if (!titles[i].IsEmpty())
100      {
101        page.pszTitle = titles[i];
102        page.dwFlags |= PSP_USETITLE;
103      }
104      // else page.pszTitle = NULL;
105      page.lParam = (LPARAM)pageInfo.Page;
106      // page.pfnCallback = NULL;
107      pagesA.Add(page);
108    }
109    #endif
110    {
111      my_compatib_PROPSHEETPAGEW page;
112      memset(&page, 0, sizeof(page));
113      page.dwSize = sizeof(page);
114      page.dwFlags = PSP_HASHELP;
115      page.hInstance = g_hInstance;
116      page.pszTemplate = MAKEINTRESOURCEW(pageInfo.ID);
117      // page.pszIcon = NULL;
118      page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
119
120      if (!pageInfo.Title.IsEmpty())
121      {
122        page.pszTitle = pageInfo.Title;
123        page.dwFlags |= PSP_USETITLE;
124      }
125      // else page.pszTitle = NULL;
126      page.lParam = (LPARAM)pageInfo.Page;
127      // page.pfnCallback = NULL;
128      pagesW.Add(page);
129    }
130  }
131
132  #ifndef _UNICODE
133  if (!g_IsNT)
134  {
135    PROPSHEETHEADERA sheet;
136    sheet.dwSize = sizeof(sheet);
137    sheet.dwFlags = PSH_PROPSHEETPAGE;
138    sheet.hwndParent = hwndParent;
139    sheet.hInstance = g_hInstance;
140    AString titleA (GetSystemString(title));
141    sheet.pszCaption = titleA;
142    sheet.nPages = pagesA.Size();
143    sheet.nStartPage = 0;
144    sheet.ppsp = (LPCPROPSHEETPAGEA)(const void *)&pagesA.Front();
145    sheet.pfnCallback = NULL;
146    return ::PropertySheetA(&sheet);
147  }
148  else
149  #endif
150  {
151    PROPSHEETHEADERW sheet;
152    sheet.dwSize = sizeof(sheet);
153    sheet.dwFlags = PSH_PROPSHEETPAGE;
154    sheet.hwndParent = hwndParent;
155    sheet.hInstance = g_hInstance;
156    sheet.pszCaption = title;
157    sheet.nPages = pagesW.Size();
158    sheet.nStartPage = 0;
159    sheet.ppsp = (LPCPROPSHEETPAGEW)(const void *)&pagesW.Front();
160    sheet.pfnCallback = NULL;
161    return ::PropertySheetW(&sheet);
162  }
163}
164
165}}
166