X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f1db433a3bcaa0c1c8a6a149eafa5e1f0f47cb71..437a8892a107139e9f808f0a11792a56a55b4e25:/src/motif/choice.cpp diff --git a/src/motif/choice.cpp b/src/motif/choice.cpp index 7b88db0e3e..4a05b6829d 100644 --- a/src/motif/choice.cpp +++ b/src/motif/choice.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: choice.cpp +// Name: src/motif/choice.cpp // Purpose: wxChoice // Author: Julian Smart // Modified by: @@ -9,25 +9,17 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "choice.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#ifdef __VMS -#define XtDisplay XTDISPLAY -#define XtParent XTPARENT -#endif - -#include "wx/defs.h" - #if wxUSE_CHOICE #include "wx/choice.h" -#include "wx/utils.h" -#include "wx/arrstr.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" + #include "wx/arrstr.h" +#endif #ifdef __VMS__ #pragma message disable nosimpint @@ -46,7 +38,7 @@ #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); @@ -74,6 +66,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id, { if ( !CreateControl(parent, id, pos, size, style, validator, name) ) return false; + PreCreation(); Widget parentWidget = (Widget) parent->GetClientWidget(); @@ -141,9 +134,7 @@ bool wxChoice::Create(wxWindow *parent, wxWindowID id, 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); @@ -183,75 +174,89 @@ wxChoice::~wxChoice() m_mainWidget = (WXWidget) 0; m_buttonWidget = (WXWidget) 0; } - if ( HasClientObjectData() ) - m_clientDataDict.DestroyData(); } -int wxChoice::DoAppend(const wxString& item) +static inline wxChar* MYcopystring(const wxChar* s) +{ + wxChar* copy = new wxChar[wxStrlen(s) + 1]; + return wxStrcpy(copy, s); +} + +// TODO auto-sorting is not supported by the code +int wxChoice::DoInsertItems(const wxArrayStringsAdapter& items, + unsigned int pos, + void **clientData, wxClientDataType type) { - Widget w = XtVaCreateManagedWidget (wxStripMenuCodes(item), +#ifndef XmNpositionIndex + wxCHECK_MSG( pos == GetCount(), -1, wxT("insert not implemented")); +#endif + + 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 - xmPushButtonGadgetClass, (Widget) m_menuWidget, + xmPushButtonGadgetClass, (Widget) m_menuWidget, #else - xmPushButtonWidgetClass, (Widget) m_menuWidget, + xmPushButtonWidgetClass, (Widget) m_menuWidget, #endif - NULL); - - wxDoChangeBackgroundColour((WXWidget) w, m_backgroundColour); +#ifdef XmNpositionIndex + XmNpositionIndex, pos, +#endif + NULL); - if( m_font.Ok() ) - wxDoChangeFont( w, m_font ); + wxDoChangeBackgroundColour((WXWidget) w, m_backgroundColour); - m_widgetArray.Add(w); + if( m_font.Ok() ) + wxDoChangeFont( w, m_font ); - char mnem = wxFindMnemonic (item); - if (mnem != 0) - XtVaSetValues (w, XmNmnemonic, mnem, NULL); + m_widgetArray.Insert(w, pos); - XtAddCallback (w, XmNactivateCallback, - (XtCallbackProc) wxChoiceCallback, - (XtPointer) this); + char mnem = wxFindMnemonic (items[i]); + if (mnem != 0) + XtVaSetValues (w, XmNmnemonic, mnem, NULL); - 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); - } - m_stringList.Add(item); - m_noStrings ++; + XtAddCallback (w, XmNactivateCallback, + (XtCallbackProc) wxChoiceCallback, + (XtPointer) this); - return GetCount() - 1; -} + 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 ++; -int wxChoice::DoInsert(const wxString& item, int pos) -{ - wxCHECK_MSG(false, -1, wxT("insert not implemented")); + InsertNewItemClientData(pos, clientData, i, type); + } -// wxCHECK_MSG((pos>=0) && (pos<=GetCount()), -1, wxT("invalid index")); -// if (pos == GetCount()) return DoAppend(item); + return pos - 1; } -void wxChoice::Delete(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)); - m_clientDataDict.Delete(n, HasClientObjectData()); + wxChoiceBase::DoDeleteOneItem(n); XtDestroyWidget(w); - m_noStrings --; + m_noStrings--; } -void wxChoice::Clear() +void wxChoice::DoClear() { m_stringList.Clear (); - size_t i; + unsigned int i; for (i = 0; i < m_noStrings; i++) { XtRemoveCallback((Widget) m_widgetArray[i], @@ -266,8 +271,7 @@ void wxChoice::Clear() XmNmenuHistory, (Widget) NULL, NULL); - if ( HasClientObjectData() ) - m_clientDataDict.DestroyData(); + wxChoiceBase::DoClear(); m_noStrings = 0; } @@ -282,7 +286,7 @@ int wxChoice::GetSelection() const wxXmString freeMe(text); wxString s = wxXmStringToString( text ); - if (!s.IsEmpty()) + if (!s.empty()) { int i = 0; for (wxStringList::compatibility_iterator node = m_stringList.GetFirst (); @@ -333,22 +337,7 @@ void wxChoice::SetSelection(int n) m_inSetValue = false; } -int wxChoice::FindString(const wxString& s) const -{ - int i = 0; - for (wxStringList::compatibility_iterator node = m_stringList.GetFirst(); - node; node = node->GetNext ()) - { - if (s == node->GetData()) - return i; - - i++; - } - - return wxNOT_FOUND; -} - -wxString wxChoice::GetString(int n) const +wxString wxChoice::GetString(unsigned int n) const { wxStringList::compatibility_iterator node = m_stringList.Item(n); if (node) @@ -361,7 +350,7 @@ void wxChoice::SetColumns(int n) { if (n<1) n = 1 ; - short numColumns = n ; + short numColumns = (short)n ; Arg args[3]; XtSetArg(args[0], XmNnumColumns, numColumns); @@ -395,7 +384,7 @@ void wxChoice::DoSetSize(int x, int y, int width, int height, int sizeFlags) if (width > -1) { - size_t i; + unsigned int i; for (i = 0; i < m_noStrings; i++) XtVaSetValues ((Widget) m_widgetArray[i], XmNwidth, actualWidth, @@ -406,7 +395,7 @@ void wxChoice::DoSetSize(int x, int y, int width, int height, int sizeFlags) if (height > -1) { #if 0 - size_t i; + unsigned int i; for (i = 0; i < m_noStrings; i++) XtVaSetValues ((Widget) m_widgetArray[i], XmNheight, actualHeight, @@ -458,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? - if (m_font.Ok()) + if (m_mainWidget && m_font.Ok()) { Display* dpy = XtDisplay((Widget) m_mainWidget); int width, height, width1, height1; @@ -473,7 +462,7 @@ void wxChoice::ChangeFont(bool keepOriginalSize) fontTag, m_font.GetFontTypeC(dpy), NULL); - for( size_t i = 0; i < m_noStrings; ++i ) + for( unsigned int i = 0; i < m_noStrings; ++i ) XtVaSetValues( (Widget)m_widgetArray[i], fontTag, m_font.GetFontTypeC(dpy), NULL ); @@ -491,7 +480,7 @@ void wxChoice::ChangeBackgroundColour() wxDoChangeBackgroundColour(m_formWidget, m_backgroundColour); wxDoChangeBackgroundColour(m_buttonWidget, m_backgroundColour); wxDoChangeBackgroundColour(m_menuWidget, m_backgroundColour); - size_t i; + unsigned int i; for (i = 0; i < m_noStrings; i++) wxDoChangeBackgroundColour(m_widgetArray[i], m_backgroundColour); } @@ -501,38 +490,17 @@ void wxChoice::ChangeForegroundColour() wxDoChangeForegroundColour(m_formWidget, m_foregroundColour); wxDoChangeForegroundColour(m_buttonWidget, m_foregroundColour); wxDoChangeForegroundColour(m_menuWidget, m_foregroundColour); - size_t i; + unsigned int i; for (i = 0; i < m_noStrings; i++) wxDoChangeForegroundColour(m_widgetArray[i], m_foregroundColour); } -int wxChoice::GetCount() const +unsigned int wxChoice::GetCount() const { return m_noStrings; } -void wxChoice::DoSetItemClientData(int n, void* clientData) -{ - m_clientDataDict.Set(n, (wxClientData*)clientData, false); -} - -void* wxChoice::DoGetItemClientData(int n) const -{ - return (void*)m_clientDataDict.Get(n); -} - -void wxChoice::DoSetItemClientObject(int n, wxClientData* clientData) -{ - // don't delete, wxItemContainer does that for us - m_clientDataDict.Set(n, clientData, false); -} - -wxClientData* wxChoice::DoGetItemClientObject(int n) const -{ - return m_clientDataDict.Get(n); -} - -void wxChoice::SetString(int WXUNUSED(n), const wxString& WXUNUSED(s)) +void wxChoice::SetString(unsigned int WXUNUSED(n), const wxString& WXUNUSED(s)) { wxFAIL_MSG( wxT("wxChoice::SetString not implemented") ); }