home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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);
- }
-