]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/choice.cpp
fix a hang up in wxExecute(wxArrayString& output) overload (#4380)
[wxWidgets.git] / src / motif / choice.cpp
index 11153b562dd05bc8e7e5b6dbdbbdd410e3332842..4a05b6829d5954bedc6ae7e0ca0839e26dd4c030 100644 (file)
 
 #if wxUSE_CHOICE
 
 
 #if wxUSE_CHOICE
 
-#ifdef __VMS
-#define XtDisplay XTDISPLAY
-#define XtParent XTPARENT
-#endif
-
 #include "wx/choice.h"
 
 #ifndef WX_PRECOMP
 #include "wx/choice.h"
 
 #ifndef WX_PRECOMP
@@ -43,7 +38,7 @@
 #define WIDTH_OVERHEAD_SUBTRACT 40
 #define HEIGHT_OVERHEAD 15
 
 #define WIDTH_OVERHEAD_SUBTRACT 40
 #define HEIGHT_OVERHEAD 15
 
-IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxChoice, wxControlWithItems)
 
 void wxChoiceCallback (Widget w, XtPointer clientData,
                        XtPointer ptr);
 
 void wxChoiceCallback (Widget w, XtPointer clientData,
                        XtPointer ptr);
@@ -71,6 +66,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id,
 {
     if ( !CreateControl(parent, id, pos, size, style, validator, name) )
         return false;
 {
     if ( !CreateControl(parent, id, pos, size, style, validator, name) )
         return false;
+    PreCreation();
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
 
     Widget parentWidget = (Widget) parent->GetClientWidget();
 
@@ -138,9 +134,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id,
 
     XtVaSetValues((Widget) m_formWidget, XmNresizePolicy, XmRESIZE_NONE, NULL);
 
 
     XtVaSetValues((Widget) m_formWidget, XmNresizePolicy, XmRESIZE_NONE, NULL);
 
-    ChangeFont(false);
-    ChangeBackgroundColour();
-
+    PostCreation();
     AttachWidget (parent, m_buttonWidget, m_formWidget,
                   pos.x, pos.y, bestSize.x, bestSize.y);
 
     AttachWidget (parent, m_buttonWidget, m_formWidget,
                   pos.x, pos.y, bestSize.x, bestSize.y);
 
@@ -180,8 +174,6 @@ wxChoice::~wxChoice()
         m_mainWidget = (WXWidget) 0;
         m_buttonWidget = (WXWidget) 0;
     }
         m_mainWidget = (WXWidget) 0;
         m_buttonWidget = (WXWidget) 0;
     }
-    if ( HasClientObjectData() )
-        m_clientDataDict.DestroyData();
 }
 
 static inline wxChar* MYcopystring(const wxChar* s)
 }
 
 static inline wxChar* MYcopystring(const wxChar* s)
@@ -190,72 +182,78 @@ static inline wxChar* MYcopystring(const wxChar* s)
     return wxStrcpy(copy, s);
 }
 
     return wxStrcpy(copy, s);
 }
 
-int wxChoice::DoInsert(const wxString& item, unsigned int pos)
+// TODO auto-sorting is not supported by the code
+int wxChoice::DoInsertItems(const wxArrayStringsAdapter& items,
+                            unsigned int pos,
+                            void **clientData, wxClientDataType type)
 {
 #ifndef XmNpositionIndex
     wxCHECK_MSG( pos == GetCount(), -1, wxT("insert not implemented"));
 #endif
 {
 #ifndef XmNpositionIndex
     wxCHECK_MSG( pos == GetCount(), -1, wxT("insert not implemented"));
 #endif
-    Widget w = XtVaCreateManagedWidget (wxStripMenuCodes(item),
+
+    const unsigned int numItems = items.GetCount();
+    AllocClientData(numItems);
+    for( unsigned int i = 0; i < numItems; ++i, ++pos )
+    {
+        Widget w = XtVaCreateManagedWidget (GetLabelText(items[i]),
 #if wxUSE_GADGETS
 #if wxUSE_GADGETS
-        xmPushButtonGadgetClass, (Widget) m_menuWidget,
+            xmPushButtonGadgetClass, (Widget) m_menuWidget,
 #else
 #else
-        xmPushButtonWidgetClass, (Widget) m_menuWidget,
+            xmPushButtonWidgetClass, (Widget) m_menuWidget,
 #endif
 #ifdef XmNpositionIndex
 #endif
 #ifdef XmNpositionIndex
-        XmNpositionIndex, pos,
+            XmNpositionIndex, pos,
 #endif
 #endif
-        NULL);
+            NULL);
 
 
-    wxDoChangeBackgroundColour((WXWidget) w, m_backgroundColour);
+        wxDoChangeBackgroundColour((WXWidget) w, m_backgroundColour);
 
 
-    if( m_font.Ok() )
-        wxDoChangeFont( w, m_font );
+        if( m_font.Ok() )
+            wxDoChangeFont( w, m_font );
 
 
-    m_widgetArray.Insert(w, pos);
+        m_widgetArray.Insert(w, pos);
 
 
-    char mnem = wxFindMnemonic (item);
-    if (mnem != 0)
-        XtVaSetValues (w, XmNmnemonic, mnem, NULL);
+        char mnem = wxFindMnemonic (items[i]);
+        if (mnem != 0)
+            XtVaSetValues (w, XmNmnemonic, mnem, NULL);
 
 
-    XtAddCallback (w, XmNactivateCallback,
-                   (XtCallbackProc) wxChoiceCallback,
-                   (XtPointer) this);
+        XtAddCallback (w, XmNactivateCallback,
+                       (XtCallbackProc) wxChoiceCallback,
+                       (XtPointer) this);
 
 
-    if (m_noStrings == 0 && m_buttonWidget)
-    {
-        XtVaSetValues ((Widget) m_buttonWidget, XmNmenuHistory, w, NULL);
-        Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget);
-        wxXmString text( item );
-        XtVaSetValues (label,
-            XmNlabelString, text(),
-            NULL);
-    }
-    // need to ditch wxStringList for wxArrayString
-    m_stringList.Insert(pos, MYcopystring(item));
-    m_noStrings ++;
+        if (m_noStrings == 0 && m_buttonWidget)
+        {
+            XtVaSetValues ((Widget) m_buttonWidget, XmNmenuHistory, w, NULL);
+            Widget label = XmOptionButtonGadget ((Widget) m_buttonWidget);
+            wxXmString text( items[i] );
+            XtVaSetValues (label,
+                XmNlabelString, text(),
+                NULL);
+        }
+        // need to ditch wxStringList for wxArrayString
+        m_stringList.Insert(pos, MYcopystring(items[i]));
+        m_noStrings ++;
 
 
-    return pos;
-}
+        InsertNewItemClientData(pos, clientData, i, type);
+    }
 
 
-int wxChoice::DoAppend(const wxString& item)
-{
-    return DoInsert(item, GetCount());
+    return pos - 1;
 }
 
 }
 
