gecko-dev/cmd/winfe/namcomp.cpp

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);
}
}