mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 08:12:05 +00:00
7342 lines
182 KiB
C++
Executable File
7342 lines
182 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 "rosetta.h"
|
|
#include "addrfrm.h"
|
|
#include "addrprop.h"
|
|
#include "template.h"
|
|
#include "xpgetstr.h"
|
|
#include "wfemsg.h"
|
|
#include "msg_srch.h"
|
|
#include "msgcom.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"
|
|
#include "mnrccln.h"
|
|
|
|
//RHP - Need this include for the call in confhook.cpp
|
|
#include "confhook.h"
|
|
|
|
//#include "fegui.h" // for FE_GetProgramDirectory()
|
|
extern "C" char *FE_GetProgramDirectory(char *buffer, int length);
|
|
|
|
#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
|
|
#define _MAX_ARG_LEN_ 128
|
|
|
|
static UINT AddrCodes[] = {
|
|
ID_ITEM_ADDUSER,
|
|
ID_ITEM_ADDLIST,
|
|
ID_ITEM_PROPERTIES,
|
|
ID_FILE_NEWMESSAGE,
|
|
ID_LIVE_CALL,
|
|
ID_EDIT_DELETE,
|
|
ID_NAVIGATE_INTERRUPT
|
|
};
|
|
|
|
#ifdef MOZ_NEWADDR
|
|
typedef enum{
|
|
AB_ColumnFEID0 = AB_ColumnID0 + 1,
|
|
AB_ColumnFEID1,
|
|
AB_ColumnFEID2,
|
|
AB_ColumnFEID3,
|
|
AB_ColumnFEID4,
|
|
AB_ColumnFEID5,
|
|
AB_ColumnFEID6
|
|
} AB_ColumnFEID;
|
|
|
|
static AB_ContainerAttribute ContainerAttribs [] = {
|
|
attribContainerType,
|
|
attribName,
|
|
attribDepth,
|
|
attribNumChildren
|
|
};
|
|
|
|
|
|
int ShowPropertySheetForEntry (MSG_Pane * pane, MWContext * context)
|
|
{
|
|
BOOL result = FALSE;
|
|
|
|
if(MSG_GetPaneType(pane) == AB_PERSONENTRYPANE)
|
|
{
|
|
// Need to get given name
|
|
AB_AttribID id = AB_attribDisplayName;
|
|
AB_AttributeValue *value;
|
|
uint16 numItems = 1;
|
|
|
|
AB_GetPersonEntryAttributes(pane, &id, &value, &numItems);
|
|
|
|
BOOL bNew = FALSE;
|
|
CString title;
|
|
if(numItems > 0 && value->attrib == AB_attribDisplayName)
|
|
{
|
|
title.Format(XP_GetString (MK_ADDR_BOOK_CARD), value->u.string);
|
|
bNew = FALSE;
|
|
}
|
|
else
|
|
{
|
|
title = XP_GetString (MK_ADDR_NEW_CARD);
|
|
bNew = TRUE;
|
|
}
|
|
|
|
|
|
CAddrEditProperties prop(NULL,
|
|
(const char *) title, ABSTRACTCX(context)->GetDialogOwner(),
|
|
pane, context, bNew);
|
|
|
|
result = prop.DoModal();
|
|
|
|
if (result == IDOK)
|
|
result = TRUE;
|
|
if (result == IDCANCEL)
|
|
result = FALSE;
|
|
|
|
if(numItems > 0)
|
|
{
|
|
AB_FreeEntryAttributeValues(value, numItems);
|
|
}
|
|
}
|
|
else if(MSG_GetPaneType(pane) == AB_MAILINGLISTPANE)
|
|
{
|
|
|
|
CABMLDialog* dialog;
|
|
|
|
dialog = new CABMLDialog (ABSTRACTCX(context)->GetDialogOwner(), pane, context);
|
|
|
|
if (dialog->Create(ABSTRACTCX(context)->GetDialogOwner()))
|
|
result = TRUE;
|
|
}
|
|
|
|
|
|
return result;
|
|
}
|
|
|
|
int ShowPropertySheetForDir(DIR_Server *server, MWContext *context, MSG_Pane *pane,
|
|
XP_Bool newDirectory)
|
|
{
|
|
|
|
BOOL result = FALSE;
|
|
|
|
if(server->dirType == LDAPDirectory)
|
|
{
|
|
|
|
CAddrLDAPProperties dialog(ABSTRACTCX(context)->GetDialogOwner(), context,
|
|
server, "ldaptest");
|
|
|
|
if(dialog.DoModal() == IDOK)
|
|
{
|
|
CAddrFrame::HandleErrorReturn(AB_UpdateDIRServerForContainerPane(pane, server));
|
|
}
|
|
result = TRUE;
|
|
}
|
|
else if(server->dirType == PABDirectory)
|
|
{
|
|
|
|
LPTSTR name = newDirectory ? "" : server->description;
|
|
|
|
char *newName = FE_PromptWithCaption(context, "Address Book Info", "Name", name);
|
|
|
|
if(newName)
|
|
{
|
|
server->description = XP_STRDUP(newName);
|
|
|
|
CAddrFrame::HandleErrorReturn(AB_UpdateDIRServerForContainerPane(pane, server));
|
|
}
|
|
|
|
result = TRUE;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
int FE_ShowPropertySheetFor (MWContext* context, ABID entryID, PersonEntry* pPerson)
|
|
{
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
int FE_ShowPropertySheetFor (MWContext* context, ABID entryID, PersonEntry* pPerson)
|
|
{
|
|
DIR_Server *pab = NULL;
|
|
BOOL result = FALSE;
|
|
|
|
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
|
|
|
|
return result;
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// This will be the central function where we will call the
|
|
// import utility
|
|
//
|
|
// Args: makeCall - true if we are called from the address book
|
|
// false - if we are called from another mail window
|
|
//
|
|
void WFE_MSGLaunchMigrationUtility(HWND parent, int calledFromAddressBook,
|
|
char* directory)
|
|
{
|
|
char szCommandLine[_MAX_ARG_LEN_];
|
|
// the args for the import utility are
|
|
// -d for mail directory,
|
|
// -t for import type 0==mail 1==address book
|
|
// and -v for version number
|
|
|
|
strcpy (szCommandLine, "");
|
|
|
|
// format the command line
|
|
if (calledFromAddressBook == 0)
|
|
{
|
|
strcpy (szCommandLine, "-d");
|
|
char mailDirectory[256];
|
|
int nLen = 255;
|
|
strcpy (mailDirectory, "");
|
|
PREF_GetCharPref("mail.directory", mailDirectory, &nLen);
|
|
strcpy (szCommandLine, mailDirectory);
|
|
// strcpy (szCommandLine, " -t0 ");
|
|
}
|
|
else
|
|
{
|
|
strcpy (szCommandLine, "-a");
|
|
strcpy (szCommandLine, directory);
|
|
strcpy (szCommandLine, " -t1 ");
|
|
}
|
|
|
|
// strcpy (szCommandLine, "-v");
|
|
// strcpy (szCommandLine, XP_AppVersion);
|
|
|
|
//
|
|
// Check to see if the executable is defined on the machine. If it is not, then
|
|
// show a message and return.
|
|
char executable [_MAX_PATH + 32];
|
|
strcpy (executable, "");
|
|
FE_GetProgramDirectory( executable, _MAX_PATH + 32 );
|
|
if ( *executable ) {
|
|
#ifdef WIN32
|
|
strcat( executable, "import32.exe" );
|
|
#else
|
|
strcat( executable, "import16.exe" );
|
|
#endif
|
|
}
|
|
|
|
// try to launch the import app
|
|
int uSpawn = (int) ShellExecute(NULL, "open", executable, szCommandLine, ".", SW_SHOW);
|
|
if(uSpawn <= 32)
|
|
{
|
|
char szMsg[80];
|
|
switch(uSpawn)
|
|
{
|
|
case 0:
|
|
case 8:
|
|
sprintf(szMsg, szLoadString(IDS_WINEXEC_0_8));
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
sprintf(szMsg, szLoadString(IDS_WINEXEC_2_3));
|
|
break;
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
case 15:
|
|
sprintf(szMsg, szLoadString(IDS_WINEXEC_10_THRU_15));
|
|
break;
|
|
case 16:
|
|
sprintf(szMsg, szLoadString(IDS_WINEXEC_16));
|
|
break;
|
|
case 21:
|
|
sprintf(szMsg, szLoadString(IDS_WINEXEC_21));
|
|
break;
|
|
default:
|
|
sprintf(szMsg, szLoadString(IDS_WINEXEC_XX), uSpawn);
|
|
break;
|
|
}
|
|
|
|
CString s;
|
|
if (s.LoadString( IDS_BOOKMARK_ADDRESSPROPERTIES ))
|
|
{
|
|
::MessageBox(parent, szMsg, s, MB_OK | MB_APPLMODAL);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAddrCX::DestroyContext()
|
|
{
|
|
CStubsCX::DestroyContext();
|
|
}
|
|
|
|
#ifdef MOZ_NEWADDR
|
|
|
|
CAddrBarEditWnd::CAddrBarEditWnd()
|
|
{
|
|
|
|
}
|
|
|
|
CAddrBarEditWnd::~CAddrBarEditWnd()
|
|
{
|
|
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAddrBarEditWnd,CEdit)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
BOOL CAddrBarEditWnd::PreTranslateMessage ( MSG * msg )
|
|
{
|
|
if ( msg->message == WM_KEYDOWN)
|
|
{
|
|
switch(msg->wParam)
|
|
{
|
|
case VK_RETURN:
|
|
m_pOwner->SearchText(TRUE);
|
|
break;
|
|
|
|
}
|
|
}
|
|
return CEdit::PreTranslateMessage ( msg );
|
|
}
|
|
|
|
|
|
|
|
CAddrBar::CAddrBar()
|
|
{
|
|
m_iWidth = 0;
|
|
m_uTypedownClock = 0;
|
|
m_save = "";
|
|
m_pFont = NULL;
|
|
m_bRemoveLDAPDir = FALSE;
|
|
|
|
PREF_GetBoolPref("mail.addr_book.ldap.disabled", &m_bRemoveLDAPDir);
|
|
m_EditWnd.SetOwner(this);
|
|
//{{AFX_DATA_INIT(CAddrbkView)
|
|
m_name = _T("");
|
|
//}}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_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;
|
|
m_EditWnd.SubclassDlgItem(IDC_ADDRNAME, this);
|
|
|
|
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::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);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
void CAddrBar::OnChangeName()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
|
|
UpdateData(TRUE);
|
|
if (frame->IsSearching()) {
|
|
CString checkName (szLoadString(IDS_SEARCHRESULTS));
|
|
if (stricmp (checkName, m_name) != 0)
|
|
frame->OnExtendedDirectorySearch();
|
|
else
|
|
return;
|
|
}
|
|
|
|
SearchText(FALSE);
|
|
}
|
|
|
|
void CAddrBar::SearchText(BOOL bImmediately)
|
|
{
|
|
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
|
|
|
|
if (m_name != m_save) {
|
|
m_save = m_name;
|
|
KillTimer(m_uTypedownClock);
|
|
if (m_name.GetLength())
|
|
{
|
|
if(bImmediately)
|
|
{
|
|
m_uTypedownClock = SetTimer(ADDRESS_BOOK_TIMER, 0, NULL);
|
|
}
|
|
else
|
|
{
|
|
DIR_Server* dir;
|
|
dir = frame->GetCurrentDirectoryServer();
|
|
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::ClearSavedText()
|
|
{
|
|
m_save = "";
|
|
}
|
|
|
|
void CAddrBar::ChangeDirectoryName(char * directoryName)
|
|
{
|
|
CWnd* widget = GetDlgItem ( IDC_STATIC1 );
|
|
if (widget)
|
|
widget->SetWindowText (directoryName);
|
|
}
|
|
|
|
|
|
void CAddrBar::OnExtDirectorySearch()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
CAddrFrame* frame = (CAddrFrame*) GetParentFrame();
|
|
if (frame) {
|
|
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;
|
|
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;
|
|
CRect rect1;
|
|
|
|
widget->GetWindowRect(&rect);
|
|
if (parent = widget->GetParent()) {
|
|
parent->GetWindowRect(&rect1);
|
|
parent->ScreenToClient(&rect1);
|
|
parent->ScreenToClient(&rect);
|
|
rect.right = rect1.right - 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
|
|
{
|
|
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_pSplitter = NULL;
|
|
m_pOutliner = NULL;
|
|
m_pOutlinerParent = NULL;
|
|
m_pDirOutliner = NULL;
|
|
m_pDirOutlinerParent = NULL;
|
|
m_addrBookPane = NULL;
|
|
m_addrContPane = NULL;
|
|
m_bSearching = FALSE;
|
|
m_iProgress = 0;
|
|
m_iWidth = 0;
|
|
|
|
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_ClosePane(m_addrBookPane));
|
|
|
|
if (m_addrContPane)
|
|
HandleErrorReturn(AB_ClosePane(m_addrContPane));
|
|
|
|
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() );
|
|
m_pOutliner->SetOutlinerOwner(this);
|
|
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_pDirOutliner->SetOutlinerOwner(this);
|
|
m_pDirOutlinerParent->CreateColumns ( );
|
|
m_pDirOutlinerParent->EnableFocusFrame(TRUE);
|
|
|
|
|
|
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 m_addrBookPane;
|
|
}
|
|
|
|
MSG_Pane *CAddrFrame::GetResultsPane()
|
|
{
|
|
return m_addrBookPane;
|
|
}
|
|
|
|
MSG_Pane *CAddrFrame::GetContainerPane()
|
|
{
|
|
return m_addrContPane;
|
|
}
|
|
|
|
void CAddrFrame::PaneChanged(MSG_Pane *pane, XP_Bool asynchronous,
|
|
MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
|
|
{
|
|
switch(notify)
|
|
{
|
|
case MSG_PaneDirectoriesChanged:
|
|
if(pane == m_addrContPane)
|
|
{
|
|
}
|
|
break;
|
|
|
|
case MSG_PaneNotifyTypeDownCompleted:
|
|
m_pOutliner->OnTypedown(value);
|
|
break;
|
|
|
|
case MSG_PaneNotifyStartSearching:
|
|
StartSearching();
|
|
break;
|
|
case MSG_PaneNotifyStopSearching:
|
|
m_bSearching = FALSE;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void CAddrFrame::StartSearching()
|
|
{
|
|
m_bSearching = TRUE;
|
|
//make sure we can update the stop button
|
|
LPNSTOOLBAR pIToolBar = NULL;
|
|
GetChrome()->QueryInterface( IID_INSToolBar, (LPVOID *) &pIToolBar );
|
|
if ( pIToolBar ) {
|
|
CToolbarButton *pButton = pIToolBar->GetButtonByID(ID_NAVIGATE_INTERRUPT);
|
|
|
|
if(pButton)
|
|
{
|
|
pButton->Enable(TRUE);
|
|
pButton->Invalidate();
|
|
}
|
|
pIToolBar->Release();
|
|
}
|
|
GetChrome()->StartAnimation();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// 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_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_COL0, OnSortColumn0)
|
|
ON_UPDATE_COMMAND_UI(ID_SORT_COL0, OnUpdateSortColumn0)
|
|
ON_COMMAND(ID_SORT_COL1, OnSortColumn1)
|
|
ON_UPDATE_COMMAND_UI(ID_SORT_COL1, OnUpdateSortColumn1)
|
|
ON_COMMAND(ID_SORT_COL2, OnSortColumn2)
|
|
ON_UPDATE_COMMAND_UI(ID_SORT_COL2, OnUpdateSortColumn2)
|
|
ON_COMMAND(ID_SORT_COL3, OnSortColumn3)
|
|
ON_UPDATE_COMMAND_UI(ID_SORT_COL3, OnUpdateSortColumn3)
|
|
ON_COMMAND(ID_SORT_COL4, OnSortColumn4)
|
|
ON_UPDATE_COMMAND_UI(ID_SORT_COL4, OnUpdateSortColumn4)
|
|
ON_COMMAND(ID_SORT_COL5, OnSortColumn5)
|
|
ON_UPDATE_COMMAND_UI(ID_SORT_COL5, OnUpdateSortColumn5)
|
|
ON_COMMAND(ID_SORT_COL6, OnSortColumn6)
|
|
ON_UPDATE_COMMAND_UI(ID_SORT_COL6, OnUpdateSortColumn6)
|
|
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);
|
|
int result = 0;
|
|
AB_ContainerInfo * info = NULL;
|
|
|
|
HandleErrorReturn((result = AB_CreateABPane(&m_addrBookPane,
|
|
GetContext(),
|
|
WFE_MSGGetMaster())));
|
|
|
|
if (result)
|
|
return -1;
|
|
|
|
HandleErrorReturn((result = AB_CreateContainerPane(&m_addrContPane,
|
|
GetContext(),
|
|
WFE_MSGGetMaster())));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrBookPane);
|
|
return -1;
|
|
}
|
|
|
|
HandleErrorReturn((result = AB_InitializeContainerPane(m_addrContPane)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
return -1;
|
|
}
|
|
|
|
info = AB_GetContainerForIndex(m_addrContPane, 0);
|
|
|
|
ASSERT (info);
|
|
|
|
HandleErrorReturn((result = AB_InitializeABPane(m_addrBookPane,
|
|
info)));
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
return -1;
|
|
}
|
|
|
|
//set property sheets for address book pane
|
|
HandleErrorReturn((result = AB_SetShowPropertySheetForEntryFunc(
|
|
(MSG_Pane *)m_addrBookPane,
|
|
ShowPropertySheetForEntry)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
return -1;
|
|
}
|
|
|
|
//set property sheets for container pane
|
|
HandleErrorReturn((result = AB_SetShowPropertySheetForEntryFunc(
|
|
(MSG_Pane *)m_addrContPane,
|
|
ShowPropertySheetForEntry)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
return -1;
|
|
}
|
|
|
|
//set ldap property sheets for container pane
|
|
HandleErrorReturn((result = AB_SetShowPropertySheetForDirFunc(
|
|
(MSG_Pane *)m_addrContPane,
|
|
ShowPropertySheetForDir)));
|
|
|
|
if (result) {
|
|
AB_ClosePane (m_addrContPane);
|
|
AB_ClosePane (m_addrBookPane);
|
|
return -1;
|
|
}
|
|
|
|
int32 prefSortByInt;
|
|
XP_Bool prefSortAscending = TRUE;
|
|
PREF_GetIntPref("mail.addr_book.sortby", &prefSortByInt);
|
|
PREF_GetBoolPref("mail.addr_book.sort_ascending", &prefSortAscending);
|
|
AB_SortByAttribute(m_addrBookPane,
|
|
(AB_AttribID) (prefSortByInt - 1),
|
|
prefSortAscending);
|
|
|
|
//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);
|
|
|
|
}
|
|
|
|
MSG_SetFEData( (MSG_Pane*) m_addrBookPane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) m_pIAddrList );
|
|
MSG_SetFEData( (MSG_Pane*) m_addrContPane, (LPVOID) (LPUNKNOWN) (LPMSGLIST) m_pIAddrList );
|
|
m_pOutliner->SetPane(m_addrBookPane);
|
|
m_pDirOutliner->SetPane(m_addrContPane);
|
|
m_pDirOutliner->SelectItem(0);
|
|
|
|
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::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);
|
|
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;
|
|
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());
|
|
|
|
//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 == m_addrBookPane ) {
|
|
if ( m_pOutliner ) {
|
|
m_pOutliner->MysticStuffStarting( asynchronous, notify,
|
|
where, num );
|
|
}
|
|
return;
|
|
}
|
|
if ( pane == m_addrContPane ) {
|
|
if ( m_pDirOutliner ) {
|
|
m_pDirOutliner->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 == m_addrBookPane ) {
|
|
if ( m_pOutliner ) {
|
|
m_pOutliner->MysticStuffFinishing( asynchronous, notify,
|
|
where, num );
|
|
}
|
|
return;
|
|
}
|
|
if ( pane == m_addrContPane ) {
|
|
if ( m_pDirOutliner ) {
|
|
m_pDirOutliner->MysticStuffFinishing( asynchronous, notify,
|
|
where, num );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrFrame::SetSearchResults(MSG_ViewIndex index, int32 num)
|
|
{
|
|
|
|
CString csStatus;
|
|
|
|
ASSERT(m_pOutliner);
|
|
AB_LDAPSearchResultsAB2(m_addrBookPane, index, num);
|
|
if (num > 1) {
|
|
csStatus.Format( szLoadString(IDS_SEARCHHITS), num );
|
|
} else if ( num > 0 ) {
|
|
csStatus.LoadString( IDS_SEARCHONEHIT );
|
|
} else {
|
|
csStatus.LoadString( IDS_SEARCHNOHITS );
|
|
}
|
|
|
|
if (GetChrome()) {
|
|
LPNSSTATUSBAR pIStatusBar = NULL;
|
|
GetChrome()->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
|
|
if ( pIStatusBar ) {
|
|
pIStatusBar->SetStatusText(csStatus);
|
|
pIStatusBar->Release();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CAddrFrame::DoubleClick()
|
|
{
|
|
OnItemProperties();
|
|
}
|
|
|
|
CWnd* CAddrFrame::GetOwnerWindow()
|
|
{
|
|
return this;
|
|
}
|
|
|
|
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 );
|
|
}
|
|
|
|
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()
|
|
{
|
|
AB_ImportData(GetCurrentContainerInfo(),
|
|
NULL, /* could be a filename or NULL (if type = prompt for filename) or a block of data to be imported */
|
|
0, /* how big is the buffer? */
|
|
AB_PromptForFileName); /* valid types: All */
|
|
}
|
|
|
|
void CAddrFrame::OnExportFile()
|
|
{
|
|
AB_ExportData(GetCurrentContainerInfo(),
|
|
NULL, /* could be a filename or NULL (if type = prompt for filename) or a block of data to be imported */
|
|
0, /* how big is the buffer? */
|
|
AB_PromptForFileName); /* valid types: All */
|
|
}
|
|
|
|
|
|
void CAddrFrame::OnTypedown (char* name)
|
|
{
|
|
#ifdef MOZ_NEWADDR
|
|
|
|
HandleErrorReturn(AB_TypedownSearch(m_addrBookPane, name, MSG_VIEWINDEXNONE));
|
|
#else
|
|
DIR_Server* dir = GetCurrentDirectoryServer();
|
|
|
|
if (dir->dirType == LDAPDirectory) {
|
|
OnDirectoryList(name);
|
|
}
|
|
else
|
|
m_pOutliner->OnTypedown(name);
|
|
#endif //MOZ_NEWADDR
|
|
}
|
|
|
|
|
|
void CAddrFrame::DoAddressBookCommand(MSG_Pane *pPane, AB_CommandType cmd)
|
|
{
|
|
|
|
if(pPane)
|
|
{
|
|
CMSelectOutliner *pOutliner = (pPane == m_addrContPane) ? (CMSelectOutliner*)m_pDirOutliner:
|
|
(CMSelectOutliner*)m_pOutliner;
|
|
if(pOutliner)
|
|
{
|
|
MSG_ViewIndex *pIndices;
|
|
int count;
|
|
|
|
pOutliner->GetSelection(pIndices, count);
|
|
HandleErrorReturn(AB_CommandAB2 (pPane, cmd, pIndices, count), this);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
void CAddrFrame::DoUpdateAddressBook( CCmdUI* pCmdUI, AB_CommandType cmd, BOOL bUseCheck )
|
|
{
|
|
if(!pCmdUI)
|
|
return;
|
|
|
|
XP_Bool bSelectable = FALSE, bPlural = FALSE;
|
|
MSG_COMMAND_CHECK_STATE sState;
|
|
|
|
MSG_Pane *pPane;
|
|
CMSelectOutliner *pOutliner;
|
|
|
|
pPane = GetPaneForCommand(cmd);
|
|
|
|
pOutliner = (pPane == m_addrContPane) ?
|
|
(CMSelectOutliner*)m_pDirOutliner : (CMSelectOutliner*)m_pOutliner;
|
|
|
|
/*
|
|
// AB_PropertiesCmd depends on which outliner has focus.
|
|
if(cmd == AB_PropertiesCmd)
|
|
{
|
|
CWnd *pFocus = CWnd::GetFocus();
|
|
|
|
pPane = (pFocus == m_pDirOutliner) ? m_addrContPane : m_addrBookPane;
|
|
pOutliner = (pFocus == m_pDirOutliner) ?
|
|
(CMSelectOutliner*)m_pDirOutliner : (CMSelectOutliner*)m_pOutliner;
|
|
|
|
}
|
|
*/
|
|
if (pPane) {
|
|
if (pOutliner) {
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
pOutliner->GetSelection(indices, count);
|
|
AB_CommandStatusAB2(pPane,
|
|
cmd,
|
|
indices, count,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
} else {
|
|
AB_CommandStatusAB2(pPane,
|
|
cmd,
|
|
NULL, 0,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
}
|
|
}
|
|
pCmdUI->Enable(bSelectable);
|
|
if (bUseCheck)
|
|
pCmdUI->SetCheck(sState == MSG_Checked);
|
|
else
|
|
pCmdUI->SetRadio(sState == MSG_Checked);
|
|
}
|
|
|
|
MSG_Pane * CAddrFrame::GetPaneForCommand(AB_CommandType cmd)
|
|
{
|
|
|
|
switch(cmd)
|
|
{
|
|
case AB_NewMessageCmd:
|
|
case AB_LDAPSearchCmd:
|
|
case AB_SortByColumnID0:
|
|
case AB_SortByColumnID1:
|
|
case AB_SortByColumnID2:
|
|
case AB_SortByColumnID3:
|
|
case AB_SortByColumnID4:
|
|
case AB_SortByColumnID5:
|
|
case AB_SortByColumnID6:
|
|
case AB_SortDescending:
|
|
case AB_SortAscending:
|
|
case AB_CallCmd:
|
|
case AB_SaveCmd:
|
|
case AB_ImportCmd:
|
|
return m_addrBookPane;
|
|
break;
|
|
case AB_NewLDAPDirectory:
|
|
case AB_NewAddressBook:
|
|
return m_addrContPane;
|
|
break;
|
|
case AB_DeleteCmd:
|
|
case AB_DeleteAllCmd:
|
|
case AB_PropertiesCmd:
|
|
case AB_AddUserCmd:
|
|
case AB_AddMailingListCmd:
|
|
case AB_CloseCmd:
|
|
return GetFocusPane();
|
|
break;
|
|
case AB_ImportLdapEntriesCmd:
|
|
return GetFocusPane();
|
|
break;
|
|
default:
|
|
return GetFocusPane();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
MSG_Pane * CAddrFrame::GetFocusPane()
|
|
{
|
|
MSG_Pane *pFocusPane;
|
|
|
|
CWnd *pFocusWnd = CWnd::GetFocus();
|
|
|
|
pFocusPane = (pFocusWnd == m_pDirOutliner) ? m_addrContPane : m_addrBookPane;
|
|
|
|
return pFocusPane;
|
|
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnExtDirectorySearch()
|
|
{
|
|
m_barAddr.OnExtDirectorySearch();
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateShowAddressBookWindow( CCmdUI *pCmdUI )
|
|
{
|
|
pCmdUI->Enable(FALSE);
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSecureStatus(CCmdUI *pCmdUI)
|
|
{
|
|
HG28728
|
|
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::OnUpdateSortColumn0(CCmdUI* pCmdUI)
|
|
{
|
|
DoUpdateAddressBook(pCmdUI, AB_SortByColumnID0, TRUE);
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSortColumn1(CCmdUI* pCmdUI)
|
|
{
|
|
DoUpdateAddressBook(pCmdUI, AB_SortByColumnID1, TRUE);
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSortColumn2(CCmdUI* pCmdUI)
|
|
{
|
|
DoUpdateAddressBook(pCmdUI, AB_SortByColumnID2, TRUE);
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSortColumn3(CCmdUI* pCmdUI)
|
|
{
|
|
DoUpdateAddressBook(pCmdUI, AB_SortByColumnID3, TRUE);
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSortColumn4(CCmdUI* pCmdUI)
|
|
{
|
|
DoUpdateAddressBook(pCmdUI, AB_SortByColumnID4, TRUE);
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSortColumn5(CCmdUI* pCmdUI)
|
|
{
|
|
DoUpdateAddressBook(pCmdUI, AB_SortByColumnID5, TRUE);
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSortColumn6(CCmdUI* pCmdUI)
|
|
{
|
|
DoUpdateAddressBook(pCmdUI, AB_SortByColumnID6, 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)
|
|
{
|
|
pCmdUI->Enable(m_bSearching);
|
|
}
|
|
|
|
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::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::OnAddUser ( void )
|
|
{
|
|
DoAddressBookCommand(GetFocusPane(), AB_AddUserCmd);
|
|
}
|
|
|
|
void CAddrFrame::OnAddAB ( void )
|
|
{
|
|
DoAddressBookCommand(m_addrContPane, AB_NewAddressBook);
|
|
}
|
|
|
|
void CAddrFrame::OnAddDir ( void )
|
|
{
|
|
DoAddressBookCommand(m_addrContPane, AB_NewLDAPDirectory);
|
|
}
|
|
|
|
void CAddrFrame::OnHTMLDomains ( void )
|
|
{
|
|
MSG_DisplayHTMLDomainsDialog(GetContext());
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateHTMLDomains( CCmdUI *pCmdUI )
|
|
{
|
|
pCmdUI->Enable( TRUE );
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateEditCut(CCmdUI* pCmdUI)
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateEditCopy(CCmdUI* pCmdUI)
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateDeleteFromAll(CCmdUI* pCmdUI)
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateSelectAll(CCmdUI* pCmdUI)
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateDirectoryPane(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable( TRUE );
|
|
}
|
|
|
|
void CAddrFrame::OnEditCut ( )
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnEditCopy ( )
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnEditDeleteFromAll ( )
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnSelectAll ( )
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnDirectoryPane ( )
|
|
{
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnCreateCard ( void )
|
|
{
|
|
HandleErrorReturn(AB_CommandAB2 (GetFocusPane(), AB_AddUserCmd, 0, 0), this);
|
|
}
|
|
|
|
DIR_Server * CAddrFrame::GetCurrentDirectoryServer()
|
|
{
|
|
return (AB_GetDirServerForContainer(AB_GetContainerForIndex(m_addrContPane, m_pDirOutliner->GetDirectoryIndex())));
|
|
}
|
|
|
|
AB_ContainerInfo * CAddrFrame::GetCurrentContainerInfo ()
|
|
{
|
|
return (AB_GetContainerForIndex(m_addrContPane, m_pDirOutliner->GetDirectoryIndex()));
|
|
}
|
|
|
|
void CAddrFrame::OnAddList ( void )
|
|
{
|
|
DoAddressBookCommand(GetFocusPane(), AB_AddMailingListCmd);
|
|
}
|
|
|
|
|
|
void CAddrFrame::OnDeleteItem()
|
|
{
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
|
|
HWND hwndFocus = ::GetFocus();
|
|
|
|
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
|
|
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
|
|
|
|
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
|
|
|
|
if (hwndFocus == hwndDirOutliner) {
|
|
|
|
m_pDirOutliner->GetSelection(indices, count);
|
|
|
|
HandleErrorReturn(AB_CommandAB2 (m_addrContPane, AB_DeleteCmd, indices, count), this);
|
|
m_pDirOutliner->UpdateCount();
|
|
if ((m_pDirOutliner->GetFocusLine() > m_pDirOutliner->GetTotalLines() - 1))
|
|
m_pDirOutliner->SelectItem(m_pDirOutliner->GetTotalLines() - 1);
|
|
else
|
|
m_pDirOutliner->SelectItem(m_pDirOutliner->GetFocusLine());
|
|
}
|
|
else {
|
|
m_pOutliner->GetSelection(indices, count);
|
|
|
|
HandleErrorReturn(AB_CommandAB2 (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 ) );
|
|
}
|
|
|
|
|
|
void CAddrFrame::OnUndo()
|
|
{
|
|
HWND hwndFocus = ::GetFocus();
|
|
|
|
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
|
|
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
|
|
|
|
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
|
|
|
|
if (hwndFocus == hwndDirOutliner) {
|
|
HandleErrorReturn(AB_CommandAB2 (m_addrContPane, AB_UndoCmd, 0, 0), this);
|
|
m_pDirOutliner->UpdateCount();
|
|
if ((m_pDirOutliner->GetFocusLine() > m_pDirOutliner->GetTotalLines() - 1))
|
|
m_pDirOutliner->SelectItem(m_pDirOutliner->GetTotalLines() - 1);
|
|
else
|
|
m_pDirOutliner->SelectItem(m_pDirOutliner->GetFocusLine());
|
|
}
|
|
else {
|
|
HandleErrorReturn(AB_CommandAB2 (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()
|
|
{
|
|
HWND hwndFocus = ::GetFocus();
|
|
|
|
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
|
|
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
|
|
|
|
SetCursor ( theApp.LoadStandardCursor ( IDC_WAIT ) );
|
|
|
|
if (hwndFocus == hwndDirOutliner) {
|
|
HandleErrorReturn(AB_CommandAB2 (m_addrContPane, AB_RedoCmd, 0, 0), this);
|
|
m_pDirOutliner->UpdateCount();
|
|
if ((m_pDirOutliner->GetFocusLine() > m_pDirOutliner->GetTotalLines() - 1))
|
|
m_pDirOutliner->SelectItem(m_pDirOutliner->GetTotalLines() - 1);
|
|
else
|
|
m_pDirOutliner->SelectItem(m_pDirOutliner->GetFocusLine());
|
|
}
|
|
else {
|
|
HandleErrorReturn(AB_CommandAB2 (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_CommandAB2 (m_addrBookPane, AB_NewMessageCmd, indices, count), this);
|
|
}
|
|
|
|
void CAddrFrame::OnItemProperties()
|
|
{
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
HWND hwndFocus = ::GetFocus();
|
|
|
|
|
|
HWND hwndDirOutliner = m_pDirOutliner ? m_pDirOutliner->m_hWnd : NULL;
|
|
HWND hwndOutliner = m_pOutliner ? m_pOutliner->m_hWnd : NULL;
|
|
|
|
if (hwndFocus == hwndOutliner) {
|
|
m_pOutliner->GetSelection(indices, count);
|
|
HandleErrorReturn(AB_CommandAB2 (m_addrBookPane, AB_PropertiesCmd, indices, count), this);
|
|
}
|
|
if (hwndFocus == hwndDirOutliner) {
|
|
m_pDirOutliner->GetSelection(indices, count);
|
|
HandleErrorReturn(AB_CommandAB2 (m_addrContPane, AB_PropertiesCmd, indices, count), this);
|
|
}
|
|
}
|
|
|
|
void CAddrFrame::OnCall()
|
|
{
|
|
CString ipAddress;
|
|
CString emailAddress;
|
|
short useServer = 0;
|
|
AB_AttribID attribs [5] = {AB_attribEntryType, AB_attribCoolAddress, AB_attribEmailAddress,
|
|
AB_attribUseServer, AB_attribFullName };
|
|
AB_AttributeValue * values;
|
|
uint16 numItems = 5;
|
|
|
|
char szCommandLine[_MAX_PATH];
|
|
|
|
// check the entry type and add/remove pages
|
|
AB_GetEntryAttributesForPane(m_addrBookPane, m_pOutliner->GetFocusLine(),
|
|
attribs, &values, &numItems);
|
|
|
|
if (values[0].u.entryType != AB_Person) {
|
|
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
|
|
ipAddress = values[1].u.string;
|
|
emailAddress = values[2].u.string;
|
|
|
|
if ((values[3].u.shortValue == kSpecificDLS || values[3].u.shortValue == 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();
|
|
AB_FreeEntryAttributeValues(values, numItems);
|
|
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();
|
|
AB_FreeEntryAttributeValues(values, numItems);
|
|
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())
|
|
{
|
|
strcat(szCommandLine, " ");
|
|
strcat(szCommandLine, userNameFlag);
|
|
strcat(szCommandLine, " ");
|
|
strcat(szCommandLine, values[4].u.string);
|
|
}
|
|
//
|
|
//RHP - Launch conference app
|
|
//
|
|
AB_FreeEntryAttributeValues(values, numItems);
|
|
LaunchConfEndpoint(szCommandLine, GetSafeHwnd());
|
|
}
|
|
|
|
void CAddrFrame::OnSortColumn0()
|
|
{
|
|
m_pOutlinerParent->ColumnCommand ( AB_ColumnFEID0 );
|
|
}
|
|
|
|
void CAddrFrame::OnSortColumn1()
|
|
{
|
|
m_pOutlinerParent->ColumnCommand ( AB_ColumnFEID1 );
|
|
}
|
|
|
|
void CAddrFrame::OnSortColumn2()
|
|
{
|
|
m_pOutlinerParent->ColumnCommand ( AB_ColumnFEID2 );
|
|
}
|
|
|
|
void CAddrFrame::OnSortColumn3()
|
|
{
|
|
m_pOutlinerParent->ColumnCommand ( AB_ColumnFEID3 );
|
|
}
|
|
|
|
void CAddrFrame::OnSortColumn4()
|
|
{
|
|
m_pOutlinerParent->ColumnCommand ( AB_ColumnFEID4 );
|
|
}
|
|
|
|
void CAddrFrame::OnSortColumn5()
|
|
{
|
|
m_pOutlinerParent->ColumnCommand ( AB_ColumnFEID5 );
|
|
}
|
|
|
|
void CAddrFrame::OnSortColumn6()
|
|
{
|
|
m_pOutlinerParent->ColumnCommand ( AB_ColumnFEID6 );
|
|
}
|
|
|
|
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::OnUpdateDirectorySelection (int dirIndex, BOOL indexChanged)
|
|
{
|
|
// the user has selected a different directory in the left pane
|
|
if (indexChanged) {
|
|
m_pOutliner->SetDirectoryIndex(dirIndex);
|
|
HandleErrorReturn(AB_ChangeABContainer(m_addrBookPane, GetCurrentContainerInfo()), this);
|
|
}
|
|
DIR_Server* dir = GetCurrentDirectoryServer();
|
|
|
|
m_barAddr.ChangeDirectoryName (dir->description);
|
|
m_barAddr.ClearSavedText();
|
|
}
|
|
|
|
|
|
void CAddrFrame::OnStopSearch ()
|
|
{
|
|
CWnd* widget2 = m_barAddr.GetDlgItem (IDC_DIRSEARCH);
|
|
// We've hit the stop button
|
|
HandleErrorReturn(AB_FinishSearchAB2(m_addrBookPane));
|
|
m_bSearching = FALSE;
|
|
GetChrome()->StopAnimation();
|
|
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* widget2 = m_barAddr.GetDlgItem (IDC_DIRSEARCH);
|
|
|
|
if (m_bSearching) {
|
|
OnStopSearch();
|
|
return;
|
|
}
|
|
|
|
|
|
CSearchDialog searchDlg ((UINT) IDS_ADRSEARCH,
|
|
(MSG_Pane*) m_addrBookPane,
|
|
GetCurrentDirectoryServer(),
|
|
this);
|
|
int result = searchDlg.DoModal();
|
|
|
|
// Build Search
|
|
if (result == IDOK)
|
|
{
|
|
GetChrome()->StartAnimation();
|
|
LPNSSTATUSBAR pIStatusBar = NULL;
|
|
m_pChrome->QueryInterface( IID_INSStatusBar, (LPVOID *) &pIStatusBar );
|
|
if ( pIStatusBar ) {
|
|
pIStatusBar->SetStatusText(szLoadString( IDS_SEARCHING ));
|
|
pIStatusBar->Release();
|
|
}
|
|
|
|
m_bSearching = TRUE;
|
|
m_barAddr.GetDlgItem(IDC_ADDRNAME)->SetWindowText(CString (szLoadString(IDS_SEARCHRESULTS)));
|
|
widget2->EnableWindow(FALSE);
|
|
m_pOutliner->SetTotalLines(0);
|
|
m_pOutliner->SetFocus();
|
|
m_pOutliner->SetFocusLine(0);
|
|
m_pDirOutliner->EnableWindow(FALSE);
|
|
|
|
HandleErrorReturn(AB_SearchDirectoryAB2(m_addrBookPane, NULL), this);
|
|
}
|
|
|
|
}
|
|
|
|
void CAddrFrame::OnDirectoryList (char * name)
|
|
{
|
|
CString cs;
|
|
CWnd* 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;
|
|
widget2->EnableWindow(FALSE);
|
|
m_pDirOutliner->EnableWindow(FALSE);
|
|
|
|
HandleErrorReturn(AB_SearchDirectoryAB2(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()
|
|
ON_WM_SIZE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
CAddrOutliner::CAddrOutliner ( )
|
|
{
|
|
int32 prefInt;
|
|
PREF_GetIntPref("mail.addr_book.sortby",&prefInt);
|
|
// MW fix this should be moved to the create where
|
|
// we know the directory and can figure out if we can
|
|
// sort by the attribute in a particular column
|
|
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_hFont = NULL;
|
|
m_psTypedown = "";
|
|
m_uTypedownClock = 0;
|
|
m_pEntryValues = NULL;
|
|
m_intNumAttribs = 0;
|
|
m_pane = NULL;
|
|
m_pOutlinerOwner = NULL;
|
|
}
|
|
|
|
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(int32 index)
|
|
{
|
|
|
|
ScrollIntoView(CASTINT(index));
|
|
SelectItem (CASTINT(index));
|
|
|
|
}
|
|
void CAddrOutliner::OnTypedown (char* name)
|
|
{
|
|
int startIndex;
|
|
|
|
if (GetFocusLine() != -1)
|
|
startIndex = GetFocusLine();
|
|
else
|
|
startIndex = 0;
|
|
|
|
// This will eventually cause OnTypedown(int32 index) to
|
|
// get called.
|
|
AB_TypedownSearch(m_pane, name, MSG_VIEWINDEXNONE);
|
|
// 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;
|
|
}
|
|
|
|
|
|
void CAddrOutliner::SetDirectoryIndex (int dirIndex)
|
|
{
|
|
int numAttribs = ID_RESULTS_COLNUM;
|
|
AB_ContainerInfo *container = NULL;
|
|
if(m_pOutlinerOwner != NULL)
|
|
{
|
|
container = m_pOutlinerOwner->GetCurrentContainerInfo();
|
|
}
|
|
|
|
AB_GetColumnAttribIDs(container,
|
|
m_EntryAttrib, /* FE allocated array of attribs. BE fills with values */
|
|
&numAttribs); /* FE passes in # elements allocated in array. BE returns # elements filled */
|
|
|
|
int iCount = GetNumColumns();
|
|
for (int i = 0; i < iCount; i++) {
|
|
int iColumn = GetColumnAtPos(i);
|
|
AB_ColumnInfo * columnInfo = NULL;
|
|
columnInfo = AB_GetColumnInfo(container, (AB_ColumnID) (iColumn - 1));
|
|
if (columnInfo && columnInfo->displayString)
|
|
SetColumnName(iColumn, columnInfo->displayString);
|
|
AB_FreeColumnInfo(columnInfo);
|
|
}
|
|
ClearSelection();
|
|
GetParent()->Invalidate();
|
|
GetParent()->UpdateWindow();
|
|
SelectItem(0);
|
|
}
|
|
|
|
void CAddrOutliner::UpdateCount( )
|
|
{
|
|
uint32 count;
|
|
|
|
count = MSG_GetNumLines(m_pane);
|
|
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_CommandStatusAB2( m_pane,
|
|
AB_DeleteCmd,
|
|
indices, 1,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
if (bSelectable) {
|
|
AB_CommandAB2 ( m_pane, AB_DeleteCmd, indices, 1 );
|
|
return TRUE;
|
|
}
|
|
else
|
|
MessageBeep(0);
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CAddrOutliner::IsSelected ( int iLine )
|
|
{
|
|
|
|
if(AB_UseExtendedSelection(m_pane))
|
|
{
|
|
return AB_IsSelected(m_pane, iLine);
|
|
}
|
|
else
|
|
{
|
|
return CMSelectOutliner::IsSelected(iLine);
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrOutliner::AddSelection( MSG_ViewIndex iSel )
|
|
{
|
|
if(AB_UseExtendedSelection(m_pane))
|
|
{
|
|
AB_AddSelection(m_pane, iSel);
|
|
}
|
|
CMSelectOutliner::AddSelection(iSel);
|
|
|
|
}
|
|
|
|
void CAddrOutliner::RemoveSelection( MSG_ViewIndex iSel )
|
|
{
|
|
if(AB_UseExtendedSelection(m_pane))
|
|
{
|
|
AB_RemoveSelection(m_pane, iSel);
|
|
}
|
|
CMSelectOutliner::RemoveSelection(iSel);
|
|
|
|
}
|
|
|
|
void CAddrOutliner::RemoveSelectionRange( MSG_ViewIndex iSelBegin, MSG_ViewIndex iSelEnd )
|
|
{
|
|
|
|
if(AB_UseExtendedSelection(m_pane))
|
|
{
|
|
for(MSG_ViewIndex i = iSelBegin; i <= iSelEnd; i++)
|
|
{
|
|
AB_RemoveSelection(m_pane, i);
|
|
}
|
|
}
|
|
|
|
CMSelectOutliner::RemoveSelectionRange(iSelBegin, iSelEnd);
|
|
|
|
}
|
|
|
|
void CAddrOutliner::ClearSelection()
|
|
{
|
|
if(AB_UseExtendedSelection(m_pane))
|
|
{
|
|
|
|
AB_RemoveAllSelections(m_pane);
|
|
}
|
|
CMSelectOutliner::ClearSelection();
|
|
|
|
}
|
|
|
|
void CAddrOutliner::SetPane(MSG_Pane *pane)
|
|
{
|
|
m_pane = pane;
|
|
uint32 count;
|
|
|
|
if (m_pane) {
|
|
count = MSG_GetNumLines(m_pane);
|
|
SetTotalLines(CASTINT(count));
|
|
Invalidate();
|
|
UpdateWindow();
|
|
AB_SetFEPageSizeForPane (m_pane, GetNumberVisibleRows ());
|
|
}
|
|
}
|
|
|
|
void CAddrOutliner::OnSize(UINT nType, int cx, int cy )
|
|
{
|
|
CMSelectOutliner::OnSize(nType, cx, cy);
|
|
if (m_pane)
|
|
AB_SetFEPageSizeForPane (m_pane, GetNumberVisibleRows ());
|
|
}
|
|
|
|
void CAddrOutliner::MysticStuffStarting( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
|
|
if ( notify == MSG_NotifyLDAPTotalContentChanged) {
|
|
// save off what was selected
|
|
}
|
|
|
|
if(notify == MSG_NotifyAll)
|
|
{
|
|
//keep track of current entry id
|
|
CAddrFrame::HandleErrorReturn(AB_GetABIDForIndex(m_pane,m_iSelection,&m_selectedID));
|
|
}
|
|
++m_iMysticPlane;
|
|
}
|
|
|
|
void CAddrOutliner::MysticStuffFinishing( XP_Bool asynchronous,
|
|
MSG_NOTIFY_CODE notify,
|
|
MSG_ViewIndex where,
|
|
int32 num )
|
|
{
|
|
uint32 count = 0;
|
|
|
|
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
|
|
&& m_pOutlinerOwner && m_pOutlinerOwner->IsSearching() && num > 0)
|
|
{
|
|
m_pOutlinerOwner->SetSearchResults(where, num);
|
|
HandleInsert(where, num);
|
|
}
|
|
else
|
|
{
|
|
if (num > 0)
|
|
HandleInsert(where, num);
|
|
else
|
|
HandleDelete(where, -num);
|
|
}
|
|
// count = MSG_GetNumLines(m_pane);
|
|
// SetTotalLines(CASTINT(count));
|
|
break;
|
|
|
|
case MSG_NotifyChanged:
|
|
InvalidateLines( (int) where, (int) num );
|
|
break;
|
|
|
|
case MSG_NotifyAll:
|
|
count = MSG_GetNumLines(m_pane);
|
|
SetTotalLines(CASTINT(count));
|
|
ABID selectedID;
|
|
CAddrFrame::HandleErrorReturn(AB_GetABIDForIndex(m_pane,m_iSelection,&selectedID));
|
|
//if the selection changed it's no longer valid and select 1st one
|
|
if(selectedID != m_selectedID || selectedID == 0)
|
|
{
|
|
SelectItem(0);
|
|
}
|
|
Invalidate();
|
|
break;
|
|
|
|
case MSG_NotifyScramble:
|
|
Invalidate();
|
|
break;
|
|
|
|
case MSG_NotifyLDAPTotalContentChanged:
|
|
// reselect indexes based
|
|
SetTotalLines(CASTINT(num));
|
|
Invalidate();
|
|
break;
|
|
|
|
case MSG_NotifyNewTopIndex:
|
|
m_iTopLine = where;
|
|
Invalidate();
|
|
break;
|
|
}
|
|
|
|
if (( !--m_iMysticPlane && m_pane)) {
|
|
// Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CAddrOutliner::PropertyMenu ( int iSel, UINT flags )
|
|
{
|
|
BOOL bHasItems = FALSE;
|
|
CMenu cmPopup;
|
|
CString cs;
|
|
|
|
SetFocus();
|
|
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(ID_POPUP_CUT);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_CUT, cs);
|
|
cs.LoadString(ID_POPUP_COPY);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_COPY, cs);
|
|
cs.LoadString(ID_POPUP_PASTE);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_PASTE, cs);
|
|
cs.LoadString(IDS_COMPOSE_REMOVE);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_DELETE, cs);
|
|
cs.LoadString(IDS_DELETEFROMALL);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_DELETEALL, cs);
|
|
cmPopup.AppendMenu(MF_SEPARATOR);
|
|
cs.LoadString(IDS_POPUP_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,
|
|
m_pOutlinerOwner->GetOwnerWindow(), 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;
|
|
|
|
// check if we are dropping from the left hand pane
|
|
if ( pDataObject->IsDataAvailable( m_cfDirIndexes ) ) {
|
|
|
|
AB_ContainerInfo *pContInfo = AB_GetContainerForIndex(m_pane, iLineNo);
|
|
HGLOBAL hContent = pDataObject->GetGlobalData (m_cfDirIndexes);
|
|
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock(hContent);
|
|
|
|
AB_DragEffect requireEffect = AB_Default_Drag;
|
|
if (dropEffect & DROPEFFECT_MOVE)
|
|
requireEffect = AB_Require_Move;
|
|
else if (dropEffect & 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;
|
|
}
|
|
|
|
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);
|
|
#if 0 // MW fix
|
|
// Parse the vcards and add them to the address book
|
|
AB_ImportFromVcard((AddressPane*) m_pane, pAddresses);
|
|
#endif
|
|
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);
|
|
m_cfAddrIndexes = (CLIPFORMAT)RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT);
|
|
m_cfDirIndexes = (CLIPFORMAT)RegisterClipboardFormat(DIRLIST_INDEX_FORMAT);
|
|
}
|
|
|
|
CLIPFORMAT * CAddrOutliner::GetClipFormatList(void)
|
|
{
|
|
static CLIPFORMAT cfFormatList[5];
|
|
cfFormatList[0] = m_cfAddresses; // vcards
|
|
cfFormatList[1] = m_cfSourceTarget; // ids
|
|
cfFormatList[2] = m_cfAddrIndexes; // right pane indexes
|
|
cfFormatList[3] = m_cfDirIndexes; // left pane indexes
|
|
cfFormatList[3] = 0;
|
|
return cfFormatList;
|
|
}
|
|
|
|
DROPEFFECT CAddrOutliner::DropSelect( int iLineNo, COleDataObject *pDataObject )
|
|
{
|
|
DROPEFFECT res = DROPEFFECT_NONE;
|
|
HGLOBAL hContent;
|
|
|
|
if ( pDataObject->IsDataAvailable( m_cfDirIndexes )) {
|
|
|
|
AB_ContainerInfo *pContInfo = AB_GetContainerForIndex(m_pane, iLineNo);
|
|
hContent = pDataObject->GetGlobalData (m_cfDirIndexes);
|
|
|
|
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock(hContent);
|
|
|
|
AB_DragEffect requireEffect = AB_Default_Drag;
|
|
if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetKeyState(VK_CONTROL) & 0x8000))
|
|
requireEffect = AB_Default_Drag;
|
|
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;
|
|
m_iDragSelection = iLineNo;
|
|
|
|
GlobalUnlock (hContent); //do we have to GlobalFree it too?
|
|
}
|
|
|
|
//dragging from right pane
|
|
//we need to see if we are over a mailing list.
|
|
if(pDataObject->IsDataAvailable(m_cfAddrIndexes))
|
|
{
|
|
AB_ContainerInfo *pContInfo = AB_GetContainerForIndex(m_pane, iLineNo);
|
|
hContent = pDataObject->GetGlobalData (m_cfAddrIndexes);
|
|
|
|
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock(hContent);
|
|
|
|
AB_DragEffect requireEffect = AB_Default_Drag;
|
|
if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetKeyState(VK_CONTROL) & 0x8000))
|
|
requireEffect = AB_Default_Drag;
|
|
else if (GetKeyState(VK_SHIFT) & 0x8000)
|
|
requireEffect = AB_Require_Move;
|
|
else if (GetKeyState(VK_CONTROL) & 0x8000)
|
|
requireEffect = AB_Require_Copy;
|
|
|
|
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
COleDataSource * CAddrOutliner::GetDataSource(void)
|
|
{
|
|
COleDataSource * pDataSource = new COleDataSource;
|
|
ABID entryID;
|
|
char* pVcard = NULL;
|
|
char* pVcards = XP_STRDUP("");
|
|
int32 vCardSize;
|
|
char szTemp[10];
|
|
char szEntryID[20];
|
|
char* pEntryIDs = XP_STRDUP("");
|
|
HANDLE hString = 0;
|
|
MSG_ViewIndex *indices;
|
|
int count;
|
|
|
|
GetSelection(indices, count);
|
|
|
|
// create a drag type for the indexes
|
|
HANDLE hContent = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(AddressBookDragData));
|
|
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock (hContent);
|
|
pDragData->m_pane = m_pane;
|
|
pDragData->m_indices = indices;
|
|
pDragData->m_count = count;
|
|
GlobalUnlock(hContent);
|
|
pDataSource->CacheGlobalData(m_cfAddrIndexes, hContent);
|
|
|
|
AB_AttributeValue *pValue;
|
|
for (int i = 0 ; i < count; i++) {
|
|
CAddrFrame::HandleErrorReturn(AB_GetEntryAttributeForPane(m_pane,
|
|
indices[i], AB_attribVCard, &pValue));
|
|
|
|
if (pValue)
|
|
{
|
|
|
|
|
|
pVcards = StrAllocCat(pVcards, pValue->u.string);
|
|
|
|
ltoa(333, szTemp, 10);
|
|
sprintf(szEntryID, "%s-", szTemp);
|
|
pEntryIDs = StrAllocCat(pEntryIDs, szEntryID);
|
|
|
|
AB_FreeEntryAttributeValue(pValue);
|
|
pValue = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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 != AB_ColumnFEID0 )
|
|
return CMSelectOutliner::RenderData ( iColumn, rect, dc, text );
|
|
int idxImage;
|
|
|
|
if (m_pEntryValues [0].u.entryType == AB_MailingList)
|
|
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_AttributeValue* pEntryValues = (AB_AttributeValue*) pLineData;
|
|
int idxImage = 0;
|
|
|
|
if (pEntryValues [0].u.entryType == AB_MailingList)
|
|
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 )
|
|
{
|
|
if ( line >= m_iTotalLines) {
|
|
m_pEntryValues = NULL;
|
|
return NULL;
|
|
}
|
|
|
|
if (m_pEntryValues) {
|
|
m_intNumAttribs = ID_RESULTS_COLNUM;
|
|
AB_FreeEntryAttributeValues (m_pEntryValues, m_intNumAttribs);
|
|
m_pEntryValues = NULL;
|
|
}
|
|
|
|
// get the values by passing in the attribute array
|
|
m_intNumAttribs = ID_RESULTS_COLNUM;
|
|
|
|
AB_GetEntryAttributesForPane(
|
|
m_pane,
|
|
line,
|
|
m_EntryAttrib, /* FE allocated array of attribs that you want */
|
|
&m_pEntryValues,
|
|
&m_intNumAttribs);
|
|
|
|
return m_pEntryValues;
|
|
}
|
|
|
|
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 )
|
|
{
|
|
if (iColumn == AB_ColumnFEID0)
|
|
return ("");
|
|
|
|
AB_AttributeValue* pEntryValues = (AB_AttributeValue*) pLineData;
|
|
|
|
if (pEntryValues [iColumn-1].u.string && *(pEntryValues [iColumn-1].u.string))
|
|
return pEntryValues [iColumn-1].u.string;
|
|
|
|
return ("");
|
|
}
|
|
|
|
void CAddrOutliner::OnSelChanged()
|
|
{
|
|
m_pOutlinerOwner->SelectionChanged();
|
|
}
|
|
|
|
void CAddrOutliner::OnSelDblClk()
|
|
{
|
|
m_pOutlinerOwner->DoubleClick();
|
|
}
|
|
|
|
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 ("", AB_ColumnFEID0, 24, 0, ColumnFixed, 0, TRUE );
|
|
m_pOutliner->AddColumn ("", AB_ColumnFEID1, 1500, 0, ColumnVariable, iCol0 ? iCol0 : 1500 );
|
|
m_pOutliner->AddColumn ("", AB_ColumnFEID2, 1500, 0, ColumnVariable, iCol2 ? iCol2 : 1500 );
|
|
m_pOutliner->AddColumn ("", AB_ColumnFEID3, 1500, 0, ColumnVariable, iCol5 ? iCol5 : 1500 );
|
|
m_pOutliner->AddColumn ("", AB_ColumnFEID4, 1500, 0, ColumnVariable, iCol4 ? iCol4 : 1500 );
|
|
m_pOutliner->AddColumn ("", AB_ColumnFEID5, 1500, 0, ColumnVariable, iCol4 ? iCol4 : 1500 );
|
|
m_pOutliner->AddColumn ("", AB_ColumnFEID6, 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();
|
|
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 entryID;
|
|
int iBEColumnID = idColumn - 1;
|
|
|
|
// check if we can sort by this column
|
|
AB_ColumnInfo * columnInfo = NULL;
|
|
CAddrBookOutlinerOwner * owner= ((CAddrOutliner*)m_pOutliner)->GetOutlinerOwner();
|
|
|
|
if(owner)
|
|
columnInfo = AB_GetColumnInfo(owner->GetCurrentContainerInfo(), (AB_ColumnID) (iBEColumnID));
|
|
if (columnInfo && !columnInfo->sortable) {
|
|
AB_FreeColumnInfo(columnInfo);
|
|
return FALSE;
|
|
}
|
|
|
|
AB_FreeColumnInfo(columnInfo);
|
|
|
|
CAddrOutliner *pOutliner = (CAddrOutliner *) m_pOutliner;
|
|
if (pOutliner->GetFocusLine() != -1)
|
|
{
|
|
AB_GetABIDForIndex(
|
|
pOutliner->GetPane(),
|
|
pOutliner->GetFocusLine(),
|
|
&entryID); /* FE allocated. BE fills with the id you want */
|
|
}
|
|
|
|
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 (iBEColumnID) {
|
|
case AB_ColumnID0:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID0, 0, 0);
|
|
break;
|
|
case AB_ColumnID1:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID1, 0, 0);
|
|
break;
|
|
case AB_ColumnID2:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID2, 0, 0);
|
|
break;
|
|
case AB_ColumnID3:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID3, 0, 0);
|
|
break;
|
|
case AB_ColumnID4:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID4, 0, 0);
|
|
break;
|
|
case AB_ColumnID5:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID5, 0, 0);
|
|
break;
|
|
case AB_ColumnID6:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID6, 0, 0);
|
|
break;
|
|
default:
|
|
AB_CommandAB2(pOutliner->GetPane(), AB_SortByColumnID1, 0, 0);
|
|
break;
|
|
}
|
|
|
|
|
|
if (pOutliner->GetFocusLine() != -1) {
|
|
MSG_ViewIndex index;
|
|
AB_GetEntryIndex(
|
|
pOutliner->GetPane(),
|
|
entryID, /* entry id in the database */
|
|
&index); /* FE allocated, BE fills with index */
|
|
|
|
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 ( )
|
|
{
|
|
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_lineindex = 0;
|
|
m_iMysticPlane = 0;
|
|
m_dirIndex = -1;
|
|
m_hFont = NULL;
|
|
m_pLineValues = NULL;
|
|
m_pAncestor = NULL;
|
|
m_numItems = sizeof (ContainerAttribs)/sizeof(AB_ContainerAttribute);
|
|
m_pSelection = NULL;
|
|
m_pFocus = NULL;
|
|
m_pOutlinerOwner = NULL;
|
|
}
|
|
|
|
CDirOutliner::~CDirOutliner ( )
|
|
{
|
|
if (m_pUnkUserImage) {
|
|
if (m_pIUserImage)
|
|
m_pUnkUserImage->Release();
|
|
}
|
|
if (m_hFont) {
|
|
theApp.ReleaseAppFont(m_hFont);
|
|
}
|
|
if (m_pSelection) {
|
|
delete [] m_pSelection;
|
|
m_pSelection = NULL;
|
|
}
|
|
if (m_pFocus) {
|
|
m_pFocus = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
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::UpdateCount( )
|
|
{
|
|
m_iTotalLines = MSG_GetNumLines(m_pane);
|
|
if (!m_iTotalLines)
|
|
ClearSelection();
|
|
Invalidate();
|
|
UpdateWindow();
|
|
}
|
|
|
|
|
|
BOOL CDirOutliner::DeleteItem ( int iLine )
|
|
{
|
|
XP_Bool bSelectable, bPlural;
|
|
MSG_ViewIndex indices[1];
|
|
indices[0] = (MSG_ViewIndex) iLine;
|
|
MSG_COMMAND_CHECK_STATE sState;
|
|
AB_CommandStatusAB2( m_pane,
|
|
AB_DeleteCmd,
|
|
indices, 1,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
if (bSelectable) {
|
|
AB_CommandAB2 ( m_pane, AB_DeleteCmd, indices, 1 );
|
|
return TRUE;
|
|
}
|
|
else
|
|
MessageBeep(0);
|
|
return FALSE;
|
|
}
|
|
|
|
void CDirOutliner::SetPane(MSG_Pane *pane)
|
|
{
|
|
m_pane = pane;
|
|
|
|
if (m_pane) {
|
|
SetTotalLines (MSG_GetNumLines(m_pane));
|
|
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);
|
|
//if deleting current selection we need to load new directory
|
|
if(m_dirIndex == where)
|
|
{
|
|
m_dirIndex = m_iSelection;
|
|
m_pOutlinerOwner->OnUpdateDirectorySelection (m_dirIndex, TRUE);
|
|
}
|
|
}
|
|
SetTotalLines (MSG_GetNumLines(m_pane));
|
|
Invalidate();
|
|
break;
|
|
|
|
case MSG_NotifyChanged:
|
|
{
|
|
InvalidateLines( (int) where, (int) num );
|
|
// update the description in the address book bar
|
|
if (m_pOutlinerOwner)
|
|
m_pOutlinerOwner->OnUpdateDirectorySelection(m_dirIndex, FALSE);
|
|
}
|
|
break;
|
|
|
|
case MSG_NotifyAll:
|
|
case MSG_NotifyScramble:
|
|
Invalidate();
|
|
break;
|
|
}
|
|
|
|
if (( !--m_iMysticPlane && m_pane)) {
|
|
UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CDirOutliner::PropertyMenu ( int iSel, UINT flags )
|
|
{
|
|
BOOL bHasItems = FALSE;
|
|
CMenu cmPopup;
|
|
CString cs;
|
|
|
|
//need to make sure that we have focus
|
|
SetFocus();
|
|
if(cmPopup.CreatePopupMenu() == 0)
|
|
return;
|
|
|
|
if (iSel < m_iTotalLines) {
|
|
cs.LoadString(IDS_NEWADDRESSBOOK);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_FILE_NEWAB, cs);
|
|
cs.LoadString(IDS_NEWDIRECTORY);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_FILE_NEWDIR, cs);
|
|
cmPopup.AppendMenu(MF_SEPARATOR);
|
|
/* MSG_ViewIndex *indices;
|
|
int count;
|
|
pOutliner->GetSelection(indices, count);
|
|
AB_CommandStatusAB2(pPane,
|
|
cmd,
|
|
indices, count,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
} else {
|
|
AB_CommandStatusAB2(pPane,
|
|
cmd,
|
|
NULL, 0,
|
|
&bSelectable,
|
|
&sState,
|
|
NULL,
|
|
&bPlural);
|
|
}
|
|
}
|
|
pCmdUI->Enable(bSelectable);
|
|
if (bUseCheck)
|
|
pCmdUI->SetCheck(sState == MSG_Checked);
|
|
else
|
|
pCmdUI->SetRadio(sState == MSG_Checked); */
|
|
|
|
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(ID_POPUP_CUT);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_CUT, cs);
|
|
cs.LoadString(ID_POPUP_COPY);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_COPY, cs);
|
|
cs.LoadString(ID_POPUP_PASTE);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_PASTE, cs);
|
|
cs.LoadString(IDS_COMPOSE_REMOVE);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_DELETE, cs);
|
|
cs.LoadString(IDS_DELETEFROMALL);
|
|
cmPopup.AppendMenu(MF_ENABLED, ID_EDIT_DELETEALL, cs);
|
|
cmPopup.AppendMenu(MF_SEPARATOR);
|
|
cs.LoadString(IDS_POPUP_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,
|
|
m_pOutlinerOwner->GetOwnerWindow(), NULL);
|
|
|
|
// Cleanup
|
|
cmPopup.DestroyMenu();
|
|
}
|
|
|
|
void CDirOutliner::AcceptDrop( int iLineNo, COleDataObject *pDataObject,
|
|
DROPEFFECT dropEffect )
|
|
{
|
|
HGLOBAL hContent;
|
|
|
|
if(!pDataObject)
|
|
return;
|
|
|
|
// check if we are dropping on ourselves or from the
|
|
// right hand pane
|
|
if ( pDataObject->IsDataAvailable( m_cfDirIndexes ) ||
|
|
pDataObject->IsDataAvailable( m_cfAddrIndexes) ) {
|
|
|
|
AB_ContainerInfo *pContInfo = AB_GetContainerForIndex(m_pane, iLineNo);
|
|
if (pDataObject->IsDataAvailable( m_cfDirIndexes ))
|
|
hContent = pDataObject->GetGlobalData (m_cfDirIndexes);
|
|
else
|
|
hContent = pDataObject->GetGlobalData (m_cfAddrIndexes);
|
|
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock(hContent);
|
|
|
|
AB_DragEffect requireEffect = AB_Default_Drag;
|
|
if (dropEffect & DROPEFFECT_MOVE)
|
|
requireEffect = AB_Require_Move;
|
|
else if (dropEffect & 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;
|
|
}
|
|
|
|
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_cfAddrIndexes = (CLIPFORMAT)RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT);
|
|
m_cfSourceTarget = (CLIPFORMAT)RegisterClipboardFormat(DIRLIST_SOURCETARGET_FORMAT);
|
|
m_cfDirIndexes = (CLIPFORMAT)RegisterClipboardFormat(DIRLIST_INDEX_FORMAT);
|
|
}
|
|
|
|
CLIPFORMAT * CDirOutliner::GetClipFormatList(void)
|
|
{
|
|
static CLIPFORMAT cfFormatList[5];
|
|
cfFormatList[0] = m_cfAddresses;
|
|
cfFormatList[1] = m_cfSourceTarget;
|
|
cfFormatList[2] = m_cfDirIndexes;
|
|
cfFormatList[3] = m_cfAddrIndexes;
|
|
cfFormatList[5] = 0;
|
|
return cfFormatList;
|
|
}
|
|
|
|
DROPEFFECT CDirOutliner::DropSelect( int iLineNo, COleDataObject *pDataObject )
|
|
{
|
|
DROPEFFECT res = DROPEFFECT_NONE;
|
|
HGLOBAL hContent;
|
|
|
|
if ( pDataObject->IsDataAvailable( m_cfDirIndexes ) ||
|
|
pDataObject->IsDataAvailable( m_cfAddrIndexes) ) {
|
|
|
|
if ( m_iDragSelection != -1 )
|
|
InvalidateLine (m_iDragSelection);
|
|
|
|
m_iDragSelection = -1;
|
|
|
|
AB_ContainerInfo *pContInfo = AB_GetContainerForIndex(m_pane, iLineNo);
|
|
if (pDataObject->IsDataAvailable( m_cfDirIndexes ))
|
|
hContent = pDataObject->GetGlobalData (m_cfDirIndexes);
|
|
else
|
|
hContent = pDataObject->GetGlobalData (m_cfAddrIndexes);
|
|
|
|
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;
|
|
|
|
m_iDragSelection = iLineNo;
|
|
|
|
GlobalUnlock (hContent); //do we have to GlobalFree it too?
|
|
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
COleDataSource * CDirOutliner::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);
|
|
|
|
// create a drag type for the indexes
|
|
HANDLE hContent = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(AddressBookDragData));
|
|
AddressBookDragData *pDragData = (AddressBookDragData *) GlobalLock (hContent);
|
|
|
|
pDragData->m_pane = m_pane;
|
|
pDragData->m_indices = indices;
|
|
pDragData->m_count = count;
|
|
|
|
GlobalUnlock(hContent);
|
|
pDataSource->CacheGlobalData(m_cfDirIndexes, hContent);
|
|
|
|
/* 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;
|
|
}
|
|
|
|
|
|
int CDirOutliner::Expand( int iLine )
|
|
{
|
|
if (MSG_ExpansionDelta( m_pane, iLine ) > 0) {
|
|
return ToggleExpansion( iLine );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int CDirOutliner::Collapse( int iLine )
|
|
{
|
|
if (MSG_ExpansionDelta( m_pane, iLine ) < 0) {
|
|
return ToggleExpansion( iLine );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int CDirOutliner::ToggleExpansion( int iLine )
|
|
{
|
|
int32 numChanged = 0;
|
|
|
|
MSG_ToggleExpansion( m_pane, iLine, &numChanged );
|
|
|
|
return (int) numChanged;
|
|
}
|
|
|
|
|
|
int CDirOutliner::TranslateIcon ( void * pLineData )
|
|
{
|
|
AB_ContainerAttribValue* line = (AB_ContainerAttribValue*) pLineData;
|
|
int idxImage = 0;
|
|
|
|
if (m_pLineValues[0].u.containerType == AB_LDAPContainer)
|
|
idxImage = IDX_DIRLDAPAB;
|
|
else
|
|
if (m_pLineValues[0].u.containerType == AB_PABContainer)
|
|
idxImage = IDX_DIRPERSONALAB;
|
|
else // mailing list
|
|
idxImage = IDX_DIRMAILINGLIST;
|
|
return idxImage;
|
|
}
|
|
|
|
int CDirOutliner::TranslateIconFolder (void * pLineData)
|
|
{
|
|
ASSERT(pLineData);
|
|
|
|
AB_ContainerAttribValue* line = (AB_ContainerAttribValue*) pLineData;
|
|
|
|
// if the depth is 0 and children > 0 and
|
|
// expansion delta > 0 it must be closed
|
|
if ((line[2].u.number == 0) && (line[3].u.number > 0))
|
|
{
|
|
if (MSG_ExpansionDelta(m_pane, m_lineindex) > 0)
|
|
return(OUTLINER_CLOSEDFOLDER);
|
|
else
|
|
return(OUTLINER_OPENFOLDER);
|
|
}
|
|
return (OUTLINER_ITEM);
|
|
}
|
|
|
|
|
|
BOOL CDirOutliner::ColumnCommand ( int iColumn, int iLine )
|
|
{
|
|
// We have no column commands
|
|
return FALSE;
|
|
}
|
|
|
|
void * CDirOutliner::AcquireLineData ( int line )
|
|
{
|
|
if (m_pLineValues) {
|
|
AB_FreeContainerAttribValues (m_pLineValues, m_numItems);
|
|
m_pLineValues = NULL;
|
|
}
|
|
|
|
m_lineindex = line;
|
|
if ( line >= m_iTotalLines)
|
|
return NULL;
|
|
|
|
AB_GetContainerAttributes (AB_GetContainerForIndex(m_pane, line),
|
|
ContainerAttribs, &m_pLineValues, &m_numItems);
|
|
|
|
// create an ancestor based on the depth
|
|
m_pAncestor = new OutlinerAncestorInfo[m_pLineValues [2].u.number+1];
|
|
if ( m_pLineValues [2].u.number )
|
|
{
|
|
// if it is a mailing list
|
|
AB_ContainerAttribValue* lineValue = NULL;
|
|
AB_ContainerInfo * info = NULL;
|
|
info = AB_GetContainerForIndex(m_pane, line - 1);
|
|
AB_GetContainerAttribute (AB_GetContainerForIndex(m_pane, line - 1),
|
|
attribContainerType, &lineValue);
|
|
m_pAncestor[1].has_prev = lineValue->u.containerType == AB_MListContainer;
|
|
AB_FreeContainerAttribValue (lineValue);
|
|
lineValue = NULL;
|
|
info = AB_GetContainerForIndex(m_pane, line + 1);
|
|
if (info)
|
|
{
|
|
AB_GetContainerAttribute (AB_GetContainerForIndex(m_pane, line + 1),
|
|
attribContainerType, &lineValue);
|
|
m_pAncestor[1].has_next = lineValue->u.containerType == AB_MListContainer;;
|
|
AB_FreeContainerAttribValue (lineValue);
|
|
}
|
|
else
|
|
m_pAncestor[1].has_next = FALSE;
|
|
m_pAncestor[0].has_next = FALSE;
|
|
m_pAncestor[0].has_prev = FALSE;
|
|
|
|
}
|
|
else
|
|
{
|
|
// if it is a top level container and has children
|
|
m_pAncestor[0].has_next = (m_pLineValues [3].u.number > 0);
|
|
m_pAncestor[0].has_prev = FALSE;
|
|
}
|
|
|
|
return m_pLineValues;
|
|
}
|
|
|
|
void CDirOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth, OutlinerAncestorInfo ** pAncestor )
|
|
{
|
|
if (pFlags)
|
|
*pFlags = 0;
|
|
if (pDepth)
|
|
*pDepth = m_pLineValues [2].u.number;
|
|
if (pAncestor)
|
|
*pAncestor = m_pAncestor;
|
|
}
|
|
|
|
void CDirOutliner::ReleaseLineData ( void * )
|
|
{
|
|
delete [] m_pAncestor;
|
|
m_pAncestor = NULL;
|
|
}
|
|
|
|
LPCTSTR CDirOutliner::GetColumnText ( UINT iColumn, void * pLineData )
|
|
{
|
|
AB_ContainerAttribValue* line = (AB_ContainerAttribValue*) pLineData;
|
|
|
|
switch (iColumn) {
|
|
case ID_COLDIR_NAME:
|
|
return line[1].u.string;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ("");
|
|
}
|
|
|
|
void CDirOutliner::OnSelChanged()
|
|
{
|
|
MSG_ViewIndex *indices = NULL;
|
|
int count = 0;
|
|
|
|
if (m_pOutlinerOwner && m_pOutlinerOwner->IsSearching())
|
|
return;
|
|
|
|
GetSelection(indices, count);
|
|
|
|
if (count == 1 && m_pOutlinerOwner) {
|
|
if (m_dirIndex != indices[0]) {
|
|
m_dirIndex = indices[0];
|
|
m_pOutlinerOwner->OnUpdateDirectorySelection(indices[0], TRUE);
|
|
}
|
|
}
|
|
}
|
|
|
|
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) );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
COutliner * CDirOutlinerParent::GetOutliner ( void )
|
|
{
|
|
return new CDirOutliner;
|
|
}
|
|
|
|
void CDirOutlinerParent::CreateColumns ( void )
|
|
{
|
|
int iCol0 = 0,
|
|
iCol1 = 0;
|
|
CString cs;
|
|
cs.LoadString(IDS_USERNAME);
|
|
m_pOutliner->AddColumn (cs, ID_COLDIR_NAME, 1500, 0, ColumnVariable, iCol0 ? iCol0 : 1500 );
|
|
m_pOutliner->SetHasPipes( TRUE );
|
|
m_pOutliner->SetImageColumn (ID_COLDIR_NAME);
|
|
}
|
|
|
|
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 )
|
|
{
|
|
// no sorting for the directories
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void WFE_MSGOpenAB()
|
|
{
|
|
CAddrFrame::Open();
|
|
}
|
|
|
|
DIR_Server *CAddrFrame::DIRServerFromMenuID( UINT &nBase, UINT nID )
|
|
{
|
|
int i;
|
|
XP_List* pabList = NULL;
|
|
DIR_Server* res = NULL;
|
|
|
|
// pabList = DIR_GetPersonalAddressBooks (theApp.m_directories);
|
|
|
|
// Figure out which pab corrresponds to the id
|
|
res = (DIR_Server*) XP_ListGetObjectNum (pabList, (nID - nBase) + 1);
|
|
|
|
return res;
|
|
}
|
|
|
|
DIR_Server *CAddrFrame::DIRServerFromMenuID( UINT nID )
|
|
{
|
|
UINT nBase = 0;
|
|
DIR_Server* res = NULL;
|
|
|
|
if ( nID >= FIRST_ADDSENDER_MENU_ID && nID <= LAST_ADDSENDER_MENU_ID )
|
|
{
|
|
nBase = FIRST_ADDSENDER_MENU_ID;
|
|
}
|
|
if ( nID >= FIRST_ADDALL_MENU_ID && nID <= LAST_ADDALL_MENU_ID )
|
|
{
|
|
nBase = FIRST_ADDALL_MENU_ID;
|
|
}
|
|
|
|
ASSERT (nBase);
|
|
if (nBase)
|
|
res = CAddrFrame::DIRServerFromMenuID( nBase, nID );
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
void CAddrFrame::UpdateMenu(HMENU hMenu, UINT &nID)
|
|
{
|
|
// *** If you change the way this menu is built, you also need to
|
|
// change CAddrFrame::DIRServerFromMenuID
|
|
|
|
int i, j;
|
|
XP_List* pabList = NULL;
|
|
DIR_Server* pab = NULL;
|
|
int32 iCount = 0;
|
|
char buffer[_MAX_PATH];
|
|
|
|
// pabList = DIR_GetPersonalAddressBooks (theApp.m_directories);
|
|
j = 0;
|
|
iCount = XP_ListCount(pabList);
|
|
|
|
for ( i = 0; i < iCount; i++) {
|
|
pab = (DIR_Server*) XP_ListGetObjectNum (theApp.m_directories, i + 1);
|
|
|
|
if ( pab ) {
|
|
if (j < 10) {
|
|
sprintf( buffer, "&%d %s", j, pab->description);
|
|
} else if ( j < 36 ) {
|
|
sprintf( buffer, "&%c %s", 'a' + j - 10, pab->description);
|
|
} else {
|
|
sprintf( buffer, " %s", pab->description);
|
|
}
|
|
::AppendMenu( hMenu, MF_STRING, nID, buffer);
|
|
nID++;
|
|
j++;
|
|
}
|
|
}
|
|
}
|
|
|
|
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( 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 );
|
|
}
|
|
|
|
void WFE_MSGBuildAddAddressBookPopups(HMENU hMenu, int nStartPosition,
|
|
BOOL bCreateMenuItem, MWContext *pContext)
|
|
{
|
|
|
|
XP_List *addressBooks = AB_AcquireAddressBookContainers(pContext);
|
|
|
|
|
|
if(addressBooks)
|
|
{
|
|
|
|
if(hMenu)
|
|
{
|
|
int nCount = XP_ListCount(addressBooks);
|
|
if(nCount == 1)
|
|
{
|
|
//just add menu items, don't create submenus for each address book
|
|
if(bCreateMenuItem)
|
|
{
|
|
::InsertMenu(hMenu, nStartPosition, MF_BYPOSITION| MF_STRING,
|
|
FIRST_ADDSENDER_MENU_ID + 1, szLoadString(IDS_ADDSENDER));
|
|
|
|
::InsertMenu(hMenu, nStartPosition + 1, MF_BYPOSITION| MF_STRING,
|
|
FIRST_ADDALL_MENU_ID + 1, szLoadString(IDS_ADDALL));
|
|
}
|
|
else
|
|
{
|
|
::ModifyMenu(hMenu, nStartPosition, MF_BYPOSITION| MF_STRING,
|
|
FIRST_ADDSENDER_MENU_ID + 1, szLoadString(IDS_ADDSENDER));
|
|
|
|
::ModifyMenu(hMenu, nStartPosition + 1, MF_BYPOSITION| MF_STRING,
|
|
FIRST_ADDALL_MENU_ID + 1, szLoadString(IDS_ADDALL));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Need to create a submenu for each address book
|
|
HMENU senderMenu = ::CreatePopupMenu();
|
|
HMENU allMenu = ::CreatePopupMenu();
|
|
|
|
if(bCreateMenuItem)
|
|
{
|
|
::InsertMenu(hMenu, nStartPosition, MF_BYPOSITION| MF_STRING | MF_POPUP,
|
|
(UINT)senderMenu, szLoadString(IDS_ADDSENDER));
|
|
|
|
::InsertMenu(hMenu, nStartPosition + 1, MF_BYPOSITION| MF_STRING | MF_POPUP,
|
|
(UINT)allMenu, szLoadString(IDS_ADDALL));
|
|
}
|
|
else
|
|
{
|
|
::ModifyMenu(hMenu, nStartPosition, MF_BYPOSITION| MF_STRING | MF_POPUP,
|
|
(UINT)senderMenu, szLoadString(IDS_ADDSENDER));
|
|
|
|
::ModifyMenu(hMenu, nStartPosition + 1, MF_BYPOSITION| MF_STRING | MF_POPUP,
|
|
(UINT)allMenu, szLoadString(IDS_ADDALL));
|
|
}
|
|
|
|
for(int i = 1; i <= nCount; i++)
|
|
{
|
|
AB_ContainerInfo *info =
|
|
(AB_ContainerInfo*)XP_ListGetObjectNum (addressBooks, i);
|
|
|
|
AB_ContainerAttribValue *value;
|
|
AB_GetContainerAttribute(info, attribName, &value);
|
|
|
|
if(value != NULL)
|
|
{
|
|
::AppendMenu(senderMenu, MF_BYPOSITION | MF_STRING,
|
|
FIRST_ADDSENDER_MENU_ID + i, value->u.string);
|
|
::AppendMenu(allMenu, MF_BYPOSITION | MF_STRING,
|
|
FIRST_ADDALL_MENU_ID + i, value->u.string);
|
|
|
|
AB_FreeContainerAttribValue(value);
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
AB_ReleaseContainersList(addressBooks);
|
|
}
|
|
|
|
}
|
|
#else
|
|
|
|
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;
|
|
if (widget)
|
|
{
|
|
GetDlgItem(IDC_DIRECTORIES)->ShowWindow (SW_HIDE);
|
|
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);
|
|
|
|
if (widget)
|
|
{
|
|
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();
|
|
}
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// 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);
|
|
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) {
|
|
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);
|
|
}
|
|
|
|
OnStopSearch();
|
|
|
|
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)
|
|
{
|
|
if (GetCurrentDirectoryServer()->dirType == LDAPDirectory) {
|
|
if(m_pDirOutliner == GetFocus())
|
|
{
|
|
pCmdUI->Enable(TRUE);
|
|
return;
|
|
}
|
|
}
|
|
|
|
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 )
|
|
{
|
|
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)) {
|
|
//the property sheet dialog destroys itself when it closes so it's not worth
|
|
//saving
|
|
|
|
//m_userPropList.Add (prop);
|
|
}
|
|
}
|
|
|
|
void CAddrFrame::OnAddAB ( void )
|
|
{
|
|
HandleErrorReturn(AB_Command (m_addrBookPane, AB_NewAddressBook, 0, 0), this);
|
|
}
|
|
|
|
|
|
void CAddrFrame::OnAddDir ( void )
|
|
{
|
|
CString label;
|
|
label.LoadString(IDS_ADD_LDAP_SERVER);
|
|
CAddrLDAPProperties serverProperties(this, GetContext(), NULL, label);
|
|
if (IDOK == serverProperties.DoModal())
|
|
{
|
|
DIR_Server* pServer = &serverProperties.m_serverInfo, *pNewServer;
|
|
DIR_CopyServer(pServer, &pNewServer);
|
|
if (pNewServer && pNewServer->dirType == LDAPDirectory)
|
|
{
|
|
DIR_SetServerFileName(pNewServer, pNewServer->serverName);
|
|
}
|
|
XP_ListAddObjectToEnd(theApp.m_directories, pNewServer);
|
|
DIR_SaveServerPreferences (theApp.m_directories);
|
|
}
|
|
}
|
|
|
|
|
|
void CAddrFrame::OnHTMLDomains ( void )
|
|
{
|
|
MSG_DisplayHTMLDomainsDialog(GetContext());
|
|
}
|
|
|
|
void CAddrFrame::OnUpdateHTMLDomains( CCmdUI *pCmdUI )
|
|
{
|
|
pCmdUI->Enable( TRUE );
|
|
}
|
|
|
|
void CAddrFrame::OnCreateCard ( void )
|
|
{
|
|
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)) {
|
|
//the property sheet dialog destroys itself when it closes so it's not worth
|
|
//saving
|
|
// 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)) {
|
|
//the property sheet dialog destroys itself when it closes so it's not worth
|
|
//saving
|
|
// m_userPropList.Add (prop);
|
|
}
|
|
}
|
|
}
|
|
if (email)
|
|
XP_FREE (email);
|
|
if (name)
|
|
XP_FREE (name);
|
|
}
|
|
|
|
|
|
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()
|
|
{
|
|
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 ) );
|
|
}
|
|
|
|
|
|
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)
|
|
{
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
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()
|
|
{
|
|
if (GetCurrentDirectoryServer()->dirType == LDAPDirectory) {
|
|
|
|
if(m_pDirOutliner == GetFocus())
|
|
{
|
|
CString label;
|
|
label.LoadString(IDS_ADD_LDAP_SERVER);
|
|
CAddrLDAPProperties serverProperties(this, GetContext(),
|
|
GetCurrentDirectoryServer(), label);
|
|
if (IDOK == serverProperties.DoModal())
|
|
{
|
|
DIR_SaveServerPreferences (theApp.m_directories);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
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)) {
|
|
//the property sheet dialog destroys itself when it closes so it's not worth
|
|
//saving
|
|
// 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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
CSearchDialog searchDlg ((UINT) IDS_ADRSEARCH,
|
|
(MSG_Pane*) m_addrBookPane,
|
|
GetCurrentDirectoryServer(),
|
|
this);
|
|
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;
|
|
|
|
GetSelection(indices, count);
|
|
|
|
|
|
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();
|
|
}
|
|
|
|
DIR_Server *CAddrFrame::DIRServerFromMenuID( UINT &nBase, UINT nID )
|
|
{
|
|
int i;
|
|
XP_List* pabList = NULL;
|
|
DIR_Server* res = NULL;
|
|
|
|
// pabList = DIR_GetPersonalAddressBooks (theApp.m_directories);
|
|
|
|
// Figure out which pab corrresponds to the id
|
|
res = (DIR_Server*) XP_ListGetObjectNum (pabList, (nID - nBase) + 1);
|
|
|
|
return res;
|
|
}
|
|
|
|
DIR_Server *CAddrFrame::DIRServerFromMenuID( UINT nID )
|
|
{
|
|
UINT nBase = 0;
|
|
DIR_Server* res = NULL;
|
|
|
|
if ( nID >= FIRST_ADDSENDER_MENU_ID && nID <= LAST_ADDSENDER_MENU_ID )
|
|
{
|
|
nBase = FIRST_ADDSENDER_MENU_ID;
|
|
}
|
|
if ( nID >= FIRST_ADDALL_MENU_ID && nID <= LAST_ADDALL_MENU_ID )
|
|
{
|
|
nBase = FIRST_ADDALL_MENU_ID;
|
|
}
|
|
|
|
ASSERT (nBase);
|
|
if (nBase)
|
|
res = CAddrFrame::DIRServerFromMenuID( nBase, nID );
|
|
|
|
return res;
|
|
}
|
|
|
|
|
|
void CAddrFrame::UpdateMenu(HMENU hMenu, UINT &nID)
|
|
{
|
|
// *** If you change the way this menu is built, you also need to
|
|
// change CAddrFrame::DIRServerFromMenuID
|
|
|
|
int i, j;
|
|
XP_List* pabList = NULL;
|
|
DIR_Server* pab = NULL;
|
|
int32 iCount = 0;
|
|
char buffer[_MAX_PATH];
|
|
|
|
// pabList = DIR_GetPersonalAddressBooks (theApp.m_directories);
|
|
j = 0;
|
|
iCount = XP_ListCount(pabList);
|
|
|
|
for ( i = 0; i < iCount; i++) {
|
|
pab = (DIR_Server*) XP_ListGetObjectNum (theApp.m_directories, i + 1);
|
|
|
|
if ( pab ) {
|
|
if (j < 10) {
|
|
sprintf( buffer, "&%d %s", j, pab->description);
|
|
} else if ( j < 36 ) {
|
|
sprintf( buffer, "&%c %s", 'a' + j - 10, pab->description);
|
|
} else {
|
|
sprintf( buffer, " %s", pab->description);
|
|
}
|
|
::AppendMenu( hMenu, MF_STRING, nID, buffer);
|
|
nID++;
|
|
j++;
|
|
}
|
|
}
|
|
}
|
|
|
|
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 );
|
|
}
|
|
|
|
|
|
#endif
|
|
|