X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/af111fc33841cc8bdc4d6cf027702805333bdd2a..4b1f929cc3421e43409f7d62260bf9ba0ffc75ab:/src/motif/textctrl.cpp diff --git a/src/motif/textctrl.cpp b/src/motif/textctrl.cpp index df6e6269b5..ced2808927 100644 --- a/src/motif/textctrl.cpp +++ b/src/motif/textctrl.cpp @@ -21,9 +21,14 @@ #pragma implementation "textctrl.h" #endif +#ifdef __VMS +#define XtParent XTPARENT +#endif + +#include "wx/defs.h" + #include #include -#include #include #include "wx/textctrl.h" @@ -31,7 +36,13 @@ #include "wx/filefn.h" #include "wx/utils.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/motif/private.h" @@ -51,7 +62,6 @@ 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); -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxTextCtrl, wxControl) BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) @@ -71,7 +81,6 @@ static void wxTextWindowActivateProc(Widget w, XtPointer clientData, XmAnyCallba EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) END_EVENT_TABLE() -#endif // ============================================================================ // implementation @@ -98,24 +107,14 @@ bool wxTextCtrl::Create(wxWindow *parent, const wxValidator& validator, const wxString& name) { + if( !CreateControl( parent, id, pos, size, style, validator, name ) ) + return false; + m_tempCallbackStruct = (void*) NULL; m_modified = FALSE; m_processedDefault = FALSE; - // m_backgroundColour = parent->GetBackgroundColour(); - m_backgroundColour = * wxWHITE; - m_foregroundColour = parent->GetForegroundColour(); - - SetName(name); - SetValidator(validator); - if (parent) - parent->AddChild(this); - m_windowStyle = style; - - if ( id == -1 ) - m_windowId = (int)NewControlId(); - else - m_windowId = id; + m_backgroundColour = *wxWHITE; Widget parentWidget = (Widget) parent->GetClientWidget(); @@ -131,7 +130,7 @@ bool wxTextCtrl::Create(wxWindow *parent, XtSetArg (args[1], XmNwordWrap, wantWordWrap ? True : False); m_mainWidget = (WXWidget) XmCreateScrolledText(parentWidget, - (char*)name.c_str(), + wxConstCast(name.c_str(), char), args, 2); XtVaSetValues ((Widget) m_mainWidget, @@ -144,7 +143,7 @@ bool wxTextCtrl::Create(wxWindow *parent, { m_mainWidget = (WXWidget)XtVaCreateManagedWidget ( - (char*)name.c_str(), + wxConstCast(name.c_str(), char), xmTextWidgetClass, parentWidget, NULL @@ -171,20 +170,13 @@ bool wxTextCtrl::Create(wxWindow *parent, NULL); } - if ( !!value ) + if ( !value.empty() ) { -#if 0 - // don't do this because it is just linking the text to a source - // string which is unsafe. MB - // - XmTextSetString ((Widget) m_mainWidget, (char*)value.c_str()); -#else // do this instead... MB // XtVaSetValues( (Widget) m_mainWidget, - XmNvalue, (char *)value.c_str(), + XmNvalue, wxConstCast(value.c_str(), char), NULL); -#endif } // install callbacks @@ -199,11 +191,15 @@ bool wxTextCtrl::Create(wxWindow *parent, XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this); // font - m_font = parent->GetFont(); ChangeFont(FALSE); + wxSize best = GetBestSize(); + if( size.x != -1 ) best.x = size.x; + if( size.y != -1 ) best.y = size.y; + SetCanAddEventHandler(TRUE); - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, + pos.x, pos.y, best.x, best.y); ChangeBackgroundColour(); @@ -251,18 +247,11 @@ void wxTextCtrl::SetValue(const wxString& value) { m_inSetValue = TRUE; -#if 0 - // don't do this because it is just linking the text to a source - // string which is unsafe. MB - // - XmTextSetString ((Widget) m_mainWidget, (char*)value.c_str()); -#else // do this instead... MB // XtVaSetValues( (Widget) m_mainWidget, - XmNvalue, (char *)value.c_str(), + XmNvalue, wxConstCast(value.c_str(), char), NULL); -#endif m_inSetValue = FALSE; } @@ -296,7 +285,7 @@ bool wxTextCtrl::CanCut() const // Can cut if there's a selection long from, to; GetSelection(& from, & to); - return (from != to) ; + return (from != to) && (IsEditable()); } bool wxTextCtrl::CanPaste() const @@ -373,7 +362,7 @@ long wxTextCtrl::GetLastPosition() const void wxTextCtrl::Replace(long from, long to, const wxString& value) { XmTextReplace ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, - (char*) (const char*) value); + wxConstCast(value.c_str(), char)); } void wxTextCtrl::Remove(long from, long to) @@ -385,6 +374,9 @@ void wxTextCtrl::Remove(long from, long to) void wxTextCtrl::SetSelection(long from, long to) { + if( to == -1 ) + to = GetLastPosition(); + XmTextSetSelection ((Widget) m_mainWidget, (XmTextPosition) from, (XmTextPosition) to, (Time) 0); } @@ -402,8 +394,8 @@ bool wxTextCtrl::LoadFile(const wxString& file) FILE *fp = 0; struct stat statb; - if ((stat ((char*) (const char*) file, &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG || - !(fp = fopen ((char*) (const char*) file, "r"))) + if ((stat (wxConstCast(file.c_str(), char), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG || + !(fp = fopen (wxConstCast(file.c_str(), char), "r"))) { return FALSE; } @@ -444,7 +436,7 @@ bool wxTextCtrl::SaveFile(const wxString& file) Widget textWidget = (Widget) m_mainWidget; FILE *fp; - if (!(fp = fopen ((char*) (const char*) theFile, "w"))) + if (!(fp = fopen (wxConstCast(theFile.c_str(), char), "w"))) { return FALSE; } @@ -471,7 +463,8 @@ bool wxTextCtrl::SaveFile(const wxString& file) void wxTextCtrl::WriteText(const wxString& text) { long textPosition = GetInsertionPoint() + strlen (text); - XmTextInsert ((Widget) m_mainWidget, GetInsertionPoint(), (char*) (const char*) text); + XmTextInsert ((Widget) m_mainWidget, GetInsertionPoint(), + wxConstCast(text.c_str(), char)); XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL); SetInsertionPoint(textPosition); XmTextShowPosition ((Widget) m_mainWidget, textPosition); @@ -481,7 +474,8 @@ void wxTextCtrl::WriteText(const wxString& text) void wxTextCtrl::AppendText(const wxString& text) { long textPosition = GetLastPosition() + strlen(text); - XmTextInsert ((Widget) m_mainWidget, GetLastPosition(), (char*) (const char*) text); + XmTextInsert ((Widget) m_mainWidget, GetLastPosition(), + wxConstCast(text.c_str(), char)); XtVaSetValues ((Widget) m_mainWidget, XmNcursorPosition, textPosition, NULL); SetInsertionPoint(textPosition); XmTextShowPosition ((Widget) m_mainWidget, textPosition); @@ -657,13 +651,14 @@ void wxTextCtrl::ChangeBackgroundColour() XmNhorizontalScrollBar, &hsb, XmNverticalScrollBar, &vsb, NULL); - wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); + wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); if (hsb) DoChangeBackgroundColour((WXWidget) hsb, backgroundColour, TRUE); if (vsb) DoChangeBackgroundColour((WXWidget) vsb, backgroundColour, TRUE); - DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE); + // MBN: why change parent background? + // DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE); } } @@ -723,6 +718,41 @@ void wxTextCtrl::DoSendEvents(void *wxcbs, long keycode) 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 ); + + 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 ); +} + +wxSize wxTextCtrl::DoGetBestSize() const +{ + if( IsSingleLine() ) + return wxDoGetSingleTextCtrlBestSize( (Widget)m_mainWidget, this ); + else + return wxWindow::DoGetBestSize(); +} + // ---------------------------------------------------------------------------- // helpers and Motif callbacks // ---------------------------------------------------------------------------- @@ -752,7 +782,9 @@ static void MergeChangesIntoString(wxString& value, const char * const passwd = value; int len = value.length(); - len += strlen(cbs->text->ptr) + 1; // + new text (if any) + NUL + len += ( cbs->text->ptr ? + strlen(cbs->text->ptr) : + 0 ) + 1; // + new text (if any) + NUL len -= cbs->endPos - cbs->startPos; // - text from affected region. char * newS = new char [len]; @@ -766,8 +798,9 @@ static void MergeChangesIntoString(wxString& value, *dest++ = *p++; // Copy the text to be inserted). - while (*insert) - *dest++ = *insert++; + if (insert) + while (*insert) + *dest++ = *insert++; // Finally, copy into newS any remaining text from passwd[endPos] on. for (p = passwd + cbs->endPos; *p; )