listbox rewrite, cleanup

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38832 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2006-04-19 07:53:02 +00:00
parent ca92309874
commit 6cce68eaab
4 changed files with 2322 additions and 1569 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -30,6 +30,18 @@ IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox)
BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox) BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
END_EVENT_TABLE() 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() void wxCheckListBox::Init()
{ {
} }
@@ -69,9 +81,9 @@ bool wxCheckListBox::Create(
return false; return false;
// this will be increased by our Append command // this will be increased by our Append command
m_noItems = 0; wxMacDataBrowserCheckListControl* control = new wxMacDataBrowserCheckListControl( this, pos, size, style );
control->SetClientDataType( m_clientDataItemsType );
m_peer = (wxMacControl*) CreateMacListControl(pos , size , style ); m_peer = control;
MacPostControlCreate(pos,size); MacPostControlCreate(pos,size);
@@ -92,7 +104,7 @@ bool wxCheckListBox::IsChecked(unsigned int item) const
wxCHECK_MSG( IsValid(item), false, wxCHECK_MSG( IsValid(item), false,
wxT("invalid index in wxCheckListBox::IsChecked") ); wxT("invalid index in wxCheckListBox::IsChecked") );
return m_checks[item] != 0; return GetPeer()->MacIsChecked( item );
} }
void wxCheckListBox::Check(unsigned int item, bool check) void wxCheckListBox::Check(unsigned int item, bool check)
@@ -100,62 +112,158 @@ void wxCheckListBox::Check(unsigned int item, bool check)
wxCHECK_RET( IsValid(item), wxCHECK_RET( IsValid(item),
wxT("invalid index in wxCheckListBox::Check") ); wxT("invalid index in wxCheckListBox::Check") );
bool isChecked = m_checks[item] != 0; bool isChecked = GetPeer()->MacIsChecked( item );
if ( check != isChecked ) if ( check != isChecked )
{ {
m_checks[item] = check; GetPeer()->MacCheck( item , check );
MacUpdateLine( item );
} }
} }
// ---------------------------------------------------------------------------- wxMacCheckListControl* wxCheckListBox::GetPeer() const
// methods forwarded to wxCheckListBox
// ----------------------------------------------------------------------------
void wxCheckListBox::Delete(unsigned int n)
{ {
wxCHECK_RET( IsValid(n), wxT("invalid index in wxCheckListBox::Delete") ); return dynamic_cast<wxMacCheckListControl*>(m_peer);
wxListBox::Delete( n );
m_checks.RemoveAt( n );
} }
int wxCheckListBox::DoAppend(const wxString& item) const short kCheckboxColumnId = 1026;
wxMacDataBrowserCheckListControl::wxMacDataBrowserCheckListControl( wxListBox *peer, const wxPoint& pos, const wxSize& size, long style)
: wxMacDataBrowserListControl( peer, pos, size, style )
{ {
int pos = wxListBox::DoAppend( item ); OSStatus err = noErr;
// the item is initially unchecked DataBrowserListViewColumnDesc columnDesc;
m_checks.Insert( false, pos ); columnDesc.headerBtnDesc.titleOffset = 0;
columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
return pos; 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 );
} }
void wxCheckListBox::DoInsertItems(const wxArrayString& items, unsigned int pos) wxMacDataBrowserCheckListControl::~wxMacDataBrowserCheckListControl()
{ {
wxListBox::DoInsertItems( items, pos );
unsigned int count = items.GetCount(); }
for ( unsigned int n = 0; n < count; n++ )
class wxMacCheckListBoxItem : public wxMacListBoxItem
{
public :
wxMacCheckListBoxItem()
{ {
m_checks.Insert( false, pos + n ); m_isChecked = false;
} }
}
void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData) ~wxMacCheckListBoxItem()
{
// call it first as it does DoClear()
wxListBox::DoSetItems( items, clientData );
unsigned int count = items.GetCount();
for ( unsigned int n = 0; n < count; n++ )
{ {
m_checks.Add( false );
} }
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;
}
void Check( bool check )
{
m_isChecked = check;
}
bool IsChecked() const
{
return m_isChecked;
}
protected :
bool m_isChecked;
};
wxMacListBoxItem* wxMacDataBrowserCheckListControl::CreateItem()
{
return new wxMacCheckListBoxItem();
} }
void wxCheckListBox::DoClear() void wxMacDataBrowserCheckListControl::MacCheck( unsigned int n, bool bCheck)
{ {
m_checks.Empty(); wxMacCheckListBoxItem* item = dynamic_cast<wxMacCheckListBoxItem*>( GetItemFromLine( n) );
item->Check( bCheck);
UpdateItem(wxMacDataBrowserRootContainer, item , kCheckboxColumnId);
} }
bool wxMacDataBrowserCheckListControl::MacIsChecked( unsigned int n) const
{
wxMacCheckListBoxItem * item = dynamic_cast<wxMacCheckListBoxItem*>( GetItemFromLine( n ) );
return item->IsChecked();
}
#endif // wxUSE_CHECKLISTBOX #endif // wxUSE_CHECKLISTBOX

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff