diff --git a/uppsrc/CtrlLib/CtrlUtil.h b/uppsrc/CtrlLib/CtrlUtil.h index 9f1e005f1..71c68190e 100644 --- a/uppsrc/CtrlLib/CtrlUtil.h +++ b/uppsrc/CtrlLib/CtrlUtil.h @@ -290,6 +290,7 @@ public: bool Execute(bool open, const char *title = NULL); bool ExecuteOpen(const char *title = NULL) { return Execute(true, title); } bool ExecuteSaveAs(const char *title = NULL) { return Execute(false, title); } + bool ExecuteSelectDir(const char *title = NULL); String Get() const; void Set(const String& s) { filename.At(0) = s; } diff --git a/uppsrc/CtrlLib/Win32.cpp b/uppsrc/CtrlLib/Win32.cpp index 132afa560..c050f7826 100644 --- a/uppsrc/CtrlLib/Win32.cpp +++ b/uppsrc/CtrlLib/Win32.cpp @@ -6,6 +6,10 @@ #include #include +#define CY win32_CY_ +#include +#undef CY + #endif #endif @@ -97,6 +101,53 @@ static UINT_PTR CALLBACK sCenterHook(HWND hdlg, UINT msg, WPARAM wParam, LPARAM #define OFN_ENABLESIZING 0x00800000 #endif +INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) +{ + if (uMsg==BFFM_INITIALIZED) { + SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); + SendMessage(hwnd, BFFM_SETEXPANDED, TRUE, pData); + } + return 0; +} + +bool FileSelNative::ExecuteSelectDir(const char *title) +{ + Vector> s16; + auto W32 = [&](const String& s) -> char16* { + auto& h = s16.Add(); + h = ToSystemCharsetW(s); + return h; + }; + + String ret; + + BROWSEINFOW br; + memset(&br, 0, sizeof(BROWSEINFO)); + Ctrl *q = Ctrl::GetActiveWindow(); + if(q) br.hwndOwner = q->GetHWND(); + br.lpfn = BrowseCallbackProc; + br.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; + br.lpszTitle = W32(title); + br.lParam = (LPARAM)W32(activedir); + + LPITEMIDLIST pidl = NULL; + if((pidl = SHBrowseForFolderW(&br)) != NULL) { + char16 buffer[MAX_PATH]; + if(SHGetPathFromIDListW(pidl, buffer)) + filename << FromSystemCharsetW(buffer); + else + filename << Null; + IMalloc *pMalloc; + if(SHGetMalloc(&pMalloc) == NOERROR) { + pMalloc->Free(pidl); + pMalloc->Release(); + } + return true; + } + + return false; +} + bool FileSelNative::Execute(bool open, const char *dlgtitle) { Vector> s16; auto W32 = [&](const String& s) -> char16* { diff --git a/upptst/FileSel/FileSel.upp b/upptst/FileSelNative/FileSelNative.upp similarity index 100% rename from upptst/FileSel/FileSel.upp rename to upptst/FileSelNative/FileSelNative.upp diff --git a/upptst/FileSel/main.cpp b/upptst/FileSelNative/main.cpp similarity index 80% rename from upptst/FileSel/main.cpp rename to upptst/FileSelNative/main.cpp index 83ab8859a..2eb7d1109 100644 --- a/upptst/FileSel/main.cpp +++ b/upptst/FileSelNative/main.cpp @@ -1,23 +1,28 @@ -#include - -using namespace Upp; - -GUI_APP_MAIN -{ - FileSelNative sel; - sel.AllFilesType(); - sel.Type("Test2", "*.tst"); - sel.Type("All", "*.*"); - sel.Type("All 2", "*"); - sel.ActiveType(1); - while(sel.ExecuteSaveAs("Test!")) { - for(int i = 0; i < sel.GetCount(); i++) - DDUMP(sel[i]); - sel.Multi(); - sel.NoAsking(); - } - sel = GetDataFile("main.cpp"); - if(!sel.ExecuteSaveAs("as")) - return; - DDUMP(~sel); -} +#include + +using namespace Upp; + +GUI_APP_MAIN +{ + FileSelNative sel; + sel.ActiveDir(GetHomeDirectory()); + while(sel.ExecuteSelectDir("Just a test")) + PromptOK(sel.Get()); + + sel.AllFilesType(); + sel.Type("Test2", "*.tst"); + sel.Type("All", "*.*"); + sel.Type("All 2", "*"); + sel.ActiveType(1); + + while(sel.ExecuteSaveAs("Test!")) { + for(int i = 0; i < sel.GetCount(); i++) + DDUMP(sel[i]); + sel.Multi(); + sel.NoAsking(); + } + sel = GetDataFile("main.cpp"); + if(!sel.ExecuteSaveAs("as")) + return; + DDUMP(~sel); +}