X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..404b319a85dadd7decf7a5a5331020520031a41c:/src/motif/textctrl.cpp diff --git a/src/motif/textctrl.cpp b/src/motif/textctrl.cpp index 0efb6c71d0..f637e1fa42 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: @@ -20,20 +20,18 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#ifdef __VMS -#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 @@ -61,9 +59,7 @@ 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) - - BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) + BEGIN_EVENT_TABLE(wxTextCtrl, wxTextCtrlBase) EVT_DROP_FILES(wxTextCtrl::OnDropFiles) EVT_CHAR(wxTextCtrl::OnChar) @@ -92,7 +88,7 @@ static void wxTextWindowActivateProc(Widget w, XtPointer clientData, XmAnyCallba // Text item wxTextCtrl::wxTextCtrl() { - m_tempCallbackStruct = (void*) NULL; + m_tempCallbackStruct = NULL; m_modified = false; m_processedDefault = false; } @@ -108,13 +104,12 @@ bool wxTextCtrl::Create(wxWindow *parent, { if( !CreateControl( parent, id, pos, size, style, validator, name ) ) return false; + PreCreation(); - m_tempCallbackStruct = (void*) NULL; + m_tempCallbackStruct = NULL; m_modified = false; m_processedDefault = false; - m_backgroundColour = *wxWHITE; - Widget parentWidget = (Widget) parent->GetClientWidget(); Bool wantHorizScroll = (m_windowStyle & wxHSCROLL) != 0 ? True : False; @@ -133,17 +128,18 @@ bool wxTextCtrl::Create(wxWindow *parent, Arg args[8]; int count = 0; XtSetArg (args[count], XmNscrollHorizontal, wantHorizScroll); ++count; - XtSetArg (args[count], (String) wxFont::GetFontTag(), - m_font.GetFontType( XtDisplay(parentWidget) ) ); ++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, value.c_str()); ++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, - wxConstCast(name.c_str(), char), + name.char_str(), args, count); XtManageChild ((Widget) m_mainWidget); @@ -152,11 +148,11 @@ bool wxTextCtrl::Create(wxWindow *parent, { m_mainWidget = (WXWidget)XtVaCreateManagedWidget ( - wxConstCast(name.c_str(), char), + name.mb_str(), xmTextWidgetClass, parentWidget, wxFont::GetFontTag(), m_font.GetFontType( XtDisplay(parentWidget) ), - XmNvalue, value.c_str(), + XmNvalue, (const char*)value.mb_str(), XmNeditable, (style & wxTE_READONLY) ? False : True, NULL @@ -165,8 +161,8 @@ bool wxTextCtrl::Create(wxWindow *parent, #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.empty() && (value.length() > (unsigned int) noCols)) + noCols = value.length(); XtVaSetValues((Widget) m_mainWidget, XmNcolumns, noCols, NULL); @@ -192,11 +188,10 @@ bool wxTextCtrl::Create(wxWindow *parent, XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this); + PostCreation(); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); - ChangeBackgroundColour(); - return true; } @@ -218,14 +213,7 @@ wxString wxTextCtrl::GetValue() const } else { - // just get the string from Motif - char *s = XmTextGetString ((Widget) m_mainWidget); - if ( s ) - { - str = s; - XtFree (s); - } - //else: return empty string + str = wxTextEntry::GetValue(); if ( m_tempCallbackStruct ) { @@ -238,173 +226,23 @@ wxString wxTextCtrl::GetValue() const return str; } -void wxTextCtrl::SetValue(const wxString& text) +void wxTextCtrl::DoSetValue(const wxString& text, int flags) { m_inSetValue = true; - XmTextSetString ((Widget) m_mainWidget, wxConstCast(text.c_str(), char)); + XmTextSetString ((Widget) m_mainWidget, text.char_str()); XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, text.length(), NULL); SetInsertionPoint(text.length()); XmTextShowPosition ((Widget) m_mainWidget, text.length()); - m_modified = TRUE; - - m_inSetValue = false; -} - -// Clipboard operations -void wxTextCtrl::Copy() -{ - XmTextCopy((Widget) m_mainWidget, CurrentTime); -} - -void wxTextCtrl::Cut() -{ - XmTextCut((Widget) m_mainWidget, CurrentTime); -} - -void wxTextCtrl::Paste() -{ - XmTextPaste((Widget) m_mainWidget); -} - -bool wxTextCtrl::CanCopy() const -{ - // Can copy if there's a selection - long from, to; - GetSelection(& from, & to); - return (from != to) ; -} - -bool wxTextCtrl::CanCut() const -{ - // Can cut if there's a selection - long from, to; - GetSelection(& from, & to); - return (from != to) && (IsEditable()); -} - -bool wxTextCtrl::CanPaste() const -{ - return IsEditable() ; -} - -// Undo/redo -void wxTextCtrl::Undo() -{ - // Not possible in Motif -} - -void wxTextCtrl::Redo() -{ - // Not possible in Motif -} - -bool wxTextCtrl::CanUndo() const -{ - // No Undo in Motif - return false; -} - -bool wxTextCtrl::CanRedo() const -{ - // No Redo in Motif - return false; -} - -// If the return values from and to are the same, there is no -// selection. -void wxTextCtrl::GetSelection(long* from, long* to) const -{ - XmTextPosition left, right; - - XmTextGetSelectionPosition((Widget) m_mainWidget, & left, & right); - - *from = (long) left; - *to = (long) right; -} - -bool wxTextCtrl::IsEditable() const -{ - return (XmTextGetEditable((Widget) m_mainWidget) != 0); -} - -void wxTextCtrl::SetEditable(bool editable) -{ - XmTextSetEditable((Widget) m_mainWidget, (Boolean) editable); -} - -void wxTextCtrl::SetInsertionPoint(long pos) -{ - XmTextSetInsertionPosition ((Widget) m_mainWidget, (XmTextPosition) pos); -} - -void wxTextCtrl::SetInsertionPointEnd() -{ - wxTextPos pos = GetLastPosition(); - SetInsertionPoint(pos); -} - -long wxTextCtrl::GetInsertionPoint() const -{ - return (long) XmTextGetInsertionPosition ((Widget) m_mainWidget); -} - -wxTextPos wxTextCtrl::GetLastPosition() const -{ - return (long) XmTextGetLastPosition ((Widget) m_mainWidget); -} - -void wxTextCtrl::Replace(long from, long to, const wxString& value) -{ - XmTextReplace ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, - wxConstCast(value.c_str(), char)); -} - -void wxTextCtrl::Remove(long from, long to) -{ - XmTextSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, - (Time) 0); - XmTextRemove ((Widget) m_mainWidget); -} - -void wxTextCtrl::SetSelection(long from, long to) -{ - if( to == -1 ) - to = GetLastPosition(); - - XmTextSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, - (Time) 0); -} - -void wxTextCtrl::WriteText(const wxString& 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; -} -void wxTextCtrl::AppendText(const wxString& text) -{ - 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_inSetValue = false; -void wxTextCtrl::Clear() -{ - XmTextSetString ((Widget) m_mainWidget, wxMOTIF_STR("")); - m_modified = false; + if ( flags & SetValue_SendEvent ) + SendTextUpdatedEvent(); } bool wxTextCtrl::IsModified() const @@ -488,7 +326,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 @@ -498,7 +336,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++ ) @@ -547,9 +385,9 @@ void wxTextCtrl::OnChar(wxKeyEvent& event) XmTextVerifyCallbackStruct *textStruct = (XmTextVerifyCallbackStruct *) m_tempCallbackStruct; textStruct->doit = True; - if (isascii(event.m_keyCode) && (textStruct->text->length == 1)) + if (wxIsascii(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); } } } @@ -627,7 +465,7 @@ void wxTextCtrl::DoSendEvents(void *wxcbs, long keycode) // the character passed through) cbs->doit = False; - GetEventHandler()->ProcessEvent(event); + HandleWindowEvent(event); if ( !InSetValue() && m_processedDefault ) { @@ -662,8 +500,8 @@ wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget, 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? @@ -675,10 +513,16 @@ wxSize wxTextCtrl::DoGetBestSize() const if( IsSingleLine() ) { wxSize best = wxControl::DoGetBestSize(); - - if( best.x < 110 ) best.x = 110; +#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(); @@ -817,7 +661,7 @@ wxTextWindowGainFocusProc (Widget w, XtPointer clientData, XmAnyCallbackStruct * wxTextCtrl *tw = (wxTextCtrl *) clientData; wxFocusEvent event(wxEVT_SET_FOCUS, tw->GetId()); event.SetEventObject(tw); - tw->GetEventHandler()->ProcessEvent(event); + tw->HandleWindowEvent(event); } static void @@ -829,7 +673,7 @@ wxTextWindowLoseFocusProc (Widget w, XtPointer clientData, XmAnyCallbackStruct * wxTextCtrl *tw = (wxTextCtrl *) clientData; wxFocusEvent event(wxEVT_KILL_FOCUS, tw->GetId()); event.SetEventObject(tw); - tw->GetEventHandler()->ProcessEvent(event); + tw->HandleWindowEvent(event); } static void wxTextWindowActivateProc(Widget w, XtPointer clientData,