X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b4726a583db1d7d4274f979521a6482776579684..204abcd474fa99071b7bb5b00f7e212b0bde16dc:/src/mac/carbon/checklst.cpp diff --git a/src/mac/carbon/checklst.cpp b/src/mac/carbon/checklst.cpp index 14f7a76bd7..5f0fecb5e2 100644 --- a/src/mac/carbon/checklst.cpp +++ b/src/mac/carbon/checklst.cpp @@ -17,19 +17,34 @@ #if wxUSE_CHECKLISTBOX #include "wx/checklst.h" -#include "wx/arrstr.h" -#include "wx/mac/uma.h" - -#ifndef __DARWIN__ -#include +#ifndef WX_PRECOMP + #include "wx/arrstr.h" #endif +#include "wx/mac/uma.h" + 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 ~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() { } @@ -69,16 +84,16 @@ 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 ); + // TODO CHECK 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; } @@ -92,7 +107,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 +115,159 @@ 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 ; +} + +const short kCheckboxColumnId = 1026; -void wxCheckListBox::Delete(unsigned int n) +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; - wxListBox::Delete( n ); - m_checks.RemoveAt( n ); + 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; + } - 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->HandleWindowEvent( 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 wxCheckListBox::DoClear() +void wxMacDataBrowserCheckListControl::MacCheck( unsigned int n, bool bCheck) { - m_checks.Empty(); + wxMacCheckListBoxItem* item = wx_static_cast(wxMacCheckListBoxItem*, GetItemFromLine( n) ); + item->Check( bCheck); + UpdateItem(wxMacDataBrowserRootContainer, item , kCheckboxColumnId); } +bool wxMacDataBrowserCheckListControl::MacIsChecked( unsigned int n) const +{ + wxMacCheckListBoxItem * item = wx_static_cast( wxMacCheckListBoxItem*, GetItemFromLine( n ) ); + return item->IsChecked(); +} + + + #endif // wxUSE_CHECKLISTBOX