]> git.saurik.com Git - wxWidgets.git/commitdiff
Implemented DoGetBestSize for wxListBox, (native) wxComboBox and
authorMattia Barbon <mbarbon@cpan.org>
Sun, 23 Feb 2003 20:33:43 +0000 (20:33 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sun, 23 Feb 2003 20:33:43 +0000 (20:33 +0000)
wxTextCtrl, and used it when wxSize(-1, -1) is passed to Create, to set
the initial size.
  Added wxDoChangeFont and wxXmStringToString helper functions, removed
the use of m_stringList in native wxComboBox, removed some duplicated code
in wxWindow.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19296 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/motif/combobox.h
include/wx/motif/listbox.h
include/wx/motif/private.h
include/wx/motif/textctrl.h
src/motif/choice.cpp
src/motif/combobox_native.cpp
src/motif/listbox.cpp
src/motif/settings.cpp
src/motif/textctrl.cpp
src/motif/utils.cpp
src/motif/window.cpp

index ebf2238539d5f77e7604c203b0a77e04ff5dfab7..618756c3452488e96a8a053f5a44994241e6ec25 100644 (file)
@@ -91,6 +91,9 @@ protected:
     virtual void DoSetSize(int x, int y,
         int width, int height,
         int sizeFlags = wxSIZE_AUTO);
     virtual void DoSetSize(int x, int y,
         int width, int height,
         int sizeFlags = wxSIZE_AUTO);
+private:
+    // only implemented for native combo box
+    void AdjustDropDownListSize();
 };
 
 #endif
 };
 
 #endif
index 5f5cbc99c8be2ad0b32467e6b3950c7e39ec86f0..4702db06a5e9469218c6828bed82574c2ec427b2 100644 (file)
@@ -88,6 +88,8 @@ public:
     virtual void DoToggleItem(int item, int x) {};
 #endif
 protected:
     virtual void DoToggleItem(int item, int x) {};
 #endif
 protected:
+    virtual wxSize DoGetBestSize() const;
+
     int       m_noItems;
     
     // List mapping positions->client data
     int       m_noItems;
     
     // List mapping positions->client data
index 8f21c4e12c5e446d54e9784428e72fc7af7fb512..da2bc7f3086accdffe18a836109a538e51164b3e 100644 (file)
@@ -64,6 +64,7 @@ extern void wxDoChangeForegroundColour(WXWidget widget,
 extern void wxDoChangeBackgroundColour(WXWidget widget,
                                        wxColour& backgroundColour,
                                        bool changeArmColour = FALSE);
 extern void wxDoChangeBackgroundColour(WXWidget widget,
                                        wxColour& backgroundColour,
                                        bool changeArmColour = FALSE);
+extern void wxDoChangeFont(WXWidget widget, wxFont& font);
 
 #define wxNO_COLORS   0x00
 #define wxBACK_COLORS 0x01
 
 #define wxNO_COLORS   0x00
 #define wxBACK_COLORS 0x01
@@ -107,13 +108,20 @@ private:
     XmString m_string;
 };
 
     XmString m_string;
 };
 
+wxString wxXmStringToString( const XmString& xmString );
+
 // ----------------------------------------------------------------------------
 // Routines used in both wxTextCtrl/wxListBox and nativa wxComboBox
 // (defined in src/motif/listbox.cpp or src/motif/textctrl.cpp
 // ----------------------------------------------------------------------------
 
 int wxDoFindStringInList( Widget listWidget, const wxString& str );
 // ----------------------------------------------------------------------------
 // Routines used in both wxTextCtrl/wxListBox and nativa wxComboBox
 // (defined in src/motif/listbox.cpp or src/motif/textctrl.cpp
 // ----------------------------------------------------------------------------
 
 int wxDoFindStringInList( Widget listWidget, const wxString& str );
