xref: /reactos/base/applications/regedit/clb/clb.c (revision 84344399)
1 /*
2  * PROJECT:     ReactOS Column List Box
3  * LICENSE:     LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4  * PURPOSE:     Column List Box
5  * COPYRIGHT:   Copyright 2005 Thomas Weidenmueller <w3seek@reactos.com>
6  */
7 #include <precomp.h>
8 
9 static HINSTANCE hDllInstance;
10 
11 static const WCHAR ClbClassName[] = L"ColumnListBox";
12 static const WCHAR ClbColumns[] = L"Column1;Column2;Column3";
13 
14 typedef struct _CLB_PRIVATEDATA
15 {
16     HWND hwnd;
17 } CLB_PRIVATEDATA, *PCLB_PRIVATEDATA;
18 
19 static const CLBS_INFO ClbsSupportedStyles[] =
20 {
21     {
22         CLBS_NOTIFY,
23         0x0,
24         L"CLBS_NOTIFY"
25     },
26     {
27         CLBS_SORT,
28         0x0,
29         L"CLBS_SORT"
30     },
31     {
32         CLBS_DISABLENOSCROLL,
33         0x0,
34         L"CLBS_DISABLENOSCROLL"
35     },
36     {
37         CLBS_VSCROLL,
38         0x0,
39         L"CLBS_VSCROLL"
40     },
41     {
42         CLBS_BORDER,
43         0x0,
44         L"CLBS_BORDER"
45     },
46     {
47         CLBS_POPOUT_HEADINGS,
48         0x0,
49         L"CLBS_POPOUT_HEADINGS"
50     },
51     {
52         CLBS_SPRINGLY_COLUMNS,
53         0x0,
54         L"CLBS_SPRINGLY_COLUMNS"
55     },
56     {
57         LBS_OWNERDRAWFIXED,
58         0x0,
59         L"LBS_OWNERDRAWFIXED"
60     }
61 };
62 
63 /*
64  * @unimplemented
65  */
66 DWORD
67 WINAPI
68 ClbAddData(IN DWORD Unknown1,
69            IN DWORD Unknown2,
70            IN DWORD Unknown3)
71 {
72     DPRINT1("ClbAddData(0x%x, 0x%x, 0x%x)\n", Unknown1, Unknown2, Unknown3);
73     return 0;
74 }
75 
76 /*
77  * @unimplemented
78  */
79 DWORD
80 WINAPI
81 ClbSetColumnWidths(IN DWORD Unknown1,
82                    IN DWORD Unknown2,
83                    IN DWORD Unknown3)
84 {
85     DPRINT1("ClbSetColumnWidths(0x%x, 0x%x, 0x%x)\n", Unknown1, Unknown2, Unknown3);
86     return 0;
87 }
88 
89 /*
90  * @unimplemented
91  */
92 LRESULT
93 CALLBACK
94 ClbWndProc(IN HWND hwnd,
95            IN UINT uMsg,
96            IN WPARAM wParam,
97            IN LPARAM lParam)
98 {
99     PCLB_PRIVATEDATA PrivData;
100     LRESULT Ret = 0;
101 
102     DPRINT1("ClbWndProc(0x%p, 0x%x, 0x%p, 0x%p)\n", hwnd, uMsg, wParam, lParam);
103 
104     PrivData = (PCLB_PRIVATEDATA)GetWindowLongPtr(hwnd, 0);
105     if (PrivData == NULL && uMsg != WM_CREATE)
106     {
107         goto HandleDefMsg;
108     }
109 
110     switch (uMsg)
111     {
112     case WM_CREATE:
113         PrivData = HeapAlloc(GetProcessHeap(),
114                              0,
115                              sizeof(CLB_PRIVATEDATA));
116         if (PrivData == NULL)
117         {
118             Ret = (LRESULT)-1;
119             break;
120         }
121         PrivData->hwnd = hwnd;
122         break;
123 
124     case WM_DESTROY:
125         HeapFree(GetProcessHeap(), 0, PrivData);
126         break;
127 
128     default:
129 HandleDefMsg:
130         Ret = DefWindowProc(hwnd, uMsg, wParam, lParam);
131         break;
132     }
133 
134     return Ret;
135 }
136 
137 static INT_PTR CALLBACK
138 ClbpStyleDlgProc(IN HWND hwndDlg,
139                  IN UINT uMsg,
140                  IN WPARAM wParam,
141                  IN LPARAM lParam)
142 {
143     INT_PTR Ret = FALSE;
144 
145     DPRINT1("ClbpStyleDlgProc(0x%p, 0x%x, 0x%p, 0x%p)\n", hwndDlg, uMsg, wParam, lParam);
146 
147     switch (uMsg)
148     {
149     case WM_COMMAND:
150         switch (LOWORD(wParam))
151         {
152         case IDOK:
153         case IDCANCEL:
154             EndDialog(hwndDlg, LOWORD(wParam));
155             break;
156         }
157         break;
158 
159     case WM_CLOSE:
160         EndDialog(hwndDlg, IDCANCEL);
161         break;
162 
163     case WM_INITDIALOG:
164         Ret = TRUE;
165         break;
166     }
167 
168     return Ret;
169 }
170 
171 /*
172  * @implemented
173  */
174 INT_PTR
175 WINAPI
176 ClbStyleW(IN HWND hWndParent,
177           IN LPARAM dwInitParam)
178 {
179     return DialogBoxParam(hDllInstance,
180                           MAKEINTRESOURCE(IDD_COLUMNLISTBOXSTYLES),
181                           hWndParent,
182                           ClbpStyleDlgProc,
183                           dwInitParam);
184 }
185 
186 /*
187  * @implemented
188  */
189 BOOL
190 WINAPI
191 CustomControlInfoW(OUT LPCUSTOM_CONTROL_INFO CustomControlInfo OPTIONAL)
192 {
193     if (CustomControlInfo != NULL)
194     {
195         wcscpy(CustomControlInfo->ClassName, ClbClassName);
196 
197         CustomControlInfo->Zero1 = 0;
198 
199         wcscpy(CustomControlInfo->ClassName2, ClbClassName);
200 
201         CustomControlInfo->Unknown1 = 0x60; // FIXME - ???
202         CustomControlInfo->Unknown2 = 0x50; // FIXME - ???
203         CustomControlInfo->Unknown3 = 0x50A10013; // FIXME - ???
204 
205         CustomControlInfo->Zero2 = 0;
206         CustomControlInfo->Zero3 = 0;
207 
208         CustomControlInfo->StylesCount = _countof(ClbsSupportedStyles);
209         CustomControlInfo->SupportedStyles = ClbsSupportedStyles;
210 
211         wcscpy(CustomControlInfo->Columns, ClbColumns);
212 
213         CustomControlInfo->ClbStyleW = ClbStyleW;
214 
215         CustomControlInfo->Zero4 = 0;
216         CustomControlInfo->Zero5 = 0;
217         CustomControlInfo->Zero6 = 0;
218     }
219 
220     return TRUE;
221 }
222 
223 BOOL
224 WINAPI
225 DllMain(IN HINSTANCE hinstDLL,
226         IN DWORD dwReason,
227         IN LPVOID lpvReserved)
228 {
229     BOOL Ret = TRUE;
230 
231     switch (dwReason)
232     {
233     case DLL_PROCESS_ATTACH:
234     {
235         WNDCLASS ClbWndClass;
236 
237         hDllInstance = hinstDLL;
238 
239         InitCommonControls();
240 
241         /* register the control's window class */
242         ClbWndClass.style = CS_GLOBALCLASS | CS_OWNDC;
243         ClbWndClass.lpfnWndProc = ClbWndProc;
244         ClbWndClass.cbClsExtra = 0;
245         ClbWndClass.cbWndExtra = sizeof(PCLB_PRIVATEDATA);
246         ClbWndClass.hInstance = hinstDLL;
247         ClbWndClass.hIcon = NULL;
248         ClbWndClass.hCursor = LoadCursor(NULL, (LPWSTR)IDC_ARROW);
249         ClbWndClass.hbrBackground = NULL;
250         ClbWndClass.lpszMenuName = NULL;
251         ClbWndClass.lpszClassName = ClbClassName;
252 
253         if (!RegisterClass(&ClbWndClass))
254         {
255             Ret = FALSE;
256             break;
257         }
258         break;
259     }
260 
261     case DLL_THREAD_ATTACH:
262     case DLL_THREAD_DETACH:
263         break;
264 
265     case DLL_PROCESS_DETACH:
266         UnregisterClass(ClbClassName, hinstDLL);
267         break;
268     }
269     return Ret;
270 }
271 
272 /* EOF */
273