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