-int wxDoGetSelectionInList(Widget listWidget);
+int wxDoGetSelectionInList( Widget listWidget );
+wxString wxDoGetStringInList( Widget listWidget, int n );
+wxSize wxDoGetListBoxBestSize( Widget listWidget, const wxWindow* window );
+
+wxSize wxDoGetSingleTextCtrlBestSize( Widget textWidget,
+                                      const wxWindow* window );
 
 // ----------------------------------------------------------------------------
 // executes one main loop iteration (implemented in src/motif/evtloop.cpp)
 
 // ----------------------------------------------------------------------------
 // executes one main loop iteration (implemented in src/motif/evtloop.cpp)
index 7355c8555519ce6250313a298d0bcea556f6f9bf..59d3510eb167f45251b96115d4a83a81501e3008 100644 (file)
@@ -133,7 +133,8 @@ public:
     
 protected:
     wxString  m_fileName;
     
 protected:
     wxString  m_fileName;
-    
+
+    virtual wxSize DoGetBestSize() const;
 public:
     // Motif-specific
     void*     m_tempCallbackStruct;
 public:
     // Motif-specific
     void*     m_tempCallbackStruct;
index a3e57838b93bf6864f2f11ef45d9533fec9fe962..fa5340e37849be815f4538bacb1bb3c1e5d2b08e 100644 (file)
@@ -176,10 +176,8 @@ int wxChoice::DoAppend(const wxString& item)
 
     DoChangeBackgroundColour((WXWidget) w, m_backgroundColour);
 
 
     DoChangeBackgroundColour((WXWidget) w, m_backgroundColour);
 
-    if (m_font.Ok())
-        XtVaSetValues (w,
-        XmNfontList, (XmFontList) m_font.GetFontList(1.0, XtDisplay((Widget) m_formWidget)),
-        NULL);
+    if( m_font.Ok() )
+        wxDoChangeFont( w, m_font );
 
     m_widgetArray.Add(w);
 
 
     m_widgetArray.Add(w);
 
index 9c11990fe3f4d6c65196c357c1dad3ef3601ef9a..aa8eac0f0d54f38b2c535d10c3879d4aee717a41 100644 (file)
@@ -83,6 +83,8 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
                   ( style & wxCB_DROPDOWN ) ? XmDROP_DOWN_COMBO_BOX :
     // default to wxCB_DROPDOWN
                                               XmDROP_DOWN_COMBO_BOX;
                   ( style & wxCB_DROPDOWN ) ? XmDROP_DOWN_COMBO_BOX :
     // default to wxCB_DROPDOWN
                                               XmDROP_DOWN_COMBO_BOX;
+    if( cb_type == XmDROP_DOWN_COMBO_BOX )
+        SetWindowStyle( style | wxCB_DROPDOWN );
 
     Widget buttonWidget= XtVaCreateManagedWidget(name.c_str(),
         xmComboBoxWidgetClass, parentWidget,
 
     Widget buttonWidget= XtVaCreateManagedWidget(name.c_str(),
         xmComboBoxWidgetClass, parentWidget,
@@ -108,19 +110,36 @@ bool wxComboBox::Create(wxWindow *parent, wxWindowID id,
                    (XtCallbackProc) wxComboBoxCallback,
                    (XtPointer) this);
 
                    (XtCallbackProc) wxComboBoxCallback,
                    (XtPointer) this);
 
+    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,
     SetCanAddEventHandler(true);
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
-                  pos.x, pos.y, size.x, size.y);
-
-    XtVaSetValues (GetXmList(this),
-                   XmNvisibleItemCount, 10,
-                   NULL);
+                  pos.x, pos.y, best.x, best.y);
 
     ChangeBackgroundColour();
 
     return true;
 }
 
 
     ChangeBackgroundColour();
 
     return true;
 }
 