-void wxChoice::Delete(unsigned int n)
+void wxChoice::DoDeleteOneItem(unsigned int n)
 {
     Widget w = (Widget)m_widgetArray[n];
     XtRemoveCallback(w, XmNactivateCallback, (XtCallbackProc)wxChoiceCallback,
                      (XtPointer)this);
     m_stringList.Erase(m_stringList.Item(n));
     m_widgetArray.RemoveAt(size_t(n));
 {
     Widget w = (Widget)m_widgetArray[n];
     XtRemoveCallback(w, XmNactivateCallback, (XtCallbackProc)wxChoiceCallback,
                      (XtPointer)this);
     m_stringList.Erase(m_stringList.Item(n));
     m_widgetArray.RemoveAt(size_t(n));
-    m_clientDataDict.Delete(n, HasClientObjectData());
+    wxChoiceBase::DoDeleteOneItem(n);
 
     XtDestroyWidget(w);
     m_noStrings--;
 }
 
 
     XtDestroyWidget(w);
     m_noStrings--;
 }
 
-void wxChoice::Clear()
+void wxChoice::DoClear()
 {
     m_stringList.Clear ();
     unsigned int i;
 {
     m_stringList.Clear ();
     unsigned int i;
@@ -273,8 +271,7 @@ void wxChoice::Clear()
                        XmNmenuHistory, (Widget) NULL,
                        NULL);
 
                        XmNmenuHistory, (Widget) NULL,
                        NULL);
 
-    if ( HasClientObjectData() )
-        m_clientDataDict.DestroyData();
+    wxChoiceBase::DoClear();
 
     m_noStrings = 0;
 }
 
     m_noStrings = 0;
 }
@@ -450,7 +447,7 @@ void wxChoice::ChangeFont(bool keepOriginalSize)
     // Note that this causes the widget to be resized back
     // to its original size! We therefore have to set the size
     // back again. TODO: a better way in Motif?
     // Note that this causes the widget to be resized back
     // to its original size! We therefore have to set the size
     // back again. TODO: a better way in Motif?
-    if (m_font.Ok())
+    if (m_mainWidget && m_font.Ok())
     {
         Display* dpy = XtDisplay((Widget) m_mainWidget);
         int width, height, width1, height1;
     {
         Display* dpy = XtDisplay((Widget) m_mainWidget);
         int width, height, width1, height1;
@@ -503,27 +500,6 @@ unsigned int wxChoice::GetCount() const
     return m_noStrings;
 }
 
     return m_noStrings;
 }
 
-void wxChoice::DoSetItemClientData(unsigned int n, void* clientData)
-{
-    m_clientDataDict.Set(n, (wxClientData*)clientData, false);
-}
-
-void* wxChoice::DoGetItemClientData(unsigned int n) const
-{
-    return (void*)m_clientDataDict.Get(n);
-}
-
-void wxChoice::DoSetItemClientObject(unsigned int n, wxClientData* clientData)
-{
-    // don't delete, wxItemContainer does that for us
-    m_clientDataDict.Set(n, clientData, false);
-}
-
-wxClientData* wxChoice::DoGetItemClientObject(unsigned int n) const
-{
-    return m_clientDataDict.Get(n);
-}
-
 void wxChoice::SetString(unsigned int WXUNUSED(n), const wxString& WXUNUSED(s))
 {
     wxFAIL_MSG( wxT("wxChoice::SetString not implemented") );
 void wxChoice::SetString(unsigned int WXUNUSED(n), const wxString& WXUNUSED(s))
 {
     wxFAIL_MSG( wxT("wxChoice::SetString not implemented") );