gecko-dev/cmd/winfe/addrfrm.cpp
1998-03-28 02:44:41 +00:00

3397 lines
85 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.
*/
// addrfrm.cpp : implementation file
//
#include "stdafx.h"
#include "addrfrm.h"
#ifdef FEATURE_ADDRPROP
#include "addrprop.h"
#endif
#include "template.h"
#include "xpgetstr.h"
#include "wfemsg.h"
#include "msg_srch.h"
#include "dirprefs.h"
#include "nethelp.h"
#include "xp_help.h"
#include "prefapi.h"
#include "intlwin.h"
#include "srchdlg.h"
#include "intl_csi.h"
#include "mailpriv.h"
#include "mnprefs.h"
//RHP - Need this include for the call in confhook.cpp
#include "confhook.h"
#ifndef _AFXDLL
#undef new
#endif
IMPLEMENT_DYNCREATE(CAddrFrame, CGenericFrame)
#ifndef _AFXDLL
#define new DEBUG_NEW
#endif
extern "C" {
#include "xpgetstr.h"
extern int MK_MSG_CANT_CALL_MAILING_LIST;
extern int MK_MSG_CALL_NEEDS_IPADDRESS;
extern int MK_MSG_CALL_NEEDS_EMAILADDRESS;
extern int MK_MSG_CANT_FIND_CALLPOINT;
extern int MK_ADDR_BOOK_CARD;
extern int MK_ADDR_NEW_CARD;
extern int MK_OUT_OF_MEMORY;
extern int MK_ADDR_FIRST_LAST_SEP;
extern int MK_ADDR_LAST_FIRST_SEP;
};
#define ADDRESS_BOOK_TIMER 6
#define OUTLINER_TYPEDOWN_TIMER 250
#define TYPEDOWN_SPEED 300
#define LDAP_SEARCH_SPEED 1250
#define OUTLINER_TYPEDOWN_SPEED 1250
static UINT AddrCodes[] = {
ID_ITEM_ADDUSER,
ID_ITEM_ADDLIST,
ID_ITEM_PROPERTIES,
ID_FILE_NEWMESSAGE,
ID_LIVE_CALL,
ID_EDIT_DELETE,
ID_NAVIGATE_INTERRUPT
};
int FE_ShowPropertySheetFor (MWContext* context, ABID entryID, PersonEntry* pPerson)
{
DIR_Server *pab = NULL;
BOOL result = FALSE;
#ifdef FEATURE_ADDRPROP
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
XP_ASSERT (pab);
if (pab)
{
if (entryID != MSG_MESSAGEIDNONE)
{
CString formattedString;
char fullname [kMaxFullNameLength];
AB_GetFullName(pab, theApp.m_pABook, entryID, fullname);
formattedString.Format(XP_GetString (MK_ADDR_BOOK_CARD), fullname);
CAddrEditProperties prop(NULL, pab,
(const char *) formattedString, ABSTRACTCX(context)->GetDialogOwner(), entryID, pPerson, context);
prop.SetCurrentPage(0);
result = prop.DoModal();
}
else
{
CString formattedString;
char* name = NULL;
name = (char *) XP_ALLOC(kMaxFullNameLength);
if (!name)
return MK_OUT_OF_MEMORY;
XP_STRCPY (name, pPerson->pGivenName);
if (pPerson->pFamilyName)
{
XP_STRNCPY_SAFE (name, XP_GetString (MK_ADDR_FIRST_LAST_SEP), kMaxFullNameLength);
XP_STRNCPY_SAFE (name, pPerson->pFamilyName, kMaxFullNameLength);
}
formattedString.Format(XP_GetString (MK_ADDR_BOOK_CARD), name);
XP_FREEIF (name);
CAddrEditProperties prop(NULL, pab,
(const char *) formattedString, ABSTRACTCX(context)->GetDialogOwner(), 0, pPerson, context);
prop.SetCurrentPage(0);
result = prop.DoModal();
}
}
if (result == IDOK)
result = TRUE;
if (result == IDCANCEL)
result = FALSE;
// if it is -1 then there was a memory problem creating the dialog
// and we should return that
#endif
return result;
}
void CAddrCX::DestroyContext()
{
CStubsCX::DestroyContext();
}
CAddrBar::CAddrBar()
{
m_iWidth = 0;
m_uTypedownClock = 0;
m_save = "";
m_savedir = -1;
m_pFont = NULL;
m_bRemoveLDAPDir = FALSE;
PREF_GetBoolPref("mail.addr_book.ldap.disabled", &m_bRemoveLDAPDir);
//{{AFX_DATA_INIT(CAddrbkView)
m_name = _T("");
m_directory = 0;
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CAddrBar::~CAddrBar()
{
if (m_pFont) {
theApp.ReleaseAppFont(m_pFont);
}
}
/////////////////////////////////////////////////////////////////////////////
// CAddrBar Message handlers
BEGIN_MESSAGE_MAP(CAddrBar, CDialogBar)
//{{AFX_MSG_MAP(CAddrFrame)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_TIMER ()
ON_EN_CHANGE(IDC_ADDRNAME, OnChangeName)
ON_EN_SETFOCUS(IDC_ADDRNAME, OnSetFocusName)
ON_CBN_SELCHANGE(IDC_DIRECTORIES, OnChangeDirectory)
ON_BN_CLICKED(IDC_DIRSEARCH, OnExtDirectorySearch)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CAddrBar::Create(CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID)
{
BOOL res = CDialogBar::Create(pParentWnd, nIDTemplate, nStyle, nID);
m_iWidth = m_sizeDefault.cx;
return res;
}
int CAddrBar::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
int retval = CDialogBar::OnCreate( lpCreateStruct);
HDC hDC = ::GetDC(m_hWnd);
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lf.lfPitchAndFamily = FF_SWISS;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = IntlGetLfCharset(CIntlWin::GetSystemLocaleCsid());
if (CIntlWin::GetSystemLocaleCsid() == CS_LATIN1)
_tcscpy(lf.lfFaceName, "MS Sans Serif");
else
_tcscpy(lf.lfFaceName, IntlGetUIPropFaceName(CIntlWin::GetSystemLocaleCsid()));
lf.lfHeight = -MulDiv(9, ::GetDeviceCaps(hDC, LOGPIXELSY), 72);
m_pFont = theApp.CreateAppFont( lf );
::ReleaseDC(m_hWnd,hDC);
CRect rect;
GetClientRect(&rect);
m_sizeDefault = rect.Size();
return retval;
}
void CAddrBar::SetDirectoryIndex( int dirIndex )
{
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
m_savedir = -1;
widget->SetCurSel (dirIndex);
UpdateData(TRUE);
if (m_directory != m_savedir) {
m_savedir = m_directory;
if (m_directory != -1) {
XP_Bool bSelectable = FALSE, bPlural = FALSE;
MSG_COMMAND_CHECK_STATE sState;
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
AB_CommandStatus((ABPane*) frame->GetPane(),
AB_LDAPSearchCmd,
NULL, NULL,
&bSelectable,
&sState,
NULL,
&bPlural);
CWnd* widget = GetDlgItem ( IDC_DIRSEARCH );
widget->EnableWindow(bSelectable);
}
}
}
void CAddrBar::UpdateDirectories()
{
DIR_Server* dir;
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
widget->ResetContent();
XP_List *pTraverse = theApp.m_directories;
while (dir = (DIR_Server*) XP_ListNextObject(pTraverse)) {
if (m_bRemoveLDAPDir){
if (dir->dirType == PABDirectory)
widget->AddString(dir->description);
}
else if (dir->dirType == PABDirectory || dir->dirType == LDAPDirectory)
widget->AddString(dir->description);
}
if (m_directory == -1)
widget->SetCurSel(0);
else
widget->SetCurSel(m_directory);
}
void CAddrBar::OnTimer(UINT nID)
{
CWnd::OnTimer(nID);
if (nID == ADDRESS_BOOK_TIMER) {
KillTimer(m_uTypedownClock);
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
if (!m_name.IsEmpty()) {
frame->OnTypedown(m_name.GetBuffer(0));
m_name.ReleaseBuffer();
}
}
}
void CAddrBar::OnKillFocus( CWnd* pNewWnd )
{
KillTimer(m_uTypedownClock);
}
void CAddrBar::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddrbkView)
DDX_Text(pDX, IDC_ADDRNAME, m_name);
DDX_CBIndex(pDX, IDC_DIRECTORIES, m_directory);
//}}AFX_DATA_MAP
}
void CAddrBar::OnChangeName()
{
// TODO: Add your control notification handler code here
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
if (frame->IsSearching()) {
frame->OnExtendedDirectorySearch();
}
UpdateData(TRUE);
if (m_name != m_save) {
m_save = m_name;
KillTimer(m_uTypedownClock);
if (m_name.GetLength())
{
DIR_Server* dir;
CComboBox *widget = (CComboBox*) GetDlgItem(IDC_DIRECTORIES);
dir = (DIR_Server*) XP_ListGetObjectNum (theApp.m_directories, widget->GetCurSel() + 1);
if (dir->dirType == PABDirectory)
m_uTypedownClock = SetTimer(ADDRESS_BOOK_TIMER, TYPEDOWN_SPEED, NULL);
else {
int32 prefInt = LDAP_SEARCH_SPEED;
PREF_GetIntPref("ldap_1.autoComplete.interval", &prefInt);
m_uTypedownClock = SetTimer(ADDRESS_BOOK_TIMER, prefInt, NULL);
}
}
}
}
void CAddrBar::OnSetFocusName()
{
CEdit *widget = (CEdit*) GetDlgItem(IDC_ADDRNAME);
widget->SetSel(0, -1, TRUE);
}
void CAddrBar::OnChangeDirectory()
{
// TODO: Add your control notification handler code here
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
if (frame->IsSearching())
return;
UpdateData(TRUE);
if (m_directory != m_savedir) {
m_savedir = m_directory;
if (m_directory != -1) {
frame->OnChangeDirectory(m_directory);
XP_Bool bSelectable = FALSE, bPlural = FALSE;
MSG_COMMAND_CHECK_STATE sState;
AB_CommandStatus((ABPane*) frame->GetPane(),
AB_LDAPSearchCmd,
NULL, NULL,
&bSelectable,
&sState,
NULL,
&bPlural);
CWnd* widget = GetDlgItem ( IDC_DIRSEARCH );
widget->EnableWindow(bSelectable);
}
}
}
void CAddrBar::OnExtDirectorySearch()
{
// TODO: Add your control notification handler code here
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
if (m_directory != -1) {
KillTimer(m_uTypedownClock);
frame->OnExtendedDirectorySearch();
}
}
static void GrowWindow( CWnd *pWnd, int dx, int dy )
{
CRect rect;
CWnd *parent;
pWnd->GetWindowRect(&rect);
if (parent = pWnd->GetParent())
parent->ScreenToClient(&rect);
rect.bottom += dy;
if (rect.right + dx > 0)
rect.right += dx;
pWnd->MoveWindow(&rect);
}
static void SlideWindow( CWnd *pWnd, int dx, int dy )
{
CRect rect;
CWnd *parent;
pWnd->GetWindowRect(&rect);
if (parent = pWnd->GetParent())
parent->ScreenToClient(&rect);
rect.top += dy;
rect.left += dx;
rect.bottom += dy;
rect.right += dx;
pWnd->MoveWindow(&rect, TRUE);
}
void CAddrBar::OnSize( UINT nType, int cx, int cy )
{
CDialogBar::OnSize( nType, cx, cy );
if ( cx && m_iWidth && ( cx != m_iWidth ) ) {
CWnd *widget;
CRect rect1 (0,0,0,0);
int dx = cx - m_iWidth;
widget = GetDlgItem(IDC_DIRSEARCH);
if (widget) {
SlideWindow(widget, dx, 0);
widget->GetWindowRect(&rect1);
}
widget = GetDlgItem(IDC_ADDRNAME);
if (widget) {
CWnd *parent;
CRect rect;
widget->GetWindowRect(&rect);
if (parent = widget->GetParent()) {
parent->ScreenToClient(&rect1);
parent->ScreenToClient(&rect);
rect.right = rect1.left - 8;
}
widget->MoveWindow(&rect);
}
m_iWidth = cx;
}
}
class CAddrFrame;
/////////////////////////////////////////////////////////////////////////////
// CAddrEntryList
class CAddrEntryList: public IMsgList {
CAddrFrame *m_pAddrFrame;
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) {}
CAddrEntryList( CAddrFrame *pAddrFrame ) {
m_ulRefCount = 0;
m_pAddrFrame = pAddrFrame;
}
};
STDMETHODIMP CAddrEntryList::QueryInterface(REFIID refiid, LPVOID * ppv)
{
*ppv = NULL;
if (IsEqualIID(refiid,IID_IUnknown))
*ppv = (LPUNKNOWN) this;
else if (IsEqualIID(refiid,IID_IMsgList))
*ppv = (LPMSGLIST) this;
else if (IsEqualIID(refiid,IID_IMailFrame))
*ppv = (LPMAILFRAME) m_pAddrFrame;
if (*ppv != NULL) {
AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CAddrEntryList::AddRef(void)
{
return ++m_ulRefCount;
}
STDMETHODIMP_(ULONG) CAddrEntryList::Release(void)
{
ULONG ulRef;
ulRef = --m_ulRefCount;
if (m_ulRefCount == 0)
delete this;
return ulRef;
}
void CAddrEntryList::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pAddrFrame) {
m_pAddrFrame->ListChangeStarting( pane, asynchronous,
notify, where, num );
}
}
void CAddrEntryList::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pAddrFrame) {
m_pAddrFrame->ListChangeFinished( pane, asynchronous,
notify, where, num );
}
}
void CAddrEntryList::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
int *focus)
{
}
void CAddrEntryList::SelectItem( MSG_Pane* pane, int item )
{
}
/////////////////////////////////////////////////////////////////////////////
// CAddrFrame
CAddrFrame *CAddrFrame::Open()
{
if (!WFE_MSGCheckWizard())
return NULL;
if (!theApp.m_pAddressWindow) //starts the address book window
{
CCreateContext context;
context.m_pCurrentFrame = NULL;
context.m_pCurrentDoc = NULL;
context.m_pNewViewClass = NULL;
context.m_pNewDocTemplate = NULL;
theApp.m_pAddressWindow = new CAddrFrame();
if(!theApp.m_pAddressWindow) return NULL;
CCreateContext Context;
Context.m_pCurrentFrame = NULL; // nothing to base on
Context.m_pCurrentDoc = NULL; // nothing to base on
Context.m_pNewViewClass = NULL; // nothing to base on
Context.m_pNewDocTemplate = NULL; // nothing to base on
theApp.m_pAddressWindow->LoadFrame(IDR_ADDRESS_MENU,
WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE |WS_CLIPCHILDREN|WS_CLIPSIBLINGS, NULL, &Context);
}
else
{
theApp.m_pAddressWindow->ActivateFrame();
}
return theApp.m_pAddressWindow;
}
CAddrFrame::CAddrFrame()
{
CString msg;
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(GetContext());
m_cxType = AddressCX;
GetContext()->type = MWContextAddressBook;
GetContext()->fancyFTP = TRUE;
GetContext()->fancyNews = TRUE;
GetContext()->intrupt = FALSE;
GetContext()->reSize = FALSE;
INTL_SetCSIWinCSID(csi, CIntlWin::GetSystemLocaleCsid());
m_pOutliner = NULL;
m_pOutlinerParent = NULL;
m_addrBookPane = NULL;
m_bSearching = FALSE;
m_iProgress = 0;
m_iWidth = 0;
m_pSplitter = NULL;
CAddrEntryList *pInstance = new CAddrEntryList( this );
pInstance->QueryInterface( IID_IMsgList, (LPVOID *) &m_pIAddrList );
}
CAddrFrame::~CAddrFrame()
{
if (m_pIAddrList)
m_pIAddrList->Release();
if (m_addrBookPane)
HandleErrorReturn(AB_CloseAddressBookPane(&m_addrBookPane));
theApp.m_pAddressWindow = NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CAddrFrame Overloaded methods
BOOL CAddrFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.hwndParent = NULL;
cs.x = cs.y = 0;
cs.cx = cs.cy = 300; // Arbitrary
BOOL bRet = CGenericFrame::PreCreateWindow(cs);
#ifdef _WIN32
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
#endif
return bRet;
}
BOOL CAddrFrame::LoadFrame( UINT nIDResource, DWORD dwDefaultStyle,
CWnd* pParentWnd, CCreateContext* pContext)
{
BOOL ret = CGenericFrame::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext);
if (ret) {
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(&wp);
if (wp.rcNormalPosition.left < 0 || wp.rcNormalPosition.top < 0) {
SetWindowPos( NULL, 0 , 0, 0, 0, SWP_NOSIZE);
GetWindowPlacement(&wp);
SetWindowPos( NULL, abs (wp.rcNormalPosition.left) , abs (wp.rcNormalPosition.top),
0, 0, SWP_SHOWWINDOW | SWP_NOSIZE);
}
else
ShowWindow(SW_SHOW);
}
return ret;
}
BOOL CAddrFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
BOOL res = CGenericFrame::OnCreateClient(lpcs, pContext);
if (res) {
m_pSplitter = (CMailNewsSplitter *) RUNTIME_CLASS(CMailNewsSplitter)->CreateObject();
ASSERT(m_pSplitter);
#ifdef _WIN32
m_pSplitter->CreateEx(0, NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,
0,0,0,0, this->m_hWnd, (HMENU)AFX_IDW_PANE_FIRST, pContext );
#else
m_pSplitter->Create( NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,
CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST, pContext );
#endif
m_pOutlinerParent = new CAddrOutlinerParent;
#ifdef _WIN32
m_pOutlinerParent->CreateEx(WS_EX_CLIENTEDGE, NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
0,0,0,0, m_pSplitter->m_hWnd, (HMENU) IDW_RESULTS_PANE, NULL );
#else
m_pOutlinerParent->Create( NULL, NULL,
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,
CRect(0,0,0,0), m_pSplitter, IDW_RESULTS_PANE );
#endif
m_pOutliner = (CAddrOutliner *) m_pOutlinerParent->m_pOutliner;
m_pOutlinerParent->CreateColumns ( );
m_pOutlinerParent->EnableFocusFrame(TRUE);
m_pOutliner->SetContext( GetContext() );
SetMainContext (this);
SetActiveContext (this);
m_pDirOutlinerParent = new CDirOutlinerParent;
#ifdef _WIN32
m_pDirOutlinerParent->CreateEx(WS_EX_CLIENTEDGE, NULL, NULL,
WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,
0,0,0,0, m_pSplitter->m_hWnd, (HMENU) IDW_RESULTS_PANE, NULL );
#else
m_pDirOutlinerParent->Create( NULL, NULL,
WS_BORDER|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS,
CRect(0,0,0,0), m_pSplitter, IDW_RESULTS_PANE );
#endif
m_pDirOutliner = (CDirOutliner *) m_pDirOutlinerParent->m_pOutliner;
m_pDirOutlinerParent->CreateColumns ( );
m_pDirOutlinerParent->EnableFocusFrame(TRUE);
m_pDirOutliner->SetContext( GetContext() );
int32 prefInt = -1;
PREF_GetIntPref("mail.addr_book.sliderwidth", &prefInt);
RECT rect;
GetClientRect(&rect);
m_pSplitter->AddPanes(m_pDirOutlinerParent, m_pOutlinerParent, prefInt, TRUE);
}
return res;
}
BOOL CAddrFrame::PreTranslateMessage( MSG* pMsg )
{
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_DELETE)
{
if (GetFocus() == m_barAddr.GetDlgItem(IDC_ADDRNAME)) {
return FALSE;
}
}
if (pMsg->wParam == VK_TAB) {
HWND hwndNext = NULL;
HWND hwndFocus = ::GetFocus();
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
HWND hwndAddrBarFirst = ::GetNextDlgTabItem( m_barAddr.m_hWnd, NULL, FALSE );
HWND hwndAddrBarLast = ::GetNextDlgTabItem( m_barAddr.m_hWnd, hwndAddrBarFirst, TRUE );
if ( GetKeyState(VK_SHIFT) & 0x8000 ) {
// Tab backward
if ( hwndFocus == hwndAddrBarFirst ) {
// Handle tabbing into outliner
hwndNext = hwndOutliner;
} else if (hwndFocus == hwndOutliner) {
// Handle tabbing out of outliner into the directory list
if (m_pSplitter->IsOnePaneClosed())
hwndNext = hwndAddrBarLast;
else
hwndNext = hwndDirOutliner;
} else if ( hwndFocus == hwndDirOutliner ) {
// Handle tabbing into the outliner
hwndNext = hwndAddrBarLast;
}
} else {
// Tab forward
if (hwndFocus == hwndOutliner) {
// Handle tabbing out of outliner
hwndNext = hwndAddrBarFirst;
} else if ( hwndFocus == hwndAddrBarLast ) {
// handle tabbing into the directory list
if (m_pSplitter->IsOnePaneClosed())
hwndNext = hwndOutliner;
else
hwndNext = hwndDirOutliner;
} else if (hwndFocus == hwndDirOutliner) {
// Handle tabbing out of the directory list
hwndNext = hwndOutliner;
}
}
if ( hwndNext ) {
::SetFocus( hwndNext );
return TRUE;
}
} // if tab
} // if keydown
return CGenericFrame::PreTranslateMessage(pMsg);
}
void CAddrFrame::OnHelpMenu()
{
NetHelp(HELP_ADDRESS_BOOK);
}
void CAddrFrame::Progress(MWContext *pContext, const char *pMessage)
{
LPNSSTATUSBAR pIStatusBar = NULL;
m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->SetStatusText(pMessage);
pIStatusBar->Release();
}
}
void CAddrFrame::SetProgressBarPercent(MWContext *pContext, int32 lPercent)
{
lPercent = lPercent < 0 ? 0 : ( lPercent > 100 ? 100 : lPercent );
if ( m_iProgress == lPercent ) {
return;
}
m_iProgress = lPercent;
if (GetChrome()) {
LPNSSTATUSBAR pIStatusBar = NULL;
GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->SetProgress( CASTINT(lPercent) );
pIStatusBar->Release();
}
}
}
STDMETHODIMP CAddrFrame::QueryInterface(REFIID refiid, LPVOID * ppv)
{
*ppv = NULL;
if (IsEqualIID(refiid,IID_IUnknown))
*ppv = (LPUNKNOWN) (LPMSGLIST) m_pIAddrList;
else if (IsEqualIID(refiid,IID_IMailFrame))
*ppv = (LPMAILFRAME) this;
else if (IsEqualIID(refiid,IID_IMsgList))
*ppv = (LPMSGLIST) m_pIAddrList;
if (*ppv != NULL) {
AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CAddrFrame::AddRef(void)
{
return 0; // Not a real component
}
STDMETHODIMP_(ULONG) CAddrFrame::Release(void)
{
return 0; // Not a real component
}
// IMailFrame interface
CMailNewsFrame *CAddrFrame::GetMailNewsFrame()
{
return (CMailNewsFrame *) NULL;
}
MSG_Pane *CAddrFrame::GetPane()
{
return (MSG_Pane*) m_addrBookPane;
}
void CAddrFrame::PaneChanged(MSG_Pane *pane, XP_Bool asynchronous,
MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
{
if (notify == MSG_PaneDirectoriesChanged) {
// stop an ldap search if we need to
if (m_bSearching)
OnStopSearch();
UpdateDirectories();
}
}
#ifdef FEATURE_ADDRESS_BOOK
#include "addrfrm.i00"
#endif
/////////////////////////////////////////////////////////////////////////////
// CAddrFrame message handlers
BEGIN_MESSAGE_MAP(CAddrFrame, CGenericFrame)
//{{AFX_MSG_MAP(CAddrFrame)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_SHOWWINDOW( )
ON_WM_DESTROY()
ON_WM_GETMINMAXINFO()
ON_UPDATE_COMMAND_UI(ID_VIEW_ABTOOLBAR, OnUpdateViewCommandToolbar)
ON_COMMAND(ID_VIEW_ABTOOLBAR, OnViewCommandToolbar)
ON_UPDATE_COMMAND_UI(ID_TOOLS_ADDRESSBOOK, OnUpdateShowAddressBookWindow)
ON_UPDATE_COMMAND_UI(IDS_SECURITY_STATUS, OnUpdateSecureStatus)
ON_COMMAND(ID_FILE_IMPORT, OnImportFile)
ON_UPDATE_COMMAND_UI( ID_FILE_IMPORT, OnUpdateImport )
ON_COMMAND(ID_FILE_SAVEAS, OnExportFile)
ON_UPDATE_COMMAND_UI( ID_FILE_SAVEAS, OnUpdateExport )
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_UPDATE_COMMAND_UI( IDC_DIRSEARCH, OnUpdateSearch )
ON_COMMAND(IDC_DIRSEARCH, OnExtDirectorySearch)
ON_COMMAND(ID_NAVIGATE_INTERRUPT, OnStopSearch)
ON_UPDATE_COMMAND_UI(ID_NAVIGATE_INTERRUPT, OnUpdateStopSearch)
ON_COMMAND(ID_FILE_NEWMESSAGE, OnComposeMsg)
ON_UPDATE_COMMAND_UI(ID_FILE_NEWMESSAGE, OnUpdateComposeMsg)
ON_COMMAND(ID_LIVE_CALL, OnCall)
ON_UPDATE_COMMAND_UI(ID_LIVE_CALL, OnUpdateCall)
ON_COMMAND(ID_ITEM_ADDUSER, OnAddUser)
ON_UPDATE_COMMAND_UI(ID_ITEM_ADDUSER, OnUpdateAddUser)
ON_COMMAND(ID_FILE_NEWAB, OnAddAB)
ON_UPDATE_COMMAND_UI(ID_FILE_NEWAB, OnUpdateAddAB)
ON_COMMAND(ID_FILE_NEWDIR, OnAddDir)
ON_UPDATE_COMMAND_UI(ID_FILE_NEWDIR, OnUpdateAddDir)
ON_COMMAND(ID_EDIT_DOMAINS, OnHTMLDomains)
ON_UPDATE_COMMAND_UI(ID_EDIT_DOMAINS, OnUpdateHTMLDomains)
ON_COMMAND(ID_ITEM_ADDLIST, OnAddList)
ON_UPDATE_COMMAND_UI(ID_ITEM_ADDLIST, OnUpdateAddList)
ON_COMMAND(ID_SWITCH_SORT, OnSwitchSortFirstLast)
ON_UPDATE_COMMAND_UI(ID_SWITCH_SORT, OnUpdateSwitchSort)
ON_COMMAND(ID_EDIT_DELETE, OnDeleteItem)
ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateDeleteItem)
ON_COMMAND(ID_EDIT_UNDO, OnUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateUndo)
ON_COMMAND(ID_EDIT_REDO, OnRedo)
ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateRedo)
ON_COMMAND(ID_ITEM_PROPERTIES, OnItemProperties)
ON_UPDATE_COMMAND_UI(ID_ITEM_PROPERTIES, OnUpdateItemProperties)
ON_COMMAND(ID_SORT_TYPE, OnSortType)
ON_UPDATE_COMMAND_UI(ID_SORT_TYPE, OnUpdateSortType)
ON_COMMAND(ID_SORT_NAME, OnSortName)
ON_UPDATE_COMMAND_UI(ID_SORT_NAME, OnUpdateSortName)
ON_COMMAND(ID_SORT_NICKNAME, OnSortNickName)
ON_UPDATE_COMMAND_UI(ID_SORT_NICKNAME, OnUpdateSortNickName)
ON_COMMAND(ID_SORT_EMAILADDRESS, OnSortEmailAddress)
ON_UPDATE_COMMAND_UI(ID_SORT_EMAILADDRESS, OnUpdateSortEmailAddress)
ON_COMMAND(ID_SORT_COMPANY, OnSortCompany)
ON_UPDATE_COMMAND_UI(ID_SORT_COMPANY, OnUpdateSortCompany)
ON_COMMAND(ID_SORT_LOCALITY, OnSortLocality)
ON_UPDATE_COMMAND_UI(ID_SORT_LOCALITY, OnUpdateSortLocality)
ON_COMMAND(ID_ASCENDING, OnSortAscending)
ON_UPDATE_COMMAND_UI(ID_ASCENDING, OnUpdateSortAscending)
ON_COMMAND(ID_DECENDING, OnSortDescending)
ON_UPDATE_COMMAND_UI(ID_DECENDING, OnUpdateSortDescending)
ON_COMMAND(ID_CREATE_CARD, OnCreateCard)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
int CAddrFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
void WFE_AddNewFrameToFrameList(CGenericFrame * pFrame);
int res = CGenericFrame::OnCreate(lpCreateStruct);
unsigned long sortby;
int32 prefInt;
PREF_GetIntPref("mail.addr_book.sortby",&prefInt);
switch (prefInt) {
case ID_COLADDR_TYPE:
case ID_COLADDR_COMPANY:
case ID_COLADDR_LOCALITY:
sortby = ABFullName;
break;
case ID_COLADDR_NAME:
sortby = ABFullName;
break;
case ID_COLADDR_EMAIL:
sortby = ABEmailAddress;
break;
case ID_COLADDR_NICKNAME:
sortby = ABNickname;
break;
default:
sortby = ABFullName;
break;
}
int result = 0;
DIR_Server* dir = (DIR_Server*)XP_ListGetObjectNum(theApp.m_directories, 1);
XP_ASSERT (dir);
if (!dir)
return -1;
XP_Bool prefBool;
PREF_GetBoolPref("mail.addr_book.sort_ascending",&prefBool);
HandleErrorReturn((result = AB_CreateAddressBookPane(&m_addrBookPane,
GetContext(),
WFE_MSGGetMaster())));
if (result)
return -1;
HandleErrorReturn((result = AB_InitializeAddressBookPane(m_addrBookPane,
dir,
theApp.m_pABook,
sortby,
prefBool)));
if (result)
return -1;
//I'm hardcoding because I don't want this translated
GetChrome()->CreateCustomizableToolbar("Address_Book"/*ID_ADDRESS_BOOK*/, 3, TRUE);
CButtonToolbarWindow *pWindow;
BOOL bOpen, bShowing;
int32 nPos;
//I'm hardcoding because I don't want this translated
GetChrome()->LoadToolbarConfiguration(ID_ADDRESS_BOOK_TOOLBAR, CString("Address_Book_Toolbar"), nPos, bOpen, bShowing);
LPNSTOOLBAR pIToolBar = NULL;
GetChrome()->QueryInterface( IID_INSToolBar, (LPVOID *) &pIToolBar );
if ( pIToolBar ) {
pIToolBar->Create( this, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | CBRS_TOP | WS_BORDER);
pIToolBar->SetButtons( AddrCodes, sizeof(AddrCodes)/sizeof(UINT) );
pIToolBar->SetSizes( CSize( 30, 27 ), CSize( 23, 21 ) );
pIToolBar->LoadBitmap( MAKEINTRESOURCE( IDB_ADDRESSTOOLBARP ) );
pIToolBar->SetToolbarStyle( theApp.m_pToolbarStyle );
pWindow = new CButtonToolbarWindow(CWnd::FromHandlePermanent(pIToolBar->GetHWnd()), theApp.m_pToolbarStyle, 43, 27, eLARGE_HTAB);
GetChrome()->GetCustomizableToolbar()->AddNewWindow(ID_ADDRESS_BOOK_TOOLBAR, pWindow,nPos, 50, 37, 0, CString(szLoadString(ID_ADDRESS_BOOK_TOOLBAR)),theApp.m_pToolbarStyle, bOpen, FALSE);
GetChrome()->ShowToolbar(ID_ADDRESS_BOOK_TOOLBAR, bShowing);
#ifdef XP_WIN16
GetChrome()->GetCustomizableToolbar()->SetBottomBorder(TRUE);
#endif
pIToolBar->Release();
}
LPNSSTATUSBAR pIStatusBar = NULL;
GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->Create( this );
pIStatusBar->Release();
}
m_barAddr.Create( this, IDD_ADDRESSBOOK, CBRS_TOP, 1 );
// Initially size window to only dialog + title bar.
int BorderX = GetSystemMetrics(SM_CXFRAME);
CRect rect;
m_barAddr.GetWindowRect(rect);
#ifdef _WIN32
CSize size = m_barAddr.CalcFixedLayout(FALSE, FALSE);
#else
CSize size = m_barAddr.m_sizeDefault;
#endif
// Figure height of title bar + bottom border
m_iWidth = size.cx;
int16 iLeft,iRight,iTop,iBottom;
PREF_GetRectPref("mail.addr_book_window_rect", &iLeft, &iTop, &iRight, &iBottom);
int screenY = ::GetSystemMetrics(SM_CYFULLSCREEN);
int screenX = ::GetSystemMetrics(SM_CXFULLSCREEN);
if ((iLeft >= 0) && (iTop >= 0) && (iRight < screenX) && (iBottom < screenY))
{
if (iRight - iLeft > m_iWidth)
size.cx = iRight - iLeft;
size.cy = iBottom - iTop;
SetWindowPos( NULL, iLeft, iTop, size.cx, size.cy,
SWP_HIDEWINDOW);
}
else {
size.cy = 300;
SetWindowPos( NULL, 0, 0, size.cx, size.cy,
SWP_HIDEWINDOW);
}
m_barAddr.UpdateDirectories();
m_pOutliner->SetPane(m_addrBookPane);
m_pDirOutliner->SetPane(m_addrBookPane);
MSG_SetFEData( (MSG_Pane*) m_addrBookPane, (void *) m_pIAddrList );
WFE_AddNewFrameToFrameList(this);
CFrameWnd::RecalcLayout();
if (m_barAddr.m_pFont)
::SendMessage(::GetDlgItem(m_barAddr.GetSafeHwnd(), IDC_ADDRNAME),
WM_SETFONT, (WPARAM)m_barAddr.m_pFont, FALSE);
if (m_barAddr.m_bRemoveLDAPDir)
m_barAddr.GetDlgItem(IDC_DIRSEARCH)->ShowWindow(SW_HIDE);
m_barAddr.GetDlgItem(IDC_ADDRNAME)->SetFocus();
return res;
}
void CAddrFrame::UpdateDirectories ( void )
{
m_barAddr.SetDirectoryIndex(0);
m_barAddr.OnChangeDirectory();
m_barAddr.UpdateDirectories();
m_pDirOutliner->UpdateCount();
}
void CAddrFrame::OnFileClose ( void )
{
PostMessage ( WM_CLOSE );
}
void CAddrFrame::OnViewCommandToolbar()
{
GetChrome()->ShowToolbar(ID_ADDRESS_BOOK_TOOLBAR, !GetChrome()->GetToolbarVisible(ID_ADDRESS_BOOK_TOOLBAR));
}
void CAddrFrame::OnUpdateViewCommandToolbar(CCmdUI *pCmdUI)
{
BOOL bShow = GetChrome()->GetToolbarVisible(ID_ADDRESS_BOOK_TOOLBAR);
if( pCmdUI->m_pMenu ){
pCmdUI->m_pMenu->ModifyMenu(CASTUINT(ID_VIEW_ABTOOLBAR), CASTUINT(MF_BYCOMMAND | MF_STRING), CASTUINT(ID_VIEW_ABTOOLBAR),
szLoadString(CASTUINT(bShow ? IDS_HIDE_ABTOOLBAR : IDS_SHOW_ABTOOLBAR)) );
} else {
pCmdUI->SetCheck(bShow);
}
}
void CAddrFrame::OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI )
{
CGenericFrame::OnGetMinMaxInfo( lpMMI );
if (m_iWidth) {
lpMMI->ptMinTrackSize.x = m_iWidth;
}
}
void CAddrFrame::OnDestroy()
{
// DestroyContext will call Interrupt, but if we wait until after DestroyContext
// to call MSG_SearchFree, the MWContext will be gone, and we'll be reading freed memory
if (XP_IsContextBusy (GetContext()))
XP_InterruptContext (GetContext());
if (m_addrBookPane)
MSG_SearchFree ((MSG_Pane*) m_addrBookPane);
CGenericFrame::OnDestroy();
if(!IsDestroyed()) {
DestroyContext();
}
}
void CAddrFrame::OnClose()
{
CRect rect;
WINDOWPLACEMENT wp;
int i;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(&wp);
ASSERT(theApp.m_pAddressWindow == this);
if ( !IsIconic() && !IsZoomed() )
{
GetWindowRect ( &rect );
PREF_SetRectPref("mail.addr_book_window_rect",
(int16) rect.left, (int16) rect.top, (int16) rect.right, (int16) rect.bottom);
}
PREF_SetIntPref("mail.wfe.addr_book.show_value",(int)wp.showCmd);
PREF_SetIntPref("mail.addr_book.sliderwidth", m_pSplitter->GetPaneSize());
// we should prompt if changes aren't saved
// MW fix
for (i = 0; i < m_listPropList.GetSize(); i++) {
((CWnd*) m_listPropList.GetAt(i))->DestroyWindow();
}
for (i = 0; i < m_userPropList.GetSize(); i++) {
((CWnd*) m_userPropList.GetAt(i))->DestroyWindow();
}
//I'm hardcoding because I don't want this translated
GetChrome()->SaveToolbarConfiguration(ID_ADDRESS_BOOK_TOOLBAR, CString("Address_Book_Toolbar"));
CGenericFrame::OnClose();
}
void CAddrFrame::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == (MSG_Pane*) m_addrBookPane ) {
if ( m_pOutliner ) {
m_pOutliner->MysticStuffStarting( asynchronous, notify,
where, num );
}
}
}
void CAddrFrame::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == (MSG_Pane*) m_addrBookPane ) {
if ( m_pOutliner ) {
m_pOutliner->MysticStuffFinishing( asynchronous, notify,
where, num );
}
}
}
void CAddrFrame::SetSearchResults(MSG_ViewIndex index, int32 num)
{
CString csStatus;
ASSERT(m_pOutliner);
AB_LDAPSearchResults(m_addrBookPane, index, num);
if (num > 1) {
csStatus.Format( szLoadString(IDS_SEARCHHITS), num );
} else if ( num > 0 ) {
csStatus.LoadString( IDS_SEARCHONEHIT );
} else {
csStatus.LoadString( IDS_SEARCHNOHITS );
}
if (GetChrome()) {
LPNSSTATUSBAR pIStatusBar = NULL;
GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->SetStatusText(csStatus);
pIStatusBar->Release();
}
}
}
void CAddrFrame::AllConnectionsComplete( MWContext *pContext )
{
CStubsCX::AllConnectionsComplete( pContext );
if (m_bSearching) {
OnStopSearch();
int32 total = m_pOutliner->GetTotalLines();
CString csStatus;
if ( total > 1 ) {
csStatus.Format( szLoadString( IDS_SEARCHHITS ), total );
} else if ( total > 0 ) {
csStatus.LoadString( IDS_SEARCHONEHIT );
} else {
csStatus.LoadString( IDS_SEARCHNOHITS );
CString s;
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
MessageBox(csStatus, s, MB_OK | MB_APPLMODAL);
}
LPNSSTATUSBAR pIStatusBar = NULL;
m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->SetStatusText( csStatus );
pIStatusBar->SetProgress( 0 );
pIStatusBar->Release();
}
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
}
}
void CAddrFrame::Close()
{
if (theApp.m_pAddressWindow) {
theApp.m_pAddressWindow->PostMessage(WM_CLOSE);
}
}
void CAddrFrame::OnImportFile()
{
HandleErrorReturn(AB_ImportFromFile(m_addrBookPane, GetContext()), this);
}
void CAddrFrame::OnExportFile()
{
HandleErrorReturn(AB_ExportToFile(m_addrBookPane, GetContext()), this);
}
void CAddrFrame::OnTypedown (char* name)
{
DIR_Server* dir = GetCurrentDirectoryServer();
if (dir->dirType == LDAPDirectory) {
OnDirectoryList(name);
}
else
m_pOutliner->OnTypedown (name);
}
void CAddrFrame::DoUpdateAddressBook( CCmdUI* pCmdUI, AB_CommandType cmd, BOOL bUseCheck )
{
if(!pCmdUI)
return;
XP_Bool bSelectable = FALSE, bPlural = FALSE;
MSG_COMMAND_CHECK_STATE sState;
if (m_addrBookPane) {
if (m_pOutliner) {
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
AB_CommandStatus(m_addrBookPane,
cmd,
indices, count,
&bSelectable,
&sState,
NULL,
&bPlural);
} else {
AB_CommandStatus(m_addrBookPane,
cmd,
NULL, 0,
&bSelectable,
&sState,
NULL,
&bPlural);
}
}
pCmdUI->Enable(bSelectable);
if (bUseCheck)
pCmdUI->SetCheck(sState == MSG_Checked);
else
pCmdUI->SetRadio(sState == MSG_Checked);
}
void CAddrFrame::OnExtDirectorySearch()
{
m_barAddr.OnExtDirectorySearch();
}
void CAddrFrame::OnUpdateShowAddressBookWindow( CCmdUI *pCmdUI )
{
pCmdUI->Enable(FALSE);
}
void CAddrFrame::OnUpdateSecureStatus(CCmdUI *pCmdUI)
{
DIR_Server* dir = GetCurrentDirectoryServer();
if (dir->isSecure)
pCmdUI->Enable(TRUE);
else
pCmdUI->Enable(FALSE);
}
void CAddrFrame::OnUpdateSearch( CCmdUI *pCmdUI )
{
DoUpdateAddressBook(pCmdUI, AB_LDAPSearchCmd, TRUE);
}
void CAddrFrame::OnUpdateImport(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_ImportCmd, TRUE);
}
void CAddrFrame::OnUpdateExport(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SaveCmd, TRUE);
}
void CAddrFrame::OnUpdateSortType(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortByTypeCmd, TRUE);
}
void CAddrFrame::OnUpdateSortName(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortByFullNameCmd, TRUE);
}
void CAddrFrame::OnUpdateSortNickName(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortByNickname, TRUE);
}
void CAddrFrame::OnUpdateSortEmailAddress(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortByEmailAddress, TRUE);
}
void CAddrFrame::OnUpdateSortCompany(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortByCompanyName, TRUE);
}
void CAddrFrame::OnUpdateSortLocality(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortByLocality, TRUE);
}
void CAddrFrame::OnUpdateSortAscending(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortAscending, TRUE);
}
void CAddrFrame::OnUpdateSortDescending(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_SortDescending, TRUE);
}
void CAddrFrame::OnUpdateComposeMsg(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_NewMessageCmd);
}
void CAddrFrame::OnUpdateStopSearch(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_LDAPSearchCmd);
}
void CAddrFrame::OnUpdateAddUser(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_AddUserCmd);
}
void CAddrFrame::OnUpdateAddList(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_AddMailingListCmd);
}
void CAddrFrame::OnUpdateAddAB(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_NewAddressBook);
}
void CAddrFrame::OnUpdateAddDir(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_NewLDAPDirectory);
}
void CAddrFrame::OnUpdateItemProperties(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_PropertiesCmd);
}
void CAddrFrame::OnUpdateCall(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_CallCmd);
}
void CAddrFrame::OnUpdateSwitchSort(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_AddUserCmd);
}
void CAddrFrame::OnUpdateDeleteItem(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_DeleteCmd);
}
void CAddrFrame::OnUpdateUndo(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_UndoCmd);
}
void CAddrFrame::OnUpdateRedo(CCmdUI* pCmdUI)
{
DoUpdateAddressBook(pCmdUI, AB_RedoCmd);
}
void CAddrFrame::OnSwitchSortFirstLast()
{
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
AB_SetSortByFirstName(theApp.m_pABook, !AB_GetSortByFirstName(theApp.m_pABook));
SetCursor ( theApp.LoadStandardCursor ( IDC_ARROW ) );
}
void CAddrFrame::OnAddUser ( void )
{
#ifdef FEATURE_ADDRPROP
CAddrEditProperties* prop;
prop = new CAddrEditProperties (this,
GetCurrentDirectoryServer(),
XP_GetString (MK_ADDR_NEW_CARD), this, 0, NULL, GetContext());
prop->SetCurrentPage(0);
if (prop->Create(this, WS_SYSMENU | WS_POPUP | WS_CAPTION | WS_VISIBLE,
WS_EX_DLGMODALFRAME)) {
m_userPropList.Add (prop);
}
#endif
}
void CAddrFrame::OnAddAB ( void )
{
HandleErrorReturn(AB_Command (m_addrBookPane, AB_NewAddressBook, 0, 0), this);
}
void CAddrFrame::OnAddDir ( void )
{
#ifdef FEATURE_ADDRPROP
CString label;
label.LoadString(IDS_ADD_LDAP_SERVER);
CAddrLDAPProperties serverProperties(this, GetContext(), NULL, label);
if (IDOK == serverProperties.DoModal())
{
DIR_Server* pServer = &serverProperties.m_serverInfo;
DIR_Server *pNewServer = (DIR_Server *) XP_ALLOC(sizeof(DIR_Server));
if (pNewServer)
{
DIR_InitServer(pNewServer);
DIR_CopyServer(pServer, &pNewServer);
if (pNewServer->dirType == LDAPDirectory) {
DIR_SetServerFileName(pNewServer, pNewServer->serverName);
}
}
XP_ListAddObjectToEnd(theApp.m_directories, pNewServer);
DIR_SaveServerPreferences (theApp.m_directories);
}
#endif
}
void CAddrFrame::OnHTMLDomains ( void )
{
MSG_DisplayHTMLDomainsDialog(GetContext());
}
void CAddrFrame::OnUpdateHTMLDomains( CCmdUI *pCmdUI )
{
pCmdUI->Enable( TRUE );
}
void CAddrFrame::OnCreateCard ( void )
{
#ifdef FEATURE_ADDRPROP
CAddrEditProperties* prop;
char* email = NULL;
char* name = NULL;
DIR_Server* pab = NULL;
PersonEntry person;
person.Initialize();
ABID entryID = MSG_MESSAGEIDNONE;
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(GetContext());
if (FE_UsersMailAddress())
email = XP_STRDUP (FE_UsersMailAddress());
if (FE_UsersFullName())
name = XP_STRDUP (FE_UsersFullName());
person.pGivenName = name;
person.pEmailAddress = email;
person.WinCSID = INTL_GetCSIWinCSID(csi);
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
XP_ASSERT (pab);
if (pab) {
AB_GetEntryIDForPerson(pab,
theApp.m_pABook, &entryID, &person);
if (entryID != MSG_MESSAGEIDNONE) {
// see it it is already opened
if (m_userPropList.GetSize()) {
// try to find it
for (int i = 0; i < m_userPropList.GetSize(); i++) {
if (((CAddrEditProperties*)m_userPropList.GetAt(i))->GetEntryID() == entryID) {
((CAddrEditProperties*)m_userPropList.GetAt(i))->BringWindowToTop();
return;
}
}
}
// otherwise open the window
CString formattedString;
char fullname [kMaxFullNameLength];
AB_GetFullName(pab, theApp.m_pABook, entryID, fullname);
formattedString.Format(XP_GetString (MK_ADDR_BOOK_CARD), fullname);
prop = new CAddrEditProperties(this,
pab, (const char *) formattedString, this, entryID, NULL, GetContext());
prop->SetCurrentPage(0);
if (prop->Create(this, WS_SYSMENU | WS_POPUP | WS_CAPTION | WS_VISIBLE,
WS_EX_DLGMODALFRAME)) {
m_userPropList.Add (prop);
}
}
else {
CString formattedString;
formattedString.Format(XP_GetString (MK_ADDR_BOOK_CARD), name);
prop = new CAddrEditProperties (this,
pab, formattedString, this, 0, &person, GetContext());
prop->SetCurrentPage(0);
if (prop->Create(this, WS_SYSMENU | WS_POPUP | WS_CAPTION | WS_VISIBLE,
WS_EX_DLGMODALFRAME)) {
m_userPropList.Add (prop);
}
}
}
if (email)
XP_FREE (email);
if (name)
XP_FREE (name);
#endif
}
DIR_Server * CAddrFrame::GetCurrentDirectoryServer()
{
return (DIR_Server*)XP_ListGetObjectNum(theApp.m_directories, m_pOutliner->GetDirectoryIndex() + 1);
}
void CAddrFrame::OnAddList ( void )
{
CABMLDialog* dialog;
dialog = new CABMLDialog (GetCurrentDirectoryServer(),
this, 0, GetContext());
if (dialog->Create(this)) {
m_listPropList.Add (dialog);
}
}
void CAddrFrame::OnDeleteItem()
{
#ifdef FEATURE_ADDRPROP
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
for (int i = 0; i < count; i++)
{
ABID type;
ABID entryID;
// check the entry type and add/remove pages
entryID = AB_GetEntryIDAt((AddressPane*)m_addrBookPane, indices[i]);
AB_GetType(GetCurrentDirectoryServer(), theApp.m_pABook,
entryID, &type);
if (m_userPropList.GetSize() && type == ABTypePerson) {
// try to find
for (int i = 0; i < m_userPropList.GetSize(); i++) {
if (((CAddrEditProperties*)m_userPropList.GetAt(i))->GetEntryID() == entryID) {
((CAddrEditProperties*)m_userPropList.GetAt(i))->DestroyWindow();
}
}
}
if (m_listPropList.GetSize() && type == ABTypeList) {
for (int i = 0; i < m_listPropList.GetSize(); i++) {
if (((CABMLDialog*)m_listPropList.GetAt(i))->GetEntryID() == entryID) {
((CABMLDialog*)m_listPropList.GetAt(i))->DestroyWindow();
}
}
}
}
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
HandleErrorReturn(AB_Command (m_addrBookPane, AB_DeleteCmd, indices, count), this);
m_pOutliner->UpdateCount();
if ((m_pOutliner->GetFocusLine() > m_pOutliner->GetTotalLines() - 1))
m_pOutliner->SelectItem(m_pOutliner->GetTotalLines() - 1);
else
m_pOutliner->SelectItem(m_pOutliner->GetFocusLine());
SetCursor ( theApp.LoadStandardCursor ( IDC_ARROW ) );
#endif
}
void CAddrFrame::OnUndo()
{
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
HandleErrorReturn(AB_Command (m_addrBookPane, AB_UndoCmd, 0, 0), this);
m_pOutliner->UpdateCount();
if ((m_pOutliner->GetFocusLine() > m_pOutliner->GetTotalLines() - 1))
m_pOutliner->SelectItem(m_pOutliner->GetTotalLines() - 1);
else
m_pOutliner->SelectItem(m_pOutliner->GetFocusLine());
SetCursor ( theApp.LoadStandardCursor ( IDC_ARROW ) );
}
void CAddrFrame::OnRedo()
{
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
HandleErrorReturn(AB_Command (m_addrBookPane, AB_RedoCmd, 0, 0), this);
m_pOutliner->UpdateCount();
if ((m_pOutliner->GetFocusLine() > m_pOutliner->GetTotalLines() - 1))
m_pOutliner->SelectItem(m_pOutliner->GetTotalLines() - 1);
else
m_pOutliner->SelectItem(m_pOutliner->GetFocusLine());
SetCursor ( theApp.LoadStandardCursor ( IDC_ARROW ) );
}
void CAddrFrame::OnComposeMsg()
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
HandleErrorReturn(AB_Command (m_addrBookPane, AB_NewMessageCmd, indices, count), this);
}
void CAddrFrame::CloseUserProperties (CAddrEditProperties* wnd, ABID entryID)
{
#ifdef FEATURE_ADDRPROP
CAddrEditProperties* prop;
for (int i = 0; i < m_userPropList.GetSize(); i++) {
prop = (CAddrEditProperties*) (m_userPropList.GetAt(i));
if (prop->GetEntryID() == entryID && prop == wnd) {
m_userPropList.RemoveAt(i);
break;
}
}
#endif
}
void CAddrFrame::CloseListProperties (CABMLDialog* wnd, ABID entryID)
{
CABMLDialog* prop;
for (int i = 0; i < m_listPropList.GetSize(); i++) {
prop = (CABMLDialog*) (m_listPropList.GetAt(i));
if (prop->GetEntryID() == entryID && prop == wnd) {
m_listPropList.RemoveAt(i);
break;
}
}
}
void CAddrFrame::OnItemProperties()
{
#ifdef FEATURE_ADDRPROP
if (GetCurrentDirectoryServer()->dirType == LDAPDirectory) {
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
HandleErrorReturn(AB_Command (m_addrBookPane, AB_PropertiesCmd, indices, count), this);
}
else {
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
for (int i = 0; i < count; i++) {
ABID type;
ABID entryID;
// check the entry type and add/remove pages
entryID = AB_GetEntryIDAt((AddressPane*)m_addrBookPane, indices[i]);
AB_GetType(GetCurrentDirectoryServer(), theApp.m_pABook,
entryID, &type);
if (m_userPropList.GetSize() && type == ABTypePerson) {
// try to find
for (int i = 0; i < m_userPropList.GetSize(); i++) {
if (((CAddrEditProperties*)m_userPropList.GetAt(i))->GetEntryID() == entryID) {
((CAddrEditProperties*)m_userPropList.GetAt(i))->BringWindowToTop();
return;
}
}
}
if (m_listPropList.GetSize() && type == ABTypeList) {
for (int i = 0; i < m_listPropList.GetSize(); i++) {
if (((CABMLDialog*)m_listPropList.GetAt(i))->GetEntryID() == entryID) {
((CABMLDialog*)m_listPropList.GetAt(i))->BringWindowToTop();
return;
}
}
}
// otherwise open an new property sheet
if (type == ABTypePerson) {
CAddrEditProperties* prop = NULL;
CString formattedString;
char fullname [kMaxFullNameLength];
AB_GetFullName(GetCurrentDirectoryServer(), theApp.m_pABook, entryID, fullname);
formattedString.Format(XP_GetString (MK_ADDR_BOOK_CARD), fullname);
prop = new CAddrEditProperties(this,
GetCurrentDirectoryServer(),
(const char *) formattedString, this, entryID, NULL, GetContext());
prop->SetCurrentPage(0);
if (prop->Create(this, WS_SYSMENU | WS_POPUP | WS_CAPTION | WS_VISIBLE,
WS_EX_DLGMODALFRAME)) {
m_userPropList.Add (prop);
}
}
else {
CABMLDialog* dialog;
dialog = new CABMLDialog (GetCurrentDirectoryServer(),
this, entryID, GetContext());
if (dialog->Create(this)) {
dialog->ShowWindow(SW_SHOW);
m_listPropList.Add (dialog);
}
}
}
}
#endif
}
void CAddrFrame::OnCall()
{
ABID type;
ABID entryID;
CString ipAddress;
CString emailAddress;
short useServer = 0;
char szCommandLine[_MAX_PATH];
// check the entry type and add/remove pages
entryID = AB_GetEntryIDAt((AddressPane*)m_addrBookPane, m_pOutliner->GetFocusLine());
AB_GetType(GetCurrentDirectoryServer(), theApp.m_pABook,
entryID, &type);
if (type != ABTypePerson) {
CString s;
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
MessageBox(XP_GetString (MK_MSG_CANT_CALL_MAILING_LIST), s, MB_OK | MB_APPLMODAL);
return;
}
// check that info exists for this person
AB_GetCoolAddress (GetCurrentDirectoryServer(),
theApp.m_pABook, entryID, ipAddress.GetBuffer(kMaxCoolAddress));
ipAddress.ReleaseBuffer(-1);
AB_GetEmailAddress (GetCurrentDirectoryServer(),
theApp.m_pABook, entryID, emailAddress.GetBuffer(kMaxEmailAddressLength));
emailAddress.ReleaseBuffer(-1);
AB_GetUseServer (GetCurrentDirectoryServer(),
theApp.m_pABook, entryID, &useServer);
if ((useServer == kSpecificDLS || useServer == kHostOrIPAddress) && !ipAddress.GetLength()) {
CString s;
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
MessageBox(XP_GetString (MK_MSG_CALL_NEEDS_IPADDRESS), s, MB_OK | MB_APPLMODAL);
OnItemProperties();
return;
}
if ((useServer == kSpecificDLS || useServer == kDefaultDLS) && !emailAddress.GetLength()) {
CString s;
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
MessageBox(XP_GetString (MK_MSG_CALL_NEEDS_EMAILADDRESS), s, MB_OK | MB_APPLMODAL);
OnItemProperties();
return;
}
strcpy (szCommandLine, "");
if (useServer == 0)
{
CString emailFlag = FEU_GetConfAppProfileString(IDS_CONFAPP_EMAIL);
if (!emailFlag.IsEmpty())
{
strcat(szCommandLine, emailFlag);
strcat(szCommandLine, " ");
strcat(szCommandLine, emailAddress);
}
}
else {
if (useServer == 1)
{
CString emailFlag = FEU_GetConfAppProfileString(IDS_CONFAPP_EMAIL);
if (!emailFlag.IsEmpty())
{
strcat(szCommandLine, emailFlag);
strcat(szCommandLine, " ");
strcat(szCommandLine, emailAddress);
strcat(szCommandLine, " ");
}
CString serverFlag = FEU_GetConfAppProfileString(IDS_CONFAPP_SERVER);
if (!serverFlag.IsEmpty())
{
strcat(szCommandLine, serverFlag);
strcat(szCommandLine, " ");
strcat(szCommandLine, ipAddress);
}
}
else {
CString directFlag = FEU_GetConfAppProfileString(IDS_CONFAPP_DIRECTIP);
if (!directFlag.IsEmpty())
{
strcat(szCommandLine, directFlag);
strcat(szCommandLine, " ");
strcat(szCommandLine, ipAddress);
}
}
}
//
// Something a bit new...this will be here for passing a users name at the
// end of a command line.
//
CString userNameFlag = FEU_GetConfAppProfileString(IDS_CONFAPP_USERNAME);
if (!userNameFlag.IsEmpty())
{
CString szFullUserName;
AB_GetFullName (GetCurrentDirectoryServer(),
theApp.m_pABook, entryID, szFullUserName.GetBuffer(kMaxFullNameLength));
strcat(szCommandLine, " ");
strcat(szCommandLine, userNameFlag);
strcat(szCommandLine, " ");
strcat(szCommandLine, szFullUserName);
}
//
//RHP - Launch conference app
//
LaunchConfEndpoint(szCommandLine, GetSafeHwnd());
}
void CAddrFrame::OnSortName()
{
m_pOutlinerParent->ColumnCommand ( ID_COLADDR_NAME );
}
void CAddrFrame::OnSortType()
{
m_pOutlinerParent->ColumnCommand ( ID_COLADDR_TYPE );
}
void CAddrFrame::OnSortNickName()
{
m_pOutlinerParent->ColumnCommand ( ID_COLADDR_NICKNAME );
}
void CAddrFrame::OnSortEmailAddress()
{
m_pOutlinerParent->ColumnCommand ( ID_COLADDR_EMAIL );
}
void CAddrFrame::OnSortCompany()
{
m_pOutlinerParent->ColumnCommand ( ID_COLADDR_COMPANY );
}
void CAddrFrame::OnSortLocality()
{
m_pOutlinerParent->ColumnCommand ( ID_COLADDR_LOCALITY );
}
void CAddrFrame::OnSortAscending()
{
m_pOutlinerParent->ColumnCommand ( m_pOutliner->GetSortBy() );
}
void CAddrFrame::OnSortDescending()
{
m_pOutlinerParent->ColumnCommand ( m_pOutliner->GetSortBy() );
}
void CAddrFrame::HandleErrorReturn(int XPErrorId, CWnd* parent, int errorid)
{
if (errorid) {
CString s;
HWND parentWnd = NULL;
if (parent)
parentWnd = parent->m_hWnd;
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES )) {
if (XPErrorId)
::MessageBox(parentWnd, XP_GetString(XPErrorId), s, MB_OK | MB_APPLMODAL);
else {
CString s2;
s2.LoadString (errorid);
::MessageBox(parentWnd, s2, s, MB_OK | MB_APPLMODAL);
}
}
}
}
void CAddrFrame::OnSave()
{
}
void CAddrFrame::OnChangeDirectory (int dirIndex)
{
m_pDirOutliner->SetDirectoryIndex(dirIndex);
}
void CAddrFrame::OnShowWindow( BOOL bShow, UINT nStatus )
{
CFrameWnd::OnShowWindow (bShow, nStatus);
if (bShow && (nStatus == 0)) {
m_pOutliner->SetDirectoryIndex(0);
m_pDirOutliner->SetDirectoryIndex(0);
}
}
void CAddrFrame::OnUpdateDirectorySelection (int dirIndex)
{
// the user has selected a different directory in the left pane
m_barAddr.SetDirectoryIndex(dirIndex);
m_pOutliner->SetDirectoryIndex(dirIndex);
HandleErrorReturn(AB_ChangeDirectory(m_addrBookPane, GetCurrentDirectoryServer()), this);
}
void CAddrFrame::OnStopSearch ()
{
CWnd* widget = m_barAddr.GetDlgItem(IDC_DIRECTORIES);
CWnd* widget2 = m_barAddr.GetDlgItem (IDC_DIRSEARCH);
// We've turned into stop button
HandleErrorReturn(AB_FinishSearch(m_addrBookPane, GetContext()), this);
m_bSearching = FALSE;
GetChrome()->StopAnimation();
widget->EnableWindow(TRUE);
widget2->EnableWindow(TRUE);
m_pDirOutliner->EnableWindow(TRUE);
MSG_ViewIndex *indices = NULL;
int count = 0;
m_pOutliner->GetSelection(indices, count);
if (!count)
m_pOutliner->SelectItem (0);
return;
}
void CAddrFrame::OnExtendedDirectorySearch ()
{
CWnd* widget = m_barAddr.GetDlgItem(IDC_DIRECTORIES);
CWnd* widget2 = m_barAddr.GetDlgItem (IDC_DIRSEARCH);
if (m_bSearching) {
OnStopSearch();
return;
}
CUIntArray buttonLabels;
buttonLabels.SetSize (4, 1);
buttonLabels [0] = IDS_ADRSEARCH;
buttonLabels [1] = IDS_CANCEL_BUTTON;
buttonLabels [2] = IDS_HELP_BUTTON;
buttonLabels [3] = IDS_ADVSEARCH;
CSearchDialog searchDlg ((UINT) IDS_ADRSEARCH,
(MSG_Pane*) m_addrBookPane,
GetCurrentDirectoryServer(),
this, 4, BUTTON_RIGHT, &buttonLabels);
int result = searchDlg.DoModal();
// Build Search
if (result == IDOK)
{
GetChrome()->StartAnimation();
LPNSSTATUSBAR pIStatusBar = NULL;
m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->SetStatusText(szLoadString( IDS_SEARCHING ));
pIStatusBar->Release();
}
m_barAddr.GetDlgItem(IDC_ADDRNAME)->SetWindowText("");
m_bSearching = TRUE;
widget->EnableWindow(FALSE);
widget2->EnableWindow(FALSE);
m_pOutliner->SetTotalLines(0);
m_pOutliner->SetFocus();
m_pOutliner->SetFocusLine(0);
m_pDirOutliner->EnableWindow(FALSE);
HandleErrorReturn(AB_SearchDirectory(m_addrBookPane, NULL), this);
}
}
void CAddrFrame::OnDirectoryList (char * name)
{
CWnd* widget;
CWnd* widget2;
CString cs;
widget = m_barAddr.GetDlgItem(IDC_DIRECTORIES);
widget2 = m_barAddr.GetDlgItem(IDC_DIRSEARCH);
// Build Search
GetChrome()->StartAnimation();
LPNSSTATUSBAR pIStatusBar = NULL;
m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
if ( pIStatusBar ) {
pIStatusBar->SetStatusText(szLoadString( IDS_SEARCHING ));
pIStatusBar->Release();
}
m_bSearching = TRUE;
widget->EnableWindow(FALSE);
widget2->EnableWindow(FALSE);
m_pDirOutliner->EnableWindow(FALSE);
HandleErrorReturn(AB_SearchDirectory(m_addrBookPane, name), this);
m_pOutliner->UpdateCount();
}
//////////////////////////////////////////////////////////////////////////////
// CAddrOutliner
BEGIN_MESSAGE_MAP(CAddrOutliner, CMSelectOutliner)
//{{AFX_MSG_MAP(CAddrOutliner)
ON_WM_KEYDOWN()
ON_WM_TIMER()
ON_WM_KILLFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CAddrOutliner::CAddrOutliner ( )
{
int32 prefInt;
PREF_GetIntPref("mail.addr_book.sortby",&prefInt);
if (prefInt != ID_COLADDR_NAME && prefInt != ID_COLADDR_EMAIL
&& prefInt != ID_COLADDR_NICKNAME)
prefInt = ID_COLADDR_NAME;
m_attribSortBy = CASTINT(prefInt);
ApiApiPtr(api);
m_pUnkUserImage = api->CreateClassInstance(APICLASS_IMAGEMAP);
if (m_pUnkUserImage) {
m_pUnkUserImage->QueryInterface(IID_IImageMap,(LPVOID*)&m_pIUserImage);
ASSERT(m_pIUserImage);
m_pIUserImage->Initialize(IDB_ADDRESSBOOK,16,16);
}
XP_Bool prefBool;
PREF_GetBoolPref("mail.addr_book.sort_ascending",&prefBool);
m_bSortAscending = prefBool;
m_iMysticPlane = 0;
m_dirIndex = 0;
m_hFont = NULL;
m_psTypedown = "";
m_uTypedownClock = 0;
}
CAddrOutliner::~CAddrOutliner ( )
{
if (m_pUnkUserImage) {
if (m_pIUserImage)
m_pUnkUserImage->Release();
}
if (m_hFont) {
theApp.ReleaseAppFont(m_hFont);
}
}
void CAddrOutliner::OnKillFocus( CWnd* pNewWnd )
{
CMSelectOutliner::OnKillFocus (pNewWnd );
m_psTypedown = "";
KillTimer(m_uTypedownClock);
}
void CAddrOutliner::OnTypedown (char* name)
{
MSG_ViewIndex index;
int startIndex;
if (GetFocusLine() != -1)
startIndex = GetFocusLine();
else
startIndex = 0;
AB_GetIndexMatchingTypedown(m_pane, &index,
(LPCTSTR) name, startIndex);
ScrollIntoView(CASTINT(index));
SelectItem (CASTINT(index));
}
HFONT CAddrOutliner::GetLineFont(void *pLineData)
{
if (!m_hFont)
{
HDC hDC = ::GetDC(m_hWnd);
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lf.lfPitchAndFamily = FF_SWISS;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = IntlGetLfCharset(CIntlWin::GetSystemLocaleCsid());
if (CIntlWin::GetSystemLocaleCsid() == CS_LATIN1)
_tcscpy(lf.lfFaceName, "MS Sans Serif");
else
_tcscpy(lf.lfFaceName, IntlGetUIPropFaceName(CIntlWin::GetSystemLocaleCsid()));
lf.lfHeight = -MulDiv(9, ::GetDeviceCaps(hDC, LOGPIXELSY), 72);
m_hFont = theApp.CreateAppFont( lf );
::ReleaseDC(m_hWnd,hDC);
}
return m_hFont;
}
DIR_Server* CAddrOutliner::GetCurrentDirectoryServer ()
{
return (DIR_Server*)XP_ListGetObjectNum(theApp.m_directories, m_dirIndex + 1);
}
void CAddrOutliner::SetDirectoryIndex (int dirIndex)
{
m_dirIndex = dirIndex;
DIR_Server* pServer = GetCurrentDirectoryServer ();
int iCount = GetNumColumns();
for (int i = 0; i < iCount; i++) {
CString cs;
int iColumn = GetColumnAtPos(i);
if (pServer->dirType == LDAPDirectory)
{
DIR_AttributeId id;
const char *text = NULL;
switch (iColumn) {
case ID_COLADDR_TYPE:
text = NULL;
break;
case ID_COLADDR_NAME:
MSG_SearchAttribToDirAttrib(attribCommonName, &id);
text = DIR_GetAttributeName(pServer, id);
break;
case ID_COLADDR_EMAIL:
MSG_SearchAttribToDirAttrib(attrib822Address, &id);
text = DIR_GetAttributeName(pServer, id);
break;
case ID_COLADDR_COMPANY:
MSG_SearchAttribToDirAttrib(attribOrganization, &id);
text = DIR_GetAttributeName(pServer, id);
break;
case ID_COLADDR_LOCALITY:
MSG_SearchAttribToDirAttrib(attribLocality, &id);
text = DIR_GetAttributeName(pServer, id);
break;
case ID_COLADDR_PHONE:
MSG_SearchAttribToDirAttrib(attribPhoneNumber, &id);
text = DIR_GetAttributeName(pServer, id);
break;
case ID_COLADDR_NICKNAME:
text = NULL;
break;
default:
break;
}
if (text)
SetColumnName(iColumn, text);
}
else
{
switch (iColumn) {
case ID_COLADDR_TYPE:
cs = "";
break;
case ID_COLADDR_NAME:
cs.LoadString(IDS_USERNAME);
break;
case ID_COLADDR_EMAIL:
cs.LoadString(IDS_EMAILADDRESS);
break;
case ID_COLADDR_COMPANY:
cs.LoadString(IDS_COMPANYNAME);
break;
case ID_COLADDR_PHONE:
cs.LoadString(IDS_PHONE);
break;
case ID_COLADDR_LOCALITY:
cs.LoadString(IDS_LOCALITY);
break;
case ID_COLADDR_NICKNAME:
cs.LoadString(IDS_NICKNAME);
break;
default:
break;
}
if (cs.GetLength())
SetColumnName(iColumn, cs);
}
}
GetParent()->Invalidate();
GetParent()->UpdateWindow();
ClearSelection();
SelectItem(dirIndex);
}
void CAddrOutliner::UpdateCount( )
{
uint32 count;
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
m_iTotalLines = CASTINT(count);
if (!m_iTotalLines)
ClearSelection();
}
BOOL CAddrOutliner::DeleteItem ( int iLine )
{
XP_Bool bSelectable, bPlural;
MSG_ViewIndex indices[1];
indices[0] = (MSG_ViewIndex) iLine;
MSG_COMMAND_CHECK_STATE sState;
AB_CommandStatus( m_pane,
AB_DeleteCmd,
indices, 1,
&bSelectable,
&sState,
NULL,
&bPlural);
if (bSelectable) {
AB_Command ( m_pane, AB_DeleteCmd, indices, 1 );
return TRUE;
}
else
MessageBeep(0);
return FALSE;
}
void CAddrOutliner::SetPane(ABPane *pane)
{
m_pane = pane;
uint32 count;
if (m_pane) {
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
SetTotalLines(CASTINT(count));
Invalidate();
UpdateWindow();
}
}
void CAddrOutliner::MysticStuffStarting( XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num )
{
++m_iMysticPlane;
}
void CAddrOutliner::MysticStuffFinishing( XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num )
{
switch ( notify ) {
case MSG_NotifyNone:
break;
case MSG_NotifyInsertOrDelete:
// if its insert or delete then tell my frame to add the next chunk of values
// from the search
if (notify == MSG_NotifyInsertOrDelete
&& ((CAddrFrame*) GetParentFrame())->IsSearching() && num > 0)
{
((CAddrFrame*) GetParentFrame())->SetSearchResults(where, num);
HandleInsert(where, num);
// Invalidate();
}
else
{
if (num > 0)
HandleInsert(where, num);
else
HandleDelete(where, -num);
}
break;
case MSG_NotifyChanged:
InvalidateLines( (int) where, (int) num );
break;
case MSG_NotifyAll:
case MSG_NotifyScramble:
Invalidate();
break;
}
if (( !--m_iMysticPlane && m_pane)) {
uint32 count;
AB_GetEntryCount(GetCurrentDirectoryServer (), theApp.m_pABook, &count, ABTypeAll, NULL);
SetTotalLines(CASTINT(count));
Invalidate();
UpdateWindow();
}
}
void CAddrOutliner::PropertyMenu ( int iSel, UINT flags )
{
BOOL bHasItems = FALSE;
CMenu cmPopup;
CString cs;
if(cmPopup.CreatePopupMenu() == 0)
return;
if (iSel < m_iTotalLines) {
cs.LoadString(ID_POPUP_MAILNEW);
cmPopup.AppendMenu(MF_ENABLED, ID_FILE_NEWMESSAGE, cs);
cmPopup.AppendMenu(MF_SEPARATOR);
cs.LoadString(IDS_AB_NEW_USER);
cmPopup.AppendMenu(MF_ENABLED, ID_ITEM_ADDUSER, cs);
cs.LoadString(IDS_AB_NEW_LIST);
cmPopup.AppendMenu(MF_ENABLED, ID_ITEM_ADDLIST, cs);
cmPopup.AppendMenu(MF_SEPARATOR);
cs.LoadString(IDS_COMPOSE_REMOVE);
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_DELETE, cs);
cmPopup.AppendMenu(MF_SEPARATOR);
cs.LoadString(IDS_AB_PROPERTIES);
cmPopup.AppendMenu(MF_ENABLED, ID_ITEM_PROPERTIES, cs);
bHasItems = TRUE;
}
// Track the popup now.
POINT pt = m_ptHit;
ClientToScreen(&pt);
cmPopup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y,
GetParentFrame(), NULL);
// Cleanup
cmPopup.DestroyMenu();
}
void CAddrOutliner::AcceptDrop( int iLineNo, COleDataObject *pDataObject,
DROPEFFECT dropEffect )
{
if(!pDataObject)
return;
// Dont allow us to drop on ourselves
if(pDataObject->IsDataAvailable(m_cfSourceTarget))
return;
if(!pDataObject->IsDataAvailable(m_cfAddresses) &&
!pDataObject->IsDataAvailable(CF_TEXT))
return;
if(pDataObject->IsDataAvailable(m_cfAddresses)) {
HGLOBAL hAddresses = pDataObject->GetGlobalData(m_cfAddresses);
LPSTR pAddresses = (LPSTR)GlobalLock(hAddresses);
ASSERT(pAddresses);
// Parse the vcards and add them to the address book
AB_ImportFromVcard((AddressPane*) m_pane, pAddresses);
GlobalUnlock(hAddresses);
}
else {
HGLOBAL hString = pDataObject->GetGlobalData(CF_TEXT);
char * pAddress = (char*)GlobalLock(hString);
ASSERT(pAddress);
// parse the vcard from the text
AB_ImportFromVcard((AddressPane*) m_pane, pAddress);
GlobalUnlock(hString);
}
}
void CAddrOutliner::InitializeClipFormats(void)
{
m_cfAddresses = (CLIPFORMAT)RegisterClipboardFormat(vCardClipboardFormat);
m_cfSourceTarget = (CLIPFORMAT)RegisterClipboardFormat(ADDRESSBOOK_SOURCETARGET_FORMAT);
}
CLIPFORMAT * CAddrOutliner::GetClipFormatList(void)
{
static CLIPFORMAT cfFormatList[3];
cfFormatList[0] = m_cfAddresses;
cfFormatList[1] = m_cfSourceTarget;
cfFormatList[2] = 0;
return cfFormatList;
}
COleDataSource * CAddrOutliner::GetDataSource(void)
{
COleDataSource * pDataSource = new COleDataSource;
ABID entryID;
char* pVcard = NULL;
char* pVcards = XP_STRDUP("");
char szTemp[10];
char szEntryID[20];
char* pEntryIDs = XP_STRDUP("");
HANDLE hString = 0;
MSG_ViewIndex *indices;
int count;
GetSelection(indices, count);
for (int i = 0 ; i < count; i++) {
if ((entryID = AB_GetEntryIDAt((AddressPane*) m_pane, indices[i])) != 0) {
AB_ExportToVCard(theApp.m_pABook,
GetCurrentDirectoryServer (), entryID, &pVcard);
pVcards = StrAllocCat(pVcards, pVcard);
XP_FREE(pVcard);
pVcard = NULL;
ltoa(entryID, szTemp, 10);
sprintf(szEntryID, "%s-", szTemp);
pEntryIDs = StrAllocCat(pEntryIDs, szEntryID);
}
}
if (pVcards) {
hString = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT,strlen(pVcards)+1);
LPSTR lpszString = (LPSTR)GlobalLock(hString);
strcpy(lpszString,pVcards);
XP_FREE (pVcards);
GlobalUnlock(hString);
HANDLE hEntryID = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT,strlen(pEntryIDs)+1);
LPSTR lpszEntryID = (LPSTR)GlobalLock(hEntryID);
strcpy(lpszEntryID,pEntryIDs);
XP_FREE (pEntryIDs);
GlobalUnlock(hEntryID);
pDataSource->CacheGlobalData(m_cfAddresses, hString);
pDataSource->CacheGlobalData(m_cfSourceTarget, hEntryID);
pDataSource->CacheGlobalData(CF_TEXT, hString);
}
return pDataSource;
}
BOOL CAddrOutliner::RenderData ( UINT iColumn, CRect &rect, CDC &dc, const char * text )
{
if ( iColumn != ID_COLADDR_TYPE )
return CMSelectOutliner::RenderData ( iColumn, rect, dc, text );
int idxImage;
if (m_EntryLine.entryType == ABTypeList)
idxImage = IDX_ADDRESSBOOKLIST;
else
idxImage = IDX_ADDRESSBOOKPERSON;
m_pIUserImage->DrawImage ( idxImage,
rect.left + ( ( rect.Width ( ) - 16 ) / 2 ), rect.top, &dc, FALSE );
return TRUE;
}
int CAddrOutliner::TranslateIcon ( void * pLineData )
{
AB_EntryLine* line = (AB_EntryLine*) pLineData;
int idxImage = 0;
if (line->entryType == ABTypeList)
idxImage = IDX_ADDRESSBOOKLIST;
else
idxImage = IDX_ADDRESSBOOKPERSON;
return idxImage;
}
int CAddrOutliner::TranslateIconFolder (void * pData)
{
// We're a flat list, so we're never a folder
return ( OUTLINER_ITEM );
}
BOOL CAddrOutliner::ColumnCommand ( int iColumn, int iLine )
{
// We have no column commands
return FALSE;
}
void * CAddrOutliner::AcquireLineData ( int line )
{
m_lineindex = line + 1;
if ( line >= m_iTotalLines)
return NULL;
if (!AB_GetEntryLine(m_pane, line, &m_EntryLine ))
return NULL;
return &m_EntryLine;
}
void CAddrOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
{
if ( pFlags ) *pFlags = 0; // Flags?
if ( pDepth ) *pDepth = 0; // We're flat, remember?
}
void CAddrOutliner::ReleaseLineData ( void * )
{
}
LPCTSTR CAddrOutliner::GetColumnText ( UINT iColumn, void * pLineData )
{
AB_EntryLine* line = (AB_EntryLine*) pLineData;
switch (iColumn) {
case ID_COLADDR_NAME:
return line->fullname;
break;
case ID_COLADDR_EMAIL:
return line->emailAddress;
break;
case ID_COLADDR_COMPANY:
return line->companyName;
break;
case ID_COLADDR_PHONE:
if (line->entryType == ABTypePerson)
return line->workPhone;
break;
case ID_COLADDR_LOCALITY:
return line->locality;
break;
case ID_COLADDR_NICKNAME:
return line->nickname;
break;
default:
break;
}
return ("");
}
void CAddrOutliner::OnSelChanged()
{
// No Op
}
void CAddrOutliner::OnSelDblClk()
{
GetParentFrame()->SendMessage(WM_COMMAND, ID_ITEM_PROPERTIES, 0);
}
void CAddrOutliner::OnTimer(UINT nID)
{
CMSelectOutliner::OnTimer(nID);
if (nID == OUTLINER_TYPEDOWN_TIMER) {
KillTimer(m_uTypedownClock);
m_psTypedown = "";
}
}
void CAddrOutliner::OnKeyDown ( UINT nChar, UINT nRepCnt, UINT nFlags )
{
CMSelectOutliner::OnKeyDown ( nChar, nRepCnt, nFlags );
KillTimer(m_uTypedownClock);
if (nChar > VK_HELP) {
KillTimer(m_uTypedownClock);
m_psTypedown += nChar;
OnTypedown (m_psTypedown.GetBuffer (0));
m_psTypedown.ReleaseBuffer(-1);
int32 prefInt = OUTLINER_TYPEDOWN_SPEED;
PREF_GetIntPref("ldap_1.autoComplete.interval", &prefInt);
m_uTypedownClock = SetTimer(OUTLINER_TYPEDOWN_TIMER, prefInt, NULL);
}
}
/////////////////////////////////////////////////////////////////////////////
// CAddrOutlinerParent
BEGIN_MESSAGE_MAP(CAddrOutlinerParent, COutlinerParent)
//{{AFX_MSG_MAP(CAddrOutlinerParent)
ON_WM_DESTROY()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CAddrOutlinerParent::CAddrOutlinerParent()
{
}
CAddrOutlinerParent::~CAddrOutlinerParent()
{
}
BOOL CAddrOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, const char * text )
{
int cx = 3, cy = 0;
CAddrOutliner *pOutliner = (CAddrOutliner *) m_pOutliner;
// Calculate text offset from top using font height.
TEXTMETRIC tm;
dc.GetTextMetrics ( &tm );
cy = ( rect.bottom - rect.top - tm.tmHeight ) / 2;
// Draw Text String
dc.TextOut (rect.left + cx, rect.top + cy, text, _tcslen(text) );
// Draw Sort Indicator
MSG_COMMAND_CHECK_STATE sortType = pOutliner->m_attribSortBy == idColumn ? MSG_Checked : MSG_Unchecked;
int idxImage = pOutliner->m_bSortAscending ? IDX_SORTINDICATORDOWN : IDX_SORTINDICATORUP;
CSize cs = dc.GetTextExtent(text, _tcslen(text));
if (idColumn == pOutliner->m_attribSortBy && cs.cx + 22 <= rect.Width()) {
m_pIImage->DrawTransImage( idxImage,
rect.left + 8 + cs.cx,
(rect.top + rect.bottom) / 2 - 4,
&dc );
}
return TRUE;
}
COutliner * CAddrOutlinerParent::GetOutliner ( void )
{
return new CAddrOutliner;
}
void CAddrOutlinerParent::CreateColumns ( void )
{
int iCol0 = 0,
iCol1 = 0,
iCol2 = 0,
iCol3 = 0,
iCol4 = 0,
iCol5 = 0;
CString cs;
m_pOutliner->AddColumn ("", ID_COLADDR_TYPE, 24, 0, ColumnFixed, 0, TRUE );
cs.LoadString(IDS_USERNAME);
m_pOutliner->AddColumn (cs, ID_COLADDR_NAME, 1500, 0, ColumnVariable, iCol0 ? iCol0 : 1500 );
cs.LoadString(IDS_EMAILADDRESS);
m_pOutliner->AddColumn (cs, ID_COLADDR_EMAIL, 1500, 0, ColumnVariable, iCol2 ? iCol2 : 1500 );
cs.LoadString(IDS_COMPANYNAME);
m_pOutliner->AddColumn (cs, ID_COLADDR_COMPANY, 1500, 0, ColumnVariable, iCol5 ? iCol5 : 1500 );
cs.LoadString(IDS_PHONE);
m_pOutliner->AddColumn (cs, ID_COLADDR_PHONE, 1500, 0, ColumnVariable, iCol4 ? iCol4 : 1500, FALSE);
cs.LoadString(IDS_LOCALITY);
m_pOutliner->AddColumn (cs, ID_COLADDR_LOCALITY, 1500, 0, ColumnVariable, iCol4 ? iCol4 : 1500 );
cs.LoadString(IDS_NICKNAME);
m_pOutliner->AddColumn (cs, ID_COLADDR_NICKNAME, 1500, 0, ColumnVariable, iCol3 ? iCol3 : 1500 );
m_pOutliner->SetHasPipes( FALSE );
m_pOutliner->SetVisibleColumns(DEF_VISIBLE_COLUMNS);
m_pOutliner->LoadXPPrefs("mailnews.abook_columns_win");
}
void CAddrOutlinerParent::OnDestroy()
{
int32 prefInt = ((CAddrOutliner*)m_pOutliner)->GetSortBy();
if (prefInt != ID_COLADDR_NAME && prefInt != ID_COLADDR_EMAIL
&& prefInt != ID_COLADDR_NICKNAME)
prefInt = ID_COLADDR_NAME;
PREF_SetIntPref("mail.addr_book.sortby", prefInt);
PREF_SetBoolPref("mail.addr_book.sort_ascending",((CAddrOutliner*)m_pOutliner)->GetSortAscending());
COutlinerParent::OnDestroy();
}
void CAddrOutlinerParent::OnLButtonUp( UINT nFlags, CPoint point )
{
BOOL bSaveColumns = (m_pOutliner &&
(m_bResizeColumn || m_bDraggingHeader || m_iPusherHit))? TRUE : FALSE;
COutlinerParent::OnLButtonUp(nFlags, point);
if (bSaveColumns)
m_pOutliner->SaveXPPrefs("mailnews.abook_columns_win");
}
BOOL CAddrOutlinerParent::ColumnCommand ( int idColumn )
{
ABID lastSelection;
CAddrOutliner *pOutliner = (CAddrOutliner *) m_pOutliner;
if (pOutliner->GetFocusLine() != -1)
lastSelection = AB_GetEntryIDAt((AddressPane*) pOutliner->GetPane(), pOutliner->GetFocusLine());
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
if (idColumn == pOutliner->m_attribSortBy) {
pOutliner->m_bSortAscending = !pOutliner->m_bSortAscending;
}
else
pOutliner->m_bSortAscending = TRUE;
pOutliner->m_attribSortBy = idColumn;
switch (idColumn) {
case ID_COLADDR_TYPE:
AB_Command(pOutliner->GetPane(), AB_SortByTypeCmd, 0, 0);
break;
case ID_COLADDR_NAME:
AB_Command(pOutliner->GetPane(), AB_SortByFullNameCmd, 0, 0);
break;
case ID_COLADDR_NICKNAME:
AB_Command(pOutliner->GetPane(), AB_SortByNickname, 0, 0);
break;
case ID_COLADDR_LOCALITY:
AB_Command(pOutliner->GetPane(), AB_SortByLocality, 0, 0);
break;
case ID_COLADDR_COMPANY:
AB_Command(pOutliner->GetPane(), AB_SortByCompanyName, 0, 0);
break;
case ID_COLADDR_EMAIL:
AB_Command(pOutliner->GetPane(), AB_SortByEmailAddress, 0, 0);
break;
default:
AB_Command(pOutliner->GetPane(), AB_SortByFullNameCmd, 0, 0);
break;
}
if (pOutliner->GetFocusLine() != -1) {
uint32 index = AB_GetIndexOfEntryID ((AddressPane *) pOutliner->GetPane(), lastSelection);
pOutliner->SelectItem (CASTINT(index));
pOutliner->ScrollIntoView(CASTINT(index));
}
Invalidate();
pOutliner->Invalidate();
SetCursor ( theApp.LoadStandardCursor ( IDC_ARROW ) );
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
// CAddrOutliner
BEGIN_MESSAGE_MAP(CDirOutliner, CMSelectOutliner)
//{{AFX_MSG_MAP(CDirOutliner)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CDirOutliner::CDirOutliner ( )
{
m_attribSortBy = 0;
ApiApiPtr(api);
m_pUnkUserImage = api->CreateClassInstance(APICLASS_IMAGEMAP);
if (m_pUnkUserImage) {
m_pUnkUserImage->QueryInterface(IID_IImageMap,(LPVOID*)&m_pIUserImage);
ASSERT(m_pIUserImage);
m_pIUserImage->Initialize(IDB_DIRLIST,16,16);
}
m_attribSortBy = 1;
m_bSortAscending = TRUE;
m_iMysticPlane = 0;
m_dirIndex = 0;
m_hFont = NULL;
m_pDirLine = NULL;
}
CDirOutliner::~CDirOutliner ( )
{
if (m_pUnkUserImage) {
if (m_pIUserImage)
m_pUnkUserImage->Release();
}
if (m_hFont) {
theApp.ReleaseAppFont(m_hFont);
}
}
HFONT CDirOutliner::GetLineFont(void *pLineData)
{
if (!m_hFont)
{
HDC hDC = ::GetDC(m_hWnd);
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lf.lfPitchAndFamily = FF_SWISS;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = IntlGetLfCharset(CIntlWin::GetSystemLocaleCsid());
if (CIntlWin::GetSystemLocaleCsid() == CS_LATIN1)
_tcscpy(lf.lfFaceName, "MS Sans Serif");
else
_tcscpy(lf.lfFaceName, IntlGetUIPropFaceName(CIntlWin::GetSystemLocaleCsid()));
lf.lfHeight = -MulDiv(9, ::GetDeviceCaps(hDC, LOGPIXELSY), 72);
m_hFont = theApp.CreateAppFont( lf );
::ReleaseDC(m_hWnd,hDC);
}
return m_hFont;
}
void CDirOutliner::SetDirectoryIndex (int dirIndex)
{
m_dirIndex = dirIndex;
SelectItem (CASTINT(m_dirIndex));
}
void CDirOutliner::UpdateCount( )
{
m_iTotalLines = XP_ListCount (theApp.m_directories);
if (!m_iTotalLines)
ClearSelection();
Invalidate();
UpdateWindow();
}
BOOL CDirOutliner::DeleteItem ( int iLine )
{
MSG_ViewIndex indices[1];
indices[0] = (MSG_ViewIndex) iLine;
MessageBeep(0);
return TRUE;
}
void CDirOutliner::SetPane(ABPane *pane)
{
m_pane = pane;
if (m_pane) {
SetTotalLines(XP_ListCount (theApp.m_directories));
Invalidate();
UpdateWindow();
}
}
void CDirOutliner::MysticStuffStarting( XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num )
{
++m_iMysticPlane;
}
void CDirOutliner::MysticStuffFinishing( XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num )
{
switch ( notify ) {
case MSG_NotifyNone:
break;
case MSG_NotifyInsertOrDelete:
if (num > 0)
HandleInsert(where, num);
else
HandleDelete(where, -num);
break;
case MSG_NotifyChanged:
InvalidateLines( (int) where, (int) num );
break;
case MSG_NotifyAll:
case MSG_NotifyScramble:
Invalidate();
break;
}
if (( !--m_iMysticPlane && m_pane)) {
SetTotalLines(XP_ListCount (theApp.m_directories));
Invalidate();
UpdateWindow();
}
}
void CDirOutliner::PropertyMenu ( int iSel, UINT flags )
{
BOOL bHasItems = FALSE;
CMenu cmPopup;
CString cs;
if(cmPopup.CreatePopupMenu() == 0)
return;
if (iSel < m_iTotalLines) {
cs.LoadString(IDS_AB_NEW_USER);
cmPopup.AppendMenu(MF_ENABLED, ID_ITEM_ADDUSER, cs);
cs.LoadString(IDS_AB_NEW_LIST);
cmPopup.AppendMenu(MF_ENABLED, ID_ITEM_ADDLIST, cs);
cmPopup.AppendMenu(MF_SEPARATOR);
cs.LoadString(IDS_COMPOSE_REMOVE);
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_DELETE, cs);
cmPopup.AppendMenu(MF_SEPARATOR);
cs.LoadString(IDS_AB_PROPERTIES);
cmPopup.AppendMenu(MF_ENABLED, ID_ITEM_PROPERTIES, cs);
bHasItems = TRUE;
}
// Track the popup now.
POINT pt = m_ptHit;
ClientToScreen(&pt);
cmPopup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y,
GetParentFrame(), NULL);
// Cleanup
cmPopup.DestroyMenu();
}
void CDirOutliner::AcceptDrop( int iLineNo, COleDataObject *pDataObject,
DROPEFFECT dropEffect )
{
if(!pDataObject)
return;
// Dont allow us to drop on ourselves
if(pDataObject->IsDataAvailable(m_cfSourceTarget))
return;
if(!pDataObject->IsDataAvailable(m_cfAddresses) &&
!pDataObject->IsDataAvailable(CF_TEXT))
return;
if(pDataObject->IsDataAvailable(m_cfAddresses)) {
HGLOBAL hAddresses = pDataObject->GetGlobalData(m_cfAddresses);
LPSTR pAddresses = (LPSTR)GlobalLock(hAddresses);
ASSERT(pAddresses);
// Parse the vcards and add them to the address book
// AB_ImportFromVcard((AddressPane*) m_pane, pAddresses);
GlobalUnlock(hAddresses);
}
else {
HGLOBAL hString = pDataObject->GetGlobalData(CF_TEXT);
char * pAddress = (char*)GlobalLock(hString);
ASSERT(pAddress);
// parse the vcard from the text
// AB_ImportFromVcard((AddressPane*) m_pane, pAddress);
GlobalUnlock(hString);
}
}
void CDirOutliner::InitializeClipFormats(void)
{
m_cfAddresses = (CLIPFORMAT)RegisterClipboardFormat(vCardClipboardFormat);
m_cfSourceTarget = (CLIPFORMAT)RegisterClipboardFormat(ADDRESSBOOK_SOURCETARGET_FORMAT);
}
CLIPFORMAT * CDirOutliner::GetClipFormatList(void)
{
static CLIPFORMAT cfFormatList[3];
cfFormatList[0] = m_cfAddresses;
cfFormatList[1] = m_cfSourceTarget;
cfFormatList[2] = 0;
return cfFormatList;
}
COleDataSource * CDirOutliner::GetDataSource(void)
{
COleDataSource * pDataSource = new COleDataSource;
MSG_ViewIndex *indices;
int count;
/*
ABID entryID;
char* pVcard = NULL;
char* pVcards = XP_STRDUP("");
char szTemp[10];
char szEntryID[20];
char* pEntryIDs = XP_STRDUP("");
HANDLE hString = 0;
*/
GetSelection(indices, count);
/* for (int i = 0 ; i < count; i++) {
if ((entryID = AB_GetEntryIDAt((AddressPane*) m_pane, indices[i])) != 0) {
AB_ExportToVCard(theApp.m_pABook,
(DIR_Server*)XP_ListGetObjectNum(theApp.m_directories, m_dirIndex + 1), entryID, &pVcard);
pVcards = StrAllocCat(pVcards, pVcard);
XP_FREE(pVcard);
pVcard = NULL;
ltoa(entryID, szTemp, 10);
sprintf(szEntryID, "%s-", szTemp);
pEntryIDs = StrAllocCat(pEntryIDs, szEntryID);
}
}
if (pVcards) {
hString = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT,strlen(pVcards)+1);
LPSTR lpszString = (LPSTR)GlobalLock(hString);
strcpy(lpszString,pVcards);
XP_FREE (pVcards);
GlobalUnlock(hString);
HANDLE hEntryID = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT,strlen(pEntryIDs)+1);
LPSTR lpszEntryID = (LPSTR)GlobalLock(hEntryID);
strcpy(lpszEntryID,pEntryIDs);
XP_FREE (pEntryIDs);
GlobalUnlock(hEntryID);
pDataSource->CacheGlobalData(m_cfAddresses, hString);
pDataSource->CacheGlobalData(m_cfSourceTarget, hEntryID);
pDataSource->CacheGlobalData(CF_TEXT, hString);
} */
return pDataSource;
}
BOOL CDirOutliner::RenderData ( UINT iColumn, CRect &rect, CDC &dc, const char * text )
{
if ( iColumn != ID_COLDIR_TYPE )
return CMSelectOutliner::RenderData ( iColumn, rect, dc, text );
int idxImage;
if (m_pDirLine->dirType == LDAPDirectory)
idxImage = IDX_DIRLDAPAB;
else
idxImage = IDX_DIRPERSONALAB;
m_pIUserImage->DrawImage ( idxImage,
rect.left + ( ( rect.Width ( ) - 16 ) / 2 ), rect.top, &dc, FALSE );
return TRUE;
}
int CDirOutliner::TranslateIcon ( void * pLineData )
{
DIR_Server* line = (DIR_Server*) pLineData;
int idxImage = 0;
if (m_pDirLine->dirType == ABTypeList)
idxImage = IDX_DIRLDAPAB;
else
idxImage = IDX_DIRPERSONALAB;
return idxImage;
}
int CDirOutliner::TranslateIconFolder (void * pData)
{
// We're a flat list, so we're never a folder
return ( OUTLINER_ITEM );
}
BOOL CDirOutliner::ColumnCommand ( int iColumn, int iLine )
{
// We have no column commands
return FALSE;
}
void * CDirOutliner::AcquireLineData ( int line )
{
m_lineindex = line + 1;
if ( line >= m_iTotalLines)
return NULL;
m_pDirLine = (DIR_Server*) XP_ListGetObjectNum(theApp.m_directories, line + 1);
return m_pDirLine;
}
void CDirOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
{
if ( pFlags ) *pFlags = 0; // Flags?
if ( pDepth ) *pDepth = 0; // We're flat, remember?
}
void CDirOutliner::ReleaseLineData ( void * )
{
}
LPCTSTR CDirOutliner::GetColumnText ( UINT iColumn, void * pLineData )
{
DIR_Server* line = (DIR_Server*) pLineData;
switch (iColumn) {
case ID_COLDIR_NAME:
return line->description;
break;
default:
break;
}
return ("");
}
void CDirOutliner::OnSelChanged()
{
MSG_ViewIndex *indices;
int count;
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
if (frame->IsSearching())
return;
GetSelection(indices, count);
if (count == 1) {
frame->OnUpdateDirectorySelection(indices[0]);
}
}
void CDirOutliner::OnSelDblClk()
{
GetParentFrame()->SendMessage(WM_COMMAND, ID_ITEM_PROPERTIES, 0);
}
/////////////////////////////////////////////////////////////////////////////
// CAddrOutlinerParent
BEGIN_MESSAGE_MAP(CDirOutlinerParent, COutlinerParent)
//{{AFX_MSG_MAP(CDirOutlinerParent)
ON_WM_DESTROY()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CDirOutlinerParent::CDirOutlinerParent()
{
}
CDirOutlinerParent::~CDirOutlinerParent()
{
}
BOOL CDirOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, const char * text )
{
int cx = 3, cy = 0;
CDirOutliner *pOutliner = (CDirOutliner *) m_pOutliner;
// Calculate text offset from top using font height.
TEXTMETRIC tm;
dc.GetTextMetrics ( &tm );
cy = ( rect.bottom - rect.top - tm.tmHeight ) / 2;
// Draw Text String
dc.TextOut (rect.left + cx, rect.top + cy, text, _tcslen(text) );
// Draw Sort Indicator
MSG_COMMAND_CHECK_STATE sortType = pOutliner->m_attribSortBy == idColumn ? MSG_Checked : MSG_Unchecked;
int idxImage = pOutliner->m_bSortAscending ? IDX_SORTINDICATORDOWN : IDX_SORTINDICATORUP;
CSize cs = dc.GetTextExtent(text, _tcslen(text));
if (idColumn == pOutliner->m_attribSortBy && cs.cx + 22 <= rect.Width()) {
m_pIImage->DrawTransImage( idxImage,
rect.left + 8 + cs.cx,
(rect.top + rect.bottom) / 2 - 4,
&dc );
}
return TRUE;
}
COutliner * CDirOutlinerParent::GetOutliner ( void )
{
return new CDirOutliner;
}
void CDirOutlinerParent::CreateColumns ( void )
{
int iCol0 = 0,
iCol1 = 0;
CString cs;
m_pOutliner->AddColumn ("", ID_COLDIR_TYPE, 24, 0, ColumnFixed, 0, TRUE );
cs.LoadString(IDS_USERNAME);
m_pOutliner->AddColumn (cs, ID_COLDIR_NAME, 1500, 0, ColumnVariable, iCol0 ? iCol0 : 1500 );
m_pOutliner->SetHasPipes( FALSE );
m_pOutliner->SetVisibleColumns(DEF_DIRVISIBLE_COLUMNS);
m_pOutliner->LoadXPPrefs("mailnews.abook_dir_columns_win");
}
void CDirOutlinerParent::OnDestroy()
{
int32 prefInt = ((CDirOutliner*)m_pOutliner)->GetSortBy();
COutlinerParent::OnDestroy();
}
void CDirOutlinerParent::OnLButtonUp( UINT nFlags, CPoint point )
{
BOOL bSaveColumns = (m_pOutliner &&
(m_bResizeColumn || m_bDraggingHeader || m_iPusherHit))? TRUE : FALSE;
COutlinerParent::OnLButtonUp(nFlags, point);
if (bSaveColumns)
m_pOutliner->SaveXPPrefs("mailnews.abook_dir_columns_win");
}
BOOL CDirOutlinerParent::ColumnCommand ( int idColumn )
{
ABID lastSelection;
// no sorting for right now
return TRUE;
CDirOutliner *pOutliner = (CDirOutliner *) m_pOutliner;
if (pOutliner->GetFocusLine() != -1)
lastSelection = AB_GetEntryIDAt((AddressPane*) pOutliner->GetPane(), pOutliner->GetFocusLine());
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
if (idColumn == pOutliner->m_attribSortBy) {
pOutliner->m_bSortAscending = !pOutliner->m_bSortAscending;
}
else
pOutliner->m_bSortAscending = TRUE;
pOutliner->m_attribSortBy = idColumn;
switch (idColumn) {
case ID_COLDIR_TYPE:
AB_Command(pOutliner->GetPane(), AB_SortByTypeCmd, 0, 0);
break;
case ID_COLDIR_NAME:
AB_Command(pOutliner->GetPane(), AB_SortByFullNameCmd, 0, 0);
break;
default:
AB_Command(pOutliner->GetPane(), AB_SortByFullNameCmd, 0, 0);
break;
}
if (pOutliner->GetFocusLine() != -1) {
uint32 index = AB_GetIndexOfEntryID ((AddressPane *) pOutliner->GetPane(), lastSelection);
pOutliner->SelectItem (CASTINT(index));
pOutliner->ScrollIntoView(CASTINT(index));
}
Invalidate();
pOutliner->Invalidate();
SetCursor ( theApp.LoadStandardCursor ( IDC_ARROW ) );
return TRUE;
}
void WFE_MSGOpenAB()
{
CAddrFrame::Open();
}
void CAddrFrame::UpdateMenu(HMENU hMenu, UINT &nID)
{
// *** If you change the way this menu is built, you also need to
// change CAddrFrame::FolderInfoFromMenuID
MSG_Master *pMaster = WFE_MSGGetMaster();
int i, j;
MSG_FolderInfo **folderInfos;
int32 iCount;
MSG_FolderLine folderLine;
char buffer[_MAX_PATH];
j = 0;
iCount = MSG_GetFolderChildren( pMaster, NULL, NULL, NULL );
folderInfos = new MSG_FolderInfo*[iCount];
if (folderInfos) {
MSG_GetFolderChildren( pMaster, NULL, folderInfos, iCount );
for ( i = 0; i < iCount; i++) {
if ( MSG_GetFolderLineById( pMaster, folderInfos[ i ], &folderLine ) ) {
if (j < 10) {
sprintf( buffer, "&%d %s", j, folderLine.name);
} else if ( j < 36 ) {
sprintf( buffer, "&%c %s", 'a' + j - 10, folderLine.name);
} else {
sprintf( buffer, " %s", folderLine.name);
}
::AppendMenu( hMenu, MF_STRING, nID, buffer);
nID++;
j++;
}
}
delete [] folderInfos;
}
}
void WFE_MSGBuildAddressBookPopup( HMENU hmenu, BOOL bAddSender )
{
UINT nID;
if (bAddSender)
nID = FIRST_ADDSENDER_MENU_ID;
else
nID = FIRST_ADDALL_MENU_ID;
HMENU hABAddMenu = CreatePopupMenu();
HMENU hAddMenu = CreatePopupMenu();
// ::AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT) hFileMenu, szLoadString( IDS_POPUP_FILE ) );
::AppendMenu( hAddMenu, MF_STRING, ID_MESSAGE_ADDSENDER, szLoadString( IDS_POPUP_ADDSENDER ) );
::AppendMenu( hAddMenu, MF_STRING, ID_MESSAGE_ADDALL, szLoadString( IDS_POPUP_ADDALL ) );
::AppendMenu( hmenu, MF_STRING|MF_POPUP, (UINT) hAddMenu, szLoadString( IDS_POPUP_ADDTOADDRESSBOOK ) );
::AppendMenu( hmenu, MF_SEPARATOR, 0, NULL );
CAddrFrame::UpdateMenu( hABAddMenu, nID );
}