X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/99ab3e3f56ab43fe1127eb565cad1a619cad0499..5a618a14c627c87a2ea642bd8395b74d72e614ba:/src/motif/listbox.cpp diff --git a/src/motif/listbox.cpp b/src/motif/listbox.cpp index 1b2a48a223..db682d40d4 100644 --- a/src/motif/listbox.cpp +++ b/src/motif/listbox.cpp @@ -92,22 +92,35 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, Widget parentWidget = (Widget) parent->GetClientWidget(); - Arg args[3]; + WXFontType fontType = (WXFontType)NULL; + + if( m_font.Ok() ) + { + fontType = m_font.GetFontType(XtDisplay(parentWidget)); + } + + Arg args[4]; 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; + if( fontType ) + { + XtSetArg( args[count], (String)wxFont::GetFontTag(), fontType ); + ++count; + } if( m_windowStyle & wxLB_ALWAYS_SB ) { - XtSetArg( args[2], XmNscrollBarDisplayPolicy, XmSTATIC ); + XtSetArg( args[count], XmNscrollBarDisplayPolicy, XmSTATIC ); ++count; } - Widget listWidget = XmCreateScrolledList(parentWidget, - (char*)name.c_str(), args, count); + Widget listWidget = + XmCreateScrolledList(parentWidget, + wxConstCast(name.c_str(), char), args, count); m_mainWidget = (WXWidget) listWidget; @@ -115,12 +128,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, 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, @@ -139,11 +149,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, (XtCallbackProc) wxListBoxCallback, (XtPointer) this); - ChangeFont(FALSE); - SetCanAddEventHandler(TRUE); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, - pos.x, pos.y, width, height); + pos.x, pos.y, best.x, best.y); ChangeBackgroundColour(); @@ -249,7 +257,7 @@ void wxListBox::DoSetItems(const wxArrayString& items, void** clientData) XmString *text = new XmString[items.GetCount()]; size_t i; for (i = 0; i < items.GetCount(); ++i) - text[i] = XmStringCreateSimple ((char*)items[i].c_str()); + text[i] = wxStringToXmString (items[i]); if ( clientData ) for (i = 0; i < items.GetCount(); ++i) @@ -272,12 +280,12 @@ void wxListBox::DoSetItems(const wxArrayString& items, void** clientData) m_noItems = items.GetCount(); } -int wxListBox::FindString(const wxString& s) const +int wxDoFindStringInList(Widget w, const wxString& s) { wxXmString str( s ); int *positions = NULL; int no_positions = 0; - bool success = XmListGetMatchPos ((Widget) m_mainWidget, str(), + bool success = XmListGetMatchPos (w, str(), &positions, &no_positions); if (success) @@ -291,6 +299,11 @@ int wxListBox::FindString(const wxString& s) const return -1; } +int wxListBox::FindString(const wxString& s) const +{ + return wxDoFindStringInList( (Widget)m_mainWidget, s ); +} + void wxListBox::Clear() { if (m_noItems <= 0) @@ -415,9 +428,8 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) const } // Get single selection, for single choice list items -int wxListBox::GetSelection() const +int wxDoGetSelectionInList(Widget listBox) { - Widget listBox = (Widget) m_mainWidget; int *posList = NULL; int posCnt = 0; bool flag = XmListGetSelectedPos (listBox, &posList, &posCnt); @@ -433,29 +445,31 @@ int wxListBox::GetSelection() const return -1; } +int wxListBox::GetSelection() const +{ + return wxDoGetSelectionInList((Widget) m_mainWidget); +} + // Find string for position -wxString wxListBox::GetString(int N) const +wxString wxDoGetStringInList( Widget listBox, int n ) { - Widget listBox = (Widget) m_mainWidget; 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; } +wxString wxListBox::GetString( int n ) const +{ + return wxDoGetStringInList( (Widget)m_mainWidget, n ); +} + void wxListBox::DoInsertItems(const wxArrayString& items, int pos) { wxSizeKeeper sk( this ); @@ -473,12 +487,12 @@ void wxListBox::DoInsertItems(const wxArrayString& items, int pos) // Corrected by Sergey Krasnov from Steve Hammes' code #if XmVersion > 1001 for (i = 0; i < items.GetCount(); i++) - text[i] = XmStringCreateSimple((char*)items[i].c_str()); + text[i] = wxStringToXmString(items[i]); XmListAddItemsUnselected(listBox, text, items.GetCount(), pos+1); #else for (i = 0; i < items.GetCount(); i++) { - text[i] = XmStringCreateSimple((char*)items[i].c_str()); + text[i] = wxStringToXmString(items[i]); // Another Sergey correction XmListAddItemUnselected(listBox, text[i], pos+i+1); } @@ -615,7 +629,8 @@ void wxListBox::ChangeBackgroundColour() XmNtroughColor, backgroundColour.AllocColour(XtDisplay(vsb)), NULL); - DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE); + // MBN: why change parent's background? It looks really ugly. + // DoChangeBackgroundColour((WXWidget) parent, m_backgroundColour, TRUE); } void wxListBox::ChangeForegroundColour() @@ -643,3 +658,51 @@ int wxListBox::GetCount() const { 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 ); +} +