WABTOOLDLG.CPP

// wabtoolDlg.cpp : implementation file 
//

#include "stdafx.h"
#include "wabtool.h"
#include "wabobject.h"
#include "wabtoolDlg.h"
#include "DlgProp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CWAB * g_pWAB;

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWabtoolDlg dialog

CWabtoolDlg::CWabtoolDlg(CWnd* pParent /*=NULL*/)
: CDialog(CWabtoolDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CWabtoolDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CWabtoolDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWabtoolDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CWabtoolDlg, CDialog)
//{{AFX_MSG_MAP(CWabtoolDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnDblclkList)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, OnItemchangedList)
ON_LBN_SELCHANGE(IDC_LIST_TAGS, OnSelchangeListTags)
ON_BN_CLICKED(IDC_BUTTON_DETAILS, OnButtonDetails)
ON_BN_CLICKED(IDC_BUTTON_NEW, OnButtonNew)
ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
ON_BN_CLICKED(IDC_BUTTON_ADDPROP, OnButtonAddprop)
ON_BN_CLICKED(IDC_BUTTON_MODIFYPROP, OnButtonModifyprop)
ON_LBN_DBLCLK(IDC_LIST_TAGS, OnDblclkListTags)
ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnButtonRefresh)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWabtoolDlg message handlers

BOOL CWabtoolDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);// Set small icon

// TODO: Add extra initialization here
InitCommonControls();

LoadContents(TRUE);

return TRUE; // return TRUE unless you set the focus to a control
}

void CWabtoolDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CWabtoolDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CWabtoolDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

BOOL CWabtoolDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
ClearCurrentWAB(TRUE);

return CDialog::DestroyWindow();
}

//
// Double-clicking the contents list view shows Details on the
// selected entries
//
void CWabtoolDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)
{
g_pWAB->ShowSelectedItemDetails(m_hWnd);

*pResult = 0;
}

//
// Clicking the browse button lets the user select a new WAB file
// to inspect
//
void CWabtoolDlg::OnButtonBrowse()
{

char szFilters[]="WAB Files (*.wab)|*.wab|All Files (*.*)|*.*||";
CFileDialog CFileDlg (TRUE, "wab", "*.wab",
OFN_FILEMUSTEXIST, szFilters, this);

if(CFileDlg.DoModal() == IDOK)
{
delete m_pszFileName;
m_pszFileName = new CString(CFileDlg.GetPathName());

ClearCurrentWAB(TRUE);

LoadContents(TRUE);

}
}

// Loads the WAB contents into the list view
//
// bLoadNew is true if we are loading a new file
//
void CWabtoolDlg::LoadContents(BOOL bLoadNew)
{

CListCtrl * pListView = (CListCtrl *) GetDlgItem(IDC_LIST);

if(bLoadNew)
g_pWAB = new CWAB(m_pszFileName);

g_pWAB->LoadWABContents(pListView);

CStatic * pFileName = (CStatic *) GetDlgItem(IDC_STATIC_FILENAME);
pFileName->SetWindowText((LPTSTR) (LPCTSTR) *m_pszFileName);

TCHAR sz[256];
wsprintf(sz, "%d entries", pListView->GetItemCount());
CStatic * pCount = (CStatic *) GetDlgItem(IDC_STATIC_NUMENTRIES);
pCount->SetWindowText(sz);

// select the first item in the list view
pListView->SetItem( 0, 0,
LVIF_STATE,NULL,
0,
LVNI_SELECTED | LVNI_FOCUSED,
LVNI_SELECTED | LVNI_FOCUSED,
NULL);

}

//
// Clear out the currently loaded WAB
//
void CWabtoolDlg::ClearCurrentWAB(BOOL bLoadNew)
{
CListCtrl * pListView = (CListCtrl *) GetDlgItem(IDC_LIST);
g_pWAB->ClearWABLVContents(pListView);

if(bLoadNew) // we'll be loading a new address book so lose this object
delete g_pWAB;
}

void CWabtoolDlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

CListCtrl * pListView = (CListCtrl *) GetDlgItem(IDC_LIST);

static int oldItem = -1;

int newItem = pListView->GetNextItem(-1, LVNI_SELECTED);

if(newItem != oldItem && newItem != -1)
{
g_pWAB->SetSelection(pListView);
g_pWAB->GetSelectedItemPropArray();

UpdatePropTagData();

OnSelchangeListTags();

oldItem = newItem;
}

