+ wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
+
+ Remove( from, to );
+
+ if (!value.IsEmpty())
+ {
+#ifdef __WXGTK20__
+ SetInsertionPoint( from );
+ WriteText( value );
+#else // GTK 1.x
+ gint pos = (gint)from;
+#if wxUSE_UNICODE
+ wxWX2MBbuf buf = value.mbc_str();
+ gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &pos );
+#else
+ gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos );
+#endif // wxUSE_UNICODE
+#endif // GTK 1.x/2.x
+ }
+}
+
+void wxTextCtrl::Cut()
+{
+ wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
+
+#ifndef __WXGTK20__
+ gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
+#endif
+}
+
+void wxTextCtrl::Copy()
+{
+ wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
+
+#ifndef __WXGTK20__
+ gtk_editable_copy_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
+#endif
+}
+
+void wxTextCtrl::Paste()
+{
+ wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
+
+#ifndef __WXGTK20__
+ gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) DUMMY_CLIPBOARD_ARG );
+#endif
+}
+
+// Undo/redo
+void wxTextCtrl::Undo()
+{
+ // TODO
+ wxFAIL_MSG( wxT("wxTextCtrl::Undo not implemented") );
+}
+
+void wxTextCtrl::Redo()
+{
+ // TODO
+ wxFAIL_MSG( wxT("wxTextCtrl::Redo not implemented") );
+}
+
+bool wxTextCtrl::CanUndo() const
+{
+ // TODO
+ //wxFAIL_MSG( wxT("wxTextCtrl::CanUndo not implemented") );
+ return FALSE;
+}
+
+bool wxTextCtrl::CanRedo() const
+{
+ // TODO
+ //wxFAIL_MSG( wxT("wxTextCtrl::CanRedo not implemented") );
+ return FALSE;
+}
+
+// If the return values from and to are the same, there is no
+// selection.
+void wxTextCtrl::GetSelection(long* fromOut, long* toOut) const
+{
+ wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
+
+ gint from = -1;
+ gint to = -1;
+ bool haveSelection = FALSE;
+
+#ifdef __WXGTK20__
+ if (m_windowStyle & wxTE_MULTILINE)
+ {
+ GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (m_text));
+ GtkTextIter ifrom, ito;
+ if ( gtk_text_buffer_get_selection_bounds(buffer, &ifrom, &ito) )
+ {
+ haveSelection = TRUE;
+ from = gtk_text_iter_get_offset(&ifrom);
+ to = gtk_text_iter_get_offset(&ito);
+ }
+ }
+ else // not multi-line
+ {
+ if ( gtk_editable_get_selection_bounds( GTK_EDITABLE(m_text),
+ &from, &to) )
+ {
+ haveSelection = TRUE;
+ }
+ }
+#else // not GTK2
+ if ( (GTK_EDITABLE(m_text)->has_selection) )
+ {
+ haveSelection = TRUE;
+ from = (long) GTK_EDITABLE(m_text)->selection_start_pos;
+ to = (long) GTK_EDITABLE(m_text)->selection_end_pos;
+ }
+#endif
+
+ if (! haveSelection )
+ from = to = GetInsertionPoint();
+
+ if ( from > to )
+ {
+ // exchange them to be compatible with wxMSW
+ gint tmp = from;
+ from = to;
+ to = tmp;
+ }
+
+ if ( fromOut )
+ *fromOut = from;
+ if ( toOut )
+ *toOut = to;
+}
+
+
+bool wxTextCtrl::IsEditable() const
+{
+ wxCHECK_MSG( m_text != NULL, FALSE, wxT("invalid text ctrl") );
+
+#ifdef __WXGTK20__
+ if (m_windowStyle & wxTE_MULTILINE)
+ {
+ return gtk_text_view_get_editable(GTK_TEXT_VIEW(m_text));
+ }
+ else
+ {
+ return gtk_editable_get_editable(GTK_EDITABLE(m_text));
+ }
+#else
+ return GTK_EDITABLE(m_text)->editable;
+#endif
+}
+
+bool wxTextCtrl::IsModified() const
+{
+ return m_modified;
+}
+
+void wxTextCtrl::Clear()
+{
+ SetValue( wxT("") );
+}
+
+void wxTextCtrl::OnChar( wxKeyEvent &key_event )
+{
+ wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") );
+
+ if ((key_event.GetKeyCode() == WXK_RETURN) && (m_windowStyle & wxPROCESS_ENTER))
+ {
+ wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
+ event.SetEventObject(this);
+ event.SetString(GetValue());
+ if (GetEventHandler()->ProcessEvent(event)) return;
+ }
+
+ if ((key_event.GetKeyCode() == WXK_RETURN) && !(m_windowStyle & wxTE_MULTILINE))
+ {
+ // This will invoke the dialog default action, such
+ // as the clicking the default button.
+
+ wxWindow *top_frame = m_parent;
+ while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
+ top_frame = top_frame->GetParent();
+
+ if (top_frame && GTK_IS_WINDOW(top_frame->m_widget))
+ {
+ GtkWindow *window = GTK_WINDOW(top_frame->m_widget);
+
+ if (window->default_widget)
+ {
+ gtk_widget_activate (window->default_widget);
+ return;
+ }
+ }
+ }
+
+ key_event.Skip();