+void wxComboBox::AdjustDropDownListSize()
+{
+    int newListCount = -1, itemCount = GetCount();
+    const int MAX = 12;
+
+    if( !itemCount )
+        newListCount = 1;
+    else if( itemCount < MAX )
+        newListCount = itemCount;
+    else
+        newListCount = MAX;
+
+    XtVaSetValues( GetXmList(this),
+                   XmNvisibleItemCount, newListCount,
+                   NULL );
+}
+
 wxComboBox::~wxComboBox()
 {
     DetachWidget((Widget) m_mainWidget); // Removes event handlers
 wxComboBox::~wxComboBox()
 {
     DetachWidget((Widget) m_mainWidget); // Removes event handlers
@@ -171,8 +190,8 @@ int wxComboBox::DoAppend(const wxString& item)
 {
     wxXmString str( item.c_str() );
     XmComboBoxAddItem((Widget) m_mainWidget, str(), 0, False);
 {
     wxXmString str( item.c_str() );
     XmComboBoxAddItem((Widget) m_mainWidget, str(), 0, False);
-    m_stringList.Add(item);
     m_noStrings ++;
     m_noStrings ++;
+    AdjustDropDownListSize();
 
     return GetCount() - 1;
 }
 
     return GetCount() - 1;
 }
@@ -185,14 +204,10 @@ void wxComboBox::Delete(int n)
     XmComboBoxDeletePos((Widget) m_mainWidget, n+1);
 #endif
 
     XmComboBoxDeletePos((Widget) m_mainWidget, n+1);
 #endif
 
-    wxStringList::Node *node = m_stringList.Item(n);
-    if (node)
-    {
-        delete[] node->GetData();
-        delete node;
-    }
     m_clientDataDict.Delete(n, HasClientObjectData());
     m_noStrings--;
     m_clientDataDict.Delete(n, HasClientObjectData());
     m_noStrings--;
+
+    AdjustDropDownListSize();
 }
 
 void wxComboBox::Clear()
 }
 
 void wxComboBox::Clear()
@@ -204,13 +219,12 @@ void wxComboBox::Clear()
     {
        XmComboBoxDeletePos((Widget) m_mainWidget, m_noStrings--);
     }
     {
        XmComboBoxDeletePos((Widget) m_mainWidget, m_noStrings--);
     }
- #endif
-
-    m_stringList.Clear();
+#endif
 
     if ( HasClientObjectData() )
         m_clientDataDict.DestroyData();
     m_noStrings = 0;
 
     if ( HasClientObjectData() )
         m_clientDataDict.DestroyData();
     m_noStrings = 0;
+    AdjustDropDownListSize();
 }
 
 void wxComboBox::SetSelection (int n)
 }
 
 void wxComboBox::SetSelection (int n)
@@ -237,11 +251,7 @@ int wxComboBox::GetSelection (void) const
 
 wxString wxComboBox::GetString(int n) const
 {
 
 wxString wxComboBox::GetString(int n) const
 {
-    wxStringList::Node *node = m_stringList.Item(n);
-    if (node)
-        return wxString(node->GetData ());
-    else
-        return wxEmptyString;
+    return wxDoGetStringInList( GetXmList(this), n );
 }
 
 int wxComboBox::FindString(const wxString& s) const
 }
 
 int wxComboBox::FindString(const wxString& s) const
@@ -356,6 +366,12 @@ void  wxComboBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
 
 void wxComboBox::ChangeFont(bool keepOriginalSize)
 {
 
 void wxComboBox::ChangeFont(bool keepOriginalSize)
 {
+    if( m_font.Ok() )
+    {
+        wxDoChangeFont( GetXmText(this), m_font );
+        wxDoChangeFont( GetXmList(this), m_font );
+    }
+
     // Don't use the base class wxChoice's ChangeFont
     wxWindow::ChangeFont(keepOriginalSize);
 }
     // Don't use the base class wxChoice's ChangeFont
     wxWindow::ChangeFont(keepOriginalSize);
 }
