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