/* -*- 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. */ #ifndef __MAILMISC_H #define __MAILMISC_H #include "outliner.h" #include "msgcom.h" #define ID_COLUMN_FROM 1 #define ID_COLUMN_SUBJECT 2 #define ID_COLUMN_DATE 3 #define ID_COLUMN_READ 4 #define ID_COLUMN_THREAD 5 #define ID_COLUMN_PRIORITY 6 #define ID_COLUMN_STATUS 7 #define ID_COLUMN_LENGTH 8 #define ID_COLUMN_COUNT 9 #define ID_COLUMN_UNREAD 10 #define ID_COLUMN_FOLDER 11 #define ID_COLUMN_MARK 12 #define ID_COLUMN_SLAMMER 13 // array of indexes for IDB_MAILNEWS #define IDX_LOCALMAIL 0 #define IDX_REMOTEMAIL 1 #define IDX_NEWSHOST 2 #define IDX_MAILMESSAGE 3 #define IDX_MAILREAD 4 #define IDX_DRAFT 5 #define IDX_NEWSGROUP 6 #define IDX_NEWSARTICLE 7 #define IDX_NEWSGROUPNEW 8 #define IDX_NEWSNEW 9 #define IDX_NEWSREAD 10 #define IDX_UNREAD 11 #define IDX_READ 12 #define IDX_MARKED 13 #define IDX_CHECKMARK 14 #define IDX_CHECKBOX 15 #define IDX_MAILFOLDERCLOSED 16 #define IDX_MAILFOLDEROPEN 17 #define IDX_MAILFOLDERCLOSEDNEW 18 #define IDX_MAILFOLDEROPENNEW 19 #define IDX_INBOXCLOSED 20 #define IDX_INBOXOPEN 21 #define IDX_INBOXCLOSEDNEW 22 #define IDX_INBOXOPENNEW 23 #define IDX_OUTBOXCLOSED 24 #define IDX_OUTBOXOPEN 25 #define IDX_SENTCLOSED 26 #define IDX_SENTOPEN 27 #define IDX_DRAFTSCLOSED 28 #define IDX_DRAFTSOPEN 29 #define IDX_TRASH 30 #define IDX_TRASHOPEN 31 #define IDX_THREADCLOSED 32 #define IDX_THREADOPEN 33 #define IDX_THREADCLOSEDNEW 34 #define IDX_THREADOPENNEW 35 #define IDX_THREADWATCHED 36 #define IDX_THREADWATCHEDNEW 37 #define IDX_TWISTYOPEN 38 #define IDX_TWISTYCLOSED 39 #define IDX_MAILNEW 40 #define IDX_COLLECTION 41 #define IDX_CONTAINER 42 #define IDX_SECNEWS 43 #define IDX_THREADIGNOREDCLOSED 44 #define IDX_THREADIGNOREDOPEN 45 #define IDX_OFFLINENEWS 46 #define IDX_FOLDEROPENOFFLINE 47 #define IDX_FOLDERCLOSEDOFFLINE 48 #define IDX_MAILOFFLINE 49 #define IDX_NEWSHOSTOFFLINE 50 #define IDX_NEWSMSGOFFLINE 51 #define IDX_NEWSREADOFFLINE 52 #define IDX_MAILREADOFFLINE 53 #define IDX_MAILMSGOFFLINE 54 #define IDX_IMAPMSGDELETED 55 #define IDX_TEMPLATE 56 #define IDX_TEMPLATEOPEN 57 // array of indexes for IDB_MAILCOL #define IDX_THREAD 0 #define IDX_MAILCHECKMARK 1 #define IDX_MAILMARKED 2 #define IDX_MAILUNREAD 3 #define IDX_UNTHREAD 4 #define NETSCAPE_MESSAGE_FORMAT "Netscape Message" #define NETSCAPE_FOLDER_FORMAT "Netscape Folder" #define NETSCAPE_SEARCH_FORMAT "Netscape Search" int WFE_MSGTranslateFolderIcon( uint8 level, int32 iFlags, BOOL bOpen ); void WFE_MSGBuildMessagePopup( HMENU hmenu, BOOL bNews, BOOL bInHeaders = FALSE ); /////////////////////////////////////////////////////////////////////// // CMessagePrefs class CMsgPrefs { private: MSG_Master *m_pMaster; public: CMsgPrefs(); ~CMsgPrefs(); void Init(); void Shutdown(); BOOL IsValid() const; MSG_Master *GetMaster(); CGenericDocTemplate *m_pFolderTemplate; CGenericDocTemplate *m_pThreadTemplate; CGenericDocTemplate *m_pMsgTemplate; // Lib Msg prefs structure MSG_Prefs *m_pMsgPrefs; // Biff Context MWContext *m_pBiffContext; CString m_csMailDir; CString m_csMailHost; CString m_csNewsDir; CString m_csNewsHost; CString m_csUsersEmailAddr; CString m_csUsersFullName; CString m_csUsersOrganization; LPSTR m_pszUserSig; BOOL m_bThreadPaneMaxed; BOOL m_bMessageReuse; BOOL m_bThreadReuse; }; extern CMsgPrefs g_MsgPrefs; typedef struct { MSG_Pane *m_pane; int m_count; MSG_ViewIndex *m_indices; } MailNewsDragData; /////////////////////////////////////////////////////////////////////// // CMailNewsOutliner class CMailNewsOutliner: public CMSelectOutliner { protected: MSG_Pane *m_pPane; int m_iMysticPlane; BOOL m_bSelChanged; int m_iSelBlock; BOOL m_bExpandOrCollapse; public: CMailNewsOutliner(); ~CMailNewsOutliner(); virtual void SetPane( MSG_Pane *pane ); MSG_Pane *GetPane() { return m_pPane; } virtual void MysticStuffStarting( XP_Bool asynchronous, MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num); virtual void MysticStuffFinishing( XP_Bool asynchronous, MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num); int GetMysticStuffDepth() const { return m_iMysticPlane; } void BlockSelNotify(BOOL bBlock) { m_iSelBlock += (bBlock ? 1 : -1); } protected: // Basic Overrides virtual int ToggleExpansion( int iLine ); virtual int Expand( int iLine ); virtual int Collapse( int iLine ); afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message ); afx_msg void OnLButtonDown( UINT nFlags, CPoint point ); afx_msg void OnRButtonDown( UINT nFlags, CPoint point ); afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags ); afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags ); DECLARE_MESSAGE_MAP() }; /////////////////////////////////////////////////////////////////////// // CFolderOutliner class CFolderOutliner : public CMailNewsOutliner { protected: MSG_FolderLine m_FolderLine; OutlinerAncestorInfo * m_pAncestor; LPTSTR m_pszExtraText; CLIPFORMAT m_cfMessages, m_cfFolders, m_cfSearchMessages; DWORD m_dwPrevTime; UINT m_uTimer; BOOL m_bLButtonDown; BOOL m_bDoubleClicked; BOOL m_b3PaneParent; int m_nCurrentSelected; MSG_FolderInfo **m_pMysticStuff; MSG_FolderInfo *m_MysticFocus; MSG_FolderInfo *m_MysticSelection; public: CFolderOutliner ( ); ~CFolderOutliner ( ); BOOL IsParent3PaneFrame() { return m_b3PaneParent; } void SetCurrentSelected(int nIndex) { m_nCurrentSelected = nIndex; } int GetCurrentSelected() { return m_nCurrentSelected; } virtual void MysticStuffStarting( XP_Bool asynchronous, MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num ); virtual void MysticStuffFinishing( XP_Bool asynchronous, MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num ); protected: virtual void OnSelChanged(); virtual void OnSelDblClk(); // Tree Info stuff virtual int GetDepth( int iLine ); virtual int GetNumChildren( int iLine ); virtual BOOL IsCollapsed( int iLine ); virtual LPCTSTR GetColumnText( UINT iColumn, void * pLineData ); virtual LPCTSTR GetColumnTip( UINT iColumn, void * pLineData ); virtual void * AcquireLineData( int iLine ); virtual void ReleaseLineData( void * pLineData ); virtual void GetTreeInfo( int iLine, uint32 * pFlags, int * iDepth, OutlinerAncestorInfo ** pAncestor ); virtual HFONT GetLineFont ( void * pLineData ); virtual int TranslateIcon ( void *); virtual int TranslateIconFolder ( void *); virtual void PropertyMenu ( int iSel, UINT flags ); // Drag-Drop Stuff // clip format virtual void InitializeClipFormats(void); virtual CLIPFORMAT * GetClipFormatList(void); // initiate drag virtual COleDataSource * GetDataSource(void); // accept drop virtual DROPEFFECT DropSelect(int iLineNo, COleDataObject *object); virtual void AcceptDrop(int iLineNo, COleDataObject *object, DROPEFFECT effect); afx_msg int OnCreate(LPCREATESTRUCT lpcs); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnDestroy(); DECLARE_MESSAGE_MAP() }; /////////////////////////////////////////////////////////////////////// // CMessageOutliner class CMessageOutliner : public CMailNewsOutliner { protected: MSG_MessageLine m_MessageLine; OutlinerAncestorInfo * m_pAncestor; LPTSTR m_pszExtraText; CLIPFORMAT m_cfMessages; MessageKey *m_pMysticStuff; MessageKey m_MysticFocus; MessageKey m_MysticSelection; BOOL m_bNews, m_bDrafts; UINT m_uTimer; BOOL m_bLButtonDown; BOOL m_bDoubleClicked; int m_nCurrentSelected; DWORD m_dwPrevTime; public: CMessageOutliner ( ); ~CMessageOutliner ( ); virtual void MysticStuffStarting( XP_Bool asynchronous, MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num); virtual void MysticStuffFinishing( XP_Bool asynchronous, MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num); void SetCurrentSelected(int nIndex) { m_nCurrentSelected = nIndex; } int GetCurrentSelected() { return m_nCurrentSelected; } void SelectThread( int iLine, UINT flags = 0 ); void SelectFlagged(); BOOL IsNews() const { return m_bNews; } void SetNews(BOOL bNews) { m_bNews = bNews;} void EnsureFlagsVisible(); protected: virtual void OnSelChanged(); virtual void OnSelDblClk(); // Tree Info stuff virtual int GetDepth( int iLine ); virtual int GetNumChildren( int iLine ); virtual int GetParentIndex( int iLine ); virtual BOOL IsCollapsed( int iLine ); // Tree manip stuff virtual int ExpandAll( int iLine ); virtual int CollapseAll( int iLine ); virtual LPCTSTR GetColumnText ( UINT iColumn, void * pLineData ); virtual void * AcquireLineData ( int iLine ); virtual void ReleaseLineData ( void * pLineData ); virtual void GetTreeInfo ( int iLine, uint32 * pFlags, int * iDepth, OutlinerAncestorInfo ** pAncestor ); virtual HFONT GetLineFont ( void * pLineData ); virtual int TranslateIcon ( void *); virtual int TranslateIconFolder ( void *); virtual BOOL RenderData ( UINT iColumn, CRect & rect, CDC & pdc, LPCTSTR ); virtual BOOL ColumnCommand ( int iColumn, int iLine ); virtual void PropertyMenu ( int iSel, UINT flags ); // Drag Drop stuff // clip formats virtual void InitializeClipFormats(void); virtual CLIPFORMAT * GetClipFormatList(void); // initiate drag virtual COleDataSource * GetDataSource(void); // accept drop virtual DROPEFFECT DropSelect( int iLineNo, COleDataObject *object ); virtual void AcceptDrop( int iLineNo, COleDataObject *object, DROPEFFECT effect ); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnDestroy(); DECLARE_MESSAGE_MAP() }; /////////////////////////////////////////////////////////////////////// // CFolderOutlinerParent class CFolderOutlinerParent : public COutlinerParent { public: CFolderOutlinerParent(); ~CFolderOutlinerParent(); virtual COutliner *GetOutliner(); virtual void CreateColumns ( void ); protected: afx_msg void OnDestroy(); DECLARE_MESSAGE_MAP() }; // CMessageOutlinerParent class CMessageOutlinerParent : public COutlinerParent { protected: MWContextType m_contextType; public: CMessageOutlinerParent(); ~CMessageOutlinerParent(); virtual COutliner *GetOutliner(); virtual void CreateColumns ( void ); virtual BOOL RenderData ( int idColumn, CRect & rect, CDC & dc, LPCTSTR ); protected: virtual BOOL ColumnCommand ( int iColumn ); afx_msg void OnDestroy(); DECLARE_MESSAGE_MAP() }; /////////////////////////////////////////////////////////////////////// // CFolderView class CFolderView : public COutlinerView { public: CFolderView ( ) { m_pOutlinerParent = (COutlinerParent *) new CFolderOutlinerParent; } DECLARE_DYNCREATE(CFolderView) }; ///////////////////////////////////////////////////////////////////////////// // CMailFolderHelper // // It's such a pain to use the same owner draw routines for a combo box // and a list using MFC. This just pulls out the important stuff into its // own, multiple inheritable class class CMailFolderHelper { protected: BOOL m_bStaticCtl; UINT m_nAddString, m_nSetItemData, m_nResetContent; int m_iInitialDepth; MSG_Master *m_pMaster; LPIMAGEMAP m_pIImageMap; LPUNKNOWN m_pIImageUnk; HFONT m_hFont, m_hBoldFont; CMailFolderHelper(UINT nAddString, UINT nSetItemData, UINT nResetContent ); ~CMailFolderHelper(); void InitFonts( HDC hdc ); void DoDrawItem( HWND hWnd, LPDRAWITEMSTRUCT lpDrawItemStruct, BOOL bNoPrettyName = FALSE); void DoMeasureItem( HWND hWnd, LPMEASUREITEMSTRUCT lpMeasureItemStruct ); virtual void SubPopulate( HWND hWnd, int &index, MSG_FolderInfo *folder ); public: int Populate( HWND hWnd, MSG_Master *pMaster, MSG_FolderInfo *folderInfo ); int PopulateMailServer( HWND hWnd, MSG_Master *pMaster, BOOL bRoots = TRUE); int PopulateMail( HWND hWnd, MSG_Master *pMaster, BOOL bRoots = TRUE); virtual int PopulateNews( HWND hWnd, MSG_Master *pMaster, BOOL bRoots = TRUE ); }; ///////////////////////////////////////////////////////////////////////////// // CMailFolderCombo class CMailFolderCombo: public CComboBox, public CMailFolderHelper { protected: BOOL m_bNoPrettyName; virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) { DoDrawItem( m_hWnd, lpDrawItemStruct, m_bNoPrettyName); } virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct ) { DoMeasureItem( m_hWnd, lpMeasureItemStruct ); } public: CMailFolderCombo(): CMailFolderHelper( CB_ADDSTRING, CB_SETITEMDATA, CB_RESETCONTENT ) { m_bNoPrettyName = FALSE; } void NoPrettyName() { m_bNoPrettyName = TRUE; } int Populate( MSG_Master *pMaster, MSG_FolderInfo *folderInfo ) { return CMailFolderHelper::Populate( m_hWnd, pMaster, folderInfo ); } int PopulateMail( MSG_Master *pMaster, BOOL bRoots = TRUE ) { return CMailFolderHelper::PopulateMail( m_hWnd, pMaster, bRoots ); } int PopulateMailServer( MSG_Master *pMaster, BOOL bRoots = TRUE ) { return CMailFolderHelper::PopulateMailServer( m_hWnd, pMaster, bRoots ); } }; ///////////////////////////////////////////////////////////////////////////// // CMailFolderList class CMailFolderList: public CListBox, public CMailFolderHelper { protected: virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) { DoDrawItem( m_hWnd, lpDrawItemStruct ); } virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct ) { DoMeasureItem( m_hWnd, lpMeasureItemStruct ); } public: CMailFolderList(): CMailFolderHelper( LB_ADDSTRING, LB_SETITEMDATA, LB_RESETCONTENT ) {} virtual int Populate( MSG_Master *pMaster, MSG_FolderInfo *folderInfo ) { return CMailFolderHelper::Populate( m_hWnd, pMaster, folderInfo ); } }; class CMailNewsFrame; class IMailFrame: public IUnknown { public: virtual CMailNewsFrame *GetMailNewsFrame() = 0; virtual MSG_Pane *GetPane() = 0; virtual void PaneChanged( MSG_Pane *pane, XP_Bool asynchronous, MSG_PANE_CHANGED_NOTIFY_CODE, int32 value) = 0; virtual void AttachmentCount(MSG_Pane *messagepane, void* closure, int32 numattachments, XP_Bool finishedloading) = 0; virtual void UserWantsToSeeAttachments(MSG_Pane *messagepane, void *closure) = 0; }; typedef IMailFrame *LPMAILFRAME; #endif