X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad9835c97c10c0d7de345e3a7a7c0fc2776eb2cb..cc4d5638c66a409e421420ed7110917755a66788:/src/motif/listbox.cpp diff --git a/src/motif/listbox.cpp b/src/motif/listbox.cpp index 23bd098612..c4d601a800 100644 --- a/src/motif/listbox.cpp +++ b/src/motif/listbox.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 17/09/98 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -14,21 +13,16 @@ #if wxUSE_LISTBOX +#include "wx/listbox.h" + #ifndef WX_PRECOMP #include "wx/dynarray.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/settings.h" + #include "wx/arrstr.h" #endif -#ifdef __VMS -#define XtParent XTPARENT -#define XtDisplay XTDISPLAY -#endif - -#include "wx/listbox.h" -#include "wx/settings.h" -#include "wx/log.h" -#include "wx/utils.h" -#include "wx/arrstr.h" - #ifdef __VMS__ #pragma message disable nosimpint #endif @@ -38,8 +32,6 @@ #endif #include "wx/motif/private.h" - IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) - static void wxListBoxCallback(Widget w, XtPointer clientData, XmListCallbackStruct * cbs); @@ -52,21 +44,23 @@ static void wxListBoxCallback(Widget w, class wxSizeKeeper { int m_x, m_y; - wxWindow* m_w; + int m_w, m_h; + wxWindow* m_wnd; public: wxSizeKeeper( wxWindow* w ) - : m_w( w ) + : m_wnd( w ) { - m_w->GetSize( &m_x, &m_y ); + m_wnd->GetSize( &m_w, &m_h ); + m_wnd->GetPosition( &m_x, &m_y ); } void Restore() { int x, y; - m_w->GetSize( &x, &y ); + m_wnd->GetSize( &x, &y ); if( x != m_x || y != m_y ) - m_w->SetSize( -1, -1, m_x, m_y ); + m_wnd->SetSize( m_x, m_y, m_w, m_h ); } }; @@ -91,9 +85,9 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, if( !wxControl::CreateControl( parent, id, pos, size, style, validator, name ) ) return false; + PreCreation(); m_noItems = (unsigned int)n; - m_backgroundColour = * wxWHITE; Widget parentWidget = (Widget) parent->GetClientWidget(); Display* dpy = XtDisplay(parentWidget); @@ -106,7 +100,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, ( m_windowStyle & wxLB_EXTENDED ) ? XmEXTENDED_SELECT : XmBROWSE_SELECT ); ++count; - if( m_font.Ok() ) + if( m_font.IsOk() ) { XtSetArg( args[count], (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy) ); @@ -120,7 +114,7 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, Widget listWidget = XmCreateScrolledList(parentWidget, - wxConstCast(name.c_str(), char), args, count); + name.char_str(), args, count); m_mainWidget = (WXWidget) listWidget; @@ -149,11 +143,10 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, (XtCallbackProc) wxListBoxCallback, (XtPointer) this); + PostCreation(); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, best.x, best.y); - ChangeBackgroundColour(); - return true; } @@ -170,12 +163,6 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id, style, validator, name); } -wxListBox::~wxListBox() -{ - if( HasClientObjectData() ) - m_clientDataDict.DestroyData(); -} - void wxListBox::SetSelectionPolicy() { Widget listBox = (Widget)m_mainWidget; @@ -207,92 +194,16 @@ void wxListBox::DoSetFirstItem( int N ) XmListSetPos ((Widget) m_mainWidget, N + 1); } -void wxListBox::Delete(unsigned int n) +void wxListBox::DoDeleteOneItem(unsigned int n) { - wxSizeKeeper sk( this ); Widget listBox = (Widget) m_mainWidget; - bool managed = XtIsManaged(listBox); - - if (managed) - XtUnmanageChild (listBox); - XmListDeletePos (listBox, n + 1); - if (managed) - XtManageChild (listBox); - - sk.Restore(); - m_clientDataDict.Delete(n, HasClientObjectData()); + wxListBoxBase::DoDeleteOneItem(n); m_noItems --; } -int wxListBox::DoAppend(const wxString& item) -{ - wxSizeKeeper sk( this ); - Widget listBox = (Widget) m_mainWidget; - - bool managed = XtIsManaged(listBox); - - if (managed) - XtUnmanageChild (listBox); - int n; - XtVaGetValues (listBox, XmNitemCount, &n, NULL); - wxXmString text( item ); - // XmListAddItem(listBox, text, n + 1); - XmListAddItemUnselected (listBox, text(), 0); - - // It seems that if the list is cleared, we must re-ask for - // selection policy!! - SetSelectionPolicy(); - - if (managed) - XtManageChild (listBox); - - sk.Restore(); - m_noItems ++; - - return GetCount() - 1; -} - -void wxListBox::DoSetItems(const wxArrayString& items, void** clientData) -{ - wxSizeKeeper sk( this ); - Widget listBox = (Widget) m_mainWidget; - - if( HasClientObjectData() ) - m_clientDataDict.DestroyData(); - - bool managed = XtIsManaged(listBox); - - if (managed) - XtUnmanageChild (listBox); - XmString *text = new XmString[items.GetCount()]; - unsigned int i; - for (i = 0; i < items.GetCount(); ++i) - text[i] = wxStringToXmString (items[i]); - - if ( clientData ) - for (i = 0; i < items.GetCount(); ++i) - m_clientDataDict.Set(i, (wxClientData*)clientData[i], false); - - XmListAddItems (listBox, text, items.GetCount(), 0); - for (i = 0; i < items.GetCount(); i++) - XmStringFree (text[i]); - delete[] text; - - // It seems that if the list is cleared, we must re-ask for - // selection policy!! - SetSelectionPolicy(); - - if (managed) - XtManageChild (listBox); - - sk.Restore(); - - m_noItems = items.GetCount(); -} - int wxDoFindStringInList(Widget w, const wxString& s) { wxXmString str( s ); @@ -301,11 +212,10 @@ int wxDoFindStringInList(Widget w, const wxString& s) bool success = XmListGetMatchPos (w, str(), &positions, &no_positions); - if (success) + if (success && positions) { int pos = positions[0]; - if (positions) - XtFree ((char *) positions); + XtFree ((char *) positions); return pos - 1; } else @@ -319,20 +229,19 @@ int wxListBox::FindString(const wxString& s, bool WXUNUSED(bCase)) const return wxDoFindStringInList( (Widget)m_mainWidget, s ); } -void wxListBox::Clear() +void wxListBox::DoClear() { - if (m_noItems <= 0) + if (!m_noItems) return; wxSizeKeeper sk( this ); Widget listBox = (Widget) m_mainWidget; XmListDeleteAllItems (listBox); - if( HasClientObjectData() ) - m_clientDataDict.DestroyData(); sk.Restore(); + wxListBoxBase::DoClear(); m_noItems = 0; } @@ -393,26 +302,6 @@ bool wxListBox::IsSelected(int N) const return false; } -void wxListBox::DoSetItemClientObject(unsigned int n, wxClientData* clientData) -{ - m_clientDataDict.Set(n, clientData, false); -} - -wxClientData* wxListBox::DoGetItemClientObject(unsigned int n) const -{ - return m_clientDataDict.Get(n); -} - -void *wxListBox::DoGetItemClientData(unsigned int n) const -{ - return (void*)m_clientDataDict.Get(n); -} - -void wxListBox::DoSetItemClientData(unsigned int n, void *Client_data) -{ - m_clientDataDict.Set(n, (wxClientData*)Client_data, false); -} - // Return number of selections and an array of selected integers int wxListBox::GetSelections(wxArrayInt& aSelections) const { @@ -485,47 +374,43 @@ wxString wxListBox::GetString(unsigned int n) const return wxDoGetStringInList( (Widget)m_mainWidget, n ); } -void wxListBox::DoInsertItems(const wxArrayString& items, unsigned int pos) +int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items, + unsigned int pos, + void **clientData, wxClientDataType type) { - wxSizeKeeper sk( this ); Widget listBox = (Widget) m_mainWidget; - bool managed = XtIsManaged(listBox); + const unsigned int numItems = items.GetCount(); - if (managed) - XtUnmanageChild(listBox); - - XmString *text = new XmString[items.GetCount()]; + XmString *text = new XmString[numItems]; unsigned int i; - // Steve Hammes: Motif 1.1 compatibility - // #if XmVersion > 1100 - // Corrected by Sergey Krasnov from Steve Hammes' code #if XmVersion > 1001 - for (i = 0; i < items.GetCount(); i++) + for (i = 0; i < numItems; i++) + { text[i] = wxStringToXmString(items[i]); - XmListAddItemsUnselected(listBox, text, items.GetCount(), pos+1); + } + XmListAddItemsUnselected(listBox, text, numItems, GetMotifPosition(pos)); + InsertNewItemsClientData(pos, numItems, clientData, type); #else - for (i = 0; i < items.GetCount(); i++) + AllocClientData(numItems); + + unsigned int idx = pos; + for ( i = 0; i < numItems; i++, idx++ ) { text[i] = wxStringToXmString(items[i]); - // Another Sergey correction - XmListAddItemUnselected(listBox, text[i], pos+i+1); + XmListAddItemUnselected(listBox, text[i], GetMotifPosition(idx)); + InsertNewItemClientData(idx, clientData, i, type); } #endif - for (i = 0; i < items.GetCount(); i++) + for (i = 0; i < numItems; i++) XmStringFree(text[i]); delete[] text; - // It seems that if the list is cleared, we must re-ask for - // selection policy!! - SetSelectionPolicy(); - - if (managed) - XtManageChild(listBox); + m_noItems += numItems; - sk.Restore(); + SetSelectionPolicy(); - m_noItems += items.GetCount(); + return pos + numItems - 1; } void wxListBox::SetString(unsigned int n, const wxString& s) @@ -566,9 +451,9 @@ void wxListBoxCallback (Widget WXUNUSED(w), XtPointer clientData, wxEventType evtType; if( cbs->reason == XmCR_DEFAULT_ACTION ) - evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED; + evtType = wxEVT_LISTBOX_DCLICK; else - evtType = wxEVT_COMMAND_LISTBOX_SELECTED; + evtType = wxEVT_LISTBOX; int n = cbs->item_position - 1; wxCommandEvent event (evtType, item->GetId()); @@ -597,7 +482,7 @@ void wxListBoxCallback (Widget WXUNUSED(w), XtPointer clientData, item->DoToggleItem( n, x ); #endif case XmCR_DEFAULT_ACTION: - item->GetEventHandler()->ProcessEvent(event); + item->HandleWindowEvent(event); break; case XmCR_EXTENDED_SELECT: switch (cbs->selection_type) @@ -606,7 +491,7 @@ void wxListBoxCallback (Widget WXUNUSED(w), XtPointer clientData, case XmADDITION: case XmMODIFICATION: item->DoToggleItem( n, x ); - item->GetEventHandler()->ProcessEvent(event); + item->HandleWindowEvent(event); break; } break;