mirror of
https://github.com/fadden/ciderpress.git
synced 2024-12-22 20:29:51 +00:00
ef708f563e
The DeployMaster installer issue prevents the user from seeing more than nine of the 18 file extensions that CiderPress wants to handle, and I don't want to go stomping on file associations without some way to disable the behavior. So this returns to the previous behavior, where CiderPress directly manages the file associations. The CiderPress app is not able to modify HKEY_LOCAL_MACHINE (which it used to do via HKEY_CLASSES_ROOT) on recent versions of Windows -- tested in Win7, but it probably broke with Vista. So now we do everything in HKEY_CURRENT_USER. This works, more or less. We're not looking at the Windows shell overrides, which are made in yet another set of registry entries, so there are multiple reasons why the values reported by the Edit Associations dialog may now be inaccurate. I still favor eliminating the dialog as a long-term strategy. I took the opportunity to do some code cleanup in the registry code. I also added calls to SHChangeNotify() to tell the Windows shell when file associations change, so Windows Explorer windows get updated promptly.
126 lines
3.3 KiB
C++
126 lines
3.3 KiB
C++
/*
|
|
* CiderPress
|
|
* Copyright (C) 2007 by faddenSoft, LLC. All Rights Reserved.
|
|
* See the file LICENSE for distribution terms.
|
|
*/
|
|
#include "stdafx.h"
|
|
#ifdef CAN_UPDATE_FILE_ASSOC
|
|
#include "EditAssocDialog.h"
|
|
#include "MyApp.h"
|
|
#include "Registry.h"
|
|
|
|
BEGIN_MESSAGE_MAP(EditAssocDialog, CDialog)
|
|
ON_WM_HELPINFO()
|
|
ON_COMMAND(IDHELP, OnHelp)
|
|
END_MESSAGE_MAP()
|
|
|
|
/* this comes from VC++6.0 MSDN help */
|
|
#ifndef ListView_SetCheckState
|
|
#define ListView_SetCheckState(hwndLV, i, fCheck) \
|
|
ListView_SetItemState(hwndLV, i, \
|
|
INDEXTOSTATEIMAGEMASK((fCheck)+1), LVIS_STATEIMAGEMASK)
|
|
#endif
|
|
|
|
BOOL EditAssocDialog::OnInitDialog(void)
|
|
{
|
|
CListCtrl* pListView = (CListCtrl*) GetDlgItem(IDC_ASSOCIATION_LIST);
|
|
|
|
ASSERT(pListView != NULL);
|
|
//pListView->ModifyStyleEx(0, LVS_EX_CHECKBOXES);
|
|
ListView_SetExtendedListViewStyleEx(pListView->m_hWnd,
|
|
LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES);
|
|
|
|
/* move it over slightly so we see some overlap */
|
|
CRect rect;
|
|
GetWindowRect(&rect);
|
|
rect.left += 10;
|
|
rect.right += 10;
|
|
MoveWindow(&rect);
|
|
|
|
|
|
/*
|
|
* Initialize this before DDX stuff happens. If the caller didn't
|
|
* provide a set, load our own.
|
|
*/
|
|
if (fOurAssociations == NULL) {
|
|
fOurAssociations = new bool[gMyApp.fRegistry.GetNumFileAssocs()];
|
|
Setup(true);
|
|
} else {
|
|
Setup(false);
|
|
}
|
|
|
|
return CDialog::OnInitDialog();
|
|
}
|
|
|
|
void EditAssocDialog::Setup(bool loadAssoc)
|
|
{
|
|
LOGD("Setup!");
|
|
|
|
CListCtrl* pListView = (CListCtrl*) GetDlgItem(IDC_ASSOCIATION_LIST);
|
|
ASSERT(pListView != NULL);
|
|
|
|
ASSERT(fOurAssociations != NULL);
|
|
|
|
/* two columns */
|
|
CRect rect;
|
|
pListView->GetClientRect(&rect);
|
|
int width;
|
|
|
|
width = pListView->GetStringWidth(L"XXExtensionXX");
|
|
pListView->InsertColumn(0, L"Extension", LVCFMT_LEFT, width);
|
|
pListView->InsertColumn(1, L"Association", LVCFMT_LEFT,
|
|
rect.Width() - width);
|
|
|
|
int num = gMyApp.fRegistry.GetNumFileAssocs();
|
|
int idx = 0;
|
|
while (num--) {
|
|
CString ext, handler;
|
|
CString dispStr;
|
|
bool ours;
|
|
|
|
gMyApp.fRegistry.GetFileAssoc(idx, &ext, &handler, &ours);
|
|
if (handler.IsEmpty()) {
|
|
handler = L"(no association)";
|
|
}
|
|
|
|
pListView->InsertItem(idx, ext);
|
|
pListView->SetItemText(idx, 1, handler);
|
|
|
|
if (loadAssoc)
|
|
fOurAssociations[idx] = ours;
|
|
idx++;
|
|
}
|
|
|
|
//DeleteAllItems(); // for Reload case
|
|
}
|
|
|
|
void EditAssocDialog::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CListCtrl* pListView = (CListCtrl*) GetDlgItem(IDC_ASSOCIATION_LIST);
|
|
|
|
ASSERT(fOurAssociations != NULL);
|
|
if (fOurAssociations == NULL)
|
|
return;
|
|
|
|
int num = gMyApp.fRegistry.GetNumFileAssocs();
|
|
|
|
if (!pDX->m_bSaveAndValidate) {
|
|
/* load fixed set of file associations */
|
|
int idx = 0;
|
|
while (num--) {
|
|
ListView_SetCheckState(pListView->m_hWnd, idx,
|
|
fOurAssociations[idx]);
|
|
idx++;
|
|
}
|
|
} else {
|
|
/* copy the checkboxes out */
|
|
int idx = 0;
|
|
while (num--) {
|
|
fOurAssociations[idx] =
|
|
(ListView_GetCheckState(pListView->m_hWnd, idx) != 0);
|
|
idx++;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif |