+IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox)
+
+const short kwxMacListWithVerticalScrollbar = 128 ;
+const short kwxMacListItemHeight = 14 ;
+const short kwxMacListCheckboxWidth = 14 ;
+
+typedef struct {
+ unsigned short instruction;
+ void (*function)();
+} ldefRec, *ldefPtr, **ldefHandle;
+
+extern "C"
+{
+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 )
+{
+ 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;
+
+ case lCloseMsg:
+ break;
+
+ case lDrawMsg:
+ {
+ 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 );
+
+ ::TextFont( kFontIDMonaco ) ;
+ ::TextSize( 9 );
+ ::TextFace( 0 ) ;
+ ThemeButtonDrawInfo info ;
+ info.state = kThemeStateActive ;
+ info.value = checked ? kThemeButtonOn : kThemeButtonOff ;
+ info.adornment = kThemeAdornmentNone ;
+ Rect checkRect = *drawRect ;
+ checkRect.left +=0 ;
+ checkRect.top +=2 ;
+ checkRect.right = checkRect.left + 12 ;
+ checkRect.bottom = checkRect.top + 10 ;
+ DrawThemeButton(&checkRect,kThemeCheckBox,
+ &info,NULL,NULL, NULL,0);
+
+ MoveTo(drawRect->left + 4 + kwxMacListCheckboxWidth, drawRect->top + 10 );
+
+ 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 );
+ }
+
+ // 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()
+{
+}
+
+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_noItems = 0 ; // this will be increased by our append command
+ m_selected = 0;
+
+ Rect bounds ;
+ Str255 title ;
+
+ MacPreControlCreate( parent , id , "" , pos , size ,style, validator , name , &bounds , title ) ;
+
+ ListDefSpec listDef;
+ listDef.defType = kListDefUserProcType;
+ if ( macCheckListDefUPP == NULL )
+ {
+ macCheckListDefUPP = NewListDefUPP( wxMacCheckListDefinition );
+ }
+ listDef.u.userProc = macCheckListDefUPP ;
+
+#if TARGET_CARBON
+ Size asize;
+
+
+ CreateListBoxControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, false, 0, 1, false, true,
+ 14, 14, false, &listDef, (ControlRef *)&m_macControl );
+
+ GetControlData( (ControlHandle) m_macControl, kControlNoPart, kControlListBoxListHandleTag,
+ sizeof(ListHandle), (Ptr) &m_macList, &asize);
+
+ SetControlReference( (ControlHandle) m_macControl, (long) this);
+ SetControlVisibility( (ControlHandle) m_macControl, false, false);
+
+#else
+
+ long result ;
+
+ 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 ) ;
+
+ 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 ) ;