#include "wx/textcompleter.h"
#include "wx/dynlib.h"
+#include <initguid.h>
+
#include "wx/msw/private.h"
#if wxUSE_UXTHEME
#include "wx/msw/ole/oleutils.h"
#include <shldisp.h>
-#include <shobjidl.h>
#if defined(__MINGW32__) || defined (__WATCOMC__) || defined(__CYGWIN__)
// needed for IID_IAutoComplete, IID_IAutoComplete2 and ACO_AUTOSUGGEST
#include <shlguid.h>
+
+ #ifndef ACO_AUTOAPPEND
+ #define ACO_AUTOAPPEND 0x02
+ #endif
#endif
#ifndef ACO_UPDOWNKEYDROPSLIST
#define SHACF_FILESYS_ONLY 0x00000010
#endif
-DEFINE_GUID(CLSID_AutoComplete,
- 0x00bb2763, 0x6a77, 0x11d0, 0xa5, 0x35, 0x00, 0xc0, 0x4f, 0xd7, 0xd0, 0x62);
+#ifndef SHACF_FILESYS_DIRS
+ #define SHACF_FILESYS_DIRS 0x00000020
+#endif
namespace
{
+// Normally this interface and its IID are defined in shobjidl.h header file
+// included in the platform SDK but MinGW and Cygwin don't have it so redefine
+// the interface ourselves and, as long as we do it all, do it for all
+// compilers to ensure we have the same behaviour for all of them and to avoid
+// the need to check for concrete compilers and maybe even their versions.
+class IAutoCompleteDropDown : public IUnknown
+{
+public:
+ virtual HRESULT wxSTDCALL GetDropDownStatus(DWORD *, LPWSTR *) = 0;
+ virtual HRESULT wxSTDCALL ResetEnumerator() = 0;
+};
+
+DEFINE_GUID(wxIID_IAutoCompleteDropDown,
+ 0x3cd141f4, 0x3c6a, 0x11d2, 0xbc, 0xaa, 0x00, 0xc0, 0x4f, 0xd9, 0x29, 0xdb);
+
+DEFINE_GUID(wxCLSID_AutoComplete,
+ 0x00bb2763, 0x6a77, 0x11d0, 0xa5, 0x35, 0x00, 0xc0, 0x4f, 0xd7, 0xd0, 0x62);
+
// Small helper class which can be used to ensure thread safety even when
// wxUSE_THREADS==0 (and hence wxCriticalSection does nothing).
class CSLock
// apparently.
HRESULT hr = CoCreateInstance
(
- CLSID_AutoComplete,
+ wxCLSID_AutoComplete,
NULL,
CLSCTX_INPROC_SERVER,
IID_IAutoComplete,
// provided IAutoComplete always implements IAutoCompleteDropDown too.
hr = m_autoComplete->QueryInterface
(
- IID_IAutoCompleteDropDown,
+ wxIID_IAutoCompleteDropDown,
reinterpret_cast<void **>(&m_autoCompleteDropDown)
);
if ( FAILED(hr) )
// wxEVT_CHAR handler (as we must also let the other handlers
// defined at wx level run first).
//
- // Notice that we can't use wxEVT_COMMAND_TEXT_UPDATED here
+ // Notice that we can't use wxEVT_TEXT here
// neither as, due to our use of ACO_AUTOAPPEND, we get
// EN_CHANGE notifications from the control every time
// IAutoComplete auto-appends something to it.
void wxTextEntry::WriteText(const wxString& text)
{
- ::SendMessage(GetEditHwnd(), EM_REPLACESEL, 0, (LPARAM)text.wx_str());
+ ::SendMessage(GetEditHwnd(), EM_REPLACESEL, 0, wxMSW_CONV_LPARAM(text));
}
wxString wxTextEntry::DoGetValue() const
#ifdef HAS_AUTOCOMPLETE
-bool wxTextEntry::DoAutoCompleteFileNames()
+#if wxUSE_DYNLIB_CLASS
+
+bool wxTextEntry::DoAutoCompleteFileNames(int flags)
{
typedef HRESULT (WINAPI *SHAutoComplete_t)(HWND, DWORD);
static SHAutoComplete_t s_pfnSHAutoComplete = (SHAutoComplete_t)-1;
if ( !s_pfnSHAutoComplete )
return false;
- HRESULT hr = (*s_pfnSHAutoComplete)(GetEditHwnd(), SHACF_FILESYS_ONLY);
+ DWORD dwFlags = 0;
+ if ( flags & wxFILE )
+ dwFlags |= SHACF_FILESYS_ONLY;
+ else if ( flags & wxDIR )
+ dwFlags |= SHACF_FILESYS_DIRS;
+ else
+ {
+ wxFAIL_MSG(wxS("No flags for file name auto completion?"));
+ return false;
+ }
+
+ HRESULT hr = (*s_pfnSHAutoComplete)(GetEditHwnd(), dwFlags);
if ( FAILED(hr) )
{
wxLogApiError(wxT("SHAutoComplete()"), hr);
return true;
}
+#endif // wxUSE_DYNLIB_CLASS
+
wxTextAutoCompleteData *wxTextEntry::GetOrCreateCompleter()
{
if ( !m_autoCompleteData )
// We still need to define stubs as we declared these overrides in the header.
-bool wxTextEntry::DoAutoCompleteFileNames()
+bool wxTextEntry::DoAutoCompleteFileNames(int flags)
{
- return wxTextEntryBase::DoAutoCompleteFileNames();
+ return wxTextEntryBase::DoAutoCompleteFileNames(flags);
}
bool wxTextEntry::DoAutoCompleteStrings(const wxArrayString& choices)
bool wxTextEntry::DoAutoCompleteCustom(wxTextCompleter *completer)
{
- return wxTextCompleter::DoAutoCompleteCustom(completer);
+ return wxTextEntryBase::DoAutoCompleteCustom(completer);
}
#endif // HAS_AUTOCOMPLETE/!HAS_AUTOCOMPLETE
if ( margins.x != -1 )
{
- // left margin
+ // Set both horizontal margins to the given value, we don't distinguish
+ // between left and right margin at wx API level and it seems to be
+ // better to change both of them than only left one.
::SendMessage(GetEditHwnd(), EM_SETMARGINS,
- EC_LEFTMARGIN, MAKELONG(margins.x, 0));
+ EC_LEFTMARGIN | EC_RIGHTMARGIN,
+ MAKELONG(margins.x, margins.x));
}
if ( margins.y != -1 )