mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 14:15:30 +00:00
5153 lines
128 KiB
C++
Executable File
5153 lines
128 KiB
C++
Executable File
/* -*- 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 "addrdlg.h"
|
|
|
|
#ifdef MOZ_NEWADDR
|
|
|
|
#include "msg_srch.h"
|
|
#include "dirprefs.h"
|
|
#include "apiaddr.h"
|
|
#include "nethelp.h"
|
|
#include "prefapi.h"
|
|
#include "intl_csi.h"
|
|
#include "srchdlg.h"
|
|
#include "abcom.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern "C" {
|
|
#include "xpgetstr.h"
|
|
extern int MK_ADDR_CCNAME;
|
|
extern int MK_ADDR_BCCNAME;
|
|
extern int MK_ADDR_TONAME;
|
|
};
|
|
|
|
#define ADDRESS_DIALOG_TIMER 7
|
|
#define TYPEDOWN_SPEED 300
|
|
#define LDAP_SEARCH_SPEED 1250
|
|
#define ADDRDLG_OUTLINER_TYPEDOWN_TIMER 251
|
|
#define OUTLINER_TYPEDOWN_SPEED 1250
|
|
|
|
|
|
class CAddrDialog;
|
|
|
|
|
|
CAddrDialogCX::CAddrDialogCX(CAddrDialog *pDialog)
|
|
: CStubsCX(AddressCX, MWContextAddressBook)
|
|
{
|
|
m_pDialog = pDialog;
|
|
m_lPercent = 0;
|
|
m_bAnimated = FALSE;
|
|
}
|
|
|
|
|
|
void CAddrDialogCX::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 CAddrDialogCX::Progress(MWContext *pContext, const char *pMessage) {
|
|
m_csProgress = pMessage;
|
|
if ( m_pDialog ) {
|
|
m_pDialog->SetStatusText(pMessage);
|
|
}
|
|
}
|
|
|
|
int32 CAddrDialogCX::QueryProgressPercent() {
|
|
return m_lPercent;
|
|
}
|
|
|
|
|
|
void CAddrDialogCX::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 CAddrDialogCX::UpdateStopState( MWContext *pContext )
|
|
{
|
|
if (m_pDialog) {
|
|
m_pDialog->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
|
|
}
|
|
}
|
|
|
|
CWnd *CAddrDialogCX::GetDialogOwner() const {
|
|
return m_pDialog;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialogEntryList
|
|
|
|
class CAddrDialogEntryList: public IMsgList {
|
|
|
|
CAddrDialog *m_pAddrDialog;
|
|
unsigned long m_ulRefCount;
|
|
|
|
public:
|
|
// IUnknown Interface
|
|
STDMETHODIMP QueryInterface(REFIID,LPVOID *);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IMsgList Interface
|
|
virtual void ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num);
|
|
virtual void ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num);
|
|
virtual void GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
|
|
int *focus);
|
|
virtual void SelectItem( MSG_Pane* pane, int item );
|
|
|
|
virtual void CopyMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
|
|
MSG_FolderInfo *folderInfo) {}
|
|
virtual void MoveMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
|
|
MSG_FolderInfo *folderInfo) {}
|
|
|
|
CAddrDialogEntryList( CAddrDialog *pAddrDialog ) {
|
|
m_ulRefCount = 0;
|
|
m_pAddrDialog = pAddrDialog;
|
|
}
|
|
};
|
|
|
|
|
|
STDMETHODIMP CAddrDialogEntryList::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_pAddrDialog;
|
|
|
|
if (*ppv != NULL) {
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAddrDialogEntryList::AddRef(void)
|
|
{
|
|
return ++m_ulRefCount;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAddrDialogEntryList::Release(void)
|
|
{
|
|
ULONG ulRef;
|
|
ulRef = --m_ulRefCount;
|
|
if (m_ulRefCount == 0)
|
|
delete this;
|
|
return ulRef;
|
|
}
|
|
|
|
void CAddrDialogEntryList::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if (m_pAddrDialog) {
|
|
m_pAddrDialog->ListChangeStarting( pane, asynchronous,
|
|
notify, where, num );
|
|
}
|
|
}
|
|
|
|
void CAddrDialogEntryList::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if (m_pAddrDialog) {
|
|
m_pAddrDialog->ListChangeFinished( pane, asynchronous,
|
|
notify, where, num );
|
|
}
|
|
}
|
|
|
|
void CAddrDialogEntryList::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
|
|
int *focus)
|
|
{
|
|
}
|
|
|
|
void CAddrDialogEntryList::SelectItem( MSG_Pane* pane, int item )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialog
|
|
|
|
CAddrDialog::CAddrDialog(
|
|
CWnd* pParent, /*=NULL*/
|
|
BOOL isMapi, LPSTR winText, MAPIAddressCallbackProc mapiCB, MAPIAddressGetAddrProc mapiGetProc // rhp - MAPI
|
|
)
|
|
: CDialog(CAddrDialog::IDD, pParent)
|
|
{
|
|
|
|
CString msg;
|
|
int result = 0;
|
|
INTL_CharSetInfo csi;
|
|
|
|
m_pCX = new CAddrDialogCX( 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_pOutliner = NULL;
|
|
m_addrBookPane = NULL;
|
|
m_addrContPane = NULL;
|
|
m_bSearching = FALSE;
|
|
m_directory = 0;
|
|
m_pDropTarget = NULL;
|
|
m_idefButtonID = IDC_TO;
|
|
|
|
m_EditWnd.SetOwner(this);
|
|
CAddrDialogEntryList *pInstance = new CAddrDialogEntryList( this );
|
|
pInstance->QueryInterface( IID_IMsgList, (LPVOID *) &m_pIAddrList );
|
|
|
|
|
|
// rhp - MAPI stuff...
|
|
m_isMAPI = isMapi;
|
|
m_mapiHeader = NULL;
|
|
m_mapiCBProc = NULL;
|
|
m_mapiGetAddrProc = NULL;
|
|
|
|
if (m_isMAPI)
|
|
{
|
|
if ( (winText) && (*winText) )
|
|
{
|
|
m_mapiHeader = strdup(winText);
|
|
}
|
|
|
|
m_mapiCBProc = mapiCB;
|
|
m_mapiGetAddrProc = mapiGetProc;
|
|
}
|
|
|
|
CAddrFrame::HandleErrorReturn((result = AB_CreateABPane(&m_addrBookPane,
|
|
m_pCX->GetContext(),
|
|
WFE_MSGGetMaster())));
|
|
|
|
if (result)
|
|
return;
|
|
|
|
CAddrFrame::HandleErrorReturn((result = AB_CreateContainerPane(&m_addrContPane,
|
|
m_pCX->GetContext(),
|
|
WFE_MSGGetMaster())));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrBookPane);
|
|
return;
|
|
}
|
|
|
|
CAddrFrame::HandleErrorReturn((result = AB_InitializeContainerPane(m_addrContPane)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
return;
|
|
}
|
|
|
|
AB_ContainerInfo *info = AB_GetContainerForIndex(m_addrContPane, 0);
|
|
|
|
ASSERT (info);
|
|
|
|
CAddrFrame::HandleErrorReturn((result = AB_InitializeABPane(m_addrBookPane,
|
|
info)));
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
return;
|
|
}
|
|
|
|
//set property sheets for address book pane
|
|
HandleErrorReturn((result = AB_SetShowPropertySheetForEntryFunc(
|
|
(MSG_Pane *)m_addrBookPane,
|
|
ShowPropertySheetForEntry)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
}
|
|
|
|
//set property sheets for container pane
|
|
HandleErrorReturn((result = AB_SetShowPropertySheetForEntryFunc(
|
|
(MSG_Pane *)m_addrContPane,
|
|
ShowPropertySheetForEntry)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
}
|
|
|
|
//set ldap property sheets for container pane
|
|
HandleErrorReturn((result = AB_SetShowPropertySheetForDirFunc(
|
|
(MSG_Pane *)m_addrContPane,
|
|
ShowPropertySheetForDir)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
}
|
|
|
|
//{{AFX_DATA_INIT(CAddrDialog)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CAddrDialog::OnKeyDown ( UINT nChar, UINT nRepCnt, UINT nFlags )
|
|
{
|
|
CDialog::OnKeyDown ( nChar, nRepCnt, nFlags );
|
|
}
|
|
|
|
void CAddrDialog::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
|
|
|
|
PREF_SetIntPref("mail.addr_picker.sliderwidth", m_pSplitter->GetPaneSize());
|
|
|
|
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_ClosePane(m_addrBookPane));
|
|
|
|
if (m_addrContPane)
|
|
HandleErrorReturn(AB_ClosePane(m_addrContPane));
|
|
|
|
if(!m_pCX->IsDestroyed()) {
|
|
m_pCX->DestroyContext();
|
|
}
|
|
if (m_pFont){
|
|
theApp.ReleaseAppFont(m_pFont);
|
|
}
|
|
|
|
if (m_pOutlinerParent){
|
|
delete m_pOutlinerParent;
|
|
}
|
|
|
|
if (m_pDirOutlinerParent){
|
|
delete m_pDirOutlinerParent;
|
|
}
|
|
|
|
if (m_pSplitter){
|
|
delete m_pSplitter;
|
|
}
|
|
|
|
if (m_pDropTarget) {
|
|
m_pDropTarget->Revoke();
|
|
delete m_pDropTarget;
|
|
m_pDropTarget = NULL;
|
|
}
|
|
|
|
// rhp - for MAPI
|
|
if (m_isMAPI)
|
|
{
|
|
if (m_mapiHeader)
|
|
free(m_mapiHeader);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialog Overloaded methods
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// rhp - this is needed for the population of the to address type...
|
|
void
|
|
CAddrDialog::ProcessMAPIAddressPopulation(void)
|
|
{
|
|
int index = 0;
|
|
LPSTR name;
|
|
LPSTR address;
|
|
int addrType;
|
|
|
|
if (!m_mapiGetAddrProc)
|
|
return;
|
|
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
while ( m_mapiGetAddrProc(&name, &address, &addrType) )
|
|
{
|
|
char *formatted;
|
|
char tempString[512] = "";
|
|
int nIndex = -1;
|
|
NSADDRESSLIST *pAddress = new NSADDRESSLIST;
|
|
|
|
ASSERT(pAddress);
|
|
if (!pAddress)
|
|
continue;
|
|
|
|
if ((name) && (*name))
|
|
{
|
|
strcat(tempString, name);
|
|
strcat(tempString, " ");
|
|
}
|
|
|
|
if ( (!address) || (!(*address)) )
|
|
continue;
|
|
|
|
strcat(tempString, "<");
|
|
strcat(tempString, address);
|
|
strcat(tempString, ">");
|
|
|
|
pAddress->ulHeaderType = addrType;
|
|
pAddress->idBitmap = 0;
|
|
pAddress->idEntry = 0;
|
|
pAddress->szAddress = strdup (tempString);
|
|
|
|
GetFormattedString(tempString, addrType, &formatted);
|
|
if (formatted)
|
|
{
|
|
nIndex = pBucket->InsertString( index, formatted );
|
|
free (formatted);
|
|
}
|
|
|
|
if ( nIndex < 0 )
|
|
return;
|
|
|
|
pBucket->SetItemDataPtr( nIndex, pAddress );
|
|
++index;
|
|
}
|
|
|
|
OnSelchange();
|
|
}
|
|
|
|
BOOL CAddrDialog::OnInitDialog( )
|
|
{
|
|
if (CDialog::OnInitDialog()) {
|
|
CWnd* widget;
|
|
CRect rect2, rect3, rect4;
|
|
UINT aIDArray[] = { IDS_SECURITY_STATUS, IDS_TRANSFER_STATUS, ID_SEPARATOR,
|
|
IDS_ONLINE_STATUS};
|
|
int result = 0;
|
|
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
widget = GetDlgItem(IDC_ADDRESSLIST);
|
|
widget->GetWindowRect(&rect2);
|
|
widget->GetClientRect(&rect3);
|
|
GetClientRect(&rect4);
|
|
ClientToScreen(&rect4);
|
|
rect2.OffsetRect(-rect4.left, -rect4.top);
|
|
|
|
widget->DestroyWindow ();
|
|
|
|
// create slider control
|
|
m_pSplitter = (CMailNewsSplitter *) RUNTIME_CLASS(CMailNewsSplitter)->CreateObject();
|
|
|
|
ASSERT(m_pSplitter);
|
|
|
|
#ifdef _WIN32
|
|
m_pSplitter->CreateEx(0, NULL, NULL,
|
|
WS_CHILD|WS_VISIBLE|WS_TABSTOP,
|
|
0, 0, 0, 0,
|
|
this->m_hWnd, (HMENU) IDC_ADDRESSLIST );
|
|
#else
|
|
CCreateContext Context;
|
|
Context.m_pCurrentFrame = NULL; // nothing to base on
|
|
Context.m_pCurrentDoc = NULL; // nothing to base on
|
|
Context.m_pNewViewClass = NULL; // nothing to base on
|
|
Context.m_pNewDocTemplate = NULL; // nothing to base on
|
|
m_pSplitter->Create( NULL, NULL,
|
|
WS_CHILD|WS_VISIBLE |WS_TABSTOP,
|
|
rect2, this, IDC_ADDRESSLIST, &Context );
|
|
#endif
|
|
|
|
// create the outliner control
|
|
m_pOutlinerParent = new CAddrOutlinerParent;
|
|
#ifdef _WIN32
|
|
m_pOutlinerParent->CreateEx ( WS_EX_CLIENTEDGE, NULL, _T("NSOutlinerParent"),
|
|
WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN,
|
|
0, 0, 0, 0,
|
|
m_pSplitter->m_hWnd, (HMENU) 99);
|
|
#else
|
|
rect2.SetRectEmpty();
|
|
m_pOutlinerParent->Create( NULL, _T("NSOutlinerParent"),
|
|
WS_BORDER|WS_TABSTOP|WS_VISIBLE|WS_CHILD,
|
|
rect2, m_pSplitter, 99);
|
|
#endif
|
|
|
|
m_pOutlinerParent->CreateColumns ( );
|
|
m_pOutlinerParent->EnableFocusFrame(TRUE);
|
|
m_pOutliner = (CAddrOutliner *) m_pOutlinerParent->m_pOutliner;
|
|
m_pOutliner->SetPane(m_addrBookPane);
|
|
m_pOutliner->SetContext( m_pCX->GetContext() );
|
|
m_pOutliner->SetOutlinerOwner(this);
|
|
|
|
|
|
// create the directory outliner control
|
|
m_pDirOutlinerParent = new CDirOutlinerParent;
|
|
|
|
#ifdef _WIN32
|
|
m_pDirOutlinerParent->CreateEx(WS_EX_CLIENTEDGE, NULL, _T("NSOutlinerParent"),
|
|
WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN,
|
|
0,0,0,0, m_pSplitter->m_hWnd, (HMENU) 100 );
|
|
#else
|
|
m_pDirOutlinerParent->Create( NULL, _T("NSOutlinerParent"),
|
|
WS_BORDER|WS_TABSTOP|WS_VISIBLE|WS_CHILD,
|
|
CRect(0,0,0,0), m_pSplitter, 100);
|
|
#endif
|
|
|
|
m_pDirOutliner = (CDirOutliner *) m_pDirOutlinerParent->m_pOutliner;
|
|
m_pDirOutlinerParent->CreateColumns ( );
|
|
m_pDirOutlinerParent->EnableFocusFrame(TRUE);
|
|
m_pDirOutliner->SetPane(m_addrContPane);
|
|
m_pDirOutliner->SetOutlinerOwner(this);
|
|
m_pDirOutliner->SelectItem(0);
|
|
|
|
|
|
// m_pDirOutliner->SetDirectoryIndex(0);
|
|
|
|
// set the width of the panes in the slider
|
|
int32 prefInt = -1;
|
|
PREF_GetIntPref("mail.addr_picker.sliderwidth", &prefInt);
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
m_pSplitter->AddPanes(m_pDirOutlinerParent, m_pOutlinerParent, prefInt, TRUE);
|
|
m_pSplitter->SetWindowPos(GetDlgItem(ID_NAVIGATE_INTERRUPT), rect2.left, rect2.top, rect3.right, rect3.bottom, SWP_SHOWWINDOW);
|
|
|
|
m_pDirOutlinerParent->SetWindowPos(GetDlgItem(ID_NAVIGATE_INTERRUPT), 0, 0,
|
|
rect3.right, rect3.bottom, SWP_NOMOVE|SWP_NOSIZE);
|
|
m_pOutlinerParent->SetWindowPos(m_pDirOutlinerParent, 0, 0,
|
|
rect3.right, rect3.bottom, SWP_NOMOVE|SWP_NOSIZE);
|
|
// reset the tab order
|
|
widget = GetDlgItem (IDC_TO);
|
|
widget->SetWindowPos(m_pOutlinerParent, 0, 0,
|
|
rect3.right, rect3.bottom, SWP_NOMOVE|SWP_NOSIZE);
|
|
UpdateDirectories();
|
|
|
|
// create the status bar
|
|
widget = GetDlgItem(IDC_StatusRect);
|
|
widget->GetWindowRect(&rect2);
|
|
widget->GetClientRect(&rect3);
|
|
ScreenToClient(&rect2);
|
|
|
|
widget->DestroyWindow ();
|
|
|
|
m_barStatus.Create(this, TRUE, FALSE);
|
|
|
|
m_barStatus.MoveWindow(&rect2, TRUE);
|
|
|
|
m_barStatus.SetIndicators( aIDArray, sizeof(aIDArray) / sizeof(UINT) );
|
|
|
|
int idx = m_barStatus.CommandToIndex(IDS_ONLINE_STATUS);
|
|
if (idx > -1)
|
|
{
|
|
UINT nID = IDS_ONLINE_STATUS;
|
|
UINT nStyle;
|
|
int nWidth;
|
|
m_barStatus.GetPaneInfo( idx, nID, nStyle, nWidth );
|
|
if (!NET_IsOffline())
|
|
m_barStatus.SetPaneInfo(idx, IDS_ONLINE_STATUS, SBPS_NORMAL, nWidth);
|
|
else
|
|
m_barStatus.SetPaneInfo(idx, IDS_ONLINE_STATUS, SBPS_DISABLED, nWidth);
|
|
}
|
|
|
|
|
|
DoUpdateWidget(IDC_DIRSEARCH, AB_LDAPSearchCmd, TRUE);
|
|
DoUpdateWidget(IDC_TO, AB_NewMessageCmd, TRUE);
|
|
UpdateMsgButtons();
|
|
|
|
CGenericFrame *pCompose = (CGenericFrame *)GetParent();
|
|
|
|
ApiApiPtr(api);
|
|
LPUNKNOWN pUnk = api->CreateClassInstance(
|
|
APICLASS_ADDRESSCONTROL, NULL, (APISIGNATURE)pCompose);
|
|
if (pUnk)
|
|
{
|
|
LPADDRESSCONTROL pIAddressControl;
|
|
HRESULT hRes = pUnk->QueryInterface(IID_IAddressControl,(LPVOID*)&pIAddressControl);
|
|
ASSERT(hRes==NOERROR);
|
|
LPNSADDRESSLIST pList = NULL;
|
|
int count = pIAddressControl->GetAddressList(&pList);
|
|
pUnk->Release();
|
|
for (int index = 0; index < count; index++)
|
|
{
|
|
if (pList[index].szAddress)
|
|
{
|
|
if (strlen (pList[index].szAddress))
|
|
{
|
|
NSADDRESSLIST *pAddress = new NSADDRESSLIST;
|
|
char * formatted;
|
|
int nIndex = -1;
|
|
ASSERT(pAddress);
|
|
pAddress->ulHeaderType = pList[index].ulHeaderType;
|
|
pAddress->idBitmap = pList[index].idBitmap;
|
|
pAddress->idEntry = pList[index].idEntry;
|
|
pAddress->szAddress = strdup (pList[index].szAddress);
|
|
GetFormattedString(pList[index].szAddress, pList[index].ulHeaderType, &formatted);
|
|
if (formatted)
|
|
{
|
|
nIndex = pBucket->InsertString( index, formatted );
|
|
free (formatted);
|
|
}
|
|
free (pList[index].szAddress);
|
|
if ( nIndex < 0 )
|
|
return 0;
|
|
pBucket->SetItemDataPtr( nIndex, pAddress );
|
|
}
|
|
}
|
|
}
|
|
free(pList);
|
|
OnSelchange();
|
|
} else
|
|
{
|
|
return FALSE;
|
|
}
|
|
} else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
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_pFont = theApp.CreateAppFont( lf );
|
|
::ReleaseDC(m_hWnd,hDC);
|
|
|
|
m_EditWnd.SubclassDlgItem(IDC_ADDRNAME, this);
|
|
|
|
::SendMessage(::GetDlgItem(m_hWnd, IDC_ADDRNAME), WM_SETFONT, (WPARAM)m_pFont, FALSE);
|
|
::SendMessage(::GetDlgItem(m_hWnd, IDC_ADDRESSBKT), WM_SETFONT, (WPARAM)m_pFont, FALSE);
|
|
|
|
if(!m_pDropTarget) {
|
|
m_pDropTarget = new CAddressPickerDropTarget(this);
|
|
m_pDropTarget->Register(this);
|
|
}
|
|
DragAcceptFiles();
|
|
|
|
CComboBox *directory = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
|
|
directory->SetCurSel (0);
|
|
m_pOutliner->SetDirectoryIndex( directory->GetCurSel());
|
|
m_pDirOutliner->SetFocusLine(0);
|
|
if (m_pOutliner->GetTotalLines())
|
|
m_pOutliner->SelectItem (0);
|
|
GetDlgItem(IDC_ADDRNAME)->SetFocus();
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
|
|
// rhp - for MAPI
|
|
if (m_isMAPI)
|
|
{
|
|
ProcessMAPIAddressPopulation();
|
|
|
|
if (m_mapiHeader)
|
|
{
|
|
SetWindowText(m_mapiHeader);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void CAddrDialog::GetFormattedString(char* fullname, MSG_HEADER_SET header, char** formatted)
|
|
{
|
|
|
|
CString formattedString;
|
|
if (fullname) {
|
|
switch (header) {
|
|
case MSG_TO_HEADER_MASK:
|
|
formattedString.Format(XP_GetString (MK_ADDR_TONAME), fullname);
|
|
break;
|
|
case MSG_CC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString (MK_ADDR_CCNAME), fullname);
|
|
break;
|
|
case MSG_BCC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString (MK_ADDR_BCCNAME), fullname);
|
|
break;
|
|
default:
|
|
formattedString.Format(XP_GetString (MK_ADDR_TONAME), fullname);
|
|
}
|
|
}
|
|
(*formatted) = strdup (formattedString);
|
|
}
|
|
|
|
void CAddrDialog::Progress(const char *pMessage)
|
|
{
|
|
m_barStatus.SetWindowText( pMessage );
|
|
}
|
|
|
|
|
|
void CAddrDialog::SetProgressBarPercent(int32 lPercent)
|
|
{
|
|
m_barStatus.SetPercentDone (lPercent);
|
|
} // END OF FUNCTION CAddrDialog::DrawProgressBar()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialog message handlers
|
|
|
|
BEGIN_MESSAGE_MAP(CAddrDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CAddrDialog)
|
|
ON_WM_TIMER ()
|
|
ON_EN_SETFOCUS(IDC_ADDRNAME, OnSetFocusName)
|
|
ON_EN_CHANGE(IDC_ADDRNAME, OnChangeName)
|
|
ON_CBN_SELCHANGE(IDC_DIRECTORIES, OnChangeDirectory)
|
|
ON_BN_CLICKED(IDC_DIRSEARCH, OnDirectorySearch)
|
|
ON_BN_CLICKED(ID_NAVIGATE_INTERRUPT, OnStopSearch)
|
|
ON_BN_CLICKED( IDC_DONE_EDITING, OnDone)
|
|
ON_BN_CLICKED( IDCANCEL, OnCancel)
|
|
ON_WM_CREATE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_KEYDOWN()
|
|
ON_COMMAND(IDC_TO, OnComposeMsg)
|
|
ON_COMMAND(IDC_CC, OnComposeCCMsg)
|
|
ON_COMMAND(IDC_BCC, OnComposeBCCMsg)
|
|
ON_COMMAND(ID_ITEM_PROPERTIES, OnGetProperties)
|
|
ON_LBN_SELCHANGE(IDC_ADDRESSBKT, OnSelchange)
|
|
ON_COMMAND(ID_HELP, OnHelp)
|
|
ON_LBN_SETFOCUS(IDC_ADDRESSBKT, OnSetFocusBucket)
|
|
ON_UPDATE_COMMAND_UI(IDS_ONLINE_STATUS, OnUpdateOnlineStatus)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CAddrDialog::PreTranslateMessage( MSG* pMsg )
|
|
{
|
|
if (pMsg->message == WM_KEYDOWN && pMsg->hwnd == m_pOutliner->GetSafeHwnd())
|
|
{
|
|
if (pMsg->wParam != VK_TAB && pMsg->wParam != VK_ESCAPE && pMsg->wParam != VK_RETURN) {
|
|
::SendMessage(pMsg->hwnd, WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if (pMsg->message == WM_KEYDOWN && pMsg->hwnd == GetBucket()->GetSafeHwnd())
|
|
{
|
|
if (pMsg->wParam == VK_DELETE || pMsg->wParam == VK_BACK) {
|
|
OnRemove();
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if (pMsg->message == WM_KEYDOWN && pMsg->hwnd == GetDlgItem(IDC_ADDRNAME)->GetSafeHwnd())
|
|
{
|
|
if (pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN) {
|
|
::SendMessage(m_pOutliner->GetSafeHwnd(), WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
|
|
CWnd* widget = NULL;
|
|
widget = GetDlgItem (GetDefaultButtonID());
|
|
if (widget) {
|
|
SendMessage(DM_SETDEFID, GetDefaultButtonID(), TRUE);
|
|
widget->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
widget = GetDlgItem (IDC_DONE_EDITING);
|
|
widget->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if (pMsg->message == WM_KEYDOWN) {
|
|
if (pMsg->wParam == VK_TAB) {
|
|
HWND hwndNext = NULL;
|
|
HWND hwndFocus = ::GetFocus();
|
|
|
|
HWND hwndPossibleNext = ::GetNextDlgTabItem( m_hWnd, pMsg->hwnd, FALSE );
|
|
|
|
HWND hwndPossiblePrev = ::GetNextDlgTabItem( m_hWnd, pMsg->hwnd, TRUE );
|
|
|
|
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
|
|
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
|
|
HWND hwndSlider = m_pSplitter ? m_pSplitter->m_hWnd : NULL;
|
|
HWND hwndPropButton = GetDlgItem(ID_ITEM_PROPERTIES) ? GetDlgItem(ID_ITEM_PROPERTIES)->m_hWnd : NULL;
|
|
|
|
|
|
if ( GetKeyState(VK_SHIFT) & 0x8000 ) {
|
|
|
|
// Tab backward
|
|
if (hwndFocus == hwndOutliner) {
|
|
// Handle tabbing out of outliner into the directory list
|
|
if (m_pSplitter->IsOnePaneClosed())
|
|
hwndNext = hwndPossiblePrev;
|
|
else
|
|
hwndNext = hwndDirOutliner;
|
|
} else if ( hwndFocus == hwndDirOutliner ) {
|
|
// Handle tabbing out of the slider
|
|
hwndNext = hwndPossiblePrev;
|
|
} else if ( hwndPossiblePrev == hwndSlider ) {
|
|
// Handle tabbing back to the outliner from the
|
|
// to/cc/bcc buttons the bucket
|
|
hwndNext = hwndOutliner;
|
|
}
|
|
|
|
} else {
|
|
|
|
// Tab forward
|
|
if ( hwndPossibleNext == hwndSlider ) {
|
|
// handle tabbing into the directory list
|
|
if (m_pSplitter->IsOnePaneClosed())
|
|
hwndNext = hwndOutliner;
|
|
else
|
|
hwndNext = hwndDirOutliner;
|
|
} else if (hwndFocus == hwndDirOutliner) {
|
|
// Handle tabbing out of the directory list
|
|
// and into the results list
|
|
hwndNext = hwndOutliner;
|
|
}
|
|
|
|
}
|
|
if ( hwndNext ) {
|
|
::SetFocus( hwndNext );
|
|
return TRUE;
|
|
}
|
|
}
|
|
} // if tab && keydown
|
|
|
|
return CDialog::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CAddrDialog::UpdateDirectories()
|
|
{
|
|
DIR_Server* dir;
|
|
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
|
|
|
|
widget->ResetContent();
|
|
|
|
XP_List *pTraverse = theApp.m_directories;
|
|
while(dir = (DIR_Server *)XP_ListNextObject(pTraverse)) {
|
|
if (dir->dirType == PABDirectory || dir->dirType == LDAPDirectory)
|
|
widget->AddString(dir->description);
|
|
}
|
|
if (m_directory == -1)
|
|
widget->SetCurSel(0);
|
|
else
|
|
widget->SetCurSel(m_directory);
|
|
|
|
m_pDirOutliner->UpdateCount();
|
|
}
|
|
|
|
|
|
DIR_Server * CAddrDialog::GetCurrentDirectoryServer()
|
|
{
|
|
return (DIR_Server*) XP_ListGetObjectNum (theApp.m_directories, m_pDirOutliner->GetDirectoryIndex() + 1);
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnTimer(UINT nID)
|
|
{
|
|
CWnd::OnTimer(nID);
|
|
if (nID == ADDRESS_DIALOG_TIMER) {
|
|
KillTimer(m_uTypedownClock);
|
|
if (!m_name.IsEmpty()) {
|
|
HandleErrorReturn(AB_TypedownSearch(m_addrBookPane, m_name, MSG_VIEWINDEXNONE));
|
|
|
|
// DIR_Server* dir;
|
|
// dir = GetCurrentDirectoryServer();
|
|
// if (dir->dirType == LDAPDirectory)
|
|
// PerformListDirectory (m_name.GetBuffer(0));
|
|
// else
|
|
// PerformTypedown(m_name.GetBuffer(0));
|
|
m_name.ReleaseBuffer();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAddrDialog)
|
|
DDX_Text(pDX, IDC_ADDRNAME, m_name);
|
|
DDX_CBIndex(pDX, IDC_DIRECTORIES, m_directory);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnChangeName()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
GetDlgItem(IDC_TO)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_CC)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_BCC)->EnableWindow(FALSE);
|
|
|
|
// TODO: Add your control notification handler code here
|
|
if (IsSearching()) {
|
|
CString checkName (szLoadString(IDS_SEARCHRESULTS));
|
|
if (stricmp (checkName, m_name) != 0) {
|
|
OnDirectorySearch();
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
|
|
SearchText(FALSE);
|
|
}
|
|
|
|
void CAddrDialog::SearchText(BOOL bImmediately)
|
|
{
|
|
|
|
if (m_name != m_save) {
|
|
m_save = m_name;
|
|
KillTimer(m_uTypedownClock);
|
|
if (m_name.GetLength())
|
|
{
|
|
if(bImmediately)
|
|
{
|
|
//in this case we want to start a new search, not accept a result
|
|
//into the list.
|
|
GetDlgItem(IDC_TO)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_CC)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_BCC)->EnableWindow(FALSE);
|
|
m_uTypedownClock = SetTimer(ADDRESS_DIALOG_TIMER, 0, NULL);
|
|
}
|
|
else
|
|
{
|
|
DIR_Server* dir = NULL;
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
dir = GetCurrentDirectoryServer();
|
|
if (dir->dirType == PABDirectory)
|
|
m_uTypedownClock = SetTimer(ADDRESS_DIALOG_TIMER, TYPEDOWN_SPEED, NULL);
|
|
else {
|
|
int32 prefInt = LDAP_SEARCH_SPEED;
|
|
PREF_GetIntPref("ldap_1.autoComplete.interval", &prefInt);
|
|
m_uTypedownClock = SetTimer(ADDRESS_DIALOG_TIMER, prefInt, NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void CAddrDialog::OnSetFocusName()
|
|
{
|
|
CEdit *widget = (CEdit*) GetDlgItem(IDC_ADDRNAME);
|
|
if (widget)
|
|
widget->SetSel(0, -1, TRUE);
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
|
|
void CAddrDialog::OnSetFocusBucket()
|
|
{
|
|
CListBox *pBucket = (CListBox*)GetDlgItem(IDC_ADDRESSBKT);
|
|
|
|
if (pBucket->GetCount()) {
|
|
SendMessage(DM_SETDEFID, IDC_DONE_EDITING, TRUE);
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
}
|
|
|
|
void CAddrDialog::OnUpdateOnlineStatus(CCmdUI *pCmdUI)
|
|
{
|
|
pCmdUI->Enable(!NET_IsOffline());
|
|
}
|
|
|
|
void CAddrDialog::OnChangeDirectory()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
if (IsSearching())
|
|
return;
|
|
|
|
UpdateData(TRUE);
|
|
|
|
if (m_directory != m_savedir) {
|
|
m_savedir = m_directory;
|
|
if (m_directory != -1) {
|
|
// if (m_pDirOutliner)
|
|
// m_pDirOutliner->OnChangeDirectory(m_directory);
|
|
PerformChangeDirectory(m_directory);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAddrDialog::OnSelchange()
|
|
{
|
|
CListBox *pBucket = (CListBox*)GetDlgItem(IDC_ADDRESSBKT);
|
|
|
|
BOOL bEnabled = (pBucket->GetCount() > 0)? TRUE : FALSE;
|
|
pBucket->EnableWindow (bEnabled);
|
|
GetDlgItem(IDC_DONE_EDITING)->EnableWindow(bEnabled);
|
|
if (bEnabled) {
|
|
SendMessage(DM_SETDEFID, IDC_DONE_EDITING, TRUE);
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
else {
|
|
GetDlgItem(IDC_ADDRNAME)->SetFocus();
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
|
|
|
|
// TODO: Add your control notification handler code here
|
|
}
|
|
|
|
void CAddrDialog::DoUpdateWidget( int command, AB_CommandType cmd, BOOL bUseCheck )
|
|
{
|
|
|
|
CWnd* widget;
|
|
|
|
XP_Bool bSelectable = FALSE, bPlural = FALSE;
|
|
MSG_COMMAND_CHECK_STATE sState;
|
|
|
|
if (m_addrBookPane) {
|
|
if (m_pOutliner) {
|
|
MSG_ViewIndex *indices = NULL;
|
|
int count = 0;
|
|
m_pOutliner->GetSelection(indices, count);
|
|
AB_CommandStatusAB2(m_addrBookPane,
|
|
cmd,
|
|
indices, count,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
} else {
|
|
AB_CommandStatusAB2(m_addrBookPane,
|
|
cmd,
|
|
NULL, 0,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
}
|
|
}
|
|
|
|
widget = GetDlgItem ( command );
|
|
widget->EnableWindow(bSelectable);
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnDirectorySearch()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
if (m_directory != -1)
|
|
PerformDirectorySearch();
|
|
}
|
|
|
|
int CAddrDialog::DoModal ()
|
|
{
|
|
if (!m_MailNewsResourceSwitcher.Initialize())
|
|
return -1;
|
|
return CDialog::DoModal();
|
|
}
|
|
|
|
|
|
int CAddrDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
m_MailNewsResourceSwitcher.Reset();
|
|
int res = CDialog::OnCreate(lpCreateStruct);
|
|
|
|
MSG_SetFEData( (MSG_Pane*) m_addrBookPane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) m_pIAddrList );
|
|
MSG_SetFEData( (MSG_Pane*) m_addrContPane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) m_pIAddrList );
|
|
return res;
|
|
}
|
|
|
|
// rhp - This is for MAPI processing...
|
|
void
|
|
CAddrDialog::ProcessMAPIOnDone(void)
|
|
{
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
int count = pBucket->GetCount();
|
|
if (count != LB_ERR && count > 0)
|
|
{
|
|
for (int index = 0; index < count; index++)
|
|
{
|
|
NSADDRESSLIST * pAddress = (NSADDRESSLIST *)(pBucket->GetItemDataPtr(index));
|
|
ASSERT(pAddress);
|
|
if (m_mapiCBProc)
|
|
{
|
|
m_mapiCBProc(count, index, pAddress->ulHeaderType,
|
|
pAddress->szAddress); // rhp - for MAPI
|
|
}
|
|
delete (pAddress);
|
|
}
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
void CAddrDialog::OnDone()
|
|
{
|
|
NSADDRESSLIST* pAddressList;
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
// rhp - for MAPI...
|
|
if (m_isMAPI)
|
|
{
|
|
ProcessMAPIOnDone();
|
|
return;
|
|
}
|
|
|
|
int count = pBucket->GetCount();
|
|
if (count != LB_ERR && count > 0)
|
|
{
|
|
pAddressList = (NSADDRESSLIST *)calloc(count, sizeof(NSADDRESSLIST));
|
|
if (pAddressList)
|
|
{
|
|
for (int index = 0; index < count; index++)
|
|
{
|
|
NSADDRESSLIST * pAddress = (NSADDRESSLIST *)(pBucket->GetItemDataPtr(index));
|
|
ASSERT(pAddress);
|
|
pAddressList[index].ulHeaderType = pAddress->ulHeaderType;
|
|
pAddressList[index].idBitmap = pAddress->idBitmap;
|
|
pAddressList[index].idEntry = pAddress->idEntry;
|
|
pAddressList[index].szAddress = pAddress->szAddress;
|
|
delete (pAddress);
|
|
}
|
|
}
|
|
|
|
CGenericFrame *pCompose = (CGenericFrame *)GetParent();
|
|
|
|
ApiApiPtr(api);
|
|
LPUNKNOWN pUnk = api->CreateClassInstance(
|
|
APICLASS_ADDRESSCONTROL, NULL, (APISIGNATURE)pCompose);
|
|
if (pUnk)
|
|
{
|
|
LPADDRESSCONTROL pIAddressControl;
|
|
HRESULT hRes = pUnk->QueryInterface(IID_IAddressControl,(LPVOID*)&pIAddressControl);
|
|
ASSERT(hRes==NOERROR);
|
|
int ct = pIAddressControl->SetAddressList(pAddressList, count);
|
|
pUnk->Release();
|
|
}
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnCancel()
|
|
{
|
|
CDialog::OnCancel();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
void CAddrDialog::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 );
|
|
}
|
|
}
|
|
else if(pane == (MSG_Pane*)m_addrContPane)
|
|
{
|
|
if(m_pDirOutliner)
|
|
{
|
|
m_pDirOutliner->MysticStuffStarting(asynchronous, notify, where, num);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAddrDialog::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 );
|
|
UpdateMsgButtons();
|
|
}
|
|
}
|
|
else if(pane == (MSG_Pane*)m_addrContPane)
|
|
{
|
|
if(m_pDirOutliner)
|
|
{
|
|
m_pDirOutliner->MysticStuffFinishing(asynchronous, notify, where, num);
|
|
UpdateMsgButtons();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void CAddrDialog::SetStatusText(const char* pMessage)
|
|
{
|
|
m_barStatus.SetWindowText( pMessage );
|
|
}
|
|
|
|
|
|
void CAddrDialog::SetSearchResults(MSG_ViewIndex index, int32 num)
|
|
{
|
|
|
|
CString csStatus;
|
|
|
|
ASSERT(m_pOutliner);
|
|
AB_LDAPSearchResultsAB2(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 CAddrDialog::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) CAddrDialog::AddRef(void)
|
|
{
|
|
return 0; // Not a real component
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAddrDialog::Release(void)
|
|
{
|
|
return 0; // Not a real component
|
|
}
|
|
|
|
// IMailFrame interface
|
|
CMailNewsFrame *CAddrDialog::GetMailNewsFrame()
|
|
{
|
|
return (CMailNewsFrame *) NULL;
|
|
}
|
|
|
|
MSG_Pane *CAddrDialog::GetPane()
|
|
{
|
|
return (MSG_Pane*) m_addrBookPane;
|
|
}
|
|
|
|
void CAddrDialog::PaneChanged(MSG_Pane *pane, XP_Bool asynchronous,
|
|
MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
|
|
{
|
|
switch(notify)
|
|
{
|
|
case MSG_PaneNotifyTypeDownCompleted:
|
|
m_pOutliner->OnTypedown(value);
|
|
break;
|
|
case MSG_PaneNotifyStartSearching:
|
|
m_bSearching = TRUE;
|
|
m_barStatus.StartAnimation();
|
|
break;
|
|
|
|
case MSG_PaneNotifyStopSearching:
|
|
m_bSearching = FALSE;
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::AllConnectionsComplete( MWContext *pContext )
|
|
{
|
|
OnStopSearch();
|
|
|
|
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 CAddrDialog::PerformTypedown (char* name)
|
|
{
|
|
if (!m_bSearching)
|
|
m_pOutliner->OnTypedown (name);
|
|
}
|
|
|
|
void CAddrDialog::PerformListDirectory (char* name)
|
|
{
|
|
// Build Search
|
|
m_barStatus.SetWindowText( szLoadString( IDS_SEARCHING ) );
|
|
m_bSearching = TRUE;
|
|
GetDlgItem(IDC_DIRECTORIES)->EnableWindow(FALSE);
|
|
GetDlgItem( IDC_DIRSEARCH)->EnableWindow(FALSE);
|
|
GetDlgItem( ID_NAVIGATE_INTERRUPT)->EnableWindow(TRUE);
|
|
m_pOutliner->UpdateCount();
|
|
m_barStatus.StartAnimation();
|
|
|
|
HandleErrorReturn(AB_SearchDirectoryAB2(m_addrBookPane, name));
|
|
}
|
|
|
|
|
|
void CAddrDialog::MoveSelections(MSG_HEADER_SET header)
|
|
{
|
|
CString csAddress;
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
CGenericFrame * pCompose = (CGenericFrame *)GetParent();
|
|
CListBox *pBucket = GetBucket();
|
|
pBucket->EnableWindow (TRUE);
|
|
ABID entryID = 0;
|
|
|
|
m_pOutliner->GetSelection(indices, count);
|
|
AB_AttribID attribs[2] = {AB_attribEntryType, AB_attribFullAddress};
|
|
uint16 numAttribs;
|
|
AB_AttributeValue *pEntryValues;
|
|
|
|
for (int32 i = 0; i < count; i++) {
|
|
// should we stop on error?
|
|
char* fullname = NULL;
|
|
CString formattedString;
|
|
numAttribs = 2;
|
|
AB_GetEntryAttributesForPane(m_addrBookPane, indices[i], attribs,
|
|
&pEntryValues,&numAttribs);
|
|
|
|
AB_EntryType type =AB_Person;
|
|
|
|
for(int j = 0; j < numAttribs; j++)
|
|
{
|
|
switch(pEntryValues[j].attrib)
|
|
{
|
|
case AB_attribEntryType: type = pEntryValues[j].u.entryType;
|
|
break;
|
|
case AB_attribFullAddress: fullname = XP_STRDUP(pEntryValues[j].u.string);
|
|
break;
|
|
}
|
|
}
|
|
if (fullname){
|
|
AddStringToBucket(pBucket, header, fullname, type, entryID);
|
|
}
|
|
AB_FreeEntryAttributeValues(pEntryValues, numAttribs);
|
|
|
|
}
|
|
CEdit *widget = (CEdit*) GetDlgItem(IDC_ADDRNAME);
|
|
if (widget)
|
|
widget->SetSel(0, -1, TRUE);
|
|
pBucket->EnableWindow (TRUE);
|
|
SendMessage(DM_SETDEFID, IDC_DONE_EDITING, TRUE);
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
|
|
void CAddrDialog::AddStringToBucket
|
|
(CListBox *pBucket, MSG_HEADER_SET header, char* fullname, AB_EntryType type, ABID entryID)
|
|
{
|
|
CString formattedString;
|
|
switch (header) {
|
|
case MSG_TO_HEADER_MASK:
|
|
formattedString.Format(XP_GetString(MK_ADDR_TONAME), fullname);
|
|
break;
|
|
case MSG_CC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString(MK_ADDR_CCNAME), fullname);
|
|
break;
|
|
case MSG_BCC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString(MK_ADDR_BCCNAME), fullname);
|
|
break;
|
|
default:
|
|
formattedString.Format(XP_GetString(MK_ADDR_TONAME), fullname);
|
|
}
|
|
|
|
if (pBucket->FindStringExact(0, (LPCTSTR) formattedString ) == LB_ERR) {
|
|
int idx = pBucket->AddString(formattedString);
|
|
if ((idx != LB_ERR) || (idx != LB_ERRSPACE))
|
|
{
|
|
NSADDRESSLIST *pAddress = new NSADDRESSLIST;
|
|
ASSERT(pAddress);
|
|
pAddress->ulHeaderType = header;
|
|
|
|
if (type == ABTypeList)
|
|
pAddress->idBitmap = IDB_MAILINGLIST;
|
|
else
|
|
pAddress->idBitmap = IDB_PERSON;
|
|
|
|
pAddress->idEntry = entryID;
|
|
pAddress->szAddress = fullname;
|
|
pBucket->SetItemDataPtr( idx, pAddress );
|
|
}
|
|
}
|
|
int total = pBucket->GetCount();
|
|
if (total)
|
|
{
|
|
GetDlgItem(IDC_DONE_EDITING)->EnableWindow(TRUE);
|
|
pBucket->SetCurSel(total - 1);
|
|
}
|
|
else
|
|
GetDlgItem(IDC_DONE_EDITING)->EnableWindow(FALSE);
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnRemove()
|
|
{
|
|
CListBox *pBucket = GetBucket();
|
|
int prevSel = pBucket->GetCurSel();
|
|
if (prevSel != -1)
|
|
{
|
|
NSADDRESSLIST * pAddress = (NSADDRESSLIST *)(pBucket->GetItemDataPtr(prevSel));
|
|
if (pAddress->szAddress)
|
|
free (pAddress->szAddress);
|
|
delete pAddress;
|
|
|
|
int count = pBucket->DeleteString (prevSel);
|
|
if (count) {
|
|
if (prevSel)
|
|
pBucket->SetCurSel (prevSel - 1);
|
|
else
|
|
pBucket->SetCurSel (prevSel);
|
|
}
|
|
OnSelchange();
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnComposeMsg()
|
|
{
|
|
MoveSelections(MSG_TO_HEADER_MASK);
|
|
m_idefButtonID = IDC_TO;
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnComposeCCMsg()
|
|
{
|
|
MoveSelections(MSG_CC_HEADER_MASK);
|
|
m_idefButtonID = IDC_CC;
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnComposeBCCMsg()
|
|
{
|
|
MoveSelections(MSG_BCC_HEADER_MASK);
|
|
m_idefButtonID = IDC_BCC;
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnGetProperties()
|
|
{
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
HWND hwndFocus = ::GetFocus();
|
|
|
|
|
|
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
|
|
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
|
|
if (hwndFocus == hwndDirOutliner)
|
|
{
|
|
m_pDirOutliner->GetSelection(indices, count);
|
|
HandleErrorReturn(AB_CommandAB2 (m_addrContPane, AB_PropertiesCmd, indices, count));
|
|
}
|
|
else
|
|
{
|
|
m_pOutliner->GetSelection(indices, count);
|
|
HandleErrorReturn(AB_CommandAB2 (m_addrBookPane, AB_PropertiesCmd, indices, count));
|
|
}
|
|
}
|
|
|
|
void CAddrDialog::HandleErrorReturn(int errorid)
|
|
{
|
|
if (errorid) {
|
|
CString s;
|
|
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
|
|
::MessageBox(NULL, XP_GetString(errorid), s, MB_OK);
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::PerformChangeDirectory (int dirIndex)
|
|
{
|
|
DIR_Server* dir = GetCurrentDirectoryServer();
|
|
AB_ContainerInfo *pCurrentContainerInfo = AB_GetContainerForIndex(m_addrContPane, dirIndex);
|
|
HandleErrorReturn(AB_ChangeABContainer(m_addrBookPane, pCurrentContainerInfo));
|
|
m_pOutliner->SetDirectoryIndex(dirIndex);
|
|
DoUpdateWidget(IDC_DIRSEARCH, AB_LDAPSearchCmd, TRUE);
|
|
DoUpdateWidget(IDC_TO, AB_NewMessageCmd, TRUE);
|
|
m_pOutliner->UpdateCount( );
|
|
|
|
int idx = m_barStatus.CommandToIndex(IDS_SECURITY_STATUS);
|
|
if (idx > -1) {
|
|
UINT nID = IDS_SECURITY_STATUS;
|
|
UINT nStyle;
|
|
int nWidth;
|
|
m_barStatus.GetPaneInfo( idx, nID, nStyle, nWidth );
|
|
if (dir->isSecure)
|
|
m_barStatus.SetPaneInfo(idx, IDS_SECURITY_STATUS, SBPS_NORMAL, nWidth);
|
|
else
|
|
m_barStatus.SetPaneInfo(idx, IDS_SECURITY_STATUS, SBPS_DISABLED, nWidth);
|
|
}
|
|
UpdateMsgButtons();
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnUpdateDirectorySelection (int dirIndex, BOOL indexChanged)
|
|
{
|
|
if(indexChanged)
|
|
{
|
|
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
|
|
widget->SetCurSel(dirIndex);
|
|
PerformChangeDirectory(dirIndex);
|
|
m_save = "";
|
|
}
|
|
}
|
|
|
|
AB_ContainerInfo * CAddrDialog::GetCurrentContainerInfo()
|
|
{
|
|
return (AB_GetContainerForIndex(m_addrContPane, m_pDirOutliner->GetDirectoryIndex()));
|
|
}
|
|
|
|
void CAddrDialog::SelectionChanged()
|
|
{
|
|
DoUpdateWidget(IDC_TO, AB_NewMessageCmd, TRUE);
|
|
UpdateMsgButtons();
|
|
CWnd* widget = NULL;
|
|
widget = GetDlgItem (GetDefaultButtonID());
|
|
if (widget) {
|
|
SendMessage(DM_SETDEFID, GetDefaultButtonID(), TRUE);
|
|
widget->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
widget = GetDlgItem (IDC_DONE_EDITING);
|
|
widget->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void CAddrDialog::DoubleClick()
|
|
{
|
|
SetDefaultButtonID (IDC_TO);
|
|
MoveSelections (MSG_TO_HEADER_MASK);
|
|
}
|
|
|
|
CWnd* CAddrDialog::GetOwnerWindow()
|
|
{
|
|
return this;
|
|
}
|
|
|
|
void CAddrDialog::OnStopSearch ()
|
|
{
|
|
if ( m_bSearching) {
|
|
// We've ended the search
|
|
XP_InterruptContext( m_pCX->GetContext() );
|
|
HandleErrorReturn(AB_FinishSearchAB2(m_addrBookPane));
|
|
m_bSearching = FALSE;
|
|
GetDlgItem(IDC_DIRECTORIES)->EnableWindow(TRUE);
|
|
GetDlgItem( IDC_DIRSEARCH)->EnableWindow(TRUE);
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow (FALSE);
|
|
m_pDirOutliner->EnableWindow(TRUE);
|
|
m_barStatus.StopAnimation();
|
|
if (m_pOutliner->GetTotalLines())
|
|
m_pOutliner->SelectItem (0);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void CAddrDialog::PerformDirectorySearch ()
|
|
{
|
|
if ( m_bSearching) {
|
|
OnStopSearch ();
|
|
return;
|
|
}
|
|
|
|
|
|
CSearchDialog searchDlg ((UINT) IDS_ADRSEARCH,
|
|
(MSG_Pane*) m_addrBookPane,
|
|
GetCurrentDirectoryServer(),
|
|
this);
|
|
int result = searchDlg.DoModal();
|
|
|
|
// Build Search
|
|
if (result == IDOK)
|
|
{
|
|
GetDlgItem(IDC_DIRSEARCH)->EnableWindow (FALSE);
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow (TRUE);
|
|
GetDlgItem(IDC_DIRECTORIES)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_ADDRNAME)->SetWindowText("");
|
|
|
|
// Build Search
|
|
m_barStatus.SetWindowText( szLoadString( IDS_SEARCHING ) );
|
|
m_bSearching = TRUE;
|
|
GetDlgItem(IDC_ADDRNAME)->SetWindowText(CString (szLoadString(IDS_SEARCHRESULTS)));
|
|
m_pOutliner->UpdateCount();
|
|
m_pOutliner->SetFocus();
|
|
m_pDirOutliner->EnableWindow(FALSE);
|
|
|
|
HandleErrorReturn(AB_SearchDirectoryAB2(m_addrBookPane, NULL));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialogOutliner
|
|
BEGIN_MESSAGE_MAP(CAddrDialogOutliner, CMSelectOutliner)
|
|
//{{AFX_MSG_MAP(CAddrDialogOutliner)
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_TIMER()
|
|
ON_WM_KILLFOCUS()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogOutliner::CAddrDialogOutliner ( )
|
|
{
|
|
m_attribSortBy = ID_COLADDR_NAME;
|
|
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_bSortAscending = TRUE;
|
|
m_iMysticPlane = 0;
|
|
m_dirIndex = 0;
|
|
m_hFont = NULL;
|
|
m_uTypedownClock = 0;
|
|
}
|
|
|
|
CAddrDialogOutliner::~CAddrDialogOutliner ( )
|
|
{
|
|
if (m_pUnkUserImage) {
|
|
if (m_pIUserImage)
|
|
m_pUnkUserImage->Release();
|
|
}
|
|
|
|
if (m_hFont) {
|
|
theApp.ReleaseAppFont(m_hFont);
|
|
}
|
|
}
|
|
|
|
DIR_Server* CAddrDialogOutliner::GetCurrentDirectoryServer ()
|
|
{
|
|
return (DIR_Server*)XP_ListGetObjectNum(theApp.m_directories, m_dirIndex + 1);
|
|
}
|
|
|
|
void CAddrDialogOutliner::SetDirectoryIndex(int dirIndex )
|
|
{
|
|
m_dirIndex = dirIndex;
|
|
DIR_Server* pServer = GetCurrentDirectoryServer ();
|
|
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();
|
|
ClearSelection();
|
|
if (m_iTotalLines)
|
|
SelectItem (0);
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::OnTimer(UINT nID)
|
|
{
|
|
CMSelectOutliner::OnTimer(nID);
|
|
if (nID == ADDRDLG_OUTLINER_TYPEDOWN_TIMER) {
|
|
KillTimer(m_uTypedownClock);
|
|
m_psTypedown = "";
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::OnKeyDown ( UINT nChar, UINT nRepCnt, UINT nFlags )
|
|
{
|
|
CMSelectOutliner::OnKeyDown ( nChar, nRepCnt, nFlags );
|
|
KillTimer(m_uTypedownClock);
|
|
if (nChar > VK_HELP) {
|
|
KillTimer(m_uTypedownClock);
|
|
m_psTypedown += nChar;
|
|
OnTypedown (m_psTypedown.GetBuffer (0));
|
|
m_psTypedown.ReleaseBuffer(-1);
|
|
int32 prefInt = OUTLINER_TYPEDOWN_SPEED;
|
|
PREF_GetIntPref("ldap_1.autoComplete.interval", &prefInt);
|
|
m_uTypedownClock = SetTimer(ADDRDLG_OUTLINER_TYPEDOWN_TIMER, prefInt, NULL);
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::OnKillFocus( CWnd* pNewWnd )
|
|
{
|
|
CMSelectOutliner::OnKillFocus (pNewWnd );
|
|
m_psTypedown = "";
|
|
KillTimer(m_uTypedownClock);
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::OnTypedown (char* name)
|
|
{
|
|
MSG_ViewIndex index;
|
|
uint startIndex;
|
|
|
|
if (GetFocusLine() != -1)
|
|
startIndex = GetFocusLine();
|
|
else
|
|
startIndex = 0;
|
|
|
|
AB_GetIndexMatchingTypedown(m_pane, &index,
|
|
(LPCTSTR) name, startIndex);
|
|
ScrollIntoView(CASTINT(index));
|
|
SelectItem (CASTINT(index));
|
|
}
|
|
|
|
void CAddrDialogOutliner::UpdateCount( )
|
|
{
|
|
uint32 count;
|
|
|
|
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
|
|
SetTotalLines(CASTINT(count));
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::SetPane(ABPane *pane)
|
|
{
|
|
m_pane = pane;
|
|
uint32 count;
|
|
|
|
if (m_pane) {
|
|
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
|
|
SetTotalLines(CASTINT(count));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::MysticStuffStarting( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
++m_iMysticPlane;
|
|
}
|
|
|
|
void CAddrDialogOutliner::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
|
|
&& ((CAddrDialog*)pParent)->IsSearching() && num > 0)
|
|
{
|
|
((CAddrDialog*)pParent)->SetSearchResults(where, num);
|
|
HandleInsert(where, num);
|
|
}
|
|
else
|
|
{
|
|
if (num > 0)
|
|
HandleInsert(where, num);
|
|
else
|
|
HandleDelete(where, -num);
|
|
}
|
|
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;
|
|
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
|
|
SetTotalLines(CASTINT(count));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::SetTotalLines( int count)
|
|
{
|
|
CMSelectOutliner::SetTotalLines(count);
|
|
if (count = 0)
|
|
ClearSelection();
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CAddrDialogOutliner::RenderData ( UINT iColumn, CRect &rect, CDC &dc, const char * text )
|
|
{
|
|
if ( iColumn != ID_COLADDR_TYPE )
|
|
return CMSelectOutliner::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 CAddrDialogOutliner::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 CAddrDialogOutliner::TranslateIconFolder (void * pData)
|
|
{
|
|
// We're a flat list, so we're never a folder
|
|
return ( OUTLINER_ITEM );
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogOutliner::ColumnCommand ( int iColumn, int iLine )
|
|
{
|
|
// We have no column commands
|
|
return FALSE;
|
|
}
|
|
|
|
HFONT CAddrDialogOutliner::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 * CAddrDialogOutliner::AcquireLineData ( int line )
|
|
{
|
|
if ( line >= m_iTotalLines)
|
|
return NULL;
|
|
if (!AB_GetEntryLine(m_pane, line, &m_EntryLine ))
|
|
return NULL;
|
|
|
|
return &m_EntryLine;
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
|
|
{
|
|
if ( pFlags ) *pFlags = 0; // Flags?
|
|
if ( pDepth ) *pDepth = 0; // We're flat, remember?
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::ReleaseLineData ( void * )
|
|
{
|
|
}
|
|
|
|
|
|
LPCTSTR CAddrDialogOutliner::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 CAddrDialogOutliner::OnSelChanged()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
((CAddrDialog*) pParent)->DoUpdateWidget(IDC_TO, AB_NewMessageCmd, TRUE);
|
|
((CAddrDialog*) pParent)->UpdateMsgButtons();
|
|
CWnd* widget = NULL;
|
|
widget = ((CAddrDialog*) pParent)->GetDlgItem (((CAddrDialog*) pParent)->GetDefaultButtonID());
|
|
if (widget) {
|
|
SendMessage(DM_SETDEFID, ((CAddrDialog*) pParent)->GetDefaultButtonID(), TRUE);
|
|
widget->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
widget = ((CAddrDialog*) pParent)->GetDlgItem (IDC_DONE_EDITING);
|
|
widget->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::OnSelDblClk()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
|
|
((CAddrDialog*) pParent)->SetDefaultButtonID (IDC_TO);
|
|
((CAddrDialog*) pParent)->MoveSelections (MSG_TO_HEADER_MASK);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrOutlinerParent
|
|
|
|
BEGIN_MESSAGE_MAP(CAddrDialogOutlinerParent, COutlinerParent)
|
|
//{{AFX_MSG_MAP(CAddrDialogOutlinerParent)
|
|
ON_WM_LBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogOutlinerParent::CAddrDialogOutlinerParent()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
CAddrDialogOutlinerParent::~CAddrDialogOutlinerParent()
|
|
{
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, const char * text )
|
|
{
|
|
int cx = 3, cy = 0;
|
|
CAddrDialogOutliner *pOutliner = (CAddrDialogOutliner *) 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) );
|
|
|
|
// 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 * CAddrDialogOutlinerParent::GetOutliner ( void )
|
|
{
|
|
return new CAddrDialogOutliner;
|
|
}
|
|
|
|
|
|
void CAddrDialogOutlinerParent::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 CAddrDialogOutlinerParent::ColumnCommand ( int idColumn )
|
|
{
|
|
ABID lastSelection;
|
|
|
|
CAddrDialogOutliner *pOutliner = (CAddrDialogOutliner *) m_pOutliner;
|
|
|
|
if (pOutliner->GetFocusLine() != -1)
|
|
lastSelection = AB_GetEntryIDAt((AddressPane*) pOutliner->GetPane(), pOutliner->GetFocusLine());
|
|
|
|
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
|
|
|
|
if (idColumn == pOutliner->m_attribSortBy) {
|
|
pOutliner->m_bSortAscending = !pOutliner->m_bSortAscending;
|
|
}
|
|
else
|
|
pOutliner->m_bSortAscending = TRUE;
|
|
|
|
pOutliner->m_attribSortBy = idColumn;
|
|
|
|
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 CAddrDialogOutlinerParent::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.abook_columns_win");
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialogDirOutliner
|
|
BEGIN_MESSAGE_MAP(CAddrDialogDirOutliner, CMSelectOutliner)
|
|
//{{AFX_MSG_MAP(CAddrDialogDirOutliner)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogDirOutliner::CAddrDialogDirOutliner ( )
|
|
{
|
|
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_DIRLIST,16,16);
|
|
}
|
|
m_iMysticPlane = 0;
|
|
m_dirIndex = 0;
|
|
m_hFont = NULL;
|
|
}
|
|
|
|
CAddrDialogDirOutliner::~CAddrDialogDirOutliner ( )
|
|
{
|
|
if (m_pUnkUserImage) {
|
|
if (m_pIUserImage)
|
|
m_pUnkUserImage->Release();
|
|
}
|
|
|
|
if (m_hFont) {
|
|
theApp.ReleaseAppFont(m_hFont);
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::SetDirectoryIndex(int dirIndex )
|
|
{
|
|
m_dirIndex = dirIndex;
|
|
SelectItem (CASTINT(m_dirIndex));
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::UpdateCount( )
|
|
{
|
|
m_iTotalLines = XP_ListCount (theApp.m_directories);
|
|
if (!m_iTotalLines)
|
|
ClearSelection();
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::SetPane(ABPane *pane)
|
|
{
|
|
m_pane = pane;
|
|
|
|
if (m_pane) {
|
|
SetTotalLines(XP_ListCount (theApp.m_directories));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::MysticStuffStarting( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
++m_iMysticPlane;
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::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 (num > 0)
|
|
HandleInsert(where, num);
|
|
else
|
|
HandleDelete(where, -num);
|
|
|
|
break;
|
|
|
|
case MSG_NotifyChanged:
|
|
InvalidateLines( (int) where, (int) num );
|
|
break;
|
|
|
|
case MSG_NotifyAll:
|
|
case MSG_NotifyScramble:
|
|
Invalidate();
|
|
break;
|
|
}
|
|
|
|
if (( !--m_iMysticPlane && m_pane)) {
|
|
SetTotalLines(XP_ListCount (theApp.m_directories));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::SetTotalLines( int count)
|
|
{
|
|
CMSelectOutliner::SetTotalLines(count);
|
|
if (count = 0)
|
|
ClearSelection();
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CAddrDialogDirOutliner::RenderData ( UINT iColumn, CRect &rect, CDC &dc, const char * text )
|
|
{
|
|
if ( iColumn != ID_COLDIR_TYPE )
|
|
return CMSelectOutliner::RenderData ( iColumn, rect, dc, text );
|
|
int idxImage;
|
|
|
|
if (m_pDirLine->dirType == LDAPDirectory)
|
|
idxImage = IDX_DIRLDAPAB;
|
|
else
|
|
idxImage = IDX_DIRPERSONALAB;
|
|
|
|
m_pIUserImage->DrawImage ( idxImage,
|
|
rect.left + ( ( rect.Width ( ) - 16 ) / 2 ), rect.top, &dc, FALSE );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
int CAddrDialogDirOutliner::TranslateIcon ( void * pLineData )
|
|
{
|
|
DIR_Server* line = (DIR_Server*) pLineData;
|
|
int idxImage = 0;
|
|
|
|
if (m_pDirLine->dirType == ABTypeList)
|
|
idxImage = IDX_DIRLDAPAB;
|
|
else
|
|
idxImage = IDX_DIRPERSONALAB;
|
|
return idxImage;
|
|
}
|
|
|
|
int CAddrDialogDirOutliner::TranslateIconFolder (void * pData)
|
|
{
|
|
// We're a flat list, so we're never a folder
|
|
return ( OUTLINER_ITEM );
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogDirOutliner::ColumnCommand ( int iColumn, int iLine )
|
|
{
|
|
// We have no column commands
|
|
return FALSE;
|
|
}
|
|
|
|
HFONT CAddrDialogDirOutliner::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 * CAddrDialogDirOutliner::AcquireLineData ( int line )
|
|
{
|
|
if ( line >= m_iTotalLines)
|
|
return NULL;
|
|
m_pDirLine = (DIR_Server*) XP_ListGetObjectNum(theApp.m_directories, line + 1);
|
|
|
|
return m_pDirLine;
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
|
|
{
|
|
if ( pFlags ) *pFlags = 0; // Flags?
|
|
if ( pDepth ) *pDepth = 0; // We're flat, remember?
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::ReleaseLineData ( void * )
|
|
{
|
|
}
|
|
|
|
|
|
LPCTSTR CAddrDialogDirOutliner::GetColumnText ( UINT iColumn, void * pLineData )
|
|
{
|
|
DIR_Server* line = (DIR_Server*) pLineData;
|
|
|
|
switch (iColumn) {
|
|
case ID_COLDIR_NAME:
|
|
return line->description;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ("");
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::OnSelChanged()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
|
|
if (((CAddrDialog*) pParent)->IsSearching())
|
|
return;
|
|
|
|
GetSelection(indices, count);
|
|
|
|
if (count == 1)
|
|
((CAddrDialog*) pParent)->OnUpdateDirectorySelection(indices[0], TRUE);
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::OnSelDblClk()
|
|
{
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrOutlinerParent
|
|
|
|
BEGIN_MESSAGE_MAP(CAddrDialogDirOutlinerParent, COutlinerParent)
|
|
//{{AFX_MSG_MAP(CAddrDialogDirOutlinerParent)
|
|
ON_WM_LBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogDirOutlinerParent::CAddrDialogDirOutlinerParent()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
CAddrDialogDirOutlinerParent::~CAddrDialogDirOutlinerParent()
|
|
{
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogDirOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, const char * text )
|
|
{
|
|
int cx = 3, cy = 0;
|
|
CAddrDialogDirOutliner *pOutliner = (CAddrDialogDirOutliner *) 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 * CAddrDialogDirOutlinerParent::GetOutliner ( void )
|
|
{
|
|
return new CAddrDialogDirOutliner;
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutlinerParent::CreateColumns ( void )
|
|
{
|
|
|
|
int iCol0 = 0,
|
|
iCol1 = 0;
|
|
CString cs;
|
|
|
|
m_pOutliner->AddColumn ("", ID_COLDIR_TYPE, 24, 0, ColumnFixed, 0, TRUE );
|
|
cs.LoadString(IDS_USERNAME);
|
|
m_pOutliner->AddColumn (cs, ID_COLDIR_NAME, 1500, 0, ColumnVariable, iCol0 ? iCol0 : 1500 );
|
|
m_pOutliner->SetHasPipes( FALSE );
|
|
|
|
m_pOutliner->SetVisibleColumns(DEF_DIRVISIBLE_COLUMNS);
|
|
m_pOutliner->LoadXPPrefs("mailnews.abook_dir_columns_win");
|
|
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutlinerParent::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.abook_dir_columns_win");
|
|
}
|
|
|
|
|
|
|
|
void CAddrDialog::OnHelp()
|
|
{
|
|
NetHelp(HELP_SELECT_ADDRESSES);
|
|
}
|
|
|
|
|
|
BOOL CAddrDialog::IsDragInListBox(CPoint *pPoint)
|
|
{
|
|
CRect listRect;
|
|
|
|
CListBox *pBucket = GetBucket();
|
|
pBucket->GetWindowRect(LPRECT(listRect));
|
|
ScreenToClient(LPRECT(listRect));
|
|
if (listRect.PtInRect(*pPoint))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CAddrDialog::ProcessVCardData(COleDataObject * pDataObject, CPoint &point)
|
|
{
|
|
UINT clipFormat;
|
|
BOOL retVal = TRUE;;
|
|
CWnd * pWnd = GetFocus();
|
|
XP_List * pEntries;
|
|
int32 iEntries;
|
|
|
|
if (pDataObject->IsDataAvailable(
|
|
clipFormat = ::RegisterClipboardFormat(vCardClipboardFormat)))
|
|
{
|
|
HGLOBAL hAddresses = pDataObject->GetGlobalData(clipFormat);
|
|
LPSTR pAddresses = (LPSTR)GlobalLock(hAddresses);
|
|
ASSERT(pAddresses);
|
|
if (!AB_ConvertVCardsToExpandedName(theApp.m_pABook,pAddresses,&pEntries,&iEntries))
|
|
{
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
XP_List * node = pEntries;
|
|
for (int32 i = 0; i < iEntries+1; i++)
|
|
{
|
|
char * pString = (char *)node->object;
|
|
if (pString != NULL)
|
|
AddStringToBucket(pBucket, MSG_TO_HEADER_MASK, pString, AB_Person, -1);
|
|
node = node->next;
|
|
if (!node)
|
|
break;
|
|
}
|
|
XP_ListDestroy(pEntries);
|
|
}
|
|
}
|
|
|
|
if (pWnd && ::IsWindow(pWnd->m_hWnd))
|
|
pWnd->SetFocus();
|
|
return retVal;
|
|
}
|
|
|
|
void CAddrDialog::UpdateMsgButtons()
|
|
{
|
|
if (m_pOutliner)
|
|
{
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
BOOL bEnable;
|
|
|
|
m_pOutliner->GetSelection(indices, count);
|
|
bEnable = (count > 0) ? TRUE : FALSE;
|
|
GetDlgItem(IDC_TO)->EnableWindow(bEnable);
|
|
GetDlgItem(IDC_CC)->EnableWindow(bEnable);
|
|
GetDlgItem(IDC_BCC)->EnableWindow(bEnable);
|
|
#ifdef MOZ_NEWADDR
|
|
GetDlgItem(ID_ITEM_PROPERTIES)->EnableWindow(bEnable);
|
|
#else
|
|
//leave disabled for now.
|
|
GetDlgItem(ID_ITEM_PROPERTIES)->EnableWindow(FALSE);
|
|
#endif
|
|
}
|
|
DoUpdateWidget(IDC_DIRSEARCH, AB_LDAPSearchCmd, TRUE);
|
|
if (m_bSearching)
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow(TRUE);
|
|
else
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow(FALSE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CAddressPickerDropTarget
|
|
|
|
DROPEFFECT CAddressPickerDropTarget::OnDragOver(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DWORD dwKeyState, CPoint point)
|
|
{
|
|
DROPEFFECT deReturn = DROPEFFECT_NONE;
|
|
// Only interested in vcard
|
|
if(pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(vCardClipboardFormat)) )
|
|
{
|
|
if (m_pOwner->IsDragInListBox(&point))
|
|
deReturn = DROPEFFECT_COPY;
|
|
}
|
|
return(deReturn);
|
|
}
|
|
|
|
BOOL CAddressPickerDropTarget::OnDrop
|
|
(CWnd * pWnd, COleDataObject * pDataObject, DROPEFFECT, CPoint point)
|
|
{
|
|
if (pDataObject->IsDataAvailable(::RegisterClipboardFormat(vCardClipboardFormat)) )
|
|
{
|
|
return m_pOwner->ProcessVCardData(pDataObject,point);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
#else //MOZ_NEWADDR
|
|
|
|
#include "msg_srch.h"
|
|
#include "dirprefs.h"
|
|
#include "apiaddr.h"
|
|
#include "nethelp.h"
|
|
#include "prefapi.h"
|
|
#include "intl_csi.h"
|
|
#include "srchdlg.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
extern "C" {
|
|
#include "xpgetstr.h"
|
|
extern int MK_ADDR_CCNAME;
|
|
extern int MK_ADDR_BCCNAME;
|
|
extern int MK_ADDR_TONAME;
|
|
};
|
|
|
|
#define ADDRESS_DIALOG_TIMER 7
|
|
#define TYPEDOWN_SPEED 300
|
|
#define LDAP_SEARCH_SPEED 1250
|
|
#define ADDRDLG_OUTLINER_TYPEDOWN_TIMER 251
|
|
#define OUTLINER_TYPEDOWN_SPEED 1250
|
|
|
|
|
|
class CAddrDialog;
|
|
|
|
|
|
CAddrDialogCX::CAddrDialogCX(CAddrDialog *pDialog)
|
|
: CStubsCX(AddressCX, MWContextAddressBook)
|
|
{
|
|
m_pDialog = pDialog;
|
|
m_lPercent = 0;
|
|
m_bAnimated = FALSE;
|
|
}
|
|
|
|
|
|
void CAddrDialogCX::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 CAddrDialogCX::Progress(MWContext *pContext, const char *pMessage) {
|
|
m_csProgress = pMessage;
|
|
if ( m_pDialog ) {
|
|
m_pDialog->SetStatusText(pMessage);
|
|
}
|
|
}
|
|
|
|
int32 CAddrDialogCX::QueryProgressPercent() {
|
|
return m_lPercent;
|
|
}
|
|
|
|
|
|
void CAddrDialogCX::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 CAddrDialogCX::UpdateStopState( MWContext *pContext )
|
|
{
|
|
if (m_pDialog) {
|
|
m_pDialog->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
|
|
}
|
|
}
|
|
|
|
CWnd *CAddrDialogCX::GetDialogOwner() const {
|
|
return m_pDialog;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialogEntryList
|
|
|
|
class CAddrDialogEntryList: public IMsgList {
|
|
|
|
CAddrDialog *m_pAddrDialog;
|
|
unsigned long m_ulRefCount;
|
|
|
|
public:
|
|
// IUnknown Interface
|
|
STDMETHODIMP QueryInterface(REFIID,LPVOID *);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
// IMsgList Interface
|
|
virtual void ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num);
|
|
virtual void ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num);
|
|
virtual void GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
|
|
int *focus);
|
|
virtual void SelectItem( MSG_Pane* pane, int item );
|
|
|
|
virtual void CopyMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
|
|
MSG_FolderInfo *folderInfo) {}
|
|
virtual void MoveMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
|
|
MSG_FolderInfo *folderInfo) {}
|
|
|
|
CAddrDialogEntryList( CAddrDialog *pAddrDialog ) {
|
|
m_ulRefCount = 0;
|
|
m_pAddrDialog = pAddrDialog;
|
|
}
|
|
};
|
|
|
|
|
|
STDMETHODIMP CAddrDialogEntryList::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_pAddrDialog;
|
|
|
|
if (*ppv != NULL) {
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAddrDialogEntryList::AddRef(void)
|
|
{
|
|
return ++m_ulRefCount;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAddrDialogEntryList::Release(void)
|
|
{
|
|
ULONG ulRef;
|
|
ulRef = --m_ulRefCount;
|
|
if (m_ulRefCount == 0)
|
|
delete this;
|
|
return ulRef;
|
|
}
|
|
|
|
void CAddrDialogEntryList::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if (m_pAddrDialog) {
|
|
m_pAddrDialog->ListChangeStarting( pane, asynchronous,
|
|
notify, where, num );
|
|
}
|
|
}
|
|
|
|
void CAddrDialogEntryList::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
|
|
int32 num)
|
|
{
|
|
if (m_pAddrDialog) {
|
|
m_pAddrDialog->ListChangeFinished( pane, asynchronous,
|
|
notify, where, num );
|
|
}
|
|
}
|
|
|
|
void CAddrDialogEntryList::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
|
|
int *focus)
|
|
{
|
|
}
|
|
|
|
void CAddrDialogEntryList::SelectItem( MSG_Pane* pane, int item )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialog
|
|
|
|
CAddrDialog::CAddrDialog(
|
|
CWnd* pParent, /*=NULL*/
|
|
BOOL isMapi, LPSTR winText, MAPIAddressCallbackProc mapiCB, MAPIAddressGetAddrProc mapiGetProc // rhp - MAPI
|
|
)
|
|
: CDialog(CAddrDialog::IDD, pParent)
|
|
{
|
|
|
|
CString msg;
|
|
int result = 0;
|
|
INTL_CharSetInfo csi;
|
|
|
|
m_pCX = new CAddrDialogCX( 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_pOutliner = NULL;
|
|
m_addrBookPane = NULL;
|
|
m_bSearching = FALSE;
|
|
m_directory = 0;
|
|
m_pDropTarget = NULL;
|
|
m_idefButtonID = IDC_TO;
|
|
|
|
CAddrDialogEntryList *pInstance = new CAddrDialogEntryList( this );
|
|
pInstance->QueryInterface( IID_IMsgList, (LPVOID *) &m_pIAddrList );
|
|
|
|
HandleErrorReturn((result = AB_CreateAddressBookPane(&m_addrBookPane,
|
|
m_pCX->GetContext(),
|
|
WFE_MSGGetMaster())));
|
|
|
|
// rhp - MAPI stuff...
|
|
m_isMAPI = isMapi;
|
|
m_mapiHeader = NULL;
|
|
m_mapiCBProc = NULL;
|
|
m_mapiGetAddrProc = NULL;
|
|
|
|
if (m_isMAPI)
|
|
{
|
|
if ( (winText) && (*winText) )
|
|
{
|
|
m_mapiHeader = strdup(winText);
|
|
}
|
|
|
|
m_mapiCBProc = mapiCB;
|
|
m_mapiGetAddrProc = mapiGetProc;
|
|
}
|
|
|
|
//{{AFX_DATA_INIT(CAddrDialog)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CAddrDialog::OnKeyDown ( UINT nChar, UINT nRepCnt, UINT nFlags )
|
|
{
|
|
CDialog::OnKeyDown ( nChar, nRepCnt, nFlags );
|
|
}
|
|
|
|
void CAddrDialog::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
|
|
|
|
PREF_SetIntPref("mail.addr_picker.sliderwidth", m_pSplitter->GetPaneSize());
|
|
|
|
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;
|
|
}
|
|
|
|
if (m_pDirOutlinerParent){
|
|
delete m_pDirOutlinerParent;
|
|
}
|
|
|
|
if (m_pSplitter){
|
|
delete m_pSplitter;
|
|
}
|
|
|
|
if (m_pDropTarget) {
|
|
m_pDropTarget->Revoke();
|
|
delete m_pDropTarget;
|
|
m_pDropTarget = NULL;
|
|
}
|
|
|
|
// rhp - for MAPI
|
|
if (m_isMAPI)
|
|
{
|
|
if (m_mapiHeader)
|
|
free(m_mapiHeader);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialog Overloaded methods
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// rhp - this is needed for the population of the to address type...
|
|
void
|
|
CAddrDialog::ProcessMAPIAddressPopulation(void)
|
|
{
|
|
int index = 0;
|
|
LPSTR name;
|
|
LPSTR address;
|
|
int addrType;
|
|
|
|
if (!m_mapiGetAddrProc)
|
|
return;
|
|
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
while ( m_mapiGetAddrProc(&name, &address, &addrType) )
|
|
{
|
|
char *formatted;
|
|
char tempString[512] = "";
|
|
int nIndex = -1;
|
|
NSADDRESSLIST *pAddress = new NSADDRESSLIST;
|
|
|
|
ASSERT(pAddress);
|
|
if (!pAddress)
|
|
continue;
|
|
|
|
if ((name) && (*name))
|
|
{
|
|
strcat(tempString, name);
|
|
strcat(tempString, " ");
|
|
}
|
|
|
|
if ( (!address) || (!(*address)) )
|
|
continue;
|
|
|
|
strcat(tempString, "<");
|
|
strcat(tempString, address);
|
|
strcat(tempString, ">");
|
|
|
|
pAddress->ulHeaderType = addrType;
|
|
pAddress->idBitmap = 0;
|
|
pAddress->idEntry = 0;
|
|
pAddress->szAddress = strdup (tempString);
|
|
|
|
GetFormattedString(tempString, addrType, &formatted);
|
|
if (formatted)
|
|
{
|
|
nIndex = pBucket->InsertString( index, formatted );
|
|
free (formatted);
|
|
}
|
|
|
|
if ( nIndex < 0 )
|
|
return;
|
|
|
|
pBucket->SetItemDataPtr( nIndex, pAddress );
|
|
++index;
|
|
}
|
|
|
|
OnSelchange();
|
|
}
|
|
|
|
BOOL CAddrDialog::OnInitDialog( )
|
|
{
|
|
if (CDialog::OnInitDialog()) {
|
|
CWnd* widget;
|
|
CRect rect2, rect3, rect4;
|
|
UINT aIDArray[] = { IDS_SECURITY_STATUS, IDS_TRANSFER_STATUS, ID_SEPARATOR};
|
|
int result = 0;
|
|
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
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;
|
|
}
|
|
|
|
widget = GetDlgItem(IDC_ADDRESSLIST);
|
|
widget->GetWindowRect(&rect2);
|
|
widget->GetClientRect(&rect3);
|
|
GetClientRect(&rect4);
|
|
ClientToScreen(&rect4);
|
|
rect2.OffsetRect(-rect4.left, -rect4.top);
|
|
|
|
widget->DestroyWindow ();
|
|
|
|
// create slider control
|
|
m_pSplitter = (CMailNewsSplitter *) RUNTIME_CLASS(CMailNewsSplitter)->CreateObject();
|
|
|
|
ASSERT(m_pSplitter);
|
|
|
|
#ifdef _WIN32
|
|
m_pSplitter->CreateEx(0, NULL, NULL,
|
|
WS_CHILD|WS_VISIBLE|WS_TABSTOP,
|
|
0, 0, 0, 0,
|
|
this->m_hWnd, (HMENU) IDC_ADDRESSLIST );
|
|
#else
|
|
CCreateContext Context;
|
|
Context.m_pCurrentFrame = NULL; // nothing to base on
|
|
Context.m_pCurrentDoc = NULL; // nothing to base on
|
|
Context.m_pNewViewClass = NULL; // nothing to base on
|
|
Context.m_pNewDocTemplate = NULL; // nothing to base on
|
|
m_pSplitter->Create( NULL, NULL,
|
|
WS_CHILD|WS_VISIBLE |WS_TABSTOP,
|
|
rect2, this, IDC_ADDRESSLIST, &Context );
|
|
#endif
|
|
|
|
// create the outliner control
|
|
m_pOutlinerParent = new CAddrDialogOutlinerParent;
|
|
#ifdef _WIN32
|
|
m_pOutlinerParent->CreateEx ( WS_EX_CLIENTEDGE, NULL, _T("NSOutlinerParent"),
|
|
WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN,
|
|
0, 0, 0, 0,
|
|
m_pSplitter->m_hWnd, (HMENU) 99);
|
|
#else
|
|
rect2.SetRectEmpty();
|
|
m_pOutlinerParent->Create( NULL, _T("NSOutlinerParent"),
|
|
WS_BORDER|WS_TABSTOP|WS_VISIBLE|WS_CHILD,
|
|
rect2, m_pSplitter, 99);
|
|
#endif
|
|
|
|
m_pOutlinerParent->CreateColumns ( );
|
|
m_pOutlinerParent->EnableFocusFrame(TRUE);
|
|
m_pOutliner = (CAddrDialogOutliner *) m_pOutlinerParent->m_pOutliner;
|
|
m_pOutliner->SetPane(m_addrBookPane);
|
|
m_pOutliner->SetContext( m_pCX->GetContext() );
|
|
|
|
// create the directory outliner control
|
|
m_pDirOutlinerParent = new CAddrDialogDirOutlinerParent;
|
|
|
|
#ifdef _WIN32
|
|
m_pDirOutlinerParent->CreateEx(WS_EX_CLIENTEDGE, NULL, _T("NSOutlinerParent"),
|
|
WS_TABSTOP|WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN,
|
|
0,0,0,0, m_pSplitter->m_hWnd, (HMENU) 100 );
|
|
#else
|
|
m_pDirOutlinerParent->Create( NULL, _T("NSOutlinerParent"),
|
|
WS_BORDER|WS_TABSTOP|WS_VISIBLE|WS_CHILD,
|
|
CRect(0,0,0,0), m_pSplitter, 100);
|
|
#endif
|
|
|
|
m_pDirOutliner = (CAddrDialogDirOutliner *) m_pDirOutlinerParent->m_pOutliner;
|
|
m_pDirOutlinerParent->CreateColumns ( );
|
|
m_pDirOutlinerParent->EnableFocusFrame(TRUE);
|
|
m_pDirOutliner->SetContext( m_pCX->GetContext() );
|
|
m_pDirOutliner->SetPane(m_addrBookPane);
|
|
m_pDirOutliner->SetDirectoryIndex(0);
|
|
|
|
// set the width of the panes in the slider
|
|
int32 prefInt = -1;
|
|
PREF_GetIntPref("mail.addr_picker.sliderwidth", &prefInt);
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
m_pSplitter->AddPanes(m_pDirOutlinerParent, m_pOutlinerParent, prefInt, TRUE);
|
|
m_pSplitter->SetWindowPos(GetDlgItem(ID_NAVIGATE_INTERRUPT), rect2.left, rect2.top, rect3.right, rect3.bottom, SWP_SHOWWINDOW);
|
|
|
|
m_pDirOutlinerParent->SetWindowPos(GetDlgItem(ID_NAVIGATE_INTERRUPT), 0, 0,
|
|
rect3.right, rect3.bottom, SWP_NOMOVE|SWP_NOSIZE);
|
|
m_pOutlinerParent->SetWindowPos(m_pDirOutlinerParent, 0, 0,
|
|
rect3.right, rect3.bottom, SWP_NOMOVE|SWP_NOSIZE);
|
|
// reset the tab order
|
|
widget = GetDlgItem (IDC_TO);
|
|
widget->SetWindowPos(m_pOutlinerParent, 0, 0,
|
|
rect3.right, rect3.bottom, SWP_NOMOVE|SWP_NOSIZE);
|
|
UpdateDirectories();
|
|
|
|
// create the status bar
|
|
widget = GetDlgItem(IDC_StatusRect);
|
|
widget->GetWindowRect(&rect2);
|
|
widget->GetClientRect(&rect3);
|
|
ScreenToClient(&rect2);
|
|
|
|
widget->DestroyWindow ();
|
|
|
|
m_barStatus.Create(this, TRUE, FALSE);
|
|
|
|
m_barStatus.MoveWindow(&rect2, TRUE);
|
|
|
|
m_barStatus.SetIndicators( aIDArray, sizeof(aIDArray) / sizeof(UINT) );
|
|
|
|
DoUpdateWidget(IDC_DIRSEARCH, AB_LDAPSearchCmd, TRUE);
|
|
DoUpdateWidget(IDC_TO, AB_NewMessageCmd, TRUE);
|
|
UpdateMsgButtons();
|
|
|
|
CGenericFrame *pCompose = (CGenericFrame *)GetParent();
|
|
|
|
ApiApiPtr(api);
|
|
LPUNKNOWN pUnk = api->CreateClassInstance(
|
|
APICLASS_ADDRESSCONTROL, NULL, (APISIGNATURE)pCompose);
|
|
if (pUnk)
|
|
{
|
|
LPADDRESSCONTROL pIAddressControl;
|
|
HRESULT hRes = pUnk->QueryInterface(IID_IAddressControl,(LPVOID*)&pIAddressControl);
|
|
ASSERT(hRes==NOERROR);
|
|
LPNSADDRESSLIST pList = NULL;
|
|
int count = pIAddressControl->GetAddressList(&pList);
|
|
pUnk->Release();
|
|
for (int index = 0; index < count; index++)
|
|
{
|
|
if (pList[index].szAddress)
|
|
{
|
|
if (strlen (pList[index].szAddress))
|
|
{
|
|
NSADDRESSLIST *pAddress = new NSADDRESSLIST;
|
|
char * formatted;
|
|
int nIndex = -1;
|
|
ASSERT(pAddress);
|
|
pAddress->ulHeaderType = pList[index].ulHeaderType;
|
|
pAddress->idBitmap = pList[index].idBitmap;
|
|
pAddress->idEntry = pList[index].idEntry;
|
|
pAddress->szAddress = strdup (pList[index].szAddress);
|
|
GetFormattedString(pList[index].szAddress, pList[index].ulHeaderType, &formatted);
|
|
if (formatted)
|
|
{
|
|
nIndex = pBucket->InsertString( index, formatted );
|
|
free (formatted);
|
|
}
|
|
free (pList[index].szAddress);
|
|
if ( nIndex < 0 )
|
|
return 0;
|
|
pBucket->SetItemDataPtr( nIndex, pAddress );
|
|
}
|
|
}
|
|
}
|
|
free(pList);
|
|
OnSelchange();
|
|
} else
|
|
{
|
|
return FALSE;
|
|
}
|
|
} else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
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_pFont = theApp.CreateAppFont( lf );
|
|
::ReleaseDC(m_hWnd,hDC);
|
|
|
|
::SendMessage(::GetDlgItem(m_hWnd, IDC_ADDRNAME), WM_SETFONT, (WPARAM)m_pFont, FALSE);
|
|
::SendMessage(::GetDlgItem(m_hWnd, IDC_ADDRESSBKT), WM_SETFONT, (WPARAM)m_pFont, FALSE);
|
|
|
|
if(!m_pDropTarget) {
|
|
m_pDropTarget = new CAddressPickerDropTarget(this);
|
|
m_pDropTarget->Register(this);
|
|
}
|
|
DragAcceptFiles();
|
|
|
|
CComboBox *directory = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
|
|
directory->SetCurSel (0);
|
|
m_pOutliner->SetDirectoryIndex( directory->GetCurSel());
|
|
m_pDirOutliner->SetFocusLine(0);
|
|
if (m_pOutliner->GetTotalLines())
|
|
m_pOutliner->SelectItem (0);
|
|
GetDlgItem(IDC_ADDRNAME)->SetFocus();
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
|
|
// rhp - for MAPI
|
|
if (m_isMAPI)
|
|
{
|
|
ProcessMAPIAddressPopulation();
|
|
|
|
if (m_mapiHeader)
|
|
{
|
|
SetWindowText(m_mapiHeader);
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void CAddrDialog::GetFormattedString(char* fullname, MSG_HEADER_SET header, char** formatted)
|
|
{
|
|
|
|
CString formattedString;
|
|
if (fullname) {
|
|
switch (header) {
|
|
case MSG_TO_HEADER_MASK:
|
|
formattedString.Format(XP_GetString (MK_ADDR_TONAME), fullname);
|
|
break;
|
|
case MSG_CC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString (MK_ADDR_CCNAME), fullname);
|
|
break;
|
|
case MSG_BCC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString (MK_ADDR_BCCNAME), fullname);
|
|
break;
|
|
default:
|
|
formattedString.Format(XP_GetString (MK_ADDR_TONAME), fullname);
|
|
}
|
|
}
|
|
(*formatted) = strdup (formattedString);
|
|
}
|
|
|
|
void CAddrDialog::Progress(const char *pMessage)
|
|
{
|
|
m_barStatus.SetWindowText( pMessage );
|
|
}
|
|
|
|
|
|
void CAddrDialog::SetProgressBarPercent(int32 lPercent)
|
|
{
|
|
m_barStatus.SetPercentDone (lPercent);
|
|
} // END OF FUNCTION CAddrDialog::DrawProgressBar()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialog message handlers
|
|
|
|
BEGIN_MESSAGE_MAP(CAddrDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CAddrDialog)
|
|
ON_WM_TIMER ()
|
|
ON_EN_SETFOCUS(IDC_ADDRNAME, OnSetFocusName)
|
|
ON_EN_CHANGE(IDC_ADDRNAME, OnChangeName)
|
|
ON_CBN_SELCHANGE(IDC_DIRECTORIES, OnChangeDirectory)
|
|
ON_BN_CLICKED(IDC_DIRSEARCH, OnDirectorySearch)
|
|
ON_BN_CLICKED(ID_NAVIGATE_INTERRUPT, OnStopSearch)
|
|
ON_BN_CLICKED( IDC_DONE_EDITING, OnDone)
|
|
ON_BN_CLICKED( IDCANCEL, OnCancel)
|
|
ON_WM_CREATE()
|
|
ON_WM_DESTROY()
|
|
ON_WM_KEYDOWN()
|
|
ON_COMMAND(IDC_TO, OnComposeMsg)
|
|
ON_COMMAND(IDC_CC, OnComposeCCMsg)
|
|
ON_COMMAND(IDC_BCC, OnComposeBCCMsg)
|
|
ON_COMMAND(ID_ITEM_PROPERTIES, OnGetProperties)
|
|
ON_LBN_SELCHANGE(IDC_ADDRESSBKT, OnSelchange)
|
|
ON_COMMAND(ID_HELP, OnHelp)
|
|
ON_LBN_SETFOCUS(IDC_ADDRESSBKT, OnSetFocusBucket)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CAddrDialog::PreTranslateMessage( MSG* pMsg )
|
|
{
|
|
if (pMsg->message == WM_KEYDOWN && pMsg->hwnd == m_pOutliner->GetSafeHwnd())
|
|
{
|
|
if (pMsg->wParam != VK_TAB && pMsg->wParam != VK_ESCAPE && pMsg->wParam != VK_RETURN) {
|
|
::SendMessage(pMsg->hwnd, WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if (pMsg->message == WM_KEYDOWN && pMsg->hwnd == GetBucket()->GetSafeHwnd())
|
|
{
|
|
if (pMsg->wParam == VK_DELETE || pMsg->wParam == VK_BACK) {
|
|
OnRemove();
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if (pMsg->message == WM_KEYDOWN && pMsg->hwnd == GetDlgItem(IDC_ADDRNAME)->GetSafeHwnd())
|
|
{
|
|
if (pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN) {
|
|
::SendMessage(m_pOutliner->GetSafeHwnd(), WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
|
|
CWnd* widget = NULL;
|
|
widget = GetDlgItem (GetDefaultButtonID());
|
|
if (widget) {
|
|
SendMessage(DM_SETDEFID, GetDefaultButtonID(), TRUE);
|
|
widget->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
widget = GetDlgItem (IDC_DONE_EDITING);
|
|
widget->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if (pMsg->message == WM_KEYDOWN) {
|
|
if (pMsg->wParam == VK_TAB) {
|
|
HWND hwndNext = NULL;
|
|
HWND hwndFocus = ::GetFocus();
|
|
|
|
HWND hwndPossibleNext = ::GetNextDlgTabItem( m_hWnd, pMsg->hwnd, FALSE );
|
|
|
|
HWND hwndPossiblePrev = ::GetNextDlgTabItem( m_hWnd, pMsg->hwnd, TRUE );
|
|
|
|
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
|
|
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
|
|
HWND hwndSlider = m_pSplitter ? m_pSplitter->m_hWnd : NULL;
|
|
HWND hwndDefSendButton = GetDlgItem(m_idefButtonID) ? GetDlgItem(m_idefButtonID)->m_hWnd : NULL;
|
|
HWND hwndPropButton = GetDlgItem(ID_ITEM_PROPERTIES) ? GetDlgItem(ID_ITEM_PROPERTIES)->m_hWnd : NULL;
|
|
|
|
|
|
if ( GetKeyState(VK_SHIFT) & 0x8000 ) {
|
|
|
|
// Tab backward
|
|
if ( hwndFocus == hwndPropButton ) {
|
|
// Handle tabbing back to the to/cc/bcc buttons
|
|
if (::IsWindowEnabled (hwndDefSendButton)) {
|
|
hwndNext = hwndDefSendButton;
|
|
DWORD defID = SendMessage(DM_GETDEFID, 0, 0);
|
|
int defaultID = LOWORD (defID);
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
if (defaultID != m_idefButtonID)
|
|
GetDlgItem(defaultID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
} else if (hwndFocus == hwndOutliner) {
|
|
// Handle tabbing out of outliner into the directory list
|
|
if (m_pSplitter->IsOnePaneClosed())
|
|
hwndNext = hwndPossiblePrev;
|
|
else
|
|
hwndNext = hwndDirOutliner;
|
|
} else if ( hwndFocus == hwndDirOutliner ) {
|
|
// Handle tabbing out of the slider
|
|
hwndNext = hwndPossiblePrev;
|
|
} else if ( hwndPossiblePrev == hwndSlider ) {
|
|
// Handle tabbing back to the outliner from the
|
|
// to/cc/bcc buttons the bucket
|
|
hwndNext = hwndOutliner;
|
|
}
|
|
|
|
} else {
|
|
|
|
// Tab forward
|
|
if (hwndFocus == hwndOutliner) {
|
|
// Handle tabbing out of outliner
|
|
if (::IsWindowEnabled (hwndDefSendButton)) {
|
|
hwndNext = hwndDefSendButton;
|
|
DWORD defID = SendMessage(DM_GETDEFID, 0, 0);
|
|
int defaultID = LOWORD (defID);
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
if (defaultID != m_idefButtonID)
|
|
GetDlgItem(defaultID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
} else if ( hwndPossibleNext == hwndSlider ) {
|
|
// handle tabbing into the directory list
|
|
if (m_pSplitter->IsOnePaneClosed())
|
|
hwndNext = hwndOutliner;
|
|
else
|
|
hwndNext = hwndDirOutliner;
|
|
} else if (hwndFocus == hwndDirOutliner) {
|
|
// Handle tabbing out of the directory list
|
|
// and into the results list
|
|
hwndNext = hwndOutliner;
|
|
}
|
|
|
|
}
|
|
if ( hwndNext ) {
|
|
::SetFocus( hwndNext );
|
|
return TRUE;
|
|
}
|
|
}
|
|
} // if tab && keydown
|
|
|
|
return CDialog::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CAddrDialog::UpdateDirectories()
|
|
{
|
|
DIR_Server* dir;
|
|
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
|
|
|
|
widget->ResetContent();
|
|
|
|
XP_List *pTraverse = theApp.m_directories;
|
|
while(dir = (DIR_Server *)XP_ListNextObject(pTraverse)) {
|
|
if (dir->dirType == PABDirectory || dir->dirType == LDAPDirectory)
|
|
widget->AddString(dir->description);
|
|
}
|
|
if (m_directory == -1)
|
|
widget->SetCurSel(0);
|
|
else
|
|
widget->SetCurSel(m_directory);
|
|
|
|
m_pDirOutliner->UpdateCount();
|
|
}
|
|
|
|
|
|
DIR_Server * CAddrDialog::GetCurrentDirectoryServer()
|
|
{
|
|
return (DIR_Server*) XP_ListGetObjectNum (theApp.m_directories, m_pOutliner->GetDirectoryIndex() + 1);
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnTimer(UINT nID)
|
|
{
|
|
CWnd::OnTimer(nID);
|
|
if (nID == ADDRESS_DIALOG_TIMER) {
|
|
KillTimer(m_uTypedownClock);
|
|
if (!m_name.IsEmpty()) {
|
|
DIR_Server* dir;
|
|
dir = GetCurrentDirectoryServer();
|
|
if (dir->dirType == LDAPDirectory)
|
|
PerformListDirectory (m_name.GetBuffer(0));
|
|
else
|
|
PerformTypedown(m_name.GetBuffer(0));
|
|
m_name.ReleaseBuffer();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAddrDialog)
|
|
DDX_Text(pDX, IDC_ADDRNAME, m_name);
|
|
DDX_CBIndex(pDX, IDC_DIRECTORIES, m_directory);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnChangeName()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
// TODO: Add your control notification handler code here
|
|
if (IsSearching()) {
|
|
CString checkName (szLoadString(IDS_SEARCHRESULTS));
|
|
if (stricmp (checkName, m_name) != 0) {
|
|
OnDirectorySearch();
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
else
|
|
return;
|
|
}
|
|
|
|
if (m_name != m_save) {
|
|
m_save = m_name;
|
|
KillTimer(m_uTypedownClock);
|
|
if (m_name.GetLength())
|
|
{
|
|
DIR_Server* dir = NULL;
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
dir = GetCurrentDirectoryServer();
|
|
if (dir->dirType == PABDirectory)
|
|
m_uTypedownClock = SetTimer(ADDRESS_DIALOG_TIMER, TYPEDOWN_SPEED, NULL);
|
|
else {
|
|
int32 prefInt = LDAP_SEARCH_SPEED;
|
|
PREF_GetIntPref("ldap_1.autoComplete.interval", &prefInt);
|
|
m_uTypedownClock = SetTimer(ADDRESS_DIALOG_TIMER, prefInt, NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnSetFocusName()
|
|
{
|
|
CEdit *widget = (CEdit*) GetDlgItem(IDC_ADDRNAME);
|
|
if (widget)
|
|
widget->SetSel(0, -1, TRUE);
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
|
|
void CAddrDialog::OnSetFocusBucket()
|
|
{
|
|
CListBox *pBucket = (CListBox*)GetDlgItem(IDC_ADDRESSBKT);
|
|
|
|
if (pBucket->GetCount()) {
|
|
SendMessage(DM_SETDEFID, IDC_DONE_EDITING, TRUE);
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
}
|
|
|
|
void CAddrDialog::OnChangeDirectory()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
if (IsSearching())
|
|
return;
|
|
|
|
UpdateData(TRUE);
|
|
|
|
if (m_directory != m_savedir) {
|
|
m_savedir = m_directory;
|
|
if (m_directory != -1) {
|
|
if (m_pDirOutliner)
|
|
m_pDirOutliner->SetDirectoryIndex(m_directory);
|
|
PerformChangeDirectory(m_directory);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAddrDialog::OnSelchange()
|
|
{
|
|
CListBox *pBucket = (CListBox*)GetDlgItem(IDC_ADDRESSBKT);
|
|
|
|
BOOL bEnabled = (pBucket->GetCount() > 0)? TRUE : FALSE;
|
|
pBucket->EnableWindow (bEnabled);
|
|
GetDlgItem(IDC_DONE_EDITING)->EnableWindow(bEnabled);
|
|
if (bEnabled) {
|
|
SendMessage(DM_SETDEFID, IDC_DONE_EDITING, TRUE);
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
else {
|
|
GetDlgItem(IDC_ADDRNAME)->SetFocus();
|
|
SendMessage(DM_SETDEFID, m_idefButtonID, TRUE);
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
|
|
|
|
// TODO: Add your control notification handler code here
|
|
}
|
|
|
|
void CAddrDialog::DoUpdateWidget( int command, AB_CommandType cmd, BOOL bUseCheck )
|
|
{
|
|
|
|
CWnd* widget;
|
|
|
|
XP_Bool bSelectable = FALSE, bPlural = FALSE;
|
|
MSG_COMMAND_CHECK_STATE sState;
|
|
|
|
if (m_addrBookPane) {
|
|
if (m_pOutliner) {
|
|
MSG_ViewIndex *indices = NULL;
|
|
int count = 0;
|
|
m_pOutliner->GetSelection(indices, count);
|
|
AB_CommandStatus(m_addrBookPane,
|
|
cmd,
|
|
indices, count,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
} else {
|
|
AB_CommandStatus(m_addrBookPane,
|
|
cmd,
|
|
NULL, 0,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
}
|
|
}
|
|
|
|
widget = GetDlgItem ( command );
|
|
widget->EnableWindow(bSelectable);
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnDirectorySearch()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
if (m_directory != -1)
|
|
PerformDirectorySearch();
|
|
}
|
|
|
|
int CAddrDialog::DoModal ()
|
|
{
|
|
if (!m_MailNewsResourceSwitcher.Initialize())
|
|
return -1;
|
|
return CDialog::DoModal();
|
|
}
|
|
|
|
|
|
int CAddrDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
m_MailNewsResourceSwitcher.Reset();
|
|
int res = CDialog::OnCreate(lpCreateStruct);
|
|
|
|
MSG_SetFEData( (MSG_Pane*) m_addrBookPane, (void *) m_pIAddrList );
|
|
return res;
|
|
}
|
|
|
|
// rhp - This is for MAPI processing...
|
|
void
|
|
CAddrDialog::ProcessMAPIOnDone(void)
|
|
{
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
int count = pBucket->GetCount();
|
|
if (count != LB_ERR && count > 0)
|
|
{
|
|
for (int index = 0; index < count; index++)
|
|
{
|
|
NSADDRESSLIST * pAddress = (NSADDRESSLIST *)(pBucket->GetItemDataPtr(index));
|
|
ASSERT(pAddress);
|
|
if (m_mapiCBProc)
|
|
{
|
|
m_mapiCBProc(count, index, pAddress->ulHeaderType,
|
|
pAddress->szAddress); // rhp - for MAPI
|
|
}
|
|
delete (pAddress);
|
|
}
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
void CAddrDialog::OnDone()
|
|
{
|
|
NSADDRESSLIST* pAddressList;
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
// rhp - for MAPI...
|
|
if (m_isMAPI)
|
|
{
|
|
ProcessMAPIOnDone();
|
|
return;
|
|
}
|
|
|
|
int count = pBucket->GetCount();
|
|
if (count != LB_ERR && count > 0)
|
|
{
|
|
pAddressList = (NSADDRESSLIST *)calloc(count, sizeof(NSADDRESSLIST));
|
|
if (pAddressList)
|
|
{
|
|
for (int index = 0; index < count; index++)
|
|
{
|
|
NSADDRESSLIST * pAddress = (NSADDRESSLIST *)(pBucket->GetItemDataPtr(index));
|
|
ASSERT(pAddress);
|
|
pAddressList[index].ulHeaderType = pAddress->ulHeaderType;
|
|
pAddressList[index].idBitmap = pAddress->idBitmap;
|
|
pAddressList[index].idEntry = pAddress->idEntry;
|
|
pAddressList[index].szAddress = pAddress->szAddress;
|
|
delete (pAddress);
|
|
}
|
|
}
|
|
|
|
CGenericFrame *pCompose = (CGenericFrame *)GetParent();
|
|
|
|
ApiApiPtr(api);
|
|
LPUNKNOWN pUnk = api->CreateClassInstance(
|
|
APICLASS_ADDRESSCONTROL, NULL, (APISIGNATURE)pCompose);
|
|
if (pUnk)
|
|
{
|
|
LPADDRESSCONTROL pIAddressControl;
|
|
HRESULT hRes = pUnk->QueryInterface(IID_IAddressControl,(LPVOID*)&pIAddressControl);
|
|
ASSERT(hRes==NOERROR);
|
|
int ct = pIAddressControl->SetAddressList(pAddressList, count);
|
|
pUnk->Release();
|
|
}
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnCancel()
|
|
{
|
|
CDialog::OnCancel();
|
|
CleanupOnClose();
|
|
}
|
|
|
|
void CAddrDialog::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 CAddrDialog::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 );
|
|
UpdateMsgButtons();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::SetStatusText(const char* pMessage)
|
|
{
|
|
m_barStatus.SetWindowText( pMessage );
|
|
}
|
|
|
|
|
|
void CAddrDialog::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 CAddrDialog::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) CAddrDialog::AddRef(void)
|
|
{
|
|
return 0; // Not a real component
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CAddrDialog::Release(void)
|
|
{
|
|
return 0; // Not a real component
|
|
}
|
|
|
|
// IMailFrame interface
|
|
CMailNewsFrame *CAddrDialog::GetMailNewsFrame()
|
|
{
|
|
return (CMailNewsFrame *) NULL;
|
|
}
|
|
|
|
MSG_Pane *CAddrDialog::GetPane()
|
|
{
|
|
return (MSG_Pane*) m_addrBookPane;
|
|
}
|
|
|
|
void CAddrDialog::PaneChanged(MSG_Pane *pane, XP_Bool asynchronous,
|
|
MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
|
|
{
|
|
if (notify == MSG_PaneDirectoriesChanged) {
|
|
if (IsSearching())
|
|
OnStopSearch ();
|
|
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
|
|
m_savedir = -1;
|
|
widget->SetCurSel (0);
|
|
OnChangeDirectory();
|
|
UpdateDirectories();
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::AllConnectionsComplete( MWContext *pContext )
|
|
{
|
|
OnStopSearch();
|
|
|
|
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 CAddrDialog::PerformTypedown (char* name)
|
|
{
|
|
if (!m_bSearching)
|
|
m_pOutliner->OnTypedown (name);
|
|
}
|
|
|
|
void CAddrDialog::PerformListDirectory (char* name)
|
|
{
|
|
// Build Search
|
|
m_barStatus.SetWindowText( szLoadString( IDS_SEARCHING ) );
|
|
m_bSearching = TRUE;
|
|
GetDlgItem(IDC_DIRECTORIES)->EnableWindow(FALSE);
|
|
GetDlgItem( IDC_DIRSEARCH)->EnableWindow(FALSE);
|
|
GetDlgItem( ID_NAVIGATE_INTERRUPT)->EnableWindow(TRUE);
|
|
m_pOutliner->UpdateCount();
|
|
m_barStatus.StartAnimation();
|
|
|
|
HandleErrorReturn(AB_SearchDirectory(m_addrBookPane, name));
|
|
}
|
|
|
|
|
|
void CAddrDialog::MoveSelections(MSG_HEADER_SET header)
|
|
{
|
|
CString csAddress;
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
CGenericFrame * pCompose = (CGenericFrame *)GetParent();
|
|
CListBox *pBucket = GetBucket();
|
|
pBucket->EnableWindow (TRUE);
|
|
|
|
m_pOutliner->GetSelection(indices, count);
|
|
|
|
// delete the entries
|
|
for (int32 i = 0; i < count; i++) {
|
|
// should we stop on error?
|
|
char* fullname = NULL;
|
|
CString formattedString;
|
|
ABID entryID = AB_GetEntryIDAt((AddressPane*) m_addrBookPane, indices[i]);
|
|
AB_GetExpandedName(GetCurrentDirectoryServer(),
|
|
theApp.m_pABook, entryID, &fullname);
|
|
|
|
if (fullname){
|
|
ABID type;
|
|
|
|
// need to change the bitmap based on the type
|
|
AB_GetType (GetCurrentDirectoryServer(),
|
|
theApp.m_pABook, entryID, &type);
|
|
AddStringToBucket(pBucket, header, fullname, type, entryID);
|
|
}
|
|
}
|
|
CEdit *widget = (CEdit*) GetDlgItem(IDC_ADDRNAME);
|
|
if (widget)
|
|
widget->SetSel(0, -1, TRUE);
|
|
pBucket->EnableWindow (TRUE);
|
|
SendMessage(DM_SETDEFID, IDC_DONE_EDITING, TRUE);
|
|
GetDlgItem(IDC_DONE_EDITING)->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
GetDlgItem(m_idefButtonID)->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
|
|
void CAddrDialog::AddStringToBucket
|
|
(CListBox *pBucket, MSG_HEADER_SET header, char* fullname, ABID type, ABID entryID)
|
|
{
|
|
CString formattedString;
|
|
switch (header) {
|
|
case MSG_TO_HEADER_MASK:
|
|
formattedString.Format(XP_GetString(MK_ADDR_TONAME), fullname);
|
|
break;
|
|
case MSG_CC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString(MK_ADDR_CCNAME), fullname);
|
|
break;
|
|
case MSG_BCC_HEADER_MASK:
|
|
formattedString.Format(XP_GetString(MK_ADDR_BCCNAME), fullname);
|
|
break;
|
|
default:
|
|
formattedString.Format(XP_GetString(MK_ADDR_TONAME), fullname);
|
|
}
|
|
|
|
if (pBucket->FindStringExact(0, (LPCTSTR) formattedString ) == LB_ERR) {
|
|
int idx = pBucket->AddString(formattedString);
|
|
if ((idx != LB_ERR) || (idx != LB_ERRSPACE))
|
|
{
|
|
NSADDRESSLIST *pAddress = new NSADDRESSLIST;
|
|
ASSERT(pAddress);
|
|
pAddress->ulHeaderType = header;
|
|
|
|
if (type == ABTypeList)
|
|
pAddress->idBitmap = IDB_MAILINGLIST;
|
|
else
|
|
pAddress->idBitmap = IDB_PERSON;
|
|
|
|
pAddress->idEntry = entryID;
|
|
pAddress->szAddress = fullname;
|
|
pBucket->SetItemDataPtr( idx, pAddress );
|
|
}
|
|
}
|
|
int total = pBucket->GetCount();
|
|
if (total)
|
|
{
|
|
GetDlgItem(IDC_DONE_EDITING)->EnableWindow(TRUE);
|
|
pBucket->SetCurSel(total - 1);
|
|
}
|
|
else
|
|
GetDlgItem(IDC_DONE_EDITING)->EnableWindow(FALSE);
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnRemove()
|
|
{
|
|
CListBox *pBucket = GetBucket();
|
|
int prevSel = pBucket->GetCurSel();
|
|
if (prevSel != -1)
|
|
{
|
|
NSADDRESSLIST * pAddress = (NSADDRESSLIST *)(pBucket->GetItemDataPtr(prevSel));
|
|
if (pAddress->szAddress)
|
|
free (pAddress->szAddress);
|
|
delete pAddress;
|
|
|
|
int count = pBucket->DeleteString (prevSel);
|
|
if (count) {
|
|
if (prevSel)
|
|
pBucket->SetCurSel (prevSel - 1);
|
|
else
|
|
pBucket->SetCurSel (prevSel);
|
|
}
|
|
OnSelchange();
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnComposeMsg()
|
|
{
|
|
MoveSelections(MSG_TO_HEADER_MASK);
|
|
m_idefButtonID = IDC_TO;
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnComposeCCMsg()
|
|
{
|
|
MoveSelections(MSG_CC_HEADER_MASK);
|
|
m_idefButtonID = IDC_CC;
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnComposeBCCMsg()
|
|
{
|
|
MoveSelections(MSG_BCC_HEADER_MASK);
|
|
m_idefButtonID = IDC_BCC;
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnGetProperties()
|
|
{
|
|
MSG_ViewIndex *indices = NULL;
|
|
int count;
|
|
CAddrDialogOutliner *pOutliner = (CAddrDialogOutliner *) m_pOutliner;
|
|
|
|
if (pOutliner)
|
|
{
|
|
pOutliner->GetSelection(indices, count);
|
|
// AB_Command(pOutliner->GetPane(), AB_ImportLdapEntriesCmd, indices, count);
|
|
}
|
|
}
|
|
|
|
void CAddrDialog::HandleErrorReturn(int errorid)
|
|
{
|
|
if (errorid) {
|
|
CString s;
|
|
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
|
|
::MessageBox(NULL, XP_GetString(errorid), s, MB_OK);
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialog::PerformChangeDirectory (int dirIndex)
|
|
{
|
|
m_pOutliner->SetDirectoryIndex(dirIndex);
|
|
DIR_Server* dir = GetCurrentDirectoryServer();
|
|
HandleErrorReturn(AB_ChangeDirectory(m_addrBookPane, dir));
|
|
DoUpdateWidget(IDC_DIRSEARCH, AB_LDAPSearchCmd, TRUE);
|
|
DoUpdateWidget(IDC_TO, AB_NewMessageCmd, TRUE);
|
|
m_pOutliner->UpdateCount( );
|
|
|
|
int idx = m_barStatus.CommandToIndex(IDS_SECURITY_STATUS);
|
|
if (idx > -1) {
|
|
UINT nID = IDS_SECURITY_STATUS;
|
|
UINT nStyle;
|
|
int nWidth;
|
|
m_barStatus.GetPaneInfo( idx, nID, nStyle, nWidth );
|
|
if (dir->isSecure)
|
|
m_barStatus.SetPaneInfo(idx, IDS_SECURITY_STATUS, SBPS_NORMAL, nWidth);
|
|
else
|
|
m_barStatus.SetPaneInfo(idx, IDS_SECURITY_STATUS, SBPS_DISABLED, nWidth);
|
|
}
|
|
UpdateMsgButtons();
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnUpdateDirectorySelection (int dirIndex)
|
|
{
|
|
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
|
|
widget->SetCurSel(dirIndex);
|
|
PerformChangeDirectory(dirIndex);
|
|
}
|
|
|
|
|
|
void CAddrDialog::OnStopSearch ()
|
|
{
|
|
if ( m_bSearching) {
|
|
// We've ended the search
|
|
XP_InterruptContext( m_pCX->GetContext() );
|
|
HandleErrorReturn(AB_FinishSearch(m_addrBookPane, m_pCX->GetContext()));
|
|
m_bSearching = FALSE;
|
|
GetDlgItem(IDC_DIRECTORIES)->EnableWindow(TRUE);
|
|
GetDlgItem( IDC_DIRSEARCH)->EnableWindow(TRUE);
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow (FALSE);
|
|
m_pDirOutliner->EnableWindow(TRUE);
|
|
m_barStatus.StopAnimation();
|
|
if (m_pOutliner->GetTotalLines())
|
|
m_pOutliner->SelectItem (0);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void CAddrDialog::PerformDirectorySearch ()
|
|
{
|
|
if ( m_bSearching) {
|
|
OnStopSearch ();
|
|
return;
|
|
}
|
|
|
|
|
|
CSearchDialog searchDlg ((UINT) IDS_ADRSEARCH,
|
|
(MSG_Pane*) m_addrBookPane,
|
|
GetCurrentDirectoryServer(),
|
|
this);
|
|
int result = searchDlg.DoModal();
|
|
|
|
// Build Search
|
|
if (result == IDOK)
|
|
{
|
|
GetDlgItem(IDC_DIRSEARCH)->EnableWindow (FALSE);
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow (TRUE);
|
|
GetDlgItem(IDC_DIRECTORIES)->EnableWindow(FALSE);
|
|
GetDlgItem(IDC_ADDRNAME)->SetWindowText("");
|
|
|
|
// Build Search
|
|
m_barStatus.SetWindowText( szLoadString( IDS_SEARCHING ) );
|
|
m_bSearching = TRUE;
|
|
GetDlgItem(IDC_ADDRNAME)->SetWindowText(CString (szLoadString(IDS_SEARCHRESULTS)));
|
|
m_pOutliner->UpdateCount();
|
|
m_pOutliner->SetFocus();
|
|
m_pDirOutliner->EnableWindow(FALSE);
|
|
|
|
HandleErrorReturn(AB_SearchDirectory(m_addrBookPane, NULL));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialogOutliner
|
|
BEGIN_MESSAGE_MAP(CAddrDialogOutliner, CMSelectOutliner)
|
|
//{{AFX_MSG_MAP(CAddrDialogOutliner)
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_TIMER()
|
|
ON_WM_KILLFOCUS()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogOutliner::CAddrDialogOutliner ( )
|
|
{
|
|
m_attribSortBy = ID_COLADDR_NAME;
|
|
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_bSortAscending = TRUE;
|
|
m_iMysticPlane = 0;
|
|
m_dirIndex = 0;
|
|
m_hFont = NULL;
|
|
m_uTypedownClock = 0;
|
|
}
|
|
|
|
CAddrDialogOutliner::~CAddrDialogOutliner ( )
|
|
{
|
|
if (m_pUnkUserImage) {
|
|
if (m_pIUserImage)
|
|
m_pUnkUserImage->Release();
|
|
}
|
|
|
|
if (m_hFont) {
|
|
theApp.ReleaseAppFont(m_hFont);
|
|
}
|
|
}
|
|
|
|
DIR_Server* CAddrDialogOutliner::GetCurrentDirectoryServer ()
|
|
{
|
|
return (DIR_Server*)XP_ListGetObjectNum(theApp.m_directories, m_dirIndex + 1);
|
|
}
|
|
|
|
void CAddrDialogOutliner::SetDirectoryIndex(int dirIndex )
|
|
{
|
|
m_dirIndex = dirIndex;
|
|
DIR_Server* pServer = GetCurrentDirectoryServer ();
|
|
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();
|
|
ClearSelection();
|
|
if (m_iTotalLines)
|
|
SelectItem (0);
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::OnTimer(UINT nID)
|
|
{
|
|
CMSelectOutliner::OnTimer(nID);
|
|
if (nID == ADDRDLG_OUTLINER_TYPEDOWN_TIMER) {
|
|
KillTimer(m_uTypedownClock);
|
|
m_psTypedown = "";
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::OnKeyDown ( UINT nChar, UINT nRepCnt, UINT nFlags )
|
|
{
|
|
CMSelectOutliner::OnKeyDown ( nChar, nRepCnt, nFlags );
|
|
KillTimer(m_uTypedownClock);
|
|
if (nChar > VK_HELP) {
|
|
KillTimer(m_uTypedownClock);
|
|
m_psTypedown += nChar;
|
|
OnTypedown (m_psTypedown.GetBuffer (0));
|
|
m_psTypedown.ReleaseBuffer(-1);
|
|
int32 prefInt = OUTLINER_TYPEDOWN_SPEED;
|
|
PREF_GetIntPref("ldap_1.autoComplete.interval", &prefInt);
|
|
m_uTypedownClock = SetTimer(ADDRDLG_OUTLINER_TYPEDOWN_TIMER, prefInt, NULL);
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::OnKillFocus( CWnd* pNewWnd )
|
|
{
|
|
CMSelectOutliner::OnKillFocus (pNewWnd );
|
|
m_psTypedown = "";
|
|
KillTimer(m_uTypedownClock);
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::OnTypedown (char* name)
|
|
{
|
|
MSG_ViewIndex index;
|
|
uint startIndex;
|
|
|
|
if (GetFocusLine() != -1)
|
|
startIndex = GetFocusLine();
|
|
else
|
|
startIndex = 0;
|
|
|
|
AB_GetIndexMatchingTypedown(m_pane, &index,
|
|
(LPCTSTR) name, startIndex);
|
|
ScrollIntoView(CASTINT(index));
|
|
SelectItem (CASTINT(index));
|
|
}
|
|
|
|
void CAddrDialogOutliner::UpdateCount( )
|
|
{
|
|
uint32 count;
|
|
|
|
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
|
|
SetTotalLines(CASTINT(count));
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::SetPane(ABPane *pane)
|
|
{
|
|
m_pane = pane;
|
|
uint32 count;
|
|
|
|
if (m_pane) {
|
|
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
|
|
SetTotalLines(CASTINT(count));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::MysticStuffStarting( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
++m_iMysticPlane;
|
|
}
|
|
|
|
void CAddrDialogOutliner::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
|
|
&& ((CAddrDialog*)pParent)->IsSearching() && num > 0)
|
|
{
|
|
((CAddrDialog*)pParent)->SetSearchResults(where, num);
|
|
HandleInsert(where, num);
|
|
}
|
|
else
|
|
{
|
|
if (num > 0)
|
|
HandleInsert(where, num);
|
|
else
|
|
HandleDelete(where, -num);
|
|
}
|
|
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;
|
|
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
|
|
SetTotalLines(CASTINT(count));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::SetTotalLines( int count)
|
|
{
|
|
CMSelectOutliner::SetTotalLines(count);
|
|
if (count = 0)
|
|
ClearSelection();
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CAddrDialogOutliner::RenderData ( UINT iColumn, CRect &rect, CDC &dc, const char * text )
|
|
{
|
|
if ( iColumn != ID_COLADDR_TYPE )
|
|
return CMSelectOutliner::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 CAddrDialogOutliner::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 CAddrDialogOutliner::TranslateIconFolder (void * pData)
|
|
{
|
|
// We're a flat list, so we're never a folder
|
|
return ( OUTLINER_ITEM );
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogOutliner::ColumnCommand ( int iColumn, int iLine )
|
|
{
|
|
// We have no column commands
|
|
return FALSE;
|
|
}
|
|
|
|
HFONT CAddrDialogOutliner::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 * CAddrDialogOutliner::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 CAddrDialogOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
|
|
{
|
|
if ( pFlags ) *pFlags = 0; // Flags?
|
|
if ( pDepth ) *pDepth = 0; // We're flat, remember?
|
|
}
|
|
|
|
|
|
void CAddrDialogOutliner::ReleaseLineData ( void * )
|
|
{
|
|
}
|
|
|
|
|
|
LPCTSTR CAddrDialogOutliner::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 CAddrDialogOutliner::OnSelChanged()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
((CAddrDialog*) pParent)->DoUpdateWidget(IDC_TO, AB_NewMessageCmd, TRUE);
|
|
((CAddrDialog*) pParent)->UpdateMsgButtons();
|
|
CWnd* widget = NULL;
|
|
widget = ((CAddrDialog*) pParent)->GetDlgItem (((CAddrDialog*) pParent)->GetDefaultButtonID());
|
|
if (widget) {
|
|
SendMessage(DM_SETDEFID, ((CAddrDialog*) pParent)->GetDefaultButtonID(), TRUE);
|
|
widget->SendMessage(BM_SETSTYLE, BS_DEFPUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
widget = ((CAddrDialog*) pParent)->GetDlgItem (IDC_DONE_EDITING);
|
|
widget->SendMessage(BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0));
|
|
}
|
|
}
|
|
|
|
void CAddrDialogOutliner::OnSelDblClk()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
|
|
((CAddrDialog*) pParent)->SetDefaultButtonID (IDC_TO);
|
|
((CAddrDialog*) pParent)->MoveSelections (MSG_TO_HEADER_MASK);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrOutlinerParent
|
|
|
|
BEGIN_MESSAGE_MAP(CAddrDialogOutlinerParent, COutlinerParent)
|
|
//{{AFX_MSG_MAP(CAddrDialogOutlinerParent)
|
|
ON_WM_LBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogOutlinerParent::CAddrDialogOutlinerParent()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
CAddrDialogOutlinerParent::~CAddrDialogOutlinerParent()
|
|
{
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, const char * text )
|
|
{
|
|
int cx = 3, cy = 0;
|
|
CAddrDialogOutliner *pOutliner = (CAddrDialogOutliner *) 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) );
|
|
|
|
// 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 * CAddrDialogOutlinerParent::GetOutliner ( void )
|
|
{
|
|
return new CAddrDialogOutliner;
|
|
}
|
|
|
|
|
|
void CAddrDialogOutlinerParent::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 CAddrDialogOutlinerParent::ColumnCommand ( int idColumn )
|
|
{
|
|
ABID lastSelection;
|
|
|
|
CAddrDialogOutliner *pOutliner = (CAddrDialogOutliner *) m_pOutliner;
|
|
|
|
if (pOutliner->GetFocusLine() != -1)
|
|
lastSelection = AB_GetEntryIDAt((AddressPane*) pOutliner->GetPane(), pOutliner->GetFocusLine());
|
|
|
|
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
|
|
|
|
if (idColumn == pOutliner->m_attribSortBy) {
|
|
pOutliner->m_bSortAscending = !pOutliner->m_bSortAscending;
|
|
}
|
|
else
|
|
pOutliner->m_bSortAscending = TRUE;
|
|
|
|
pOutliner->m_attribSortBy = idColumn;
|
|
|
|
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 CAddrDialogOutlinerParent::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.abook_columns_win");
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CAddrDialogDirOutliner
|
|
BEGIN_MESSAGE_MAP(CAddrDialogDirOutliner, CMSelectOutliner)
|
|
//{{AFX_MSG_MAP(CAddrDialogDirOutliner)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogDirOutliner::CAddrDialogDirOutliner ( )
|
|
{
|
|
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_DIRLIST,16,16);
|
|
}
|
|
m_iMysticPlane = 0;
|
|
m_dirIndex = 0;
|
|
m_hFont = NULL;
|
|
}
|
|
|
|
CAddrDialogDirOutliner::~CAddrDialogDirOutliner ( )
|
|
{
|
|
if (m_pUnkUserImage) {
|
|
if (m_pIUserImage)
|
|
m_pUnkUserImage->Release();
|
|
}
|
|
|
|
if (m_hFont) {
|
|
theApp.ReleaseAppFont(m_hFont);
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::SetDirectoryIndex(int dirIndex )
|
|
{
|
|
m_dirIndex = dirIndex;
|
|
SelectItem (CASTINT(m_dirIndex));
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::UpdateCount( )
|
|
{
|
|
m_iTotalLines = XP_ListCount (theApp.m_directories);
|
|
if (!m_iTotalLines)
|
|
ClearSelection();
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::SetPane(ABPane *pane)
|
|
{
|
|
m_pane = pane;
|
|
|
|
if (m_pane) {
|
|
SetTotalLines(XP_ListCount (theApp.m_directories));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::MysticStuffStarting( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
++m_iMysticPlane;
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::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 (num > 0)
|
|
HandleInsert(where, num);
|
|
else
|
|
HandleDelete(where, -num);
|
|
|
|
break;
|
|
|
|
case MSG_NotifyChanged:
|
|
InvalidateLines( (int) where, (int) num );
|
|
break;
|
|
|
|
case MSG_NotifyAll:
|
|
case MSG_NotifyScramble:
|
|
Invalidate();
|
|
break;
|
|
}
|
|
|
|
if (( !--m_iMysticPlane && m_pane)) {
|
|
SetTotalLines(XP_ListCount (theApp.m_directories));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::SetTotalLines( int count)
|
|
{
|
|
CMSelectOutliner::SetTotalLines(count);
|
|
if (count = 0)
|
|
ClearSelection();
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CAddrDialogDirOutliner::RenderData ( UINT iColumn, CRect &rect, CDC &dc, const char * text )
|
|
{
|
|
if ( iColumn != ID_COLDIR_TYPE )
|
|
return CMSelectOutliner::RenderData ( iColumn, rect, dc, text );
|
|
int idxImage;
|
|
|
|
if (m_pDirLine->dirType == LDAPDirectory)
|
|
idxImage = IDX_DIRLDAPAB;
|
|
else
|
|
idxImage = IDX_DIRPERSONALAB;
|
|
|
|
m_pIUserImage->DrawImage ( idxImage,
|
|
rect.left + ( ( rect.Width ( ) - 16 ) / 2 ), rect.top, &dc, FALSE );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
int CAddrDialogDirOutliner::TranslateIcon ( void * pLineData )
|
|
{
|
|
DIR_Server* line = (DIR_Server*) pLineData;
|
|
int idxImage = 0;
|
|
|
|
if (m_pDirLine->dirType == ABTypeList)
|
|
idxImage = IDX_DIRLDAPAB;
|
|
else
|
|
idxImage = IDX_DIRPERSONALAB;
|
|
return idxImage;
|
|
}
|
|
|
|
int CAddrDialogDirOutliner::TranslateIconFolder (void * pData)
|
|
{
|
|
// We're a flat list, so we're never a folder
|
|
return ( OUTLINER_ITEM );
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogDirOutliner::ColumnCommand ( int iColumn, int iLine )
|
|
{
|
|
// We have no column commands
|
|
return FALSE;
|
|
}
|
|
|
|
HFONT CAddrDialogDirOutliner::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 * CAddrDialogDirOutliner::AcquireLineData ( int line )
|
|
{
|
|
m_lineindex = line + 1;
|
|
if ( line >= m_iTotalLines)
|
|
return NULL;
|
|
m_pDirLine = (DIR_Server*) XP_ListGetObjectNum(theApp.m_directories, line + 1);
|
|
|
|
return m_pDirLine;
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
|
|
{
|
|
if ( pFlags ) *pFlags = 0; // Flags?
|
|
if ( pDepth ) *pDepth = 0; // We're flat, remember?
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutliner::ReleaseLineData ( void * )
|
|
{
|
|
}
|
|
|
|
|
|
LPCTSTR CAddrDialogDirOutliner::GetColumnText ( UINT iColumn, void * pLineData )
|
|
{
|
|
DIR_Server* line = (DIR_Server*) pLineData;
|
|
|
|
switch (iColumn) {
|
|
case ID_COLDIR_NAME:
|
|
return line->description;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ("");
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::OnSelChanged()
|
|
{
|
|
#ifdef _WIN32
|
|
CWnd *pParent = GetParentOwner();
|
|
#else
|
|
CWnd *pParent = GetOwner();
|
|
pParent = pParent->GetParent();
|
|
ASSERT(pParent);
|
|
#endif
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
|
|
if (((CAddrDialog*) pParent)->IsSearching())
|
|
return;
|
|
|
|
GetSelection(indices, count);
|
|
|
|
if (count == 1)
|
|
((CAddrDialog*) pParent)->OnUpdateDirectorySelection(indices[0]);
|
|
}
|
|
|
|
void CAddrDialogDirOutliner::OnSelDblClk()
|
|
{
|
|
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAddrOutlinerParent
|
|
|
|
BEGIN_MESSAGE_MAP(CAddrDialogDirOutlinerParent, COutlinerParent)
|
|
//{{AFX_MSG_MAP(CAddrDialogDirOutlinerParent)
|
|
ON_WM_LBUTTONUP()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrDialogDirOutlinerParent::CAddrDialogDirOutlinerParent()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
CAddrDialogDirOutlinerParent::~CAddrDialogDirOutlinerParent()
|
|
{
|
|
}
|
|
|
|
|
|
BOOL CAddrDialogDirOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, const char * text )
|
|
{
|
|
int cx = 3, cy = 0;
|
|
CAddrDialogDirOutliner *pOutliner = (CAddrDialogDirOutliner *) 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 * CAddrDialogDirOutlinerParent::GetOutliner ( void )
|
|
{
|
|
return new CAddrDialogDirOutliner;
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutlinerParent::CreateColumns ( void )
|
|
{
|
|
|
|
int iCol0 = 0,
|
|
iCol1 = 0;
|
|
CString cs;
|
|
|
|
m_pOutliner->AddColumn ("", ID_COLDIR_TYPE, 24, 0, ColumnFixed, 0, TRUE );
|
|
cs.LoadString(IDS_USERNAME);
|
|
m_pOutliner->AddColumn (cs, ID_COLDIR_NAME, 1500, 0, ColumnVariable, iCol0 ? iCol0 : 1500 );
|
|
m_pOutliner->SetHasPipes( FALSE );
|
|
|
|
m_pOutliner->SetVisibleColumns(DEF_DIRVISIBLE_COLUMNS);
|
|
m_pOutliner->LoadXPPrefs("mailnews.abook_dir_columns_win");
|
|
|
|
}
|
|
|
|
|
|
void CAddrDialogDirOutlinerParent::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.abook_dir_columns_win");
|
|
}
|
|
|
|
|
|
|
|
void CAddrDialog::OnHelp()
|
|
{
|
|
NetHelp(HELP_SELECT_ADDRESSES);
|
|
}
|
|
|
|
|
|
BOOL CAddrDialog::IsDragInListBox(CPoint *pPoint)
|
|
{
|
|
CRect listRect;
|
|
|
|
CListBox *pBucket = GetBucket();
|
|
pBucket->GetWindowRect(LPRECT(listRect));
|
|
ScreenToClient(LPRECT(listRect));
|
|
if (listRect.PtInRect(*pPoint))
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CAddrDialog::ProcessVCardData(COleDataObject * pDataObject, CPoint &point)
|
|
{
|
|
UINT clipFormat;
|
|
BOOL retVal = TRUE;;
|
|
CWnd * pWnd = GetFocus();
|
|
XP_List * pEntries;
|
|
int32 iEntries;
|
|
|
|
if (pDataObject->IsDataAvailable(
|
|
clipFormat = ::RegisterClipboardFormat(vCardClipboardFormat)))
|
|
{
|
|
HGLOBAL hAddresses = pDataObject->GetGlobalData(clipFormat);
|
|
LPSTR pAddresses = (LPSTR)GlobalLock(hAddresses);
|
|
ASSERT(pAddresses);
|
|
if (!AB_ConvertVCardsToExpandedName(theApp.m_pABook,pAddresses,&pEntries,&iEntries))
|
|
{
|
|
CListBox *pBucket = GetBucket();
|
|
|
|
XP_List * node = pEntries;
|
|
for (int32 i = 0; i < iEntries+1; i++)
|
|
{
|
|
char * pString = (char *)node->object;
|
|
if (pString != NULL)
|
|
AddStringToBucket(pBucket, MSG_TO_HEADER_MASK, pString, ABTypePerson, -1);
|
|
node = node->next;
|
|
if (!node)
|
|
break;
|
|
}
|
|
XP_ListDestroy(pEntries);
|
|
}
|
|
}
|
|
|
|
if (pWnd && ::IsWindow(pWnd->m_hWnd))
|
|
pWnd->SetFocus();
|
|
return retVal;
|
|
}
|
|
|
|
void CAddrDialog::UpdateMsgButtons()
|
|
{
|
|
if (m_pOutliner)
|
|
{
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
BOOL bEnable;
|
|
|
|
m_pOutliner->GetSelection(indices, count);
|
|
bEnable = (count > 0) ? TRUE : FALSE;
|
|
GetDlgItem(IDC_TO)->EnableWindow(bEnable);
|
|
GetDlgItem(IDC_CC)->EnableWindow(bEnable);
|
|
GetDlgItem(IDC_BCC)->EnableWindow(bEnable);
|
|
#ifdef MOZ_NEWADDR
|
|
GetDlgItem(ID_ITEM_PROPERTIES)->EnableWindow(bEnable);
|
|
#else
|
|
//leave disabled for now.
|
|
GetDlgItem(ID_ITEM_PROPERTIES)->EnableWindow(FALSE);
|
|
#endif
|
|
}
|
|
DoUpdateWidget(IDC_DIRSEARCH, AB_LDAPSearchCmd, TRUE);
|
|
if (m_bSearching)
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow(TRUE);
|
|
else
|
|
GetDlgItem(ID_NAVIGATE_INTERRUPT)->EnableWindow(FALSE);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CAddressPickerDropTarget
|
|
|
|
DROPEFFECT CAddressPickerDropTarget::OnDragOver(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DWORD dwKeyState, CPoint point)
|
|
{
|
|
DROPEFFECT deReturn = DROPEFFECT_NONE;
|
|
// Only interested in vcard
|
|
if(pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(vCardClipboardFormat)) )
|
|
{
|
|
if (m_pOwner->IsDragInListBox(&point))
|
|
deReturn = DROPEFFECT_COPY;
|
|
}
|
|
return(deReturn);
|
|
}
|
|
|
|
BOOL CAddressPickerDropTarget::OnDrop
|
|
(CWnd * pWnd, COleDataObject * pDataObject, DROPEFFECT, CPoint point)
|
|
{
|
|
if (pDataObject->IsDataAvailable(::RegisterClipboardFormat(vCardClipboardFormat)) )
|
|
{
|
|
return m_pOwner->ProcessVCardData(pDataObject,point);
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
#endif // MOZ_NEWADDR
|