]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/nonownedwnd.mm
If there is a sizer then use it's calculated minimum in wxStaticBox::DoGetBestSize
[wxWidgets.git] / src / osx / cocoa / nonownedwnd.mm
index 1cd9e84b4866256c5cc2ba542559a7b4f9c58aaa..a83bd48ba0e50b95d1c731cb3ef18c73da1553ae 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      DavidStefan Csomor
 // Modified by:
 // Created:     2008-06-20
-// RCS-ID:      $Id: nonownedwnd.mm 48805 2007-09-19 14:52:25Z SC $
+// RCS-ID:      $Id$
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -15,6 +15,8 @@
     #include "wx/frame.h"
     #include "wx/app.h"
     #include "wx/dialog.h"
+    #include "wx/menuitem.h"
+    #include "wx/menu.h"
 #endif
 
 #include "wx/osx/private.h"
@@ -77,6 +79,7 @@ bool shouldHandleSelector(SEL selector)
             || selector == @selector(deleteForward:)
             || selector == @selector(insertNewline:)
             || selector == @selector(insertTab:)
+            || selector == @selector(insertBacktab:)
             || selector == @selector(keyDown:)
             || selector == @selector(keyUp:)
             || selector == @selector(scrollPageUp:)
@@ -117,12 +120,22 @@ bool shouldHandleSelector(SEL selector)
     bool handled = false;
     if ( ([event type] >= NSLeftMouseDown) && ([event type] <= NSMouseExited) )
     {
+        WXEVENTREF formerEvent = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEvent();
+        WXEVENTHANDLERCALLREF formerHandler = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEventHandlerCallRef();
+
         wxWindow* cw = wxWindow::GetCapture();
         if ( cw != NULL )
         {
+            if (wxTheApp)
+                wxTheApp->MacSetCurrentEvent(event, NULL);
             ((wxWidgetCocoaImpl*)cw->GetPeer())->DoHandleMouseEvent( event);
             handled = true;
         }
+        if ( handled )
+        {
+            if (wxTheApp)
+                wxTheApp->MacSetCurrentEvent(formerEvent , formerHandler);
+        }
     }
     return handled;
 }
@@ -199,12 +212,22 @@ bool shouldHandleSelector(SEL selector)
 {
 }
 
+- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen;
 - (void)noResponderFor: (SEL) selector;
 - (void)sendEvent:(NSEvent *)event;
 @end
 
 @implementation wxNSPanel
 
+- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
+{
+    wxNonOwnedWindowCocoaImpl* impl = (wxNonOwnedWindowCocoaImpl*) wxNonOwnedWindowImpl::FindFromWXWindow( self );
+    if (impl && impl->IsFullScreen())
+        return frameRect;
+    else
+        return [super constrainFrameRect:frameRect toScreen:screen];
+}
+
 - (BOOL)canBecomeKeyWindow
 {
     return YES;
@@ -228,7 +251,18 @@ bool shouldHandleSelector(SEL selector)
 - (void)sendEvent:(NSEvent *) event
 {
     if ( ![self WX_filterSendEvent: event] )
+    {
+        WXEVENTREF formerEvent = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEvent();
+        WXEVENTHANDLERCALLREF formerHandler = wxTheApp == NULL ? NULL : wxTheApp->MacGetCurrentEventHandlerCallRef();
+        
+        if (wxTheApp)
+            wxTheApp->MacSetCurrentEvent(event, NULL);
+        
         [super sendEvent: event];
+        
+        if (wxTheApp)
+            wxTheApp->MacSetCurrentEvent(formerEvent , formerHandler);
+    }
 }
 
 @end
@@ -252,14 +286,89 @@ bool shouldHandleSelector(SEL selector)
 
 @end
 
+extern int wxOSXGetIdFromSelector(SEL action );
+
 @implementation wxNonOwnedWindowController
 
 - (id) init
 {
-    [super init];
+    self = [super init];
     return self;
 }
 
+- (BOOL) triggerMenu:(SEL) action
+{
+    wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar();
+    if ( mbar )
+    {
+        wxMenu* menu = NULL;
+        wxMenuItem* menuitem = mbar->FindItem(wxOSXGetIdFromSelector(action), &menu);
+        if ( menu != NULL && menuitem != NULL)
+            return menu->HandleCommandProcess(menuitem);
+    }
+    return NO;
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)menuItem 
+{    
+    SEL action = [menuItem action];
+
+    wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar();
+    if ( mbar )
+    {
+        wxMenu* menu = NULL;
+        wxMenuItem* menuitem = mbar->FindItem(wxOSXGetIdFromSelector(action), &menu);
+        if ( menu != NULL && menuitem != NULL)
+        {
+            menu->HandleCommandUpdateStatus(menuitem);
+            return menuitem->IsEnabled();
+        }
+    }
+    return YES;
+}
+
+- (void)undo:(id)sender 
+{
+    wxUnusedVar(sender);
+    [self triggerMenu:_cmd];
+}
+
+- (void)redo:(id)sender 
+{
+    wxUnusedVar(sender);
+    [self triggerMenu:_cmd];
+}
+
+- (void)cut:(id)sender 
+{
+    wxUnusedVar(sender);
+    [self triggerMenu:_cmd];
+}
+
+- (void)copy:(id)sender
+{
+    wxUnusedVar(sender);
+    [self triggerMenu:_cmd];
+}
+
+- (void)paste:(id)sender
+{
+    wxUnusedVar(sender);
+    [self triggerMenu:_cmd];
+}
+
+- (void)delete:(id)sender 
+{
+    wxUnusedVar(sender);
+    [self triggerMenu:_cmd];
+}
+
+- (void)selectAll:(id)sender 
+{
+    wxUnusedVar(sender);
+    [self triggerMenu:_cmd];
+}
+
 - (BOOL)windowShouldClose:(id)nwindow
 {
     wxNonOwnedWindowCocoaImpl* windowimpl = [(NSWindow*) nwindow WX_implementation];
@@ -364,10 +473,11 @@ bool shouldHandleSelector(SEL selector)
             editor = [[wxNSTextFieldEditor alloc] init];
             [editor setFieldEditor:YES];
             [tf setFieldEditor:editor];
+            [editor release];
         }
         return editor;
-    }
-
+    } 
     return nil;
 }
 
@@ -443,30 +553,10 @@ long style, long extraStyle, const wxString& WXUNUSED(name) )
     if ( style & wxFRAME_TOOL_WINDOW )
     {
         windowstyle |= NSUtilityWindowMask;
-        if ( ( style & wxMINIMIZE_BOX ) || ( style & wxMAXIMIZE_BOX ) ||
-            ( style & wxCLOSE_BOX ) || ( style & wxSYSTEM_MENU ) )
-        {
-            windowstyle |= NSTitledWindowMask ;
-        }
     }
     else if ( ( style & wxPOPUP_WINDOW ) )
     {
         level = kCGPopUpMenuWindowLevel;
-        /*
-        if ( ( style & wxBORDER_NONE ) )
-        {
-            wclass = kHelpWindowClass ;   // has no border
-            attr |= kWindowNoShadowAttribute;
-        }
-        else
-        {
-            wclass = kPlainWindowClass ;  // has a single line border, it will have to do for now
-        }
-        */
-    }
-    else if ( ( style & wxCAPTION ) )
-    {
-        windowstyle |= NSTitledWindowMask ;
     }
     else if ( ( style & wxFRAME_DRAWER ) )
     {
@@ -474,40 +564,24 @@ long style, long extraStyle, const wxString& WXUNUSED(name) )
         wclass = kDrawerWindowClass;
         */
     }
