+    m_inSetValue = TRUE;
+    if (!value.IsNull())
+        XmComboBoxSetString ((Widget) m_mainWidget, (char*) (const char*) value);
+    m_inSetValue = FALSE;
+}
+
+void wxComboBox::Append(const wxString& item)
+{
+    XmString str = XmStringCreateLtoR((char*) (const char*) item, XmSTRING_DEFAULT_CHARSET);
+    XmComboBoxAddItem((Widget) m_mainWidget, str, 0);
+    m_stringList.Add(item);
+    XmStringFree(str);
+    m_noStrings ++;
+}
+
+void wxComboBox::Delete(int n)
+{
+    XmComboBoxDeletePos((Widget) m_mainWidget, n-1);
+    wxNode *node = m_stringList.Nth(n);
+    if (node)
+    {
+        delete[] (char *)node->Data();
+        delete node;
+    }
+    node = m_clientList.Nth( n );
+    if (node)
+    {
+        if ( HasClientObjectData() )
+        {
+            delete (wxClientData *)node->Data();
+        }
+        delete node;
+    }
+
+    m_noStrings--;
+}
+
+void wxComboBox::Clear()
+{
+    XmComboBoxDeleteAllItems((Widget) m_mainWidget);
+    m_stringList.Clear();
+
+    if ( HasClientObjectData() )
+    {
+        // destroy the data (due to Robert's idea of using wxList<wxObject>
+        // and not wxList<wxClientData> we can't just say
+        // m_clientList.DeleteContents(TRUE) - this would crash!
+        wxNode *node = m_clientList.First();
+        while ( node )
+        {
+            delete (wxClientData *)node->Data();
+            node = node->Next();
+        }
+    }
+    m_clientList.Clear();
+    m_noStrings = 0;
+}
+
+void wxComboBox::SetSelection (int n)
+{
+    XmComboBoxSelectPos((Widget) m_mainWidget, n+1, False);
+}
+
+int wxComboBox::GetSelection (void) const
+{
+    int sel = XmComboBoxGetSelectedPos((Widget) m_mainWidget);
+    if (sel == 0)
+        return -1;
+    else
+        return sel - 1;
+}
+
+wxString wxComboBox::GetString(int n) const
+{
+    wxNode *node = m_stringList.Nth (n);
+    if (node)
+        return wxString((char *) node->Data ());
+    else
+        return wxEmptyString;
+}
+
+wxString wxComboBox::GetStringSelection() const
+{
+    int sel = GetSelection();
+    if (sel == -1)
+        return wxEmptyString;
+    else
+        return GetString(sel);
+}
+
+bool wxComboBox::SetStringSelection(const wxString& sel)
+{
+    int n = FindString(sel);
+    if (n == -1)
+        return FALSE;
+    else
+    {
+        SetSelection(n);
+        return TRUE;
+    }
+}
+
+int wxComboBox::FindString(const wxString& s) const
+{
+    int *pos_list = NULL;
+    int count = 0;
+    XmString text = XmStringCreateSimple ((char*) (const char*) s);
+    bool found = (XmComboBoxGetMatchPos((Widget) m_mainWidget,
+        text, &pos_list, &count) != 0);
+
+    XmStringFree(text);
+
+    if (found && count > 0)
+    {
+        int pos = pos_list[0] - 1;
+        free(pos_list);
+        return pos;
+    }
+
+    return -1;