Leaked source code of windows server 2003
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

// 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;
}