xref: /aosp_15_r20/external/lzma/CPP/Windows/Control/PropertyPage.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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 
11 extern HINSTANCE g_hInstance;
12 #ifndef _UNICODE
13 extern bool g_IsNT;
14 #endif
15 
16 namespace NWindows {
17 namespace NControl {
18 
19 static
20 #ifdef Z7_OLD_WIN_SDK
21   BOOL
22 #else
23   INT_PTR
24 #endif
MyProperyPageProcedure(HWND dialogHWND,UINT message,WPARAM wParam,LPARAM lParam)25 APIENTRY 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 
OnNotify(UINT,LPNMHDR lParam)39 bool 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 /*
54 PROPSHEETPAGE fields depend from
55 #if   (_WIN32_WINNT >= 0x0600)
56 #elif (_WIN32_WINNT >= 0x0501)
57 #elif (_WIN32_IE >= 0x0400)
58 PROPSHEETHEADER 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 
MyPropertySheet(const CObjectVector<CPageInfo> & pagesInfo,HWND hwndParent,const UString & title)74 INT_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.ConstData();
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.ConstData();
160     sheet.pfnCallback = NULL;
161     return ::PropertySheetW(&sheet);
162   }
163 }
164 
165 }}
166