*pResult = 0;
}

void CWabtoolDlg::UpdatePropTagData()
{
g_pWAB->LoadPropTags((CListBox *) GetDlgItem(IDC_LIST_TAGS));
}

void CWabtoolDlg::OnSelchangeListTags()
{
TCHAR sz[64];

CListBox * pList = (CListBox *) GetDlgItem(IDC_LIST_TAGS);

ULONG ulPropTag = (ULONG) pList->GetItemData(pList->GetCurSel());

pList->GetText(pList->GetCurSel(), sz);

SetPropTagString(sz);
SetPropTypeString(ulPropTag);
SetPropNameString(ulPropTag);
SetPropDataString(ulPropTag);

}

LPTSTR PropTypeString(ULONG ulPropType) {
switch (ulPropType) {
case PT_UNSPECIFIED:
return("PT_UNSPECIFIED");
case PT_NULL:
return("PT_NULL ");
case PT_I2:
return("PT_I2 ");
case PT_LONG:
return("PT_LONG ");
case PT_R4:
return("PT_R4 ");
case PT_DOUBLE:
return("PT_DOUBLE ");
case PT_CURRENCY:
return("PT_CURRENCY ");
case PT_APPTIME:
return("PT_APPTIME ");
case PT_ERROR:
return("PT_ERROR ");
case PT_BOOLEAN:
return("PT_BOOLEAN ");
case PT_OBJECT:
return("PT_OBJECT ");
case PT_I8:
return("PT_I8 ");
case PT_STRING8:
return("PT_STRING8 ");
case PT_UNICODE:
return("PT_UNICODE ");
case PT_SYSTIME:
return("PT_SYSTIME ");
case PT_CLSID:
return("PT_CLSID ");
case PT_BINARY:
return("PT_BINARY ");
case PT_MV_I2:
return("PT_MV_I2 ");
case PT_MV_LONG:
return("PT_MV_LONG ");
case PT_MV_R4:
return("PT_MV_R4 ");
case PT_MV_DOUBLE:
return("PT_MV_DOUBLE ");
case PT_MV_CURRENCY:
return("PT_MV_CURRENCY");
case PT_MV_APPTIME:
return("PT_MV_APPTIME ");
case PT_MV_SYSTIME:
return("PT_MV_SYSTIME ");
case PT_MV_STRING8:
return("PT_MV_STRING8 ");
case PT_MV_BINARY:
return("PT_MV_BINARY ");
case PT_MV_UNICODE:
return("PT_MV_UNICODE ");
case PT_MV_CLSID:
return("PT_MV_CLSID ");
case PT_MV_I8:
return("PT_MV_I8 ");
default:
return(" <unknown> ");
}
}

void CWabtoolDlg::SetPropTypeString(ULONG ulPropTag)
{
((CStatic *) GetDlgItem(IDC_STATIC_PROPTYPE))->SetWindowText(PropTypeString(PROP_TYPE(ulPropTag)));
}

void CWabtoolDlg::SetPropTagString(LPTSTR lpTag)
{
((CStatic *) GetDlgItem(IDC_STATIC_PROPTAG))->SetWindowText(lpTag);
}

void CWabtoolDlg::OnButtonDetails()
{
g_pWAB->ShowSelectedItemDetails(m_hWnd);
// refresh the list view
OnButtonRefresh();
}

#define RETURN_PROP_CASE(pt) case PROP_ID(pt): return(#pt)

