X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/96be256b3e1802de10f45953c41ed33bce399b54..479647105b2ad7d4016b04aefcf2021daed922a1:/src/motif/textctrl.cpp diff --git a/src/motif/textctrl.cpp b/src/motif/textctrl.cpp index 06e42ff6c7..82624d53e8 100644 --- a/src/motif/textctrl.cpp +++ b/src/motif/textctrl.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: textctrl.cpp +// Name: src/motif/textctrl.cpp // Purpose: wxTextCtrl // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "textctrl.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,16 +24,18 @@ #define XtParent XTPARENT #endif -#include "wx/defs.h" - #include #include #include #include "wx/textctrl.h" -#include "wx/settings.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/settings.h" +#endif + #include "wx/filefn.h" -#include "wx/utils.h" #ifdef __VMS__ #pragma message disable nosimpint @@ -65,9 +63,9 @@ static void wxTextWindowGainFocusProc(Widget w, XtPointer clientData, XmAnyCallb static void wxTextWindowLoseFocusProc(Widget w, XtPointer clientData, XmAnyCallbackStruct *cbs); static void wxTextWindowActivateProc(Widget w, XtPointer clientData, XmAnyCallbackStruct *ptr); - IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) + IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxTextCtrlBase) - BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) + BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) EVT_CHAR(wxTextCtrl::OnChar) @@ -112,57 +110,69 @@ bool wxTextCtrl::Create(wxWindow *parent, { if( !CreateControl( parent, id, pos, size, style, validator, name ) ) return false; + PreCreation(); m_tempCallbackStruct = (void*) NULL; m_modified = false; m_processedDefault = false; - m_backgroundColour = *wxWHITE; - Widget parentWidget = (Widget) parent->GetClientWidget(); - bool wantHorizScrolling = ((m_windowStyle & wxHSCROLL) != 0); - + Bool wantHorizScroll = (m_windowStyle & wxHSCROLL) != 0 ? True : False; // If we don't have horizontal scrollbars, we want word wrap. - bool wantWordWrap = !wantHorizScrolling; + // OpenMotif 2.1 crashes if wantWordWrap is True in Japanese + // locale (and probably other multibyte locales). The check might be + // more precise +#if wxCHECK_LESSTIF() || wxCHECK_MOTIF_VERSION( 2, 2 ) + Bool wantWordWrap = wantHorizScroll == True ? False : True; +#else + Bool wantWordWrap = False; +#endif if (m_windowStyle & wxTE_MULTILINE) { - Arg args[2]; - XtSetArg (args[0], XmNscrollHorizontal, wantHorizScrolling ? True : False); - XtSetArg (args[1], XmNwordWrap, wantWordWrap ? True : False); - - m_mainWidget = (WXWidget) XmCreateScrolledText(parentWidget, - wxConstCast(name.c_str(), char), - args, 2); - - XtVaSetValues ((Widget) m_mainWidget, - XmNeditable, ((style & wxTE_READONLY) ? False : True), - XmNeditMode, XmMULTI_LINE_EDIT, - NULL); + Arg args[8]; + int count = 0; + XtSetArg (args[count], XmNscrollHorizontal, wantHorizScroll); ++count; + if( m_font.IsOk() ) + XtSetArg (args[count], (String) wxFont::GetFontTag(), + m_font.GetFontType( XtDisplay(parentWidget) ) ); ++count; + XtSetArg (args[count], XmNwordWrap, wantWordWrap); ++count; + XtSetArg (args[count], XmNvalue, (const char*)value.mb_str()); ++count; + XtSetArg (args[count], XmNeditable, + style & wxTE_READONLY ? False : True); ++count; + XtSetArg (args[count], XmNeditMode, XmMULTI_LINE_EDIT ); ++count; + + m_mainWidget = + (WXWidget) XmCreateScrolledText(parentWidget, + name.char_str(), + args, count); + XtManageChild ((Widget) m_mainWidget); } else { m_mainWidget = (WXWidget)XtVaCreateManagedWidget ( - wxConstCast(name.c_str(), char), + name.mb_str(), xmTextWidgetClass, parentWidget, + wxFont::GetFontTag(), m_font.GetFontType( XtDisplay(parentWidget) ), + XmNvalue, (const char*)value.mb_str(), + XmNeditable, (style & wxTE_READONLY) ? + False : True, NULL ); - XtVaSetValues ((Widget) m_mainWidget, - XmNeditable, ((style & wxTE_READONLY) ? False : True), - NULL); - +#if 0 // TODO: Is this relevant? What does it do? int noCols = 2; - if (!value.IsNull() && (value.Length() > (unsigned int) noCols)) - noCols = value.Length(); + if (!value.IsNull() && (value.length() > (unsigned int) noCols)) + noCols = value.length(); XtVaSetValues((Widget) m_mainWidget, XmNcolumns, noCols, NULL); +#endif } // remove border if asked for @@ -173,15 +183,6 @@ bool wxTextCtrl::Create(wxWindow *parent, NULL); } - if ( !value.empty() ) - { - // do this instead... MB - // - XtVaSetValues( (Widget) m_mainWidget, - XmNvalue, wxConstCast(value.c_str(), char), - NULL); - } - // install callbacks XtAddCallback((Widget) m_mainWidget, XmNvalueChangedCallback, (XtCallbackProc)wxTextWindowChangedProc, (XtPointer)this); @@ -193,17 +194,9 @@ bool wxTextCtrl::Create(wxWindow *parent, XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this); - // font - ChangeFont(false); - - wxSize best = GetBestSize(); - if( size.x != -1 ) best.x = size.x; - if( size.y != -1 ) best.y = size.y; - + PostCreation(); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, - pos.x, pos.y, best.x, best.y); - - ChangeBackgroundColour(); + pos.x, pos.y, size.x, size.y); return true; } @@ -246,23 +239,23 @@ wxString wxTextCtrl::GetValue() const return str; } -void wxTextCtrl::SetValue(const wxString& value) +void wxTextCtrl::DoSetValue(const wxString& text, int flags) { m_inSetValue = true; - // do this instead... MB - // - // with (at least) OpenMotif 2.1 this causes a lot of flicker -#if 0 - XtVaSetValues( (Widget) m_mainWidget, - XmNvalue, wxConstCast(value.c_str(), char), + XmTextSetString ((Widget) m_mainWidget, text.char_str()); + XtVaSetValues ((Widget) m_mainWidget, + XmNcursorPosition, text.length(), NULL); -#endif - Clear(); - AppendText( value ); + SetInsertionPoint(text.length()); + XmTextShowPosition ((Widget) m_mainWidget, text.length()); + m_modified = true; m_inSetValue = false; + + if ( flags & SetValue_SendEvent ) + SendTextUpdatedEvent(); } // Clipboard operations @@ -371,7 +364,7 @@ wxTextPos wxTextCtrl::GetLastPosition() const void wxTextCtrl::Replace(long from, long to, const wxString& value) { XmTextReplace ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, - wxConstCast(value.c_str(), char)); + value.char_str()); } void wxTextCtrl::Remove(long from, long to) @@ -394,7 +387,7 @@ void wxTextCtrl::WriteText(const wxString& text) { long textPosition = GetInsertionPoint() + text.length(); XmTextInsert ((Widget) m_mainWidget, GetInsertionPoint(), - wxConstCast(text.c_str(), char)); + text.char_str()); XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL); SetInsertionPoint(textPosition); XmTextShowPosition ((Widget) m_mainWidget, textPosition); @@ -405,7 +398,7 @@ void wxTextCtrl::AppendText(const wxString& text) { wxTextPos textPosition = GetLastPosition() + text.length(); XmTextInsert ((Widget) m_mainWidget, GetLastPosition(), - wxConstCast(text.c_str(), char)); + text.char_str()); XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL); SetInsertionPoint(textPosition); XmTextShowPosition ((Widget) m_mainWidget, textPosition); @@ -414,7 +407,7 @@ void wxTextCtrl::AppendText(const wxString& text) void wxTextCtrl::Clear() { - XmTextSetString ((Widget) m_mainWidget, ""); + XmTextSetString ((Widget) m_mainWidget, wxMOTIF_STR("")); m_modified = false; } @@ -499,7 +492,7 @@ void wxTextCtrl::ShowPosition(long pos) int wxTextCtrl::GetLineLength(long lineNo) const { wxString str = GetLineText (lineNo); - return (int) str.Length(); + return (int) str.length(); } wxString wxTextCtrl::GetLineText(long lineNo) const @@ -509,7 +502,7 @@ wxString wxTextCtrl::GetLineText(long lineNo) const if (s) { - wxString buf(""); + wxString buf; long i; int currentLine = 0; for (i = 0; currentLine != lineNo && s[i]; i++ ) @@ -560,7 +553,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) textStruct->doit = True; if (isascii(event.m_keyCode) && (textStruct->text->length == 1)) { - textStruct->text->ptr[0] = ((event.m_keyCode == WXK_RETURN) ? 10 : event.m_keyCode); + textStruct->text->ptr[0] = (char)((event.m_keyCode == WXK_RETURN) ? 10 : event.m_keyCode); } } } @@ -668,12 +661,13 @@ wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget, NULL ); if( !value ) - value = "|"; + value = wxMOTIF_STR("|"); int x, y; window->GetTextExtent( value, &x, &y ); - if( x < 100 ) x = 100; + if( x < 90 ) + x = 90; return wxSize( x + 2 * xmargin + 2 * highlight + 2 * shadow, // MBN: +2 necessary: Lesstif bug or mine? @@ -683,7 +677,19 @@ wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget, wxSize wxTextCtrl::DoGetBestSize() const { if( IsSingleLine() ) - return wxDoGetSingleTextCtrlBestSize( (Widget)m_mainWidget, this ); + { + wxSize best = wxControl::DoGetBestSize(); +#if wxCHECK_MOTIF_VERSION( 2, 3 ) + // OpenMotif 2.3 gives way too big X sizes + wxSize other_best = wxDoGetSingleTextCtrlBestSize + ( (Widget) GetTopWidget(), this ); + return wxSize( other_best.x, best.y ); +#else + if( best.x < 90 ) best.x = 90; + + return best; +#endif + } else return wxWindow::DoGetBestSize(); }