X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b4726a583db1d7d4274f979521a6482776579684..6d49e4bbed54b296e9d59d1051de9182f4058bff:/src/mac/carbon/checklst.cpp diff --git a/src/mac/carbon/checklst.cpp b/src/mac/carbon/checklst.cpp index 14f7a76bd7..dcaed50c21 100644 --- a/src/mac/carbon/checklst.cpp +++ b/src/mac/carbon/checklst.cpp @@ -30,6 +30,18 @@ IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox) 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 wxMacListBoxItem* CreateItem(); + + virtual bool MacIsChecked(unsigned int n) const; + virtual void MacCheck(unsigned int n, bool bCheck = true); +}; + void wxCheckListBox::Init() { } @@ -69,9 +81,9 @@ bool wxCheckListBox::Create( 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); @@ -92,7 +104,7 @@ bool wxCheckListBox::IsChecked(unsigned int item) const 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) @@ -100,62 +112,158 @@ 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 +{ + return dynamic_cast(m_peer); +} -void wxCheckListBox::Delete(unsigned int n) -{ - wxCHECK_RET( IsValid(n), wxT("invalid index in wxCheckListBox::Delete") ); +const short kCheckboxColumnId = 1026; - wxListBox::Delete( n ); - m_checks.RemoveAt( n ); +wxMacDataBrowserCheckListControl::wxMacDataBrowserCheckListControl( wxListBox *peer, const wxPoint& pos, const wxSize& size, long style) + : wxMacDataBrowserListControl( peer, pos, size, style ) +{ + 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; + + 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; + } + + ~wxMacCheckListBoxItem() + { + } + + 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_checks.Insert( false, pos + n ); + m_isChecked = check; } -} + bool IsChecked() const + { + return m_isChecked; + } + +protected : + bool m_isChecked; +}; -void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData) +wxMacListBoxItem* wxMacDataBrowserCheckListControl::CreateItem() { - // call it first as it does DoClear() - wxListBox::DoSetItems( items, clientData ); + return new wxMacCheckListBoxItem(); +} - unsigned int count = items.GetCount(); - for ( unsigned int n = 0; n < count; n++ ) - { - m_checks.Add( false ); - } +void wxMacDataBrowserCheckListControl::MacCheck( unsigned int n, bool bCheck) +{ + wxMacCheckListBoxItem* item = dynamic_cast( GetItemFromLine( n) ); + item->Check( bCheck); + UpdateItem(wxMacDataBrowserRootContainer, item , kCheckboxColumnId); } -void wxCheckListBox::DoClear() +bool wxMacDataBrowserCheckListControl::MacIsChecked( unsigned int n) const { - m_checks.Empty(); + wxMacCheckListBoxItem * item = dynamic_cast( GetItemFromLine( n ) ); + return item->IsChecked(); } + + #endif // wxUSE_CHECKLISTBOX