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.
274 lines
7.0 KiB
274 lines
7.0 KiB
// filedlg.cpp : header file
|
|
//
|
|
// Copyright (C) 1992-1999 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This file is to support an extended file save dialog with a
|
|
// "Use this format by default" checkbox
|
|
|
|
#include "stdafx.h"
|
|
#include "wordpad.h"
|
|
#include "filedlg.h"
|
|
#include "ddxm.h"
|
|
#include "helpids.h"
|
|
#include <dlgs.h>
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
DWORD const CWordpadFileDialog::m_nHelpIDs[] =
|
|
{
|
|
IDC_DEFAULT_FORMAT, IDH_WORDPAD_DEFAULT_FORMAT,
|
|
0, 0
|
|
};
|
|
|
|
|
|
int CWordpadFileDialog::m_defaultDoctype = RD_DEFAULT;
|
|
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CWordpadFileDialog, CFileDialog)
|
|
//{{AFX_MSG_MAP(CWordpadFileDialog)
|
|
ON_BN_CLICKED(IDC_DEFAULT_FORMAT, OnDefaultFormatClicked)
|
|
ON_MESSAGE(WM_HELP, OnHelp)
|
|
ON_MESSAGE(WM_CONTEXTMENU, OnHelpContextMenu)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
IMPLEMENT_DYNAMIC(CWordpadFileDialog, CFileDialog)
|
|
|
|
|
|
|
|
|
|
CWordpadFileDialog::CWordpadFileDialog(BOOL bOpenFileDialog)
|
|
: CFileDialog(bOpenFileDialog)
|
|
{
|
|
m_ofn.Flags |= OFN_ENABLESIZING;
|
|
|
|
if (!m_bOpenFileDialog)
|
|
{
|
|
m_ofn.Flags |= OFN_ENABLETEMPLATE;
|
|
m_ofn.lpTemplateName = TEXT("DefaultFormatDialog");
|
|
}
|
|
|
|
m_doctype = GetDefaultFileType();
|
|
}
|
|
|
|
|
|
|
|
void CWordpadFileDialog::OnDefaultFormatClicked()
|
|
{
|
|
if (m_bOpenFileDialog)
|
|
return;
|
|
|
|
m_doctype = GetTypeFromIndex(
|
|
m_openfilename.nFilterIndex - 1,
|
|
m_bOpenFileDialog);
|
|
|
|
GetDlgItem(IDC_DEFAULT_FORMAT)->EnableWindow(FALSE);
|
|
|
|
// Move the focus to the filename combobox.
|
|
GetParent()->GetDlgItem(cmb13)->SetFocus();
|
|
}
|
|
|
|
|
|
|
|
BOOL CWordpadFileDialog::OnFileNameOK()
|
|
{
|
|
BOOL ret = CFileDialog::OnFileNameOK();
|
|
|
|
if (!m_bOpenFileDialog)
|
|
{
|
|
// returns 0 if ok, 1 if not ok...
|
|
if (0 == ret)
|
|
SetDefaultFileType(m_doctype);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
|
|
void CWordpadFileDialog::OnTypeChange()
|
|
{
|
|
CFileDialog::OnTypeChange();
|
|
|
|
if (m_bOpenFileDialog)
|
|
return;
|
|
|
|
int type = GetTypeFromIndex(
|
|
m_openfilename.nFilterIndex - 1,
|
|
m_bOpenFileDialog);
|
|
|
|
CWnd *checkbox = GetDlgItem(IDC_DEFAULT_FORMAT);
|
|
|
|
checkbox->SendMessage(
|
|
BM_SETCHECK,
|
|
(type == m_doctype)
|
|
? BST_CHECKED
|
|
: BST_UNCHECKED,
|
|
0);
|
|
|
|
checkbox->EnableWindow(!(type == m_doctype));
|
|
|
|
//
|
|
// Change the extension of the filename presented to the user to match
|
|
// the new type
|
|
//
|
|
|
|
// If the user has "Hide extensions of known types" set all this is moot
|
|
SHELLFLAGSTATE flags;
|
|
SHGetSettings(&flags, SSF_SHOWEXTENSIONS);
|
|
if (!flags.fShowExtensions)
|
|
return;
|
|
|
|
CString filespec;
|
|
|
|
CommDlg_OpenSave_GetSpec(
|
|
GetParent()->GetSafeHwnd(),
|
|
filespec.GetBufferSetLength(MAX_PATH),
|
|
MAX_PATH);
|
|
filespec.ReleaseBuffer();
|
|
|
|
if (filespec.IsEmpty())
|
|
return;
|
|
|
|
CString extension = GetExtFromType(type);
|
|
int extstart = filespec.ReverseFind(TEXT('.'));
|
|
|
|
if (-1 == extstart)
|
|
extstart = filespec.GetLength();
|
|
|
|
if (filespec.Mid(extstart) == extension)
|
|
return;
|
|
|
|
filespec = filespec.Mid(0, extstart) + extension;
|
|
|
|
CommDlg_OpenSave_SetControlText(
|
|
GetParent()->GetSafeHwnd(),
|
|
edt1,
|
|
(LPCTSTR) filespec);
|
|
}
|
|
|
|
|
|
|
|
void CWordpadFileDialog::OnInitDone()
|
|
{
|
|
CFileDialog::OnInitDone();
|
|
|
|
if (m_bOpenFileDialog)
|
|
return;
|
|
|
|
OnTypeChange();
|
|
}
|
|
|
|
|
|
|
|
LONG CWordpadFileDialog::OnHelp(WPARAM, LPARAM lParam)
|
|
{
|
|
::WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle,
|
|
AfxGetApp()->m_pszHelpFilePath,
|
|
HELP_WM_HELP, (DWORD_PTR)GetHelpIDs());
|
|
return 0;
|
|
}
|
|
|
|
LONG CWordpadFileDialog::OnHelpContextMenu(WPARAM wParam, LPARAM)
|
|
{
|
|
::WinHelp((HWND)wParam, AfxGetApp()->m_pszHelpFilePath,
|
|
HELP_CONTEXTMENU, (DWORD_PTR)GetHelpIDs());
|
|
return 0;
|
|
}
|
|
|
|
|
|
//
|
|
// MFC assumes that when a common dialog is created, the first message that
|
|
// gets sent to it's common message handing procedure will be to that window.
|
|
// This isn't always true and although it attempts to handle this doesn't get
|
|
// it right every time. Fix it, at least for file dialogs, by making a
|
|
// private message procedure that does the necessary initialization and then
|
|
// calls the original
|
|
//
|
|
|
|
UINT_PTR CALLBACK CWordpadFileDialog::FileDialogHookProc(
|
|
HWND hWnd,
|
|
UINT message,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
CWordpadFileDialog *_this;
|
|
|
|
if (WM_INITDIALOG == message)
|
|
{
|
|
_this = (CWordpadFileDialog *) ((OPENFILENAME *) lParam)->lCustData;
|
|
_this->SubclassWindow(hWnd);
|
|
}
|
|
|
|
_this = (CWordpadFileDialog *) CWnd::FromHandlePermanent(hWnd);
|
|
|
|
if (NULL != _this)
|
|
return (_this->m_original_hook)(hWnd, message, wParam, lParam);
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
INT_PTR CWordpadFileDialog::DoModal()
|
|
{
|
|
ASSERT_VALID(this);
|
|
ASSERT(m_ofn.Flags & OFN_ENABLEHOOK);
|
|
ASSERT(m_ofn.lpfnHook != NULL); // can still be a user hook
|
|
#ifdef _MAC
|
|
ASSERT((m_ofn.Flags & OFN_ALLOWMULTISELECT) == 0);
|
|
#endif
|
|
|
|
// WINBUG: This is a special case for the file open/save dialog,
|
|
// which sometimes pumps while it is coming up but before it has
|
|
// disabled the main window.
|
|
HWND hWndFocus = ::GetFocus();
|
|
BOOL bEnableParent = FALSE;
|
|
m_ofn.hwndOwner = PreModal();
|
|
AfxUnhookWindowCreate();
|
|
if (m_ofn.hwndOwner != NULL && ::IsWindowEnabled(m_ofn.hwndOwner))
|
|
{
|
|
bEnableParent = TRUE;
|
|
::EnableWindow(m_ofn.hwndOwner, FALSE);
|
|
}
|
|
|
|
_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
|
|
ASSERT(pThreadState->m_pAlternateWndInit == NULL);
|
|
|
|
m_original_hook = m_ofn.lpfnHook;
|
|
m_ofn.lpfnHook = FileDialogHookProc;
|
|
m_ofn.lCustData = (LPARAM) this;
|
|
|
|
ZeroMemory(&m_openfilename, sizeof(m_openfilename));
|
|
CopyMemory(&m_openfilename, &m_ofn, sizeof(m_ofn));
|
|
m_openfilename.lStructSize = sizeof(m_openfilename);
|
|
|
|
int nResult;
|
|
if (m_bOpenFileDialog)
|
|
nResult = ::GetOpenFileName((OPENFILENAME*) &m_openfilename);
|
|
else
|
|
nResult = ::GetSaveFileName((OPENFILENAME*) &m_openfilename);
|
|
|
|
CopyMemory(&m_ofn, &m_openfilename, sizeof(m_ofn));
|
|
m_ofn.lStructSize = sizeof(m_ofn);
|
|
|
|
m_ofn.lpfnHook = m_original_hook;
|
|
|
|
if (nResult)
|
|
ASSERT(pThreadState->m_pAlternateWndInit == NULL);
|
|
pThreadState->m_pAlternateWndInit = NULL;
|
|
|
|
// WINBUG: Second part of special case for file open/save dialog.
|
|
if (bEnableParent)
|
|
::EnableWindow(m_ofn.hwndOwner, TRUE);
|
|
if (::IsWindow(hWndFocus))
|
|
::SetFocus(hWndFocus);
|
|
|
|
PostModal();
|
|
return nResult ? nResult : IDCANCEL;
|
|
}
|