-    else
-    {
-        // set these even if we have no title, otherwise the controls won't be visible
-        if ( ( style & wxMINIMIZE_BOX ) || ( style & wxMAXIMIZE_BOX ) ||
-            ( style & wxCLOSE_BOX ) || ( style & wxSYSTEM_MENU ) )
-        {
-            windowstyle |= NSTitledWindowMask ;
-        }
-        /*
-        else if ( ( style & wxNO_BORDER ) )
-        {
-            wclass = kSimpleWindowClass ;
-        }
-        else
-        {
-            wclass = kPlainWindowClass ;
-        }
-        */
-    }
-
-    if ( windowstyle & NSTitledWindowMask )
+    if ( ( style & wxMINIMIZE_BOX ) || ( style & wxMAXIMIZE_BOX ) ||
+        ( style & wxCLOSE_BOX ) || ( style & wxSYSTEM_MENU ) || ( style & wxCAPTION ) )
     {
+        windowstyle |= NSTitledWindowMask ;
         if ( ( style & wxMINIMIZE_BOX ) )
             windowstyle |= NSMiniaturizableWindowMask ;
-
+        
         if ( ( style & wxMAXIMIZE_BOX ) )
-            windowstyle |= NSResizableWindowMask ; // TODO showing ZOOM ?
-
-        if ( ( style & wxRESIZE_BORDER ) )
             windowstyle |= NSResizableWindowMask ;
-
+        
         if ( ( style & wxCLOSE_BOX) )
             windowstyle |= NSClosableWindowMask ;
     }
+    
+    if ( ( style & wxRESIZE_BORDER ) )
+        windowstyle |= NSResizableWindowMask ;
+
     if ( extraStyle & wxFRAME_EX_METAL)
         windowstyle |= NSTexturedBackgroundWindowMask;
 
@@ -526,7 +600,16 @@ long style, long extraStyle, const wxString& WXUNUSED(name) )
         backing:NSBackingStoreBuffered
         defer:NO
         ];
-
+    
+    // if we just have a title bar with no buttons needed, hide them
+    if ( (windowstyle & NSTitledWindowMask) && 
+        !(style & wxCLOSE_BOX) && !(style & wxMAXIMIZE_BOX) && !(style & wxMINIMIZE_BOX) )
+    {
+        [[m_macWindow standardWindowButton:NSWindowZoomButton] setHidden:YES];
+        [[m_macWindow standardWindowButton:NSWindowCloseButton] setHidden:YES];
+        [[m_macWindow standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
+    }
+    
     // If the parent is modal, windows with wxFRAME_FLOAT_ON_PARENT style need
     // to be in kCGUtilityWindowLevel and not kCGFloatingWindowLevel to stay
     // above the parent.
@@ -551,11 +634,10 @@ long style, long extraStyle, const wxString& WXUNUSED(name) )
     }
 
     [m_macWindow setLevel:level];
+    m_macWindowLevel = level;
 
     [m_macWindow setDelegate:controller];
 
-    [m_macWindow setAcceptsMouseMovedEvents: YES];
-    
     if ( ( style & wxFRAME_SHAPED) )
     {
         [m_macWindow setOpaque:NO];
@@ -578,7 +660,7 @@ WXWindow wxNonOwnedWindowCocoaImpl::GetWXWindow() const
 
 void wxNonOwnedWindowCocoaImpl::Raise()
 {
-    [m_macWindow orderWindow:NSWindowAbove relativeTo:0];
+    [m_macWindow makeKeyAndOrderFront:nil];
 }
 
 void wxNonOwnedWindowCocoaImpl::Lower()
@@ -627,8 +709,12 @@ bool wxNonOwnedWindowCocoaImpl::SetTransparent(wxByte alpha)
     return true;
 }
 
-bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& WXUNUSED(col) )
+bool wxNonOwnedWindowCocoaImpl::SetBackgroundColour(const wxColour& col )
 {
+    [m_macWindow setBackgroundColor:[NSColor colorWithCalibratedRed:(CGFloat) (col.Red() / 255.0)
+                                                             green:(CGFloat) (col.Green() / 255.0)
+                                                              blue:(CGFloat) (col.Blue() / 255.0)
+                                                             alpha:(CGFloat) (col.Alpha() / 255.0)]];
     return true;
 }
 
@@ -661,6 +747,7 @@ void wxNonOwnedWindowCocoaImpl::SetWindowStyleFlag( long style )
             level = kCGFloatingWindowLevel;
         
         [m_macWindow setLevel: level];
+        m_macWindowLevel = level;
     }
 }
 
