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