Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1270 lines
30 KiB

  1. // LeftView.cpp : implementation of the CLeftView class
  2. //
  3. #include "stdafx.h"
  4. #define __FILE_ID__ 4
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. extern CClientConsoleApp theApp;
  11. CImageList CLeftView::m_ImageList;
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CLeftView
  14. IMPLEMENT_DYNCREATE(CLeftView, CTreeView)
  15. BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
  16. //{{AFX_MSG_MAP(CLeftView)
  17. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnTreeSelChanged)
  18. ON_NOTIFY_REFLECT(NM_RCLICK, OnRightClick)
  19. ON_WM_CHAR( )
  20. //}}AFX_MSG_MAP
  21. END_MESSAGE_MAP()
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CLeftView construction/destruction
  24. CLeftView::CLeftView() :
  25. m_treeitemRoot (NULL),
  26. m_pCurrentView(NULL),
  27. m_iLastActivityStringId(0)
  28. {}
  29. CLeftView::~CLeftView()
  30. {}
  31. BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
  32. {
  33. return CTreeView::PreCreateWindow(cs);
  34. }
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CLeftView drawing
  37. void CLeftView::OnDraw(CDC* pDC)
  38. {
  39. CClientConsoleDoc* pDoc = GetDocument();
  40. ASSERT_VALID(pDoc);
  41. }
  42. DWORD
  43. CLeftView::RefreshImageList ()
  44. {
  45. HIMAGELIST himl = NULL;
  46. DWORD dwRes = ERROR_SUCCESS;
  47. DBG_ENTER(TEXT("CLeftView::RefreshImageList"), dwRes);
  48. //
  49. // Build and load the image list
  50. //
  51. himl = m_ImageList.Detach();
  52. if (himl)
  53. {
  54. ImageList_Destroy(himl);
  55. }
  56. himl = ImageList_LoadImage(AfxGetResourceHandle(),
  57. MAKEINTRESOURCE(IDB_TREE_IMAGES),
  58. 16,
  59. 0,
  60. RGB(0, 255, 0),
  61. IMAGE_BITMAP,
  62. LR_LOADTRANSPARENT | LR_CREATEDIBSECTION);
  63. if (NULL == himl)
  64. {
  65. dwRes = GetLastError();
  66. CALL_FAIL (RESOURCE_ERR, TEXT("ImageList_LoadImage"), dwRes);
  67. }
  68. else
  69. {
  70. m_ImageList.Attach (himl);
  71. }
  72. GetTreeCtrl().SetImageList (&m_ImageList, TVSIL_NORMAL);
  73. return dwRes;
  74. } // CLeftView::RefreshImageList
  75. void CLeftView::OnInitialUpdate()
  76. {
  77. DWORD dwRes;
  78. DBG_ENTER(TEXT("CLeftView::OnInitialUpdate"));
  79. CTreeView::OnInitialUpdate();
  80. CClientConsoleDoc* pDoc = GetDocument();
  81. if(!pDoc)
  82. {
  83. ASSERTION(pDoc);
  84. PopupError (ERROR_GEN_FAILURE);
  85. return;
  86. }
  87. //
  88. // Set the style of the tree
  89. //
  90. CTreeCtrl &Tree = GetTreeCtrl();
  91. LONG lWnd = GetWindowLong (Tree.m_hWnd, GWL_STYLE);
  92. if (!lWnd)
  93. {
  94. dwRes = GetLastError ();
  95. CALL_FAIL (WINDOW_ERR, TEXT("GetWindowLong"), dwRes);
  96. PopupError (dwRes);
  97. return;
  98. }
  99. lWnd |= (TVS_HASLINES | // Lines between node
  100. TVS_HASBUTTONS | // Tree has +/- (expand/collapse) buttons
  101. TVS_INFOTIP | // Allow tooltip messages
  102. TVS_LINESATROOT | // Root object has lines
  103. TVS_SHOWSELALWAYS // Always show selected node
  104. );
  105. if (!SetWindowLong (Tree.m_hWnd, GWL_STYLE, lWnd))
  106. {
  107. dwRes = GetLastError ();
  108. CALL_FAIL (WINDOW_ERR, TEXT("SetWindowLong"), dwRes);
  109. PopupError (dwRes);
  110. return;
  111. }
  112. RefreshImageList();
  113. //
  114. // Create the 4 views of the 4 different folder types.
  115. //
  116. CMainFrame *pFrm = GetFrm();
  117. if (!pFrm)
  118. {
  119. //
  120. // Shutdown in progress
  121. //
  122. return;
  123. }
  124. dwRes = pFrm->CreateFolderViews (GetDocument());
  125. if (ERROR_SUCCESS != dwRes)
  126. {
  127. CALL_FAIL (GENERAL_ERR, TEXT("CMainFrame::CreateFolderViews"), dwRes);
  128. PopupError (dwRes);
  129. return;
  130. }
  131. //
  132. // Build root node
  133. //
  134. CString cstrNodeName;
  135. dwRes = LoadResourceString (cstrNodeName, IDS_TREE_ROOT_NAME);
  136. if (ERROR_SUCCESS != dwRes)
  137. {
  138. CALL_FAIL (GENERAL_ERR, TEXT("LoadResourceString"), dwRes);
  139. PopupError (dwRes);
  140. return;
  141. }
  142. CString& cstrSingleServer = pDoc->GetSingleServerName();
  143. if(!cstrSingleServer.IsEmpty())
  144. {
  145. CString cstrRoot;
  146. try
  147. {
  148. cstrRoot.Format(TEXT("%s (%s)"), cstrNodeName, cstrSingleServer);
  149. cstrNodeName = cstrRoot;
  150. }
  151. catch(...)
  152. {
  153. dwRes = ERROR_NOT_ENOUGH_MEMORY;
  154. CALL_FAIL (MEM_ERR, TEXT("CString operation"), dwRes);
  155. PopupError (dwRes);
  156. return;
  157. }
  158. }
  159. m_treeitemRoot = Tree.InsertItem (cstrNodeName);
  160. if (NULL == m_treeitemRoot)
  161. {
  162. dwRes = ERROR_GEN_FAILURE;
  163. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::InsertItem"), dwRes);
  164. PopupError (dwRes);
  165. return;
  166. }
  167. Tree.SetItemImage (m_treeitemRoot, TREE_IMAGE_ROOT, TREE_IMAGE_ROOT);
  168. //
  169. // Set the item data of the root to NULL.
  170. //
  171. Tree.SetItemData (m_treeitemRoot, 0);
  172. HTREEITEM hItemIncoming;
  173. HTREEITEM hItemInbox;
  174. HTREEITEM hItemOutbox;
  175. HTREEITEM hItemSentItems;
  176. //
  177. // Add Incoming
  178. //
  179. dwRes = SyncFolderNode (m_treeitemRoot, // Parent node
  180. TRUE, // Visible?
  181. IDS_TREE_NODE_INCOMING, // node string
  182. TVI_LAST, // Insert after (= TVI_FIRST)
  183. TREE_IMAGE_INCOMING, // Normal icon
  184. TREE_IMAGE_INCOMING, // Selected icon
  185. (LPARAM)pFrm->GetIncomingView(), // Node's data
  186. hItemIncoming);
  187. if (ERROR_SUCCESS != dwRes)
  188. {
  189. CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes);
  190. PopupError (dwRes);
  191. return;
  192. }
  193. //
  194. // Add Inbox
  195. //
  196. dwRes = SyncFolderNode (m_treeitemRoot, // Parent node
  197. TRUE, // Visible?
  198. IDS_TREE_NODE_INBOX, // node string
  199. TVI_LAST, // Insert after (= TVI_FIRST)
  200. TREE_IMAGE_INBOX, // Normal icon
  201. TREE_IMAGE_INBOX, // Selected icon
  202. (LPARAM)pFrm->GetInboxView(), // Node's data
  203. hItemInbox);
  204. if (ERROR_SUCCESS != dwRes)
  205. {
  206. CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes);
  207. PopupError (dwRes);
  208. return;
  209. }
  210. //
  211. // Add Outbox
  212. //
  213. dwRes = SyncFolderNode (m_treeitemRoot, // Parent node
  214. TRUE, // Visible?
  215. IDS_TREE_NODE_OUTBOX, // node string
  216. TVI_LAST, // Insert after (= TVI_FIRST)
  217. TREE_IMAGE_OUTBOX, // Normal icon
  218. TREE_IMAGE_OUTBOX, // Selected icon
  219. (LPARAM)pFrm->GetOutboxView(), // Node's data
  220. hItemOutbox);
  221. if (ERROR_SUCCESS != dwRes)
  222. {
  223. CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes);
  224. PopupError (dwRes);
  225. return;
  226. }
  227. //
  228. // Add SentItems
  229. //
  230. dwRes = SyncFolderNode (m_treeitemRoot, // Parent node
  231. TRUE, // Visible?
  232. IDS_TREE_NODE_SENT_ITEMS, // node string
  233. TVI_LAST, // Insert after (= TVI_FIRST)
  234. TREE_IMAGE_INBOX, // Normal icon
  235. TREE_IMAGE_INBOX, // Selected icon
  236. (LPARAM)pFrm->GetSentItemsView(),// Node's data
  237. hItemSentItems);
  238. if (ERROR_SUCCESS != dwRes)
  239. {
  240. CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes);
  241. PopupError (dwRes);
  242. return;
  243. }
  244. //
  245. // Expand the root to expose all the servers
  246. //
  247. Tree.Expand (m_treeitemRoot, TVE_EXPAND);
  248. dwRes = pDoc->RefreshServersList();
  249. if(ERROR_SUCCESS != dwRes)
  250. {
  251. CALL_FAIL (GENERAL_ERR, TEXT("CClientConsoleDoc::RefreshServersList"), dwRes);
  252. PopupError (dwRes);
  253. return;
  254. }
  255. if(theApp.IsCmdLineOpenFolder())
  256. {
  257. //
  258. // select folder according to command line
  259. //
  260. SelectFolder (theApp.GetCmdLineFolderType());
  261. }
  262. #ifdef UNICODE
  263. DetectImportFiles();
  264. #endif // UNICODE
  265. } // CLeftView::OnInitialUpdate
  266. VOID
  267. CLeftView::SelectFolder (
  268. FolderType type
  269. )
  270. {
  271. DBG_ENTER(TEXT("CLeftView::SelectFolder"), TEXT("type=%ld"), type);
  272. CFolderListView *pView = NULL;
  273. INT iNodeStringResource;
  274. CMainFrame *pFrm = GetFrm();
  275. if (!pFrm)
  276. {
  277. //
  278. // Shutdown in progress
  279. //
  280. return;
  281. }
  282. switch(type)
  283. {
  284. case FOLDER_TYPE_INCOMING:
  285. iNodeStringResource = IDS_TREE_NODE_INCOMING;
  286. pView = pFrm->GetIncomingView();
  287. break;
  288. case FOLDER_TYPE_INBOX:
  289. iNodeStringResource = IDS_TREE_NODE_INBOX;
  290. pView = pFrm->GetInboxView();
  291. break;
  292. case FOLDER_TYPE_OUTBOX:
  293. iNodeStringResource = IDS_TREE_NODE_OUTBOX;
  294. pView = pFrm->GetOutboxView();
  295. break;
  296. case FOLDER_TYPE_SENT_ITEMS:
  297. iNodeStringResource = IDS_TREE_NODE_SENT_ITEMS;
  298. pView = pFrm->GetSentItemsView();
  299. break;
  300. default:
  301. ASSERTION_FAILURE
  302. return;
  303. }
  304. HTREEITEM hItem;
  305. CString cstrNodeName;
  306. //
  307. // Retrieve node's title string
  308. //
  309. if (ERROR_SUCCESS != LoadResourceString (cstrNodeName, iNodeStringResource))
  310. {
  311. return;
  312. }
  313. hItem = FindNode (GetTreeCtrl().GetRootItem(), cstrNodeName);
  314. if (!hItem)
  315. {
  316. ASSERTION_FAILURE
  317. return;
  318. }
  319. if(!GetTreeCtrl().Select(hItem, TVGN_CARET))
  320. {
  321. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::Select"), ERROR_CAN_NOT_COMPLETE);
  322. }
  323. //
  324. // Force data change while handling this message, otherwise the current view is not changed until the
  325. // notification message reaches the left view.
  326. //
  327. ASSERTION (pView);
  328. NM_TREEVIEW nmtv = {0};
  329. LRESULT lr;
  330. nmtv.itemNew.lParam = (LPARAM)pView;
  331. OnTreeSelChanged ((NMHDR*)&nmtv, &lr);
  332. } // CLeftView::SelectFolder
  333. /////////////////////////////////////////////////////////////////////////////
  334. // CLeftView diagnostics
  335. #ifdef _DEBUG
  336. void CLeftView::AssertValid() const
  337. {
  338. CTreeView::AssertValid();
  339. }
  340. void CLeftView::Dump(CDumpContext& dc) const
  341. {
  342. CTreeView::Dump(dc);
  343. }
  344. CClientConsoleDoc* CLeftView::GetDocument() // non-debug version is inline
  345. {
  346. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CClientConsoleDoc)));
  347. return (CClientConsoleDoc*)m_pDocument;
  348. }
  349. #endif //_DEBUG
  350. /////////////////////////////////////////////////////////////////////////////
  351. // CLeftView message handlers
  352. HTREEITEM
  353. CLeftView::FindNode (
  354. HTREEITEM hRoot,
  355. CString &cstrNodeString
  356. )
  357. /*++
  358. Routine name : CLeftView::FindNode
  359. Routine description:
  360. Finds a node in the tree that has a specific string
  361. Author:
  362. Eran Yariv (EranY), Feb, 2000
  363. Arguments:
  364. hRoot [in] - Root of search: all direct sons (only) of root will be searched
  365. cstrNodeString [in] - String to look for
  366. Return Value:
  367. Handle to found tree item, NULL if not found
  368. --*/
  369. {
  370. CTreeCtrl &refTree = GetTreeCtrl();
  371. for (HTREEITEM hChildItem = refTree.GetChildItem (hRoot);
  372. hChildItem != NULL;
  373. hChildItem = refTree.GetNextSiblingItem (hChildItem))
  374. {
  375. if (cstrNodeString == refTree.GetItemText (hChildItem))
  376. {
  377. //
  378. // Match found
  379. //
  380. return hChildItem;
  381. }
  382. }
  383. return NULL;
  384. } // CLeftView::FindNode
  385. DWORD
  386. CLeftView::SyncFolderNode (
  387. HTREEITEM hParent,
  388. BOOL bVisible,
  389. int iNodeStringResource,
  390. HTREEITEM hInsertAfter,
  391. TreeIconType iconNormal,
  392. TreeIconType iconSelected,
  393. LPARAM lparamNodeData,
  394. HTREEITEM &hNode
  395. )
  396. /*++
  397. Routine name : CLeftView::SyncFolderNode
  398. Routine description:
  399. Synchronizes a tree folder
  400. Author:
  401. Eran Yariv (EranY), Feb, 2000
  402. Arguments:
  403. hParent [in] - Parent node
  404. bVisible [in] - Should the node be visible?
  405. iNodeStringResource [in] - Resource of node's title string
  406. hInsertAfter [in] - Sibling to insert after (must exist)
  407. iconNormal [in] - Icon of normal image
  408. iconSelected [in] - Icon of selected image
  409. lparamNodeData [in] - Node assigned data
  410. hNode [out] - Node tree item (changed only if node had to be created).
  411. Set to NULL if node was removed.
  412. Return Value:
  413. Standard Win32 error code
  414. --*/
  415. {
  416. DWORD dwRes = ERROR_SUCCESS;
  417. DBG_ENTER(TEXT("CLeftView::SyncFolderNode"), dwRes);
  418. CString cstrNodeName;
  419. //
  420. // Retrieve node's title string
  421. //
  422. dwRes = LoadResourceString (cstrNodeName, iNodeStringResource);
  423. if (ERROR_SUCCESS != dwRes)
  424. {
  425. return dwRes;
  426. }
  427. CTreeCtrl &refTree = GetTreeCtrl();
  428. hNode = FindNode (hParent, cstrNodeName);
  429. if (!bVisible)
  430. {
  431. //
  432. // The node should not be visible at all
  433. //
  434. if (hNode)
  435. {
  436. if (refTree.GetSelectedItem () == hNode)
  437. {
  438. //
  439. // If the node is currently selected, select its parent
  440. //
  441. refTree.SelectItem (hParent);
  442. }
  443. //
  444. // Remove node
  445. //
  446. if (!refTree.DeleteItem (hNode))
  447. {
  448. dwRes = ERROR_GEN_FAILURE;
  449. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::DeleteItem"), dwRes);
  450. return dwRes;
  451. }
  452. }
  453. hNode = NULL;
  454. }
  455. else
  456. {
  457. //
  458. // The node should be visible
  459. //
  460. if (!hNode)
  461. {
  462. //
  463. // Node does not exist, create it
  464. //
  465. TVINSERTSTRUCT tvis;
  466. tvis.hParent = hParent;
  467. tvis.hInsertAfter = hInsertAfter;
  468. tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
  469. tvis.item.pszText = const_cast<LPTSTR> ((LPCTSTR) cstrNodeName);
  470. tvis.item.iImage = iconNormal;
  471. tvis.item.iSelectedImage = iconSelected;
  472. tvis.item.state = 0;
  473. tvis.item.stateMask = 0;
  474. tvis.item.lParam = lparamNodeData;
  475. hNode = refTree.InsertItem (&tvis);
  476. if (NULL == hNode)
  477. {
  478. dwRes = ERROR_GEN_FAILURE;
  479. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::InsertItem"), dwRes);
  480. return dwRes;
  481. }
  482. }
  483. else
  484. {
  485. //
  486. // Node already exists, just update its image and assigned data
  487. //
  488. TVITEM tvi;
  489. tvi.hItem = hNode;
  490. tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
  491. tvi.iImage = iconNormal;
  492. tvi.iSelectedImage = iconSelected;
  493. tvi.lParam = lparamNodeData;
  494. if (!refTree.SetItem (&tvi))
  495. {
  496. dwRes = ERROR_GEN_FAILURE;
  497. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::SetItem"), dwRes);
  498. return dwRes;
  499. }
  500. }
  501. }
  502. ASSERTION (ERROR_SUCCESS == dwRes);
  503. return dwRes;
  504. } // CLeftView::SyncFolderNode
  505. void
  506. CLeftView::OnTreeSelChanged(
  507. NMHDR* pNMHDR,
  508. LRESULT* pResult
  509. )
  510. /*++
  511. Routine name : CLeftView::OnTreeSelChanged
  512. Routine description:
  513. Called by the framework when a node is selected in the tree
  514. Author:
  515. Eran Yariv (EranY), Jan, 2000
  516. Arguments:
  517. pNMHDR [in ] - Pointer to structure describing old and new node
  518. pResult [out] - Result
  519. Return Value:
  520. None.
  521. --*/
  522. {
  523. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  524. DBG_ENTER(TEXT("CLeftView::OnTreeSelChanged"));
  525. *pResult = 0;
  526. //
  527. // Retrieve item data of new node and cast to CObject
  528. //
  529. CFolderListView* pFolderView = (CFolderListView*) pNMTreeView->itemNew.lParam;
  530. if (GetCurrentView() == pFolderView)
  531. {
  532. //
  533. // Hey, that folder is ALREADY the current one.
  534. // No change required.
  535. //
  536. VERBOSE (DBG_MSG, TEXT("Requested folder is already the current one. No change performed."));
  537. return;
  538. }
  539. CMainFrame *pFrm = GetFrm();
  540. if (!pFrm)
  541. {
  542. //
  543. // Shutdown in progress
  544. //
  545. return;
  546. }
  547. pFrm->SwitchRightPaneView (pFolderView);
  548. m_pCurrentView = pFolderView;
  549. if(NULL == pFolderView)
  550. {
  551. SetFocus();
  552. return;
  553. }
  554. FolderType type = m_pCurrentView->GetType();
  555. GetDocument()->ViewFolder(type);
  556. SetFocus();
  557. if(FOLDER_TYPE_OUTBOX == type)
  558. {
  559. theApp.OutboxViewed();
  560. }
  561. } // CLeftView::OnTreeSelChanged
  562. BOOL
  563. CLeftView::CanRefreshFolder()
  564. /*++
  565. Routine name : CLeftView::CanRefreshFolder
  566. Routine description:
  567. does the user can referesh curent folder
  568. Author:
  569. Alexander Malysh (AlexMay), May, 2000
  570. Arguments:
  571. Return Value:
  572. TRUE if yes, FALSE otherwise.
  573. --*/
  574. {
  575. DWORD dwRes = ERROR_SUCCESS;
  576. DBG_ENTER(TEXT("CLeftView::CanRefreshFolder"));
  577. BOOL bRefreshing;
  578. DWORD dwOffLineCount;
  579. GetServerState(bRefreshing, dwOffLineCount);
  580. return !bRefreshing;
  581. }
  582. DWORD
  583. CLeftView::RefreshCurrentFolder ()
  584. /*++
  585. Routine name : CLeftView::RefreshCurrentFolder
  586. Routine description:
  587. Causes a refresh of the currently displayed folder (right pane)
  588. Author:
  589. Eran Yariv (EranY), Jan, 2000
  590. Arguments:
  591. Return Value:
  592. Standard win32 error code
  593. --*/
  594. {
  595. DWORD dwRes = ERROR_SUCCESS;
  596. DBG_ENTER(TEXT("CLeftView::RefreshCurrentFolder"), dwRes);
  597. CClientConsoleDoc* pDoc = GetDocument();
  598. if(!pDoc)
  599. {
  600. ASSERTION(pDoc);
  601. return dwRes;
  602. }
  603. if(!m_pCurrentView)
  604. {
  605. //
  606. // root is selected
  607. //
  608. // clear all the folders
  609. //
  610. CMainFrame *pFrm = GetFrm();
  611. if (!pFrm)
  612. {
  613. //
  614. // Shutdown in progress
  615. //
  616. return dwRes;
  617. }
  618. pFrm->GetIncomingView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL);
  619. pFrm->GetInboxView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL);
  620. pFrm->GetSentItemsView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL);
  621. pFrm->GetOutboxView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL);
  622. pDoc->SetInvalidFolder(FOLDER_TYPE_INBOX);
  623. pDoc->SetInvalidFolder(FOLDER_TYPE_OUTBOX);
  624. pDoc->SetInvalidFolder(FOLDER_TYPE_SENT_ITEMS);
  625. pDoc->SetInvalidFolder(FOLDER_TYPE_INCOMING);
  626. //
  627. // refresh server status
  628. //
  629. CServerNode* pServerNode;
  630. const SERVERS_LIST& srvList = pDoc->GetServersList();
  631. for (SERVERS_LIST::iterator it = srvList.begin(); it != srvList.end(); ++it)
  632. {
  633. pServerNode = *it;
  634. pServerNode->RefreshState();
  635. }
  636. return dwRes;
  637. }
  638. FolderType type = m_pCurrentView->GetType();
  639. //
  640. // clear view
  641. //
  642. m_pCurrentView->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL);
  643. //
  644. // Invalidate Folder
  645. //
  646. pDoc->SetInvalidFolder(type);
  647. //
  648. // refresh folder
  649. //
  650. pDoc->ViewFolder(type);
  651. return dwRes;
  652. } // CLeftView::RefreshCurrentFolder
  653. DWORD
  654. CLeftView::OpenSelectColumnsDlg()
  655. {
  656. DWORD dwRes = ERROR_SUCCESS;
  657. DBG_ENTER(TEXT("CLeftView::OpenSelectColumnsDlg"), dwRes);
  658. ASSERTION(m_pCurrentView);
  659. dwRes = m_pCurrentView->OpenSelectColumnsDlg();
  660. if(ERROR_SUCCESS != dwRes)
  661. {
  662. CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::OpenSelectColumnsDlg"), dwRes);
  663. }
  664. return dwRes;
  665. }
  666. void
  667. CLeftView::GetServerState(
  668. BOOL& bRefreshing,
  669. DWORD& dwOffLineCount
  670. )
  671. /*++
  672. Routine name : CLeftView::GetServerState
  673. Routine description:
  674. calculate servers status
  675. Author:
  676. Alexander Malysh (AlexMay), May, 2000
  677. Arguments:
  678. bRefreshing [out] - is one of servers or folder refreshing
  679. dwOffLineCount [out] - a number of offline servers
  680. Return Value:
  681. None.
  682. --*/
  683. {
  684. DWORD dwRes = ERROR_SUCCESS;
  685. bRefreshing = FALSE;
  686. dwOffLineCount = 0;
  687. const SERVERS_LIST& srvList = GetDocument()->GetServersList();
  688. FolderType type;
  689. CServerNode* pServerNode;
  690. for (SERVERS_LIST::iterator it = srvList.begin(); it != srvList.end(); ++it)
  691. {
  692. pServerNode = *it;
  693. if(m_pCurrentView)
  694. {
  695. //
  696. // is refreshing ?
  697. //
  698. type = m_pCurrentView->GetType();
  699. if(pServerNode->GetFolder(type)->IsRefreshing())
  700. {
  701. bRefreshing = TRUE;
  702. }
  703. }
  704. else
  705. {
  706. //
  707. // root selected
  708. //
  709. if(pServerNode->GetFolder(FOLDER_TYPE_INBOX)->IsRefreshing() ||
  710. pServerNode->GetFolder(FOLDER_TYPE_OUTBOX)->IsRefreshing() ||
  711. pServerNode->GetFolder(FOLDER_TYPE_SENT_ITEMS)->IsRefreshing() ||
  712. pServerNode->GetFolder(FOLDER_TYPE_INCOMING)->IsRefreshing())
  713. {
  714. bRefreshing = TRUE;
  715. }
  716. }
  717. if(pServerNode->IsRefreshing())
  718. {
  719. bRefreshing = TRUE;
  720. }
  721. else if(!pServerNode->IsOnline())
  722. {
  723. ++dwOffLineCount;
  724. }
  725. }
  726. }
  727. BOOL
  728. CLeftView::GetActivity(
  729. CString &cstr,
  730. HICON& hIcon
  731. )
  732. /*++
  733. Routine name : CLeftView::GetActivity
  734. Routine description:
  735. calculate status bar activity string and icon
  736. Author:
  737. Alexander Malysh (AlexMay), Apr, 2000
  738. Arguments:
  739. cstr [out] - activity string
  740. hIcon [out] - icon
  741. Return Value:
  742. TRUE if any activity, FALSE otherwise.
  743. --*/
  744. {
  745. DWORD dwRes = ERROR_SUCCESS;
  746. BOOL bRes = TRUE;
  747. DWORD dwOffLine = 0;
  748. BOOL bRefreshing = FALSE;
  749. int nIconRes = 0;
  750. int nStringRes = 0;
  751. DWORD dwServerCount = GetDocument()->GetServerCount();
  752. GetServerState(bRefreshing, dwOffLine);
  753. if(0 == dwServerCount)
  754. {
  755. //
  756. // no fax printer install
  757. //
  758. nIconRes = IDI_SRV_WRN;
  759. nStringRes = IDS_NO_SRV_INSTALL;
  760. }
  761. else if(bRefreshing)
  762. {
  763. nIconRes = IDI_SRV_WAIT;
  764. nStringRes = IDS_FOLDER_REFRESHING;
  765. }
  766. else if(dwOffLine)
  767. {
  768. nIconRes = IDI_SRV_WRN;
  769. if(dwServerCount == dwOffLine)
  770. {
  771. nStringRes = IDS_SRV_OFFLINE;
  772. }
  773. else
  774. {
  775. nStringRes = IDS_SRV_PART_OFFLINE;
  776. }
  777. }
  778. else
  779. {
  780. //
  781. // online
  782. //
  783. nIconRes = IDI_SRV_OK;
  784. nStringRes = IDS_SRV_ONLINE;
  785. }
  786. if (m_iLastActivityStringId != nStringRes)
  787. {
  788. if (m_pCurrentView)
  789. {
  790. //
  791. // Force a recalc of the mouse cursor
  792. //
  793. m_pCurrentView->PostMessage (WM_SETCURSOR, 0, 0);
  794. }
  795. m_iLastActivityStringId = nStringRes;
  796. }
  797. if(0 != nStringRes)
  798. {
  799. //
  800. // load string
  801. //
  802. dwRes = LoadResourceString (cstr, nStringRes);
  803. if (ERROR_SUCCESS != dwRes)
  804. {
  805. bRes = FALSE;
  806. }
  807. }
  808. //
  809. // load icon
  810. //
  811. if(0 != nIconRes)
  812. {
  813. hIcon = (HICON)LoadImage(GetResourceHandle(),
  814. MAKEINTRESOURCE(nIconRes),
  815. IMAGE_ICON,
  816. 16,
  817. 16,
  818. LR_SHARED);
  819. if(NULL == hIcon)
  820. {
  821. DBG_ENTER(TEXT("CLeftView::GetActivity"));
  822. dwRes = GetLastError();
  823. CALL_FAIL (RESOURCE_ERR, TEXT("LoadImage"), dwRes);
  824. bRes = FALSE;
  825. }
  826. }
  827. return bRes;
  828. } // CLeftView::GetActivityString
  829. void
  830. CLeftView::OnRightClick(
  831. NMHDR* pNMHDR,
  832. LRESULT* pResult
  833. )
  834. /*++
  835. Routine name : CLeftView::OnRightClick
  836. Routine description:
  837. mouse right click handler
  838. Author:
  839. Alexander Malysh (AlexMay), Feb, 2000
  840. Arguments:
  841. pNMHDR [in] - message info
  842. pResult [out] - result
  843. Return Value:
  844. None.
  845. --*/
  846. {
  847. DBG_ENTER(TEXT("CLeftView::OnRightClick"));
  848. *pResult = 0;
  849. //
  850. // get cursor position
  851. //
  852. CPoint ptScreen(GetMessagePos());
  853. CPoint ptClient(ptScreen);
  854. ScreenToClient(&ptClient);
  855. UINT nFlags;
  856. CTreeCtrl &refTree = GetTreeCtrl();
  857. HTREEITEM hItem = refTree.HitTest(ptClient, &nFlags);
  858. if(0 == hItem)
  859. {
  860. return;
  861. }
  862. //
  863. // select the item
  864. //
  865. BOOL bRes = refTree.Select(hItem, TVGN_CARET);
  866. if(!bRes)
  867. {
  868. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::Select"), ERROR_GEN_FAILURE);
  869. return;
  870. }
  871. //
  872. // TODO
  873. //
  874. return;
  875. int nMenuResource = 0;
  876. if (NULL == m_pCurrentView)
  877. {
  878. nMenuResource = IDM_TREE_ROOT_OPTIONS;
  879. }
  880. else
  881. {
  882. switch(m_pCurrentView->GetType())
  883. {
  884. case FOLDER_TYPE_OUTBOX:
  885. nMenuResource = IDM_OUTBOX_FOLDER;
  886. break;
  887. case FOLDER_TYPE_INCOMING:
  888. case FOLDER_TYPE_INBOX:
  889. case FOLDER_TYPE_SENT_ITEMS:
  890. break;
  891. default:
  892. ASSERTION_FAILURE
  893. break;
  894. }
  895. }
  896. if(0 == nMenuResource)
  897. {
  898. return;
  899. }
  900. //
  901. // popup menu
  902. //
  903. CMenu mnuContainer;
  904. if (!mnuContainer.LoadMenu (nMenuResource))
  905. {
  906. CALL_FAIL (RESOURCE_ERR, TEXT("CMenu::LoadMenu"), ERROR_GEN_FAILURE);
  907. return;
  908. }
  909. CMenu* pmnuPopup = mnuContainer.GetSubMenu (0);
  910. ASSERTION (pmnuPopup);
  911. if (!pmnuPopup->TrackPopupMenu (TPM_LEFTALIGN,
  912. ptScreen.x,
  913. ptScreen.y,
  914. AfxGetMainWnd ()))
  915. {
  916. CALL_FAIL (RESOURCE_ERR, TEXT("CMenu::TrackPopupMenu"), ERROR_GEN_FAILURE);
  917. }
  918. } // CLeftView::OnRightClick
  919. DWORD
  920. CLeftView::RemoveTreeItem(
  921. HTREEITEM hItem
  922. )
  923. {
  924. DWORD dwRes = ERROR_SUCCESS;
  925. DBG_ENTER(TEXT("CLeftView::RemoveTreeItem"), dwRes);
  926. ASSERTION(hItem);
  927. CTreeCtrl &refTree = GetTreeCtrl();
  928. if(!refTree.DeleteItem(hItem))
  929. {
  930. dwRes = ERROR_CAN_NOT_COMPLETE;
  931. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::DeleteItem"), dwRes);
  932. return dwRes;
  933. }
  934. return dwRes;
  935. }
  936. DWORD
  937. CLeftView::SelectRoot()
  938. {
  939. DWORD dwRes = ERROR_SUCCESS;
  940. DBG_ENTER(TEXT("CLeftView::SelectRoot"), dwRes);
  941. CTreeCtrl &refTree = GetTreeCtrl();
  942. if(!refTree.Select(m_treeitemRoot, TVGN_CARET))
  943. {
  944. dwRes = ERROR_CAN_NOT_COMPLETE;
  945. CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::Select"), dwRes);
  946. return dwRes;
  947. }
  948. return dwRes;
  949. }
  950. DWORD
  951. CLeftView::OpenHelpTopic()
  952. /*++
  953. Routine name : CLeftView::OpenHelpTopic
  954. Routine description:
  955. open appropriate help topic according to current selection
  956. Author:
  957. Alexander Malysh (AlexMay), Mar, 2000
  958. Arguments:
  959. Return Value:
  960. Standard Win32 error code
  961. --*/
  962. {
  963. DWORD dwRes = ERROR_SUCCESS;
  964. DBG_ENTER(TEXT("CLeftView::OpenHelpTopic"), dwRes);
  965. TCHAR* tszHelpTopic = FAX_HELP_WELCOME;
  966. if(NULL != m_pCurrentView)
  967. {
  968. switch(m_pCurrentView->GetType())
  969. {
  970. case FOLDER_TYPE_INCOMING:
  971. tszHelpTopic = FAX_HELP_INCOMING;
  972. break;
  973. case FOLDER_TYPE_INBOX:
  974. tszHelpTopic = FAX_HELP_INBOX;
  975. break;
  976. case FOLDER_TYPE_OUTBOX:
  977. tszHelpTopic = FAX_HELP_OUTBOX;
  978. break;
  979. case FOLDER_TYPE_SENT_ITEMS:
  980. tszHelpTopic = FAX_HELP_SENTITEMS;
  981. break;
  982. default:
  983. ASSERTION_FAILURE
  984. break;
  985. }
  986. }
  987. dwRes = ::HtmlHelpTopic(m_hWnd, tszHelpTopic);
  988. if(ERROR_SUCCESS != dwRes)
  989. {
  990. CALL_FAIL (GENERAL_ERR, TEXT("HtmlHelpTopic"),dwRes);
  991. }
  992. return dwRes;
  993. } // CLeftView::OpenHelpTopic
  994. int
  995. CLeftView::GetDataCount()
  996. {
  997. int nCount = -1;
  998. if(NULL != m_pCurrentView)
  999. {
  1000. FolderType type = m_pCurrentView->GetType();
  1001. nCount = GetDocument()->GetFolderDataCount(type);
  1002. }
  1003. return nCount;
  1004. }
  1005. void
  1006. CLeftView::OnChar(
  1007. UINT nChar,
  1008. UINT nRepCnt,
  1009. UINT nFlags
  1010. )
  1011. /*++
  1012. Routine name : CFolderListView::OnChar
  1013. Routine description:
  1014. The framework calls this member function when a keystroke translates
  1015. to a nonsystem character
  1016. Arguments:
  1017. nChar [in] - Contains the character code value of the key.
  1018. nRepCnt [in] - Contains the repeat count
  1019. nFlags [in] - Contains the scan code
  1020. Return Value:
  1021. None.
  1022. --*/
  1023. {
  1024. if(VK_TAB == nChar)
  1025. {
  1026. if(m_pCurrentView)
  1027. {
  1028. m_pCurrentView->SetFocus();
  1029. }
  1030. }
  1031. else
  1032. {
  1033. CTreeView::OnChar(nChar, nRepCnt, nFlags);
  1034. }
  1035. }