Files
easy7zip/CPP/Windows/CommonDialog.cpp
Igor Pavlov d9666cf046 4.44 beta
2016-05-28 00:15:49 +01:00

165 lines
3.7 KiB
C++
Executable File

// Windows/CommonDialog.cpp
#include "StdAfx.h"
#ifndef _UNICODE
#include "Common/StringConvert.h"
#endif
#include "Common/MyCom.h"
#include "CommonDialog.h"
#ifndef _UNICODE
extern bool g_IsNT;
#endif
namespace NWindows{
#ifndef _UNICODE
class CDoubleZeroStringListA
{
CRecordVector<int> m_Indexes;
AString m_String;
public:
void Add(LPCSTR s);
void SetForBuffer(LPSTR buffer);
};
void CDoubleZeroStringListA::Add(LPCSTR s)
{
m_String += s;
m_Indexes.Add(m_String.Length());
m_String += ' ';
}
void CDoubleZeroStringListA::SetForBuffer(LPSTR buffer)
{
MyStringCopy(buffer, (const char *)m_String);
for (int i = 0; i < m_Indexes.Size(); i++)
buffer[m_Indexes[i]] = '\0';
}
#endif
class CDoubleZeroStringListW
{
CRecordVector<int> m_Indexes;
UString m_String;
public:
void Add(LPCWSTR s);
void SetForBuffer(LPWSTR buffer);
};
void CDoubleZeroStringListW::Add(LPCWSTR s)
{
m_String += s;
m_Indexes.Add(m_String.Length());
m_String += L' ';
}
void CDoubleZeroStringListW::SetForBuffer(LPWSTR buffer)
{
MyStringCopy(buffer, (const wchar_t *)m_String);
for (int i = 0; i < m_Indexes.Size(); i++)
buffer[m_Indexes[i]] = L'\0';
}
bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, LPCWSTR fullFileName, LPCWSTR s, UString &resPath)
{
const int kBufferSize = MAX_PATH * 2;
#ifndef _UNICODE
if (!g_IsNT)
{
CHAR buffer[kBufferSize];
MyStringCopy(buffer, (const char *)GetSystemString(fullFileName));
OPENFILENAME info;
info.lStructSize = sizeof(info);
info.hwndOwner = hwnd;
info.hInstance = 0;
const int kFilterBufferSize = MAX_PATH;
CHAR filterBuffer[kFilterBufferSize];
CDoubleZeroStringListA doubleZeroStringList;
doubleZeroStringList.Add(GetSystemString(s));
doubleZeroStringList.Add("*.*");
doubleZeroStringList.SetForBuffer(filterBuffer);
info.lpstrFilter = filterBuffer;
info.lpstrCustomFilter = NULL;
info.nMaxCustFilter = 0;
info.nFilterIndex = 0;
info.lpstrFile = buffer;
info.nMaxFile = kBufferSize;
info.lpstrFileTitle = NULL;
info.nMaxFileTitle = 0;
info.lpstrInitialDir= NULL;
info.lpstrTitle = 0;
AString titleA;
if (title != 0)
{
titleA = GetSystemString(title);
info.lpstrTitle = titleA;
}
info.Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
info.nFileOffset = 0;
info.nFileExtension = 0;
info.lpstrDefExt = NULL;
info.lCustData = 0;
info.lpfnHook = NULL;
info.lpTemplateName = NULL;
bool res = BOOLToBool(::GetOpenFileNameA(&info));
resPath = GetUnicodeString(buffer);
return res;
}
else
#endif
{
WCHAR buffer[kBufferSize];
MyStringCopy(buffer, fullFileName);
OPENFILENAMEW info;
info.lStructSize = sizeof(info);
info.hwndOwner = hwnd;
info.hInstance = 0;
const int kFilterBufferSize = MAX_PATH;
WCHAR filterBuffer[kFilterBufferSize];
CDoubleZeroStringListW doubleZeroStringList;
doubleZeroStringList.Add(s);
doubleZeroStringList.Add(L"*.*");
doubleZeroStringList.SetForBuffer(filterBuffer);
info.lpstrFilter = filterBuffer;
info.lpstrCustomFilter = NULL;
info.nMaxCustFilter = 0;
info.nFilterIndex = 0;
info.lpstrFile = buffer;
info.nMaxFile = kBufferSize;
info.lpstrFileTitle = NULL;
info.nMaxFileTitle = 0;
info.lpstrInitialDir= NULL;
info.lpstrTitle = title;
info.Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
info.nFileOffset = 0;
info.nFileExtension = 0;
info.lpstrDefExt = NULL;
info.lCustData = 0;
info.lpfnHook = NULL;
info.lpTemplateName = NULL;
bool res = BOOLToBool(::GetOpenFileNameW(&info));
resPath = buffer;
return res;
}
}
}