wxNonOwnedWindowCocoaImpl* impl;
}
+- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen;
- (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation;
- (wxNonOwnedWindowCocoaImpl*) implementation;
- (void)noResponderFor: (SEL) selector;
@implementation wxNSWindow
+// The default implementation always moves the window back onto the screen,
+// even when the programmer explicitly wants to hide it.
+- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
+{
+ wxUnusedVar(screen);
+ return frameRect;
+}
+
- (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation
{
impl = theImplementation;
}
}
+// We need this for borderless windows, i.e. shaped windows or windows without
+// a title bar. For more info, see:
+// http://lists.apple.com/archives/cocoa-dev/2008/May/msg02091.html
+- (BOOL)canBecomeKeyWindow
+{
+ return YES;
+}
+
@end
@interface wxNSPanel : NSPanel
// controller
//
-@interface wxNonOwnedWindowController : NSObject
+@interface wxNonOwnedWindowController : NSObject wxOSX_10_6_AND_LATER(<NSWindowDelegate>)
{
}
- (void)windowDidBecomeKey:(NSNotification *)notification;
- (void)windowDidMove:(NSNotification *)notification;
- (BOOL)windowShouldClose:(id)window;
+- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame;
@end
return nil;
}
+- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame
+{
+ wxNonOwnedWindowCocoaImpl* windowimpl = [(wxNSWindow*)window implementation];
+ if ( windowimpl )
+ {
+ wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer();
+ wxMaximizeEvent event(wxpeer->GetId());
+ event.SetEventObject(wxpeer);
+ return !wxpeer->HandleWindowEvent(event);
+ }
+ return true;
+}
+
@end
IMPLEMENT_DYNAMIC_CLASS( wxNonOwnedWindowCocoaImpl , wxNonOwnedWindowImpl )
[m_macWindow release];
}
-void wxNonOwnedWindowCocoaImpl::Destroy()
+void wxNonOwnedWindowCocoaImpl::WillBeDestroyed()
{
- wxPendingDelete.Append( new wxDeferredObjectDeleter( this ) );
+ [m_macWindow setDelegate:nil];
}
void wxNonOwnedWindowCocoaImpl::Create( wxWindow* WXUNUSED(parent), const wxPoint& pos, const wxSize& size,
NSRect r = wxToNSRect( NULL, wxRect( pos, size) );
[m_macWindow setImplementation:this];
+ r = [NSWindow contentRectForFrameRect:r styleMask:windowstyle];
[m_macWindow initWithContentRect:r
styleMask:windowstyle
[m_macWindow orderWindow:NSWindowBelow relativeTo:0];
}
+void wxNonOwnedWindowCocoaImpl::ShowWithoutActivating()
+{
+ [m_macWindow orderFront:nil];
+ [[m_macWindow contentView] setNeedsDisplay: YES];
+}
+
bool wxNonOwnedWindowCocoaImpl::Show(bool show)
{
if ( show )
{
wxNonOwnedWindow* wxpeer = GetWXPeer();
if (wxpeer && !(wxpeer->GetWindowStyle() & wxFRAME_TOOL_WINDOW))
- [m_macWindow makeKeyAndOrderFront:nil];
+ [m_macWindow makeKeyAndOrderFront:nil];
else
[m_macWindow orderFront:nil];
-
- [[m_macWindow contentView] setNeedsDisplay:YES];
+ [[m_macWindow contentView] setNeedsDisplay: YES];
}
else
[m_macWindow orderOut:nil];
}
}
-bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle WXUNUSED(style))
+void wxNonOwnedWindowCocoaImpl::SetWindowStyleFlag( long style )
+{
+ if (m_macWindow)
+ {
+ CGWindowLevel level = kCGNormalWindowLevel;
+
+ if (style & wxSTAY_ON_TOP)
+ level = kCGUtilityWindowLevel;
+ else if (( style & wxFRAME_FLOAT_ON_PARENT ) || ( style & wxFRAME_TOOL_WINDOW ))
+ level = kCGFloatingWindowLevel;
+
+ [m_macWindow setLevel: level];
+ }
+}
+
+bool wxNonOwnedWindowCocoaImpl::SetBackgroundStyle(wxBackgroundStyle style)
{
+ if ( style == wxBG_STYLE_TRANSPARENT )
+ {
+ [m_macWindow setOpaque:NO];
+ [m_macWindow setBackgroundColor:[NSColor clearColor]];
+ }
+
return true;
}
bool wxNonOwnedWindowCocoaImpl::SetShape(const wxRegion& WXUNUSED(region))
{
- return false;
+ [m_macWindow setOpaque:NO];
+ [m_macWindow setBackgroundColor:[NSColor clearColor]];
+
+ return true;
}
void wxNonOwnedWindowCocoaImpl::SetTitle( const wxString& title, wxFontEncoding encoding )
bool wxNonOwnedWindowCocoaImpl::IsMaximized() const
{
- return [m_macWindow isZoomed];
+ if (([m_macWindow styleMask] & NSResizableWindowMask) != 0)
+ {
+ return [m_macWindow isZoomed];
+ }
+ else
+ {
+ NSRect rectScreen = [[NSScreen mainScreen] visibleFrame];
+ NSRect rectWindow = [m_macWindow frame];
+ return (rectScreen.origin.x == rectWindow.origin.x &&
+ rectScreen.origin.y == rectWindow.origin.y &&
+ rectScreen.size.width == rectWindow.size.width &&
+ rectScreen.size.height == rectWindow.size.height);
+ }
}
bool wxNonOwnedWindowCocoaImpl::IsIconized() const
return true;
}
-void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int WXUNUSED(flags))
+void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int flagsWX)
{
+ NSRequestUserAttentionType flagsOSX;
+ switch ( flagsWX )
+ {
+ case wxUSER_ATTENTION_INFO:
+ flagsOSX = NSInformationalRequest;
+ break;
+
+ case wxUSER_ATTENTION_ERROR:
+ flagsOSX = NSCriticalRequest;
+ break;
+
+ default:
+ wxFAIL_MSG( "invalid RequestUserAttention() flags" );
+ return;
+ }
+
+ [NSApp requestUserAttention:flagsOSX];
}
void wxNonOwnedWindowCocoaImpl::ScreenToWindow( int *x, int *y )
*y = p.y;
}
+bool wxNonOwnedWindowCocoaImpl::IsActive()
+{
+ return [m_macWindow isKeyWindow];
+}
+
+void wxNonOwnedWindowCocoaImpl::SetModified(bool modified)
+{
+ [m_macWindow setDocumentEdited:modified];
+}
+
+bool wxNonOwnedWindowCocoaImpl::IsModified() const
+{
+ return [m_macWindow isDocumentEdited];
+}
+
wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, const wxPoint& pos, const wxSize& size,
long style, long extraStyle, const wxString& name )
{