// LeftView.cpp : implementation of the CLeftView class // #include "stdafx.h" #define __FILE_ID__ 4 #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CClientConsoleApp theApp; CImageList CLeftView::m_ImageList; ///////////////////////////////////////////////////////////////////////////// // CLeftView IMPLEMENT_DYNCREATE(CLeftView, CTreeView) BEGIN_MESSAGE_MAP(CLeftView, CTreeView) //{{AFX_MSG_MAP(CLeftView) ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnTreeSelChanged) ON_NOTIFY_REFLECT(NM_RCLICK, OnRightClick) ON_WM_CHAR( ) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CLeftView construction/destruction CLeftView::CLeftView() : m_treeitemRoot (NULL), m_pCurrentView(NULL), m_iLastActivityStringId(0) {} CLeftView::~CLeftView() {} BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs) { return CTreeView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CLeftView drawing void CLeftView::OnDraw(CDC* pDC) { CClientConsoleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); } DWORD CLeftView::RefreshImageList () { HIMAGELIST himl = NULL; DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::RefreshImageList"), dwRes); // // Build and load the image list // himl = m_ImageList.Detach(); if (himl) { ImageList_Destroy(himl); } himl = ImageList_LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_TREE_IMAGES), 16, 0, RGB(0, 255, 0), IMAGE_BITMAP, LR_LOADTRANSPARENT | LR_CREATEDIBSECTION); if (NULL == himl) { dwRes = GetLastError(); CALL_FAIL (RESOURCE_ERR, TEXT("ImageList_LoadImage"), dwRes); } else { m_ImageList.Attach (himl); } GetTreeCtrl().SetImageList (&m_ImageList, TVSIL_NORMAL); return dwRes; } // CLeftView::RefreshImageList void CLeftView::OnInitialUpdate() { DWORD dwRes; DBG_ENTER(TEXT("CLeftView::OnInitialUpdate")); CTreeView::OnInitialUpdate(); CClientConsoleDoc* pDoc = GetDocument(); if(!pDoc) { ASSERTION(pDoc); PopupError (ERROR_GEN_FAILURE); return; } // // Set the style of the tree // CTreeCtrl &Tree = GetTreeCtrl(); LONG lWnd = GetWindowLong (Tree.m_hWnd, GWL_STYLE); if (!lWnd) { dwRes = GetLastError (); CALL_FAIL (WINDOW_ERR, TEXT("GetWindowLong"), dwRes); PopupError (dwRes); return; } lWnd |= (TVS_HASLINES | // Lines between node TVS_HASBUTTONS | // Tree has +/- (expand/collapse) buttons TVS_INFOTIP | // Allow tooltip messages TVS_LINESATROOT | // Root object has lines TVS_SHOWSELALWAYS // Always show selected node ); if (!SetWindowLong (Tree.m_hWnd, GWL_STYLE, lWnd)) { dwRes = GetLastError (); CALL_FAIL (WINDOW_ERR, TEXT("SetWindowLong"), dwRes); PopupError (dwRes); return; } RefreshImageList(); // // Create the 4 views of the 4 different folder types. // CMainFrame *pFrm = GetFrm(); if (!pFrm) { // // Shutdown in progress // return; } dwRes = pFrm->CreateFolderViews (GetDocument()); if (ERROR_SUCCESS != dwRes) { CALL_FAIL (GENERAL_ERR, TEXT("CMainFrame::CreateFolderViews"), dwRes); PopupError (dwRes); return; } // // Build root node // CString cstrNodeName; dwRes = LoadResourceString (cstrNodeName, IDS_TREE_ROOT_NAME); if (ERROR_SUCCESS != dwRes) { CALL_FAIL (GENERAL_ERR, TEXT("LoadResourceString"), dwRes); PopupError (dwRes); return; } CString& cstrSingleServer = pDoc->GetSingleServerName(); if(!cstrSingleServer.IsEmpty()) { CString cstrRoot; try { cstrRoot.Format(TEXT("%s (%s)"), cstrNodeName, cstrSingleServer); cstrNodeName = cstrRoot; } catch(...) { dwRes = ERROR_NOT_ENOUGH_MEMORY; CALL_FAIL (MEM_ERR, TEXT("CString operation"), dwRes); PopupError (dwRes); return; } } m_treeitemRoot = Tree.InsertItem (cstrNodeName); if (NULL == m_treeitemRoot) { dwRes = ERROR_GEN_FAILURE; CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::InsertItem"), dwRes); PopupError (dwRes); return; } Tree.SetItemImage (m_treeitemRoot, TREE_IMAGE_ROOT, TREE_IMAGE_ROOT); // // Set the item data of the root to NULL. // Tree.SetItemData (m_treeitemRoot, 0); HTREEITEM hItemIncoming; HTREEITEM hItemInbox; HTREEITEM hItemOutbox; HTREEITEM hItemSentItems; // // Add Incoming // dwRes = SyncFolderNode (m_treeitemRoot, // Parent node TRUE, // Visible? IDS_TREE_NODE_INCOMING, // node string TVI_LAST, // Insert after (= TVI_FIRST) TREE_IMAGE_INCOMING, // Normal icon TREE_IMAGE_INCOMING, // Selected icon (LPARAM)pFrm->GetIncomingView(), // Node's data hItemIncoming); if (ERROR_SUCCESS != dwRes) { CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes); PopupError (dwRes); return; } // // Add Inbox // dwRes = SyncFolderNode (m_treeitemRoot, // Parent node TRUE, // Visible? IDS_TREE_NODE_INBOX, // node string TVI_LAST, // Insert after (= TVI_FIRST) TREE_IMAGE_INBOX, // Normal icon TREE_IMAGE_INBOX, // Selected icon (LPARAM)pFrm->GetInboxView(), // Node's data hItemInbox); if (ERROR_SUCCESS != dwRes) { CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes); PopupError (dwRes); return; } // // Add Outbox // dwRes = SyncFolderNode (m_treeitemRoot, // Parent node TRUE, // Visible? IDS_TREE_NODE_OUTBOX, // node string TVI_LAST, // Insert after (= TVI_FIRST) TREE_IMAGE_OUTBOX, // Normal icon TREE_IMAGE_OUTBOX, // Selected icon (LPARAM)pFrm->GetOutboxView(), // Node's data hItemOutbox); if (ERROR_SUCCESS != dwRes) { CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes); PopupError (dwRes); return; } // // Add SentItems // dwRes = SyncFolderNode (m_treeitemRoot, // Parent node TRUE, // Visible? IDS_TREE_NODE_SENT_ITEMS, // node string TVI_LAST, // Insert after (= TVI_FIRST) TREE_IMAGE_INBOX, // Normal icon TREE_IMAGE_INBOX, // Selected icon (LPARAM)pFrm->GetSentItemsView(),// Node's data hItemSentItems); if (ERROR_SUCCESS != dwRes) { CALL_FAIL (WINDOW_ERR, TEXT("SyncFolderNode"), dwRes); PopupError (dwRes); return; } // // Expand the root to expose all the servers // Tree.Expand (m_treeitemRoot, TVE_EXPAND); dwRes = pDoc->RefreshServersList(); if(ERROR_SUCCESS != dwRes) { CALL_FAIL (GENERAL_ERR, TEXT("CClientConsoleDoc::RefreshServersList"), dwRes); PopupError (dwRes); return; } if(theApp.IsCmdLineOpenFolder()) { // // select folder according to command line // SelectFolder (theApp.GetCmdLineFolderType()); } #ifdef UNICODE DetectImportFiles(); #endif // UNICODE } // CLeftView::OnInitialUpdate VOID CLeftView::SelectFolder ( FolderType type ) { DBG_ENTER(TEXT("CLeftView::SelectFolder"), TEXT("type=%ld"), type); CFolderListView *pView = NULL; INT iNodeStringResource; CMainFrame *pFrm = GetFrm(); if (!pFrm) { // // Shutdown in progress // return; } switch(type) { case FOLDER_TYPE_INCOMING: iNodeStringResource = IDS_TREE_NODE_INCOMING; pView = pFrm->GetIncomingView(); break; case FOLDER_TYPE_INBOX: iNodeStringResource = IDS_TREE_NODE_INBOX; pView = pFrm->GetInboxView(); break; case FOLDER_TYPE_OUTBOX: iNodeStringResource = IDS_TREE_NODE_OUTBOX; pView = pFrm->GetOutboxView(); break; case FOLDER_TYPE_SENT_ITEMS: iNodeStringResource = IDS_TREE_NODE_SENT_ITEMS; pView = pFrm->GetSentItemsView(); break; default: ASSERTION_FAILURE return; } HTREEITEM hItem; CString cstrNodeName; // // Retrieve node's title string // if (ERROR_SUCCESS != LoadResourceString (cstrNodeName, iNodeStringResource)) { return; } hItem = FindNode (GetTreeCtrl().GetRootItem(), cstrNodeName); if (!hItem) { ASSERTION_FAILURE return; } if(!GetTreeCtrl().Select(hItem, TVGN_CARET)) { CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::Select"), ERROR_CAN_NOT_COMPLETE); } // // Force data change while handling this message, otherwise the current view is not changed until the // notification message reaches the left view. // ASSERTION (pView); NM_TREEVIEW nmtv = {0}; LRESULT lr; nmtv.itemNew.lParam = (LPARAM)pView; OnTreeSelChanged ((NMHDR*)&nmtv, &lr); } // CLeftView::SelectFolder ///////////////////////////////////////////////////////////////////////////// // CLeftView diagnostics #ifdef _DEBUG void CLeftView::AssertValid() const { CTreeView::AssertValid(); } void CLeftView::Dump(CDumpContext& dc) const { CTreeView::Dump(dc); } CClientConsoleDoc* CLeftView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CClientConsoleDoc))); return (CClientConsoleDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CLeftView message handlers HTREEITEM CLeftView::FindNode ( HTREEITEM hRoot, CString &cstrNodeString ) /*++ Routine name : CLeftView::FindNode Routine description: Finds a node in the tree that has a specific string Author: Eran Yariv (EranY), Feb, 2000 Arguments: hRoot [in] - Root of search: all direct sons (only) of root will be searched cstrNodeString [in] - String to look for Return Value: Handle to found tree item, NULL if not found --*/ { CTreeCtrl &refTree = GetTreeCtrl(); for (HTREEITEM hChildItem = refTree.GetChildItem (hRoot); hChildItem != NULL; hChildItem = refTree.GetNextSiblingItem (hChildItem)) { if (cstrNodeString == refTree.GetItemText (hChildItem)) { // // Match found // return hChildItem; } } return NULL; } // CLeftView::FindNode DWORD CLeftView::SyncFolderNode ( HTREEITEM hParent, BOOL bVisible, int iNodeStringResource, HTREEITEM hInsertAfter, TreeIconType iconNormal, TreeIconType iconSelected, LPARAM lparamNodeData, HTREEITEM &hNode ) /*++ Routine name : CLeftView::SyncFolderNode Routine description: Synchronizes a tree folder Author: Eran Yariv (EranY), Feb, 2000 Arguments: hParent [in] - Parent node bVisible [in] - Should the node be visible? iNodeStringResource [in] - Resource of node's title string hInsertAfter [in] - Sibling to insert after (must exist) iconNormal [in] - Icon of normal image iconSelected [in] - Icon of selected image lparamNodeData [in] - Node assigned data hNode [out] - Node tree item (changed only if node had to be created). Set to NULL if node was removed. Return Value: Standard Win32 error code --*/ { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::SyncFolderNode"), dwRes); CString cstrNodeName; // // Retrieve node's title string // dwRes = LoadResourceString (cstrNodeName, iNodeStringResource); if (ERROR_SUCCESS != dwRes) { return dwRes; } CTreeCtrl &refTree = GetTreeCtrl(); hNode = FindNode (hParent, cstrNodeName); if (!bVisible) { // // The node should not be visible at all // if (hNode) { if (refTree.GetSelectedItem () == hNode) { // // If the node is currently selected, select its parent // refTree.SelectItem (hParent); } // // Remove node // if (!refTree.DeleteItem (hNode)) { dwRes = ERROR_GEN_FAILURE; CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::DeleteItem"), dwRes); return dwRes; } } hNode = NULL; } else { // // The node should be visible // if (!hNode) { // // Node does not exist, create it // TVINSERTSTRUCT tvis; tvis.hParent = hParent; tvis.hInsertAfter = hInsertAfter; tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvis.item.pszText = const_cast ((LPCTSTR) cstrNodeName); tvis.item.iImage = iconNormal; tvis.item.iSelectedImage = iconSelected; tvis.item.state = 0; tvis.item.stateMask = 0; tvis.item.lParam = lparamNodeData; hNode = refTree.InsertItem (&tvis); if (NULL == hNode) { dwRes = ERROR_GEN_FAILURE; CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::InsertItem"), dwRes); return dwRes; } } else { // // Node already exists, just update its image and assigned data // TVITEM tvi; tvi.hItem = hNode; tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.iImage = iconNormal; tvi.iSelectedImage = iconSelected; tvi.lParam = lparamNodeData; if (!refTree.SetItem (&tvi)) { dwRes = ERROR_GEN_FAILURE; CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::SetItem"), dwRes); return dwRes; } } } ASSERTION (ERROR_SUCCESS == dwRes); return dwRes; } // CLeftView::SyncFolderNode void CLeftView::OnTreeSelChanged( NMHDR* pNMHDR, LRESULT* pResult ) /*++ Routine name : CLeftView::OnTreeSelChanged Routine description: Called by the framework when a node is selected in the tree Author: Eran Yariv (EranY), Jan, 2000 Arguments: pNMHDR [in ] - Pointer to structure describing old and new node pResult [out] - Result Return Value: None. --*/ { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; DBG_ENTER(TEXT("CLeftView::OnTreeSelChanged")); *pResult = 0; // // Retrieve item data of new node and cast to CObject // CFolderListView* pFolderView = (CFolderListView*) pNMTreeView->itemNew.lParam; if (GetCurrentView() == pFolderView) { // // Hey, that folder is ALREADY the current one. // No change required. // VERBOSE (DBG_MSG, TEXT("Requested folder is already the current one. No change performed.")); return; } CMainFrame *pFrm = GetFrm(); if (!pFrm) { // // Shutdown in progress // return; } pFrm->SwitchRightPaneView (pFolderView); m_pCurrentView = pFolderView; if(NULL == pFolderView) { SetFocus(); return; } FolderType type = m_pCurrentView->GetType(); GetDocument()->ViewFolder(type); SetFocus(); if(FOLDER_TYPE_OUTBOX == type) { theApp.OutboxViewed(); } } // CLeftView::OnTreeSelChanged BOOL CLeftView::CanRefreshFolder() /*++ Routine name : CLeftView::CanRefreshFolder Routine description: does the user can referesh curent folder Author: Alexander Malysh (AlexMay), May, 2000 Arguments: Return Value: TRUE if yes, FALSE otherwise. --*/ { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::CanRefreshFolder")); BOOL bRefreshing; DWORD dwOffLineCount; GetServerState(bRefreshing, dwOffLineCount); return !bRefreshing; } DWORD CLeftView::RefreshCurrentFolder () /*++ Routine name : CLeftView::RefreshCurrentFolder Routine description: Causes a refresh of the currently displayed folder (right pane) Author: Eran Yariv (EranY), Jan, 2000 Arguments: Return Value: Standard win32 error code --*/ { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::RefreshCurrentFolder"), dwRes); CClientConsoleDoc* pDoc = GetDocument(); if(!pDoc) { ASSERTION(pDoc); return dwRes; } if(!m_pCurrentView) { // // root is selected // // clear all the folders // CMainFrame *pFrm = GetFrm(); if (!pFrm) { // // Shutdown in progress // return dwRes; } pFrm->GetIncomingView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL); pFrm->GetInboxView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL); pFrm->GetSentItemsView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL); pFrm->GetOutboxView()->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL); pDoc->SetInvalidFolder(FOLDER_TYPE_INBOX); pDoc->SetInvalidFolder(FOLDER_TYPE_OUTBOX); pDoc->SetInvalidFolder(FOLDER_TYPE_SENT_ITEMS); pDoc->SetInvalidFolder(FOLDER_TYPE_INCOMING); // // refresh server status // CServerNode* pServerNode; const SERVERS_LIST& srvList = pDoc->GetServersList(); for (SERVERS_LIST::iterator it = srvList.begin(); it != srvList.end(); ++it) { pServerNode = *it; pServerNode->RefreshState(); } return dwRes; } FolderType type = m_pCurrentView->GetType(); // // clear view // m_pCurrentView->OnUpdate(NULL, UPDATE_HINT_CLEAR_VIEW, NULL); // // Invalidate Folder // pDoc->SetInvalidFolder(type); // // refresh folder // pDoc->ViewFolder(type); return dwRes; } // CLeftView::RefreshCurrentFolder DWORD CLeftView::OpenSelectColumnsDlg() { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::OpenSelectColumnsDlg"), dwRes); ASSERTION(m_pCurrentView); dwRes = m_pCurrentView->OpenSelectColumnsDlg(); if(ERROR_SUCCESS != dwRes) { CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::OpenSelectColumnsDlg"), dwRes); } return dwRes; } void CLeftView::GetServerState( BOOL& bRefreshing, DWORD& dwOffLineCount ) /*++ Routine name : CLeftView::GetServerState Routine description: calculate servers status Author: Alexander Malysh (AlexMay), May, 2000 Arguments: bRefreshing [out] - is one of servers or folder refreshing dwOffLineCount [out] - a number of offline servers Return Value: None. --*/ { DWORD dwRes = ERROR_SUCCESS; bRefreshing = FALSE; dwOffLineCount = 0; const SERVERS_LIST& srvList = GetDocument()->GetServersList(); FolderType type; CServerNode* pServerNode; for (SERVERS_LIST::iterator it = srvList.begin(); it != srvList.end(); ++it) { pServerNode = *it; if(m_pCurrentView) { // // is refreshing ? // type = m_pCurrentView->GetType(); if(pServerNode->GetFolder(type)->IsRefreshing()) { bRefreshing = TRUE; } } else { // // root selected // if(pServerNode->GetFolder(FOLDER_TYPE_INBOX)->IsRefreshing() || pServerNode->GetFolder(FOLDER_TYPE_OUTBOX)->IsRefreshing() || pServerNode->GetFolder(FOLDER_TYPE_SENT_ITEMS)->IsRefreshing() || pServerNode->GetFolder(FOLDER_TYPE_INCOMING)->IsRefreshing()) { bRefreshing = TRUE; } } if(pServerNode->IsRefreshing()) { bRefreshing = TRUE; } else if(!pServerNode->IsOnline()) { ++dwOffLineCount; } } } BOOL CLeftView::GetActivity( CString &cstr, HICON& hIcon ) /*++ Routine name : CLeftView::GetActivity Routine description: calculate status bar activity string and icon Author: Alexander Malysh (AlexMay), Apr, 2000 Arguments: cstr [out] - activity string hIcon [out] - icon Return Value: TRUE if any activity, FALSE otherwise. --*/ { DWORD dwRes = ERROR_SUCCESS; BOOL bRes = TRUE; DWORD dwOffLine = 0; BOOL bRefreshing = FALSE; int nIconRes = 0; int nStringRes = 0; DWORD dwServerCount = GetDocument()->GetServerCount(); GetServerState(bRefreshing, dwOffLine); if(0 == dwServerCount) { // // no fax printer install // nIconRes = IDI_SRV_WRN; nStringRes = IDS_NO_SRV_INSTALL; } else if(bRefreshing) { nIconRes = IDI_SRV_WAIT; nStringRes = IDS_FOLDER_REFRESHING; } else if(dwOffLine) { nIconRes = IDI_SRV_WRN; if(dwServerCount == dwOffLine) { nStringRes = IDS_SRV_OFFLINE; } else { nStringRes = IDS_SRV_PART_OFFLINE; } } else { // // online // nIconRes = IDI_SRV_OK; nStringRes = IDS_SRV_ONLINE; } if (m_iLastActivityStringId != nStringRes) { if (m_pCurrentView) { // // Force a recalc of the mouse cursor // m_pCurrentView->PostMessage (WM_SETCURSOR, 0, 0); } m_iLastActivityStringId = nStringRes; } if(0 != nStringRes) { // // load string // dwRes = LoadResourceString (cstr, nStringRes); if (ERROR_SUCCESS != dwRes) { bRes = FALSE; } } // // load icon // if(0 != nIconRes) { hIcon = (HICON)LoadImage(GetResourceHandle(), MAKEINTRESOURCE(nIconRes), IMAGE_ICON, 16, 16, LR_SHARED); if(NULL == hIcon) { DBG_ENTER(TEXT("CLeftView::GetActivity")); dwRes = GetLastError(); CALL_FAIL (RESOURCE_ERR, TEXT("LoadImage"), dwRes); bRes = FALSE; } } return bRes; } // CLeftView::GetActivityString void CLeftView::OnRightClick( NMHDR* pNMHDR, LRESULT* pResult ) /*++ Routine name : CLeftView::OnRightClick Routine description: mouse right click handler Author: Alexander Malysh (AlexMay), Feb, 2000 Arguments: pNMHDR [in] - message info pResult [out] - result Return Value: None. --*/ { DBG_ENTER(TEXT("CLeftView::OnRightClick")); *pResult = 0; // // get cursor position // CPoint ptScreen(GetMessagePos()); CPoint ptClient(ptScreen); ScreenToClient(&ptClient); UINT nFlags; CTreeCtrl &refTree = GetTreeCtrl(); HTREEITEM hItem = refTree.HitTest(ptClient, &nFlags); if(0 == hItem) { return; } // // select the item // BOOL bRes = refTree.Select(hItem, TVGN_CARET); if(!bRes) { CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::Select"), ERROR_GEN_FAILURE); return; } // // TODO // return; int nMenuResource = 0; if (NULL == m_pCurrentView) { nMenuResource = IDM_TREE_ROOT_OPTIONS; } else { switch(m_pCurrentView->GetType()) { case FOLDER_TYPE_OUTBOX: nMenuResource = IDM_OUTBOX_FOLDER; break; case FOLDER_TYPE_INCOMING: case FOLDER_TYPE_INBOX: case FOLDER_TYPE_SENT_ITEMS: break; default: ASSERTION_FAILURE break; } } if(0 == nMenuResource) { return; } // // popup menu // CMenu mnuContainer; if (!mnuContainer.LoadMenu (nMenuResource)) { CALL_FAIL (RESOURCE_ERR, TEXT("CMenu::LoadMenu"), ERROR_GEN_FAILURE); return; } CMenu* pmnuPopup = mnuContainer.GetSubMenu (0); ASSERTION (pmnuPopup); if (!pmnuPopup->TrackPopupMenu (TPM_LEFTALIGN, ptScreen.x, ptScreen.y, AfxGetMainWnd ())) { CALL_FAIL (RESOURCE_ERR, TEXT("CMenu::TrackPopupMenu"), ERROR_GEN_FAILURE); } } // CLeftView::OnRightClick DWORD CLeftView::RemoveTreeItem( HTREEITEM hItem ) { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::RemoveTreeItem"), dwRes); ASSERTION(hItem); CTreeCtrl &refTree = GetTreeCtrl(); if(!refTree.DeleteItem(hItem)) { dwRes = ERROR_CAN_NOT_COMPLETE; CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::DeleteItem"), dwRes); return dwRes; } return dwRes; } DWORD CLeftView::SelectRoot() { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::SelectRoot"), dwRes); CTreeCtrl &refTree = GetTreeCtrl(); if(!refTree.Select(m_treeitemRoot, TVGN_CARET)) { dwRes = ERROR_CAN_NOT_COMPLETE; CALL_FAIL (WINDOW_ERR, TEXT("CTreeCtrl::Select"), dwRes); return dwRes; } return dwRes; } DWORD CLeftView::OpenHelpTopic() /*++ Routine name : CLeftView::OpenHelpTopic Routine description: open appropriate help topic according to current selection Author: Alexander Malysh (AlexMay), Mar, 2000 Arguments: Return Value: Standard Win32 error code --*/ { DWORD dwRes = ERROR_SUCCESS; DBG_ENTER(TEXT("CLeftView::OpenHelpTopic"), dwRes); TCHAR* tszHelpTopic = FAX_HELP_WELCOME; if(NULL != m_pCurrentView) { switch(m_pCurrentView->GetType()) { case FOLDER_TYPE_INCOMING: tszHelpTopic = FAX_HELP_INCOMING; break; case FOLDER_TYPE_INBOX: tszHelpTopic = FAX_HELP_INBOX; break; case FOLDER_TYPE_OUTBOX: tszHelpTopic = FAX_HELP_OUTBOX; break; case FOLDER_TYPE_SENT_ITEMS: tszHelpTopic = FAX_HELP_SENTITEMS; break; default: ASSERTION_FAILURE break; } } dwRes = ::HtmlHelpTopic(m_hWnd, tszHelpTopic); if(ERROR_SUCCESS != dwRes) { CALL_FAIL (GENERAL_ERR, TEXT("HtmlHelpTopic"),dwRes); } return dwRes; } // CLeftView::OpenHelpTopic int CLeftView::GetDataCount() { int nCount = -1; if(NULL != m_pCurrentView) { FolderType type = m_pCurrentView->GetType(); nCount = GetDocument()->GetFolderDataCount(type); } return nCount; } void CLeftView::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ) /*++ Routine name : CFolderListView::OnChar Routine description: The framework calls this member function when a keystroke translates to a nonsystem character Arguments: nChar [in] - Contains the character code value of the key. nRepCnt [in] - Contains the repeat count nFlags [in] - Contains the scan code Return Value: None. --*/ { if(VK_TAB == nChar) { if(m_pCurrentView) { m_pCurrentView->SetFocus(); } } else { CTreeView::OnChar(nChar, nRepCnt, nFlags); } }