gecko-dev/cmd/winfe/thrdfrm.cpp
1998-06-22 21:19:46 +00:00

2304 lines
58 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "stdafx.h"
#include "prefapi.h"
#include "msgcom.h"
#include "intl_csi.h"
#include "feutil.h"
#include "netsvw.h"
#include "fldrfrm.h"
#include "thrdfrm.h"
#include "srchfrm.h"
#include "msgfrm.h"
#include "wfemsg.h"
#include "msgview.h"
#include "filter.h"
#include "mailmisc.h"
#include "template.h"
#include "custom.h"
#include "subnews.h"
#include "mailpriv.h"
#include "mailqf.h"
#include "dspppage.h"
#include "addrfrm.h" //for MOZ_NEWADDR
#ifdef DEBUG_WHITEBOX
#include "qa.h"
#endif
#ifndef _AFXDLL
#undef new
#endif
IMPLEMENT_DYNCREATE(C3PaneMailFrame, CMsgListFrame)
#ifndef _AFXDLL
#define new DEBUG_NEW
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
static C3PaneMailFrame *g_pLast3PaneMailFrame = NULL;
///////////////////////////////////////////////////////////////////////////
// C3PaneMailFrame
static BOOL s_bHintNews = FALSE;
static BOOL s_bGetMail = FALSE;
UINT MailCodes[10] = {
ID_FILE_GETNEWMAIL,
ID_FILE_NEWMESSAGE,
ID_MESSAGE_REPLYBUTTON,
ID_MESSAGE_FORWARDBUTTON,
ID_MESSAGE_FILE,
ID_MESSAGE_NEXTUNREAD,
ID_FILE_PRINT,
ID_SECURITY,
ID_EDIT_DELETE_3PANE,
ID_NAVIGATE_INTERRUPT
};
int MailIndices[10] = { 0, 1, 2, 3, 4, 5, 6, 10, 11, 13 };
UINT NewsCodes[11] = {
ID_FILE_GETNEWMAIL,
ID_NEWS_POSTNEW,
ID_MESSAGE_REPLYBUTTON,
ID_MESSAGE_FORWARDBUTTON,
ID_MESSAGE_FILE,
ID_MESSAGE_NEXTUNREAD,
ID_FILE_PRINT,
ID_SECURITY,
ID_MESSAGE_MARKBUTTON,
ID_EDIT_DELETE_3PANE,
ID_NAVIGATE_INTERRUPT
};
int NewsIndices[11] = { 0, 1, 2, 3, 4, 5, 6, 10, 11, 12, 14 };
//status bar format
static const UINT BASED_CODE indicators[] =
{
IDS_EXPANDO,
IDS_SECURITY_STATUS,
IDS_SIGNED_STATUS,
IDS_TRANSFER_STATUS,
ID_SEPARATOR,
IDS_ONLINE_STATUS,
IDS_TASKBAR
};
C3PaneMailFrame::C3PaneMailFrame()
{
m_bNews = FALSE;
m_bWantToGetMail = FALSE;
m_pMessagePane = NULL;
m_pOutlinerParent = NULL;
m_pFolderPane = NULL;
m_pFolderOutliner = NULL;
m_pFolderOutlinerParent = NULL;
m_pFolderSplitter = NULL;
m_pThreadSplitter = NULL;
m_nLoadingFolder = 0;
m_bDragCopying = FALSE;
m_bBlockingFolderSelection = FALSE;
m_bNoScrollHack = FALSE;
m_actionOnLoad = actionSelectFirst;
m_navPending = MSG_FirstMessage;
m_selPending = -1L;
m_pFocusWnd = NULL;
// All our favorite hotkeys
LoadAccelerators( IDR_ONEKEYMESSAGE );
}
C3PaneMailFrame::~C3PaneMailFrame()
{
delete m_pOutlinerParent;
delete m_pFolderOutlinerParent;
}
void C3PaneMailFrame::UIForFolder( MSG_FolderInfo *folderInfo )
{
MSG_FolderLine folderLine;
if (MSG_GetFolderLineById(WFE_MSGGetMaster(), folderInfo, &folderLine)) {
SetIsNews( folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ? TRUE : FALSE );
MSG_FolderInfo *parentFolder = folderInfo;
int16 doc_csid = MSG_GetFolderCSID( parentFolder );
if (!doc_csid)
doc_csid = INTL_DefaultWinCharSetID(0);
RefreshNewEncoding( doc_csid, FALSE );
CString csFullString, csTitle, cs;
if ( m_bNews ) {
csFullString.LoadString( IDR_NEWSTHREAD );
} else {
csFullString.LoadString( IDR_MAILTHREAD );
}
AfxExtractSubString( csTitle, csFullString, 0 );
cs = folderLine.prettyName && folderLine.prettyName[0] ?
folderLine.prettyName :
folderLine.name;
cs += _T(" - ");
cs += csTitle;
m_pChrome->SetWindowTitle(cs);
m_pInfoBar->Update();
// Refresh the headers, which may change
if ( m_pOutliner )
m_pOutliner->GetParent()->Invalidate();
UpdateFolderPane(folderInfo);
}
}
void C3PaneMailFrame::PaneChanged( MSG_Pane *pane, XP_Bool asynchronous,
MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
{
if ( pane ==m_pFolderPane && notify == MSG_PaneNotifySelectNewFolder ) {
if ( value >= 0 ) {
m_pFolderOutliner->SelectItem( CASTINT(value) );
}
return;
}
if (notify == MSG_PaneNotifySafeToSelectFolder)
{
if (m_bBlockingFolderSelection)
{
m_bBlockingFolderSelection = FALSE;
PostMessage(WM_COMMAND, ID_FOLDER_SELECT, 0);
}
return;
}
if ( notify == MSG_PaneNotifyFolderLoaded ) {
if (m_nLoadingFolder > 0) {
// This load was initiated through our LoadFolder method
m_pOutliner->BlockSelNotify(FALSE);
m_nLoadingFolder--;
}
else
return; // must be blocked by select top level host
// Update the UI
MSG_FolderInfo *folderInfo = MSG_GetCurFolder( m_pPane );
UIForFolder( folderInfo );
// Safety Dance
m_pOutliner->SetTotalLines( (int) MSG_GetNumLines( m_pPane ) );
m_pOutliner->Invalidate();
// Select something based on previously set hints.
switch ( m_actionOnLoad ) {
case actionSelectFirst:
{
if (m_navPending != MSG_NextUnreadMessage)
{
XP_Bool bSelectLastMsg = FALSE;
PREF_GetBoolPref("mailnews.remember_selected_message", &bSelectLastMsg);
MessageKey lastKey = MSG_GetLastMessageLoaded(folderInfo);
MSG_ViewIndex index =
MSG_GetMessageIndexForKey(m_pPane, lastKey, TRUE);
if (index != MSG_VIEWINDEXNONE && bSelectLastMsg)
SelectMessage(lastKey);
else
m_pOutliner->SelectItem( m_pOutliner->GetTotalLines() > 0 ? 0 : -1 );
m_bNoScrollHack = TRUE;
OnDoneGettingMail();
}
else
m_navPending = MSG_FirstMessage;
}
break;
case actionSelectKey:
SelectMessage( m_selPending );
break;
case actionNavigation:
switch ( m_navPending ) {
case MSG_Forward:
case MSG_Back:
case MSG_EditUndo:
case MSG_EditRedo:
SelectMessage( m_selPending );
break;
case MSG_NextFolder:
case MSG_NextMessage:
m_pOutliner->SelectItem( -1 );
DoNavigate(MSG_FirstMessage);
break;
case MSG_NextUnreadMessage:
case MSG_NextUnreadThread:
case MSG_NextUnreadGroup:
case MSG_LaterMessage:
m_navPending = MSG_NextUnreadMessage;
default:
m_pOutliner->SelectItem( -1 );
DoNavigate( m_navPending );
break;
}
break;
case actionNone:
break;
}
// Sort might have changed, redraw column headers
m_pOutliner->GetParent()->Invalidate();
m_actionOnLoad = actionSelectFirst;
if (m_bWantToGetMail && !NET_IsOffline() &&
!MSG_GetMailServerIsIMAP4(g_MsgPrefs.m_pMsgPrefs)) {
PostMessage(WM_COMMAND, (WPARAM) ID_FILE_GETNEWMAIL, (LPARAM) 0);
}
m_bWantToGetMail = FALSE;
} else if ( notify == MSG_PaneNotifyFolderDeleted ) {
if (!m_pPane)
CreateThreadPane();
} else if ( notify == MSG_PaneNotifyMessageLoaded ) {
MSG_FolderInfo *curFolder = GetCurFolder();
MSG_FolderInfo *folderInfo = MSG_GetCurFolder(m_pMessagePane);
MessageKey key = (MessageKey) value;
if (folderInfo != curFolder) {
C3PaneMailFrame::Open(folderInfo, key);
} else {
MSG_ViewIndex index = MSG_GetMessageIndexForKey(m_pPane, key, TRUE);
if (index != MSG_VIEWINDEXNONE) {
m_pOutliner->BlockSelNotify(TRUE); // Tail don't wag dog
m_pOutliner->SelectItem(CASTINT(index));
m_pOutliner->BlockSelNotify(FALSE);
}
}
if (MSG_GetBacktrackState(m_pPane) == MSG_BacktrackIdle)
MSG_AddBacktrackMessage(m_pPane, folderInfo, key);
else
MSG_SetBacktrackState(m_pPane, MSG_BacktrackIdle);
} else if ( notify == MSG_PaneNotifyCopyFinished && m_bDragCopying) {
// Allow the UI to update and be interacted with
m_pOutliner->BlockSelNotify(FALSE);
m_bDragCopying = FALSE;
// Post message to allow BE to return first.
PostMessage(WM_COMMAND, (WPARAM) ID_MESSAGE_SELECT, 0);
}
// We get notified of message deletes individually, so lets
// ignore it.
if ( notify != MSG_PaneNotifyMessageDeleted && m_pPane) {
m_pInfoBar->Update();
}
#ifdef DEBUG_WHITEBOX
if ( notify == MSG_PaneNotifyMessageLoaded ) // previous MSG_PaneNotifyMessageLoaded
{
bWaitForInbox = FALSE;
}
if ( notify == MSG_PaneNotifyMessageDeleted)
{
QADoDeleteMessageEventHandler2();
}
#endif
}
void C3PaneMailFrame::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == m_pFolderPane ) {
if ( m_pFolderOutliner ) {
m_pFolderOutliner->MysticStuffStarting( asynchronous, notify,
where, num );
}
} else {
CMsgListFrame::ListChangeStarting( pane, asynchronous, notify,
where, num );
}
}
void C3PaneMailFrame::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == m_pFolderPane ) {
if ( m_pFolderOutliner ) {
m_pFolderOutliner->MysticStuffFinishing( asynchronous, notify,
where, num );
}
} else {
CMsgListFrame::ListChangeFinished( pane, asynchronous, notify,
where, num );
}
}
void C3PaneMailFrame::CopyMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
MSG_FolderInfo *folderInfo)
{
ASSERT(pane);
m_bDragCopying = TRUE;
m_pOutliner->BlockSelNotify(TRUE);
MSG_CopyMessagesIntoFolder(pane, indices, count, folderInfo);
}
void C3PaneMailFrame::MoveMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
MSG_FolderInfo *folderInfo)
{
ASSERT(pane);
m_bDragCopying = TRUE;
m_pOutliner->BlockSelNotify(TRUE);
MSG_FolderLine folderLine;
MSG_GetFolderLineById( WFE_MSGGetMaster(), GetCurFolder(), &folderLine );
// We want to make file behave for newsgroups
if ( folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ) {
MSG_CopyMessagesIntoFolder(pane, indices, count, folderInfo);
} else {
MSG_MoveMessagesIntoFolder(pane, indices, count, folderInfo);
}
}
void C3PaneMailFrame::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
int *focus)
{
if ( pane == m_pFolderPane ) {
if ( m_pFolderOutliner ) {
m_pFolderOutliner->GetSelection(*indices, *count);
*focus = m_pFolderOutliner->GetFocusLine();
}
} else {
CMsgListFrame::GetSelection( pane, indices, count, focus );
}
}
void C3PaneMailFrame::SelectItem( MSG_Pane* pane, int item )
{
if ( pane == m_pFolderPane ) {
if ( m_pFolderOutliner ) {
m_pFolderOutliner->SelectItem(item);
m_pFolderOutliner->ScrollIntoView(item);
}
} else {
CMsgListFrame::SelectItem( pane, item );
}
}
//clock wise
void C3PaneMailFrame::CheckFocusWindow(BOOL bUseTab)
{
CWnd* pNextFocusWnd = NULL;
CWnd* pMsgBodyView = m_pMessageView ? m_pMessageView->GetMessageBodyView() : NULL;
BOOL bFolderClosed = m_pFolderSplitter->IsOnePaneClosed();
BOOL bMessageClosed = m_pThreadSplitter->IsOnePaneClosed();
if (m_pFocusWnd == pMsgBodyView )
{
if (bUseTab || bMessageClosed)
pNextFocusWnd = bFolderClosed ? m_pOutliner : m_pFolderOutliner;
else
pNextFocusWnd = pMsgBodyView;
}
else if (m_pFocusWnd == m_pOutliner)
{
if (bUseTab)
{
if (!bMessageClosed)
pNextFocusWnd = pMsgBodyView;
else if (!bFolderClosed)
pNextFocusWnd = m_pFolderOutliner;
else
pNextFocusWnd = m_pOutliner;
}
else
pNextFocusWnd = m_pOutliner;
}
else
pNextFocusWnd = m_pOutliner;
if (pNextFocusWnd != m_pFocusWnd)
{
m_pFocusWnd = pNextFocusWnd;
m_pFocusWnd->SetFocus();
}
}
//counter clock wise
void C3PaneMailFrame::CheckShiftKeyFocusWindow()
{
CWnd* pNextFocusWnd = NULL;
CWnd* pMsgBodyView = m_pMessageView ? m_pMessageView->GetMessageBodyView() : NULL;
BOOL bFolderClosed = m_pFolderSplitter->IsOnePaneClosed();
BOOL bMessageClosed = m_pThreadSplitter->IsOnePaneClosed();
if (m_pFocusWnd == m_pFolderOutliner)
pNextFocusWnd = bMessageClosed ? m_pOutliner : pMsgBodyView;
else if (m_pFocusWnd == m_pOutliner)
{
if (!bFolderClosed)
pNextFocusWnd = m_pFolderOutliner;
else if (!bMessageClosed)
pNextFocusWnd = pMsgBodyView;
else
pNextFocusWnd = m_pOutliner;
}
else
pNextFocusWnd = m_pOutliner;
if (pNextFocusWnd != m_pFocusWnd)
{
m_pFocusWnd = pNextFocusWnd;
m_pFocusWnd->SetFocus();
}
}
BOOL C3PaneMailFrame::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_DELETE)
{
CWnd* pFocusWnd = GetFocus();
if (pFocusWnd == m_pFolderOutliner)
{
PrepareForDeleteFolder();
OnDeleteFolder();
}
else
{
if (GetKeyState(VK_SHIFT) & 0x8000)
OnReallyDeleteMessage();
else
OnDeleteMessage();
}
return TRUE;
}
if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB &&
!(GetKeyState(VK_MENU) & 0x8000) &&
!(GetKeyState(VK_CONTROL) & 0x8000))
{
if (GetKeyState(VK_SHIFT) & 0x8000)
CheckShiftKeyFocusWindow();
else
CheckFocusWindow();
return TRUE;
}
return CMsgListFrame::PreTranslateMessage( pMsg );
}
BOOL C3PaneMailFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
BOOL res = CMsgListFrame::OnCreateClient(lpcs, pContext);
if (res) {
m_pMaster = WFE_MSGGetMaster();
m_bNews = s_bHintNews;
m_pFolderSplitter = DYNAMIC_DOWNCAST(CMailNewsSplitter, GetDescendantWindow(AFX_IDW_PANE_FIRST, TRUE));
ASSERT(m_pFolderSplitter);
#ifdef _WIN32
m_pFolderSplitter->ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED);
#endif
m_pFolderSplitter->SetNotifyFrame(this); //for setting focus in pane
m_pThreadSplitter = (CMailNewsSplitter *) RUNTIME_CLASS(CMailNewsSplitter)->CreateObject();
ASSERT(m_pThreadSplitter);
#ifdef _WIN32
m_pThreadSplitter->CreateEx(0, NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,
0,0,0,0, m_pFolderSplitter->m_hWnd, (HMENU)99, NULL );
#else
m_pThreadSplitter->Create( NULL, NULL,
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,
CRect(0,0,0,0), m_pFolderSplitter, 99, pContext );
#endif
m_pThreadSplitter->SetNotifyFrame(this); //for loading message when pane opens
m_pThreadSplitter->SetLoadMessage(TRUE); //for loading message when pane opens
m_pMessageView = (CMessageView *) RUNTIME_CLASS(CMessageView)->CreateObject();
#ifdef _WIN32
if (sysInfo.m_bWin4)
m_pMessageView->CreateEx( WS_EX_CLIENTEDGE, NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
0,0,0,0, m_pThreadSplitter->m_hWnd, (HMENU) IDW_MESSAGE_VIEW, pContext );
else
#endif
m_pMessageView->Create( NULL, NULL,
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
CRect(0,0,0,0), m_pThreadSplitter, IDW_MESSAGE_VIEW, pContext );
m_pMessageView->SendMessage(WM_INITIALUPDATE);
CWnd *pView = GetDescendantWindow(IDW_MESSAGE_PANE, TRUE);
ASSERT(pView);
CWinCX *pWinCX;
pWinCX = new CWinCX(DYNAMIC_DOWNCAST(CGenericDoc, pContext->m_pCurrentDoc),
this, (CGenericView *)pView);
SetMainContext(pWinCX);
SetActiveContext(pWinCX);
RECT rect;
GetClientRect(&rect);
pWinCX->Initialize(FALSE, &rect);
pWinCX->GetContext()->type = MWContextMail;
pWinCX->GetContext()->fancyFTP = TRUE;
pWinCX->GetContext()->fancyNews = TRUE;
pWinCX->GetContext()->intrupt = FALSE;
pWinCX->GetContext()->reSize = FALSE;
m_pOutlinerParent = new CMessageOutlinerParent;
#ifdef _WIN32
m_pOutlinerParent->CreateEx(WS_EX_CLIENTEDGE, NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
0,0,0,0, m_pThreadSplitter->m_hWnd, (HMENU) IDW_THREAD_PANE, NULL );
#else
m_pOutlinerParent->Create( NULL, NULL,
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
CRect(0,0,0,0), m_pThreadSplitter, IDW_THREAD_PANE );
#endif
m_pOutlinerParent->EnableFocusFrame(TRUE);
CreateFolderOutliner();
m_pOutliner = DOWNCAST(CMailNewsOutliner, m_pOutlinerParent->m_pOutliner);
DOWNCAST(CMessageOutliner, m_pOutliner)->SetNews(m_bNews);
m_pOutlinerParent->CreateColumns ( );
int32 prefInt = -1;
PREF_GetIntPref("mailnews.3pane_thread_height", &prefInt);
m_pThreadSplitter->AddPanes(m_pOutlinerParent, m_pMessageView, prefInt, FALSE);
prefInt = -1;
PREF_GetIntPref("mailnews.3pane_folder_width", &prefInt);
m_pFolderSplitter->AddPanes(m_pFolderOutlinerParent, m_pThreadSplitter, prefInt);
CreateMessagePane();
CreateThreadPane();
m_pOutlinerParent->SetFocus();
m_pFocusWnd = m_pOutliner;
// Don't call CMsgListFrame, since we create our list
// differently
}
return res;
}
void C3PaneMailFrame::GetMessageString( UINT nID, CString& rMessage ) const
{
switch (nID) {
case ID_MESSAGE_KILL:
rMessage.LoadString(ID_MESSAGE_KILL);
break;
default:
CMsgListFrame::GetMessageString( nID, rMessage );
}
}
BEGIN_MESSAGE_MAP(C3PaneMailFrame, CMailNewsFrame)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_SETFOCUS()
// File Menu Items
ON_COMMAND(ID_FILE_EMPTYTRASHFOLDER, OnEmptyTrash)
// Edit Menu Items
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
ON_COMMAND(ID_EDIT_SELECTTHREAD, OnSelectThread)
ON_UPDATE_COMMAND_UI(ID_EDIT_SELECTTHREAD, OnUpdateSelectThread)
ON_COMMAND(ID_EDIT_SELECTMARKEDMESSAGES, OnSelectFlagged)
ON_UPDATE_COMMAND_UI(ID_EDIT_SELECTMARKEDMESSAGES, OnUpdateSelectFlagged)
ON_COMMAND(ID_EDIT_SELECTALL, OnSelectAll)
ON_UPDATE_COMMAND_UI(ID_EDIT_SELECTALL, OnUpdateSelectAll)
ON_COMMAND(ID_EDIT_DELETE_3PANE, OnDeleteFrom3Pane)
ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE_3PANE, OnUpdateDeleteFrom3Pane)
// View Menu Items
ON_COMMAND(ID_VIEW_MESSAGE, OnViewMessage)
ON_UPDATE_COMMAND_UI(ID_VIEW_MESSAGE, OnUpdateViewMessage)
ON_COMMAND(ID_VIEW_FOLDER, OnViewFolder)
ON_UPDATE_COMMAND_UI(ID_VIEW_FOLDER, OnUpdateViewFolder)
// Message Menu Items
#ifdef ON_COMMAND_RANGE
ON_COMMAND_RANGE(FIRST_MOVE_MENU_ID, LAST_MOVE_MENU_ID, OnMove )
ON_COMMAND_RANGE(FIRST_COPY_MENU_ID, LAST_COPY_MENU_ID, OnCopy )
ON_UPDATE_COMMAND_UI_RANGE( FIRST_MOVE_MENU_ID, LAST_MOVE_MENU_ID, OnUpdateFile )
ON_UPDATE_COMMAND_UI_RANGE( FIRST_COPY_MENU_ID, LAST_COPY_MENU_ID, OnUpdateFile )
#endif
ON_COMMAND(ID_MESSAGE_KILL, OnIgnore)
ON_UPDATE_COMMAND_UI(ID_MESSAGE_KILL, OnUpdateIgnore)
// Non Menu Items
ON_COMMAND( ID_MESSAGE_CONTINUE, OnContinue )
ON_COMMAND( ID_MESSAGE_SELECT, OnSelect )
ON_COMMAND( ID_FOLDER_SELECT, OnSelectFolder )
ON_COMMAND( ID_FILE_OPENMESSAGE, OnOpen )
ON_UPDATE_COMMAND_UI( ID_FILE_OPENMESSAGE, OnUpdateOpen)
ON_COMMAND( ID_FILE_OPENMESSAGENEW, OnOpenNew )
ON_UPDATE_COMMAND_UI( ID_FILE_OPENMESSAGENEW, OnUpdateOpen)
ON_COMMAND( ID_FILE_OPENMESSAGEREUSE, OnOpenReuse )
ON_UPDATE_COMMAND_UI( ID_FILE_OPENMESSAGEREUSE, OnUpdateOpen)
ON_COMMAND(ID_NAVIGATE_CONTAINER, OnContainer )
ON_UPDATE_COMMAND_UI( ID_MESSAGE_FILE, OnUpdateFile )
ON_COMMAND(ID_FILE_OPENFOLDER, OnOpenNewFrame )
ON_COMMAND(ID_HOTLIST_ADDCURRENTTOHOTLIST, OnFileBookmark)
ON_UPDATE_COMMAND_UI(ID_HOTLIST_ADDCURRENTTOHOTLIST, OnUpdateFileBookmark)
ON_COMMAND(ID_PRIORITY_LOWEST, OnPriorityLowest)
ON_UPDATE_COMMAND_UI(ID_PRIORITY_LOWEST, OnUpdatePriority)
ON_COMMAND(ID_PRIORITY_LOW, OnPriorityLow)
ON_UPDATE_COMMAND_UI(ID_PRIORITY_LOW, OnUpdatePriority)
ON_COMMAND(ID_PRIORITY_NORMAL, OnPriorityNormal)
ON_UPDATE_COMMAND_UI(ID_PRIORITY_NORMAL, OnUpdatePriority)
ON_COMMAND(ID_PRIORITY_HIGH, OnPriorityHigh)
ON_UPDATE_COMMAND_UI(ID_PRIORITY_HIGH, OnUpdatePriority)
ON_COMMAND(ID_PRIORITY_HIGHEST, OnPriorityHighest)
ON_UPDATE_COMMAND_UI(ID_PRIORITY_HIGHEST, OnUpdatePriority)
ON_COMMAND(ID_DONEGETTINGMAIL, OnDoneGettingMail)
ON_MESSAGE(TB_FILLINTOOLTIP, OnFillInToolTip)
ON_MESSAGE(TB_FILLINSTATUS, OnFillInToolbarButtonStatus)
END_MESSAGE_MAP()
void C3PaneMailFrame::HandleGetNNNMessageMenuItem()
{
//News needs to have Get Next N messages and mail doesn't.
CMenu *pMainMenu = GetMenu();
if(pMainMenu)
{
CMenu *pFileMenu = pMainMenu->GetSubMenu(0);
if(pFileMenu)
{
if(!m_bNews)
{
pFileMenu->RemoveMenu(ID_FILE_GETNEXT, MF_BYCOMMAND);
}
else
{
int nGetNNNMessagePosition = WFE_FindMenuItem(pFileMenu, ID_FILE_GETNEXT);
if(nGetNNNMessagePosition == -1)
{
int nGetMessagePosition = WFE_FindMenuItem(pFileMenu, ID_FILE_GETNEWMAIL);
if(nGetMessagePosition != -1)
{
pFileMenu->InsertMenu(nGetMessagePosition + 1, MF_BYPOSITION, ID_FILE_GETNEXT);
}
}
}
}
}
}
void C3PaneMailFrame::SwitchUI( )
{
LPNSTOOLBAR pIToolBar;
m_pChrome->QueryInterface( IID_INSToolBar, (LPVOID *) &pIToolBar );
if ( pIToolBar ) {
CWnd *pToolWnd = CWnd::FromHandlePermanent( pIToolBar->GetHWnd() );
if ( pToolWnd ) {
pIToolBar->RemoveAllButtons();
UINT *aidButtons = m_bNews ? NewsCodes : MailCodes;
int *aidxButtons = m_bNews ? NewsIndices : MailIndices;
int nButtons = (m_bNews ? sizeof(NewsCodes) : sizeof(MailCodes)) /sizeof(UINT);
for(int i = 0; i < nButtons; i++)
{
if ( aidButtons[i] == ID_MESSAGE_FILE ) {
CMailQFButton *pFileButton = new CMailQFButton;
pFileButton->Create( CRect(0,0,0,0), pToolWnd, ID_MESSAGE_FILE);
pIToolBar->AddButton(pFileButton, i);
} else {
CString statusStr, toolTipStr, textStr;
CCommandToolbarButton *pCommandButton = new CCommandToolbarButton;
WFE_ParseButtonString( aidButtons[i], statusStr, toolTipStr, textStr );
DWORD dwButtonStyle = 0;
switch (aidButtons[i]) {
case ID_MESSAGE_MARKBUTTON:
dwButtonStyle |= TB_HAS_IMMEDIATE_MENU;
break;
case ID_MESSAGE_REPLYBUTTON:
case ID_MESSAGE_NEXTUNREAD:
dwButtonStyle |= TB_HAS_TIMED_MENU;
break;
case ID_EDIT_DELETE_3PANE:
dwButtonStyle |= TB_DYNAMIC_TOOLTIP | TB_DYNAMIC_STATUS;
break;
case ID_NAVIGATE_MSG_BACK:
break;
default:
break;
}
pCommandButton->Create( pToolWnd, theApp.m_pToolbarStyle,
CSize(44, 37), CSize(25, 25),
textStr, toolTipStr, statusStr,
m_bNews ? IDR_NEWSTHREAD : IDR_MAILTHREAD,
aidxButtons[i], CSize(23,21),
aidButtons[i], -1, dwButtonStyle);
pIToolBar->AddButton(pCommandButton, i);
}
}
}
pIToolBar->Release();
}
#ifdef _WIN32
if (sysInfo.m_bWin4) {
UINT nIDIcon = m_bNews ? IDR_NEWSTHREAD : IDR_MAILTHREAD;
HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(nIDIcon), RT_GROUP_ICON);
HICON hLargeIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(nIDIcon));
SetIcon(hLargeIcon, TRUE);
HICON hSmallIcon = (HICON) ::LoadImage(hInst,
MAKEINTRESOURCE(nIDIcon),
IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
LR_SHARED);
SetIcon(hSmallIcon, FALSE);
}
#endif
}
void C3PaneMailFrame::SetIsNews( BOOL bNews )
{
if ( bNews != m_bNews ) {
m_bNews = bNews;
SwitchUI();
}
}
void C3PaneMailFrame::SetSort( int idSort )
{
if ( m_pOutliner ) {
m_pOutliner->GetParent()->Invalidate();
m_pOutliner->ScrollIntoView(m_pOutliner->GetFocusLine());
}
}
void C3PaneMailFrame::DoNavigate( MSG_MotionType msgCommand )
{
ASSERT( m_pPane && m_pOutliner );
if ( !m_pPane || !m_pOutliner )
return;
if ( m_nLoadingFolder > 0 )
return;
MSG_ViewIndex viewIndex = (MSG_ViewIndex) m_pOutliner->GetFocusLine();
// Back end really wants -1 if there are no messages.
if ( m_pOutliner->GetTotalLines() < 1 ) {
viewIndex = (MSG_ViewIndex)-1;
}
MSG_ViewIndex resultIndex = viewIndex;
MessageKey key = MSG_GetMessageKey( m_pPane, viewIndex );
MessageKey resultId = key;
MSG_ViewIndex threadIndex;
MSG_FolderInfo *pFolderInfo = NULL;
if ((int) viewIndex >= -1) {
// We don't want to be informed of a selection change if the BE does
// something weird like collapse a thread as part of navigation, since
// we're probably going to select something ourselves.
XP_Bool enable = FALSE;
MSG_NavigateStatus(m_pPane, msgCommand, viewIndex, &enable, NULL);
if (!enable)
return;
m_pOutliner->BlockSelNotify(TRUE);
MSG_ViewNavigate(m_pPane, msgCommand, viewIndex,
&resultId, &resultIndex, &threadIndex, &pFolderInfo);
m_pOutliner->BlockSelNotify(FALSE);
if ( pFolderInfo )
{
C3PaneMailFrame *pFrame = C3PaneMailFrame::FindFrame( pFolderInfo );
if (pFrame) {
pFrame->ActivateFrame();
if (pFolderInfo != pFrame->GetCurFolder()) {
// We must be a category, since we found a frame,
// but our folderInfos don't match
pFrame->m_navPending = msgCommand;
switch ( msgCommand ) {
case MSG_Forward:
case MSG_Back:
pFrame->m_selPending = resultId;
break;
default:
break;
}
pFrame->LoadFolder(pFolderInfo, MSG_MESSAGEKEYNONE, actionNavigation);
} else {
switch ( msgCommand ) {
case MSG_Forward:
case MSG_Back:
case MSG_EditUndo:
case MSG_EditRedo:
pFrame->SelectMessage( resultId );
break;
case MSG_NextFolder:
case MSG_NextMessage:
pFrame->m_pOutliner->SelectItem( -1 );
pFrame->DoNavigate(MSG_FirstMessage);
break;
case MSG_NextUnreadMessage:
case MSG_NextUnreadThread:
case MSG_NextUnreadGroup:
case MSG_LaterMessage:
pFrame->m_pOutliner->SelectItem( -1 );
pFrame->DoNavigate( msgCommand );
default:
break;
}
}
} else {
m_navPending = msgCommand;
switch ( msgCommand ) {
case MSG_NextFolder:
case MSG_NextUnreadGroup:
break;
case MSG_Forward:
case MSG_Back:
m_selPending = resultId;
break;
default:
break;
}
LoadFolder(pFolderInfo, MSG_MESSAGEKEYNONE, actionNavigation);
}
} else if ( resultId != key && (int) resultIndex >= 0 &&
(int) resultIndex < m_pOutliner->GetTotalLines() ) {
m_pOutliner->SelectItem( CASTINT(resultIndex) );
m_pOutliner->ScrollIntoView( CASTINT(resultIndex) );
}
else if ( resultId != key && resultId != MSG_MESSAGEKEYNONE) {
SelectMessage(resultId);
}
}
}
void C3PaneMailFrame::DoUpdateNavigate( CCmdUI* pCmdUI, MSG_MotionType msgCommand )
{
ASSERT( m_pPane && m_pOutliner );
if ( !m_pPane || !m_pOutliner )
return;
XP_Bool enable = FALSE;
MSG_ViewIndex viewIndex = (MSG_ViewIndex) m_pOutliner->GetFocusLine();
// Back end really wants -1 if there are no messages.
if ( m_pOutliner->GetTotalLines() < 1 ) {
viewIndex = (MSG_ViewIndex) -1;
}
if ((int) viewIndex >= -1) {
MSG_NavigateStatus(m_pPane, msgCommand, viewIndex, &enable, NULL);
}
pCmdUI->Enable( enable );
}
void C3PaneMailFrame::LoadFrameMenu(CMenu *pPopup, UINT nIndex)
{
CGenericFrame::LoadFrameMenu(pPopup, nIndex);
//if it's the file menu we want to make sure it's correct
HandleGetNNNMessageMenuItem();
}
int C3PaneMailFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// Add menus to genframe's menu map in order to load these menus
// when they are accessed rather than when frame is first created.
AddToMenuMap(0, IDM_MAILTHREADFILEMENU);
AddToMenuMap(1, IDM_MAILTHREADEDITMENU);
AddToMenuMap(2, IDM_MAILTHREADVIEWMENU);
AddToMenuMap(3, IDM_MAILTHREADGOMENU);
AddToMenuMap(4, IDM_MAILTHREADMESSAGEMENU);
int res = CMailNewsFrame::OnCreate(lpCreateStruct);
if ( res != -1) {
m_pChrome->SetWindowTitle(XP_AppName);
//I'm hardcoding string since I don't want it translated.
m_pChrome->CreateCustomizableToolbar("Messenger", 3, TRUE);
UINT nID = CASTUINT(ID_NAVIGATION_TOOLBAR);
CButtonToolbarWindow *pWindow;
BOOL bOpen, bShowing;
int32 nPos;
//I'm hardcoding because I don't want this translated
m_pChrome->LoadToolbarConfiguration(ID_NAVIGATION_TOOLBAR, CString("Navigation_Toolbar"), nPos, bOpen, bShowing);
// Create tool bar
LPNSTOOLBAR pIToolBar;
m_pChrome->QueryInterface( IID_INSToolBar, (LPVOID *) &pIToolBar );
if ( pIToolBar ) {
pIToolBar->Create( this, WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE|CBRS_TOP );
pIToolBar->SetToolbarStyle( theApp.m_pToolbarStyle );
SwitchUI();
pWindow = new CButtonToolbarWindow(CWnd::FromHandlePermanent(pIToolBar->GetHWnd()), theApp.m_pToolbarStyle, 43, 27, eLARGE_HTAB);
m_pChrome->GetCustomizableToolbar()->AddNewWindow(ID_NAVIGATION_TOOLBAR, pWindow,nPos, 50, 37, 0, CString(szLoadString(nID)),theApp.m_pToolbarStyle, bOpen, FALSE);
m_pChrome->ShowToolbar(ID_NAVIGATION_TOOLBAR, bShowing);
pIToolBar->Release();
}
m_pInfoBar = new CFolderInfoBar;
m_pInfoBar->Create( this, m_pPane );
//I'm hardcoding because I don't want this translated
m_pChrome->LoadToolbarConfiguration(ID_LOCATION_TOOLBAR, CString("Location_Toolbar"), nPos, bOpen, bShowing);
CToolbarWindow *pToolWindow = new CToolbarWindow(m_pInfoBar, theApp.m_pToolbarStyle, 27, 27, eSMALL_HTAB);
m_pChrome->GetCustomizableToolbar()->AddNewWindow(ID_LOCATION_TOOLBAR, pToolWindow,nPos, 27, 27, 0, CString(szLoadString(ID_LOCATION_TOOLBAR)),theApp.m_pToolbarStyle, bOpen, FALSE);
m_pChrome->ShowToolbar(ID_LOCATION_TOOLBAR, bShowing);
m_barStatus.Create( this );
m_barStatus.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
LPNSSTATUSBAR pIStatusBar = NULL;
m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->Attach( &m_barStatus );
pIStatusBar->Release();
}
RecalcLayout();
}
if ( res != -1) {
g_pLast3PaneMailFrame = this;
} else {
g_pLast3PaneMailFrame = NULL;
}
return res;
}
#ifndef ON_COMMAND_RANGE
BOOL C3PaneMailFrame::OnCommand( WPARAM wParam, LPARAM lParam )
{
UINT nID = wParam;
if ( nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID ) {
OnMove( nID );
return TRUE;
}
if ( nID >= FIRST_COPY_MENU_ID && nID <= LAST_COPY_MENU_ID ) {
OnCopy( nID );
return TRUE;
}
return CMsgListFrame::OnCommand( wParam, lParam );
}
BOOL C3PaneMailFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (nCode == CN_UPDATE_COMMAND_UI) {
CCmdUI* pCmdUI = (CCmdUI*)pExtra;
if ( nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID ) {
OnUpdateFile( pCmdUI );
return TRUE;
}
if ( nID >= FIRST_COPY_MENU_ID && nID <= LAST_COPY_MENU_ID ) {
OnUpdateFile( pCmdUI );
return TRUE;
}
}
return CMsgListFrame::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
#endif
void C3PaneMailFrame::OnClose()
{
int16 left, top, width, height;
int32 prefInt;
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(&wp);
CRect rect(wp.rcNormalPosition);
left = (int16) rect.left;
top = (int16) rect.top;
width = (int16) rect.Width();
height = (int16) rect.Height();
prefInt = wp.showCmd;
PREF_SetRectPref("mailnews.thread_window_rect", left, top, width, height);
PREF_SetIntPref("mailnews.thread_window_showwindow", prefInt);
PREF_SetIntPref("mailnews.3pane_folder_width", m_pFolderSplitter->GetPaneSize());
PREF_SetIntPref("mailnews.3pane_thread_height", m_pThreadSplitter->GetPaneSize());
//I'm hardcoding because I don't want this translated
m_pChrome->SaveToolbarConfiguration(ID_NAVIGATION_TOOLBAR, CString("Navigation_Toolbar"));
m_pChrome->SaveToolbarConfiguration(ID_LOCATION_TOOLBAR, CString("Location_Toolbar"));
CMailNewsFrame::OnClose();
}
void C3PaneMailFrame::OnDestroy()
{
if (m_pAttachmentData)
MSG_FreeAttachmentList(m_pMessagePane, m_pAttachmentData);
m_pAttachmentData = NULL;
DestroyMessagePane();
if ( m_pFolderPane ) {
// Ditto...
MSG_Pane *pTemp = m_pFolderPane;
m_pFolderPane = NULL;
//otherwise folder pane sometimes gets accessed on quit
m_pFolderOutliner->SetPane(NULL);
MSG_DestroyPane( pTemp );
}
CView *pView = (CView *) GetDescendantWindow(IDW_MESSAGE_PANE, TRUE);
ASSERT(pView && pView->IsKindOf(RUNTIME_CLASS(CNetscapeView)));
if(pView)
((CNetscapeView *)pView)->FrameClosing();
CMsgListFrame::OnDestroy();
}
void C3PaneMailFrame::OnSetFocus(CWnd* pOldWnd)
{
CMsgListFrame::OnSetFocus(pOldWnd);
if (!m_pFocusWnd)
m_pFocusWnd = m_pOutliner;
m_pFocusWnd->SetFocus();
}
// Edit Menu Items
void C3PaneMailFrame::OnSelectThread()
{
( (CMessageOutliner *) m_pOutliner)->SelectThread( -1 );
}
void C3PaneMailFrame::OnUpdateSelectThread ( CCmdUI* pCmdUI )
{
BOOL bEnable = TRUE;
bEnable &= MSG_GetToggleStatus( m_pPane, MSG_SortByThread, NULL, 0) == MSG_Checked;
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
bEnable &= (count > 0);
pCmdUI->Enable( bEnable );
}
void C3PaneMailFrame::OnSelectFlagged()
{
( (CMessageOutliner *) m_pOutliner)->SelectFlagged();
}
void C3PaneMailFrame::OnUpdateSelectFlagged( CCmdUI *pCmdUI )
{
// We should probably only do this when there are
// flagged messages in the view, but that's probably
// too expensive
pCmdUI->Enable( TRUE );
}
#define IS_IN_WINDOW(hParent,hChild)\
(((hParent) == (hChild)) || ::IsChild(hParent, hChild))
void C3PaneMailFrame::OnSelectAll()
{
HWND hwndFocus = ::GetFocus();
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
HWND hwndView = NULL;
CWinCX* pContext = GetActiveWinContext();
if (pContext) {
hwndView = pContext->GetPane();
}
BOOL bEnable = TRUE;
UINT nID = IDS_MENU_ALL;
if (IS_IN_WINDOW(hwndOutliner, hwndFocus)) {
if (MSG_GetToggleStatus(m_pPane, MSG_SortByThread, NULL, 0) == MSG_Checked)
((CMessageOutliner*)m_pOutliner)->SelectAllMessages();
m_pOutliner->SelectRange( 0, -1, TRUE );
} else if (hwndView == hwndFocus){
LO_SelectAll(pContext->GetDocumentContext());
}
}
void C3PaneMailFrame::OnUpdateSelectAll( CCmdUI *pCmdUI )
{
HWND hwndFocus = ::GetFocus();
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
HWND hwndView = NULL;
CWinCX* pContext = GetActiveWinContext();
if (pContext) {
hwndView = pContext->GetPane();
}
BOOL bEnable = TRUE;
UINT nID = IDS_MENU_ALL;
if (IS_IN_WINDOW(hwndOutliner, hwndFocus)) {
nID = IDS_MENU_ALLMESSAGES;
bEnable = m_pOutliner->GetTotalLines() > 0;
} else if (hwndView != hwndFocus){
bEnable = FALSE;
}
pCmdUI->SetText(szLoadString(nID));
pCmdUI->Enable(bEnable);
}
void C3PaneMailFrame::OnUpdateDeleteFrom3Pane(CCmdUI* pCmdUI)
{
if(IsThreadFocus() || IsMessageFocus())
{
OnUpdateDeleteMessage(pCmdUI);
}
else
{
OnUpdateDeleteFolder(pCmdUI);
}
}
void C3PaneMailFrame::OnDeleteFrom3Pane()
{
if(IsThreadFocus() || IsMessageFocus())
{
OnDeleteMessage();
}
else
{
PrepareForDeleteFolder();
OnDeleteFolder();
}
}
// Message Menu Items
void C3PaneMailFrame::OnMove(UINT nID)
{
if ( m_pPane ) {
MSG_FolderInfo *folderInfo = FolderInfoFromMenuID( nID );
ASSERT(folderInfo);
if (folderInfo) {
MSG_FolderLine folderLine;
MSG_GetFolderLineById( WFE_MSGGetMaster(), folderInfo, &folderLine );
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
// We want to make file behave for newsgroups
if ( folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ) {
MSG_CopyMessagesIntoFolder( m_pPane, indices, count, folderInfo);
} else {
MSG_MoveMessagesIntoFolder( m_pPane, indices, count, folderInfo);
}
ModalStatusBegin( MODAL_DELAY );
}
}
}
void C3PaneMailFrame::OnCopy(UINT nID)
{
if ( m_pPane ) {
MSG_FolderInfo *folderInfo = FolderInfoFromMenuID( nID );
ASSERT(folderInfo);
if (folderInfo) {
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
MSG_CopyMessagesIntoFolder( m_pPane, indices, count, folderInfo);
ModalStatusBegin( MODAL_DELAY );
}
}
}
void C3PaneMailFrame::OnUpdateFile( CCmdUI *pCmdUI )
{
//note you can get in here if m_nID == ID_MESSAGE_FILE or
//if in the move and copy ranges. So we have to make sure it
//works for all of those scenarios.
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
// find the desired effect
MSG_DragEffect request = (pCmdUI->m_nID >= FIRST_MOVE_MENU_ID &&
pCmdUI->m_nID <= LAST_MOVE_MENU_ID) ?
MSG_Require_Move : MSG_Require_Copy;
// find the id
int nID = (request == MSG_Require_Move) ?
pCmdUI->m_nID - FIRST_MOVE_MENU_ID :
pCmdUI->m_nID - FIRST_COPY_MENU_ID;
// get the folderInfo
MSG_FolderInfo *folderInfo = NULL;
MSG_DragEffect effect = MSG_Drag_Not_Allowed;
if(pCmdUI->m_nID != ID_MESSAGE_FILE &&
(request == MSG_Require_Move && pCmdUI->m_nID >=FIRST_MOVE_MENU_ID
&& pCmdUI->m_nID <=LAST_MOVE_MENU_ID) ||
(request == MSG_Require_Copy && pCmdUI->m_nID >=FIRST_COPY_MENU_ID
&& pCmdUI->m_nID <=LAST_COPY_MENU_ID))
{
folderInfo = FolderInfoFromMenuID(pCmdUI->m_nID);
}
if(pCmdUI->m_nID != ID_MESSAGE_FILE && folderInfo)
{
effect = MSG_DragMessagesIntoFolderStatus(m_pPane,
NULL, 0, folderInfo, request);
}
BOOL bEnable = count > 0 && (pCmdUI->m_nID == ID_MESSAGE_FILE ||
(pCmdUI->m_pSubMenu || effect != MSG_Drag_Not_Allowed));
// BOOL bEnable = count > 0;
if (pCmdUI->m_pSubMenu) {
pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
MF_BYPOSITION |(bEnable ? MF_ENABLED : MF_GRAYED));
} else {
pCmdUI->Enable( bEnable );
}
}
void C3PaneMailFrame::OnViewMessage()
{
MSG_FolderInfo *folderInfo = GetCurFolder();
if ( folderInfo ) {
if (m_pThreadSplitter->IsOnePaneClosed()) {
CFolderFrame::SetFolderPref( folderInfo, MSG_FOLDER_PREF_ONEPANE );
m_pThreadSplitter->SetPaneSize(m_pOutlinerParent, m_pThreadSplitter->GetPreviousPaneSize());
SendMessage(WM_COMMAND, ID_MESSAGE_SELECT, 0);
} else {
CFolderFrame::ClearFolderPref( folderInfo, MSG_FOLDER_PREF_ONEPANE );
m_pThreadSplitter->SetPaneSize(m_pMessageView, 0);
}
}
}
void C3PaneMailFrame::OnUpdateViewMessage( CCmdUI *pCmdUI )
{
pCmdUI->SetCheck(!m_pThreadSplitter->IsOnePaneClosed());
pCmdUI->Enable( TRUE );
}
void C3PaneMailFrame::OnViewFolder()
{
if (m_pFolderSplitter->IsOnePaneClosed()) {
m_pFolderOutlinerParent->EnableWindow(TRUE);
m_pFolderOutliner->EnableWindow(TRUE);
MSG_FolderInfo *pFolderInfo = MSG_GetCurFolder(m_pPane);
UpdateFolderPane(pFolderInfo);
m_pFolderSplitter->SetPaneSize(m_pFolderOutlinerParent, m_pFolderSplitter->GetPreviousPaneSize());
}
else
{
m_pFolderSplitter->SetPaneSize(m_pFolderOutlinerParent , 0);
}
}
void C3PaneMailFrame::OnUpdateViewFolder( CCmdUI *pCmdUI )
{
pCmdUI->SetCheck(!m_pFolderSplitter->IsOnePaneClosed());
pCmdUI->Enable( TRUE );
}
// Message Menu Items
void C3PaneMailFrame::OnIgnore()
{
DoNavigate((MSG_MotionType) MSG_ToggleThreadKilled);
}
void C3PaneMailFrame::OnUpdateIgnore(CCmdUI *pCmdUI)
{
pCmdUI->SetText(szLoadString(IDS_MENU_IGNORETHREAD));
DoUpdateCommand(pCmdUI, MSG_ToggleThreadKilled);
}
void C3PaneMailFrame::OnSelectFolder()
{
if (m_bBlockingFolderSelection)
return;
MSG_FolderLine folderLine;
if (GetSelectedFolder(&folderLine))
{
C3PaneMailFrame* pFrame = NULL;
if (!m_pPane)
CreateThreadPane();
ASSERT(m_pPane);
MSG_FolderInfo *folderInfo = MSG_GetCurFolder(m_pPane);
if (folderLine.id == folderInfo)
{
m_pInfoBar->Update();
if (folderLine.total == m_pOutliner->GetTotalLines())
return;
}
// check if folder has loaded in other window
pFrame = FindFrame(folderLine.id);
if (pFrame)
{
if (pFrame != this)
{
pFrame->ActivateFrame();
// set selection back to original one when doing a double click
int nIndex = m_pFolderOutliner->GetCurrentSelected();
if (nIndex != -1)
{
m_pFolderOutliner->SelectItem(nIndex);
m_pFolderOutliner->ScrollIntoView(nIndex);
}
}
}
else
LoadFolder(folderLine.id, MSG_MESSAGEKEYNONE, m_actionOnLoad);
}
else
{
BlankOutThreadPane();
BlankOutMessagePane(NULL);
}
}
void C3PaneMailFrame::OnSelect()
{
if (!m_pPane)
return; // Abort!
MessageKey idLoad = MSG_MESSAGEIDNONE;
MSG_FolderInfo *folderInfo = MSG_GetCurFolder( m_pPane );
// Make sure we need to load a message
if ( m_pOutliner ) {
MSG_MessageLine messageLine;
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
if ( count == 1 &&
MSG_GetThreadLineByIndex( m_pPane, indices[0], 1, &messageLine ) &&
!m_pThreadSplitter->IsOnePaneClosed() ) {
idLoad = messageLine.messageKey;
if (!m_bNoScrollHack) {
m_pOutliner->ScrollIntoView( CASTINT(indices[0]) );
}
}
}
if (!m_pMessagePane)
return; // Abort!
// Make sure we aren't already displaying the message
MessageKey idCur;
MSG_FolderInfo *folderInfoCur;
MSG_ViewIndex idxCur;
MSG_GetCurMessage( m_pMessagePane, &folderInfoCur, &idCur, &idxCur );
if ( idCur != idLoad || folderInfo != folderInfoCur ) {
// Our null document doesn't clear the title.
if (idLoad == MSG_MESSAGEIDNONE)
BlankOutMessagePane(folderInfo);
else
MSG_LoadMessage( m_pMessagePane, folderInfo, idLoad );
}
// Sync our info bar
m_pInfoBar->Update();
m_bNoScrollHack = FALSE;
}
void C3PaneMailFrame::DoOpenMessage(BOOL bReuse)
{
if (m_pOutliner) {
MSG_ViewIndex *indices;
int i, count;
m_pOutliner->GetSelection(indices, count);
for ( i = 0; i < count; i++ ) {
MSG_FolderInfo *folderInfo = MSG_GetCurFolder( m_pPane );
MessageKey id = MSG_GetMessageKey(m_pPane, indices[i]);
if ( folderInfo && id != MSG_MESSAGEKEYNONE ) {
MSG_FolderLine folderLine;
MSG_GetFolderLineById( WFE_MSGGetMaster(), folderInfo, &folderLine );
if (folderLine.flags &
(MSG_FOLDER_FLAG_DRAFTS |
MSG_FOLDER_FLAG_QUEUE |
MSG_FOLDER_FLAG_TEMPLATES)) {
MSG_OpenDraft (m_pPane, folderInfo, id);
} else {
CMessageFrame *pFrame = CMessageFrame::FindFrame( folderInfo, id );
if ( !pFrame ) {
if ( bReuse && i == 0 ) {
pFrame = GetLastMessageFrame();
}
if ( pFrame ) {
pFrame->LoadMessage( folderInfo, id );
} else {
pFrame = CMessageFrame::Open( folderInfo, id );
}
}
if ( pFrame ) {
pFrame->ActivateFrame();
}
}
int nPreviousSel = ((CMessageOutliner*)m_pOutliner)->GetCurrentSelected();
if (-1 != nPreviousSel)
{
m_pOutliner->SelectItem(nPreviousSel);
m_pOutliner->ScrollIntoView(nPreviousSel);
}
}
}
}
m_pInfoBar->Update();
}
void C3PaneMailFrame::OnOpen( )
{
BOOL bReuse = g_MsgPrefs.m_bMessageReuse;
if (GetKeyState(VK_MENU) & 0x8000)
bReuse = !bReuse;
DoOpenMessage(bReuse);
}
void C3PaneMailFrame::OnOpenNew( )
{
DoOpenMessage(FALSE);
}
void C3PaneMailFrame::OnOpenReuse( )
{
DoOpenMessage(TRUE);
}
void C3PaneMailFrame::OnUpdateOpen(CCmdUI *pCmdUI)
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
pCmdUI->Enable(count > 0);
}
void C3PaneMailFrame::OnOpenNewFrame()
{
if (GetFocus() == m_pFolderOutliner)
{
MSG_FolderLine folderLine;
if (GetSelectedFolder(&folderLine))
{
if (folderLine.level > 1)
{
Open(folderLine.id);
if (!g_MsgPrefs.m_bThreadReuse)
{
int nIndex = m_pFolderOutliner->GetCurrentSelected();
if (nIndex != -1)
{
m_pFolderOutliner->SelectItem(nIndex);
m_pFolderOutliner->ScrollIntoView(nIndex);
}
}
}
}
}
}
void C3PaneMailFrame::OnContinue()
{
CWinCX * pCX = GetMainWinContext();
if(pCX->GetOriginY() + pCX->GetHeight() < pCX->GetDocumentHeight()) {
pCX->Scroll(SB_VERT, SB_PAGEDOWN, 0, NULL);
} else if (!pCX->IsLayingOut()) {
DoNavigate( MSG_NextUnreadMessage );
}
}
void C3PaneMailFrame::OnContainer()
{
MSG_FolderInfo *folderInfo = MSG_GetCurFolder( m_pPane );
if ( folderInfo ) {
CFolderFrame::Open( folderInfo );
}
}
void C3PaneMailFrame::DoPriority( MSG_PRIORITY priority )
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
for (int i = 0; i < count; i++) {
MSG_SetPriority( m_pPane,
MSG_GetMessageKey( m_pPane, indices[i] ),
priority );
}
}
void C3PaneMailFrame::OnPriorityLowest()
{
DoPriority( MSG_LowestPriority );
}
void C3PaneMailFrame::OnPriorityLow()
{
DoPriority( MSG_LowPriority );
}
void C3PaneMailFrame::OnPriorityNormal()
{
DoPriority( MSG_NormalPriority );
}
void C3PaneMailFrame::OnPriorityHigh()
{
DoPriority( MSG_HighPriority );
}
void C3PaneMailFrame::OnPriorityHighest()
{
DoPriority( MSG_HighestPriority );
}
void C3PaneMailFrame::OnUpdatePriority(CCmdUI *pCmdUI)
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices,count);
pCmdUI->Enable( !m_bNews && (count > 0) );
}
void C3PaneMailFrame::OnDoneGettingMail()
{
MSG_ViewIndex resultIndex = 0;
MessageKey resultId = MSG_MESSAGEKEYNONE;
MSG_ViewIndex threadIndex = 0;
MSG_FolderInfo *pFolderInfo = NULL;
// We don't want to be informed of a selection change if the BE does
// something weird like collapse a thread as part of navigation, since
// we're probably going to select something ourselves.
m_pOutliner->BlockSelNotify(TRUE);
MSG_ViewNavigate(m_pPane, MSG_FirstNew, 0,
&resultId, &resultIndex, &threadIndex, &pFolderInfo);
m_pOutliner->BlockSelNotify(FALSE);
if (resultId != MSG_MESSAGEKEYNONE) {
resultIndex = MSG_GetMessageIndexForKey(m_pPane, resultId, TRUE);
m_pOutliner->ScrollIntoView(CASTINT(resultIndex));
}
}
void C3PaneMailFrame::DoUndoNavigate( MSG_MotionType motionCmd )
{
MessageKey key = MSG_MESSAGEKEYNONE;
MSG_FolderInfo *folder = NULL;
if (!m_pPane || !m_pOutliner) return;
UndoStatus undoStatus = MSG_GetUndoStatus(m_pPane);
if ( UndoComplete == undoStatus ) {
if (MSG_GetUndoMessageKey(m_pPane, &folder, &key) && folder) {
if (GetCurFolder() == folder) {
SelectMessage(key);
}
else {
/* need to load new folder */
m_navPending = motionCmd;
m_selPending = key;
LoadFolder(folder, MSG_MESSAGEKEYNONE, actionNavigation);
}
}
}
}
// File Menu Items
void C3PaneMailFrame::OnEmptyTrash()
{
MSG_FolderLine folderLine;
MSG_FolderInfo *curFolderInfo = MSG_GetCurFolder( m_pPane );
if (MSG_GetFolderLineById(WFE_MSGGetMaster(), curFolderInfo, &folderLine))
{
if (folderLine.flags & MSG_FOLDER_FLAG_TRASH)
{
BlankOutThreadPane();
BlankOutMessagePane(curFolderInfo);
}
}
CMailNewsFrame::OnEmptyTrash();
}
// Edit Menu Items
void C3PaneMailFrame::OnEditUndo()
{
DoCommand(MSG_Undo);
DoUndoNavigate(MSG_EditUndo);
}
void C3PaneMailFrame::OnEditRedo()
{
DoCommand(MSG_Redo);
DoUndoNavigate(MSG_EditRedo);
}
//lpttt->szText can only hold 80 characters
#define MAX_TOOLTIP_CHARS 79
//status can only hold 1000 characters
#define MAX_STATUS_CHARS 999
LRESULT C3PaneMailFrame::OnFillInToolTip(WPARAM wParam, LPARAM lParam)
{
HWND hwnd = (HWND)wParam;
LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam;
CToolbarButton *pButton = (CToolbarButton *)CWnd::FromHandle(hwnd);
UINT nCommand = pButton->GetButtonCommand();
const char * pText = "";
if(nCommand == ID_EDIT_DELETE_3PANE)
{
if(IsThreadFocus() || IsMessageFocus())
{
pText = szLoadString(IDS_DELETEMESSAGE_TOOLTIP);
}
else
{
pText = szLoadString(IDS_DELETEFOLDER_TOOLTIP);
}
}
strncpy(lpttt->szText, pText, MAX_TOOLTIP_CHARS);
return 1;
}
LRESULT C3PaneMailFrame::OnFillInToolbarButtonStatus(WPARAM wParam, LPARAM lParam)
{
UINT nCommand = LOWORD(wParam);
char *pStatus = (char*)lParam;
const char * pText = "";
if(nCommand == ID_EDIT_DELETE_3PANE)
{
if(IsThreadFocus() || IsMessageFocus())
{
pText = szLoadString(IDS_DELETEMESSAGE_STATUS);
}
else
{
pText = szLoadString(IDS_DELETEFOLDER_STATUS);
}
}
strncpy(pStatus, pText, MAX_TOOLTIP_CHARS);
return 1;
}
void C3PaneMailFrame::SelectMessage( MessageKey key )
{
MSG_ViewIndex index =
MSG_GetMessageIndexForKey( m_pPane, key, TRUE );
if ( index != MSG_VIEWINDEXNONE ) {
m_pOutliner->SelectItem( CASTINT(index) );
m_pOutliner->ScrollIntoView(CASTINT(index));
}
}
void C3PaneMailFrame::CreateThreadPane()
{
m_pPane = MSG_CreateThreadPane(GetMainContext()->GetContext(), m_pMaster);
if (m_pPane)
{
if (m_pOutliner)
m_pOutliner->SetPane(m_pPane);
MSG_SetFEData( m_pPane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) this );
#ifdef MOZ_NEWADDR
AB_SetShowPropertySheetForEntryFunc(m_pPane, ShowPropertySheetForEntry);
#endif
if (m_pInfoBar)
m_pInfoBar->SetPane(m_pPane);
}
}
void C3PaneMailFrame::CreateMessagePane()
{
m_pMessagePane = MSG_CreateMessagePane(GetMainContext()->GetContext(), m_pMaster );
if (m_pMessagePane)
{
MSG_SetFEData( m_pMessagePane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) this );
MSG_SetMessagePaneCallbacks(m_pMessagePane, &MsgPaneCB, NULL);
}
}
void C3PaneMailFrame::CreateFolderOutliner()
{
m_pFolderOutlinerParent = new CFolderOutlinerParent;
#ifdef _WIN32
m_pFolderOutlinerParent->CreateEx(WS_EX_CLIENTEDGE, NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
0,0,0,0, m_pFolderSplitter->m_hWnd, (HMENU) IDW_FOLDER_PANE, NULL );
#else
m_pFolderOutlinerParent->Create( NULL, NULL,
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
CRect(0,0,0,0), m_pFolderSplitter, IDW_FOLDER_PANE );
#endif
m_pFolderOutlinerParent->EnableFocusFrame(TRUE);
m_pFolderPane = MSG_CreateFolderPane( GetMainContext()->GetContext(), m_pMaster );
m_pFolderOutliner = DOWNCAST(CFolderOutliner, m_pFolderOutlinerParent->m_pOutliner);
m_pFolderOutlinerParent->CreateColumns ( );
m_pFolderOutliner->SetPane(m_pFolderPane);
MSG_SetFEData( m_pFolderPane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) this );
}
void C3PaneMailFrame::UpdateFolderPane(MSG_FolderInfo *pFolderInfo)
{
if (m_pFolderOutliner && m_pFolderPane)
{
MSG_ViewIndex *indices;
int count;
m_pFolderOutliner->GetSelection( indices, count );
MSG_ViewIndex index = MSG_GetFolderIndexForInfo(m_pFolderPane,
pFolderInfo, TRUE);
if (index != MSG_VIEWINDEXNONE && indices[0] != index)
m_pFolderOutliner->SelectItem( CASTINT(index) );
}
}
BOOL C3PaneMailFrame::GetSelectedFolder(MSG_FolderLine* pFolderLine)
{
if (m_pFolderOutliner && m_pFolderPane)
{
MSG_ViewIndex *indices;
int count = 0;
m_pFolderOutliner->GetSelection(indices, count);
if (count == 1 &&
MSG_GetFolderLineByIndex(m_pFolderPane, indices[0], 1, pFolderLine))
return TRUE;
else
{
int nIndex = m_pFolderOutliner->GetCurrentSelected();
if (count == 0)
{
indices[0] = nIndex;
if (MSG_GetFolderLineByIndex(m_pFolderPane, indices[0], 1, pFolderLine))
return TRUE;
}
else
{
ASSERT(m_pPane);
if (m_pPane)
{
MSG_FolderInfo *pFolderInfo = MSG_GetCurFolder( m_pPane );
if (pFolderInfo && MSG_GetFolderLineById(m_pMaster, pFolderInfo, pFolderLine))
return TRUE;
}
}
}
}
return FALSE;
}
void C3PaneMailFrame::PrepareForDeleteFolder()
{
MSG_FolderLine folderLine;
if (GetSelectedFolder(&folderLine))
{
BlankOutMessagePane(folderLine.id);
DestroyMessagePane();
CreateMessagePane();
BlankOutThreadPane();
MSG_Pane *pTemp = m_pPane;
m_pPane = NULL;
MSG_DestroyPane(pTemp);
CreateThreadPane();
m_bBlockingFolderSelection = TRUE;
}
}
void C3PaneMailFrame::BlankOutThreadPane()
{
m_pOutliner->SelectItem(-1);
m_pOutliner->SetTotalLines(0);
m_pOutliner->Invalidate();
m_pOutliner->UpdateWindow();
}
void C3PaneMailFrame::BlankOutMessagePane(MSG_FolderInfo *pFolderInfo)
{
if (m_pMessagePane)
{
MSG_LoadMessage(m_pMessagePane, pFolderInfo, MSG_MESSAGEKEYNONE);
m_pChrome->SetDocumentTitle("");
m_pMessageView->SetAttachments(NULL, 0);
}
}
void C3PaneMailFrame::DestroyMessagePane()
{
if (m_pMessagePane) {
// Since MSG_DestroyPane can result in notifications that
// we may attempt to act upon with the dying pane, NULL
// it out first
MSG_Pane *pTemp = m_pMessagePane;
m_pMessagePane = NULL;
MSG_DestroyPane( pTemp );
}
}
void C3PaneMailFrame::BlankOutRightPanes()
{
MSG_FolderInfo *pCurFolderInfo = MSG_GetCurFolder( m_pPane );
if (pCurFolderInfo)
BlankOutMessagePane(pCurFolderInfo);
DestroyMessagePane();
CreateMessagePane();
BlankOutThreadPane();
MSG_Pane *pTemp = m_pPane;
m_pPane = NULL;
MSG_DestroyPane(pTemp);
CreateThreadPane();
}
void C3PaneMailFrame::CheckForChangeFocus()
{
MSG_FolderInfo* pFolderInfo = NULL;
MSG_FolderLine folderLine;
if (m_pPane)
pFolderInfo = MSG_GetCurFolder(m_pPane);
if (m_pFolderOutliner && m_pFolderPane)
{
MSG_ViewIndex *indices;
int count = 0;
m_pFolderOutliner->GetSelection(indices, count);
if (count == 1)
MSG_GetFolderLineByIndex(m_pFolderPane, indices[0], 1, &folderLine);
}
if (!pFolderInfo || (pFolderInfo != folderLine.id))
m_pOutliner->SetFocus();
}
void C3PaneMailFrame::LoadFolder( MSG_FolderInfo *folderInfo, MessageKey key, int action )
{
MSG_FolderInfo *curFolderInfo = MSG_GetCurFolder( m_pPane );
if (curFolderInfo != folderInfo && m_pPane)
{
//remember last message
MessageKey lastKey = GetCurMessage();
MSG_SetLastMessageLoaded(curFolderInfo, lastKey);
if ( key == MSG_MESSAGEKEYNONE )
{
m_actionOnLoad = action;
}
else
{
m_actionOnLoad = actionSelectKey;
m_selPending = key;
}
BlankOutMessagePane(folderInfo);
UIForFolder( folderInfo );
if (m_nLoadingFolder == 0)
{
m_nLoadingFolder++; // FYI
m_pOutliner->BlockSelNotify(TRUE);
}
MSG_LoadFolder( m_pPane, folderInfo );
}
}
MessageKey C3PaneMailFrame::GetCurMessage() const
{
MessageKey res = MSG_MESSAGEKEYNONE;
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
if ( count == 1 ) {
res = MSG_GetMessageKey( m_pPane, indices[0] );
}
return res;
}
MSG_FolderInfo *C3PaneMailFrame::GetCurFolder() const
{
return m_pPane ? MSG_GetCurFolder( m_pPane ) : NULL;
}
LPCTSTR C3PaneMailFrame::GetWindowMenuTitle()
{
static CString cs;
cs.LoadString(m_bNews ? IDS_NEWSGROUPCOLON : IDS_FOLDERCOLON);
CString csTitle;
csTitle.LoadString(IDS_NOTITLE);
MSG_FolderLine folderLine;
MSG_FolderInfo *folderInfo;
folderInfo = MSG_GetCurFolder(m_pPane);
if ( folderInfo && MSG_GetFolderLineById( m_pMaster, folderInfo, &folderLine ) ) {
csTitle = folderLine.prettyName && folderLine.prettyName[0] ?
folderLine.prettyName :
folderLine.name;
}
cs += csTitle;
return cs;
}
void C3PaneMailFrame::OnFileBookmark()
{
FileBookmark();
}
void C3PaneMailFrame::OnUpdateFileBookmark(CCmdUI *pCmdUI)
{
pCmdUI->Enable(GetCurFolder() != NULL);
}
BOOL C3PaneMailFrame::FileBookmark()
{
BOOL res = FALSE;
MSG_ViewIndex *indices = NULL;
int count = 0;
m_pOutliner->GetSelection(indices, count);
if (count < 1) {
// Add bookmark to folder
MSG_FolderLine folderLine;
MSG_FolderInfo *folderInfo = MSG_GetCurFolder(m_pPane);
if ( folderInfo && MSG_GetFolderLineById( m_pMaster, folderInfo, &folderLine ) ) {
URL_Struct *url = MSG_ConstructUrlForPane(m_pPane);
if (url) {
const char *name = (folderLine.prettyName && folderLine.prettyName[0]) ?
folderLine.prettyName : folderLine.name;
HT_AddBookmark(url->address, (char*)name); // Updated to Aurora (Dave H.)
NET_FreeURLStruct( url );
res = TRUE;
}
}
} else {
// Add bookmark to each selected message
MSG_MessageLine messageLine;
for (int i = 0; i < count; i++) {
if (MSG_GetThreadLineByIndex(m_pPane, indices[i], 1, &messageLine)) {
URL_Struct *url = MSG_ConstructUrlForMessage( m_pPane, messageLine.messageKey );
char *buf = IntlDecodeMimePartIIStr(messageLine.subject, INTL_DocToWinCharSetID(m_iCSID), FALSE);
char *name = (buf && buf[0]) ? buf : messageLine.subject;
if ( url ) {
HT_AddBookmark(url->address, (char*)name); // Updated to Aurora (Dave H.)
NET_FreeURLStruct( url );
res = TRUE;
}
XP_FREEIF(buf);
}
}
}
return res;
}
void C3PaneMailFrame::SetFocusWindowBackToFrame()
{
CWnd* pWnd = GetFocus();
if (m_pFocusWnd != pWnd)
m_pFocusWnd->SetFocus();
}
BOOL C3PaneMailFrame::MessageViewClosed()
{
return m_pThreadSplitter->IsOnePaneClosed();
}
C3PaneMailFrame *C3PaneMailFrame::FindFrame( MSG_FolderInfo *folderInfo )
{
CGenericFrame *pFrame = theApp.m_pFrameList;
while (pFrame) {
if (pFrame->IsKindOf(RUNTIME_CLASS(C3PaneMailFrame))) {
C3PaneMailFrame *pThreadFrame = DYNAMIC_DOWNCAST(C3PaneMailFrame, pFrame);
MSG_FolderInfo *folderInfo2 = pThreadFrame->GetCurFolder();
if (folderInfo == folderInfo2)
return pThreadFrame;
}
pFrame = pFrame->m_pNext;
}
return NULL;
}
C3PaneMailFrame *C3PaneMailFrame::Open( )
{
g_MsgPrefs.m_pThreadTemplate->OpenDocumentFile( NULL );
return g_pLast3PaneMailFrame;
}
C3PaneMailFrame *C3PaneMailFrame::Open
( MSG_FolderInfo *folderInfo, MessageKey key, BOOL* pContinue )
{
BOOL bReuse = g_MsgPrefs.m_bThreadReuse;
if (GetKeyState(VK_MENU) & 0x8000)
bReuse = !bReuse;
C3PaneMailFrame *pFrame = FindFrame( folderInfo );
MSG_FolderInfo *pCurrentFolder = NULL;
if (pFrame)
pCurrentFolder = MSG_GetCurFolder( pFrame->m_pPane );
if ( pFrame && (bReuse || (folderInfo == pCurrentFolder)))
{
if (folderInfo != MSG_GetCurFolder( pFrame->m_pPane ))
pFrame->LoadFolder(folderInfo, key);
else
{
if ( key != MSG_MESSAGEKEYNONE )
pFrame->SelectMessage( key );
else
{
if (pFrame->m_nLoadingFolder && pContinue)
*pContinue = TRUE;
}
}
if (s_bGetMail)
pFrame->PostMessage(WM_COMMAND, (WPARAM) ID_FILE_GETNEWMAIL, (LPARAM) 0);
if (pContinue && *pContinue)
return pFrame;
}
else
{
if ( !bReuse || !(pFrame = CMailNewsFrame::GetLastThreadFrame()) )
{
// Try to bring up the right UI the first time.
MSG_FolderLine folderLine;
MSG_GetFolderLineById(WFE_MSGGetMaster(), folderInfo, &folderLine);
s_bHintNews = !(folderLine.flags & MSG_FOLDER_FLAG_MAIL);
pFrame = C3PaneMailFrame::Open();
if (pFrame)
{
if (pFrame->m_pFolderOutliner && pFrame->m_pFolderPane)
{
MSG_ViewIndex index = MSG_GetFolderIndexForInfo(pFrame->m_pFolderPane,
folderInfo, TRUE);
if (index != MSG_VIEWINDEXNONE)
pFrame->m_pFolderOutliner->SelectItem( CASTINT(index) );
}
pFrame->m_pOutliner->Invalidate();
pFrame->m_pFolderOutliner->Invalidate();
pFrame->m_pMessageView->Invalidate();
pFrame->UpdateWindow();
}
}
if (pFrame)
{
if (s_bGetMail)
pFrame->m_bWantToGetMail = TRUE;
pFrame->LoadFolder( folderInfo, key );
}
}
if ( pFrame )
pFrame->ActivateFrame();
return pFrame;
}
C3PaneMailFrame *C3PaneMailFrame::OpenInbox( BOOL bGetNew )
{
if(theApp.m_hPostalLib)
{
FEU_AltMail_ShowMailBox();
return NULL;
}
else
{
if (!CheckWizard())
return NULL;
C3PaneMailFrame *pFrame = NULL;
MSG_FolderInfo *folderInfo = NULL;
MSG_GetFoldersWithFlag( WFE_MSGGetMaster(),
MSG_FOLDER_FLAG_INBOX,
&folderInfo, 1 );
s_bGetMail = bGetNew;
if (folderInfo)
{
pFrame = Open( folderInfo );
if (pFrame->m_pFolderOutliner && pFrame->m_pFolderPane)
{
MSG_ViewIndex index = MSG_GetFolderIndexForInfo(pFrame->m_pFolderPane,
folderInfo, TRUE);
if (index != MSG_VIEWINDEXNONE)
pFrame->m_pFolderOutliner->SelectItem( CASTINT(index) );
}
}
s_bGetMail = FALSE;
return pFrame;
}
}
C3PaneMailFrame *WFE_MSGOpenInbox(BOOL bGetNew)
{
return C3PaneMailFrame::OpenInbox(bGetNew);
}
#ifdef DEBUG_WHITEBOX
BOOL C3PaneMailFrame::WhiteBox_DoesMessageExist( MessageKey key )
{
MSG_ViewIndex index = MSG_GetMessageIndexForKey( m_pPane, key, TRUE );
if ( index != MSG_VIEWINDEXNONE )
return TRUE;
return FALSE;
}
#endif