///////////////////////////////////////////////////////////////////////////////
-// Name: checklst.cpp
+// Name: src/mac/carbon/checklst.cpp
// Purpose: implementation of wxCheckListBox class
// Author: Stefan Csomor
-// Modified by:
+// Modified by:
// Created: 1998-01-01
// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
+//
+// new DataBrowser-based version
-// ============================================================================
-// headers & declarations
-// ============================================================================
-#ifdef __GNUG__
-#pragma implementation "checklst.h"
-#endif
-
-#include "wx/defs.h"
+#include "wx/wxprec.h"
#if wxUSE_CHECKLISTBOX
#include "wx/checklst.h"
+#include "wx/arrstr.h"
#include "wx/mac/uma.h"
-#include "Appearance.h"
-// ============================================================================
-// implementation of wxCheckListBoxBase
-// ============================================================================
-
-wxCheckListBoxBase::wxCheckListBoxBase()
-{
-}
-
-// ============================================================================
-// implementation of wxCheckListBox
-// ============================================================================
+#ifndef __DARWIN__
+#include <Appearance.h>
+#endif
IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox)
-const short kwxMacListWithVerticalScrollbar = 128 ;
-const short kwxMacListItemHeight = 14 ;
-const short kwxMacListCheckboxWidth = 14 ;
+BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
+END_EVENT_TABLE()
-#if PRAGMA_STRUCT_ALIGN
- #pragma options align=mac68k
-#elif PRAGMA_STRUCT_PACKPUSH
- #pragma pack(push, 2)
-#elif PRAGMA_STRUCT_PACK
- #pragma pack(2)
-#endif
+const short kTextColumnId = 1024;
+const short kCheckboxColumnId = 1025;
-typedef struct {
- unsigned short instruction;
- void (*function)();
-} ldefRec, *ldefPtr, **ldefHandle;
-
-#if PRAGMA_STRUCT_ALIGN
- #pragma options align=reset
-#elif PRAGMA_STRUCT_PACKPUSH
- #pragma pack(pop)
-#elif PRAGMA_STRUCT_PACK
- #pragma pack()
-#endif
-extern "C"
+void wxCheckListBox::Init()
{
-static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, Rect *drawRect,
- Cell cell, short dataOffset, short dataLength,
- ListHandle listHandle ) ;
}
-static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, Rect *drawRect,
- Cell cell, short dataOffset, short dataLength,
- ListHandle listHandle )
+bool wxCheckListBox::Create(
+ wxWindow *parent,
+ wxWindowID id,
+ const wxPoint &pos,
+ const wxSize &size,
+ const wxArrayString& choices,
+ long style,
+ const wxValidator& validator,
+ const wxString &name )
{
- GrafPtr savePort;
- GrafPtr grafPtr;
- RgnHandle savedClipRegion;
- SInt32 savedPenMode;
- wxCheckListBox* list;
- GetPort(&savePort);
- SetPort((**listHandle).port);
- grafPtr = (**listHandle).port ;
- // typecast our refCon
- list = (wxCheckListBox*) GetControlReference( (ControlHandle) GetListRefCon(listHandle) );
-
- // Calculate the cell rect.
-
- switch( message ) {
- case lInitMsg:
- break;
+ wxCArrayString chs( choices );
- case lCloseMsg:
- break;
+ return Create( parent, id, pos, size, chs.GetCount(), chs.GetStrings(), style, validator, name );
+}
- case lDrawMsg:
+#if TARGET_API_MAC_OSX
+static pascal void DataBrowserItemNotificationProc(
+ ControlRef browser,
+ DataBrowserItemID itemID,
+ DataBrowserItemNotification message,
+ DataBrowserItemDataRef itemData )
+#else
+static pascal void DataBrowserItemNotificationProc(
+ ControlRef browser,
+ DataBrowserItemID itemID,
+ DataBrowserItemNotification message )
+#endif
+{
+ long ref = GetControlReference( browser );
+ if (ref != 0)
+ {
+ wxCheckListBox* list = wxDynamicCast( (wxObject*)ref, wxCheckListBox );
+ int i = itemID - 1;
+ if ((i >= 0) && (i < (int)list->GetCount()))
{
- const wxString text = list->m_stringArray[cell.v] ;
- int checked = list->m_checks[cell.v] ;
-
- // Save the current clip region, and set the clip region to the area we are about
- // to draw.
-
- savedClipRegion = NewRgn();
- GetClip( savedClipRegion );
-
- ClipRect( drawRect );
- EraseRect( drawRect );
-
- const wxFont& font = list->GetFont();
- if ( font.Ok() )
+ bool trigger = false;
+ wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
+ switch ( message )
{
- ::TextFont( font.GetMacFontNum() ) ;
- ::TextSize( font.GetMacFontSize()) ;
- ::TextFace( font.GetMacFontStyle() ) ;
+ case kDataBrowserItemDeselected:
+ if ( list->HasMultipleSelection() )
+ trigger = true;
+ break;
+
+ case kDataBrowserItemSelected:
+ trigger = true;
+ break;
+
+ case kDataBrowserItemDoubleClicked:
+ event.SetEventType( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED );
+ trigger = true;
+ break;
+
+ default:
+ break;
}
-
- ThemeButtonDrawInfo info ;
- info.state = kThemeStateActive ;
- info.value = checked ? kThemeButtonOn : kThemeButtonOff ;
- info.adornment = kThemeAdornmentNone ;
- Rect checkRect = *drawRect ;
-
-
- checkRect.left +=0 ;
- checkRect.top +=0 ;
- checkRect.right = checkRect.left + list->m_checkBoxWidth ;
- checkRect.bottom = checkRect.top + list->m_checkBoxHeight ;
- DrawThemeButton(&checkRect,kThemeCheckBox,
- &info,NULL,NULL, NULL,0);
-
- MoveTo(drawRect->left + 2 + list->m_checkBoxWidth+2, drawRect->top + list->m_TextBaseLineOffset );
-
- DrawText(text, 0 , text.Length());
- // If the cell is hilited, do the hilite now. Paint the cell contents with the
- // appropriate QuickDraw transform mode.
-
- if( isSelected ) {
- savedPenMode = GetPortPenMode( (CGrafPtr) grafPtr );
- SetPortPenMode( (CGrafPtr) grafPtr, hilitetransfermode );
- PaintRect( drawRect );
- SetPortPenMode( (CGrafPtr) grafPtr, savedPenMode );
+
+ if ( trigger )
+ {
+ event.SetEventObject( list );
+ if ( list->HasClientObjectData() )
+ event.SetClientObject( list->GetClientObject( i ) );
+ else if ( list->HasClientUntypedData() )
+ event.SetClientData( list->GetClientData( i ) );
+ event.SetString( list->GetString( i ) );
+ event.SetInt( i );
+ event.SetExtraLong( list->HasMultipleSelection() ? message == kDataBrowserItemSelected : true );
+ wxPostEvent( list->GetEventHandler(), event );
+
+ // direct notification is not always having the listbox GetSelection() having in sync with event
+ // list->GetEventHandler()->ProcessEvent( event );
}
-
- // Restore the saved clip region.
-
- SetClip( savedClipRegion );
- DisposeRgn( savedClipRegion );
}
- break;
- case lHiliteMsg:
-
- // Hilite or unhilite the cell. Paint the cell contents with the
- // appropriate QuickDraw transform mode.
-
- GetPort( &grafPtr );
- savedPenMode = GetPortPenMode( (CGrafPtr) grafPtr );
- SetPortPenMode( (CGrafPtr) grafPtr, hilitetransfermode );
- PaintRect( drawRect );
- SetPortPenMode( (CGrafPtr) grafPtr, savedPenMode );
- break;
- default :
- break ;
}
- SetPort(savePort);
}
-extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ;
-
-static ListDefUPP macCheckListDefUPP = NULL ;
-
-// ----------------------------------------------------------------------------
-// creation
-// ----------------------------------------------------------------------------
-
-void wxCheckListBox::Init()
+static pascal OSStatus ListBoxGetSetItemData(
+ ControlRef browser,
+ DataBrowserItemID itemID,
+ DataBrowserPropertyID property,
+ DataBrowserItemDataRef itemData,
+ Boolean changeValue )
{
-}
+ OSStatus err = errDataBrowserPropertyNotSupported;
-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)
-{
- if ( !wxCheckListBoxBase::Create(parent, id, pos, size,
- n, choices, style, validator, name) )
- return false;
+ if ( !changeValue )
+ {
+ switch (property)
+ {
+ case kTextColumnId:
+ {
+ long ref = GetControlReference( browser );
+ if (ref != 0)
+ {
+ wxCheckListBox* list = wxDynamicCast( (wxObject*) ref, wxCheckListBox );
+ int i = itemID - 1;
+ if ((i >= 0) && (i < (int)list->GetCount()))
+ {
+ wxMacCFStringHolder cf( list->GetString( i ), list->GetFont().GetEncoding() );
+ verify_noerr( ::SetDataBrowserItemDataText( itemData, cf ) );
+ err = noErr;
+ }
+ }
+ }
+ break;
- m_noItems = 0 ; // this will be increased by our append command
- m_selected = 0;
-
- m_checkBoxWidth = 12;
- m_checkBoxHeight= 10;
-
- long h = m_checkBoxHeight ;
-#if TARGET_CARBON
- GetThemeMetric(kThemeMetricCheckBoxWidth,(long *)&m_checkBoxWidth);
- GetThemeMetric(kThemeMetricCheckBoxHeight,&h);
-#endif
+ case kCheckboxColumnId:
+ {
+ long ref = GetControlReference( browser );
+ if (ref != 0)
+ {
+ wxCheckListBox* list = wxDynamicCast( (wxObject*)ref, wxCheckListBox );
+ int i = itemID - 1;
+ if ((i >= 0) && (i < (int)list->GetCount()))
+ {
+ verify_noerr( ::SetDataBrowserItemDataButtonValue( itemData, list->IsChecked(i) ? kThemeButtonOn : kThemeButtonOff ) );
+ err = noErr;
+ }
+ }
+ }
+ break;
- const wxFont& font = GetFont();
+ case kDataBrowserItemIsEditableProperty:
+ {
+ err = ::SetDataBrowserItemDataBooleanValue( itemData, true );
+ }
+ break;
- FontInfo finfo;
- FetchFontInfo(font.GetMacFontNum(),font.GetMacFontSize(),font.GetMacFontStyle(),&finfo);
-
- m_TextBaseLineOffset= finfo.leading+finfo.ascent;
- m_checkBoxHeight= finfo.leading+finfo.ascent+finfo.descent;
-
- if (m_checkBoxHeight<h)
- {
- m_TextBaseLineOffset+= (h-m_checkBoxHeight)/2;
- m_checkBoxHeight= h;
+ default:
+ break;
+ }
}
-
- Rect bounds ;
- Str255 title ;
-
- MacPreControlCreate( parent , id , wxEmptyString , pos , size ,style, validator , name , &bounds , title ) ;
-
- ListDefSpec listDef;
- listDef.defType = kListDefUserProcType;
- if ( macCheckListDefUPP == NULL )
+ else
{
- macCheckListDefUPP = NewListDefUPP( wxMacCheckListDefinition );
- }
- listDef.u.userProc = macCheckListDefUPP ;
+ switch ( property )
+ {
+ case kCheckboxColumnId:
+ {
+ long ref = GetControlReference( browser );
+ if (ref != 0)
+ {
+ wxCheckListBox* list = wxDynamicCast( (wxObject*) ref, wxCheckListBox );
+ int i = itemID - 1;
+ if ((i >= 0) && (i < (int)list->GetCount()))
+ {
+ // we have to change this behind the back, since Check() would be triggering another update round
+ bool newVal = !list->IsChecked(i);
+ verify_noerr( ::SetDataBrowserItemDataButtonValue( itemData, newVal ? kThemeButtonOn : kThemeButtonOff ) );
+ err = noErr;
+ list->m_checks[i] = newVal;
+
+ wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, list->GetId());
+ event.SetInt( i );
+ event.SetEventObject( list );
+ list->GetEventHandler()->ProcessEvent( event );
+ }
+ }
+ }
+ break;
-#if TARGET_CARBON
- Size asize;
+ default:
+ break;
+ }
+ }
+ return err;
+}
- CreateListBoxControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, false, 0, 1, false, true,
- m_checkBoxHeight+2, 14, false, &listDef, (ControlRef *)&m_macControl );
+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;
- GetControlData( (ControlHandle) m_macControl, kControlNoPart, kControlListBoxListHandleTag,
- sizeof(ListHandle), (Ptr) &m_macList, &asize);
+ wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED),
+ wxT("only one of listbox selection modes can be specified") );
- SetControlReference( (ControlHandle) m_macControl, (long) this);
- SetControlVisibility( (ControlHandle) m_macControl, false, false);
+ if ( !wxListBoxBase::Create( parent, id, pos, size, style & ~(wxHSCROLL | wxVSCROLL), validator, name ) )
+ return false;
-#else
+ // this will be increased by our Append command
+ m_noItems = 0;
+ m_selected = 0;
- long result ;
+ Rect bounds = wxMacGetBoundsForControl( this, pos, size );
- wxStAppResource resload ;
- m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false ,
- kwxMacListWithVerticalScrollbar , 0 , 0,
- kControlListBoxProc , (long) this ) ;
- ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxListHandleTag ,
- sizeof( ListHandle ) , (char*) &m_macList , &result ) ;
+ m_peer = new wxMacControl( this );
+ OSStatus err = ::CreateDataBrowserControl(
+ MAC_WXHWND(parent->MacGetTopLevelWindowRef()),
+ &bounds, kDataBrowserListView, m_peer->GetControlRefAddr() );
+ verify_noerr( err );
- HLock( (Handle) m_macList ) ;
- ldefHandle ldef ;
- ldef = (ldefHandle) NewHandle( sizeof(ldefRec) ) ;
- if ( (**(ListHandle)m_macList).listDefProc != NULL )
- {
- (**ldef).instruction = 0x4EF9; /* JMP instruction */
- (**ldef).function = (void(*)()) listDef.u.userProc;
- (**(ListHandle)m_macList).listDefProc = (Handle) ldef ;
- }
-
- Point pt = (**(ListHandle)m_macList).cellSize ;
- pt.v = 14 ;
- LCellSize( pt , (ListHandle)m_macList ) ;
- LAddColumn( 1 , 0 , (ListHandle)m_macList ) ;
-#endif
- OptionBits options = 0;
+ DataBrowserSelectionFlags options = kDataBrowserDragSelect;
if ( style & wxLB_MULTIPLE )
{
- options += lNoExtend ;
+ options |= kDataBrowserAlwaysExtendSelection | kDataBrowserCmdTogglesSelection;
}
else if ( style & wxLB_EXTENDED )
{
- options += lExtendDrag ;
+ // default behaviour
}
else
{
- options = (OptionBits) lOnlyOne ;
+ options |= kDataBrowserSelectOnlyOne;
}
- SetListSelectionFlags((ListHandle)m_macList, options);
-
- MacPostControlCreate() ;
-
- for ( int i = 0 ; i < n ; i++ )
+
+ err = m_peer->SetSelectionFlags( options );
+ verify_noerr( err );
+
+ 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; // CFSTR( "" );
+
+ // check column
+
+ columnDesc.headerBtnDesc.minimumWidth = 30;
+ columnDesc.headerBtnDesc.maximumWidth = 30;
+
+ columnDesc.propertyDesc.propertyID = kCheckboxColumnId;
+ columnDesc.propertyDesc.propertyType = kDataBrowserCheckboxType;
+ columnDesc.propertyDesc.propertyFlags =
+ kDataBrowserPropertyIsMutable
+ | kDataBrowserTableViewSelectionColumn
+ | kDataBrowserDefaultPropertyFlags;
+ err = m_peer->AddListViewColumn( &columnDesc, kDataBrowserListViewAppendColumn );
+ verify_noerr( err );
+
+ // text column
+
+ columnDesc.headerBtnDesc.minimumWidth = 0;
+ columnDesc.headerBtnDesc.maximumWidth = 10000;
+
+ columnDesc.propertyDesc.propertyID = kTextColumnId;
+ columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
+ columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+ | kDataBrowserListViewTypeSelectColumn
+#endif
+ ;
+
+ verify_noerr( m_peer->AddListViewColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
+
+ verify_noerr( m_peer->AutoSizeListViewColumns() );
+ verify_noerr( m_peer->SetHasScrollBars( false, true ) );
+ verify_noerr( m_peer->SetTableViewHiliteStyle( kDataBrowserTableViewFillHilite ) );
+ verify_noerr( m_peer->SetListViewHeaderBtnHeight( 0 ) );
+
+ DataBrowserCallbacks callbacks;
+ callbacks.version = kDataBrowserLatestCallbacks;
+ InitDataBrowserCallbacks( &callbacks );
+ callbacks.u.v1.itemDataCallback = NewDataBrowserItemDataUPP( &ListBoxGetSetItemData );
+ callbacks.u.v1.itemNotificationCallback =
+#if TARGET_API_MAC_OSX
+ (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP( &DataBrowserItemNotificationProc );
+#else
+ NewDataBrowserItemNotificationUPP( &DataBrowserItemNotificationProc );
+#endif
+ m_peer->SetCallbacks( &callbacks );
+
+#if 0
+ // shouldn't be necessary anymore under 10.2
+ m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean)false );
+ m_peer->SetNeedsFocusRect( true );
+#endif
+
+ MacPostControlCreate( pos, size );
+
+ for ( int i = 0; i < n; i++ )
{
- Append( choices[i] ) ;
+ Append( choices[i] );
}
-
- LSetDrawingMode( true , (ListHandle) m_macList ) ;
- return TRUE;
+ // Needed because it is a wxControlWithItems
+ SetBestSize( size );
+
+ return true;
}
// ----------------------------------------------------------------------------
// wxCheckListBox functions
// ----------------------------------------------------------------------------
-bool wxCheckListBox::IsChecked(size_t item) const
+bool wxCheckListBox::IsChecked(unsigned int item) const
{
- wxCHECK_MSG( item < m_checks.GetCount(), FALSE,
- _T("invalid index in wxCheckListBox::IsChecked") );
+ wxCHECK_MSG( IsValid(item), false,
+ wxT("invalid index in wxCheckListBox::IsChecked") );
return m_checks[item] != 0;
}
-void wxCheckListBox::Check(size_t item, bool check)
+void wxCheckListBox::Check(unsigned int item, bool check)
{
- wxCHECK_RET( item < m_checks.GetCount(),
- _T("invalid index in wxCheckListBox::Check") );
+ wxCHECK_RET( IsValid(item),
+ wxT("invalid index in wxCheckListBox::Check") );
- // intermediate var is needed to avoid compiler warning with VC++
bool isChecked = m_checks[item] != 0;
if ( check != isChecked )
{
m_checks[item] = check;
-
- MacRedrawControl() ;
+ UInt32 id = item + 1;
+ OSStatus err = m_peer->UpdateItems(
+ kDataBrowserNoItem, 1, &id,
+ kDataBrowserItemNoProperty, kDataBrowserItemNoProperty );
+ verify_noerr( err );
}
}
// ----------------------------------------------------------------------------
-// methods forwarded to wxListBox
+// methods forwarded to wxCheckListBox
// ----------------------------------------------------------------------------
-void wxCheckListBox::Delete(int n)
+void wxCheckListBox::Delete(unsigned int n)
{
- wxCHECK_RET( n < GetCount(), _T("invalid index in wxListBox::Delete") );
+ wxCHECK_RET( IsValid(n), wxT("invalid index in wxCheckListBox::Delete") );
- wxListBox::Delete(n);
-
- m_checks.RemoveAt(n);
+ wxListBox::Delete( n );
+ m_checks.RemoveAt( n );
}
int wxCheckListBox::DoAppend(const wxString& item)
{
- LSetDrawingMode( false , (ListHandle) m_macList ) ;
- int pos = wxListBox::DoAppend(item);
+ int pos = wxListBox::DoAppend( item );
// the item is initially unchecked
- m_checks.Insert(FALSE, pos);
- LSetDrawingMode( true , (ListHandle) m_macList ) ;
+ m_checks.Insert( false, pos );
return pos;
}
-void wxCheckListBox::DoInsertItems(const wxArrayString& items, int pos)
+void wxCheckListBox::DoInsertItems(const wxArrayString& items, unsigned int pos)
{
- wxListBox::DoInsertItems(items, pos);
+ wxListBox::DoInsertItems( items, pos );
- size_t count = items.GetCount();
- for ( size_t n = 0; n < count; n++ )
+ unsigned int count = items.GetCount();
+ for ( unsigned int n = 0; n < count; n++ )
{
- m_checks.Insert(FALSE, pos + n);
+ 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);
+ wxListBox::DoSetItems( items, clientData );
- size_t count = items.GetCount();
- for ( size_t n = 0; n < count; n++ )
+ unsigned int count = items.GetCount();
+ for ( unsigned int n = 0; n < count; n++ )
{
- m_checks.Add(FALSE);
+ m_checks.Add( false );
}
}
m_checks.Empty();
}
-BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
- EVT_CHAR(wxCheckListBox::OnChar)
- EVT_LEFT_DOWN(wxCheckListBox::OnLeftClick)
-END_EVENT_TABLE()
-
-// this will only work as soon as
-
-void wxCheckListBox::OnChar(wxKeyEvent& event)
-{
- if ( event.GetKeyCode() == WXK_SPACE )
- {
- int index = GetSelection() ;
- if ( index >= 0 )
- {
- Check(index, !IsChecked(index) ) ;
- wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId());
- event.SetInt(index);
- event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
- }
- }
- else
- event.Skip();
-}
-
-void wxCheckListBox::OnLeftClick(wxMouseEvent& event)
-{
- // clicking on the item selects it, clicking on the checkmark toggles
- if ( event.GetX() <= 20 /*check width*/ ) {
- int lineheight ;
- int topcell ;
-#if TARGET_CARBON
- Point pt ;
- GetListCellSize( (ListHandle)m_macList , &pt ) ;
- lineheight = pt.v ;
- ListBounds visible ;
- GetListVisibleCells( (ListHandle)m_macList , &visible ) ;
- topcell = visible.top ;
-#else
- lineheight = (**(ListHandle)m_macList).cellSize.v ;
- topcell = (**(ListHandle)m_macList).visible.top ;
-#endif
- size_t nItem = ((size_t)event.GetY()) / lineheight + topcell ;
-
- if ( nItem < (size_t)m_noItems )
- {
- Check(nItem, !IsChecked(nItem) ) ;
- wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId());
- event.SetInt(nItem);
- event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
- }
- //else: it's not an error, just click outside of client zone
- }
- else {
- // implement default behaviour: clicking on the item selects it
- event.Skip();
- }
-}
-
#endif // wxUSE_CHECKLISTBOX