]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/checklst.cpp
fixed crash in wxDb::Open() in Unicode build due to wrong interpretation of BufferLen...
[wxWidgets.git] / src / motif / checklst.cpp
index b609661ac9d71b86f258f8c73985a947100fe65f..ea21e7e19263a2ee00dfb436ace47dbce04876a4 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        checklst.cpp
+// Name:        src/motif/checklst.cpp
 // Purpose:     implementation of wxCheckListBox class
 // Author:      Julian Smart
 // Modified by:
 // headers & declarations
 // ============================================================================
 
-#ifdef __GNUG__
-#pragma implementation "checklst.h"
-#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#if wxUSE_CHECKLISTBOX
 
 #include "wx/checklst.h"
 
+#ifndef WX_PRECOMP
+    #include "wx/arrstr.h"
+#endif
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -37,8 +42,26 @@ END_EVENT_TABLE()
 // control creation
 // ----------------
 
+static const wxString prefixChecked = "[x] ";
+static const wxString prefixUnchecked = "[ ] ";
+static const char checkChar = 'x', uncheckChar = ' ';
+
+static inline const wxString& Prefix(bool checked)
+    { return checked ? prefixChecked : prefixUnchecked; }
+static inline bool IsChecked(const wxString& s)
+    { wxASSERT(s.length() >=4); return s[1] == checkChar; }
+
+static void CopyStringsAddingPrefix(const wxArrayString& orig,
+                                    wxArrayString& copy)
+{
+    copy.Clear();
+
+    for(size_t i = 0; i < orig.GetCount(); ++i )
+        copy.Add( Prefix(false) + orig[i] );
+}
+
 // def ctor: use Create() to really create the control
-wxCheckListBox::wxCheckListBox() : wxListBox()
+wxCheckListBox::wxCheckListBox() : wxCheckListBoxBase()
 {
 }
 
@@ -48,25 +71,130 @@ wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id,
                                int nStrings, const wxString choices[],
                                long style, const wxValidator& val,
                                const wxString& name)
-                               : wxListBox()
+                               : wxCheckListBoxBase()
+{
+    Create(parent, id, pos, size, nStrings, choices,
+           style, val, name);
+}
+
+wxCheckListBox::wxCheckListBox(wxWindow *parent, wxWindowID id,
+                               const wxPoint& pos, const wxSize& size,
+                               const wxArrayString& choices,
+                               long style, const wxValidator& val,
+                               const wxString& name)
+                               : wxCheckListBoxBase()
+{
+    Create(parent, id, pos, size, choices,
+           style, val, name);
+}
+
+bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id,
+                            const wxPoint& pos,
+                            const wxSize& size,
+                            int n, const wxString choices[],
+                            long style,
+                            const wxValidator& validator,
+                            const wxString& name)
+{
+    // wxListBox::Create calls set, which adds the prefixes
+    bool retVal = wxListBox::Create(parent, id, pos, size, n, choices,
+                                    style, validator, name);
+    return retVal;
+}
+
+bool wxCheckListBox::Create(wxWindow *parent, wxWindowID id,
+                            const wxPoint& pos,
+                            const wxSize& size,
+                            const wxArrayString& choices,
+                            long style,
+                            const wxValidator& validator,
+                            const wxString& name)
 {
-    // TODO: you'll probably need a separate Create instead of using
-    // the wxListBox one as here.
-    Create(parent, id, pos, size, nStrings, choices, style|wxLB_OWNERDRAW, val, name);
+    // wxListBox::Create calls set, which adds the prefixes
+    bool retVal = wxListBox::Create(parent, id, pos, size, choices,
+                                    style, validator, name);
+    return retVal;
 }
 
 // check items
 // -----------
 
-bool wxCheckListBox::IsChecked(size_t WXUNUSED(uiIndex)) const
+bool wxCheckListBox::IsChecked(unsigned int uiIndex) const
 {
-    // TODO
-    return FALSE;
+    return ::IsChecked(wxListBox::GetString(uiIndex));
 }
 
-void wxCheckListBox::Check(size_t WXUNUSED(uiIndex), bool WXUNUSED(bCheck))
+void wxCheckListBox::Check(unsigned int uiIndex, bool bCheck)
 {
-    // TODO
+    wxString label = wxListBox::GetString(uiIndex);
+    if(::IsChecked(label) == bCheck) return;
+    label[1u] = bCheck ? checkChar : uncheckChar;
+    wxListBox::SetString(uiIndex, label);
 }
 
+void wxCheckListBox::DoToggleItem( int n, int x )
+{
+    if( x < 23 )
+    {
+        wxString label = wxListBox::GetString(n);
+        label[1u] = (!::IsChecked(label)) ? checkChar : uncheckChar;
+        wxListBox::SetString(n, label);
+
+        wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId());
+        if( HasClientObjectData() )
+            event.SetClientObject( GetClientObject(n) );
+        else if( HasClientUntypedData() )
+            event.SetClientData( GetClientData(n) );
+        event.SetInt(n);
+        event.SetExtraLong(true);
+        event.SetEventObject(this);
+        event.SetString(GetString(n));
+
+        GetEventHandler()->ProcessEvent(event);
+    }
+}
+
+int wxCheckListBox::DoAppend(const wxString& item)
+{
+    return wxListBox::DoAppend( Prefix(false) + item );
+}
+
+int wxCheckListBox::FindString(const wxString& s, bool bCase) const
+{
+    int n1 = wxListBox::FindString(Prefix(false) + s, bCase);
+    int n2 = wxListBox::FindString(Prefix(true) + s, bCase);
+    int min = wxMin(n1, n2), max = wxMax(n1, n2);
+
+    // why this works:
+    // n1 == -1, n2 == -1 => return -1 OK
+    // n1 != -1 || n2 != -1 => min == -1 => return the other one
+    // both != -1 => return the first one.
+    if( min == -1 ) return max;
+    return min;
+}
+
+void wxCheckListBox::SetString(unsigned int n, const wxString& s)
+{
+    wxListBox::SetString(n, Prefix(IsChecked(n)) + s);
+}
+
+wxString wxCheckListBox::GetString(unsigned int n) const
+{
+    return wxListBox::GetString(n).substr(4);
+}
+
+void wxCheckListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
+{
+    wxArrayString copy;
+    CopyStringsAddingPrefix(items, copy);
+    wxListBox::DoInsertItems(copy, pos);
+}
+
+void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData)
+{
+    wxArrayString copy;
+    CopyStringsAddingPrefix(items, copy);
+    wxListBox::DoSetItems(copy, clientData);
+}
 
+#endif // wxUSE_CHECKLISTBOX