]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/checklst.cpp
check that the version of __sync_sub_and_fetch that returns a value is supported...
[wxWidgets.git] / src / mac / carbon / checklst.cpp
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: src/mac/carbon/checklst.cpp
3// Purpose: implementation of wxCheckListBox class
4// Author: Stefan Csomor
5// Modified by:
6// Created: 1998-01-01
7// RCS-ID: $Id$
8// Copyright: (c) Stefan Csomor
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11//
12// new DataBrowser-based version
13
14
15#include "wx/wxprec.h"
16
17#if wxUSE_CHECKLISTBOX
18
19#include "wx/checklst.h"
20
21#ifndef WX_PRECOMP
22 #include "wx/arrstr.h"
23#endif
24
25#include "wx/mac/uma.h"
26
27IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox)
28
29BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
30END_EVENT_TABLE()
31
32class wxMacDataBrowserCheckListControl : public wxMacDataBrowserListControl , public wxMacCheckListControl
33{
34public:
35 wxMacDataBrowserCheckListControl( wxListBox *peer, const wxPoint& pos, const wxSize& size, long style );
36 wxMacDataBrowserCheckListControl() {}
37 virtual ~wxMacDataBrowserCheckListControl();
38
39 virtual wxMacDataItem* CreateItem();
40
41 virtual bool MacIsChecked(unsigned int n) const;
42 virtual void MacCheck(unsigned int n, bool bCheck = true);
43 DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacDataBrowserCheckListControl)
44};
45
46IMPLEMENT_DYNAMIC_CLASS( wxMacDataBrowserCheckListControl , wxMacDataBrowserListControl )
47
48void wxCheckListBox::Init()
49{
50}
51
52bool wxCheckListBox::Create(
53 wxWindow *parent,
54 wxWindowID id,
55 const wxPoint &pos,
56 const wxSize &size,
57 const wxArrayString& choices,
58 long style,
59 const wxValidator& validator,
60 const wxString &name )
61{
62 wxCArrayString chs( choices );
63
64 return Create( parent, id, pos, size, chs.GetCount(), chs.GetStrings(), style, validator, name );
65}
66
67bool wxCheckListBox::Create(
68 wxWindow *parent,
69 wxWindowID id,
70 const wxPoint& pos,
71 const wxSize& size,
72 int n,
73 const wxString choices[],
74 long style,
75 const wxValidator& validator,
76 const wxString& name )
77{
78 m_macIsUserPane = false;
79
80 wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED),
81 wxT("only one of listbox selection modes can be specified") );
82
83 if ( !wxListBoxBase::Create( parent, id, pos, size, style & ~(wxHSCROLL | wxVSCROLL), validator, name ) )
84 return false;
85
86 // this will be increased by our Append command
87 wxMacDataBrowserCheckListControl* control = new wxMacDataBrowserCheckListControl( this, pos, size, style );
88 // TODO CHECK control->SetClientDataType( m_clientDataItemsType );
89 m_peer = control;
90
91 MacPostControlCreate(pos,size);
92
93 InsertItems( n , choices , 0 );
94
95 // Needed because it is a wxControlWithItems
96 SetInitialSize( size );
97
98 return true;
99}
100
101// ----------------------------------------------------------------------------
102// wxCheckListBox functions
103// ----------------------------------------------------------------------------
104
105bool wxCheckListBox::IsChecked(unsigned int item) const
106{
107 wxCHECK_MSG( IsValid(item), false,
108 wxT("invalid index in wxCheckListBox::IsChecked") );
109
110 return GetPeer()->MacIsChecked( item );
111}
112
113void wxCheckListBox::Check(unsigned int item, bool check)
114{
115 wxCHECK_RET( IsValid(item),
116 wxT("invalid index in wxCheckListBox::Check") );
117
118 bool isChecked = GetPeer()->MacIsChecked( item );
119 if ( check != isChecked )
120 {
121 GetPeer()->MacCheck( item , check );
122 }
123}
124
125wxMacCheckListControl* wxCheckListBox::GetPeer() const
126{
127 wxMacDataBrowserCheckListControl *lb = wxDynamicCast(m_peer,wxMacDataBrowserCheckListControl);
128 return lb ? wx_static_cast(wxMacCheckListControl*,lb) : 0 ;
129}
130
131const short kCheckboxColumnId = 1026;
132
133wxMacDataBrowserCheckListControl::wxMacDataBrowserCheckListControl( wxListBox *peer, const wxPoint& pos, const wxSize& size, long style)
134 : wxMacDataBrowserListControl( peer, pos, size, style )
135{
136 OSStatus err = noErr;
137
138 DataBrowserListViewColumnDesc columnDesc;
139 columnDesc.headerBtnDesc.titleOffset = 0;
140 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
141
142 columnDesc.headerBtnDesc.btnFontStyle.flags =
143 kControlUseFontMask | kControlUseJustMask;
144
145 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
146 columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault;
147 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
148 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
149 columnDesc.headerBtnDesc.titleString = NULL;
150
151 columnDesc.headerBtnDesc.minimumWidth = 30;
152 columnDesc.headerBtnDesc.maximumWidth = 30;
153
154 columnDesc.propertyDesc.propertyID = kCheckboxColumnId;
155 columnDesc.propertyDesc.propertyType = kDataBrowserCheckboxType;
156 columnDesc.propertyDesc.propertyFlags =
157 kDataBrowserPropertyIsMutable
158 | kDataBrowserTableViewSelectionColumn
159 | kDataBrowserDefaultPropertyFlags;
160
161 err = AddColumn( &columnDesc, 0 );
162 verify_noerr( err );
163}
164
165wxMacDataBrowserCheckListControl::~wxMacDataBrowserCheckListControl()
166{
167
168}
169
170class wxMacCheckListBoxItem : public wxMacListBoxItem
171{
172public :
173 wxMacCheckListBoxItem()
174 {
175 m_isChecked = false;
176 }
177
178 virtual ~wxMacCheckListBoxItem()
179 {
180 }
181
182 virtual OSStatus GetSetData( wxMacDataItemBrowserControl *owner ,
183 DataBrowserPropertyID property,
184 DataBrowserItemDataRef itemData,
185 bool changeValue )
186 {
187 OSStatus err = errDataBrowserPropertyNotSupported;
188
189 wxCheckListBox *checklist = wxDynamicCast( owner->GetPeer() , wxCheckListBox );
190 wxCHECK_MSG( checklist != NULL , errDataBrowserPropertyNotSupported , wxT("wxCheckListBox expected"));
191
192 if ( !changeValue )
193 {
194 switch (property)
195 {
196 case kCheckboxColumnId:
197 verify_noerr(SetDataBrowserItemDataButtonValue( itemData, m_isChecked ? kThemeButtonOn : kThemeButtonOff ));
198 err = noErr;
199 break;
200
201 case kDataBrowserItemIsEditableProperty:
202 verify_noerr(SetDataBrowserItemDataBooleanValue( itemData, true ));
203 err = noErr;
204 break;
205
206 default:
207 break;
208 }
209 }
210 else
211 {
212 switch (property)
213 {
214 case kCheckboxColumnId:
215 {
216 // we have to change this behind the back, since Check() would be triggering another update round
217 bool newVal = !m_isChecked;
218 verify_noerr(SetDataBrowserItemDataButtonValue( itemData, newVal ? kThemeButtonOn : kThemeButtonOff ));
219 m_isChecked = newVal;
220 err = noErr;
221
222 wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, checklist->GetId() );
223 event.SetInt( owner->GetLineFromItem( this ) );
224 event.SetEventObject( checklist );
225 checklist->HandleWindowEvent( event );
226 }
227 break;
228
229 default:
230 break;
231 }
232 }
233
234 if ( err == errDataBrowserPropertyNotSupported )
235 err = wxMacListBoxItem::GetSetData( owner , property, itemData , changeValue);
236
237 return err;
238 }
239
240 void Check( bool check )
241 {
242 m_isChecked = check;
243 }
244 bool IsChecked() const
245 {
246 return m_isChecked;
247 }
248
249protected :
250 bool m_isChecked;
251};
252
253wxMacDataItem* wxMacDataBrowserCheckListControl::CreateItem()
254{
255 return new wxMacCheckListBoxItem();
256}
257
258void wxMacDataBrowserCheckListControl::MacCheck( unsigned int n, bool bCheck)
259{
260 wxMacCheckListBoxItem* item = wx_static_cast(wxMacCheckListBoxItem*, GetItemFromLine( n) );
261 item->Check( bCheck);
262 UpdateItem(wxMacDataBrowserRootContainer, item , kCheckboxColumnId);
263}
264
265bool wxMacDataBrowserCheckListControl::MacIsChecked( unsigned int n) const
266{
267 wxMacCheckListBoxItem * item = wx_static_cast( wxMacCheckListBoxItem*, GetItemFromLine( n ) );
268 return item->IsChecked();
269}
270
271
272
273#endif // wxUSE_CHECKLISTBOX