]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/utils.cpp
correction to last commit: don't test unsetenv() return value, it's void under Darwin
[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.
466bool wxCheckForInterrupt(wxWindow *wnd)
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
VZ
591#ifndef __DARWIN__
592wxChar *wxGetUserHome (const wxString& user)
593{
594 // TODO
595 return NULL;
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
9d8aca48 935void wxMacControl::VisibilityChanged(bool 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
1289wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer, const wxPoint& pos, const wxSize& size, long style) : wxMacControl( peer )
88a7a4e1 1290{
6cce68ea
SC
1291 Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
1292 OSStatus err = ::CreateDataBrowserControl(
1293 MAC_WXHWND(peer->MacGetTopLevelWindowRef()),
1294 &bounds, kDataBrowserListView, &m_controlRef );
1295 SetReferenceInNativeControl();
1296 verify_noerr( err );
1297 if ( gDataBrowserItemCompareUPP == NULL )
1298 gDataBrowserItemCompareUPP = NewDataBrowserItemCompareUPP(DataBrowserCompareProc);
1299 if ( gDataBrowserItemDataUPP == NULL )
1300 gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc);
1301 if ( gDataBrowserItemNotificationUPP == NULL )
1302 {
1303 gDataBrowserItemNotificationUPP =
1304#if TARGET_API_MAC_OSX
1305 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
1306#else
1307 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc);
1308#endif
1309 }
1310
1311 DataBrowserCallbacks callbacks;
1312 InitializeDataBrowserCallbacks( &callbacks, kDataBrowserLatestCallbacks );
1313
1314 callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
1315 callbacks.u.v1.itemCompareCallback = gDataBrowserItemCompareUPP;
1316 callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
1317 SetCallbacks( &callbacks );
1318
1319}
1320
1321OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container,
1322 Boolean recurse,
1323 DataBrowserItemState state,
e6c3d3e6 1324 ItemCount *numItems) const
6cce68ea 1325{
88a7a4e1 1326 return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems );
6cce68ea
SC
1327}
1328
1329OSStatus wxMacDataBrowserControl::GetItems( DataBrowserItemID container,
1330 Boolean recurse,
1331 DataBrowserItemState state,
88a7a4e1 1332 Handle items) const
6cce68ea 1333{
88a7a4e1 1334 return GetDataBrowserItems( m_controlRef, container, recurse, state, items );
6cce68ea
SC
1335}
1336
1337OSStatus wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options )
1338{
1339 return SetDataBrowserSelectionFlags( m_controlRef, options );
1340}
1341
1342OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *columnDesc,
1343 DataBrowserTableViewColumnIndex position )
1344{
1345 return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position );
1346}
1347
e2bc1d69 1348OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){
f49c76e5 1349 return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id );
e2bc1d69
KO
1350}
1351
1352OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position )
1353{
f49c76e5 1354 DataBrowserTableViewColumnID id;
e2bc1d69
KO
1355 GetColumnIDFromIndex( position, &id );
1356 return RemoveDataBrowserTableViewColumn( m_controlRef, id );
1357}
1358
6cce68ea
SC
1359OSStatus wxMacDataBrowserControl::AutoSizeColumns()
1360{
1361 return AutoSizeDataBrowserListViewColumns(m_controlRef);
1362}
1363
1364OSStatus wxMacDataBrowserControl::SetHasScrollBars( bool horiz, bool vert )
1365{
1366 return SetDataBrowserHasScrollBars( m_controlRef, horiz, vert );
1367}
1368
1369OSStatus wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
1370{
1371 return SetDataBrowserTableViewHiliteStyle( m_controlRef, hiliteStyle );
1372}
1373
1374OSStatus wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height)
1375{
1376 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1377}
1378
1379OSStatus wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16 *height)
1380{
1381 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1382}
1383
1384OSStatus wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks *callbacks)
1385{
1386 return SetDataBrowserCallbacks( m_controlRef, callbacks );
1387}
1388
88a7a4e1 1389OSStatus wxMacDataBrowserControl::UpdateItems(
6cce68ea
SC
1390 DataBrowserItemID container,
1391 UInt32 numItems,
1392 const DataBrowserItemID *items,
1393 DataBrowserPropertyID preSortProperty,
1394 DataBrowserPropertyID propertyID ) const
1395{
1396 return UpdateDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty, propertyID );
1397}
1398
1399bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item ) const
1400{
1401 return IsDataBrowserItemSelected( m_controlRef, item );
1402}
1403
1404OSStatus wxMacDataBrowserControl::AddItems(
1405 DataBrowserItemID container,
1406 UInt32 numItems,
1407 const DataBrowserItemID *items,
1408 DataBrowserPropertyID preSortProperty )
1409{
1410 return AddDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1411}
1412
1413OSStatus wxMacDataBrowserControl::RemoveItems(
1414 DataBrowserItemID container,
1415 UInt32 numItems,
1416 const DataBrowserItemID *items,
1417 DataBrowserPropertyID preSortProperty )
1418{
1419 return RemoveDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1420}
1421
1422OSStatus wxMacDataBrowserControl::RevealItem(
1423 DataBrowserItemID item,
1424 DataBrowserPropertyID propertyID,
1425 DataBrowserRevealOptions options ) const
1426{
1427 return RevealDataBrowserItem( m_controlRef, item, propertyID, options );
1428}
1429
1430OSStatus wxMacDataBrowserControl::SetSelectedItems(
1431 UInt32 numItems,
1432 const DataBrowserItemID *items,
1433 DataBrowserSetOption operation )
1434{
1435 return SetDataBrowserSelectedItems( m_controlRef, numItems, items, operation );
1436}
1437
1438OSStatus wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const
1439{
1440 return GetDataBrowserSelectionAnchor( m_controlRef, first, last );
1441}
1442
1443OSStatus wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
1444{
1445 return GetDataBrowserTableViewItemID( m_controlRef, row, item );
1446}
1447
1448OSStatus wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item, DataBrowserTableViewRowIndex * row ) const
1449{
1450 return GetDataBrowserTableViewItemRow( m_controlRef, item, row );
1451}
1452
88a7a4e1 1453OSStatus wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height )
6cce68ea 1454{
88a7a4e1 1455 return SetDataBrowserTableViewRowHeight( m_controlRef , height );
6cce68ea
SC
1456}
1457
88a7a4e1 1458OSStatus wxMacDataBrowserControl::GetDefaultRowHeight( UInt16 * height ) const
6cce68ea 1459{
88a7a4e1 1460 return GetDataBrowserTableViewRowHeight( m_controlRef, height );
6cce68ea 1461}
88a7a4e1
WS
1462
1463OSStatus wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item , UInt16 height)
6cce68ea
SC
1464{
1465 return SetDataBrowserTableViewItemRowHeight( m_controlRef, item , height );
1466}
1467
88a7a4e1 1468OSStatus wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item , UInt16 *height) const
6cce68ea
SC
1469{
1470 return GetDataBrowserTableViewItemRowHeight( m_controlRef, item , height);
1471}
1472
88a7a4e1 1473OSStatus wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const
6cce68ea
SC
1474{
1475 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1476}
1477
88a7a4e1 1478OSStatus wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column , UInt16 width )
6cce68ea
SC
1479{
1480 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1481}
1482
88a7a4e1 1483OSStatus wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16 *width ) const
6cce68ea
SC
1484{
1485 return GetDataBrowserTableViewColumnWidth( m_controlRef , width );
1486}
1487
88a7a4e1 1488OSStatus wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width )
6cce68ea
SC
1489{
1490 return SetDataBrowserTableViewColumnWidth( m_controlRef , width );
1491}
1492
88a7a4e1 1493OSStatus wxMacDataBrowserControl::GetColumnCount(UInt32* numColumns) const
6cce68ea
SC
1494{
1495 return GetDataBrowserTableViewColumnCount( m_controlRef, numColumns);
1496}
1497
88a7a4e1 1498OSStatus wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column,
e6c3d3e6 1499 DataBrowserTableViewColumnIndex *position) const
6cce68ea
SC
1500{
1501 return GetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1502}
1503
e6c3d3e6 1504OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position)
6cce68ea
SC
1505{
1506 return SetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1507}
1508
88a7a4e1 1509OSStatus wxMacDataBrowserControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
6cce68ea
SC
1510{
1511 return GetDataBrowserScrollPosition( m_controlRef , top , left );
1512}
1513
88a7a4e1 1514OSStatus wxMacDataBrowserControl::SetScrollPosition( UInt32 top , UInt32 left )
6cce68ea
SC
1515{
1516 return SetDataBrowserScrollPosition( m_controlRef , top , left );
1517}
1518
88a7a4e1 1519OSStatus wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID *column ) const
6cce68ea
SC
1520{
1521 return GetDataBrowserSortProperty( m_controlRef , column );
1522}
1523
88a7a4e1 1524OSStatus wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column )
6cce68ea
SC
1525{
1526 return SetDataBrowserSortProperty( m_controlRef , column );
1527}
88a7a4e1
WS
1528
1529OSStatus wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder *order ) const
6cce68ea
SC
1530{
1531 return GetDataBrowserSortOrder( m_controlRef , order );
1532}
1533
88a7a4e1 1534OSStatus wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order )
6cce68ea
SC
1535{
1536 return SetDataBrowserSortOrder( m_controlRef , order );
1537}
1538
88a7a4e1
WS
1539OSStatus wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property,
1540 DataBrowserPropertyFlags *flags ) const
6cce68ea
SC
1541{
1542 return GetDataBrowserPropertyFlags( m_controlRef , property , flags );
1543}
1544
88a7a4e1
WS
1545OSStatus wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property,
1546 DataBrowserPropertyFlags flags )
6cce68ea
SC
1547{
1548 return SetDataBrowserPropertyFlags( m_controlRef , property , flags );
1549}
1550
88a7a4e1
WS
1551OSStatus wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property,
1552 DataBrowserListViewHeaderDesc *desc ) const
6cce68ea
SC
1553{
1554 return GetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
1555}
1556
88a7a4e1
WS
1557OSStatus wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property,
1558 DataBrowserListViewHeaderDesc *desc )
6cce68ea 1559{
88a7a4e1 1560 return SetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
6cce68ea
SC
1561}
1562
88a7a4e1
WS
1563OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property ,
1564 Boolean expandableRows )
6cce68ea
SC
1565{
1566 return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows);
1567}
1568
1569// ============================================================================
88a7a4e1 1570// Higher-level Databrowser
6cce68ea
SC
1571// ============================================================================
1572//
1573// basing on data item objects
1574//
1575
1576wxMacDataItem::wxMacDataItem()
88a7a4e1 1577{
e2bc1d69 1578 m_data = NULL;
f49c76e5 1579
e2bc1d69
KO
1580 m_order = 0;
1581 m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
6cce68ea
SC
1582}
1583
88a7a4e1
WS
1584wxMacDataItem::~wxMacDataItem()
1585{
6cce68ea 1586}
88a7a4e1 1587
e2bc1d69 1588void wxMacDataItem::SetOrder( SInt32 order )
6cce68ea 1589{
e2bc1d69
KO
1590 m_order = order;
1591}
1592
1593SInt32 wxMacDataItem::GetOrder() const
1594{
1595 return m_order;
1596}
1597
1598void wxMacDataItem::SetData( void* data)
1599{
1600 m_data = data;
1601}
1602
1603void* wxMacDataItem::GetData() const
1604{
1605 return m_data;
1606}
1607
1608short wxMacDataItem::GetColumn()
1609{
1610 return m_colId;
1611}
1612
1613void wxMacDataItem::SetColumn( short col )
1614{
1615 m_colId = col;
f49c76e5 1616}
e2bc1d69
KO
1617
1618void wxMacDataItem::SetLabel( const wxString& str)
1619{
1620 m_label = str;
1621 m_cfLabel.Assign( str , wxLocale::GetSystemEncoding());
6cce68ea
SC
1622}
1623
e2bc1d69
KO
1624const wxString& wxMacDataItem::GetLabel() const
1625{
1626 return m_label;
1627}
1628
1629bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *owner ,
1630 const wxMacDataItem* rhs,
1631 DataBrowserPropertyID sortProperty) const
1632{
bf9a1615 1633 const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs);
e2bc1d69 1634 bool retval = false;
f49c76e5 1635
67650ea0 1636 if ( sortProperty == m_colId ){
e2bc1d69
KO
1637 retval = m_label.CmpNoCase( otherItem->m_label) < 0;
1638 }
f49c76e5 1639
67650ea0 1640 else if ( sortProperty == kNumericOrderColumnId )
e2bc1d69
KO
1641 retval = m_order < otherItem->m_order;
1642
1643 return retval;
1644}
1645
1646OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *owner ,
6cce68ea
SC
1647 DataBrowserPropertyID property,
1648 DataBrowserItemDataRef itemData,
88a7a4e1 1649 bool changeValue )
6cce68ea 1650{
e2bc1d69
KO
1651 OSStatus err = errDataBrowserPropertyNotSupported;
1652 if ( !changeValue )
1653 {
1654 if ( property == m_colId ){
1655 err = ::SetDataBrowserItemDataText( itemData, m_cfLabel );
1656 err = noErr;
1657 }
1658 else if ( property == kNumericOrderColumnId ){
1659 err = ::SetDataBrowserItemDataValue( itemData, m_order );
1660 err = noErr;
1661 }
1662 else{
1663 }
1664 }
1665 else
1666 {
1667 switch (property)
1668 {
1669 // no editable props here
1670 default:
1671 break;
1672 }
1673 }
1674
1675 return err;
6cce68ea
SC
1676}
1677
88a7a4e1 1678void wxMacDataItem::Notification(wxMacDataItemBrowserControl *owner ,
6cce68ea
SC
1679 DataBrowserItemNotification message,
1680 DataBrowserItemDataRef itemData ) const
1681{
1682}
1683
bf9a1615 1684IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl )
6cce68ea 1685
88a7a4e1 1686wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) :
6cce68ea 1687 wxMacDataBrowserControl( peer, pos, size, style )
88a7a4e1 1688{
6cce68ea 1689 m_suppressSelection = false;
e2bc1d69
KO
1690 m_sortOrder = SortOrder_None;
1691 m_clientDataItemsType = wxClientData_None;
1692}
1693
1694wxMacDataItem* wxMacDataItemBrowserControl::CreateItem()
1695{
1696 return new wxMacDataItem();
6cce68ea 1697}
88a7a4e1
WS
1698
1699wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser)
6cce68ea
SC
1700{
1701 m_former = browser->SuppressSelection(true);
1702 m_browser = browser;
1703}
1704
1705wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1706{
1707 m_browser->SuppressSelection(m_former);
1708}
1709
1710bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress )
1711{
1712 bool former = m_suppressSelection;
1713 m_suppressSelection = suppress;
1714
1715 return former;
1716}
1717
88a7a4e1
WS
1718Boolean wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID,
1719 DataBrowserItemID itemTwoID,
1720 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1721{
1722 wxMacDataItem* itemOne = (wxMacDataItem*) itemOneID;
1723 wxMacDataItem* itemTwo = (wxMacDataItem*) itemTwoID;
1724 return CompareItems( itemOne , itemTwo , sortProperty );
1725}
1726
88a7a4e1
WS
1727Boolean wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem* itemOne,
1728 const wxMacDataItem* itemTwo,
1729 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1730{
1731 Boolean retval = false;
1732 if ( itemOne != NULL )
1733 retval = itemOne->IsLessThan( this , itemTwo , sortProperty);
1734 return retval;
1735}
1736
1737OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1738 DataBrowserItemID itemID,
1739 DataBrowserPropertyID property,
1740 DataBrowserItemDataRef itemData,
88a7a4e1 1741 Boolean changeValue )
6cce68ea
SC
1742{
1743 wxMacDataItem* item = (wxMacDataItem*) itemID;
1744 return GetSetItemData(item, property, itemData , changeValue );
1745}
1746
1747OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1748 wxMacDataItem* item,
1749 DataBrowserPropertyID property,
1750 DataBrowserItemDataRef itemData,
88a7a4e1 1751 Boolean changeValue )
6cce68ea
SC
1752{
1753 OSStatus err = errDataBrowserPropertyNotSupported;
1754 switch( property )
1755 {
1756 case kDataBrowserContainerIsClosableProperty :
1757 case kDataBrowserContainerIsSortableProperty :
1758 case kDataBrowserContainerIsOpenableProperty :
1759 // right now default behaviour on these
1760 break;
1761 default :
f49c76e5 1762
e2bc1d69 1763 if ( item != NULL ){
6cce68ea 1764 err = item->GetSetData( this, property , itemData , changeValue );
e2bc1d69 1765 }
6cce68ea 1766 break;
88a7a4e1 1767
6cce68ea
SC
1768 }
1769 return err;
1770}
1771
1772void wxMacDataItemBrowserControl::ItemNotification(
1773 DataBrowserItemID itemID,
1774 DataBrowserItemNotification message,
88a7a4e1 1775 DataBrowserItemDataRef itemData)
6cce68ea 1776{
88a7a4e1 1777 wxMacDataItem* item = (wxMacDataItem*) itemID;
6cce68ea
SC
1778 ItemNotification( item , message, itemData);
1779}
1780
1781void wxMacDataItemBrowserControl::ItemNotification(
1782 const wxMacDataItem* item,
1783 DataBrowserItemNotification message,
88a7a4e1 1784 DataBrowserItemDataRef itemData)
6cce68ea
SC
1785{
1786 if (item != NULL)
1787 item->Notification( this, message, itemData);
1788}
1789
88a7a4e1
WS
1790unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* container,
1791 bool recurse , DataBrowserItemState state) const
6cce68ea 1792{
e6c3d3e6 1793 ItemCount numItems = 0;
88a7a4e1
WS
1794 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID)container,
1795 recurse, state, &numItems ) );
6cce68ea
SC
1796 return numItems;
1797}
1798
f49c76e5 1799unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container,
e2bc1d69
KO
1800 bool recurse ) const
1801{
1802 return GetItemCount( container, recurse, kDataBrowserItemIsSelected );
1803
1804}
1805
88a7a4e1
WS
1806void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem* container,
1807 bool recurse , DataBrowserItemState state, wxArrayMacDataItemPtr &items) const
6cce68ea
SC
1808{
1809 Handle handle = NewHandle(0);
88a7a4e1
WS
1810 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID)container ,
1811 recurse , state, handle) );
6cce68ea
SC
1812
1813 int itemCount = GetHandleSize(handle)/sizeof(DataBrowserItemID);
1814 HLock( handle );
1815 wxMacDataItemPtr* itemsArray = (wxMacDataItemPtr*) *handle;
1816 for ( int i = 0; i < itemCount; ++i)
1817 {
1818 items.Add(itemsArray[i]);
1819 }
1820 HUnlock( handle );
1821 DisposeHandle( handle );
1822}
1823
1824unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem* item) const
1825{
1826 DataBrowserTableViewRowIndex row;
1827 OSStatus err = GetItemRow( (DataBrowserItemID) item , &row);
1828 wxASSERT( err == noErr);
1829 return row;
1830}
1831
1832wxMacDataItem* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n) const
1833{
1834 DataBrowserItemID id;
1835 OSStatus err = GetItemID( (DataBrowserTableViewRowIndex) n , &id);
1836 wxASSERT( err == noErr);
88a7a4e1 1837 return (wxMacDataItem*) id;
6cce68ea
SC
1838}
1839
88a7a4e1 1840void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem *container,
6cce68ea
SC
1841 const wxMacDataItem *item , DataBrowserPropertyID property) const
1842{
88a7a4e1 1843 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, 1,
6cce68ea
SC
1844 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty /* notSorted */, property ) );
1845}
1846
88a7a4e1 1847void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem *container,
6cce68ea
SC
1848 wxArrayMacDataItemPtr &itemArray , DataBrowserPropertyID property) const
1849{
1850 unsigned int noItems = itemArray.GetCount();
1851 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1852 for ( unsigned int i = 0; i < noItems; ++i )
1853 items[i] = (DataBrowserItemID) itemArray[i];
1854
88a7a4e1 1855 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, noItems,
6cce68ea
SC
1856 items, kDataBrowserItemNoProperty /* notSorted */, property ) );
1857 delete [] items;
1858}
1859
3ef4e126 1860void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyType colType,
0e4124e7 1861 const wxString& title, SInt16 just, int defaultWidth)
e2bc1d69
KO
1862{
1863 DataBrowserListViewColumnDesc columnDesc;
1864 columnDesc.headerBtnDesc.titleOffset = 0;
1865 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
1866
1867 columnDesc.headerBtnDesc.btnFontStyle.flags =
1868 kControlUseFontMask | kControlUseJustMask;
1869
f49c76e5 1870 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
e2bc1d69
KO
1871 columnDesc.headerBtnDesc.btnFontStyle.just = just;
1872 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
1873 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
f49c76e5 1874
e2bc1d69
KO
1875 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1876 // defined for other modes?
1877 wxFontEncoding enc;
1878 if ( m_font.Ok() )
1879 enc = m_font.GetEncoding();
1880 else
1881 enc = wxLocale::GetSystemEncoding();
1882 wxMacCFStringHolder cfTitle;
1883 cfTitle.Assign( title, enc );
f49c76e5 1884 columnDesc.headerBtnDesc.titleString = cfTitle;
0d2d29b1
KO
1885
1886 columnDesc.headerBtnDesc.minimumWidth = 0;
1887 columnDesc.headerBtnDesc.maximumWidth = 30000;
e2bc1d69
KO
1888
1889 columnDesc.propertyDesc.propertyID = (kMinColumnId + colId);
1890 columnDesc.propertyDesc.propertyType = colType;
f49c76e5
WS
1891 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
1892#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1893 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
1894#endif
4e78e173 1895#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
67650ea0 1896 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
e2bc1d69
KO
1897#endif
1898
1899 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
0d2d29b1
KO
1900
1901 if (defaultWidth > 0){
1902 SetColumnWidth(colId, defaultWidth);
1903 }
1904
e2bc1d69
KO
1905}
1906
1907void wxMacDataItemBrowserControl::SetColumnWidth(int colId, int width)
1908{
1909 DataBrowserPropertyID id;
1910 GetColumnIDFromIndex(colId, &id);
1911 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id, width));
1912}
1913
1914int wxMacDataItemBrowserControl::GetColumnWidth(int colId)
1915{
1916 DataBrowserPropertyID id;
1917 GetColumnIDFromIndex(colId, &id);
1918 UInt16 result;
1919 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id, &result));
1920 return result;
1921}
1922
6cce68ea
SC
1923void wxMacDataItemBrowserControl::AddItem(wxMacDataItem *container, wxMacDataItem *item)
1924{
88a7a4e1 1925 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, 1,
6cce68ea
SC
1926 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty ) );
1927}
1928
88a7a4e1 1929void wxMacDataItemBrowserControl::AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray )
6cce68ea
SC
1930{
1931 unsigned int noItems = itemArray.GetCount();
1932 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1933 for ( unsigned int i = 0; i < noItems; ++i )
1934 items[i] = (DataBrowserItemID) itemArray[i];
1935
88a7a4e1 1936 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, noItems,
6cce68ea
SC
1937 (DataBrowserItemID*) items, kDataBrowserItemNoProperty ) );
1938 delete [] items;
1939}
1940
88a7a4e1 1941void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem *container, wxMacDataItem* item)
6cce68ea 1942{
88a7a4e1 1943 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 1,
e6c3d3e6 1944 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty );
6cce68ea
SC
1945 verify_noerr( err );
1946}
1947
88a7a4e1 1948void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray)
6cce68ea
SC
1949{
1950 unsigned int noItems = itemArray.GetCount();
1951 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1952 for ( unsigned int i = 0; i < noItems; ++i )
1953 items[i] = (DataBrowserItemID) itemArray[i];
1954
88a7a4e1 1955 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, noItems,
e6c3d3e6 1956 (DataBrowserItemID*) items, kDataBrowserItemNoProperty );
6cce68ea
SC
1957 verify_noerr( err );
1958 delete [] items;
1959}
1960
88a7a4e1 1961void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem *container)
6cce68ea
SC
1962{
1963 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 0 , NULL , kDataBrowserItemNoProperty );
1964 verify_noerr( err );
1965}
1966
88a7a4e1 1967void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem* item , DataBrowserSetOption option)
6cce68ea
SC
1968{
1969 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID*) &item, option ));
1970}
1971
88a7a4e1 1972void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option)
6cce68ea
SC
1973{
1974 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL , option ));
1975}
1976
88a7a4e1 1977void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr &itemArray , DataBrowserSetOption option)
6cce68ea
SC
1978{
1979 unsigned int noItems = itemArray.GetCount();
1980 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1981 for ( unsigned int i = 0; i < noItems; ++i )
1982 items[i] = (DataBrowserItemID) itemArray[i];
1983
1984 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems, (DataBrowserItemID*) items, option ));
1985 delete [] items;
1986}
1987
1988Boolean wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem* item) const
1989{
1990 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID) item);
1991}
1992
88a7a4e1 1993void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options)
6cce68ea
SC
1994{
1995 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID) item, kDataBrowserNoItem , options ) );
1996}
1997
88a7a4e1 1998void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const
6cce68ea 1999{
88a7a4e1 2000 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID*) first, (DataBrowserItemID*) last) );
6cce68ea
SC
2001}
2002
e2bc1d69
KO
2003wxClientDataType wxMacDataItemBrowserControl::GetClientDataType() const
2004{
2005 return m_clientDataItemsType;
2006}
2007void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType)
2008{
2009 m_clientDataItemsType = clientDataItemsType;
2010}
2011
2012unsigned int wxMacDataItemBrowserControl::MacGetCount() const
2013{
2014 return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState);
2015}
2016
2017void wxMacDataItemBrowserControl::MacDelete( unsigned int n )
2018{
2019 wxMacDataItem* item = (wxMacDataItem*)GetItemFromLine( n );
2020 RemoveItem( wxMacDataBrowserRootContainer, item );
2021}
2022
a236aa20
VZ
2023void wxMacDataItemBrowserControl::MacInsert( unsigned int n,
2024 const wxArrayStringsAdapter& items,
2025 int column )
e2bc1d69
KO
2026{
2027 size_t itemsCount = items.GetCount();
2028 if ( itemsCount == 0 )
2029 return;
2030
2031 SInt32 frontLineOrder = 0;
2032
2033 if ( m_sortOrder == SortOrder_None )
2034 {
2035 // increase the order of the lines to be shifted
2036 unsigned int lines = MacGetCount();
2037 for ( unsigned int i = n; i < lines; ++i)
2038 {
2039 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
2040 iter->SetOrder( iter->GetOrder() + itemsCount );
2041 }
2042 if ( n > 0 )
2043 {
2044 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
2045 frontLineOrder = iter->GetOrder();
2046 }
2047 }
2048
2049 wxArrayMacDataItemPtr ids;
2050 ids.SetCount( itemsCount );
2051
2052 for ( unsigned int i = 0; i < itemsCount; ++i )
2053 {
2054 wxMacDataItem* item = CreateItem();
2055 item->SetLabel( items[i]);
2056 if ( column != -1 )
2057 item->SetColumn( kMinColumnId + column );
f49c76e5 2058
e2bc1d69
KO
2059 if ( m_sortOrder == SortOrder_None )
2060 item->SetOrder( frontLineOrder + 1 + i );
2061
2062 ids[i] = item;
2063 }
2064
2065 AddItems( wxMacDataBrowserRootContainer, ids );
2066}
2067
2068int wxMacDataItemBrowserControl::MacAppend( const wxString& text)
2069{
2070 wxMacDataItem* item = CreateItem();
2071 item->SetLabel( text );
2072 if ( m_sortOrder == SortOrder_None )
2073 {
2074 unsigned int lines = MacGetCount();
2075 if ( lines == 0 )
2076 item->SetOrder( 1 );
2077 else
2078 {
2079 wxMacDataItem* frontItem = (wxMacDataItem*) GetItemFromLine(lines-1);
2080 item->SetOrder( frontItem->GetOrder() + 1 );
2081 }
2082 }
2083 AddItem( wxMacDataBrowserRootContainer, item );
2084
2085 return GetLineFromItem(item);
2086}
2087
2088void wxMacDataItemBrowserControl::MacClear()
2089{
2090 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
2091 RemoveAllItems(wxMacDataBrowserRootContainer);
2092}
2093
2094void wxMacDataItemBrowserControl::MacDeselectAll()
2095{
2096 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
2097 SetSelectedAllItems( kDataBrowserItemsRemove );
2098}
2099
2100void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n, bool select, bool multi )
2101{
2102 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
2103 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
2104
2105 if ( IsItemSelected( item ) != select )
2106 {
2107 if ( select )
2108 SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
2109 else
2110 SetSelectedItem( item, kDataBrowserItemsRemove );
2111 }
2112
2113 MacScrollTo( n );
2114}
2115
2116bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n ) const
2117{
2118 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
2119 return IsItemSelected( item );
2120}
2121
2122int wxMacDataItemBrowserControl::MacGetSelection() const
2123{
2124 wxMacDataItemPtr first, last;
2125 GetSelectionAnchor( &first, &last );
2126
2127 if ( first != NULL )
2128 {
2129 return GetLineFromItem( first );
2130 }
2131
2132 return -1;
2133}
2134
2135int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt& aSelections ) const
2136{
2137 aSelections.Empty();
2138 wxArrayMacDataItemPtr selectedItems;
2139 GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
2140
2141 int count = selectedItems.GetCount();
2142
2143 for ( int i = 0; i < count; ++i)
2144 {
2145 aSelections.Add(GetLineFromItem(selectedItems[i]));
2146 }
2147
2148 return count;
2149}
2150
2151void wxMacDataItemBrowserControl::MacSetString( unsigned int n, const wxString& text )
2152{
2153 // as we don't store the strings we only have to issue a redraw
2154 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
2155 item->SetLabel( text );
2156 UpdateItem( wxMacDataBrowserRootContainer, item , kTextColumnId );
2157}
2158
2159wxString wxMacDataItemBrowserControl::MacGetString( unsigned int n ) const
2160{
2161 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
2162 return item->GetLabel();
2163}
2164
2165void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n, void * data)
2166{
2167 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
2168 item->SetData( data );
2169 // not displayed, therefore no Update infos to DataBrowser
2170}
2171
2172void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n) const
2173{
2174 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
2175 return item->GetData();
2176}
2177
2178void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n )
2179{
2180 RevealItem( GetItemFromLine( n) , kDataBrowserRevealWithoutSelecting );
2181}
2182
88a7a4e1 2183
6cce68ea 2184
5ca0d812
SC
2185//
2186// Tab Control
2187//
9d8aca48
WS
2188
2189OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
5ca0d812 2190{
6cce68ea 2191 return ::SetTabEnabled( m_controlRef , tabNo , enable );
5ca0d812 2192}
9d8aca48 2193
30e77b5c
SC
2194//
2195// Quartz Support
2196//
2197
2198#ifdef __WXMAC_OSX__
2199// snippets from Sketch Sample from Apple :
2200
8638e69b
DS
2201#define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2202
30e77b5c 2203/*
fb5246be 2204 This function locates, opens, and returns the profile reference for the calibrated
30e77b5c
SC
2205 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2206 with the profile reference this function returns.
2207*/
8638e69b 2208CMProfileRef wxMacOpenGenericProfile()
30e77b5c
SC
2209{
2210 static CMProfileRef cachedRGBProfileRef = NULL;
fb5246be 2211
30e77b5c
SC
2212 // we only create the profile reference once
2213 if (cachedRGBProfileRef == NULL)
2214 {
fb5246be
WS
2215 CMProfileLocation loc;
2216
2217 loc.locType = cmPathBasedProfile;
2218 strcpy(loc.u.pathLoc.path, kGenericRGBProfilePathStr);
2219
2220 verify_noerr( CMOpenProfile(&cachedRGBProfileRef, &loc) );
30e77b5c
SC
2221 }
2222
8638e69b 2223 // clone the profile reference so that the caller has their own reference, not our cached one
30e77b5c 2224 if (cachedRGBProfileRef)
fb5246be 2225 CMCloneProfileRef(cachedRGBProfileRef);
30e77b5c
SC
2226
2227 return cachedRGBProfileRef;
2228}
2229
2230/*
2231 Return the generic RGB color space. This is a 'get' function and the caller should
2232 not release the returned value unless the caller retains it first. Usually callers
2233 of this routine will immediately use the returned colorspace with CoreGraphics
2234 so they typically do not need to retain it themselves.
fb5246be 2235
30e77b5c
SC
2236 This function creates the generic RGB color space once and hangs onto it so it can
2237 return it whenever this function is called.
2238*/
2239
2240CGColorSpaceRef wxMacGetGenericRGBColorSpace()
2241{
6cce68ea 2242 static wxMacCFRefHolder<CGColorSpaceRef> genericRGBColorSpace;
fb5246be 2243
8638e69b
DS
2244 if (genericRGBColorSpace == NULL)
2245 {
26a2f914 2246 if ( UMAGetSystemVersion() >= 0x1040 )
fb5246be 2247 {
6cce68ea 2248 genericRGBColorSpace.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
fb5246be 2249 }
26a2f914
SC
2250 else
2251 {
2252 CMProfileRef genericRGBProfile = wxMacOpenGenericProfile();
8638e69b 2253
26a2f914
SC
2254 if (genericRGBProfile)
2255 {
6cce68ea 2256 genericRGBColorSpace.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile) );
8638e69b 2257
6cce68ea 2258 wxASSERT_MSG( genericRGBColorSpace != NULL, wxT("couldn't create the generic RGB color space") );
8638e69b 2259
26a2f914 2260 // we opened the profile so it is up to us to close it
88a7a4e1 2261 CMCloseProfile(genericRGBProfile);
26a2f914
SC
2262 }
2263 }
8638e69b
DS
2264 }
2265
30e77b5c
SC
2266 return genericRGBColorSpace;
2267}
2268#endif
2269
e6c3d3e6
SC
2270#ifndef __LP64__
2271
54ce9ebb
JS
2272wxMacPortSaver::wxMacPortSaver( GrafPtr port )
2273{
6cce68ea
SC
2274 ::GetPort( &m_port );
2275 ::SetPort( port );
54ce9ebb
JS
2276}
2277
2278wxMacPortSaver::~wxMacPortSaver()
2279{
6cce68ea 2280 ::SetPort( m_port );
54ce9ebb 2281}
e6c3d3e6
SC
2282#endif
2283
2284void wxMacGlobalToLocal( WindowRef window , Point*pt )
2285{
f49c76e5 2286#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
e6c3d3e6 2287 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
2288 HIViewRef contentView ;
2289 // TODO check toolbar offset
daca43d8 2290 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
f49c76e5 2291 HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
e6c3d3e6
SC
2292 pt->h = p.x;
2293 pt->v = p.y;
2294#else
2295 QDGlobalToLocalPoint( GetWindowPort(window), pt ) ;
2296#endif
2297}
2298
2299void wxMacLocalToGlobal( WindowRef window , Point*pt )
2300{
f49c76e5 2301#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
e6c3d3e6 2302 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
2303 HIViewRef contentView ;
2304 // TODO check toolbar offset
daca43d8
SC
2305 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
2306 HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
e6c3d3e6
SC
2307 pt->h = p.x;
2308 pt->v = p.y;
2309#else
2310 QDLocalToGlobalPoint( GetWindowPort(window), pt ) ;
2311#endif
2312}
54ce9ebb 2313
b6ed2b86 2314#endif // wxUSE_GUI