1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/mac/carbon/window.cpp
3 // Purpose: wxWindowMac
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
14 #include "wx/window.h"
23 #include "wx/dcclient.h"
24 #include "wx/button.h"
26 #include "wx/dialog.h"
27 #include "wx/settings.h"
28 #include "wx/msgdlg.h"
29 #include "wx/scrolbar.h"
30 #include "wx/statbox.h"
31 #include "wx/textctrl.h"
32 #include "wx/toolbar.h"
33 #include "wx/layout.h"
34 #include "wx/statusbr.h"
35 #include "wx/menuitem.h"
36 #include "wx/treectrl.h"
37 #include "wx/listctrl.h"
40 #include "wx/tooltip.h"
41 #include "wx/spinctrl.h"
42 #include "wx/geometry.h"
45 #include "wx/listctrl.h"
49 #include "wx/treectrl.h"
57 #include "wx/popupwin.h"
60 #if wxUSE_DRAG_AND_DROP
64 #include "wx/mac/uma.h"
66 #define MAC_SCROLLBAR_SIZE 15
67 #define MAC_SMALL_SCROLLBAR_SIZE 11
71 #ifdef __WXUNIVERSAL__
72 IMPLEMENT_ABSTRACT_CLASS(wxWindowMac
, wxWindowBase
)
74 IMPLEMENT_DYNAMIC_CLASS(wxWindow
, wxWindowBase
)
77 BEGIN_EVENT_TABLE(wxWindowMac
, wxWindowBase
)
78 EVT_NC_PAINT(wxWindowMac::OnNcPaint
)
79 EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground
)
80 EVT_PAINT(wxWindowMac::OnPaint
)
81 EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent
)
84 #define wxMAC_DEBUG_REDRAW 0
85 #ifndef wxMAC_DEBUG_REDRAW
86 #define wxMAC_DEBUG_REDRAW 0
89 // ---------------------------------------------------------------------------
90 // Utility Routines to move between different coordinate systems
91 // ---------------------------------------------------------------------------
94 * Right now we have the following setup :
95 * a border that is not part of the native control is always outside the
96 * control's border (otherwise we loose all native intelligence, future ways
97 * may be to have a second embedding control responsible for drawing borders
98 * and backgrounds eventually)
99 * so all this border calculations have to be taken into account when calling
100 * native methods or getting native oriented data
101 * so we have three coordinate systems here
102 * wx client coordinates
103 * wx window coordinates (including window frames)
108 // originating from native control
112 void wxMacNativeToWindow( const wxWindow
* window
, RgnHandle handle
)
114 OffsetRgn( handle
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ;
117 void wxMacNativeToWindow( const wxWindow
* window
, Rect
*rect
)
119 OffsetRect( rect
, window
->MacGetLeftBorderSize() , window
->MacGetTopBorderSize() ) ;
123 // directed towards native control
126 void wxMacWindowToNative( const wxWindow
* window
, RgnHandle handle
)
128 OffsetRgn( handle
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() );
131 void wxMacWindowToNative( const wxWindow
* window
, Rect
*rect
)
133 OffsetRect( rect
, -window
->MacGetLeftBorderSize() , -window
->MacGetTopBorderSize() ) ;
136 // ---------------------------------------------------------------------------
138 // ---------------------------------------------------------------------------
140 static const EventTypeSpec eventList
[] =
142 { kEventClassCommand
, kEventProcessCommand
} ,
143 { kEventClassCommand
, kEventCommandUpdateStatus
} ,
145 { kEventClassControl
, kEventControlGetClickActivation
} ,
146 { kEventClassControl
, kEventControlHit
} ,
148 { kEventClassTextInput
, kEventTextInputUnicodeForKeyEvent
} ,
149 { kEventClassTextInput
, kEventTextInputUpdateActiveInputArea
} ,
151 { kEventClassControl
, kEventControlDraw
} ,
153 { kEventClassControl
, kEventControlVisibilityChanged
} ,
154 { kEventClassControl
, kEventControlEnabledStateChanged
} ,
155 { kEventClassControl
, kEventControlHiliteChanged
} ,
157 { kEventClassControl
, kEventControlActivate
} ,
158 { kEventClassControl
, kEventControlDeactivate
} ,
160 { kEventClassControl
, kEventControlSetFocusPart
} ,
161 { kEventClassControl
, kEventControlFocusPartChanged
} ,
163 { kEventClassService
, kEventServiceGetTypes
},
164 { kEventClassService
, kEventServiceCopy
},
165 { kEventClassService
, kEventServicePaste
},
167 // { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only
168 // { kEventClassControl , kEventControlBoundsChanged } ,
171 static pascal OSStatus
wxMacWindowControlEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data
)
173 OSStatus result
= eventNotHandledErr
;
175 wxMacCarbonEvent
cEvent( event
) ;
177 ControlRef controlRef
;
178 wxWindowMac
* thisWindow
= (wxWindowMac
*) data
;
180 cEvent
.GetParameter( kEventParamDirectObject
, &controlRef
) ;
182 switch ( GetEventKind( event
) )
184 case kEventControlDraw
:
186 RgnHandle updateRgn
= NULL
;
187 RgnHandle allocatedRgn
= NULL
;
188 wxRegion visRegion
= thisWindow
->MacGetVisibleRegion() ;
190 if ( cEvent
.GetParameter
<RgnHandle
>(kEventParamRgnHandle
, &updateRgn
) != noErr
)
192 HIShapeGetAsQDRgn( visRegion
.GetWXHRGN(), updateRgn
);
196 if ( thisWindow
->MacGetLeftBorderSize() != 0 || thisWindow
->MacGetTopBorderSize() != 0 )
198 // as this update region is in native window locals we must adapt it to wx window local
199 allocatedRgn
= NewRgn() ;
200 CopyRgn( updateRgn
, allocatedRgn
) ;
202 // hide the given region by the new region that must be shifted
203 wxMacNativeToWindow( thisWindow
, allocatedRgn
) ;
204 updateRgn
= allocatedRgn
;
208 #if wxMAC_DEBUG_REDRAW
209 if ( thisWindow
->MacIsUserPane() )
211 static float color
= 0.5 ;
214 CGContextRef cgContext
= cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
) ;
216 HIViewGetBounds( controlRef
, &bounds
);
217 CGContextSetRGBFillColor( cgContext
, channel
== 0 ? color
: 0.5 ,
218 channel
== 1 ? color
: 0.5 , channel
== 2 ? color
: 0.5 , 1 );
219 CGContextFillRect( cgContext
, bounds
);
232 bool created
= false ;
233 CGContextRef cgContext
= NULL
;
234 OSStatus err
= cEvent
.GetParameter
<CGContextRef
>(kEventParamCGContextRef
, &cgContext
) ;
235 wxASSERT_MSG( err
== noErr
, wxT("Unable to retrieve CGContextRef") ) ;
236 thisWindow
->MacSetCGContextRef( cgContext
) ;
239 wxMacCGContextStateSaver
sg( cgContext
) ;
242 wxWindow
* iter
= thisWindow
;
245 alpha
*= (float) iter
->GetTransparent()/255.0 ;
246 if ( iter
->IsTopLevel() )
249 iter
= iter
->GetParent() ;
252 CGContextSetAlpha( cgContext
, alpha
) ;
254 if ( thisWindow
->GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT
)
257 HIViewGetBounds( controlRef
, &bounds
);
258 CGContextClearRect( cgContext
, bounds
);
263 if ( thisWindow
->MacDoRedraw( updateRgn
, cEvent
.GetTicks() ) )
266 thisWindow
->MacSetCGContextRef( NULL
) ;
270 CGContextRelease( cgContext
) ;
274 DisposeRgn( allocatedRgn
) ;
278 case kEventControlVisibilityChanged
:
279 // we might have two native controls attributed to the same wxWindow instance
280 // eg a scrollview and an embedded textview, make sure we only fire for the 'outer'
281 // control, as otherwise native and wx visibility are different
282 if ( thisWindow
->GetPeer() != NULL
&& thisWindow
->GetPeer()->GetControlRef() == controlRef
)
284 thisWindow
->MacVisibilityChanged() ;
288 case kEventControlEnabledStateChanged
:
289 thisWindow
->MacEnabledStateChanged();
292 case kEventControlHiliteChanged
:
293 thisWindow
->MacHiliteChanged() ;
296 case kEventControlActivate
:
297 case kEventControlDeactivate
:
298 // FIXME: we should have a virtual function for this!
300 if ( thisWindow
->IsKindOf( CLASSINFO( wxTreeCtrl
) ) )
301 thisWindow
->Refresh();
304 if ( thisWindow
->IsKindOf( CLASSINFO( wxListCtrl
) ) )
305 thisWindow
->Refresh();
311 // different handling on OS X
314 case kEventControlFocusPartChanged
:
315 // the event is emulated by wxmac for systems lower than 10.5
317 ControlPartCode previousControlPart
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPreviousPart
, typeControlPartCode
);
318 ControlPartCode currentControlPart
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlCurrentPart
, typeControlPartCode
);
320 if ( thisWindow
->MacGetTopLevelWindow() && thisWindow
->GetPeer()->NeedsFocusRect() )
322 thisWindow
->MacInvalidateBorders();
325 if ( currentControlPart
== 0 )
329 if ( thisWindow
->GetCaret() )
330 thisWindow
->GetCaret()->OnKillFocus();
333 wxLogTrace(_T("Focus"), _T("focus lost(%p)"), wx_static_cast(void*, thisWindow
));
335 // remove this as soon as posting the synthesized event works properly
336 static bool inKillFocusEvent
= false ;
338 if ( !inKillFocusEvent
)
340 inKillFocusEvent
= true ;
341 wxFocusEvent
event( wxEVT_KILL_FOCUS
, thisWindow
->GetId());
342 event
.SetEventObject(thisWindow
);
343 thisWindow
->HandleWindowEvent(event
) ;
344 inKillFocusEvent
= false ;
347 else if ( previousControlPart
== 0 )
350 // panel wants to track the window which was the last to have focus in it
351 wxLogTrace(_T("Focus"), _T("focus set(%p)"), wx_static_cast(void*, thisWindow
));
352 wxChildFocusEvent
eventFocus((wxWindow
*)thisWindow
);
353 thisWindow
->HandleWindowEvent(eventFocus
);
356 if ( thisWindow
->GetCaret() )
357 thisWindow
->GetCaret()->OnSetFocus();
360 wxFocusEvent
event(wxEVT_SET_FOCUS
, thisWindow
->GetId());
361 event
.SetEventObject(thisWindow
);
362 thisWindow
->HandleWindowEvent(event
) ;
366 case kEventControlSetFocusPart
:
369 Boolean focusEverything
= false ;
370 if ( cEvent
.GetParameter
<Boolean
>(kEventParamControlFocusEverything
, &focusEverything
) == noErr
)
372 // put a breakpoint here to catch focus everything events
375 ControlPartCode controlPart
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart
, typeControlPartCode
);
377 ControlPartCode previousControlPart
= 0;
378 verify_noerr( HIViewGetFocusPart(controlRef
, &previousControlPart
));
380 if ( thisWindow
->MacIsUserPane() )
382 if ( controlPart
!= kControlFocusNoPart
)
383 cEvent
.SetParameter
<ControlPartCode
>( kEventParamControlPart
, typeControlPartCode
, 1 ) ;
387 result
= CallNextEventHandler(handler
, event
);
389 if ( UMAGetSystemVersion() < 0x1050 )
391 // set back to 0 if problems arise
393 ControlPartCode currentControlPart
= cEvent
.GetParameter
<ControlPartCode
>(kEventParamControlPart
, typeControlPartCode
);
394 // synthesize the event focus changed event
395 EventRef evRef
= NULL
;
397 OSStatus err
= MacCreateEvent(
398 NULL
, kEventClassControl
, kEventControlFocusPartChanged
, TicksToEventTime( TickCount() ) ,
399 kEventAttributeUserEvent
, &evRef
);
402 wxMacCarbonEvent
iEvent( evRef
) ;
403 iEvent
.SetParameter
<ControlRef
>( kEventParamDirectObject
, controlRef
) ;
404 iEvent
.SetParameter
<ControlPartCode
>( kEventParamControlPreviousPart
, typeControlPartCode
, previousControlPart
) ;
405 iEvent
.SetParameter
<ControlPartCode
>( kEventParamControlCurrentPart
, typeControlPartCode
, currentControlPart
) ;
408 // TODO test this first, avoid double posts etc...
409 PostEventToQueue( GetMainEventQueue(), evRef
, kEventPriorityHigh
);
411 wxMacWindowControlEventHandler( NULL
, evRef
, data
) ;
413 ReleaseEvent( evRef
) ;
415 // old implementation, to be removed if the new one works
416 if ( controlPart
== kControlFocusNoPart
)
419 if ( thisWindow
->GetCaret() )
420 thisWindow
->GetCaret()->OnKillFocus();
423 wxLogTrace(_T("Focus"), _T("focus lost(%p)"), wx_static_cast(void*, thisWindow
));
425 static bool inKillFocusEvent
= false ;
427 if ( !inKillFocusEvent
)
429 inKillFocusEvent
= true ;
430 wxFocusEvent
event( wxEVT_KILL_FOCUS
, thisWindow
->GetId());
431 event
.SetEventObject(thisWindow
);
432 thisWindow
->HandleWindowEvent(event
) ;
433 inKillFocusEvent
= false ;
438 // panel wants to track the window which was the last to have focus in it
439 wxLogTrace(_T("Focus"), _T("focus set(%p)"), wx_static_cast(void*, thisWindow
));
440 wxChildFocusEvent
eventFocus((wxWindow
*)thisWindow
);
441 thisWindow
->HandleWindowEvent(eventFocus
);
444 if ( thisWindow
->GetCaret() )
445 thisWindow
->GetCaret()->OnSetFocus();
448 wxFocusEvent
event(wxEVT_SET_FOCUS
, thisWindow
->GetId());
449 event
.SetEventObject(thisWindow
);
450 thisWindow
->HandleWindowEvent(event
) ;
457 case kEventControlHit
:
458 result
= thisWindow
->MacControlHit( handler
, event
) ;
461 case kEventControlGetClickActivation
:
463 // fix to always have a proper activation for DataBrowser controls (stay in bkgnd otherwise)
464 WindowRef owner
= cEvent
.GetParameter
<WindowRef
>(kEventParamWindowRef
);
465 if ( !IsWindowActive(owner
) )
467 cEvent
.SetParameter(kEventParamClickActivation
,(UInt32
) kActivateAndIgnoreClick
) ;
480 static pascal OSStatus
481 wxMacWindowServiceEventHandler(EventHandlerCallRef
WXUNUSED(handler
),
485 OSStatus result
= eventNotHandledErr
;
487 wxMacCarbonEvent
cEvent( event
) ;
489 ControlRef controlRef
;
490 wxWindowMac
* thisWindow
= (wxWindowMac
*) data
;
491 wxTextCtrl
* textCtrl
= wxDynamicCast( thisWindow
, wxTextCtrl
) ;
492 cEvent
.GetParameter( kEventParamDirectObject
, &controlRef
) ;
494 switch ( GetEventKind( event
) )
496 case kEventServiceGetTypes
:
500 textCtrl
->GetSelection( &from
, &to
) ;
502 CFMutableArrayRef copyTypes
= 0 , pasteTypes
= 0;
504 copyTypes
= cEvent
.GetParameter
< CFMutableArrayRef
>( kEventParamServiceCopyTypes
, typeCFMutableArrayRef
) ;
505 if ( textCtrl
->IsEditable() )
506 pasteTypes
= cEvent
.GetParameter
< CFMutableArrayRef
>( kEventParamServicePasteTypes
, typeCFMutableArrayRef
) ;
508 static const OSType textDataTypes
[] = { kTXNTextData
/* , 'utxt', 'PICT', 'MooV', 'AIFF' */ };
509 for ( size_t i
= 0 ; i
< WXSIZEOF(textDataTypes
) ; ++i
)
511 CFStringRef typestring
= CreateTypeStringWithOSType(textDataTypes
[i
]);
515 CFArrayAppendValue(copyTypes
, typestring
) ;
517 CFArrayAppendValue(pasteTypes
, typestring
) ;
519 CFRelease( typestring
) ;
527 case kEventServiceCopy
:
532 textCtrl
->GetSelection( &from
, &to
) ;
533 wxString val
= textCtrl
->GetValue() ;
534 val
= val
.Mid( from
, to
- from
) ;
535 PasteboardRef pasteboard
= cEvent
.GetParameter
<PasteboardRef
>( kEventParamPasteboardRef
, typePasteboardRef
);
536 verify_noerr( PasteboardClear( pasteboard
) ) ;
537 PasteboardSynchronize( pasteboard
);
538 // TODO add proper conversion
539 CFDataRef data
= CFDataCreate( kCFAllocatorDefault
, (const UInt8
*)val
.c_str(), val
.length() );
540 PasteboardPutItemFlavor( pasteboard
, (PasteboardItemID
) 1, CFSTR("com.apple.traditional-mac-plain-text"), data
, 0);
546 case kEventServicePaste
:
549 PasteboardRef pasteboard
= cEvent
.GetParameter
<PasteboardRef
>( kEventParamPasteboardRef
, typePasteboardRef
);
550 PasteboardSynchronize( pasteboard
);
552 verify_noerr( PasteboardGetItemCount( pasteboard
, &itemCount
) );
553 for( UInt32 itemIndex
= 1; itemIndex
<= itemCount
; itemIndex
++ )
555 PasteboardItemID itemID
;
556 if ( PasteboardGetItemIdentifier( pasteboard
, itemIndex
, &itemID
) == noErr
)
558 CFDataRef flavorData
= NULL
;
559 if ( PasteboardCopyItemFlavorData( pasteboard
, itemID
, CFSTR("com.apple.traditional-mac-plain-text"), &flavorData
) == noErr
)
561 CFIndex flavorDataSize
= CFDataGetLength( flavorData
);
562 char *content
= new char[flavorDataSize
+1] ;
563 memcpy( content
, CFDataGetBytePtr( flavorData
), flavorDataSize
);
564 content
[flavorDataSize
]=0;
565 CFRelease( flavorData
);
567 textCtrl
->WriteText( wxString( content
, wxConvLocal
) );
569 textCtrl
->WriteText( wxString( content
) ) ;
587 pascal OSStatus
wxMacUnicodeTextEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data
)
589 OSStatus result
= eventNotHandledErr
;
590 wxWindowMac
* focus
= (wxWindowMac
*) data
;
592 wchar_t* uniChars
= NULL
;
593 UInt32 when
= EventTimeToTicks( GetEventTime( event
) ) ;
595 UniChar
* charBuf
= NULL
;
596 ByteCount dataSize
= 0 ;
599 if ( GetEventParameter( event
, kEventParamTextInputSendText
, typeUnicodeText
, NULL
, 0 , &dataSize
, NULL
) == noErr
)
601 numChars
= dataSize
/ sizeof( UniChar
) + 1;
604 if ( (size_t) numChars
* 2 > sizeof(buf
) )
605 charBuf
= new UniChar
[ numChars
] ;
609 uniChars
= new wchar_t[ numChars
] ;
610 GetEventParameter( event
, kEventParamTextInputSendText
, typeUnicodeText
, NULL
, dataSize
, NULL
, charBuf
) ;
611 charBuf
[ numChars
- 1 ] = 0;
612 #if SIZEOF_WCHAR_T == 2
613 uniChars
= (wchar_t*) charBuf
;
614 /* memcpy( uniChars , charBuf , numChars * 2 ) ;*/ // is there any point in copying charBuf over itself? (in fact, memcpy isn't even guaranteed to work correctly if the source and destination ranges overlap...)
616 // the resulting string will never have more chars than the utf16 version, so this is safe
617 wxMBConvUTF16 converter
;
618 numChars
= converter
.MB2WC( uniChars
, (const char*)charBuf
, numChars
) ;
622 switch ( GetEventKind( event
) )
624 case kEventTextInputUpdateActiveInputArea
:
626 // An IME input event may return several characters, but we need to send one char at a time to
628 for (int pos
=0 ; pos
< numChars
; pos
++)
630 WXEVENTREF formerEvent
= wxTheApp
->MacGetCurrentEvent() ;
631 WXEVENTHANDLERCALLREF formerHandler
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ;
632 wxTheApp
->MacSetCurrentEvent( event
, handler
) ;
634 UInt32 message
= uniChars
[pos
] < 128 ? (char)uniChars
[pos
] : '?';
636 NB: faking a charcode here is problematic. The kEventTextInputUpdateActiveInputArea event is sent
637 multiple times to update the active range during inline input, so this handler will often receive
638 uncommited text, which should usually not trigger side effects. It might be a good idea to check the
639 kEventParamTextInputSendFixLen parameter and verify if input is being confirmed (see CarbonEvents.h).
640 On the other hand, it can be useful for some applications to react to uncommitted text (for example,
641 to update a status display), as long as it does not disrupt the inline input session. Ideally, wx
642 should add new event types to support advanced text input. For now, I would keep things as they are.
644 However, the code that was being used caused additional problems:
645 UInt32 message = (0 << 8) + ((char)uniChars[pos] );
646 Since it simply truncated the unichar to the last byte, it ended up causing weird bugs with inline
647 input, such as switching to another field when one attempted to insert the character U+4E09 (the kanji
648 for "three"), because it was truncated to 09 (kTabCharCode), which was later "converted" to WXK_TAB
649 (still 09) in wxMacTranslateKey; or triggering the default button when one attempted to insert U+840D
650 (the kanji for "name"), which got truncated to 0D and interpreted as a carriage return keypress.
651 Note that even single-byte characters could have been misinterpreted, since MacRoman charcodes only
652 overlap with Unicode within the (7-bit) ASCII range.
653 But simply passing a NUL charcode would disable text updated events, because wxTextCtrl::OnChar checks
654 for codes within a specific range. Therefore I went for the solution seen above, which keeps ASCII
655 characters as they are and replaces the rest with '?', ensuring that update events are triggered.
656 It would be better to change wxTextCtrl::OnChar to look at the actual unicode character instead, but
657 I don't have time to look into that right now.
660 if ( wxTheApp
->MacSendCharEvent(
661 focus
, message
, 0 , when
, 0 , 0 , uniChars
[pos
] ) )
666 wxTheApp
->MacSetCurrentEvent( formerEvent
, formerHandler
) ;
670 case kEventTextInputUnicodeForKeyEvent
:
672 UInt32 keyCode
, modifiers
;
675 unsigned char charCode
;
677 GetEventParameter( event
, kEventParamTextInputSendKeyboardEvent
, typeEventRef
, NULL
, sizeof(rawEvent
), NULL
, &rawEvent
) ;
678 GetEventParameter( rawEvent
, kEventParamKeyMacCharCodes
, typeChar
, NULL
, sizeof(char), NULL
, &charCode
);
679 GetEventParameter( rawEvent
, kEventParamKeyCode
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &keyCode
);
680 GetEventParameter( rawEvent
, kEventParamKeyModifiers
, typeUInt32
, NULL
, sizeof(UInt32
), NULL
, &modifiers
);
681 GetEventParameter( rawEvent
, kEventParamMouseLocation
, typeQDPoint
, NULL
, sizeof(Point
), NULL
, &point
);
683 UInt32 message
= (keyCode
<< 8) + charCode
;
685 // An IME input event may return several characters, but we need to send one char at a time to
687 for (int pos
=0 ; pos
< numChars
; pos
++)
689 WXEVENTREF formerEvent
= wxTheApp
->MacGetCurrentEvent() ;
690 WXEVENTHANDLERCALLREF formerHandler
= wxTheApp
->MacGetCurrentEventHandlerCallRef() ;
691 wxTheApp
->MacSetCurrentEvent( event
, handler
) ;
693 if ( wxTheApp
->MacSendCharEvent(
694 focus
, message
, modifiers
, when
, point
.h
, point
.v
, uniChars
[pos
] ) )
699 wxTheApp
->MacSetCurrentEvent( formerEvent
, formerHandler
) ;
708 if ( charBuf
!= buf
)
714 static pascal OSStatus
715 wxMacWindowCommandEventHandler(EventHandlerCallRef
WXUNUSED(handler
),
719 OSStatus result
= eventNotHandledErr
;
720 wxWindowMac
* focus
= (wxWindowMac
*) data
;
724 wxMacCarbonEvent
cEvent( event
) ;
725 cEvent
.GetParameter
<HICommand
>(kEventParamDirectObject
,typeHICommand
,&command
) ;
727 wxMenuItem
* item
= NULL
;
728 wxMenu
* itemMenu
= wxFindMenuFromMacCommand( command
, item
) ;
729 int id
= wxMacCommandToId( command
.commandID
) ;
733 wxASSERT( itemMenu
!= NULL
) ;
735 switch ( cEvent
.GetKind() )
737 case kEventProcessCommand
:
738 result
= itemMenu
->MacHandleCommandProcess( item
, id
, focus
);
741 case kEventCommandUpdateStatus
:
742 result
= itemMenu
->MacHandleCommandUpdateStatus( item
, id
, focus
);
752 pascal OSStatus
wxMacWindowEventHandler( EventHandlerCallRef handler
, EventRef event
, void *data
)
754 EventRef formerEvent
= (EventRef
) wxTheApp
->MacGetCurrentEvent() ;
755 EventHandlerCallRef formerEventHandlerCallRef
= (EventHandlerCallRef
) wxTheApp
->MacGetCurrentEventHandlerCallRef() ;
756 wxTheApp
->MacSetCurrentEvent( event
, handler
) ;
757 OSStatus result
= eventNotHandledErr
;
759 switch ( GetEventClass( event
) )
761 case kEventClassCommand
:
762 result
= wxMacWindowCommandEventHandler( handler
, event
, data
) ;
765 case kEventClassControl
:
766 result
= wxMacWindowControlEventHandler( handler
, event
, data
) ;
769 case kEventClassService
:
770 result
= wxMacWindowServiceEventHandler( handler
, event
, data
) ;
773 case kEventClassTextInput
:
774 result
= wxMacUnicodeTextEventHandler( handler
, event
, data
) ;
781 wxTheApp
->MacSetCurrentEvent( formerEvent
, formerEventHandlerCallRef
) ;
786 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler
)
788 // ---------------------------------------------------------------------------
789 // Scrollbar Tracking for all
790 // ---------------------------------------------------------------------------
792 pascal void wxMacLiveScrollbarActionProc( ControlRef control
, ControlPartCode partCode
) ;
793 pascal void wxMacLiveScrollbarActionProc( ControlRef control
, ControlPartCode partCode
)
797 wxWindow
* wx
= wxFindControlFromMacControl( control
) ;
799 wx
->MacHandleControlClick( (WXWidget
) control
, partCode
, true /* stillDown */ ) ;
802 wxMAC_DEFINE_PROC_GETTER( ControlActionUPP
, wxMacLiveScrollbarActionProc
) ;
804 // ===========================================================================
806 // ===========================================================================
808 WX_DECLARE_HASH_MAP(ControlRef
, wxWindow
*, wxPointerHash
, wxPointerEqual
, MacControlMap
);
810 static MacControlMap wxWinMacControlList
;
812 wxWindow
*wxFindControlFromMacControl(ControlRef inControl
)
814 MacControlMap::iterator node
= wxWinMacControlList
.find(inControl
);
816 return (node
== wxWinMacControlList
.end()) ? NULL
: node
->second
;
819 void wxAssociateControlWithMacControl(ControlRef inControl
, wxWindow
*control
)
821 // adding NULL ControlRef is (first) surely a result of an error and
822 // (secondly) breaks native event processing
823 wxCHECK_RET( inControl
!= (ControlRef
) NULL
, wxT("attempt to add a NULL WindowRef to window list") );
825 wxWinMacControlList
[inControl
] = control
;
828 void wxRemoveMacControlAssociation(wxWindow
*control
)
830 // iterate over all the elements in the class
831 // is the iterator stable ? as we might have two associations pointing to the same wxWindow
832 // we should go on...
838 MacControlMap::iterator it
;
839 for ( it
= wxWinMacControlList
.begin(); it
!= wxWinMacControlList
.end(); ++it
)
841 if ( it
->second
== control
)
843 wxWinMacControlList
.erase(it
);
851 // ----------------------------------------------------------------------------
852 // constructors and such
853 // ----------------------------------------------------------------------------
855 wxWindowMac::wxWindowMac()
860 wxWindowMac::wxWindowMac(wxWindowMac
*parent
,
865 const wxString
& name
)
868 Create(parent
, id
, pos
, size
, style
, name
);
871 void wxWindowMac::Init()
875 m_cgContextRef
= NULL
;
877 // as all windows are created with WS_VISIBLE style...
880 m_hScrollBar
= NULL
;
881 m_vScrollBar
= NULL
;
882 m_hScrollBarAlwaysShown
= false;
883 m_vScrollBarAlwaysShown
= false;
885 m_macIsUserPane
= true;
886 m_clipChildren
= false ;
887 m_cachedClippedRectValid
= false ;
889 // we need a valid font for the encodings
890 wxWindowBase::SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
893 wxWindowMac::~wxWindowMac()
897 m_isBeingDeleted
= true;
899 MacInvalidateBorders() ;
901 #ifndef __WXUNIVERSAL__
902 // VS: make sure there's no wxFrame with last focus set to us:
903 for ( wxWindow
*win
= GetParent(); win
; win
= win
->GetParent() )
905 wxFrame
*frame
= wxDynamicCast(win
, wxFrame
);
908 if ( frame
->GetLastFocus() == this )
909 frame
->SetLastFocus((wxWindow
*)NULL
);
915 // destroy children before destroying this window itself
918 // wxRemoveMacControlAssociation( this ) ;
919 // If we delete an item, we should initialize the parent panel,
920 // because it could now be invalid.
921 wxTopLevelWindow
*tlw
= wxDynamicCast(wxGetTopLevelParent(this), wxTopLevelWindow
);
924 if ( tlw
->GetDefaultItem() == (wxButton
*) this)
925 tlw
->SetDefaultItem(NULL
);
928 if ( m_peer
&& m_peer
->Ok() )
930 // in case the callback might be called during destruction
931 wxRemoveMacControlAssociation( this) ;
932 ::RemoveEventHandler( (EventHandlerRef
) m_macControlEventHandler
) ;
933 // we currently are not using this hook
934 // ::SetControlColorProc( *m_peer , NULL ) ;
938 if ( g_MacLastWindow
== this )
939 g_MacLastWindow
= NULL
;
941 #ifndef __WXUNIVERSAL__
942 wxFrame
* frame
= wxDynamicCast( wxGetTopLevelParent( (wxWindow
*)this ) , wxFrame
) ;
945 if ( frame
->GetLastFocus() == this )
946 frame
->SetLastFocus( NULL
) ;
950 // delete our drop target if we've got one
951 #if wxUSE_DRAG_AND_DROP
952 if ( m_dropTarget
!= NULL
)
962 WXWidget
wxWindowMac::GetHandle() const
964 return (WXWidget
) m_peer
->GetControlRef() ;
967 void wxWindowMac::MacInstallEventHandler( WXWidget control
)
969 wxAssociateControlWithMacControl( (ControlRef
) control
, this ) ;
970 InstallControlEventHandler( (ControlRef
)control
, GetwxMacWindowEventHandlerUPP(),
971 GetEventTypeCount(eventList
), eventList
, this,
972 (EventHandlerRef
*)&m_macControlEventHandler
);
976 bool wxWindowMac::Create(wxWindowMac
*parent
,
981 const wxString
& name
)
983 wxCHECK_MSG( parent
, false, wxT("can't create wxWindowMac without parent") );
985 if ( !CreateBase(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) )
988 m_windowVariant
= parent
->GetWindowVariant() ;
990 if ( m_macIsUserPane
)
992 Rect bounds
= wxMacGetBoundsForControl( this , pos
, size
) ;
995 | kControlSupportsEmbedding
996 | kControlSupportsLiveFeedback
997 | kControlGetsFocusOnClick
998 // | kControlHasSpecialBackground
999 // | kControlSupportsCalcBestRect
1000 | kControlHandlesTracking
1001 | kControlSupportsFocus
1002 | kControlWantsActivate
1003 | kControlWantsIdle
;
1005 m_peer
= new wxMacControl(this) ;
1006 OSStatus err
=::CreateUserPaneControl( MAC_WXHWND(GetParent()->MacGetTopLevelWindowRef()) , &bounds
, features
, m_peer
->GetControlRefAddr() );
1007 verify_noerr( err
);
1009 MacPostControlCreate(pos
, size
) ;
1012 #ifndef __WXUNIVERSAL__
1013 // Don't give scrollbars to wxControls unless they ask for them
1014 if ( (! IsKindOf(CLASSINFO(wxControl
)) && ! IsKindOf(CLASSINFO(wxStatusBar
)))
1015 || (IsKindOf(CLASSINFO(wxControl
)) && ((style
& wxHSCROLL
) || (style
& wxVSCROLL
))))
1017 MacCreateScrollBars( style
) ;
1021 wxWindowCreateEvent
event(this);
1022 GetEventHandler()->AddPendingEvent(event
);
1027 void wxWindowMac::MacChildAdded()
1030 m_vScrollBar
->Raise() ;
1032 m_hScrollBar
->Raise() ;
1035 void wxWindowMac::MacPostControlCreate(const wxPoint
& WXUNUSED(pos
), const wxSize
& size
)
1037 wxASSERT_MSG( m_peer
!= NULL
&& m_peer
->Ok() , wxT("No valid mac control") ) ;
1039 m_peer
->SetReference( (URefCon
) this ) ;
1040 GetParent()->AddChild( this );
1042 MacInstallEventHandler( (WXWidget
) m_peer
->GetControlRef() );
1044 ControlRef container
= (ControlRef
) GetParent()->GetHandle() ;
1045 wxASSERT_MSG( container
!= NULL
, wxT("No valid mac container control") ) ;
1046 ::EmbedControl( m_peer
->GetControlRef() , container
) ;
1047 GetParent()->MacChildAdded() ;
1049 // adjust font, controlsize etc
1050 DoSetWindowVariant( m_windowVariant
) ;
1052 m_peer
->SetLabel( wxStripMenuCodes(m_label
, wxStrip_Mnemonics
) ) ;
1054 if (!m_macIsUserPane
)
1055 SetInitialSize(size
);
1057 SetCursor( *wxSTANDARD_CURSOR
) ;
1060 void wxWindowMac::DoSetWindowVariant( wxWindowVariant variant
)
1062 // Don't assert, in case we set the window variant before
1063 // the window is created
1064 // wxASSERT( m_peer->Ok() ) ;
1066 m_windowVariant
= variant
;
1068 if (m_peer
== NULL
|| !m_peer
->Ok())
1072 ThemeFontID themeFont
= kThemeSystemFont
;
1074 // we will get that from the settings later
1075 // and make this NORMAL later, but first
1076 // we have a few calculations that we must fix
1080 case wxWINDOW_VARIANT_NORMAL
:
1081 size
= kControlSizeNormal
;
1082 themeFont
= kThemeSystemFont
;
1085 case wxWINDOW_VARIANT_SMALL
:
1086 size
= kControlSizeSmall
;
1087 themeFont
= kThemeSmallSystemFont
;
1090 case wxWINDOW_VARIANT_MINI
:
1091 // not always defined in the headers
1096 case wxWINDOW_VARIANT_LARGE
:
1097 size
= kControlSizeLarge
;
1098 themeFont
= kThemeSystemFont
;
1102 wxFAIL_MSG(_T("unexpected window variant"));
1106 m_peer
->SetData
<ControlSize
>(kControlEntireControl
, kControlSizeTag
, &size
) ;
1109 font
.MacCreateFromThemeFont( themeFont
) ;
1113 void wxWindowMac::MacUpdateControlFont()
1115 m_peer
->SetFont( GetFont() , GetForegroundColour() , GetWindowStyle() ) ;
1116 // do not trigger refreshes upon invisible and possible partly created objects
1117 if ( IsShownOnScreen() )
1121 bool wxWindowMac::SetFont(const wxFont
& font
)
1123 bool retval
= wxWindowBase::SetFont( font
);
1125 MacUpdateControlFont() ;
1130 bool wxWindowMac::SetForegroundColour(const wxColour
& col
)
1132 bool retval
= wxWindowBase::SetForegroundColour( col
);
1135 MacUpdateControlFont();
1140 bool wxWindowMac::SetBackgroundColour(const wxColour
& col
)
1142 if ( !wxWindowBase::SetBackgroundColour(col
) && m_hasBgCol
)
1145 m_peer
->SetBackgroundColour( col
) ;
1150 bool wxWindowMac::MacCanFocus() const
1152 // TODO : evaluate performance hits by looking up this value, eventually cache the results for a 1 sec or so
1153 // CAUTION : the value returned currently is 0 or 2, I've also found values of 1 having the same meaning,
1154 // but the value range is nowhere documented
1155 Boolean keyExistsAndHasValidFormat
;
1156 CFIndex fullKeyboardAccess
= CFPreferencesGetAppIntegerValue( CFSTR("AppleKeyboardUIMode" ) ,
1157 kCFPreferencesCurrentApplication
, &keyExistsAndHasValidFormat
);
1159 if ( keyExistsAndHasValidFormat
&& fullKeyboardAccess
> 0 )
1165 UInt32 features
= 0 ;
1166 m_peer
->GetFeatures( &features
) ;
1168 return features
& ( kControlSupportsFocus
| kControlGetsFocusOnClick
) ;
1172 void wxWindowMac::SetFocus()
1174 if ( !AcceptsFocus() )
1177 wxWindow
* former
= FindFocus() ;
1178 if ( former
== this )
1181 // as we cannot rely on the control features to find out whether we are in full keyboard mode,
1182 // we can only leave in case of an error
1183 OSStatus err
= m_peer
->SetFocus( kControlFocusNextPart
) ;
1184 if ( err
== errCouldntSetFocus
)
1187 SetUserFocusWindow( (WindowRef
)MacGetTopLevelWindowRef() );
1190 void wxWindowMac::DoCaptureMouse()
1192 wxApp::s_captureWindow
= this ;
1195 wxWindow
* wxWindowBase::GetCapture()
1197 return wxApp::s_captureWindow
;
1200 void wxWindowMac::DoReleaseMouse()
1202 wxApp::s_captureWindow
= NULL
;
1205 #if wxUSE_DRAG_AND_DROP
1207 void wxWindowMac::SetDropTarget(wxDropTarget
*pDropTarget
)
1209 if ( m_dropTarget
!= NULL
)
1210 delete m_dropTarget
;
1212 m_dropTarget
= pDropTarget
;
1213 if ( m_dropTarget
!= NULL
)
1221 // Old-style File Manager Drag & Drop
1222 void wxWindowMac::DragAcceptFiles(bool WXUNUSED(accept
))
1227 // Returns the size of the native control. In the case of the toplevel window
1228 // this is the content area root control
1230 void wxWindowMac::MacGetPositionAndSizeFromControl(int& WXUNUSED(x
),
1233 int& WXUNUSED(h
)) const
1235 wxFAIL_MSG( wxT("Not currently supported") ) ;
1238 // From a wx position / size calculate the appropriate size of the native control
1240 bool wxWindowMac::MacGetBoundsForControl(
1244 int& w
, int& h
, bool adjustOrigin
) const
1246 // the desired size, minus the border pixels gives the correct size of the control
1250 // TODO: the default calls may be used as soon as PostCreateControl Is moved here
1251 w
= wxMax(size
.x
, 0) ; // WidthDefault( size.x );
1252 h
= wxMax(size
.y
, 0) ; // HeightDefault( size.y ) ;
1254 x
+= MacGetLeftBorderSize() ;
1255 y
+= MacGetTopBorderSize() ;
1256 w
-= MacGetLeftBorderSize() + MacGetRightBorderSize() ;
1257 h
-= MacGetTopBorderSize() + MacGetBottomBorderSize() ;
1260 AdjustForParentClientOrigin( x
, y
) ;
1262 // this is in window relative coordinate, as this parent may have a border, its physical position is offset by this border
1263 if ( !GetParent()->IsTopLevel() )
1265 x
-= GetParent()->MacGetLeftBorderSize() ;
1266 y
-= GetParent()->MacGetTopBorderSize() ;
1272 // Get window size (not client size)
1273 void wxWindowMac::DoGetSize(int *x
, int *y
) const
1276 m_peer
->GetRect( &bounds
) ;
1279 *x
= bounds
.right
- bounds
.left
+ MacGetLeftBorderSize() + MacGetRightBorderSize() ;
1281 *y
= bounds
.bottom
- bounds
.top
+ MacGetTopBorderSize() + MacGetBottomBorderSize() ;
1284 // get the position of the bounds of this window in client coordinates of its parent
1285 void wxWindowMac::DoGetPosition(int *x
, int *y
) const
1288 m_peer
->GetRect( &bounds
) ;
1290 int x1
= bounds
.left
;
1291 int y1
= bounds
.top
;
1293 // get the wx window position from the native one
1294 x1
-= MacGetLeftBorderSize() ;
1295 y1
-= MacGetTopBorderSize() ;
1297 if ( !IsTopLevel() )
1299 wxWindow
*parent
= GetParent();
1302 // we must first adjust it to be in window coordinates of the parent,
1303 // as otherwise it gets lost by the ClientAreaOrigin fix
1304 x1
+= parent
->MacGetLeftBorderSize() ;
1305 y1
+= parent
->MacGetTopBorderSize() ;
1307 // and now to client coordinates
1308 wxPoint
pt(parent
->GetClientAreaOrigin());
1320 void wxWindowMac::DoScreenToClient(int *x
, int *y
) const
1322 WindowRef window
= (WindowRef
) MacGetTopLevelWindowRef() ;
1323 wxCHECK_RET( window
, wxT("TopLevel Window missing") ) ;
1325 Point localwhere
= { 0, 0 } ;
1332 wxMacGlobalToLocal( window
, &localwhere
) ;
1339 MacRootWindowToWindow( x
, y
) ;
1341 wxPoint origin
= GetClientAreaOrigin() ;
1348 void wxWindowMac::DoClientToScreen(int *x
, int *y
) const
1350 WindowRef window
= (WindowRef
) MacGetTopLevelWindowRef() ;
1351 wxCHECK_RET( window
, wxT("TopLevel window missing") ) ;
1353 wxPoint origin
= GetClientAreaOrigin() ;
1359 MacWindowToRootWindow( x
, y
) ;
1361 Point localwhere
= { 0, 0 };
1367 wxMacLocalToGlobal( window
, &localwhere
) ;
1375 void wxWindowMac::MacClientToRootWindow( int *x
, int *y
) const
1377 wxPoint origin
= GetClientAreaOrigin() ;
1383 MacWindowToRootWindow( x
, y
) ;
1386 void wxWindowMac::MacRootWindowToClient( int *x
, int *y
) const
1388 MacRootWindowToWindow( x
, y
) ;
1390 wxPoint origin
= GetClientAreaOrigin() ;
1397 void wxWindowMac::MacWindowToRootWindow( int *x
, int *y
) const
1406 if ( !IsTopLevel() )
1408 wxTopLevelWindowMac
* top
= MacGetTopLevelWindow();
1411 pt
.x
-= MacGetLeftBorderSize() ;
1412 pt
.y
-= MacGetTopBorderSize() ;
1413 wxMacControl::Convert( &pt
, m_peer
, top
->m_peer
) ;
1423 void wxWindowMac::MacWindowToRootWindow( short *x
, short *y
) const
1432 MacWindowToRootWindow( &x1
, &y1
) ;
1440 void wxWindowMac::MacRootWindowToWindow( int *x
, int *y
) const
1449 if ( !IsTopLevel() )
1451 wxTopLevelWindowMac
* top
= MacGetTopLevelWindow();
1454 wxMacControl::Convert( &pt
, top
->m_peer
, m_peer
) ;
1455 pt
.x
+= MacGetLeftBorderSize() ;
1456 pt
.y
+= MacGetTopBorderSize() ;
1466 void wxWindowMac::MacRootWindowToWindow( short *x
, short *y
) const
1475 MacRootWindowToWindow( &x1
, &y1
) ;
1483 void wxWindowMac::MacGetContentAreaInset( int &left
, int &top
, int &right
, int &bottom
)
1485 RgnHandle rgn
= NewRgn() ;
1487 if ( m_peer
->GetRegion( kControlContentMetaPart
, rgn
) == noErr
)
1489 Rect structure
, content
;
1491 GetRegionBounds( rgn
, &content
) ;
1492 m_peer
->GetRect( &structure
) ;
1493 OffsetRect( &structure
, -structure
.left
, -structure
.top
) ;
1495 left
= content
.left
- structure
.left
;
1496 top
= content
.top
- structure
.top
;
1497 right
= structure
.right
- content
.right
;
1498 bottom
= structure
.bottom
- content
.bottom
;
1502 left
= top
= right
= bottom
= 0 ;
1508 wxSize
wxWindowMac::DoGetSizeFromClientSize( const wxSize
& size
) const
1510 wxSize sizeTotal
= size
;
1512 RgnHandle rgn
= NewRgn() ;
1513 if ( m_peer
->GetRegion( kControlContentMetaPart
, rgn
) == noErr
)
1515 Rect content
, structure
;
1516 GetRegionBounds( rgn
, &content
) ;
1517 m_peer
->GetRect( &structure
) ;
1519 // structure is in parent coordinates, but we only need width and height, so it's ok
1521 sizeTotal
.x
+= (structure
.right
- structure
.left
) - (content
.right
- content
.left
) ;
1522 sizeTotal
.y
+= (structure
.bottom
- structure
.top
) - (content
.bottom
- content
.top
) ;
1527 sizeTotal
.x
+= MacGetLeftBorderSize() + MacGetRightBorderSize() ;
1528 sizeTotal
.y
+= MacGetTopBorderSize() + MacGetBottomBorderSize() ;
1533 // Get size *available for subwindows* i.e. excluding menu bar etc.
1534 void wxWindowMac::DoGetClientSize( int *x
, int *y
) const
1538 RgnHandle rgn
= NewRgn() ;
1540 if ( m_peer
->GetRegion( kControlContentMetaPart
, rgn
) == noErr
)
1541 GetRegionBounds( rgn
, &content
) ;
1543 m_peer
->GetRect( &content
) ;
1546 ww
= content
.right
- content
.left
;
1547 hh
= content
.bottom
- content
.top
;
1549 if (m_hScrollBar
&& m_hScrollBar
->IsShown() )
1550 hh
-= m_hScrollBar
->GetSize().y
;
1552 if (m_vScrollBar
&& m_vScrollBar
->IsShown() )
1553 ww
-= m_vScrollBar
->GetSize().x
;
1561 bool wxWindowMac::SetCursor(const wxCursor
& cursor
)
1563 if (m_cursor
.IsSameAs(cursor
))
1568 if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR
) )
1573 if ( ! wxWindowBase::SetCursor( cursor
) )
1577 wxASSERT_MSG( m_cursor
.Ok(),
1578 wxT("cursor must be valid after call to the base version"));
1580 wxWindowMac
*mouseWin
= 0 ;
1582 wxTopLevelWindowMac
*tlw
= MacGetTopLevelWindow() ;
1583 WindowRef window
= (WindowRef
) ( tlw
? tlw
->MacGetWindowRef() : 0 ) ;
1585 ControlPartCode part
;
1586 ControlRef control
;
1588 #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
1590 HIGetMousePosition(kHICoordSpaceWindow
, window
, &hiPoint
);
1594 GetGlobalMouse( &pt
);
1597 ScreenToClient(&x
, &y
);
1601 control
= FindControlUnderMouse( pt
, window
, &part
) ;
1603 mouseWin
= wxFindControlFromMacControl( control
) ;
1607 if ( mouseWin
== this && !wxIsBusy() )
1608 m_cursor
.MacInstall() ;
1614 bool wxWindowMac::DoPopupMenu(wxMenu
*menu
, int x
, int y
)
1616 #ifndef __WXUNIVERSAL__
1617 menu
->SetInvokingWindow((wxWindow
*)this);
1620 if ( x
== wxDefaultCoord
&& y
== wxDefaultCoord
)
1622 wxPoint mouse
= wxGetMousePosition();
1628 ClientToScreen( &x
, &y
) ;
1631 menu
->MacBeforeDisplay( true ) ;
1632 long menuResult
= ::PopUpMenuSelect((MenuHandle
) menu
->GetHMenu() , y
, x
, 0) ;
1633 if ( HiWord(menuResult
) != 0 )
1636 GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult
)) , LoWord(menuResult
) , &macid
);
1637 int id
= wxMacCommandToId( macid
);
1638 wxMenuItem
* item
= NULL
;
1640 item
= menu
->FindItem( id
, &realmenu
) ;
1643 if (item
->IsCheckable())
1644 item
->Check( !item
->IsChecked() ) ;
1646 menu
->SendEvent( id
, item
->IsCheckable() ? item
->IsChecked() : -1 ) ;
1650 menu
->MacAfterDisplay( true ) ;
1651 menu
->SetInvokingWindow( NULL
);
1655 // actually this shouldn't be called, because universal is having its own implementation
1661 // ----------------------------------------------------------------------------
1663 // ----------------------------------------------------------------------------
1667 void wxWindowMac::DoSetToolTip(wxToolTip
*tooltip
)
1669 wxWindowBase::DoSetToolTip(tooltip
);
1672 m_tooltip
->SetWindow(this);
1677 void wxWindowMac::MacInvalidateBorders()
1679 if ( m_peer
== NULL
)
1682 bool vis
= IsShownOnScreen() ;
1686 int outerBorder
= MacGetLeftBorderSize() ;
1687 if ( m_peer
->NeedsFocusRect() /* && m_peer->HasFocus() */ )
1690 if ( outerBorder
== 0 )
1693 // now we know that we have something to do at all
1695 // as the borders are drawn on the parent we have to properly invalidate all these areas
1696 RgnHandle updateInner
, updateOuter
;
1699 // this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon
1700 updateInner
= NewRgn() ;
1701 updateOuter
= NewRgn() ;
1703 m_peer
->GetRect( &rect
) ;
1704 RectRgn( updateInner
, &rect
) ;
1705 InsetRect( &rect
, -outerBorder
, -outerBorder
) ;
1706 RectRgn( updateOuter
, &rect
) ;
1707 DiffRgn( updateOuter
, updateInner
, updateOuter
) ;
1709 GetParent()->m_peer
->SetNeedsDisplay( updateOuter
) ;
1711 DisposeRgn( updateOuter
) ;
1712 DisposeRgn( updateInner
) ;
1715 void wxWindowMac::DoMoveWindow(int x
, int y
, int width
, int height
)
1717 // this is never called for a toplevel window, so we know we have a parent
1718 int former_x
, former_y
, former_w
, former_h
;
1720 // Get true coordinates of former position
1721 DoGetPosition( &former_x
, &former_y
) ;
1722 DoGetSize( &former_w
, &former_h
) ;
1724 wxWindow
*parent
= GetParent();
1727 wxPoint
pt(parent
->GetClientAreaOrigin());
1732 int actualWidth
= width
;
1733 int actualHeight
= height
;
1737 if ((m_minWidth
!= -1) && (actualWidth
< m_minWidth
))
1738 actualWidth
= m_minWidth
;
1739 if ((m_minHeight
!= -1) && (actualHeight
< m_minHeight
))
1740 actualHeight
= m_minHeight
;
1741 if ((m_maxWidth
!= -1) && (actualWidth
> m_maxWidth
))
1742 actualWidth
= m_maxWidth
;
1743 if ((m_maxHeight
!= -1) && (actualHeight
> m_maxHeight
))
1744 actualHeight
= m_maxHeight
;
1746 bool doMove
= false, doResize
= false ;
1748 if ( actualX
!= former_x
|| actualY
!= former_y
)
1751 if ( actualWidth
!= former_w
|| actualHeight
!= former_h
)
1754 if ( doMove
|| doResize
)
1756 // as the borders are drawn outside the native control, we adjust now
1758 wxRect
bounds( wxPoint( actualX
+ MacGetLeftBorderSize() ,actualY
+ MacGetTopBorderSize() ),
1759 wxSize( actualWidth
- (MacGetLeftBorderSize() + MacGetRightBorderSize()) ,
1760 actualHeight
- (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ;
1763 wxMacRectToNative( &bounds
, &r
) ;
1765 if ( !GetParent()->IsTopLevel() )
1766 wxMacWindowToNative( GetParent() , &r
) ;
1768 MacInvalidateBorders() ;
1770 m_cachedClippedRectValid
= false ;
1771 m_peer
->SetRect( &r
) ;
1773 wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
1775 MacInvalidateBorders() ;
1777 MacRepositionScrollBars() ;
1780 wxPoint
point(actualX
, actualY
);
1781 wxMoveEvent
event(point
, m_windowId
);
1782 event
.SetEventObject(this);
1783 HandleWindowEvent(event
) ;
1788 MacRepositionScrollBars() ;
1789 wxSize
size(actualWidth
, actualHeight
);
1790 wxSizeEvent
event(size
, m_windowId
);
1791 event
.SetEventObject(this);
1792 HandleWindowEvent(event
);
1797 wxSize
wxWindowMac::DoGetBestSize() const
1799 if ( m_macIsUserPane
|| IsTopLevel() )
1800 return wxWindowBase::DoGetBestSize() ;
1802 Rect bestsize
= { 0 , 0 , 0 , 0 } ;
1803 int bestWidth
, bestHeight
;
1805 m_peer
->GetBestRect( &bestsize
) ;
1806 if ( EmptyRect( &bestsize
) )
1811 bestsize
.bottom
= 16 ;
1813 if ( IsKindOf( CLASSINFO( wxScrollBar
) ) )
1815 bestsize
.bottom
= 16 ;
1818 else if ( IsKindOf( CLASSINFO( wxSpinButton
) ) )
1820 bestsize
.bottom
= 24 ;
1825 // return wxWindowBase::DoGetBestSize() ;
1829 bestWidth
= bestsize
.right
- bestsize
.left
;
1830 bestHeight
= bestsize
.bottom
- bestsize
.top
;
1831 if ( bestHeight
< 10 )
1834 return wxSize(bestWidth
, bestHeight
);
1837 // set the size of the window: if the dimensions are positive, just use them,
1838 // but if any of them is equal to -1, it means that we must find the value for
1839 // it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
1840 // which case -1 is a valid value for x and y)
1842 // If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
1843 // the width/height to best suit our contents, otherwise we reuse the current
1845 void wxWindowMac::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
1847 // get the current size and position...
1848 int currentX
, currentY
;
1849 int currentW
, currentH
;
1851 GetPosition(¤tX
, ¤tY
);
1852 GetSize(¤tW
, ¤tH
);
1854 // ... and don't do anything (avoiding flicker) if it's already ok
1855 if ( x
== currentX
&& y
== currentY
&&
1856 width
== currentW
&& height
== currentH
&& ( height
!= -1 && width
!= -1 ) )
1859 MacRepositionScrollBars() ; // we might have a real position shift
1864 if ( !(sizeFlags
& wxSIZE_ALLOW_MINUS_ONE
) )
1866 if ( x
== wxDefaultCoord
)
1868 if ( y
== wxDefaultCoord
)
1872 AdjustForParentClientOrigin( x
, y
, sizeFlags
);
1874 wxSize size
= wxDefaultSize
;
1875 if ( width
== wxDefaultCoord
)
1877 if ( sizeFlags
& wxSIZE_AUTO_WIDTH
)
1879 size
= DoGetBestSize();
1884 // just take the current one
1889 if ( height
== wxDefaultCoord
)
1891 if ( sizeFlags
& wxSIZE_AUTO_HEIGHT
)
1893 if ( size
.x
== wxDefaultCoord
)
1894 size
= DoGetBestSize();
1895 // else: already called DoGetBestSize() above
1901 // just take the current one
1906 DoMoveWindow( x
, y
, width
, height
);
1909 wxPoint
wxWindowMac::GetClientAreaOrigin() const
1911 RgnHandle rgn
= NewRgn() ;
1913 if ( m_peer
->GetRegion( kControlContentMetaPart
, rgn
) == noErr
)
1915 GetRegionBounds( rgn
, &content
) ;
1925 return wxPoint( content
.left
+ MacGetLeftBorderSize() , content
.top
+ MacGetTopBorderSize() );
1928 void wxWindowMac::DoSetClientSize(int clientwidth
, int clientheight
)
1930 if ( clientwidth
!= wxDefaultCoord
|| clientheight
!= wxDefaultCoord
)
1932 int currentclientwidth
, currentclientheight
;
1933 int currentwidth
, currentheight
;
1935 GetClientSize( ¤tclientwidth
, ¤tclientheight
) ;
1936 GetSize( ¤twidth
, ¤theight
) ;
1938 DoSetSize( wxDefaultCoord
, wxDefaultCoord
, currentwidth
+ clientwidth
- currentclientwidth
,
1939 currentheight
+ clientheight
- currentclientheight
, wxSIZE_USE_EXISTING
) ;
1943 void wxWindowMac::SetLabel(const wxString
& title
)
1947 if ( m_peer
&& m_peer
->Ok() )
1948 m_peer
->SetLabel( wxStripMenuCodes(m_label
, wxStrip_Mnemonics
) ) ;
1950 // do not trigger refreshes upon invisible and possible partly created objects
1951 if ( IsShownOnScreen() )
1955 wxString
wxWindowMac::GetLabel() const
1960 bool wxWindowMac::Show(bool show
)
1962 if ( !wxWindowBase::Show(show
) )
1966 m_peer
->SetVisibility( show
, true ) ;
1971 void wxWindowMac::DoEnable(bool enable
)
1973 m_peer
->Enable( enable
) ;
1977 // status change notifications
1980 void wxWindowMac::MacVisibilityChanged()
1984 void wxWindowMac::MacHiliteChanged()
1988 void wxWindowMac::MacEnabledStateChanged()
1990 OnEnabled( m_peer
->IsEnabled() );
1994 // status queries on the inherited window's state
1997 bool wxWindowMac::MacIsReallyEnabled()
1999 return m_peer
->IsEnabled() ;
2002 bool wxWindowMac::MacIsReallyHilited()
2004 return m_peer
->IsActive();
2007 void wxWindowMac::MacFlashInvalidAreas()
2009 #if TARGET_API_MAC_OSX
2010 HIViewFlashDirtyArea( (WindowRef
) MacGetTopLevelWindowRef() ) ;
2014 int wxWindowMac::GetCharHeight() const
2016 wxClientDC
dc( (wxWindowMac
*)this ) ;
2018 return dc
.GetCharHeight() ;
2021 int wxWindowMac::GetCharWidth() const
2023 wxClientDC
dc( (wxWindowMac
*)this ) ;
2025 return dc
.GetCharWidth() ;
2028 void wxWindowMac::GetTextExtent(const wxString
& string
, int *x
, int *y
,
2029 int *descent
, int *externalLeading
, const wxFont
*theFont
) const
2031 const wxFont
*fontToUse
= theFont
;
2033 fontToUse
= &m_font
;
2035 wxClientDC
dc( (wxWindowMac
*) this ) ;
2036 wxCoord lx
,ly
,ld
,le
;
2037 dc
.GetTextExtent( string
, &lx
, &ly
, &ld
, &le
, (wxFont
*)fontToUse
) ;
2038 if ( externalLeading
)
2039 *externalLeading
= le
;
2049 * Rect is given in client coordinates, for further reading, read wxTopLevelWindowMac::InvalidateRect
2050 * we always intersect with the entire window, not only with the client area
2053 void wxWindowMac::Refresh(bool WXUNUSED(eraseBack
), const wxRect
*rect
)
2055 if ( m_peer
== NULL
)
2058 if ( !IsShownOnScreen() )
2065 wxMacRectToNative( rect
, &r
) ;
2066 m_peer
->SetNeedsDisplay( &r
) ;
2070 m_peer
->SetNeedsDisplay() ;
2074 void wxWindowMac::DoFreeze()
2076 #if TARGET_API_MAC_OSX
2077 if ( m_peer
&& m_peer
->Ok() )
2078 m_peer
->SetDrawingEnabled( false ) ;
2082 void wxWindowMac::DoThaw()
2084 #if TARGET_API_MAC_OSX
2085 if ( m_peer
&& m_peer
->Ok() )
2087 m_peer
->SetDrawingEnabled( true ) ;
2088 m_peer
->InvalidateWithChildren() ;
2093 wxWindowMac
*wxGetActiveWindow()
2095 // actually this is a windows-only concept
2099 // Coordinates relative to the window
2100 void wxWindowMac::WarpPointer(int WXUNUSED(x_pos
), int WXUNUSED(y_pos
))
2102 // We really don't move the mouse programmatically under Mac.
2105 void wxWindowMac::OnEraseBackground(wxEraseEvent
& event
)
2107 if ( MacGetTopLevelWindow() == NULL
)
2110 #if TARGET_API_MAC_OSX
2111 if ( !m_backgroundColour.Ok() || GetBackgroundStyle() == wxBG_STYLE_TRANSPARENT )
2117 if ( GetBackgroundStyle() == wxBG_STYLE_COLOUR
)
2119 event
.GetDC()->Clear() ;
2127 void wxWindowMac::OnNcPaint( wxNcPaintEvent
& event
)
2132 int wxWindowMac::GetScrollPos(int orient
) const
2134 if ( orient
== wxHORIZONTAL
)
2137 return m_hScrollBar
->GetThumbPosition() ;
2142 return m_vScrollBar
->GetThumbPosition() ;
2148 // This now returns the whole range, not just the number
2149 // of positions that we can scroll.
2150 int wxWindowMac::GetScrollRange(int orient
) const
2152 if ( orient
== wxHORIZONTAL
)
2155 return m_hScrollBar
->GetRange() ;
2160 return m_vScrollBar
->GetRange() ;
2166 int wxWindowMac::GetScrollThumb(int orient
) const
2168 if ( orient
== wxHORIZONTAL
)
2171 return m_hScrollBar
->GetThumbSize() ;
2176 return m_vScrollBar
->GetThumbSize() ;
2182 void wxWindowMac::SetScrollPos(int orient
, int pos
, bool WXUNUSED(refresh
))
2184 if ( orient
== wxHORIZONTAL
)
2187 m_hScrollBar
->SetThumbPosition( pos
) ;
2192 m_vScrollBar
->SetThumbPosition( pos
) ;
2197 wxWindowMac::AlwaysShowScrollbars(bool hflag
, bool vflag
)
2199 bool needVisibilityUpdate
= false;
2201 if ( m_hScrollBarAlwaysShown
!= hflag
)
2203 m_hScrollBarAlwaysShown
= hflag
;
2204 needVisibilityUpdate
= true;
2207 if ( m_vScrollBarAlwaysShown
!= vflag
)
2209 m_vScrollBarAlwaysShown
= vflag
;
2210 needVisibilityUpdate
= true;
2213 if ( needVisibilityUpdate
)
2214 DoUpdateScrollbarVisibility();
2218 // we draw borders and grow boxes, are already set up and clipped in the current port / cgContextRef
2219 // our own window origin is at leftOrigin/rightOrigin
2222 void wxWindowMac::MacPaintGrowBox()
2227 if ( MacHasScrollBarCorner() )
2231 CGContextRef cgContext
= (CGContextRef
) MacGetCGContextRef() ;
2232 wxASSERT( cgContext
) ;
2234 m_peer
->GetRect( &rect
) ;
2236 int size
= m_hScrollBar
? m_hScrollBar
->GetSize().y
: ( m_vScrollBar
? m_vScrollBar
->GetSize().x
: MAC_SCROLLBAR_SIZE
) ;
2237 CGRect cgrect
= CGRectMake( rect
.right
- size
, rect
.bottom
- size
, size
, size
) ;
2238 CGPoint cgpoint
= CGPointMake( rect
.right
- size
, rect
.bottom
- size
) ;
2239 CGContextSaveGState( cgContext
);
2241 if ( m_backgroundColour
.Ok() )
2243 CGContextSetFillColorWithColor( cgContext
, m_backgroundColour
.GetCGColor() );
2247 CGContextSetRGBFillColor( cgContext
, 1.0, 1.0 , 1.0 , 1.0 );
2249 CGContextFillRect( cgContext
, cgrect
);
2250 CGContextRestoreGState( cgContext
);
2254 void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin
) , int WXUNUSED(rightOrigin
) )
2260 bool hasFocus
= m_peer
->NeedsFocusRect() && m_peer
->HasFocus() ;
2262 // back to the surrounding frame rectangle
2263 m_peer
->GetRect( &rect
) ;
2264 InsetRect( &rect
, -1 , -1 ) ;
2267 CGRect cgrect
= CGRectMake( rect
.left
, rect
.top
, rect
.right
- rect
.left
,
2268 rect
.bottom
- rect
.top
) ;
2270 HIThemeFrameDrawInfo info
;
2271 memset( &info
, 0 , sizeof(info
) ) ;
2275 info
.state
= IsEnabled() ? kThemeStateActive
: kThemeStateInactive
;
2276 info
.isFocused
= hasFocus
;
2278 CGContextRef cgContext
= (CGContextRef
) GetParent()->MacGetCGContextRef() ;
2279 wxASSERT( cgContext
) ;
2281 if ( HasFlag(wxRAISED_BORDER
) || HasFlag(wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
) )
2283 info
.kind
= kHIThemeFrameTextFieldSquare
;
2284 HIThemeDrawFrame( &cgrect
, &info
, cgContext
, kHIThemeOrientationNormal
) ;
2286 else if ( HasFlag(wxSIMPLE_BORDER
) )
2288 info
.kind
= kHIThemeFrameListBox
;
2289 HIThemeDrawFrame( &cgrect
, &info
, cgContext
, kHIThemeOrientationNormal
) ;
2291 else if ( hasFocus
)
2293 HIThemeDrawFocusRect( &cgrect
, true , cgContext
, kHIThemeOrientationNormal
) ;
2295 #if 0 // TODO REMOVE now done in a separate call earlier in drawing the window itself
2296 m_peer
->GetRect( &rect
) ;
2297 if ( MacHasScrollBarCorner() )
2299 int variant
= (m_hScrollBar
== NULL
? m_vScrollBar
: m_hScrollBar
) ->GetWindowVariant();
2300 int size
= m_hScrollBar
? m_hScrollBar
->GetSize().y
: ( m_vScrollBar
? m_vScrollBar
->GetSize().x
: MAC_SCROLLBAR_SIZE
) ;
2301 CGRect cgrect
= CGRectMake( rect
.right
- size
, rect
.bottom
- size
, size
, size
) ;
2302 CGPoint cgpoint
= CGPointMake( rect
.right
- size
, rect
.bottom
- size
) ;
2303 HIThemeGrowBoxDrawInfo info
;
2304 memset( &info
, 0, sizeof(info
) ) ;
2306 info
.state
= IsEnabled() ? kThemeStateActive
: kThemeStateInactive
;
2307 info
.kind
= kHIThemeGrowBoxKindNone
;
2308 // contrary to the docs ...SizeSmall does not work
2309 info
.size
= kHIThemeGrowBoxSizeNormal
;
2310 info
.direction
= 0 ;
2311 HIThemeDrawGrowBox( &cgpoint
, &info
, cgContext
, kHIThemeOrientationNormal
) ;
2317 void wxWindowMac::RemoveChild( wxWindowBase
*child
)
2319 if ( child
== m_hScrollBar
)
2320 m_hScrollBar
= NULL
;
2321 if ( child
== m_vScrollBar
)
2322 m_vScrollBar
= NULL
;
2324 wxWindowBase::RemoveChild( child
) ;
2327 void wxWindowMac::DoUpdateScrollbarVisibility()
2329 bool triggerSizeEvent
= false;
2333 bool showHScrollBar
= m_hScrollBarAlwaysShown
|| m_hScrollBar
->IsNeeded();
2335 if ( m_hScrollBar
->IsShown() != showHScrollBar
)
2337 m_hScrollBar
->Show( showHScrollBar
);
2338 triggerSizeEvent
= true;
2344 bool showVScrollBar
= m_vScrollBarAlwaysShown
|| m_vScrollBar
->IsNeeded();
2346 if ( m_vScrollBar
->IsShown() != showVScrollBar
)
2348 m_vScrollBar
->Show( showVScrollBar
) ;
2349 triggerSizeEvent
= true;
2353 MacRepositionScrollBars() ;
2354 if ( triggerSizeEvent
)
2356 wxSizeEvent
event(GetSize(), m_windowId
);
2357 event
.SetEventObject(this);
2358 HandleWindowEvent(event
);
2362 // New function that will replace some of the above.
2363 void wxWindowMac::SetScrollbar(int orient
, int pos
, int thumb
,
2364 int range
, bool refresh
)
2366 if ( orient
== wxHORIZONTAL
&& m_hScrollBar
)
2367 m_hScrollBar
->SetScrollbar(pos
, thumb
, range
, thumb
, refresh
);
2368 else if ( orient
== wxVERTICAL
&& m_vScrollBar
)
2369 m_vScrollBar
->SetScrollbar(pos
, thumb
, range
, thumb
, refresh
);
2371 DoUpdateScrollbarVisibility();
2374 // Does a physical scroll
2375 void wxWindowMac::ScrollWindow(int dx
, int dy
, const wxRect
*rect
)
2377 if ( dx
== 0 && dy
== 0 )
2380 int width
, height
;
2381 GetClientSize( &width
, &height
) ;
2384 // note there currently is a bug in OSX which makes inefficient refreshes in case an entire control
2385 // area is scrolled, this does not occur if width and height are 2 pixels less,
2386 // TODO: write optimal workaround
2387 wxRect
scrollrect( MacGetLeftBorderSize() , MacGetTopBorderSize() , width
, height
) ;
2389 scrollrect
.Intersect( *rect
) ;
2391 if ( m_peer
->GetNeedsDisplay() )
2393 // because HIViewScrollRect does not scroll the already invalidated area we have two options:
2394 // in case there is already a pending redraw on that area
2395 // either immediate redraw or full invalidate
2397 // is the better overall solution, as it does not slow down scrolling
2398 m_peer
->SetNeedsDisplay() ;
2400 // this would be the preferred version for fast drawing controls
2401 HIViewRender(m_peer
->GetControlRef()) ;
2405 // as the native control might be not a 0/0 wx window coordinates, we have to offset
2406 scrollrect
.Offset( -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ;
2407 m_peer
->ScrollRect( &scrollrect
, dx
, dy
) ;
2410 // this would be the preferred version for fast drawing controls
2411 HIViewRender(m_peer
->GetControlRef()) ;
2417 for (wxWindowList::compatibility_iterator node
= GetChildren().GetFirst(); node
; node
= node
->GetNext())
2419 child
= node
->GetData();
2422 if (child
== m_vScrollBar
)
2424 if (child
== m_hScrollBar
)
2426 if (child
->IsTopLevel())
2429 child
->GetPosition( &x
, &y
);
2430 child
->GetSize( &w
, &h
);
2433 wxRect
rc( x
, y
, w
, h
);
2434 if (rect
->Intersects( rc
))
2435 child
->SetSize( x
+ dx
, y
+ dy
, w
, h
, wxSIZE_AUTO
|wxSIZE_ALLOW_MINUS_ONE
);
2439 child
->SetSize( x
+ dx
, y
+ dy
, w
, h
, wxSIZE_AUTO
|wxSIZE_ALLOW_MINUS_ONE
);
2444 void wxWindowMac::MacOnScroll( wxScrollEvent
&event
)
2446 if ( event
.GetEventObject() == m_vScrollBar
|| event
.GetEventObject() == m_hScrollBar
)
2448 wxScrollWinEvent wevent
;
2449 wevent
.SetPosition(event
.GetPosition());
2450 wevent
.SetOrientation(event
.GetOrientation());
2451 wevent
.SetEventObject(this);
2453 if (event
.GetEventType() == wxEVT_SCROLL_TOP
)
2454 wevent
.SetEventType( wxEVT_SCROLLWIN_TOP
);
2455 else if (event
.GetEventType() == wxEVT_SCROLL_BOTTOM
)
2456 wevent
.SetEventType( wxEVT_SCROLLWIN_BOTTOM
);
2457 else if (event
.GetEventType() == wxEVT_SCROLL_LINEUP
)
2458 wevent
.SetEventType( wxEVT_SCROLLWIN_LINEUP
);
2459 else if (event
.GetEventType() == wxEVT_SCROLL_LINEDOWN
)
2460 wevent
.SetEventType( wxEVT_SCROLLWIN_LINEDOWN
);
2461 else if (event
.GetEventType() == wxEVT_SCROLL_PAGEUP
)
2462 wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEUP
);
2463 else if (event
.GetEventType() == wxEVT_SCROLL_PAGEDOWN
)
2464 wevent
.SetEventType( wxEVT_SCROLLWIN_PAGEDOWN
);
2465 else if (event
.GetEventType() == wxEVT_SCROLL_THUMBTRACK
)
2466 wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBTRACK
);
2467 else if (event
.GetEventType() == wxEVT_SCROLL_THUMBRELEASE
)
2468 wevent
.SetEventType( wxEVT_SCROLLWIN_THUMBRELEASE
);
2470 HandleWindowEvent(wevent
);
2474 // Get the window with the focus
2475 wxWindowMac
*wxWindowBase::DoFindFocus()
2477 ControlRef control
;
2478 GetKeyboardFocus( GetUserFocusWindow() , &control
) ;
2479 return wxFindControlFromMacControl( control
) ;
2482 void wxWindowMac::OnInternalIdle()
2484 // This calls the UI-update mechanism (querying windows for
2485 // menu/toolbar/control state information)
2486 if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen())
2487 UpdateWindowUI(wxUPDATE_UI_FROMIDLE
);
2490 // Raise the window to the top of the Z order
2491 void wxWindowMac::Raise()
2493 m_peer
->SetZOrder( true , NULL
) ;
2496 // Lower the window to the bottom of the Z order
2497 void wxWindowMac::Lower()
2499 m_peer
->SetZOrder( false , NULL
) ;
2502 // static wxWindow *gs_lastWhich = NULL;
2504 bool wxWindowMac::MacSetupCursor( const wxPoint
& pt
)
2506 // first trigger a set cursor event
2508 wxPoint clientorigin
= GetClientAreaOrigin() ;
2509 wxSize clientsize
= GetClientSize() ;
2511 if ( wxRect2DInt( clientorigin
.x
, clientorigin
.y
, clientsize
.x
, clientsize
.y
).Contains( wxPoint2DInt( pt
) ) )
2513 wxSetCursorEvent
event( pt
.x
, pt
.y
);
2515 bool processedEvtSetCursor
= HandleWindowEvent(event
);
2516 if ( processedEvtSetCursor
&& event
.HasCursor() )
2518 cursor
= event
.GetCursor() ;
2522 // the test for processedEvtSetCursor is here to prevent using m_cursor
2523 // if the user code caught EVT_SET_CURSOR() and returned nothing from
2524 // it - this is a way to say that our cursor shouldn't be used for this
2526 if ( !processedEvtSetCursor
&& m_cursor
.Ok() )
2529 if ( !wxIsBusy() && !GetParent() )
2530 cursor
= *wxSTANDARD_CURSOR
;
2534 cursor
.MacInstall() ;
2537 return cursor
.Ok() ;
2540 wxString
wxWindowMac::MacGetToolTipString( wxPoint
&WXUNUSED(pt
) )
2544 return m_tooltip
->GetTip() ;
2547 return wxEmptyString
;
2550 void wxWindowMac::ClearBackground()
2556 void wxWindowMac::Update()
2558 wxTopLevelWindowMac
* top
= MacGetTopLevelWindow();
2560 top
->MacPerformUpdates() ;
2563 wxTopLevelWindowMac
* wxWindowMac::MacGetTopLevelWindow() const
2565 wxTopLevelWindowMac
* win
= NULL
;
2566 WindowRef window
= (WindowRef
) MacGetTopLevelWindowRef() ;
2568 win
= wxFindWinFromMacWindow( window
) ;
2573 const wxRect
& wxWindowMac::MacGetClippedClientRect() const
2575 MacUpdateClippedRects() ;
2577 return m_cachedClippedClientRect
;
2580 const wxRect
& wxWindowMac::MacGetClippedRect() const
2582 MacUpdateClippedRects() ;
2584 return m_cachedClippedRect
;
2587 const wxRect
&wxWindowMac:: MacGetClippedRectWithOuterStructure() const
2589 MacUpdateClippedRects() ;
2591 return m_cachedClippedRectWithOuterStructure
;
2594 const wxRegion
& wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures
)
2596 static wxRegion emptyrgn
;
2598 if ( !m_isBeingDeleted
&& IsShownOnScreen() )
2600 MacUpdateClippedRects() ;
2601 if ( includeOuterStructures
)
2602 return m_cachedClippedRegionWithOuterStructure
;
2604 return m_cachedClippedRegion
;
2612 void wxWindowMac::MacUpdateClippedRects() const
2614 if ( m_cachedClippedRectValid
)
2617 // includeOuterStructures is true if we try to draw somthing like a focus ring etc.
2618 // also a window dc uses this, in this case we only clip in the hierarchy for hard
2619 // borders like a scrollwindow, splitter etc otherwise we end up in a paranoia having
2620 // to add focus borders everywhere
2622 Rect r
, rIncludingOuterStructures
;
2624 m_peer
->GetRect( &r
) ;
2625 r
.left
-= MacGetLeftBorderSize() ;
2626 r
.top
-= MacGetTopBorderSize() ;
2627 r
.bottom
+= MacGetBottomBorderSize() ;
2628 r
.right
+= MacGetRightBorderSize() ;
2635 rIncludingOuterStructures
= r
;
2636 InsetRect( &rIncludingOuterStructures
, -4 , -4 ) ;
2638 wxRect cl
= GetClientRect() ;
2639 Rect rClient
= { cl
.y
, cl
.x
, cl
.y
+ cl
.height
, cl
.x
+ cl
.width
} ;
2643 const wxWindow
* child
= this ;
2644 const wxWindow
* parent
= NULL
;
2646 while ( !child
->IsTopLevel() && ( parent
= child
->GetParent() ) != NULL
)
2648 if ( parent
->MacIsChildOfClientArea(child
) )
2650 size
= parent
->GetClientSize() ;
2651 wxPoint origin
= parent
->GetClientAreaOrigin() ;
2657 // this will be true for scrollbars, toolbars etc.
2658 size
= parent
->GetSize() ;
2659 y
= parent
->MacGetTopBorderSize() ;
2660 x
= parent
->MacGetLeftBorderSize() ;
2661 size
.x
-= parent
->MacGetLeftBorderSize() + parent
->MacGetRightBorderSize() ;
2662 size
.y
-= parent
->MacGetTopBorderSize() + parent
->MacGetBottomBorderSize() ;
2665 parent
->MacWindowToRootWindow( &x
, &y
) ;
2666 MacRootWindowToWindow( &x
, &y
) ;
2668 Rect rparent
= { y
, x
, y
+ size
.y
, x
+ size
.x
} ;
2670 // the wxwindow and client rects will always be clipped
2671 SectRect( &r
, &rparent
, &r
) ;
2672 SectRect( &rClient
, &rparent
, &rClient
) ;
2674 // the structure only at 'hard' borders
2675 if ( parent
->MacClipChildren() ||
2676 ( parent
->GetParent() && parent
->GetParent()->MacClipGrandChildren() ) )
2678 SectRect( &rIncludingOuterStructures
, &rparent
, &rIncludingOuterStructures
) ;
2684 m_cachedClippedRect
= wxRect( r
.left
, r
.top
, r
.right
- r
.left
, r
.bottom
- r
.top
) ;
2685 m_cachedClippedClientRect
= wxRect( rClient
.left
, rClient
.top
,
2686 rClient
.right
- rClient
.left
, rClient
.bottom
- rClient
.top
) ;
2687 m_cachedClippedRectWithOuterStructure
= wxRect(
2688 rIncludingOuterStructures
.left
, rIncludingOuterStructures
.top
,
2689 rIncludingOuterStructures
.right
- rIncludingOuterStructures
.left
,
2690 rIncludingOuterStructures
.bottom
- rIncludingOuterStructures
.top
) ;
2692 m_cachedClippedRegionWithOuterStructure
= wxRegion( m_cachedClippedRectWithOuterStructure
) ;
2693 m_cachedClippedRegion
= wxRegion( m_cachedClippedRect
) ;
2694 m_cachedClippedClientRegion
= wxRegion( m_cachedClippedClientRect
) ;
2696 m_cachedClippedRectValid
= true ;
2700 This function must not change the updatergn !
2702 bool wxWindowMac::MacDoRedraw( void* updatergnr
, long time
)
2704 bool handled
= false ;
2706 RgnHandle updatergn
= (RgnHandle
) updatergnr
;
2707 GetRegionBounds( updatergn
, &updatebounds
) ;
2709 // wxLogDebug(wxT("update for %s bounds %d, %d, %d, %d"), wxString(GetClassInfo()->GetClassName()).c_str(), updatebounds.left, updatebounds.top , updatebounds.right , updatebounds.bottom ) ;
2711 if ( !EmptyRgn(updatergn
) )
2713 RgnHandle newupdate
= NewRgn() ;
2714 wxSize point
= GetClientSize() ;
2715 wxPoint origin
= GetClientAreaOrigin() ;
2716 SetRectRgn( newupdate
, origin
.x
, origin
.y
, origin
.x
+ point
.x
, origin
.y
+ point
.y
) ;
2717 SectRgn( newupdate
, updatergn
, newupdate
) ;
2719 // first send an erase event to the entire update area
2721 // for the toplevel window this really is the entire area
2722 // for all the others only their client area, otherwise they
2723 // might be drawing with full alpha and eg put blue into
2724 // the grow-box area of a scrolled window (scroll sample)
2725 wxDC
* dc
= new wxWindowDC(this);
2727 dc
->SetClippingRegion(wxRegion(HIShapeCreateWithQDRgn(updatergn
)));
2729 dc
->SetClippingRegion(wxRegion(HIShapeCreateWithQDRgn(newupdate
)));
2731 wxEraseEvent
eevent( GetId(), dc
);
2732 eevent
.SetEventObject( this );
2733 HandleWindowEvent( eevent
);
2739 // calculate a client-origin version of the update rgn and set m_updateRegion to that
2740 OffsetRgn( newupdate
, -origin
.x
, -origin
.y
) ;
2741 m_updateRegion
= wxRegion(HIShapeCreateWithQDRgn(newupdate
)) ;
2742 DisposeRgn( newupdate
) ;
2744 if ( !m_updateRegion
.Empty() )
2746 // paint the window itself
2749 event
.SetTimestamp(time
);
2750 event
.SetEventObject(this);
2751 HandleWindowEvent(event
);
2755 // now we cannot rely on having its borders drawn by a window itself, as it does not
2756 // get the updateRgn wide enough to always do so, so we do it from the parent
2757 // this would also be the place to draw any custom backgrounds for native controls
2758 // in Composited windowing
2759 wxPoint clientOrigin
= GetClientAreaOrigin() ;
2763 for (wxWindowList::compatibility_iterator node
= GetChildren().GetFirst(); node
; node
= node
->GetNext())
2765 child
= node
->GetData();
2768 if (child
== m_vScrollBar
)
2770 if (child
== m_hScrollBar
)
2772 if (child
->IsTopLevel())
2774 if (!child
->IsShown())
2777 // only draw those in the update region (add a safety margin of 10 pixels for shadow effects
2779 child
->GetPosition( &x
, &y
);
2780 child
->GetSize( &w
, &h
);
2781 Rect childRect
= { y
, x
, y
+ h
, x
+ w
} ;
2782 OffsetRect( &childRect
, clientOrigin
.x
, clientOrigin
.y
) ;
2783 InsetRect( &childRect
, -10 , -10) ;
2785 if ( RectInRgn( &childRect
, updatergn
) )
2787 // paint custom borders
2788 wxNcPaintEvent
eventNc( child
->GetId() );
2789 eventNc
.SetEventObject( child
);
2790 if ( !child
->HandleWindowEvent( eventNc
) )
2792 child
->MacPaintBorders(0, 0) ;
2802 WXWindow
wxWindowMac::MacGetTopLevelWindowRef() const
2804 wxWindowMac
*iter
= (wxWindowMac
*)this ;
2808 if ( iter
->IsTopLevel() )
2810 wxTopLevelWindow
* toplevel
= wxDynamicCast(iter
,wxTopLevelWindow
);
2812 return toplevel
->MacGetWindowRef();
2814 wxPopupWindow
* popupwin
= wxDynamicCast(iter
,wxPopupWindow
);
2816 return popupwin
->MacGetPopupWindowRef();
2819 iter
= iter
->GetParent() ;
2825 bool wxWindowMac::MacHasScrollBarCorner() const
2827 /* Returns whether the scroll bars in a wxScrolledWindow should be
2828 * shortened. Scroll bars should be shortened if either:
2830 * - both scroll bars are visible, or
2832 * - there is a resize box in the parent frame's corner and this
2833 * window shares the bottom and right edge with the parent
2837 if ( m_hScrollBar
== NULL
&& m_vScrollBar
== NULL
)
2840 if ( ( m_hScrollBar
&& m_hScrollBar
->IsShown() )
2841 && ( m_vScrollBar
&& m_vScrollBar
->IsShown() ) )
2843 // Both scroll bars visible
2848 wxPoint thisWindowBottomRight
= GetScreenRect().GetBottomRight();
2850 for ( const wxWindow
*win
= this; win
; win
= win
->GetParent() )
2852 const wxFrame
*frame
= wxDynamicCast( win
, wxFrame
) ;
2855 if ( frame
->GetWindowStyleFlag() & wxRESIZE_BORDER
)
2857 // Parent frame has resize handle
2858 wxPoint frameBottomRight
= frame
->GetScreenRect().GetBottomRight();
2860 // Note: allow for some wiggle room here as wxMac's
2861 // window rect calculations seem to be imprecise
2862 if ( abs( thisWindowBottomRight
.x
- frameBottomRight
.x
) <= 2
2863 && abs( thisWindowBottomRight
.y
- frameBottomRight
.y
) <= 2 )
2865 // Parent frame has resize handle and shares
2866 // right bottom corner
2871 // Parent frame has resize handle but doesn't
2872 // share right bottom corner
2878 // Parent frame doesn't have resize handle
2884 // No parent frame found
2889 void wxWindowMac::MacCreateScrollBars( long style
)
2891 wxASSERT_MSG( m_vScrollBar
== NULL
&& m_hScrollBar
== NULL
, wxT("attempt to create window twice") ) ;
2893 if ( style
& ( wxVSCROLL
| wxHSCROLL
) )
2895 int scrlsize
= MAC_SCROLLBAR_SIZE
;
2896 if ( GetWindowVariant() == wxWINDOW_VARIANT_SMALL
|| GetWindowVariant() == wxWINDOW_VARIANT_MINI
)
2898 scrlsize
= MAC_SMALL_SCROLLBAR_SIZE
;
2901 int adjust
= MacHasScrollBarCorner() ? scrlsize
- 1: 0 ;
2903 GetClientSize( &width
, &height
) ;
2905 wxPoint
vPoint(width
- scrlsize
, 0) ;
2906 wxSize
vSize(scrlsize
, height
- adjust
) ;
2907 wxPoint
hPoint(0, height
- scrlsize
) ;
2908 wxSize
hSize(width
- adjust
, scrlsize
) ;
2910 // we have to set the min size to a smaller value, otherwise they cannot get smaller (InitialSize sets MinSize)
2911 if ( style
& wxVSCROLL
)
2913 m_vScrollBar
= new wxScrollBar((wxWindow
*)this, wxID_ANY
, vPoint
, vSize
, wxVERTICAL
);
2914 m_vScrollBar
->SetMinSize( wxDefaultSize
);
2917 if ( style
& wxHSCROLL
)
2919 m_hScrollBar
= new wxScrollBar((wxWindow
*)this, wxID_ANY
, hPoint
, hSize
, wxHORIZONTAL
);
2920 m_hScrollBar
->SetMinSize( wxDefaultSize
);
2924 // because the create does not take into account the client area origin
2925 // we might have a real position shift
2926 MacRepositionScrollBars() ;
2929 bool wxWindowMac::MacIsChildOfClientArea( const wxWindow
* child
) const
2931 bool result
= ((child
== NULL
) || ((child
!= m_hScrollBar
) && (child
!= m_vScrollBar
)));
2936 void wxWindowMac::MacRepositionScrollBars()
2938 if ( !m_hScrollBar
&& !m_vScrollBar
)
2941 int scrlsize
= m_hScrollBar
? m_hScrollBar
->GetSize().y
: ( m_vScrollBar
? m_vScrollBar
->GetSize().x
: MAC_SCROLLBAR_SIZE
) ;
2942 int adjust
= MacHasScrollBarCorner() ? scrlsize
- 1 : 0 ;
2944 // get real client area
2946 GetSize( &width
, &height
);
2948 width
-= MacGetLeftBorderSize() + MacGetRightBorderSize();
2949 height
-= MacGetTopBorderSize() + MacGetBottomBorderSize();
2951 wxPoint
vPoint( width
- scrlsize
, 0 ) ;
2952 wxSize
vSize( scrlsize
, height
- adjust
) ;
2953 wxPoint
hPoint( 0 , height
- scrlsize
) ;
2954 wxSize
hSize( width
- adjust
, scrlsize
) ;
2957 int x
= 0, y
= 0, w
, h
;
2958 GetSize( &w
, &h
) ;
2960 MacClientToRootWindow( &x
, &y
) ;
2961 MacClientToRootWindow( &w
, &h
) ;
2963 wxWindowMac
*iter
= (wxWindowMac
*)this ;
2965 int totW
= 10000 , totH
= 10000;
2968 if ( iter
->IsTopLevel() )
2970 iter
->GetSize( &totW
, &totH
) ;
2974 iter
= iter
->GetParent() ;
2988 if ( w
- x
>= totW
)
2993 if ( h
- y
>= totH
)
3001 m_vScrollBar
->SetSize( vPoint
.x
, vPoint
.y
, vSize
.x
, vSize
.y
, wxSIZE_ALLOW_MINUS_ONE
);
3003 m_hScrollBar
->SetSize( hPoint
.x
, hPoint
.y
, hSize
.x
, hSize
.y
, wxSIZE_ALLOW_MINUS_ONE
);
3006 bool wxWindowMac::AcceptsFocus() const
3008 return MacCanFocus() && wxWindowBase::AcceptsFocus();
3011 void wxWindowMac::MacSuperChangedPosition()
3013 // only window-absolute structures have to be moved i.e. controls
3015 m_cachedClippedRectValid
= false ;
3018 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
3021 child
= node
->GetData();
3022 child
->MacSuperChangedPosition() ;
3024 node
= node
->GetNext();
3028 void wxWindowMac::MacTopLevelWindowChangedPosition()
3030 // only screen-absolute structures have to be moved i.e. glcanvas
3033 wxWindowList::compatibility_iterator node
= GetChildren().GetFirst();
3036 child
= node
->GetData();
3037 child
->MacTopLevelWindowChangedPosition() ;
3039 node
= node
->GetNext();
3043 long wxWindowMac::MacGetLeftBorderSize() const
3050 if (HasFlag(wxRAISED_BORDER
) || HasFlag( wxSUNKEN_BORDER
) || HasFlag(wxDOUBLE_BORDER
))
3052 // this metric is only the 'outset' outside the simple frame rect
3053 GetThemeMetric( kThemeMetricEditTextFrameOutset
, &border
) ;
3056 else if (HasFlag(wxSIMPLE_BORDER
))
3058 // this metric is only the 'outset' outside the simple frame rect
3059 GetThemeMetric( kThemeMetricListBoxFrameOutset
, &border
) ;
3066 long wxWindowMac::MacGetRightBorderSize() const
3068 // they are all symmetric in mac themes
3069 return MacGetLeftBorderSize() ;
3072 long wxWindowMac::MacGetTopBorderSize() const
3074 // they are all symmetric in mac themes
3075 return MacGetLeftBorderSize() ;
3078 long wxWindowMac::MacGetBottomBorderSize() const
3080 // they are all symmetric in mac themes
3081 return MacGetLeftBorderSize() ;
3084 long wxWindowMac::MacRemoveBordersFromStyle( long style
)
3086 return style
& ~wxBORDER_MASK
;
3089 // Find the wxWindowMac at the current mouse position, returning the mouse
3091 wxWindowMac
* wxFindWindowAtPointer( wxPoint
& pt
)
3093 pt
= wxGetMousePosition();
3094 wxWindowMac
* found
= wxFindWindowAtPoint(pt
);
3099 // Get the current mouse position.
3100 wxPoint
wxGetMousePosition()
3104 wxGetMousePosition( &x
, &y
);
3106 return wxPoint(x
, y
);
3109 void wxWindowMac::OnMouseEvent( wxMouseEvent
&event
)
3111 if ( event
.GetEventType() == wxEVT_RIGHT_DOWN
)
3113 // copied from wxGTK : CS
3114 // VZ: shouldn't we move this to base class then?
3116 // generate a "context menu" event: this is similar to wxEVT_RIGHT_DOWN
3119 // (a) it's a command event and so is propagated to the parent
3120 // (b) under MSW it can be generated from kbd too
3121 // (c) it uses screen coords (because of (a))
3122 wxContextMenuEvent
evtCtx(wxEVT_CONTEXT_MENU
,
3124 this->ClientToScreen(event
.GetPosition()));
3125 evtCtx
.SetEventObject(this);
3126 if ( ! HandleWindowEvent(evtCtx
) )
3135 void wxWindowMac::OnPaint( wxPaintEvent
& WXUNUSED(event
) )
3137 if ( wxTheApp
->MacGetCurrentEvent() != NULL
&& wxTheApp
->MacGetCurrentEventHandlerCallRef() != NULL
3138 && GetBackgroundStyle() != wxBG_STYLE_TRANSPARENT
)
3139 CallNextEventHandler(
3140 (EventHandlerCallRef
)wxTheApp
->MacGetCurrentEventHandlerCallRef() ,
3141 (EventRef
) wxTheApp
->MacGetCurrentEvent() ) ;
3144 void wxWindowMac::MacHandleControlClick(WXWidget
WXUNUSED(control
),
3145 wxInt16
WXUNUSED(controlpart
),
3146 bool WXUNUSED(mouseStillDown
))
3150 Rect
wxMacGetBoundsForControl( wxWindow
* window
, const wxPoint
& pos
, const wxSize
&size
, bool adjustForOrigin
)
3154 window
->MacGetBoundsForControl( pos
, size
, x
, y
, w
, h
, adjustForOrigin
) ;
3155 Rect bounds
= { y
, x
, y
+ h
, x
+ w
};
3160 wxInt32
wxWindowMac::MacControlHit(WXEVENTHANDLERREF
WXUNUSED(handler
) , WXEVENTREF
WXUNUSED(event
) )
3162 return eventNotHandledErr
;
3165 bool wxWindowMac::Reparent(wxWindowBase
*newParentBase
)
3167 wxWindowMac
*newParent
= (wxWindowMac
*)newParentBase
;
3168 if ( !wxWindowBase::Reparent(newParent
) )
3171 // copied from MacPostControlCreate
3172 ControlRef container
= (ControlRef
) GetParent()->GetHandle() ;
3174 wxASSERT_MSG( container
!= NULL
, wxT("No valid mac container control") ) ;
3176 ::EmbedControl( m_peer
->GetControlRef() , container
) ;
3181 bool wxWindowMac::SetTransparent(wxByte alpha
)
3183 SetBackgroundStyle(wxBG_STYLE_TRANSPARENT
);
3185 if ( alpha
!= m_macAlpha
)
3187 m_macAlpha
= alpha
;
3194 bool wxWindowMac::CanSetTransparent()
3199 wxByte
wxWindowMac::GetTransparent() const
3204 bool wxWindowMac::IsShownOnScreen() const
3206 #if TARGET_API_MAC_OSX
3207 if ( m_peer
&& m_peer
->Ok() )
3209 bool peerVis
= m_peer
->IsVisible();
3210 bool wxVis
= wxWindowBase::IsShownOnScreen();
3211 if( peerVis
!= wxVis
)
3213 // CS : put a breakpoint here to investigate differences
3214 // between native an wx visibilities
3215 // the only place where I've encountered them until now
3216 // are the hiding/showing sequences where the vis-changed event is
3217 // first sent to the innermost control, while wx does things
3218 // from the outmost control
3219 wxVis
= wxWindowBase::IsShownOnScreen();
3223 return m_peer
->IsVisible();
3227 return wxWindowBase::IsShownOnScreen();