gecko-dev/cmd/winfe/subnews.cpp
1998-03-28 02:44:41 +00:00

1976 lines
50 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 "property.h"
#include "styles.h"
#include "helper.h"
#include "display.h"
#include "dialog.h"
#include "secnav.h"
#include "custom.h"
#include "cxabstra.h"
#include "msgcom.h"
#include "subnews.h"
#include "wfemsg.h"
#include "mnprefs.h"
#include "nethelp.h" // help
#include "xp_help.h"
#include "prefapi.h"
#include "thrdfrm.h"
#include "fldrfrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define LEVEL_ROOT 0
#define LEVEL_1 1
#define SUBSCRIBE_VISIBLE_TIMER 999
extern "C" BOOL IsNumeric(char* pStr);
extern "C" void HelperInitFonts( HDC hdc , HFONT *phFont, HFONT *phBoldFont);
extern "C" MSG_Host *DoAddNewsServer(CWnd* pParent, int nFromWhere);
extern "C" MSG_Host *DoAddIMAPServer(CWnd* pParent, char* pServerName, BOOL bImap);
extern "C" XP_Bool FE_CreateSubscribePaneOnHost(MSG_Master* master,
MWContext* parentContext, MSG_Host* host)
{
CGenericFrame *pFrame = theApp.m_pFrameList;
while (pFrame) {
if (pFrame->IsKindOf(RUNTIME_CLASS(C3PaneMailFrame))) {
C3PaneMailFrame *pThreadFrame = DYNAMIC_DOWNCAST(C3PaneMailFrame, pFrame);
pThreadFrame->SendMessage(WM_COMMAND, ID_FILE_SUBSCRIBE, (LPARAM)host);
return TRUE;
}
pFrame = pFrame->m_pNext;
}
pFrame = theApp.m_pFrameList;
while (pFrame) {
if (pFrame->IsKindOf(RUNTIME_CLASS(CFolderFrame))) {
CFolderFrame *pFolderFrame = DYNAMIC_DOWNCAST(CFolderFrame, pFrame);
pFolderFrame->SendMessage(WM_COMMAND, ID_FILE_SUBSCRIBE, (LPARAM)host);
return TRUE;
}
pFrame = pFrame->m_pNext;
}
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CServersCombo
#define SERVER_BUTTONWIDTH 24
#define SERVER_BUTTONHEIGHT 16
CServersCombo::CServersCombo()
{
m_bStaticCtl = FALSE;
m_hFont = NULL;
m_hBoldFont = NULL;
ApiApiPtr(api);
m_pIImageUnk = api->CreateClassInstance(APICLASS_IMAGEMAP);
ASSERT(m_pIImageUnk);
if (m_pIImageUnk) {
m_pIImageUnk->QueryInterface(IID_IImageMap,(LPVOID*)&m_pIImageMap);
ASSERT(m_pIImageMap);
m_pIImageMap->Initialize(IDB_MAILNEWS,16,16);
}
}
CServersCombo::~CServersCombo()
{
if (m_hFont)
theApp.ReleaseAppFont(m_hFont);
if (m_hBoldFont)
theApp.ReleaseAppFont(m_hBoldFont);
}
void CServersCombo::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 ) );
m_pIImageMap->UseHighlight( );
} else {
hBrushFill = hBrushWindow;
::SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) );
::SetTextColor( hDC, GetSysColor( COLOR_WINDOWTEXT ) );
m_pIImageMap->UseNormal( );
}
VERIFY(::FillRect( hDC, &rcItem, hBrushFill ));
if ( lpDrawItemStruct->itemID != -1 && dwItemData )
{
int idxImage;
MSG_Host *pServer = (MSG_Host *) lpDrawItemStruct->itemData;
if (MSG_IsNewsHost(pServer))
idxImage = IDX_NEWSHOST;
else
idxImage = IDX_REMOTEMAIL;
BOOL bStatic = FALSE;
#ifdef _WIN32
if ( sysInfo.m_bWin4 )
bStatic = ( lpDrawItemStruct->itemState & ODS_COMBOBOXEDIT ) ? TRUE : FALSE;
else
#endif
bStatic = m_bStaticCtl;
//Draw the news bitmap
int iIndent = 4;
m_pIImageMap->DrawImage( idxImage, iIndent, rcItem.top, hDC, FALSE );
//Draw the text
LPCTSTR name = (LPCTSTR) MSG_GetHostUIName(pServer);
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 );
//Draw the focus
if ( lpDrawItemStruct->itemAction & ODA_FOCUS &&
lpDrawItemStruct->itemState & ODS_SELECTED )
{
::DrawFocusRect( hDC, &rcItem);
}
}
if ( hBrushHigh )
VERIFY( ::DeleteObject( hBrushHigh ));
if ( hBrushWindow )
VERIFY( ::DeleteObject( hBrushWindow ));
if ( hOldFont )
::SelectObject( hDC, hOldFont );
}
BEGIN_MESSAGE_MAP( CServersCombo, CComboBox )
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSubscribeCX
CSubscribeCX::CSubscribeCX(CNetscapePropertySheet *pSheet)
: CStubsCX(NewsCX, MWContextNews)
{
m_pSheet = (CSubscribePropertySheet*)pSheet;
m_lPercent = 0;
m_bAnimated = FALSE;
}
void CSubscribeCX::SetProgressBarPercent(MWContext *pContext, int32 lPercent )
{
// Ensure the safety of the value.
lPercent = lPercent < 0 ? 0 : ( lPercent > 100 ? 100 : lPercent );
if ( m_lPercent == lPercent )
return;
m_lPercent = lPercent;
if (m_pSheet)
m_pSheet->SetProgressBarPercent(lPercent);
}
void CSubscribeCX::Progress(MWContext *pContext, const char *pMessage)
{
m_csProgress = pMessage;
if (m_pSheet)
m_pSheet->SetStatusText(pMessage);
}
int32 CSubscribeCX::QueryProgressPercent()
{
return m_lPercent;
}
void CSubscribeCX::AllConnectionsComplete(MWContext *pContext)
{
// Call the base.
CStubsCX::AllConnectionsComplete(pContext);
// Also, we can clear the progress bar now.
m_lPercent = 0;
if ( m_pSheet )
{
m_pSheet->SetProgressBarPercent(m_lPercent);
m_pSheet->AllConnectionsComplete(pContext);
}
#ifdef _WIN32
if (m_pSheet)
{
m_pSheet->SendMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
m_pSheet->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
}
#endif
}
void CSubscribeCX::UpdateStopState( MWContext *pContext )
{
#ifdef _WIN32
if (m_pSheet)
{
m_pSheet->SendMessage(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
m_pSheet->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
}
#endif
}
/////////////////////////////////////////////////////////////////////////////
// CSubscribeList
STDMETHODIMP CSubscribeList::QueryInterface(REFIID refiid, LPVOID * ppv)
{
*ppv = NULL;
if (IsEqualIID(refiid,IID_IUnknown))
*ppv = (LPUNKNOWN) this;
else if (IsEqualIID(refiid,IID_IMsgList))
*ppv = (LPMSGLIST) this;
if (*ppv != NULL) {
((LPUNKNOWN) *ppv)->AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CSubscribeList::AddRef(void)
{
return ++m_ulRefCount;
}
STDMETHODIMP_(ULONG) CSubscribeList::Release(void)
{
ULONG ulRef;
ulRef = --m_ulRefCount;
if (m_ulRefCount == 0)
delete this;
return ulRef;
}
void CSubscribeList::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pSubscribePage)
m_pSubscribePage->ListChangeStarting( pane, asynchronous,
notify, where, num );
}
void CSubscribeList::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pSubscribePage)
m_pSubscribePage->ListChangeFinished( pane, asynchronous,
notify, where, num );
}
void CSubscribeList::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
int *focus)
{
}
void CSubscribeList::SelectItem( MSG_Pane* pane, int item )
{
}
/////////////////////////////////////////////////////////////////////////////
// CNewsgroupsOutlinerParent
BEGIN_MESSAGE_MAP(CNewsgroupsOutlinerParent, COutlinerParent)
END_MESSAGE_MAP()
CNewsgroupsOutlinerParent::CNewsgroupsOutlinerParent()
{
}
CNewsgroupsOutlinerParent::~CNewsgroupsOutlinerParent()
{
}
// Draw Column text and Sort indicator
BOOL CNewsgroupsOutlinerParent::RenderData (int idColumn, CRect & rect, CDC &dc, const char * text)
{
CNewsgroupsOutliner* pOutliner = (CNewsgroupsOutliner*) m_pOutliner;
// Draw Text String
if (idColumn == ID_COLNEWS_SUBSCRIBE)
dc.DrawText(text, _tcslen(text), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
else
dc.DrawText(text, _tcslen(text), &rect, DT_SINGLELINE | DT_VCENTER);
// Draw Sort Indicator
MSG_COMMAND_CHECK_STATE sortType =
pOutliner->m_attribSortBy == idColumn ? MSG_Checked : MSG_Unchecked;
int idxImage = pOutliner->m_bSortAscending ? IDX_SORTINDICATORDOWN : IDX_SORTINDICATORUP;
CSize cs = dc.GetTextExtent(text, _tcslen(text));
if (idColumn == pOutliner->m_attribSortBy && cs.cx + 22 <= rect.Width()) {
m_pIImage->DrawTransImage( idxImage,
rect.left + 8 + cs.cx,
(rect.top + rect.bottom) / 2 - 4,
&dc );
}
return TRUE;
}
COutliner * CNewsgroupsOutlinerParent::GetOutliner ( void )
{
return new CNewsgroupsOutliner;
}
void CNewsgroupsOutlinerParent::CreateColumns ( void )
{
CString text, newName;
CRect colRect;
int col1, col2, col3, nPos;
int pos1, pos2, pos3;
if (m_pSheet->nameWidth == -1)
{
CDC* pDC = GetDC();
text.LoadString(IDS_SUBSCRIBE);
CSize textSize = pDC->GetTextExtent(LPCTSTR(text), text.GetLength());
ReleaseDC(pDC);
GetClientRect(colRect);
col2 = textSize.cx + 10;
col3 = col2;
int nScrollWidth = ::GetSystemMetrics(SM_CXVSCROLL);
col1 = (colRect.right - colRect.left - nScrollWidth) - (col2 + col3);
m_pSheet->nameWidth = col1;
m_pSheet->subscribeWidth = col2;
m_pSheet->postWidth = col3;
m_pSheet->namePos = 0;
m_pSheet->subscribePos = 1;
m_pSheet->postPos = 2;
}
else
{
col1 = m_pSheet->nameWidth;
col2 = m_pSheet->subscribeWidth;
col3 = m_pSheet->postWidth;
pos1 = m_pSheet->namePos;
pos2 = m_pSheet->subscribePos;
pos3 = m_pSheet->postPos;
}
text.LoadString(IDS_NEWSGROUP_NAME);
m_pOutliner->AddColumn (text, ID_COLNEWS_NAME, col1, colRect.right,
ColumnVariable, col1, FALSE);
text.LoadString(IDS_SUBSCRIBE);
nPos = text.Find('&');
if (nPos >= 0)
newName = text.Left(nPos) + text.Right(text.GetLength() - nPos - 1);
else
newName = text;
m_pOutliner->AddColumn (newName, ID_COLNEWS_SUBSCRIBE, col2, colRect.right,
ColumnVariable, col2, FALSE);
text.LoadString(IDS_POSTINGS);
m_pOutliner->AddColumn (text, ID_COLNEWS_POSTINGS, col3, colRect.right,
ColumnVariable, col3, FALSE);
m_pOutliner->SetColumnPos( ID_COLNEWS_NAME, pos1 );
m_pOutliner->SetColumnPos( ID_COLNEWS_SUBSCRIBE, pos2 );
m_pOutliner->SetColumnPos( ID_COLNEWS_POSTINGS, pos3 );
m_pOutliner->SetImageColumn( ID_COLNEWS_NAME );
}
//////////////////////////////////////////////////////////////////////////////
// CNewsgroupsOutliner
CNewsgroupsOutliner::CNewsgroupsOutliner()
{
ApiApiPtr(api);
m_pUnkUserImage = api->CreateClassInstance(APICLASS_IMAGEMAP);
if (m_pUnkUserImage) {
m_pUnkUserImage->QueryInterface(IID_IImageMap,(LPVOID*)&m_pIUserImage);
ASSERT(m_pIUserImage);
m_pIUserImage->Initialize(IDB_MAILNEWS,16,16);
}
m_pAncestor = NULL;
m_pszExtraText = new char[256];
m_pPage = NULL;
}
CNewsgroupsOutliner::~CNewsgroupsOutliner ( )
{
if (m_pUnkUserImage) {
if (m_pIUserImage)
m_pUnkUserImage->Release();
}
delete [] m_pAncestor;
delete [] m_pszExtraText;
}
int CNewsgroupsOutliner::GetDepth( int iLine )
{
MSG_GroupNameLine groupLine;
MSG_GetGroupNameLineByIndex(m_pPane, (MSG_ViewIndex) iLine, 1, &groupLine );
return groupLine.level;
}
int CNewsgroupsOutliner::GetNumChildren( int iLine )
{
MSG_GroupNameLine groupLine;
MSG_GetGroupNameLineByIndex(m_pPane, (MSG_ViewIndex) iLine, 1, &groupLine );
return groupLine.flags & MSG_GROUPNAME_FLAG_HASCHILDREN ? 1 : 0;
}
BOOL CNewsgroupsOutliner::IsCollapsed( int iLine )
{
MSG_GroupNameLine groupLine;
MSG_GetGroupNameLineByIndex(m_pPane, (MSG_ViewIndex) iLine, 1, &groupLine );
return (groupLine.flags & MSG_GROUPNAME_FLAG_ELIDED) ? TRUE : FALSE;
}
BOOL CNewsgroupsOutliner::RenderData(UINT iColumn, CRect &rect, CDC &dc, const char * text )
{
if (iColumn != ID_COLNEWS_SUBSCRIBE)
return FALSE;
MSG_Host* pHost = ((CSubscribePropertySheet*)(GetPage()->GetParent()))->GetHost();
if ((m_GroupLine.flags & MSG_GROUPNAME_FLAG_HASCHILDREN) && MSG_IsNewsHost(pHost))
return TRUE;
int idxImage = -1;
if (m_GroupLine.flags & MSG_GROUPNAME_FLAG_SUBSCRIBED)
idxImage = IDX_CHECKMARK;
else
idxImage = IDX_CHECKBOX;
m_pIUserImage->DrawImage(idxImage, rect.left + ( ( rect.Width ( ) - 16 ) / 2 ),
rect.top, &dc, FALSE);
return TRUE;
}
int CNewsgroupsOutliner::TranslateIcon(void * pLineData)
{
ASSERT(pLineData);
MSG_GroupNameLine *pGroup = (MSG_GroupNameLine*)pLineData;
if (pGroup->flags & MSG_GROUPNAME_FLAG_HASCHILDREN)
{
if (pGroup->flags & MSG_GROUPNAME_FLAG_ELIDED)
return IDX_MAILFOLDERCLOSED;
else
return IDX_MAILFOLDEROPEN;
}
else
{
if (pGroup->flags & MSG_GROUPNAME_FLAG_NEW_GROUP)
return IDX_NEWSNEW;
else
return IDX_NEWSGROUP;
}
}
int CNewsgroupsOutliner::TranslateIconFolder (void * pData)
{
ASSERT(pData);
MSG_GroupNameLine *pGroup = (MSG_GroupNameLine*)pData;
if (pGroup->flags & MSG_GROUPNAME_FLAG_HASCHILDREN)
{
if (pGroup->flags & MSG_GROUPNAME_FLAG_ELIDED)
return(OUTLINER_CLOSEDFOLDER);
else
return(OUTLINER_OPENFOLDER);
}
return (OUTLINER_ITEM);
}
BOOL CNewsgroupsOutliner::ColumnCommand(int iColumn, int iLine)
{
if (iColumn == ID_COLNEWS_SUBSCRIBE)
{
MSG_ViewIndex indices;
indices = (MSG_ViewIndex)iLine;
MSG_Command(GetPane(), MSG_ToggleSubscribed, &indices, 1);
}
return FALSE;
}
void* CNewsgroupsOutliner::AcquireLineData(int line)
{
MSG_Pane *pPane = GetPane();
if (pPane && m_pPage)
{
if (MSG_SubscribeGetMode(pPane) != m_pPage->GetMode())
return NULL;
}
else
return NULL;
delete [] m_pAncestor;
m_pAncestor = NULL;
m_pszExtraText[ 0 ] = '\0';
if ( line >= m_iTotalLines)
return NULL;
if ( !MSG_GetGroupNameLineByIndex(m_pPane, line, 1, &m_GroupLine ))
return NULL;
return &m_GroupLine;
}
void CNewsgroupsOutliner::GetTreeInfo( int iLine, uint32 * pFlags, int* pDepth,
OutlinerAncestorInfo** pAncestor)
{
delete [] m_pAncestor;
m_pAncestor = NULL;
MSG_GroupNameLine groupLine;
MSG_GetGroupNameLineByIndex(m_pPane, (MSG_ViewIndex) iLine, 1, &groupLine );
if ( pAncestor ) {
m_pAncestor = new OutlinerAncestorInfo[groupLine.level + 1];
int i = groupLine.level;
int idx = iLine + 1;
while ( i > 0 ) {
if ( idx < m_iTotalLines ) {
MSG_GroupNameLine groupLine;
MSG_GetGroupNameLineByIndex( m_pPane, idx, 1, &groupLine );
if ( groupLine.level == i ) {
m_pAncestor[i].has_prev = TRUE;
m_pAncestor[i].has_next = TRUE;
i--;
idx++;
} else if ( groupLine.level < i ) {
m_pAncestor[i].has_prev = FALSE;
m_pAncestor[i].has_next = FALSE;
i--;
} else {
idx++;
}
} else {
m_pAncestor[i].has_prev = FALSE;
m_pAncestor[i].has_next = FALSE;
i--;
}
}
m_pAncestor[i].has_prev = FALSE;
m_pAncestor[i].has_next = FALSE;
*pAncestor = m_pAncestor;
}
if ( pFlags ) *pFlags = groupLine.flags;
if ( pDepth ) *pDepth = groupLine.level;// do not -1
}
void CNewsgroupsOutliner::ReleaseLineData(void *)
{
delete [] m_pAncestor;
m_pAncestor = NULL;
}
LPCTSTR CNewsgroupsOutliner::GetColumnText(UINT iColumn, void* pLineData)
{
MSG_GroupNameLine* pGroup = (MSG_GroupNameLine*)pLineData;
memset(m_pszExtraText, '\0', 256);
switch (iColumn)
{
case ID_COLNEWS_NAME:
strncpy(m_pszExtraText, pGroup->name, strlen(pGroup->name));
break;
case ID_COLNEWS_POSTINGS:
if (pGroup->total >= 0) {
sprintf(m_pszExtraText, "%ld", pGroup->total);
}
break;
default:
break;
}
return m_pszExtraText;
}
void CNewsgroupsOutliner::OnSelChanged()
{
if (!GetPage())
return;
if (GetPage()->m_bFromTyping)
{
GetPage()->m_bFromTyping = FALSE;
return;
}
MSG_GroupNameLine group;
MSG_ViewIndex *indices;
int count;
GetSelection( indices, count );
if ( count == 1 && MSG_GetGroupNameLineByIndex(m_pPane, indices[0], 1, &group))
GetPage()->DoSelChanged(&group);
}
void CNewsgroupsOutliner::OnSelDblClk()
{
MSG_ViewIndex *indices;
int count;
MSG_GroupNameLine group;
GetSelection( indices, count );
if ( count == 1 && MSG_GetGroupNameLineByIndex(m_pPane, indices[0], 1, &group))
{
if (group.flags & MSG_GROUPNAME_FLAG_HASCHILDREN)
ToggleExpansion(indices[0]);
else
MSG_Command(GetPane(), MSG_ToggleSubscribed, &indices[0], 1);
}
}
int CNewsgroupsOutliner::ToggleExpansion(int iLine)
{
int count;
MSG_ViewIndex *indices;
MSG_GroupNameLine group;
int nResult = CMailNewsOutliner::ToggleExpansion(iLine);
GetSelection(indices, count);
if (indices[0] == iLine &&
MSG_GetGroupNameLineByIndex(m_pPane, iLine, 1, &group) &&
GetPage()->GetMode() == MSG_SubscribeAll)
{
if (group.flags & MSG_GROUPNAME_FLAG_HASCHILDREN)
{
if (group.flags & MSG_GROUPNAME_FLAG_ELIDED)
GetPage()->GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(TRUE);
else
GetPage()->GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(FALSE);
}
else
{
GetPage()->GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(FALSE);
}
}
return nResult;
}
// for select the first item in the outliner,
// so user can tab through
BOOL CNewsgroupsOutliner::SelectInitialItem()
{
int count;
MSG_ViewIndex *indices;
GetSelection( indices, count );
if (GetPage() && GetPage()->m_bFromTyping)
return TRUE;
if (GetTotalLines() && !count )
{
SelectItem(0);
InvalidateLine(0);
return TRUE;
}
if (count)
return TRUE;
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CSubscribePropertyPage
CSubscribePropertyPage::CSubscribePropertyPage(CWnd *pParent,
MWContext *pContext, MSG_SubscribeMode nMode, UINT nID)
: CNetscapePropertyPage(nID)
{
m_pParent = (CSubscribePropertySheet*)pParent;
m_bActivated = FALSE;
m_bSelChanged = FALSE;
m_bNotifyAll = FALSE;
m_bInitDialog = FALSE;
m_bFromTyping = FALSE;
m_bDoShowWindow = TRUE;
m_nMode = nMode;
m_uTimer = 0;
m_hNewsHost = NULL;
m_pOutliner = NULL;
m_bProcessGetDeletion = FALSE;
m_bListChangeStarting = FALSE;
}
CSubscribePropertyPage::~CSubscribePropertyPage()
{
if (m_hNewsHost)
delete [] m_hNewsHost;
m_hNewsHost = NULL;
}
MWContext* CSubscribePropertyPage::GetContext()
{
CSubscribePropertySheet* pSheet = (CSubscribePropertySheet*)GetParent();
CSubscribeCX* pCX = pSheet->GetSubscribeContext();
if (pCX)
return pCX->GetContext();
else
return NULL;
}
CSubscribeCX * CSubscribePropertyPage::GetSubscribeContext()
{ return ((CSubscribePropertySheet*)GetParent())->GetSubscribeContext(); }
MSG_Pane * CSubscribePropertyPage::GetPane()
{ return ((CSubscribePropertySheet*)GetParent())->GetSubscribePane(); }
CSubscribeList* CSubscribePropertyPage::GetList()
{ return ((CSubscribePropertySheet*)GetParent())->GetSubscribeList(); }
CSubscribeList** CSubscribePropertyPage::GetListHandle()
{ return ((CSubscribePropertySheet*)GetParent())->GetSubscribeHandle(); }
void CSubscribePropertyPage::SetSubscribeContext(CSubscribeCX *pCX)
{ ((CSubscribePropertySheet*)GetParent())->SetSubscribeContext(pCX); }
void CSubscribePropertyPage::SetPane(MSG_Pane *pPane)
{ ((CSubscribePropertySheet*)GetParent())->SetSubscribePane(pPane); }
void CSubscribePropertyPage::SetList(CSubscribeList* pList)
{ ((CSubscribePropertySheet*)GetParent())->SetSubscribeList(pList); }
BOOL CSubscribePropertyPage::IsOutlinerHasFocus()
{
if (GetFocus() == m_pOutliner)
return TRUE;
else
return FALSE;
}
static void
DoFetchGroups(MSG_Pane* pane, void* closure)
{
CSubscribePropertySheet* tmp = (CSubscribePropertySheet*) closure;
tmp->GetAllGroupPage()->OnGetDeletions();
}
static void
DoEnableAllControls(MSG_Pane* pane, void* closure)
{
CSubscribePropertySheet* tmp = (CSubscribePropertySheet*) closure;
if (tmp->GetAllGroupPage()->m_bProcessGetDeletion)
{
tmp->GetAllGroupPage()->m_bProcessGetDeletion = FALSE;
tmp->GetAllGroupPage()->EnableAllControls(TRUE);
}
CNewsgroupsOutliner* pOutliner = tmp->GetAllGroupPage()->GetOutliner();
if (pOutliner)
pOutliner->SelectInitialItem();
}
static MSG_SubscribeCallbacks CallbackStruct = {
DoFetchGroups,
DoEnableAllControls
};
BOOL CSubscribePropertyPage::OnInitDialog()
{
BOOL ret = CNetscapePropertyPage::OnInitDialog();
m_ServerCombo.SubclassDlgItem( IDC_COMBO_SERVER, this );
m_bInitDialog = TRUE;
CRect winRect, ctlRect;
GetDlgItem(IDC_NEWSGROUPS)->ShowWindow( SW_HIDE );
GetDlgItem(IDC_NEWSGROUPS)->GetWindowRect(ctlRect);
GetWindowRect(winRect);
ctlRect.OffsetRect(-winRect.left, -winRect.top);
ctlRect.InflateRect(-1, -1);
#ifdef _WIN32
m_OutlinerParent.CreateEx ( WS_EX_CLIENTEDGE, NULL, _T("NSOutlinerParent"),
WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_TABSTOP,
ctlRect.left, ctlRect.top,
ctlRect.right - ctlRect.left, ctlRect.bottom - ctlRect.top,
this->m_hWnd, NULL);
#else
m_OutlinerParent.Create( NULL, _T("NSOutlinerParent"),
WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_TABSTOP,
ctlRect, this, NULL);
#endif
m_OutlinerParent.SetPropertySheet(m_pParent);
m_OutlinerParent.CreateColumns();
m_pOutliner = (CNewsgroupsOutliner *) m_OutlinerParent.m_pOutliner;
m_pOutliner->SetPage(this);
if (m_nMode != MSG_SubscribeNew)
{
#ifdef _WIN32
((CEdit*)GetDlgItem(IDC_EDIT_NEWSGROUP))->SetLimitText(MSG_MAXGROUPNAMELENGTH - 1);
#else
((CEdit*)GetDlgItem(IDC_EDIT_NEWSGROUP))->LimitText(MSG_MAXGROUPNAMELENGTH - 1);
#endif
}
if (m_pOutliner)
m_pOutliner->SelectInitialItem();
return ret;
}
void CSubscribePropertyPage::OnShowWindow(BOOL bShow, UINT nStatus)
{
if (bShow)
{
if (m_uTimer == 0)
m_uTimer = SetTimer(SUBSCRIBE_VISIBLE_TIMER, 100, NULL);
if (m_uTimer)
m_bDoShowWindow = TRUE;
else
{
if (!InitSubscribePage())
m_pParent->EndDialog(IDCANCEL);
}
}
}
BOOL CSubscribePropertyPage::InitSubscribePage()
{
BOOL result = TRUE;
if (m_bInitDialog)
{
m_bInitDialog = FALSE;
result = CreateSubscribePage();
}
if (result && GetPane() &&
m_nMode != MSG_SubscribeGetMode(GetPane()))
{
MSG_SubscribeSetMode(GetPane(), m_nMode);
if (GetList())
GetList()->SetSubscribePage(this);
m_pOutliner->SetPane(GetPane());
}
return result;
}
BOOL CSubscribePropertyPage::CreateSubscribePage()
{
MSG_Master * pMaster = WFE_MSGGetMaster();
SetNewsHosts(pMaster);
//create CSubscribePane for subscribe newsgroup
MSG_Pane* pPane = GetPane();
if (pPane == NULL)
{
CSubscribeCX* pCX = new CSubscribeCX(m_pParent);
pCX->GetContext()->fancyFTP = TRUE;
pCX->GetContext()->fancyNews = TRUE;
pCX->GetContext()->intrupt = FALSE;
pCX->GetContext()->reSize = FALSE;
pCX->GetContext()->type = MWContextNews;
SetSubscribeContext(pCX);
MSG_Host *pCurrentHost = ((CSubscribePropertySheet*)GetParent())->GetHost();
pPane = MSG_CreateSubscribePaneForHost(pCX->GetContext(), pMaster, pCurrentHost);
if (!pPane)
return FALSE;
((CSubscribePropertySheet*)GetParent())->SetSubscribePane(pPane);
if (m_pOutliner)
m_pOutliner->SetPane(pPane);
//use CSubscribeList to hook up with the backend
CSubscribeList *pInstance = new CSubscribeList(this);
SetList(pInstance);
CSubscribeList** hList = GetListHandle();
pInstance->QueryInterface(IID_IMsgList, (LPVOID *)hList);
MSG_SetFEData((MSG_Pane*)pPane, (void *)pInstance);
if (GetList())
GetList()->SetSubscribePage(this);
MSG_SubscribeSetCallbacks(pPane, &CallbackStruct, GetParent());
}
return TRUE;
}
void CSubscribePropertyPage::SetNewsHosts(MSG_Master* pMaster)
{
int nDefaultHost = 0;
MSG_Host *pNewsHost = NULL;
int32 nTotal = MSG_GetSubscribingHosts(pMaster, NULL, 0);
if (nTotal)
{
m_hNewsHost = new MSG_Host* [nTotal];
MSG_GetSubscribingHosts(pMaster, m_hNewsHost, nTotal);
for (int i = 0; i < nTotal; i++)
{
int addedIndex = GetServerCombo()->AddString(MSG_GetHostUIName(m_hNewsHost[i]));
if (addedIndex != CB_ERR)
{
GetServerCombo()->SetItemDataPtr(addedIndex, m_hNewsHost[i]);
}
}
MSG_Host *pCurrentHost = ((CSubscribePropertySheet*)GetParent())->GetHost();
if (pCurrentHost)
{
for (i = 0; i < nTotal; i++)
{
pNewsHost = (MSG_Host *) GetServerCombo()->GetItemDataPtr(i);
if (pNewsHost == pCurrentHost)
{
nDefaultHost = i;
break;
}
}
}
else
{
MSG_Host* pDefhost = MSG_GetMSGHostFromNewsHost(MSG_GetDefaultNewsHost(pMaster));
for (i = 0; i < nTotal; i++)
{
pNewsHost = (MSG_Host *) GetServerCombo()->GetItemDataPtr(i);
if (pDefhost == pNewsHost)
{
nDefaultHost = i;
((CSubscribePropertySheet*)GetParent())->SetHost(pNewsHost);
break;
}
}
}
GetServerCombo()->SetCurSel(i);
if (pNewsHost && MSG_IsIMAPHost(pNewsHost))
m_pParent->EnableNonImapPages(FALSE);
}
}
BOOL CSubscribePropertyPage::OnSetActive()
{
if(!CNetscapePropertyPage::OnSetActive())
return(FALSE);
if(!m_bActivated)
m_bActivated = TRUE;
if (m_pParent)
m_pParent->SetStatusText("");
if (GetOutliner())
{
GetOutliner()->SetColumnSize(ID_COLNEWS_NAME, m_pParent->nameWidth);
GetOutliner()->SetColumnSize(ID_COLNEWS_SUBSCRIBE, m_pParent->subscribeWidth);
GetOutliner()->SetColumnSize(ID_COLNEWS_POSTINGS, m_pParent->postWidth);
GetOutliner()->SetColumnPos(ID_COLNEWS_NAME, m_pParent->namePos);
GetOutliner()->SetColumnPos(ID_COLNEWS_SUBSCRIBE, m_pParent->subscribePos);
GetOutliner()->SetColumnPos(ID_COLNEWS_POSTINGS, m_pParent->postPos);
}
ClearNewsgroupSelection();
//set news host
int nSelection = GetServerCombo()->GetCurSel();
MSG_Host *pSelHost = (MSG_Host *)GetServerCombo()->GetItemDataPtr(nSelection);
MSG_Host *pCurrentHost = ((CSubscribePropertySheet*)GetParent())->GetHost();
if (pSelHost != pCurrentHost) //not the current selected server
{
int nNewIndex = 0;
int nTotal = GetServerCombo()->GetCount();
for (int i = 0; i < nTotal; i++)
{
MSG_Host *pNewsHost = (MSG_Host *)GetServerCombo()->GetItemDataPtr(i);
if (pNewsHost == pCurrentHost)
{
nNewIndex = i;
break;
}
}
// the checking id for if can't fiind a match and nSelection != nNewIndex
if (nNewIndex != nSelection)
GetServerCombo()->SetCurSel(nNewIndex);
}
if (GetOutliner())
{
if (GetOutliner()->SelectInitialItem())
{
int count;
MSG_ViewIndex *indices;
MSG_GroupNameLine group;
GetOutliner()->GetSelection( indices, count );
if (MSG_GetGroupNameLineByIndex(GetPane(), indices[0], 1, &group))
CheckSubscribeButton(&group);
}
if (m_nMode == MSG_SubscribeNew)
{
if (GetOutliner()->GetTotalLines())
GetDlgItem(IDC_CLEAR_NEW)->EnableWindow(TRUE);
else
GetDlgItem(IDC_CLEAR_NEW)->EnableWindow(FALSE);
}
}
return(TRUE);
}
BOOL CSubscribePropertyPage::OnKillActive()
{
m_pParent->nameWidth = GetOutliner()->GetColumnSize(ID_COLNEWS_NAME);
m_pParent->subscribeWidth = GetOutliner()->GetColumnSize(ID_COLNEWS_SUBSCRIBE);
m_pParent->postWidth = GetOutliner()->GetColumnSize(ID_COLNEWS_POSTINGS);
m_pParent->namePos = GetOutliner()->GetColumnPos(ID_COLNEWS_NAME);
m_pParent->subscribePos = GetOutliner()->GetColumnPos(ID_COLNEWS_SUBSCRIBE);
m_pParent->postPos = GetOutliner()->GetColumnPos(ID_COLNEWS_POSTINGS);
ShowWindow(SW_HIDE); // Hide window to prevent flash list
return CNetscapePropertyPage::OnKillActive();
}
void CSubscribePropertyPage::DoSelChanged(MSG_GroupNameLine* pGroup)
{
if (m_nMode == MSG_SubscribeAll)
{
if (!(pGroup->flags & MSG_GROUPNAME_FLAG_HASCHILDREN))
{
m_bSelChanged = TRUE;
GetDlgItem(IDC_EDIT_NEWSGROUP)->SetWindowText(pGroup->name);
}
if (m_bProcessGetDeletion)
return;
if (pGroup->flags & MSG_GROUPNAME_FLAG_HASCHILDREN)
{
if (pGroup->flags & MSG_GROUPNAME_FLAG_ELIDED)
GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(TRUE);
else
GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(FALSE);
}
}
CheckSubscribeButton(pGroup);
}
void CSubscribePropertyPage::CheckSubscribeButton(MSG_GroupNameLine* pGroup)
{
if (!pGroup)
return;
if (pGroup->flags & MSG_GROUPNAME_FLAG_HASCHILDREN)
{
GetDlgItem(IDC_SUBSCRIBE)->EnableWindow(FALSE);
GetDlgItem(IDC_UNSUBSCRIBE)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_SUBSCRIBE)->EnableWindow(TRUE);
GetDlgItem(IDC_UNSUBSCRIBE)->EnableWindow(TRUE);
}
}
void CSubscribePropertyPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
void CSubscribePropertyPage::CleanupOnClose()
{
CSubscribeList* pList = GetList();
if (pList)
{
pList->Release();
SetList(NULL);
}
CSubscribeCX* pCX = GetSubscribeContext();
if (pCX)
{
if(!pCX->IsDestroyed())
pCX->DestroyContext();
SetSubscribeContext(NULL);
}
MSG_Pane * pPane = GetPane();
if (pPane)
{
MSG_DestroyPane(pPane);
SetPane(NULL);
}
}
void CSubscribePropertyPage::OnOK()
{
if (!m_bActivated) // this is to fix the crash below when m_pOutliner
return; // is NULL.
if (m_bProcessGetDeletion && GetSubscribeContext())
{
if (XP_IsContextBusy(GetContext()))
XP_InterruptContext(GetContext());
}
CPropertyPage::OnOK();
CleanupOnClose();
}
void CSubscribePropertyPage::OnCancel()
{
if (m_bProcessGetDeletion && GetSubscribeContext())
{
if (XP_IsContextBusy(GetContext()))
XP_InterruptContext(GetContext());
}
if (GetPane())
MSG_SubscribeCancel(GetPane());
CNetscapePropertyPage::OnCancel();
CleanupOnClose();
}
void CSubscribePropertyPage::OnAddServer()
{
CServerTypeDialog serverTypeDialog(this->GetParent());
if (IDOK == serverTypeDialog.DoModal())
{
MSG_Host *pNewHost = serverTypeDialog.GetNewHost();
if (pNewHost)
{
int nIndex = GetServerCombo()->AddString(MSG_GetHostUIName(pNewHost));
((CSubscribePropertySheet*)GetParent())->AddServer(pNewHost);
if (nIndex != CB_ERR)
{
m_bFromTyping = FALSE;
GetServerCombo()->SetItemDataPtr(nIndex, pNewHost);
GetServerCombo()->SetCurSel(nIndex);
OnChangeServer();
}
}
}
}
void CSubscribePropertyPage::OnSubscribeNewsgroup()
{
int count;
MSG_ViewIndex *indices;
MSG_GroupNameLine group;
m_pOutliner->GetSelection( indices, count );
for (int i = 0; i < count; i++)
{
MSG_GetGroupNameLineByIndex(GetPane(), indices[i], 1, &group);
if (!(group.flags & MSG_GROUPNAME_FLAG_SUBSCRIBED))
MSG_Command(GetPane(), MSG_ToggleSubscribed, &indices[i], 1);
}
//Get updated info
MSG_GetGroupNameLineByIndex(GetPane(), indices[0], 1, &group);
CheckSubscribeButton(&group);
}
void CSubscribePropertyPage::OnUnsubscribeNewsgroup()
{
int count;
MSG_ViewIndex *indices;
MSG_GroupNameLine group;
m_pOutliner->GetSelection( indices, count );
for (int i = 0; i < count; i++)
{
MSG_GetGroupNameLineByIndex(GetPane(), indices[i], 1, &group);
if (group.flags & MSG_GROUPNAME_FLAG_SUBSCRIBED)
MSG_Command(GetPane(), MSG_ToggleSubscribed, &indices[i], 1);
}
//Get updated info
MSG_GetGroupNameLineByIndex(GetPane(), indices[0], 1, &group);
CheckSubscribeButton(&group);
}
void CSubscribePropertyPage::OnChangeServer()
{
CSubscribePropertySheet* pParent = (CSubscribePropertySheet*)GetParent();
MSG_Host *pCurrentHost = pParent->GetHost();
int nIndex = GetServerCombo()->GetCurSel();
MSG_Host *pHost = (MSG_Host *)GetServerCombo()->GetItemDataPtr(nIndex);
if (pHost == pCurrentHost)
return;
DoStopListChange();
ClearNewsgroupSelection();
if (m_nMode != MSG_SubscribeNew && GetDlgItem(IDC_EDIT_NEWSGROUP))
{
GetDlgItem(IDC_EDIT_NEWSGROUP)->SetWindowText("");
//SetWindowText() caused call to OnChangeNewsgroup() and set
//m_bFromTyping == TRUE, reset it back to FALSE
m_bFromTyping = FALSE;
}
GetOutliner()->SetTotalLines(0); // fix for bug# 38007
pParent->SetHost(pHost);
MSG_SubscribeSetHost(GetPane(), pHost);
if (MSG_IsIMAPHost(pHost))
m_pParent->EnableNonImapPages(FALSE);
else
m_pParent->EnableNonImapPages(TRUE);
}
void CSubscribePropertyPage::EnableAllControls(BOOL bEnable)
{
CWnd *wnd = NULL;
if (wnd = GetDlgItem(IDC_EDIT_NEWSGROUP))
wnd->EnableWindow(bEnable);
if (wnd = GetDlgItem(IDC_SUBSCRIBE))
wnd->EnableWindow(bEnable);
if (wnd = GetDlgItem(IDC_UNSUBSCRIBE))
wnd->EnableWindow(bEnable);
if (wnd = GetDlgItem(IDC_EXPAND_ALL))
wnd->EnableWindow(bEnable);
if (wnd = GetDlgItem(IDC_COLLAPSE_ALL))
wnd->EnableWindow(bEnable);
if (wnd = GetDlgItem(IDC_GET_DELETE))
wnd->EnableWindow(bEnable);
if (wnd = GetDlgItem(IDC_ADD_SERVER))
wnd->EnableWindow(bEnable);
if (wnd = GetDlgItem(IDC_COMBO_SERVER))
wnd->EnableWindow(bEnable);
if (wnd = GetParent()->GetDlgItem(IDOK))
wnd->EnableWindow(bEnable);
if (bEnable == TRUE)
m_pParent->StopAnimation();
}
void CSubscribePropertyPage::DoStopListChange()
{
if (m_bListChangeStarting)
{
if (GetSubscribeContext() && XP_IsContextBusy(GetContext()))
XP_InterruptContext(GetContext());
m_bListChangeStarting = FALSE;
}
}
void CSubscribePropertyPage::ClearNewsgroupSelection()
{
if (m_pOutliner && m_pOutliner->IsWindowVisible())
{
if (m_pOutliner->GetTotalLines())
{
int count;
MSG_ViewIndex *indices;
m_pOutliner->GetSelection(indices, count);
if (count)
m_pOutliner->SelectItem(-1);
}
}
}
void CSubscribePropertyPage::ListChangeStarting(MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num)
{
if ( pane == GetPane() )
{
m_bListChangeStarting = TRUE;
if (m_pOutliner)
m_pOutliner->MysticStuffStarting(asynchronous, notify, where, num );
}
}
void CSubscribePropertyPage::OnTimer(UINT nIDEvent)
{
if (m_uTimer == nIDEvent)
{
if (m_bNotifyAll && m_pOutliner->IsWindowVisible())
{
m_pOutliner->MysticStuffFinishing(m_bAsynchronous, MSG_NotifyAll, 0, 0);
m_pOutliner->SetTotalLines(CASTINT(MSG_GetNumLines(GetPane())));
m_bNotifyAll = FALSE;
KillTimer(m_uTimer);
m_uTimer = 0;
}
if (IsWindowVisible() && m_bDoShowWindow)
{
BOOL result = InitSubscribePage();
m_bDoShowWindow = FALSE;
KillTimer(m_uTimer);
m_uTimer = 0;
if (!result)
m_pParent->EndDialog(IDCANCEL);
}
}
}
void CSubscribePropertyPage::ListChangeFinished(MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where, int32 num)
{
if ( pane == GetPane() )
{
m_bListChangeStarting = FALSE;
if (m_pOutliner)
{
//check if there's a MSG_NotifyAll and the outliner is not visible,
//when it is visible, do MSG_NotifyAll at that time
if (notify == MSG_NotifyAll && !m_pOutliner->IsWindowVisible())
{
m_uTimer = SetTimer(SUBSCRIBE_VISIBLE_TIMER, 100, NULL);
if (m_uTimer)
{
m_bNotifyAll = TRUE;
m_bAsynchronous = asynchronous;
return;
}
}
if (m_bNotifyAll && m_pOutliner->IsWindowVisible() &&
notify != MSG_NotifyAll)
{
if (notify != MSG_NotifyAll)
m_pOutliner->MysticStuffFinishing(asynchronous, MSG_NotifyAll, 0, 0);
m_bNotifyAll = FALSE;
}
m_pOutliner->MysticStuffFinishing(asynchronous, notify, where, num);
m_pOutliner->SetTotalLines(CASTINT(MSG_GetNumLines(GetPane())));
}
}
}
BEGIN_MESSAGE_MAP(CSubscribePropertyPage, CNetscapePropertyPage)
ON_WM_TIMER()
ON_WM_SHOWWINDOW()
ON_BN_CLICKED(IDC_ADD_SERVER, OnAddServer)
ON_BN_CLICKED(IDC_SUBSCRIBE, OnSubscribeNewsgroup)
ON_BN_CLICKED(IDC_UNSUBSCRIBE, OnUnsubscribeNewsgroup)
ON_CBN_SELCHANGE(IDC_COMBO_SERVER, OnChangeServer)
ON_BN_CLICKED(IDOK, OnOK)
ON_BN_CLICKED(IDCANCEL, OnCancel)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAllNewsgroupsPage
CAllNewsgroupsPage::CAllNewsgroupsPage(CWnd *pParent,
MWContext *pContext, MSG_SubscribeMode nMode)
: CSubscribePropertyPage(pParent, pContext, nMode, IDD)
{
}
BOOL CAllNewsgroupsPage::OnInitDialog()
{
BOOL ret = CSubscribePropertyPage::OnInitDialog();
return ret;
}
BOOL CAllNewsgroupsPage::OnKillActive()
{
OnStop();
return CSubscribePropertyPage::OnKillActive();
}
void CAllNewsgroupsPage::OnChangeNewsgroup()
{
if (m_bSelChanged)
{ //change from user click outliner, change the selection
m_bSelChanged = FALSE;
return;
}
m_bFromTyping = TRUE;
CString group;
GetDlgItem(IDC_EDIT_NEWSGROUP)->GetWindowText(group);
MSG_ViewIndex index = MSG_SubscribeFindFirst(GetPane(),
LPCTSTR(group));
if (index != MSG_VIEWINDEXNONE )
{
MSG_GroupNameLine newsGroup;
m_pOutliner->SelectItem(CASTINT(index));
m_pOutliner->ScrollIntoView(CASTINT(index));
int len = group.GetLength();
((CEdit*)GetDlgItem(IDC_EDIT_NEWSGROUP))->SetSel(len, len);
if (MSG_GetGroupNameLineByIndex(GetPane(), index, 1, &newsGroup))
CheckSubscribeButton(&newsGroup);
}
}
void CAllNewsgroupsPage::OnExpandAll()
{
DoStopListChange();
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
MSG_Command(GetPane(), MSG_ExpandAll, indices, count);
GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(FALSE);
}
void CAllNewsgroupsPage::OnCollapseAll()
{
int count;
MSG_ViewIndex *indices;
MSG_GroupNameLine group;
DoStopListChange();
MSG_Command(GetPane(), MSG_CollapseAll, NULL, 0);
m_pOutliner->GetSelection(indices, count);
if (MSG_GetGroupNameLineByIndex(GetPane(), indices[0], 1, &group))
{
if (group.flags & MSG_GROUPNAME_FLAG_HASCHILDREN)
{
if (group.flags & MSG_GROUPNAME_FLAG_ELIDED)
GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(TRUE);
else
GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(FALSE);
}
else
{
GetDlgItem(IDC_EXPAND_ALL)->EnableWindow(FALSE);
}
}
}
void CAllNewsgroupsPage::OnGetDeletions()
{
if (IsWindowVisible())
ClearNewsgroupSelection();
m_bProcessGetDeletion = TRUE;
EnableAllControls(FALSE);
m_pParent->StartAnimation();
MSG_Command(GetPane(), MSG_FetchGroupList, NULL, 0);
}
void CAllNewsgroupsPage::OnStop()
{
m_pParent->StopAnimation();
if (GetSubscribeContext() && XP_IsContextBusy(GetContext()))
XP_InterruptContext(GetContext());
if (m_bListChangeStarting)
m_bListChangeStarting = FALSE;
if (m_bProcessGetDeletion)
{
m_bProcessGetDeletion = FALSE;
EnableAllControls(TRUE);
}
GetOutliner()->SelectInitialItem();
}
void CAllNewsgroupsPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAllNewsgroupsPage, CSubscribePropertyPage)
ON_EN_CHANGE(IDC_EDIT_NEWSGROUP, OnChangeNewsgroup)
ON_BN_CLICKED(IDC_EXPAND_ALL, OnExpandAll)
ON_BN_CLICKED(IDC_COLLAPSE_ALL, OnCollapseAll)
ON_BN_CLICKED(IDC_GET_DELETE, OnGetDeletions)
ON_BN_CLICKED(IDC_STOP, OnStop)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSearchNewsgroupPage
CSearchNewsgroupPage::CSearchNewsgroupPage(CWnd *pParent,
MWContext *pContext, MSG_SubscribeMode nMode)
: CSubscribePropertyPage(pParent, pContext, nMode, IDD)
{
}
BOOL CSearchNewsgroupPage::OnInitDialog()
{
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
BOOL ret = CSubscribePropertyPage::OnInitDialog();
return ret;
}
void CSearchNewsgroupPage::OnSearchNow()
{
CString group;
ClearNewsgroupSelection();
GetDlgItem(IDC_EDIT_NEWSGROUP)->GetWindowText(group);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
MSG_SubscribeFindAll(GetPane(), LPCTSTR(group));
if (m_pOutliner->GetTotalLines())
m_pOutliner->SelectItem(0);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
void CSearchNewsgroupPage::OnStop()
{
m_pParent->StopAnimation();
if (GetSubscribeContext() && XP_IsContextBusy(GetContext()))
XP_InterruptContext(GetContext());
if (m_bListChangeStarting)
m_bListChangeStarting = FALSE;
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
void CSearchNewsgroupPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSearchNewsgroupPage, CSubscribePropertyPage)
ON_BN_CLICKED(IDC_SEARCH_NOW, OnSearchNow)
ON_BN_CLICKED(IDC_STOP, OnStop)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNewNewsgroupsPage
CNewNewsgroupsPage::CNewNewsgroupsPage(CWnd *pParent,
MWContext *pContext, MSG_SubscribeMode nMode)
: CSubscribePropertyPage(pParent, pContext, nMode, IDD)
{
m_bGetNew = FALSE;
}
BOOL CNewNewsgroupsPage::OnInitDialog()
{
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
return CSubscribePropertyPage::OnInitDialog();
}
BOOL CNewNewsgroupsPage::OnKillActive()
{
OnStop();
return CSubscribePropertyPage::OnKillActive();
}
void CNewNewsgroupsPage::OnGetNew()
{
m_pParent->StartAnimation();
MSG_Command(GetPane(), MSG_CheckForNew, NULL, 0);
GetDlgItem(IDC_GET_NEW)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
m_bGetNew = TRUE;
}
void CNewNewsgroupsPage::OnClearNew()
{
ClearNewsgroupSelection();
GetDlgItem(IDC_CLEAR_NEW)->EnableWindow(FALSE);
MSG_Command(GetPane(), MSG_ClearNew, NULL, 0);
}
void CNewNewsgroupsPage::OnStop()
{
if (GetSubscribeContext() && XP_IsContextBusy(GetContext()))
XP_InterruptContext(GetContext());
if (m_bListChangeStarting)
m_bListChangeStarting = FALSE;
if (m_bGetNew)
{
m_bGetNew = FALSE;
m_pParent->StopAnimation();
GetDlgItem(IDC_GET_NEW)->EnableWindow(TRUE);
if (GetOutliner()->GetTotalLines())
GetDlgItem(IDC_CLEAR_NEW)->EnableWindow(TRUE);
else
GetDlgItem(IDC_CLEAR_NEW)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
}
void CNewNewsgroupsPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CNewNewsgroupsPage, CSubscribePropertyPage)
ON_BN_CLICKED(IDC_GET_NEW, OnGetNew)
ON_BN_CLICKED(IDC_CLEAR_NEW, OnClearNew)
ON_BN_CLICKED(IDC_STOP, OnStop)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSubscibePropertySheet
CSubscribePropertySheet::CSubscribePropertySheet
(CWnd *pParent, MWContext *pContext, const char* pName)
: CNetscapePropertySheet(pName, pParent, 0, pContext)
{
m_pCX = NULL;
m_pSubscribePane = NULL;
m_pSubscribeList = NULL;
m_pCurrentHost = NULL;
m_pNewPage = NULL;
m_bCommitingStart = FALSE;
nameWidth = -1;
subscribeWidth = -1;
postWidth = -1;
namePos = -1;
subscribePos = -1;
postPos = -1;
int32 lPrefInt;
PREF_GetIntPref("news.subscribe.name_width",&lPrefInt);
nameWidth = CASTINT(lPrefInt);
PREF_GetIntPref("news.subscribe.join_width",&lPrefInt);
subscribeWidth = CASTINT(lPrefInt);
PREF_GetIntPref("news.subscribe.post_width",&lPrefInt);
postWidth = CASTINT(lPrefInt);
PREF_GetIntPref("news.subscribe.name_pos",&lPrefInt);
namePos = CASTINT(lPrefInt);
PREF_GetIntPref("news.subscribe.join_pos",&lPrefInt);
subscribePos = CASTINT(lPrefInt);
PREF_GetIntPref("news.subscribe.post_pos",&lPrefInt);
postPos = CASTINT(lPrefInt);
m_pAllGroupPage = new CAllNewsgroupsPage(this, pContext);
m_pSearchGroupPage = new CSearchNewsgroupPage(this, pContext);
m_pNewGroupPage = new CNewNewsgroupsPage(this, pContext);
AddPage(m_pAllGroupPage);
AddPage(m_pSearchGroupPage);
AddPage(m_pNewGroupPage);
}
CSubscribePropertySheet::~CSubscribePropertySheet()
{
PREF_SetIntPref("news.subscribe.name_width", (int32)nameWidth);
PREF_SetIntPref("news.subscribe.join_width", (int32)subscribeWidth);
PREF_SetIntPref("news.subscribe.post_width", (int32)postWidth);
PREF_SetIntPref("news.subscribe.name_pos", (int32)namePos);
PREF_SetIntPref("news.subscribe.join_pos", (int32)subscribePos);
PREF_SetIntPref("news.subscribe.post_pos", (int32)postPos);
if (m_pAllGroupPage)
delete m_pAllGroupPage;
if (m_pSearchGroupPage)
delete m_pSearchGroupPage;
if (m_pNewGroupPage)
delete m_pNewGroupPage;
}
BOOL CSubscribePropertySheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
#ifdef _WIN32
if (!m_bCommitingStart && (
IDOK == LOWORD(wParam) && HIWORD(wParam) == BN_CLICKED))
#else
if (!m_bCommitingStart && (IDOK == wParam && HIWORD(lParam) == BN_CLICKED))
#endif
{
if (GetActivePage() == m_pSearchGroupPage)
{
if (GetFocus() == m_pSearchGroupPage->GetDlgItem(IDC_EDIT_NEWSGROUP))
{
#ifdef _WIN32
m_pSearchGroupPage->SendMessage(WM_COMMAND, MAKELONG(IDC_SEARCH_NOW, BN_CLICKED),
(LPARAM)(m_pSearchGroupPage->GetDlgItem(IDC_SEARCH_NOW)->GetSafeHwnd()));
#else
m_pSearchGroupPage->SendMessage(WM_COMMAND, IDC_SEARCH_NOW,
MAKELONG(m_pSearchGroupPage->GetDlgItem(IDC_SEARCH_NOW)->GetSafeHwnd(), BN_CLICKED));
#endif
return TRUE;
}
}
if (XP_IsContextBusy(GetSubscribeContext()->GetContext()))
XP_InterruptContext(GetSubscribeContext()->GetContext());
((CSubscribePropertyPage*)GetActivePage())->EnableAllControls(FALSE);
m_bCommitingStart = TRUE;
MSG_SubscribeCommit(GetSubscribePane());
return TRUE;
}
return CNetscapePropertySheet::OnCommand(wParam, lParam);
}
#ifdef _WIN32
BOOL CSubscribePropertySheet::OnInitDialog()
{
BOOL ret = CNetscapePropertySheet::OnInitDialog();
CreateProgressBar();
return ret;
}
#else
int CSubscribePropertySheet::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
int ret = CNetscapePropertySheet::OnCreate(lpCreateStruct);
CreateProgressBar();
return ret;
}
#endif
void CSubscribePropertySheet::CreateProgressBar()
{
TEXTMETRIC tm;
CRect winRect, pageRect;
HDC hDC = ::GetDC(GetSafeHwnd());
GetTextMetrics(hDC, &tm);
::ReleaseDC(GetSafeHwnd(), hDC);
int nStatusHeight = tm.tmHeight + tm.tmInternalLeading+ tm.tmExternalLeading;
GetWindowRect(winRect);
SetWindowPos(NULL, 0, 0, winRect.right - winRect.left,
winRect.bottom - winRect.top + nStatusHeight, SWP_NOMOVE);
m_barStatus.Create(this, FALSE, FALSE);
GetClientRect(winRect);
m_barStatus.MoveWindow(0, winRect.bottom - winRect.top - nStatusHeight,
winRect.right - winRect.left, nStatusHeight, TRUE);
}
void CSubscribePropertySheet::SetStatusText(const char* pMessage)
{
if (IsWindow(m_barStatus.GetSafeHwnd()))
m_barStatus.SetPaneText(m_barStatus.CommandToIndex(ID_SEPARATOR),
pMessage, TRUE );
}
void CSubscribePropertySheet::Progress(const char *pMessage)
{
if (IsWindow(m_barStatus.GetSafeHwnd()))
m_barStatus.SetPaneText(m_barStatus.CommandToIndex(ID_SEPARATOR),
pMessage, TRUE );
}
void CSubscribePropertySheet::SetProgressBarPercent(int32 lPercent)
{
if (::IsWindow(m_barStatus.GetSafeHwnd()))
m_barStatus.SetPercentDone( lPercent );
}
void CSubscribePropertySheet::StartAnimation()
{
if (::IsWindow(m_barStatus.GetSafeHwnd()))
{
m_barStatus.StartAnimation();
}
}
void CSubscribePropertySheet::StopAnimation()
{
if (::IsWindow(m_barStatus.GetSafeHwnd()))
{
m_barStatus.StopAnimation();
}
}
void CSubscribePropertySheet::AllConnectionsComplete(MWContext *pContext )
{
if (m_bCommitingStart)
{
SendMessage(WM_COMMAND, IDOK, 0);
return;
}
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
StopAnimation();
CSubscribePropertyPage* pPage = (CSubscribePropertyPage*)GetActivePage();
if (pPage)
{
CNewsgroupsOutliner* pOutliner = pPage->GetOutliner();
if (pOutliner)
{
if (pOutliner->SelectInitialItem())
{
int count;
MSG_ViewIndex *indices;
MSG_GroupNameLine group;
pOutliner->GetSelection(indices, count);
if (MSG_GetGroupNameLineByIndex(GetSubscribePane(), indices[0],
1, &group))
pPage->CheckSubscribeButton(&group);
}
}
if (pPage->GetMode() == MSG_SubscribeNew)
{
StopAnimation();
((CNewNewsgroupsPage*)pPage)->m_bGetNew = FALSE;
pPage->GetDlgItem(IDC_GET_NEW)->EnableWindow(TRUE);
if (pPage->GetOutliner()->GetTotalLines())
pPage->GetDlgItem(IDC_CLEAR_NEW)->EnableWindow(TRUE);
else
pPage->GetDlgItem(IDC_CLEAR_NEW)->EnableWindow(FALSE);
pPage->GetDlgItem(IDC_STOP)->EnableWindow(FALSE);
}
}
}
void CSubscribePropertySheet::AddServer(MSG_Host* pHost)
{
if (::IsWindow(m_pSearchGroupPage->GetSafeHwnd()))
{
int nIndex = m_pSearchGroupPage->GetServerCombo()->AddString(MSG_GetHostUIName(pHost));
if (nIndex != CB_ERR)
m_pSearchGroupPage->GetServerCombo()->SetItemDataPtr(nIndex, pHost);
}
if (::IsWindow(m_pNewGroupPage->GetSafeHwnd()))
{
int nIndex = m_pNewGroupPage->GetServerCombo()->AddString(MSG_GetHostUIName(pHost));
if (nIndex != CB_ERR)
m_pNewGroupPage->GetServerCombo()->SetItemDataPtr(nIndex, pHost);
}
}
void CSubscribePropertySheet::EnableNonImapPages(BOOL bEnable)
{
if (::IsWindow(m_pSearchGroupPage->GetSafeHwnd()))
m_pSearchGroupPage->EnableAllControls(bEnable);
if (::IsWindow(m_pNewGroupPage->GetSafeHwnd()))
m_pNewGroupPage->EnableAllControls(bEnable);
}
void CSubscribePropertySheet::OnHelp()
{
if (GetActivePage() == m_pAllGroupPage)
NetHelp(HELP_SUBSCRIBE_LIST_ALL);
else if (GetActivePage() == m_pSearchGroupPage)
NetHelp(HELP_SUBSCRIBE_SEARCH);
else if (GetActivePage() == m_pNewGroupPage)
NetHelp(HELP_SUBSCRIBE_LIST_NEW);
}
BEGIN_MESSAGE_MAP(CSubscribePropertySheet, CNetscapePropertySheet)
#ifndef _WIN32
ON_WM_CREATE()
#endif
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CServerTypeDialog
//
CServerTypeDialog::CServerTypeDialog(CWnd *pParent)
: CDialog(CServerTypeDialog::IDD, pParent)
{
m_pHost = NULL;
}
BOOL CServerTypeDialog::OnInitDialog()
{
CheckDlgButton(IDC_RADIO_NNTP, TRUE);
return CDialog::OnInitDialog();
}
void CServerTypeDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
void CServerTypeDialog::OnOK()
{
CDialog::OnOK();
if (IsDlgButtonChecked(IDC_RADIO_NNTP))
{
m_pHost = DoAddNewsServer(GetParent(), FROM_SUBSCRIBEUI);
}
else if (IsDlgButtonChecked(IDC_RADIO_IMAP))
{
m_pHost = DoAddIMAPServer(GetParent(), NULL, TRUE);
}
}
BEGIN_MESSAGE_MAP(CServerTypeDialog, CDialog)
ON_BN_CLICKED(IDOK, OnOK)
END_MESSAGE_MAP()