зеркало из https://github.com/mozilla/gecko-dev.git
493 строки
13 KiB
C++
493 строки
13 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.
|
|
*/
|
|
|
|
// dlgseldg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "mailmisc.h"
|
|
#include "xp_time.h"
|
|
#include "xplocale.h"
|
|
#include "wfemsg.h"
|
|
#include "dateedit.h"
|
|
#include "nethelp.h"
|
|
#include "dlgseldg.h"
|
|
#include "prefapi.h"
|
|
#include "nethelp.h"
|
|
#include "xp_help.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern "C" void HelperInitFonts( HDC hdc , HFONT *phFont, HFONT *phBoldFont);
|
|
|
|
CDiscussionsList::CDiscussionsList(): CMailFolderList()
|
|
{
|
|
m_iPosIndex = 0;
|
|
m_iPosName = 50;
|
|
m_iPosStatus = 100;
|
|
m_pDWordArray = new CDWordArray; //holds a list of groups with selection values.
|
|
m_bHasSelectables= FALSE; //Flag that tells us if anything can be selected
|
|
|
|
}
|
|
|
|
CDiscussionsList::~CDiscussionsList()
|
|
{
|
|
FolderData *pData = NULL;
|
|
|
|
while (-1 != m_pDWordArray->GetUpperBound())
|
|
{
|
|
pData = (FolderData*)m_pDWordArray->GetAt(m_pDWordArray->GetUpperBound());
|
|
m_pDWordArray->RemoveAt(m_pDWordArray->GetUpperBound());
|
|
m_pDWordArray->FreeExtra();
|
|
if (pData)
|
|
{
|
|
delete pData;
|
|
pData = NULL;
|
|
}
|
|
}
|
|
if (m_pDWordArray)
|
|
delete m_pDWordArray;
|
|
}
|
|
|
|
void CDiscussionsList::SetColumnPositions(int iPosIndex, int iPosName, int iPosStatus)
|
|
{
|
|
m_iPosIndex = iPosIndex;
|
|
m_iPosName = iPosName;
|
|
m_iPosStatus = iPosStatus;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP( CDiscussionsList, CMailFolderList )
|
|
ON_WM_LBUTTONDOWN()
|
|
END_MESSAGE_MAP( )
|
|
|
|
|
|
int CDiscussionsList::PopulateNews(MSG_Master *pMaster, BOOL bRoots)
|
|
{
|
|
m_pMaster = pMaster;
|
|
int index = 0;
|
|
int nCount=0;
|
|
m_iInitialDepth = 1;
|
|
|
|
::SendMessage( m_hWnd, m_nResetContent, (WPARAM) 0, (LPARAM) 0 );
|
|
|
|
int32 iLines = MSG_GetFolderChildren (m_pMaster, NULL, NULL, 0);
|
|
MSG_FolderInfo **ppFolderInfo = new MSG_FolderInfo *[iLines];
|
|
|
|
ASSERT(ppFolderInfo);
|
|
if (ppFolderInfo)
|
|
{
|
|
MSG_GetFolderChildren (m_pMaster, NULL, ppFolderInfo, iLines);
|
|
for (int i = 0; i < iLines; i++)
|
|
{
|
|
MSG_FolderLine folderLine;
|
|
if (MSG_GetFolderLineById (m_pMaster, ppFolderInfo[i], &folderLine))
|
|
{
|
|
if ( folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ||
|
|
folderLine.flags & MSG_FOLDER_FLAG_NEWS_HOST ||
|
|
folderLine.flags & MSG_FOLDER_FLAG_IMAPBOX ||
|
|
folderLine.flags & MSG_FOLDER_FLAG_CAT_CONTAINER)
|
|
{
|
|
if ( bRoots )
|
|
{
|
|
FolderData *pFolderData = new FolderData;
|
|
if (pFolderData)
|
|
{
|
|
pFolderData->infoData = folderLine.id;
|
|
pFolderData->bDownLoad = (BOOL)(MSG_GetFolderPrefFlags(folderLine.id) & MSG_FOLDER_PREF_OFFLINE);
|
|
::SendMessage( m_hWnd, m_nAddString, (WPARAM) 0, (LPARAM) folderLine.name );
|
|
::SendMessage( m_hWnd, m_nSetItemData, (WPARAM) index,(DWORD)(pFolderData) );
|
|
TRY
|
|
{
|
|
m_pDWordArray->Add((DWORD)pFolderData);
|
|
}
|
|
CATCH(CMemoryException, e)
|
|
{
|
|
delete [] ppFolderInfo;
|
|
return 0;
|
|
}
|
|
END_CATCH
|
|
index++;
|
|
}
|
|
if ( folderLine.numChildren > 0 )
|
|
{
|
|
SubPopulate(index, folderLine.id );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
delete [] ppFolderInfo;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
void CDiscussionsList::SubPopulate(int &index, MSG_FolderInfo *folder )
|
|
{
|
|
int32 iLines = MSG_GetFolderChildren (m_pMaster, folder, NULL, 0);
|
|
MSG_FolderInfo **ppFolderInfo = new MSG_FolderInfo *[iLines];
|
|
|
|
ASSERT(ppFolderInfo);
|
|
if (ppFolderInfo)
|
|
{
|
|
MSG_GetFolderChildren (m_pMaster, folder, ppFolderInfo, iLines);
|
|
for (int i = 0; i < iLines; i++)
|
|
{
|
|
MSG_FolderLine folderLine;
|
|
if (MSG_GetFolderLineById (m_pMaster, ppFolderInfo[i], &folderLine))
|
|
{
|
|
m_bHasSelectables = TRUE;
|
|
FolderData *pFolderData = new FolderData;
|
|
if (pFolderData)
|
|
{
|
|
pFolderData->infoData = folderLine.id;
|
|
pFolderData->bDownLoad = (BOOL)(MSG_GetFolderPrefFlags(folderLine.id) & MSG_FOLDER_PREF_OFFLINE);
|
|
::SendMessage( m_hWnd, m_nAddString, (WPARAM) 0, (LPARAM) folderLine.name );
|
|
::SendMessage( m_hWnd, m_nSetItemData, (WPARAM) index,(DWORD)(pFolderData) );
|
|
TRY
|
|
{
|
|
m_pDWordArray->Add((DWORD)pFolderData);
|
|
}
|
|
CATCH(CMemoryException, e)
|
|
{
|
|
delete [] ppFolderInfo;
|
|
return;
|
|
}
|
|
END_CATCH
|
|
index++;
|
|
}
|
|
if ( folderLine.numChildren > 0 ) {
|
|
SubPopulate(index, folderLine.id);
|
|
}
|
|
}
|
|
}
|
|
delete [] ppFolderInfo;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void CDiscussionsList::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
|
|
{
|
|
HDC hDC = lpDrawItemStruct->hDC;
|
|
RECT rcItem = lpDrawItemStruct->rcItem;
|
|
RECT rcTemp = rcItem;
|
|
RECT rcText;
|
|
DWORD dwItemData = lpDrawItemStruct->itemData;
|
|
HBRUSH hBrushWindow = ::CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
|
HBRUSH hBrushHigh = ::CreateSolidBrush( GetSysColor( COLOR_HIGHLIGHT ) );
|
|
HBRUSH hBrushFill = NULL;
|
|
|
|
if ( !m_hFont ) {
|
|
HelperInitFonts( hDC, &m_hFont, &m_hBoldFont);
|
|
}
|
|
|
|
HFONT hOldFont = NULL;
|
|
if ( m_hFont ) {
|
|
hOldFont = (HFONT) ::SelectObject( hDC,(HFONT)&m_hFont );
|
|
}
|
|
|
|
if ( lpDrawItemStruct->itemState & ODS_SELECTED ) {
|
|
hBrushFill = hBrushHigh;
|
|
::SetBkColor( hDC, GetSysColor( COLOR_HIGHLIGHT ) );
|
|
::SetTextColor( hDC, GetSysColor( COLOR_HIGHLIGHTTEXT ) );
|
|
} else {
|
|
hBrushFill = hBrushWindow;
|
|
::SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) );
|
|
::SetTextColor( hDC, GetSysColor( COLOR_WINDOWTEXT ) );
|
|
}
|
|
|
|
VERIFY(::FillRect( hDC, &rcItem, hBrushFill ));
|
|
|
|
if ( lpDrawItemStruct->itemID != -1 && dwItemData )
|
|
{
|
|
FolderData * itemInfo = (FolderData *) dwItemData;
|
|
MSG_FolderLine folderLine;
|
|
MSG_GetFolderLineById( m_pMaster, (MSG_FolderInfo*)itemInfo->infoData , &folderLine);
|
|
|
|
int idxImage = WFE_MSGTranslateFolderIcon( folderLine.level,
|
|
folderLine.flags,
|
|
folderLine.numChildren );
|
|
|
|
if ( m_hBoldFont && folderLine.unseen > 0 )
|
|
{
|
|
::SelectObject( hDC, (HFONT)&m_hBoldFont );
|
|
}
|
|
int iIndent = 4;
|
|
|
|
BOOL bStatic = FALSE;
|
|
#ifdef _WIN32
|
|
if ( sysInfo.m_bWin4 )
|
|
bStatic = ( lpDrawItemStruct->itemState & ODS_COMBOBOXEDIT ) ? TRUE : FALSE;
|
|
else
|
|
#endif
|
|
bStatic = m_bStaticCtl;
|
|
|
|
if (!bStatic)
|
|
iIndent += (folderLine.level - m_iInitialDepth) * 8;
|
|
|
|
//Draw the news bitmap
|
|
m_pIImageMap->DrawImage( idxImage, iIndent, rcItem.top, hDC, FALSE );
|
|
LPCTSTR name = (LPCTSTR) folderLine.prettyName;
|
|
if ( !name || !name[0] )
|
|
name = folderLine.name;
|
|
//Draw the text
|
|
::DrawText( hDC, name, -1, &rcTemp, DT_SINGLELINE|DT_CALCRECT|DT_NOPREFIX );
|
|
int iWidth = rcTemp.right - rcTemp.left;
|
|
|
|
rcTemp = rcItem;
|
|
rcText = rcItem;
|
|
rcTemp.left = iIndent + 20;
|
|
rcTemp.right = rcTemp.left + iWidth + 4;
|
|
|
|
VERIFY(::FillRect( hDC, &rcTemp, hBrushFill ));
|
|
rcText.left = rcTemp.left + 2;
|
|
rcText.right = rcTemp.right - 2;
|
|
::DrawText( hDC, name, -1, &rcText, DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX );
|
|
//handle the checkmark if it's a (news group or IMAP mail folder or a category container) and not a host
|
|
if ((folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ||
|
|
folderLine.flags & MSG_FOLDER_FLAG_IMAPBOX ||
|
|
folderLine.flags & MSG_FOLDER_FLAG_CAT_CONTAINER) &&
|
|
!(folderLine.flags & MSG_FOLDER_FLAG_IMAP_SERVER))
|
|
{
|
|
BOOL bEnabled = itemInfo->bDownLoad;
|
|
m_pIImageMap->DrawTransImage( bEnabled ? IDX_CHECKMARK : IDX_CHECKBOX,
|
|
m_iPosStatus, rcItem.top, hDC );
|
|
}
|
|
//Draw the focus
|
|
if ( lpDrawItemStruct->itemAction & ODA_FOCUS &&
|
|
lpDrawItemStruct->itemState & ODS_SELECTED )
|
|
{
|
|
::DrawFocusRect( hDC, &lpDrawItemStruct->rcItem );
|
|
}
|
|
}
|
|
|
|
if ( hBrushHigh )
|
|
VERIFY( ::DeleteObject( hBrushHigh ));
|
|
if ( hBrushWindow )
|
|
VERIFY( ::DeleteObject( hBrushWindow ));
|
|
|
|
if ( hOldFont )
|
|
::SelectObject( hDC, hOldFont );
|
|
}
|
|
|
|
|
|
UINT CDiscussionsList::ItemFromPoint(CPoint pt, BOOL& bOutside) const
|
|
{
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
|
|
int iHeight = GetItemHeight(0);
|
|
int iCount = GetCount();
|
|
int iTopIndex = GetTopIndex();
|
|
|
|
int iListHeight = iHeight * ( iCount - iTopIndex );
|
|
rect.bottom = rect.bottom < iListHeight ? rect.bottom : iListHeight;
|
|
|
|
bOutside = !::PtInRect(&rect, pt);
|
|
|
|
if ( bOutside ) {
|
|
return 0;
|
|
}
|
|
|
|
return (pt.y / iHeight) + iTopIndex;
|
|
}
|
|
|
|
void CDiscussionsList::OnLButtonDown( UINT nFlags, CPoint point )
|
|
{
|
|
if ( point.x > m_iPosStatus ) {
|
|
BOOL bOutside;
|
|
UINT item = ItemFromPoint( point, bOutside );
|
|
RECT rcItem;
|
|
GetItemRect( item, &rcItem );
|
|
|
|
if ( (point.y < rcItem.bottom) && (point.y >= rcItem.top) ) {
|
|
FolderData *pItemData = (FolderData *)GetItemData( item );
|
|
if ( pItemData ) {
|
|
pItemData->bDownLoad = !pItemData->bDownLoad;
|
|
InvalidateRect( &rcItem );
|
|
}
|
|
}
|
|
} else {
|
|
CListBox::OnLButtonDown( nFlags, point );
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDlgSelectGroups dialog
|
|
|
|
|
|
CDlgSelectGroups::CDlgSelectGroups(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CDlgSelectGroups::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CDlgSelectGroups)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_nDiscussionSelectionCount=0;
|
|
m_nMailSelectionCount=0;
|
|
}
|
|
|
|
|
|
void CDlgSelectGroups::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CDlgSelectGroups)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CDlgSelectGroups, CDialog)
|
|
//{{AFX_MSG_MAP(CDlgSelectGroups)
|
|
ON_BN_CLICKED(IDC_BUTTON_SELECT_ALL, OnButtonSelectAll)
|
|
ON_BN_CLICKED(IDC_HELP_SELECT_FOR_DOWNLOAD, OnHelp)
|
|
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDlgSelectGroups message handlers
|
|
|
|
void CDlgSelectGroups::OnButtonSelectAll()
|
|
{
|
|
|
|
CListBox *pList = (CListBox*)GetDlgItem(IDC_LIST_DISCUSSIONS);
|
|
if (pList)
|
|
{
|
|
int nCount = pList->GetCount();
|
|
CRect rect;
|
|
MSG_FolderLine folderLine;
|
|
MSG_Master *pMaster = WFE_MSGGetMaster();
|
|
for (int i = 0; i < nCount ; i++)
|
|
{
|
|
FolderData *pData = (FolderData*)pList->GetItemData(i);
|
|
if (pData)
|
|
{ //Make sure we are setting the properties of a group, not a host
|
|
MSG_GetFolderLineById( pMaster, pData->infoData, &folderLine );
|
|
if ( folderLine.flags & MSG_FOLDER_FLAG_NEWSGROUP ||
|
|
folderLine.flags & MSG_FOLDER_FLAG_IMAPBOX ||
|
|
folderLine.flags & MSG_FOLDER_FLAG_CAT_CONTAINER)
|
|
{
|
|
pData->bDownLoad=TRUE;
|
|
pList->SetItemData(i,(DWORD)pData);
|
|
pList->GetItemRect(i,&rect);
|
|
pList->InvalidateRect(rect);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void CDlgSelectGroups::OnOK()
|
|
{
|
|
MSG_FolderLine folderLine;
|
|
MSG_Master *pMaster = WFE_MSGGetMaster();
|
|
|
|
for (int i=0 ; i <= m_DiscussionList.m_pDWordArray->GetUpperBound(); i++)
|
|
{
|
|
FolderData *pData = (FolderData*)m_DiscussionList.m_pDWordArray->GetAt(i);
|
|
if (pData)
|
|
{
|
|
if (pData->bDownLoad)
|
|
{
|
|
MSG_SetFolderPrefFlags(pData->infoData, MSG_FOLDER_PREF_OFFLINE);
|
|
MSG_GetFolderLineById( pMaster, pData->infoData, &folderLine );
|
|
if ( folderLine.flags & MSG_FOLDER_FLAG_IMAPBOX)
|
|
++m_nMailSelectionCount; //count the selected mail folders
|
|
else
|
|
++m_nDiscussionSelectionCount; //count the selected discussion groups
|
|
}
|
|
else
|
|
MSG_SetFolderPrefFlags(pData->infoData, !MSG_FOLDER_PREF_OFFLINE);
|
|
}
|
|
}
|
|
|
|
PREF_SetIntPref("mail.selection.count",(int32)m_nMailSelectionCount);
|
|
PREF_SetIntPref("offline.news.discussions_count",(int32)m_nDiscussionSelectionCount);
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
|
|
BOOL CDlgSelectGroups::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
m_DiscussionList.SubclassDlgItem( IDC_LIST_DISCUSSIONS, this );
|
|
|
|
m_iIndex = 0;
|
|
|
|
int iPosIndex, iPosName, iPosStatus;
|
|
int iListLeft = 4;
|
|
RECT rect, rcText;
|
|
|
|
CWnd *widget = GetDlgItem(IDC_LIST_DISCUSSIONS);
|
|
widget->GetWindowRect(&rect);
|
|
|
|
::SetRect( &rcText, 0, 0, 64, 64 );
|
|
|
|
iPosIndex = iListLeft + 4;
|
|
iPosName = iPosIndex + rcText.right * 3;
|
|
iPosStatus = rect.right - rect.left - 20 - GetSystemMetrics(SM_CXVSCROLL);
|
|
|
|
m_DiscussionList.SetColumnPositions( iPosIndex, iPosName, iPosStatus );
|
|
|
|
m_DiscussionList.PopulateNews(WFE_MSGGetMaster(),TRUE);
|
|
|
|
if (!m_DiscussionList.m_bHasSelectables)
|
|
AfxMessageBox(IDS_NOTHING_SUBSCRIBED);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CDlgSelectGroups::OnCancel()
|
|
{
|
|
BOOL bEnabled = FALSE;
|
|
MSG_FolderLine folderLine;
|
|
MSG_Master *pMaster = WFE_MSGGetMaster();
|
|
|
|
#ifdef WE_USE_SELECTION_COUNT // currently not using this, so don't calculate it
|
|
for (int i=0 ; i <= m_DiscussionList.m_pDWordArray->GetUpperBound(); i++)
|
|
{
|
|
FolderData *pData = (FolderData*)m_DiscussionList.m_pDWordArray->GetAt(i);
|
|
BOOL bEnabled = (BOOL)(MSG_GetFolderPrefFlags(pData->infoData) & MSG_FOLDER_PREF_OFFLINE);
|
|
if (bEnabled)
|
|
{
|
|
MSG_GetFolderLineById( pMaster, pData->infoData, &folderLine );
|
|
if ( folderLine.flags & MSG_FOLDER_FLAG_IMAPBOX)
|
|
++m_nMailSelectionCount; //count the selected mail folders
|
|
else
|
|
++m_nDiscussionSelectionCount; //count the selected discussion groups
|
|
}
|
|
}
|
|
#endif WE_USE_SELECTION_COUNT
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
void CDlgSelectGroups::OnHelp()
|
|
{
|
|
NetHelp(HELP_OFFLINE_DISCUSSION_GROUPS);
|
|
}
|