X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/76a5e5d21ee1a6230d777ce0209b2df4c6075f0f..e71800ba3a40711f6c6c2461ed10cd6f2502c1d1:/src/mac/carbon/checklst.cpp?ds=inline diff --git a/src/mac/carbon/checklst.cpp b/src/mac/carbon/checklst.cpp index 743fea9aac..cb7c4a818f 100644 --- a/src/mac/carbon/checklst.cpp +++ b/src/mac/carbon/checklst.cpp @@ -1,11 +1,11 @@ /////////////////////////////////////////////////////////////////////////////// // Name: checklst.cpp // Purpose: implementation of wxCheckListBox class -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: -// Created: ??/??/98 +// Created: 1998-01-01 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR +// Copyright: (c) Stefan Csomor // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -22,6 +22,7 @@ #if wxUSE_CHECKLISTBOX #include "wx/checklst.h" +#include "wx/arrstr.h" #include "wx/mac/uma.h" #include "Appearance.h" @@ -36,11 +37,27 @@ const short kwxMacListWithVerticalScrollbar = 128 ; const short kwxMacListItemHeight = 14 ; const short kwxMacListCheckboxWidth = 14 ; +#if PRAGMA_STRUCT_ALIGN + #pragma options align=mac68k +#elif PRAGMA_STRUCT_PACKPUSH + #pragma pack(push, 2) +#elif PRAGMA_STRUCT_PACK + #pragma pack(2) +#endif + 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" { static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, Rect *drawRect, @@ -52,15 +69,14 @@ static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, Cell cell, short dataOffset, short dataLength, ListHandle listHandle ) { - FontInfo fontInfo; GrafPtr savePort; GrafPtr grafPtr; RgnHandle savedClipRegion; SInt32 savedPenMode; wxCheckListBox* list; - GetPort(&savePort); - SetPort((**listHandle).port); - grafPtr = (**listHandle).port ; + GetPort(&savePort); + SetPort((**listHandle).port); + grafPtr = (**listHandle).port ; // typecast our refCon list = (wxCheckListBox*) GetControlReference( (ControlHandle) GetListRefCon(listHandle) ); @@ -87,24 +103,31 @@ static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, ClipRect( drawRect ); EraseRect( drawRect ); - ::TextFont( kFontIDMonaco ) ; - ::TextSize( 9 ); - ::TextFace( 0 ) ; + const wxFont& font = list->GetFont(); + if ( font.Ok() ) + { + ::TextFont( font.GetMacFontNum() ) ; + ::TextSize( font.GetMacFontSize()) ; + ::TextFace( font.GetMacFontStyle() ) ; + } + 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 ; + 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 + 4 + kwxMacListCheckboxWidth, drawRect->top + 10 ); - - DrawText(text, 0 , text.Length()); + &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. @@ -119,8 +142,8 @@ static pascal void wxMacCheckListDefinition( short message, Boolean isSelected, SetClip( savedClipRegion ); DisposeRgn( savedClipRegion ); - } - break; + } + break; case lHiliteMsg: // Hilite or unhilite the cell. Paint the cell contents with the @@ -150,6 +173,21 @@ 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, @@ -160,13 +198,40 @@ bool wxCheckListBox::Create(wxWindow *parent, const wxValidator& validator, const wxString &name) { + if ( !wxCheckListBoxBase::Create(parent, id, pos, size, + n, choices, style, validator, name) ) + return false; + 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 + + const wxFont& font = GetFont(); + + 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_checkBoxHeightMacGetRootWindow(), &bounds, false, 0, 1, false, true, - 14, 14, false, &listDef, &m_macControl ); + CreateListBoxControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, false, 0, 1, false, true, + m_checkBoxHeight+2, 14, false, &listDef, (ControlRef *)&m_macControl ); GetControlData( (ControlHandle) m_macControl, kControlNoPart, kControlListBoxListHandleTag, sizeof(ListHandle), (Ptr) &m_macList, &asize); @@ -193,6 +258,7 @@ bool wxCheckListBox::Create(wxWindow *parent, long result ; + wxStAppResource resload ; m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false , kwxMacListWithVerticalScrollbar , 0 , 0, kControlListBoxProc , (long) this ) ; @@ -225,7 +291,7 @@ bool wxCheckListBox::Create(wxWindow *parent, } else { - options = lOnlyOne ; + options = (OptionBits) lOnlyOne ; } SetListSelectionFlags((ListHandle)m_macList, options); @@ -283,10 +349,12 @@ void wxCheckListBox::Delete(int n) int wxCheckListBox::DoAppend(const wxString& item) { + LSetDrawingMode( false , (ListHandle) m_macList ) ; int pos = wxListBox::DoAppend(item); // the item is initially unchecked m_checks.Insert(FALSE, pos); + LSetDrawingMode( true , (ListHandle) m_macList ) ; return pos; } @@ -328,55 +396,55 @@ END_EVENT_TABLE() void wxCheckListBox::OnChar(wxKeyEvent& event) { - if ( event.KeyCode() == WXK_SPACE ) - { - int index = GetSelection() ; - if ( index >= 0 ) + if ( event.GetKeyCode() == WXK_SPACE ) { - Check(index, !IsChecked(index) ) ; - wxCommandEvent event(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, GetId()); - event.SetInt(index); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + 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(); + 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 ; + // 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( m_macList , &pt ) ; - lineheight = pt.v ; - ListBounds visible ; - GetListVisibleCells( m_macList , &visible ) ; - topcell = visible.top ; + 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 ; + 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); + 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(); } - //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