xref: /reactos/base/applications/regedit/clb/clb.c (revision 2b82fe44)
1 /*
2  * ReactOS Column List Box
3  * Copyright (C) 2005 Thomas Weidenmueller
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19 /*
20  * PROJECT:         ReactOS Column List Box
21  * FILE:            lib/clb/clb.c
22  * PURPOSE:         Column List Box
23  * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
24  *
25  * UPDATE HISTORY:
26  *      10/29/2005  Created
27  */
28 #include <precomp.h>
29 
30 static HINSTANCE hDllInstance;
31 
32 static const WCHAR ClbClassName[] = L"ColumnListBox";
33 static const WCHAR ClbColumns[] = L"Column1;Column2;Column3";
34 
35 typedef struct _CLB_PRIVATEDATA
36 {
37     HWND hwnd;
38 } CLB_PRIVATEDATA, *PCLB_PRIVATEDATA;
39 
40 static const CLBS_INFO ClbsSupportedStyles[] =
41 {
42     {
43         CLBS_NOTIFY,
44         0x0,
45         L"CLBS_NOTIFY"
46     },
47     {
48         CLBS_SORT,
49         0x0,
50         L"CLBS_SORT"
51     },
52     {
53         CLBS_DISABLENOSCROLL,
54         0x0,
55         L"CLBS_DISABLENOSCROLL"
56     },
57     {
58         CLBS_VSCROLL,
59         0x0,
60         L"CLBS_VSCROLL"
61     },
62     {
63         CLBS_BORDER,
64         0x0,
65         L"CLBS_BORDER"
66     },
67     {
68         CLBS_POPOUT_HEADINGS,
69         0x0,
70         L"CLBS_POPOUT_HEADINGS"
71     },
72     {
73         CLBS_SPRINGLY_COLUMNS,
74         0x0,
75         L"CLBS_SPRINGLY_COLUMNS"
76     },
77     {
78         LBS_OWNERDRAWFIXED,
79         0x0,
80         L"LBS_OWNERDRAWFIXED"
81     }
82 };
83 
84 /*
85  * @unimplemented
86  */
87 DWORD
88 WINAPI
89 ClbAddData(IN DWORD Unknown1,
90            IN DWORD Unknown2,
91            IN DWORD Unknown3)
92 {
93     DPRINT1("ClbAddData(0x%x, 0x%x, 0x%x)\n", Unknown1, Unknown2, Unknown3);
94     return 0;
95 }
96 
97 
98 /*
99  * @unimplemented
100  */
101 DWORD
102 WINAPI
103 ClbSetColumnWidths(IN DWORD Unknown1,
104                    IN DWORD Unknown2,
105                    IN DWORD Unknown3)
106 {
107     DPRINT1("ClbSetColumnWidths(0x%x, 0x%x, 0x%x)\n", Unknown1, Unknown2, Unknown3);
108     return 0;
109 }
110 
111 
112 /*
113  * @unimplemented
114  */
115 LRESULT
116 CALLBACK
117 ClbWndProc(IN HWND hwnd,
118            IN UINT uMsg,
119            IN WPARAM wParam,
120            IN LPARAM lParam)
121 {
122     PCLB_PRIVATEDATA PrivData;
123     LRESULT Ret = 0;
124 
125     DPRINT1("ClbWndProc(0x%p, 0x%x, 0x%p, 0x%p)\n", hwnd, uMsg, wParam, lParam);
126 
127     PrivData = (PCLB_PRIVATEDATA)GetWindowLongPtr(hwnd,
128                0);
129     if (PrivData == NULL && uMsg != WM_CREATE)
130     {
131         goto HandleDefMsg;
132     }
133 
134     switch (uMsg)
135     {
136     case WM_CREATE:
137         PrivData = HeapAlloc(GetProcessHeap(),
138                              0,
139                              sizeof(CLB_PRIVATEDATA));
140         if (PrivData == NULL)
141         {
142             Ret = (LRESULT)-1;
143             break;
144         }
145         PrivData->hwnd = hwnd;
146         break;
147 
148     case WM_DESTROY:
149         HeapFree(GetProcessHeap(),
150                  0,
151                  PrivData);
152         break;
153 
154     default:
155 HandleDefMsg:
156         Ret = DefWindowProc(hwnd,
157                             uMsg,
158                             wParam,
159                             lParam);
160         break;
161     }
162 
163     return Ret;
164 }
165 
166 
167 static INT_PTR CALLBACK
168 ClbpStyleDlgProc(IN HWND hwndDlg,
169                  IN UINT uMsg,
170                  IN WPARAM wParam,
171                  IN LPARAM lParam)
172 {
173     INT_PTR Ret = FALSE;
174 
175     DPRINT1("ClbpStyleDlgProc(0x%p, 0x%x, 0x%p, 0x%p)\n", hwndDlg, uMsg, wParam, lParam);
176 
177     switch (uMsg)
178     {
179     case WM_COMMAND:
180         switch (LOWORD(wParam))
181         {
182         case IDOK:
183         case IDCANCEL:
184             EndDialog(hwndDlg,
185                       (INT_PTR)LOWORD(wParam));
186             break;
187         }
188         break;
189 
190     case WM_CLOSE:
191         EndDialog(hwndDlg,
192                   IDCANCEL);
193         break;
194 
195     case WM_INITDIALOG:
196         Ret = TRUE;
197         break;
198     }
199 
200     return Ret;
201 }
202 
203 
204 /*
205  * @implemented
206  */
207 INT_PTR
208 WINAPI
209 ClbStyleW(IN HWND hWndParent,
210           IN LPARAM dwInitParam)
211 {
212     return DialogBoxParam(hDllInstance,
213                           MAKEINTRESOURCE(IDD_COLUMNLISTBOXSTYLES),
214                           hWndParent,
215                           ClbpStyleDlgProc,
216                           dwInitParam);
217 }
218 
219 
220 /*
221  * @implemented
222  */
223 BOOL
224 WINAPI
225 CustomControlInfoW(OUT LPCUSTOM_CONTROL_INFO CustomControlInfo  OPTIONAL)
226 {
227     if (CustomControlInfo != NULL)
228     {
229         wcscpy(CustomControlInfo->ClassName,
230                ClbClassName);
231 
232         CustomControlInfo->Zero1 = 0;
233 
234         wcscpy(CustomControlInfo->ClassName2,
235                ClbClassName);
236 
237         CustomControlInfo->Unknown1 = 0x60; /* FIXME - ??? */
238         CustomControlInfo->Unknown2 = 0x50; /* FIXME - ??? */
239         CustomControlInfo->Unknown3 = 0x50A10013; /* FIXME - ??? */
240 
241         CustomControlInfo->Zero2 = 0;
242         CustomControlInfo->Zero3 = 0;
243 
244         CustomControlInfo->StylesCount = sizeof(ClbsSupportedStyles) / sizeof(ClbsSupportedStyles[0]);
245         CustomControlInfo->SupportedStyles = ClbsSupportedStyles;
246 
247         wcscpy(CustomControlInfo->Columns,
248                ClbColumns);
249 
250         CustomControlInfo->ClbStyleW = ClbStyleW;
251 
252         CustomControlInfo->Zero4 = 0;
253         CustomControlInfo->Zero5 = 0;
254         CustomControlInfo->Zero6 = 0;
255     }
256 
257     return TRUE;
258 }
259 
260 BOOL
261 WINAPI
262 DllMain(IN HINSTANCE hinstDLL,
263         IN DWORD dwReason,
264         IN LPVOID lpvReserved)
265 {
266     BOOL Ret = TRUE;
267 
268     switch (dwReason)
269     {
270     case DLL_PROCESS_ATTACH:
271     {
272         WNDCLASS ClbWndClass;
273 
274         hDllInstance = hinstDLL;
275 
276         InitCommonControls();
277 
278         /* register the control's window class */
279         ClbWndClass.style = CS_GLOBALCLASS | CS_OWNDC;
280         ClbWndClass.lpfnWndProc = ClbWndProc;
281         ClbWndClass.cbClsExtra = 0;
282         ClbWndClass.cbWndExtra = sizeof(PCLB_PRIVATEDATA);
283         ClbWndClass.hInstance = hinstDLL,
284                     ClbWndClass.hIcon = NULL;
285         ClbWndClass.hCursor = LoadCursor(NULL,
286                                          (LPWSTR)IDC_ARROW);
287         ClbWndClass.hbrBackground = NULL;
288         ClbWndClass.lpszMenuName = NULL;
289         ClbWndClass.lpszClassName = ClbClassName;
290 
291         if (!RegisterClass(&ClbWndClass))
292         {
293             Ret = FALSE;
294             break;
295         }
296         break;
297     }
298 
299     case DLL_THREAD_ATTACH:
300     case DLL_THREAD_DETACH:
301         break;
302 
303     case DLL_PROCESS_DETACH:
304         UnregisterClass(ClbClassName,
305                         hinstDLL);
306         break;
307     }
308     return Ret;
309 }
310 
311