mirror of https://github.com/tongzx/nt5src
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.
278 lines
7.9 KiB
278 lines
7.9 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994 - 1998.
|
|
//
|
|
// File: FileExt.cpp
|
|
//
|
|
// Contents: file extension property page
|
|
//
|
|
// Classes: CFileExt
|
|
//
|
|
// History: 03-14-1998 stevebl Commented
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "precomp.hxx"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileExt property page
|
|
|
|
IMPLEMENT_DYNCREATE(CFileExt, CPropertyPage)
|
|
|
|
CFileExt::CFileExt() : CPropertyPage(CFileExt::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CFileExt)
|
|
// NOTE: the ClassWizard will add member initialization here
|
|
//}}AFX_DATA_INIT
|
|
m_pIClassAdmin = NULL;
|
|
}
|
|
|
|
CFileExt::~CFileExt()
|
|
{
|
|
*m_ppThis = NULL;
|
|
if (m_pIClassAdmin)
|
|
{
|
|
m_pIClassAdmin->Release();
|
|
}
|
|
}
|
|
|
|
void CFileExt::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPage::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CFileExt)
|
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CFileExt, CPropertyPage)
|
|
//{{AFX_MSG_MAP(CFileExt)
|
|
ON_BN_CLICKED(IDC_BUTTON1, OnMoveUp)
|
|
ON_BN_CLICKED(IDC_BUTTON2, OnMoveDown)
|
|
ON_CBN_SELCHANGE(IDC_COMBO1, OnExtensionChanged)
|
|
ON_WM_CONTEXTMENU()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CFileExt message handlers
|
|
|
|
void CFileExt::OnMoveUp()
|
|
{
|
|
CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1);
|
|
int i = pList->GetCurSel();
|
|
if (i != LB_ERR && i > 0)
|
|
{
|
|
// change the selection
|
|
CComboBox * pCombo = (CComboBox *)GetDlgItem(IDC_COMBO1);
|
|
CString sz;
|
|
pCombo->GetLBText(pCombo->GetCurSel(), sz);
|
|
EXT & Ext = m_Extensions[sz];
|
|
Ext.fDirty = TRUE;
|
|
EXTEL t = Ext.v[i-1];
|
|
Ext.v[i-1] = Ext.v[i];
|
|
Ext.v[i] = t;
|
|
pList->GetText(i, sz);
|
|
pList->DeleteString(i);
|
|
pList->InsertString(i-1, sz);
|
|
pList->SetCurSel(i-1);
|
|
SetModified();
|
|
}
|
|
}
|
|
|
|
void CFileExt::OnMoveDown()
|
|
{
|
|
CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1);
|
|
int i = pList->GetCurSel();
|
|
if (i != LB_ERR && i < pList->GetCount()-1)
|
|
{
|
|
// change the selection
|
|
CComboBox * pCombo = (CComboBox *)GetDlgItem(IDC_COMBO1);
|
|
CString sz;
|
|
pCombo->GetLBText(pCombo->GetCurSel(), sz);
|
|
EXT & Ext = m_Extensions[sz];
|
|
Ext.fDirty = TRUE;
|
|
EXTEL t = Ext.v[i+1];
|
|
Ext.v[i+1] = Ext.v[i];
|
|
Ext.v[i] = t;
|
|
pList->GetText(i+1, sz);
|
|
pList->DeleteString(i+1);
|
|
pList->InsertString(i, sz);
|
|
pList->SetCurSel(i+1);
|
|
SetModified();
|
|
}
|
|
}
|
|
|
|
void CFileExt::OnExtensionChanged()
|
|
{
|
|
CComboBox * pCombo = (CComboBox *)GetDlgItem(IDC_COMBO1);
|
|
CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1);
|
|
CString szExt;
|
|
pCombo->GetLBText(pCombo->GetCurSel(), szExt);
|
|
pList->ResetContent();
|
|
pList->SetHorizontalExtent(0);
|
|
if (szExt.IsEmpty())
|
|
{
|
|
return; // nothing to do if there are no entries
|
|
}
|
|
|
|
// First check to see if we already have set up our own data for this extension.
|
|
if (m_Extensions.end() == m_Extensions.find(szExt))
|
|
{
|
|
// need to set up our list
|
|
EXT Ext;
|
|
Ext.fDirty = FALSE;
|
|
|
|
EXTLIST::iterator i;
|
|
EXTLIST & ExtList = m_pScopePane->m_Extensions[szExt];
|
|
for (i = ExtList.begin(); i != ExtList.end(); i++)
|
|
{
|
|
EXTEL ExtEl;
|
|
ExtEl.lCookie = *i;
|
|
|
|
// look for the entry that matches this file extension
|
|
CAppData & data = m_pScopePane->m_AppData[*i];
|
|
UINT n2 = data.m_pDetails->pActInfo->cShellFileExt;
|
|
while (n2--)
|
|
{
|
|
if (0 == szExt.CompareNoCase(data.m_pDetails->pActInfo->prgShellFileExt[n2]))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
ExtEl.lPriority = data.m_pDetails->pActInfo->prgPriority[n2];
|
|
Ext.v.push_back(ExtEl);
|
|
}
|
|
order_EXTEL func;
|
|
sort(Ext.v.begin(), Ext.v.end(), func);
|
|
m_Extensions[szExt] = Ext;
|
|
}
|
|
vector<EXTEL>::iterator i;
|
|
EXT & Ext = m_Extensions[szExt];
|
|
for (i = Ext.v.begin(); i != Ext.v.end(); i++)
|
|
{
|
|
CString sz = m_pScopePane->m_AppData[i->lCookie].m_pDetails->pszPackageName;
|
|
pList->AddString(sz);
|
|
CDC * pDC = pList->GetDC();
|
|
CSize size = pDC->GetTextExtent(sz);
|
|
pDC->LPtoDP(&size);
|
|
pList->ReleaseDC(pDC);
|
|
if (pList->GetHorizontalExtent() < size.cx)
|
|
{
|
|
pList->SetHorizontalExtent(size.cx);
|
|
}
|
|
}
|
|
pList->SetCurSel(0);
|
|
int n = pList->GetCount();
|
|
GetDlgItem(IDC_BUTTON1)->EnableWindow(n > 1);
|
|
GetDlgItem(IDC_BUTTON2)->EnableWindow(n > 1);
|
|
if (NULL == GetFocus())
|
|
{
|
|
GetParent()->GetDlgItem(IDOK)->SetFocus();
|
|
}
|
|
}
|
|
|
|
BOOL CFileExt::OnInitDialog()
|
|
{
|
|
RefreshData();
|
|
|
|
CPropertyPage::OnInitDialog();
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
BOOL CFileExt::OnApply()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
map <CString, EXT>::iterator iExt;
|
|
// walk the list looking for dirty entries
|
|
for (iExt = m_Extensions.begin(); iExt != m_Extensions.end(); iExt++)
|
|
{
|
|
if (iExt->second.fDirty)
|
|
{
|
|
ULONG uPriority = iExt->second.v.size();
|
|
vector<EXTEL>::iterator i;
|
|
for (i = iExt->second.v.begin(); i != iExt->second.v.end(); i++)
|
|
{
|
|
CAppData & data = m_pScopePane->m_AppData[i->lCookie];
|
|
CString sz = data.m_pDetails->pszPackageName;
|
|
ASSERT(m_pIClassAdmin);
|
|
hr = m_pIClassAdmin->SetPriorityByFileExt((LPOLESTR)((LPCOLESTR)sz), (LPOLESTR)((LPCOLESTR)iExt->first), --uPriority);
|
|
|
|
// look for the entry that matches this file extension
|
|
UINT n2 = data.m_pDetails->pActInfo->cShellFileExt;
|
|
while (n2--)
|
|
{
|
|
if (0 == iExt->first.CompareNoCase(data.m_pDetails->pActInfo->prgShellFileExt[n2]))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
data.m_pDetails->pActInfo->prgPriority[n2] = uPriority;
|
|
}
|
|
iExt->second.fDirty = FALSE;
|
|
}
|
|
}
|
|
if (FAILED(hr))
|
|
{
|
|
CString sz;
|
|
sz.LoadString(IDS_CHANGEFAILED);
|
|
ReportGeneralPropertySheetError(m_hWnd, sz, hr);
|
|
return FALSE;
|
|
}
|
|
return CPropertyPage::OnApply();
|
|
}
|
|
|
|
|
|
LRESULT CFileExt::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (message)
|
|
{
|
|
case WM_HELP:
|
|
StandardHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, IDD);
|
|
return 0;
|
|
case WM_USER_REFRESH:
|
|
RefreshData();
|
|
return 0;
|
|
case WM_USER_CLOSE:
|
|
return GetOwner()->SendMessage(WM_CLOSE);
|
|
default:
|
|
return CPropertyPage::WindowProc(message, wParam, lParam);
|
|
}
|
|
}
|
|
|
|
void CFileExt::RefreshData(void)
|
|
{
|
|
CComboBox * pCombo = (CComboBox *)GetDlgItem(IDC_COMBO1);
|
|
pCombo->ResetContent();
|
|
if (m_pIClassAdmin)
|
|
{
|
|
// only populate the extension list when we have an IClassAdmin interface
|
|
map <CString, EXTLIST>::iterator iExt;
|
|
for (iExt=m_pScopePane->m_Extensions.begin(); iExt != m_pScopePane->m_Extensions.end(); iExt++)
|
|
{
|
|
pCombo->AddString(iExt->first);
|
|
}
|
|
}
|
|
pCombo->SetCurSel(0);
|
|
// clear the record of extension changes
|
|
m_Extensions.erase(m_Extensions.begin(), m_Extensions.end());
|
|
// and populate the list box
|
|
SetModified(FALSE);
|
|
|
|
OnExtensionChanged();
|
|
}
|
|
|
|
|
|
void CFileExt::OnContextMenu(CWnd* pWnd, CPoint point)
|
|
{
|
|
StandardContextMenu(pWnd->m_hWnd, IDD_FILE_EXT);
|
|
}
|