+#include "wx/clipbrd.h"
+
+// ----------------------------------------------------------------------------
+// wxTextEntryHintData
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxTextEntryHintData wxBIND_OR_CONNECT_HACK_ONLY_BASE_CLASS
+{
+public:
+ wxTextEntryHintData(wxTextEntryBase *entry, wxWindow *win)
+ : m_entry(entry),
+ m_win(win)
+ {
+ wxBIND_OR_CONNECT_HACK(win, wxEVT_SET_FOCUS, wxFocusEventHandler,
+ wxTextEntryHintData::OnSetFocus, this);
+ wxBIND_OR_CONNECT_HACK(win, wxEVT_KILL_FOCUS, wxFocusEventHandler,
+ wxTextEntryHintData::OnKillFocus, this);
+
+ // we don't have any hint yet
+ m_showsHint = false;
+ }
+
+ // default dtor is ok
+
+ // are we showing the hint right now?
+ bool ShowsHint() const { return m_showsHint; }
+
+ void SetHintString(const wxString& hint)
+ {
+ m_hint = hint;
+
+ if ( m_showsHint )
+ {
+ // update it immediately
+ m_entry->ChangeValue(hint);
+ }
+ //else: the new hint will be shown later
+ }
+
+ const wxString& GetHintString() const { return m_hint; }
+
+private:
+ void OnSetFocus(wxFocusEvent& event)
+ {
+ // hide the hint if we were showing it
+ if ( m_showsHint )
+ {
+ // Clear() would send an event which we don't want, so do it like
+ // this
+ m_entry->ChangeValue(wxString());
+ m_win->SetForegroundColour(m_colFg);
+
+ m_showsHint = false;
+ }
+
+ event.Skip();
+ }
+
+ void OnKillFocus(wxFocusEvent& event)
+ {
+ // restore the hint if the user didn't do anything in the control
+ if ( m_entry->IsEmpty() )
+ {
+ m_entry->ChangeValue(m_hint);
+
+ m_colFg = m_win->GetForegroundColour();
+ m_win->SetForegroundColour(*wxLIGHT_GREY);
+
+ m_showsHint = true;
+ }
+
+ event.Skip();
+ }
+
+ // the text control we're associated with (as its interface and its window)
+ wxTextEntryBase * const m_entry;
+ wxWindow * const m_win;
+
+ // the original foreground colour of m_win before we changed it
+ wxColour m_colFg;
+
+ // the hint passed to wxTextEntry::SetHint()
+ wxString m_hint;
+
+ // true if we're currently showing it, for this we must be empty and not
+ // have focus
+ bool m_showsHint;
+
+ wxDECLARE_NO_COPY_CLASS(wxTextEntryHintData);
+};