]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/mac/carbon/listbox.cpp
added wxShutdown (patch 547443)
[wxWidgets.git] / src / mac / carbon / listbox.cpp
... / ...
CommitLineData
1///////////////////////////////////////////////////////////////////////////////
2// Name: listbox.cpp
3// Purpose: wxListBox
4// Author: AUTHOR
5// Modified by:
6// Created: ??/??/98
7// RCS-ID: $Id$
8// Copyright: (c) AUTHOR
9// Licence: wxWindows licence
10///////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation "listbox.h"
14#endif
15
16#include "wx/app.h"
17#include "wx/listbox.h"
18#include "wx/settings.h"
19#include "wx/toplevel.h"
20#include "wx/dynarray.h"
21#include "wx/log.h"
22
23#include "wx/utils.h"
24
25#if !USE_SHARED_LIBRARY
26 IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
27
28BEGIN_EVENT_TABLE(wxListBox, wxControl)
29 EVT_SIZE( wxListBox::OnSize )
30END_EVENT_TABLE()
31#endif
32
33#include "wx/mac/uma.h"
34
35#if PRAGMA_STRUCT_ALIGN
36 #pragma options align=mac68k
37#elif PRAGMA_STRUCT_PACKPUSH
38 #pragma pack(push, 2)
39#elif PRAGMA_STRUCT_PACK
40 #pragma pack(2)
41#endif
42
43typedef struct {
44 unsigned short instruction;
45 void (*function)();
46} ldefRec, *ldefPtr, **ldefHandle;
47
48#if PRAGMA_STRUCT_ALIGN
49 #pragma options align=reset
50#elif PRAGMA_STRUCT_PACKPUSH
51 #pragma pack(pop)
52#elif PRAGMA_STRUCT_PACK
53 #pragma pack()
54#endif
55
56extern "C"
57{
58static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect,
59 Cell cell, short dataOffset, short dataLength,
60 ListHandle listHandle ) ;
61}
62
63static pascal void wxMacListDefinition( short message, Boolean isSelected, Rect *drawRect,
64 Cell cell, short dataOffset, short dataLength,
65 ListHandle listHandle )
66{
67 GrafPtr savePort;
68 GrafPtr grafPtr;
69 RgnHandle savedClipRegion;
70 SInt32 savedPenMode;
71 wxListBox* list;
72 GetPort(&savePort);
73 SetPort((**listHandle).port);
74 grafPtr = (**listHandle).port ;
75 // typecast our refCon
76 list = (wxListBox*) GetControlReference( (ControlHandle) GetListRefCon(listHandle) );
77
78 // Calculate the cell rect.
79
80 switch( message ) {
81 case lInitMsg:
82 break;
83
84 case lCloseMsg:
85 break;
86
87 case lDrawMsg:
88 {
89 const wxString text = list->m_stringArray[cell.v] ;
90
91 // Save the current clip region, and set the clip region to the area we are about
92 // to draw.
93
94 savedClipRegion = NewRgn();
95 GetClip( savedClipRegion );
96
97 ClipRect( drawRect );
98 EraseRect( drawRect );
99
100 MoveTo(drawRect->left + 4 , drawRect->top + 10 );
101 ::TextFont( kFontIDMonaco ) ;
102 ::TextSize( 9 );
103 ::TextFace( 0 ) ;
104
105 DrawText(text, 0 , text.Length());
106 // If the cell is hilited, do the hilite now. Paint the cell contents with the
107 // appropriate QuickDraw transform mode.
108
109 if( isSelected ) {
110 savedPenMode = GetPortPenMode( (CGrafPtr) grafPtr );
111 SetPortPenMode( (CGrafPtr)grafPtr, hilitetransfermode );
112 PaintRect( drawRect );
113 SetPortPenMode( (CGrafPtr)grafPtr, savedPenMode );
114 }
115
116 // Restore the saved clip region.
117
118 SetClip( savedClipRegion );
119 DisposeRgn( savedClipRegion );
120 }
121 break;
122 case lHiliteMsg:
123
124 // Hilite or unhilite the cell. Paint the cell contents with the
125 // appropriate QuickDraw transform mode.
126
127 GetPort( &grafPtr );
128 savedPenMode = GetPortPenMode( (CGrafPtr)grafPtr );
129 SetPortPenMode( (CGrafPtr)grafPtr, hilitetransfermode );
130 PaintRect( drawRect );
131 SetPortPenMode( (CGrafPtr)grafPtr, savedPenMode );
132 break;
133 default :
134 break ;
135 }
136 SetPort(savePort);
137}
138
139extern "C" void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon) ;
140const short kwxMacListWithVerticalScrollbar = 128 ;
141const short kwxMacListItemHeight = 14 ;
142
143// ============================================================================
144// list box control implementation
145// ============================================================================
146
147// Listbox item
148wxListBox::wxListBox()
149{
150 m_noItems = 0;
151 m_selected = 0;
152 m_macList = NULL ;
153}
154
155static ListDefUPP macListDefUPP = NULL ;
156
157bool wxListBox::Create(wxWindow *parent, wxWindowID id,
158 const wxPoint& pos,
159 const wxSize& size,
160 int n, const wxString choices[],
161 long style,
162 const wxValidator& validator,
163 const wxString& name)
164{
165 m_noItems = 0 ; // this will be increased by our append command
166 m_selected = 0;
167
168 Rect bounds ;
169 Str255 title ;
170
171 MacPreControlCreate( parent , id , "" , pos , size ,style, validator , name , &bounds , title ) ;
172
173 ListDefSpec listDef;
174 listDef.defType = kListDefUserProcType;
175 if ( macListDefUPP == NULL )
176 {
177 macListDefUPP = NewListDefUPP( wxMacListDefinition );
178 }
179 listDef.u.userProc = macListDefUPP ;
180
181#if TARGET_CARBON
182 Size asize;
183
184
185 CreateListBoxControl( MAC_WXHWND(parent->MacGetRootWindow()), &bounds, false, 0, 1, false, true,
186 kwxMacListItemHeight, kwxMacListItemHeight, false, &listDef, (ControlRef *)&m_macControl );
187
188 GetControlData( (ControlHandle) m_macControl, kControlNoPart, kControlListBoxListHandleTag,
189 sizeof(ListHandle), (Ptr) &m_macList, &asize);
190
191 SetControlReference( (ControlHandle) m_macControl, (long) this);
192 SetControlVisibility( (ControlHandle) m_macControl, false, false);
193
194#else
195
196 long result ;
197 wxStAppResource resload ;
198 m_macControl = ::NewControl( MAC_WXHWND(parent->MacGetRootWindow()) , &bounds , title , false ,
199 kwxMacListWithVerticalScrollbar , 0 , 0,
200 kControlListBoxProc , (long) this ) ;
201 ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxListHandleTag ,
202 sizeof( ListHandle ) , (char*) &m_macList , &result ) ;
203
204 HLock( (Handle) m_macList ) ;
205 ldefHandle ldef ;
206 ldef = (ldefHandle) NewHandle( sizeof(ldefRec) ) ;
207 if ( (**(ListHandle)m_macList).listDefProc != NULL )
208 {
209 (**ldef).instruction = 0x4EF9; /* JMP instruction */
210 (**ldef).function = (void(*)()) listDef.u.userProc;
211 (**(ListHandle)m_macList).listDefProc = (Handle) ldef ;
212 }
213
214 Point pt = (**(ListHandle)m_macList).cellSize ;
215 pt.v = kwxMacListItemHeight ;
216 LCellSize( pt , (ListHandle)m_macList ) ;
217 LAddColumn( 1 , 0 , (ListHandle)m_macList ) ;
218#endif
219 OptionBits options = 0;
220 if ( style & wxLB_MULTIPLE )
221 {
222 options += lNoExtend ;
223 }
224 else if ( style & wxLB_EXTENDED )
225 {
226 options += lExtendDrag ;
227 }
228 else
229 {
230 options = lOnlyOne ;
231 }
232 SetListSelectionFlags((ListHandle)m_macList, options);
233
234 MacPostControlCreate() ;
235
236 for ( int i = 0 ; i < n ; i++ )
237 {
238 Append( choices[i] ) ;
239 }
240
241 LSetDrawingMode( true , (ListHandle)m_macList ) ;
242
243 return TRUE;
244}
245
246wxListBox::~wxListBox()
247{
248 Free() ;
249 if ( m_macList )
250 {
251#if !TARGET_CARBON
252 DisposeHandle( (**(ListHandle)m_macList).listDefProc ) ;
253 (**(ListHandle)m_macList).listDefProc = NULL ;
254#endif
255 m_macList = NULL ;
256 }
257}
258
259void wxListBox::Free()
260{
261#if wxUSE_OWNER_DRAWN
262 if ( m_windowStyle & wxLB_OWNERDRAW )
263 {
264 size_t uiCount = m_aItems.Count();
265 while ( uiCount-- != 0 ) {
266 delete m_aItems[uiCount];
267 }
268
269 m_aItems.Clear();
270 }
271 else
272#endif // wxUSE_OWNER_DRAWN
273 if ( HasClientObjectData() )
274 {
275 for ( size_t n = 0; n < (size_t)m_noItems; n++ )
276 {
277 delete GetClientObject(n);
278 }
279 }
280}
281
282void wxListBox::DoSetSize(int x, int y,
283 int width, int height,
284 int sizeFlags )
285{
286 wxControl::DoSetSize( x , y , width , height , sizeFlags ) ;
287#if TARGET_CARBON
288 Rect bounds ;
289 GetControlBounds( (ControlHandle) m_macControl , &bounds ) ;
290 ControlRef control = GetListVerticalScrollBar( (ListHandle)m_macList ) ;
291 if ( control )
292 {
293 Rect scrollbounds ;
294 GetControlBounds( control , &scrollbounds ) ;
295 if( scrollbounds.right != bounds.right + 1 )
296 {
297 UMAMoveControl( control , bounds.right - (scrollbounds.right - scrollbounds.left) + 1 ,
298 scrollbounds.top ) ;
299 }
300 }
301#endif
302}
303void wxListBox::DoSetFirstItem(int N)
304{
305 MacScrollTo( N ) ;
306}
307
308void wxListBox::Delete(int N)
309{
310 wxCHECK_RET( N >= 0 && N < m_noItems,
311 wxT("invalid index in wxListBox::Delete") );
312
313#if wxUSE_OWNER_DRAWN
314 delete m_aItems[N];
315 m_aItems.RemoveAt(N);
316#else // !wxUSE_OWNER_DRAWN
317 if ( HasClientObjectData() )
318 {
319 delete GetClientObject(N);
320 }
321#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
322 m_stringArray.Remove( N ) ;
323 m_dataArray.RemoveAt( N ) ;
324 m_noItems --;
325
326 MacDelete( N ) ;
327}
328
329int wxListBox::DoAppend(const wxString& item)
330{
331 int index = m_noItems ;
332 if( wxApp::s_macDefaultEncodingIsPC )
333 {
334 m_stringArray.Add( wxMacMakeMacStringFromPC( item ) ) ;
335 m_dataArray.Add( NULL );
336 }
337 else {
338 m_stringArray.Add( item ) ;
339 m_dataArray.Add( NULL );
340 }
341 m_noItems ++;
342 DoSetItemClientData( index , NULL ) ;
343 MacAppend( item ) ;
344
345 return index ;
346}
347
348void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
349{
350 MacSetRedraw( false ) ;
351 Clear() ;
352 int n = choices.GetCount();
353
354 for( int i = 0 ; i < n ; ++i )
355 {
356 if ( clientData )
357 {
358#if wxUSE_OWNER_DRAWN
359 wxASSERT_MSG(clientData[i] == NULL,
360 wxT("Can't use client data with owner-drawn listboxes"));
361#else // !wxUSE_OWNER_DRAWN
362 Append( choices[i] , clientData[i] ) ;
363 #endif
364 }
365 else
366 Append( choices[i] ) ;
367 }
368
369#if wxUSE_OWNER_DRAWN
370 if ( m_windowStyle & wxLB_OWNERDRAW ) {
371 // first delete old items
372 size_t ui = m_aItems.Count();
373 while ( ui-- != 0 ) {
374 delete m_aItems[ui];
375 }
376 m_aItems.Empty();
377
378 // then create new ones
379 for ( ui = 0; ui < (size_t)m_noItems; ui++ ) {
380 wxOwnerDrawn *pNewItem = CreateItem(ui);
381 pNewItem->SetName(choices[ui]);
382 m_aItems.Add(pNewItem);
383 }
384 }
385#endif // wxUSE_OWNER_DRAWN
386 MacSetRedraw( true ) ;
387}
388
389bool wxListBox::HasMultipleSelection() const
390{
391 return (m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED);
392}
393
394int wxListBox::FindString(const wxString& st) const
395{
396 wxString s ;
397 if( wxApp::s_macDefaultEncodingIsPC )
398 {
399 s = wxMacMakeMacStringFromPC( st ) ;
400 }
401 else
402 s = st ;
403
404 if ( s.Right(1) == "*" )
405 {
406 wxString search = s.Left( s.Length() - 1 ) ;
407 int len = search.Length() ;
408 Str255 s1 , s2 ;
409
410#if TARGET_CARBON
411 c2pstrcpy( (StringPtr) s2 , search.c_str() ) ;
412#else
413 strcpy( (char *) s2 , search.c_str() ) ;
414 c2pstr( (char *) s2 ) ;
415#endif
416
417 for ( int i = 0 ; i < m_noItems ; ++ i )
418 {
419#if TARGET_CARBON
420 c2pstrcpy( (StringPtr) s1 , m_stringArray[i].Left( len ).c_str() ) ;
421#else
422 strcpy( (char *) s1 , m_stringArray[i].Left( len ).c_str() ) ;
423 c2pstr( (char *) s1 ) ;
424#endif
425 if ( EqualString( s1 , s2 , false , false ) )
426 return i ;
427 }
428 if ( s.Left(1) == "*" && s.Length() > 1 )
429 {
430 s.MakeLower() ;
431 for ( int i = 0 ; i < m_noItems ; ++i )
432 {
433 if ( GetString(i).Lower().Matches(s) )
434 return i ;
435 }
436 }
437
438 }
439 else
440 {
441 Str255 s1 , s2 ;
442
443#if TARGET_CARBON
444 c2pstrcpy( (StringPtr) s2 , s.c_str() ) ;
445#else
446 strcpy( (char *) s2 , s.c_str() ) ;
447 c2pstr( (char *) s2 ) ;
448#endif
449
450 for ( int i = 0 ; i < m_noItems ; ++ i )
451 {
452#if TARGET_CARBON
453 c2pstrcpy( (StringPtr) s1 , m_stringArray[i].c_str() ) ;
454#else
455 strcpy( (char *) s1 , m_stringArray[i].c_str() ) ;
456 c2pstr( (char *) s1 ) ;
457#endif
458 if ( EqualString( s1 , s2 , false , false ) )
459 return i ;
460 }
461 }
462 return -1;
463}
464
465void wxListBox::Clear()
466{
467 Free();
468 m_noItems = 0;
469 m_stringArray.Empty() ;
470 m_dataArray.Empty() ;
471 MacClear() ;
472}
473
474void wxListBox::SetSelection(int N, bool select)
475{
476 wxCHECK_RET( N >= 0 && N < m_noItems,
477 "invalid index in wxListBox::SetSelection" );
478 MacSetSelection( N , select ) ;
479 GetSelections( m_selectionPreImage ) ;
480}
481
482bool wxListBox::IsSelected(int N) const
483{
484 wxCHECK_MSG( N >= 0 && N < m_noItems, FALSE,
485 "invalid index in wxListBox::Selected" );
486
487 return MacIsSelected( N ) ;
488}
489
490void *wxListBox::DoGetItemClientData(int N) const
491{
492 wxCHECK_MSG( N >= 0 && N < m_noItems, NULL,
493 wxT("invalid index in wxListBox::GetClientData"));
494
495 return (void *)m_dataArray[N];
496}
497
498wxClientData *wxListBox::DoGetItemClientObject(int N) const
499{
500 return (wxClientData *) DoGetItemClientData( N ) ;
501}
502
503void wxListBox::DoSetItemClientData(int N, void *Client_data)
504{
505 wxCHECK_RET( N >= 0 && N < m_noItems,
506 "invalid index in wxListBox::SetClientData" );
507
508#if wxUSE_OWNER_DRAWN
509 if ( m_windowStyle & wxLB_OWNERDRAW )
510 {
511 // client data must be pointer to wxOwnerDrawn, otherwise we would crash
512 // in OnMeasure/OnDraw.
513 wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes"));
514 }
515#endif // wxUSE_OWNER_DRAWN
516 wxASSERT_MSG( m_dataArray.GetCount() >= N , "invalid client_data array" ) ;
517
518 if ( m_dataArray.GetCount() > N )
519 {
520 m_dataArray[N] = (char*) Client_data ;
521 }
522 else
523 {
524 m_dataArray.Add( (char*) Client_data ) ;
525 }
526}
527
528void wxListBox::DoSetItemClientObject(int n, wxClientData* clientData)
529{
530 DoSetItemClientData(n, clientData);
531}
532
533// Return number of selections and an array of selected integers
534int wxListBox::GetSelections(wxArrayInt& aSelections) const
535{
536 return MacGetSelections( aSelections ) ;
537}
538
539// Get single selection, for single choice list items
540int wxListBox::GetSelection() const
541{
542 return MacGetSelection() ;
543}
544
545// Find string for position
546wxString wxListBox::GetString(int N) const
547{
548 if( wxApp::s_macDefaultEncodingIsPC )
549 {
550 return wxMacMakePCStringFromMac( m_stringArray[N] ) ;
551 }
552 else
553 return m_stringArray[N] ;
554}
555
556void wxListBox::DoInsertItems(const wxArrayString& items, int pos)
557{
558 wxCHECK_RET( pos >= 0 && pos <= m_noItems,
559 wxT("invalid index in wxListBox::InsertItems") );
560
561 int nItems = items.GetCount();
562
563 for ( int i = 0 ; i < nItems ; i++ )
564 {
565 m_stringArray.Insert( items[i] , pos + i ) ;
566 m_dataArray.Insert( NULL , pos + i ) ;
567 MacInsert( pos + i , items[i] ) ;
568 }
569
570 m_noItems += nItems;
571}
572
573void wxListBox::SetString(int N, const wxString& s)
574{
575 wxString str ;
576 if( wxApp::s_macDefaultEncodingIsPC )
577 {
578 str = wxMacMakeMacStringFromPC( s ) ;
579 }
580 else
581 str = s ;
582 m_stringArray[N] = str ;
583 MacSet( N , s ) ;
584}
585
586wxSize wxListBox::DoGetBestSize() const
587{
588 return wxSize(100, 100);
589}
590
591int wxListBox::GetCount() const
592{
593 return m_noItems;
594}
595
596void wxListBox::SetupColours()
597{
598 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
599 SetForegroundColour(GetParent()->GetForegroundColour());
600}
601
602void wxListBox::Refresh(bool eraseBack, const wxRect *rect)
603{
604 wxControl::Refresh( eraseBack , rect ) ;
605// MacRedrawControl() ;
606}
607
608#if wxUSE_OWNER_DRAWN
609
610class wxListBoxItem : public wxOwnerDrawn
611{
612public:
613 wxListBoxItem(const wxString& str = "");
614};
615
616wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, FALSE)
617{
618 // no bitmaps/checkmarks
619 SetMarginWidth(0);
620}
621
622wxOwnerDrawn *wxListBox::CreateItem(size_t n)
623{
624 return new wxListBoxItem();
625}
626
627#endif //USE_OWNER_DRAWN
628
629// ============================================================================
630// list box control implementation
631// ============================================================================
632
633void MacDrawStringCell(Rect *cellRect, Cell lCell, ListHandle theList, long refCon)
634{
635 wxListBox* list;
636 // typecast our refCon
637 list = (wxListBox*)refCon;
638
639 MoveTo(cellRect->left + 4 , cellRect->top + 10 );
640 const wxString text = list->m_stringArray[lCell.v] ;
641 ::TextFont( kFontIDMonaco ) ;
642 ::TextSize( 9 );
643 ::TextFace( 0 ) ;
644 DrawText(text, 0 , text.Length());
645
646}
647
648void wxListBox::MacDelete( int N )
649{
650 LDelRow( 1 , N , (ListHandle)m_macList) ;
651 Refresh();
652}
653
654void wxListBox::MacInsert( int n , const char * text)
655{
656 Cell cell = { 0 , 0 } ;
657 cell.v = n ;
658 LAddRow( 1 , cell.v , (ListHandle)m_macList ) ;
659// LSetCell(text, strlen(text), cell, m_macList);
660 Refresh();
661}
662
663void wxListBox::MacAppend( const char * text)
664{
665 Cell cell = { 0 , 0 } ;
666 cell.v = (**(ListHandle)m_macList).dataBounds.bottom ;
667 LAddRow( 1 , cell.v , (ListHandle)m_macList ) ;
668 // LSetCell(text, strlen(text), cell, m_macList);
669 Refresh();
670}
671
672void wxListBox::MacClear()
673{
674 LDelRow( (**(ListHandle)m_macList).dataBounds.bottom , 0 ,(ListHandle) m_macList ) ;
675 Refresh();
676}
677
678void wxListBox::MacSetSelection( int n , bool select )
679{
680 Cell cell = { 0 , 0 } ;
681 if ( ! (m_windowStyle & wxLB_MULTIPLE) )
682 {
683 if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )
684 {
685 LSetSelect( false , cell , (ListHandle)m_macList ) ;
686 }
687 }
688
689 cell.v = n ;
690 LSetSelect( select , cell , (ListHandle)m_macList ) ;
691 LAutoScroll( (ListHandle)m_macList ) ;
692 Refresh();
693}
694
695bool wxListBox::MacIsSelected( int n ) const
696{
697 Cell cell = { 0 , 0 } ;
698 cell.v = n ;
699 return LGetSelect( false , &cell , (ListHandle)m_macList ) ;
700}
701
702void wxListBox::MacDestroy()
703{
704// DisposeExtLDEFInfo( m_macList ) ;
705}
706
707int wxListBox::MacGetSelection() const
708{
709 Cell cell = { 0 , 0 } ;
710 if ( LGetSelect( true , &cell , (ListHandle)m_macList ) )
711 return cell.v ;
712 else
713 return -1 ;
714}
715
716int wxListBox::MacGetSelections( wxArrayInt& aSelections ) const
717{
718 int no_sel = 0 ;
719
720 aSelections.Empty();
721
722 Cell cell = { 0 , 0 } ;
723 cell.v = 0 ;
724
725 while ( LGetSelect( true , &cell ,(ListHandle) m_macList ) )
726 {
727 aSelections.Add( cell.v ) ;
728 no_sel++ ;
729 cell.v++ ;
730 }
731 return no_sel ;
732}
733
734void wxListBox::MacSet( int n , const char * text )
735{
736 // our implementation does not store anything in the list
737 // so we just have to redraw
738 Cell cell = { 0 , 0 } ;
739 cell.v = n ;
740// LSetCell(text, strlen(text), cell, m_macList);
741 Refresh();
742}
743
744void wxListBox::MacScrollTo( int n )
745{
746 // TODO implement scrolling
747}
748
749void wxListBox::OnSize( const wxSizeEvent &event)
750{
751 Point pt;
752
753#if TARGET_CARBON
754 GetListCellSize((ListHandle)m_macList, &pt);
755#else
756 pt = (**(ListHandle)m_macList).cellSize ;
757#endif
758 pt.h = m_width - 15 ;
759 LCellSize( pt , (ListHandle)m_macList ) ;
760}
761
762void wxListBox::MacHandleControlClick( WXWidget control , wxInt16 controlpart )
763{
764 Boolean wasDoubleClick = false ;
765 long result ;
766
767 ::GetControlData( (ControlHandle) m_macControl , kControlNoPart , kControlListBoxDoubleClickTag , sizeof( wasDoubleClick ) , (char*) &wasDoubleClick , &result ) ;
768 if ( !wasDoubleClick )
769 {
770 MacDoClick() ;
771 }
772 else
773 {
774 MacDoDoubleClick() ;
775 }
776}
777
778void wxListBox::MacSetRedraw( bool doDraw )
779{
780 LSetDrawingMode( doDraw , (ListHandle)m_macList ) ;
781
782}
783
784void wxListBox::MacDoClick()
785{
786 wxArrayInt aSelections;
787 int n, count = GetSelections(aSelections);
788
789 if ( count == m_selectionPreImage.GetCount() )
790 {
791 bool hasChanged = false ;
792 for ( int i = 0 ; i < count ; ++i )
793 {
794 if ( aSelections[i] != m_selectionPreImage[i] )
795 {
796 hasChanged = true ;
797 break ;
798 }
799 }
800 if ( !hasChanged )
801 {
802 return ;
803 }
804 }
805
806 m_selectionPreImage = aSelections;
807
808 wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
809 event.SetEventObject( this );
810
811 if ( count > 0 )
812 {
813 n = aSelections[0];
814 if ( HasClientObjectData() )
815 event.SetClientObject( GetClientObject(n) );
816 else if ( HasClientUntypedData() )
817 event.SetClientData( GetClientData(n) );
818 event.SetString( GetString(n) );
819 }
820 else
821 {
822 n = -1;
823 }
824
825 event.m_commandInt = n;
826
827 GetEventHandler()->ProcessEvent(event);
828}
829
830void wxListBox::MacDoDoubleClick()
831{
832 wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
833 event.SetEventObject( this );
834 GetEventHandler()->ProcessEvent(event) ;
835}