text: ///////////////////////////////////////////////////////////////////////////////
  // Name:        src/osx/checklst.cpp
  // Purpose:     implementation of wxCheckListBox class
  // Author:      Stefan Csomor
  // Modified by:
  // Created:     1998-01-01
  // RCS-ID:      $Id$
  // Copyright:   (c) Stefan Csomor
  // Licence:     wxWindows licence
  ///////////////////////////////////////////////////////////////////////////////
  //
  // new DataBrowser-based version
  
  
  #include "wx/wxprec.h"
  
  #if wxUSE_CHECKLISTBOX
  
  #include "wx/checklst.h"
  
  #ifndef WX_PRECOMP
      #include "wx/arrstr.h"
  #endif
  
  #include "wx/osx/private.h"
  
  IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox)
  
  BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
  END_EVENT_TABLE()
  
  void wxCheckListBox::Init()
  {
  }
  
  bool wxCheckListBox::Create(
      wxWindow *parent,
      wxWindowID id,
      const wxPoint &pos,
      const wxSize &size,
      const wxArrayString& choices,
      long style,
      const wxValidator& validator,
      const wxString &name )
  {
      wxCArrayString chs( choices );
  
      return Create( parent, id, pos, size, chs.GetCount(), chs.GetStrings(), style, validator, 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 )
  {
      m_macIsUserPane = false;
  
      wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED),
                    wxT("only one of listbox selection modes can be specified") );
  
      if ( !wxCheckListBoxBase::Create( parent, id, pos, size, n, choices, style & ~(wxHSCROLL | wxVSCROLL), validator, name ) )
          return false;
  
      int colwidth = 30;
      // TODO adapt the width according to the window variant
      m_checkColumn = GetListPeer()->InsertCheckColumn(0, wxEmptyString, true, wxALIGN_CENTER, colwidth);
  
      return true;
  }
  
  // ----------------------------------------------------------------------------
  // wxCheckListBox functions
  // ----------------------------------------------------------------------------
  
  // ----------------------------------------------------------------------------
  // wxCheckListBox functions
  // ----------------------------------------------------------------------------
  
  bool wxCheckListBox::IsChecked(unsigned int n) const
  {
      wxCHECK_MSG( IsValid(n), false,
                   wxT("invalid index in wxCheckListBox::IsChecked") );
  
      return m_checks[n] != 0;
  }
  
  void wxCheckListBox::Check(unsigned int n, bool check)
  {
      wxCHECK_RET( IsValid(n),
                   wxT("invalid index in wxCheckListBox::Check") );
  
      // intermediate var is needed to avoid compiler warning with VC++
      bool isChecked = m_checks[n] != 0;
      if ( check != isChecked )
      {
          m_checks[n] = check;
  
          GetListPeer()->UpdateLine(n);
      }
  }
  
  void wxCheckListBox::GetValueCallback( unsigned int n, wxListWidgetColumn* col , wxListWidgetCellValue& value )
  {
      if ( col == m_checkColumn )
          value.Check( IsChecked( n ) );
      else
          wxListBox::GetValueCallback( n, col, value );
  }
  
  void wxCheckListBox::SetValueCallback( unsigned int n, wxListWidgetColumn* col , wxListWidgetCellValue& value )
  {
      if ( col == m_checkColumn )
      {
          Check( n, value.IsChecked() );
  
          wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId() );
          event.SetInt( n );
          event.SetString( GetString( n ) );
          event.SetEventObject( this );
          HandleWindowEvent( event );
      }
  }
  
  
  
  // ----------------------------------------------------------------------------
  // methods forwarded to wxListBox
  // ----------------------------------------------------------------------------
  
  void wxCheckListBox::OnItemInserted(unsigned int pos)
  {
      wxListBox::OnItemInserted(pos);
  
      m_checks.Insert(false, pos );
  }
  
  void wxCheckListBox::DoDeleteOneItem(unsigned int n)
  {
      wxListBox::DoDeleteOneItem(n);
  
      m_checks.RemoveAt(n);
  }
  
  void wxCheckListBox::DoClear()
  {
      wxListBox::DoClear();
  
      m_checks.Empty();
  }
  
  #endif // wxUSE_CHECKLISTBOX
  