home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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;
- }
-
-
-