]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/listbox.cpp
Applied #15375 to stop event-sending in generic wxSpinCtrl ctor (eco)
[wxWidgets.git] / src / motif / listbox.cpp
index 817b9b1c99dd8300c0332f0d038eada17dfc3957..c4d601a8004fcab8ac8f80a3b4ccec12f63f5115 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Julian Smart
 // Modified by:
 // Created:     17/09/98
 // Author:      Julian Smart
 // Modified by:
 // Created:     17/09/98
-// RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
     #include "wx/arrstr.h"
 #endif
 
     #include "wx/arrstr.h"
 #endif
 
-#ifdef __VMS
-#define XtParent XTPARENT
-#define XtDisplay XTDISPLAY
-#endif
-
 #ifdef __VMS__
 #pragma message disable nosimpint
 #endif
 #ifdef __VMS__
 #pragma message disable nosimpint
 #endif
@@ -38,8 +32,6 @@
 #endif
 #include "wx/motif/private.h"
 
 #endif
 #include "wx/motif/private.h"
 
-    IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
-
 static void wxListBoxCallback(Widget w,
                               XtPointer clientData,
                               XmListCallbackStruct * cbs);
 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;
 class wxSizeKeeper
 {
     int m_x, m_y;
-    wxWindow* m_w;
+    int m_w, m_h;
+    wxWindow* m_wnd;
 public:
     wxSizeKeeper( wxWindow* w )
 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;
 
     }
 
     void Restore()
     {
         int x, y;
 
-        m_w->GetSize( &x, &y );
+        m_wnd->GetSize( &x, &y );
         if( x != m_x || y != m_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;
     if( !wxControl::CreateControl( parent, id, pos, size, style,
                                    validator, name ) )
         return false;
+    PreCreation();
 
     m_noItems = (unsigned int)n;
 
     m_noItems = (unsigned int)n;
-    m_backgroundColour = * wxWHITE;
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
     Display* dpy = XtDisplay(parentWidget);
 
     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;
               ( 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) );
     {
         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,
 
     Widget listWidget =
         XmCreateScrolledList(parentWidget,
-                             wxConstCast(name.mb_str(), char), args, count);
+                             name.char_str(), args, count);
 
     m_mainWidget = (WXWidget) listWidget;
 
 
     m_mainWidget = (WXWidget) listWidget;
 
@@ -149,11 +143,10 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
                    (XtCallbackProc) wxListBoxCallback,
                    (XtPointer) this);
 
                    (XtCallbackProc) wxListBoxCallback,
                    (XtPointer) this);
 
+    PostCreation();
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, best.x, best.y);
 
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL,
                   pos.x, pos.y, best.x, best.y);
 
-    ChangeBackgroundColour();
-
     return true;
 }
 
     return true;
 }
 
@@ -170,12 +163,6 @@ bool wxListBox::Create(wxWindow *parent, wxWindowID id,
                   style, validator, name);
 }
 
                   style, validator, name);
 }
 
-wxListBox::~wxListBox()
-{
-    if( HasClientObjectData() )
-        m_clientDataDict.DestroyData();
-}
-
 void wxListBox::SetSelectionPolicy()
 {
     Widget listBox = (Widget)m_mainWidget;
 void wxListBox::SetSelectionPolicy()
 {
     Widget listBox = (Widget)m_mainWidget;
@@ -207,63 +194,16 @@ void wxListBox::DoSetFirstItem( int N )
     XmListSetPos ((Widget) m_mainWidget, N + 1);
 }
 
     XmListSetPos ((Widget) m_mainWidget, N + 1);
 }
 
-void wxListBox::Delete(unsigned int n)
+void wxListBox::DoDeleteOneItem(unsigned int n)
 {
     Widget listBox = (Widget) m_mainWidget;
 
     XmListDeletePos (listBox, n + 1);
 
 {
     Widget listBox = (Widget) m_mainWidget;
 
     XmListDeletePos (listBox, n + 1);
 
-    m_clientDataDict.Delete(n, HasClientObjectData());
+    wxListBoxBase::DoDeleteOneItem(n);
     m_noItems --;
 }
 
     m_noItems --;
 }
 