@@ -372,7 +388,31 @@ void wxComboBox::ChangeForegroundColour()
 
 wxSize wxComboBox::DoGetBestSize() const
 {
 
 wxSize wxComboBox::DoGetBestSize() const
 {
-   return wxWindow::DoGetBestSize();
+    if( (GetWindowStyle() & wxCB_DROPDOWN) == wxCB_DROPDOWN ||
+        (GetWindowStyle() & wxCB_READONLY) == wxCB_READONLY )
+    {
+        Dimension arrowW, arrowS, highlight, xmargin, ymargin, shadow;
+
+        XtVaGetValues( (Widget)m_mainWidget,
+                       XmNarrowSize, &arrowW,
+                       XmNarrowSpacing, &arrowS,
+                       XmNhighlightThickness, &highlight,
+                       XmNmarginWidth, &xmargin,
+                       XmNmarginHeight, &ymargin,
+                       XmNshadowThickness, &shadow,
+                       NULL );
+
+        wxSize listSize = wxDoGetListBoxBestSize( GetXmList(this), this );
+        wxSize textSize = wxDoGetSingleTextCtrlBestSize( GetXmText(this),
+                                                         this );
+
+        // FIXME arbitrary constants
+        return wxSize( listSize.x + arrowW + arrowS + 2 * highlight
+                                  + 2 * shadow + 2 * xmargin ,
+                       textSize.y + 2 * highlight + 2 * ymargin + 2 * shadow );
+    }
+    else
+        return wxWindow::DoGetBestSize();
 }
 
 #endif // XmVersion >= 2000
 }
 
 #endif // XmVersion >= 2000
index 045bbc81d087dfbc0eaa237b8af80ad014c3563c..ddcbd3fa2fbc5bd0d6a9be5a0538e66141b0a564 100644 (file)
@@ -92,17 +92,30 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
-    Arg args[3];
+    XmFontList fontList = (XmFontList)NULL;
+
+    if( m_font.Ok() )
+    {
+        fontList = (XmFontList)m_font.GetFontList(1.0,
+                                                  XtDisplay(parentWidget));
+    }
+
+    Arg args[4];
     int count = 0;
     int count = 0;
-    XtSetArg( args[0], XmNlistSizePolicy, XmCONSTANT ); ++count;
-    XtSetArg( args[1], XmNselectionPolicy,
+    XtSetArg( args[count], XmNlistSizePolicy, XmCONSTANT ); ++count;
+    XtSetArg( args[count], XmNselectionPolicy,
               ( m_windowStyle & wxLB_MULTIPLE ) ? XmMULTIPLE_SELECT :
               ( m_windowStyle & wxLB_EXTENDED ) ? XmEXTENDED_SELECT :
                                                   XmBROWSE_SELECT );
     ++count;
               ( m_windowStyle & wxLB_MULTIPLE ) ? XmMULTIPLE_SELECT :
               ( m_windowStyle & wxLB_EXTENDED ) ? XmEXTENDED_SELECT :
                                                   XmBROWSE_SELECT );
     ++count;
+    if( fontList )
+    {
+        XtSetArg( args[count], XmNfontList, fontList );
+        ++count;
+    }
     if( m_windowStyle & wxLB_ALWAYS_SB )
     {
     if( m_windowStyle & wxLB_ALWAYS_SB )
     {
-        XtSetArg( args[2], XmNscrollBarDisplayPolicy, XmSTATIC );
+        XtSetArg( args[count], XmNscrollBarDisplayPolicy, XmSTATIC );
         ++count;
     }
 
         ++count;
     }
 
@@ -115,12 +128,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
 
     XtManageChild (listWidget);
 
 
     XtManageChild (listWidget);
 
-    long width = size.x;
-    long height = size.y;
-    if (width == -1)
-        width = 150;
-    if (height == -1)
-        height = 80;
+    wxSize best = GetBestSize();
+    if( size.x != -1 ) best.x = size.x;
+    if( size.y != -1 ) best.y = size.y;
 
     XtAddCallback (listWidget,
                    XmNbrowseSelectionCallback,
 
     XtAddCallback (listWidget,
                    XmNbrowseSelectionCallback,
@@ -139,11 +149,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
                    (XtCallbackProc) wxListBoxCallback,
                    (XtPointer) this);
 
                    (XtCallbackProc) wxListBoxCallback,
                    (XtPointer) this);
 
