| @@ -245,10 +245,42 @@ private: | |||||
| JUCE_COMRESULT OnFolderChanging (IFileDialog* d, IShellItem*) override { return updateHwnd (d); } | JUCE_COMRESULT OnFolderChanging (IFileDialog* d, IShellItem*) override { return updateHwnd (d); } | ||||
| JUCE_COMRESULT OnFileOk (IFileDialog* d) override { return updateHwnd (d); } | JUCE_COMRESULT OnFileOk (IFileDialog* d) override { return updateHwnd (d); } | ||||
| JUCE_COMRESULT OnFolderChange (IFileDialog* d) override { return updateHwnd (d); } | JUCE_COMRESULT OnFolderChange (IFileDialog* d) override { return updateHwnd (d); } | ||||
| JUCE_COMRESULT OnSelectionChange (IFileDialog* d) override { return updateHwnd (d); } | |||||
| JUCE_COMRESULT OnSelectionChange (IFileDialog* d) override { focusWorkaround(); return updateHwnd (d); } | |||||
| JUCE_COMRESULT OnShareViolation (IFileDialog* d, IShellItem*, FDE_SHAREVIOLATION_RESPONSE*) override { return updateHwnd (d); } | JUCE_COMRESULT OnShareViolation (IFileDialog* d, IShellItem*, FDE_SHAREVIOLATION_RESPONSE*) override { return updateHwnd (d); } | ||||
| JUCE_COMRESULT OnOverwrite (IFileDialog* d, IShellItem*, FDE_OVERWRITE_RESPONSE*) override { return updateHwnd (d); } | JUCE_COMRESULT OnOverwrite (IFileDialog* d, IShellItem*, FDE_OVERWRITE_RESPONSE*) override { return updateHwnd (d); } | ||||
| /** Workaround for a bug in Vista+, OpenFileDialog will truncate the initialFile text. | |||||
| Moving the caret along the full length of the text and back will reveal the full string. | |||||
| */ | |||||
| void focusWorkaround() | |||||
| { | |||||
| if (! defaultFileNameTextCaretMoved) | |||||
| { | |||||
| auto makeKeyInput = [] (WORD vk, bool pressed) | |||||
| { | |||||
| INPUT i; | |||||
| ZeroMemory (&i, sizeof (INPUT)); | |||||
| i.type = INPUT_KEYBOARD; | |||||
| i.ki.wVk = vk; | |||||
| i.ki.dwFlags = pressed ? 0 : KEYEVENTF_KEYUP; | |||||
| return i; | |||||
| }; | |||||
| INPUT inputs[] = { | |||||
| makeKeyInput (VK_HOME, true), | |||||
| makeKeyInput (VK_HOME, false), | |||||
| makeKeyInput (VK_END, true), | |||||
| makeKeyInput (VK_END, false), | |||||
| }; | |||||
| SendInput ((UINT) std::size (inputs), inputs, sizeof (INPUT)); | |||||
| defaultFileNameTextCaretMoved = true; | |||||
| } | |||||
| } | |||||
| JUCE_COMRESULT updateHwnd (IFileDialog* d) | JUCE_COMRESULT updateHwnd (IFileDialog* d) | ||||
| { | { | ||||
| HWND hwnd = nullptr; | HWND hwnd = nullptr; | ||||
| @@ -266,6 +298,7 @@ private: | |||||
| return S_OK; | return S_OK; | ||||
| } | } | ||||
| bool defaultFileNameTextCaretMoved = false; | |||||
| Win32NativeFileChooser& owner; | Win32NativeFileChooser& owner; | ||||
| }; | }; | ||||