-int wxListBox::DoAppend(const wxString& item)
-{
-    Widget listBox = (Widget) m_mainWidget;
-
-    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();
-
-    m_noItems ++;
-
-    return GetCount() - 1;
-}
-
-void wxListBox::DoSetItems(const wxArrayString& items, void** clientData)
-{
-    Widget listBox = (Widget) m_mainWidget;
-
-    if( HasClientObjectData() )
-        m_clientDataDict.DestroyData();
-
-    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();
-
-    m_noItems = items.GetCount();
-}
-
 int wxDoFindStringInList(Widget w, const wxString& s)
 {
     wxXmString str( s );
 int wxDoFindStringInList(Widget w, const wxString& s)
 {
     wxXmString str( s );
@@ -289,20 +229,19 @@ int wxListBox::FindString(const wxString& s, bool WXUNUSED(bCase)) const
     return wxDoFindStringInList( (Widget)m_mainWidget, s );
 }
 
     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);
         return;
 
     wxSizeKeeper sk( this );
     Widget listBox = (Widget) m_mainWidget;
 
     XmListDeleteAllItems (listBox);
-    if( HasClientObjectData() )
-        m_clientDataDict.DestroyData();
 
     sk.Restore();
 
 
     sk.Restore();
 
+    wxListBoxBase::DoClear();
     m_noItems = 0;
 }
 
     m_noItems = 0;
 }
 
@@ -363,26 +302,6 @@ bool wxListBox::IsSelected(int N) const
     return false;
 }
 
     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
 {
 // Return number of selections and an array of selected integers
 int wxListBox::GetSelections(wxArrayInt& aSelections) const
 {
@@ -455,36 +374,43 @@ wxString wxListBox::GetString(unsigned int n) const
     return wxDoGetStringInList( (Widget)m_mainWidget, n );
 }
 
     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)
 {
     Widget listBox = (Widget) m_mainWidget;
 
 {
     Widget listBox = (Widget) m_mainWidget;
 
-    XmString *text = new XmString[items.GetCount()];
+    const unsigned int numItems = items.GetCount();
+
+    XmString *text = new XmString[numItems];
     unsigned int i;
     unsigned int i;
-    // Steve Hammes: Motif 1.1 compatibility
-    // #if XmVersion > 1100
-    // Corrected by Sergey Krasnov from Steve Hammes' code
 #if XmVersion > 1001
 #if XmVersion > 1001
-    for (i = 0; i < items.GetCount(); i++)
+    for (i = 0; i < numItems; i++)
+    {
         text[i] = wxStringToXmString(items[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
 #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]);
     {
         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
     }
 #endif
-    for (i = 0; i < items.GetCount(); i++)
+    for (i = 0; i < numItems; i++)
         XmStringFree(text[i]);
     delete[] text;
 
         XmStringFree(text[i]);
     delete[] text;
 
-    // It seems that if the list is cleared, we must re-ask for
-    // selection policy!!
+    m_noItems += numItems;
+
     SetSelectionPolicy();
 
     SetSelectionPolicy();
 
-    m_noItems += items.GetCount();
+    return pos + numItems - 1;
 }
 
 void wxListBox::SetString(unsigned int n, const wxString& s)
 }
 
 void wxListBox::SetString(unsigned int n, const wxString& s)
@@ -525,9 +451,9 @@ void wxListBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
     wxEventType evtType;
 
     if( cbs->reason == XmCR_DEFAULT_ACTION )
     wxEventType evtType;
 
     if( cbs->reason == XmCR_DEFAULT_ACTION )
-        evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
+        evtType = wxEVT_LISTBOX_DCLICK;
     else
     else
-        evtType = wxEVT_COMMAND_LISTBOX_SELECTED;
+        evtType = wxEVT_LISTBOX;
 
     int n = cbs->item_position - 1;
     wxCommandEvent event (evtType, item->GetId());
 
     int n = cbs->item_position - 1;
     wxCommandEvent event (evtType, item->GetId());
@@ -556,7 +482,7 @@ void wxListBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
         item->DoToggleItem( n, x );
 #endif
     case XmCR_DEFAULT_ACTION:
         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)
         break;
     case XmCR_EXTENDED_SELECT:
         switch (cbs->selection_type)
@@ -565,7 +491,7 @@ void wxListBoxCallback (Widget WXUNUSED(w), XtPointer clientData,
         case XmADDITION:
         case XmMODIFICATION:
             item->DoToggleItem( n, x );
         case XmADDITION:
         case XmMODIFICATION:
             item->DoToggleItem( n, x );
-            item->GetEventHandler()->ProcessEvent(event);
+            item->HandleWindowEvent(event);
             break;
         }
         break;
             break;
         }
         break;