-    ChangeFont(FALSE);
-
     SetCanAddEventHandler(TRUE);
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
     SetCanAddEventHandler(TRUE);
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
-                  pos.x, pos.y, width, height);
+                  pos.x, pos.y, best.x, best.y);
 
     ChangeBackgroundColour();
 
 
     ChangeBackgroundColour();
 
@@ -443,28 +451,25 @@ int wxListBox::GetSelection() const
 }
 
 // Find string for position
 }
 
 // Find string for position
-wxString wxListBox::GetString(int N) const
+wxString wxDoGetStringInList( Widget listBox, int n )
 {
 {
-    Widget listBox = (Widget) m_mainWidget;
     XmString *strlist;
     XmString *strlist;
-    int n;
-    XtVaGetValues (listBox, XmNitemCount, &n, XmNitems, &strlist, NULL);
-    if (N <= n && N >= 0)
-    {
-        char *txt;
-        if (XmStringGetLtoR (strlist[N], XmSTRING_DEFAULT_CHARSET, &txt))
-        {
-            wxString str(txt);
-            XtFree (txt);
-            return str;
-        }
-        else
-            return wxEmptyString;
-    }
+    int count;
+    XtVaGetValues( listBox,
+                   XmNitemCount, &count,
+                   XmNitems, &strlist,
+                   NULL );
+    if( n <= count && n >= 0 )
+        return wxXmStringToString( strlist[n] );
     else
         return wxEmptyString;
 }
 
     else
         return wxEmptyString;
 }
 
