X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/33faea0a0d17e22a771d96573576bf143fd56e54..243f5c2d917b77474b6d159fc338ec669d70cc91:/src/cocoa/toplevel.mm diff --git a/src/cocoa/toplevel.mm b/src/cocoa/toplevel.mm index 39fa6a5b25..de8ad02661 100644 --- a/src/cocoa/toplevel.mm +++ b/src/cocoa/toplevel.mm @@ -29,10 +29,12 @@ #endif //WX_PRECOMP #include "wx/cocoa/autorelease.h" +#include "wx/cocoa/string.h" #include "wx/cocoa/mbarman.h" #import #import +#import // ---------------------------------------------------------------------------- // globals // ---------------------------------------------------------------------------- @@ -58,6 +60,26 @@ void wxTopLevelWindowCocoa::Init() m_closed = false; } +unsigned int wxTopLevelWindowCocoa::NSWindowStyleForWxStyle(long style) +{ + unsigned int styleMask = 0; + if(style & wxCAPTION) + styleMask |= NSTitledWindowMask; + if(style & wxMINIMIZE_BOX) + styleMask |= NSMiniaturizableWindowMask; + #if 0 + if(style & wxMAXIMIZE_BOX) + styleMask |= NSWindowMask; + #endif + if(style & wxCLOSE_BOX) + styleMask |= NSClosableWindowMask; + if(style & wxRESIZE_BORDER) + styleMask |= NSResizableWindowMask; + if(style & wxSIMPLE_BORDER) + styleMask |= NSBorderlessWindowMask; + return styleMask; +} + bool wxTopLevelWindowCocoa::Create(wxWindow *parent, wxWindowID winid, const wxString& title, @@ -75,24 +97,29 @@ bool wxTopLevelWindowCocoa::Create(wxWindow *parent, if ( parent ) parent->AddChild(this); - // TODO: get rect from given position/size - NSRect cocoaRect = NSMakeRect(100,100,200,200); + unsigned int cocoaStyle = NSWindowStyleForWxStyle(style); + if(style & wxFRAME_TOOL_WINDOW) + cocoaStyle |= NSUtilityWindowMask; - // TODO: Set flags given wxWindows style - unsigned int cocoaStyle = 0; - cocoaStyle |= NSTitledWindowMask; - cocoaStyle |= NSClosableWindowMask; - cocoaStyle |= NSMiniaturizableWindowMask; - cocoaStyle |= NSResizableWindowMask; + // NOTE: y-origin needs to be flipped. + NSRect cocoaRect = [NSWindow contentRectForFrameRect:NSMakeRect(pos.x,pos.y,size.x,size.y) styleMask:cocoaStyle]; m_cocoaNSWindow = NULL; m_cocoaNSView = NULL; - SetNSWindow([[NSWindow alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO]); + if(style & wxFRAME_TOOL_WINDOW) + SetNSWindow([[NSPanel alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO]); + else + SetNSWindow([[NSWindow alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO]); // NOTE: SetNSWindow has retained the Cocoa object for this object. // Because we do not release on close, the following release matches the // above alloc and thus the retain count will be 1. [m_cocoaNSWindow release]; + if(style & wxFRAME_NO_TASKBAR) + [m_cocoaNSWindow setExcludedFromWindowsMenu: YES]; + if(style & wxSTAY_ON_TOP) + [m_cocoaNSWindow setLevel:NSFloatingWindowLevel]; + [m_cocoaNSWindow setTitle:wxNSStringWithWxString(title)]; return TRUE; } @@ -107,6 +134,14 @@ wxTopLevelWindowCocoa::~wxTopLevelWindowCocoa() // wxTopLevelWindowCocoa Cocoa Specifics // ---------------------------------------------------------------------------- +wxMenuBar* wxTopLevelWindowCocoa::GetAppMenuBar(wxCocoaNSWindow *win) +{ + wxTopLevelWindowCocoa *parent = wxDynamicCast(GetParent(),wxTopLevelWindow); + if(parent) + return parent->GetAppMenuBar(win); + return NULL; +} + void wxTopLevelWindowCocoa::SetNSWindow(WX_NSWindow cocoaNSWindow) { bool need_debug = cocoaNSWindow || m_cocoaNSWindow; @@ -132,7 +167,6 @@ void wxTopLevelWindowCocoa::CocoaReplaceView(WX_NSView oldView, WX_NSView newVie void wxTopLevelWindowCocoa::CocoaDelegate_windowDidBecomeKey(void) { wxLogDebug("wxTopLevelWindowCocoa=%p::CocoaDelegate_windowDidBecomeKey",this); - wxMenuBarManager::GetInstance()->WindowDidBecomeKey(this); wxActivateEvent event(wxEVT_ACTIVATE, TRUE, GetId()); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); @@ -144,22 +178,19 @@ void wxTopLevelWindowCocoa::CocoaDelegate_windowDidResignKey(void) wxActivateEvent event(wxEVT_ACTIVATE, FALSE, GetId()); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); - wxMenuBarManager::GetInstance()->WindowDidResignKey(this); } void wxTopLevelWindowCocoa::CocoaDelegate_windowDidBecomeMain(void) { wxLogDebug("wxTopLevelWindowCocoa=%p::CocoaDelegate_windowDidBecomeMain",this); - wxMenuBarManager::GetInstance()->WindowDidBecomeMain(this); } void wxTopLevelWindowCocoa::CocoaDelegate_windowDidResignMain(void) { wxLogDebug("wxTopLevelWindowCocoa=%p::CocoaDelegate_windowDidResignMain",this); - wxMenuBarManager::GetInstance()->WindowDidResignMain(this); } -void wxTopLevelWindowCocoa::Cocoa_close(void) +void wxTopLevelWindowCocoa::CocoaDelegate_windowWillClose(void) { m_closed = true; Destroy(); @@ -230,8 +261,8 @@ bool wxTopLevelWindowCocoa::Close(bool force) // will invoke windowShouldClose which will call the base class version // of Close() which will NOT Destroy() the window (see below) but // if closing is not stopped, then performClose will go ahead and - // close the window which will invoke Cocoa_close() setting m_closed - // to true and Destroy()ing the window. + // close the window which will send the close notifications setting + // m_closed to true and Destroy()ing the window. [m_cocoaNSWindow performClose:m_cocoaNSWindow]; return m_closed; }