Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

757 lines
20 KiB

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corp., 1997 **/
/**********************************************************************/
/*
sfmfasoc.cpp
Implementation for the file association property page.
FILE HISTORY:
8/20/97 ericdav Code moved into file managemnet snapin
*/
#include "stdafx.h"
#include "sfmcfg.h"
#include "sfmfasoc.h"
#include "sfmtypes.h"
#include "sfmutil.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int CompareCreators(CAfpTypeCreator * pAfpTC1, CAfpTypeCreator * pAfpTC2)
{
CString str1, str2;
str1 = pAfpTC1->QueryCreator();
str2 = pAfpTC2->QueryCreator();
return lstrcmpi(str1,str2);
}
int CompareTypes(CAfpTypeCreator * pAfpTC1, CAfpTypeCreator * pAfpTC2)
{
CString str1, str2;
str1 = pAfpTC1->QueryType();
str2 = pAfpTC2->QueryType();
return lstrcmpi(str1,str2);
}
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CAfpTypeCreator * pAfpTC1 = (CAfpTypeCreator *) lParam1;
CAfpTypeCreator * pAfpTC2 = (CAfpTypeCreator *) lParam2;
CString str1, str2;
int nCompare = 0;
// special case, we want the default to show up at the top always
if (pAfpTC1->QueryId() == AFP_DEF_TCID)
return -1;
else if (pAfpTC2->QueryId() == AFP_DEF_TCID)
return 1;
switch (lParamSort)
{
// creator
case 0:
nCompare = CompareCreators(pAfpTC1, pAfpTC2);
if (nCompare == 0)
nCompare = CompareTypes(pAfpTC1, pAfpTC2);
break;
// type
case 1:
nCompare = CompareTypes(pAfpTC1, pAfpTC2);
if (nCompare == 0)
nCompare = CompareCreators(pAfpTC1, pAfpTC2);
break;
// description
case 2:
str1 = pAfpTC1->QueryComment();
str2 = pAfpTC2->QueryComment();
nCompare = lstrcmpi(str1,str2);
break;
}
return nCompare;
}
/////////////////////////////////////////////////////////////////////////////
// CMacFilesFileAssociation property page
IMPLEMENT_DYNCREATE(CMacFilesFileAssociation, CPropertyPage)
CMacFilesFileAssociation::CMacFilesFileAssociation() : CPropertyPage(CMacFilesFileAssociation::IDD)
{
//{{AFX_DATA_INIT(CMacFilesFileAssociation)
//}}AFX_DATA_INIT
m_nSortColumn = 0;
}
CMacFilesFileAssociation::~CMacFilesFileAssociation()
{
}
void CMacFilesFileAssociation::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMacFilesFileAssociation)
DDX_Control(pDX, IDC_LIST_TYPE_CREATORS, m_listctrlCreators);
DDX_Control(pDX, IDC_COMBO_EXTENSION, m_comboExtension);
DDX_Control(pDX, IDC_BUTTON_EDIT, m_buttonEdit);
DDX_Control(pDX, IDC_BUTTON_DELETE, m_buttonDelete);
DDX_Control(pDX, IDC_BUTTON_ASSOCIATE, m_buttonAssociate);
DDX_Control(pDX, IDC_BUTTON_ADD, m_buttonAdd);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMacFilesFileAssociation, CPropertyPage)
//{{AFX_MSG_MAP(CMacFilesFileAssociation)
ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
ON_BN_CLICKED(IDC_BUTTON_ASSOCIATE, OnButtonAssociate)
ON_BN_CLICKED(IDC_BUTTON_DELETE, OnButtonDelete)
ON_BN_CLICKED(IDC_BUTTON_EDIT, OnButtonEdit)
ON_CBN_SELCHANGE(IDC_COMBO_EXTENSION, OnSelchangeComboExtension)
ON_CBN_EDITCHANGE(IDC_COMBO_EXTENSION, OnEditchangeComboExtension)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_TYPE_CREATORS, OnDblclkListTypeCreators)
ON_WM_CLOSE()
ON_WM_CONTEXTMENU()
ON_WM_HELPINFO()
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_TYPE_CREATORS, OnItemchangedListTypeCreators)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_TYPE_CREATORS, OnColumnclickListTypeCreators)
ON_WM_DESTROY()
ON_WM_COMPAREITEM()
ON_WM_DRAWITEM()
ON_WM_DELETEITEM()
ON_NOTIFY(LVN_DELETEITEM, IDC_LIST_TYPE_CREATORS, OnDeleteitemListTypeCreators)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMacFilesFileAssociation message handlers
BOOL CMacFilesFileAssociation::OnInitDialog()
{
CPropertyPage::OnInitDialog();
m_comboExtension.LimitText(AFP_EXTENSION_LEN);
InitListCtrl();
//
// Fill in the data from the server for extensions and type creators
//
Update();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMacFilesFileAssociation::OnButtonAdd()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CTypeCreatorAddDlg dlgAdd(&m_listctrlCreators, m_pSheet->m_hAfpServer, m_pSheet->m_strHelpFilePath);
CThemeContextActivator activator;
if (dlgAdd.DoModal() == IDOK)
{
//
// Refresh the dialog
//
DWORD err = Refresh();
if ( err != NO_ERROR )
{
::SFMMessageBox(err);
return;
}
SelectTypeCreator(dlgAdd.m_strCreator, dlgAdd.m_strType);
}
}
void CMacFilesFileAssociation::OnButtonEdit()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CAfpTypeCreator * pAfpTC = GetTCObject(-1); // Get current TC Object
if (!pAfpTC)
return;
CTypeCreatorEditDlg dlgEdit(pAfpTC, m_pSheet->m_hAfpServer, m_pSheet->m_strHelpFilePath);
CThemeContextActivator activator;
if (dlgEdit.DoModal() == IDOK)
{
//
// Refresh the dialog.
//
DWORD err = Refresh();
if ( err != NO_ERROR )
{
::SFMMessageBox(err);
return;
}
}
if (m_buttonEdit.GetButtonStyle() == BS_DEFPUSHBUTTON)
m_buttonEdit.SetFocus();
}
void CMacFilesFileAssociation::OnButtonAssociate()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//
// The user pressed the Associate button. So associate the currently
// selected Extension with the currently selected type/creator.
//
AFP_TYPE_CREATOR AfpTypeCreator;
AFP_EXTENSION AfpExtension;
DWORD err;
CString strExtension;
if ( !g_SfmDLL.LoadFunctionPointers() )
return;
m_comboExtension.GetWindowText(strExtension);
strExtension.MakeUpper();
::ZeroMemory(&AfpTypeCreator, sizeof(AfpTypeCreator));
::ZeroMemory(&AfpExtension, sizeof(AfpExtension));
::CopyMemory(AfpExtension.afpe_extension, (LPCTSTR) strExtension, strExtension.GetLength() * sizeof(TCHAR));
CAfpTypeCreator * pAfpTC = GetTCObject(-1); // Get Current TC Object
if (!pAfpTC)
return;
::CopyMemory(AfpTypeCreator.afptc_creator, pAfpTC->QueryCreator(), pAfpTC->QueryCreatorLength() * sizeof(TCHAR));
::CopyMemory(AfpTypeCreator.afptc_type, pAfpTC->QueryType(), pAfpTC->QueryTypeLength() * sizeof(TCHAR));
::CopyMemory(AfpTypeCreator.afptc_comment, pAfpTC->QueryComment(), pAfpTC->QueryCommentLength() * sizeof(TCHAR));
AfpTypeCreator.afptc_id = pAfpTC->QueryId();
err = ((ETCMAPASSOCIATEPROC) g_SfmDLL[AFP_ETC_MAP_ASSOCIATE])(m_pSheet->m_hAfpServer,
&AfpTypeCreator,
&AfpExtension );
if ( err != NO_ERROR )
{
::SFMMessageBox(err);
}
//
// Refresh the dialog
//
err = Refresh();
if ( err != NO_ERROR )
{
::SFMMessageBox(err);
}
}
void CMacFilesFileAssociation::OnButtonDelete()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//
// The user pressed the Delete button. Delete the currently
// selected type/creator pair
//
AFP_TYPE_CREATOR AfpTypeCreator;
CAfpTypeCreator * pAfpTC = GetTCObject(-1); // Get Current TC Object
if (!pAfpTC)
return;
DWORD err;
if ( !g_SfmDLL.LoadFunctionPointers() )
return;
//
// First warn the user.
//
if (::AfxMessageBox(IDS_DELETE_TC_CONFIRM,
MB_ICONEXCLAMATION | MB_YESNO) == IDNO )
{
return;
}
::ZeroMemory( &AfpTypeCreator, sizeof(AfpTypeCreator) );
CopyMemory(AfpTypeCreator.afptc_creator,
pAfpTC->QueryCreator(),
pAfpTC->QueryCreatorLength() * sizeof(TCHAR));
CopyMemory(AfpTypeCreator.afptc_type,
pAfpTC->QueryType(),
pAfpTC->QueryTypeLength() * sizeof(TCHAR));
err = ((ETCMAPDELETEPROC) g_SfmDLL[AFP_ETC_MAP_DELETE])(m_pSheet->m_hAfpServer, &AfpTypeCreator);
if ( err != NO_ERROR )
{
::SFMMessageBox(err);
}
//
// Refresh the dialog.
//
err = Refresh();
if ( err != NO_ERROR )
{
::SFMMessageBox(err);
return;
}
if ((m_buttonDelete.GetButtonStyle() == BS_DEFPUSHBUTTON) ||
(m_buttonEdit.GetButtonStyle() == BS_DEFPUSHBUTTON))
{
//
// The delete button has focus so we need to move
// the focus elsewhere because this button will be
// disabled. Let's set it to the add button.
//
m_buttonAdd.SetFocus();
m_buttonAdd.SetButtonStyle(BS_DEFPUSHBUTTON);
m_buttonDelete.SetButtonStyle(BS_PUSHBUTTON);
m_buttonEdit.SetButtonStyle(BS_PUSHBUTTON);
}
}
void CMacFilesFileAssociation::OnSelchangeComboExtension()
{
int nCurIndex = m_comboExtension.GetCurSel();
if (nCurIndex != -1)
{
//
// Select the matching type creator (if exists) and enable associate button
//
SelectTypeCreator((DWORD)m_comboExtension.GetItemData(nCurIndex));
m_buttonAssociate.EnableWindow(TRUE);
}
else
{
m_buttonAssociate.EnableWindow(FALSE);
}
}
void CMacFilesFileAssociation::OnEditchangeComboExtension()
{
CString strCurText;
m_comboExtension.GetWindowText(strCurText);
strCurText.MakeUpper();
if (strCurText.IsEmpty())
{
//
// User cleared out the edit box, go to the default type creator
//
m_buttonAssociate.EnableWindow(FALSE);
SelectTypeCreator(AFP_DEF_TCID);
}
else
{
int nIndexFound = m_comboExtension.FindStringExact(-1, strCurText);
if (nIndexFound != CB_ERR)
{
//
// See if what the user has typed matches an extension in the listbox.
// Set the item to be the current one.
//
SelectTypeCreator((DWORD)m_comboExtension.GetItemData(nIndexFound));
}
m_buttonAssociate.EnableWindow(TRUE);
}
}
void CMacFilesFileAssociation::OnDblclkListTypeCreators(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
CAfpTypeCreator * pAfpTC = GetTCObject(-1); // Get Current TC Object
//
// Do not allow editing of the default type/creator
//
if (pAfpTC && pAfpTC->QueryId() != AFP_DEF_TCID)
OnButtonEdit();
*pResult = 0;
}
/////////////////////////////////////////////////////////////////////////////
// CMacFilesFileAssociation helper functions
void CMacFilesFileAssociation::EnableControls(BOOL fEnable)
{
if (fEnable)
{
m_buttonDelete.EnableWindow(TRUE);
m_buttonEdit.EnableWindow(TRUE);
}
else
{
if ( (m_buttonEdit.GetState() & 0x0008) ||
(m_buttonDelete.GetState() & 0x0008) )
{
//m_listctrlCreators.SetFocus();
}
m_buttonDelete.EnableWindow(FALSE);
m_buttonEdit.EnableWindow(FALSE);
}
}
DWORD CMacFilesFileAssociation::SelectTypeCreator(DWORD dwId)
{
DWORD dwIdSelected = (DWORD)-1;
//
// Find the corresponding type creator if there is one
// and select it
//
for (int i = 0; i < m_listctrlCreators.GetItemCount(); i++)
{
CAfpTypeCreator * pAfpTC = GetTCObject(i); // Get TC object associated with this item
if (pAfpTC && pAfpTC->QueryId() == dwId)
{
SetCurSel(i);
dwIdSelected = pAfpTC->QueryId();
break;
}
}
if (dwIdSelected == AFP_DEF_TCID || dwIdSelected == (DWORD)-1)
EnableControls(FALSE);
else
EnableControls(TRUE);
return dwIdSelected;
}
DWORD CMacFilesFileAssociation::SelectTypeCreator(CString & strCreator, CString & strType)
{
DWORD dwIdSelected = (DWORD)-1;
//
// Find the corresponding type creator if there is one
// and select it
//
for (int i = 0; i < m_listctrlCreators.GetItemCount(); i++)
{
CAfpTypeCreator * pAfpTC = GetTCObject(i); // Get TC object associated with this item
if ( pAfpTC &&
(lstrcmp(strCreator, pAfpTC->QueryCreator()) == 0) &&
(lstrcmp(strType, pAfpTC->QueryType()) == 0) )
{
SetCurSel(i);
dwIdSelected = pAfpTC->QueryId();
break;
}
}
if (dwIdSelected == AFP_DEF_TCID || dwIdSelected == (DWORD)-1)
EnableControls(FALSE);
else
EnableControls(TRUE);
return dwIdSelected;
}
DWORD CMacFilesFileAssociation::Update()
{
PAFP_ETCMAP_INFO pAfpEtcMapInfo = NULL;
DWORD err;
if ( !g_SfmDLL.LoadFunctionPointers() )
return S_OK;
//
// Get the new data
//
err = ((ETCMAPGETINFOPROC) g_SfmDLL[AFP_ETC_MAP_GET_INFO])(m_pSheet->m_hAfpServer,
(LPBYTE *)&pAfpEtcMapInfo);
if ( err != NO_ERROR )
{
//
// Couldn't get the info...
//
return err;
}
//
// Update the extensions COMBOBOX.
//
m_comboExtension.ResetContent();
PAFP_EXTENSION pAfpExtensions = pAfpEtcMapInfo->afpetc_extension;
for (UINT i = 0; i < pAfpEtcMapInfo->afpetc_num_extensions; i++)
{
int nIndex = m_comboExtension.AddString(pAfpExtensions->afpe_extension);
m_comboExtension.SetItemData(nIndex, pAfpExtensions->afpe_tcid);
pAfpExtensions++;
}
m_comboExtension.SetCurSel(-1);
m_buttonAssociate.EnableWindow(FALSE);
//
// Update the type/creator listbox
//
//
// let's nuke everything in the listbox.
//
ClearListCtrl();
PAFP_TYPE_CREATOR pAfpTypeCreators = pAfpEtcMapInfo->afpetc_type_creator;
for (i = 0; i < pAfpEtcMapInfo->afpetc_num_type_creators; i++)
{
CAfpTypeCreator * pItemData = new CAfpTypeCreator(pAfpTypeCreators);
InsertItem(pItemData);
pAfpTypeCreators++;
}
if ( pAfpEtcMapInfo != NULL )
{
((SFMBUFFERFREEPROC) g_SfmDLL[AFP_BUFFER_FREE])(pAfpEtcMapInfo);
}
m_listctrlCreators.SortItems(CompareFunc, m_nSortColumn);
//
// Set the current selection to be the default type creator
//
SelectTypeCreator(AFP_DEF_TCID);
return NO_ERROR;
}
void CMacFilesFileAssociation::InitListCtrl()
{
CString strText;
strText.LoadString(IDS_CREATOR);
m_listctrlCreators.InsertColumn(0, strText, LVCFMT_LEFT, 50);
strText.LoadString(IDS_TYPE);
m_listctrlCreators.InsertColumn(1, strText, LVCFMT_LEFT, 50);
strText.LoadString(IDS_DESCRIPTION);
m_listctrlCreators.InsertColumn(2, strText, LVCFMT_LEFT, 175);
ListView_SetExtendedListViewStyle(m_listctrlCreators.GetSafeHwnd(), LVS_EX_FULLROWSELECT);
}
void CMacFilesFileAssociation::ClearListCtrl()
{
m_listctrlCreators.DeleteAllItems();
}
void CMacFilesFileAssociation::InsertItem(CAfpTypeCreator * pItemData)
{
int nIndex = m_listctrlCreators.InsertItem(0, pItemData->QueryCreator());
m_listctrlCreators.SetItemText(nIndex, 1, pItemData->QueryType());
m_listctrlCreators.SetItemText(nIndex, 2, pItemData->QueryComment());
m_listctrlCreators.SetItemData(nIndex, (DWORD_PTR) pItemData);
}
void CMacFilesFileAssociation::SetCurSel(int nIndex)
{
LV_ITEM lvItem;
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.iItem = nIndex;
lvItem.mask = LVIF_STATE;
lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
lvItem.state = LVIS_SELECTED | LVIS_FOCUSED;
m_listctrlCreators.SetItem(&lvItem);
m_listctrlCreators.EnsureVisible(nIndex, FALSE);
}
int CMacFilesFileAssociation::GetCurSel()
{
return m_listctrlCreators.GetNextItem(-1, LVNI_SELECTED);
}
DWORD CMacFilesFileAssociation::Refresh()
{
//
// Find out the type creator that has the current focus.
//
CAfpTypeCreator * pAfpTC = GetTCObject(-1); // Get Current TC Object
if (!pAfpTC)
return NO_ERROR;
DWORD dwIdCreator = pAfpTC->QueryId();
CWnd * pFocusWnd = CWnd::GetFocus();
//
// Find out the extension that has the current focus
//
DWORD err;
CString strCurExtension;
m_comboExtension.GetWindowText(strCurExtension);
strCurExtension.MakeUpper();
if ( (err = Update()) != NO_ERROR )
{
if (pFocusWnd)
pFocusWnd->SetFocus();
return err;
}
DWORD dwIdSelected = SelectTypeCreator(dwIdCreator);
//
// Set the extension to what it was before
//
if (strCurExtension.IsEmpty())
{
m_buttonAssociate.EnableWindow(FALSE);
}
else
{
m_comboExtension.SetWindowText(strCurExtension);
m_buttonAssociate.EnableWindow(TRUE);
}
if (pFocusWnd)
pFocusWnd->SetFocus();
return NO_ERROR;
}
CAfpTypeCreator * CMacFilesFileAssociation::GetTCObject(int nIndex)
{
if (-1 == nIndex)
nIndex = GetCurSel();
if (-1 == nIndex)
return NULL;
return (CAfpTypeCreator *) m_listctrlCreators.GetItemData(nIndex);
}
void CMacFilesFileAssociation::OnClose()
{
ClearListCtrl();
m_comboExtension.ResetContent();
CPropertyPage::OnClose();
}
BOOL CMacFilesFileAssociation::OnHelpInfo(HELPINFO* pHelpInfo)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (pHelpInfo->iContextType == HELPINFO_WINDOW)
{
::WinHelp ((HWND)pHelpInfo->hItemHandle,
m_pSheet->m_strHelpFilePath,
HELP_WM_HELP,
g_aHelpIDs_CONFIGURE_SFM);
}
return TRUE;
}
void CMacFilesFileAssociation::OnContextMenu(CWnd* pWnd, CPoint /*point*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (this == pWnd)
return;
::WinHelp (pWnd->m_hWnd,
m_pSheet->m_strHelpFilePath,
HELP_CONTEXTMENU,
g_aHelpIDs_CONFIGURE_SFM);
}
void CMacFilesFileAssociation::OnItemchangedListTypeCreators(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//
// Get the selected item's data which points to a TypeCreator object.
// Check the ID of that object to see how we should enable the buttons.
//
if (pNMListView->uNewState & LVIS_SELECTED)
{
CAfpTypeCreator * pAfpTC = GetTCObject(-1); // Get Current TC Object
if (pAfpTC)
{
DWORD dwId = pAfpTC->QueryId();
if (dwId == AFP_DEF_TCID || dwId == (DWORD)-1)
EnableControls(FALSE);
else
EnableControls(TRUE);
}
}
*pResult = 0;
}
void CMacFilesFileAssociation::OnColumnclickListTypeCreators(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
m_nSortColumn = pNMListView->iSubItem;
m_listctrlCreators.SortItems(CompareFunc, m_nSortColumn);
*pResult = 0;
}
void CMacFilesFileAssociation::OnDestroy()
{
CPropertyPage::OnDestroy();
ClearListCtrl();
m_comboExtension.ResetContent();
}
void CMacFilesFileAssociation::OnDeleteitemListTypeCreators(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
delete (CAfpTypeCreator *) pNMListView->lParam;
*pResult = 0;
}