+wxString wxListBox::GetString( int n ) const
+{
+    return wxDoGetStringInList( (Widget)m_mainWidget, n );
+}
+
 void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
 {
     wxSizeKeeper sk( this );
 void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
 {
     wxSizeKeeper sk( this );
@@ -653,3 +658,51 @@ int wxListBox::GetCount() const
 {
     return m_noItems;
 }
 {
     return m_noItems;
 }
+
+#define LIST_SCROLL_SPACING 6
+
+wxSize wxDoGetListBoxBestSize( Widget listWidget, const wxWindow* window )
+{
+    int max;
+    Dimension spacing, highlight, xmargin, ymargin, shadow;
+    int width = 0;
+    int x, y;
+
+    XtVaGetValues( listWidget,
+                   XmNitemCount, &max,
+                   XmNlistSpacing, &spacing,
+                   XmNhighlightThickness, &highlight,
+                   XmNlistMarginWidth, &xmargin,
+                   XmNlistMarginHeight, &ymargin,
+                   XmNshadowThickness, &shadow,
+                   NULL );
+
+    for( size_t i = 0; i < (size_t)max; ++i )
+    {
+        window->GetTextExtent( wxDoGetStringInList( listWidget, i ), &x, &y );
+        width = wxMax( width, x );
+    }
+
+    // use some arbitrary value if there are no strings
+    if( width == 0 )
+        width = 100;
+
+    // get my
+    window->GetTextExtent( "v", &x, &y );
+
+    // make it a little larger than widest string, plus the scrollbar
+    width += wxSystemSettings::GetMetric( wxSYS_VSCROLL_X )
+        + 2 * highlight + LIST_SCROLL_SPACING + 2 * xmargin + 2 * shadow;
+
+    // at least 3 items, at most 10
+    int height = wxMax( 3, wxMin( 10, max ) ) *
+        ( y + spacing + 2 * highlight ) + 2 * ymargin + 2 * shadow;
+
+    return wxSize( width, height );
+}
+
+wxSize wxListBox::DoGetBestSize() const
+{
+    return wxDoGetListBoxBestSize( (Widget)m_mainWidget, this );
+}
+
index e8d4c9b01b2221b8565c2a62f86735bf094e1f4e..91f8fc631b76d223e3f22281c3ca98f929b4e97e 100644 (file)
@@ -181,6 +181,9 @@ int wxSystemSettingsNative::GetMetric(wxSystemMetric index)
 {
     switch ( index)
     {
 {
     switch ( index)
     {
+        case wxSYS_HSCROLL_Y:
+        case wxSYS_VSCROLL_X:
+            return 15;
         case wxSYS_MOUSE_BUTTONS:
             // TODO
         case wxSYS_BORDER_X:
         case wxSYS_MOUSE_BUTTONS:
             // TODO
         case wxSYS_BORDER_X:
@@ -233,10 +236,6 @@ int wxSystemSettingsNative::GetMetric(wxSystemMetric index)
             // TODO
         case wxSYS_SMALLICON_Y:
             // TODO
             // TODO
         case wxSYS_SMALLICON_Y:
             // TODO
-        case wxSYS_HSCROLL_Y:
-            // TODO
-        case wxSYS_VSCROLL_X:
-            // TODO
         case wxSYS_VSCROLL_ARROW_X:
             // TODO
         case wxSYS_VSCROLL_ARROW_Y:
         case wxSYS_VSCROLL_ARROW_X:
             // TODO
         case wxSYS_VSCROLL_ARROW_Y:
index 7bb9799cae4a5f6d2e0cd2656115631bb65ae002..6512988d93bd2114513d2efe905a9522be082fb7 100644 (file)
@@ -107,24 +107,14 @@ bool wxTextCtrl::Create(wxWindow *parent,
                         const wxValidator& validator,
                         const wxString& name)
 {
                         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_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();
 
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -180,20 +170,13 @@ bool wxTextCtrl::Create(wxWindow *parent,
                       NULL);
     }
 
                       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(),
                        NULL);
         // do this instead... MB
         //
         XtVaSetValues( (Widget) m_mainWidget,
                        XmNvalue, (char *)value.c_str(),
                        NULL);
-#endif
     }
     
     // install callbacks
     }
     
     // install callbacks
@@ -208,11 +191,15 @@ bool wxTextCtrl::Create(wxWindow *parent,
     XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this);
 
     // font
     XtAddCallback((Widget) m_mainWidget, XmNlosingFocusCallback, (XtCallbackProc)wxTextWindowLoseFocusProc, (XtPointer)this);
 
     // font
-    m_font = parent->GetFont();
     ChangeFont(FALSE);
 
     ChangeFont(FALSE);
 
+    wxSize best = GetBestSize();
+    if( size.x != -1 ) best.x = size.x;
+    if( size.y != -1 ) best.y = size.y;
+
     SetCanAddEventHandler(TRUE);
     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();
 
 
     ChangeBackgroundColour();
 
@@ -260,18 +247,11 @@ void wxTextCtrl::SetValue(const wxString& value)
 {
     m_inSetValue = TRUE;
 
 {
     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(),
                    NULL);
     // do this instead... MB
     //
     XtVaSetValues( (Widget) m_mainWidget,
                    XmNvalue, (char *)value.c_str(),
                    NULL);
-#endif
 
     m_inSetValue = FALSE;
 }
 
     m_inSetValue = FALSE;
 }
@@ -735,6 +715,38 @@ void wxTextCtrl::DoSendEvents(void *wxcbs, long keycode)
     m_tempCallbackStruct = NULL;
 }
 
     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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // helpers and Motif callbacks
 // ----------------------------------------------------------------------------
index 36df02e7fc084ab6badd0d91790501298a062f63..78989f932c35c0b4d426f13a1fb3f663451018ec 100644 (file)
@@ -1247,6 +1247,21 @@ void wxDoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, boo
         NULL);
 }
 
         NULL);
 }
 