@@ -703,8 +790,6 @@ void wxNonOwnedWindowCocoaImpl::GetSize( int &width, int &height ) const
 
 void wxNonOwnedWindowCocoaImpl::GetContentArea( int& left, int &top, int &width, int &height ) const
 {
-    NSRect outer = NSMakeRect(100,100,100,100);
-    NSRect content = [NSWindow contentRectForFrameRect:outer styleMask:[m_macWindow styleMask] ];
     NSRect rect = [[m_macWindow contentView] frame];
     left = (int)rect.origin.x;
     top = (int)rect.origin.y;
@@ -765,6 +850,7 @@ void wxNonOwnedWindowCocoaImpl::Maximize(bool WXUNUSED(maximize))
 
 typedef struct
 {
+    NSUInteger m_formerStyleMask;
     int m_formerLevel;
     NSRect m_formerFrame;
 } FullScreenData ;
@@ -785,18 +871,50 @@ bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long WXUNUSED(style))
         m_macFullScreenData = data ;
         data->m_formerLevel = [m_macWindow level];
         data->m_formerFrame = [m_macWindow frame];
-        CGDisplayCapture( kCGDirectMainDisplay );
-        [m_macWindow setLevel:CGShieldingWindowLevel()];
-        [m_macWindow setFrame:[[NSScreen mainScreen] frame] display:YES];
+        data->m_formerStyleMask = [m_macWindow styleMask];
+#if 0
+        // CGDisplayCapture( kCGDirectMainDisplay );
+        //[m_macWindow setLevel:NSMainMenuWindowLevel+1/*CGShieldingWindowLevel()*/];
+#endif
+        NSRect screenframe = [[NSScreen mainScreen] frame];
+        NSRect frame = NSMakeRect (0, 0, 100, 100);
+        NSRect contentRect;
+
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+        if ( [ m_macWindow respondsToSelector:@selector(setStyleMask:) ] )
+            [m_macWindow setStyleMask:data->m_formerStyleMask & ~ NSResizableWindowMask];
+#endif
+        
+        contentRect = [NSWindow contentRectForFrameRect: frame
+                                styleMask: [m_macWindow styleMask]];
+        screenframe.origin.y += (frame.origin.y - contentRect.origin.y);
+        screenframe.size.height += (frame.size.height - contentRect.size.height);
+        [m_macWindow setFrame:screenframe display:YES];
+
+        SetSystemUIMode(kUIModeAllHidden,
+                                kUIOptionDisableAppleMenu
+                        /*
+                                | kUIOptionDisableProcessSwitch
+                                | kUIOptionDisableForceQuit
+                         */); 
     }
     else if ( m_macFullScreenData != NULL )
     {
         FullScreenData *data = (FullScreenData *) m_macFullScreenData ;
-        CGDisplayRelease( kCGDirectMainDisplay );
-        [m_macWindow setLevel:data->m_formerLevel];
+#if 0
+        // CGDisplayRelease( kCGDirectMainDisplay );
+        // [m_macWindow setLevel:data->m_formerLevel];
+#endif
+        
         [m_macWindow setFrame:data->m_formerFrame display:YES];
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+        if ( [ m_macWindow respondsToSelector:@selector(setStyleMask:) ] )
+            [m_macWindow setStyleMask:data->m_formerStyleMask];
+#endif
         delete data ;
         m_macFullScreenData = NULL ;
+
+        SetSystemUIMode(kUIModeNormal, 0); 
     }
 
     return true;
@@ -864,6 +982,21 @@ bool wxNonOwnedWindowCocoaImpl::IsModified() const
     return [m_macWindow isDocumentEdited];
 }
 
+void wxNonOwnedWindowCocoaImpl::SetRepresentedFilename(const wxString& filename)
+{
+    [m_macWindow setRepresentedFilename:wxCFStringRef(filename).AsNSString()];
+}
+
+void wxNonOwnedWindowCocoaImpl::RestoreWindowLevel()
+{
+    if ( [m_macWindow level] != m_macWindowLevel )
+        [m_macWindow setLevel:m_macWindowLevel];
+}
+
+//
+//
+//
+
 wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, WXWindow nativeWindow)
 {
     wxNonOwnedWindowCocoaImpl* now = new wxNonOwnedWindowCocoaImpl( wxpeer );
@@ -878,3 +1011,4 @@ wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWind
     now->Create( parent, pos, size, style , extraStyle, name );
     return now;
 }
+