61361ab313146205884a901b09512935e997ead7
[reactos.git] / sdk / include / reactos / rosdlgs.h
1 #pragma once
2
3 #include <atlwin.h>
4
5 namespace ATL
6 {
7 template <class T>
8 class CPropertyPageImpl: public CDialogImplBaseT<CWindow>
9 {
10 public:
11 PROPSHEETPAGE m_psp;
12
13 operator PROPSHEETPAGE*()
14 {
15 return &m_psp;
16 }
17
18 CPropertyPageImpl(LPCTSTR lpszTitle = NULL)
19 {
20 T* pT = static_cast<T*>(this);
21
22 memset(&m_psp, 0, sizeof(m_psp));
23 m_psp.dwSize = sizeof(m_psp);
24 m_psp.hInstance = _AtlBaseModule.GetResourceInstance();
25 m_psp.pszTemplate = MAKEINTRESOURCE(T::IDD);
26 m_psp.pszTitle = lpszTitle;
27 m_psp.pfnDlgProc = T::StartDialogProc;
28 m_psp.pfnCallback = T::PropPageCallback;
29 m_psp.lParam = reinterpret_cast<LPARAM>(pT);
30
31 m_psp.dwFlags = PSP_USECALLBACK;
32 if (lpszTitle)
33 m_psp.dwFlags |= PSP_USETITLE;
34 }
35
36 static UINT CALLBACK PropPageCallback(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp)
37 {
38 T* pT = reinterpret_cast<T*>(ppsp->lParam);
39 CDialogImplBaseT<CWindow>* pThis = static_cast<CDialogImplBaseT<CWindow>*>(pT);
40
41 switch (uMsg)
42 {
43 case PSPCB_CREATE:
44 _AtlWinModule.AddCreateWndData(&pThis->m_thunk.cd, pThis);
45 return pT->OnPageCreate();
46 case PSPCB_ADDREF:
47 pT->OnPageAddRef();
48 break;
49 case PSPCB_RELEASE:
50 pT->OnPageRelease();
51 break;
52 }
53
54 return 0;
55 }
56
57 HPROPSHEETPAGE Create()
58 {
59 return ::CreatePropertySheetPage(&m_psp);
60 }
61
62 BOOL EndDialog(_In_ int nRetCode)
63 {
64 return FALSE;
65 }
66
67 void SetModified(BOOL bChanged = TRUE)
68 {
69 ::SendMessage(GetParent(), bChanged ? PSM_CHANGED : PSM_UNCHANGED, (WPARAM)m_hWnd, 0L);
70 }
71
72 BOOL OnPageCreate()
73 {
74 return TRUE;
75 }
76
77 VOID OnPageAddRef()
78 {
79 }
80
81 VOID OnPageRelease()
82 {
83 }
84
85 int OnSetActive()
86 {
87 return 0;
88 }
89
90 BOOL OnKillActive()
91 {
92 return FALSE;
93 }
94
95 int OnApply()
96 {
97 return PSNRET_NOERROR;
98 }
99
100 void OnReset()
101 {
102 }
103
104 void OnHelp()
105 {
106 }
107
108 int OnWizardBack()
109 {
110 return 0;
111 }
112
113 int OnWizardNext()
114 {
115 return 0;
116 }
117
118 BOOL OnWizardFinish()
119 {
120 return FALSE;
121 }
122
123 BOOL OnQueryCancel()
124 {
125 return FALSE;
126 }
127
128 BOOL OnGetObject(LPNMOBJECTNOTIFY lpObjectNotify)
129 {
130 return FALSE;
131 }
132
133 int OnTranslateAccelerator(LPMSG lpMsg)
134 {
135 return 0;
136 }
137
138 HWND OnQueryInitialFocus(HWND hwnd)
139 {
140 return NULL;
141 }
142
143 // message map and handlers
144 typedef CPropertyPageImpl<T> thisClass;
145 BEGIN_MSG_MAP(thisClass)
146 MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
147 END_MSG_MAP()
148
149 LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
150 {
151 NMHDR* pnmh = (NMHDR*)lParam;
152 T* pThis = static_cast<T*>(this);
153
154 if (pnmh->hwndFrom != GetParent() && pnmh->hwndFrom != m_hWnd)
155 {
156 bHandled = FALSE;
157 return TRUE;
158 }
159
160 switch (pnmh->code)
161 {
162 case PSN_SETACTIVE:
163 return pThis->OnSetActive();
164 case PSN_KILLACTIVE:
165 return pThis->OnKillActive();
166 case PSN_APPLY:
167 return pThis->OnApply();
168 case PSN_RESET:
169 pThis->OnReset();
170 return 0;
171 case PSN_HELP:
172 pThis->OnHelp();
173 return 0;
174 case PSN_WIZBACK:
175 return pThis->OnWizardBack();
176 case PSN_WIZNEXT:
177 return pThis->OnWizardNext();
178 case PSN_WIZFINISH:
179 return pThis->OnWizardFinish();
180 case PSN_QUERYCANCEL:
181 return pThis->OnQueryCancel();
182 case PSN_GETOBJECT:
183 return pThis->OnGetObject((LPNMOBJECTNOTIFY)lParam);
184 case PSN_TRANSLATEACCELERATOR:
185 return pThis->OnTranslateAccelerator((LPMSG)lParam);
186 case PSN_QUERYINITIALFOCUS:
187 return (LRESULT)pThis->OnQueryInitialFocus((HWND)lParam);
188 }
189
190 bHandled = FALSE;
191 return 0;
192 }
193 };
194 }