зеркало из https://github.com/mozilla/gecko-dev.git
1017 строки
24 KiB
C++
1017 строки
24 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.
|
|
*/
|
|
// addrdlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "wfemsg.h"
|
|
#include "msg_srch.h"
|
|
#include "dirprefs.h"
|
|
#include "namcomp.h"
|
|
#include "apiaddr.h"
|
|
#include "nethelp.h"
|
|
#include "prefapi.h"
|
|
#include "intl_csi.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern "C" {
|
|
#include "xpgetstr.h"
|
|
};
|
|
|
|
|
|
class CNameCompletion;
|
|
|
|
CNameCompletionCX::CNameCompletionCX(CNameCompletion *pDialog)
|
|
: CStubsCX(AddressCX, MWContextAddressBook)
|
|
{
|
|
m_pDialog = pDialog;
|
|
m_lPercent = 0;
|
|
m_bAnimated = FALSE;
|
|
}
|
|
|
|
|
|
void CNameCompletionCX::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_pDialog) {
|
|
m_pDialog->SetProgressBarPercent(lPercent);
|
|
}
|
|
}
|
|
|
|
void CNameCompletionCX::Progress(MWContext *pContext, const char *pMessage) {
|
|
if ( m_pDialog ) {
|
|
m_pDialog->SetStatusText(pMessage);
|
|
}
|
|
}
|
|
|
|
int32 CNameCompletionCX::QueryProgressPercent() {
|
|
return m_lPercent;
|
|
}
|
|
|
|
|
|
void CNameCompletionCX::AllConnectionsComplete(MWContext *pContext)
|
|
{
|
|
// Call the base.
|
|
CStubsCX::AllConnectionsComplete(pContext);
|
|
|
|
// Also, we can clear the progress bar now.
|
|
m_lPercent = 0;
|
|
if ( m_pDialog ) {
|
|
m_pDialog->SetProgressBarPercent(m_lPercent);
|
|
m_pDialog->AllConnectionsComplete(pContext);
|
|
}
|
|
if (m_pDialog) {
|
|
m_pDialog->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
|
|
}
|
|
}
|
|
|
|
void CNameCompletionCX::UpdateStopState( MWContext *pContext )
|
|
{
|
|
if (m_pDialog) {
|
|
m_pDialog->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
|
|
}
|
|
}
|
|
|
|
CWnd *CNameCompletionCX::GetDialogOwner() const {
|
|
return m_pDialog;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNameCompletionEntryList
|
|
|
|
STDMETHODIMP CNameCompletionEntryList::QueryInterface(REFIID refiid, LPVOID * ppv)
|
|
{
|
|
*ppv = NULL;
|
|
if (IsEqualIID(refiid,IID_IUnknown))
|
|
*ppv = (LPUNKNOWN) this;
|
|
else if (IsEqualIID(refiid,IID_IMsgList))
|
|
*ppv = (LPMSGLIST) this;
|
|
else if (IsEqualIID(refiid,IID_IMailFrame))
|
|
*ppv = (LPMAILFRAME) m_pNameCompletion;
|
|
|
|
if (*ppv != NULL) {
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CNameCompletionEntryList::AddRef(void)
|
|
{
|
|
return ++m_ulRefCount;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CNameCompletionEntryList::Release(void)
|
|
{
|
|
ULONG ulRef;
|
|
ulRef = --m_ulRefCount;
|
|
if (m_ulRefCount == 0)
|
|
delete this;
|
|
return ulRef;
|
|
}
|
|
|
|
void CNameCompletionEntryList::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if (m_pNameCompletion) {
|
|
m_pNameCompletion->ListChangeStarting( pane, asynchronous,
|
|
notify, where, num );
|
|
}
|
|
}
|
|
|
|
void CNameCompletionEntryList::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if (m_pNameCompletion) {
|
|
m_pNameCompletion->ListChangeFinished( pane, asynchronous,
|
|
notify, where, num );
|
|
}
|
|
}
|
|
|
|
void CNameCompletionEntryList::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
|
|
int *focus)
|
|
{
|
|
}
|
|
|
|
void CNameCompletionEntryList::SelectItem( MSG_Pane* pane, int item )
|
|
{
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNameCompletion
|
|
|
|
CNameCompletion::CNameCompletion(LPCTSTR lpszSearchString,
|
|
CWnd * parent): CDialog(CNameCompletion::IDD, parent)
|
|
{
|
|
int result = 0;
|
|
INTL_CharSetInfo csi;
|
|
|
|
m_pCX = new CNameCompletionCX( this );
|
|
csi = LO_GetDocumentCharacterSetInfo(m_pCX->GetContext());
|
|
|
|
m_pCX->GetContext()->type = MWContextAddressBook;
|
|
m_pCX->GetContext()->fancyFTP = TRUE;
|
|
m_pCX->GetContext()->fancyNews = TRUE;
|
|
m_pCX->GetContext()->intrupt = FALSE;
|
|
m_pCX->GetContext()->reSize = FALSE;
|
|
INTL_SetCSIWinCSID(csi, CIntlWin::GetSystemLocaleCsid());
|
|
|
|
m_addrBookPane = NULL;
|
|
m_pOutliner = NULL;
|
|
m_pOutlinerParent = NULL;
|
|
m_bSearching = FALSE;
|
|
m_lpszSearchString = lpszSearchString;
|
|
|
|
CNameCompletionEntryList *pInstance = new CNameCompletionEntryList( this );
|
|
pInstance->QueryInterface( IID_IMsgList, (LPVOID *) &m_pIAddrList );
|
|
|
|
HandleErrorReturn((result = AB_CreateAddressBookPane(&m_addrBookPane,
|
|
m_pCX->GetContext(),
|
|
WFE_MSGGetMaster())));
|
|
|
|
//{{AFX_DATA_INIT(CNameCompletion)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void CNameCompletion::CleanupOnClose()
|
|
{
|
|
// DestroyContext will call Interrupt, but if we wait until after DestroyContext
|
|
// to call MSG_SearchFree, the MWContext will be gone, and we'll be reading freed memory
|
|
if (XP_IsContextBusy (m_pCX->GetContext()))
|
|
XP_InterruptContext (m_pCX->GetContext());
|
|
MSG_SearchFree ((MSG_Pane*) m_addrBookPane);
|
|
|
|
if (m_pIAddrList)
|
|
m_pIAddrList->Release();
|
|
|
|
if (m_addrBookPane)
|
|
HandleErrorReturn(AB_CloseAddressBookPane(&m_addrBookPane));
|
|
|
|
if(!m_pCX->IsDestroyed()) {
|
|
m_pCX->DestroyContext();
|
|
}
|
|
|
|
if (m_pFont){
|
|
theApp.ReleaseAppFont(m_pFont);
|
|
}
|
|
|
|
if (m_pOutlinerParent){
|
|
delete m_pOutlinerParent;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNameCompletion Overloaded methods
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL CNameCompletion::OnInitDialog( )
|
|
{
|
|
if (CDialog::OnInitDialog()) {
|
|
|
|
CWnd* widget;
|
|
CRect rect2, rect3, rect4;
|
|
UINT aIDArray[] = { IDS_SECURITY_STATUS, IDS_TRANSFER_STATUS, ID_SEPARATOR};
|
|
int result = 0;
|
|
|
|
DIR_Server* dir = (DIR_Server*)XP_ListGetObjectNum(theApp.m_directories, 1);
|
|
|
|
XP_ASSERT (dir);
|
|
|
|
if (!dir)
|
|
return FALSE;
|
|
|
|
HandleErrorReturn((result = AB_InitializeAddressBookPane(m_addrBookPane,
|
|
dir,
|
|
theApp.m_pABook,
|
|
ABFullName,
|
|
TRUE)));
|
|
|
|
if (result) {
|
|
EndDialog(IDCANCEL);
|
|
return TRUE;
|
|
}
|
|
|
|
// create the outliner
|
|
widget = GetDlgItem(IDC_ADDRESSLIST);
|
|
widget->GetWindowRect(&rect2);
|
|
widget->GetClientRect(&rect3);
|
|
GetClientRect(&rect4);
|
|
ClientToScreen(&rect4);
|
|
rect2.OffsetRect(-rect4.left, -rect4.top);
|
|
|
|
widget->DestroyWindow ();
|
|
|
|
// create the outliner control
|
|
m_pOutlinerParent = new CNameCompletionOutlinerParent;
|
|
#ifdef _WIN32
|
|
m_pOutlinerParent->CreateEx ( WS_EX_CLIENTEDGE, NULL, _T("NSOutlinerParent"),
|
|
WS_BORDER|WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN,
|
|
0, 0, 0, 0,
|
|
this->m_hWnd, (HMENU) IDC_ADDRESSLIST);
|
|
#else
|
|
rect3.SetRectEmpty();
|
|
m_pOutlinerParent->Create( NULL, _T("NSOutlinerParent"),
|
|
WS_BORDER|WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
|
|
rect3, this, IDC_ADDRESSLIST);
|
|
#endif
|
|
|
|
m_pOutlinerParent->MoveWindow(&rect2, TRUE);
|
|
m_pOutlinerParent->CreateColumns ( );
|
|
m_pOutliner = (CNameCompletionOutliner *) m_pOutlinerParent->m_pOutliner;
|
|
m_pOutliner->SetPane(m_addrBookPane);
|
|
m_pOutliner->SetContext( m_pCX->GetContext() );
|
|
|
|
// create the status bar
|
|
widget = GetDlgItem(IDC_StatusRect);
|
|
widget->GetWindowRect(&rect2);
|
|
widget->GetClientRect(&rect3);
|
|
ScreenToClient(&rect2);
|
|
|
|
widget->DestroyWindow ();
|
|
|
|
// create the status bar
|
|
m_barStatus.Create(this, TRUE, FALSE);
|
|
m_barStatus.MoveWindow(&rect2, TRUE);
|
|
m_barStatus.SetIndicators( aIDArray, sizeof(aIDArray) / sizeof(UINT) );
|
|
|
|
UpdateButtons();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void CNameCompletion::Progress(const char *pMessage)
|
|
{
|
|
m_barStatus.SetWindowText( pMessage );
|
|
}
|
|
|
|
|
|
void CNameCompletion::SetProgressBarPercent(int32 lPercent)
|
|
{
|
|
m_barStatus.SetPercentDone (lPercent);
|
|
} // END OF FUNCTION CNameCompletion::DrawProgressBar()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialog message handlers
|
|
|
|
BEGIN_MESSAGE_MAP(CNameCompletion, CDialog)
|
|
//{{AFX_MSG_MAP(CNameCompletion)
|
|
ON_BN_CLICKED( IDOK, OnOK)
|
|
ON_BN_CLICKED( IDCANCEL, OnCancel)
|
|
ON_WM_CREATE()
|
|
ON_WM_DESTROY()
|
|
ON_COMMAND(ID_HELP, OnHelp)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
void CNameCompletion::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CNameCompletion)
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
int CNameCompletion::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
int res = CDialog::OnCreate(lpCreateStruct);
|
|
|
|
m_MailNewsResourceSwitcher.Reset();
|
|
|
|
MSG_SetFEData( (MSG_Pane*) m_addrBookPane, (void *) m_pIAddrList );
|
|
return res;
|
|
}
|
|
|
|
|
|
void CNameCompletion::OnOK()
|
|
{
|
|
CDialog::OnOK();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
|
|
void CNameCompletion::OnCancel()
|
|
{
|
|
CDialog::OnCancel();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
|
|
void CNameCompletion::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if ( pane == (MSG_Pane*) m_addrBookPane ) {
|
|
if ( m_pOutliner ) {
|
|
m_pOutliner->MysticStuffStarting( asynchronous, notify,
|
|
where, num );
|
|
}
|
|
}
|
|
}
|
|
|
|
void CNameCompletion::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if ( pane == (MSG_Pane*) m_addrBookPane ) {
|
|
if ( m_pOutliner ) {
|
|
m_pOutliner->MysticStuffFinishing( asynchronous, notify,
|
|
where, num );
|
|
UpdateButtons();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CNameCompletion::SetStatusText(const char* pMessage)
|
|
{
|
|
m_barStatus.SetWindowText( pMessage );
|
|
}
|
|
|
|
|
|
void CNameCompletion::SetSearchResults(MSG_ViewIndex index, int32 num)
|
|
{
|
|
|
|
CString csStatus;
|
|
|
|
ASSERT(m_pOutliner);
|
|
AB_LDAPSearchResults(m_addrBookPane, index, num);
|
|
if (num > 1 ) {
|
|
csStatus.Format( szLoadString(IDS_SEARCHHITS), num );
|
|
} else if ( num > 0 ) {
|
|
csStatus.LoadString( IDS_SEARCHONEHIT );
|
|
} else {
|
|
csStatus.LoadString( IDS_SEARCHNOHITS );
|
|
}
|
|
|
|
m_barStatus.SetWindowText( csStatus );
|
|
|
|
}
|
|
|
|
STDMETHODIMP CNameCompletion::QueryInterface(REFIID refiid, LPVOID * ppv)
|
|
{
|
|
*ppv = NULL;
|
|
if (IsEqualIID(refiid,IID_IUnknown))
|
|
*ppv = (LPUNKNOWN) (LPMAILFRAME) this;
|
|
else if (IsEqualIID(refiid,IID_IMailFrame))
|
|
*ppv = (LPMAILFRAME) this;
|
|
|
|
if (*ppv != NULL) {
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CNameCompletion::AddRef(void)
|
|
{
|
|
return 0; // Not a real component
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CNameCompletion::Release(void)
|
|
{
|
|
return 0; // Not a real component
|
|
}
|
|
|
|
// IMailFrame interface
|
|
CMailNewsFrame *CNameCompletion::GetMailNewsFrame()
|
|
{
|
|
return (CMailNewsFrame *) NULL;
|
|
}
|
|
|
|
MSG_Pane *CNameCompletion::GetPane()
|
|
{
|
|
return (MSG_Pane*) m_addrBookPane;
|
|
}
|
|
|
|
void CNameCompletion::PaneChanged(MSG_Pane *pane, XP_Bool asynchronous,
|
|
MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
|
|
{
|
|
if (notify == MSG_PaneDirectoriesChanged) {
|
|
if (IsSearching())
|
|
PerformDirectorySearch ();
|
|
}
|
|
}
|
|
|
|
|
|
void CNameCompletion::AllConnectionsComplete( MWContext *pContext )
|
|
{
|
|
PerformDirectorySearch();
|
|
|
|
int total = m_pOutliner->GetTotalLines();
|
|
CString csStatus;
|
|
if ( total > 1 ) {
|
|
csStatus.Format( szLoadString( IDS_SEARCHHITS ), total );
|
|
} else if ( total > 0 ) {
|
|
csStatus.LoadString( IDS_SEARCHONEHIT );
|
|
} else {
|
|
csStatus.LoadString( IDS_SEARCHNOHITS );
|
|
}
|
|
m_barStatus.SetWindowText( csStatus );
|
|
|
|
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
|
|
}
|
|
|
|
|
|
void CNameCompletion::OnComposeMsg()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void CNameCompletion::HandleErrorReturn(int errorid)
|
|
{
|
|
if (errorid) {
|
|
CString s;
|
|
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
|
|
::MessageBox(NULL, XP_GetString(errorid), s, MB_OK);
|
|
}
|
|
}
|
|
|
|
|
|
void CNameCompletion::PerformDirectorySearch ()
|
|
{
|
|
CString cs;
|
|
|
|
if ( m_bSearching) {
|
|
// We've turned into stop button
|
|
XP_InterruptContext( m_pCX->GetContext() );
|
|
HandleErrorReturn(AB_FinishSearch(m_addrBookPane, m_pCX->GetContext()));
|
|
m_bSearching = FALSE;
|
|
return;
|
|
}
|
|
|
|
// Begin Search
|
|
m_barStatus.SetWindowText( szLoadString( IDS_SEARCHING ) );
|
|
m_bSearching = TRUE;
|
|
m_pOutliner->UpdateCount();
|
|
m_pOutliner->SetFocus();
|
|
|
|
HandleErrorReturn(AB_SearchDirectory(m_addrBookPane, NULL));
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CNameCompletionOutliner
|
|
BEGIN_MESSAGE_MAP(CNameCompletionOutliner, COutliner)
|
|
//{{AFX_MSG_MAP(CNameCompletionOutliner)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CNameCompletionOutliner::CNameCompletionOutliner ( )
|
|
{
|
|
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_ADDRESSBOOK,16,16);
|
|
}
|
|
m_iMysticPlane = 0;
|
|
m_hFont = NULL;
|
|
}
|
|
|
|
CNameCompletionOutliner::~CNameCompletionOutliner ( )
|
|
{
|
|
if (m_pUnkUserImage) {
|
|
if (m_pIUserImage)
|
|
m_pUnkUserImage->Release();
|
|
}
|
|
|
|
if (m_hFont) {
|
|
theApp.ReleaseAppFont(m_hFont);
|
|
}
|
|
}
|
|
|
|
|
|
void CNameCompletionOutliner::SetColumnsForDirectory (DIR_Server* pServer)
|
|
{
|
|
int iCount = GetNumColumns();
|
|
for (int i = 0; i < iCount; i++) {
|
|
CString cs;
|
|
int iColumn = GetColumnAtPos(i);
|
|
if (pServer->dirType == LDAPDirectory)
|
|
{
|
|
DIR_AttributeId id;
|
|
const char *text = NULL;
|
|
switch (iColumn) {
|
|
case ID_COLADDR_TYPE:
|
|
text = NULL;
|
|
break;
|
|
case ID_COLADDR_NAME:
|
|
MSG_SearchAttribToDirAttrib(attribCommonName, &id);
|
|
text = DIR_GetAttributeName(pServer, id);
|
|
break;
|
|
case ID_COLADDR_EMAIL:
|
|
MSG_SearchAttribToDirAttrib(attrib822Address, &id);
|
|
text = DIR_GetAttributeName(pServer, id);
|
|
break;
|
|
case ID_COLADDR_COMPANY:
|
|
MSG_SearchAttribToDirAttrib(attribOrganization, &id);
|
|
text = DIR_GetAttributeName(pServer, id);
|
|
break;
|
|
case ID_COLADDR_PHONE:
|
|
MSG_SearchAttribToDirAttrib(attribPhoneNumber, &id);
|
|
text = DIR_GetAttributeName(pServer, id);
|
|
break;
|
|
case ID_COLADDR_LOCALITY:
|
|
MSG_SearchAttribToDirAttrib(attribLocality, &id);
|
|
text = DIR_GetAttributeName(pServer, id);
|
|
break;
|
|
case ID_COLADDR_NICKNAME:
|
|
text = NULL;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (text)
|
|
SetColumnName(iColumn, text);
|
|
}
|
|
else
|
|
{
|
|
switch (iColumn) {
|
|
case ID_COLADDR_TYPE:
|
|
cs = "";
|
|
break;
|
|
case ID_COLADDR_NAME:
|
|
cs.LoadString(IDS_USERNAME);
|
|
break;
|
|
case ID_COLADDR_EMAIL:
|
|
cs.LoadString(IDS_EMAILADDRESS);
|
|
break;
|
|
case ID_COLADDR_COMPANY:
|
|
cs.LoadString(IDS_COMPANYNAME);
|
|
break;
|
|
case ID_COLADDR_PHONE:
|
|
cs.LoadString(IDS_PHONE);
|
|
break;
|
|
case ID_COLADDR_LOCALITY:
|
|
cs.LoadString(IDS_LOCALITY);
|
|
break;
|
|
case ID_COLADDR_NICKNAME:
|
|
cs.LoadString(IDS_NICKNAME);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
if (cs.GetLength())
|
|
SetColumnName(iColumn, cs);
|
|
}
|
|
}
|
|
GetParent()->Invalidate();
|
|
GetParent()->UpdateWindow();
|
|
}
|
|
|
|
|
|
void CNameCompletionOutliner::UpdateCount( )
|
|
{
|
|
uint32 count = 0;
|
|
|
|
SetTotalLines(CASTINT(count));
|
|
}
|
|
|
|
|
|
void CNameCompletionOutliner::SetPane(ABPane *pane)
|
|
{
|
|
m_pane = pane;
|
|
uint32 count = 0;
|
|
|
|
if (m_pane) {
|
|
SetTotalLines(CASTINT(count));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CNameCompletionOutliner::MysticStuffStarting( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
++m_iMysticPlane;
|
|
}
|
|
|
|
void CNameCompletionOutliner::MysticStuffFinishing( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
|
|
switch ( notify )
|
|
{
|
|
|
|
case MSG_NotifyNone:
|
|
break;
|
|
|
|
case MSG_NotifyInsertOrDelete:
|
|
// if its insert or delete then tell my frame to add the next chunk of values
|
|
// from the search
|
|
if (notify == MSG_NotifyInsertOrDelete
|
|
&& ((CNameCompletion*)pParent)->IsSearching() && num > 0)
|
|
{
|
|
((CNameCompletion*)pParent)->SetSearchResults(where, num);
|
|
}
|
|
else
|
|
{
|
|
}
|
|
break;
|
|
|
|
case MSG_NotifyChanged:
|
|
InvalidateLines( (int) where, (int) num );
|
|
break;
|
|
|
|
case MSG_NotifyAll:
|
|
case MSG_NotifyScramble:
|
|
Invalidate();
|
|
break;
|
|
}
|
|
|
|
if (( !--m_iMysticPlane && m_pane))
|
|
{
|
|
uint32 count;
|
|
SetTotalLines(CASTINT(count));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
|
|
void CNameCompletionOutliner::SetTotalLines( int count)
|
|
{
|
|
COutliner::SetTotalLines(count);
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CNameCompletionOutliner::RenderData ( UINT iColumn, CRect &rect, CDC &dc, const char * text )
|
|
{
|
|
if ( iColumn != ID_COLADDR_TYPE )
|
|
return COutliner::RenderData ( iColumn, rect, dc, text );
|
|
|
|
int idxImage = 0;
|
|
|
|
if (m_EntryLine.entryType == ABTypeList)
|
|
idxImage = IDX_ADDRESSBOOKLIST;
|
|
else
|
|
idxImage = IDX_ADDRESSBOOKPERSON;
|
|
|
|
m_pIUserImage->DrawImage ( idxImage,
|
|
rect.left + ( ( rect.Width ( ) - 16 ) / 2 ), rect.top, &dc, FALSE );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
int CNameCompletionOutliner::TranslateIcon ( void * pLineData )
|
|
{
|
|
AB_EntryLine* line = (AB_EntryLine*) pLineData;
|
|
int idxImage = 0;
|
|
|
|
if (line->entryType == ABTypeList)
|
|
idxImage = IDX_ADDRESSBOOKLIST;
|
|
else
|
|
idxImage = IDX_ADDRESSBOOKPERSON;
|
|
return idxImage;
|
|
}
|
|
|
|
int CNameCompletionOutliner::TranslateIconFolder (void * pData)
|
|
{
|
|
// We're a flat list, so we're never a folder
|
|
return ( OUTLINER_ITEM );
|
|
}
|
|
|
|
|
|
BOOL CNameCompletionOutliner::ColumnCommand ( int iColumn, int iLine )
|
|
{
|
|
// We have no column commands
|
|
return FALSE;
|
|
}
|
|
|
|
HFONT CNameCompletionOutliner::GetLineFont(void *pLineData)
|
|
{
|
|
if (!m_hFont)
|
|
{
|
|
HDC hDC = ::GetDC(m_hWnd);
|
|
LOGFONT lf;
|
|
memset(&lf,0,sizeof(LOGFONT));
|
|
|
|
lf.lfPitchAndFamily = FF_SWISS;
|
|
lf.lfWeight = FW_NORMAL;
|
|
lf.lfCharSet = IntlGetLfCharset(CIntlWin::GetSystemLocaleCsid());
|
|
if (CIntlWin::GetSystemLocaleCsid() == CS_LATIN1)
|
|
_tcscpy(lf.lfFaceName, "MS Sans Serif");
|
|
else
|
|
_tcscpy(lf.lfFaceName, IntlGetUIPropFaceName(CIntlWin::GetSystemLocaleCsid()));
|
|
lf.lfHeight = -MulDiv(9, ::GetDeviceCaps(hDC, LOGPIXELSY), 72);
|
|
m_hFont = theApp.CreateAppFont( lf );
|
|
::ReleaseDC(m_hWnd,hDC);
|
|
}
|
|
return m_hFont;
|
|
}
|
|
|
|
|
|
void * CNameCompletionOutliner::AcquireLineData ( int line )
|
|
{
|
|
m_lineindex = line + 1;
|
|
if ( line >= m_iTotalLines)
|
|
return NULL;
|
|
if (!AB_GetEntryLine(m_pane, line, &m_EntryLine ))
|
|
return NULL;
|
|
|
|
return &m_EntryLine;
|
|
}
|
|
|
|
|
|
void CNameCompletionOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
|
|
{
|
|
if ( pFlags ) *pFlags = 0; // Flags?
|
|
if ( pDepth ) *pDepth = 0; // We're flat, remember?
|
|
}
|
|
|
|
|
|
void CNameCompletionOutliner::ReleaseLineData ( void * )
|
|
{
|
|
}
|
|
|
|
|
|
LPCTSTR CNameCompletionOutliner::GetColumnText ( UINT iColumn, void * pLineData )
|
|
{
|
|
AB_EntryLine* line = (AB_EntryLine*) pLineData;
|
|
|
|
switch (iColumn) {
|
|
case ID_COLADDR_NAME:
|
|
return line->fullname;
|
|
break;
|
|
case ID_COLADDR_EMAIL:
|
|
return line->emailAddress;
|
|
break;
|
|
case ID_COLADDR_COMPANY:
|
|
return line->companyName;
|
|
break;
|
|
case ID_COLADDR_PHONE:
|
|
if (line->entryType == ABTypePerson)
|
|
return line->workPhone;
|
|
break;
|
|
case ID_COLADDR_LOCALITY:
|
|
return line->locality;
|
|
break;
|
|
case ID_COLADDR_NICKNAME:
|
|
return line->nickname;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ("");
|
|
}
|
|
|
|
void CNameCompletionOutliner::OnSelChanged()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
((CNameCompletion*) pParent)->UpdateButtons();
|
|
}
|
|
|
|
void CNameCompletionOutliner::OnSelDblClk()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrOutlinerParent
|
|
|
|
BEGIN_MESSAGE_MAP(CNameCompletionOutlinerParent, COutlinerParent)
|
|
//{{AFX_MSG_MAP(CNameCompletionOutlinerParent)
|
|
ON_WM_LBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CNameCompletionOutlinerParent::CNameCompletionOutlinerParent()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
CNameCompletionOutlinerParent::~CNameCompletionOutlinerParent()
|
|
{
|
|
}
|
|
|
|
|
|
BOOL CNameCompletionOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, const char * text )
|
|
{
|
|
int cx = 3, cy = 0;
|
|
CNameCompletionOutliner *pOutliner = (CNameCompletionOutliner *) m_pOutliner;
|
|
|
|
// Calculate text offset from top using font height.
|
|
TEXTMETRIC tm;
|
|
dc.GetTextMetrics ( &tm );
|
|
cy = ( rect.bottom - rect.top - tm.tmHeight ) / 2;
|
|
|
|
// Draw Text String
|
|
dc.TextOut (rect.left + cx, rect.top + cy, text, _tcslen(text) );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
COutliner * CNameCompletionOutlinerParent::GetOutliner ( void )
|
|
{
|
|
return new CNameCompletionOutliner;
|
|
}
|
|
|
|
|
|
void CNameCompletionOutlinerParent::CreateColumns ( void )
|
|
{
|
|
CString cs;
|
|
|
|
m_pOutliner->AddColumn ("", ID_COLADDR_TYPE, 24, 0, ColumnFixed, 0, TRUE );
|
|
cs.LoadString(IDS_USERNAME);
|
|
m_pOutliner->AddColumn (cs, ID_COLADDR_NAME, 175, 0, ColumnVariable, 1500);
|
|
cs.LoadString(IDS_EMAILADDRESS);
|
|
m_pOutliner->AddColumn (cs, ID_COLADDR_EMAIL, 175, 0, ColumnVariable, 1500);
|
|
cs.LoadString(IDS_COMPANYNAME);
|
|
m_pOutliner->AddColumn (cs, ID_COLADDR_COMPANY, 175, 0, ColumnVariable, 1500 );
|
|
cs.LoadString(IDS_PHONE);
|
|
m_pOutliner->AddColumn (cs, ID_COLADDR_PHONE, 175, 0, ColumnVariable, 1500, FALSE);
|
|
cs.LoadString(IDS_LOCALITY);
|
|
m_pOutliner->AddColumn (cs, ID_COLADDR_LOCALITY, 175, 0, ColumnVariable, 1500 );
|
|
cs.LoadString(IDS_NICKNAME);
|
|
m_pOutliner->AddColumn (cs, ID_COLADDR_NICKNAME, 175, 0, ColumnVariable, 1500 );
|
|
m_pOutliner->SetHasPipes( FALSE );
|
|
|
|
m_pOutliner->SetVisibleColumns(DEF_VISIBLE_COLUMNS);
|
|
m_pOutliner->LoadXPPrefs("mailnews.abook_columns_win");
|
|
|
|
}
|
|
|
|
|
|
BOOL CNameCompletionOutlinerParent::ColumnCommand ( int idColumn )
|
|
{
|
|
ABID lastSelection;
|
|
|
|
CNameCompletionOutliner *pOutliner = (CNameCompletionOutliner *) m_pOutliner;
|
|
|
|
if (pOutliner->GetFocusLine() != -1)
|
|
lastSelection = AB_GetEntryIDAt((AddressPane*) pOutliner->GetPane(), pOutliner->GetFocusLine());
|
|
|
|
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
|
|
|
|
switch (idColumn) {
|
|
case ID_COLADDR_TYPE:
|
|
AB_Command(pOutliner->GetPane(), AB_SortByTypeCmd, 0, 0);
|
|
break;
|
|
case ID_COLADDR_NAME:
|
|
AB_Command(pOutliner->GetPane(), AB_SortByFullNameCmd, 0, 0);
|
|
break;
|
|
case ID_COLADDR_NICKNAME:
|
|
AB_Command(pOutliner->GetPane(), AB_SortByNickname, 0, 0);
|
|
break;
|
|
case ID_COLADDR_LOCALITY:
|
|
AB_Command(pOutliner->GetPane(), AB_SortByLocality, 0, 0);
|
|
break;
|
|
case ID_COLADDR_COMPANY:
|
|
AB_Command(pOutliner->GetPane(), AB_SortByCompanyName, 0, 0);
|
|
break;
|
|
case ID_COLADDR_EMAIL:
|
|
AB_Command(pOutliner->GetPane(), AB_SortByEmailAddress, 0, 0);
|
|
break;
|
|
default:
|
|
AB_Command(pOutliner->GetPane(), AB_SortByFullNameCmd, 0, 0);
|
|
break;
|
|
}
|
|
|
|
|
|
if (pOutliner->GetFocusLine() != -1) {
|
|
uint index = CASTUINT(AB_GetIndexOfEntryID ((AddressPane*) pOutliner->GetPane(), lastSelection));
|
|
pOutliner->SelectItem (index);
|
|
pOutliner->ScrollIntoView(index);
|
|
}
|
|
|
|
Invalidate();
|
|
pOutliner->Invalidate();
|
|
SetCursor ( theApp.LoadStandardCursor ( IDC_ARROW ) );
|
|
return TRUE;
|
|
}
|
|
|
|
void CNameCompletionOutlinerParent::OnLButtonUp( UINT nFlags, CPoint point )
|
|
{
|
|
BOOL bSaveColumns = (m_pOutliner &&
|
|
(m_bResizeColumn || m_bDraggingHeader || m_iPusherHit))? TRUE : FALSE;
|
|
COutlinerParent::OnLButtonUp(nFlags, point);
|
|
if (bSaveColumns)
|
|
m_pOutliner->SaveXPPrefs("mailnews.autocomp_columns_win");
|
|
}
|
|
|
|
|
|
void CNameCompletion::OnHelp()
|
|
{
|
|
NetHelp(HELP_SELECT_ADDRESSES);
|
|
}
|
|
|
|
|
|
void CNameCompletion::UpdateButtons()
|
|
{
|
|
if (m_pOutliner)
|
|
{
|
|
// need to determine when to actually enable this
|
|
BOOL bEnable = TRUE;
|
|
GetDlgItem(IDOK)->EnableWindow(bEnable);
|
|
}
|
|
}
|
|
|