rlm@1: // FileDlg.cpp: implementation of the FileDlg class. rlm@1: // rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: //#define WINVER 0x0410 // windows 98 - just for this 1 file - just in case rlm@1: #include "stdafx.h" rlm@1: #include rlm@1: #include rlm@1: #include "resource.h" rlm@1: #include "FileDlg.h" rlm@1: #include "Sound.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: static FileDlg *instance = NULL; rlm@1: rlm@1: static UINT_PTR CALLBACK HookFunc(HWND hwnd, rlm@1: UINT msg, rlm@1: WPARAM wParam, rlm@1: LPARAM lParam) rlm@1: { rlm@1: if (instance) rlm@1: { rlm@1: if (msg == WM_NOTIFY) rlm@1: { rlm@1: OFNOTIFY *notify = (OFNOTIFY *)lParam; rlm@1: if (notify) rlm@1: { rlm@1: if (notify->hdr.code == CDN_TYPECHANGE) rlm@1: { rlm@1: instance->OnTypeChange(hwnd); rlm@1: return 1; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: return 0; rlm@1: } rlm@1: rlm@1: static UINT_PTR CALLBACK HookFuncOldStyle(HWND hwnd, rlm@1: UINT msg, rlm@1: WPARAM wParam, rlm@1: LPARAM lParam) rlm@1: { rlm@1: if (instance) rlm@1: { rlm@1: if (msg == WM_COMMAND) rlm@1: { rlm@1: if (HIWORD(wParam) == CBN_SELCHANGE) rlm@1: { rlm@1: if (LOWORD(wParam) == cmb1) rlm@1: { rlm@1: // call method with combobox handle to keep rlm@1: // behaviour there rlm@1: instance->OnTypeChange((HWND)lParam); rlm@1: return 1; rlm@1: } rlm@1: } rlm@1: } rlm@1: } rlm@1: return 0; rlm@1: } rlm@1: rlm@1: ///////////////////////////////////////////////////////////////////////////// rlm@1: // FileDlg rlm@1: rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: // Construction/Destruction rlm@1: ////////////////////////////////////////////////////////////////////// rlm@1: rlm@1: FileDlg::FileDlg(CWnd *parent, LPCTSTR file, LPCTSTR filter, rlm@1: int filterIndex, LPCTSTR ext, LPCTSTR *exts, LPCTSTR initialDir, rlm@1: LPCTSTR title, bool save, bool noReadOnly) rlm@1: { rlm@1: OSVERSIONINFO info; rlm@1: info.dwOSVersionInfoSize = sizeof(info); rlm@1: GetVersionEx(&info); rlm@1: m_file = file; rlm@1: int size = sizeof(OPENFILENAME); rlm@1: rlm@1: // avoid problems if OPENFILENAME is already defined with the extended fields rlm@1: // needed for the enhanced open/save dialog rlm@1: #if _WIN32_WINNT < 0x0500 rlm@1: if (info.dwPlatformId == VER_PLATFORM_WIN32_NT) rlm@1: { rlm@1: if (info.dwMajorVersion >= 5) rlm@1: size = sizeof(OPENFILENAMEEX); rlm@1: } rlm@1: #endif rlm@1: rlm@1: ZeroMemory(&m_ofn, sizeof(m_ofn)); rlm@1: m_ofn.lpstrFile = m_file.GetBuffer(MAX_PATH); rlm@1: m_ofn.nMaxFile = MAX_PATH; rlm@1: m_ofn.lStructSize = size; rlm@1: m_ofn.hwndOwner = parent ? parent->GetSafeHwnd() : NULL; rlm@1: m_ofn.nFilterIndex = filterIndex; rlm@1: m_ofn.lpstrInitialDir = initialDir; rlm@1: m_ofn.lpstrTitle = title; rlm@1: m_ofn.lpstrDefExt = ext; rlm@1: m_ofn.lpfnHook = HookFunc; rlm@1: m_ofn.Flags = OFN_PATHMUSTEXIST | OFN_ENABLESIZING | OFN_ENABLEHOOK; rlm@1: m_ofn.Flags |= OFN_EXPLORER; rlm@1: if (noReadOnly) rlm@1: m_ofn.Flags |= OFN_HIDEREADONLY; rlm@1: m_filter = filter; rlm@1: rlm@1: char *p = m_filter.GetBuffer(0); rlm@1: rlm@1: while ((p = strchr(p, '|')) != NULL) rlm@1: *p++ = 0; rlm@1: m_ofn.lpstrFilter = m_filter; rlm@1: rlm@1: if (theApp.videoOption == VIDEO_320x240) rlm@1: { rlm@1: m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_OPENDLG); rlm@1: m_ofn.lpfnHook = HookFuncOldStyle; rlm@1: m_ofn.Flags |= OFN_ENABLETEMPLATE; rlm@1: m_ofn.Flags &= ~OFN_EXPLORER; rlm@1: } rlm@1: rlm@1: isSave = save; rlm@1: extensions = exts; rlm@1: rlm@1: instance = this; rlm@1: } rlm@1: rlm@1: FileDlg::~FileDlg() rlm@1: { rlm@1: instance = NULL; rlm@1: } rlm@1: rlm@1: void FileDlg::OnTypeChange(HWND hwnd) rlm@1: { rlm@1: HWND parent = GetParent(hwnd); rlm@1: rlm@1: HWND fileNameControl = ::GetDlgItem(parent, cmb13); rlm@1: rlm@1: if (fileNameControl == NULL) rlm@1: fileNameControl = ::GetDlgItem(parent, edt1); rlm@1: rlm@1: if (fileNameControl == NULL) rlm@1: return; rlm@1: rlm@1: CString filename; rlm@1: GetWindowText(fileNameControl, filename.GetBuffer(MAX_PATH), MAX_PATH); rlm@1: filename.ReleaseBuffer(); rlm@1: rlm@1: HWND typeControl = ::GetDlgItem(parent, cmb1); rlm@1: rlm@1: ASSERT(typeControl != NULL); rlm@1: rlm@1: int sel = ::SendMessage(typeControl, CB_GETCURSEL, 0, 0); rlm@1: rlm@1: ASSERT(sel != -1); rlm@1: rlm@1: LPCTSTR typeName = extensions[sel]; rlm@1: rlm@1: // sel could easily be an invalid index of extensions, so check for null guard rlm@1: for(int i = 0; i <= sel; i++) rlm@1: if(extensions[i] == NULL) rlm@1: typeName = ""; rlm@1: rlm@1: if (filename.GetLength() == 0) rlm@1: { rlm@1: if(*typeName) rlm@1: filename.Format("*%s", typeName); rlm@1: } rlm@1: else rlm@1: { rlm@1: int index = filename.Find('.'); rlm@1: if (index == -1) rlm@1: { rlm@1: filename = filename + typeName; rlm@1: } rlm@1: else rlm@1: { rlm@1: filename = filename.Left(index) + typeName; rlm@1: } rlm@1: } rlm@1: SetWindowText(fileNameControl, filename); rlm@1: } rlm@1: rlm@1: int FileDlg::getFilterIndex() rlm@1: { rlm@1: return m_ofn.nFilterIndex; rlm@1: } rlm@1: rlm@1: int FileDlg::DoModal() rlm@1: { rlm@1: systemSoundClearBuffer(); rlm@1: BOOL res = isSave ? GetSaveFileName(&m_ofn) : rlm@1: GetOpenFileName(&m_ofn); rlm@1: rlm@1: return res ? IDOK : IDCANCEL; rlm@1: } rlm@1: rlm@1: LPCTSTR FileDlg::GetPathName() rlm@1: { rlm@1: return (LPCTSTR)m_file; rlm@1: } rlm@1: