pjs/cmd/winfe/abmldlg.cpp

956 строки
25 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.
*/
// abmldlg.cpp : implementation file
//
#include "stdafx.h"
#include "addrfrm.h"
#include "template.h"
#include "wfemsg.h"
#include "msg_srch.h"
#include "dirprefs.h"
#include "abmldlg.h"
#include "compfrm.h"
#include "apiaddr.h"
#include "nethelp.h" // help
#include "xp_help.h"
#include "intl_csi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern "C" {
#include "xpgetstr.h"
extern int MK_ADDR_ADD_PERSON_TO_ABOOK;
extern int MK_UNABLE_TO_OPEN_ADDR_FILE;
};
/////////////////////////////////////////////////////////////////////////////
// CAddrDialogEntryList
class CABMLDialogEntryList: public IMsgList {
CABMLDialog *m_pABMLDialog;
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) {}
CABMLDialogEntryList( CABMLDialog *pAddrDialog ) {
m_ulRefCount = 0;
m_pABMLDialog = pAddrDialog;
}
};
STDMETHODIMP CABMLDialogEntryList::QueryInterface(REFIID refiid, LPVOID * ppv)
{
*ppv = NULL;
if (IsEqualIID(refiid,IID_IUnknown))
*ppv = (LPUNKNOWN) this;
else if (IsEqualIID(refiid,IID_IMsgList))
*ppv = (LPMSGLIST) this;
if (*ppv != NULL) {
AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CABMLDialogEntryList::AddRef(void)
{
return ++m_ulRefCount;
}
STDMETHODIMP_(ULONG) CABMLDialogEntryList::Release(void)
{
ULONG ulRef;
ulRef = --m_ulRefCount;
if (m_ulRefCount == 0)
delete this;
return ulRef;
}
void CABMLDialogEntryList::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pABMLDialog) {
m_pABMLDialog->ListChangeStarting( pane, asynchronous,
notify, where, num );
}
}
void CABMLDialogEntryList::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pABMLDialog) {
m_pABMLDialog->ListChangeFinished( pane, asynchronous,
notify, where, num );
}
}
void CABMLDialogEntryList::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
int *focus)
{
}
void CABMLDialogEntryList::SelectItem( MSG_Pane* pane, int item )
{
}
/////////////////////////////////////////////////////////////////////////////
// CAddrDialog
CABMLDialog::CABMLDialog(DIR_Server* dir, CWnd* pParent,
ABID listID, MWContext* context)
: CDialog(CABMLDialog::IDD, pParent)
{
CString msg;
//{{AFX_DATA_INIT(CAddrList)
m_description = _T("");
m_name = _T("");
m_nickname = _T("");
//}}AFX_DATA_INIT
m_dir = dir;
m_entryID = listID;
m_addingEntries = FALSE;
m_saved = TRUE;
m_errorCode = 0;
m_changingEntry = FALSE;
m_pFont = NULL;
m_pDropTarget = NULL;
CABMLDialogEntryList *pInstance = new CABMLDialogEntryList( this );
pInstance->QueryInterface( IID_IMsgList, (LPVOID *) &m_pIAddrList );
HandleErrorReturn(AB_InitMailingListPane(&m_addrBookPane,
&m_entryID,
dir,
theApp.m_pABook,
context, WFE_MSGGetMaster(),
ABFullName, TRUE), this);
ApiApiPtr(api);
m_pUnkAddress = api->CreateClassInstance(
APICLASS_ADDRESSCONTROL,NULL);
m_pUnkAddress->QueryInterface(IID_IAddressControl,(LPVOID*)&m_pIAddressList);
m_pIAddressList->SetControlParent(this);
//{{AFX_DATA_INIT(CAddrDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CABMLDialog::~CABMLDialog ( )
{
if(m_pDropTarget) {
m_pDropTarget->Revoke();
delete m_pDropTarget;
m_pDropTarget = NULL;
}
}
void CABMLDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddrList)
DDX_Text(pDX, IDC_Description, m_description);
DDX_Text(pDX, IDC_NAME, m_name);
DDX_Text(pDX, IDC_NICKNAME, m_nickname);
//}}AFX_DATA_MAP
}
void CABMLDialog::PostNcDestroy()
{
delete this;
} // END OF FUNCTION CABMLDialog::PostNcDestroy()
void CABMLDialog::OnDestroy( )
{
CleanupOnClose();
if (m_pFont)
theApp.ReleaseAppFont(m_pFont);
}
void CABMLDialog::CleanupOnClose()
{
if (m_pIAddrList)
m_pIAddrList->Release();
HandleErrorReturn(AB_CloseMailingListPane(&m_addrBookPane), this);
((CAddrFrame*) GetParent())->CloseListProperties (this, m_entryID);
m_pUnkAddress->Release();
}
void CABMLDialog::OnHelp()
{
if (m_entryID == MSG_MESSAGEIDNONE)
NetHelp(HELP_ADD_LIST_MAILING_LIST);
else
NetHelp(HELP_MAIL_LIST_PROPS);
}
/////////////////////////////////////////////////////////////////////////////
// CABMLDialog Overloaded methods
/////////////////////////////////////////////////////////////////////////////
BOOL CABMLDialog::OnInitDialog( )
{
if (CDialog::OnInitDialog()) {
CWnd* widget;
CRect rect2, rect3;
HDC hDC = ::GetDC(m_hWnd);
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
MWContext * context = FE_GetAddressBookContext ((MSG_Pane *) m_addrBookPane, FALSE);
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 );
::SendMessage(::GetDlgItem(m_hWnd, IDC_NAME), WM_SETFONT, (WPARAM)m_pFont, FALSE);
::SendMessage(::GetDlgItem(m_hWnd, IDC_NICKNAME), WM_SETFONT, (WPARAM)m_pFont, FALSE);
::SendMessage(::GetDlgItem(m_hWnd, IDC_Description), WM_SETFONT, (WPARAM)m_pFont, FALSE);
::ReleaseDC(m_hWnd,hDC);
MSG_SetFEData( (MSG_Pane*) m_addrBookPane, (void *) m_pIAddrList );
widget = GetDlgItem(IDC_ENTRIES);
widget->GetWindowRect(&rect2);
widget->GetClientRect(&rect3);
ScreenToClient(rect2);
widget->DestroyWindow ();
CRect rect(0,0,0,0);
m_pIAddressList->Create(this,IDC_ADDRESSLIST);
m_pIAddressList->AddAddressType(NULL);
m_pIAddressList->SetDefaultBitmapId (IDB_PERSON);
CListBox * pWnd = m_pIAddressList->GetListBox();
pWnd->Invalidate();
pWnd->MoveWindow(rect2.left, rect2.top, rect3.right, rect3.bottom, TRUE);
m_pIAddressList->SetCSID(CIntlWin::GetSystemLocaleCsid());
CPaintDC dc ( pWnd );
pWnd->GetWindowRect(rect);
ScreenToClient(rect);
rect.InflateRect(4,4);
WFE_DrawRaisedRect(dc.GetSafeHdc(),rect);
AddEntriesToList (-1, -1);
m_addingEntries = FALSE;
HandleErrorReturn (AB_GetFullName(m_dir, theApp.m_pABook, m_entryID, m_name.GetBuffer(kMaxFullNameLength)), this);
m_name.ReleaseBuffer(-1);
HandleErrorReturn (AB_GetNickname(m_dir, theApp.m_pABook, m_entryID, m_nickname.GetBuffer(kMaxNameLength)), this);
m_nickname.ReleaseBuffer(-1);
HandleErrorReturn (AB_GetInfo(m_dir, theApp.m_pABook, m_entryID, m_description.GetBuffer(kMaxInfo)), this);
m_description.ReleaseBuffer(-1);
UpdateData(FALSE);
if(!m_pDropTarget) {
m_pDropTarget = new CMailListDropTarget(this);
m_pDropTarget->Register(this);
}
DragAcceptFiles();
} else {
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAddrDialog message handlers
BEGIN_MESSAGE_MAP(CABMLDialog, CDialog)
//{{AFX_MSG_MAP(CABMLDialog)
ON_BN_CLICKED( IDOK, OnOK)
ON_BN_CLICKED( IDCANCEL, OnCancel)
ON_BN_CLICKED( IDC_REMOVEITEM, OnRemoveEntry)
ON_BN_CLICKED( ID_HELP, OnHelp)
ON_WM_CREATE()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
int CABMLDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
m_MailNewsResourceSwitcher.Reset();
int res = CDialog::OnCreate(lpCreateStruct);
MSG_SetFEData( (MSG_Pane*) m_addrBookPane, (void *) m_pIAddrList );
return res;
}
BOOL CABMLDialog::PreTranslateMessage( MSG* pMsg )
{
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_TAB)
{
BOOL bControl = GetKeyState(VK_CONTROL) & 0x8000;
BOOL bShift = GetKeyState(VK_SHIFT) & 0x8000;
CWnd* hwndNext = NULL;
CWnd* hwndFocus = GetFocus();
CWnd* hwndDescription = GetDlgItem( IDC_Description );
CWnd* hwndEntries = m_pIAddressList->GetListBox();
CEdit* hwndEntriesEdit = m_pIAddressList->GetAddressNameField();
CWnd* hwndOK = GetDlgItem( IDOK );
if ( bShift ) {
// Tab backward
if ( hwndFocus == hwndEntries || hwndFocus == hwndEntriesEdit ) {
// Tab backward into description
hwndNext = hwndDescription;
if (IsWindow(hwndEntriesEdit->m_hWnd)) {
hwndEntriesEdit->ShowWindow(SW_HIDE);
}
} else if (hwndFocus == hwndOK) {
// Tab into list
hwndNext = hwndEntries;
}
} else {
// Tab forward
if (hwndFocus == hwndDescription) {
// Handle tabbing into list
hwndNext = hwndEntries;
} else if ( hwndFocus == hwndEntries || hwndFocus == hwndEntriesEdit ) {
if (IsWindow(hwndEntriesEdit->m_hWnd)) {
hwndEntriesEdit->ShowWindow(SW_HIDE);
}
hwndNext = hwndOK;
}
}
if ( hwndNext ) {
hwndNext->SetFocus();
return TRUE;
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CABMLDialog::OnOK()
{
// TODO: Add your specialized code here and/or call the base class
MailingListEntry list;
ABID tempID = MSG_MESSAGEIDNONE;
int errorID = 0;
MSG_ViewIndex index = 0;
uint32 count = 0;
DIR_Server* pab = NULL;
uint i = 0;
MWContext * context = FE_GetAddressBookContext ((MSG_Pane *) m_addrBookPane, FALSE);
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(context);
UpdateData();
list.Initialize();
list.pNickName = m_nickname.GetBuffer(0);
list.pFullName = m_name.GetBuffer(0);
list.pInfo = m_description.GetBuffer(0);
list.WinCSID = INTL_GetCSIWinCSID(csi);
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
XP_ASSERT (pab);
if (!pab)
HandleErrorReturn(MK_UNABLE_TO_OPEN_ADDR_FILE, this);
AB_GetEntryCountInMailingList(m_addrBookPane, &count);
do
{
if ((errorID = AB_ModifyMailingListAndEntriesWithChecks(m_addrBookPane, &list,
&index, i)) != 0) {
if (MK_ADDR_ADD_PERSON_TO_ABOOK == errorID)
{
CString s;
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
{
char * fullname = NULL;
m_pIAddressList->SetSel (index, TRUE);
tempID = AB_GetEntryIDAt((AddressPane*) m_addrBookPane, index);
AB_GetExpandedName (pab,
theApp.m_pABook, tempID, &fullname);
char* tmp = PR_smprintf(XP_GetString (MK_ADDR_ADD_PERSON_TO_ABOOK),
fullname);
if (tmp && fullname)
{
if (::MessageBox(this->m_hWnd, tmp, s, MB_OKCANCEL | MB_APPLMODAL) != IDOK)
{
XP_FREEIF (tmp);
XP_FREEIF (fullname);
return;
}
else
errorID = 0;
i = index;
if (i == count - 1)
{
errorID = AB_ModifyMailingListAndEntriesWithChecks(m_addrBookPane, &list,
&index, MSG_VIEWINDEXNONE);
HandleErrorReturn(errorID, this);
}
}
XP_FREEIF (tmp);
XP_FREEIF (fullname);
}
}
else
{
m_pIAddressList->SetSel (index, TRUE);
HandleErrorReturn(errorID, this);
break;
}
}
i++;
} while (i < count && errorID == 0);
if (!errorID)
DestroyWindow();
}
void CABMLDialog::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CABMLDialog::AddEntriesToList(int index, int num)
{
uint32 count = 0;
ABID entryID;
ABID type;
DIR_Server* pab = NULL;
CListBox * pWnd = m_pIAddressList->GetListBox();
if (m_changingEntry)
return;
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
XP_ASSERT (pab);
if (pab)
{
HandleErrorReturn (AB_GetEntryCountInMailingList(m_addrBookPane, &count), this);
if (count) {
m_addingEntries = TRUE;
if (index != -1)
{
count = index + num;
for (int i = index; i < count; i++)
{
// add the entry to the list
m_pIAddressList->InsertEntry(i, FALSE, "", "", IDB_PERSON, 0);
}
}
else
{
pWnd->ResetContent();
index = 0;
for (int i = 0; i < count; i++)
{
// add the entry to the list
m_pIAddressList->AppendEntry(FALSE, "", "", IDB_PERSON, 0);
}
}
for (int j = index; j < count; j++)
{
if ((entryID = AB_GetEntryIDAt((AddressPane*) m_addrBookPane, j)) != MSG_MESSAGEIDNONE)
{
char *fullname = NULL;
// need to change the bitmap based on the type
HandleErrorReturn (AB_GetType (pab, theApp.m_pABook, entryID, &type), this);
// if the entry is null, use a null terminated string
HandleErrorReturn (AB_GetExpandedName (pab,
theApp.m_pABook, entryID, &fullname), this);
// add the entry to the list
m_pIAddressList->SetEntry(j,
"",fullname,type==ABTypeList?IDB_MAILINGLIST:IDB_PERSON,entryID);
XP_FREEIF (fullname);
}
}
}
else {
m_pIAddressList->AppendEntry();
}
}
else {
// add the entry to the list
m_pIAddressList->AppendEntry();
}
pWnd->Invalidate();
pWnd->UpdateWindow();
}
#ifdef XP_WIN16
#define LPNMHDR NMHDR*
#endif
void CABMLDialog::OnRemoveEntry(void)
{
ASSERT(m_pIAddressList);
CListBox * pListBox = m_pIAddressList->GetListBox();
if (pListBox->GetCount())
{
CListBox * pWnd = m_pIAddressList->GetListBox();
m_pIAddressList->RemoveSelection();
}
}
void CABMLDialog::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == (MSG_Pane*) m_addrBookPane ) {
++m_iMysticPlane;
}
}
void CABMLDialog::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
ABID entryID = MSG_MESSAGEIDNONE;
if ( pane == (MSG_Pane*) m_addrBookPane ) {
switch ( notify ) {
case MSG_NotifyNone:
break;
case MSG_NotifyInsertOrDelete:
// this could happen from someone deleting one of the members from the
// address book or an undo action adding a member back in
{
if (num > 0)
AddEntriesToList(CASTINT(where), CASTINT(num));
else
AddEntriesToList(-1, -1);
}
break;
case MSG_NotifyChanged:
if ((entryID = AB_GetEntryIDAt((AddressPane*) m_addrBookPane, where)) != MSG_MESSAGEIDNONE)
{
char *fullname = NULL;
DIR_Server* pab = NULL;
ABID type;
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
XP_ASSERT (pab);
if (pab)
{
HandleErrorReturn (AB_GetExpandedName (pab,
theApp.m_pABook, entryID, &fullname), this);
HandleErrorReturn (AB_GetType (pab, theApp.m_pABook, entryID, &type), this);
m_pIAddressList->SetItemBitmap(CASTINT(where), type==ABTypeList?IDB_MAILINGLIST:IDB_PERSON);
m_pIAddressList->SetItemEntryID(CASTINT(where), entryID);
m_pIAddressList->SetItemName(CASTINT(where), fullname);
XP_FREEIF (fullname);
}
}
break;
case MSG_NotifyAll:
case MSG_NotifyScramble:
AddEntriesToList(-1, -1);
break;
}
if (( !--m_iMysticPlane && m_addrBookPane)) {
CListBox * pWnd = m_pIAddressList->GetListBox();
pWnd->Invalidate();
pWnd->UpdateWindow();
}
}
}
void CABMLDialog::HandleErrorReturn(int errorid, CWnd* parent)
{
if (errorid) {
CString s;
HWND parentWnd = NULL;
if (parent)
parentWnd = parent->m_hWnd;
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
::MessageBox(parentWnd, XP_GetString(errorid), s, MB_OK | MB_APPLMODAL);
}
}
// IAddressParent stuff
// these functions are in compbar.cpp, they should be prototyped
// in some header file and placed somewhere more appropriate
extern "C" char * wfe_ExpandForNameCompletion(char * pString);
extern "C" char * wfe_ExpandName(char * pString, unsigned long* entryID, UINT* bitmapID);
int CABMLDialog::ChangedItem (char * pString, int index, HWND hwnd, char ** ppFullName, unsigned long* entryID, UINT* bitmapID)
{
if (!m_addingEntries) {
ABID type, field, tempID = MSG_MESSAGEIDNONE;
char* fullname = NULL;
m_saved = FALSE;
int errorID = 0;
DIR_Server* pab = NULL;
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
XP_ASSERT (pab);
tempID = (*entryID);
if (pab)
{
// check if this is one that has already been
// expanded and hasn't changed
if (tempID != MSG_MESSAGEIDNONE) {
AB_GetExpandedName (pab,
theApp.m_pABook, tempID, &fullname);
if (fullname)
{
if (XP_STRCMP (fullname, pString) == 0)
{
(*ppFullName) = fullname;
return 0;
}
}
}
m_changingEntry = TRUE;
AB_GetIDForNameCompletion(
theApp.m_pABook,
pab,
&tempID, &field, (LPCTSTR)pString);
if (tempID != MSG_MESSAGEIDNONE)
{
if ((*entryID) == MSG_MESSAGEIDNONE)
m_errorCode = AB_AddIDToMailingListAt (m_addrBookPane, tempID, index);
else
m_errorCode = AB_ReplaceIDInMailingListAt(m_addrBookPane, tempID, index);
AB_GetExpandedName (pab,
theApp.m_pABook, tempID, &fullname);
// need to change the bitmap based on the type
AB_GetType (pab,
theApp.m_pABook, tempID, &type);
if (type == ABTypeList)
(*bitmapID) = IDB_MAILINGLIST;
else
(*bitmapID) = IDB_PERSON;
}
else {
PersonEntry person;
person.Initialize();
person.pGivenName = pString;
person.pEmailAddress = pString;
MWContext * context = FE_GetAddressBookContext ((MSG_Pane *) m_addrBookPane, FALSE);
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(context);
person.WinCSID = INTL_GetCSIWinCSID(csi);
m_errorCode = AB_AddPersonToMailingListAt(m_addrBookPane, &person, index, &tempID);
fullname = (char *) XP_ALLOC (kMaxFullNameLength);
if (fullname)
{
XP_STRCPY (fullname, "");
XP_STRCPY (fullname, pString);
}
(*bitmapID) = IDB_PERSON;
}
m_changingEntry = FALSE;
(*ppFullName) = fullname;
(*entryID) = tempID;
return 0;
}
else
return 0;
}
return 0;
}
void CABMLDialog::DeletedItem (HWND hwnd, LONG id, int index)
{
HandleErrorReturn (AB_RemoveIDFromMailingListAt (m_addrBookPane, index), this);
}
void CABMLDialog::AddedItem (HWND hwnd, LONG id, int index)
{
}
char * CABMLDialog::NameCompletion(char * pString)
{
ABID entryID = -1;
ABID field = -1;
DIR_Server* pab = NULL;
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
if (pab != NULL && theApp.m_pABook)
{
AB_GetIDForNameCompletion(
theApp.m_pABook,
pab,
&entryID,&field,(LPCTSTR)pString);
if (entryID != -1)
{
if (field == ABNickname) {
char szNickname[kMaxNameLength];
AB_GetNickname(
pab,
theApp.m_pABook, entryID, szNickname);
if (strlen(szNickname))
return strdup(szNickname);
}
else {
char szFullname[kMaxFullNameLength];
AB_GetFullName(pab, theApp.m_pABook,
entryID, szFullname);
if (strlen(szFullname))
return strdup(szFullname);
}
}
}
return NULL;
}
BOOL CABMLDialog::IsDragInListBox(CPoint *pPoint)
{
CRect listRect;
CListBox * pListBox = m_pIAddressList->GetListBox();
pListBox->GetWindowRect(LPRECT(listRect));
ScreenToClient(LPRECT(listRect));
if (listRect.PtInRect(*pPoint))
return TRUE;
else
return FALSE;
}
BOOL CABMLDialog::ProcessVCardData(COleDataObject * pDataObject, CPoint &point)
{
UINT clipFormat, fromABFormat;
BOOL retVal;
CWnd * pWnd = GetFocus();
ABID tempID = MSG_MESSAGEIDNONE;
HGLOBAL hEntryIDs = NULL;
LPSTR pEntryIDs = NULL;
if (pDataObject->IsDataAvailable(
clipFormat = ::RegisterClipboardFormat(vCardClipboardFormat)))
{
if (pDataObject->IsDataAvailable(
fromABFormat = ::RegisterClipboardFormat(ADDRESSBOOK_SOURCETARGET_FORMAT)))
{
hEntryIDs = pDataObject->GetGlobalData(fromABFormat);
pEntryIDs = (LPSTR)GlobalLock(hEntryIDs);
ASSERT(pEntryIDs);
}
HGLOBAL hAddresses = pDataObject->GetGlobalData(clipFormat);
LPSTR pAddresses = (LPSTR)GlobalLock(hAddresses);
ASSERT(pAddresses);
XP_List * pEntries;
int32 iEntries;
if (m_pIAddressList)
{
int itemNum = 0;
char * szType = NULL;
char * szName = NULL;
char * pszType = NULL;
CListBox * pListBox = m_pIAddressList->GetListBox();
if (!AB_ConvertVCardsToExpandedName(theApp.m_pABook,pAddresses,&pEntries,&iEntries))
{
XP_List * node = pEntries;
char *pTemp = NULL;
if (pEntryIDs) //from Address Book
pTemp = pEntryIDs;
for (int32 i = 0; i < iEntries+1; i++)
{
char * pString = (char *)node->object;
if (pString != NULL)
{
m_changingEntry = TRUE;
int nIndex = pListBox->GetCount() - 1;
if (pEntryIDs) //from Address Book
{
char szEntryID[20];
ABID entryID;
ABID type;
char *fullname = NULL;
DIR_Server* pab = NULL;
szEntryID[0] = '\0';
int nPos = 0;
while (pTemp[nPos] != '\0')
{
if (pTemp[nPos] == '-')
{
strncpy(szEntryID, pTemp, nPos);
szEntryID[nPos] = '\0';
pTemp = pTemp + nPos + 1;
break;
}
else
nPos++;
}
entryID = atol(szEntryID);
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
m_errorCode = AB_AddIDToMailingListAt(m_addrBookPane, entryID, nIndex);
// need to change the bitmap based on the type
HandleErrorReturn (AB_GetType (pab, theApp.m_pABook, entryID, &type));
// if the entry is null, use a null terminated string
HandleErrorReturn (AB_GetExpandedName (pab,
theApp.m_pABook, entryID, &fullname));
m_pIAddressList->SetEntry(nIndex, "", fullname, type==ABTypeList?IDB_MAILINGLIST:IDB_PERSON, 0);
m_pIAddressList->AppendEntry(FALSE);
XP_FREEIF (fullname);
}
else
{
char* names = NULL;
char* addresses = NULL;
int num = 0;
num = MSG_ParseRFC822Addresses(pString, &names, &addresses);
if (num > 0)
{
XP_ASSERT(names);
XP_ASSERT(addresses);
PersonEntry person;
person.Initialize();
person.pGivenName = names;
person.pEmailAddress = addresses;
MWContext * context = FE_GetAddressBookContext ((MSG_Pane *) m_addrBookPane, FALSE);
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(context);
person.WinCSID = INTL_GetCSIWinCSID(csi);
m_errorCode = AB_AddPersonToMailingListAt(m_addrBookPane, &person, nIndex, &tempID);
m_pIAddressList->InsertEntry(nIndex, FALSE, "", pString, IDB_PERSON, 0);
m_pIAddressList->AppendEntry(FALSE, "", "", IDB_PERSON);
XP_FREEIF(names);
XP_FREEIF(addresses);
}
}
}
node = node->next;
if (!node)
break;
}
XP_ListDestroy(pEntries);
}
if (hEntryIDs)
GlobalUnlock(hEntryIDs);
GlobalUnlock(hAddresses);
retVal = TRUE;
m_changingEntry = FALSE;
}
}
if (pWnd && ::IsWindow(pWnd->m_hWnd))
pWnd->SetFocus();
return retVal;
}
//////////////////////////////////////////////////////////////////////////////
// CMailListDropTarget
DROPEFFECT CMailListDropTarget::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 CMailListDropTarget::OnDrop
(CWnd * pWnd, COleDataObject * pDataObject, DROPEFFECT, CPoint point)
{
if (pDataObject->IsDataAvailable(::RegisterClipboardFormat(vCardClipboardFormat)) )
{
return m_pOwner->ProcessVCardData(pDataObject,point);
}
return FALSE;
}