2. use HandleWindowEvent() everywhere as more obvious and convenient shortcut for GetEventHandler()->ProcessEvent(); also for consistency with wxGTK where it's required git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50329 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
274 lines
8.0 KiB
C++
274 lines
8.0 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/mac/carbon/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/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()
|
|
{
|
|
}
|
|
|
|
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 ( !wxListBoxBase::Create( parent, id, pos, size, style & ~(wxHSCROLL | wxVSCROLL), validator, name ) )
|
|
return false;
|
|
|
|
// this will be increased by our Append command
|
|
wxMacDataBrowserCheckListControl* control = new wxMacDataBrowserCheckListControl( this, pos, size, style );
|
|
// TODO CHECK control->SetClientDataType( m_clientDataItemsType );
|
|
m_peer = control;
|
|
|
|
MacPostControlCreate(pos,size);
|
|
|
|
InsertItems( n , choices , 0 );
|
|
|
|
// Needed because it is a wxControlWithItems
|
|
SetInitialSize( size );
|
|
|
|
return true;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxCheckListBox functions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
bool wxCheckListBox::IsChecked(unsigned int item) const
|
|
{
|
|
wxCHECK_MSG( IsValid(item), false,
|
|
wxT("invalid index in wxCheckListBox::IsChecked") );
|
|
|
|
return GetPeer()->MacIsChecked( item );
|
|
}
|
|
|
|
void wxCheckListBox::Check(unsigned int item, bool check)
|
|
{
|
|
wxCHECK_RET( IsValid(item),
|
|
wxT("invalid index in wxCheckListBox::Check") );
|
|
|
|
bool isChecked = GetPeer()->MacIsChecked( item );
|
|
if ( check != isChecked )
|
|
{
|
|
GetPeer()->MacCheck( item , check );
|
|
}
|
|
}
|
|
|
|
wxMacCheckListControl* wxCheckListBox::GetPeer() const
|
|
{
|
|
wxMacDataBrowserCheckListControl *lb = wxDynamicCast(m_peer,wxMacDataBrowserCheckListControl);
|
|
return lb ? wx_static_cast(wxMacCheckListControl*,lb) : 0 ;
|
|
}
|
|
|
|
const short kCheckboxColumnId = 1026;
|
|
|
|
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 );
|
|
}
|
|
|
|
wxMacDataBrowserCheckListControl::~wxMacDataBrowserCheckListControl()
|
|
{
|
|
|
|
}
|
|
|
|
class wxMacCheckListBoxItem : public wxMacListBoxItem
|
|
{
|
|
public :
|
|
wxMacCheckListBoxItem()
|
|
{
|
|
m_isChecked = false;
|
|
}
|
|
|
|
virtual ~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->HandleWindowEvent( 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;
|
|
};
|
|
|
|
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);
|
|
}
|
|
|
|
bool wxMacDataBrowserCheckListControl::MacIsChecked( unsigned int n) const
|
|
{
|
|
wxMacCheckListBoxItem * item = wx_static_cast( wxMacCheckListBoxItem*, GetItemFromLine( n ) );
|
|
return item->IsChecked();
|
|
}
|
|
|
|
|
|
|
|
#endif // wxUSE_CHECKLISTBOX
|