+void wxTextCtrl::ChangeForegroundColour()
+{
+ wxWindow::ChangeForegroundColour();
+
+ if (m_windowStyle & wxTE_MULTILINE)
+ {
+ Widget parent = XtParent ((Widget) m_mainWidget);
+ Widget hsb, vsb;
+
+ XtVaGetValues (parent,
+ XmNhorizontalScrollBar, &hsb,
+ XmNverticalScrollBar, &vsb,
+ NULL);
+
+ /* TODO: should scrollbars be affected? Should probably have separate
+ * function to change them (by default, taken from wxSystemSettings)
+ if (hsb)
+ DoChangeForegroundColour((WXWidget) hsb, m_foregroundColour);
+ if (vsb)
+ DoChangeForegroundColour((WXWidget) vsb, m_foregroundColour);
+ */
+ DoChangeForegroundColour((WXWidget) parent, m_foregroundColour);
+ }
+}
+
+void wxTextCtrl::DoSendEvents(void *wxcbs, long keycode)
+{
+ // we're in process of updating the text control
+ m_tempCallbackStruct = wxcbs;
+
+ XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct *)wxcbs;
+
+ wxKeyEvent event (wxEVT_CHAR);
+ event.SetId(GetId());
+ event.m_keyCode = keycode;
+ event.SetEventObject(this);
+
+ // Only if wxTextCtrl::OnChar is called will this be set to True (and
+ // the character passed through)
+ cbs->doit = False;
+
+ GetEventHandler()->ProcessEvent(event);
+
+ if ( !InSetValue() && m_processedDefault )
+ {
+ // Can generate a command
+ wxCommandEvent commandEvent(wxEVT_COMMAND_TEXT_UPDATED, GetId());
+ commandEvent.SetEventObject(this);
+ ProcessCommand(commandEvent);
+ }
+
+ // do it after the (user) event handlers processed the events because
+ // otherwise GetValue() would return incorrect (not yet updated value)
+ m_tempCallbackStruct = NULL;
+}
+
+wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget,
+ const wxWindow* window )
+{
+ Dimension xmargin, ymargin, highlight, shadow;
+ char* value;
+
+ XtVaGetValues( textWidget,
+ XmNmarginWidth, &xmargin,
+ XmNmarginHeight, &ymargin,
+ XmNvalue, &value,
+ XmNhighlightThickness, &highlight,
+ XmNshadowThickness, &shadow,
+ NULL );
+ if( !value )
+ value = "|";
+
+ int x, y;
+ window->GetTextExtent( value, &x, &y );
+
+ return wxSize( x + 2 * xmargin + 2 * highlight + 2 * shadow,
+ // MBN: +2 necessary: Lesstif bug or mine?
+ y + 2 * ymargin + 2 * highlight + 2 * shadow + 2 );
+}
+
+wxSize wxTextCtrl::DoGetBestSize() const
+{
+ if( IsSingleLine() )
+ return wxDoGetSingleTextCtrlBestSize( (Widget)m_mainWidget, this );
+ else
+ return wxWindow::DoGetBestSize();
+}
+
+// ----------------------------------------------------------------------------
+// helpers and Motif callbacks
+// ----------------------------------------------------------------------------
+
+static void MergeChangesIntoString(wxString& value,
+ XmTextVerifyCallbackStruct *cbs)