home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / winfe / mailfrm.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  76.0 KB  |  2,997 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18.  
  19. //
  20. // Main frame for mail reading window
  21. //
  22.  
  23. #include "stdafx.h"
  24. #include "intl_csi.h"
  25. #include "netsvw.h"
  26. #include "cxsave.h"
  27. #include "mailfrm.h"
  28. #include "fldrfrm.h"
  29. #include "thrdfrm.h"
  30. #include "msgfrm.h"
  31. #include "msgview.h"
  32. #include "msgcom.h"
  33. #include "mailmisc.h"
  34. #include "template.h"
  35. #include "subnews.h"
  36. #include "mnprefs.h"
  37. #include "mailpriv.h"
  38. #include "prefapi.h"
  39. #include "ssl.h"
  40. #include "xpgetstr.h"
  41.  
  42. #ifdef DEBUG_WHITEBOX
  43. #include "xp_trace.h"
  44. #include "stdio.h"
  45. #include "qaoutput.h"
  46. #include "qatrace.h"
  47. #endif
  48.  
  49. extern "C"
  50. {
  51.     extern int MK_NNTP_SERVER_NOT_CONFIGURED;
  52. };
  53.  
  54. extern "C" MSG_Host *DoAddNewsServer(CWnd* pParent, int nFromWhere);
  55.  
  56. #ifdef _DEBUG
  57. #undef THIS_FILE
  58. static char BASED_CODE THIS_FILE[] = __FILE__;
  59. #endif
  60.  
  61. int g_iModalDelay = -1;
  62.  
  63. MSG_Master *WFE_MSGGetMaster();                
  64.  
  65. extern "C" void wfe_AttachmentCount(MSG_Pane *messagepane, void* closure,
  66.                                     int32 numattachments, XP_Bool finishedloading)
  67. {
  68.     LPUNKNOWN pUnk = (LPUNKNOWN) MSG_GetFEData( messagepane );
  69.     if (pUnk) {
  70.         LPMAILFRAME pInterface = NULL;
  71.         pUnk->QueryInterface( IID_IMailFrame, (LPVOID *) &pInterface );
  72.         if ( pInterface ) {
  73.             pInterface->AttachmentCount( messagepane, closure, numattachments, finishedloading );
  74.             pInterface->Release();
  75.         }
  76.     }
  77. }
  78.  
  79. extern "C" void wfe_UserWantsToSeeAttachments(MSG_Pane *messagepane, void* closure)
  80. {
  81.     LPUNKNOWN pUnk = (LPUNKNOWN) MSG_GetFEData( messagepane );
  82.     if (pUnk) {
  83.         LPMAILFRAME pInterface = NULL;
  84.         pUnk->QueryInterface( IID_IMailFrame, (LPVOID *) &pInterface );
  85.         if ( pInterface ) {
  86.             pInterface->UserWantsToSeeAttachments( messagepane, closure );
  87.             pInterface->Release();
  88.         }
  89.     }
  90. }
  91.  
  92. MSG_MessagePaneCallbacks MsgPaneCB = {
  93.     wfe_AttachmentCount,
  94.     wfe_UserWantsToSeeAttachments
  95. };
  96.  
  97. CMailNewsCX::CMailNewsCX(ContextType ctMyType, CFrameWnd *pFrame )    
  98. {
  99.     m_pFrame = pFrame;
  100.     m_pIChrome = NULL;
  101.     m_cxType = ctMyType;
  102.     m_lPercent = 0;
  103.     m_bAnimated = FALSE;
  104. }
  105.  
  106. CMailNewsCX::~CMailNewsCX()
  107. {
  108.     if (m_pIChrome) {
  109.         m_pIChrome->Release();
  110.     }
  111. }
  112.  
  113. void CMailNewsCX::SetChrome( LPUNKNOWN pUnk )
  114. {
  115.     LPCHROME pIChrome = NULL;
  116.  
  117.     if ( pUnk ) {
  118.         pUnk->QueryInterface( IID_IChrome, (LPVOID *) &pIChrome);
  119.         ASSERT(pIChrome);
  120.     }
  121.  
  122.     if ( m_pIChrome == pIChrome ) {
  123.         return;
  124.     }
  125.  
  126.     if ( m_pIChrome ) {
  127.         m_pIChrome->Release();
  128.     }
  129.  
  130.     m_pIChrome = pIChrome;
  131.  
  132.     if ( m_pIChrome ) {
  133.         LPNSSTATUSBAR pIStatusBar = NULL;
  134.         m_pIChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
  135.         if ( pIStatusBar ) {
  136.             pIStatusBar->SetProgress( CASTINT(m_lPercent) );
  137.             pIStatusBar->SetStatusText( (LPCTSTR) m_csProgress );
  138.             pIStatusBar->Release();
  139.         }
  140.         if ( m_bAnimated ) {
  141.             m_pIChrome->StartAnimation();
  142.         } else {
  143.             m_pIChrome->StopAnimation();
  144.         }
  145.     }
  146. }
  147.  
  148. void CMailNewsCX::SetProgressBarPercent(MWContext *pContext, int32 lPercent ) {
  149.     //    Ensure the safety of the value.
  150.  
  151.     lPercent = lPercent < 0 ? 0 : ( lPercent > 100 ? 100 : lPercent );
  152.  
  153.     if ( m_lPercent == lPercent ) {
  154.         return;
  155.     }
  156.  
  157.     m_lPercent = lPercent;
  158.     if (m_pIChrome) {
  159.         LPNSSTATUSBAR pIStatusBar = NULL;
  160.         m_pIChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
  161.         if ( pIStatusBar ) {
  162.             pIStatusBar->SetProgress( CASTINT(lPercent) );
  163.             pIStatusBar->Release();
  164.         }
  165.     }
  166. }
  167.  
  168. void CMailNewsCX::Progress(MWContext *pContext, const char *pMessage) {
  169.     m_csProgress = pMessage;
  170.     if ( m_pIChrome ) {
  171.         LPNSSTATUSBAR pIStatusBar = NULL;
  172.         m_pIChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
  173.         if ( pIStatusBar ) {
  174.             pIStatusBar->SetStatusText( pMessage );
  175.             pIStatusBar->Release();
  176.         }
  177.     }
  178. }
  179.  
  180. int32 CMailNewsCX::QueryProgressPercent()    {
  181.     return m_lPercent;
  182. }
  183.  
  184. void CMailNewsCX::SetDocTitle( MWContext *pContext, char *pTitle )
  185. {
  186. }
  187.  
  188. void CMailNewsCX::StartAnimation()
  189. {
  190.     m_bAnimated = TRUE;
  191.     if ( m_pIChrome ) {
  192.         m_pIChrome->StartAnimation();
  193.     }
  194. }
  195.  
  196. void CMailNewsCX::StopAnimation()
  197. {
  198.     m_bAnimated = FALSE;
  199.     if ( m_pIChrome ) {
  200.         m_pIChrome->StopAnimation();
  201.     }
  202. }
  203.  
  204. void CMailNewsCX::AllConnectionsComplete(MWContext *pContext)    
  205. {
  206.     //  Call the base.
  207.     CStubsCX::AllConnectionsComplete(pContext);
  208.  
  209.     //    Okay, stop the animation.
  210.     StopAnimation();
  211.  
  212.     //    Also, we can clear the progress bar now.
  213.     m_lPercent = 0;
  214.     if ( m_pIChrome ) {
  215.         LPNSSTATUSBAR pIStatusBar = NULL;
  216.         m_pIChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
  217.         if ( pIStatusBar ) {
  218.             pIStatusBar->SetProgress( 0 );
  219.             pIStatusBar->Release();
  220.         }
  221.     }
  222.     if (m_pFrame) {
  223.         m_pFrame->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
  224.     }
  225. }
  226.  
  227. void CMailNewsCX::UpdateStopState( MWContext *pContext )
  228. {
  229.     if (m_pFrame) {
  230.         m_pFrame->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
  231.     }
  232. }
  233.  
  234. CWnd *CMailNewsCX::GetDialogOwner() const {
  235.     return m_pFrame;
  236. }
  237.  
  238. /////////////////////////////////////////////////////////////////////////////
  239. // CMailNewsFrame
  240.  
  241. #ifndef _AFXDLL
  242. #undef new
  243. #endif
  244. IMPLEMENT_DYNCREATE(CMailNewsFrame, CGenericFrame)
  245. IMPLEMENT_DYNCREATE(CMsgListFrame, CMailNewsFrame)
  246. #ifndef _AFXDLL
  247. #define new DEBUG_NEW
  248. #endif
  249.  
  250.  
  251. STDMETHODIMP CMailNewsFrame::QueryInterface(REFIID refiid, LPVOID * ppv)
  252. {
  253.     *ppv = NULL;
  254.     if (IsEqualIID(refiid,IID_IUnknown))
  255.            *ppv = (LPUNKNOWN) this;
  256.     else if (IsEqualIID(refiid,IID_IMailFrame))
  257.         *ppv = (LPMAILFRAME) this;
  258.  
  259.     if (*ppv != NULL) {
  260.            AddRef();
  261.         return NOERROR;
  262.     }
  263.             
  264.     return ResultFromScode(E_NOINTERFACE);
  265. }
  266.  
  267. STDMETHODIMP_(ULONG) CMailNewsFrame::AddRef(void)
  268. {
  269.     return ++m_ulRefCount;
  270. }
  271.  
  272. STDMETHODIMP_(ULONG) CMailNewsFrame::Release(void)
  273. {
  274.     ULONG ulRef;
  275.     ulRef = --m_ulRefCount;
  276.     if (m_ulRefCount == 0) 
  277.         delete this;       
  278.     return ulRef;       
  279. }
  280.  
  281. // IMailFrame interface
  282.  
  283. CMailNewsFrame *CMailNewsFrame::GetMailNewsFrame()
  284. {
  285.     return (CMailNewsFrame *) this; 
  286. }
  287.  
  288. MSG_Pane *CMailNewsFrame::GetPane()
  289. {
  290.     return m_pPane;
  291. }
  292.  
  293. void CMailNewsFrame::PaneChanged(MSG_Pane *pane, XP_Bool asynchronous, 
  294.                                  MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
  295. {
  296. }
  297.  
  298. void CMailNewsFrame::AttachmentCount(MSG_Pane *messagepane, void* closure,
  299.                                      int32 numattachments, XP_Bool finishedloading)
  300. {
  301.     if (m_pMessagePane != NULL)
  302.     {
  303.         m_nAttachmentCount = numattachments;
  304.         // OK, so 64 is arbitrary, but a bunch of menu ranges need to
  305.         // be changed if it changes.
  306.         if (m_nAttachmentCount > 64)
  307.             m_nAttachmentCount = 64;
  308.  
  309.         if (m_pAttachmentData)
  310.             MSG_FreeAttachmentList(m_pMessagePane, m_pAttachmentData);
  311.         m_pAttachmentData = NULL;
  312.         MSG_GetViewedAttachments(m_pMessagePane, &m_pAttachmentData, NULL);
  313.  
  314.         if (m_pMessageView) {
  315.             if (numattachments == 0)
  316.                 m_pMessageView->ShowAttachments(FALSE);
  317.             m_pMessageView->SetAttachments( numattachments, m_pAttachmentData );
  318.         }
  319.     }
  320. }
  321.  
  322. void CMailNewsFrame::UserWantsToSeeAttachments(MSG_Pane *messagepane, void* closure)
  323. {
  324.     if (m_pMessagePane != NULL)
  325.     {
  326.         if (m_pMessageView)
  327.             m_pMessageView->ShowAttachments(!m_pMessageView->AttachmentsVisible());
  328.     }
  329. }
  330.  
  331. CMailNewsFrame::CMailNewsFrame()
  332. {
  333.     m_bNews = FALSE;
  334.     m_bCategory = FALSE;
  335.  
  336.     // Folder Frame is the only one that's different
  337.     m_iMessageMenuPos = 4;
  338.     m_iMoveMenuPos = 6;
  339.     m_iCopyMenuPos = 7;
  340.  
  341.     m_iFileMenuPos = 0;
  342.     m_iAttachMenuPos = 3;
  343.  
  344.     m_pPane = NULL;
  345.     m_pMessagePane = NULL;
  346.     m_pMaster = NULL;
  347.     m_ulRefCount = 1; // Don't auto delete
  348.     m_pOutliner = NULL;
  349.     m_pInfoBar = NULL;
  350.  
  351.     m_hAccel = NULL;
  352.  
  353.     m_pAttachmentData = NULL;
  354.     m_nAttachmentCount = 0;
  355.     m_pMessageView = NULL;
  356. }
  357.  
  358. //
  359. // The menu gets cleaned up on window destruction but we need
  360. //   to delete our accelerator table ourselves
  361. //
  362. CMailNewsFrame::~CMailNewsFrame()
  363. {
  364.     if(m_hAccelTable != NULL)   {
  365. #ifdef _WIN32
  366.         VERIFY(::DestroyAcceleratorTable( m_hAccelTable ));
  367. #else
  368.         ::FreeResource((HGLOBAL)m_hAccelTable);
  369. #endif
  370.         m_hAccelTable = NULL;
  371.     }
  372.  
  373.     delete m_pInfoBar;
  374.  
  375.     if ( m_hAccel )
  376. #ifdef _WIN32
  377.         ::DestroyAcceleratorTable( m_hAccel );
  378. #else
  379.         ::FreeResource( (HGLOBAL)m_hAccel );
  380. #endif
  381. }                          
  382.  
  383. C3PaneMailFrame *CMailNewsFrame::GetLastThreadFrame(CFrameWnd *pExclude)
  384. {
  385.     CFrameGlue *pGlue = NULL;
  386.  
  387.     //    Loop through all active frames.
  388.     POSITION rIndex = m_cplActiveFrameStack.GetHeadPosition();
  389.  
  390.     while( rIndex != NULL )    {
  391.         pGlue = (CFrameGlue *) m_cplActiveFrameStack.GetNext( rIndex );
  392.         
  393.         if( pGlue->GetFrameWnd() ) {
  394.             if ( pGlue->GetFrameWnd()->IsKindOf(RUNTIME_CLASS(C3PaneMailFrame)) ) {
  395.                 // Win16 somehow gets the newest frame on the stack before
  396.                 // I want it to, so I need to force it to be skipped
  397.                 if (pGlue->GetFrameWnd() != pExclude)
  398.                     return (C3PaneMailFrame *) pGlue->GetFrameWnd();
  399.             }
  400.         }
  401.     }
  402.     return NULL;
  403. }
  404.  
  405. CMessageFrame *CMailNewsFrame::GetLastMessageFrame(CFrameWnd *pExclude)
  406. {
  407.     CFrameGlue *pGlue = NULL;
  408.  
  409.     //    Loop through all active frames.
  410.     POSITION rIndex = m_cplActiveFrameStack.GetHeadPosition();
  411.  
  412.     while( rIndex != NULL )    {
  413.         pGlue = (CFrameGlue *) m_cplActiveFrameStack.GetNext( rIndex );
  414.         
  415.         if( pGlue->GetFrameWnd() ) {
  416.             if ( pGlue->GetFrameWnd()->IsKindOf(RUNTIME_CLASS(CMessageFrame)) ) {
  417.                 // Win16 somehow gets the newest frame on the stack before
  418.                 // I want it to, so I need to force it to be skipped
  419.                 if (pGlue->GetFrameWnd() != pExclude)
  420.                     return (CMessageFrame *) pGlue->GetFrameWnd();
  421.             }
  422.         }
  423.     }
  424.     return NULL;
  425. }
  426.  
  427.  
  428. extern int iLowerColors;
  429. extern int iLowerSystemColors;
  430.  
  431. BOOL CMailNewsFrame::LoadAccelerators( UINT nID )
  432. {
  433.     return LoadAccelerators(MAKEINTRESOURCE(nID));
  434. }
  435.  
  436. BOOL CMailNewsFrame::LoadAccelerators( LPCSTR lpszResource )
  437. {
  438.     BOOL bSuccess = FALSE;
  439.  
  440.     VERIFY( m_hAccel = ::LoadAccelerators(AfxGetResourceHandle(), lpszResource ));
  441.     if ( m_hAccel )
  442.         bSuccess = TRUE;
  443.  
  444.     return bSuccess;
  445. }
  446.  
  447. void CMailNewsFrame::ActivateFrame( int nCmdShow )
  448. {
  449.     nCmdShow = (nCmdShow == -1) ? (IsIconic() ? SW_RESTORE : SW_SHOW) : nCmdShow;
  450.  
  451. #ifdef _WIN32
  452.     SetForegroundWindow();
  453. #else
  454.     SetActiveWindow();
  455. #endif
  456.  
  457.     CGenericFrame::ActivateFrame( nCmdShow );
  458. }
  459.  
  460. BOOL CMailNewsFrame::PreCreateWindow( CREATESTRUCT& cs )
  461. {
  462.     BOOL res = CGenericFrame::PreCreateWindow(cs);
  463.  
  464.     if (!sysInfo.m_bWin4) {
  465.         if (m_bPreCreated) {
  466.             cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW, 
  467.                                                ::LoadCursor(NULL, IDC_ARROW),
  468.                                                (HBRUSH)(COLOR_WINDOW+1),
  469.                                                NULL);
  470.             cs.hInstance = AfxGetInstanceHandle();
  471.         }
  472.     }
  473.  
  474.     return res;
  475. }
  476.  
  477. BOOL CMailNewsFrame::PreTranslateMessage( MSG *pMsg )
  478. {
  479.     if ( pMsg->message == WM_KEYDOWN) {
  480.         CWinCX*    pContext = GetActiveWinContext();
  481.  
  482.         // Determine if keystroke is destined for a contained window
  483.         HWND hwnd = pMsg->hwnd;
  484.         LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
  485.         while ((lStyle & WS_CHILD) && (hwnd = ::GetParent(hwnd))) {
  486.             lStyle = GetWindowLong(hwnd, GWL_STYLE);
  487.         }
  488.  
  489.         if (hwnd == m_hWnd && pContext) {
  490.             HWND hwndFocus = ::GetFocus();
  491.             HWND hwndView = pContext->GetPane();
  492.  
  493.             if ( !::IsChild( hwndView, hwndFocus ) ) {
  494.                 // Give accelerators first shot
  495.                 if ( TranslateAccelerator( m_hWnd, m_hAccel, pMsg ) ) {
  496.                     return TRUE;
  497.                 }
  498.             }
  499.         }
  500.     }
  501.  
  502.     return CGenericFrame::PreTranslateMessage( pMsg );
  503. }
  504.  
  505. void CMailNewsFrame::GetMessageString( UINT nID, CString& rMessage ) const
  506. {
  507.     MSG_FolderInfo *folderInfo = GetCurFolder();
  508.     MSG_FolderLine folderLine;
  509.     folderLine.flags = 0;
  510.     if ( folderInfo ) {
  511.         MSG_GetFolderLineById( WFE_MSGGetMaster(), folderInfo, &folderLine );
  512.     }
  513.  
  514.     CString csFull = "";
  515.  
  516.     switch (nID) {
  517.     case ID_EDIT_DELETEMESSAGE:
  518.         if (m_bNews)
  519.             csFull.LoadString( IDS_STATUS_CANCELMESSAGE );
  520.         break;
  521.  
  522.     case ID_EDIT_DELETEFOLDER:
  523.     case ID_POPUP_DELETEFOLDER:
  524.         if ( folderLine.flags & MSG_FOLDER_FLAG_MAIL ) {
  525.             csFull.LoadString( ID_EDIT_DELETEFOLDER );
  526.         } else if ( folderLine.flags & MSG_FOLDER_FLAG_NEWS_HOST ) {
  527.             rMessage.LoadString( IDS_STATUS_DELETENEWSHOST );
  528.         } else if ( folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ) {
  529.             rMessage.LoadString( IDS_STATUS_DELETENEWSGROUP );
  530.         } else {
  531.             rMessage.LoadString( IDS_STATUS_DELETESELECTION );
  532.         }
  533.         break;
  534.  
  535.     case ID_FILE_GETNEXT:
  536.         {
  537.             int32 iDownloadMax = 0;
  538.             PREF_GetIntPref("news.max_articles", &iDownloadMax);
  539.             csFull.Format(szLoadString(ID_FILE_GETNEXT), (int) iDownloadMax );
  540.         }
  541.         break;
  542.  
  543.     case ID_FILE_NEWFOLDER:
  544.         if (m_bNews) {
  545.             if (m_bCategory)
  546.                 csFull.LoadString(ID_FILE_NEWCATEGORY);
  547.             else
  548.                 csFull.LoadString(ID_FILE_NEWNEWSGROUP);
  549.         } else {
  550.             csFull.LoadString(ID_FILE_NEWFOLDER);
  551.         }
  552.         break;
  553.  
  554.     default:
  555.         break;
  556.     }
  557.  
  558.     if (nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID)
  559.         csFull.LoadString(IDS_STATUS_MOVEMESSAGE);
  560.     else if (nID >= FIRST_COPY_MENU_ID && nID <= LAST_COPY_MENU_ID)
  561.         csFull.LoadString(IDS_STATUS_COPYMESSAGE);
  562.  
  563.     if (!csFull.IsEmpty()) {
  564.         AfxExtractSubString( rMessage, csFull, 0 );
  565.     } else {
  566.         CGenericFrame::GetMessageString( nID, rMessage );
  567.     }
  568. }
  569.  
  570. BEGIN_MESSAGE_MAP(CMailNewsFrame, CGenericFrame)
  571.     ON_WM_CREATE()
  572.     ON_WM_PAINT()
  573.     ON_WM_QUERYDRAGICON()
  574.     ON_WM_CLOSE()
  575.     ON_WM_SETFOCUS()
  576.     ON_WM_DESTROY()
  577.     ON_WM_INITMENUPOPUP()
  578.     ON_MESSAGE(NSBUTTONMENUOPEN, OnButtonMenuOpen)
  579.  
  580.     // File Menu Commands
  581.     ON_COMMAND(ID_FILE_NEWMESSAGE, OnNew)
  582.     ON_UPDATE_COMMAND_UI(ID_FILE_NEWMESSAGE, OnUpdateNew)
  583.     ON_COMMAND(ID_FILE_NEWFOLDER, OnNewFolder)
  584.     ON_UPDATE_COMMAND_UI(ID_FILE_NEWFOLDER, OnUpdateNewFolder)
  585.     ON_COMMAND(ID_FILE_NEWNEWSGROUP, OnNewNewsgroup)
  586.     ON_UPDATE_COMMAND_UI(ID_FILE_NEWNEWSGROUP, OnUpdateNewNewsgroup)
  587.     ON_COMMAND(ID_FILE_NEWNEWSHOST, OnNewNewshost)
  588.     ON_UPDATE_COMMAND_UI(ID_FILE_NEWNEWSHOST, OnUpdateNewNewshost)
  589.     ON_COMMAND(ID_FILE_NEWCATEGORY, OnNewCategory)       
  590.     ON_UPDATE_COMMAND_UI(ID_FILE_NEWCATEGORY, OnUpdateNewCategory)
  591.     ON_COMMAND(ID_FILE_SAVEMESSAGES, OnSave)
  592.     ON_UPDATE_COMMAND_UI(ID_FILE_SAVEMESSAGES, OnUpdateSave)
  593.     ON_COMMAND(ID_FILE_EDITMESSAGE, OnEditMessage)
  594.     ON_UPDATE_COMMAND_UI(ID_FILE_EDITMESSAGE, OnUpdateEditMessage)
  595.     ON_COMMAND(ID_FILE_ADDNEWSGROUP, OnAddNewsGroup)
  596.     ON_UPDATE_COMMAND_UI(ID_FILE_ADDNEWSGROUP, OnUpdateAddNewsGroup)
  597.     ON_COMMAND(ID_FILE_SUBSCRIBE, OnSubscribe)
  598.     ON_UPDATE_COMMAND_UI(ID_FILE_SUBSCRIBE, OnUpdateSubscribe)
  599.     ON_COMMAND(ID_FILE_UNSUBSCRIBE, OnUnsubscribe)
  600.     ON_UPDATE_COMMAND_UI(ID_FILE_UNSUBSCRIBE, OnUpdateUnsubscribe)
  601. #ifdef ON_COMMAND_RANGE
  602.     ON_COMMAND_RANGE( FIRST_ATTACH_MENU_ID, LAST_ATTACH_MENU_ID, OnOpenAttach )
  603.     ON_UPDATE_COMMAND_UI_RANGE( FIRST_ATTACH_MENU_ID, LAST_ATTACH_MENU_ID, OnUpdateOpenAttach )
  604.     ON_COMMAND_RANGE( FIRST_SAVEATTACH_MENU_ID, LAST_SAVEATTACH_MENU_ID, OnSaveAttach )
  605.     ON_UPDATE_COMMAND_UI_RANGE( FIRST_SAVEATTACH_MENU_ID, LAST_SAVEATTACH_MENU_ID, OnUpdateSaveAttach )
  606.     ON_COMMAND_RANGE( FIRST_ATTACHPROP_MENU_ID, LAST_ATTACHPROP_MENU_ID, OnAttachProperties )
  607.     ON_UPDATE_COMMAND_UI_RANGE( FIRST_ATTACHPROP_MENU_ID, LAST_ATTACHPROP_MENU_ID, OnUpdateAttachProperties )
  608. #endif
  609.  
  610.     // Edit Menu Commands
  611.     ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
  612.     ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
  613.     ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
  614.     ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
  615.     ON_COMMAND(ID_EDIT_DELETEFOLDER, OnDeleteFolder)
  616.     ON_UPDATE_COMMAND_UI(ID_EDIT_DELETEFOLDER, OnUpdateDeleteFolder)
  617.     ON_COMMAND(ID_POPUP_DELETEFOLDER, OnDeleteFolder)
  618.     ON_UPDATE_COMMAND_UI(ID_POPUP_DELETEFOLDER, OnUpdateDeleteFolder)
  619.     ON_COMMAND(ID_EDIT_DELETEMESSAGE, OnDeleteMessage)
  620.     ON_COMMAND(ID_EDIT_REALLYDELETEMESSAGE, OnReallyDeleteMessage)
  621.     ON_UPDATE_COMMAND_UI(ID_EDIT_DELETEMESSAGE, OnUpdateDeleteMessage)
  622.     ON_COMMAND(ID_EDIT_SELECTALLMESSAGES, OnSelectAll)
  623.     ON_UPDATE_COMMAND_UI(ID_EDIT_SELECTALLMESSAGES, OnUpdateSelectAll)
  624.     ON_COMMAND(ID_EDIT_SELECTALL, OnSelectAll)
  625.     ON_UPDATE_COMMAND_UI(ID_EDIT_SELECTALL, OnUpdateSelectAll)
  626.     ON_COMMAND(ID_EDIT_SEARCH, OnSearch)
  627.     ON_COMMAND(ID_EDIT_FILTER, OnFilter)
  628.     ON_COMMAND(ID_EDIT_MANAGEMAILACCOUNT, OnSetupWizard)
  629.     ON_UPDATE_COMMAND_UI(ID_EDIT_MANAGEMAILACCOUNT, OnUpdateSetupWizard)
  630.     ON_COMMAND(ID_EDIT_SERVER, OnServerStuff)
  631.     ON_UPDATE_COMMAND_UI(ID_EDIT_SERVER, OnUpdateServerStuff)
  632.  
  633.     // View Menu Items
  634.     ON_COMMAND(ID_MAIL_SORTAGAIN, OnSortAgain)
  635.     ON_UPDATE_COMMAND_UI(ID_MAIL_SORTAGAIN, OnUpdateSortAgain)
  636.     ON_COMMAND(ID_SORT_ASCENDING, OnAscending)
  637.     ON_UPDATE_COMMAND_UI(ID_SORT_ASCENDING, OnUpdateAscending)
  638.     ON_COMMAND(ID_SORT_DESCENDING, OnDescending)
  639.     ON_UPDATE_COMMAND_UI(ID_SORT_DESCENDING, OnUpdateDescending)
  640.     ON_COMMAND(ID_SORT_BYDATE, OnSortDate)
  641.     ON_UPDATE_COMMAND_UI(ID_SORT_BYDATE, OnUpdateSortDate)
  642.     ON_COMMAND(ID_SORT_BYSUBJECT, OnSortSubject)
  643.     ON_UPDATE_COMMAND_UI(ID_SORT_BYSUBJECT, OnUpdateSortSubject)
  644.     ON_COMMAND(ID_SORT_BYSENDER, OnSortSender)
  645.     ON_UPDATE_COMMAND_UI(ID_SORT_BYSENDER, OnUpdateSortSender)
  646.     ON_COMMAND(ID_SORT_BYMESSAGENUMBER, OnSortNumber)
  647.     ON_UPDATE_COMMAND_UI(ID_SORT_BYMESSAGENUMBER, OnUpdateSortNumber)
  648.     ON_COMMAND(ID_SORT_BYTHREAD, OnThread)
  649.     ON_UPDATE_COMMAND_UI(ID_SORT_BYTHREAD, OnUpdateThread)
  650.     ON_COMMAND(ID_SORT_BYPRIORITY, OnSortPriority)
  651.     ON_UPDATE_COMMAND_UI(ID_SORT_BYPRIORITY, OnUpdateSortPriority)
  652.     ON_COMMAND(ID_SORT_BYSTATUS, OnSortStatus)
  653.     ON_UPDATE_COMMAND_UI(ID_SORT_BYSTATUS, OnUpdateSortStatus)
  654.     ON_COMMAND(ID_SORT_BYSIZE, OnSortSize)
  655.     ON_UPDATE_COMMAND_UI(ID_SORT_BYSIZE, OnUpdateSortSize)
  656.     ON_COMMAND(ID_SORT_BYFLAG, OnSortFlag)
  657.     ON_UPDATE_COMMAND_UI(ID_SORT_BYFLAG, OnUpdateSortFlag)
  658.     ON_COMMAND(ID_SORT_BYUNREAD, OnSortUnread)
  659.     ON_UPDATE_COMMAND_UI(ID_SORT_BYUNREAD, OnUpdateSortUnread)
  660.     ON_COMMAND(ID_VIEW_ALLTHREADS, OnViewAll)
  661.     ON_UPDATE_COMMAND_UI(ID_VIEW_ALLTHREADS, OnUpdateViewAll)
  662.     ON_COMMAND(ID_VIEW_KILLEDTHREADS, OnViewKilled)
  663.     ON_UPDATE_COMMAND_UI(ID_VIEW_KILLEDTHREADS, OnUpdateViewKilled)
  664.     ON_COMMAND(ID_VIEW_WATCHEDTHREADS, OnViewWatched)
  665.     ON_UPDATE_COMMAND_UI(ID_VIEW_WATCHEDTHREADS, OnUpdateViewWatched)
  666.     ON_COMMAND(ID_VIEW_NEWTHREADS, OnViewNew)
  667.     ON_UPDATE_COMMAND_UI(ID_VIEW_NEWTHREADS, OnUpdateViewNew)
  668.     ON_COMMAND(ID_VIEW_NEWONLY, OnViewNewOnly)
  669.     ON_UPDATE_COMMAND_UI(ID_VIEW_NEWONLY, OnUpdateViewNewOnly)
  670.     ON_COMMAND(ID_VIEW_HEADERS_MICRO, OnHeadersMicro)
  671.     ON_UPDATE_COMMAND_UI(ID_VIEW_HEADERS_MICRO, OnUpdateHeadersMicro)
  672.     ON_COMMAND(ID_VIEW_HEADERS_SHORT, OnHeadersShort)
  673.     ON_UPDATE_COMMAND_UI(ID_VIEW_HEADERS_SHORT, OnUpdateHeadersShort)
  674.     ON_COMMAND(ID_VIEW_HEADERS_ALL, OnHeadersAll)
  675.     ON_UPDATE_COMMAND_UI(ID_VIEW_HEADERS_ALL, OnUpdateHeadersAll)
  676.     ON_COMMAND(ID_VIEW_ATTACHINLINE,OnViewInline)
  677.     ON_UPDATE_COMMAND_UI(ID_VIEW_ATTACHINLINE,OnUpdateViewInline)
  678.     ON_COMMAND(ID_VIEW_ATTACHLINKS,OnViewAsLinks)
  679.     ON_UPDATE_COMMAND_UI(ID_VIEW_ATTACHLINKS,OnUpdateViewAsLinks)
  680.  
  681.     // Navigation Commands
  682.     ON_COMMAND(ID_MESSAGE_NEXT, OnNext)
  683.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_NEXT, OnUpdateNext)
  684.     ON_COMMAND(ID_MESSAGE_NEXTNEWSGROUP, OnNextFolder)
  685.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_NEXTNEWSGROUP, OnUpdateNextFolder)
  686.     ON_COMMAND(ID_MESSAGE_NEXTUNREAD, OnNextUnread)
  687.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_NEXTUNREAD, OnUpdateNextUnread)
  688.     ON_COMMAND(ID_MESSAGE_PREVIOUS, OnPrevious)
  689.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_PREVIOUS, OnUpdatePrevious)
  690.     ON_COMMAND(ID_MESSAGE_PREVIOUSUNREAD, OnPreviousUnread)
  691.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_PREVIOUSUNREAD, OnUpdatePreviousUnread)
  692.     ON_COMMAND(ID_MESSAGE_NEXTUNREADTHREAD, OnNextUnreadThread)
  693.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_NEXTUNREADTHREAD, OnUpdateNextUnreadThread)
  694.     ON_COMMAND(ID_MESSAGE_NEXTUNREADNEWSGROUP, OnNextUnreadFolder)
  695.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_NEXTUNREADNEWSGROUP, OnUpdateNextUnreadFolder)
  696.     ON_COMMAND(ID_MESSAGE_PREVIOUSFLAGGED, OnPreviousFlagged)
  697.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_PREVIOUSFLAGGED, OnUpdatePreviousFlagged)
  698.     ON_COMMAND(ID_MESSAGE_NEXTFLAGGED, OnNextFlagged)
  699.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_NEXTFLAGGED, OnUpdateNextFlagged)
  700.     ON_COMMAND(ID_MESSAGE_FIRSTFLAGGED, OnFirstFlagged)
  701.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_FIRSTFLAGGED, OnUpdateFirstFlagged)
  702.  
  703.     /* hack for message backtracking */
  704.     ON_COMMAND(ID_NAVIGATE_MSG_BACK, OnGoBack)
  705.     ON_UPDATE_COMMAND_UI(ID_NAVIGATE_MSG_BACK, OnUpdateGoBack)
  706.     ON_COMMAND(ID_NAVIGATE_MSG_FORWARD, OnGoForward)
  707.     ON_UPDATE_COMMAND_UI(ID_NAVIGATE_MSG_FORWARD, OnUpdateGoForward)
  708.  
  709.     // Message menu items
  710.      ON_COMMAND(ID_FILE_GETNEWMAIL, OnGetMail)
  711.      ON_UPDATE_COMMAND_UI(ID_FILE_GETNEWMAIL, OnUpdateGetMail)
  712.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_REPLYBUTTON, OnUpdateReply)
  713.      ON_COMMAND(ID_FILE_GETMOREMESSAGES, OnGetMail)
  714.      ON_UPDATE_COMMAND_UI(ID_FILE_GETMOREMESSAGES, OnUpdateGetMail)
  715.     ON_COMMAND(ID_FILE_GETNEXT, OnGetNext)
  716.     ON_UPDATE_COMMAND_UI(ID_FILE_GETNEXT, OnUpdateGetNext)
  717.     ON_COMMAND(ID_FILE_DELIVERMAILNOW,OnDeliverNow)
  718.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_SENDUNSENT,OnUpdateDeliverNow)
  719.     ON_COMMAND(ID_MESSAGE_SENDUNSENT, OnDeliverNow)
  720.     ON_UPDATE_COMMAND_UI(ID_FILE_DELIVERMAILNOW,OnUpdateDeliverNow)
  721.     ON_COMMAND(ID_NEWS_POSTNEW, OnPostNew)
  722.     ON_UPDATE_COMMAND_UI(ID_NEWS_POSTNEW, OnUpdatePostNew)
  723.     ON_COMMAND(ID_MESSAGE_REPLY, OnReply)
  724.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_REPLY, OnUpdateReply)
  725.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_MARKBUTTON, OnUpdateMarkAllRead )
  726.     ON_COMMAND(ID_MESSAGE_REPLYALL, OnReplyAll)
  727.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_REPLYALL, OnUpdateReplyAll)
  728.     ON_COMMAND(ID_MESSAGE_FORWARD, OnForward)
  729.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_FORWARD, OnUpdateForward)
  730.     ON_COMMAND(ID_MESSAGE_FORWARDQUOTED, OnForwardQuoted)
  731.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_FORWARDQUOTED, OnUpdateForwardQuoted)
  732.     ON_COMMAND(ID_MESSAGE_POSTREPLY, OnPostReply)
  733.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_POSTREPLY, OnUpdatePostReply)
  734.     ON_COMMAND(ID_MESSAGE_POSTANDREPLY, OnPostAndMailReply)
  735.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_POSTANDREPLY, OnUpdatePostAndMailReply)
  736.     ON_COMMAND(ID_MESSAGE_KILL, OnKill )
  737.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_KILL, OnUpdateKill )
  738.     ON_COMMAND(ID_MESSAGE_RETRIEVESELECTED, OnRetrieveSelected)
  739.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_RETRIEVESELECTED, OnUpdateRetrieveSelected)
  740.     ON_COMMAND(ID_MESSAGE_WATCH, OnWatch )
  741.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_WATCH, OnUpdateWatch )
  742.     ON_COMMAND(ID_MESSAGE_MARKASREAD, OnMarkMessagesRead)
  743.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_MARKASREAD, OnUpdateMarkMessagesRead)
  744.     ON_COMMAND(ID_MESSAGE_MARKASUNREAD, OnMarkMessagesUnread)
  745.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_MARKASUNREAD, OnUpdateMarkMessagesUnread)
  746.     ON_COMMAND(ID_MESSAGE_MARKTHREADREAD, OnMarkThreadRead )
  747.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_MARKTHREADREAD, OnUpdateMarkThreadRead )
  748.     ON_COMMAND(ID_MESSAGE_MARKALLREAD, OnMarkAllRead )
  749.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_MARKALLREAD, OnUpdateMarkAllRead )
  750.     ON_COMMAND(ID_MESSAGE_MARKALLREAD, OnMarkAllRead )
  751.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_MARKALLREAD, OnUpdateMarkAllRead )
  752.     ON_COMMAND(ID_MESSAGE_CATCHUP, OnCatchup)
  753.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_CATCHUP, OnUpdateCatchup)
  754.     ON_COMMAND(ID_MESSAGE_MARKASLATER, OnMarkMessagesLater)
  755.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_MARKASLATER, OnUpdateMarkMessagesLater)
  756.     ON_COMMAND(ID_MESSAGE_RETRIEVEOFFLINE, OnRetrieveOffline)
  757.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_RETRIEVEOFFLINE, OnUpdateRetrieveOffline)
  758.     ON_COMMAND(ID_MESSAGE_MARK, OnMarkMessages )
  759.     ON_UPDATE_COMMAND_UI( ID_MESSAGE_MARK, OnUpdateMarkMessages )
  760.     ON_COMMAND(ID_MESSAGE_UNMARK, OnUnmarkMessages )
  761.     ON_UPDATE_COMMAND_UI( ID_MESSAGE_UNMARK, OnUpdateUnmarkMessages )
  762.     ON_COMMAND(ID_EDIT_CANCELMESSAGE, OnCancelMessage)
  763.     ON_UPDATE_COMMAND_UI(ID_EDIT_CANCELMESSAGE, OnUpdateCancelMessage)
  764.     ON_COMMAND(ID_NAVIGATE_INTERRUPT, OnInterrupt)
  765.     ON_UPDATE_COMMAND_UI(ID_NAVIGATE_INTERRUPT, OnUpdateInterrupt)
  766.     ON_COMMAND(ID_MAIL_WRAPLONGLINES,OnWrapLongLines)
  767.     ON_UPDATE_COMMAND_UI(ID_MAIL_WRAPLONGLINES,OnUpdateWrapLongLines)
  768.     ON_COMMAND(ID_VIEW_ROT13,OnViewRot13)
  769.     ON_UPDATE_COMMAND_UI(ID_VIEW_ROT13,OnUpdateViewRot13)
  770.  
  771.     // Organize Menu
  772.     ON_COMMAND(ID_FILE_COMPRESSTHISFOLDER, OnCompressFolder)
  773.     ON_UPDATE_COMMAND_UI(ID_FILE_COMPRESSTHISFOLDER, OnUpdateCompressFolder)
  774.     ON_COMMAND(ID_FOLDER_RENAME, OnRenameFolder)
  775.     ON_UPDATE_COMMAND_UI(ID_FOLDER_RENAME, OnUpdateRenameFolder)
  776.     ON_COMMAND(ID_FILE_COMPRESSALLFOLDERS, OnCompressAll)
  777.     ON_UPDATE_COMMAND_UI(ID_FILE_COMPRESSALLFOLDERS, OnUpdateCompressAll)
  778.     ON_COMMAND(ID_FILE_EMPTYTRASHFOLDER, OnEmptyTrash)
  779.     ON_UPDATE_COMMAND_UI(ID_FILE_EMPTYTRASHFOLDER, OnUpdateEmptyTrash)
  780.     ON_COMMAND(ID_MESSAGE_ADDSENDER, OnAddToAddressBook)
  781.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_ADDSENDER, OnUpdateAddToAddressBook)
  782.     ON_COMMAND(ID_MESSAGE_ADDALL, OnAddAllToAddressBook)
  783.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_ADDALL, OnUpdateAddAllToAddressBook)
  784.  
  785.     // Non-MSG Commands
  786.     ON_COMMAND(ID_OPTIONS_TIPS, OnTips)
  787.     ON_COMMAND(ID_MESSAGE_FILE, OnQuickFile)
  788.     ON_UPDATE_COMMAND_UI(ID_MESSAGE_FILE, OnUpdateQuickFile)
  789.     ON_COMMAND(ID_PRIORITY_LOWEST, OnPriorityLowest)
  790.     ON_UPDATE_COMMAND_UI(ID_PRIORITY_LOWEST, OnUpdatePriority)
  791.     ON_COMMAND(ID_PRIORITY_LOW, OnPriorityLow)
  792.     ON_UPDATE_COMMAND_UI(ID_PRIORITY_LOW, OnUpdatePriority)
  793.     ON_COMMAND(ID_PRIORITY_NORMAL, OnPriorityNormal)
  794.     ON_UPDATE_COMMAND_UI(ID_PRIORITY_NORMAL, OnUpdatePriority)
  795.     ON_COMMAND(ID_PRIORITY_HIGH, OnPriorityHigh)
  796.     ON_UPDATE_COMMAND_UI(ID_PRIORITY_HIGH, OnUpdatePriority)
  797.     ON_COMMAND(ID_PRIORITY_HIGHEST, OnPriorityHighest)
  798.     ON_UPDATE_COMMAND_UI(ID_PRIORITY_HIGHEST, OnUpdatePriority)
  799.     ON_UPDATE_COMMAND_UI(ID_SECURITY, OnUpdateSecurity)
  800.     ON_UPDATE_COMMAND_UI(IDS_SECURITY_STATUS, OnUpdateSecureStatus)
  801.     ON_UPDATE_COMMAND_UI(IDS_SIGNED_STATUS, OnUpdateSecureStatus)
  802.  
  803. END_MESSAGE_MAP()
  804.  
  805. BOOL CMailNewsFrame::OnCommand( WPARAM wParam, LPARAM lParam )
  806. {
  807.     UINT nID = wParam;
  808.  
  809.     if (nID == ID_FILE_SUBSCRIBE)
  810.     {
  811.         MSG_Host* pThisHost = (MSG_Host*)lParam;
  812.         DoSubscribe(pThisHost);
  813.         return TRUE;
  814.     }
  815.  
  816. #ifndef ON_COMMAND_RANGE
  817.  
  818.     if ( nID >= FIRST_ATTACH_MENU_ID && nID <= LAST_ATTACH_MENU_ID ) {
  819.         OnOpenAttach( nID );
  820.         return TRUE;
  821.     } else if (nID >= FIRST_SAVEATTACH_MENU_ID && nID <= LAST_SAVEATTACH_MENU_ID) {
  822.         OnSaveAttach( nID );
  823.         return TRUE;
  824.     } else if (nID >= FIRST_ATTACHPROP_MENU_ID && nID <= LAST_ATTACHPROP_MENU_ID) {
  825.         OnAttachProperties( nID );
  826.         return TRUE;
  827.     }
  828. #endif
  829.  
  830.     return CGenericFrame::OnCommand( wParam, lParam );
  831. }
  832.  
  833. #ifndef ON_COMMAND_RANGE
  834.  
  835. BOOL CMailNewsFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
  836.     if (nCode == CN_UPDATE_COMMAND_UI) {
  837.         CCmdUI* pCmdUI = (CCmdUI*)pExtra;
  838.         if ( nID >= FIRST_ATTACH_MENU_ID && nID <= LAST_ATTACH_MENU_ID ) {
  839.             OnUpdateOpenAttach( pCmdUI );
  840.             return TRUE;
  841.         } else if (nID >= FIRST_SAVEATTACH_MENU_ID && nID <= LAST_SAVEATTACH_MENU_ID) {
  842.             OnUpdateSaveAttach( pCmdUI );
  843.             return TRUE;
  844.         } else if (nID >= FIRST_ATTACHPROP_MENU_ID && nID <= LAST_ATTACHPROP_MENU_ID) {
  845.             OnUpdateAttachProperties( pCmdUI );
  846.             return TRUE;
  847.         }
  848.     }
  849.     return CGenericFrame::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  850. }
  851.  
  852. #endif
  853.  
  854. static int iMailFrameCount = 0;
  855.  
  856. int CMailNewsFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  857. {
  858.     int res = CGenericFrame::OnCreate(lpCreateStruct);
  859.  
  860.     iMailFrameCount++;
  861.  
  862.     return res;
  863. }
  864.  
  865. static void _ShutDownFrameCallBack(HWND hwnd, MSG_Pane *pane, void * closure)
  866. {
  867.     if (::IsWindow(hwnd)) {
  868.         ::ShowWindow(hwnd,SW_SHOW);
  869.         ::UpdateWindow(hwnd);
  870.     }
  871.  
  872.     if (pane)
  873.         MSG_CleanupFolders(pane);
  874. }
  875.  
  876. void CMailNewsFrame::OnPaint()
  877. {
  878.     // To switch icons on < version 4, we have to override paint
  879.     // when the window is iconic
  880.     if (!sysInfo.m_bWin4 && IsIconic()) {
  881.         CPaintDC dc(this);
  882.         UINT nIDIcon = m_bNews ? IDR_NEWSTHREAD : IDR_MAILTHREAD;
  883.         if (IsKindOf(RUNTIME_CLASS(CFolderFrame)))
  884.             nIDIcon = IDR_MAILFRAME;
  885.         HICON hLargeIcon = theApp.LoadIcon(nIDIcon);
  886.  
  887.         dc.DrawIcon(0, 0, hLargeIcon);
  888.     } else {
  889.         CGenericFrame::OnPaint();
  890.     }
  891. }
  892.  
  893. HCURSOR CMailNewsFrame::OnQueryDragIcon()
  894. {
  895.     UINT nIDIcon = m_bNews ? IDR_NEWSTHREAD : IDR_MAILTHREAD;
  896.     if (IsKindOf(RUNTIME_CLASS(CFolderFrame)))
  897.         nIDIcon = IDR_MAILFRAME;
  898.  
  899.     return (HCURSOR) theApp.LoadIcon(nIDIcon);
  900. }
  901.  
  902. void CMailNewsFrame::OnClose()  
  903. {
  904.     XP_Bool bSelectable = FALSE;
  905.     XP_Bool bPlural = FALSE;
  906.     MSG_COMMAND_CHECK_STATE sState = MSG_Unchecked;
  907.  
  908.     if (1 == iMailFrameCount)    // this seems to be null when you close a message window dmb
  909.     {
  910.         ASSERT(m_pPane);
  911.         MSG_CommandStatus(m_pPane, MSG_DeliverQueuedMessages, 0, NULL,
  912.                           &bSelectable, &sState, NULL, &bPlural);
  913.  
  914.         
  915.         if (bSelectable && !NET_IsOffline()) {
  916.             CString strTitle;
  917.             VERIFY(strTitle.LoadString(IDS_NETSCAPE_MAIL_TITLE));
  918.  
  919.             if (MessageBox(szLoadString(IDS_UNSENT_MESSAGES), strTitle, MB_YESNO) == IDYES) {
  920.                 MSG_Command(m_pPane, MSG_DeliverQueuedMessages, 0, NULL );
  921.                 return;
  922.             }
  923.         }
  924.         if (MSG_CleanupNeeded(m_pMaster))
  925.           new CProgressDialog(NULL, m_pPane,_ShutDownFrameCallBack,
  926.             NULL,szLoadString(IDS_COMPRESSINGFOLDERS));
  927.     }
  928.  
  929.     CGenericFrame::OnClose();
  930. }
  931.  
  932. void CMailNewsFrame::OnDestroy()
  933. {
  934.     iMailFrameCount--;
  935.  
  936.     MSG_DestroyPane(m_pPane);
  937.     m_pPane = NULL;
  938.  
  939.     CGenericFrame::OnDestroy();
  940. }
  941.  
  942. void CMailNewsFrame::OnInitMenuPopup( CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu )
  943. {
  944.     AfxLockTempMaps();
  945.     CGenericFrame::OnInitMenuPopup( pPopupMenu, nIndex, bSysMenu );
  946.  
  947.     HMENU hmenu = ::GetMenu(m_hWnd);
  948.     if ( m_iMessageMenuPos >= 0 && 
  949.          pPopupMenu->m_hMenu == GetSubMenu(hmenu, m_iMessageMenuPos )) { 
  950.         UpdateFileMenus();
  951.     } else if (m_iFileMenuPos >= 0 &&
  952.                pPopupMenu->m_hMenu == GetSubMenu(hmenu, m_iFileMenuPos )) {
  953.         UpdateAttachmentMenus();
  954.     }
  955.     AfxUnlockTempMaps();
  956. }
  957.  
  958. MSG_FolderInfo *CMailNewsFrame::FolderInfoFromMenuID( MSG_FolderInfo *mailRoot, 
  959.                                                       UINT &nBase, UINT nID )
  960. {
  961.     int i, iCount;
  962.     MSG_FolderInfo **folderInfos;
  963.     MSG_FolderInfo *res = NULL;
  964.     MSG_FolderLine folderLine;
  965.  
  966.     if (mailRoot == NULL ) {
  967.         // Loop through top level folderInfos, looking for mail trees.
  968.  
  969.         iCount = MSG_GetFolderChildren(m_pMaster, NULL, NULL, NULL);
  970.         folderInfos = new MSG_FolderInfo*[iCount];
  971.         if (folderInfos) {
  972.             MSG_GetFolderChildren(m_pMaster, NULL, folderInfos, iCount);
  973.  
  974.             for (i = 0; i < iCount && !res; i++) {
  975.                 if (MSG_GetFolderLineById(m_pMaster, folderInfos[i], &folderLine)) {
  976.                     if (folderLine.flags & MSG_FOLDER_FLAG_MAIL) {
  977.                         res = FolderInfoFromMenuID( folderInfos[i], nBase, nID);
  978.                     }
  979.                 }
  980.             }
  981.             delete [] folderInfos;
  982.         }
  983.         return res;
  984.     }
  985.  
  986.     MSG_GetFolderLineById( m_pMaster, mailRoot, &folderLine );
  987.     if (folderLine.level > 1) { // We've a subfolder
  988.         if ( nID == nBase ) {
  989.             return mailRoot;
  990.         }
  991.         nBase++;
  992.     }
  993.  
  994.     iCount = MSG_GetFolderChildren( m_pMaster, mailRoot, NULL, NULL );
  995.  
  996.     folderInfos = new MSG_FolderInfo*[iCount];
  997.     ASSERT( folderInfos );
  998.     if (folderInfos) {
  999.         MSG_GetFolderChildren( m_pMaster, mailRoot, folderInfos, iCount );
  1000.  
  1001.         for ( i = 0; i < iCount && !res; i++ ) {
  1002.             if ( MSG_GetFolderLineById( m_pMaster, folderInfos[ i ], &folderLine ) ) {
  1003.                 if ( folderLine.numChildren > 0 ) {
  1004.                     res = FolderInfoFromMenuID( folderInfos[ i ], nBase, nID );
  1005.                 } else {
  1006.                     if ( nID == nBase ) {
  1007.                         res = folderInfos[ i ];
  1008.                     } else {
  1009.                         nBase++;
  1010.                     }
  1011.                 }
  1012.             }
  1013.         }
  1014.         delete [] folderInfos;
  1015.     }
  1016.  
  1017.     return res;
  1018. }
  1019.  
  1020. MSG_FolderInfo *CMailNewsFrame::FolderInfoFromMenuID( UINT nID )
  1021. {
  1022.     UINT nBase = 0;
  1023.     if ( nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID ) {
  1024.         nBase = FIRST_MOVE_MENU_ID;
  1025.     } else     if ( nID >= FIRST_COPY_MENU_ID && nID <= LAST_COPY_MENU_ID ) {
  1026.         nBase = FIRST_COPY_MENU_ID;
  1027.     } else {
  1028.         ASSERT(0);
  1029.         return NULL;
  1030.     }
  1031.     return FolderInfoFromMenuID( NULL, nBase, nID );
  1032. }
  1033.  
  1034. // Update the menu list for the copy and move submenus
  1035. //
  1036.  
  1037. void CMailNewsFrame::UpdateMenu( MSG_FolderInfo *mailRoot,
  1038.                                  HMENU hMenu, UINT &nID, int nStart)
  1039. {
  1040.     // *** If you change the way this menu is built, you also need to
  1041.     // change CMailNewsFrame::FolderInfoFromMenuID and make it the same
  1042.     // as CMailQFButton::BuildMenu ***
  1043.  
  1044.     MSG_Master *pMaster = WFE_MSGGetMaster();
  1045.     int i, j;
  1046.     MSG_FolderInfo **folderInfos;
  1047.     int32 iCount;
  1048.     MSG_FolderLine folderLine;
  1049.     char buffer[_MAX_PATH];
  1050.  
  1051.     j = nStart;
  1052.  
  1053.     if (mailRoot == NULL) {
  1054.         // Get rid of old top level menu (deletes submenus, too)
  1055.  
  1056.         int iMenuCount = ::GetMenuItemCount( hMenu );
  1057.         for( i = 0; i < iMenuCount; i++)
  1058.             ::DeleteMenu( hMenu, 0, MF_BYPOSITION );
  1059.  
  1060.         // Loop through top level folderInfos, looking for mail trees.
  1061.  
  1062.         iCount = MSG_GetFolderChildren(pMaster, NULL, NULL, NULL);
  1063.         folderInfos = new MSG_FolderInfo*[iCount];
  1064.         if (folderInfos) {
  1065.             int nLevelTotal = 0;
  1066.             BOOL bAddSep = FALSE;
  1067.             MSG_GetFolderChildren(pMaster, NULL, folderInfos, iCount);
  1068.  
  1069.             for (i = 0; i < iCount; i++) {
  1070.                 if (MSG_GetFolderLineById(pMaster, folderInfos[i], &folderLine)) {
  1071.                     if (folderLine.flags & MSG_FOLDER_FLAG_MAIL) {
  1072.                         if ( bAddSep ) {
  1073.                             ::AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
  1074.                         }
  1075.                         UpdateMenu(folderInfos[i], hMenu, nID, nLevelTotal);
  1076.                         nLevelTotal = MSG_GetFolderChildren( pMaster, folderInfos[i],
  1077.                                      NULL, NULL);
  1078.                         bAddSep = TRUE;
  1079.                     }
  1080.                 }
  1081.             }
  1082.             delete [] folderInfos;
  1083.         }
  1084.         return;
  1085.     }
  1086.  
  1087.     MSG_GetFolderLineById( pMaster, mailRoot, &folderLine );
  1088.  
  1089.     if ( folderLine.level > 1 ) { // We're a child folder
  1090.         sprintf( buffer, "&%d %s", j, szLoadString(IDS_MAIL_THISFOLDER));
  1091.         ::AppendMenu( hMenu, MF_STRING, nID, buffer);
  1092.         ::AppendMenu( hMenu, MF_SEPARATOR, NULL, NULL);
  1093.         nID++;
  1094.         j++;
  1095.     }
  1096.  
  1097.     iCount = MSG_GetFolderChildren( pMaster, mailRoot, NULL, NULL );
  1098.  
  1099.     folderInfos = new MSG_FolderInfo*[iCount];
  1100.     if (folderInfos) {
  1101.         MSG_GetFolderChildren( pMaster, mailRoot, folderInfos, iCount );
  1102.  
  1103.         for ( i = 0; i < iCount; i++) {
  1104.             if ( MSG_GetFolderLineById( pMaster, folderInfos[ i ], &folderLine ) ) {
  1105.                 if (j < 10) {
  1106.                     sprintf( buffer, "&%d %s", j, folderLine.name);
  1107.                 } else if ( j < 36 ) {
  1108.                     sprintf( buffer, "&%c %s", 'a' + j - 10, folderLine.name);
  1109.                 } else {
  1110.                     sprintf( buffer, "  %s", folderLine.name);
  1111.                 }
  1112.  
  1113.                 if ( folderLine.numChildren > 0 ) {
  1114.                     HMENU hNewMenu = ::CreatePopupMenu();
  1115.  
  1116.                     UpdateMenu( folderInfos[ i ], hNewMenu, nID);
  1117.  
  1118.                     ::AppendMenu( hMenu, MF_STRING|MF_POPUP, (UINT) hNewMenu, buffer);
  1119.                 } else {
  1120.                     ::AppendMenu( hMenu, MF_STRING, nID, buffer);
  1121.                     nID++;
  1122.                 }
  1123.                 j++;
  1124.             }
  1125.         }
  1126.         delete [] folderInfos;
  1127.     }
  1128. }
  1129.  
  1130. void CMailNewsFrame::UpdateFileMenus()
  1131. {
  1132.     HMENU hFrameMenu = ::GetMenu( m_hWnd );
  1133.  
  1134.     ASSERT( hFrameMenu );
  1135.  
  1136.     if( hFrameMenu ) {
  1137.         HMENU hMessage = ::GetSubMenu( hFrameMenu, m_iMessageMenuPos );
  1138.  
  1139.         if ( hMessage ) {
  1140.             UINT idMove = FIRST_MOVE_MENU_ID;
  1141.             UINT idCopy = FIRST_COPY_MENU_ID;
  1142.  
  1143.             HMENU hMove = ::GetSubMenu( hMessage, m_iMoveMenuPos );
  1144.             HMENU hCopy = NULL;
  1145.             if ( m_iCopyMenuPos > -1 )
  1146.                 hCopy = ::GetSubMenu( hMessage, m_iCopyMenuPos );
  1147.         
  1148.             // we don't alway have a copy menu
  1149.             if( hMove ) {
  1150.                 UpdateMenu( NULL, hMove, idMove ); 
  1151.             }
  1152.             if (hCopy) {
  1153.                 UpdateMenu( NULL, hCopy, idCopy );
  1154.             }
  1155.         }
  1156.     }
  1157.     DrawMenuBar();
  1158. }
  1159.  
  1160. void CMailNewsFrame::UpdateAttachmentMenus()
  1161. {
  1162.     HMENU hFrameMenu = ::GetMenu( m_hWnd );
  1163.  
  1164.     ASSERT( hFrameMenu );
  1165.  
  1166.     if( hFrameMenu ) {
  1167.         HMENU hFile = ::GetSubMenu( hFrameMenu, m_iFileMenuPos );
  1168.  
  1169.         if ( hFile ) {
  1170.             int i;
  1171.             char buffer[_MAX_PATH];
  1172.             UINT idAttach = FIRST_ATTACH_MENU_ID;
  1173.             HMENU hAttach = ::GetSubMenu( hFile, m_iAttachMenuPos );
  1174.             
  1175.             int iCount = ::GetMenuItemCount( hAttach );
  1176.             for( i = 0; i < iCount; i++)
  1177.                 ::DeleteMenu( hAttach, 0, MF_BYPOSITION );
  1178.  
  1179.             if (m_pAttachmentData) {
  1180.                 for ( i = 0; m_pAttachmentData[i].url; i++ ) {
  1181.                     const char *name = m_pAttachmentData[i].real_name ?
  1182.                                        m_pAttachmentData[i].real_name :
  1183.                                        szLoadString(IDS_UNTITLED);
  1184.                     if (i < 10) {
  1185.                         sprintf( buffer, "&%d %s", i, name);
  1186.                     } else {
  1187.                         strcpy(buffer, name);
  1188.                     }
  1189.                     ::AppendMenu( hAttach, MF_STRING, idAttach + i, buffer);
  1190.                 }
  1191.             } else {
  1192.                 ::AppendMenu( hAttach, MF_STRING, idAttach, szLoadString(IDS_NOATTACHMENTS));
  1193.             }
  1194.         }
  1195.     }
  1196. }
  1197.  
  1198. void CMailNewsFrame::ModalStatusBegin( int iModalDelay )
  1199. {
  1200.     if ( iModalDelay > -1 ) {
  1201.         LPNSSTATUSBAR pIStatusBar = NULL;
  1202.         m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
  1203.         if ( pIStatusBar ) {
  1204.             pIStatusBar->ModalStatus( TRUE, iModalDelay );
  1205.             pIStatusBar->Release();
  1206.         }
  1207.     }
  1208. }
  1209.  
  1210. void CMailNewsFrame::ModalStatusEnd()
  1211. {
  1212.     LPNSSTATUSBAR pIStatusBar = NULL;
  1213.     m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
  1214.     if ( pIStatusBar ) {
  1215.         pIStatusBar->ModalStatus( FALSE, 0 );
  1216.         pIStatusBar->Release();
  1217.     }
  1218. }
  1219.  
  1220. void CMailNewsFrame::DoUpdateCommand( CCmdUI* pCmdUI, MSG_CommandType cmd, BOOL bUseCheck )
  1221. {
  1222.     XP_Bool bSelectable = FALSE, bPlural = FALSE;
  1223.     MSG_COMMAND_CHECK_STATE sState;
  1224.     const char *display_string;
  1225.  
  1226.     if (m_pPane) {
  1227.         MSG_ViewIndex *indices = NULL;
  1228.         int count = 0;
  1229.         if (m_pOutliner)
  1230.             m_pOutliner->GetSelection(indices, count);
  1231.  
  1232.         MSG_CommandStatus(m_pPane,
  1233.                           cmd,
  1234.                           indices, count,
  1235.                           &bSelectable,
  1236.                           &sState,
  1237.                           &display_string,
  1238.                           &bPlural);
  1239.     }
  1240.  
  1241.     pCmdUI->Enable(bSelectable);
  1242.     if (bUseCheck)
  1243.         pCmdUI->SetCheck(sState == MSG_Checked);
  1244.     else
  1245.         pCmdUI->SetRadio(sState == MSG_Checked);
  1246. }
  1247.  
  1248. void CMailNewsFrame::DoCommand( MSG_CommandType msgCommand, int iModalDelay, BOOL bAsync )
  1249. {
  1250. #ifdef DEBUG_WHITEBOX
  1251.     QA_Trace("CMailNewsFrame:Do Command parameters = MSG_CommandType %d, iModalDelay %d, bAsync %d",
  1252.         (int) msgCommand, iModalDelay, (int) bAsync);
  1253. #endif
  1254.  
  1255.     ModalStatusBegin( iModalDelay );
  1256.  
  1257.     CMailNewsOutliner* pOutliner;
  1258.     if (msgCommand == MSG_DeleteFolder && 
  1259.         IsKindOf(RUNTIME_CLASS(C3PaneMailFrame)))
  1260.         pOutliner = ((C3PaneMailFrame*)this)->GetFolderOutliner();
  1261.     else
  1262.         pOutliner = m_pOutliner;
  1263.  
  1264.     MSG_ViewIndex *indices = NULL;
  1265.     int count = 0;
  1266.     if (pOutliner)
  1267.         pOutliner->GetSelection(indices, count);
  1268.  
  1269. #ifdef DEBUG_WHITEBOX
  1270.     QA_Trace("Return from GetSelection: count = %d",count);
  1271.     
  1272.     for (int i = 0; i < count; i++)
  1273.     {
  1274.         QA_Trace("indices[%d] = %d",i,*(indices+i));
  1275.     }
  1276. #endif
  1277.  
  1278.     MSG_Pane *pPane = pOutliner ? pOutliner->GetPane(): m_pPane;
  1279.     MSG_Command(pPane, msgCommand, indices, count);
  1280.  
  1281.     if (!bAsync)
  1282.         ModalStatusEnd();
  1283. }
  1284.  
  1285. void CMailNewsFrame::DoUpdateMessageCommand( CCmdUI* pCmdUI, MSG_CommandType tMenuType, BOOL bUseCheck )
  1286. {
  1287.     XP_Bool bSelectable = FALSE, bPlural = FALSE;
  1288.     const char *szTitle;
  1289.     MSG_COMMAND_CHECK_STATE sState = MSG_Unchecked;
  1290.  
  1291.     if ( m_pMessagePane ) {
  1292.         if (m_pOutliner) {
  1293.             MsgViewIndex *indices;
  1294.             int iCount;
  1295.             m_pOutliner->GetSelection( indices, iCount );
  1296.             MSG_CommandStatus(m_pMessagePane,
  1297.                               tMenuType,
  1298.                               indices, iCount,
  1299.                               &bSelectable,
  1300.                               &sState,
  1301.                               &szTitle,
  1302.                               &bPlural );
  1303.         } else {
  1304.             MSG_FolderInfo* folder;
  1305.             MessageKey key;
  1306.             MSG_ViewIndex viewIndex;
  1307.  
  1308.             MSG_GetCurMessage( m_pMessagePane,
  1309.                                &folder,
  1310.                                &key, &viewIndex );
  1311.             if ( key != MSG_MESSAGEKEYNONE ) {
  1312.                 MSG_CommandStatus(m_pMessagePane,
  1313.                                   tMenuType,
  1314.                                   &viewIndex, 1,
  1315.                                   &bSelectable,
  1316.                                   &sState,
  1317.                                   &szTitle,
  1318.                                   &bPlural );
  1319.             }
  1320.         }
  1321.     }
  1322.     pCmdUI->Enable(bSelectable);
  1323.     if (bUseCheck)
  1324.         pCmdUI->SetCheck(sState == MSG_Checked);
  1325.     else
  1326.         pCmdUI->SetRadio(sState == MSG_Checked);
  1327. }
  1328.  
  1329. void CMailNewsFrame::DoMessageCommand(MSG_CommandType msgCommand )
  1330. {
  1331.     if ( m_pMessagePane ) {
  1332.         if (m_pOutliner) {
  1333.             MsgViewIndex *indices;
  1334.             int iCount;
  1335.             m_pOutliner->GetSelection( indices, iCount );
  1336.             MSG_Command(m_pMessagePane, msgCommand, indices, iCount);
  1337.         } else {
  1338.             MSG_FolderInfo* folder;
  1339.             MessageKey key;
  1340.             MSG_ViewIndex viewIndex;
  1341.             MSG_GetCurMessage( m_pMessagePane,
  1342.                                &folder,
  1343.                                &key,
  1344.                                &viewIndex);
  1345.             if ( key != MSG_MESSAGEKEYNONE ) {
  1346.                 MSG_Command(m_pMessagePane, msgCommand, &viewIndex, 1);
  1347.             }
  1348.         }
  1349.     }
  1350. }
  1351.  
  1352. // Reply button drop down menu
  1353. const UINT idArrayReply[] = { ID_MESSAGE_REPLY,
  1354.                               ID_MESSAGE_REPLYALL,
  1355.                               ID_MESSAGE_POSTREPLY,
  1356.                               ID_MESSAGE_POSTANDREPLY };
  1357. const UINT strArrayReply[] = { IDS_MENU_REPLY,
  1358.                                IDS_MENU_REPLYALL,
  1359.                                IDS_MENU_POSTREPLY,
  1360.                                IDS_MENU_POSTMAILREPLY };
  1361.  
  1362. // Mark button drop down menu
  1363. const UINT idArrayMark[] = { ID_MESSAGE_MARKASUNREAD,
  1364.                              ID_MESSAGE_MARKASREAD,
  1365.                              ID_MESSAGE_MARKTHREADREAD,
  1366.                              ID_MESSAGE_MARKALLREAD,
  1367.                              ID_MESSAGE_CATCHUP,
  1368.                              ID_MESSAGE_MARKASLATER };
  1369.  
  1370. const UINT strArrayMark[] = { IDS_POPUP_MARKASUNREAD,
  1371.                               IDS_POPUP_MARKASREAD,
  1372.                               IDS_POPUP_MARKTHREADREAD,
  1373.                               IDS_POPUP_MARKALLREAD,
  1374.                               IDS_POPUP_CATCHUP,
  1375.                               IDS_POPUP_MARKFORLATER };
  1376.  
  1377. const UINT idArrayNext[] = { ID_MESSAGE_NEXT,
  1378.                              ID_MESSAGE_NEXTUNREAD,
  1379.                              ID_MESSAGE_NEXTFLAGGED,
  1380.                              ID_MESSAGE_NEXTUNREADTHREAD,
  1381.                              ID_MESSAGE_NEXTNEWSGROUP,
  1382.                              ID_MESSAGE_NEXTUNREADNEWSGROUP };
  1383.  
  1384. const UINT strArrayNext[] = { IDS_POPUP_NEXTMESSAGE,
  1385.                               IDS_POPUP_NEXTUNREADMSG,
  1386.                               IDS_POPUP_NEXTFLAGGEDMSG,
  1387.                               IDS_POPUP_NEXTUNREADTHREAD,
  1388.                               IDS_POPUP_NEXTFOLDER,
  1389.                               IDS_POPUP_NEXTUNREADFOLDER };
  1390.  
  1391. LRESULT CMailNewsFrame::OnButtonMenuOpen(WPARAM wParam, LPARAM lParam)
  1392. {
  1393.  
  1394.     HMENU hMenu = (HMENU) lParam;
  1395.     UINT nCommand = (UINT) LOWORD(wParam);
  1396.  
  1397.     const UINT *idArray = NULL;
  1398.     const UINT *strArray = NULL;
  1399.     int nSize = 0;
  1400.  
  1401.     if(nCommand == ID_MESSAGE_REPLYBUTTON) {
  1402.         idArray = idArrayReply;
  1403.         strArray = strArrayReply;
  1404.         if (m_bNews) {
  1405.             nSize = 4;
  1406.         } else {
  1407.             nSize = 2;
  1408.         }
  1409.     } else if (nCommand == ID_MESSAGE_MARKBUTTON ) {
  1410.         idArray = idArrayMark;
  1411.         strArray = strArrayMark;
  1412.         nSize = 6;
  1413.     } else if (nCommand == ID_MESSAGE_NEXTUNREAD ) {
  1414.         idArray = idArrayNext;
  1415.         strArray = strArrayNext;
  1416.         nSize = 6;
  1417.     }
  1418.  
  1419.     if ( nSize > 0 ) {
  1420.         CString str;
  1421.  
  1422.         for(int i = 0; i < nSize; i++)
  1423.         {
  1424.             str.LoadString(strArray[i]);
  1425.  
  1426.             AppendMenu(hMenu, MF_STRING, idArray[i], (const char*) str);
  1427.         }
  1428.     }
  1429.     return 1;
  1430. }
  1431.  
  1432. // File Menu Items
  1433.  
  1434. void CMailNewsFrame::OnAddNewsGroup ( )
  1435. {
  1436.     DoCommand(MSG_AddNewsGroup);
  1437. }
  1438.  
  1439. void CMailNewsFrame::OnUpdateAddNewsGroup(CCmdUI* pCmdUI)
  1440. {
  1441.     DoUpdateCommand(pCmdUI, MSG_AddNewsGroup);
  1442. }
  1443.  
  1444. void CMailNewsFrame::DoSubscribe(MSG_Host* pThisHost)
  1445.     BeginWaitCursor();
  1446.  
  1447.     MWContext *pContext = GetMainContext() != NULL ? 
  1448.         GetMainContext()->GetContext() : NULL;
  1449.  
  1450.     // fix for bug#58453 Change Prefs news dir with no news files 
  1451.     // then Subscribe. Crashes.
  1452.     MSG_NewsHost* defhost = NULL;
  1453.     defhost = MSG_GetDefaultNewsHost(WFE_MSGGetMaster());
  1454.  
  1455.     if (defhost == NULL)
  1456.     {
  1457.         FE_Alert(pContext, XP_GetString(MK_NNTP_SERVER_NOT_CONFIGURED));
  1458.         return;
  1459.     }
  1460.  
  1461.     CString title;
  1462.     title.LoadString(IDS_SUBSCRIBE_GROUP);
  1463.     CSubscribePropertySheet SubscribeNewsgroup(this, pContext, title);
  1464.   
  1465.     if (pThisHost)
  1466.         SubscribeNewsgroup.SetHost(pThisHost);
  1467.     else
  1468.     {
  1469.         MSG_FolderInfo* pFolderInfo = GetCurFolder();
  1470.         if (pFolderInfo)
  1471.         {
  1472.             MSG_FolderLine folderLine;
  1473.             if (MSG_GetFolderLineById(WFE_MSGGetMaster(), pFolderInfo,
  1474.                                       &folderLine)) 
  1475.             {
  1476.                 MSG_Host *pHost = MSG_GetHostForFolder(pFolderInfo);
  1477.                 SubscribeNewsgroup.SetHost(pHost);
  1478.             }
  1479.         }
  1480.     }
  1481.  
  1482.     SubscribeNewsgroup.DoModal();
  1483.     EndWaitCursor();
  1484. }
  1485.  
  1486. void CMailNewsFrame::OnSubscribe ( )
  1487.     DoSubscribe(NULL);
  1488. }
  1489.  
  1490. void CMailNewsFrame::OnUpdateSubscribe(CCmdUI* pCmdUI)
  1491. {
  1492.     pCmdUI->Enable (TRUE);
  1493. }
  1494.  
  1495. void CMailNewsFrame::OnUnsubscribe ( )
  1496. {
  1497.     DoCommand(MSG_Unsubscribe);
  1498. }
  1499.  
  1500. void CMailNewsFrame::OnUpdateUnsubscribe(CCmdUI* pCmdUI)
  1501. {
  1502.     DoUpdateCommand(pCmdUI, MSG_Unsubscribe);
  1503. }
  1504.  
  1505. void CMailNewsFrame::OnOpenAttach(UINT nID)
  1506. {
  1507.     int idx = nID - FIRST_ATTACH_MENU_ID;
  1508.  
  1509.     if (idx < m_nAttachmentCount)
  1510.         GetContext()->NormalGetUrl(m_pAttachmentData[idx].url);
  1511. }
  1512.  
  1513. void CMailNewsFrame::OnUpdateOpenAttach(CCmdUI *pCmdUI)
  1514. {
  1515.     int idx = pCmdUI->m_nID - FIRST_ATTACH_MENU_ID;
  1516.  
  1517.     if (pCmdUI->m_pSubMenu) {
  1518.         pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
  1519.                                         MF_BYPOSITION |
  1520.                                         ((m_nAttachmentCount > 0) ? MF_ENABLED : MF_GRAYED));
  1521.     } else {
  1522.         pCmdUI->Enable(idx < m_nAttachmentCount);
  1523.     }
  1524. }
  1525.  
  1526. void CMailNewsFrame::OnSaveAttach(UINT nID)
  1527. {
  1528.     int idx = nID - FIRST_SAVEATTACH_MENU_ID;
  1529.  
  1530.     if (idx < m_nAttachmentCount)
  1531.         CSaveCX::SaveAnchorObject(m_pAttachmentData[idx].url, NULL);
  1532. }
  1533.  
  1534. void CMailNewsFrame::OnUpdateSaveAttach(CCmdUI *pCmdUI)
  1535. {
  1536.     int idx = pCmdUI->m_nID - FIRST_SAVEATTACH_MENU_ID;
  1537.  
  1538.     pCmdUI->Enable(idx < m_nAttachmentCount);
  1539. }
  1540.  
  1541. void CMailNewsFrame::OnAttachProperties(UINT nID)
  1542. {
  1543.     int idx = nID - FIRST_ATTACHPROP_MENU_ID;
  1544.  
  1545.     CAttachmentSheet sheet(this,
  1546.                            m_pAttachmentData[idx].real_name,
  1547.                            m_pAttachmentData[idx].real_type,
  1548.                            m_pAttachmentData[idx].description);
  1549.  
  1550.     sheet.DoModal();
  1551. }
  1552.  
  1553. void CMailNewsFrame::OnUpdateAttachProperties(CCmdUI *pCmdUI)
  1554. {
  1555.     int idx = pCmdUI->m_nID - FIRST_ATTACHPROP_MENU_ID;
  1556.  
  1557.     pCmdUI->Enable(idx < m_nAttachmentCount);
  1558. }
  1559.  
  1560.  
  1561. // Edit Menu Items
  1562.  
  1563. void CMailNewsFrame::OnEditUndo()
  1564. {
  1565.     DoCommand(MSG_Undo);
  1566. }
  1567.  
  1568. void CMailNewsFrame::OnUpdateEditUndo ( CCmdUI* pCmdUI )
  1569. {
  1570.     DoUpdateCommand(pCmdUI, MSG_Undo);
  1571. }
  1572.  
  1573. void CMailNewsFrame::OnEditRedo()
  1574. {
  1575.     DoCommand(MSG_Redo);
  1576. }
  1577.  
  1578. void CMailNewsFrame::OnUpdateEditRedo ( CCmdUI* pCmdUI )
  1579. {
  1580.     DoUpdateCommand(pCmdUI, MSG_Redo);
  1581. }
  1582.  
  1583. // hack for message backtracking
  1584.  
  1585. void CMailNewsFrame::OnGoBack()
  1586. {
  1587.     DoNavigate(MSG_Back);
  1588. }
  1589.  
  1590. void CMailNewsFrame::OnUpdateGoBack ( CCmdUI* pCmdUI )
  1591. {
  1592.     DoUpdateNavigate(pCmdUI, MSG_Back);
  1593. }
  1594.  
  1595. void CMailNewsFrame::OnGoForward()
  1596. {
  1597.     DoNavigate(MSG_Forward);
  1598. }
  1599.  
  1600. void CMailNewsFrame::OnUpdateGoForward ( CCmdUI* pCmdUI )
  1601. {
  1602.     DoUpdateNavigate(pCmdUI, MSG_Forward);
  1603. }
  1604.  
  1605.  
  1606. void CMailNewsFrame::OnDeleteFolder( )
  1607. {
  1608.     CMailNewsOutliner* pOutliner;
  1609.     if (IsKindOf(RUNTIME_CLASS(C3PaneMailFrame)))
  1610.         pOutliner = ((C3PaneMailFrame*)this)->GetFolderOutliner();
  1611.     else
  1612.         pOutliner = m_pOutliner;
  1613.  
  1614.     MSG_ViewIndex *indices;
  1615.     int count;
  1616.  
  1617.     pOutliner->GetSelection(indices, count);
  1618.  
  1619.     DoCommand(MSG_DeleteFolder);
  1620. }
  1621.  
  1622. void CMailNewsFrame::OnUpdateDeleteFolder(CCmdUI* pCmdUI)
  1623. {
  1624.     MSG_FolderInfo *folderInfo = GetCurFolder();
  1625.  
  1626.     if ( folderInfo ) {
  1627.         MSG_FolderLine folderLine;
  1628.         MSG_GetFolderLineById( WFE_MSGGetMaster(), folderInfo, &folderLine );
  1629.  
  1630.         if ( pCmdUI->m_nID == ID_EDIT_DELETEFOLDER ) {
  1631.             if ( folderLine.flags & MSG_FOLDER_FLAG_NEWS_HOST ) {
  1632.                 pCmdUI->SetText( szLoadString( IDS_MENU_DELETENEWSHOST ) );
  1633.             } else if ( folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ) {
  1634.                 pCmdUI->SetText( szLoadString( IDS_MENU_DELETENEWSGROUP ) );
  1635.             } else {
  1636.                 // We shouldn't use the popup item, except that
  1637.                 // we're don't want to add a string at this point
  1638.                 pCmdUI->SetText( szLoadString( IDS_POPUP_DELETEFOLDER ) );
  1639.             }
  1640.         }
  1641.     } else {
  1642.         pCmdUI->SetText( szLoadString( IDS_MENU_DELETESELECTION ) );
  1643.     }
  1644.     DoUpdateCommand(pCmdUI, MSG_DeleteFolder);
  1645. }
  1646.  
  1647. void CMailNewsFrame::OnDeleteMessage( )
  1648. {
  1649.     if ( m_bNews ) {
  1650.         DoCommand(MSG_CancelMessage, MODAL_DELAY);
  1651.     } else {
  1652. #ifdef DEBUG_WHITEBOX
  1653.         QA_Trace("Entering CMailNewsFrame:DoCommand");
  1654. #endif
  1655.  
  1656.         DoCommand(MSG_DeleteMessage, MODAL_DELAY);
  1657.  
  1658. #ifdef DEBUG_WHITEBOX
  1659.         QA_Trace("Finished CMailNewsFrame:DoCommand");
  1660. #endif
  1661.     }
  1662. }
  1663.  
  1664. void CMailNewsFrame::OnReallyDeleteMessage( )
  1665. {
  1666.     if ( m_bNews ) {
  1667.         DoCommand(MSG_CancelMessage, MODAL_DELAY);
  1668.     } else {
  1669.         DoCommand(MSG_DeleteMessageNoTrash, MODAL_DELAY);
  1670.     }
  1671. }
  1672.  
  1673. void CMailNewsFrame::OnUpdateDeleteMessage(CCmdUI* pCmdUI)
  1674. {
  1675.     if (IsKindOf(RUNTIME_CLASS(C3PaneMailFrame)))
  1676.     {
  1677.         if (GetFocus() == (CWnd*)((C3PaneMailFrame*)this)->GetFolderOutliner())
  1678.         {
  1679.             pCmdUI->Enable(FALSE);
  1680.             return;
  1681.         }
  1682.         else
  1683.             pCmdUI->Enable(TRUE);
  1684.     }
  1685.     if ( m_bNews ) {
  1686.         pCmdUI->SetText( szLoadString( IDS_MENU_CANCELMESSAGE ) );
  1687.         DoUpdateCommand(pCmdUI, MSG_CancelMessage);
  1688.     } else {
  1689.         pCmdUI->SetText( szLoadString( IDS_MENU_DELETEMESSAGE ) );
  1690.         DoUpdateCommand(pCmdUI, MSG_DeleteMessage);
  1691.     }
  1692. }
  1693.  
  1694. void CMailNewsFrame::OnSelectAll()
  1695. {
  1696.     if (m_pOutliner ) {
  1697.         m_pOutliner->SelectRange( 0, -1, TRUE );
  1698.     }
  1699. }
  1700.  
  1701. void CMailNewsFrame::OnUpdateSelectAll ( CCmdUI* pCmdUI )
  1702. {
  1703.     if (m_pOutliner && m_pOutliner->GetTotalLines() > 0 ) {
  1704.         pCmdUI->Enable( TRUE );
  1705.     } else {
  1706.         pCmdUI->Enable( FALSE );
  1707.     }
  1708. }
  1709.  
  1710. void CMailNewsFrame::OnCancelMessage()
  1711. {
  1712.     DoCommand(MSG_CancelMessage);
  1713. }
  1714.  
  1715. void CMailNewsFrame::OnUpdateCancelMessage ( CCmdUI* pCmdUI )
  1716. {
  1717.     DoUpdateCommand(pCmdUI, MSG_CancelMessage);
  1718. }
  1719.  
  1720. // View Menu Items
  1721.  
  1722. void CMailNewsFrame::OnSortAgain ( )
  1723. {
  1724.     DoCommand(MSG_ReSort);
  1725. }
  1726.  
  1727. void CMailNewsFrame::OnUpdateSortAgain(CCmdUI* pCmdUI)
  1728. {
  1729.     DoUpdateCommand(pCmdUI, MSG_ReSort);
  1730. }
  1731.  
  1732. void CMailNewsFrame::OnAscending( )
  1733. {
  1734.     if ( MSG_GetToggleStatus( m_pPane, MSG_SortBackward, NULL, 0 ) == MSG_Checked ) {
  1735.         DoCommand(MSG_SortBackward);
  1736.         SetSort(-1);
  1737.     }
  1738. }
  1739.  
  1740. void CMailNewsFrame::OnUpdateAscending(CCmdUI* pCmdUI)
  1741. {
  1742.     pCmdUI->Enable(TRUE);
  1743. #ifdef _WIN32
  1744.     pCmdUI->SetRadio(MSG_GetToggleStatus( m_pPane, MSG_SortBackward, NULL, 0  ) != MSG_Checked);
  1745. #else
  1746.     pCmdUI->SetCheck(MSG_GetToggleStatus( m_pPane, MSG_SortBackward, NULL, 0  ) != MSG_Checked);
  1747. #endif
  1748. }
  1749.  
  1750. void CMailNewsFrame::OnDescending( )
  1751. {
  1752.     if ( MSG_GetToggleStatus( m_pPane, MSG_SortBackward, NULL, 0  ) != MSG_Checked ) {
  1753.         DoCommand(MSG_SortBackward);
  1754.         SetSort(-1);
  1755.     }
  1756. }
  1757.  
  1758. void CMailNewsFrame::OnUpdateDescending(CCmdUI* pCmdUI)
  1759. {
  1760.     pCmdUI->Enable(TRUE);
  1761. #ifdef _WIN32
  1762.     pCmdUI->SetRadio(MSG_GetToggleStatus( m_pPane, MSG_SortBackward, NULL, 0  ) == MSG_Checked);
  1763. #else
  1764.     pCmdUI->SetCheck(MSG_GetToggleStatus( m_pPane, MSG_SortBackward, NULL, 0  ) == MSG_Checked);
  1765. #endif
  1766. }
  1767.  
  1768. void CMailNewsFrame::OnSortDate()
  1769. {
  1770.     DoCommand(MSG_SortByDate);
  1771.     SetSort(SORT_BYDATE);
  1772. }
  1773.  
  1774. void CMailNewsFrame::OnUpdateSortDate ( CCmdUI* pCmdUI )
  1775. {
  1776.     DoUpdateCommand(pCmdUI, MSG_SortByDate);
  1777. }
  1778.  
  1779. void CMailNewsFrame::OnSortNumber()
  1780. {
  1781.     DoCommand(MSG_SortByMessageNumber);
  1782.     SetSort(SORT_BYNUMBER);
  1783. }
  1784.  
  1785. void CMailNewsFrame::OnUpdateSortNumber ( CCmdUI* pCmdUI )
  1786. {
  1787.     DoUpdateCommand(pCmdUI, MSG_SortByMessageNumber);
  1788. }
  1789.  
  1790. void CMailNewsFrame::OnSortSubject()
  1791. {
  1792.     DoCommand(MSG_SortBySubject);
  1793.     SetSort(SORT_BYSUBJECT);
  1794. }
  1795.  
  1796. void CMailNewsFrame::OnUpdateSortSubject ( CCmdUI* pCmdUI )
  1797. {
  1798.     DoUpdateCommand(pCmdUI, MSG_SortBySubject);
  1799. }
  1800.  
  1801. void CMailNewsFrame::OnSortSender()
  1802. {
  1803.     DoCommand(MSG_SortBySender);
  1804.     SetSort(SORT_BYSENDER);
  1805. }
  1806.  
  1807. void CMailNewsFrame::OnUpdateSortSender ( CCmdUI* pCmdUI )
  1808. {
  1809.     if (MSG_DisplayingRecipients(m_pPane)) {
  1810.         CString cs;
  1811.         cs.LoadString(IDS_MAIL_BYRECIPIENT);
  1812.         pCmdUI->SetText(cs);
  1813.     }
  1814.     DoUpdateCommand(pCmdUI, MSG_SortBySender);
  1815. }
  1816.  
  1817. void CMailNewsFrame::OnSortPriority()
  1818. {
  1819.     DoCommand(MSG_SortByPriority);
  1820.     SetSort(SORT_BYPRIORITY);
  1821. }
  1822.  
  1823. void CMailNewsFrame::OnUpdateSortPriority( CCmdUI* pCmdUI )
  1824. {
  1825.     DoUpdateCommand(pCmdUI, MSG_SortByPriority);
  1826. }
  1827.  
  1828. void CMailNewsFrame::OnSortStatus()
  1829. {
  1830.     DoCommand(MSG_SortByStatus);
  1831.     SetSort(SORT_BYSTATUS);
  1832. }
  1833.  
  1834. void CMailNewsFrame::OnUpdateSortStatus( CCmdUI* pCmdUI )
  1835. {
  1836.     DoUpdateCommand(pCmdUI, MSG_SortByStatus);
  1837. }
  1838.  
  1839. void CMailNewsFrame::OnSortSize()
  1840. {
  1841.     DoCommand(MSG_SortBySize);
  1842.     SetSort(SORT_BYSIZE);
  1843. }
  1844.  
  1845. void CMailNewsFrame::OnUpdateSortSize( CCmdUI* pCmdUI )
  1846. {
  1847.     DoUpdateCommand(pCmdUI, MSG_SortBySize);
  1848. }
  1849.  
  1850. void CMailNewsFrame::OnSortFlag()
  1851. {
  1852.     DoCommand(MSG_SortByFlagged);
  1853.     SetSort(SORT_BYFLAG);
  1854. }
  1855.  
  1856. void CMailNewsFrame::OnUpdateSortFlag( CCmdUI* pCmdUI )
  1857. {
  1858.     DoUpdateCommand(pCmdUI, MSG_SortByFlagged);
  1859. }
  1860.  
  1861. void CMailNewsFrame::OnSortUnread()
  1862. {
  1863.     DoCommand(MSG_SortByUnread);
  1864.     SetSort(SORT_BYUNREAD);
  1865. }
  1866.  
  1867. void CMailNewsFrame::OnUpdateSortUnread( CCmdUI* pCmdUI )
  1868. {
  1869.     DoUpdateCommand(pCmdUI, MSG_SortByUnread);
  1870. }
  1871.  
  1872. void CMailNewsFrame::OnThread ( )
  1873. {
  1874.     DoCommand(MSG_SortByThread);
  1875.     SetSort(SORT_BYTHREAD);
  1876. }
  1877.  
  1878. void CMailNewsFrame::OnUpdateThread(CCmdUI* pCmdUI)
  1879. {
  1880.     DoUpdateCommand(pCmdUI, MSG_SortByThread);
  1881. }
  1882.  
  1883. void CMailNewsFrame::OnViewAll()
  1884. {
  1885.     DoCommand(MSG_ViewAllThreads);
  1886.     if ( m_pOutliner )
  1887.         m_pOutliner->GetParent()->Invalidate();
  1888. }
  1889.  
  1890. void CMailNewsFrame::OnUpdateViewAll( CCmdUI *pCmdUI )
  1891. {
  1892.     DoUpdateCommand(pCmdUI, MSG_ViewAllThreads);
  1893. }
  1894.  
  1895. void CMailNewsFrame::OnViewKilled()
  1896. {
  1897.     DoCommand(MSG_ViewKilledThreads);
  1898.     if ( m_pOutliner )
  1899.         m_pOutliner->GetParent()->Invalidate();
  1900. }
  1901.  
  1902. void CMailNewsFrame::OnUpdateViewKilled( CCmdUI *pCmdUI )
  1903. {
  1904.     DoUpdateCommand(pCmdUI, MSG_ViewKilledThreads, TRUE);
  1905. }
  1906.  
  1907. void CMailNewsFrame::OnViewNew()
  1908. {
  1909.     DoCommand(MSG_ViewThreadsWithNew);
  1910.     if ( m_pOutliner )
  1911.         m_pOutliner->GetParent()->Invalidate();
  1912. }
  1913.  
  1914. void CMailNewsFrame::OnUpdateViewNew( CCmdUI *pCmdUI )
  1915. {
  1916.     DoUpdateCommand(pCmdUI, MSG_ViewThreadsWithNew);
  1917. }
  1918.  
  1919. void CMailNewsFrame::OnViewNewOnly()
  1920. {
  1921.     DoCommand(MSG_ViewNewOnly);
  1922.     if ( m_pOutliner )
  1923.         m_pOutliner->GetParent()->Invalidate();
  1924. }
  1925.  
  1926. void CMailNewsFrame::OnUpdateViewNewOnly( CCmdUI *pCmdUI )
  1927. {
  1928.     DoUpdateCommand(pCmdUI, MSG_ViewNewOnly);
  1929. }
  1930.  
  1931. void CMailNewsFrame::OnViewWatched()
  1932. {
  1933.     DoCommand(MSG_ViewWatchedThreadsWithNew);
  1934.     if ( m_pOutliner )
  1935.         m_pOutliner->GetParent()->Invalidate();
  1936. }
  1937.  
  1938. void CMailNewsFrame::OnUpdateViewWatched( CCmdUI *pCmdUI )
  1939. {
  1940.     DoUpdateCommand(pCmdUI, MSG_ViewWatchedThreadsWithNew);
  1941. }
  1942.  
  1943. void CMailNewsFrame::OnViewInline(void)
  1944. {
  1945.     DoMessageCommand(MSG_AttachmentsInline);
  1946. }
  1947.  
  1948. void CMailNewsFrame::OnUpdateViewInline(CCmdUI* pCmdUI)
  1949. {
  1950.     DoUpdateMessageCommand(pCmdUI, MSG_AttachmentsInline, FALSE);
  1951. }
  1952.  
  1953. void CMailNewsFrame::OnViewAsLinks(void)
  1954. {
  1955.     DoMessageCommand(MSG_AttachmentsAsLinks);
  1956. }
  1957.  
  1958. void CMailNewsFrame::OnUpdateViewAsLinks(CCmdUI* pCmdUI)
  1959. {
  1960.     DoUpdateMessageCommand(pCmdUI, MSG_AttachmentsAsLinks, FALSE);
  1961. }
  1962.  
  1963. void CMailNewsFrame::OnHeadersMicro()
  1964. {
  1965.     DoMessageCommand(MSG_ShowMicroHeaders);
  1966. }
  1967.  
  1968. void CMailNewsFrame::OnUpdateHeadersMicro(CCmdUI* pCmdUI)
  1969. {
  1970.     DoUpdateMessageCommand( pCmdUI, MSG_ShowMicroHeaders );
  1971. }
  1972.  
  1973. void CMailNewsFrame::OnHeadersShort()
  1974. {
  1975.     DoMessageCommand(MSG_ShowSomeHeaders);
  1976. }
  1977.  
  1978. void CMailNewsFrame::OnUpdateHeadersShort(CCmdUI* pCmdUI)
  1979. {
  1980.     DoUpdateMessageCommand( pCmdUI, MSG_ShowSomeHeaders );
  1981. }
  1982.  
  1983. void CMailNewsFrame::OnHeadersAll()
  1984. {
  1985.     DoMessageCommand(MSG_ShowAllHeaders);
  1986. }
  1987.  
  1988. void CMailNewsFrame::OnUpdateHeadersAll(CCmdUI* pCmdUI)
  1989. {
  1990.     DoUpdateMessageCommand( pCmdUI, MSG_ShowAllHeaders );
  1991. }
  1992.  
  1993. // Navigation Menu Items
  1994.  
  1995. void CMailNewsFrame::OnPreviousUnread ( )
  1996. {
  1997.     DoNavigate( MSG_PreviousUnreadMessage );
  1998. }
  1999.  
  2000. void CMailNewsFrame::OnUpdatePreviousUnread(CCmdUI* pCmdUI)
  2001. {
  2002.     DoUpdateNavigate( pCmdUI, MSG_PreviousUnreadMessage );
  2003. }
  2004.  
  2005. void CMailNewsFrame::OnPrevious ( )
  2006. {
  2007.     DoNavigate( MSG_PreviousMessage );
  2008. }
  2009.  
  2010. void CMailNewsFrame::OnUpdatePrevious(CCmdUI* pCmdUI)
  2011. {
  2012.     DoUpdateNavigate( pCmdUI, MSG_PreviousMessage );
  2013. }
  2014.  
  2015. void CMailNewsFrame::OnNextUnread ( )
  2016. {
  2017.     DoNavigate( MSG_NextUnreadMessage );
  2018. }
  2019.  
  2020. void CMailNewsFrame::OnUpdateNextUnread(CCmdUI* pCmdUI)
  2021. {
  2022.     if (pCmdUI->m_pMenu)
  2023.         DoUpdateNavigate( pCmdUI, MSG_NextUnreadMessage );
  2024.     else // We're the toolbar button, always enable (sigh)
  2025.         pCmdUI->Enable(TRUE);
  2026. }
  2027.  
  2028. void CMailNewsFrame::OnNext ( )
  2029. {
  2030.     DoNavigate( MSG_NextMessage );
  2031. }
  2032.  
  2033. void CMailNewsFrame::OnUpdateNext(CCmdUI* pCmdUI)
  2034. {
  2035.     DoUpdateNavigate( pCmdUI, MSG_NextMessage );
  2036. }
  2037.  
  2038. void CMailNewsFrame::OnNextFolder( )
  2039. {
  2040.     DoNavigate( MSG_NextFolder );
  2041. }
  2042.  
  2043. void CMailNewsFrame::OnUpdateNextFolder(CCmdUI* pCmdUI)
  2044. {
  2045.     if (m_bNews)
  2046.         pCmdUI->SetText(szLoadString(IDS_MENU_NEXTNEWSGROUP));
  2047.     else
  2048.         pCmdUI->SetText(szLoadString(IDS_MENU_NEXTFOLDER));
  2049.     DoUpdateNavigate( pCmdUI, MSG_NextFolder );
  2050. }
  2051.  
  2052. void CMailNewsFrame::OnNextUnreadThread() 
  2053. {
  2054.     DoNavigate(MSG_NextUnreadThread);
  2055. }
  2056.  
  2057. void CMailNewsFrame::OnUpdateNextUnreadThread(CCmdUI* pCmdUI) 
  2058. {    
  2059.     DoUpdateNavigate(pCmdUI, MSG_NextUnreadThread);
  2060. }
  2061.  
  2062. void CMailNewsFrame::OnNextUnreadFolder() 
  2063. {
  2064.     DoNavigate( MSG_NextUnreadGroup );
  2065. }
  2066.  
  2067. void CMailNewsFrame::OnUpdateNextUnreadFolder(CCmdUI* pCmdUI) 
  2068. {    
  2069.     if (m_bNews)
  2070.         pCmdUI->SetText(szLoadString(IDS_MENU_NEXTUNREADNEWSGROUP));
  2071.     else
  2072.         pCmdUI->SetText(szLoadString(IDS_MENU_NEXTUNREADFOLDER));
  2073.     DoUpdateNavigate( pCmdUI, MSG_NextUnreadGroup );
  2074. }
  2075.  
  2076. void CMailNewsFrame::OnPreviousFlagged() 
  2077. {
  2078.     DoNavigate( MSG_PreviousFlagged );
  2079. }
  2080.  
  2081. void CMailNewsFrame::OnUpdatePreviousFlagged(CCmdUI* pCmdUI) 
  2082. {    
  2083.     DoUpdateNavigate( pCmdUI, MSG_PreviousFlagged );
  2084. }
  2085.  
  2086. void CMailNewsFrame::OnNextFlagged() 
  2087. {
  2088.     DoNavigate( MSG_NextFlagged );
  2089. }
  2090.  
  2091. void CMailNewsFrame::OnUpdateNextFlagged(CCmdUI* pCmdUI) 
  2092. {    
  2093.     DoUpdateNavigate( pCmdUI, MSG_NextFlagged );
  2094. }
  2095.  
  2096. void CMailNewsFrame::OnFirstFlagged() 
  2097. {
  2098.     DoNavigate( MSG_FirstFlagged );
  2099. }
  2100.  
  2101. void CMailNewsFrame::OnUpdateFirstFlagged(CCmdUI* pCmdUI) 
  2102. {    
  2103.     DoUpdateNavigate( pCmdUI, MSG_FirstFlagged );
  2104. }
  2105.  
  2106. // Message Menu Items
  2107.  
  2108. void CMailNewsFrame::OnNew( )
  2109. {
  2110.     if (m_bNews)
  2111.         DoCommand(MSG_PostNew);    
  2112.     else
  2113.         DoCommand(MSG_MailNew);
  2114. }
  2115.  
  2116. void CMailNewsFrame::OnUpdateNew(CCmdUI* pCmdUI)
  2117. {
  2118.     DoUpdateCommand(pCmdUI, MSG_MailNew);
  2119. }
  2120.  
  2121. void CMailNewsFrame::OnNewNewsgroup()
  2122. {
  2123.     DoCommand(MSG_NewNewsgroup);
  2124. }
  2125.  
  2126. void CMailNewsFrame::OnUpdateNewNewsgroup(CCmdUI *pCmdUI)
  2127. {
  2128.     DoUpdateCommand(pCmdUI, MSG_NewNewsgroup);
  2129. }
  2130.  
  2131. void CMailNewsFrame::OnNewNewshost()
  2132. {
  2133.     DoAddNewsServer(this, FROM_FOLDERPANE);
  2134. }
  2135.  
  2136. void CMailNewsFrame::OnUpdateNewNewshost(CCmdUI *pCmdUI)
  2137. {
  2138.     pCmdUI->Enable(TRUE);
  2139. }
  2140.  
  2141. void CMailNewsFrame::OnNewCategory()
  2142. {
  2143.     DoCommand(MSG_NewCategory);
  2144. }
  2145.  
  2146. void CMailNewsFrame::OnUpdateNewCategory(CCmdUI *pCmdUI)
  2147. {
  2148.     DoUpdateCommand(pCmdUI, MSG_NewCategory);
  2149. }
  2150.  
  2151. void CMailNewsFrame::OnKill()
  2152. {
  2153.     DoNavigate((MSG_MotionType) MSG_ToggleThreadKilled);
  2154. }
  2155.  
  2156. void CMailNewsFrame::OnUpdateKill(CCmdUI* pCmdUI)
  2157. {
  2158.     DoUpdateCommand(pCmdUI, MSG_ToggleThreadKilled );
  2159. }
  2160.  
  2161. void CMailNewsFrame::OnWatch()
  2162. {
  2163.     DoCommand(MSG_ToggleThreadWatched);
  2164. }
  2165.  
  2166. void CMailNewsFrame::OnUpdateWatch(CCmdUI* pCmdUI)
  2167. {
  2168.     DoUpdateCommand(pCmdUI, MSG_ToggleThreadWatched, FALSE);
  2169. }
  2170.  
  2171.  
  2172. void CMailNewsFrame::OnPostAndMailReply() 
  2173. {
  2174.     DoCommand(MSG_PostAndMailReply);    
  2175. }
  2176.  
  2177. void CMailNewsFrame::OnUpdatePostAndMailReply(CCmdUI* pCmdUI) 
  2178. {
  2179.     DoUpdateCommand(pCmdUI, MSG_PostAndMailReply);
  2180. }
  2181.  
  2182. void CMailNewsFrame::OnPostReply() 
  2183. {
  2184.     DoCommand(MSG_PostReply);    
  2185. }
  2186.  
  2187. void CMailNewsFrame::OnUpdatePostReply(CCmdUI* pCmdUI) 
  2188. {
  2189.     DoUpdateCommand(pCmdUI, MSG_PostReply);
  2190. }
  2191.  
  2192. void CMailNewsFrame::OnReply() 
  2193. {
  2194.     DoCommand(MSG_ReplyToSender);
  2195. }
  2196.  
  2197. void CMailNewsFrame::OnUpdateReply(CCmdUI* pCmdUI) 
  2198. {
  2199.     DoUpdateCommand(pCmdUI, MSG_ReplyToSender);
  2200. }
  2201.  
  2202. void CMailNewsFrame::OnReplyAll() 
  2203. {
  2204.     DoCommand(MSG_ReplyToAll);
  2205. }
  2206.  
  2207. void CMailNewsFrame::OnUpdateReplyAll(CCmdUI* pCmdUI) 
  2208. {
  2209.     DoUpdateCommand(pCmdUI, MSG_ReplyToAll);
  2210. }
  2211.  
  2212. void CMailNewsFrame::OnForward() 
  2213. {
  2214.     DoCommand(MSG_ForwardMessage);
  2215. }
  2216.  
  2217. void CMailNewsFrame::OnUpdateForward(CCmdUI* pCmdUI) 
  2218. {
  2219.     DoUpdateCommand(pCmdUI, MSG_ForwardMessage);
  2220. }
  2221.  
  2222. void CMailNewsFrame::OnForwardQuoted() 
  2223. {
  2224.     DoCommand(MSG_ForwardMessageQuoted);
  2225. }
  2226.  
  2227. void CMailNewsFrame::OnUpdateForwardQuoted(CCmdUI* pCmdUI) 
  2228. {
  2229.     DoUpdateCommand(pCmdUI, MSG_ForwardMessageQuoted);
  2230. }
  2231.  
  2232. void CMailNewsFrame::OnSave ( )
  2233. {
  2234.     DoCommand(MSG_SaveMessagesAs);
  2235. }
  2236.  
  2237. void CMailNewsFrame::OnUpdateSave(CCmdUI* pCmdUI)
  2238. {
  2239.     DoUpdateCommand(pCmdUI, MSG_SaveMessagesAs);
  2240. }
  2241.  
  2242. void CMailNewsFrame::OnEditMessage ( )
  2243. {
  2244.     DoCommand(MSG_OpenMessageAsDraft);
  2245. }
  2246.  
  2247. void CMailNewsFrame::OnUpdateEditMessage(CCmdUI* pCmdUI)
  2248. {
  2249.     DoUpdateCommand(pCmdUI, MSG_OpenMessageAsDraft);
  2250. }
  2251.  
  2252.  
  2253. void CMailNewsFrame::OnPostAndMail()
  2254. {
  2255.     DoCommand(MSG_PostAndMailReply);
  2256. }
  2257.  
  2258. void CMailNewsFrame::OnUpdatePostAndMail ( CCmdUI* pCmdUI )
  2259. {
  2260.     DoUpdateCommand(pCmdUI, MSG_PostAndMailReply);
  2261. }
  2262.  
  2263. void CMailNewsFrame::OnMarkMessagesRead()
  2264. {
  2265.     DoCommand(MSG_MarkMessagesRead);
  2266. }
  2267.  
  2268. void CMailNewsFrame::OnRetrieveSelected()
  2269. {
  2270.     DoCommand(MSG_RetrieveSelectedMessages);
  2271. }
  2272.  
  2273. void CMailNewsFrame::OnUpdateRetrieveSelected( CCmdUI *pCmdUI )
  2274. {
  2275.     DoUpdateCommand(pCmdUI, MSG_RetrieveSelectedMessages);
  2276. }
  2277.  
  2278. void CMailNewsFrame::OnUpdateMarkMessagesRead ( CCmdUI* pCmdUI )
  2279. {
  2280.     DoUpdateCommand( pCmdUI, MSG_MarkMessagesRead );
  2281. }
  2282.  
  2283. void CMailNewsFrame::OnMarkMessagesUnread()
  2284. {
  2285.     DoCommand( MSG_MarkMessagesUnread );
  2286. }
  2287.  
  2288. void CMailNewsFrame::OnUpdateMarkMessagesUnread ( CCmdUI* pCmdUI )
  2289. {
  2290.     DoUpdateCommand( pCmdUI, MSG_MarkMessagesUnread );
  2291. }
  2292.  
  2293. void CMailNewsFrame::OnMarkThreadRead()
  2294. {
  2295.     DoCommand( MSG_MarkThreadRead );
  2296. }
  2297.  
  2298. void CMailNewsFrame::OnUpdateMarkThreadRead( CCmdUI *pCmdUI )
  2299. {
  2300.     DoUpdateCommand( pCmdUI, MSG_MarkThreadRead );
  2301. }
  2302.  
  2303. void CMailNewsFrame::OnMarkAllRead()
  2304. {
  2305.     DoCommand( MSG_MarkAllRead );
  2306. }
  2307.  
  2308. void CMailNewsFrame::OnUpdateMarkAllRead( CCmdUI *pCmdUI )
  2309. {
  2310.     DoUpdateCommand( pCmdUI, MSG_MarkAllRead );
  2311. }
  2312.  
  2313. void CMailNewsFrame::OnCatchup()
  2314. {
  2315.     CMarkReadDateDlg dlg(CMarkReadDateDlg::IDD, this);
  2316.     if (dlg.DoModal()) {
  2317.         MSG_MarkReadByDate ( m_pPane, 0, dlg.dateTo.GetTime() );
  2318.     }
  2319. }
  2320.  
  2321. void CMailNewsFrame::OnUpdateCatchup( CCmdUI *pCmdUI )
  2322. {
  2323.     // We use MarkAllRead because it's enabled state
  2324.     // should be the same
  2325.     DoUpdateCommand(pCmdUI, MSG_MarkAllRead);
  2326. }
  2327.  
  2328. void CMailNewsFrame::OnMarkMessagesLater()
  2329. {
  2330.     DoNavigate( MSG_LaterMessage );    
  2331. }
  2332.  
  2333. void CMailNewsFrame::OnUpdateMarkMessagesLater( CCmdUI *pCmdUI )
  2334. {
  2335.     DoUpdateNavigate( pCmdUI, MSG_LaterMessage);
  2336. }
  2337.  
  2338. void CMailNewsFrame::OnRetrieveOffline()
  2339. {
  2340.     DoCommand(MSG_RetrieveMarkedMessages);
  2341. }
  2342.  
  2343. void CMailNewsFrame::OnUpdateRetrieveOffline( CCmdUI *pCmdUI )
  2344. {
  2345.     DoUpdateCommand(pCmdUI, MSG_RetrieveMarkedMessages);
  2346. }
  2347.  
  2348. void CMailNewsFrame::OnMarkMessages()
  2349. {
  2350.     DoCommand( MSG_MarkMessages );
  2351.     if (m_pOutliner)
  2352.         DOWNCAST(CMessageOutliner, m_pOutliner)->EnsureFlagsVisible();
  2353. }
  2354.  
  2355. void CMailNewsFrame::OnUpdateMarkMessages( CCmdUI *pCmdUI )
  2356. {
  2357.     DoUpdateCommand( pCmdUI, MSG_MarkMessages );
  2358. }
  2359.  
  2360. void CMailNewsFrame::OnUnmarkMessages()
  2361. {
  2362.     DoCommand( MSG_UnmarkMessages );
  2363.     if (m_pOutliner)
  2364.         DOWNCAST(CMessageOutliner, m_pOutliner)->EnsureFlagsVisible();
  2365. }
  2366.  
  2367. void CMailNewsFrame::OnUpdateUnmarkMessages( CCmdUI *pCmdUI )
  2368. {
  2369.     DoUpdateCommand( pCmdUI, MSG_UnmarkMessages );
  2370. }
  2371.  
  2372. void CMailNewsFrame::OnPostNew ( )
  2373. {
  2374.     DoCommand(MSG_PostNew);
  2375. }
  2376.  
  2377. void CMailNewsFrame::OnUpdatePostNew(CCmdUI* pCmdUI)
  2378. {
  2379.     DoUpdateCommand(pCmdUI, MSG_PostNew);
  2380. }
  2381.  
  2382. void CMailNewsFrame::OnWrapLongLines ( )
  2383. {
  2384.     DoMessageCommand(MSG_WrapLongLines);
  2385. }
  2386.  
  2387. void CMailNewsFrame::OnUpdateWrapLongLines ( CCmdUI * pCmdUI )
  2388. {
  2389.     DoUpdateMessageCommand( pCmdUI, MSG_WrapLongLines );
  2390. }
  2391.  
  2392. void CMailNewsFrame::OnViewRot13 ( )
  2393. {
  2394.     DoMessageCommand(MSG_Rot13Message);
  2395. }
  2396.  
  2397. void CMailNewsFrame::OnUpdateViewRot13 ( CCmdUI * pCmdUI )
  2398. {
  2399.     DoUpdateMessageCommand( pCmdUI, MSG_Rot13Message );
  2400. }
  2401.  
  2402. static BOOL s_bGettingMail = FALSE;
  2403.  
  2404. static void _GetMailCallback(HWND hwnd, MSG_Pane *pane, void *closure)
  2405. {
  2406.    if (pane != NULL)
  2407.    {
  2408.        s_bGettingMail = TRUE;
  2409.        MSG_Command( pane, MSG_GetNewMail, NULL, 0 );
  2410.        ::ShowWindow(hwnd, SW_SHOW);
  2411.    }
  2412. }
  2413.  
  2414. static void _GetMailDoneCallback(HWND hwnd, MSG_Pane *pane, void *closure)
  2415. {
  2416.     s_bGettingMail = FALSE;
  2417.     for(CGenericFrame * f = theApp.m_pFrameList; f; f = f->m_pNext)
  2418.         f->PostMessage(WM_COMMAND, (WPARAM) ID_DONEGETTINGMAIL, (LPARAM) 0);
  2419. }
  2420.  
  2421. static void _GetNextCallback(HWND hwnd, MSG_Pane *pane, void *closure)
  2422. {
  2423.    if (pane != NULL)
  2424.    {
  2425.        XP_Bool bEnabled, bPlural;
  2426.        MSG_COMMAND_CHECK_STATE stateSelected;
  2427.        LPCSTR lpszLabel;
  2428.        MSG_CommandStatus( pane, MSG_GetNextChunkMessages, NULL, 0, 
  2429.                           &bEnabled, &stateSelected,
  2430.                           &lpszLabel, &bPlural );
  2431.  
  2432.        if ( !bEnabled ) {
  2433.          ::PostMessage(hwnd,WM_DESTROY,0,0);
  2434.        }
  2435.  
  2436.        MSG_Command( pane, MSG_GetNextChunkMessages, NULL, 0 );
  2437.    }
  2438. }
  2439.  
  2440. static void _CompressFoldersCallback(HWND hwnd, MSG_Pane *pane, void *closure)
  2441. {
  2442.    if (pane != NULL)
  2443.    {
  2444.        MSG_Command( pane, MSG_CompressAllFolders, NULL, 0 );
  2445.        ::ShowWindow(hwnd, SW_SHOW);
  2446.    }
  2447. }
  2448.  
  2449. typedef struct {
  2450.     MSG_ViewIndex *indices;
  2451.     int count;
  2452. } CompressFolderClosure;
  2453.  
  2454. static void _CompressFolderCallback(HWND hwnd, MSG_Pane *pane, void *closure)
  2455. {
  2456.    CompressFolderClosure *cfc = (CompressFolderClosure *) closure;
  2457.  
  2458.    if (pane != NULL)
  2459.    {
  2460.        MSG_Command(pane, MSG_CompressFolder, cfc->indices, cfc->count);
  2461.        ::ShowWindow(hwnd, SW_SHOW);
  2462.    }
  2463. }
  2464.  
  2465. static void _EmptyTrashCallback(HWND hwnd, MSG_Pane *pane, void *closure)
  2466. {
  2467.    if (pane != NULL)
  2468.    {
  2469.        MSG_Command( pane, MSG_EmptyTrash, NULL, 0 );
  2470.        ::ShowWindow(hwnd, SW_SHOW);
  2471.    }
  2472. }
  2473.  
  2474. /////////////////////////////////////////////////////////////////////////////
  2475. void CMailNewsFrame::OnGetMail()
  2476. {
  2477.     new CProgressDialog(this, m_pPane, _GetMailCallback, NULL, NULL, _GetMailDoneCallback);
  2478. }
  2479.  
  2480. void CMailNewsFrame::OnUpdateGetMail(CCmdUI *pCmdUI)
  2481. {
  2482.     if (!s_bGettingMail)
  2483.         DoUpdateCommand(pCmdUI, MSG_GetNewMail);
  2484.     else
  2485.         pCmdUI->Enable(FALSE);
  2486. }
  2487.  
  2488. void CMailNewsFrame::OnGetNext()
  2489. {
  2490.     new CProgressDialog(this, m_pPane, _GetNextCallback);
  2491. }
  2492.  
  2493. void CMailNewsFrame::OnUpdateGetNext(CCmdUI *pCmdUI)
  2494. {
  2495.     int32 iDownloadMax = 0;
  2496.     PREF_GetIntPref("news.max_articles", &iDownloadMax);
  2497.  
  2498.     CString cs;
  2499.     cs.Format(szLoadString(IDS_MENU_GETNEXT), (int) iDownloadMax);
  2500.  
  2501.     pCmdUI->SetText(cs);
  2502.  
  2503.     DoUpdateCommand(pCmdUI, MSG_GetNextChunkMessages);
  2504. }
  2505.  
  2506. void CMailNewsFrame::OnDeliverNow()
  2507. {
  2508.     DoCommand(MSG_DeliverQueuedMessages);
  2509. }
  2510.  
  2511. void CMailNewsFrame::OnUpdateDeliverNow(CCmdUI *pCmdUI)
  2512. {
  2513.     DoUpdateCommand(pCmdUI, MSG_DeliverQueuedMessages);
  2514. }
  2515.  
  2516. void CMailNewsFrame::OnNewFolder ( )
  2517. {
  2518.     if (m_bNews) {
  2519.         if (m_bCategory)
  2520.             OnNewCategory();
  2521.         else
  2522.             OnNewNewsgroup();
  2523.     } else {
  2524.         if (IsKindOf(RUNTIME_CLASS(C3PaneMailFrame)))
  2525.         {
  2526.             MSG_FolderLine folderLine;
  2527.             if (((C3PaneMailFrame*)this)->GetSelectedFolder(&folderLine))
  2528.                 CNewFolderDialog( this, m_pPane, folderLine.id );
  2529.             else
  2530.                 CNewFolderDialog( this, m_pPane, NULL );
  2531.         }
  2532.         else
  2533.             CNewFolderDialog( this, m_pPane, GetCurFolder() );
  2534.     }
  2535. }
  2536.  
  2537. void CMailNewsFrame::OnUpdateNewFolder(CCmdUI* pCmdUI)
  2538. {
  2539.     if (m_bNews) {
  2540.         if (m_bCategory) {
  2541.             pCmdUI->SetText(szLoadString(IDS_MENU_NEWCATEGORY));
  2542.             OnUpdateNewCategory(pCmdUI);
  2543.         } else {
  2544.             pCmdUI->SetText(szLoadString(IDS_MENU_NEWNEWSGROUP));
  2545.             OnUpdateNewNewsgroup(pCmdUI);
  2546.         }
  2547.     } else {
  2548.         pCmdUI->SetText(szLoadString(IDS_MENU_NEWFOLDER));
  2549.         pCmdUI->Enable( TRUE );
  2550.     }
  2551. }
  2552.  
  2553. void CMailNewsFrame::OnCompressFolder ( )
  2554. {
  2555.     DoCommand(MSG_CompressFolder, 0);
  2556. }
  2557.  
  2558. void CMailNewsFrame::OnUpdateCompressFolder(CCmdUI* pCmdUI)
  2559. {
  2560.     DoUpdateCommand(pCmdUI, MSG_CompressFolder);
  2561. }
  2562.  
  2563. void CMailNewsFrame::OnRenameFolder ( )
  2564. {
  2565.     DoCommand(MSG_DoRenameFolder);
  2566. }
  2567.  
  2568. void CMailNewsFrame::OnUpdateRenameFolder(CCmdUI* pCmdUI)
  2569. {
  2570.     DoUpdateCommand(pCmdUI, MSG_DoRenameFolder);
  2571. }
  2572.  
  2573. void CMailNewsFrame::OnCompressAll()
  2574. {
  2575.     MSG_FolderInfo *folderInfo = GetCurFolder();
  2576.     
  2577.     if (folderInfo) {
  2578.         XP_Bool bCompressAll = TRUE;
  2579.  
  2580.         MSG_FolderLine folderLine;
  2581.         MSG_GetFolderLineById( WFE_MSGGetMaster(), GetCurFolder(), &folderLine );
  2582.         if ( folderLine.flags & MSG_FOLDER_FLAG_IMAPBOX ) {
  2583.             PREF_GetBoolPref("mail.imap.delete_is_move_to_trash", &bCompressAll);
  2584.         }
  2585.  
  2586.         if (!bCompressAll) {
  2587.             CompressFolderClosure cfc;
  2588.             cfc.indices = NULL;
  2589.             cfc.count = 0;
  2590.  
  2591.             if (MSG_GetPaneType(m_pPane) == MSG_FOLDERPANE && m_pOutliner) {
  2592.                 m_pOutliner->GetSelection(cfc.indices, cfc.count);
  2593.             }
  2594.             new CProgressDialog(this, m_pPane, _CompressFolderCallback,
  2595.                                 &cfc, szLoadString(IDS_COMPRESSINGFOLDERS));
  2596.         } else {
  2597.             new CProgressDialog(this, m_pPane, _CompressFoldersCallback,
  2598.                                 NULL, szLoadString(IDS_COMPRESSINGFOLDERS));
  2599.         }
  2600.     }
  2601. }
  2602.  
  2603. void CMailNewsFrame::OnUpdateCompressAll ( CCmdUI* pCmdUI )
  2604. {
  2605.     MSG_FolderInfo *folderInfo = GetCurFolder();
  2606.     
  2607.     if (folderInfo) {
  2608.         XP_Bool bCompressAll = TRUE;
  2609.  
  2610.         MSG_FolderLine folderLine;
  2611.         MSG_GetFolderLineById( WFE_MSGGetMaster(), GetCurFolder(), &folderLine );
  2612.         if ( folderLine.flags & MSG_FOLDER_FLAG_IMAPBOX ) {
  2613.             PREF_GetBoolPref("mail.imap.delete_is_move_to_trash", &bCompressAll);
  2614.         }
  2615.  
  2616.         if (!bCompressAll) {
  2617.             pCmdUI->SetText(szLoadString(IDS_MENU_COMPRESSFOLDER));
  2618.             DoUpdateCommand(pCmdUI, MSG_CompressFolder);
  2619.         } else {
  2620.             pCmdUI->SetText(szLoadString(IDS_MENU_COMPRESSFOLDERS));
  2621.             DoUpdateCommand(pCmdUI, MSG_CompressAllFolders);
  2622.         }
  2623.     } else {
  2624.         pCmdUI->Enable(FALSE);
  2625.     }
  2626. }
  2627.  
  2628. void CMailNewsFrame::OnEmptyTrash()
  2629. {
  2630.     new CProgressDialog(this, m_pPane, _EmptyTrashCallback,
  2631.                         NULL, szLoadString(IDS_EMPTYINGTRASH));
  2632. }
  2633.  
  2634. void CMailNewsFrame::OnUpdateEmptyTrash ( CCmdUI* pCmdUI )
  2635. {
  2636.     DoUpdateCommand(pCmdUI, MSG_EmptyTrash);
  2637. }
  2638.  
  2639. void CMailNewsFrame::OnAddToAddressBook()
  2640. {
  2641.     theApp.DoWaitCursor(1);
  2642.     DoCommand(MSG_AddSender);    
  2643.     theApp.DoWaitCursor(-1);
  2644. }
  2645.  
  2646. void CMailNewsFrame::OnUpdateAddToAddressBook ( CCmdUI* pCmdUI )
  2647. {
  2648.     DoUpdateCommand(pCmdUI, MSG_AddSender);
  2649. }
  2650.  
  2651. void CMailNewsFrame::OnAddAllToAddressBook()
  2652. {
  2653.     theApp.DoWaitCursor(1);
  2654.     DoCommand(MSG_AddAll);    
  2655.     theApp.DoWaitCursor(-1);
  2656. }
  2657.  
  2658. void CMailNewsFrame::OnUpdateAddAllToAddressBook ( CCmdUI* pCmdUI )
  2659. {
  2660.     DoUpdateCommand(pCmdUI, MSG_AddAll);
  2661. }
  2662.  
  2663. // Non-MSG Items
  2664.  
  2665. void CMailNewsFrame::OnTips()
  2666. {
  2667.     if ( m_pOutliner ) {
  2668.         m_pOutliner->EnableTips( TRUE );
  2669.     }
  2670. }
  2671.  
  2672. void CMailNewsFrame::OnQuickFile()
  2673. {
  2674. }
  2675.  
  2676. void CMailNewsFrame::OnUpdateQuickFile( CCmdUI *pCmdUI )
  2677. {
  2678.     if (m_pOutliner) {
  2679.         MSG_ViewIndex *indices;
  2680.         int count;
  2681.         m_pOutliner->GetSelection( indices, count );
  2682.         pCmdUI->Enable( count > 0 );
  2683.     } else {
  2684.         pCmdUI->Enable( TRUE );
  2685.     }
  2686. }
  2687.  
  2688. // replace with Manage Mail Account
  2689. void CMailNewsFrame::OnSetupWizard()
  2690. {
  2691.     DoCommand(MSG_ManageMailAccount);
  2692. }
  2693.  
  2694. void CMailNewsFrame::OnUpdateSetupWizard( CCmdUI *pCmdUI )
  2695. {
  2696.     DoUpdateCommand(pCmdUI, MSG_ManageMailAccount);
  2697. }
  2698.  
  2699. void CMailNewsFrame::OnServerStuff()
  2700. {
  2701.     DoCommand(MSG_ModerateNewsgroup);
  2702. }
  2703.  
  2704. void CMailNewsFrame::OnUpdateServerStuff( CCmdUI *pCmdUI )
  2705. {
  2706.     DoUpdateCommand(pCmdUI, MSG_ModerateNewsgroup);
  2707. }
  2708.  
  2709. void CMailNewsFrame::OnInterrupt()
  2710. {
  2711.     //      Let the context have it.
  2712.     if(GetMainContext()) {
  2713.         GetMainContext()->AllInterrupt();
  2714.     }
  2715. }
  2716.  
  2717. void CMailNewsFrame::OnUpdateInterrupt( CCmdUI *pCmdUI )
  2718. {
  2719.     //      Defer to the context's wisdom.
  2720.     pCmdUI->Enable( GetMainContext() && GetMainContext()->CanAllInterrupt() );
  2721. }
  2722.  
  2723. void CMailNewsFrame::OnPriorityLowest()
  2724. {
  2725.     MSG_SetPriority( m_pPane,
  2726.                      GetCurMessage(),
  2727.                      MSG_LowestPriority );
  2728. }
  2729.  
  2730. void CMailNewsFrame::OnPriorityLow()
  2731. {
  2732.     MSG_SetPriority( m_pPane,
  2733.                      GetCurMessage(),
  2734.                      MSG_LowPriority );
  2735. }
  2736.  
  2737. void CMailNewsFrame::OnPriorityNormal()
  2738. {
  2739.     MSG_SetPriority( m_pPane,
  2740.                      GetCurMessage(),
  2741.                      MSG_NormalPriority );
  2742. }
  2743.  
  2744. void CMailNewsFrame::OnPriorityHigh()
  2745. {
  2746.     MSG_SetPriority( m_pPane,
  2747.                      GetCurMessage(),
  2748.                      MSG_HighPriority );
  2749. }
  2750.  
  2751. void CMailNewsFrame::OnPriorityHighest()
  2752. {
  2753.     MSG_SetPriority( m_pPane,
  2754.                      GetCurMessage(),
  2755.                      MSG_HighestPriority );
  2756. }
  2757.  
  2758. void CMailNewsFrame::OnUpdatePriority(CCmdUI *pCmdUI)
  2759. {
  2760.     pCmdUI->Enable(GetCurMessage() != MSG_MESSAGEKEYNONE);
  2761. }
  2762.  
  2763. #define UNSEC_SIGNED_INDEX    7
  2764. #define UNSECURE_INDEX        8
  2765. #define SEC_SIGNED_INDEX    9
  2766. #define SECURE_INDEX        10
  2767.  
  2768. void CMailNewsFrame::OnUpdateSecurity(CCmdUI *pCmdUI)
  2769. {
  2770.     XP_Bool bSigned = FALSE;
  2771.     XP_Bool bEncrypted = FALSE;
  2772.  
  2773.     MIME_GetMessageCryptoState(GetMainContext()->GetContext(),
  2774.                                0, 0,
  2775.                                &bSigned,
  2776.                                &bEncrypted);
  2777.  
  2778.     if (m_bNews) {
  2779.         int status = XP_GetSecurityStatus(GetMainContext()->GetContext());    
  2780.         if (status == SSL_SECURITY_STATUS_ON_LOW || status == SSL_SECURITY_STATUS_ON_HIGH)
  2781.             bEncrypted = TRUE;
  2782.     }
  2783.  
  2784.     LPNSTOOLBAR pIToolBar;
  2785.     m_pChrome->QueryInterface( IID_INSToolBar, (LPVOID *) &pIToolBar );
  2786.     if ( pIToolBar ) {
  2787.         CCommandToolbar *pToolBar = (CCommandToolbar *) CWnd::FromHandlePermanent( pIToolBar->GetHWnd() );
  2788.         
  2789.         int index = bEncrypted ? 
  2790.                     (bSigned ? SEC_SIGNED_INDEX : SECURE_INDEX) :
  2791.                     (bSigned ? UNSEC_SIGNED_INDEX : UNSECURE_INDEX);
  2792.  
  2793.         pToolBar->ReplaceButtonBitmapIndex(ID_SECURITY, index);
  2794.         pIToolBar->Release();
  2795.     }
  2796.     pCmdUI->Enable(TRUE);
  2797. }
  2798.  
  2799. void CMailNewsFrame::OnUpdateSecureStatus(CCmdUI *pCmdUI)
  2800. {
  2801.     XP_Bool bSigned = FALSE;
  2802.     XP_Bool bEncrypted = FALSE;
  2803.  
  2804.     MIME_GetMessageCryptoState(GetMainContext()->GetContext(),
  2805.                                0, 0,
  2806.                                &bSigned,
  2807.                                &bEncrypted);
  2808.  
  2809.     if (m_bNews) {
  2810.         int status = XP_GetSecurityStatus(GetMainContext()->GetContext());    
  2811.         if (status == SSL_SECURITY_STATUS_ON_LOW || status == SSL_SECURITY_STATUS_ON_HIGH)
  2812.             bEncrypted = TRUE;
  2813.     }
  2814.  
  2815.     if (pCmdUI->m_nID == IDS_SECURITY_STATUS)
  2816.         pCmdUI->Enable(bEncrypted);
  2817.     else
  2818.         pCmdUI->Enable(bSigned);
  2819. }
  2820.  
  2821. void CMailNewsFrame::SetCSID( int csid ) {
  2822.     if (m_iCSID != csid)
  2823.     {
  2824.         m_iCSID = csid;
  2825.         if (m_pOutliner) {
  2826.             m_pOutliner->SetCSID( csid );
  2827.         }
  2828.  
  2829.         if (m_pInfoBar) {
  2830.             m_pInfoBar->SetCSID( csid );
  2831.         }
  2832.         GetContext()->NiceReload();
  2833.         if ( m_pMessageView ) {
  2834.             m_pMessageView->SetCSID( csid );
  2835.         }
  2836.     }
  2837. }
  2838.  
  2839. void CMailNewsFrame::RefreshNewEncoding(int16 doc_csid, BOOL bSave )
  2840. {
  2841.     int16 win_csid = INTL_DocToWinCharSetID(doc_csid);
  2842.     INTL_CharSetInfo c = LO_GetDocumentCharacterSetInfo( GetMainContext()->GetContext() );
  2843.  
  2844.     INTL_SetCSIDocCSID( c, doc_csid );    
  2845.     INTL_SetCSIWinCSID( c, win_csid );
  2846.     
  2847.     SetCSID( doc_csid );
  2848.  
  2849.     if ( bSave ) {
  2850.         MSG_FolderInfo *folderInfo = GetCurFolder();
  2851.         if (m_bCategory)
  2852.             folderInfo = MSG_GetCategoryContainerForCategory(folderInfo);
  2853.  
  2854.         if (folderInfo) {
  2855.             MSG_SetFolderCSID( folderInfo, doc_csid );
  2856.         }
  2857.     }
  2858. }
  2859.  
  2860. // CMsgListFrame
  2861.  
  2862. STDMETHODIMP CMsgListFrame::QueryInterface(REFIID refiid, LPVOID * ppv)
  2863. {
  2864.     *ppv = NULL;
  2865.     if (IsEqualIID(refiid,IID_IUnknown))
  2866.            *ppv = (LPUNKNOWN) (LPMSGLIST) this;
  2867.     else if (IsEqualIID(refiid,IID_IMsgList))
  2868.            *ppv = (LPMSGLIST) this;
  2869.     else if (IsEqualIID(refiid,IID_IMailFrame))
  2870.         *ppv = (LPMAILFRAME) this;
  2871.  
  2872.     if (*ppv != NULL) {
  2873.            AddRef();
  2874.         return NOERROR;
  2875.     }
  2876.             
  2877.     return ResultFromScode(E_NOINTERFACE);
  2878. }
  2879.  
  2880. STDMETHODIMP_(ULONG) CMsgListFrame::AddRef(void)
  2881. {
  2882.     return ++m_ulRefCount;
  2883. }
  2884.  
  2885. STDMETHODIMP_(ULONG) CMsgListFrame::Release(void)
  2886. {
  2887.     ULONG ulRef;
  2888.     ulRef = --m_ulRefCount;
  2889.     if (m_ulRefCount == 0) 
  2890.         delete this;       
  2891.     return ulRef;       
  2892. }
  2893.  
  2894. CMsgListFrame::CMsgListFrame()
  2895. {
  2896. }
  2897.  
  2898. // IMsgList Interface
  2899.  
  2900. void CMsgListFrame::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
  2901.                                         MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
  2902.                                         int32 num)
  2903. {
  2904.     if ( pane == m_pPane ) {
  2905.         if ( m_pOutliner ) {
  2906.             m_pOutliner->MysticStuffStarting( asynchronous, notify,
  2907.                                                    where, num );
  2908.         }
  2909.     } else {
  2910.         ASSERT(0);
  2911.     }
  2912. }
  2913.  
  2914. void CMsgListFrame::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
  2915.                                         MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
  2916.                                         int32 num)
  2917. {
  2918.     if ( pane == m_pPane ) {
  2919.         if ( m_pOutliner ) {
  2920.             m_pOutliner->MysticStuffFinishing( asynchronous, notify,
  2921.                                                     where, num );
  2922.         }
  2923.     } else {
  2924.         ASSERT(0);
  2925.     }
  2926. }
  2927.  
  2928. void CMsgListFrame::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count, 
  2929.                                   int *focus)
  2930. {
  2931.     if ( pane == m_pPane ) {
  2932.         if ( m_pOutliner ) {
  2933.             m_pOutliner->GetSelection(*indices, *count);
  2934.             *focus = m_pOutliner->GetFocusLine();
  2935.         }
  2936.     } else {
  2937.         ASSERT(0);
  2938.     }
  2939. }
  2940.  
  2941. void CMsgListFrame::SelectItem( MSG_Pane* pane, int item )
  2942. {
  2943.     if ( pane == m_pPane ) {
  2944.         if ( m_pOutliner ) {
  2945.             m_pOutliner->SelectItem(item);
  2946.             m_pOutliner->ScrollIntoView(item);
  2947.         }
  2948.     } else {
  2949.         ASSERT(0);
  2950.     }
  2951. }
  2952.  
  2953. void CMsgListFrame::CopyMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
  2954.                                       MSG_FolderInfo *folderInfo)
  2955. {
  2956.     ASSERT(0);
  2957. }
  2958.  
  2959. void CMsgListFrame::MoveMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
  2960.                                       MSG_FolderInfo *folderInfo)
  2961. {
  2962.     ASSERT(0);
  2963. }
  2964.  
  2965. BEGIN_MESSAGE_MAP( CMsgListFrame, CMailNewsFrame)
  2966.     ON_WM_CREATE()
  2967.     ON_WM_DESTROY()
  2968. END_MESSAGE_MAP()
  2969.  
  2970.  
  2971. int CMsgListFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2972. {
  2973.     int res = CMailNewsFrame::OnCreate( lpCreateStruct );
  2974.  
  2975.     return res;
  2976. }
  2977.  
  2978. void CMsgListFrame::OnDestroy()
  2979. {
  2980.     // Destroy my own damn context
  2981.     if(GetMainContext() && !GetMainContext()->IsDestroyed()) {
  2982.         CAbstractCX *pCX = GetMainContext();
  2983.         ClearContext(pCX);
  2984.         pCX->DestroyContext();
  2985.     }
  2986.  
  2987.     CMailNewsFrame::OnDestroy();
  2988. }
  2989.  
  2990. BOOL WFE_MSGCheckWizard(CWnd *pParent)
  2991. {
  2992.     return CMailNewsFrame::CheckWizard(pParent);
  2993. }
  2994.