]> git.saurik.com Git - wxWidgets.git/blame - src/osx/carbon/listbox.cpp
minor fixes; replace references to Windows95 with references to wxMSW where possible
[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
524c47aa
SC
33wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer,
34 wxWindowMac* parent,
35 wxWindowID id,
36 const wxPoint& pos,
37 const wxSize& size,
38 long style,
39 long 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 );
178
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 }
194
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 }
229
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 );
489468fe
SC
253 wxCommandEvent event( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, list->GetId() );
254 event.SetEventObject( list );
255 if ( list->HasClientObjectData() )
524c47aa 256 event.SetClientObject( list->GetClientObject(n) );
489468fe 257 else if ( list->HasClientUntypedData() )
524c47aa
SC
258 event.SetClientData( list->GetClientData(n) );
259 event.SetString( list->GetString(n) );
260 event.SetInt( n );
489468fe
SC
261 event.SetExtraLong( 1 );
262 list->HandleWindowEvent(event);
263 return;
264 }
265}
266
267IMPLEMENT_DYNAMIC_CLASS( wxMacDataBrowserListControl , wxMacDataItemBrowserControl )
268
269wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxWindow *peer, const wxPoint& pos, const wxSize& size, long style)
270 : wxMacDataItemBrowserControl( peer, pos, size, style )
271{
524c47aa
SC
272 m_nextColumnId = 0 ;
273
489468fe
SC
274 OSStatus err = noErr;
275 m_clientDataItemsType = wxClientData_None;
276 if ( style & wxLB_SORT )
277 m_sortOrder = SortOrder_Text_Ascending;
278
279 DataBrowserSelectionFlags options = kDataBrowserDragSelect;
280 if ( style & wxLB_MULTIPLE )
281 {
282 options |= kDataBrowserAlwaysExtendSelection | kDataBrowserCmdTogglesSelection;
283 }
284 else if ( style & wxLB_EXTENDED )
285 {
286 options |= kDataBrowserCmdTogglesSelection;
287 }
288 else
289 {
290 options |= kDataBrowserSelectOnlyOne;
291 }
292 err = SetSelectionFlags( options );
293 verify_noerr( err );
294
295 DataBrowserListViewColumnDesc columnDesc;
296 columnDesc.headerBtnDesc.titleOffset = 0;
297 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
298
299 columnDesc.headerBtnDesc.btnFontStyle.flags =
300 kControlUseFontMask | kControlUseJustMask;
301
302 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
303 columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault;
304 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
305 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
306 columnDesc.headerBtnDesc.titleString = NULL;
524c47aa 307/*
489468fe
SC
308 columnDesc.headerBtnDesc.minimumWidth = 0;
309 columnDesc.headerBtnDesc.maximumWidth = 10000;
310
311 columnDesc.propertyDesc.propertyID = kTextColumnId;
312 columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
313 columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
314 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
315
316 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
524c47aa 317*/
489468fe
SC
318 columnDesc.headerBtnDesc.minimumWidth = 0;
319 columnDesc.headerBtnDesc.maximumWidth = 0;
320 columnDesc.propertyDesc.propertyID = kNumericOrderColumnId;
321 columnDesc.propertyDesc.propertyType = kDataBrowserPropertyRelevanceRankPart;
322 columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
323 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
324
325 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
326
524c47aa 327/*
489468fe
SC
328 SetDataBrowserSortProperty( m_controlRef , kTextColumnId);
329 if ( m_sortOrder == SortOrder_Text_Ascending )
330 {
331 SetDataBrowserSortProperty( m_controlRef , kTextColumnId);
332 SetDataBrowserSortOrder( m_controlRef , kDataBrowserOrderIncreasing);
333 }
334 else
524c47aa 335*/
489468fe
SC
336 {
337 SetDataBrowserSortProperty( m_controlRef , kNumericOrderColumnId);
338 SetDataBrowserSortOrder( m_controlRef , kDataBrowserOrderIncreasing);
339 }
340
341 verify_noerr( AutoSizeColumns() );
342 verify_noerr( SetHiliteStyle(kDataBrowserTableViewFillHilite ) );
343 verify_noerr( SetHeaderButtonHeight( 0 ) );
344 err = SetHasScrollBars( (style & wxHSCROLL) != 0 , true );
345#if 0
346 // shouldn't be necessary anymore under 10.2
347 m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean)false );
348 m_peer->SetNeedsFocusRect( true );
349#endif
350}
351
352wxMacDataBrowserListControl::~wxMacDataBrowserListControl()
353{
354}
355
356void wxMacDataBrowserListControl::ItemNotification(
357 const wxMacDataItem* itemID,
358 DataBrowserItemNotification message,
359 DataBrowserItemDataRef itemData)
360{
b2680ced 361 wxListBox *list = wxDynamicCast( GetWXPeer() , wxListBox );
489468fe
SC
362 wxCHECK_RET( list != NULL , wxT("Listbox expected"));
363
364 if (list->HasMultipleSelection() && (message == kDataBrowserSelectionSetChanged) && (!list->MacGetBlockEvents()))
365 {
366 list->CalcAndSendEvent();
367 return;
368 }
369
370 if ((message == kDataBrowserSelectionSetChanged) && (!list->MacGetBlockEvents()))
371 {
372 wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
373
374 int sel = list->GetSelection();
b2680ced 375 if ((sel < 0) || (sel > (int) list->GetCount())) // OS X can select an item below the last item (why?)
489468fe
SC
376 return;
377 event.SetEventObject( list );
378 if ( list->HasClientObjectData() )
379 event.SetClientObject( list->GetClientObject( sel ) );
380 else if ( list->HasClientUntypedData() )
381 event.SetClientData( list->GetClientData( sel ) );
382 event.SetString( list->GetString( sel ) );
383 event.SetInt( sel );
384 event.SetExtraLong( 1 );
385 list->HandleWindowEvent(event);
386 return;
387 }
388
389 // call super for item level(wxMacDataItem->Notification) callback processing
390 wxMacDataItemBrowserControl::ItemNotification( itemID, message, itemData);
391}
524c47aa
SC
392
393
b2680ced 394/*
489468fe
SC
395wxWindow * wxMacDataBrowserListControl::GetPeer() const
396{
b2680ced 397 return wxDynamicCast( wxMacControl::GetWX() , wxWindow );
489468fe 398}
b2680ced 399*/
524c47aa
SC
400
401//
402// List Methods
403//
404
405wxMacDataBrowserColumn* wxMacDataBrowserListControl::DoInsertColumn( unsigned int pos, DataBrowserPropertyID property,
406 const wxString& title, bool editable,
407 DataBrowserPropertyType colType, SInt16 just, int width )
408{
409 DataBrowserListViewColumnDesc columnDesc;
410 columnDesc.headerBtnDesc.titleOffset = 0;
411 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
412
413 columnDesc.headerBtnDesc.btnFontStyle.flags =
414 kControlUseFontMask | kControlUseJustMask;
415
416 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
417 columnDesc.headerBtnDesc.btnFontStyle.just = just;
418 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
419 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
420
421 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
422 // defined for other modes?
423 wxFontEncoding enc;
424 if ( m_font.Ok() )
425 enc = m_font.GetEncoding();
426 else
427 enc = wxLocale::GetSystemEncoding();
428 wxCFStringRef cfTitle( title, enc );
429 columnDesc.headerBtnDesc.titleString = cfTitle;
430
431 columnDesc.headerBtnDesc.minimumWidth = 0;
432 columnDesc.headerBtnDesc.maximumWidth = 30000;
433
434 columnDesc.propertyDesc.propertyID = property;
435 columnDesc.propertyDesc.propertyType = colType;
436 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
437 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
438 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
439
440 if ( editable )
441 columnDesc.propertyDesc.propertyFlags |= kDataBrowserPropertyIsMutable;
442
443 verify_noerr( AddColumn( &columnDesc, pos ) );
444
445 if (width > 0)
446 {
447 wxMacDataBrowserControl::SetColumnWidth(property, width);
448 }
449
450 wxMacDataBrowserColumn *col = new wxMacDataBrowserColumn( property, colType, editable );
451
452 m_columns.Insert( col, pos );
453
454 return col;
455}
456
457wxListWidgetColumn* wxMacDataBrowserListControl::InsertTextColumn( unsigned pos, const wxString& title, bool editable,
458 wxAlignment just, int defaultWidth)
459{
460 DataBrowserPropertyID property = kMinColumnId + m_nextColumnId++;
461
462 SInt16 j = teFlushLeft;
463 if ( just & wxALIGN_RIGHT )
464 j = teFlushRight;
465 else if ( just & wxALIGN_CENTER_HORIZONTAL )
466 j = teCenter;
467
468 return DoInsertColumn( pos, property, title, editable, kDataBrowserTextType, just, defaultWidth );
469}
470
471wxListWidgetColumn* wxMacDataBrowserListControl::InsertCheckColumn( unsigned pos , const wxString& title, bool editable,
472 wxAlignment just, int defaultWidth )
473{
474 DataBrowserPropertyID property = kMinColumnId + m_nextColumnId++;
475
476 SInt16 j = teFlushLeft;
477 if ( just & wxALIGN_RIGHT )
478 j = teFlushRight;
479 else if ( just & wxALIGN_CENTER_HORIZONTAL )
480 j = teCenter;
481
482 return DoInsertColumn( pos, property, title, editable, kDataBrowserCheckboxType, just, defaultWidth );
483}
484
485wxMacDataBrowserColumn* wxMacDataBrowserListControl::GetColumnFromProperty( DataBrowserPropertyID property)
486{
487 for ( unsigned int i = 0; i < m_columns.size() ; ++ i )
488 if ( m_columns[i]->GetProperty() == property )
489 return m_columns[i];
490
491 return NULL;
492}
493
494/*
495wxMacDataItem* wxMacDataBrowserListControl::ListGetLineItem( unsigned int n )
496{
497 return (wxMacDataItem*) GetItemFromLine(n);
498}
499*/
500
501unsigned int wxMacDataBrowserListControl::ListGetCount() const
502{
503 return MacGetCount();
504}
505
506void wxMacDataBrowserListControl::ListDelete( unsigned int n )
507{
508 MacDelete( n );
509}
510
511void wxMacDataBrowserListControl::ListInsert( unsigned int n )
512{
513 MacInsert( n , new wxMacListBoxItem() );
514}
515
516void wxMacDataBrowserListControl::ListClear()
517{
518 MacClear();
519}
520
521void wxMacDataBrowserListControl::ListDeselectAll()
522{
523 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
524 SetSelectedAllItems( kDataBrowserItemsRemove );
525}
526
527void wxMacDataBrowserListControl::ListSetSelection( unsigned int n, bool select, bool multi )
528{
529 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
530 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
531
532 if ( IsItemSelected( item ) != select )
533 {
534 if ( select )
535 SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
536 else
537 SetSelectedItem( item, kDataBrowserItemsRemove );
538 }
539
540 ListScrollTo( n );
541}
542
543bool wxMacDataBrowserListControl::ListIsSelected( unsigned int n ) const
544{
545 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
546 return IsItemSelected( item );
547}
548
549int wxMacDataBrowserListControl::ListGetSelection() const
550{
551 wxMacDataItemPtr first, last;
552 GetSelectionAnchor( &first, &last );
553
554 if ( first != NULL )
555 {
556 return GetLineFromItem( first );
557 }
558
559 return -1;
560}
561
562int wxMacDataBrowserListControl::ListGetSelections( wxArrayInt& aSelections ) const
563{
564 aSelections.Empty();
565 wxArrayMacDataItemPtr selectedItems;
566 GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
567
568 int count = selectedItems.GetCount();
569
570 for ( int i = 0; i < count; ++i)
571 {
572 aSelections.Add(GetLineFromItem(selectedItems[i]));
573 }
574
575 return count;
576}
577
578void wxMacDataBrowserListControl::ListScrollTo( unsigned int n )
579{
580 UInt32 top , left ;
581 GetScrollPosition( &top , &left ) ;
582 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
583
584 // there is a bug in RevealItem that leads to situations
585 // in large lists, where the item does not get scrolled
586 // into sight, so we do a pre-scroll if necessary
587 UInt16 height ;
588 GetRowHeight( (DataBrowserItemID) item , &height ) ;
589 UInt32 linetop = n * ((UInt32) height );
590 UInt32 linebottom = linetop + height;
591 Rect rect ;
592 GetControlBounds( m_controlRef, &rect );
593
594 if ( linetop < top || linebottom > (top + rect.bottom - rect.top ) )
595 SetScrollPosition( wxMax( n-2, 0 ) * ((UInt32)height) , left ) ;
596
597 RevealItem( item , kDataBrowserRevealWithoutSelecting );
598}
599
600void wxMacDataBrowserListControl::UpdateLine( unsigned int n, wxListWidgetColumn* col )
601{
602 wxMacDataBrowserColumn* dbcol = dynamic_cast<wxMacDataBrowserColumn*> (col);
603 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
604 UpdateItem(wxMacDataBrowserRootContainer, item, dbcol ? dbcol->GetProperty() : kDataBrowserNoItem );
605}
606
607void wxMacDataBrowserListControl::UpdateLineToEnd( unsigned int n)
608{
609 // with databrowser inserting does not need updating the entire model, it's done by databrowser itself
610 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
611 UpdateItem(wxMacDataBrowserRootContainer, item, kDataBrowserNoItem );
612}
613
614// value setters
615
616void wxMacDataBrowserCellValue::Set( CFStringRef value )
617{
618 SetDataBrowserItemDataText( m_data, value );
619}
620
621void wxMacDataBrowserCellValue::Set( const wxString& value )
622{
623 wxCFStringRef cf(value);
624 SetDataBrowserItemDataText( m_data, (CFStringRef) cf);
625}
626
627void wxMacDataBrowserCellValue::Set( int value )
628{
629 SetDataBrowserItemDataValue( m_data, value );
630 // SetDataBrowserItemDataButtonValue( m_data, value ? kThemeButtonOn : kThemeButtonOff);
631}
632
633int wxMacDataBrowserCellValue::GetIntValue() const
634{
635 SInt32 value;
636 GetDataBrowserItemDataValue( m_data, &value );
637 return value;
638}
639
640wxString wxMacDataBrowserCellValue::GetStringValue() const
489468fe 641{
524c47aa
SC
642 CFStringRef value;
643 GetDataBrowserItemDataText ( m_data, &value );
644 wxCFStringRef cf(value);
645 return cf.AsString();
489468fe
SC
646}
647
648#if 0
649
650// in case we need that one day
651
652// ============================================================================
653// HIView owner-draw-based implementation
654// ============================================================================
655
656static pascal void ListBoxDrawProc(
657 ControlRef browser, DataBrowserItemID item, DataBrowserPropertyID property,
658 DataBrowserItemState itemState, const Rect *itemRect, SInt16 depth, Boolean isColorDevice )
659{
660 CFStringRef cfString;
661 ThemeDrawingState themeState;
662 long systemVersion;
663
664 GetThemeDrawingState( &themeState );
665 cfString = CFStringCreateWithFormat( NULL, NULL, CFSTR("Row %d"), item );
666
667 // In this sample we handle the "selected" state; all others fall through to our "active" state
668 if ( itemState == kDataBrowserItemIsSelected )
669 {
670 ThemeBrush colorBrushID;
671
672 // TODO: switch over to wxSystemSettingsNative::GetColour() when kThemeBrushSecondaryHighlightColor
673 // is incorporated Panther DB starts using kThemeBrushSecondaryHighlightColor
674 // for inactive browser highlighting
675 if ( !IsControlActive( browser ) )
676 colorBrushID = kThemeBrushSecondaryHighlightColor;
677 else
678 colorBrushID = kThemeBrushPrimaryHighlightColor;
679
680 // First paint the hilite rect, then the text on top
681 SetThemePen( colorBrushID, 32, true );
682 PaintRect( itemRect );
683 SetThemeDrawingState( themeState, false );
684 }
685
686 DrawThemeTextBox( cfString, kThemeApplicationFont, kThemeStateActive, true, itemRect, teFlushDefault, NULL );
687 SetThemeDrawingState( themeState, true );
688
689 if ( cfString != NULL )
690 CFRelease( cfString );
691}
692
693#endif
694
695
696#endif // wxUSE_LISTBOX