/***************************************************************************

Name : PropTagName

Purpose : Associate a name with a property tag

Parameters: ulPropTag = property tag

Returns : none

Comment : Add new Property ID's as they become known

***************************************************************************/
LPTSTR PropTagName(ULONG ulPropTag) {
static TCHAR szPropTag[35]; // see string on default

switch (PROP_ID(ulPropTag)) {
RETURN_PROP_CASE(PR_7BIT_DISPLAY_NAME);
RETURN_PROP_CASE(PR_ACCOUNT);
RETURN_PROP_CASE(PR_ADDRTYPE);
RETURN_PROP_CASE(PR_ALTERNATE_RECIPIENT);
RETURN_PROP_CASE(PR_ASSISTANT);
RETURN_PROP_CASE(PR_ASSISTANT_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_BIRTHDAY);
RETURN_PROP_CASE(PR_BUSINESS_FAX_NUMBER);
RETURN_PROP_CASE(PR_BUSINESS_HOME_PAGE);
RETURN_PROP_CASE(PR_BUSINESS_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_BUSINESS2_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_CALLBACK_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_CAR_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_CELLULAR_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_CHILDRENS_NAMES);
RETURN_PROP_CASE(PR_COMMENT);
RETURN_PROP_CASE(PR_COMPANY_MAIN_PHONE_NUMBER);
RETURN_PROP_CASE(PR_COMPANY_NAME);
RETURN_PROP_CASE(PR_COMPUTER_NETWORK_NAME);
RETURN_PROP_CASE(PR_CONTACT_ADDRTYPES);
RETURN_PROP_CASE(PR_CONTACT_DEFAULT_ADDRESS_INDEX);
RETURN_PROP_CASE(PR_CONTACT_EMAIL_ADDRESSES);
RETURN_PROP_CASE(PR_CONTACT_ENTRYIDS);
RETURN_PROP_CASE(PR_CONTACT_VERSION);
RETURN_PROP_CASE(PR_CONVERSION_PROHIBITED);
RETURN_PROP_CASE(PR_COUNTRY);
RETURN_PROP_CASE(PR_CUSTOMER_ID);
RETURN_PROP_CASE(PR_DEPARTMENT_NAME);
RETURN_PROP_CASE(PR_DISCLOSE_RECIPIENTS);
RETURN_PROP_CASE(PR_DISPLAY_NAME);
RETURN_PROP_CASE(PR_DISPLAY_NAME_PREFIX);
RETURN_PROP_CASE(PR_EMAIL_ADDRESS);
RETURN_PROP_CASE(PR_ENTRYID);
RETURN_PROP_CASE(PR_FTP_SITE);
RETURN_PROP_CASE(PR_GENDER);
RETURN_PROP_CASE(PR_GENERATION);
RETURN_PROP_CASE(PR_GIVEN_NAME);
RETURN_PROP_CASE(PR_GOVERNMENT_ID_NUMBER);
RETURN_PROP_CASE(PR_HOBBIES);
RETURN_PROP_CASE(PR_HOME_ADDRESS_CITY);
RETURN_PROP_CASE(PR_HOME_ADDRESS_COUNTRY);
RETURN_PROP_CASE(PR_HOME_ADDRESS_POST_OFFICE_BOX);
RETURN_PROP_CASE(PR_HOME_ADDRESS_POSTAL_CODE);
RETURN_PROP_CASE(PR_HOME_ADDRESS_STATE_OR_PROVINCE);
RETURN_PROP_CASE(PR_HOME_ADDRESS_STREET);
RETURN_PROP_CASE(PR_HOME_FAX_NUMBER);
RETURN_PROP_CASE(PR_HOME_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_HOME2_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_INITIALS);
RETURN_PROP_CASE(PR_ISDN_NUMBER);
RETURN_PROP_CASE(PR_KEYWORD);
RETURN_PROP_CASE(PR_LANGUAGE);
RETURN_PROP_CASE(PR_LOCALITY);
RETURN_PROP_CASE(PR_LOCATION);
RETURN_PROP_CASE(PR_MAIL_PERMISSION);
RETURN_PROP_CASE(PR_MANAGER_NAME);
RETURN_PROP_CASE(PR_MHS_COMMON_NAME);
RETURN_PROP_CASE(PR_MIDDLE_NAME);
RETURN_PROP_CASE(PR_NICKNAME);
RETURN_PROP_CASE(PR_OBJECT_TYPE);
RETURN_PROP_CASE(PR_OFFICE_LOCATION);
RETURN_PROP_CASE(PR_ORGANIZATIONAL_ID_NUMBER);
RETURN_PROP_CASE(PR_ORIGINAL_DISPLAY_NAME);
RETURN_PROP_CASE(PR_ORIGINAL_ENTRYID);
RETURN_PROP_CASE(PR_ORIGINAL_SEARCH_KEY);
RETURN_PROP_CASE(PR_OTHER_ADDRESS_CITY);
RETURN_PROP_CASE(PR_OTHER_ADDRESS_COUNTRY);
RETURN_PROP_CASE(PR_OTHER_ADDRESS_POST_OFFICE_BOX);
RETURN_PROP_CASE(PR_OTHER_ADDRESS_POSTAL_CODE);
RETURN_PROP_CASE(PR_OTHER_ADDRESS_STATE_OR_PROVINCE);
RETURN_PROP_CASE(PR_OTHER_ADDRESS_STREET);
RETURN_PROP_CASE(PR_OTHER_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_PAGER_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_PERSONAL_HOME_PAGE);
RETURN_PROP_CASE(PR_POST_OFFICE_BOX);
RETURN_PROP_CASE(PR_POSTAL_ADDRESS);
RETURN_PROP_CASE(PR_POSTAL_CODE);
RETURN_PROP_CASE(PR_PREFERRED_BY_NAME);
RETURN_PROP_CASE(PR_PRIMARY_FAX_NUMBER);
RETURN_PROP_CASE(PR_PRIMARY_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_PROFESSION);
RETURN_PROP_CASE(PR_RADIO_TELEPHONE_NUMBER);
RETURN_PROP_CASE(PR_SEND_INTERNET_ENCODING);
RETURN_PROP_CASE(PR_SEND_RICH_INFO);
RETURN_PROP_CASE(PR_SPOUSE_NAME);
RETURN_PROP_CASE(PR_STATE_OR_PROVINCE);
RETURN_PROP_CASE(PR_STREET_ADDRESS);
RETURN_PROP_CASE(PR_SURNAME);
RETURN_PROP_CASE(PR_TELEX_NUMBER);
RETURN_PROP_CASE(PR_TITLE);
RETURN_PROP_CASE(PR_TRANSMITABLE_DISPLAY_NAME);
RETURN_PROP_CASE(PR_TTYTDD_PHONE_NUMBER);
RETURN_PROP_CASE(PR_USER_CERTIFICATE);
RETURN_PROP_CASE(PR_USER_X509_CERTIFICATE);
RETURN_PROP_CASE(PR_WEDDING_ANNIVERSARY);
RETURN_PROP_CASE(PR_SEARCH_KEY);

default:
wsprintf(szPropTag, "Unknown property tag 0x%x", PROP_ID(ulPropTag));
return(szPropTag);
}
}


