]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/utils.cpp
Implement wxBitmap::GetSubBitmap.
[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{
9d8aca48 702 // TODO
7ea087b7
SC
703 // setting up a color proc is not recommended anymore
704}
705
7f7b52b4
SC
706void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
707{
6cce68ea
SC
708 ::SetControl32BitMinimum( m_controlRef , minimum );
709 ::SetControl32BitMaximum( m_controlRef , maximum );
7f7b52b4
SC
710}
711
8638e69b 712short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers )
5ca0d812 713{
e6c3d3e6 714#ifndef __LP64__
6cce68ea 715 return HandleControlKey( m_controlRef , keyCode , charCode , modifiers );
e6c3d3e6
SC
716#else
717 return 0;
718#endif
5ca0d812
SC
719}
720
721void wxMacControl::SetActionProc( ControlActionUPP actionProc )
722{
6cce68ea 723 SetControlAction( m_controlRef , actionProc );
5ca0d812
SC
724}
725
726void wxMacControl::SetViewSize( SInt32 viewSize )
727{
6cce68ea 728 SetControlViewSize(m_controlRef , viewSize );
5ca0d812
SC
729}
730
731SInt32 wxMacControl::GetViewSize() const
732{
6cce68ea 733 return GetControlViewSize( m_controlRef );
5ca0d812
SC
734}
735
9d8aca48 736bool wxMacControl::IsVisible() const
5ca0d812 737{
6cce68ea 738 return IsControlVisible( m_controlRef );
5ca0d812
SC
739}
740
9d8aca48 741void wxMacControl::SetVisibility( bool visible , bool redraw )
5ca0d812 742{
6cce68ea 743 SetControlVisibility( m_controlRef , visible , redraw );
5ca0d812
SC
744}
745
9d8aca48 746bool wxMacControl::IsEnabled() const
5ca0d812 747{
6cce68ea 748 return IsControlEnabled( m_controlRef );
5ca0d812
SC
749}
750
9d8aca48 751bool wxMacControl::IsActive() const
5ca0d812 752{
6cce68ea 753 return IsControlActive( m_controlRef );
5ca0d812
SC
754}
755
9d8aca48 756void wxMacControl::Enable( bool enable )
5ca0d812 757{
5ca0d812 758 if ( enable )
6cce68ea 759 EnableControl( m_controlRef );
5ca0d812 760 else
6cce68ea 761 DisableControl( m_controlRef );
5ca0d812
SC
762}
763
9d8aca48 764void wxMacControl::SetDrawingEnabled( bool enable )
5ca0d812 765{
6cce68ea 766 HIViewSetDrawingEnabled( m_controlRef , enable );
5ca0d812
SC
767}
768
9d8aca48 769bool wxMacControl::GetNeedsDisplay() const
5ca0d812 770{
e779b609 771 return HIViewGetNeedsDisplay( m_controlRef );
5ca0d812
SC
772}
773
1f1c8bd4 774void wxMacControl::SetNeedsDisplay( RgnHandle where )
5ca0d812 775{
1f1c8bd4 776 if ( !IsVisible() )
6cce68ea 777 return;
fb5246be 778
e779b609 779 HIViewSetNeedsDisplayInRegion( m_controlRef , where , true );
5ca0d812 780}
1f1c8bd4
SC
781
782void wxMacControl::SetNeedsDisplay( Rect* where )
783{
784 if ( !IsVisible() )
6cce68ea 785 return;
1f1c8bd4 786
e779b609 787 if ( where != NULL )
1f1c8bd4 788 {
e779b609
SC
789 RgnHandle update = NewRgn();
790 RectRgn( update , where );
791 HIViewSetNeedsDisplayInRegion( m_controlRef , update , true );
792 DisposeRgn( update );
1f1c8bd4
SC
793 }
794 else
e779b609 795 HIViewSetNeedsDisplay( m_controlRef , true );
1f1c8bd4 796}
5ca0d812 797
9d8aca48 798void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to )
5ca0d812 799{
e779b609 800 HIPoint hiPoint;
8638e69b 801
e779b609
SC
802 hiPoint.x = pt->x;
803 hiPoint.y = pt->y;
804 HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef );
805 pt->x = (int)hiPoint.x;
806 pt->y = (int)hiPoint.y;
5ca0d812
SC
807}
808
9d8aca48 809void wxMacControl::SetRect( Rect *r )
5ca0d812 810{
9b89f11a
SC
811 //A HIRect is actually a CGRect on OSX - which consists of two structures -
812 //CGPoint and CGSize, which have two floats each
6cce68ea
SC
813 HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } };
814 HIViewSetFrame ( m_controlRef , &hir );
815 // eventuall we might have to do a SetVisibility( false , true );
816 // before and a SetVisibility( true , true ); after
8bb6b2c0 817}
5ca0d812 818
9d8aca48 819void wxMacControl::GetRect( Rect *r )
5ca0d812 820{
6cce68ea 821 GetControlBounds( m_controlRef , r );
5ca0d812
SC
822}
823
9d8aca48 824void wxMacControl::GetRectInWindowCoords( Rect *r )
5ca0d812 825{
fb728ebb
SC
826 GetControlBounds( m_controlRef , r ) ;
827
828 WindowRef tlwref = GetControlOwner( m_controlRef ) ;
829
830 wxTopLevelWindowMac* tlwwx = wxFindWinFromMacWindow( tlwref ) ;
831 if ( tlwwx != NULL )
832 {
833 ControlRef rootControl = tlwwx->GetPeer()->GetControlRef() ;
834 HIPoint hiPoint = CGPointMake( 0 , 0 ) ;
835 HIViewConvertPoint( &hiPoint , HIViewGetSuperview(m_controlRef) , rootControl ) ;
836 OffsetRect( r , (short) hiPoint.x , (short) hiPoint.y ) ;
837 }
5ca0d812
SC
838}
839
9d8aca48 840void wxMacControl::GetBestRect( Rect *r )
5ca0d812 841{
6cce68ea 842 short baselineoffset;
8638e69b 843
6cce68ea 844 GetBestControlRect( m_controlRef , r , &baselineoffset );
5ca0d812
SC
845}
846
fb5246be 847void wxMacControl::SetLabel( const wxString &title )
5ca0d812 848{
10a59880
RD
849 wxFontEncoding encoding;
850
851 if ( m_font.Ok() )
852 encoding = m_font.GetEncoding();
853 else
854 encoding = wxFont::GetDefaultEncoding();
9d8aca48 855
7fc641af 856 SetControlTitleWithCFString( m_controlRef , wxMacCFStringHolder( title , encoding ) );
5ca0d812
SC
857}
858
859void wxMacControl::GetFeatures( UInt32 * features )
860{
6cce68ea 861 GetControlFeatures( m_controlRef , features );
5ca0d812
SC
862}
863
9d8aca48 864OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
5ca0d812 865{
6cce68ea 866 OSStatus err = GetControlRegion( m_controlRef , partCode , region );
6cce68ea 867 return err;
5ca0d812
SC
868}
869
9d8aca48 870OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
5ca0d812 871{
9d8aca48 872 return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
6cce68ea 873 (other != NULL) ? other->m_controlRef : NULL);
5ca0d812
SC
874}
875
5ca0d812
SC
876// SetNeedsDisplay would not invalidate the children
877static void InvalidateControlAndChildren( HIViewRef control )
878{
6cce68ea
SC
879 HIViewSetNeedsDisplay( control , true );
880 UInt16 childrenCount = 0;
881 OSStatus err = CountSubControls( control , &childrenCount );
5ca0d812 882 if ( err == errControlIsNotEmbedder )
6cce68ea 883 return;
8638e69b 884
6cce68ea 885 wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") );
5ca0d812 886
6cce68ea 887 for ( UInt16 i = childrenCount; i >=1; --i )
5ca0d812 888 {
6cce68ea 889 HIViewRef child;
8638e69b 890
6cce68ea 891 err = GetIndexedSubControl( control , i , & child );
5ca0d812 892 if ( err == errControlIsNotEmbedder )
6cce68ea 893 return;
8638e69b 894
6cce68ea 895 InvalidateControlAndChildren( child );
5ca0d812
SC
896 }
897}
5ca0d812 898
9d8aca48 899void wxMacControl::InvalidateWithChildren()
5ca0d812 900{
6cce68ea 901 InvalidateControlAndChildren( m_controlRef );
5ca0d812
SC
902}
903
fb5246be 904void wxMacControl::ScrollRect( wxRect *r , int dx , int dy )
5ca0d812 905{
6cce68ea 906 wxASSERT( r != NULL );
8638e69b 907
e779b609
SC
908 HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height);
909 HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy );
5ca0d812
SC
910}
911
6cce68ea
SC
912OSType wxMacCreator = 'WXMC';
913OSType wxMacControlProperty = 'MCCT';
914
88a7a4e1 915void wxMacControl::SetReferenceInNativeControl()
6cce68ea
SC
916{
917 void * data = this;
918 verify_noerr( SetControlProperty ( m_controlRef ,
919 wxMacCreator,wxMacControlProperty, sizeof(data), &data ) );
920}
921
88a7a4e1 922wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control)
6cce68ea
SC
923{
924 wxMacControl* ctl = NULL;
e6c3d3e6 925 ByteCount actualSize;
6cce68ea
SC
926 if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) ,
927 &actualSize , &ctl ) == noErr )
928 {
929 return ctl;
930 }
931 return NULL;
932}
933
934// ============================================================================
935// DataBrowser Wrapper
936// ============================================================================
937//
938// basing on DataBrowserItemIDs
939//
940
bf9a1615
SC
941IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl , wxMacControl )
942
6cce68ea
SC
943pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
944 ControlRef browser,
945 DataBrowserItemID itemID,
946 DataBrowserItemNotification message,
947 DataBrowserItemDataRef itemData )
948{
bf9a1615 949 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
950 if ( ctl != 0 )
951 {
952 ctl->ItemNotification(itemID, message, itemData);
953 }
954}
955
956pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
957 ControlRef browser,
958 DataBrowserItemID itemID,
959 DataBrowserPropertyID property,
960 DataBrowserItemDataRef itemData,
961 Boolean changeValue )
962{
963 OSStatus err = errDataBrowserPropertyNotSupported;
bf9a1615 964 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
965 if ( ctl != 0 )
966 {
967 err = ctl->GetSetItemData(itemID, property, itemData, changeValue);
968 }
969 return err;
970}
971
972pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc(
88a7a4e1
WS
973 ControlRef browser,
974 DataBrowserItemID itemOneID,
975 DataBrowserItemID itemTwoID,
976 DataBrowserPropertyID sortProperty)
6cce68ea 977{
bf9a1615 978 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
979 if ( ctl != 0 )
980 {
981 return ctl->CompareItems(itemOneID, itemTwoID, sortProperty);
982 }
983 return false;
984}
985
986DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL;
987DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL;
988DataBrowserItemCompareUPP gDataBrowserItemCompareUPP = NULL;
989
89954433
VZ
990wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer,
991 const wxPoint& pos,
992 const wxSize& size,
993 long WXUNUSED(style))
994 : wxMacControl( peer )
88a7a4e1 995{
6cce68ea
SC
996 Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
997 OSStatus err = ::CreateDataBrowserControl(
998 MAC_WXHWND(peer->MacGetTopLevelWindowRef()),
999 &bounds, kDataBrowserListView, &m_controlRef );
1000 SetReferenceInNativeControl();
1001 verify_noerr( err );
1002 if ( gDataBrowserItemCompareUPP == NULL )
1003 gDataBrowserItemCompareUPP = NewDataBrowserItemCompareUPP(DataBrowserCompareProc);
1004 if ( gDataBrowserItemDataUPP == NULL )
1005 gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc);
1006 if ( gDataBrowserItemNotificationUPP == NULL )
1007 {
1008 gDataBrowserItemNotificationUPP =
6cce68ea 1009 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
6cce68ea
SC
1010 }
1011
1012 DataBrowserCallbacks callbacks;
1013 InitializeDataBrowserCallbacks( &callbacks, kDataBrowserLatestCallbacks );
1014
1015 callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
1016 callbacks.u.v1.itemCompareCallback = gDataBrowserItemCompareUPP;
1017 callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
1018 SetCallbacks( &callbacks );
1019
1020}
1021
1022OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container,
1023 Boolean recurse,
1024 DataBrowserItemState state,
e6c3d3e6 1025 ItemCount *numItems) const
6cce68ea 1026{
88a7a4e1 1027 return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems );
6cce68ea
SC
1028}
1029
1030OSStatus wxMacDataBrowserControl::GetItems( DataBrowserItemID container,
1031 Boolean recurse,
1032 DataBrowserItemState state,
88a7a4e1 1033 Handle items) const
6cce68ea 1034{
88a7a4e1 1035 return GetDataBrowserItems( m_controlRef, container, recurse, state, items );
6cce68ea
SC
1036}
1037
1038OSStatus wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options )
1039{
1040 return SetDataBrowserSelectionFlags( m_controlRef, options );
1041}
1042
1043OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *columnDesc,
1044 DataBrowserTableViewColumnIndex position )
1045{
1046 return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position );
1047}
1048
e2bc1d69 1049OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){
f49c76e5 1050 return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id );
e2bc1d69
KO
1051}
1052
1053OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position )
1054{
f49c76e5 1055 DataBrowserTableViewColumnID id;
e2bc1d69
KO
1056 GetColumnIDFromIndex( position, &id );
1057 return RemoveDataBrowserTableViewColumn( m_controlRef, id );
1058}
1059
6cce68ea
SC
1060OSStatus wxMacDataBrowserControl::AutoSizeColumns()
1061{
1062 return AutoSizeDataBrowserListViewColumns(m_controlRef);
1063}
1064
1065OSStatus wxMacDataBrowserControl::SetHasScrollBars( bool horiz, bool vert )
1066{
1067 return SetDataBrowserHasScrollBars( m_controlRef, horiz, vert );
1068}
1069
1070OSStatus wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
1071{
1072 return SetDataBrowserTableViewHiliteStyle( m_controlRef, hiliteStyle );
1073}
1074
1075OSStatus wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height)
1076{
1077 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1078}
1079
1080OSStatus wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16 *height)
1081{
1082 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1083}
1084
1085OSStatus wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks *callbacks)
1086{
1087 return SetDataBrowserCallbacks( m_controlRef, callbacks );
1088}
1089
88a7a4e1 1090OSStatus wxMacDataBrowserControl::UpdateItems(
6cce68ea
SC
1091 DataBrowserItemID container,
1092 UInt32 numItems,
1093 const DataBrowserItemID *items,
1094 DataBrowserPropertyID preSortProperty,
1095 DataBrowserPropertyID propertyID ) const
1096{
1097 return UpdateDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty, propertyID );
1098}
1099
1100bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item ) const
1101{
1102 return IsDataBrowserItemSelected( m_controlRef, item );
1103}
1104
1105OSStatus wxMacDataBrowserControl::AddItems(
1106 DataBrowserItemID container,
1107 UInt32 numItems,
1108 const DataBrowserItemID *items,
1109 DataBrowserPropertyID preSortProperty )
1110{
1111 return AddDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1112}
1113
1114OSStatus wxMacDataBrowserControl::RemoveItems(
1115 DataBrowserItemID container,
1116 UInt32 numItems,
1117 const DataBrowserItemID *items,
1118 DataBrowserPropertyID preSortProperty )
1119{
1120 return RemoveDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1121}
1122
1123OSStatus wxMacDataBrowserControl::RevealItem(
1124 DataBrowserItemID item,
1125 DataBrowserPropertyID propertyID,
1126 DataBrowserRevealOptions options ) const
1127{
1128 return RevealDataBrowserItem( m_controlRef, item, propertyID, options );
1129}
1130
1131OSStatus wxMacDataBrowserControl::SetSelectedItems(
1132 UInt32 numItems,
1133 const DataBrowserItemID *items,
1134 DataBrowserSetOption operation )
1135{
1136 return SetDataBrowserSelectedItems( m_controlRef, numItems, items, operation );
1137}
1138
1139OSStatus wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const
1140{
1141 return GetDataBrowserSelectionAnchor( m_controlRef, first, last );
1142}
1143
1144OSStatus wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
1145{
1146 return GetDataBrowserTableViewItemID( m_controlRef, row, item );
1147}
1148
1149OSStatus wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item, DataBrowserTableViewRowIndex * row ) const
1150{
1151 return GetDataBrowserTableViewItemRow( m_controlRef, item, row );
1152}
1153
88a7a4e1 1154OSStatus wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height )
6cce68ea 1155{
88a7a4e1 1156 return SetDataBrowserTableViewRowHeight( m_controlRef , height );
6cce68ea
SC
1157}
1158
88a7a4e1 1159OSStatus wxMacDataBrowserControl::GetDefaultRowHeight( UInt16 * height ) const
6cce68ea 1160{
88a7a4e1 1161 return GetDataBrowserTableViewRowHeight( m_controlRef, height );
6cce68ea 1162}
88a7a4e1
WS
1163
1164OSStatus wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item , UInt16 height)
6cce68ea
SC
1165{
1166 return SetDataBrowserTableViewItemRowHeight( m_controlRef, item , height );
1167}
1168
88a7a4e1 1169OSStatus wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item , UInt16 *height) const
6cce68ea
SC
1170{
1171 return GetDataBrowserTableViewItemRowHeight( m_controlRef, item , height);
1172}
1173
88a7a4e1 1174OSStatus wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const
6cce68ea
SC
1175{
1176 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1177}
1178
88a7a4e1 1179OSStatus wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column , UInt16 width )
6cce68ea
SC
1180{
1181 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1182}
1183
88a7a4e1 1184OSStatus wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16 *width ) const
6cce68ea
SC
1185{
1186 return GetDataBrowserTableViewColumnWidth( m_controlRef , width );
1187}
1188
88a7a4e1 1189OSStatus wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width )
6cce68ea
SC
1190{
1191 return SetDataBrowserTableViewColumnWidth( m_controlRef , width );
1192}
1193
88a7a4e1 1194OSStatus wxMacDataBrowserControl::GetColumnCount(UInt32* numColumns) const
6cce68ea
SC
1195{
1196 return GetDataBrowserTableViewColumnCount( m_controlRef, numColumns);
1197}
1198
88a7a4e1 1199OSStatus wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column,
e6c3d3e6 1200 DataBrowserTableViewColumnIndex *position) const
6cce68ea
SC
1201{
1202 return GetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1203}
1204
e6c3d3e6 1205OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position)
6cce68ea
SC
1206{
1207 return SetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1208}
1209
88a7a4e1 1210OSStatus wxMacDataBrowserControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
6cce68ea
SC
1211{
1212 return GetDataBrowserScrollPosition( m_controlRef , top , left );
1213}
1214
88a7a4e1 1215OSStatus wxMacDataBrowserControl::SetScrollPosition( UInt32 top , UInt32 left )
6cce68ea
SC
1216{
1217 return SetDataBrowserScrollPosition( m_controlRef , top , left );
1218}
1219
88a7a4e1 1220OSStatus wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID *column ) const
6cce68ea
SC
1221{
1222 return GetDataBrowserSortProperty( m_controlRef , column );
1223}
1224
88a7a4e1 1225OSStatus wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column )
6cce68ea
SC
1226{
1227 return SetDataBrowserSortProperty( m_controlRef , column );
1228}
88a7a4e1
WS
1229
1230OSStatus wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder *order ) const
6cce68ea
SC
1231{
1232 return GetDataBrowserSortOrder( m_controlRef , order );
1233}
1234
88a7a4e1 1235OSStatus wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order )
6cce68ea
SC
1236{
1237 return SetDataBrowserSortOrder( m_controlRef , order );
1238}
1239
88a7a4e1
WS
1240OSStatus wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property,
1241 DataBrowserPropertyFlags *flags ) const
6cce68ea
SC
1242{
1243 return GetDataBrowserPropertyFlags( m_controlRef , property , flags );
1244}
1245
88a7a4e1
WS
1246OSStatus wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property,
1247 DataBrowserPropertyFlags flags )
6cce68ea
SC
1248{
1249 return SetDataBrowserPropertyFlags( m_controlRef , property , flags );
1250}
1251
88a7a4e1
WS
1252OSStatus wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property,
1253 DataBrowserListViewHeaderDesc *desc ) const
6cce68ea
SC
1254{
1255 return GetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
1256}
1257
88a7a4e1
WS
1258OSStatus wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property,
1259 DataBrowserListViewHeaderDesc *desc )
6cce68ea 1260{
88a7a4e1 1261 return SetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
6cce68ea
SC
1262}
1263
88a7a4e1
WS
1264OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property ,
1265 Boolean expandableRows )
6cce68ea
SC
1266{
1267 return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows);
1268}
1269
1270// ============================================================================
88a7a4e1 1271// Higher-level Databrowser
6cce68ea
SC
1272// ============================================================================
1273//
1274// basing on data item objects
1275//
1276
1277wxMacDataItem::wxMacDataItem()
88a7a4e1 1278{
e2bc1d69 1279 m_data = NULL;
f49c76e5 1280
e2bc1d69
KO
1281 m_order = 0;
1282 m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
6cce68ea
SC
1283}
1284
88a7a4e1
WS
1285wxMacDataItem::~wxMacDataItem()
1286{
6cce68ea 1287}
88a7a4e1 1288
e2bc1d69 1289void wxMacDataItem::SetOrder( SInt32 order )
6cce68ea 1290{
e2bc1d69
KO
1291 m_order = order;
1292}
1293
1294SInt32 wxMacDataItem::GetOrder() const
1295{
1296 return m_order;
1297}
1298
1299void wxMacDataItem::SetData( void* data)
1300{
1301 m_data = data;
1302}
1303
1304void* wxMacDataItem::GetData() const
1305{
1306 return m_data;
1307}
1308
1309short wxMacDataItem::GetColumn()
1310{
1311 return m_colId;
1312}
1313
1314void wxMacDataItem::SetColumn( short col )
1315{
1316 m_colId = col;
f49c76e5 1317}
e2bc1d69
KO
1318
1319void wxMacDataItem::SetLabel( const wxString& str)
1320{
1321 m_label = str;
1322 m_cfLabel.Assign( str , wxLocale::GetSystemEncoding());
6cce68ea
SC
1323}
1324
e2bc1d69
KO
1325const wxString& wxMacDataItem::GetLabel() const
1326{
1327 return m_label;
1328}
1329
89954433 1330bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
e2bc1d69
KO
1331 const wxMacDataItem* rhs,
1332 DataBrowserPropertyID sortProperty) const
1333{
bf9a1615 1334 const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs);
e2bc1d69 1335 bool retval = false;
f49c76e5 1336
67650ea0 1337 if ( sortProperty == m_colId ){
e2bc1d69
KO
1338 retval = m_label.CmpNoCase( otherItem->m_label) < 0;
1339 }
f49c76e5 1340
67650ea0 1341 else if ( sortProperty == kNumericOrderColumnId )
e2bc1d69
KO
1342 retval = m_order < otherItem->m_order;
1343
1344 return retval;
1345}
1346
89954433 1347OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *WXUNUSED(owner) ,
6cce68ea
SC
1348 DataBrowserPropertyID property,
1349 DataBrowserItemDataRef itemData,
88a7a4e1 1350 bool changeValue )
6cce68ea 1351{
e2bc1d69
KO
1352 OSStatus err = errDataBrowserPropertyNotSupported;
1353 if ( !changeValue )
1354 {
1355 if ( property == m_colId ){
1356 err = ::SetDataBrowserItemDataText( itemData, m_cfLabel );
1357 err = noErr;
1358 }
1359 else if ( property == kNumericOrderColumnId ){
1360 err = ::SetDataBrowserItemDataValue( itemData, m_order );
1361 err = noErr;
1362 }
1363 else{
1364 }
1365 }
1366 else
1367 {
1368 switch (property)
1369 {
1370 // no editable props here
1371 default:
1372 break;
1373 }
1374 }
1375
1376 return err;
6cce68ea
SC
1377}
1378
89954433
VZ
1379void wxMacDataItem::Notification(wxMacDataItemBrowserControl *WXUNUSED(owner) ,
1380 DataBrowserItemNotification WXUNUSED(message),
1381 DataBrowserItemDataRef WXUNUSED(itemData) ) const
6cce68ea
SC
1382{
1383}
1384
bf9a1615 1385IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl )
6cce68ea 1386
88a7a4e1 1387wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) :
6cce68ea 1388 wxMacDataBrowserControl( peer, pos, size, style )
88a7a4e1 1389{
6cce68ea 1390 m_suppressSelection = false;
e2bc1d69
KO
1391 m_sortOrder = SortOrder_None;
1392 m_clientDataItemsType = wxClientData_None;
1393}
1394
1395wxMacDataItem* wxMacDataItemBrowserControl::CreateItem()
1396{
1397 return new wxMacDataItem();
6cce68ea 1398}
88a7a4e1
WS
1399
1400wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser)
6cce68ea
SC
1401{
1402 m_former = browser->SuppressSelection(true);
1403 m_browser = browser;
1404}
1405
1406wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1407{
1408 m_browser->SuppressSelection(m_former);
1409}
1410
1411bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress )
1412{
1413 bool former = m_suppressSelection;
1414 m_suppressSelection = suppress;
1415
1416 return former;
1417}
1418
88a7a4e1
WS
1419Boolean wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID,
1420 DataBrowserItemID itemTwoID,
1421 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1422{
1423 wxMacDataItem* itemOne = (wxMacDataItem*) itemOneID;
1424 wxMacDataItem* itemTwo = (wxMacDataItem*) itemTwoID;
1425 return CompareItems( itemOne , itemTwo , sortProperty );
1426}
1427
88a7a4e1
WS
1428Boolean wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem* itemOne,
1429 const wxMacDataItem* itemTwo,
1430 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1431{
1432 Boolean retval = false;
1433 if ( itemOne != NULL )
1434 retval = itemOne->IsLessThan( this , itemTwo , sortProperty);
1435 return retval;
1436}
1437
1438OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1439 DataBrowserItemID itemID,
1440 DataBrowserPropertyID property,
1441 DataBrowserItemDataRef itemData,
88a7a4e1 1442 Boolean changeValue )
6cce68ea
SC
1443{
1444 wxMacDataItem* item = (wxMacDataItem*) itemID;
1445 return GetSetItemData(item, property, itemData , changeValue );
1446}
1447
1448OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1449 wxMacDataItem* item,
1450 DataBrowserPropertyID property,
1451 DataBrowserItemDataRef itemData,
88a7a4e1 1452 Boolean changeValue )
6cce68ea
SC
1453{
1454 OSStatus err = errDataBrowserPropertyNotSupported;
1455 switch( property )
1456 {
1457 case kDataBrowserContainerIsClosableProperty :
1458 case kDataBrowserContainerIsSortableProperty :
1459 case kDataBrowserContainerIsOpenableProperty :
1460 // right now default behaviour on these
1461 break;
1462 default :
f49c76e5 1463
e2bc1d69 1464 if ( item != NULL ){
6cce68ea 1465 err = item->GetSetData( this, property , itemData , changeValue );
e2bc1d69 1466 }
6cce68ea 1467 break;
88a7a4e1 1468
6cce68ea
SC
1469 }
1470 return err;
1471}
1472
1473void wxMacDataItemBrowserControl::ItemNotification(
1474 DataBrowserItemID itemID,
1475 DataBrowserItemNotification message,
88a7a4e1 1476 DataBrowserItemDataRef itemData)
6cce68ea 1477{
88a7a4e1 1478 wxMacDataItem* item = (wxMacDataItem*) itemID;
6cce68ea
SC
1479 ItemNotification( item , message, itemData);
1480}
1481
1482void wxMacDataItemBrowserControl::ItemNotification(
1483 const wxMacDataItem* item,
1484 DataBrowserItemNotification message,
88a7a4e1 1485 DataBrowserItemDataRef itemData)
6cce68ea
SC
1486{
1487 if (item != NULL)
1488 item->Notification( this, message, itemData);
1489}
1490
88a7a4e1
WS
1491unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* container,
1492 bool recurse , DataBrowserItemState state) const
6cce68ea 1493{
e6c3d3e6 1494 ItemCount numItems = 0;
88a7a4e1
WS
1495 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID)container,
1496 recurse, state, &numItems ) );
6cce68ea
SC
1497 return numItems;
1498}
1499
f49c76e5 1500unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container,
e2bc1d69
KO
1501 bool recurse ) const
1502{
1503 return GetItemCount( container, recurse, kDataBrowserItemIsSelected );
1504
1505}
1506
88a7a4e1
WS
1507void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem* container,
1508 bool recurse , DataBrowserItemState state, wxArrayMacDataItemPtr &items) const
6cce68ea
SC
1509{
1510 Handle handle = NewHandle(0);
88a7a4e1
WS
1511 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID)container ,
1512 recurse , state, handle) );
6cce68ea
SC
1513
1514 int itemCount = GetHandleSize(handle)/sizeof(DataBrowserItemID);
1515 HLock( handle );
1516 wxMacDataItemPtr* itemsArray = (wxMacDataItemPtr*) *handle;
1517 for ( int i = 0; i < itemCount; ++i)
1518 {
1519 items.Add(itemsArray[i]);
1520 }
1521 HUnlock( handle );
1522 DisposeHandle( handle );
1523}
1524
1525unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem* item) const
1526{
1527 DataBrowserTableViewRowIndex row;
1528 OSStatus err = GetItemRow( (DataBrowserItemID) item , &row);
1529 wxASSERT( err == noErr);
1530 return row;
1531}
1532
1533wxMacDataItem* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n) const
1534{
1535 DataBrowserItemID id;
1536 OSStatus err = GetItemID( (DataBrowserTableViewRowIndex) n , &id);
1537 wxASSERT( err == noErr);
88a7a4e1 1538 return (wxMacDataItem*) id;
6cce68ea
SC
1539}
1540
88a7a4e1 1541void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem *container,
6cce68ea
SC
1542 const wxMacDataItem *item , DataBrowserPropertyID property) const
1543{
88a7a4e1 1544 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, 1,
6cce68ea
SC
1545 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty /* notSorted */, property ) );
1546}
1547
88a7a4e1 1548void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem *container,
6cce68ea
SC
1549 wxArrayMacDataItemPtr &itemArray , DataBrowserPropertyID property) const
1550{
1551 unsigned int noItems = itemArray.GetCount();
1552 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1553 for ( unsigned int i = 0; i < noItems; ++i )
1554 items[i] = (DataBrowserItemID) itemArray[i];
1555
88a7a4e1 1556 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, noItems,
6cce68ea
SC
1557 items, kDataBrowserItemNoProperty /* notSorted */, property ) );
1558 delete [] items;
1559}
1560
3ef4e126 1561void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyType colType,
0e4124e7 1562 const wxString& title, SInt16 just, int defaultWidth)
e2bc1d69
KO
1563{
1564 DataBrowserListViewColumnDesc columnDesc;
1565 columnDesc.headerBtnDesc.titleOffset = 0;
1566 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
1567
1568 columnDesc.headerBtnDesc.btnFontStyle.flags =
1569 kControlUseFontMask | kControlUseJustMask;
1570
f49c76e5 1571 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
e2bc1d69
KO
1572 columnDesc.headerBtnDesc.btnFontStyle.just = just;
1573 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
1574 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
f49c76e5 1575
e2bc1d69
KO
1576 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1577 // defined for other modes?
1578 wxFontEncoding enc;
1579 if ( m_font.Ok() )
1580 enc = m_font.GetEncoding();
1581 else
1582 enc = wxLocale::GetSystemEncoding();
1583 wxMacCFStringHolder cfTitle;
1584 cfTitle.Assign( title, enc );
f49c76e5 1585 columnDesc.headerBtnDesc.titleString = cfTitle;
0d2d29b1
KO
1586
1587 columnDesc.headerBtnDesc.minimumWidth = 0;
1588 columnDesc.headerBtnDesc.maximumWidth = 30000;
e2bc1d69
KO
1589
1590 columnDesc.propertyDesc.propertyID = (kMinColumnId + colId);
1591 columnDesc.propertyDesc.propertyType = colType;
f49c76e5 1592 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
f49c76e5 1593 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
67650ea0 1594 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
e2bc1d69
KO
1595
1596 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
0d2d29b1
KO
1597
1598 if (defaultWidth > 0){
1599 SetColumnWidth(colId, defaultWidth);
1600 }
1601
e2bc1d69
KO
1602}
1603
1604void wxMacDataItemBrowserControl::SetColumnWidth(int colId, int width)
1605{
1606 DataBrowserPropertyID id;
1607 GetColumnIDFromIndex(colId, &id);
1608 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id, width));
1609}
1610
1611int wxMacDataItemBrowserControl::GetColumnWidth(int colId)
1612{
1613 DataBrowserPropertyID id;
1614 GetColumnIDFromIndex(colId, &id);
1615 UInt16 result;
1616 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id, &result));
1617 return result;
1618}
1619
6cce68ea
SC
1620void wxMacDataItemBrowserControl::AddItem(wxMacDataItem *container, wxMacDataItem *item)
1621{
88a7a4e1 1622 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, 1,
6cce68ea
SC
1623 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty ) );
1624}
1625
88a7a4e1 1626void wxMacDataItemBrowserControl::AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray )
6cce68ea
SC
1627{
1628 unsigned int noItems = itemArray.GetCount();
1629 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1630 for ( unsigned int i = 0; i < noItems; ++i )
1631 items[i] = (DataBrowserItemID) itemArray[i];
1632
88a7a4e1 1633 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, noItems,
6cce68ea
SC
1634 (DataBrowserItemID*) items, kDataBrowserItemNoProperty ) );
1635 delete [] items;
1636}
1637
88a7a4e1 1638void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem *container, wxMacDataItem* item)
6cce68ea 1639{
88a7a4e1 1640 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 1,
e6c3d3e6 1641 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty );
6cce68ea
SC
1642 verify_noerr( err );
1643}
1644
88a7a4e1 1645void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray)
6cce68ea
SC
1646{
1647 unsigned int noItems = itemArray.GetCount();
1648 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1649 for ( unsigned int i = 0; i < noItems; ++i )
1650 items[i] = (DataBrowserItemID) itemArray[i];
1651
88a7a4e1 1652 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, noItems,
e6c3d3e6 1653 (DataBrowserItemID*) items, kDataBrowserItemNoProperty );
6cce68ea
SC
1654 verify_noerr( err );
1655 delete [] items;
1656}
1657
88a7a4e1 1658void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem *container)
6cce68ea
SC
1659{
1660 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 0 , NULL , kDataBrowserItemNoProperty );
1661 verify_noerr( err );
1662}
1663
88a7a4e1 1664void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem* item , DataBrowserSetOption option)
6cce68ea
SC
1665{
1666 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID*) &item, option ));
1667}
1668
88a7a4e1 1669void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option)
6cce68ea
SC
1670{
1671 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL , option ));
1672}
1673
88a7a4e1 1674void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr &itemArray , DataBrowserSetOption option)
6cce68ea
SC
1675{
1676 unsigned int noItems = itemArray.GetCount();
1677 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1678 for ( unsigned int i = 0; i < noItems; ++i )
1679 items[i] = (DataBrowserItemID) itemArray[i];
1680
1681 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems, (DataBrowserItemID*) items, option ));
1682 delete [] items;
1683}
1684
1685Boolean wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem* item) const
1686{
1687 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID) item);
1688}
1689
88a7a4e1 1690void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options)
6cce68ea
SC
1691{
1692 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID) item, kDataBrowserNoItem , options ) );
1693}
1694
88a7a4e1 1695void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const
6cce68ea 1696{
88a7a4e1 1697 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID*) first, (DataBrowserItemID*) last) );
6cce68ea
SC
1698}
1699
e2bc1d69
KO
1700wxClientDataType wxMacDataItemBrowserControl::GetClientDataType() const
1701{
1702 return m_clientDataItemsType;
1703}
1704void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType)
1705{
1706 m_clientDataItemsType = clientDataItemsType;
1707}
1708
1709unsigned int wxMacDataItemBrowserControl::MacGetCount() const
1710{
1711 return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState);
1712}
1713
1714void wxMacDataItemBrowserControl::MacDelete( unsigned int n )
1715{
1716 wxMacDataItem* item = (wxMacDataItem*)GetItemFromLine( n );
1717 RemoveItem( wxMacDataBrowserRootContainer, item );
1718}
1719
a236aa20
VZ
1720void wxMacDataItemBrowserControl::MacInsert( unsigned int n,
1721 const wxArrayStringsAdapter& items,
1722 int column )
e2bc1d69
KO
1723{
1724 size_t itemsCount = items.GetCount();
1725 if ( itemsCount == 0 )
1726 return;
1727
1728 SInt32 frontLineOrder = 0;
1729
1730 if ( m_sortOrder == SortOrder_None )
1731 {
1732 // increase the order of the lines to be shifted
1733 unsigned int lines = MacGetCount();
1734 for ( unsigned int i = n; i < lines; ++i)
1735 {
1736 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
1737 iter->SetOrder( iter->GetOrder() + itemsCount );
1738 }
1739 if ( n > 0 )
1740 {
1741 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
1742 frontLineOrder = iter->GetOrder();
1743 }
1744 }
1745
1746 wxArrayMacDataItemPtr ids;
1747 ids.SetCount( itemsCount );
1748
1749 for ( unsigned int i = 0; i < itemsCount; ++i )
1750 {
1751 wxMacDataItem* item = CreateItem();
1752 item->SetLabel( items[i]);
1753 if ( column != -1 )
1754 item->SetColumn( kMinColumnId + column );
f49c76e5 1755
e2bc1d69
KO
1756 if ( m_sortOrder == SortOrder_None )
1757 item->SetOrder( frontLineOrder + 1 + i );
1758
1759 ids[i] = item;
1760 }
1761
1762 AddItems( wxMacDataBrowserRootContainer, ids );
1763}
1764
1765int wxMacDataItemBrowserControl::MacAppend( const wxString& text)
1766{
1767 wxMacDataItem* item = CreateItem();
1768 item->SetLabel( text );
1769 if ( m_sortOrder == SortOrder_None )
1770 {
1771 unsigned int lines = MacGetCount();
1772 if ( lines == 0 )
1773 item->SetOrder( 1 );
1774 else
1775 {
1776 wxMacDataItem* frontItem = (wxMacDataItem*) GetItemFromLine(lines-1);
1777 item->SetOrder( frontItem->GetOrder() + 1 );
1778 }
1779 }
1780 AddItem( wxMacDataBrowserRootContainer, item );
1781
1782 return GetLineFromItem(item);
1783}
1784
1785void wxMacDataItemBrowserControl::MacClear()
1786{
1787 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1788 RemoveAllItems(wxMacDataBrowserRootContainer);
1789}
1790
1791void wxMacDataItemBrowserControl::MacDeselectAll()
1792{
1793 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1794 SetSelectedAllItems( kDataBrowserItemsRemove );
1795}
1796
1797void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n, bool select, bool multi )
1798{
1799 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
1800 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
1801
1802 if ( IsItemSelected( item ) != select )
1803 {
1804 if ( select )
1805 SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
1806 else
1807 SetSelectedItem( item, kDataBrowserItemsRemove );
1808 }
1809
1810 MacScrollTo( n );
1811}
1812
1813bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n ) const
1814{
1815 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
1816 return IsItemSelected( item );
1817}
1818
1819int wxMacDataItemBrowserControl::MacGetSelection() const
1820{
1821 wxMacDataItemPtr first, last;
1822 GetSelectionAnchor( &first, &last );
1823
1824 if ( first != NULL )
1825 {
1826 return GetLineFromItem( first );
1827 }
1828
1829 return -1;
1830}
1831
1832int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt& aSelections ) const
1833{
1834 aSelections.Empty();
1835 wxArrayMacDataItemPtr selectedItems;
1836 GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
1837
1838 int count = selectedItems.GetCount();
1839
1840 for ( int i = 0; i < count; ++i)
1841 {
1842 aSelections.Add(GetLineFromItem(selectedItems[i]));
1843 }
1844
1845 return count;
1846}
1847
1848void wxMacDataItemBrowserControl::MacSetString( unsigned int n, const wxString& text )
1849{
1850 // as we don't store the strings we only have to issue a redraw
1851 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
1852 item->SetLabel( text );
1853 UpdateItem( wxMacDataBrowserRootContainer, item , kTextColumnId );
1854}
1855
1856wxString wxMacDataItemBrowserControl::MacGetString( unsigned int n ) const
1857{
1858 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1859 return item->GetLabel();
1860}
1861
1862void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n, void * data)
1863{
1864 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
1865 item->SetData( data );
1866 // not displayed, therefore no Update infos to DataBrowser
1867}
1868
1869void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n) const
1870{
1871 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1872 return item->GetData();
1873}
1874
1875void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n )
1876{
6239ee05
SC
1877 UInt32 top , left ;
1878 GetScrollPosition( &top , &left ) ;
1879 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
1880
1881 UInt16 height ;
1882 GetRowHeight( (DataBrowserItemID) item , &height ) ;
1883 SetScrollPosition( n * ((UInt32)height) , left ) ;
1884
1885 RevealItem( item , kDataBrowserRevealWithoutSelecting );
e2bc1d69
KO
1886}
1887
88a7a4e1 1888
6cce68ea 1889
5ca0d812
SC
1890//
1891// Tab Control
1892//
9d8aca48
WS
1893
1894OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
5ca0d812 1895{
6cce68ea 1896 return ::SetTabEnabled( m_controlRef , tabNo , enable );
5ca0d812 1897}
9d8aca48 1898
409521e4
SC
1899#endif
1900
30e77b5c
SC
1901//
1902// Quartz Support
1903//
1904
30e77b5c
SC
1905/*
1906 Return the generic RGB color space. This is a 'get' function and the caller should
1907 not release the returned value unless the caller retains it first. Usually callers
1908 of this routine will immediately use the returned colorspace with CoreGraphics
1909 so they typically do not need to retain it themselves.
fb5246be 1910
30e77b5c
SC
1911 This function creates the generic RGB color space once and hangs onto it so it can
1912 return it whenever this function is called.
1913*/
1914
1915CGColorSpaceRef wxMacGetGenericRGBColorSpace()
1916{
6cce68ea 1917 static wxMacCFRefHolder<CGColorSpaceRef> genericRGBColorSpace;
fb5246be 1918
8638e69b
DS
1919 if (genericRGBColorSpace == NULL)
1920 {
e1673e52 1921 genericRGBColorSpace.Set( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) );
8638e69b
DS
1922 }
1923
30e77b5c
SC
1924 return genericRGBColorSpace;
1925}
30e77b5c 1926
a01d9a25
SC
1927CGColorRef wxMacCreateCGColorFromHITheme( ThemeBrush brush )
1928{
1929 CGColorRef color ;
1930 HIThemeBrushCreateCGColor( brush, &color );
1931 return color;
1932}
1933
e6c3d3e6
SC
1934#ifndef __LP64__
1935
54ce9ebb
JS
1936wxMacPortSaver::wxMacPortSaver( GrafPtr port )
1937{
6cce68ea
SC
1938 ::GetPort( &m_port );
1939 ::SetPort( port );
54ce9ebb
JS
1940}
1941
1942wxMacPortSaver::~wxMacPortSaver()
1943{
6cce68ea 1944 ::SetPort( m_port );
54ce9ebb 1945}
e6c3d3e6
SC
1946#endif
1947
409521e4
SC
1948#if wxMAC_USE_QUICKDRAW
1949
e6c3d3e6
SC
1950void wxMacGlobalToLocal( WindowRef window , Point*pt )
1951{
e6c3d3e6 1952 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
1953 HIViewRef contentView ;
1954 // TODO check toolbar offset
daca43d8 1955 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
f49c76e5 1956 HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
e6c3d3e6
SC
1957 pt->h = p.x;
1958 pt->v = p.y;
e6c3d3e6
SC
1959}
1960
1961void wxMacLocalToGlobal( WindowRef window , Point*pt )
1962{
e6c3d3e6 1963 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
1964 HIViewRef contentView ;
1965 // TODO check toolbar offset
daca43d8
SC
1966 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
1967 HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
e6c3d3e6
SC
1968 pt->h = p.x;
1969 pt->v = p.y;
e6c3d3e6 1970}
409521e4 1971#endif
54ce9ebb 1972
b6ed2b86 1973#endif // wxUSE_GUI
7fc641af
SC
1974
1975#if wxUSE_BASE
1976
1977#endif