]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toplevel.cpp
supporting readonly and singleline attributes for non-mlte textrcontrol
[wxWidgets.git] / src / mac / carbon / toplevel.cpp
index d5bcdee8210fcbe502a4e329d7b780452ae1a382..64d7065dd5bdb6bb565cfbb591c009423d90799a 100644 (file)
@@ -158,6 +158,9 @@ static pascal OSStatus KeyboardEventHandler( EventHandlerCallRef handler , Event
     OSStatus result = eventNotHandledErr ;
 
     wxWindow* focus = wxWindow::FindFocus() ;
+    if ( focus == NULL )
+        return result ;
+        
     char charCode ;
     UInt32 keyCode ;
     UInt32 modifiers ;
@@ -294,7 +297,7 @@ static void SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent )
     if ( button == kEventMouseButtonSecondary )
     {
         if (cEvent.GetKind() == kEventMouseDown )
-            wxevent.SetEventType( clickCount > 1 ? wxEVT_RIGHT_DOWN : wxEVT_RIGHT_DCLICK ) ;
+            wxevent.SetEventType( clickCount > 1 ? wxEVT_RIGHT_DCLICK : wxEVT_RIGHT_DOWN ) ;
         else if ( cEvent.GetKind() == kEventMouseUp )
             wxevent.SetEventType(wxEVT_RIGHT_UP ) ;
     }
@@ -369,12 +372,13 @@ ControlRef wxMacFindSubControl( Point location , ControlRef superControl , Contr
 ControlRef wxMacFindControlUnderMouse( Point location , WindowRef window , ControlPartCode *outPart )
 {
 #if TARGET_API_MAC_OSX
-    return FindControlUnderMouse( location , window , outPart ) ;
-#else
+    if ( UMAGetSystemVersion() >= 1030 )
+        return FindControlUnderMouse( location , window , outPart ) ;
+#endif
     ControlRef rootControl = NULL ;
     verify_noerr( GetRootControl( window , &rootControl ) ) ;
     return wxMacFindSubControl( location , rootControl , outPart ) ;
-#endif
+
 }
 pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
 {
@@ -493,6 +497,22 @@ pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , Ev
     #endif // wxUSE_TOOLTIPS                
         if ( currentMouseWindow->GetEventHandler()->ProcessEvent(wxevent) )
             result = noErr;
+        else
+        {
+            ControlPartCode dummyPart ;
+            // if built-in find control is finding the wrong control (ie static box instead of overlaid
+            // button, we cannot let the standard handler do its job, but must handle manually
+
+            if ( ( cEvent.GetKind() == kEventMouseDown ) && 
+                (FindControlUnderMouse(windowMouseLocation , window , &dummyPart) != 
+                wxMacFindControlUnderMouse( windowMouseLocation , window , &dummyPart ) ) )
+            {
+                EventModifiers modifiers = cEvent.GetParameter<EventModifiers>(kEventParamKeyModifiers, typeUInt32) ;
+                HandleControlClick( (ControlRef) currentMouseWindow->GetHandle() , windowMouseLocation ,
+                    modifiers , (ControlActionUPP ) -1 ) ;
+                result = noErr ;
+            }
+        }
         if ( cEvent.GetKind() == kEventMouseUp && wxTheApp->s_captureWindow )
         {
             wxTheApp->s_captureWindow = NULL ;
@@ -579,18 +599,21 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
         {
             UInt32 attributes = cEvent.GetParameter<UInt32>(kEventParamAttributes,typeUInt32) ;
             Rect newRect = cEvent.GetParameter<Rect>(kEventParamCurrentBounds) ;
-            wxRect r( newRect.left , newRect.top , newRect.right - newRect.left , newRect.bottom - newRect.top ) ;
 
             if ( (attributes & kWindowBoundsChangeSizeChanged) || (attributes & kWindowBoundsChangeOriginChanged) )
             {
+                // all (Mac) rects are in content area coordinates, all wxRects in structure coordinates
+                int left , top , right , bottom ;
+                toplevelWindow->MacGetContentAreaInset( left , top , right , bottom ) ;
+                wxRect r( newRect.left - left  , newRect.top  - top  , 
+                    newRect.right - newRect.left + left + right  , newRect.bottom - newRect.top + top + bottom ) ;
                 // this is a EVT_SIZING not a EVT_SIZE type !
                 wxSizeEvent wxevent( r , toplevelWindow->GetId() ) ;
                 wxevent.SetEventObject( toplevelWindow ) ;
                 wxRect adjustR = r ;
                 if ( toplevelWindow->GetEventHandler()->ProcessEvent(wxevent) )
-                {
                     adjustR = wxevent.GetRect() ;
-                }
+
                 if ( toplevelWindow->GetMaxWidth() != -1 && adjustR.GetWidth() > toplevelWindow->GetMaxWidth() )
                     adjustR.SetWidth( toplevelWindow->GetMaxWidth() ) ;
                 if ( toplevelWindow->GetMaxHeight() != -1 && adjustR.GetHeight() > toplevelWindow->GetMaxHeight() )
@@ -599,7 +622,7 @@ static pascal OSStatus wxMacTopLevelWindowEventHandler( EventHandlerCallRef hand
                     adjustR.SetWidth( toplevelWindow->GetMinWidth() ) ;
                 if ( toplevelWindow->GetMinHeight() != -1 && adjustR.GetHeight() < toplevelWindow->GetMinHeight() )
                     adjustR.SetHeight( toplevelWindow->GetMinHeight() ) ;
-                Rect adjustedRect = { adjustR.y , adjustR.x , adjustR.y + adjustR.height , adjustR.x + adjustR.width } ;
+                Rect adjustedRect = { adjustR.y + top  , adjustR.x + left , adjustR.y + adjustR.height - bottom , adjustR.x + adjustR.width - right } ;
                 if ( !EqualRect( &newRect , &adjustedRect ) )
                     cEvent.SetParameter( kEventParamCurrentBounds , &adjustedRect ) ;
             }
@@ -956,6 +979,11 @@ void  wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
     }
 
     wxCHECK_RET( err == noErr, wxT("Mac OS error when trying to create new window") );
+
+    // the create commands are only for content rect, so we have to set the size again as
+    // structure bounds 
+    SetWindowBounds(  (WindowRef) m_macWindow , kWindowStructureRgn , &theBoundsRect ) ;
+
     wxAssociateWinWithMacWindow( (WindowRef) m_macWindow , this ) ;
     UMASetWTitle( (WindowRef) m_macWindow , title , m_font.GetEncoding() ) ;
     if ( m_macUsesCompositing )
@@ -1073,6 +1101,19 @@ bool wxTopLevelWindowMac::Show(bool show)
 
 // we are still using coordinates of the content view, todo switch to structure bounds
 
+void wxTopLevelWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom )
+{
+    Rect content ;
+    Rect structure ;
+    GetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &structure ) ;
+    GetWindowBounds( (WindowRef) m_macWindow, kWindowContentRgn , &content ) ;
+
+    left = content.left - structure.left ;
+    top = content.top  - structure.top ;
+    right = structure.right - content.right ;
+    bottom = structure.bottom - content.bottom ;
+}
+
 void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height)
 {
     Rect bounds = { y , x , y + height , x + width } ;