gecko-dev/cmd/winfe/abmldlg.cpp
1998-06-22 21:19:46 +00:00

2221 lines
56 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 "abmldlg.h"
#ifdef MOZ_NEWADDR
#include "addrfrm.h"
#include "template.h"
#include "wfemsg.h"
#include "msg_srch.h"
#include "dirprefs.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;
};
#define NUM_MAILING_LIST_ATTRIBUTES 3
#define NUM_MAILING_LIST_ENTRY_ATTRIBUTES 2
/////////////////////////////////////////////////////////////////////////////
// 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(CWnd* pParent, MSG_Pane *pane, 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_addingEntries = FALSE;
m_saved = TRUE;
m_errorCode = 0;
m_pFont = NULL;
m_pDropTarget = NULL;
m_pPane = pane;
CABMLDialogEntryList *pInstance = new CABMLDialogEntryList( this );
pInstance->QueryInterface( IID_IMsgList, (LPVOID *) &m_pIAddrList );
HandleErrorReturn(AB_InitializeMailingListPaneAB2(pane));
ApiApiPtr(api);
m_pUnkAddress = api->CreateClassInstance(
APICLASS_ADDRESSCONTROL,NULL);
m_pUnkAddress->QueryInterface(IID_IAddressControl,(LPVOID*)&m_pIAddressList);
m_pIAddressList->SetContext(context);
m_pIAddressList->SetControlParent(this);
// these next three refer to flags around events that
// we receive from m_pIAddressList.
m_changingEntry = FALSE;
m_addingEntry = FALSE;
m_deletingEntry =FALSE;
//{{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_ClosePane(m_pPane));
m_pUnkAddress->Release();
}
void CABMLDialog::OnHelp()
{
if (m_entryID == MSG_MESSAGEIDNONE)
NetHelp(HELP_ADD_LIST_MAILING_LIST);
else
NetHelp(HELP_MAIL_LIST_PROPS);
}
void CABMLDialog::OnUpdateOnlineStatus(CCmdUI *pCmdUI)
{
pCmdUI->Enable(!NET_IsOffline());
}
/////////////////////////////////////////////////////////////////////////////
// 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 (m_pPane, 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( m_pPane, (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);
widget = GetDlgItem(IDC_StatusRect);
widget->GetWindowRect(&rect2);
widget->GetClientRect(&rect3);
ScreenToClient(&rect2);
CRect windowRect, statusRect;
GetClientRect(&windowRect);
statusRect.SetRect(0, windowRect.Height() - rect2.Height(),
windowRect.Width(), windowRect.Height());
widget->DestroyWindow ();
// create the status bar
UINT aIDArray[] = { IDS_TRANSFER_STATUS, ID_SEPARATOR, IDS_ONLINE_STATUS};
m_barStatus.Create(this, FALSE, FALSE);
m_barStatus.MoveWindow(&statusRect, TRUE);
m_barStatus.SetIndicators( aIDArray, sizeof(aIDArray) / sizeof(UINT) );
//set initial online status
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);
}
//move separator over status bar
widget = GetDlgItem(IDC_STATUSSEPARATOR);
widget->GetWindowRect(&rect2);
widget->MoveWindow(0, statusRect.top - rect2.Height(),
windowRect.Width(), rect2.Height(), TRUE);
AddEntriesToList (-1, -1);
m_addingEntries = FALSE;
AB_AttributeValue * values;
AB_AttribID *attribs = new AB_AttribID[NUM_MAILING_LIST_ATTRIBUTES];
uint16 numAttributes = NUM_MAILING_LIST_ATTRIBUTES;
attribs[0] = AB_attribFullName;
attribs[1] = AB_attribNickName;
attribs[2] = AB_attribInfo;
AB_GetMailingListAttributes(m_pPane, attribs, &values, &numAttributes);
for(int i = 0; i < numAttributes; i++)
{
switch(values[i].attrib)
{
case AB_attribFullName: m_name = XP_STRDUP(values[i].u.string);
break;
case AB_attribNickName: m_nickname = XP_STRDUP(values[i].u.string);
break;
case AB_attribInfo: m_description = XP_STRDUP(values[i].u.string);
break;
}
}
delete attribs;
AB_FreeEntryAttributeValues(values, numAttributes);
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_UPDATE_COMMAND_UI(IDS_ONLINE_STATUS, OnUpdateOnlineStatus)
ON_WM_CREATE()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CABMLDialog::Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd)
{
BOOL ret = FALSE;
if (m_MailNewsResourceSwitcher.Initialize ()) {
CDialog::Create (lpszTemplateName, pParentWnd);
ret = TRUE;
}
return ret;
}
BOOL CABMLDialog::Create( UINT nIDTemplate, CWnd* pParentWnd)
{
BOOL ret = FALSE;
if (m_MailNewsResourceSwitcher.Initialize ()) {
CDialog::Create (nIDTemplate, pParentWnd);
ret = TRUE;
}
return ret;
}
BOOL CABMLDialog::Create( CWnd *pParentWnd )
{
BOOL ret = FALSE;
if (m_MailNewsResourceSwitcher.Initialize ()) {
CDialog::Create (IDD, pParentWnd);
ret = TRUE;
}
return ret;
}
int CABMLDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
m_MailNewsResourceSwitcher.Reset();
int res = CDialog::OnCreate(lpCreateStruct);
MSG_SetFEData( (MSG_Pane*) m_pPane, (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()
{
MWContext * context = FE_GetAddressBookContext (m_pPane, FALSE);
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(context);
UpdateData();
AB_AttributeValue *values = new AB_AttributeValue[NUM_MAILING_LIST_ATTRIBUTES + 1];
values[0].attrib = AB_attribFullName;
values[0].u.string = XP_STRDUP(m_name.GetBuffer(0));
values[1].attrib = AB_attribNickName;
values[1].u.string = XP_STRDUP(m_nickname.GetBuffer(0));
values[2].attrib = AB_attribInfo;
values[2].u.string = XP_STRDUP(m_description.GetBuffer(0));
values[3].attrib = AB_attribWinCSID;
values[3].u.shortValue = INTL_GetCSIWinCSID(csi);
AB_SetMailingListAttributes(m_pPane, values, NUM_MAILING_LIST_ATTRIBUTES + 1);
for(int attribNum = 0; attribNum < NUM_MAILING_LIST_ATTRIBUTES + 1; attribNum++)
{
if(AB_IsStringEntryAttributeValue(&values[attribNum]))
{
XP_FREE(values[attribNum].u.string);
}
}
delete values;
//Remove all empty strings since we add them whenever inserting a
// new item
char *szType = NULL , *szName = NULL;
UINT idBitmap;
unsigned long idEntry;
CListBox * pListBox = m_pIAddressList->GetListBox();
int count = pListBox->GetCount();
for(int k = count - 1; k >= 0; k--)
{
if(m_pIAddressList->GetEntry( k,&szType, &szName, &idBitmap, &idEntry))
{
if(szName && strlen(szName) == 0)
{
AB_CommandAB2(m_pPane, AB_DeleteCmd, (MSG_ViewIndex*)&k , 1);
}
}
}
// since we've accepted all additions then commit the changes.
//ensure that no list changes get through as well.
m_changingEntry = TRUE;
AB_CommitChanges(m_pPane);
m_changingEntry = FALSE;
CDialog::OnOK();
DestroyWindow();
}
void CABMLDialog::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CABMLDialog::AddEntriesToList(int index, int num)
{
uint32 count = 0;
ABID entryID;
AB_EntryType type = AB_Person;
DIR_Server* pab = NULL;
CListBox * pWnd = m_pIAddressList->GetListBox();
// if (m_changingEntry)
// return;
if (m_pPane)
{
count = MSG_GetNumLines(m_pPane);
if (count) {
m_addingEntries = TRUE;
//if m_addingEntry is TRUE, this means that m_pIAddressList has already added
//an Entry so we don't need to add it again.
if(!m_addingEntry && !m_changingEntry)
{
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);
}
}
}
uint16 numAttributes;
AB_AttribID attribs[NUM_MAILING_LIST_ENTRY_ATTRIBUTES] = {AB_attribEntryType, AB_attribFullAddress};
AB_AttributeValue *values;
for (int j = index; j < count; j++)
{
char *fullname = NULL;
numAttributes = NUM_MAILING_LIST_ENTRY_ATTRIBUTES;
HandleErrorReturn(AB_GetMailingListEntryAttributes(m_pPane, j, attribs, &values,
&numAttributes));
for(int k = 0; k < numAttributes; k++)
{
switch(values[k].attrib)
{
case AB_attribEntryType: type = values[k].u.entryType;
break;
case AB_attribFullAddress: fullname = XP_STRDUP(values[k].u.string);
break;
}
}
if(numAttributes > 0)
{
AB_FreeEntryAttributeValues(values, numAttributes);
}
// add the entry to the list
m_pIAddressList->SetEntry(j,
"",fullname,type==AB_MailingList?IDB_MAILINGLIST:IDB_PERSON,entryID);
XP_FREEIF (fullname);
}
m_addingEntries = FALSE;
}
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();
if(pListBox->GetCount() == 1)
{
m_pIAddressList->RemoveSelection();
}
else
{
m_pIAddressList->RemoveSelection();
}
}
}
void CABMLDialog::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == m_pPane ) {
++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 == m_pPane ) {
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:
{
uint16 numAttributes = NUM_MAILING_LIST_ENTRY_ATTRIBUTES;
AB_AttribID attribs[NUM_MAILING_LIST_ENTRY_ATTRIBUTES] = {AB_attribEntryType, AB_attribFullName};
AB_AttributeValue *values;
char *fullname = NULL;
AB_EntryType type = AB_Person;
if (m_pPane)
{
HandleErrorReturn(AB_GetMailingListEntryAttributes(m_pPane, where, attribs, &values,
&numAttributes));
for(int k = 0; k < numAttributes; k++)
{
switch(values[k].attrib)
{
case AB_attribEntryType: type = values[k].u.entryType;
break;
case AB_attribFullName: fullname = values[k].u.string;
break;
}
}
m_pIAddressList->SetItemBitmap(CASTINT(where), type==AB_MailingList?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;
m_changingEntry = TRUE;
AB_NameCompletionCookie *pCookie = NULL;
int nNumResults = -1;
m_pIAddressList->GetNameCompletionCookieInfo(&pCookie, &nNumResults, index);
if(pCookie && nNumResults == 1)
{
AB_AddNCEntryToMailingList(m_pPane, index, pCookie, TRUE);
}
else
{
char *szType;
char *szName;
UINT idBitmap;
unsigned long idEntry;
if(m_pIAddressList->GetEntry( index, &szType, &szName, &idBitmap, &idEntry))
{
AB_AddNakedEntryToMailingList(m_pPane, index, szName, TRUE);
}
}
// (*bitmapID) = IDB_PERSON;
m_changingEntry = FALSE;
}
return 0;
}
void CABMLDialog::DeletedItem (HWND hwnd, LONG id, int index)
{
AB_CommandAB2(m_pPane, AB_DeleteCmd, (MSG_ViewIndex*)&index , 1);
// PrintItems("DeletedItem");
}
void CABMLDialog::AddedItem (HWND hwnd, LONG id, int index)
{
m_addingEntry = TRUE;
AB_NameCompletionCookie *pCookie = NULL;
int nNumResults = -1;
m_pIAddressList->GetNameCompletionCookieInfo(&pCookie, &nNumResults, index);
if(pCookie && nNumResults == 1)
{
AB_AddNCEntryToMailingList(m_pPane, index, pCookie, FALSE);
}
else
{
char *szType;
char *szName;
UINT idBitmap;
unsigned long idEntry;
if(m_pIAddressList->GetEntry( index, &szType, &szName, &idBitmap, &idEntry))
{
AB_AddNakedEntryToMailingList(m_pPane, index, szName, FALSE);
}
}
m_addingEntry = FALSE;
// AB_CommandAB2(m_pPane, AB_InsertLineCmd, (MSG_ViewIndex*)&index , 1);
// PrintItems("AddedItem");
}
void CABMLDialog::PrintItems(LPSTR comment)
{
int count = MSG_GetNumLines(m_pPane);
uint16 numAttributes;
AB_AttribID attribs[NUM_MAILING_LIST_ENTRY_ATTRIBUTES] = {AB_attribEntryType, AB_attribFullName};
AB_AttributeValue *values;
for (int j = 0; j < count; j++)
{
char *fullname = NULL;
numAttributes = NUM_MAILING_LIST_ENTRY_ATTRIBUTES;
HandleErrorReturn(AB_GetMailingListEntryAttributes(m_pPane, j, attribs, &values,
&numAttributes));
BOOL hasFullName = FALSE;
for(int k = 0; k < numAttributes; k++)
{
switch(values[k].attrib)
{
case AB_attribEntryType: //type = values[k].u.entryType;
break;
case AB_attribFullName: if(fullname != NULL)
{
fullname = XP_STRDUP(values[k].u.string);
}
else
{
fullname = XP_STRDUP("");
}
TRACE("%s %d %s\n", comment, j, fullname);
hasFullName = TRUE;
break;
}
}
if(!hasFullName)
{
TRACE("%s %d \n", comment, j);
}
if(numAttributes > 0)
{
AB_FreeEntryAttributeValues(values, numAttributes);
}
XP_FREEIF(fullname);
}
}
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;
}
void CABMLDialog::StartNameCompletionSearch()
{
m_barStatus.StartAnimation();
}
void CABMLDialog::StopNameCompletionSearch()
{
m_barStatus.StopAnimation();
}
void CABMLDialog::SetProgressBarPercent(int32 lPercent)
{
m_barStatus.SetPercentDone (lPercent);
}
void CABMLDialog::SetStatusText(const char* pMessage)
{
m_barStatus.SetWindowText( pMessage );
}
CWnd *CABMLDialog::GetOwnerWindow()
{
return this;
}
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;
}
DROPEFFECT CABMLDialog::GetAddressBookIndexFormatDropEffect(COleDataObject *pDataObject)
{
DROPEFFECT res = DROPEFFECT_NONE;
HGLOBAL hContent;
AB_ContainerInfo *pContInfo = AB_GetContainerForMailingList(m_pPane);
hContent = pDataObject->GetGlobalData ( ::RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT));
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock(hContent);
AB_DragEffect requireEffect = AB_Require_Copy;
if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetKeyState(VK_CONTROL) & 0x8000))
requireEffect = AB_Require_Copy;
else if (GetKeyState(VK_SHIFT) & 0x8000)
requireEffect = AB_Require_Move;
else if (GetKeyState(VK_CONTROL) & 0x8000)
requireEffect = AB_Require_Copy;
AB_DragEffect effect = AB_DragEntriesIntoContainerStatus (
pDragData->m_pane, pDragData->m_indices, pDragData->m_count,
pContInfo,
requireEffect); /* do you want to do a move? a copy? default drag? */
if (effect == AB_Require_Copy)
res = DROPEFFECT_COPY;
else if (effect == AB_Require_Move)
res = DROPEFFECT_MOVE;
else
res = DROPEFFECT_NONE;
GlobalUnlock (hContent); //do we have to GlobalFree it too?
return res;
}
BOOL CABMLDialog::ProcessAddressBookIndexFormat(COleDataObject *pDataObject, DROPEFFECT effect)
{
HGLOBAL hContent;
if(!pDataObject)
return FALSE;
AB_ContainerInfo *pContInfo = AB_GetContainerForMailingList(m_pPane);
if (pDataObject->IsDataAvailable( ::RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT) ))
hContent = pDataObject->GetGlobalData (::RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT));
// else
// hContent = pDataObject->GetGlobalData (m_cfAddrIndexes);
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock(hContent);
AB_DragEffect requireEffect = AB_Require_Copy;
if (effect & DROPEFFECT_MOVE)
requireEffect = AB_Require_Move;
else if (effect & DROPEFFECT_COPY)
requireEffect = AB_Require_Copy;
// call new drag drop calls that handle indexes
AB_DragEntriesIntoContainer( pDragData->m_pane, pDragData->m_indices, pDragData->m_count,
pContInfo, requireEffect); /* copy or move? */
return TRUE;
}
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;
if(pDataObject->IsDataAvailable(::RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT)))
{
if(m_pOwner->IsDragInListBox(&point))
{
return m_pOwner->GetAddressBookIndexFormatDropEffect(pDataObject);
}
}
if(pDataObject->IsDataAvailable(
::RegisterClipboardFormat(vCardClipboardFormat)))
{
if (m_pOwner->IsDragInListBox(&point))
deReturn = DROPEFFECT_COPY;
}
return(deReturn);
}
BOOL CMailListDropTarget::OnDrop
(CWnd * pWnd, COleDataObject * pDataObject, DROPEFFECT effect, CPoint point)
{
if(pDataObject->IsDataAvailable(::RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT)))
{
return m_pOwner->ProcessAddressBookIndexFormat(pDataObject, effect);
}
if (pDataObject->IsDataAvailable(::RegisterClipboardFormat(vCardClipboardFormat)) )
{
return m_pOwner->ProcessVCardData(pDataObject,point);
}
return FALSE;
}
#else // MOZ_NEWADDR
#include "addrfrm.h"
#include "template.h"
#include "wfemsg.h"
#include "msg_srch.h"
#include "dirprefs.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);
m_pIAddressList->SetContext(context);
//{{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()
BOOL CABMLDialog::Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd)
{
BOOL ret = FALSE;
if (m_MailNewsResourceSwitcher.Initialize ()) {
CDialog::Create (lpszTemplateName, pParentWnd);
ret = TRUE;
}
return ret;
}
BOOL CABMLDialog::Create( UINT nIDTemplate, CWnd* pParentWnd)
{
BOOL ret = FALSE;
if (m_MailNewsResourceSwitcher.Initialize ()) {
CDialog::Create (nIDTemplate, pParentWnd);
ret = TRUE;
}
return ret;
}
BOOL CABMLDialog::Create( CWnd *pParentWnd )
{
BOOL ret = FALSE;
if (m_MailNewsResourceSwitcher.Initialize ()) {
CDialog::Create (IDD, pParentWnd);
ret = TRUE;
}
return ret;
}
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 < (int) 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 < (int) count; i++)
{
// add the entry to the list
m_pIAddressList->AppendEntry(FALSE, "", "", IDB_PERSON, 0);
}
}
for (int j = index; j < (int) 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;
DIR_Server* pab = NULL;
if (pDataObject->IsDataAvailable(
clipFormat = ::RegisterClipboardFormat(vCardClipboardFormat)))
{
if (pDataObject->IsDataAvailable(
fromABFormat = ::RegisterClipboardFormat(ADDRESSBOOK_SOURCETARGET_FORMAT)))
{
CAddrFrame* frame = (CAddrFrame*) GetParent();
if (frame)
pab = frame->GetCurrentDirectoryServer();
if (DIR_AreServersSame (pab, m_dir))
{
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;
uint32 count = 0;
AB_GetEntryCountInMailingList(m_addrBookPane, &count);
int nIndex = count;
if (pEntryIDs) //from Address Book
{
char szEntryID[20];
ABID entryID;
ABID type;
char *fullname = NULL;
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;
}
#endif //MOZ_NEWADDR