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.
186 lines
4.4 KiB
186 lines
4.4 KiB
// Windows/CommonDialog.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "../Common/MyWindows.h"
|
|
|
|
#ifdef UNDER_CE
|
|
#include <commdlg.h>
|
|
#endif
|
|
|
|
#ifndef _UNICODE
|
|
#include "../Common/StringConvert.h"
|
|
#endif
|
|
|
|
#include "CommonDialog.h"
|
|
#include "Defs.h"
|
|
|
|
#ifndef _UNICODE
|
|
extern bool g_IsNT;
|
|
#endif
|
|
|
|
namespace NWindows {
|
|
|
|
#ifndef _UNICODE
|
|
|
|
class CDoubleZeroStringListA
|
|
{
|
|
LPTSTR Buf;
|
|
unsigned Size;
|
|
public:
|
|
CDoubleZeroStringListA(LPSTR buf, unsigned size): Buf(buf), Size(size) {}
|
|
bool Add(LPCSTR s) throw();
|
|
void Finish() { *Buf = 0; }
|
|
};
|
|
|
|
bool CDoubleZeroStringListA::Add(LPCSTR s) throw()
|
|
{
|
|
unsigned len = MyStringLen(s) + 1;
|
|
if (len >= Size)
|
|
return false;
|
|
MyStringCopy(Buf, s);
|
|
Buf += len;
|
|
Size -= len;
|
|
return true;
|
|
}
|
|
|
|
#endif
|
|
|
|
class CDoubleZeroStringListW
|
|
{
|
|
LPWSTR Buf;
|
|
unsigned Size;
|
|
public:
|
|
CDoubleZeroStringListW(LPWSTR buf, unsigned size): Buf(buf), Size(size) {}
|
|
bool Add(LPCWSTR s) throw();
|
|
void Finish() { *Buf = 0; }
|
|
};
|
|
|
|
bool CDoubleZeroStringListW::Add(LPCWSTR s) throw()
|
|
{
|
|
unsigned len = MyStringLen(s) + 1;
|
|
if (len >= Size)
|
|
return false;
|
|
MyStringCopy(Buf, s);
|
|
Buf += len;
|
|
Size -= len;
|
|
return true;
|
|
}
|
|
|
|
#define MY__OFN_PROJECT 0x00400000
|
|
#define MY__OFN_SHOW_ALL 0x01000000
|
|
|
|
/* if (lpstrFilter == NULL && nFilterIndex == 0)
|
|
MSDN : "the system doesn't show any files",
|
|
but WinXP-64 shows all files. Why ??? */
|
|
|
|
/*
|
|
structures
|
|
OPENFILENAMEW
|
|
OPENFILENAMEA
|
|
contain additional members:
|
|
#if (_WIN32_WINNT >= 0x0500)
|
|
void *pvReserved;
|
|
DWORD dwReserved;
|
|
DWORD FlagsEx;
|
|
#endif
|
|
|
|
If we compile the source code with (_WIN32_WINNT >= 0x0500), some functions
|
|
will not work at NT 4.0, if we use sizeof(OPENFILENAME*).
|
|
So we use size of old version of structure. */
|
|
|
|
#if defined(UNDER_CE) || defined(_WIN64) || (_WIN32_WINNT < 0x0500)
|
|
// || !defined(WINVER)
|
|
#define my_compatib_OPENFILENAMEA_size sizeof(OPENFILENAMEA)
|
|
#define my_compatib_OPENFILENAMEW_size sizeof(OPENFILENAMEW)
|
|
#else
|
|
#define my_compatib_OPENFILENAMEA_size OPENFILENAME_SIZE_VERSION_400A
|
|
#define my_compatib_OPENFILENAMEW_size OPENFILENAME_SIZE_VERSION_400W
|
|
#endif
|
|
|
|
#define CONV_U_To_A(dest, src, temp) AString temp; if (src) { temp = GetSystemString(src); dest = temp; }
|
|
|
|
bool MyGetOpenFileName(HWND hwnd, LPCWSTR title,
|
|
LPCWSTR initialDir,
|
|
LPCWSTR filePath,
|
|
LPCWSTR filterDescription,
|
|
LPCWSTR filter,
|
|
UString &resPath
|
|
#ifdef UNDER_CE
|
|
, bool openFolder
|
|
#endif
|
|
)
|
|
{
|
|
const unsigned kBufSize = MAX_PATH * 2;
|
|
const unsigned kFilterBufSize = MAX_PATH;
|
|
if (!filter)
|
|
filter = L"*.*";
|
|
#ifndef _UNICODE
|
|
if (!g_IsNT)
|
|
{
|
|
CHAR buf[kBufSize];
|
|
MyStringCopy(buf, (const char *)GetSystemString(filePath));
|
|
// OPENFILENAME_NT4A
|
|
OPENFILENAMEA p;
|
|
memset(&p, 0, sizeof(p));
|
|
p.lStructSize = my_compatib_OPENFILENAMEA_size;
|
|
p.hwndOwner = hwnd;
|
|
CHAR filterBuf[kFilterBufSize];
|
|
{
|
|
CDoubleZeroStringListA dz(filterBuf, kFilterBufSize);
|
|
dz.Add(GetSystemString(filterDescription ? filterDescription : filter));
|
|
dz.Add(GetSystemString(filter));
|
|
dz.Finish();
|
|
p.lpstrFilter = filterBuf;
|
|
p.nFilterIndex = 1;
|
|
}
|
|
|
|
p.lpstrFile = buf;
|
|
p.nMaxFile = kBufSize;
|
|
CONV_U_To_A(p.lpstrInitialDir, initialDir, initialDirA);
|
|
CONV_U_To_A(p.lpstrTitle, title, titleA);
|
|
p.Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
|
|
|
|
bool res = BOOLToBool(::GetOpenFileNameA(&p));
|
|
resPath = GetUnicodeString(buf);
|
|
return res;
|
|
}
|
|
else
|
|
#endif
|
|
{
|
|
WCHAR buf[kBufSize];
|
|
MyStringCopy(buf, filePath);
|
|
// OPENFILENAME_NT4W
|
|
OPENFILENAMEW p;
|
|
memset(&p, 0, sizeof(p));
|
|
p.lStructSize = my_compatib_OPENFILENAMEW_size;
|
|
p.hwndOwner = hwnd;
|
|
|
|
WCHAR filterBuf[kFilterBufSize];
|
|
{
|
|
CDoubleZeroStringListW dz(filterBuf, kFilterBufSize);
|
|
dz.Add(filterDescription ? filterDescription : filter);
|
|
dz.Add(filter);
|
|
dz.Finish();
|
|
p.lpstrFilter = filterBuf;
|
|
p.nFilterIndex = 1;
|
|
}
|
|
|
|
p.lpstrFile = buf;
|
|
p.nMaxFile = kBufSize;
|
|
p.lpstrInitialDir = initialDir;
|
|
p.lpstrTitle = title;
|
|
p.Flags = OFN_EXPLORER | OFN_HIDEREADONLY
|
|
#ifdef UNDER_CE
|
|
| (openFolder ? (MY__OFN_PROJECT | MY__OFN_SHOW_ALL) : 0)
|
|
#endif
|
|
;
|
|
|
|
bool res = BOOLToBool(::GetOpenFileNameW(&p));
|
|
resPath = buf;
|
|
return res;
|
|
}
|
|
}
|
|
|
|
}
|