gecko-dev/cmd/winfe/thrdfrm.cpp

1957 lines
51 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"
#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_FORWARD,
ID_MESSAGE_FILE,
ID_MESSAGE_NEXTUNREAD,
ID_FILE_PRINT,
ID_SECURITY,
ID_EDIT_DELETEMESSAGE,
ID_NAVIGATE_INTERRUPT
};
int MailIndices[10] = { 0, 1, 2, 3, 4, 5, 6, 10, 11, 13 };
UINT NewsCodes[10] = {
ID_FILE_GETNEWMAIL,
ID_NEWS_POSTNEW,
ID_MESSAGE_REPLYBUTTON,
ID_MESSAGE_FORWARD,
ID_MESSAGE_FILE,
ID_MESSAGE_NEXTUNREAD,
ID_FILE_PRINT,
ID_SECURITY,
ID_MESSAGE_MARKBUTTON,
ID_NAVIGATE_INTERRUPT
};
int NewsIndices[10] = { 0, 1, 2, 3, 4, 5, 6, 10, 11, 13 };
//status bar format
static const UINT BASED_CODE indicators[] =
{
IDS_EXPANDO,
IDS_SECURITY_STATUS,
IDS_SIGNED_STATUS,
IDS_TRANSFER_STATUS,
ID_SEPARATOR,
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_bNoScrollHack = FALSE;
// 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_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:
{
m_pOutliner->SelectItem( m_pOutliner->GetTotalLines() > 0 ? 0 : -1 );
m_bNoScrollHack = TRUE;
OnDoneGettingMail();
}
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 ) {
OnSelectFolder();
} 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_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 );
}
}
#define IS_IN_WINDOW(hParent,hChild)\
(((hParent) == (hChild)) || ::IsChild(hParent, hChild))
BOOL C3PaneMailFrame::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_DELETE)
{
CWnd* pFocusWnd = GetFocus();
if (pFocusWnd == m_pFolderOutliner)
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)) {
HWND hwndFocus = ::GetFocus();
HWND hwndFolder = m_pFolderOutliner ? m_pFolderOutliner->m_hWnd : NULL;
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
HWND hwndView = m_pMessageView ? m_pMessageView->m_hWnd : NULL;
HWND hwndNext = NULL;
if (GetKeyState(VK_SHIFT) & 0x8000) {
if ( hwndView && IS_IN_WINDOW(hwndView, hwndFocus) ) {
// Don't steal the event if the tab is destined for a child window of
// the active view, because the child window may want the tab itself
hwndNext = hwndOutliner;
} else if ( hwndFocus == hwndOutliner ) {
hwndNext = hwndFolder;
} else { // hwndFocus == hwndFolder
hwndNext = hwndView;
}
} else {
if ( hwndView && IS_IN_WINDOW(hwndView, hwndFocus) ) {
// Don't steal the event if the tab is destined for a child window of
// the active view, because the child window may want the tab itself
hwndNext = hwndFolder;
} else if ( hwndFocus == hwndFolder ) {
hwndNext = hwndOutliner;
} else { // hwndFocus == hwndOutliner
hwndNext = hwndView;
}
}
if ( hwndNext ) {
::SetFocus( hwndNext );
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_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_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 ( );
m_pMessagePane = MSG_CreateMessagePane( pWinCX->GetContext(), m_pMaster );
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);
CreateThreadPane();
MSG_SetFEData( m_pFolderPane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) this );
MSG_SetFEData( m_pMessagePane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) this );
MSG_SetMessagePaneCallbacks(m_pMessagePane, &MsgPaneCB, NULL);
m_pOutlinerParent->SetFocus();
// 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()
// 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_UPDATE_COMMAND_UI(ID_VIEW_PROPERTIES, OnUpdateProperties)
ON_COMMAND(ID_VIEW_PROPERTIES,OnEditProperties)
// View Menu Items
ON_COMMAND(ID_VIEW_MESSAGE, OnViewMessage)
ON_UPDATE_COMMAND_UI(ID_VIEW_MESSAGE, OnUpdateViewMessage)
// 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_VIEW_FOLDER, OnViewFolder)
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)
END_MESSAGE_MAP()
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_REPLYBUTTON:
case ID_MESSAGE_MARKBUTTON:
dwButtonStyle |= TB_HAS_IMMEDIATE_MENU;
break;
case ID_MESSAGE_NEXTUNREAD:
dwButtonStyle |= TB_HAS_TIMED_MENU;
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:
LoadFolder(pFolderInfo);
break;
case MSG_Forward:
case MSG_Back:
m_selPending = resultId;
break;
default:
break;
}
}
} 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 );
}
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;
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 );
}
if ( m_pFolderPane ) {
// Ditto...
MSG_Pane *pTemp = m_pFolderPane;
m_pFolderPane = 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();
}
// 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 );
}
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)) {
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::OnUpdateProperties(CCmdUI *pCmdUI)
{
MSG_ViewIndex *indices = NULL;
int count = 0;
MSG_FolderLine folderLine;
if (pCmdUI)
{
if (m_pFolderOutliner == GetFocus())
{
m_pFolderOutliner->GetSelection( indices, count );
if (indices && count)
{
MSG_FolderInfo *folderInfo = MSG_GetFolderInfo( m_pFolderPane, indices[0] );
MSG_GetFolderLineByIndex( m_pFolderPane, indices[0], 1, &folderLine );
//only make and add the pages if they selected a news group or category
if ( folderLine.flags & (MSG_FOLDER_FLAG_NEWSGROUP|MSG_FOLDER_FLAG_CATEGORY) )
{
pCmdUI->Enable(TRUE);
return;
}
}
}
}
pCmdUI->Enable(FALSE);
}
void C3PaneMailFrame::OnEditProperties()
{
MSG_ViewIndex *indices = NULL;
int count = 0;
MSG_FolderLine folderLine;
if (m_pFolderOutliner)
m_pFolderOutliner->GetSelection( indices, count );
if (indices && count)
{
MSG_FolderInfo *folderInfo = MSG_GetFolderInfo( m_pFolderPane, indices[0] );
MSG_GetFolderLineByIndex( m_pFolderPane, indices[0], 1, &folderLine );
CNewsFolderPropertySheet FolderSheet( szLoadString(IDS_NEWSGROUPPROP), this );
//destructor handles clean up of added sheets
//only make and add the pages if they selected a news group or category
if ( folderLine.flags & (MSG_FOLDER_FLAG_NEWSGROUP|MSG_FOLDER_FLAG_CATEGORY) )
{
FolderSheet.m_pNewsFolderPage= new CNewsGeneralPropertyPage(&FolderSheet);
FolderSheet.m_pNewsFolderPage->SetFolderInfo( folderInfo, (MWContext*)GetContext() );
FolderSheet.m_pDownLoadPageNews = new CDownLoadPPNews(&FolderSheet);
FolderSheet.m_pDownLoadPageNews->SetFolderInfo(folderInfo);
FolderSheet.m_pDiskSpacePage = new CDiskSpacePropertyPage(&FolderSheet);
FolderSheet.m_pDiskSpacePage->SetFolderInfo (folderInfo );
FolderSheet.AddPage(FolderSheet.m_pNewsFolderPage);
FolderSheet.AddPage(FolderSheet.m_pDownLoadPageNews);
FolderSheet.AddPage(FolderSheet.m_pDiskSpacePage);
if(FolderSheet.DoModal() == IDOK)
{
if(FolderSheet.DownLoadNow())
{
new CProgressDialog(this, NULL,_ShutDownFrameCallBack,
folderInfo,szLoadString(IDS_DOWNLOADINGARTICLES));
;//DonwLoad!!!!!!!
}
else if (FolderSheet.SynchronizeNow())
;//Synchronize!!!! NOT IMPLEMENTED
}
}
}
}
// 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 )
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
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 );
} else {
CFolderFrame::ClearFolderPref( folderInfo, MSG_FOLDER_PREF_ONEPANE );
}
}
}
void C3PaneMailFrame::OnUpdateViewMessage( CCmdUI *pCmdUI )
{
pCmdUI->SetText( szLoadString( CASTUINT(m_pThreadSplitter->IsOnePaneClosed() ?
IDS_MENU_SHOWMESSAGE : IDS_MENU_HIDEMESSAGE )) );
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);
}
}
// 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()
{
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)
{
if (folderLine.total == m_pOutliner->GetTotalLines())
return;
}
// check if folder has loaded in other window
pFrame = FindFrame(folderLine.id);
if (pFrame)
{
pFrame->ActivateFrame();
// fix do next unread group selection problem
if (folderLine.total != m_pOutliner->GetTotalLines())
return;
// set selection back to original one when doing a double click
int nIndex = m_pFolderOutliner->GetCurrentSelected();
if (nIndex != -1)
m_pFolderOutliner->SelectItem(nIndex);
}
else
LoadFolder(folderLine.id);
}
else
{
BlankOutThreadPane();
BlankOutMessagePane(NULL);
MSG_DestroyPane(m_pPane);
m_pPane = 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();
}
}
m_pOutliner->SelectItem(((CMessageOutliner*)m_pOutliner)->GetCurrentSelected());
}
}
}
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);
}
}
}
}
}
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);
}
}
}
}
// Edit Menu Items
void C3PaneMailFrame::OnEditUndo()
{
DoCommand(MSG_Undo);
DoUndoNavigate(MSG_EditUndo);
}
void C3PaneMailFrame::OnEditRedo()
{
DoCommand(MSG_Redo);
DoUndoNavigate(MSG_EditRedo);
}
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 );
if (m_pInfoBar)
m_pInfoBar->SetPane(m_pPane);
}
}
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);
}
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();
indices[0] = nIndex;
if (MSG_GetFolderLineByIndex(m_pFolderPane, indices[0], 1, pFolderLine))
return TRUE;
}
}
return FALSE;
}
void C3PaneMailFrame::BlankOutThreadPane()
{
m_pOutliner->SelectItem(-1);
m_pOutliner->SetTotalLines(0);
m_pOutliner->Invalidate();
m_pOutliner->UpdateWindow();
}
void C3PaneMailFrame::BlankOutMessagePane(MSG_FolderInfo *pFolderInfo)
{
MSG_LoadMessage(m_pMessagePane, pFolderInfo, MSG_MESSAGEKEYNONE);
m_pChrome->SetDocumentTitle("");
m_pMessageView->SetAttachments(NULL, 0);
}
void C3PaneMailFrame::LoadFolder( MSG_FolderInfo *folderInfo, MessageKey key, int action )
{
if (m_pPane) {
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
{
if (m_pPane)
return MSG_GetCurFolder(m_pPane);
else
return 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;
}
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