X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a8680e3e0e5066d35a8f4fd43294ba4bfcaf4ba7..9bb50fd0b04c824fc7ba14c0dc4ba4a2a9a1e6ad:/src/motif/textctrl.cpp diff --git a/src/motif/textctrl.cpp b/src/motif/textctrl.cpp index cb5b2b49a9..4e9b4655cb 100644 --- a/src/motif/textctrl.cpp +++ b/src/motif/textctrl.cpp @@ -17,10 +17,13 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "textctrl.h" #endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + #ifdef __VMS #define XtParent XTPARENT #endif @@ -94,8 +97,8 @@ static void wxTextWindowActivateProc(Widget w, XtPointer clientData, XmAnyCallba wxTextCtrl::wxTextCtrl() { m_tempCallbackStruct = (void*) NULL; - m_modified = FALSE; - m_processedDefault = FALSE; + m_modified = false; + m_processedDefault = false; } bool wxTextCtrl::Create(wxWindow *parent, @@ -111,32 +114,42 @@ bool wxTextCtrl::Create(wxWindow *parent, return false; m_tempCallbackStruct = (void*) NULL; - m_modified = FALSE; - m_processedDefault = FALSE; + 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; + XtSetArg (args[count], (String) wxFont::GetFontTag(), + m_font.GetFontType( XtDisplay(parentWidget) ) ); ++count; + XtSetArg (args[count], XmNwordWrap, wantWordWrap); ++count; + XtSetArg (args[count], XmNvalue, value.c_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, + wxConstCast(name.c_str(), char), + args, count); + XtManageChild ((Widget) m_mainWidget); } else @@ -146,13 +159,14 @@ bool wxTextCtrl::Create(wxWindow *parent, wxConstCast(name.c_str(), char), xmTextWidgetClass, parentWidget, + wxFont::GetFontTag(), m_font.GetFontType( XtDisplay(parentWidget) ), + XmNvalue, value.c_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)) @@ -160,6 +174,7 @@ bool wxTextCtrl::Create(wxWindow *parent, XtVaSetValues((Widget) m_mainWidget, XmNcolumns, noCols, NULL); +#endif } // remove border if asked for @@ -170,15 +185,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); @@ -190,19 +196,12 @@ 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; - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, - pos.x, pos.y, best.x, best.y); + pos.x, pos.y, size.x, size.y); ChangeBackgroundColour(); - return TRUE; + return true; } WXWidget wxTextCtrl::GetTopWidget() const @@ -243,23 +242,20 @@ wxString wxTextCtrl::GetValue() const return str; } -void wxTextCtrl::SetValue(const wxString& value) +void wxTextCtrl::SetValue(const wxString& text) { - m_inSetValue = TRUE; + 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, wxConstCast(text.c_str(), char)); + 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; + m_inSetValue = false; } // Clipboard operations @@ -313,13 +309,13 @@ void wxTextCtrl::Redo() bool wxTextCtrl::CanUndo() const { // No Undo in Motif - return FALSE; + return false; } bool wxTextCtrl::CanRedo() const { // No Redo in Motif - return FALSE; + return false; } // If the return values from and to are the same, there is no @@ -351,7 +347,7 @@ void wxTextCtrl::SetInsertionPoint(long pos) void wxTextCtrl::SetInsertionPointEnd() { - long pos = GetLastPosition(); + wxTextPos pos = GetLastPosition(); SetInsertionPoint(pos); } @@ -360,7 +356,7 @@ long wxTextCtrl::GetInsertionPoint() const return (long) XmTextGetInsertionPosition ((Widget) m_mainWidget); } -long wxTextCtrl::GetLastPosition() const +wxTextPos wxTextCtrl::GetLastPosition() const { return (long) XmTextGetLastPosition ((Widget) m_mainWidget); } @@ -389,30 +385,30 @@ void wxTextCtrl::SetSelection(long from, long to) void wxTextCtrl::WriteText(const wxString& text) { - long textPosition = GetInsertionPoint() + strlen (text); + long textPosition = GetInsertionPoint() + text.length(); XmTextInsert ((Widget) m_mainWidget, GetInsertionPoint(), wxConstCast(text.c_str(), char)); XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL); SetInsertionPoint(textPosition); XmTextShowPosition ((Widget) m_mainWidget, textPosition); - m_modified = TRUE; + m_modified = true; } void wxTextCtrl::AppendText(const wxString& text) { - long textPosition = GetLastPosition() + text.length(); + wxTextPos textPosition = GetLastPosition() + text.length(); XmTextInsert ((Widget) m_mainWidget, GetLastPosition(), wxConstCast(text.c_str(), char)); XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL); SetInsertionPoint(textPosition); XmTextShowPosition ((Widget) m_mainWidget, textPosition); - m_modified = TRUE; + m_modified = true; } void wxTextCtrl::Clear() { - XmTextSetString ((Widget) m_mainWidget, ""); - m_modified = FALSE; + XmTextSetString ((Widget) m_mainWidget, wxMOTIF_STR("")); + m_modified = false; } bool wxTextCtrl::IsModified() const @@ -420,10 +416,15 @@ bool wxTextCtrl::IsModified() const return m_modified; } -// Makes 'unmodified' +// Makes modified or unmodified +void wxTextCtrl::MarkDirty() +{ + m_modified = true; +} + void wxTextCtrl::DiscardEdits() { - m_modified = FALSE; + m_modified = false; } int wxTextCtrl::GetNumberOfLines() const @@ -434,7 +435,7 @@ int wxTextCtrl::GetNumberOfLines() const { long i = 0; int currentLine = 0; - bool finished = FALSE; + bool finished = false; while (!finished) { int ch = s[i]; @@ -445,7 +446,7 @@ int wxTextCtrl::GetNumberOfLines() const } else if (ch == 0) { - finished = TRUE; + finished = true; } else i++; @@ -480,7 +481,7 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const if ( y ) *y = yy; - return TRUE; + return true; } void wxTextCtrl::ShowPosition(long pos) @@ -543,7 +544,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) // Indicates that we should generate a normal command, because // we're letting default behaviour happen (otherwise it's vetoed // by virtue of overriding OnChar) - m_processedDefault = TRUE; + m_processedDefault = true; if (m_tempCallbackStruct) { @@ -580,12 +581,12 @@ void wxTextCtrl::ChangeBackgroundColour() NULL); wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); if (hsb) - wxDoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE); + wxDoChangeBackgroundColour((WXWidget) hsb, backgroundColour, true); if (vsb) - wxDoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE); + wxDoChangeBackgroundColour((WXWidget) vsb, backgroundColour, true); // MBN: why change parent background? - // DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE); + // DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, true); } } @@ -660,22 +661,29 @@ 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 < 100 ) + x = 100; return wxSize( x + 2 * xmargin + 2 * highlight + 2 * shadow, // MBN: +2 necessary: Lesstif bug or mine? - y + 2 * ymargin + 2 * highlight + 2 * shadow + 2 ); + y + 2 * ymargin + 2 * highlight + 2 * shadow + 2 ); } wxSize wxTextCtrl::DoGetBestSize() const { if( IsSingleLine() ) - return wxDoGetSingleTextCtrlBestSize( (Widget)m_mainWidget, this ); + { + wxSize best = wxControl::DoGetBestSize(); + + if( best.x < 110 ) best.x = 110; + + return best; + } else return wxWindow::DoGetBestSize(); } @@ -748,14 +756,14 @@ wxTextWindowChangedProc (Widget w, XtPointer clientData, XtPointer WXUNUSED(ptr) return; wxTextCtrl *tw = (wxTextCtrl *) clientData; - tw->SetModified(TRUE); + tw->SetModified(true); } static void wxTextWindowModifyProc (Widget WXUNUSED(w), XtPointer clientData, XmTextVerifyCallbackStruct *cbs) { wxTextCtrl *tw = (wxTextCtrl *) clientData; - tw->m_processedDefault = FALSE; + tw->m_processedDefault = false; // First, do some stuff if it's a password control: in this case, we need // to store the string inside the class because GetValue() can't retrieve