]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/utils.cpp
fixing bug 1841377
[wxWidgets.git] / src / mac / carbon / utils.cpp
CommitLineData
e9576ca5 1/////////////////////////////////////////////////////////////////////////////
fb5246be 2// Name: src/mac/carbon/utils.cpp
e9576ca5 3// Purpose: Various utilities
a31a5f85 4// Author: Stefan Csomor
e9576ca5 5// Modified by:
a31a5f85 6// Created: 1998-01-01
e9576ca5 7// RCS-ID: $Id$
a31a5f85 8// Copyright: (c) Stefan Csomor
88a7a4e1 9// Licence: wxWindows licence
e9576ca5
SC
10/////////////////////////////////////////////////////////////////////////////
11
3d1a4878
SC
12#include "wx/wxprec.h"
13
e9576ca5 14#include "wx/utils.h"
88a7a4e1
WS
15
16#ifndef WX_PRECOMP
17 #include "wx/intl.h"
670f9935 18 #include "wx/app.h"
1832043f
WS
19 #if wxUSE_GUI
20 #include "wx/toplevel.h"
48a1108e 21 #include "wx/font.h"
1832043f 22 #endif
88a7a4e1
WS
23#endif
24
2bf2d09e 25#include "wx/apptrait.h"
b6ed2b86
VZ
26
27#if wxUSE_GUI
28 #include "wx/mac/uma.h"
29#endif
e9576ca5
SC
30
31#include <ctype.h>
32
33#include <stdio.h>
34#include <stdlib.h>
35#include <string.h>
36#include <stdarg.h>
37
276ee533 38// #include "MoreFilesX.h"
518af45b 39
66a09d47 40#ifndef __DARWIN__
8638e69b
DS
41 #include <Threads.h>
42 #include <Sound.h>
66a09d47
SC
43#endif
44
7d9bf1f1 45#if wxUSE_GUI
8638e69b 46 #include <CoreServices/CoreServices.h>
8638e69b 47 #include <Carbon/Carbon.h>
e1673e52 48 #include "wx/mac/private/timer.h"
7d9bf1f1 49#endif // wxUSE_GUI
427ff662 50
b46b1d59 51#include "wx/evtloop.h"
8638e69b 52#include "wx/mac/private.h"
a434b43f
VZ
53
54#if defined(__MWERKS__) && wxUSE_UNICODE
03561a3c 55#if __MWERKS__ < 0x4100
a434b43f
VZ
56 #include <wtime.h>
57#endif
6cce68ea 58#endif
a434b43f 59
c655557f 60#if wxUSE_BASE
659b3e8b
VZ
61
62// our OS version is the same in non GUI and GUI cases
c655557f 63wxOperatingSystemId wxGetOsVersion(int *majorVsn, int *minorVsn)
659b3e8b 64{
e6c3d3e6 65 SInt32 theSystem;
6cce68ea 66 Gestalt(gestaltSystemVersion, &theSystem);
8638e69b 67
c655557f 68 if ( majorVsn != NULL )
6cce68ea 69 *majorVsn = (theSystem >> 8);
8638e69b 70
c655557f
VZ
71 if ( minorVsn != NULL )
72 *minorVsn = (theSystem & 0xFF);
73
8bb6b2c0
VZ
74#if defined( __DARWIN__ )
75 return wxOS_MAC_OSX_DARWIN;
659b3e8b 76#else
8bb6b2c0 77 return wxOS_MAC_OS;
659b3e8b
VZ
78#endif
79}
80
e5a9c663
SC
81extern bool WXDLLEXPORT wxIsDebuggerRunning()
82{
03561a3c 83 // TODO : try to find out ...
e5a9c663
SC
84 return false;
85}
86
e9576ca5
SC
87// Emit a beeeeeep
88void wxBell()
89{
e6c3d3e6 90#ifndef __LP64__
0a67a93b 91 SysBeep(30);
e6c3d3e6 92#endif
e9576ca5
SC
93}
94
29c99ad3 95
b6ed2b86
VZ
96#endif // wxUSE_BASE
97
98#if wxUSE_GUI
536732e4 99
8bb6b2c0 100wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
29c99ad3 101{
8bb6b2c0
VZ
102 // We suppose that toolkit version is the same as OS version under Mac
103 wxGetOsVersion(verMaj, verMin);
8638e69b 104
8bb6b2c0 105 return wxPORT_MAC;
29c99ad3
VZ
106}
107
2ddff00c 108wxEventLoopBase* wxGUIAppTraits::CreateEventLoop()
b46b1d59
VZ
109{
110 return new wxEventLoop;
111}
112
c2ca375c
VZ
113wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
114{
115 return new wxCarbonTimerImpl(timer);
116}
117
6b57b49a 118int gs_wxBusyCursorCount = 0;
6cce68ea
SC
119extern wxCursor gMacCurrentCursor;
120wxCursor gMacStoredActiveCursor;
e9576ca5
SC
121
122// Set the cursor to the busy cursor for all windows
f516d986 123void wxBeginBusyCursor(const wxCursor *cursor)
e9576ca5 124{
e40298d5
JS
125 if (gs_wxBusyCursorCount++ == 0)
126 {
6cce68ea
SC
127 gMacStoredActiveCursor = gMacCurrentCursor;
128 cursor->MacInstall();
e40298d5
JS
129 }
130 //else: nothing to do, already set
e9576ca5
SC
131}
132
133// Restore cursor to normal
134void wxEndBusyCursor()
135{
6b57b49a 136 wxCHECK_RET( gs_wxBusyCursorCount > 0,
e40298d5 137 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
5be55d56 138
e40298d5
JS
139 if (--gs_wxBusyCursorCount == 0)
140 {
6cce68ea
SC
141 gMacStoredActiveCursor.MacInstall();
142 gMacStoredActiveCursor = wxNullCursor;
e40298d5 143 }
e9576ca5
SC
144}
145
9d8aca48 146// true if we're between the above two calls
e9576ca5
SC
147bool wxIsBusy()
148{
e40298d5 149 return (gs_wxBusyCursorCount > 0);
ec5d7799 150}
e9576ca5 151
2dbc444a
RD
152#endif // wxUSE_GUI
153
154#if wxUSE_BASE
155
17af82fb 156wxString wxMacFindFolderNoSeparator( short vol,
e40298d5
JS
157 OSType folderType,
158 Boolean createFolder)
2f1ae414 159{
6cce68ea
SC
160 FSRef fsRef;
161 wxString strDir;
5be55d56 162
a2b77260 163 if ( FSFindFolder( vol, folderType, createFolder, &fsRef) == noErr)
17af82fb
VZ
164 {
165 strDir = wxMacFSRefToPath( &fsRef );
166 }
a2b77260 167
6cce68ea 168 return strDir;
2f1ae414
SC
169}
170
17af82fb
VZ
171wxString wxMacFindFolder( short vol,
172 OSType folderType,
173 Boolean createFolder)
174{
175 return wxMacFindFolderNoSeparator(vol, folderType, createFolder) + wxFILE_SEP_PATH;
176}
177
2dbc444a
RD
178#endif // wxUSE_BASE
179
180#if wxUSE_GUI
181
e9576ca5
SC
182// Check whether this window wants to process messages, e.g. Stop button
183// in long calculations.
89954433 184bool wxCheckForInterrupt(wxWindow *WXUNUSED(wnd))
e9576ca5
SC
185{
186 // TODO
9d8aca48 187 return false;
e9576ca5
SC
188}
189
190void wxGetMousePosition( int* x, int* y )
191{
409521e4 192#if wxMAC_USE_QUICKDRAW
6cce68ea 193 Point pt;
e6c3d3e6 194 GetGlobalMouse(&pt);
6cce68ea
SC
195 *x = pt.h;
196 *y = pt.v;
7fc641af
SC
197#else
198 // TODO
409521e4 199#endif
e9576ca5
SC
200};
201
9d8aca48 202// Return true if we have a colour display
e9576ca5
SC
203bool wxColourDisplay()
204{
9d8aca48 205 return true;
e9576ca5
SC
206}
207
208// Returns depth of screen
209int wxDisplayDepth()
210{
409521e4 211#if wxMAC_USE_QUICKDRAW
e1673e52 212 int theDepth = (int) CGDisplayBitsPerPixel(CGMainDisplayID());
6cce68ea 213 Rect globRect;
e40298d5
JS
214 SetRect(&globRect, -32760, -32760, 32760, 32760);
215 GDHandle theMaxDevice;
2f1ae414 216
e40298d5 217 theMaxDevice = GetMaxDevice(&globRect);
8638e69b 218 if (theMaxDevice != NULL)
e40298d5 219 theDepth = (**(**theMaxDevice).gdPMap).pixelSize;
e1673e52 220
6cce68ea 221 return theDepth;
409521e4 222#else
7fc641af 223 return 32; // TODO
409521e4 224#endif
e9576ca5
SC
225}
226
227// Get size of display
228void wxDisplaySize(int *width, int *height)
229{
e6c3d3e6 230 // TODO adapt for multi-displays
a2d6d210 231 CGRect bounds = CGDisplayBounds(CGMainDisplayID());
e6c3d3e6 232 if ( width )
a2d6d210 233 *width = (int)bounds.size.width ;
e6c3d3e6 234 if ( height )
a2d6d210 235 *height = (int)bounds.size.height;
e9576ca5
SC
236}
237
5fde6fcc
GD
238void wxDisplaySizeMM(int *width, int *height)
239{
5b028d57 240 wxDisplaySize(width, height);
6cce68ea 241 // on mac 72 is fixed (at least now;-)
5b028d57 242 float cvPt2Mm = 25.4 / 72;
e8ca7105 243
8638e69b 244 if (width != NULL)
e8ca7105 245 *width = int( *width * cvPt2Mm );
8638e69b
DS
246
247 if (height != NULL)
e8ca7105 248 *height = int( *height * cvPt2Mm );
5fde6fcc
GD
249}
250
ec5d7799
RD
251void wxClientDisplayRect(int *x, int *y, int *width, int *height)
252{
e6c3d3e6 253#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
409521e4
SC
254#if wxMAC_USE_QUICKDRAW
255
e6c3d3e6
SC
256 HIRect bounds ;
257 HIWindowGetAvailablePositioningBounds(kCGNullDirectDisplay,kHICoordSpace72DPIGlobal,
258 &bounds);
259 if ( x )
260 *x = bounds.origin.x;
261 if ( y )
262 *y = bounds.origin.y;
263 if ( width )
264 *width = bounds.size.width;
265 if ( height )
266 *height = bounds.size.height;
409521e4
SC
267#else
268 int w, h;
269 wxDisplaySize(&w,&h);
270 if ( x )
271 *x = 0;
272 if ( y )
273 *y = 24;
274 if ( width )
275 *width = w;
276 if ( height )
277 *height = h-24;
278#endif
e6c3d3e6 279#else
6cce68ea 280 Rect r;
6cce68ea 281 GetAvailableWindowPositioningBounds( GetMainDevice() , &r );
ee658398 282 if ( x )
6cce68ea 283 *x = r.left;
ee658398 284 if ( y )
6cce68ea 285 *y = r.top;
ee658398 286 if ( width )
6cce68ea 287 *width = r.right - r.left;
ee658398 288 if ( height )
6cce68ea 289 *height = r.bottom - r.top;
e6c3d3e6 290#endif
ec5d7799
RD
291}
292
57591e0e
JS
293wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
294{
295 return wxGenericFindWindowAtPoint(pt);
296}
5dbb17e2 297
b6ed2b86
VZ
298#endif // wxUSE_GUI
299
300#if wxUSE_BASE
301
5dbb17e2
SC
302wxString wxGetOsDescription()
303{
6e73695c
GD
304#ifdef WXWIN_OS_DESCRIPTION
305 // use configure generated description if available
5f3f0f17 306 return wxString(wxT("MacOS (")) + wxT(WXWIN_OS_DESCRIPTION) + wxString(wxT(")"));
6e73695c 307#else
6cce68ea 308 return wxT("MacOS"); //TODO:define further
6e73695c
GD
309#endif
310}
311
b6ed2b86 312#ifndef __DARWIN__
14d63513 313wxString wxGetUserHome (const wxString& user)
b6ed2b86
VZ
314{
315 // TODO
14d63513 316 return wxString();
b6ed2b86
VZ
317}
318
7ba7c4e6 319bool wxGetDiskSpace(const wxString& path, wxDiskspaceSize_t *pTotal, wxDiskspaceSize_t *pFree)
b6ed2b86
VZ
320{
321 if ( path.empty() )
9d8aca48 322 return false;
b6ed2b86 323
6cce68ea 324 wxString p = path;
8638e69b 325 if (p[0u] == ':' )
6cce68ea 326 p = wxGetCwd() + p;
b6ed2b86 327
6cce68ea 328 int pos = p.Find(':');
8638e69b 329 if ( pos != wxNOT_FOUND )
6cce68ea 330 p = p.Mid(1,pos);
b6ed2b86 331
6cce68ea 332 p = p + wxT(":");
b6ed2b86 333
6cce68ea 334 OSErr err = noErr;
9d8aca48 335
6cce68ea
SC
336 FSRef fsRef;
337 err = wxMacPathToFSRef( p , &fsRef );
a2b77260
SC
338 if ( noErr == err )
339 {
6cce68ea
SC
340 FSVolumeRefNum vRefNum;
341 err = FSGetVRefNum( &fsRef , &vRefNum );
a2b77260
SC
342 if ( noErr == err )
343 {
6cce68ea
SC
344 UInt64 freeBytes , totalBytes;
345 err = FSGetVInfo( vRefNum , NULL , &freeBytes , &totalBytes );
a2b77260
SC
346 if ( noErr == err )
347 {
9d8aca48 348 if ( pTotal )
6cce68ea 349 *pTotal = wxDiskspaceSize_t( totalBytes );
a2b77260 350 if ( pFree )
6cce68ea 351 *pFree = wxDiskspaceSize_t( freeBytes );
a2b77260
SC
352 }
353 }
b6ed2b86 354 }
9d8aca48 355
6cce68ea 356 return err == noErr;
b6ed2b86
VZ
357}
358#endif // !__DARWIN__
359
3d963f81
SC
360//---------------------------------------------------------------------------
361// wxMac Specific utility functions
362//---------------------------------------------------------------------------
363
5be55d56 364void wxMacStringToPascal( const wxString&from , StringPtr to )
427ff662 365{
6cce68ea
SC
366 wxCharBuffer buf = from.mb_str( wxConvLocal );
367 int len = strlen(buf);
427ff662
SC
368
369 if ( len > 255 )
6cce68ea
SC
370 len = 255;
371 to[0] = len;
372 memcpy( (char*) &to[1] , buf , len );
427ff662
SC
373}
374
5be55d56 375wxString wxMacMakeStringFromPascal( ConstStringPtr from )
427ff662 376{
6cce68ea 377 return wxString( (char*) &from[1] , wxConvLocal , from[0] );
427ff662
SC
378}
379
73280e05
SC
380// ----------------------------------------------------------------------------
381// Common Event Support
382// ----------------------------------------------------------------------------
383
73280e05
SC
384void wxMacWakeUp()
385{
7fc641af 386 OSStatus err = noErr;
8638e69b 387
41ab357e 388#if 0
7fc641af
SC
389 // lead sometimes to race conditions, although all calls used should be thread safe ...
390 static wxMacCarbonEvent s_wakeupEvent;
391 if ( !s_wakeupEvent.IsValid() )
392 {
393 err = s_wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
394 kEventAttributeNone );
73280e05 395 }
7fc641af 396 if ( err == noErr )
73280e05 397 {
7fc641af
SC
398
399 if ( IsEventInQueue( GetMainEventQueue() , s_wakeupEvent ) )
400 return;
401 s_wakeupEvent.SetCurrentTime();
402 err = PostEventToQueue(GetMainEventQueue(), s_wakeupEvent,
403 kEventPriorityHigh );
73280e05 404 }
7fc641af
SC
405#else
406 wxMacCarbonEvent wakeupEvent;
407 wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
408 kEventAttributeNone );
409 err = PostEventToQueue(GetMainEventQueue(), wakeupEvent,
410 kEventPriorityHigh );
411#endif
73280e05
SC
412}
413
d13ea1bd
RD
414#endif // wxUSE_BASE
415
416#if wxUSE_GUI
417
1f1c8bd4
SC
418// ----------------------------------------------------------------------------
419// Native Struct Conversions
420// ----------------------------------------------------------------------------
421
fb5246be 422void wxMacRectToNative( const wxRect *wx , Rect *n )
1f1c8bd4 423{
6cce68ea
SC
424 n->left = wx->x;
425 n->top = wx->y;
426 n->right = wx->x + wx->width;
427 n->bottom = wx->y + wx->height;
1f1c8bd4
SC
428}
429
fb5246be 430void wxMacNativeToRect( const Rect *n , wxRect* wx )
1f1c8bd4 431{
6cce68ea
SC
432 wx->x = n->left;
433 wx->y = n->top;
434 wx->width = n->right - n->left;
435 wx->height = n->bottom - n->top;
1f1c8bd4
SC
436}
437
fb5246be 438void wxMacPointToNative( const wxPoint* wx , Point *n )
1f1c8bd4 439{
6cce68ea
SC
440 n->h = wx->x;
441 n->v = wx->y;
1f1c8bd4
SC
442}
443
fb5246be 444void wxMacNativeToPoint( const Point *n , wxPoint* wx )
1f1c8bd4 445{
6cce68ea
SC
446 wx->x = n->h;
447 wx->y = n->v;
1f1c8bd4 448}
d13ea1bd 449
facd6764
SC
450// ----------------------------------------------------------------------------
451// Carbon Event Support
452// ----------------------------------------------------------------------------
453
facd6764
SC
454OSStatus wxMacCarbonEvent::GetParameter(EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData)
455{
6cce68ea 456 return ::GetEventParameter( m_eventRef , inName , inDesiredType , NULL , inBufferSize , NULL , outData );
facd6764
SC
457}
458
21fd5529 459OSStatus wxMacCarbonEvent::SetParameter(EventParamName inName, EventParamType inType, UInt32 inBufferSize, const void * inData)
facd6764 460{
6cce68ea 461 return ::SetEventParameter( m_eventRef , inName , inType , inBufferSize , inData );
facd6764
SC
462}
463
86d8b744
SC
464// ----------------------------------------------------------------------------
465// Control Access Support
466// ----------------------------------------------------------------------------
467
409521e4
SC
468#if wxMAC_USE_QUICKDRAW
469
bf9a1615
SC
470IMPLEMENT_DYNAMIC_CLASS( wxMacControl , wxObject )
471
472wxMacControl::wxMacControl()
473{
474 Init();
475}
476
1f1c8bd4 477wxMacControl::wxMacControl(wxWindow* peer , bool isRootControl )
9b89f11a 478{
6cce68ea
SC
479 Init();
480 m_peer = peer;
481 m_isRootControl = isRootControl;
9b89f11a
SC
482}
483
fb5246be 484wxMacControl::wxMacControl( wxWindow* peer , ControlRef control )
9b89f11a 485{
6cce68ea
SC
486 Init();
487 m_peer = peer;
6cce68ea 488 m_controlRef = control;
9b89f11a
SC
489}
490
491wxMacControl::wxMacControl( wxWindow* peer , WXWidget control )
492{
6cce68ea
SC
493 Init();
494 m_peer = peer;
6cce68ea 495 m_controlRef = (ControlRef) control;
9b89f11a
SC
496}
497
498wxMacControl::~wxMacControl()
499{
500}
501
502void wxMacControl::Init()
503{
6cce68ea
SC
504 m_peer = NULL;
505 m_controlRef = NULL;
506 m_needsFocusRect = false;
6cce68ea 507 m_isRootControl = false;
9b89f11a
SC
508}
509
5ca0d812
SC
510void wxMacControl::Dispose()
511{
b5d59f11 512 wxASSERT_MSG( m_controlRef != NULL , wxT("Control Handle already NULL, Dispose called twice ?") );
8c981ec6
SC
513 wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
514
83f787ba 515 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
3cfcae3b
SC
516 // we can have situations when being embedded, where the control gets deleted behind our back, so only
517 // CFRelease if we are safe
518 if ( IsValidControlHandle(m_controlRef) )
519 CFRelease(m_controlRef);
6cce68ea 520 m_controlRef = NULL;
5ca0d812
SC
521}
522
e6c3d3e6 523void wxMacControl::SetReference( URefCon data )
5ca0d812 524{
6cce68ea 525 SetControlReference( m_controlRef , data );
5ca0d812
SC
526}
527
29d91661 528OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const
86d8b744 529{
6cce68ea 530 return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize );
86d8b744
SC
531}
532
29d91661 533OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const
86d8b744 534{
6cce68ea 535 return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize );
86d8b744
SC
536}
537
538OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData)
539{
6cce68ea 540 return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData );
86d8b744
SC
541}
542
8638e69b 543OSStatus wxMacControl::SendEvent( EventRef event , OptionBits inOptions )
21fd5529 544{
9d8aca48 545 return SendEventToEventTargetWithOptions( event,
8638e69b 546 HIObjectGetEventTarget( (HIObjectRef) m_controlRef ), inOptions );
21fd5529
SC
547}
548
9d8aca48 549OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions )
21fd5529 550{
6cce68ea 551 wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess );
8638e69b 552
6cce68ea 553 event.SetParameter<HICommand>(kEventParamDirectObject,command);
8638e69b 554
6cce68ea 555 return SendEvent( event , inOptions );
21fd5529
SC
556}
557
9d8aca48 558OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions )
21fd5529 559{
6cce68ea 560 HICommand command;
8638e69b 561
6cce68ea
SC
562 memset( &command, 0 , sizeof(command) );
563 command.commandID = commandID;
564 return SendHICommand( command , inOptions );
21fd5529
SC
565}
566
9d8aca48 567void wxMacControl::Flash( ControlPartCode part , UInt32 ticks )
21fd5529 568{
6cce68ea 569 unsigned long finalTicks;
8638e69b 570
6cce68ea
SC
571 HiliteControl( m_controlRef , part );
572 Delay( ticks , &finalTicks );
573 HiliteControl( m_controlRef , kControlNoPart );
21fd5529
SC
574}
575
7f7b52b4 576SInt32 wxMacControl::GetValue() const
9d8aca48 577{
6cce68ea 578 return ::GetControl32BitValue( m_controlRef );
7f7b52b4
SC
579}
580
581SInt32 wxMacControl::GetMaximum() const
9d8aca48 582{
6cce68ea 583 return ::GetControl32BitMaximum( m_controlRef );
7f7b52b4
SC
584}
585
586SInt32 wxMacControl::GetMinimum() const
9d8aca48 587{
6cce68ea 588 return ::GetControl32BitMinimum( m_controlRef );
7f7b52b4
SC
589}
590
9d8aca48
WS
591void wxMacControl::SetValue( SInt32 v )
592{
6cce68ea 593 ::SetControl32BitValue( m_controlRef , v );
7f7b52b4
SC
594}
595
9d8aca48
WS
596void wxMacControl::SetMinimum( SInt32 v )
597{
6cce68ea 598 ::SetControl32BitMinimum( m_controlRef , v );
7f7b52b4
SC
599}
600
9d8aca48
WS
601void wxMacControl::SetMaximum( SInt32 v )
602{
6cce68ea 603 ::SetControl32BitMaximum( m_controlRef , v );
7f7b52b4
SC
604}
605
606void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum )
607{
6cce68ea
SC
608 ::SetControl32BitMinimum( m_controlRef , minimum );
609 ::SetControl32BitMaximum( m_controlRef , maximum );
610 ::SetControl32BitValue( m_controlRef , value );
7f7b52b4
SC
611}
612
9d8aca48 613OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart )
5ca0d812 614{
6cce68ea 615 return SetKeyboardFocus( GetControlOwner( m_controlRef ), m_controlRef, focusPart );
5ca0d812
SC
616}
617
9d8aca48 618bool wxMacControl::HasFocus() const
5ca0d812 619{
6cce68ea
SC
620 ControlRef control;
621 GetKeyboardFocus( GetUserFocusWindow() , &control );
622 return control == m_controlRef;
5ca0d812
SC
623}
624
fb5246be 625void wxMacControl::SetNeedsFocusRect( bool needs )
9b89f11a 626{
6cce68ea 627 m_needsFocusRect = needs;
9b89f11a
SC
628}
629
9d8aca48 630bool wxMacControl::NeedsFocusRect() const
5ca0d812 631{
6cce68ea 632 return m_needsFocusRect;
5ca0d812
SC
633}
634
89954433 635void wxMacControl::VisibilityChanged(bool WXUNUSED(shown))
29d91661
SC
636{
637}
638
89a66f11
SC
639void wxMacControl::SuperChangedPosition()
640{
641}
642
9d8aca48 643void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
29d91661 644{
6cce68ea 645 m_font = font;
6239ee05 646#ifndef __LP64__
9d8aca48
WS
647 ControlFontStyleRec fontStyle;
648 if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
649 {
8638e69b 650 switch ( font.MacGetThemeFontID() )
9d8aca48 651 {
8638e69b 652 case kThemeSmallSystemFont :
6cce68ea
SC
653 fontStyle.font = kControlFontSmallSystemFont;
654 break;
8638e69b
DS
655
656 case 109 : // mini font
6cce68ea
SC
657 fontStyle.font = -5;
658 break;
8638e69b
DS
659
660 case kThemeSystemFont :
6cce68ea
SC
661 fontStyle.font = kControlFontBigSystemFont;
662 break;
8638e69b
DS
663
664 default :
6cce68ea
SC
665 fontStyle.font = kControlFontBigSystemFont;
666 break;
9d8aca48 667 }
8638e69b 668
6cce68ea 669 fontStyle.flags = kControlUseFontMask;
9d8aca48
WS
670 }
671 else
672 {
6cce68ea
SC
673 fontStyle.font = font.MacGetFontNum();
674 fontStyle.style = font.MacGetFontStyle();
675 fontStyle.size = font.MacGetFontSize();
676 fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask;
9d8aca48 677 }
29d91661 678
6cce68ea
SC
679 fontStyle.just = teJustLeft;
680 fontStyle.flags |= kControlUseJustMask;
29d91661 681 if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL )
6cce68ea 682 fontStyle.just = teJustCenter;
29d91661 683 else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT )
6cce68ea 684 fontStyle.just = teJustRight;
29d91661 685
9d8aca48 686
29d91661
SC
687 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
688 // won't get grayed out by the system anymore
9d8aca48 689
29d91661
SC
690 if ( foreground != *wxBLACK )
691 {
276ee533 692 foreground.GetRGBColor( &fontStyle.foreColor );
6cce68ea 693 fontStyle.flags |= kControlUseForeColorMask;
29d91661 694 }
9d8aca48
WS
695
696 ::SetControlFontStyle( m_controlRef , &fontStyle );
6239ee05 697#endif
29d91661
SC
698}
699
a01d9a25 700void wxMacControl::SetBackgroundColour( const wxColour &WXUNUSED(col) )
7ea087b7 701{
a0a2b5c4 702// HITextViewSetBackgroundColor( m_textView , color );
7ea087b7
SC
703}
704
7f7b52b4
SC
705void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
706{
6cce68ea
SC
707 ::SetControl32BitMinimum( m_controlRef , minimum );
708 ::SetControl32BitMaximum( m_controlRef , maximum );
7f7b52b4
SC
709}
710
8638e69b 711short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers )
5ca0d812 712{
e6c3d3e6 713#ifndef __LP64__
6cce68ea 714 return HandleControlKey( m_controlRef , keyCode , charCode , modifiers );
e6c3d3e6
SC
715#else
716 return 0;
717#endif
5ca0d812
SC
718}
719
720void wxMacControl::SetActionProc( ControlActionUPP actionProc )
721{
6cce68ea 722 SetControlAction( m_controlRef , actionProc );
5ca0d812
SC
723}
724
725void wxMacControl::SetViewSize( SInt32 viewSize )
726{
6cce68ea 727 SetControlViewSize(m_controlRef , viewSize );
5ca0d812
SC
728}
729
730SInt32 wxMacControl::GetViewSize() const
731{
6cce68ea 732 return GetControlViewSize( m_controlRef );
5ca0d812
SC
733}
734
9d8aca48 735bool wxMacControl::IsVisible() const
5ca0d812 736{
6cce68ea 737 return IsControlVisible( m_controlRef );
5ca0d812
SC
738}
739
9d8aca48 740void wxMacControl::SetVisibility( bool visible , bool redraw )
5ca0d812 741{
6cce68ea 742 SetControlVisibility( m_controlRef , visible , redraw );
5ca0d812
SC
743}
744
9d8aca48 745bool wxMacControl::IsEnabled() const
5ca0d812 746{
6cce68ea 747 return IsControlEnabled( m_controlRef );
5ca0d812
SC
748}
749
9d8aca48 750bool wxMacControl::IsActive() const
5ca0d812 751{
6cce68ea 752 return IsControlActive( m_controlRef );
5ca0d812
SC
753}
754
9d8aca48 755void wxMacControl::Enable( bool enable )
5ca0d812 756{
5ca0d812 757 if ( enable )
6cce68ea 758 EnableControl( m_controlRef );
5ca0d812 759 else
6cce68ea 760 DisableControl( m_controlRef );
5ca0d812
SC
761}
762
9d8aca48 763void wxMacControl::SetDrawingEnabled( bool enable )
5ca0d812 764{
6cce68ea 765 HIViewSetDrawingEnabled( m_controlRef , enable );
5ca0d812
SC
766}
767
9d8aca48 768bool wxMacControl::GetNeedsDisplay() const
5ca0d812 769{
e779b609 770 return HIViewGetNeedsDisplay( m_controlRef );
5ca0d812
SC
771}
772
1f1c8bd4 773void wxMacControl::SetNeedsDisplay( RgnHandle where )
5ca0d812 774{
1f1c8bd4 775 if ( !IsVisible() )
6cce68ea 776 return;
fb5246be 777
e779b609 778 HIViewSetNeedsDisplayInRegion( m_controlRef , where , true );
5ca0d812 779}
1f1c8bd4
SC
780
781void wxMacControl::SetNeedsDisplay( Rect* where )
782{
783 if ( !IsVisible() )
6cce68ea 784 return;
1f1c8bd4 785
e779b609 786 if ( where != NULL )
1f1c8bd4 787 {
e779b609
SC
788 RgnHandle update = NewRgn();
789 RectRgn( update , where );
790 HIViewSetNeedsDisplayInRegion( m_controlRef , update , true );
791 DisposeRgn( update );
1f1c8bd4
SC
792 }
793 else
e779b609 794 HIViewSetNeedsDisplay( m_controlRef , true );
1f1c8bd4 795}
5ca0d812 796
9d8aca48 797void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to )
5ca0d812 798{
e779b609 799 HIPoint hiPoint;
8638e69b 800
e779b609
SC
801 hiPoint.x = pt->x;
802 hiPoint.y = pt->y;
803 HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef );
804 pt->x = (int)hiPoint.x;
805 pt->y = (int)hiPoint.y;
5ca0d812
SC
806}
807
9d8aca48 808void wxMacControl::SetRect( Rect *r )
5ca0d812 809{
9b89f11a
SC
810 //A HIRect is actually a CGRect on OSX - which consists of two structures -
811 //CGPoint and CGSize, which have two floats each
6cce68ea
SC
812 HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } };
813 HIViewSetFrame ( m_controlRef , &hir );
814 // eventuall we might have to do a SetVisibility( false , true );
815 // before and a SetVisibility( true , true ); after
8bb6b2c0 816}
5ca0d812 817
9d8aca48 818void wxMacControl::GetRect( Rect *r )
5ca0d812 819{
6cce68ea 820 GetControlBounds( m_controlRef , r );
5ca0d812
SC
821}
822
9d8aca48 823void wxMacControl::GetRectInWindowCoords( Rect *r )
5ca0d812 824{
fb728ebb
SC
825 GetControlBounds( m_controlRef , r ) ;
826
827 WindowRef tlwref = GetControlOwner( m_controlRef ) ;
828
829 wxTopLevelWindowMac* tlwwx = wxFindWinFromMacWindow( tlwref ) ;
830 if ( tlwwx != NULL )
831 {
832 ControlRef rootControl = tlwwx->GetPeer()->GetControlRef() ;
833 HIPoint hiPoint = CGPointMake( 0 , 0 ) ;
834 HIViewConvertPoint( &hiPoint , HIViewGetSuperview(m_controlRef) , rootControl ) ;
835 OffsetRect( r , (short) hiPoint.x , (short) hiPoint.y ) ;
836 }
5ca0d812
SC
837}
838
9d8aca48 839void wxMacControl::GetBestRect( Rect *r )
5ca0d812 840{
6cce68ea 841 short baselineoffset;
8638e69b 842
6cce68ea 843 GetBestControlRect( m_controlRef , r , &baselineoffset );
5ca0d812
SC
844}
845
fb5246be 846void wxMacControl::SetLabel( const wxString &title )
5ca0d812 847{
10a59880
RD
848 wxFontEncoding encoding;
849
850 if ( m_font.Ok() )
851 encoding = m_font.GetEncoding();
852 else
853 encoding = wxFont::GetDefaultEncoding();
9d8aca48 854
7fc641af 855 SetControlTitleWithCFString( m_controlRef , wxMacCFStringHolder( title , encoding ) );
5ca0d812
SC
856}
857
858void wxMacControl::GetFeatures( UInt32 * features )
859{
6cce68ea 860 GetControlFeatures( m_controlRef , features );
5ca0d812
SC
861}
862
9d8aca48 863OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
5ca0d812 864{
6cce68ea 865 OSStatus err = GetControlRegion( m_controlRef , partCode , region );
6cce68ea 866 return err;
5ca0d812
SC
867}
868
9d8aca48 869OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
5ca0d812 870{
9d8aca48 871 return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
6cce68ea 872 (other != NULL) ? other->m_controlRef : NULL);
5ca0d812
SC
873}
874
5ca0d812
SC
875// SetNeedsDisplay would not invalidate the children
876static void InvalidateControlAndChildren( HIViewRef control )
877{
6cce68ea
SC
878 HIViewSetNeedsDisplay( control , true );
879 UInt16 childrenCount = 0;
880 OSStatus err = CountSubControls( control , &childrenCount );
5ca0d812 881 if ( err == errControlIsNotEmbedder )
6cce68ea 882 return;
8638e69b 883
6cce68ea 884 wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") );
5ca0d812 885
6cce68ea 886 for ( UInt16 i = childrenCount; i >=1; --i )
5ca0d812 887 {
6cce68ea 888 HIViewRef child;
8638e69b 889
6cce68ea 890 err = GetIndexedSubControl( control , i , & child );
5ca0d812 891 if ( err == errControlIsNotEmbedder )
6cce68ea 892 return;
8638e69b 893
6cce68ea 894 InvalidateControlAndChildren( child );
5ca0d812
SC
895 }
896}
5ca0d812 897
9d8aca48 898void wxMacControl::InvalidateWithChildren()
5ca0d812 899{
6cce68ea 900 InvalidateControlAndChildren( m_controlRef );
5ca0d812
SC
901}
902
fb5246be 903void wxMacControl::ScrollRect( wxRect *r , int dx , int dy )
5ca0d812 904{
6cce68ea 905 wxASSERT( r != NULL );
8638e69b 906
e779b609
SC
907 HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height);
908 HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy );
5ca0d812
SC
909}
910
6cce68ea
SC
911OSType wxMacCreator = 'WXMC';
912OSType wxMacControlProperty = 'MCCT';
913
88a7a4e1 914void wxMacControl::SetReferenceInNativeControl()
6cce68ea
SC
915{
916 void * data = this;
917 verify_noerr( SetControlProperty ( m_controlRef ,
918 wxMacCreator,wxMacControlProperty, sizeof(data), &data ) );
919}
920
88a7a4e1 921wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control)
6cce68ea
SC
922{
923 wxMacControl* ctl = NULL;
e6c3d3e6 924 ByteCount actualSize;
6cce68ea
SC
925 if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) ,
926 &actualSize , &ctl ) == noErr )
927 {
928 return ctl;
929 }
930 return NULL;
931}
932
933// ============================================================================
934// DataBrowser Wrapper
935// ============================================================================
936//
937// basing on DataBrowserItemIDs
938//
939
bf9a1615
SC
940IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl , wxMacControl )
941
6cce68ea
SC
942pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
943 ControlRef browser,
944 DataBrowserItemID itemID,
945 DataBrowserItemNotification message,
946 DataBrowserItemDataRef itemData )
947{
bf9a1615 948 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
949 if ( ctl != 0 )
950 {
951 ctl->ItemNotification(itemID, message, itemData);
952 }
953}
954
955pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
956 ControlRef browser,
957 DataBrowserItemID itemID,
958 DataBrowserPropertyID property,
959 DataBrowserItemDataRef itemData,
960 Boolean changeValue )
961{
962 OSStatus err = errDataBrowserPropertyNotSupported;
bf9a1615 963 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
964 if ( ctl != 0 )
965 {
966 err = ctl->GetSetItemData(itemID, property, itemData, changeValue);
967 }
968 return err;
969}
970
971pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc(
88a7a4e1
WS
972 ControlRef browser,
973 DataBrowserItemID itemOneID,
974 DataBrowserItemID itemTwoID,
975 DataBrowserPropertyID sortProperty)
6cce68ea 976{
bf9a1615 977 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
978 if ( ctl != 0 )
979 {
980 return ctl->CompareItems(itemOneID, itemTwoID, sortProperty);
981 }
982 return false;
983}
984
985DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL;
986DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL;
987DataBrowserItemCompareUPP gDataBrowserItemCompareUPP = NULL;
988
89954433
VZ
989wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer,
990 const wxPoint& pos,
991 const wxSize& size,
992 long WXUNUSED(style))
993 : wxMacControl( peer )
88a7a4e1 994{
6cce68ea
SC
995 Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
996 OSStatus err = ::CreateDataBrowserControl(
997 MAC_WXHWND(peer->MacGetTopLevelWindowRef()),
998 &bounds, kDataBrowserListView, &m_controlRef );
999 SetReferenceInNativeControl();
1000 verify_noerr( err );
1001 if ( gDataBrowserItemCompareUPP == NULL )
1002 gDataBrowserItemCompareUPP = NewDataBrowserItemCompareUPP(DataBrowserCompareProc);
1003 if ( gDataBrowserItemDataUPP == NULL )
1004 gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc);
1005 if ( gDataBrowserItemNotificationUPP == NULL )
1006 {
1007 gDataBrowserItemNotificationUPP =
6cce68ea 1008 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
6cce68ea
SC
1009 }
1010
1011 DataBrowserCallbacks callbacks;
1012 InitializeDataBrowserCallbacks( &callbacks, kDataBrowserLatestCallbacks );
1013
1014 callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
1015 callbacks.u.v1.itemCompareCallback = gDataBrowserItemCompareUPP;
1016 callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
1017 SetCallbacks( &callbacks );
1018
1019}
1020
1021OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container,
1022 Boolean recurse,
1023 DataBrowserItemState state,
e6c3d3e6 1024 ItemCount *numItems) const
6cce68ea 1025{
88a7a4e1 1026 return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems );
6cce68ea
SC
1027}
1028
1029OSStatus wxMacDataBrowserControl::GetItems( DataBrowserItemID container,
1030 Boolean recurse,
1031 DataBrowserItemState state,
88a7a4e1 1032 Handle items) const
6cce68ea 1033{
88a7a4e1 1034 return GetDataBrowserItems( m_controlRef, container, recurse, state, items );
6cce68ea
SC
1035}
1036
1037OSStatus wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options )
1038{
1039 return SetDataBrowserSelectionFlags( m_controlRef, options );
1040}
1041
1042OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *columnDesc,
1043 DataBrowserTableViewColumnIndex position )
1044{
1045 return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position );
1046}
1047
e2bc1d69 1048OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){
f49c76e5 1049 return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id );
e2bc1d69
KO
1050}
1051
1052OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position )
1053{
f49c76e5 1054 DataBrowserTableViewColumnID id;
e2bc1d69
KO
1055 GetColumnIDFromIndex( position, &id );
1056 return RemoveDataBrowserTableViewColumn( m_controlRef, id );
1057}
1058
6cce68ea
SC
1059OSStatus wxMacDataBrowserControl::AutoSizeColumns()
1060{
1061 return AutoSizeDataBrowserListViewColumns(m_controlRef);
1062}
1063
1064OSStatus wxMacDataBrowserControl::SetHasScrollBars( bool horiz, bool vert )
1065{
1066 return SetDataBrowserHasScrollBars( m_controlRef, horiz, vert );
1067}
1068
1069OSStatus wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
1070{
1071 return SetDataBrowserTableViewHiliteStyle( m_controlRef, hiliteStyle );
1072}
1073
1074OSStatus wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height)
1075{
1076 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1077}
1078
1079OSStatus wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16 *height)
1080{
1081 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1082}
1083
1084OSStatus wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks *callbacks)
1085{
1086 return SetDataBrowserCallbacks( m_controlRef, callbacks );
1087}
1088
88a7a4e1 1089OSStatus wxMacDataBrowserControl::UpdateItems(
6cce68ea
SC
1090 DataBrowserItemID container,
1091 UInt32 numItems,
1092 const DataBrowserItemID *items,
1093 DataBrowserPropertyID preSortProperty,
1094 DataBrowserPropertyID propertyID ) const
1095{
1096 return UpdateDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty, propertyID );
1097}
1098
1099bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item ) const
1100{
1101 return IsDataBrowserItemSelected( m_controlRef, item );
1102}
1103
1104OSStatus wxMacDataBrowserControl::AddItems(
1105 DataBrowserItemID container,
1106 UInt32 numItems,
1107 const DataBrowserItemID *items,
1108 DataBrowserPropertyID preSortProperty )
1109{
1110 return AddDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1111}
1112
1113OSStatus wxMacDataBrowserControl::RemoveItems(
1114 DataBrowserItemID container,
1115 UInt32 numItems,
1116 const DataBrowserItemID *items,
1117 DataBrowserPropertyID preSortProperty )
1118{
1119 return RemoveDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1120}
1121
1122OSStatus wxMacDataBrowserControl::RevealItem(
1123 DataBrowserItemID item,
1124 DataBrowserPropertyID propertyID,
1125 DataBrowserRevealOptions options ) const
1126{
1127 return RevealDataBrowserItem( m_controlRef, item, propertyID, options );
1128}
1129
1130OSStatus wxMacDataBrowserControl::SetSelectedItems(
1131 UInt32 numItems,
1132 const DataBrowserItemID *items,
1133 DataBrowserSetOption operation )
1134{
1135 return SetDataBrowserSelectedItems( m_controlRef, numItems, items, operation );
1136}
1137
1138OSStatus wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const
1139{
1140 return GetDataBrowserSelectionAnchor( m_controlRef, first, last );
1141}
1142
1143OSStatus wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
1144{
1145 return GetDataBrowserTableViewItemID( m_controlRef, row, item );
1146}
1147
1148OSStatus wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item, DataBrowserTableViewRowIndex * row ) const
1149{
1150 return GetDataBrowserTableViewItemRow( m_controlRef, item, row );
1151}
1152
88a7a4e1 1153OSStatus wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height )
6cce68ea 1154{
88a7a4e1 1155 return SetDataBrowserTableViewRowHeight( m_controlRef , height );
6cce68ea
SC
1156}
1157
88a7a4e1 1158OSStatus wxMacDataBrowserControl::GetDefaultRowHeight( UInt16 * height ) const
6cce68ea 1159{
88a7a4e1 1160 return GetDataBrowserTableViewRowHeight( m_controlRef, height );
6cce68ea 1161}
88a7a4e1
WS
1162
1163OSStatus wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item , UInt16 height)
6cce68ea
SC
1164{
1165 return SetDataBrowserTableViewItemRowHeight( m_controlRef, item , height );
1166}
1167
88a7a4e1 1168OSStatus wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item , UInt16 *height) const
6cce68ea
SC
1169{
1170 return GetDataBrowserTableViewItemRowHeight( m_controlRef, item , height);
1171}
1172
88a7a4e1 1173OSStatus wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const
6cce68ea
SC
1174{
1175 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1176}
1177
88a7a4e1 1178OSStatus wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column , UInt16 width )
6cce68ea
SC
1179{
1180 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1181}
1182
88a7a4e1 1183OSStatus wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16 *width ) const
6cce68ea
SC
1184{
1185 return GetDataBrowserTableViewColumnWidth( m_controlRef , width );
1186}
1187
88a7a4e1 1188OSStatus wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width )
6cce68ea
SC
1189{
1190 return SetDataBrowserTableViewColumnWidth( m_controlRef , width );
1191}
1192
88a7a4e1 1193OSStatus wxMacDataBrowserControl::GetColumnCount(UInt32* numColumns) const
6cce68ea
SC
1194{
1195 return GetDataBrowserTableViewColumnCount( m_controlRef, numColumns);
1196}
1197
88a7a4e1 1198OSStatus wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column,
e6c3d3e6 1199 DataBrowserTableViewColumnIndex *position) const
6cce68ea
SC
1200{
1201 return GetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1202}
1203
e6c3d3e6 1204OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position)
6cce68ea
SC
1205{
1206 return SetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1207}
1208
88a7a4e1 1209OSStatus wxMacDataBrowserControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
6cce68ea
SC
1210{
1211 return GetDataBrowserScrollPosition( m_controlRef , top , left );
1212}
1213
88a7a4e1 1214OSStatus wxMacDataBrowserControl::SetScrollPosition( UInt32 top , UInt32 left )
6cce68ea
SC
1215{
1216 return SetDataBrowserScrollPosition( m_controlRef , top , left );
1217}
1218
88a7a4e1 1219OSStatus wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID *column ) const
6cce68ea
SC
1220{
1221 return GetDataBrowserSortProperty( m_controlRef , column );
1222}
1223
88a7a4e1 1224OSStatus wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column )
6cce68ea
SC
1225{
1226 return SetDataBrowserSortProperty( m_controlRef , column );
1227}
88a7a4e1
WS
1228
1229OSStatus wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder *order ) const
6cce68ea
SC
1230{
1231 return GetDataBrowserSortOrder( m_controlRef , order );
1232}
1233
88a7a4e1 1234OSStatus wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order )
6cce68ea
SC
1235{
1236 return SetDataBrowserSortOrder( m_controlRef , order );
1237}
1238
88a7a4e1
WS
1239OSStatus wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property,
1240 DataBrowserPropertyFlags *flags ) const
6cce68ea
SC
1241{
1242 return GetDataBrowserPropertyFlags( m_controlRef , property , flags );
1243}
1244
88a7a4e1
WS
1245OSStatus wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property,
1246 DataBrowserPropertyFlags flags )
6cce68ea
SC
1247{
1248 return SetDataBrowserPropertyFlags( m_controlRef , property , flags );
1249}
1250
88a7a4e1
WS
1251OSStatus wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property,
1252 DataBrowserListViewHeaderDesc *desc ) const
6cce68ea
SC
1253{
1254 return GetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
1255}
1256
88a7a4e1
WS
1257OSStatus wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property,
1258 DataBrowserListViewHeaderDesc *desc )
6cce68ea 1259{
88a7a4e1 1260 return SetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
6cce68ea
SC
1261}
1262
88a7a4e1
WS
1263OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property ,
1264 Boolean expandableRows )
6cce68ea
SC
1265{
1266 return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows);
1267}
1268
1269// ============================================================================
88a7a4e1 1270// Higher-level Databrowser
6cce68ea
SC
1271// ============================================================================
1272//
1273// basing on data item objects
1274//
1275
1276wxMacDataItem::wxMacDataItem()
88a7a4e1 1277{
e2bc1d69 1278 m_data = NULL;
f49c76e5 1279
e2bc1d69
KO
1280 m_order = 0;
1281 m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
6cce68ea
SC
1282}
1283
88a7a4e1
WS
1284wxMacDataItem::~wxMacDataItem()
1285{
6cce68ea 1286}
88a7a4e1 1287
e2bc1d69 1288void wxMacDataItem::SetOrder( SInt32 order )
6cce68ea 1289{
e2bc1d69
KO
1290 m_order = order;
1291}
1292
1293SInt32 wxMacDataItem::GetOrder() const
1294{
1295 return m_order;
1296}
1297
1298void wxMacDataItem::SetData( void* data)
1299{
1300 m_data = data;
1301}
1302
1303void* wxMacDataItem::GetData() const
1304{
1305 return m_data;
1306}
1307
1308short wxMacDataItem::GetColumn()
1309{
1310 return m_colId;
1311}
1312
1313void wxMacDataItem::SetColumn( short col )
1314{
1315 m_colId = col;
f49c76e5 1316}
e2bc1d69
KO
1317
1318void wxMacDataItem::SetLabel( const wxString& str)
1319{
1320 m_label = str;
1321 m_cfLabel.Assign( str , wxLocale::GetSystemEncoding());
6cce68ea
SC
1322}
1323
e2bc1d69
KO
1324const wxString& wxMacDataItem::GetLabel() const
1325{
1326 return m_label;
1327}
1328
89954433 1329bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
e2bc1d69
KO
1330 const wxMacDataItem* rhs,
1331 DataBrowserPropertyID sortProperty) const
1332{
bf9a1615 1333 const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs);
e2bc1d69 1334 bool retval = false;
f49c76e5 1335
67650ea0 1336 if ( sortProperty == m_colId ){
e2bc1d69
KO
1337 retval = m_label.CmpNoCase( otherItem->m_label) < 0;
1338 }
f49c76e5 1339
67650ea0 1340 else if ( sortProperty == kNumericOrderColumnId )
e2bc1d69
KO
1341 retval = m_order < otherItem->m_order;
1342
1343 return retval;
1344}
1345
89954433 1346OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *WXUNUSED(owner) ,
6cce68ea
SC
1347 DataBrowserPropertyID property,
1348 DataBrowserItemDataRef itemData,
88a7a4e1 1349 bool changeValue )
6cce68ea 1350{
e2bc1d69
KO
1351 OSStatus err = errDataBrowserPropertyNotSupported;
1352 if ( !changeValue )
1353 {
1354 if ( property == m_colId ){
1355 err = ::SetDataBrowserItemDataText( itemData, m_cfLabel );
1356 err = noErr;
1357 }
1358 else if ( property == kNumericOrderColumnId ){
1359 err = ::SetDataBrowserItemDataValue( itemData, m_order );
1360 err = noErr;
1361 }
1362 else{
1363 }
1364 }
1365 else
1366 {
1367 switch (property)
1368 {
1369 // no editable props here
1370 default:
1371 break;
1372 }
1373 }
1374
1375 return err;
6cce68ea
SC
1376}
1377
89954433
VZ
1378void wxMacDataItem::Notification(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
1379 DataBrowserItemNotification WXUNUSED(message),
1380 DataBrowserItemDataRef WXUNUSED(itemData) ) const
6cce68ea
SC
1381{
1382}
1383
bf9a1615 1384IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl )
6cce68ea 1385
88a7a4e1 1386wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) :
6cce68ea 1387 wxMacDataBrowserControl( peer, pos, size, style )
88a7a4e1 1388{
6cce68ea 1389 m_suppressSelection = false;
e2bc1d69
KO
1390 m_sortOrder = SortOrder_None;
1391 m_clientDataItemsType = wxClientData_None;
1392}
1393
1394wxMacDataItem* wxMacDataItemBrowserControl::CreateItem()
1395{
1396 return new wxMacDataItem();
6cce68ea 1397}
88a7a4e1
WS
1398
1399wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser)
6cce68ea
SC
1400{
1401 m_former = browser->SuppressSelection(true);
1402 m_browser = browser;
1403}
1404
1405wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1406{
1407 m_browser->SuppressSelection(m_former);
1408}
1409
1410bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress )
1411{
1412 bool former = m_suppressSelection;
1413 m_suppressSelection = suppress;
1414
1415 return former;
1416}
1417
88a7a4e1
WS
1418Boolean wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID,
1419 DataBrowserItemID itemTwoID,
1420 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1421{
1422 wxMacDataItem* itemOne = (wxMacDataItem*) itemOneID;
1423 wxMacDataItem* itemTwo = (wxMacDataItem*) itemTwoID;
1424 return CompareItems( itemOne , itemTwo , sortProperty );
1425}
1426
88a7a4e1
WS
1427Boolean wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem* itemOne,
1428 const wxMacDataItem* itemTwo,
1429 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1430{
1431 Boolean retval = false;
1432 if ( itemOne != NULL )
1433 retval = itemOne->IsLessThan( this , itemTwo , sortProperty);
1434 return retval;
1435}
1436
1437OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1438 DataBrowserItemID itemID,
1439 DataBrowserPropertyID property,
1440 DataBrowserItemDataRef itemData,
88a7a4e1 1441 Boolean changeValue )
6cce68ea
SC
1442{
1443 wxMacDataItem* item = (wxMacDataItem*) itemID;
1444 return GetSetItemData(item, property, itemData , changeValue );
1445}
1446
1447OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1448 wxMacDataItem* item,
1449 DataBrowserPropertyID property,
1450 DataBrowserItemDataRef itemData,
88a7a4e1 1451 Boolean changeValue )
6cce68ea
SC
1452{
1453 OSStatus err = errDataBrowserPropertyNotSupported;
1454 switch( property )
1455 {
1456 case kDataBrowserContainerIsClosableProperty :
1457 case kDataBrowserContainerIsSortableProperty :
1458 case kDataBrowserContainerIsOpenableProperty :
1459 // right now default behaviour on these
1460 break;
1461 default :
f49c76e5 1462
e2bc1d69 1463 if ( item != NULL ){
6cce68ea 1464 err = item->GetSetData( this, property , itemData , changeValue );
e2bc1d69 1465 }
6cce68ea 1466 break;
88a7a4e1 1467
6cce68ea
SC
1468 }
1469 return err;
1470}
1471
1472void wxMacDataItemBrowserControl::ItemNotification(
1473 DataBrowserItemID itemID,
1474 DataBrowserItemNotification message,
88a7a4e1 1475 DataBrowserItemDataRef itemData)
6cce68ea 1476{
88a7a4e1 1477 wxMacDataItem* item = (wxMacDataItem*) itemID;
6cce68ea
SC
1478 ItemNotification( item , message, itemData);
1479}
1480
1481void wxMacDataItemBrowserControl::ItemNotification(
1482 const wxMacDataItem* item,
1483 DataBrowserItemNotification message,
88a7a4e1 1484 DataBrowserItemDataRef itemData)
6cce68ea
SC
1485{
1486 if (item != NULL)
1487 item->Notification( this, message, itemData);
1488}
1489
88a7a4e1
WS
1490unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* container,
1491 bool recurse , DataBrowserItemState state) const
6cce68ea 1492{
e6c3d3e6 1493 ItemCount numItems = 0;
88a7a4e1
WS
1494 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID)container,
1495 recurse, state, &numItems ) );
6cce68ea
SC
1496 return numItems;
1497}
1498
f49c76e5 1499unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container,
e2bc1d69
KO
1500 bool recurse ) const
1501{
1502 return GetItemCount( container, recurse, kDataBrowserItemIsSelected );
1503
1504}
1505
88a7a4e1
WS
1506void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem* container,
1507 bool recurse , DataBrowserItemState state, wxArrayMacDataItemPtr &items) const
6cce68ea
SC
1508{
1509 Handle handle = NewHandle(0);
88a7a4e1
WS
1510 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID)container ,
1511 recurse , state, handle) );
6cce68ea
SC
1512
1513 int itemCount = GetHandleSize(handle)/sizeof(DataBrowserItemID);
1514 HLock( handle );
1515 wxMacDataItemPtr* itemsArray = (wxMacDataItemPtr*) *handle;
1516 for ( int i = 0; i < itemCount; ++i)
1517 {
1518 items.Add(itemsArray[i]);
1519 }
1520 HUnlock( handle );
1521 DisposeHandle( handle );
1522}
1523
1524unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem* item) const
1525{
1526 DataBrowserTableViewRowIndex row;
1527 OSStatus err = GetItemRow( (DataBrowserItemID) item , &row);
1528 wxASSERT( err == noErr);
1529 return row;
1530}
1531
1532wxMacDataItem* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n) const
1533{
1534 DataBrowserItemID id;
1535 OSStatus err = GetItemID( (DataBrowserTableViewRowIndex) n , &id);
1536 wxASSERT( err == noErr);
88a7a4e1 1537 return (wxMacDataItem*) id;
6cce68ea
SC
1538}
1539
88a7a4e1 1540void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem *container,
6cce68ea
SC
1541 const wxMacDataItem *item , DataBrowserPropertyID property) const
1542{
88a7a4e1 1543 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, 1,
6cce68ea
SC
1544 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty /* notSorted */, property ) );
1545}
1546
88a7a4e1 1547void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem *container,
6cce68ea
SC
1548 wxArrayMacDataItemPtr &itemArray , DataBrowserPropertyID property) const
1549{
1550 unsigned int noItems = itemArray.GetCount();
1551 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1552 for ( unsigned int i = 0; i < noItems; ++i )
1553 items[i] = (DataBrowserItemID) itemArray[i];
1554
88a7a4e1 1555 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, noItems,
6cce68ea
SC
1556 items, kDataBrowserItemNoProperty /* notSorted */, property ) );
1557 delete [] items;
1558}
1559
3ef4e126 1560void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyType colType,
0e4124e7 1561 const wxString& title, SInt16 just, int defaultWidth)
e2bc1d69
KO
1562{
1563 DataBrowserListViewColumnDesc columnDesc;
1564 columnDesc.headerBtnDesc.titleOffset = 0;
1565 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
1566
1567 columnDesc.headerBtnDesc.btnFontStyle.flags =
1568 kControlUseFontMask | kControlUseJustMask;
1569
f49c76e5 1570 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
e2bc1d69
KO
1571 columnDesc.headerBtnDesc.btnFontStyle.just = just;
1572 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
1573 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
f49c76e5 1574
e2bc1d69
KO
1575 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1576 // defined for other modes?
1577 wxFontEncoding enc;
1578 if ( m_font.Ok() )
1579 enc = m_font.GetEncoding();
1580 else
1581 enc = wxLocale::GetSystemEncoding();
1582 wxMacCFStringHolder cfTitle;
1583 cfTitle.Assign( title, enc );
f49c76e5 1584 columnDesc.headerBtnDesc.titleString = cfTitle;
0d2d29b1
KO
1585
1586 columnDesc.headerBtnDesc.minimumWidth = 0;
1587 columnDesc.headerBtnDesc.maximumWidth = 30000;
e2bc1d69
KO
1588
1589 columnDesc.propertyDesc.propertyID = (kMinColumnId + colId);
1590 columnDesc.propertyDesc.propertyType = colType;
f49c76e5 1591 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
f49c76e5 1592 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
67650ea0 1593 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
e2bc1d69
KO
1594
1595 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
0d2d29b1
KO
1596
1597 if (defaultWidth > 0){
1598 SetColumnWidth(colId, defaultWidth);
1599 }
1600
e2bc1d69
KO
1601}
1602
1603void wxMacDataItemBrowserControl::SetColumnWidth(int colId, int width)
1604{
1605 DataBrowserPropertyID id;
1606 GetColumnIDFromIndex(colId, &id);
1607 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id, width));
1608}
1609
1610int wxMacDataItemBrowserControl::GetColumnWidth(int colId)
1611{
1612 DataBrowserPropertyID id;
1613 GetColumnIDFromIndex(colId, &id);
1614 UInt16 result;
1615 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id, &result));
1616 return result;
1617}
1618
6cce68ea
SC
1619void wxMacDataItemBrowserControl::AddItem(wxMacDataItem *container, wxMacDataItem *item)
1620{
88a7a4e1 1621 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, 1,
6cce68ea
SC
1622 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty ) );
1623}
1624
88a7a4e1 1625void wxMacDataItemBrowserControl::AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray )
6cce68ea
SC
1626{
1627 unsigned int noItems = itemArray.GetCount();
1628 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1629 for ( unsigned int i = 0; i < noItems; ++i )
1630 items[i] = (DataBrowserItemID) itemArray[i];
1631
88a7a4e1 1632 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, noItems,
6cce68ea
SC
1633 (DataBrowserItemID*) items, kDataBrowserItemNoProperty ) );
1634 delete [] items;
1635}
1636
88a7a4e1 1637void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem *container, wxMacDataItem* item)
6cce68ea 1638{
88a7a4e1 1639 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 1,
e6c3d3e6 1640 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty );
6cce68ea
SC
1641 verify_noerr( err );
1642}
1643
88a7a4e1 1644void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray)
6cce68ea
SC
1645{
1646 unsigned int noItems = itemArray.GetCount();
1647 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1648 for ( unsigned int i = 0; i < noItems; ++i )
1649 items[i] = (DataBrowserItemID) itemArray[i];
1650
88a7a4e1 1651 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, noItems,
e6c3d3e6 1652 (DataBrowserItemID*) items, kDataBrowserItemNoProperty );
6cce68ea
SC
1653 verify_noerr( err );
1654 delete [] items;
1655}
1656
88a7a4e1 1657void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem *container)
6cce68ea
SC
1658{
1659 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 0 , NULL , kDataBrowserItemNoProperty );
1660 verify_noerr( err );
1661}
1662
88a7a4e1 1663void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem* item , DataBrowserSetOption option)
6cce68ea
SC
1664{
1665 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID*) &item, option ));
1666}
1667
88a7a4e1 1668void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option)
6cce68ea
SC
1669{
1670 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL , option ));
1671}
1672
88a7a4e1 1673void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr &itemArray , DataBrowserSetOption option)
6cce68ea
SC
1674{
1675 unsigned int noItems = itemArray.GetCount();
1676 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1677 for ( unsigned int i = 0; i < noItems; ++i )
1678 items[i] = (DataBrowserItemID) itemArray[i];
1679
1680 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems, (DataBrowserItemID*) items, option ));
1681 delete [] items;
1682}
1683
1684Boolean wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem* item) const
1685{
1686 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID) item);
1687}
1688
88a7a4e1 1689void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options)
6cce68ea
SC
1690{
1691 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID) item, kDataBrowserNoItem , options ) );
1692}
1693
88a7a4e1 1694void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const
6cce68ea 1695{
88a7a4e1 1696 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID*) first, (DataBrowserItemID*) last) );
6cce68ea
SC
1697}
1698
e2bc1d69
KO
1699wxClientDataType wxMacDataItemBrowserControl::GetClientDataType() const
1700{
1701 return m_clientDataItemsType;
1702}
1703void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType)
1704{
1705 m_clientDataItemsType = clientDataItemsType;
1706}
1707
1708unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1709{
1710 return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState);
1711}
1712
1713void wxMacDataItemBrowserControl::MacDelete( unsigned int n )
1714{
1715 wxMacDataItem* item = (wxMacDataItem*)GetItemFromLine( n );
1716 RemoveItem( wxMacDataBrowserRootContainer, item );
1717}
1718
a236aa20
VZ
1719void wxMacDataItemBrowserControl::MacInsert( unsigned int n,
1720 const wxArrayStringsAdapter& items,
1721 int column )
e2bc1d69
KO
1722{
1723 size_t itemsCount = items.GetCount();
1724 if ( itemsCount == 0 )
1725 return;
1726
1727 SInt32 frontLineOrder = 0;
1728
1729 if ( m_sortOrder == SortOrder_None )
1730 {
1731 // increase the order of the lines to be shifted
1732 unsigned int lines = MacGetCount();
1733 for ( unsigned int i = n; i < lines; ++i)
1734 {
1735 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
1736 iter->SetOrder( iter->GetOrder() + itemsCount );
1737 }
1738 if ( n > 0 )
1739 {
1740 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
1741 frontLineOrder = iter->GetOrder();
1742 }
1743 }
1744
1745 wxArrayMacDataItemPtr ids;
1746 ids.SetCount( itemsCount );
1747
1748 for ( unsigned int i = 0; i < itemsCount; ++i )
1749 {
1750 wxMacDataItem* item = CreateItem();
1751 item->SetLabel( items[i]);
1752 if ( column != -1 )
1753 item->SetColumn( kMinColumnId + column );
f49c76e5 1754
e2bc1d69
KO
1755 if ( m_sortOrder == SortOrder_None )
1756 item->SetOrder( frontLineOrder + 1 + i );
1757
1758 ids[i] = item;
1759 }
1760
1761 AddItems( wxMacDataBrowserRootContainer, ids );
1762}
1763
1764int wxMacDataItemBrowserControl::MacAppend( const wxString& text)
1765{
1766 wxMacDataItem* item = CreateItem();
1767 item->SetLabel( text );
1768 if ( m_sortOrder == SortOrder_None )
1769 {
1770 unsigned int lines = MacGetCount();
1771 if ( lines == 0 )
1772 item->SetOrder( 1 );
1773 else
1774 {
1775 wxMacDataItem* frontItem = (wxMacDataItem*) GetItemFromLine(lines-1);
1776 item->SetOrder( frontItem->GetOrder() + 1 );
1777 }
1778 }
1779 AddItem( wxMacDataBrowserRootContainer, item );
1780
1781 return GetLineFromItem(item);
1782}
1783
1784void wxMacDataItemBrowserControl::MacClear()
1785{
1786 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1787 RemoveAllItems(wxMacDataBrowserRootContainer);
1788}
1789
1790void wxMacDataItemBrowserControl::MacDeselectAll()
1791{
1792 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1793 SetSelectedAllItems( kDataBrowserItemsRemove );
1794}
1795
1796void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n, bool select, bool multi )
1797{
1798 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
1799 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1800
1801 if ( IsItemSelected( item ) != select )
1802 {
1803 if ( select )
1804 SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
1805 else
1806 SetSelectedItem( item, kDataBrowserItemsRemove );
1807 }
1808
1809 MacScrollTo( n );
1810}
1811
1812bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n ) const
1813{
1814 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
1815 return IsItemSelected( item );
1816}
1817
1818int wxMacDataItemBrowserControl::MacGetSelection() const
1819{
1820 wxMacDataItemPtr first, last;
1821 GetSelectionAnchor( &first, &last );
1822
1823 if ( first != NULL )
1824 {
1825 return GetLineFromItem( first );
1826 }
1827
1828 return -1;
1829}
1830
1831int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt& aSelections ) const
1832{
1833 aSelections.Empty();
1834 wxArrayMacDataItemPtr selectedItems;
1835 GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
1836
1837 int count = selectedItems.GetCount();
1838
1839 for ( int i = 0; i < count; ++i)
1840 {
1841 aSelections.Add(GetLineFromItem(selectedItems[i]));
1842 }
1843
1844 return count;
1845}
1846
1847void wxMacDataItemBrowserControl::MacSetString( unsigned int n, const wxString& text )
1848{
1849 // as we don't store the strings we only have to issue a redraw
1850 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
1851 item->SetLabel( text );
1852 UpdateItem( wxMacDataBrowserRootContainer, item , kTextColumnId );
1853}
1854
1855wxString wxMacDataItemBrowserControl::MacGetString( unsigned int n ) const
1856{
1857 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1858 return item->GetLabel();
1859}
1860
1861void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n, void * data)
1862{
1863 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
1864 item->SetData( data );
1865 // not displayed, therefore no Update infos to DataBrowser
1866}
1867
1868void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n) const
1869{
1870 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1871 return item->GetData();
1872}
1873
1874void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n )
1875{
6239ee05
SC
1876 UInt32 top , left ;
1877 GetScrollPosition( &top , &left ) ;
1878 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1879
c4807c0a
SC
1880 // there is a bug in RevealItem that leads to situations
1881 // in large lists, where the item does not get scrolled
1882 // into sight, so we do a pre-scroll if necessary
6239ee05
SC
1883 UInt16 height ;
1884 GetRowHeight( (DataBrowserItemID) item , &height ) ;
c4807c0a
SC
1885 UInt32 linetop = n * ((UInt32) height );
1886 UInt32 linebottom = linetop + height;
1887 Rect rect ;
1888 GetRect( &rect );
1889
1890 if ( linetop < top || linebottom > (top + rect.bottom - rect.top ) )
1891 SetScrollPosition( wxMax( n-2, 0 ) * ((UInt32)height) , left ) ;
6239ee05
SC
1892
1893 RevealItem( item , kDataBrowserRevealWithoutSelecting );
e2bc1d69
KO
1894}
1895
88a7a4e1 1896
6cce68ea 1897
5ca0d812
SC
1898//
1899// Tab Control
1900//
9d8aca48
WS
1901
1902OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
5ca0d812 1903{
6cce68ea 1904 return ::SetTabEnabled( m_controlRef , tabNo , enable );
5ca0d812 1905}
9d8aca48 1906
409521e4
SC
1907#endif
1908
30e77b5c
SC
1909//
1910// Quartz Support
1911//
1912
30e77b5c
SC
1913/*
1914 Return the generic RGB color space. This is a 'get' function and the caller should
1915 not release the returned value unless the caller retains it first. Usually callers
1916 of this routine will immediately use the returned colorspace with CoreGraphics
1917 so they typically do not need to retain it themselves.
fb5246be 1918
30e77b5c
SC
1919 This function creates the generic RGB color space once and hangs onto it so it can
1920 return it whenever this function is called.
1921*/
1922
1923CGColorSpaceRef wxMacGetGenericRGBColorSpace()
1924{
6cce68ea 1925 static wxMacCFRefHolder<CGColorSpaceRef> genericRGBColorSpace;
fb5246be 1926
8638e69b
DS
1927 if (genericRGBColorSpace == NULL)
1928 {
e1673e52 1929 genericRGBColorSpace.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) );
8638e69b
DS
1930 }
1931
30e77b5c
SC
1932 return genericRGBColorSpace;
1933}
30e77b5c 1934
a01d9a25
SC
1935CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush )
1936{
1937 CGColorRef color ;
1938 HIThemeBrushCreateCGColor( brush, &color );
1939 return color;
1940}
1941
409521e4
SC
1942#if wxMAC_USE_QUICKDRAW
1943
e6c3d3e6
SC
1944void wxMacGlobalToLocal( WindowRef window , Point*pt )
1945{
e6c3d3e6 1946 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
1947 HIViewRef contentView ;
1948 // TODO check toolbar offset
daca43d8 1949 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
f49c76e5 1950 HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
e6c3d3e6
SC
1951 pt->h = p.x;
1952 pt->v = p.y;
e6c3d3e6
SC
1953}
1954
1955void wxMacLocalToGlobal( WindowRef window , Point*pt )
1956{
e6c3d3e6 1957 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
1958 HIViewRef contentView ;
1959 // TODO check toolbar offset
daca43d8
SC
1960 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
1961 HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
e6c3d3e6
SC
1962 pt->h = p.x;
1963 pt->v = p.y;
e6c3d3e6 1964}
409521e4 1965#endif
54ce9ebb 1966
b6ed2b86 1967#endif // wxUSE_GUI
7fc641af
SC
1968
1969#if wxUSE_BASE
1970
1971#endif