void CWabtoolDlg::SetPropNameString(ULONG ulPropTag)
{
LPTSTR lp = PropTagName(ulPropTag);

CStatic * pType = (CStatic *) GetDlgItem(IDC_STATIC_PROPNAME);

pType->SetWindowText(lp);
}


void CWabtoolDlg::SetPropDataString(ULONG ulPropTag)
{
CEdit * pEdit = (CEdit *) GetDlgItem(IDC_EDIT_PROPDATA);

g_pWAB->SetPropString(pEdit, ulPropTag);
}

void CWabtoolDlg::OnButtonNew()
{

HRESULT hr = g_pWAB->ShowNewEntryDialog(m_hWnd);

if(!hr)
OnButtonRefresh();
}

void CWabtoolDlg::OnButtonDelete()
{
g_pWAB->DeleteEntry();
// refresh the list view
OnButtonRefresh();
}

void CWabtoolDlg::OnButtonAddprop()
{
TCHAR sz[512];
*sz = '\0';
CDlgProp dlgProp;

dlgProp.m_ulPropTag = 0;
dlgProp.m_lpszPropVal = sz;
dlgProp.m_cbsz = sizeof(sz);

if(dlgProp.DoModal())
{
g_pWAB->SetSingleStringProp(m_hWnd, dlgProp.m_ulPropTag, sz);
UpdatePropTagData();
OnSelchangeListTags();
}

}

void CWabtoolDlg::OnButtonModifyprop()
{

CListBox * pList = (CListBox *) GetDlgItem(IDC_LIST_TAGS);

ULONG ulPropTag = (ULONG) pList->GetItemData(pList->GetCurSel());

TCHAR sz[512];

if(g_pWAB->GetStringPropVal(m_hWnd, ulPropTag, sz, sizeof(sz)))
{
CDlgProp dlgProp;

dlgProp.m_ulPropTag = ulPropTag;
dlgProp.m_lpszPropVal = sz;
dlgProp.m_cbsz = sizeof(sz);

if(dlgProp.DoModal())
{
g_pWAB->SetSingleStringProp(m_hWnd, ulPropTag, sz);
UpdatePropTagData();
OnSelchangeListTags();
}


}

}

void CWabtoolDlg::OnDblclkListTags()
{
OnButtonModifyprop();
}

void CWabtoolDlg::OnButtonRefresh()
{
// refresh the list view
ClearCurrentWAB(FALSE);
LoadContents(FALSE);
}