]> git.saurik.com Git - wxWidgets.git/blame - src/mac/carbon/utils.cpp
Add middle-item click support.
[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{
8c981ec6
SC
866 wxASSERT_MSG( IsValidControlHandle(m_controlRef) , wxT("Invalid Control Handle (maybe already released) in Dispose") );
867
83f787ba
SC
868 // we cannot check the ref count here anymore, as autorelease objects might delete their refs later
869 CFRelease(m_controlRef);
6cce68ea 870 m_controlRef = NULL;
5ca0d812
SC
871}
872
e6c3d3e6 873void wxMacControl::SetReference( URefCon data )
5ca0d812 874{
6cce68ea 875 SetControlReference( m_controlRef , data );
5ca0d812
SC
876}
877
29d91661 878OSStatus wxMacControl::GetData(ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const
86d8b744 879{
6cce68ea 880 return ::GetControlData( m_controlRef , inPartCode , inTag , inBufferSize , inOutBuffer , outActualSize );
86d8b744
SC
881}
882
29d91661 883OSStatus wxMacControl::GetDataSize(ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const
86d8b744 884{
6cce68ea 885 return ::GetControlDataSize( m_controlRef , inPartCode , inTag , outActualSize );
86d8b744
SC
886}
887
888OSStatus wxMacControl::SetData(ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData)
889{
6cce68ea 890 return ::SetControlData( m_controlRef , inPartCode , inTag , inSize , inData );
86d8b744
SC
891}
892
8638e69b 893OSStatus wxMacControl::SendEvent( EventRef event , OptionBits inOptions )
21fd5529 894{
e996f509 895#if TARGET_API_MAC_OSX
9d8aca48 896 return SendEventToEventTargetWithOptions( event,
8638e69b 897 HIObjectGetEventTarget( (HIObjectRef) m_controlRef ), inOptions );
e996f509 898#else
9d8aca48 899 #pragma unused(inOptions)
6cce68ea 900 return SendEventToEventTarget(event,GetControlEventTarget( m_controlRef ) );
e996f509 901#endif
21fd5529
SC
902}
903
9d8aca48 904OSStatus wxMacControl::SendHICommand( HICommand &command , OptionBits inOptions )
21fd5529 905{
6cce68ea 906 wxMacCarbonEvent event( kEventClassCommand , kEventCommandProcess );
8638e69b 907
6cce68ea 908 event.SetParameter<HICommand>(kEventParamDirectObject,command);
8638e69b 909
6cce68ea 910 return SendEvent( event , inOptions );
21fd5529
SC
911}
912
9d8aca48 913OSStatus wxMacControl::SendHICommand( UInt32 commandID , OptionBits inOptions )
21fd5529 914{
6cce68ea 915 HICommand command;
8638e69b 916
6cce68ea
SC
917 memset( &command, 0 , sizeof(command) );
918 command.commandID = commandID;
919 return SendHICommand( command , inOptions );
21fd5529
SC
920}
921
9d8aca48 922void wxMacControl::Flash( ControlPartCode part , UInt32 ticks )
21fd5529 923{
6cce68ea 924 unsigned long finalTicks;
8638e69b 925
6cce68ea
SC
926 HiliteControl( m_controlRef , part );
927 Delay( ticks , &finalTicks );
928 HiliteControl( m_controlRef , kControlNoPart );
21fd5529
SC
929}
930
7f7b52b4 931SInt32 wxMacControl::GetValue() const
9d8aca48 932{
6cce68ea 933 return ::GetControl32BitValue( m_controlRef );
7f7b52b4
SC
934}
935
936SInt32 wxMacControl::GetMaximum() const
9d8aca48 937{
6cce68ea 938 return ::GetControl32BitMaximum( m_controlRef );
7f7b52b4
SC
939}
940
941SInt32 wxMacControl::GetMinimum() const
9d8aca48 942{
6cce68ea 943 return ::GetControl32BitMinimum( m_controlRef );
7f7b52b4
SC
944}
945
9d8aca48
WS
946void wxMacControl::SetValue( SInt32 v )
947{
6cce68ea 948 ::SetControl32BitValue( m_controlRef , v );
7f7b52b4
SC
949}
950
9d8aca48
WS
951void wxMacControl::SetMinimum( SInt32 v )
952{
6cce68ea 953 ::SetControl32BitMinimum( m_controlRef , v );
7f7b52b4
SC
954}
955
9d8aca48
WS
956void wxMacControl::SetMaximum( SInt32 v )
957{
6cce68ea 958 ::SetControl32BitMaximum( m_controlRef , v );
7f7b52b4
SC
959}
960
961void wxMacControl::SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum )
962{
6cce68ea
SC
963 ::SetControl32BitMinimum( m_controlRef , minimum );
964 ::SetControl32BitMaximum( m_controlRef , maximum );
965 ::SetControl32BitValue( m_controlRef , value );
7f7b52b4
SC
966}
967
9d8aca48 968OSStatus wxMacControl::SetFocus( ControlFocusPart focusPart )
5ca0d812 969{
6cce68ea 970 return SetKeyboardFocus( GetControlOwner( m_controlRef ), m_controlRef, focusPart );
5ca0d812
SC
971}
972
9d8aca48 973bool wxMacControl::HasFocus() const
5ca0d812 974{
6cce68ea
SC
975 ControlRef control;
976 GetKeyboardFocus( GetUserFocusWindow() , &control );
977 return control == m_controlRef;
5ca0d812
SC
978}
979
fb5246be 980void wxMacControl::SetNeedsFocusRect( bool needs )
9b89f11a 981{
6cce68ea 982 m_needsFocusRect = needs;
9b89f11a
SC
983}
984
9d8aca48 985bool wxMacControl::NeedsFocusRect() const
5ca0d812 986{
6cce68ea 987 return m_needsFocusRect;
5ca0d812
SC
988}
989
9d8aca48 990void wxMacControl::VisibilityChanged(bool shown)
29d91661
SC
991{
992}
993
89a66f11
SC
994void wxMacControl::SuperChangedPosition()
995{
996}
997
9d8aca48 998void wxMacControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle )
29d91661 999{
6cce68ea 1000 m_font = font;
9d8aca48
WS
1001 ControlFontStyleRec fontStyle;
1002 if ( font.MacGetThemeFontID() != kThemeCurrentPortFont )
1003 {
8638e69b 1004 switch ( font.MacGetThemeFontID() )
9d8aca48 1005 {
8638e69b 1006 case kThemeSmallSystemFont :
6cce68ea
SC
1007 fontStyle.font = kControlFontSmallSystemFont;
1008 break;
8638e69b
DS
1009
1010 case 109 : // mini font
6cce68ea
SC
1011 fontStyle.font = -5;
1012 break;
8638e69b
DS
1013
1014 case kThemeSystemFont :
6cce68ea
SC
1015 fontStyle.font = kControlFontBigSystemFont;
1016 break;
8638e69b
DS
1017
1018 default :
6cce68ea
SC
1019 fontStyle.font = kControlFontBigSystemFont;
1020 break;
9d8aca48 1021 }
8638e69b 1022
6cce68ea 1023 fontStyle.flags = kControlUseFontMask;
9d8aca48
WS
1024 }
1025 else
1026 {
6cce68ea
SC
1027 fontStyle.font = font.MacGetFontNum();
1028 fontStyle.style = font.MacGetFontStyle();
1029 fontStyle.size = font.MacGetFontSize();
1030 fontStyle.flags = kControlUseFontMask | kControlUseFaceMask | kControlUseSizeMask;
9d8aca48 1031 }
29d91661 1032
6cce68ea
SC
1033 fontStyle.just = teJustLeft;
1034 fontStyle.flags |= kControlUseJustMask;
29d91661 1035 if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_CENTER_HORIZONTAL )
6cce68ea 1036 fontStyle.just = teJustCenter;
29d91661 1037 else if ( ( windowStyle & wxALIGN_MASK ) & wxALIGN_RIGHT )
6cce68ea 1038 fontStyle.just = teJustRight;
29d91661 1039
9d8aca48 1040
29d91661
SC
1041 // we only should do this in case of a non-standard color, as otherwise 'disabled' controls
1042 // won't get grayed out by the system anymore
9d8aca48 1043
29d91661
SC
1044 if ( foreground != *wxBLACK )
1045 {
6cce68ea
SC
1046 fontStyle.foreColor = MAC_WXCOLORREF( foreground.GetPixel() );
1047 fontStyle.flags |= kControlUseForeColorMask;
29d91661 1048 }
9d8aca48
WS
1049
1050 ::SetControlFontStyle( m_controlRef , &fontStyle );
29d91661
SC
1051}
1052
9d8aca48 1053void wxMacControl::SetBackground( const wxBrush &WXUNUSED(brush) )
7ea087b7 1054{
9d8aca48 1055 // TODO
7ea087b7
SC
1056 // setting up a color proc is not recommended anymore
1057}
1058
7f7b52b4
SC
1059void wxMacControl::SetRange( SInt32 minimum , SInt32 maximum )
1060{
6cce68ea
SC
1061 ::SetControl32BitMinimum( m_controlRef , minimum );
1062 ::SetControl32BitMaximum( m_controlRef , maximum );
7f7b52b4
SC
1063}
1064
8638e69b 1065short wxMacControl::HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers )
5ca0d812 1066{
e6c3d3e6 1067#ifndef __LP64__
6cce68ea 1068 return HandleControlKey( m_controlRef , keyCode , charCode , modifiers );
e6c3d3e6
SC
1069#else
1070 return 0;
1071#endif
5ca0d812
SC
1072}
1073
1074void wxMacControl::SetActionProc( ControlActionUPP actionProc )
1075{
6cce68ea 1076 SetControlAction( m_controlRef , actionProc );
5ca0d812
SC
1077}
1078
1079void wxMacControl::SetViewSize( SInt32 viewSize )
1080{
6cce68ea 1081 SetControlViewSize(m_controlRef , viewSize );
5ca0d812
SC
1082}
1083
1084SInt32 wxMacControl::GetViewSize() const
1085{
6cce68ea 1086 return GetControlViewSize( m_controlRef );
5ca0d812
SC
1087}
1088
9d8aca48 1089bool wxMacControl::IsVisible() const
5ca0d812 1090{
6cce68ea 1091 return IsControlVisible( m_controlRef );
5ca0d812
SC
1092}
1093
9d8aca48 1094void wxMacControl::SetVisibility( bool visible , bool redraw )
5ca0d812 1095{
6cce68ea 1096 SetControlVisibility( m_controlRef , visible , redraw );
5ca0d812
SC
1097}
1098
9d8aca48 1099bool wxMacControl::IsEnabled() const
5ca0d812
SC
1100{
1101#if TARGET_API_MAC_OSX
6cce68ea 1102 return IsControlEnabled( m_controlRef );
5ca0d812 1103#else
6cce68ea 1104 return IsControlActive( m_controlRef );
5ca0d812
SC
1105#endif
1106}
1107
9d8aca48 1108bool wxMacControl::IsActive() const
5ca0d812 1109{
6cce68ea 1110 return IsControlActive( m_controlRef );
5ca0d812
SC
1111}
1112
9d8aca48 1113void wxMacControl::Enable( bool enable )
5ca0d812 1114{
5ca0d812 1115 if ( enable )
6cce68ea 1116 EnableControl( m_controlRef );
5ca0d812 1117 else
6cce68ea 1118 DisableControl( m_controlRef );
5ca0d812
SC
1119}
1120
9d8aca48 1121void wxMacControl::SetDrawingEnabled( bool enable )
5ca0d812 1122{
6cce68ea 1123 HIViewSetDrawingEnabled( m_controlRef , enable );
5ca0d812
SC
1124}
1125
9d8aca48 1126bool wxMacControl::GetNeedsDisplay() const
5ca0d812 1127{
e779b609 1128 return HIViewGetNeedsDisplay( m_controlRef );
5ca0d812
SC
1129}
1130
1f1c8bd4 1131void wxMacControl::SetNeedsDisplay( RgnHandle where )
5ca0d812 1132{
1f1c8bd4 1133 if ( !IsVisible() )
6cce68ea 1134 return;
fb5246be 1135
e779b609 1136 HIViewSetNeedsDisplayInRegion( m_controlRef , where , true );
5ca0d812 1137}
1f1c8bd4
SC
1138
1139void wxMacControl::SetNeedsDisplay( Rect* where )
1140{
1141 if ( !IsVisible() )
6cce68ea 1142 return;
1f1c8bd4 1143
e779b609 1144 if ( where != NULL )
1f1c8bd4 1145 {
e779b609
SC
1146 RgnHandle update = NewRgn();
1147 RectRgn( update , where );
1148 HIViewSetNeedsDisplayInRegion( m_controlRef , update , true );
1149 DisposeRgn( update );
1f1c8bd4
SC
1150 }
1151 else
e779b609 1152 HIViewSetNeedsDisplay( m_controlRef , true );
1f1c8bd4 1153}
5ca0d812 1154
9d8aca48 1155void wxMacControl::Convert( wxPoint *pt , wxMacControl *from , wxMacControl *to )
5ca0d812 1156{
e779b609 1157 HIPoint hiPoint;
8638e69b 1158
e779b609
SC
1159 hiPoint.x = pt->x;
1160 hiPoint.y = pt->y;
1161 HIViewConvertPoint( &hiPoint , from->m_controlRef , to->m_controlRef );
1162 pt->x = (int)hiPoint.x;
1163 pt->y = (int)hiPoint.y;
5ca0d812
SC
1164}
1165
9d8aca48 1166void wxMacControl::SetRect( Rect *r )
5ca0d812 1167{
9b89f11a
SC
1168 //A HIRect is actually a CGRect on OSX - which consists of two structures -
1169 //CGPoint and CGSize, which have two floats each
6cce68ea
SC
1170 HIRect hir = { { r->left , r->top }, { r->right - r->left , r->bottom - r->top } };
1171 HIViewSetFrame ( m_controlRef , &hir );
1172 // eventuall we might have to do a SetVisibility( false , true );
1173 // before and a SetVisibility( true , true ); after
8bb6b2c0 1174}
5ca0d812 1175
9d8aca48 1176void wxMacControl::GetRect( Rect *r )
5ca0d812 1177{
6cce68ea 1178 GetControlBounds( m_controlRef , r );
5ca0d812
SC
1179}
1180
9d8aca48 1181void wxMacControl::GetRectInWindowCoords( Rect *r )
5ca0d812 1182{
6cce68ea 1183 UMAGetControlBoundsInWindowCoords( m_controlRef , r );
5ca0d812
SC
1184}
1185
9d8aca48 1186void wxMacControl::GetBestRect( Rect *r )
5ca0d812 1187{
6cce68ea 1188 short baselineoffset;
8638e69b 1189
6cce68ea 1190 GetBestControlRect( m_controlRef , r , &baselineoffset );
5ca0d812
SC
1191}
1192
fb5246be 1193void wxMacControl::SetLabel( const wxString &title )
5ca0d812 1194{
10a59880
RD
1195 wxFontEncoding encoding;
1196
1197 if ( m_font.Ok() )
1198 encoding = m_font.GetEncoding();
1199 else
1200 encoding = wxFont::GetDefaultEncoding();
9d8aca48 1201
6cce68ea 1202 UMASetControlTitle( m_controlRef , title , encoding );
5ca0d812
SC
1203}
1204
1205void wxMacControl::GetFeatures( UInt32 * features )
1206{
6cce68ea 1207 GetControlFeatures( m_controlRef , features );
5ca0d812
SC
1208}
1209
9d8aca48 1210OSStatus wxMacControl::GetRegion( ControlPartCode partCode , RgnHandle region )
5ca0d812 1211{
6cce68ea 1212 OSStatus err = GetControlRegion( m_controlRef , partCode , region );
6cce68ea 1213 return err;
5ca0d812
SC
1214}
1215
9d8aca48 1216OSStatus wxMacControl::SetZOrder( bool above , wxMacControl* other )
5ca0d812
SC
1217{
1218#if TARGET_API_MAC_OSX
9d8aca48 1219 return HIViewSetZOrder( m_controlRef,above ? kHIViewZOrderAbove : kHIViewZOrderBelow,
6cce68ea 1220 (other != NULL) ? other->m_controlRef : NULL);
5ca0d812 1221#else
6cce68ea 1222 return 0;
5ca0d812
SC
1223#endif
1224}
1225
5ca0d812
SC
1226#if TARGET_API_MAC_OSX
1227// SetNeedsDisplay would not invalidate the children
1228static void InvalidateControlAndChildren( HIViewRef control )
1229{
6cce68ea
SC
1230 HIViewSetNeedsDisplay( control , true );
1231 UInt16 childrenCount = 0;
1232 OSStatus err = CountSubControls( control , &childrenCount );
5ca0d812 1233 if ( err == errControlIsNotEmbedder )
6cce68ea 1234 return;
8638e69b 1235
6cce68ea 1236 wxASSERT_MSG( err == noErr , wxT("Unexpected error when accessing subcontrols") );
5ca0d812 1237
6cce68ea 1238 for ( UInt16 i = childrenCount; i >=1; --i )
5ca0d812 1239 {
6cce68ea 1240 HIViewRef child;
8638e69b 1241
6cce68ea 1242 err = GetIndexedSubControl( control , i , & child );
5ca0d812 1243 if ( err == errControlIsNotEmbedder )
6cce68ea 1244 return;
8638e69b 1245
6cce68ea 1246 InvalidateControlAndChildren( child );
5ca0d812
SC
1247 }
1248}
1249#endif
1250
9d8aca48 1251void wxMacControl::InvalidateWithChildren()
5ca0d812
SC
1252{
1253#if TARGET_API_MAC_OSX
6cce68ea 1254 InvalidateControlAndChildren( m_controlRef );
5ca0d812
SC
1255#endif
1256}
1257
fb5246be 1258void wxMacControl::ScrollRect( wxRect *r , int dx , int dy )
5ca0d812 1259{
6cce68ea 1260 wxASSERT( r != NULL );
8638e69b 1261
e779b609
SC
1262 HIRect scrollarea = CGRectMake( r->x , r->y , r->width , r->height);
1263 HIViewScrollRect ( m_controlRef , &scrollarea , dx ,dy );
5ca0d812
SC
1264}
1265
6cce68ea
SC
1266OSType wxMacCreator = 'WXMC';
1267OSType wxMacControlProperty = 'MCCT';
1268
88a7a4e1 1269void wxMacControl::SetReferenceInNativeControl()
6cce68ea
SC
1270{
1271 void * data = this;
1272 verify_noerr( SetControlProperty ( m_controlRef ,
1273 wxMacCreator,wxMacControlProperty, sizeof(data), &data ) );
1274}
1275
88a7a4e1 1276wxMacControl* wxMacControl::GetReferenceFromNativeControl(ControlRef control)
6cce68ea
SC
1277{
1278 wxMacControl* ctl = NULL;
e6c3d3e6 1279 ByteCount actualSize;
6cce68ea
SC
1280 if ( GetControlProperty( control ,wxMacCreator,wxMacControlProperty, sizeof(ctl) ,
1281 &actualSize , &ctl ) == noErr )
1282 {
1283 return ctl;
1284 }
1285 return NULL;
1286}
1287
1288// ============================================================================
1289// DataBrowser Wrapper
1290// ============================================================================
1291//
1292// basing on DataBrowserItemIDs
1293//
1294
bf9a1615
SC
1295IMPLEMENT_ABSTRACT_CLASS( wxMacDataBrowserControl , wxMacControl )
1296
6cce68ea
SC
1297pascal void wxMacDataBrowserControl::DataBrowserItemNotificationProc(
1298 ControlRef browser,
1299 DataBrowserItemID itemID,
1300 DataBrowserItemNotification message,
1301 DataBrowserItemDataRef itemData )
1302{
bf9a1615 1303 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
1304 if ( ctl != 0 )
1305 {
1306 ctl->ItemNotification(itemID, message, itemData);
1307 }
1308}
1309
1310pascal OSStatus wxMacDataBrowserControl::DataBrowserGetSetItemDataProc(
1311 ControlRef browser,
1312 DataBrowserItemID itemID,
1313 DataBrowserPropertyID property,
1314 DataBrowserItemDataRef itemData,
1315 Boolean changeValue )
1316{
1317 OSStatus err = errDataBrowserPropertyNotSupported;
bf9a1615 1318 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
1319 if ( ctl != 0 )
1320 {
1321 err = ctl->GetSetItemData(itemID, property, itemData, changeValue);
1322 }
1323 return err;
1324}
1325
1326pascal Boolean wxMacDataBrowserControl::DataBrowserCompareProc(
88a7a4e1
WS
1327 ControlRef browser,
1328 DataBrowserItemID itemOneID,
1329 DataBrowserItemID itemTwoID,
1330 DataBrowserPropertyID sortProperty)
6cce68ea 1331{
bf9a1615 1332 wxMacDataBrowserControl* ctl = wxDynamicCast(wxMacControl::GetReferenceFromNativeControl( browser ), wxMacDataBrowserControl);
6cce68ea
SC
1333 if ( ctl != 0 )
1334 {
1335 return ctl->CompareItems(itemOneID, itemTwoID, sortProperty);
1336 }
1337 return false;
1338}
1339
1340DataBrowserItemDataUPP gDataBrowserItemDataUPP = NULL;
1341DataBrowserItemNotificationUPP gDataBrowserItemNotificationUPP = NULL;
1342DataBrowserItemCompareUPP gDataBrowserItemCompareUPP = NULL;
1343
1344wxMacDataBrowserControl::wxMacDataBrowserControl( wxWindow* peer, const wxPoint& pos, const wxSize& size, long style) : wxMacControl( peer )
88a7a4e1 1345{
6cce68ea
SC
1346 Rect bounds = wxMacGetBoundsForControl( peer, pos, size );
1347 OSStatus err = ::CreateDataBrowserControl(
1348 MAC_WXHWND(peer->MacGetTopLevelWindowRef()),
1349 &bounds, kDataBrowserListView, &m_controlRef );
1350 SetReferenceInNativeControl();
1351 verify_noerr( err );
1352 if ( gDataBrowserItemCompareUPP == NULL )
1353 gDataBrowserItemCompareUPP = NewDataBrowserItemCompareUPP(DataBrowserCompareProc);
1354 if ( gDataBrowserItemDataUPP == NULL )
1355 gDataBrowserItemDataUPP = NewDataBrowserItemDataUPP(DataBrowserGetSetItemDataProc);
1356 if ( gDataBrowserItemNotificationUPP == NULL )
1357 {
1358 gDataBrowserItemNotificationUPP =
1359#if TARGET_API_MAC_OSX
1360 (DataBrowserItemNotificationUPP) NewDataBrowserItemNotificationWithItemUPP(DataBrowserItemNotificationProc);
1361#else
1362 NewDataBrowserItemNotificationUPP(DataBrowserItemNotificationProc);
1363#endif
1364 }
1365
1366 DataBrowserCallbacks callbacks;
1367 InitializeDataBrowserCallbacks( &callbacks, kDataBrowserLatestCallbacks );
1368
1369 callbacks.u.v1.itemDataCallback = gDataBrowserItemDataUPP;
1370 callbacks.u.v1.itemCompareCallback = gDataBrowserItemCompareUPP;
1371 callbacks.u.v1.itemNotificationCallback = gDataBrowserItemNotificationUPP;
1372 SetCallbacks( &callbacks );
1373
1374}
1375
1376OSStatus wxMacDataBrowserControl::GetItemCount( DataBrowserItemID container,
1377 Boolean recurse,
1378 DataBrowserItemState state,
e6c3d3e6 1379 ItemCount *numItems) const
6cce68ea 1380{
88a7a4e1 1381 return GetDataBrowserItemCount( m_controlRef, container, recurse, state, numItems );
6cce68ea
SC
1382}
1383
1384OSStatus wxMacDataBrowserControl::GetItems( DataBrowserItemID container,
1385 Boolean recurse,
1386 DataBrowserItemState state,
88a7a4e1 1387 Handle items) const
6cce68ea 1388{
88a7a4e1 1389 return GetDataBrowserItems( m_controlRef, container, recurse, state, items );
6cce68ea
SC
1390}
1391
1392OSStatus wxMacDataBrowserControl::SetSelectionFlags( DataBrowserSelectionFlags options )
1393{
1394 return SetDataBrowserSelectionFlags( m_controlRef, options );
1395}
1396
1397OSStatus wxMacDataBrowserControl::AddColumn( DataBrowserListViewColumnDesc *columnDesc,
1398 DataBrowserTableViewColumnIndex position )
1399{
1400 return AddDataBrowserListViewColumn( m_controlRef, columnDesc, position );
1401}
1402
e2bc1d69 1403OSStatus wxMacDataBrowserControl::GetColumnIDFromIndex( DataBrowserTableViewColumnIndex position, DataBrowserTableViewColumnID* id ){
f49c76e5 1404 return GetDataBrowserTableViewColumnProperty( m_controlRef, position, id );
e2bc1d69
KO
1405}
1406
1407OSStatus wxMacDataBrowserControl::RemoveColumn( DataBrowserTableViewColumnIndex position )
1408{
f49c76e5 1409 DataBrowserTableViewColumnID id;
e2bc1d69
KO
1410 GetColumnIDFromIndex( position, &id );
1411 return RemoveDataBrowserTableViewColumn( m_controlRef, id );
1412}
1413
6cce68ea
SC
1414OSStatus wxMacDataBrowserControl::AutoSizeColumns()
1415{
1416 return AutoSizeDataBrowserListViewColumns(m_controlRef);
1417}
1418
1419OSStatus wxMacDataBrowserControl::SetHasScrollBars( bool horiz, bool vert )
1420{
1421 return SetDataBrowserHasScrollBars( m_controlRef, horiz, vert );
1422}
1423
1424OSStatus wxMacDataBrowserControl::SetHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle )
1425{
1426 return SetDataBrowserTableViewHiliteStyle( m_controlRef, hiliteStyle );
1427}
1428
1429OSStatus wxMacDataBrowserControl::SetHeaderButtonHeight(UInt16 height)
1430{
1431 return SetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1432}
1433
1434OSStatus wxMacDataBrowserControl::GetHeaderButtonHeight(UInt16 *height)
1435{
1436 return GetDataBrowserListViewHeaderBtnHeight( m_controlRef, height );
1437}
1438
1439OSStatus wxMacDataBrowserControl::SetCallbacks(const DataBrowserCallbacks *callbacks)
1440{
1441 return SetDataBrowserCallbacks( m_controlRef, callbacks );
1442}
1443
88a7a4e1 1444OSStatus wxMacDataBrowserControl::UpdateItems(
6cce68ea
SC
1445 DataBrowserItemID container,
1446 UInt32 numItems,
1447 const DataBrowserItemID *items,
1448 DataBrowserPropertyID preSortProperty,
1449 DataBrowserPropertyID propertyID ) const
1450{
1451 return UpdateDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty, propertyID );
1452}
1453
1454bool wxMacDataBrowserControl::IsItemSelected( DataBrowserItemID item ) const
1455{
1456 return IsDataBrowserItemSelected( m_controlRef, item );
1457}
1458
1459OSStatus wxMacDataBrowserControl::AddItems(
1460 DataBrowserItemID container,
1461 UInt32 numItems,
1462 const DataBrowserItemID *items,
1463 DataBrowserPropertyID preSortProperty )
1464{
1465 return AddDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1466}
1467
1468OSStatus wxMacDataBrowserControl::RemoveItems(
1469 DataBrowserItemID container,
1470 UInt32 numItems,
1471 const DataBrowserItemID *items,
1472 DataBrowserPropertyID preSortProperty )
1473{
1474 return RemoveDataBrowserItems( m_controlRef, container, numItems, items, preSortProperty );
1475}
1476
1477OSStatus wxMacDataBrowserControl::RevealItem(
1478 DataBrowserItemID item,
1479 DataBrowserPropertyID propertyID,
1480 DataBrowserRevealOptions options ) const
1481{
1482 return RevealDataBrowserItem( m_controlRef, item, propertyID, options );
1483}
1484
1485OSStatus wxMacDataBrowserControl::SetSelectedItems(
1486 UInt32 numItems,
1487 const DataBrowserItemID *items,
1488 DataBrowserSetOption operation )
1489{
1490 return SetDataBrowserSelectedItems( m_controlRef, numItems, items, operation );
1491}
1492
1493OSStatus wxMacDataBrowserControl::GetSelectionAnchor( DataBrowserItemID *first, DataBrowserItemID *last ) const
1494{
1495 return GetDataBrowserSelectionAnchor( m_controlRef, first, last );
1496}
1497
1498OSStatus wxMacDataBrowserControl::GetItemID( DataBrowserTableViewRowIndex row, DataBrowserItemID * item ) const
1499{
1500 return GetDataBrowserTableViewItemID( m_controlRef, row, item );
1501}
1502
1503OSStatus wxMacDataBrowserControl::GetItemRow( DataBrowserItemID item, DataBrowserTableViewRowIndex * row ) const
1504{
1505 return GetDataBrowserTableViewItemRow( m_controlRef, item, row );
1506}
1507
88a7a4e1 1508OSStatus wxMacDataBrowserControl::SetDefaultRowHeight( UInt16 height )
6cce68ea 1509{
88a7a4e1 1510 return SetDataBrowserTableViewRowHeight( m_controlRef , height );
6cce68ea
SC
1511}
1512
88a7a4e1 1513OSStatus wxMacDataBrowserControl::GetDefaultRowHeight( UInt16 * height ) const
6cce68ea 1514{
88a7a4e1 1515 return GetDataBrowserTableViewRowHeight( m_controlRef, height );
6cce68ea 1516}
88a7a4e1
WS
1517
1518OSStatus wxMacDataBrowserControl::SetRowHeight( DataBrowserItemID item , UInt16 height)
6cce68ea
SC
1519{
1520 return SetDataBrowserTableViewItemRowHeight( m_controlRef, item , height );
1521}
1522
88a7a4e1 1523OSStatus wxMacDataBrowserControl::GetRowHeight( DataBrowserItemID item , UInt16 *height) const
6cce68ea
SC
1524{
1525 return GetDataBrowserTableViewItemRowHeight( m_controlRef, item , height);
1526}
1527
88a7a4e1 1528OSStatus wxMacDataBrowserControl::GetColumnWidth( DataBrowserPropertyID column , UInt16 *width ) const
6cce68ea
SC
1529{
1530 return GetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1531}
1532
88a7a4e1 1533OSStatus wxMacDataBrowserControl::SetColumnWidth( DataBrowserPropertyID column , UInt16 width )
6cce68ea
SC
1534{
1535 return SetDataBrowserTableViewNamedColumnWidth( m_controlRef , column , width );
1536}
1537
88a7a4e1 1538OSStatus wxMacDataBrowserControl::GetDefaultColumnWidth( UInt16 *width ) const
6cce68ea
SC
1539{
1540 return GetDataBrowserTableViewColumnWidth( m_controlRef , width );
1541}
1542
88a7a4e1 1543OSStatus wxMacDataBrowserControl::SetDefaultColumnWidth( UInt16 width )
6cce68ea
SC
1544{
1545 return SetDataBrowserTableViewColumnWidth( m_controlRef , width );
1546}
1547
88a7a4e1 1548OSStatus wxMacDataBrowserControl::GetColumnCount(UInt32* numColumns) const
6cce68ea
SC
1549{
1550 return GetDataBrowserTableViewColumnCount( m_controlRef, numColumns);
1551}
1552
88a7a4e1 1553OSStatus wxMacDataBrowserControl::GetColumnPosition( DataBrowserPropertyID column,
e6c3d3e6 1554 DataBrowserTableViewColumnIndex *position) const
6cce68ea
SC
1555{
1556 return GetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1557}
1558
e6c3d3e6 1559OSStatus wxMacDataBrowserControl::SetColumnPosition( DataBrowserPropertyID column, DataBrowserTableViewColumnIndex position)
6cce68ea
SC
1560{
1561 return SetDataBrowserTableViewColumnPosition( m_controlRef , column , position);
1562}
1563
88a7a4e1 1564OSStatus wxMacDataBrowserControl::GetScrollPosition( UInt32 *top , UInt32 *left ) const
6cce68ea
SC
1565{
1566 return GetDataBrowserScrollPosition( m_controlRef , top , left );
1567}
1568
88a7a4e1 1569OSStatus wxMacDataBrowserControl::SetScrollPosition( UInt32 top , UInt32 left )
6cce68ea
SC
1570{
1571 return SetDataBrowserScrollPosition( m_controlRef , top , left );
1572}
1573
88a7a4e1 1574OSStatus wxMacDataBrowserControl::GetSortProperty( DataBrowserPropertyID *column ) const
6cce68ea
SC
1575{
1576 return GetDataBrowserSortProperty( m_controlRef , column );
1577}
1578
88a7a4e1 1579OSStatus wxMacDataBrowserControl::SetSortProperty( DataBrowserPropertyID column )
6cce68ea
SC
1580{
1581 return SetDataBrowserSortProperty( m_controlRef , column );
1582}
88a7a4e1
WS
1583
1584OSStatus wxMacDataBrowserControl::GetSortOrder( DataBrowserSortOrder *order ) const
6cce68ea
SC
1585{
1586 return GetDataBrowserSortOrder( m_controlRef , order );
1587}
1588
88a7a4e1 1589OSStatus wxMacDataBrowserControl::SetSortOrder( DataBrowserSortOrder order )
6cce68ea
SC
1590{
1591 return SetDataBrowserSortOrder( m_controlRef , order );
1592}
1593
88a7a4e1
WS
1594OSStatus wxMacDataBrowserControl::GetPropertyFlags( DataBrowserPropertyID property,
1595 DataBrowserPropertyFlags *flags ) const
6cce68ea
SC
1596{
1597 return GetDataBrowserPropertyFlags( m_controlRef , property , flags );
1598}
1599
88a7a4e1
WS
1600OSStatus wxMacDataBrowserControl::SetPropertyFlags( DataBrowserPropertyID property,
1601 DataBrowserPropertyFlags flags )
6cce68ea
SC
1602{
1603 return SetDataBrowserPropertyFlags( m_controlRef , property , flags );
1604}
1605
88a7a4e1
WS
1606OSStatus wxMacDataBrowserControl::GetHeaderDesc( DataBrowserPropertyID property,
1607 DataBrowserListViewHeaderDesc *desc ) const
6cce68ea
SC
1608{
1609 return GetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
1610}
1611
88a7a4e1
WS
1612OSStatus wxMacDataBrowserControl::SetHeaderDesc( DataBrowserPropertyID property,
1613 DataBrowserListViewHeaderDesc *desc )
6cce68ea 1614{
88a7a4e1 1615 return SetDataBrowserListViewHeaderDesc( m_controlRef , property , desc );
6cce68ea
SC
1616}
1617
88a7a4e1
WS
1618OSStatus wxMacDataBrowserControl::SetDisclosureColumn( DataBrowserPropertyID property ,
1619 Boolean expandableRows )
6cce68ea
SC
1620{
1621 return SetDataBrowserListViewDisclosureColumn( m_controlRef, property, expandableRows);
1622}
1623
1624// ============================================================================
88a7a4e1 1625// Higher-level Databrowser
6cce68ea
SC
1626// ============================================================================
1627//
1628// basing on data item objects
1629//
1630
1631wxMacDataItem::wxMacDataItem()
88a7a4e1 1632{
e2bc1d69 1633 m_data = NULL;
f49c76e5 1634
e2bc1d69
KO
1635 m_order = 0;
1636 m_colId = kTextColumnId; // for compat with existing wx*ListBox impls.
6cce68ea
SC
1637}
1638
88a7a4e1
WS
1639wxMacDataItem::~wxMacDataItem()
1640{
6cce68ea 1641}
88a7a4e1 1642
e2bc1d69 1643void wxMacDataItem::SetOrder( SInt32 order )
6cce68ea 1644{
e2bc1d69
KO
1645 m_order = order;
1646}
1647
1648SInt32 wxMacDataItem::GetOrder() const
1649{
1650 return m_order;
1651}
1652
1653void wxMacDataItem::SetData( void* data)
1654{
1655 m_data = data;
1656}
1657
1658void* wxMacDataItem::GetData() const
1659{
1660 return m_data;
1661}
1662
1663short wxMacDataItem::GetColumn()
1664{
1665 return m_colId;
1666}
1667
1668void wxMacDataItem::SetColumn( short col )
1669{
1670 m_colId = col;
f49c76e5 1671}
e2bc1d69
KO
1672
1673void wxMacDataItem::SetLabel( const wxString& str)
1674{
1675 m_label = str;
1676 m_cfLabel.Assign( str , wxLocale::GetSystemEncoding());
6cce68ea
SC
1677}
1678
e2bc1d69
KO
1679const wxString& wxMacDataItem::GetLabel() const
1680{
1681 return m_label;
1682}
1683
1684bool wxMacDataItem::IsLessThan(wxMacDataItemBrowserControl *owner ,
1685 const wxMacDataItem* rhs,
1686 DataBrowserPropertyID sortProperty) const
1687{
bf9a1615 1688 const wxMacDataItem* otherItem = wx_const_cast(wxMacDataItem*,rhs);
e2bc1d69 1689 bool retval = false;
f49c76e5 1690
67650ea0 1691 if ( sortProperty == m_colId ){
e2bc1d69
KO
1692 retval = m_label.CmpNoCase( otherItem->m_label) < 0;
1693 }
f49c76e5 1694
67650ea0 1695 else if ( sortProperty == kNumericOrderColumnId )
e2bc1d69
KO
1696 retval = m_order < otherItem->m_order;
1697
1698 return retval;
1699}
1700
1701OSStatus wxMacDataItem::GetSetData( wxMacDataItemBrowserControl *owner ,
6cce68ea
SC
1702 DataBrowserPropertyID property,
1703 DataBrowserItemDataRef itemData,
88a7a4e1 1704 bool changeValue )
6cce68ea 1705{
e2bc1d69
KO
1706 OSStatus err = errDataBrowserPropertyNotSupported;
1707 if ( !changeValue )
1708 {
1709 if ( property == m_colId ){
1710 err = ::SetDataBrowserItemDataText( itemData, m_cfLabel );
1711 err = noErr;
1712 }
1713 else if ( property == kNumericOrderColumnId ){
1714 err = ::SetDataBrowserItemDataValue( itemData, m_order );
1715 err = noErr;
1716 }
1717 else{
1718 }
1719 }
1720 else
1721 {
1722 switch (property)
1723 {
1724 // no editable props here
1725 default:
1726 break;
1727 }
1728 }
1729
1730 return err;
6cce68ea
SC
1731}
1732
88a7a4e1 1733void wxMacDataItem::Notification(wxMacDataItemBrowserControl *owner ,
6cce68ea
SC
1734 DataBrowserItemNotification message,
1735 DataBrowserItemDataRef itemData ) const
1736{
1737}
1738
bf9a1615 1739IMPLEMENT_DYNAMIC_CLASS( wxMacDataItemBrowserControl , wxMacDataBrowserControl )
6cce68ea 1740
88a7a4e1 1741wxMacDataItemBrowserControl::wxMacDataItemBrowserControl( wxWindow* peer , const wxPoint& pos, const wxSize& size, long style) :
6cce68ea 1742 wxMacDataBrowserControl( peer, pos, size, style )
88a7a4e1 1743{
6cce68ea 1744 m_suppressSelection = false;
e2bc1d69
KO
1745 m_sortOrder = SortOrder_None;
1746 m_clientDataItemsType = wxClientData_None;
1747}
1748
1749wxMacDataItem* wxMacDataItemBrowserControl::CreateItem()
1750{
1751 return new wxMacDataItem();
6cce68ea 1752}
88a7a4e1
WS
1753
1754wxMacDataItemBrowserSelectionSuppressor::wxMacDataItemBrowserSelectionSuppressor(wxMacDataItemBrowserControl *browser)
6cce68ea
SC
1755{
1756 m_former = browser->SuppressSelection(true);
1757 m_browser = browser;
1758}
1759
1760wxMacDataItemBrowserSelectionSuppressor::~wxMacDataItemBrowserSelectionSuppressor()
1761{
1762 m_browser->SuppressSelection(m_former);
1763}
1764
1765bool wxMacDataItemBrowserControl::SuppressSelection( bool suppress )
1766{
1767 bool former = m_suppressSelection;
1768 m_suppressSelection = suppress;
1769
1770 return former;
1771}
1772
88a7a4e1
WS
1773Boolean wxMacDataItemBrowserControl::CompareItems(DataBrowserItemID itemOneID,
1774 DataBrowserItemID itemTwoID,
1775 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1776{
1777 wxMacDataItem* itemOne = (wxMacDataItem*) itemOneID;
1778 wxMacDataItem* itemTwo = (wxMacDataItem*) itemTwoID;
1779 return CompareItems( itemOne , itemTwo , sortProperty );
1780}
1781
88a7a4e1
WS
1782Boolean wxMacDataItemBrowserControl::CompareItems(const wxMacDataItem* itemOne,
1783 const wxMacDataItem* itemTwo,
1784 DataBrowserPropertyID sortProperty)
6cce68ea
SC
1785{
1786 Boolean retval = false;
1787 if ( itemOne != NULL )
1788 retval = itemOne->IsLessThan( this , itemTwo , sortProperty);
1789 return retval;
1790}
1791
1792OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1793 DataBrowserItemID itemID,
1794 DataBrowserPropertyID property,
1795 DataBrowserItemDataRef itemData,
88a7a4e1 1796 Boolean changeValue )
6cce68ea
SC
1797{
1798 wxMacDataItem* item = (wxMacDataItem*) itemID;
1799 return GetSetItemData(item, property, itemData , changeValue );
1800}
1801
1802OSStatus wxMacDataItemBrowserControl::GetSetItemData(
1803 wxMacDataItem* item,
1804 DataBrowserPropertyID property,
1805 DataBrowserItemDataRef itemData,
88a7a4e1 1806 Boolean changeValue )
6cce68ea
SC
1807{
1808 OSStatus err = errDataBrowserPropertyNotSupported;
1809 switch( property )
1810 {
1811 case kDataBrowserContainerIsClosableProperty :
1812 case kDataBrowserContainerIsSortableProperty :
1813 case kDataBrowserContainerIsOpenableProperty :
1814 // right now default behaviour on these
1815 break;
1816 default :
f49c76e5 1817
e2bc1d69 1818 if ( item != NULL ){
6cce68ea 1819 err = item->GetSetData( this, property , itemData , changeValue );
e2bc1d69 1820 }
6cce68ea 1821 break;
88a7a4e1 1822
6cce68ea
SC
1823 }
1824 return err;
1825}
1826
1827void wxMacDataItemBrowserControl::ItemNotification(
1828 DataBrowserItemID itemID,
1829 DataBrowserItemNotification message,
88a7a4e1 1830 DataBrowserItemDataRef itemData)
6cce68ea 1831{
88a7a4e1 1832 wxMacDataItem* item = (wxMacDataItem*) itemID;
6cce68ea
SC
1833 ItemNotification( item , message, itemData);
1834}
1835
1836void wxMacDataItemBrowserControl::ItemNotification(
1837 const wxMacDataItem* item,
1838 DataBrowserItemNotification message,
88a7a4e1 1839 DataBrowserItemDataRef itemData)
6cce68ea
SC
1840{
1841 if (item != NULL)
1842 item->Notification( this, message, itemData);
1843}
1844
88a7a4e1
WS
1845unsigned int wxMacDataItemBrowserControl::GetItemCount(const wxMacDataItem* container,
1846 bool recurse , DataBrowserItemState state) const
6cce68ea 1847{
e6c3d3e6 1848 ItemCount numItems = 0;
88a7a4e1
WS
1849 verify_noerr( wxMacDataBrowserControl::GetItemCount( (DataBrowserItemID)container,
1850 recurse, state, &numItems ) );
6cce68ea
SC
1851 return numItems;
1852}
1853
f49c76e5 1854unsigned int wxMacDataItemBrowserControl::GetSelectedItemCount( const wxMacDataItem* container,
e2bc1d69
KO
1855 bool recurse ) const
1856{
1857 return GetItemCount( container, recurse, kDataBrowserItemIsSelected );
1858
1859}
1860
88a7a4e1
WS
1861void wxMacDataItemBrowserControl::GetItems(const wxMacDataItem* container,
1862 bool recurse , DataBrowserItemState state, wxArrayMacDataItemPtr &items) const
6cce68ea
SC
1863{
1864 Handle handle = NewHandle(0);
88a7a4e1
WS
1865 verify_noerr( wxMacDataBrowserControl::GetItems( (DataBrowserItemID)container ,
1866 recurse , state, handle) );
6cce68ea
SC
1867
1868 int itemCount = GetHandleSize(handle)/sizeof(DataBrowserItemID);
1869 HLock( handle );
1870 wxMacDataItemPtr* itemsArray = (wxMacDataItemPtr*) *handle;
1871 for ( int i = 0; i < itemCount; ++i)
1872 {
1873 items.Add(itemsArray[i]);
1874 }
1875 HUnlock( handle );
1876 DisposeHandle( handle );
1877}
1878
1879unsigned int wxMacDataItemBrowserControl::GetLineFromItem(const wxMacDataItem* item) const
1880{
1881 DataBrowserTableViewRowIndex row;
1882 OSStatus err = GetItemRow( (DataBrowserItemID) item , &row);
1883 wxASSERT( err == noErr);
1884 return row;
1885}
1886
1887wxMacDataItem* wxMacDataItemBrowserControl::GetItemFromLine(unsigned int n) const
1888{
1889 DataBrowserItemID id;
1890 OSStatus err = GetItemID( (DataBrowserTableViewRowIndex) n , &id);
1891 wxASSERT( err == noErr);
88a7a4e1 1892 return (wxMacDataItem*) id;
6cce68ea
SC
1893}
1894
88a7a4e1 1895void wxMacDataItemBrowserControl::UpdateItem(const wxMacDataItem *container,
6cce68ea
SC
1896 const wxMacDataItem *item , DataBrowserPropertyID property) const
1897{
88a7a4e1 1898 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, 1,
6cce68ea
SC
1899 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty /* notSorted */, property ) );
1900}
1901
88a7a4e1 1902void wxMacDataItemBrowserControl::UpdateItems(const wxMacDataItem *container,
6cce68ea
SC
1903 wxArrayMacDataItemPtr &itemArray , DataBrowserPropertyID property) const
1904{
1905 unsigned int noItems = itemArray.GetCount();
1906 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1907 for ( unsigned int i = 0; i < noItems; ++i )
1908 items[i] = (DataBrowserItemID) itemArray[i];
1909
88a7a4e1 1910 verify_noerr( wxMacDataBrowserControl::UpdateItems((DataBrowserItemID)container, noItems,
6cce68ea
SC
1911 items, kDataBrowserItemNoProperty /* notSorted */, property ) );
1912 delete [] items;
1913}
1914
3ef4e126 1915void wxMacDataItemBrowserControl::InsertColumn(int colId, DataBrowserPropertyType colType,
0e4124e7 1916 const wxString& title, SInt16 just, int defaultWidth)
e2bc1d69
KO
1917{
1918 DataBrowserListViewColumnDesc columnDesc;
1919 columnDesc.headerBtnDesc.titleOffset = 0;
1920 columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
1921
1922 columnDesc.headerBtnDesc.btnFontStyle.flags =
1923 kControlUseFontMask | kControlUseJustMask;
1924
f49c76e5 1925 columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlContentTextOnly;
e2bc1d69
KO
1926 columnDesc.headerBtnDesc.btnFontStyle.just = just;
1927 columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
1928 columnDesc.headerBtnDesc.btnFontStyle.style = normal;
f49c76e5 1929
e2bc1d69
KO
1930 // TODO: Why is m_font not defined when we enter wxLC_LIST mode, but is
1931 // defined for other modes?
1932 wxFontEncoding enc;
1933 if ( m_font.Ok() )
1934 enc = m_font.GetEncoding();
1935 else
1936 enc = wxLocale::GetSystemEncoding();
1937 wxMacCFStringHolder cfTitle;
1938 cfTitle.Assign( title, enc );
f49c76e5 1939 columnDesc.headerBtnDesc.titleString = cfTitle;
0d2d29b1
KO
1940
1941 columnDesc.headerBtnDesc.minimumWidth = 0;
1942 columnDesc.headerBtnDesc.maximumWidth = 30000;
e2bc1d69
KO
1943
1944 columnDesc.propertyDesc.propertyID = (kMinColumnId + colId);
1945 columnDesc.propertyDesc.propertyType = colType;
f49c76e5
WS
1946 columnDesc.propertyDesc.propertyFlags = kDataBrowserListViewSortableColumn;
1947#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
1948 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
1949#endif
4e78e173 1950#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
67650ea0 1951 columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
e2bc1d69
KO
1952#endif
1953
1954 verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
0d2d29b1
KO
1955
1956 if (defaultWidth > 0){
1957 SetColumnWidth(colId, defaultWidth);
1958 }
1959
e2bc1d69
KO
1960}
1961
1962void wxMacDataItemBrowserControl::SetColumnWidth(int colId, int width)
1963{
1964 DataBrowserPropertyID id;
1965 GetColumnIDFromIndex(colId, &id);
1966 verify_noerr( wxMacDataBrowserControl::SetColumnWidth(id, width));
1967}
1968
1969int wxMacDataItemBrowserControl::GetColumnWidth(int colId)
1970{
1971 DataBrowserPropertyID id;
1972 GetColumnIDFromIndex(colId, &id);
1973 UInt16 result;
1974 verify_noerr( wxMacDataBrowserControl::GetColumnWidth(id, &result));
1975 return result;
1976}
1977
6cce68ea
SC
1978void wxMacDataItemBrowserControl::AddItem(wxMacDataItem *container, wxMacDataItem *item)
1979{
88a7a4e1 1980 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, 1,
6cce68ea
SC
1981 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty ) );
1982}
1983
88a7a4e1 1984void wxMacDataItemBrowserControl::AddItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray )
6cce68ea
SC
1985{
1986 unsigned int noItems = itemArray.GetCount();
1987 DataBrowserItemID *items = new DataBrowserItemID[noItems];
1988 for ( unsigned int i = 0; i < noItems; ++i )
1989 items[i] = (DataBrowserItemID) itemArray[i];
1990
88a7a4e1 1991 verify_noerr( wxMacDataBrowserControl::AddItems( (DataBrowserItemID)container, noItems,
6cce68ea
SC
1992 (DataBrowserItemID*) items, kDataBrowserItemNoProperty ) );
1993 delete [] items;
1994}
1995
88a7a4e1 1996void wxMacDataItemBrowserControl::RemoveItem(wxMacDataItem *container, wxMacDataItem* item)
6cce68ea 1997{
88a7a4e1 1998 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 1,
e6c3d3e6 1999 (DataBrowserItemID*) &item, kDataBrowserItemNoProperty );
6cce68ea
SC
2000 verify_noerr( err );
2001}
2002
88a7a4e1 2003void wxMacDataItemBrowserControl::RemoveItems(wxMacDataItem *container, wxArrayMacDataItemPtr &itemArray)
6cce68ea
SC
2004{
2005 unsigned int noItems = itemArray.GetCount();
2006 DataBrowserItemID *items = new DataBrowserItemID[noItems];
2007 for ( unsigned int i = 0; i < noItems; ++i )
2008 items[i] = (DataBrowserItemID) itemArray[i];
2009
88a7a4e1 2010 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, noItems,
e6c3d3e6 2011 (DataBrowserItemID*) items, kDataBrowserItemNoProperty );
6cce68ea
SC
2012 verify_noerr( err );
2013 delete [] items;
2014}
2015
88a7a4e1 2016void wxMacDataItemBrowserControl::RemoveAllItems(wxMacDataItem *container)
6cce68ea
SC
2017{
2018 OSStatus err = wxMacDataBrowserControl::RemoveItems( (DataBrowserItemID)container, 0 , NULL , kDataBrowserItemNoProperty );
2019 verify_noerr( err );
2020}
2021
88a7a4e1 2022void wxMacDataItemBrowserControl::SetSelectedItem(wxMacDataItem* item , DataBrowserSetOption option)
6cce68ea
SC
2023{
2024 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 1, (DataBrowserItemID*) &item, option ));
2025}
2026
88a7a4e1 2027void wxMacDataItemBrowserControl::SetSelectedAllItems(DataBrowserSetOption option)
6cce68ea
SC
2028{
2029 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( 0 , NULL , option ));
2030}
2031
88a7a4e1 2032void wxMacDataItemBrowserControl::SetSelectedItems(wxArrayMacDataItemPtr &itemArray , DataBrowserSetOption option)
6cce68ea
SC
2033{
2034 unsigned int noItems = itemArray.GetCount();
2035 DataBrowserItemID *items = new DataBrowserItemID[noItems];
2036 for ( unsigned int i = 0; i < noItems; ++i )
2037 items[i] = (DataBrowserItemID) itemArray[i];
2038
2039 verify_noerr(wxMacDataBrowserControl::SetSelectedItems( noItems, (DataBrowserItemID*) items, option ));
2040 delete [] items;
2041}
2042
2043Boolean wxMacDataItemBrowserControl::IsItemSelected( const wxMacDataItem* item) const
2044{
2045 return wxMacDataBrowserControl::IsItemSelected( (DataBrowserItemID) item);
2046}
2047
88a7a4e1 2048void wxMacDataItemBrowserControl::RevealItem( wxMacDataItem* item, DataBrowserRevealOptions options)
6cce68ea
SC
2049{
2050 verify_noerr(wxMacDataBrowserControl::RevealItem( (DataBrowserItemID) item, kDataBrowserNoItem , options ) );
2051}
2052
88a7a4e1 2053void wxMacDataItemBrowserControl::GetSelectionAnchor( wxMacDataItemPtr* first , wxMacDataItemPtr* last) const
6cce68ea 2054{
88a7a4e1 2055 verify_noerr(wxMacDataBrowserControl::GetSelectionAnchor( (DataBrowserItemID*) first, (DataBrowserItemID*) last) );
6cce68ea
SC
2056}
2057
e2bc1d69
KO
2058wxClientDataType wxMacDataItemBrowserControl::GetClientDataType() const
2059{
2060 return m_clientDataItemsType;
2061}
2062void wxMacDataItemBrowserControl::SetClientDataType(wxClientDataType clientDataItemsType)
2063{
2064 m_clientDataItemsType = clientDataItemsType;
2065}
2066
2067unsigned int wxMacDataItemBrowserControl::MacGetCount() const
2068{
2069 return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState);
2070}
2071
2072void wxMacDataItemBrowserControl::MacDelete( unsigned int n )
2073{
2074 wxMacDataItem* item = (wxMacDataItem*)GetItemFromLine( n );
2075 RemoveItem( wxMacDataBrowserRootContainer, item );
2076}
2077
2078void wxMacDataItemBrowserControl::MacInsert( unsigned int n, const wxString& text, int column )
2079{
2080 wxMacDataItem* newItem = CreateItem();
2081 newItem->SetLabel( text );
2082 if ( column != -1 )
2083 newItem->SetColumn( kMinColumnId + column );
2084
2085 if ( m_sortOrder == SortOrder_None )
2086 {
2087 // increase the order of the lines to be shifted
2088 unsigned int lines = MacGetCount();
2089 for ( unsigned int i = n; i < lines; ++i)
2090 {
2091 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
2092 iter->SetOrder( iter->GetOrder() + 1 );
2093 }
2094
2095 SInt32 frontLineOrder = 0;
2096 if ( n > 0 )
2097 {
2098 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
2099 frontLineOrder = iter->GetOrder();
2100 }
2101 newItem->SetOrder( frontLineOrder + 1 );
2102 }
2103
2104 AddItem( wxMacDataBrowserRootContainer, newItem );
2105}
2106
2107void wxMacDataItemBrowserControl::MacInsert( unsigned int n, const wxArrayString& items, int column )
2108{
2109 size_t itemsCount = items.GetCount();
2110 if ( itemsCount == 0 )
2111 return;
2112
2113 SInt32 frontLineOrder = 0;
2114
2115 if ( m_sortOrder == SortOrder_None )
2116 {
2117 // increase the order of the lines to be shifted
2118 unsigned int lines = MacGetCount();
2119 for ( unsigned int i = n; i < lines; ++i)
2120 {
2121 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(i);
2122 iter->SetOrder( iter->GetOrder() + itemsCount );
2123 }
2124 if ( n > 0 )
2125 {
2126 wxMacDataItem* iter = (wxMacDataItem*) GetItemFromLine(n-1);
2127 frontLineOrder = iter->GetOrder();
2128 }
2129 }
2130
2131 wxArrayMacDataItemPtr ids;
2132 ids.SetCount( itemsCount );
2133
2134 for ( unsigned int i = 0; i < itemsCount; ++i )
2135 {
2136 wxMacDataItem* item = CreateItem();
2137 item->SetLabel( items[i]);
2138 if ( column != -1 )
2139 item->SetColumn( kMinColumnId + column );
f49c76e5 2140
e2bc1d69
KO
2141 if ( m_sortOrder == SortOrder_None )
2142 item->SetOrder( frontLineOrder + 1 + i );
2143
2144 ids[i] = item;
2145 }
2146
2147 AddItems( wxMacDataBrowserRootContainer, ids );
2148}
2149
2150int wxMacDataItemBrowserControl::MacAppend( const wxString& text)
2151{
2152 wxMacDataItem* item = CreateItem();
2153 item->SetLabel( text );
2154 if ( m_sortOrder == SortOrder_None )
2155 {
2156 unsigned int lines = MacGetCount();
2157 if ( lines == 0 )
2158 item->SetOrder( 1 );
2159 else
2160 {
2161 wxMacDataItem* frontItem = (wxMacDataItem*) GetItemFromLine(lines-1);
2162 item->SetOrder( frontItem->GetOrder() + 1 );
2163 }
2164 }
2165 AddItem( wxMacDataBrowserRootContainer, item );
2166
2167 return GetLineFromItem(item);
2168}
2169
2170void wxMacDataItemBrowserControl::MacClear()
2171{
2172 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
2173 RemoveAllItems(wxMacDataBrowserRootContainer);
2174}
2175
2176void wxMacDataItemBrowserControl::MacDeselectAll()
2177{
2178 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
2179 SetSelectedAllItems( kDataBrowserItemsRemove );
2180}
2181
2182void wxMacDataItemBrowserControl::MacSetSelection( unsigned int n, bool select, bool multi )
2183{
2184 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
2185 wxMacDataItemBrowserSelectionSuppressor suppressor(this);
2186
2187 if ( IsItemSelected( item ) != select )
2188 {
2189 if ( select )
2190 SetSelectedItem( item, multi ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
2191 else
2192 SetSelectedItem( item, kDataBrowserItemsRemove );
2193 }
2194
2195 MacScrollTo( n );
2196}
2197
2198bool wxMacDataItemBrowserControl::MacIsSelected( unsigned int n ) const
2199{
2200 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine(n);
2201 return IsItemSelected( item );
2202}
2203
2204int wxMacDataItemBrowserControl::MacGetSelection() const
2205{
2206 wxMacDataItemPtr first, last;
2207 GetSelectionAnchor( &first, &last );
2208
2209 if ( first != NULL )
2210 {
2211 return GetLineFromItem( first );
2212 }
2213
2214 return -1;
2215}
2216
2217int wxMacDataItemBrowserControl::MacGetSelections( wxArrayInt& aSelections ) const
2218{
2219 aSelections.Empty();
2220 wxArrayMacDataItemPtr selectedItems;
2221 GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
2222
2223 int count = selectedItems.GetCount();
2224
2225 for ( int i = 0; i < count; ++i)
2226 {
2227 aSelections.Add(GetLineFromItem(selectedItems[i]));
2228 }
2229
2230 return count;
2231}
2232
2233void wxMacDataItemBrowserControl::MacSetString( unsigned int n, const wxString& text )
2234{
2235 // as we don't store the strings we only have to issue a redraw
2236 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
2237 item->SetLabel( text );
2238 UpdateItem( wxMacDataBrowserRootContainer, item , kTextColumnId );
2239}
2240
2241wxString wxMacDataItemBrowserControl::MacGetString( unsigned int n ) const
2242{
2243 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
2244 return item->GetLabel();
2245}
2246
2247void wxMacDataItemBrowserControl::MacSetClientData( unsigned int n, void * data)
2248{
2249 wxMacDataItem* item = (wxMacDataItem*) GetItemFromLine( n);
2250 item->SetData( data );
2251 // not displayed, therefore no Update infos to DataBrowser
2252}
2253
2254void * wxMacDataItemBrowserControl::MacGetClientData( unsigned int n) const
2255{
2256 wxMacDataItem * item = (wxMacDataItem*) GetItemFromLine( n );
2257 return item->GetData();
2258}
2259
2260void wxMacDataItemBrowserControl::MacScrollTo( unsigned int n )
2261{
2262 RevealItem( GetItemFromLine( n) , kDataBrowserRevealWithoutSelecting );
2263}
2264
88a7a4e1 2265
6cce68ea 2266
5ca0d812
SC
2267//
2268// Tab Control
2269//
9d8aca48
WS
2270
2271OSStatus wxMacControl::SetTabEnabled( SInt16 tabNo , bool enable )
5ca0d812 2272{
6cce68ea 2273 return ::SetTabEnabled( m_controlRef , tabNo , enable );
5ca0d812 2274}
9d8aca48 2275
30e77b5c
SC
2276//
2277// Quartz Support
2278//
2279
2280#ifdef __WXMAC_OSX__
2281// snippets from Sketch Sample from Apple :
2282
8638e69b
DS
2283#define kGenericRGBProfilePathStr "/System/Library/ColorSync/Profiles/Generic RGB Profile.icc"
2284
30e77b5c 2285/*
fb5246be 2286 This function locates, opens, and returns the profile reference for the calibrated
30e77b5c
SC
2287 Generic RGB color space. It is up to the caller to call CMCloseProfile when done
2288 with the profile reference this function returns.
2289*/
8638e69b 2290CMProfileRef wxMacOpenGenericProfile()
30e77b5c
SC
2291{
2292 static CMProfileRef cachedRGBProfileRef = NULL;
fb5246be 2293
30e77b5c
SC
2294 // we only create the profile reference once
2295 if (cachedRGBProfileRef == NULL)
2296 {
fb5246be
WS
2297 CMProfileLocation loc;
2298
2299 loc.locType = cmPathBasedProfile;
2300 strcpy(loc.u.pathLoc.path, kGenericRGBProfilePathStr);
2301
2302 verify_noerr( CMOpenProfile(&cachedRGBProfileRef, &loc) );
30e77b5c
SC
2303 }
2304
8638e69b 2305 // clone the profile reference so that the caller has their own reference, not our cached one
30e77b5c 2306 if (cachedRGBProfileRef)
fb5246be 2307 CMCloneProfileRef(cachedRGBProfileRef);
30e77b5c
SC
2308
2309 return cachedRGBProfileRef;
2310}
2311
2312/*
2313 Return the generic RGB color space. This is a 'get' function and the caller should
2314 not release the returned value unless the caller retains it first. Usually callers
2315 of this routine will immediately use the returned colorspace with CoreGraphics
2316 so they typically do not need to retain it themselves.
fb5246be 2317
30e77b5c
SC
2318 This function creates the generic RGB color space once and hangs onto it so it can
2319 return it whenever this function is called.
2320*/
2321
2322CGColorSpaceRef wxMacGetGenericRGBColorSpace()
2323{
6cce68ea 2324 static wxMacCFRefHolder<CGColorSpaceRef> genericRGBColorSpace;
fb5246be 2325
8638e69b
DS
2326 if (genericRGBColorSpace == NULL)
2327 {
26a2f914 2328 if ( UMAGetSystemVersion() >= 0x1040 )
fb5246be 2329 {
6cce68ea 2330 genericRGBColorSpace.Set( CGColorSpaceCreateWithName( CFSTR("kCGColorSpaceGenericRGB") ) );
fb5246be 2331 }
26a2f914
SC
2332 else
2333 {
2334 CMProfileRef genericRGBProfile = wxMacOpenGenericProfile();
8638e69b 2335
26a2f914
SC
2336 if (genericRGBProfile)
2337 {
6cce68ea 2338 genericRGBColorSpace.Set( CGColorSpaceCreateWithPlatformColorSpace(genericRGBProfile) );
8638e69b 2339
6cce68ea 2340 wxASSERT_MSG( genericRGBColorSpace != NULL, wxT("couldn't create the generic RGB color space") );
8638e69b 2341
26a2f914 2342 // we opened the profile so it is up to us to close it
88a7a4e1 2343 CMCloseProfile(genericRGBProfile);
26a2f914
SC
2344 }
2345 }
8638e69b
DS
2346 }
2347
30e77b5c
SC
2348 return genericRGBColorSpace;
2349}
2350#endif
2351
e6c3d3e6
SC
2352#ifndef __LP64__
2353
54ce9ebb
JS
2354wxMacPortSaver::wxMacPortSaver( GrafPtr port )
2355{
6cce68ea
SC
2356 ::GetPort( &m_port );
2357 ::SetPort( port );
54ce9ebb
JS
2358}
2359
2360wxMacPortSaver::~wxMacPortSaver()
2361{
6cce68ea 2362 ::SetPort( m_port );
54ce9ebb 2363}
e6c3d3e6
SC
2364#endif
2365
2366void wxMacGlobalToLocal( WindowRef window , Point*pt )
2367{
f49c76e5 2368#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
e6c3d3e6 2369 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
2370 HIViewRef contentView ;
2371 // TODO check toolbar offset
daca43d8 2372 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
f49c76e5 2373 HIPointConvert( &p, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceView, contentView );
e6c3d3e6
SC
2374 pt->h = p.x;
2375 pt->v = p.y;
2376#else
2377 QDGlobalToLocalPoint( GetWindowPort(window), pt ) ;
2378#endif
2379}
2380
2381void wxMacLocalToGlobal( WindowRef window , Point*pt )
2382{
f49c76e5 2383#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4
e6c3d3e6 2384 HIPoint p = CGPointMake( pt->h, pt->v );
f49c76e5
WS
2385 HIViewRef contentView ;
2386 // TODO check toolbar offset
daca43d8
SC
2387 HIViewFindByID( HIViewGetRoot( window ), kHIViewWindowContentID , &contentView) ;
2388 HIPointConvert( &p, kHICoordSpaceView, contentView, kHICoordSpace72DPIGlobal, NULL );
e6c3d3e6
SC
2389 pt->h = p.x;
2390 pt->v = p.y;
2391#else
2392 QDLocalToGlobalPoint( GetWindowPort(window), pt ) ;
2393#endif
2394}
54ce9ebb 2395
b6ed2b86 2396#endif // wxUSE_GUI