#if wxUSE_CHECKLISTBOX
#include "wx/checklst.h"
-#include "wx/arrstr.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/arrstr.h"
+#endif
#include "wx/mac/uma.h"
BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
END_EVENT_TABLE()
+class wxMacDataBrowserCheckListControl : public wxMacDataBrowserListControl , public wxMacCheckListControl
+{
+public:
+ wxMacDataBrowserCheckListControl( wxListBox *peer, const wxPoint& pos, const wxSize& size, long style );
+ wxMacDataBrowserCheckListControl() {}
+ virtual ~wxMacDataBrowserCheckListControl();
+
+ virtual wxMacDataItem* CreateItem();
+
+ virtual bool MacIsChecked(unsigned int n) const;
+ virtual void MacCheck(unsigned int n, bool bCheck = true);
+ DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacDataBrowserCheckListControl)
+};
+
+IMPLEMENT_DYNAMIC_CLASS( wxMacDataBrowserCheckListControl , wxMacDataBrowserListControl )
+
void wxCheckListBox::Init()
{
}
return false;
// this will be increased by our Append command
- m_noItems = 0;
-
- m_peer = (wxMacControl*) CreateMacListControl(pos , size , style );
+ wxMacDataBrowserCheckListControl* control = new wxMacDataBrowserCheckListControl( this, pos, size, style );
+ control->SetClientDataType( m_clientDataItemsType );
+ m_peer = control;
MacPostControlCreate(pos,size);
- InsertItems( n , choices , 0 );
+ InsertItems( n , choices , 0 );
// Needed because it is a wxControlWithItems
- SetBestSize( size );
+ SetInitialSize( size );
return true;
}
wxCHECK_MSG( IsValid(item), false,
wxT("invalid index in wxCheckListBox::IsChecked") );
- return m_checks[item] != 0;
+ return GetPeer()->MacIsChecked( item );
}
void wxCheckListBox::Check(unsigned int item, bool check)
wxCHECK_RET( IsValid(item),
wxT("invalid index in wxCheckListBox::Check") );
- bool isChecked = m_checks[item] != 0;
+ bool isChecked = GetPeer()->MacIsChecked( item );
if ( check != isChecked )
{
- m_checks[item] = check;
- MacUpdateLine( item );
+ GetPeer()->MacCheck( item , check );
}
}
-// ----------------------------------------------------------------------------
-// methods forwarded to wxCheckListBox
-// ----------------------------------------------------------------------------
+wxMacCheckListControl* wxCheckListBox::GetPeer() const
+{
+ wxMacDataBrowserCheckListControl *lb = wxDynamicCast(m_peer,wxMacDataBrowserCheckListControl);
+ return lb ? wx_static_cast(wxMacCheckListControl*,lb) : 0 ;
+}
-void wxCheckListBox::Delete(unsigned int n)
+const short kCheckboxColumnId = 1026;
+
+wxMacDataBrowserCheckListControl::wxMacDataBrowserCheckListControl( wxListBox *peer, const wxPoint& pos, const wxSize& size, long style)
+ : wxMacDataBrowserListControl( peer, pos, size, style )
{
- wxCHECK_RET( IsValid(n), wxT("invalid index in wxCheckListBox::Delete") );
+ OSStatus err = noErr;
+
+ DataBrowserListViewColumnDesc columnDesc;
+ columnDesc.headerBtnDesc.titleOffset = 0;
+ columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
+
+ columnDesc.headerBtnDesc.btnFontStyle.flags =
+ kControlUseFontMask | kControlUseJustMask;
+
+ columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
+ columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault;
+ columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
+ columnDesc.headerBtnDesc.btnFontStyle.style = normal;
+ columnDesc.headerBtnDesc.titleString = NULL;
+
+ columnDesc.headerBtnDesc.minimumWidth = 30;
+ columnDesc.headerBtnDesc.maximumWidth = 30;
+
+ columnDesc.propertyDesc.propertyID = kCheckboxColumnId;
+ columnDesc.propertyDesc.propertyType = kDataBrowserCheckboxType;
+ columnDesc.propertyDesc.propertyFlags =
+ kDataBrowserPropertyIsMutable
+ | kDataBrowserTableViewSelectionColumn
+ | kDataBrowserDefaultPropertyFlags;
- wxListBox::Delete( n );
- m_checks.RemoveAt( n );
+ err = AddColumn( &columnDesc, 0 );
+ verify_noerr( err );
}
-int wxCheckListBox::DoAppend(const wxString& item)
+wxMacDataBrowserCheckListControl::~wxMacDataBrowserCheckListControl()
{
- int pos = wxListBox::DoAppend( item );
- // the item is initially unchecked
- m_checks.Insert( false, pos );
-
- return pos;
}
-void wxCheckListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
+class wxMacCheckListBoxItem : public wxMacListBoxItem
{
- wxListBox::DoInsertItems( items, pos );
+public :
+ wxMacCheckListBoxItem()
+ {
+ m_isChecked = false;
+ }
- unsigned int count = items.GetCount();
- for ( unsigned int n = 0; n < count; n++ )
+ virtual ~wxMacCheckListBoxItem()
{
- m_checks.Insert( false, pos + n );
}
-}
-void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData)
-{
- // call it first as it does DoClear()
- wxListBox::DoSetItems( items, clientData );
+ virtual OSStatus GetSetData( wxMacDataItemBrowserControl *owner ,
+ DataBrowserPropertyID property,
+ DataBrowserItemDataRef itemData,
+ bool changeValue )
+ {
+ OSStatus err = errDataBrowserPropertyNotSupported;
+
+ wxCheckListBox *checklist = wxDynamicCast( owner->GetPeer() , wxCheckListBox );
+ wxCHECK_MSG( checklist != NULL , errDataBrowserPropertyNotSupported , wxT("wxCheckListBox expected"));
+
+ if ( !changeValue )
+ {
+ switch (property)
+ {
+ case kCheckboxColumnId:
+ verify_noerr(SetDataBrowserItemDataButtonValue( itemData, m_isChecked ? kThemeButtonOn : kThemeButtonOff ));
+ err = noErr;
+ break;
+
+ case kDataBrowserItemIsEditableProperty:
+ verify_noerr(SetDataBrowserItemDataBooleanValue( itemData, true ));
+ err = noErr;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else
+ {
+ switch (property)
+ {
+ case kCheckboxColumnId:
+ {
+ // we have to change this behind the back, since Check() would be triggering another update round
+ bool newVal = !m_isChecked;
+ verify_noerr(SetDataBrowserItemDataButtonValue( itemData, newVal ? kThemeButtonOn : kThemeButtonOff ));
+ m_isChecked = newVal;
+ err = noErr;
+
+ wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, checklist->GetId() );
+ event.SetInt( owner->GetLineFromItem( this ) );
+ event.SetEventObject( checklist );
+ checklist->GetEventHandler()->ProcessEvent( event );
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if ( err == errDataBrowserPropertyNotSupported )
+ err = wxMacListBoxItem::GetSetData( owner , property, itemData , changeValue);
+
+ return err;
+ }
- unsigned int count = items.GetCount();
- for ( unsigned int n = 0; n < count; n++ )
+ void Check( bool check )
+ {
+ m_isChecked = check;
+ }
+ bool IsChecked() const
{
- m_checks.Add( false );
+ return m_isChecked;
}
+
+protected :
+ bool m_isChecked;
+};
+
+wxMacDataItem* wxMacDataBrowserCheckListControl::CreateItem()
+{
+ return new wxMacCheckListBoxItem();
+}
+
+void wxMacDataBrowserCheckListControl::MacCheck( unsigned int n, bool bCheck)
+{
+ wxMacCheckListBoxItem* item = wx_static_cast(wxMacCheckListBoxItem*, GetItemFromLine( n) );
+ item->Check( bCheck);
+ UpdateItem(wxMacDataBrowserRootContainer, item , kCheckboxColumnId);
}
-void wxCheckListBox::DoClear()
+bool wxMacDataBrowserCheckListControl::MacIsChecked( unsigned int n) const
{
- m_checks.Empty();
+ wxMacCheckListBoxItem * item = wx_static_cast( wxMacCheckListBoxItem*, GetItemFromLine( n ) );
+ return item->IsChecked();
}
+
+
#endif // wxUSE_CHECKLISTBOX