Develop and Download Open Source Software

Browse CVS Repository

Contents of /tombo/Tombo/Src/FilterCtlDlg.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.10 - (show annotations) (download) (as text)
Sun Sep 18 06:45:40 2005 UTC (18 years, 6 months ago) by hirami
Branch: MAIN
CVS Tags: Tombo_2_0a3, Tombo_1_17_1, B191, B192, B193, B194, B196, B197, B198, B199, B200, B201, B202, B203, B205, B206, B207, B208, B187, B186, B189, B188, B213, B212, B211, B217, B216, B215, B214, B219, B218, Tombo_2_0b2, Tombo_2_0b3, Tombo_2_0b1, Tombo_2_0b4, B228, B229, B226, B227, B224, B225, B222, B223, B220, B221, SNAPSHOT20051220, B231, B230, Tombo_1_15, Tombo_1_17, Tombo_1_16, HEAD
Branch point for: Tombo_1_17_1_branch
Changes since 1.9: +1 -3 lines
File MIME type: text/x-c++src
* Change value format note path to uri at virtual folder's "Filter settings" source tab.
* FIX: Encrypted not is not checked on vfolder

- replace VFolder directory scan implementation.

1 #include <windows.h>
2 #include <commctrl.h>
3 #include <tchar.h>
4
5 #include "resource.h"
6 #include "Tombo.h"
7 #include "Message.h"
8 #include "TString.h"
9 #include "UniConv.h"
10 #include "TreeViewItem.h"
11 #include "MemoSelectView.h"
12 #include "FilterCtlDlg.h"
13 #include "VFManager.h"
14 #include "VFStream.h"
15 #include "FilterDefDlg.h"
16 #include "DialogTemplate.h"
17
18 extern HINSTANCE g_hInstance;
19
20 static LRESULT CALLBACK FilterCtlDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
21
22 /////////////////////////////////////////
23 // initialize
24 /////////////////////////////////////////
25
26
27 BOOL FilterCtlDlg::Init(MemoSelectView *p, VFManager *pMgr)
28 {
29 pManager = pMgr;
30 pView = p;
31 return TRUE;
32 }
33
34 /////////////////////////////////////////
35 // entry point
36 /////////////////////////////////////////
37
38 DWORD FilterCtlDlg::Popup(HINSTANCE hInst, HWND hParent, HIMAGELIST hImgList)
39 {
40 hImageList = hImgList;
41 return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_FILTERCTL), hParent, (DLGPROC)FilterCtlDlgProc, (LONG)this);
42 }
43
44 /////////////////////////////////////////
45 // Initialize dialog
46 /////////////////////////////////////////
47
48 class FilterAddListener : public VirtualFolderEnumListener {
49 public:
50 DWORD nCount;
51 LV_ITEM *pItem;
52 HWND hListView;
53
54 DWORD nNKPos;
55
56 BOOL ProcessStream(LPCTSTR pName, BOOL bPersit, VFDirectoryGenerator *pGen, VFStore *pStore);
57 };
58
59 BOOL FilterAddListener::ProcessStream(LPCTSTR pName, BOOL bPersist, VFDirectoryGenerator *pGen, VFStore *pStore)
60 {
61 // create lParam;
62 VFInfo *pInfo = new VFInfo();
63 if (!pInfo) return FALSE;
64
65 pInfo->pName = StringDup(pName);
66 if (pInfo->pName == NULL) return FALSE;
67 pInfo->bPersist = bPersist;
68 pInfo->pGenerator = pGen;
69 pInfo->pStore = pStore;
70
71 pItem->iItem = nCount++;
72 pItem->cchTextMax = _tcslen(pName);
73 pItem->pszText = (LPTSTR)pName;
74 pItem->lParam = (LPARAM)pInfo;
75 if (bPersist) {
76 pItem->iImage = VFOLDER_IMAGE_PERSIST;
77 } else {
78 if (nNKPos == 0xFFFFFFFF) {
79 nNKPos = nCount - 1;
80 }
81 pItem->iImage = VFOLDER_IMAGE_TEMP;
82 }
83 ListView_InsertItem(hListView, pItem);
84 return TRUE;
85 }
86
87 static DlgMsgRes aDlgMsgRes[] = {
88 { IDC_FILTERCTL_UP, MSG_ID_DLG_FILTERCTL_UP },
89 { IDC_FILTERCTL_DOWN, MSG_ID_DLG_FILTERCTL_DOWN },
90 { IDC_FILTERCTL_KEEP, MSG_ID_DLG_FILTERCTL_KEEP },
91 { IDC_FILTERCTL_NEW, MSG_ID_DLG_FILTERCTL_NEW },
92 { IDC_FILTERCTL_RENAME, MSG_ID_DLG_FILTERCTL_RENAME },
93 { IDC_FILTERCTL_DELETE, MSG_ID_DLG_FILTERCTL_DELETE },
94 { IDOK, MSG_ID_DLG_CMN_OK },
95 { IDCANCEL, MSG_ID_DLG_CMN_CANCEL },
96 };
97
98 void FilterCtlDlg::InitDialog(HWND hDlg)
99 {
100 OverrideDlgMsg(hDlg, MSG_ID_DLG_FILTERCTL_TITLE, aDlgMsgRes, sizeof(aDlgMsgRes)/sizeof(DlgMsgRes));
101
102 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
103
104 ListView_SetImageList(hList, hImageList, LVSIL_SMALL);
105
106 /////////////////////////////////////////
107 // Insert column headers
108
109 LV_COLUMN lvc;
110 lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
111 lvc.fmt = LVCFMT_LEFT;
112 lvc.cx = 200;
113 lvc.pszText = (LPTSTR)MSG_VFOLDER_NAME_TTL;
114 ListView_InsertColumn(hList, 0, &lvc);
115
116 /////////////////////////////////////////
117 // Insert current items
118
119 LVITEM li;
120 li.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
121 li.iSubItem = 0;
122 DWORD i = 0;
123
124 FilterAddListener fal;
125 fal.nCount = 0;
126 fal.hListView = hList;
127 fal.pItem = &li;
128 fal.nNKPos = 0xFFFFFFFF;
129
130 pManager->Enum(&fal);
131 if (fal.nNKPos == 0xFFFFFFFF) {
132 nNotKeepPos = fal.nCount;
133 } else {
134 nNotKeepPos = fal.nNKPos;
135 }
136
137 HWND hSave = GetDlgItem(hDlg, IDC_FILTERCTL_KEEP);
138 HWND hUp = GetDlgItem(hDlg, IDC_FILTERCTL_UP);
139 HWND hDown = GetDlgItem(hDlg, IDC_FILTERCTL_DOWN);
140
141 EnableWindow(hSave, FALSE);
142 EnableWindow(hUp, FALSE);
143 EnableWindow(hDown, FALSE);
144 }
145
146 /////////////////////////////////////////
147 // destroy dialog
148 /////////////////////////////////////////
149
150 void FilterCtlDlg::DestroyDialog(HWND hDlg, int iResult)
151 {
152 // prevent removing imagelist
153 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
154 ListView_SetImageList(hList, NULL, LVSIL_SMALL);
155
156 // release items
157 int n = ListView_GetItemCount(hList);
158 int i;
159 LV_ITEM li;
160 VFInfo *pInfo;
161 li.mask = LVIF_PARAM;
162 for (i = 0; i < n; i++) {
163 li.iItem = i;
164 ListView_GetItem(hList, &li);
165 pInfo = (VFInfo*)li.lParam;
166 pInfo->Release();
167 delete pInfo;
168 }
169
170 EndDialog(hDlg, iResult);
171 }
172
173 /////////////////////////////////////////
174 // Update virtual folder definitions
175 /////////////////////////////////////////
176
177 BOOL FilterCtlDlg::OnOK(HWND hDlg)
178 {
179 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
180
181 int n = ListView_GetItemCount(hList);
182 VFInfo **ppInfoArray = new VFInfo*[n];
183 if (!ppInfoArray) return TRUE;
184
185 int i;
186 LV_ITEM li;
187 VFInfo *pInfo;
188 li.mask = LVIF_PARAM;
189 for (i = 0; i < n; i++) {
190 li.iItem = i;
191 ListView_GetItem(hList, &li);
192 pInfo = (VFInfo*)li.lParam;
193 ppInfoArray[i] = pInfo;
194 }
195 pManager->UpdateVirtualFolders(ppInfoArray, n);
196 return TRUE;
197 }
198
199 /////////////////////////////////////////
200 // Delete node from listview
201 /////////////////////////////////////////
202
203 void FilterCtlDlg::DeleteSelectedItem(HWND hDlg)
204 {
205 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
206
207 int iSel = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
208 if (iSel < 0 ) return;
209
210 if (MessageBox(hDlg, MSG_CONFIRM_DEL_VFOLDER, MSG_DEL_VFOLDER_TTL, MB_YESNO | MB_ICONQUESTION) != IDYES) return;
211
212 LVITEM li;
213 li.mask = LVIF_PARAM;
214 li.iItem = iSel;
215 li.iSubItem = 0;
216 ListView_GetItem(hList, &li);
217 VFInfo *pInfo = (VFInfo*)li.lParam;
218
219 pInfo->Release();
220 delete pInfo;
221 ListView_DeleteItem(hList, iSel);
222 }
223
224 /////////////////////////////////////////
225 // "Save" checkbox
226 /////////////////////////////////////////
227
228 void FilterCtlDlg::Command_ToggleKeep(HWND hDlg)
229 {
230 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
231 HWND hSave = GetDlgItem(hDlg, IDC_FILTERCTL_KEEP);
232
233
234 int iSel = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
235 LVITEM li;
236 li.mask = LVIF_PARAM;
237 li.iItem = iSel;
238 li.iSubItem = 0;
239 ListView_GetItem(hList, &li);
240 VFInfo *pInfo = (VFInfo*)li.lParam;
241
242 li.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
243 li.pszText = pInfo->pName;
244 li.cchTextMax = _tcslen(pInfo->pName);
245 li.lParam = (LPARAM)pInfo;
246 li.state = LVIS_FOCUSED | LVIS_SELECTED;
247
248 if (SendMessage(hSave, BM_GETCHECK, 0, 0) == BST_CHECKED) {
249 pInfo->bPersist = TRUE;
250
251 ListView_DeleteItem(hList, iSel);
252 li.iImage = 8;
253 li.iItem = nNotKeepPos++;
254 } else {
255 pInfo->bPersist = FALSE;
256
257 ListView_DeleteItem(hList, iSel);
258 li.iImage = 6;
259 li.iItem = --nNotKeepPos;
260 }
261 ListView_InsertItem(hList, &li);
262 }
263
264 /////////////////////////////////////////
265 // "Up"/"Down" button
266 /////////////////////////////////////////
267
268 BOOL FilterCtlDlg::Command_UpDown(HWND hDlg, int delta)
269 {
270 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
271 int iSel = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
272
273 if (iSel < 0) return TRUE;
274
275 LVITEM li;
276 li.mask = LVIF_STATE | LVIF_IMAGE | LVIF_PARAM;
277 li.iItem = iSel;
278 li.iSubItem = 0;
279 ListView_GetItem(hList, &li);
280
281 VFInfo *pInfo = (VFInfo*)li.lParam;
282
283 ListView_DeleteItem(hList, iSel);
284
285 li.iItem = iSel + delta;
286 li.mask |= LVIF_TEXT;
287 li.pszText = pInfo->pName;
288 li.cchTextMax = _tcslen(pInfo->pName);
289 li.state = LVIS_FOCUSED | LVIS_SELECTED;
290 ListView_InsertItem(hList, &li);
291
292 SetFocus(hList);
293 return TRUE;
294 }
295
296 /////////////////////////////////////////
297 // "New" button
298 /////////////////////////////////////////
299
300 void FilterCtlDlg::Command_New(HWND hDlg)
301 {
302 // Create empty VFInfo
303 VFInfo *pInfo = new VFInfo();
304 if (!pInfo ||
305 !(pInfo->pGenerator = new VFDirectoryGenerator()) ||
306 !pInfo->pGenerator->Init(TEXT(""), FALSE) ||
307 !(pInfo->pStore = new VFStore()) ||
308 !pInfo->pStore->Init()) {
309 MessageBox(hDlg, MSG_NOT_ENOUGH_MEMORY, TOMBO_APP_NAME, MB_OK | MB_ICONERROR);
310 if (pInfo) {
311 delete pInfo->pGenerator;
312 delete pInfo->pStore;
313
314 }
315 delete pInfo;
316 return;
317 }
318 pInfo->pGenerator->SetNext(pInfo->pStore);
319
320 // Popup dialog
321 FilterDefDlg fd;
322 fd.Init();
323 if (fd.Popup(g_hInstance, hDlg, pInfo, TRUE) == IDOK) {
324 // Assign name to virtual folder
325 pInfo->pName = pManager->GetNodeName();
326 if (pInfo->pName == NULL) {
327 MessageBox(hDlg, MSG_NOT_ENOUGH_MEMORY, TOMBO_APP_NAME, MB_OK | MB_ICONERROR);
328 pInfo->Release();
329 delete pInfo;
330 return;
331 }
332 pInfo->bPersist = TRUE;
333
334 // Insert to list
335 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
336 LVITEM li;
337 li.mask = LVIF_STATE | LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
338 li.iItem = ListView_GetItemCount(hList);
339 li.iSubItem = 0;
340 li.state = LVIS_FOCUSED | LVIS_SELECTED;
341 li.pszText = pInfo->pName;
342 li.cchTextMax = _tcslen(pInfo->pName);
343 li.lParam = (LPARAM)pInfo;
344 li.iImage = VFOLDER_IMAGE_PERSIST;
345
346 int idx = ListView_InsertItem(hList, &li);
347 BOOL bX = ListView_EnsureVisible(hList, idx, TRUE);
348
349 } else {
350 pInfo->Release();
351 delete pInfo;
352 }
353
354 }
355
356 /////////////////////////////////////////
357 // "Delete" button
358 /////////////////////////////////////////
359
360 void FilterCtlDlg::Command_Delete(HWND hDlg)
361 {
362 DeleteSelectedItem(hDlg);
363 }
364
365 /////////////////////////////////////////
366 // "Rename" button
367 /////////////////////////////////////////
368
369 void FilterCtlDlg::Command_Rename(HWND hDlg)
370 {
371 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
372 int iSel = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
373
374 if (iSel < 0) return;
375
376 SetFocus(hList);
377 ListView_EditLabel(hList, iSel);
378 }
379
380 /////////////////////////////////////////
381 // WM_NOTIFY handler
382 /////////////////////////////////////////
383
384 BOOL FilterCtlDlg::OnNotify(HWND hDlg, WPARAM wParam, LPARAM lParam)
385 {
386 NMHDR *pHdr = (NMHDR*)lParam;
387 if (pHdr->code == LVN_ITEMCHANGED) {
388 return Notify_ItemChanged(hDlg, lParam);
389 }
390 if (pHdr->code == LVN_ENDLABELEDIT) {
391 return Notify_EndLabelEdit(hDlg, lParam);
392 }
393 if (pHdr->code == LVN_KEYDOWN) {
394 return Notify_Keydown(hDlg, lParam);
395 }
396 if (pHdr->code == NM_DBLCLK) {
397 return Notify_DblClick(hDlg, lParam);
398 }
399 return TRUE;
400 }
401
402 /////////////////////////////////////////
403 // LVN_ITEMCHANGED
404 /////////////////////////////////////////
405 BOOL FilterCtlDlg::Notify_ItemChanged(HWND hDlg, LPARAM lParam)
406 {
407 NMHDR *pHdr = (NMHDR*)lParam;
408 NMLISTVIEW *pLv = (NMLISTVIEW*)lParam;
409 if (pLv->uNewState & LVIS_FOCUSED) {
410 VFInfo *pInfo = (VFInfo*)pLv->lParam;
411
412 HWND hSave = GetDlgItem(hDlg, IDC_FILTERCTL_KEEP);
413 HWND hUp = GetDlgItem(hDlg, IDC_FILTERCTL_UP);
414 HWND hDown = GetDlgItem(hDlg, IDC_FILTERCTL_DOWN);
415
416 EnableWindow(hSave, TRUE);
417 SendMessage(hSave, BM_SETCHECK, pInfo->bPersist ? BST_CHECKED : BST_UNCHECKED, 0);
418
419 EnableWindow(hUp, pLv->iItem > 0);
420 EnableWindow(hDown, pLv->iItem < ListView_GetItemCount(pHdr->hwndFrom) - 1);
421 }
422 return TRUE;
423 }
424
425 /////////////////////////////////////////
426 // LVN_ENDLABELEDIT
427 /////////////////////////////////////////
428
429 BOOL FilterCtlDlg::Notify_EndLabelEdit(HWND hDlg, LPARAM lParam)
430 {
431 NMLVDISPINFO *pDi = (NMLVDISPINFO*)lParam;
432 NMHDR *pHdr = (NMHDR*)lParam;
433 VFInfo *pInfo = (VFInfo*)(pDi->item.lParam);
434
435 if (pDi->item.pszText == NULL) return FALSE;
436
437 delete [] pInfo->pName;
438 pInfo->pName = StringDup(pDi->item.pszText);
439 ListView_SetItem(pHdr->hwndFrom, &(pDi->item));
440 return TRUE;
441 }
442
443 /////////////////////////////////////////
444 // NMKEYDOWN
445 /////////////////////////////////////////
446
447 BOOL FilterCtlDlg::Notify_Keydown(HWND hDlg, LPARAM lParam)
448 {
449 NMHDR *pHdr = (NMHDR*)lParam;
450 NMLVKEYDOWN *pKd = (NMLVKEYDOWN*)lParam;
451 if (pKd->wVKey != VK_DELETE) return TRUE;
452
453 DeleteSelectedItem(hDlg);
454 return TRUE;
455 }
456
457 /////////////////////////////////////////
458 // NMDBLCLK
459 /////////////////////////////////////////
460
461 BOOL FilterCtlDlg::Notify_DblClick(HWND hDlg, LPARAM lParam)
462 {
463 NMLISTVIEW* pLv = (NMLISTVIEW*)lParam;
464 HWND hList = GetDlgItem(hDlg, IDC_FILTERCTL_LIST);
465
466 // get base info
467 int iSel = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
468 if (iSel < 0 ) return TRUE;
469 LVITEM li;
470 li.mask = LVIF_PARAM;
471 li.iItem = iSel;
472 li.iSubItem = 0;
473 ListView_GetItem(hList, &li);
474 VFInfo *pInfoMaster = (VFInfo*)li.lParam;
475
476 // copy VFInfo for update
477 VFInfo *pInfoUpd = pInfoMaster->Clone();
478 if (pInfoUpd == NULL) return FALSE;
479 // popup dialog
480 FilterDefDlg fd;
481 fd.Init();
482 if (fd.Popup(g_hInstance, hDlg, pInfoUpd, FALSE) == IDOK) {
483 li.lParam = (LPARAM)pInfoUpd;
484 ListView_SetItem(hList, &li);
485
486 pInfoMaster->Release();
487 delete pInfoMaster;
488
489 } else {
490 pInfoUpd->Release();
491 delete pInfoUpd;
492 }
493 return TRUE;
494 }
495
496 /////////////////////////////////////////
497 // Dialog procedure
498 /////////////////////////////////////////
499
500 static LRESULT CALLBACK FilterCtlDlgProc(HWND hDlg, UINT nMessage, WPARAM wParam, LPARAM lParam)
501 {
502 FilterCtlDlg *pDlg;
503 if (nMessage == WM_INITDIALOG) {
504 SetWindowLong(hDlg, DWL_USER, lParam);
505 pDlg = (FilterCtlDlg*)lParam;
506
507 pDlg->InitDialog(hDlg);
508 return TRUE;
509 }
510 pDlg = (FilterCtlDlg*)GetWindowLong(hDlg, DWL_USER);
511 if (pDlg == NULL) return FALSE;
512
513 switch(nMessage) {
514 case WM_COMMAND:
515 switch (wParam) {
516 case IDOK:
517 if (pDlg->OnOK(hDlg)) {
518 pDlg->DestroyDialog(hDlg, IDOK);
519 }
520 break;
521 case IDCANCEL:
522 pDlg->DestroyDialog(hDlg, IDCANCEL);
523 break;
524 case IDC_FILTERCTL_KEEP:
525 pDlg->Command_ToggleKeep(hDlg);
526 break;
527 case IDC_FILTERCTL_UP:
528 pDlg->Command_UpDown(hDlg, -1);
529 break;
530 case IDC_FILTERCTL_DOWN:
531 pDlg->Command_UpDown(hDlg, 1);
532 break;
533 case IDC_FILTERCTL_NEW:
534 pDlg->Command_New(hDlg);
535 break;
536 case IDC_FILTERCTL_DELETE:
537 pDlg->Command_Delete(hDlg);
538 break;
539 case IDC_FILTERCTL_RENAME:
540 pDlg->Command_Rename(hDlg);
541 break;
542 }
543 return TRUE;
544 case WM_NOTIFY:
545 return pDlg->OnNotify(hDlg, wParam, lParam);
546 }
547 return FALSE;
548 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26