]> git.saurik.com Git - wxWidgets.git/blame - src/osx/carbon/listbox.cpp
Applied #10858: wxListCtrl on Mac does not route Freeze/Thaw/Update to m_genericImpl
[wxWidgets.git] / src / osx / carbon / listbox.cpp
CommitLineData
489468fe 1///////////////////////////////////////////////////////////////////////////////
524c47aa 2// Name: src/osx/carbon/listbox.cpp
489468fe
SC
3// Purpose: wxListBox
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#include "wx/wxprec.h"
13
14#if wxUSE_LISTBOX
15
16#include "wx/listbox.h"
17
18#ifndef WX_PRECOMP
19 #include "wx/log.h"
20 #include "wx/intl.h"
21 #include "wx/utils.h"
22 #include "wx/settings.h"
23 #include "wx/arrstr.h"
24 #include "wx/dcclient.h"
25#endif
26
524c47aa 27#include "wx/osx/private.h"
489468fe
SC
28
29// ============================================================================
30// list box control implementation
31// ============================================================================
32
03647350
VZ
33wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer,
34 wxWindowMac* WXUNUSED(parent),
35 wxWindowID WXUNUSED(id),
36 const wxPoint& pos,
524c47aa 37 const wxSize& size,
03647350 38 long style,
a4fec5b4 39 long WXUNUSED(extraStyle))
489468fe 40{
524c47aa 41 wxMacDataBrowserListControl* control = new wxMacDataBrowserListControl( wxpeer, pos, size, style );
489468fe 42 // TODO CHECK control->SetClientDataType( m_clientDataItemsType );
524c47aa 43 return control;
489468fe
SC
44}
45
46int wxListBox::DoListHitTest(const wxPoint& inpoint) const
47{
48 OSStatus err;
49
50 // There are few reasons why this is complicated:
51 // 1) There is no native HitTest function for Mac
52 // 2) GetDataBrowserItemPartBounds only works on visible items
53 // 3) We can't do it through GetDataBrowserTableView[Item]RowHeight
54 // because what it returns is basically inaccurate in the context
55 // of the coordinates we want here, but we use this as a guess
56 // for where the first visible item lies
57
58 wxPoint point = inpoint;
59
60 // get column property ID (req. for call to itempartbounds)
61 DataBrowserTableViewColumnID colId = 0;
62 err = GetDataBrowserTableViewColumnProperty(m_peer->GetControlRef(), 0, &colId);
63 wxCHECK_MSG(err == noErr, wxNOT_FOUND, wxT("Unexpected error from GetDataBrowserTableViewColumnProperty"));
64
65 // OK, first we need to find the first visible item we have -
66 // this will be the "low" for our binary search. There is no real
67 // easy way around this, as we will need to do a SLOW linear search
68 // until we find a visible item, but we can do a cheap calculation
69 // via the row height to speed things up a bit
70 UInt32 scrollx, scrolly;
71 err = GetDataBrowserScrollPosition(m_peer->GetControlRef(), &scrollx, &scrolly);
72 wxCHECK_MSG(err == noErr, wxNOT_FOUND, wxT("Unexpected error from GetDataBrowserScrollPosition"));
73
74 UInt16 height;
75 err = GetDataBrowserTableViewRowHeight(m_peer->GetControlRef(), &height);
76 wxCHECK_MSG(err == noErr, wxNOT_FOUND, wxT("Unexpected error from GetDataBrowserTableViewRowHeight"));
77
78 // these indices are 0-based, as usual, so we need to add 1 to them when
79 // passing them to data browser functions which use 1-based indices
80 int low = scrolly / height,
81 high = GetCount() - 1;
82
83 // search for the first visible item (note that the scroll guess above
84 // is the low bounds of where the item might lie so we only use that as a
85 // starting point - we should reach it within 1 or 2 iterations of the loop)
86 while ( low <= high )
87 {
88 Rect bounds;
89 err = GetDataBrowserItemPartBounds(
90 m_peer->GetControlRef(), low + 1, colId,
91 kDataBrowserPropertyEnclosingPart,
92 &bounds); // note +1 to translate to Mac ID
93 if ( err == noErr )
94 break;
95
96 // errDataBrowserItemNotFound is expected as it simply means that the
97 // item is not currently visible -- but other errors are not
98 wxCHECK_MSG( err == errDataBrowserItemNotFound, wxNOT_FOUND,
99 wxT("Unexpected error from GetDataBrowserItemPartBounds") );
100
101 low++;
102 }
103
104 // NOW do a binary search for where the item lies, searching low again if
105 // we hit an item that isn't visible
106 while ( low <= high )
107 {
108 int mid = (low + high) / 2;
109
110 Rect bounds;
111 err = GetDataBrowserItemPartBounds(
112 m_peer->GetControlRef(), mid + 1, colId,
113 kDataBrowserPropertyEnclosingPart,
114 &bounds); //note +1 to trans to mac id
115 wxCHECK_MSG( err == noErr || err == errDataBrowserItemNotFound,
116 wxNOT_FOUND,
117 wxT("Unexpected error from GetDataBrowserItemPartBounds") );
118
119 if ( err == errDataBrowserItemNotFound )
120 {
121 // item not visible, attempt to find a visible one
122 // search lower
123 high = mid - 1;
124 }
125 else // visible item, do actual hitttest
126 {
127 // if point is within the bounds, return this item (since we assume
128 // all x coords of items are equal we only test the x coord in
129 // equality)
130 if ((point.x >= bounds.left && point.x <= bounds.right) &&
131 (point.y >= bounds.top && point.y <= bounds.bottom) )
132 {
133 // found!
134 return mid;
135 }
136
137 if ( point.y < bounds.top )
138 // index(bounds) greater then key(point)
139 high = mid - 1;
140 else
141 // index(bounds) less then key(point)
142 low = mid + 1;
143 }
144 }
145
146 return wxNOT_FOUND;
147}
148
149// ============================================================================
150// data browser based implementation
151// ============================================================================
152
153wxMacListBoxItem::wxMacListBoxItem()
154 :wxMacDataItem()
155{
156}
157
158wxMacListBoxItem::~wxMacListBoxItem()
159{
160}
161
524c47aa
SC
162OSStatus wxMacListBoxItem::GetSetData(wxMacDataItemBrowserControl *owner ,
163 DataBrowserPropertyID property,
164 DataBrowserItemDataRef itemData,
165 bool changeValue )
166{
167 wxMacDataBrowserListControl *lb = wxDynamicCast(owner,wxMacDataBrowserListControl);
168 OSStatus err = errDataBrowserPropertyNotSupported;
169 if ( !changeValue )
170 {
171 if ( property >= kMinColumnId )
172 {
173 wxMacDataBrowserColumn* col = lb->GetColumnFromProperty( property );
174 unsigned int n = owner->GetLineFromItem( this );
175 wxListBox *list = wxDynamicCast( owner->GetWXPeer() , wxListBox );
176 wxMacDataBrowserCellValue valueholder(itemData);
177 list->GetValueCallback( n , col, valueholder );
03647350 178
524c47aa
SC
179 err = noErr;
180 }
181 else
182 {
183 if ( property == kDataBrowserItemIsEditableProperty )
184 {
185 DataBrowserPropertyID propertyToEdit ;
186 GetDataBrowserItemDataProperty( itemData, &propertyToEdit );
187 wxMacDataBrowserColumn* col = lb->GetColumnFromProperty( propertyToEdit );
188
189 verify_noerr(SetDataBrowserItemDataBooleanValue( itemData, col->IsEditable() ));
190 err = noErr;
191 }
192
193 }
03647350 194
524c47aa
SC
195 }
196 else
197 {
198 if ( property >= kMinColumnId )
199 {
200 wxMacDataBrowserColumn* col = lb->GetColumnFromProperty( property );
201
202 unsigned int n = owner->GetLineFromItem( this );
203 wxListBox *list = wxDynamicCast( owner->GetWXPeer() , wxListBox );
204 wxMacDataBrowserCellValue valueholder(itemData);
205 list->SetValueCallback( n , col, valueholder );
206
207 /*
208 // we have to change this behind the back, since Check() would be triggering another update round
209 bool newVal = !m_isChecked;
210 verify_noerr(SetDataBrowserItemDataButtonValue( itemData, newVal ? kThemeButtonOn : kThemeButtonOff ));
211 m_isChecked = newVal;
212 err = noErr;
213
214 wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, checklist->GetId() );
215 event.SetInt( owner->GetLineFromItem( this ) );
216 event.SetEventObject( checklist );
217 checklist->HandleWindowEvent( event );
218
219 */
220 err = noErr;
221 }
222 }
223
224 // call inherited if not ours
225 if ( err == errDataBrowserPropertyNotSupported )
226 {
227 err = wxMacDataItem::GetSetData(owner, property, itemData, changeValue);
228 }
03647350 229
524c47aa
SC
230 return err;
231}
232
489468fe
SC
233void wxMacListBoxItem::Notification(wxMacDataItemBrowserControl *owner ,
234 DataBrowserItemNotification message,
235 DataBrowserItemDataRef WXUNUSED(itemData) ) const
236{
237 wxMacDataBrowserListControl *lb = wxDynamicCast(owner,wxMacDataBrowserListControl);
238
239 // we want to depend on as little as possible to make sure tear-down of controls is safe
240
241 if ( message == kDataBrowserItemRemoved)
242 {
489468fe
SC
243 delete this;
244 return;
245 }
246
524c47aa 247 wxListBox *list = wxDynamicCast( lb->GetWXPeer() , wxListBox );
489468fe
SC
248 wxCHECK_RET( list != NULL , wxT("Listbox expected"));
249
250 if (message == kDataBrowserItemDoubleClicked)
251 {
524c47aa 252 unsigned int n = owner->GetLineFromItem( this );
21267321 253 list->HandleLineEvent( n, true );
489468fe
SC
254 return;
255 }
256}
257
258IMPLEMENT_DYNAMIC_CLASS( wxMacDataBrowserListControl , wxMacDataItemBrowserControl )
259
260wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxWindow *peer, const wxPoint& pos, const wxSize& size, long style)
261 : wxMacDataItemBrowserControl( peer, pos, size, style )
262{
524c47aa 263 m_nextColumnId = 0 ;
03647350 264
489468fe
SC
265 OSStatus err = noErr;
266 m_clientDataItemsType = wxClientData_None;
267 if ( style & wxLB_SORT )
268 m_sortOrder = SortOrder_Text_Ascending;
269
270 DataBrowserSelectionFlags options = kDataBrowserDragSelect;
271 if ( style & wxLB_MULTIPLE )
272 {
273 options |= kDataBrowserAlwaysExtendSelection | kDataBrowserCmdTogglesSelection;
274 }
275 else if ( style & wxLB_EXTENDED )
276 {
277 options |= kDataBrowserCmdTogglesSelection;
278 }
279 else
280 {
281 options |= kDataBrowserSelectOnlyOne;
282 }
283 err = SetSelectionFlags( options );
284 verify_noerr( err );
285
286 DataBrowserListViewColumnDesc columnDesc;
287 columnDesc.headerBtnDesc.titleOffset = 0;
288 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
289
290 columnDesc.headerBtnDesc.btnFontStyle.flags =
291 kControlUseFontMask | kControlUseJustMask;
292
293 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
294 columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault;
295 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
296 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
297 columnDesc.headerBtnDesc.titleString = NULL;
524c47aa 298/*
489468fe
SC
299 columnDesc.headerBtnDesc.minimumWidth = 0;
300 columnDesc.headerBtnDesc.maximumWidth = 10000;
301
302 columnDesc.propertyDesc.propertyID = kTextColumnId;
303 columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
304 columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
305 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
306
307 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
524c47aa 308*/
489468fe
SC
309 columnDesc.headerBtnDesc.minimumWidth = 0;
310 columnDesc.headerBtnDesc.maximumWidth = 0;
311 columnDesc.propertyDesc.propertyID = kNumericOrderColumnId;
312 columnDesc.propertyDesc.propertyType = kDataBrowserPropertyRelevanceRankPart;
313 columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
314 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
315
316 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
317
524c47aa 318/*
489468fe
SC
319 SetDataBrowserSortProperty( m_controlRef , kTextColumnId);
320 if ( m_sortOrder == SortOrder_Text_Ascending )
321 {
322 SetDataBrowserSortProperty( m_controlRef , kTextColumnId);
323 SetDataBrowserSortOrder( m_controlRef , kDataBrowserOrderIncreasing);
324 }
325 else
524c47aa 326*/
489468fe
SC
327 {
328 SetDataBrowserSortProperty( m_controlRef , kNumericOrderColumnId);
329 SetDataBrowserSortOrder( m_controlRef , kDataBrowserOrderIncreasing);
330 }
331
332 verify_noerr( AutoSizeColumns() );
333 verify_noerr( SetHiliteStyle(kDataBrowserTableViewFillHilite ) );
334 verify_noerr( SetHeaderButtonHeight( 0 ) );
335 err = SetHasScrollBars( (style & wxHSCROLL) != 0 , true );
336#if 0
337 // shouldn't be necessary anymore under 10.2
338 m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean)false );
339 m_peer->SetNeedsFocusRect( true );
340#endif
341}
342
343wxMacDataBrowserListControl::~wxMacDataBrowserListControl()
344{
345}
346
347void wxMacDataBrowserListControl::ItemNotification(
0698ed3c 348 DataBrowserItemID itemID,
489468fe
SC
349 DataBrowserItemNotification message,
350 DataBrowserItemDataRef itemData)
351{
b2680ced 352 wxListBox *list = wxDynamicCast( GetWXPeer() , wxListBox );
489468fe 353 wxCHECK_RET( list != NULL , wxT("Listbox expected"));
03647350 354
489468fe
SC
355 if (list->HasMultipleSelection() && (message == kDataBrowserSelectionSetChanged) && (!list->MacGetBlockEvents()))
356 {
357 list->CalcAndSendEvent();
358 return;
359 }
360
361 if ((message == kDataBrowserSelectionSetChanged) && (!list->MacGetBlockEvents()))
362 {
363 wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
03647350 364
489468fe 365 int sel = list->GetSelection();
b2680ced 366 if ((sel < 0) || (sel > (int) list->GetCount())) // OS X can select an item below the last item (why?)
489468fe 367 return;
21267321 368 list->HandleLineEvent( sel, false );
489468fe
SC
369 return;
370 }
03647350 371
489468fe
SC
372 // call super for item level(wxMacDataItem->Notification) callback processing
373 wxMacDataItemBrowserControl::ItemNotification( itemID, message, itemData);
374}
524c47aa
SC
375
376
b2680ced 377/*
489468fe
SC
378wxWindow * wxMacDataBrowserListControl::GetPeer() const
379{
b2680ced 380 return wxDynamicCast( wxMacControl::GetWX() , wxWindow );
489468fe 381}
b2680ced 382*/
524c47aa
SC
383
384//
385// List Methods
386//
387
03647350 388wxMacDataBrowserColumn* wxMacDataBrowserListControl::DoInsertColumn( unsigned int pos, DataBrowserPropertyID property,
524c47aa
SC
389 const wxString& title, bool editable,
390 DataBrowserPropertyType colType, SInt16 just, int width )
391{
392 DataBrowserListViewColumnDesc columnDesc;
393 columnDesc.headerBtnDesc.titleOffset = 0;
394 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
395
396 columnDesc.headerBtnDesc.btnFontStyle.flags =
397 kControlUseFontMask | kControlUseJustMask;
398
399 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
400 columnDesc.headerBtnDesc.btnFontStyle.just = just;
401 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
402 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
403
404 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
405 // defined for other modes?
406 wxFontEncoding enc;
407 if ( m_font.Ok() )
408 enc = m_font.GetEncoding();
409 else
410 enc = wxLocale::GetSystemEncoding();
411 wxCFStringRef cfTitle( title, enc );
412 columnDesc.headerBtnDesc.titleString = cfTitle;
413
414 columnDesc.headerBtnDesc.minimumWidth = 0;
415 columnDesc.headerBtnDesc.maximumWidth = 30000;
416
417 columnDesc.propertyDesc.propertyID = property;
418 columnDesc.propertyDesc.propertyType = colType;
419 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
420 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
421 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
03647350 422
524c47aa
SC
423 if ( editable )
424 columnDesc.propertyDesc.propertyFlags |= kDataBrowserPropertyIsMutable;
425
426 verify_noerr( AddColumn( &columnDesc, pos ) );
427
428 if (width > 0)
429 {
430 wxMacDataBrowserControl::SetColumnWidth(property, width);
431 }
432
433 wxMacDataBrowserColumn *col = new wxMacDataBrowserColumn( property, colType, editable );
03647350 434
524c47aa 435 m_columns.Insert( col, pos );
03647350 436
524c47aa
SC
437 return col;
438}
439
03647350
VZ
440wxListWidgetColumn* wxMacDataBrowserListControl::InsertTextColumn( unsigned pos, const wxString& title, bool editable,
441 wxAlignment just, int defaultWidth)
524c47aa
SC
442{
443 DataBrowserPropertyID property = kMinColumnId + m_nextColumnId++;
03647350 444
524c47aa
SC
445 SInt16 j = teFlushLeft;
446 if ( just & wxALIGN_RIGHT )
447 j = teFlushRight;
448 else if ( just & wxALIGN_CENTER_HORIZONTAL )
449 j = teCenter;
03647350
VZ
450
451 return DoInsertColumn( pos, property, title, editable, kDataBrowserTextType, just, defaultWidth );
524c47aa
SC
452}
453
03647350
VZ
454wxListWidgetColumn* wxMacDataBrowserListControl::InsertCheckColumn( unsigned pos , const wxString& title, bool editable,
455 wxAlignment just, int defaultWidth )
524c47aa
SC
456{
457 DataBrowserPropertyID property = kMinColumnId + m_nextColumnId++;
03647350 458
524c47aa
SC
459 SInt16 j = teFlushLeft;
460 if ( just & wxALIGN_RIGHT )
461 j = teFlushRight;
462 else if ( just & wxALIGN_CENTER_HORIZONTAL )
463 j = teCenter;
03647350
VZ
464
465 return DoInsertColumn( pos, property, title, editable, kDataBrowserCheckboxType, just, defaultWidth );
524c47aa
SC
466}
467
468wxMacDataBrowserColumn* wxMacDataBrowserListControl::GetColumnFromProperty( DataBrowserPropertyID property)
469{
470 for ( unsigned int i = 0; i < m_columns.size() ; ++ i )
471 if ( m_columns[i]->GetProperty() == property )
472 return m_columns[i];
03647350 473
524c47aa
SC
474 return NULL;
475}
476
477/*
478wxMacDataItem* wxMacDataBrowserListControl::ListGetLineItem( unsigned int n )
479{
480 return (wxMacDataItem*) GetItemFromLine(n);
481}
482*/
483
484unsigned int wxMacDataBrowserListControl::ListGetCount() const
485{
486 return MacGetCount();
487}
488
489void wxMacDataBrowserListControl::ListDelete( unsigned int n )
490{
491 MacDelete( n );
492}
493
494void wxMacDataBrowserListControl::ListInsert( unsigned int n )
495{
496 MacInsert( n , new wxMacListBoxItem() );
497}
498
499void wxMacDataBrowserListControl::ListClear()
500{
501 MacClear();
502}
503
504void wxMacDataBrowserListControl::ListDeselectAll()
505{
506 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
507 SetSelectedAllItems( kDataBrowserItemsRemove );
508}
509
510void wxMacDataBrowserListControl::ListSetSelection( unsigned int n, bool select, bool multi )
511{
512 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
513 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
514
515 if ( IsItemSelected( item ) != select )
516 {
517 if ( select )
518 SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
519 else
520 SetSelectedItem( item, kDataBrowserItemsRemove );
521 }
522
523 ListScrollTo( n );
524}
525
526bool wxMacDataBrowserListControl::ListIsSelected( unsigned int n ) const
527{
528 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
529 return IsItemSelected( item );
530}
531
532int wxMacDataBrowserListControl::ListGetSelection() const
533{
534 wxMacDataItemPtr first, last;
535 GetSelectionAnchor( &first, &last );
536
537 if ( first != NULL )
538 {
539 return GetLineFromItem( first );
540 }
541
542 return -1;
543}
544
545int wxMacDataBrowserListControl::ListGetSelections( wxArrayInt& aSelections ) const
546{
547 aSelections.Empty();
548 wxArrayMacDataItemPtr selectedItems;
549 GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
550
551 int count = selectedItems.GetCount();
552
553 for ( int i = 0; i < count; ++i)
554 {
555 aSelections.Add(GetLineFromItem(selectedItems[i]));
556 }
557
558 return count;
559}
560
561void wxMacDataBrowserListControl::ListScrollTo( unsigned int n )
562{
563 UInt32 top , left ;
564 GetScrollPosition( &top , &left ) ;
565 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
566
567 // there is a bug in RevealItem that leads to situations
568 // in large lists, where the item does not get scrolled
569 // into sight, so we do a pre-scroll if necessary
570 UInt16 height ;
571 GetRowHeight( (DataBrowserItemID) item , &height ) ;
572 UInt32 linetop = n * ((UInt32) height );
573 UInt32 linebottom = linetop + height;
574 Rect rect ;
575 GetControlBounds( m_controlRef, &rect );
576
577 if ( linetop < top || linebottom > (top + rect.bottom - rect.top ) )
578 SetScrollPosition( wxMax( n-2, 0 ) * ((UInt32)height) , left ) ;
579
580 RevealItem( item , kDataBrowserRevealWithoutSelecting );
581}
03647350
VZ
582
583void wxMacDataBrowserListControl::UpdateLine( unsigned int n, wxListWidgetColumn* col )
524c47aa
SC
584{
585 wxMacDataBrowserColumn* dbcol = dynamic_cast<wxMacDataBrowserColumn*> (col);
586 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
587 UpdateItem(wxMacDataBrowserRootContainer, item, dbcol ? dbcol->GetProperty() : kDataBrowserNoItem );
588}
589
03647350 590void wxMacDataBrowserListControl::UpdateLineToEnd( unsigned int n)
524c47aa
SC
591{
592 // with databrowser inserting does not need updating the entire model, it's done by databrowser itself
593 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
594 UpdateItem(wxMacDataBrowserRootContainer, item, kDataBrowserNoItem );
595}
596
597// value setters
598
599void wxMacDataBrowserCellValue::Set( CFStringRef value )
600{
601 SetDataBrowserItemDataText( m_data, value );
602}
603
604void wxMacDataBrowserCellValue::Set( const wxString& value )
605{
606 wxCFStringRef cf(value);
607 SetDataBrowserItemDataText( m_data, (CFStringRef) cf);
608}
609
03647350
VZ
610void wxMacDataBrowserCellValue::Set( int value )
611{
524c47aa 612 SetDataBrowserItemDataValue( m_data, value );
60ebcb8a
SC
613}
614
615void wxMacDataBrowserCellValue::Check( bool check )
616{
617 SetDataBrowserItemDataButtonValue( m_data, check ? kThemeButtonOn : kThemeButtonOff);
524c47aa 618}
03647350
VZ
619
620int wxMacDataBrowserCellValue::GetIntValue() const
524c47aa
SC
621{
622 SInt32 value;
623 GetDataBrowserItemDataValue( m_data, &value );
624 return value;
625}
626
03647350 627wxString wxMacDataBrowserCellValue::GetStringValue() const
489468fe 628{
524c47aa
SC
629 CFStringRef value;
630 GetDataBrowserItemDataText ( m_data, &value );
631 wxCFStringRef cf(value);
632 return cf.AsString();
489468fe
SC
633}
634
635#if 0
636
637// in case we need that one day
638
639// ============================================================================
640// HIView owner-draw-based implementation
641// ============================================================================
642
643static pascal void ListBoxDrawProc(
644 ControlRef browser, DataBrowserItemID item, DataBrowserPropertyID property,
645 DataBrowserItemState itemState, const Rect *itemRect, SInt16 depth, Boolean isColorDevice )
646{
647 CFStringRef cfString;
648 ThemeDrawingState themeState;
649 long systemVersion;
650
651 GetThemeDrawingState( &themeState );
652 cfString = CFStringCreateWithFormat( NULL, NULL, CFSTR("Row %d"), item );
653
654 // In this sample we handle the "selected" state; all others fall through to our "active" state
655 if ( itemState == kDataBrowserItemIsSelected )
656 {
657 ThemeBrush colorBrushID;
658
659 // TODO: switch over to wxSystemSettingsNative::GetColour() when kThemeBrushSecondaryHighlightColor
660 // is incorporated Panther DB starts using kThemeBrushSecondaryHighlightColor
661 // for inactive browser highlighting
662 if ( !IsControlActive( browser ) )
663 colorBrushID = kThemeBrushSecondaryHighlightColor;
664 else
665 colorBrushID = kThemeBrushPrimaryHighlightColor;
666
667 // First paint the hilite rect, then the text on top
668 SetThemePen( colorBrushID, 32, true );
669 PaintRect( itemRect );
670 SetThemeDrawingState( themeState, false );
671 }
672
673 DrawThemeTextBox( cfString, kThemeApplicationFont, kThemeStateActive, true, itemRect, teFlushDefault, NULL );
674 SetThemeDrawingState( themeState, true );
675
676 if ( cfString != NULL )
677 CFRelease( cfString );
678}
679
680#endif
681
682
683#endif // wxUSE_LISTBOX