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