Develop and Download Open Source Software

Browse CVS Repository

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

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


Revision 1.82 - (show annotations) (download) (as text)
Mon Sep 25 15:59:44 2006 UTC (17 years, 6 months ago) by hirami
Branch: MAIN
CVS Tags: Tombo_2_0b4, B231, HEAD
Changes since 1.81: +33 -4 lines
File MIME type: text/x-c++src
* FIX: One pane mode is not worked(#8954)
* FIX: Save new note failed when choosing virtual folder(#9013)
* FIX: Cut/Copy/Paste is not worked when choosing from menu(WM5)(#9008)
* FIX: Renaming is not worked on some WM5 devices(#9014)
* FIX: Password timeout is not occured when displaying crypted notes and focus is in treeview.(#9050)

1 #include <windows.h>
2 #include <commctrl.h>
3 #include <tchar.h>
4 #if defined(PLATFORM_PKTPC) || defined(PLATFORM_WM5)
5 #include <aygshell.h>
6 #endif
7
8 #include "Tombo.h"
9 #include "TString.h"
10 #include "TomboURI.h"
11 #include "MemoSelectView.h"
12 #include "resource.h"
13
14 #include "UniConv.h"
15 #include "MemoManager.h"
16 #include "VarBuffer.h"
17 #include "MainFrame.h"
18 #include "Property.h"
19 #include "TreeViewItem.h"
20 #include "Message.h"
21
22 #include "NewFolderDialog.h"
23
24 #include "AutoPtr.h"
25 #include "Repository.h"
26
27 /////////////////////////////////////////
28 // defs
29 /////////////////////////////////////////
30
31 // Size of each image in IDB_MEMOSELECT_IMAGES
32 #if defined(FOR_VGA)
33 #define IMAGE_CX 24
34 #define IMAGE_CY 24
35 #else
36 #define IMAGE_CX 16
37 #define IMAGE_CY 16
38 #endif
39
40 // Number of items in IDB_MEMOSELECT_IMAGES
41 #define NUM_MEMOSELECT_BITMAPS 10
42
43 /////////////////////////////////////////
44 // root info
45 /////////////////////////////////////////
46
47 struct MSViewRootInfo {
48 TomboURI uri;
49 HTREEITEM hItem;
50 DWORD nType;
51 };
52
53 /////////////////////////////////////////
54 // static functions
55 /////////////////////////////////////////
56
57 static void InsertDummyNode(HWND hTree, HTREEITEM hItem);
58 static HTREEITEM FindItem2(HWND hWnd, HTREEITEM hParent, LPCTSTR pHeadLine, DWORD nLen);
59 void SelectViewSetWndProc(SUPER_WND_PROC wp, HWND hParent, HINSTANCE h, MemoSelectView *p);
60 LRESULT CALLBACK NewSelectViewProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
61 static HIMAGELIST CreateSelectViewImageList(HINSTANCE hInst);
62
63 /////////////////////////////////////////
64 // init
65 /////////////////////////////////////////
66
67 MemoSelectView::~MemoSelectView()
68 {
69 delete [] pRoots;
70 }
71
72 BOOL MemoSelectView::Create(LPCTSTR pName, RECT &r, HWND hParent, DWORD nID, HINSTANCE hInst, HFONT hFont)
73 {
74 hSelectViewImgList = CreateSelectViewImageList(hInst);
75
76 DWORD nWndStyle;
77 nWndStyle = WS_CHILD | WS_VSCROLL | WS_HSCROLL | TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS;
78 #if !defined(PLATFORM_WM5)
79 nWndStyle |= TVS_EDITLABELS;
80 #endif
81
82 #if defined(PLATFORM_WIN32) || defined(PLATFORM_HPC)
83 hViewWnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, pName, nWndStyle,
84 r.left, r.top, r.right, r.bottom,
85 hParent, (HMENU)nID, hInst, this);
86 #else
87 hViewWnd = CreateWindow(WC_TREEVIEW, pName, nWndStyle | WS_BORDER,
88 r.left, r.top, r.right, r.bottom,
89 hParent, (HMENU)nID, hInst, this);
90 #endif
91 if (hViewWnd == NULL) return FALSE;
92
93 SUPER_WND_PROC wp = (SUPER_WND_PROC)GetWindowLong(hViewWnd, GWL_WNDPROC);
94 SelectViewSetWndProc(wp, hParent, g_hInstance, this);
95 SetWindowLong(hViewWnd, GWL_WNDPROC, (LONG)NewSelectViewProc);
96
97 TreeView_SetImageList(hViewWnd, hSelectViewImgList, TVSIL_NORMAL);
98
99 if (hFont != NULL) {
100 SendMessage(hViewWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
101 }
102 return TRUE;
103 }
104
105 /////////////////////////////////////////
106 // Insert node
107 /////////////////////////////////////////
108 // Insert node with sorting.
109
110 static HTREEITEM InsertNode(HWND hTree, TV_INSERTSTRUCT *ti)
111 {
112 LPCTSTR pInsertStr = ti->item.pszText;
113 DWORD n = _tcslen(pInsertStr);
114 TString compBuf;
115
116 TreeViewItem *pInsItem = (TreeViewItem*)ti->item.lParam;
117 DWORD nInsOrder = pInsItem->ItemOrder();
118
119 TreeViewItem *pCompareItem;
120 DWORD nCompOrder;
121
122 if (!compBuf.Alloc(n + 1)) {
123 return NULL;
124 }
125
126 if (ti->hParent != TVI_ROOT) {
127 HTREEITEM h;
128 HTREEITEM hIns;
129
130 TV_ITEM t;
131 t.mask = TVIF_TEXT | TVIF_PARAM;
132 t.cchTextMax = n;
133 t.pszText = compBuf.Get();
134
135 hIns = TVI_FIRST;
136
137 h = TreeView_GetChild(hTree, ti->hParent);
138 while(h) {
139 t.hItem = h;
140 TreeView_GetItem(hTree, &t);
141 pCompareItem = (TreeViewItem*)t.lParam;
142
143 nCompOrder = 0;
144 if (pCompareItem) {
145 nCompOrder = pCompareItem->ItemOrder();
146 } else {
147 nCompOrder = -1;
148 }
149
150 if (nInsOrder < nCompOrder) break;
151 if (nInsOrder == nCompOrder && _tcsicmp(t.pszText, pInsertStr) > 0) break;
152
153 hIns = h;
154 h = TreeView_GetNextSibling(hTree, h);
155 }
156 ti->hInsertAfter = hIns;
157 } else {
158 ti->hInsertAfter = TVI_LAST;
159 }
160 HTREEITEM hInserted = TreeView_InsertItem(hTree, ti);
161 return hInserted;
162 }
163
164 /////////////////////////////////////////
165 // Insert file node
166 /////////////////////////////////////////
167
168 HTREEITEM MemoSelectView::InsertFile(HTREEITEM hParent, const TomboURI *pURI,
169 LPCTSTR pTitle, BOOL bInsertToLast, BOOL bLink)
170 {
171 URIOption opt(NOTE_OPTIONMASK_ICON);
172 if (!g_Repository.GetOption(pURI, &opt)) return NULL;
173
174 TV_INSERTSTRUCT ti;
175 ti.hParent = hParent;
176 ti.hInsertAfter = TVI_LAST;
177 ti.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
178 ti.item.iImage = ti.item.iSelectedImage = opt.iIcon;
179
180 TreeViewFileItem *tvi;
181 if (bLink) {
182 tvi = new TreeViewFileLink();
183 } else {
184 tvi = new TreeViewFileItem();
185 }
186
187 if (!tvi) return NULL;
188
189 tvi->SetURI(pURI);
190 ti.item.lParam = (LPARAM)tvi;
191
192 ti.item.pszText = (LPTSTR)pTitle;
193 HTREEITEM hItem;
194 if (bInsertToLast) {
195 hItem = TreeView_InsertItem(hViewWnd, &ti);
196 } else {
197 hItem = InsertNode(hViewWnd, &ti);
198 }
199 tvi->SetViewItem(hItem);
200 return hItem;
201 }
202
203 /////////////////////////////////////////
204 // Insert folder
205 /////////////////////////////////////////
206
207 HTREEITEM MemoSelectView::InsertFolder(HTREEITEM hParent, LPCTSTR pName, TreeViewItem *tvi, BOOL bInsertLast)
208 {
209 HWND hTree = hViewWnd;
210
211 TV_INSERTSTRUCT ti;
212 ti.hParent = hParent;
213 ti.hInsertAfter = TVI_LAST;
214 ti.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
215 ti.item.pszText = (LPTSTR)pName;
216 ti.item.iImage = ti.item.iSelectedImage = tvi->GetIcon(this, MEMO_VIEW_STATE_INIT);
217 ti.item.lParam = (LPARAM)tvi;
218
219 HTREEITEM hItem;
220 if (bInsertLast) {
221 hItem = TreeView_InsertItem(hViewWnd, &ti);
222 } else {
223 hItem = InsertNode(hTree, &ti);
224 }
225 tvi->SetViewItem(hItem);
226
227 InsertDummyNode(hTree, hItem);
228 return hItem;
229 }
230
231 /////////////////////////////////////////
232 // Initialize tree
233 /////////////////////////////////////////
234
235 BOOL MemoSelectView::InitTree(VFManager *pManager)
236 {
237 DeleteAllItem();
238
239 nNumRoots = g_Repository.GetNumOfSubRepository();
240 pRoots = new MSViewRootInfo[nNumRoots];
241
242 for (DWORD i = 0; i < nNumRoots; i++) {
243 const TomboURI *pSubRootURI = g_Repository.GetSubRepositoryRootURI(i);
244 LPCTSTR pSubRootName = g_Repository.GetSubRepositoryName(i);
245 DWORD nSubRootType = g_Repository.GetSubRepositoryType(i);
246
247 pRoots[i].uri = *g_Repository.GetSubRepositoryRootURI(i);
248 pRoots[i].nType = nSubRootType;
249
250 switch(nSubRootType) {
251 case TOMBO_REPO_SUBREPO_TYPE_LOCALFILE:
252 {
253 TreeViewFolderItem *pItem = new TreeViewFolderItem();
254 pItem->SetURI(pSubRootURI);
255 pRoots[i].hItem = InsertFolder(TVI_ROOT, pSubRootName, pItem, TRUE);
256 }
257 break;
258 case TOMBO_REPO_SUBREPO_TYPE_VFOLDER:
259 {
260 TreeViewVirtualFolderRoot *pVFRoot = new TreeViewVirtualFolderRoot();
261 if (!pVFRoot || !pVFRoot->Init(pSubRootURI, pManager)) return FALSE;
262 pRoots[i].hItem = InsertFolder(TVI_ROOT, pSubRootName, pVFRoot, TRUE);
263 }
264 break;
265 default:
266 return FALSE;
267 }
268 TreeView_Expand(hViewWnd, pRoots[i].hItem, TVE_EXPAND);
269 }
270 return TRUE;
271 }
272
273 /////////////////////////////////////////
274 // Delete one item
275 /////////////////////////////////////////
276 //
277 // Delete item from the treeview and release its memory.
278
279 void MemoSelectView::DeleteOneItem(HTREEITEM hItem)
280 {
281 TV_ITEM ti;
282 ti.mask = TVIF_PARAM;
283
284 // get lParam(is TreeViewItem*);
285 ti.hItem = hItem;
286 TreeView_GetItem(hViewWnd, &ti);
287 TreeViewItem *tvi;
288 tvi = (TreeViewItem *)ti.lParam;
289
290 // if deleting item is clipped, release clipping.
291 if (pClipItem == tvi) pClipItem = NULL;
292
293 delete tvi;
294 TreeView_DeleteItem(hViewWnd, hItem);
295 }
296
297 /////////////////////////////////////////
298 // Delete items recursive.
299 /////////////////////////////////////////
300 //
301 // Usually, hFirst is first child of a node named "A".
302 // DeleteItemsRec() are delete follow sibling and these children,
303 // so parent node "A" is not deleted.
304 // It deletes TreeViewItem that is pointed by HTREEITEM, too.
305
306 void MemoSelectView::DeleteItemsRec(HTREEITEM hFirst)
307 {
308 HTREEITEM hItem = hFirst;
309 HTREEITEM hNext, hChild;
310
311 while(hItem) {
312 // Delete children.
313 hChild = TreeView_GetChild(hViewWnd, hItem);
314 if (hChild) {
315 DeleteItemsRec(hChild);
316 }
317
318 // Get next item before hItem is deleted.
319 hNext = TreeView_GetNextSibling(hViewWnd, hItem);
320
321 // Delete hItem
322 DeleteOneItem(hItem);
323
324 hItem = hNext;
325 }
326 }
327
328 BOOL MemoSelectView::DeleteAllItem()
329 {
330 DeleteItemsRec(TreeView_GetRoot(hViewWnd));
331 pClipItem = NULL;
332 return TRUE;
333 }
334
335 /////////////////////////////////////////
336 // Is the item expending?
337 /////////////////////////////////////////
338
339 BOOL MemoSelectView::IsExpand(HTREEITEM hItem)
340 {
341 TV_ITEM ti;
342 ti.hItem = hItem;
343 ti.mask = TVIF_STATE;
344 ti.state = TVIS_EXPANDED;
345 ti.stateMask = TVIS_EXPANDED;
346 TreeView_GetItem(hViewWnd, &ti);
347 return ti.state & TVIS_EXPANDED;
348 }
349
350 /////////////////////////////////////////
351 // get item current selected
352 /////////////////////////////////////////
353
354 const TomboURI* MemoSelectView::GetCurrentSelectedURI()
355 {
356 TreeViewItem *pItem = GetCurrentItem();
357 if (pItem == NULL) return NULL;
358
359 return pItem->GetRealURI();
360 }
361
362 TreeViewItem* MemoSelectView::GetCurrentItem(HTREEITEM *pItem)
363 {
364 HTREEITEM hItem = TreeView_GetSelection(hViewWnd);
365 if (hItem == NULL) return NULL;
366
367 TV_ITEM it;
368 it.mask = TVIF_PARAM;
369 it.hItem = hItem;
370 if (TreeView_GetItem(hViewWnd, &it)) {
371 if (pItem) *pItem = hItem;
372 TreeViewItem *tvi = (TreeViewItem*)it.lParam;
373 return tvi;
374 }
375 return NULL;
376 }
377
378 BOOL MemoSelectView::Show(int nCmdShow)
379 {
380 ShowWindow(hViewWnd, nCmdShow);
381 #if defined(PLATFORM_PKTPC) || defined(PLATFORM_WM5)
382 // close menu if switch to other view
383 if (nCmdShow == SW_HIDE) {
384 ReleaseCapture();
385 }
386 #endif
387 return UpdateWindow(hViewWnd);
388 }
389
390 void MemoSelectView::SetFocus()
391 {
392 ::SetFocus(hViewWnd);
393 }
394
395 ///////////////////////////////////////////
396 // menu control
397 ///////////////////////////////////////////
398
399 static void ControlSubMenu(HMENU hMenu, UINT nID, BOOL bEnable)
400 {
401 if (bEnable) {
402 EnableMenuItem(hMenu, nID, MF_BYCOMMAND | MF_ENABLED);
403 } else {
404 EnableMenuItem(hMenu, nID, MF_BYCOMMAND | MF_GRAYED);
405 }
406 }
407
408 ///////////////////////////////////////////
409 // OnNotify Handler
410 ///////////////////////////////////////////
411 // if you want to return TRUE/FALSE, return TRUE/FALSE.
412 // if you want to do default action, return 0xFFFFFFFF.
413
414 LRESULT MemoSelectView::OnNotify(HWND hWnd, WPARAM wParam, LPARAM lParam)
415 {
416 LPNM_TREEVIEW pHdr = (LPNM_TREEVIEW)lParam;
417
418 #if defined(PLATFORM_PKTPC) || defined(PLATFORM_WM5)
419 NMRGINFO *pnmrginfo = (PNMRGINFO)lParam;
420 if (pnmrginfo->hdr.code == GN_CONTEXTMENU) {
421 // tap & hold
422 OnNotify_RClick(pnmrginfo->ptAction);
423 return TRUE;
424 }
425 #endif
426
427 switch(pHdr->hdr.code) {
428 // case NM_CLICK:
429 // g_Logger.WriteLog("NM_CLICK\r\n");
430 // return 0;
431 case NM_DBLCLK:
432 {
433 // g_Logger.WriteLog("NM_DBLCLK\r\n");
434 HTREEITEM hItem = TreeView_GetSelection(hViewWnd);
435 TV_ITEM it;
436 it.mask = TVIF_PARAM;
437 it.hItem = hItem;
438
439 TreeView_GetItem(hViewWnd, &it);
440 TreeViewItem *tvi = (TreeViewItem*)it.lParam;
441 if (!tvi) break;
442
443 if (!tvi->HasMultiItem()) {
444 const TomboURI *pURI = ((TreeViewFileItem*)tvi)->GetRealURI();
445 GetManager()->GetMainFrame()->LoadMemo(pURI, TRUE);
446 pMemoMgr->GetMainFrame()->PostSwitchView();
447 return 0;
448 }
449 // ������Expand/Collapse������
450 }
451 break;
452 case NM_RETURN:
453 {
454 // DBLCLK�������A�[���I���c���[���J������������������
455 HTREEITEM hItem = TreeView_GetSelection(hViewWnd);
456 TV_ITEM it;
457 it.mask = TVIF_PARAM | TVIF_STATE;
458 it.hItem = hItem;
459 it.stateMask = TVIS_EXPANDED;
460 TreeView_GetItem(hViewWnd, &it);
461
462 TreeViewItem *tvi = (TreeViewItem*)it.lParam;
463 if (!tvi) break;
464
465 if (tvi->HasMultiItem()) {
466 ToggleExpandFolder(hItem, it.state & TVIS_EXPANDED);
467 } else {
468 // switch to edit view
469 tvi->LoadMemo(this, TRUE);
470 pMemoMgr->GetMainFrame()->ActivateView(MainFrame::VT_DetailsView);
471 }
472 }
473 break;
474 case TVN_SELCHANGING:
475 {
476 #if defined(PLATFORM_WIN32) || defined(PLATFORM_HPC)
477 // 2-Pane View���������� �����������������������A����
478 // �����m�F���L�����Z���������������A�A�C�e��������������
479 // �F��������������
480 if (!g_Property.GetUseTwoPane() || !pMemoMgr) return FALSE;
481
482 DWORD nYNC;
483 if (!pMemoMgr->SaveIfModify(&nYNC, FALSE)) {
484 TCHAR buf[1024];
485 wsprintf(buf, MSG_SAVE_FAILED, GetLastError());
486 pMemoMgr->GetMainFrame()->MessageBox(buf, TEXT("ERROR"), MB_ICONSTOP | MB_OK | MB_APPLMODAL);
487
488 // stop the change
489 return TRUE;
490 }
491 switch(nYNC) {
492 case IDCANCEL:
493 // cancel
494 return TRUE;
495 case IDOK:
496 /* fall through */
497 case IDYES:
498 return FALSE;
499 case IDNO:
500 // celar note
501 pMemoMgr->GetDetailsView()->DiscardMemo();
502 return FALSE;
503 }
504 #endif
505 return FALSE;
506 }
507
508 case TVN_SELCHANGED:
509 {
510 NMTREEVIEW *p = (LPNMTREEVIEW)lParam;
511 TreeViewItem *tvi = (TreeViewItem*)((p->itemNew).lParam);
512 if (tvi == NULL) {
513 break;
514 }
515 // Control menu item
516 ControlMenu();
517
518 if (g_Property.GetUseTwoPane() && (p->action == TVC_BYMOUSE || p->action == TVC_BYKEYBOARD)) {
519 // change notes if operated by user. Otherwise no switching occured.
520 pMemoMgr->SetMSSearchFlg(TRUE);
521 tvi->LoadMemo(this, FALSE);
522 }
523 }
524 break;
525 case TVN_ITEMEXPANDING:
526 if (pHdr->action == TVE_EXPAND) {
527 TreeExpand(pHdr->itemNew.hItem);
528 } else {
529 TreeCollapse(pHdr->itemNew.hItem);
530 }
531 return FALSE;
532 #if !defined(PLATFORM_WM5)
533 case TVN_BEGINLABELEDIT:
534 {
535 TreeViewItem *pItem = (TreeViewItem*)(((LPNMTVDISPINFO)lParam)->item.lParam);
536 if (pItem && !pItem->IsOperationEnabled(this, TreeViewItem::OpRename)) return TRUE;
537 return FALSE;
538 }
539 case TVN_ENDLABELEDIT:
540 {
541 LPNMTVDISPINFO p = (LPNMTVDISPINFO)lParam;
542 return EditLabel(&(p->item));
543 }
544 #endif
545 #if defined(PLATFORM_WIN32)
546 case NM_RCLICK:
547 {
548 POINT pt, pth;
549 GetCursorPos(&pt);
550 pth = pt;
551 OnNotify_RClick(pt);
552 break;
553 }
554 #endif
555
556 }
557 // return for each handler if it need return values.
558 return 0xFFFFFFFF;
559 }
560
561 #if defined(PLATFORM_WIN32) || defined(PLATFORM_HPC) || defined(PLATFORM_PKTPC) || defined(PLATFORM_WM5)
562 void MemoSelectView::OnNotify_RClick(POINT pt)
563 {
564 TV_HITTESTINFO hti;
565 POINT cpt = pt;
566 #if defined(PLATFORM_WIN32) || defined(PLATFORM_PKTPC) || defined(PLATFORM_WM5)
567 ScreenToClient(hViewWnd, &cpt);
568 #endif
569 hti.pt = cpt;
570 HTREEITEM hX = TreeView_HitTest(hViewWnd, &hti);
571
572 if (hti.hItem == NULL) return;
573 TreeViewItem *pItem = GetTVItem(hti.hItem);
574
575 TreeView_SelectItem(hViewWnd, hti.hItem);
576
577 DWORD nFlg;
578 if (pItem->HasMultiItem()) {
579 nFlg = CTXMENU_DIR;
580 } else {
581 TreeViewFileItem *pFileItem = (TreeViewFileItem*)pItem;
582 const TomboURI *pURI = pFileItem->GetRealURI();
583 URIOption opt(NOTE_OPTIONMASK_ENCRYPTED);
584 g_Repository.GetOption(pURI, &opt);
585
586 nFlg = CTXMENU_FILE | (g_Property.GetUseAssociation() ? CTXMENU_USEASSOC : 0);
587 if (!opt.bEncrypt) {
588 nFlg |= CTXMENU_ENABLEEXTAPP;
589 }
590 }
591
592 HMENU hMenu = PlatformLayer::LoadContextMenu(nFlg);
593
594 ControlSubMenu(hMenu, IDM_ENCRYPT, pItem->IsOperationEnabled(this, TreeViewItem::OpEncrypt));
595 ControlSubMenu(hMenu, IDM_DECRYPT, pItem->IsOperationEnabled(this, TreeViewItem::OpDecrypt));
596 ControlSubMenu(hMenu, IDM_CUT, pItem->IsOperationEnabled(this, TreeViewItem::OpCut));
597 ControlSubMenu(hMenu, IDM_COPY, pItem->IsOperationEnabled(this, TreeViewItem::OpCopy));
598 ControlSubMenu(hMenu, IDM_PASTE, pItem->IsOperationEnabled(this, TreeViewItem::OpPaste));
599 ControlSubMenu(hMenu, IDM_RENAME, pItem->IsOperationEnabled(this, TreeViewItem::OpRename));
600 ControlSubMenu(hMenu, IDM_DELETEITEM, pItem->IsOperationEnabled(this, TreeViewItem::OpDelete));
601 ControlSubMenu(hMenu, IDM_NEWFOLDER, pItem->IsOperationEnabled(this, TreeViewItem::OpNewFolder));
602 ControlSubMenu(hMenu, IDM_SEARCH, pItem->IsOperationEnabled(this, TreeViewItem::OpGrep));
603 ControlSubMenu(hMenu, IDM_TRACELINK, pItem->IsOperationEnabled(this, TreeViewItem::OpLink));
604
605 DWORD id = TrackPopupMenuEx(hMenu, TPM_RETURNCMD | TPM_TOPALIGN | TPM_LEFTALIGN, pt.x, pt.y, hViewWnd, NULL);
606 DestroyMenu(hMenu);
607
608 switch(id) {
609 case IDM_CUT:
610 OnCut(pItem);
611 break;
612 case IDM_COPY:
613 OnCopy(pItem);
614 break;
615 case IDM_PASTE:
616 OnPaste();
617 break;
618 case IDM_ENCRYPT:
619 OnEncrypt(pItem);
620 break;
621 case IDM_DECRYPT:
622 OnDecrypt(pItem);
623 break;
624 case IDM_RENAME:
625 OnEditLabel(hti.hItem);
626 break;
627 case IDM_DELETEITEM:
628 OnDelete(hti.hItem, pItem);
629 break;
630 case IDM_NEWFOLDER:
631 pMemoMgr->GetMainFrame()->NewFolder(pItem);
632 break;
633 case IDM_SEARCH:
634 TreeView_SelectItem(hViewWnd, hti.hItem);
635 pMemoMgr->GetMainFrame()->OnSearch();
636 break;
637 case IDM_TRACELINK:
638 {
639 TreeViewFileLink *p = (TreeViewFileLink*)pItem;
640 ShowItemByURI(p->GetRealURI(), TRUE, FALSE);
641 }
642 break;
643 case IDM_ASSOC:
644 TreeView_SelectItem(hViewWnd, hti.hItem);
645 pItem->ExecApp(pMemoMgr, this, ExecType_Assoc);
646 break;
647 case IDM_EXTAPP1:
648 TreeView_SelectItem(hViewWnd, hti.hItem);
649 pItem->ExecApp(pMemoMgr, this, ExecType_ExtApp1);
650 break;
651 case IDM_EXTAPP2:
652 TreeView_SelectItem(hViewWnd, hti.hItem);
653 pItem->ExecApp(pMemoMgr, this, ExecType_ExtApp2);
654 break;
655 }
656 }
657 #endif
658 ///////////////////////////////////////////
659 // OnCommand handler
660 ///////////////////////////////////////////
661
662 BOOL MemoSelectView::OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
663 {
664 HTREEITEM hItem;
665 TreeViewItem *pItem = GetCurrentItem(&hItem);
666
667 switch(LOWORD(wParam)) {
668 case IDM_ENCRYPT:
669 OnEncrypt(pItem);
670 return TRUE;
671 case IDM_DECRYPT:
672 OnDecrypt(pItem);
673 return TRUE;
674 case IDM_DELETEITEM:
675 // DEL key is handled by SelectView findows procedure, but leave this chunk for sending WM_COMMAND
676 OnDelete(hItem, pItem);
677 return TRUE;
678 case IDM_ACTIONBUTTON:
679 OnActionButton(hWnd);
680 return TRUE;
681 case IDM_CUT:
682 // Cut/Copy/Paste key is handled by SelectView findows procedure, but leave this chunk for sending WM_COMMAND
683 OnCut(pItem);
684 return TRUE;
685 case IDM_COPY:
686 OnCopy(pItem);
687 return TRUE;
688 case IDM_PASTE:
689 OnPaste();
690 return TRUE;
691 case IDM_RENAME:
692 OnEditLabel(hItem);
693 return TRUE;
694 #if defined(PLATFORM_BE500)
695 case IDM_EXTAPP1:
696 pItem->ExecApp(pMemoMgr, this, ExecType_ExtApp1);
697 return TRUE;
698 case IDM_EXTAPP2:
699 pItem->ExecApp(pMemoMgr, this, ExecType_ExtApp2);
700 return TRUE;
701 #endif
702 }
703 return FALSE;
704 }
705
706 ///////////////////////////////////////////
707 // HotKey
708 ///////////////////////////////////////////
709
710 BOOL MemoSelectView::OnHotKey(HWND hWnd, WPARAM wParam)
711 {
712 switch(wParam) {
713 case APP_BUTTON1:
714 /* fall through */
715 case APP_BUTTON2:
716 /* fall through */
717 case APP_BUTTON3:
718 /* fall through */
719 case APP_BUTTON4:
720 /* fall through */
721 case APP_BUTTON5:
722 OnActionButton(hWnd);
723 return TRUE;
724 default:
725 return FALSE;
726 }
727 }
728
729 ///////////////////////////////////////////
730 // Encrypt
731 ///////////////////////////////////////////
732
733 void MemoSelectView::OnEncrypt(TreeViewItem *pItem)
734 {
735 if (!pItem->Encrypt(pMemoMgr, this)) {
736 TCHAR buf[1024];
737 wsprintf(buf, MSG_ENCRYPTION_FAILED, GetLastError());
738 TomboMessageBox(hViewWnd, buf, TEXT("ERROR"), MB_ICONSTOP | MB_OK);
739 }
740 }
741
742 ///////////////////////////////////////////
743 // Decrypt
744 ///////////////////////////////////////////
745
746 void MemoSelectView::OnDecrypt(TreeViewItem *pItem)
747 {
748 if (!pItem->Decrypt(pMemoMgr, this)) {
749 TCHAR buf[1024];
750 wsprintf(buf, MSG_DECRYPTION_FAILED, GetLastError());
751 TomboMessageBox(hViewWnd, buf, TEXT("ERROR"), MB_ICONSTOP | MB_OK);
752 }
753 }
754
755 /////////////////////////////////////////////
756 // Rename
757 /////////////////////////////////////////////
758
759 void MemoSelectView::OnEditLabel(HTREEITEM hItem)
760 {
761 #if defined(PLATFORM_WM5)
762 TCHAR buf[MAX_PATH];
763 TV_ITEM item;
764 item.mask = TVIF_TEXT | TVIF_PARAM;
765 item.hItem = hItem;
766 item.cchTextMax = MAX_PATH;
767 item.pszText = buf;
768 TreeView_GetItem(hViewWnd, &item);
769
770 NewFolderDialog dlg;
771 dlg.SetOption(MSG_ID_MENUITEM_MAIN_RENAME, buf);
772 if (dlg.Popup(g_hInstance, hViewWnd) == IDOK) {
773 TreeViewItem *pti = (TreeViewItem*)(item.lParam);
774 if (pti == NULL) return;
775 pti->Rename(pMemoMgr, this, dlg.FolderName());
776
777 item.mask = TVIF_TEXT;
778 item.cchTextMax = _tcslen(dlg.FolderName());
779 item.pszText = (LPTSTR)dlg.FolderName();
780 TreeView_SetItem(hViewWnd, &item);
781 }
782 #else
783 if (hItem == NULL) return;
784 TreeView_EditLabel(hViewWnd, hItem);
785 return;
786 #endif
787 }
788
789 ///////////////////////////////////////////
790 // delete
791 ///////////////////////////////////////////
792
793 void MemoSelectView::OnDelete(HTREEITEM hItem, TreeViewItem *pItem)
794 {
795 if (hItem == NULL) return;
796 if (pItem->Delete(pMemoMgr, this)) {
797 DeleteOneItem(hItem);
798 }
799 }
800
801 ///////////////////////////////////////////
802 // get window size
803 ///////////////////////////////////////////
804
805 void MemoSelectView::GetSize(LPWORD pWidth, LPWORD pHeight)
806 {
807 RECT r;
808 GetWindowRect(hViewWnd, &r);
809 *pWidth = (WORD)(r.right - r.left);
810 *pHeight = (WORD)(r.bottom - r.top);
811 }
812
813 void MemoSelectView::GetSize(LPRECT pRect)
814 {
815 GetWindowRect(hViewWnd, pRect);
816 }
817
818 void MemoSelectView::GetClientRect(LPRECT pRect)
819 {
820 ::GetClientRect(hViewWnd, pRect);
821 }
822
823 ///////////////////////////////////////////
824 // get path
825 ///////////////////////////////////////////
826
827 LPTSTR MemoSelectView::GeneratePath(HTREEITEM hItem, LPTSTR pBuf, DWORD nSiz)
828 {
829 HWND hTree = hViewWnd;
830
831 LPTSTR p = pBuf + nSiz - 2;
832 *(p+1) = TEXT('\0');
833
834 LPTSTR pPrev;
835
836 TV_ITEM it;
837 TCHAR buf[MAX_PATH];
838
839 HTREEITEM h = hItem;
840 it.mask = TVIF_HANDLE | TVIF_TEXT;
841 it.pszText = buf;
842
843 while(h) {
844 it.hItem = h;
845 it.cchTextMax = MAX_PATH;
846 TreeView_GetItem(hTree, &it);
847
848 DWORD l = _tcslen(buf);
849 pPrev = p + 1;
850 *p-- = TEXT('\\');
851 p -= l - 1;
852 _tcsncpy(p, buf, l);
853 p--;
854 h = TreeView_GetParent(hTree, h);
855 }
856 return pPrev;
857 }
858
859 void MemoSelectView::TreeExpand(HTREEITEM hItem)
860 {
861 // delete dummy child nodes.
862 HTREEITEM di = TreeView_GetChild(hViewWnd, hItem);
863 DeleteItemsRec(di);
864
865 // change icon to "EXPANDING".
866 TreeViewItem *pItem = GetTVItem(hItem);
867 SetIcon(pItem, MEMO_VIEW_STATE_OPEN_SET);
868
869 if (!pItem->HasMultiItem()) {
870 MessageBox(NULL, TEXT("This node does'nt have multi item"), TEXT("DEBUG"), MB_OK);
871 return;
872 }
873
874 TreeViewFolderItem *pFolder = (TreeViewFolderItem*)pItem;
875
876 // expand nodes.
877 pFolder->Expand(this);
878
879 // Close node if lower node is not exist.
880 if (TreeView_GetChild(hViewWnd, hItem) == NULL) {
881 TreeCollapse(hItem);
882 }
883 }
884
885 void MemoSelectView::TreeCollapse(HTREEITEM hItem)
886 {
887 HTREEITEM h = TreeView_GetChild(hViewWnd, hItem);
888
889 DeleteItemsRec(h); // delete nodes
890 InsertDummyNode(hViewWnd, hItem); // insert dummy child
891
892 // set icon
893 TreeViewItem *pItem = GetTVItem(hItem);
894 SetIcon(pItem, MEMO_VIEW_STATE_OPEN_CLEAR);
895
896 TreeView_Expand(hViewWnd, hItem, TVE_COLLAPSE | TVE_COLLAPSERESET);
897 }
898
899
900 ///////////////////////////////////////////
901 // move window or resize window
902 ///////////////////////////////////////////
903
904 void MemoSelectView::MoveWindow(DWORD x, DWORD y, DWORD nWidth, DWORD nHeight)
905 {
906 ::MoveWindow(hViewWnd, x, y, nWidth, nHeight, TRUE);
907 }
908
909 /////////////////////////////////////////////////////////////
910 // TreeViewItem status change notify
911 /////////////////////////////////////////////////////////////
912 // Called from TreeViewItem when icon status/headline string changed.
913 // Update treeview status and link assosiation of HTREEITEM <-> TreeViewItem
914 // and TreeViewItem <-> MemoManager.
915
916 BOOL MemoSelectView::UpdateItemStatusNotify(TreeViewItem *pItem, LPCTSTR pNewHeadLine)
917 {
918 // Get old HTREEITEM
919 HTREEITEM hOrigNode = pItem->GetViewItem();
920
921 HTREEITEM hParent = TreeView_GetParent(hViewWnd, hOrigNode);
922 if (hParent == NULL) {
923 hParent = TVI_ROOT;
924 }
925
926 // Delete from Tree. (TreeViewItem is not deleted because it will deleted at caller.)
927 TreeView_DeleteItem(hViewWnd, hOrigNode);
928
929 // Insert to tree.
930 TV_INSERTSTRUCT ti;
931 ti.hParent = hParent;
932 ti.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
933 ti.item.iImage = ti.item.iSelectedImage = pItem->GetIcon(this, 0); // Get current icon
934 ti.item.pszText = (LPTSTR)pNewHeadLine;
935 ti.item.lParam = (LPARAM)pItem;
936 HTREEITEM hItem = ::InsertNode(hViewWnd, &ti);
937
938 // link TreeViewItem <-> HTREEITEM assosiation
939 pItem->SetViewItem(hItem);
940 TreeView_SelectItem(hViewWnd, hItem);
941 return TRUE;
942 }
943
944 ///////////////////////////////////////////
945 // Action(Hardware) buttons
946 ///////////////////////////////////////////
947
948 void MemoSelectView::OnActionButton(HWND hWnd)
949 {
950 HTREEITEM hItem;
951 TreeViewItem *p = GetCurrentItem(&hItem);
952 if (p && !p->HasMultiItem()) {
953 p->OpenMemo(this, OPEN_REQUEST_MSVIEW_ACTIVE);
954 return;
955 }
956
957 RECT r;
958 TreeView_GetItemRect(hViewWnd, hItem, &r, TRUE);
959 PostMessage(hViewWnd, WM_LBUTTONDBLCLK, MK_LBUTTON, MAKELPARAM(r.left, r.top));
960 }
961
962 ///////////////////////////////////////////
963 // get item path for insert
964 ///////////////////////////////////////////
965 // if the item is node, return itself.
966 // if the item is leaf, return the parent node of the leaf
967
968 HTREEITEM MemoSelectView::GetPathForNewItem(TString *pPath, TreeViewItem *pItem)
969 {
970 TCHAR buf[MAX_PATH];
971 HTREEITEM hItem = NULL;
972
973 if (pItem == NULL) {
974 pItem = GetCurrentItem(&hItem);
975 } else {
976 hItem = pItem->GetViewItem();
977 }
978 if (hItem == NULL) {
979 if (!pPath->Alloc(1)) return NULL;
980 _tcscpy(pPath->Get(), TEXT(""));
981
982 return TreeView_GetRoot(hViewWnd);
983 }
984
985 if (pItem && !pItem->HasMultiItem()) {
986 hItem = TreeView_GetParent(hViewWnd, hItem);
987 }
988
989 LPTSTR pPathTop = GeneratePath(hItem, buf, MAX_PATH);
990 if (!pPath->Set(pPathTop)) return NULL;
991 return hItem;
992 }
993
994 ///////////////////////////////////////////
995 // carete new folder
996 ///////////////////////////////////////////
997
998 BOOL MemoSelectView::CreateNewFolder(HTREEITEM hItem, LPCTSTR pFolder)
999 {
1000 // expand the tree if it collapsed
1001 if (!IsExpand(hItem) && (TreeView_GetChild(hViewWnd, hItem) != NULL)) {
1002 // the folder inserted is automatically reloaded by expanding the tree
1003 TreeView_Expand(hViewWnd, hItem, TVE_EXPAND);
1004 } else {
1005 // if node is already expanded, insert it
1006
1007 TreeViewItem *pParent = GetTVItem(hItem);
1008 const TomboURI *pParentURI = pParent->GetRealURI();
1009 TString s;
1010 if (!s.Join(pParentURI->GetFullURI(), pFolder, TEXT("/"))) return FALSE;
1011 TomboURI sNewURI;
1012 if (!sNewURI.Init(s.Get())) return FALSE;
1013
1014 TreeViewFolderItem *pItem = new TreeViewFolderItem();
1015 pItem->SetURI(&sNewURI);
1016 InsertFolder(hItem, pFolder, pItem, FALSE);
1017 if (TreeView_GetChild(hViewWnd, hItem) != NULL) {
1018 TreeView_Expand(hViewWnd, hItem, TVE_EXPAND);
1019 }
1020 }
1021 return TRUE;
1022 }
1023
1024 BOOL MemoSelectView::MakeNewFolder(HWND hWnd, TreeViewItem *pItem)
1025 {
1026 NewFolderDialog dlg;
1027 BOOL bPrev = bDisableHotKey;
1028 bDisableHotKey = TRUE;
1029 DWORD nResult = dlg.Popup(g_hInstance, hWnd);
1030 bDisableHotKey = bPrev;
1031 if (nResult == IDOK) {
1032 LPCTSTR pFolder = dlg.FolderName();
1033
1034 TomboURI sBaseURI, sURI;
1035 if (pItem) {
1036 sBaseURI = *(pItem->GetRealURI());
1037 } else {
1038 const TomboURI *pCurSel = GetCurrentSelectedURI();
1039 if (pCurSel == NULL) return FALSE;
1040 sBaseURI = *pCurSel;
1041 }
1042
1043 if (!g_Repository.GetAttachURI(&sBaseURI, &sURI)) return FALSE;
1044 HTREEITEM hItem = GetItemFromURI(sURI.GetFullURI());
1045 if (!g_Repository.MakeFolder(&sURI, pFolder)) return FALSE;
1046 CreateNewFolder(hItem, pFolder);
1047
1048 }
1049 return TRUE;
1050 }
1051
1052 /////////////////////////////////////////
1053 // Change headline string
1054 /////////////////////////////////////////
1055 // For re-ordering, delete once and re-insert again.
1056 // New URI should locate same as old URI
1057 // URI should point to file
1058
1059 BOOL MemoSelectView::UpdateHeadLine(LPCTSTR pOldURI, TomboURI *pNewURI, LPCTSTR pNewHeadLine)
1060 {
1061 // get HTREEITEM from old URI
1062 HTREEITEM hOld = GetItemFromURI(pOldURI);
1063 if (hOld == NULL) return TRUE; // if node is collapsed, nothing to do
1064
1065 // if URI is not changed, only focusing
1066 if (_tcscmp(pOldURI, pNewURI->GetFullURI()) == 0) {
1067 TreeView_SelectItem(hViewWnd, hOld);
1068 return TRUE;
1069 }
1070
1071
1072 // get parent
1073 HTREEITEM hParent = TreeView_GetParent(hViewWnd, hOld);
1074
1075 TreeView_SelectItem(hViewWnd, NULL);
1076
1077 // remove current node
1078 DeleteOneItem(hOld);
1079
1080 // insert node
1081 HTREEITEM hNew = InsertFile(hParent, pNewURI, pNewHeadLine, FALSE, FALSE);
1082 if (hNew == NULL) return FALSE;
1083
1084 TreeView_SelectItem(hViewWnd, hNew);
1085 return TRUE;
1086 }
1087
1088 HTREEITEM MemoSelectView::GetItemFromURI(LPCTSTR pURI)
1089 {
1090 TomboURI uri;
1091 if (!uri.Init(pURI)) return NULL;
1092
1093 TString sRep;
1094 if (!uri.GetRepositoryName(&sRep)) return NULL;
1095
1096 HTREEITEM hCurrent = GetRootItem(sRep.Get());
1097 if (hCurrent == NULL) return NULL;
1098
1099 TomboURIItemIterator itr(&uri);
1100 if (!itr.Init()) return NULL;
1101
1102 LPCTSTR p;
1103 for (itr.First(); p = itr.Current(); itr.Next()) {
1104 if (itr.IsLeaf()) {
1105 DWORD n = _tcslen(p);
1106 if (n >= 4) {
1107 hCurrent = FindItem2(hViewWnd, hCurrent, p, n - 4);
1108 } else {
1109 hCurrent = FindItem2(hViewWnd, hCurrent, p, n);
1110 }
1111 } else {
1112 hCurrent = FindItem2(hViewWnd, hCurrent, p, _tcslen(p));
1113 }
1114 }
1115 return hCurrent;
1116 }
1117
1118 HTREEITEM MemoSelectView::GetRootItem(LPCTSTR pRep)
1119 {
1120 for (DWORD i = 0; i < nNumRoots; i++) {
1121 TString repName;
1122 if (!pRoots[i].uri.GetRepositoryName(&repName)) return NULL;
1123 if (_tcsicmp(repName.Get(), pRep) == 0) return pRoots[i].hItem;
1124 }
1125 return NULL;
1126 }
1127
1128 /////////////////////////////////////////
1129 // set icon
1130 /////////////////////////////////////////
1131
1132 void MemoSelectView::SetIcon(TreeViewItem *ptv, DWORD nStatus)
1133 {
1134 DWORD nImage;
1135
1136 nImage = ptv->GetIcon(this, nStatus);
1137
1138 TV_ITEM ti;
1139 ti.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
1140 ti.hItem = ptv->GetViewItem();
1141 ti.iImage = ti.iSelectedImage = nImage;
1142 TreeView_SetItem(hViewWnd, &ti);
1143 }
1144
1145 /////////////////////////////////////////
1146 // set item to psudo clipboard
1147 /////////////////////////////////////////
1148
1149 void MemoSelectView::SetShareArea(TreeViewItem *pItem)
1150 {
1151 if (pClipItem) {
1152 SetIcon(pClipItem, MEMO_VIEW_STATE_CLIPED_CLEAR);
1153 }
1154 pClipItem = pItem;
1155 if (pClipItem) {
1156 SetIcon(pClipItem, MEMO_VIEW_STATE_CLIPED_SET);
1157 }
1158 }
1159
1160 /////////////////////////////////////////
1161 // prepare move the item
1162 /////////////////////////////////////////
1163
1164 void MemoSelectView::OnCut(TreeViewItem *pItem)
1165 {
1166 SetShareArea(pItem);
1167 bCut = TRUE;
1168 }
1169
1170 /////////////////////////////////////////
1171 // prepare copy the item
1172 /////////////////////////////////////////
1173
1174 void MemoSelectView::OnCopy(TreeViewItem *pItem)
1175 {
1176 SetShareArea(pItem);
1177 bCut = FALSE;
1178 }
1179
1180 /////////////////////////////////////////
1181 // move/copy notes
1182 /////////////////////////////////////////
1183
1184 void MemoSelectView::OnPaste()
1185 {
1186 if (pClipItem == NULL) return;
1187
1188 if (bCut) {
1189 // move notes
1190 HTREEITEM hItem = pClipItem->GetViewItem();
1191 LPCTSTR pErr = NULL;
1192 if (!pClipItem->Move(pMemoMgr, this, &pErr)) {
1193 if (pErr) {
1194 TomboMessageBox(hViewWnd, pErr, TEXT("ERROR"), MB_ICONSTOP | MB_OK);
1195 } else {
1196 TomboMessageBox(hViewWnd, MSG_MOVE_MEMO_FAILED, TEXT("ERROR"), MB_ICONSTOP | MB_OK);
1197 }
1198 return;
1199 }
1200 DeleteOneItem(hItem);
1201 } else {
1202 // copy notes
1203 LPCTSTR pErr = NULL;
1204 if (!pClipItem->Copy(pMemoMgr, this, &pErr)) {
1205 if (pErr) {
1206 TomboMessageBox(hViewWnd, pErr, TEXT("ERROR"), MB_ICONSTOP | MB_OK);
1207 } else {
1208 TomboMessageBox(hViewWnd, MSG_COPY_MEMO_FAILED, TEXT("ERROR"), MB_ICONSTOP | MB_OK);
1209 }
1210 }
1211 }
1212 }
1213
1214 /////////////////////////////////////////
1215 // Control menu
1216 /////////////////////////////////////////
1217
1218 void MemoSelectView::ControlMenu()
1219 {
1220 MainFrame *pMf = pMemoMgr->GetMainFrame();
1221 if (pMf == NULL) return;
1222
1223 TreeViewItem *pItem = GetCurrentItem();
1224 if (pItem) {
1225 pMf->EnableDelete(pItem->IsOperationEnabled(this, TreeViewItem::OpDelete));
1226 pMf->EnableRename(pItem->IsOperationEnabled(this, TreeViewItem::OpRename));
1227
1228 pMf->EnableEncrypt(pItem->IsOperationEnabled(this, TreeViewItem::OpEncrypt));
1229 pMf->EnableDecrypt(pItem->IsOperationEnabled(this, TreeViewItem::OpDecrypt));
1230
1231 pMf->EnableNew(pItem->IsOperationEnabled(this, TreeViewItem::OpNewMemo));
1232 pMf->EnableNewFolder(pItem->IsOperationEnabled(this, TreeViewItem::OpNewFolder));
1233
1234 pMf->EnableCut(pItem->IsOperationEnabled(this, TreeViewItem::OpCut));
1235 pMf->EnableCopy(pItem->IsOperationEnabled(this, TreeViewItem::OpCopy));
1236 pMf->EnablePaste(pItem->IsOperationEnabled(this, TreeViewItem::OpPaste));
1237
1238 pMf->EnableGrep(pItem->IsOperationEnabled(this, TreeViewItem::OpGrep));
1239
1240 } else {
1241 pMf->EnableDelete(FALSE);
1242 pMf->EnableRename(FALSE);
1243 pMf->EnableEncrypt(FALSE);
1244 pMf->EnableDecrypt(FALSE);
1245
1246 pMf->EnableCut(FALSE);
1247 pMf->EnableCopy(FALSE);
1248 pMf->EnablePaste(FALSE);
1249 }
1250 }
1251
1252 /////////////////////////////////////////
1253 // acquire forcusing
1254 /////////////////////////////////////////
1255
1256 void MemoSelectView::OnGetFocus()
1257 {
1258 MainFrame *pMf = pMemoMgr->GetMainFrame();
1259 if (pMf) {
1260 pMf->ActivateView(MainFrame::VT_SelectView);
1261 }
1262 ControlMenu();
1263 }
1264
1265 /////////////////////////////////////////
1266 // set font
1267 /////////////////////////////////////////
1268
1269 void MemoSelectView::SetFont(HFONT hFont)
1270 {
1271 SendMessage(hViewWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
1272 }
1273
1274 ///////////////////////////////////////////
1275 // expand/collapse tree
1276 ///////////////////////////////////////////
1277
1278 void MemoSelectView::ToggleExpandFolder(HTREEITEM hItem, UINT status)
1279 {
1280 if (status & TVIS_EXPANDED) {
1281 TreeCollapse(hItem);
1282 } else {
1283 TreeView_Expand(hViewWnd, hItem, TVE_EXPAND);
1284 TreeExpand(hItem);
1285 }
1286 }
1287
1288 /////////////////////////////////////////////
1289 // get TreeViewItem from HTREEITEM
1290 /////////////////////////////////////////////
1291
1292 TreeViewItem *MemoSelectView::GetTVItem(HTREEITEM h)
1293 {
1294 TV_ITEM ti;
1295 ti.mask = TVIF_PARAM;
1296 ti.hItem = h;
1297 TreeView_GetItem(hViewWnd, &ti);
1298 return (TreeViewItem*)ti.lParam;
1299 }
1300
1301 /////////////////////////////////////////////
1302 // Insert dummy node
1303 /////////////////////////////////////////////
1304 // to add "+" icon, insert dummy node if a folder which don't have no chil.
1305
1306 static void InsertDummyNode(HWND hTree, HTREEITEM hItem)
1307 {
1308 TV_INSERTSTRUCT tisub;
1309 tisub.hParent = hItem;
1310 tisub.hInsertAfter = TVI_LAST;
1311 tisub.item.mask = TVIF_PARAM;
1312 tisub.item.lParam = NULL;
1313 TreeView_InsertItem(hTree, &tisub);
1314 }
1315
1316 /////////////////////////////////////////////
1317 // Rename
1318 /////////////////////////////////////////////
1319 //
1320 // Result: TRUE = accept label change
1321 // FALSE = refuse label change
1322
1323 LRESULT MemoSelectView::EditLabel(TVITEM *pItem)
1324 {
1325 if (pItem->pszText == NULL) return FALSE;
1326
1327 TreeViewItem *pti = (TreeViewItem*)(pItem->lParam);
1328 if (pti == NULL) return FALSE;
1329 return pti->Rename(pMemoMgr, this, pItem->pszText);
1330 }
1331
1332 /////////////////////////////////////////////
1333 // Expand tree and show note
1334 /////////////////////////////////////////////
1335
1336 static HTREEITEM FindItem2(HWND hWnd, HTREEITEM hParent, LPCTSTR pStr, DWORD nLen)
1337 {
1338 HTREEITEM hItem = TreeView_GetChild(hWnd, hParent);
1339 TV_ITEM ti;
1340
1341 TCHAR buf[MAX_PATH + 1];
1342 ti.mask = TVIF_TEXT | TVIF_PARAM;
1343 ti.cchTextMax = MAX_PATH;
1344 ti.pszText = buf;
1345
1346 while(hItem) {
1347 ti.hItem = hItem;
1348 TreeView_GetItem(hWnd, &ti);
1349
1350 if (_tcsnicmp(buf, pStr, nLen) == 0 && *(buf + nLen) == TEXT('\0')) {
1351 return hItem;
1352 }
1353
1354 hItem = TreeView_GetNextSibling(hWnd, hItem);
1355 }
1356 return NULL;
1357 }
1358
1359 HTREEITEM MemoSelectView::ShowItemByURI(const TomboURI *pURI, BOOL bSelChange, BOOL bOpenNotes)
1360 {
1361 HTREEITEM hCurrent;
1362
1363 // get root node
1364 TString sRepo;
1365 if (!pURI->GetRepositoryName(&sRepo)) return FALSE;
1366 hCurrent = GetRootItem(sRepo.Get());
1367 if (hCurrent == NULL) return NULL;
1368
1369 // expand root node
1370 if (!IsExpand(hCurrent)) {
1371 TreeView_Expand(hViewWnd, hCurrent, TVE_EXPAND);
1372 }
1373
1374 if (bSelChange) TreeView_SelectItem(hViewWnd, hCurrent);
1375
1376 TomboURIItemIterator itr(pURI);
1377 if (!itr.Init()) return NULL;
1378
1379 TreeViewItem *pItem = NULL;
1380 LPCTSTR p;
1381 for (itr.First(); p = itr.Current(); itr.Next()) {
1382 HTREEITEM h;
1383 if (itr.IsLeaf()) {
1384 TString sHeadLine;
1385 if (!g_Repository.GetHeadLine(pURI, &sHeadLine)) return NULL;
1386 h = FindItem2(hViewWnd, hCurrent, sHeadLine.Get(), _tcslen(sHeadLine.Get()));
1387 } else {
1388 h = FindItem2(hViewWnd, hCurrent, p, _tcslen(p));
1389 }
1390
1391 if (h) {
1392 hCurrent = h;
1393
1394 pItem = GetTVItem(hCurrent);
1395
1396 if (pItem->HasMultiItem() && !IsExpand(hCurrent)) {
1397 TreeView_Expand(hViewWnd, hCurrent, TVE_EXPAND);
1398 }
1399 }
1400 }
1401
1402 if (hCurrent && bSelChange) {
1403 TreeView_SelectItem(hViewWnd, hCurrent);
1404 }
1405
1406 if (pItem) {
1407 DWORD nOption = bOpenNotes ? OPEN_REQUEST_MSVIEW_ACTIVE : OPEN_REQUEST_MDVIEW_ACTIVE;
1408 pItem->OpenMemo(this, nOption);
1409 }
1410 return hCurrent;
1411 }
1412
1413 /////////////////////////////////////////////
1414 // Insert grep result
1415 /////////////////////////////////////////////
1416
1417 BOOL MemoSelectView::InsertVirtualFolder(const VFInfo *pInfo)
1418 {
1419 HTREEITEM hSearchRoot = GetRootItem(VFOLDER_REPO_NAME);
1420 TreeViewVirtualFolderRoot *pVFRoot = (TreeViewVirtualFolderRoot*)GetTVItem(hSearchRoot);
1421 return pVFRoot->AddSearchResult(this, pInfo);
1422 }
1423
1424 /////////////////////////////////////////////
1425 // Get virtual folder root instance
1426 /////////////////////////////////////////////
1427 void MemoSelectView::CloseVFRoot()
1428 {
1429 HTREEITEM hSearchRoot = GetRootItem(VFOLDER_REPO_NAME);
1430 if (IsExpand(hSearchRoot)) {
1431 TreeCollapse(hSearchRoot);
1432 }
1433 }
1434
1435 /////////////////////////////////////////////
1436 // select node
1437 /////////////////////////////////////////////
1438
1439 void MemoSelectView::SelUpFolderWithoutOpen()
1440 {
1441 HTREEITEM hItem;
1442 TreeViewItem *pItem = GetCurrentItem(&hItem);
1443 HTREEITEM hParent = TreeView_GetParent(hViewWnd, hItem);
1444 if (hParent) {
1445 TreeView_SelectItem(hViewWnd, hParent);
1446 }
1447 }
1448
1449 void MemoSelectView::SelNextBrother()
1450 {
1451 HTREEITEM hItem;
1452 TreeViewItem *pItem = GetCurrentItem(&hItem);
1453
1454 HTREEITEM h = TreeView_GetNextSibling(hViewWnd, hItem);
1455 if (h) {
1456 TreeView_SelectItem(hViewWnd, h);
1457 }
1458 }
1459
1460 void MemoSelectView::SelPrevBrother()
1461 {
1462 HTREEITEM hItem;
1463 TreeViewItem *pItem = GetCurrentItem(&hItem);
1464
1465 HTREEITEM h = TreeView_GetPrevSibling(hViewWnd, hItem);
1466 if (h) {
1467 TreeView_SelectItem(hViewWnd, h);
1468 }
1469 }
1470
1471 static HIMAGELIST CreateSelectViewImageList(HINSTANCE hInst)
1472 {
1473 HIMAGELIST hImageList;
1474 // Create Imagelist.
1475 if ((hImageList = ImageList_Create(IMAGE_CX, IMAGE_CY, ILC_MASK, NUM_MEMOSELECT_BITMAPS, 0)) == NULL) return NULL;
1476 #if defined(FOR_VGA)
1477 HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MEMOSELECT_IMAGES24));
1478 #else
1479 HBITMAP hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MEMOSELECT_IMAGES));
1480 #endif
1481 // Transparent color is GREEN
1482 COLORREF rgbTransparent = RGB(0,255,0);
1483 ImageList_AddMasked(hImageList, hBmp, rgbTransparent);
1484 DeleteObject(hBmp);
1485
1486 return hImageList;
1487 }

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