+extern void wxDoChangeFont(WXWidget widget, wxFont& font)
+{
+    // lesstif 0.87 hangs here, but 0.93 does not
+#if !defined(LESSTIF_VERSION) \
+    || (defined(LesstifVersion) && LesstifVersion >= 93)
+
+    Widget w = (Widget)widget;
+    XmFontList fontList = (XmFontList)font.GetFontList(1.0, XtDisplay(w));
+    XtVaSetValues( w,
+                   XmNfontList, fontList,
+                   NULL );
+#endif
+
+}
+
 #endif
     // __WXMOTIF__
 
 #endif
     // __WXMOTIF__
 
@@ -1257,3 +1272,17 @@ bool wxWindowIsVisible(Window win)
 
     return (wa.map_state == IsViewable);
 }
 
     return (wa.map_state == IsViewable);
 }
+
+wxString wxXmStringToString( const XmString& xmString )
+{
+    char *txt;
+    if( XmStringGetLtoR( xmString, XmSTRING_DEFAULT_CHARSET, &txt ) )
+    {
+        wxString str(txt);
+        XtFree (txt);
+        return str;
+    }
+
+    return wxEmptyString;
+}
+
index 88dff304623123608f3426bd8eebbcb8fe990ec0..f68c56bcb9ef7b7bf36fcab4cdc24add656863ed 100644 (file)
@@ -2914,41 +2914,17 @@ void wxWindow::ChangeForegroundColour()
 }
 
 // Change a widget's foreground and background colours.
 }
 
 // Change a widget's foreground and background colours.
-void wxWindow::DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
+void wxWindow::DoChangeForegroundColour(WXWidget widget,
+                                        wxColour& foregroundColour)
 {
 {
-    // When should we specify the foreground, if it's calculated
-    // by wxComputeColours?
-    // Solution: say we start with the default (computed) foreground colour.
-    // If we call SetForegroundColour explicitly for a control or window,
-    // then the foreground is changed.
-    // Therefore SetBackgroundColour computes the foreground colour, and
-    // SetForegroundColour changes the foreground colour. The ordering is
-    // important.
-
-    Widget w = (Widget)widget;
-    XtVaSetValues(
-                  w,
-                  XmNforeground, foregroundColour.AllocColour(XtDisplay(w)),
-                  NULL
-                 );
+    wxDoChangeForegroundColour( widget, foregroundColour );
 }
 
 }
 
-void wxWindow::DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour)
+void wxWindow::DoChangeBackgroundColour(WXWidget widget,
+                                        wxColour& backgroundColour,
+                                        bool changeArmColour)
 {
 {
-    wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,
-        (wxColour*) NULL);
-
-    XtVaSetValues ((Widget) widget,
-        XmNbackground, g_itemColors[wxBACK_INDEX].pixel,
-        XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel,
-        XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel,
-        XmNforeground, g_itemColors[wxFORE_INDEX].pixel,
-        NULL);
-
-    if (changeArmColour)
-        XtVaSetValues ((Widget) widget,
-        XmNarmColor, g_itemColors[wxSELE_INDEX].pixel,
-        NULL);
+    wxDoChangeBackgroundColour( widget, backgroundColour, changeArmColour );
 }
 
 bool wxWindow::SetBackgroundColour(const wxColour& col)
 }
 
 bool wxWindow::SetBackgroundColour(const wxColour& col)
@@ -2982,13 +2958,7 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
         int width, height, width1, height1;
         GetSize(& width, & height);
 
         int width, height, width1, height1;
         GetSize(& width, & height);
 
-        // lesstif 0.87 hangs here, but 0.93 does not
-#if !defined(LESSTIF_VERSION) \
-    || (defined(LesstifVersion) && LesstifVersion >= 93)
-        XtVaSetValues (w,
-            XmNfontList, (XmFontList) m_font.GetFontList(1.0, XtDisplay(w)),
-            NULL);
-#endif
+        wxDoChangeFont( GetLabelWidget(), m_font );
 
         GetSize(& width1, & height1);
         if (keepOriginalSize && (width != width1 || height != height1))
 
         GetSize(& width1, & height1);
         if (keepOriginalSize && (width != width1 || height != height1))