+bool wxTextCtrlBase::CanPaste() const
+{
+ // can paste if we are not read only
+ return IsEditable();
+}
+
+// ----------------------------------------------------------------------------
+// emulating key presses
+// ----------------------------------------------------------------------------
+
+#ifdef __WIN32__
+// the generic version is unused in wxMSW
+bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& WXUNUSED(event))
+{
+ return false;
+}
+#else // !__WIN32__
+bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& event)
+{
+ wxChar ch = 0;
+ int keycode = event.GetKeyCode();
+ switch ( keycode )
+ {
+ case WXK_NUMPAD0:
+ case WXK_NUMPAD1:
+ case WXK_NUMPAD2:
+ case WXK_NUMPAD3:
+ case WXK_NUMPAD4:
+ case WXK_NUMPAD5:
+ case WXK_NUMPAD6:
+ case WXK_NUMPAD7:
+ case WXK_NUMPAD8:
+ case WXK_NUMPAD9:
+ ch = (wxChar)(_T('0') + keycode - WXK_NUMPAD0);
+ break;
+
+ case WXK_MULTIPLY:
+ case WXK_NUMPAD_MULTIPLY:
+ ch = _T('*');
+ break;
+
+ case WXK_ADD:
+ case WXK_NUMPAD_ADD:
+ ch = _T('+');
+ break;
+
+ case WXK_SUBTRACT:
+ case WXK_NUMPAD_SUBTRACT:
+ ch = _T('-');
+ break;
+
+ case WXK_DECIMAL:
+ case WXK_NUMPAD_DECIMAL:
+ ch = _T('.');
+ break;
+
+ case WXK_DIVIDE:
+ case WXK_NUMPAD_DIVIDE:
+ ch = _T('/');
+ break;
+
+ case WXK_DELETE:
+ case WXK_NUMPAD_DELETE:
+ // delete the character at cursor
+ {
+ const long pos = GetInsertionPoint();
+ if ( pos < GetLastPosition() )
+ Remove(pos, pos + 1);
+ }
+ break;
+
+ case WXK_BACK:
+ // delete the character before the cursor
+ {
+ const long pos = GetInsertionPoint();
+ if ( pos > 0 )
+ Remove(pos - 1, pos);
+ }
+ break;
+
+ default:
+#if wxUSE_UNICODE
+ if ( event.GetUnicodeKey() )
+ {
+ ch = event.GetUnicodeKey();
+ }
+ else
+#endif
+ if ( keycode < 256 && keycode >= 0 && wxIsprint(keycode) )
+ {
+ // FIXME this is not going to work for non letters...
+ if ( !event.ShiftDown() )
+ {
+ keycode = wxTolower(keycode);
+ }
+
+ ch = (wxChar)keycode;
+ }
+ else
+ {
+ ch = _T('\0');
+ }
+ }
+
+ if ( ch )
+ {
+ WriteText(ch);
+
+ return true;
+ }
+
+ return false;
+}
+#endif // !__WIN32__
+
+// ----------------------------------------------------------------------------
+// selection and ranges
+// ----------------------------------------------------------------------------
+
+void wxTextCtrlBase::SelectAll()
+{
+ SetSelection(0, GetLastPosition());
+}
+
+wxString wxTextCtrlBase::GetStringSelection() const
+{
+ long from, to;
+ GetSelection(&from, &to);
+
+ return GetRange(from, to);
+}
+
+wxString wxTextCtrlBase::GetRange(long from, long to) const
+{
+ wxString sel;
+ if ( from < to )
+ {
+ sel = GetValue().Mid(from, to - from);
+ }
+
+ return sel;
+}
+
+// do the window-specific processing after processing the update event
+void wxTextCtrlBase::DoUpdateWindowUI(wxUpdateUIEvent& event)
+{
+ // call inherited, but skip the wxControl's version, and call directly the
+ // wxWindow's one instead, because the only reason why we are overriding this
+ // function is that we want to use SetValue() instead of wxControl::SetLabel()
+ wxWindowBase::DoUpdateWindowUI(event);
+
+ // update text
+ if ( event.GetSetText() )
+ {
+ if ( event.GetText() != GetValue() )
+ SetValue(event.GetText());
+ }
+}
+
+// ----------------------------------------------------------------------------
+// hit testing
+// ----------------------------------------------------------------------------
+
+wxTextCtrlHitTestResult
+wxTextCtrlBase::HitTest(const wxPoint& pt, wxTextCoord *x, wxTextCoord *y) const
+{
+ // implement in terms of the other overload as the native ports typically
+ // can get the position and not (x, y) pair directly (although wxUniv
+ // directly gets x and y -- and so overrides this method as well)
+ long pos;
+ wxTextCtrlHitTestResult rc = HitTest(pt, &pos);
+
+ if ( rc != wxTE_HT_UNKNOWN )
+ {
+ PositionToXY(pos, x, y);
+ }
+
+ return rc;
+}
+
+wxTextCtrlHitTestResult
+wxTextCtrlBase::HitTest(const wxPoint& WXUNUSED(pt),
+ long * WXUNUSED(pos)) const
+{
+ // not implemented
+ return wxTE_HT_UNKNOWN;
+}
+
+// ----------------------------------------------------------------------------
+// events
+// ----------------------------------------------------------------------------
+
+void wxTextCtrlBase::SendTextUpdatedEvent()
+{
+ wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId());
+
+ // do not do this as it could be very inefficient if the text control
+ // contains a lot of text and we're not using ref-counted wxString
+ // implementation -- instead, event.GetString() will query the control for
+ // its current text if needed
+ //event.SetString(GetValue());
+
+ event.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(event);
+}
+
+#else // !wxUSE_TEXTCTRL
+
+// define this one even if !wxUSE_TEXTCTRL because it is also used by other
+// controls (wxComboBox and wxSpinCtrl)
+
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED)