// 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
/////////////////////////////////////////////////////////////////////////////
#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"
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;
}
- (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
@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];
editor = [[wxNSTextFieldEditor alloc] init];
[editor setFieldEditor:YES];
[tf setFieldEditor:editor];
+ [editor release];
}
return editor;
- }
-
+ }
+
return nil;
}
if ( !m_wxPeer->IsNativeWindowWrapper() )
{
[m_macWindow setDelegate:nil];
+
+ // make sure we remove this first, otherwise the ref count will not lead to the
+ // native window's destruction
+ if ([m_macWindow parentWindow] != 0)
+ [[m_macWindow parentWindow] removeChildWindow: m_macWindow];
+
[m_macWindow release];
}
}
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 ) )
{
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;
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.
}
[m_macWindow setLevel:level];
+ m_macWindowLevel = level;
[m_macWindow setDelegate:controller];
- [m_macWindow setAcceptsMouseMovedEvents: YES];
-
if ( ( style & wxFRAME_SHAPED) )
{
[m_macWindow setOpaque:NO];
void wxNonOwnedWindowCocoaImpl::Raise()
{
- [m_macWindow orderWindow:NSWindowAbove relativeTo:0];
+ [m_macWindow makeKeyAndOrderFront:nil];
}
void wxNonOwnedWindowCocoaImpl::Lower()
if ( show )
{
wxNonOwnedWindow* wxpeer = GetWXPeer();
- if (wxpeer && !(wxpeer->GetWindowStyle() & wxFRAME_TOOL_WINDOW))
- [m_macWindow makeKeyAndOrderFront:nil];
- else
- [m_macWindow orderFront:nil];
+ if ( wxpeer )
+ {
+ // add to parent window before showing
+ if ( wxpeer->GetParent() )
+ {
+ NSView * parentView = wxpeer->GetParent()->GetPeer()->GetWXWidget();
+ if ( parentView )
+ {
+ NSWindow* parentNSWindow = [parentView window];
+ if ( parentNSWindow )
+ [parentNSWindow addChildWindow:m_macWindow ordered:NSWindowAbove];
+ }
+ }
+
+ if (!(wxpeer->GetWindowStyle() & wxFRAME_TOOL_WINDOW))
+ [m_macWindow makeKeyAndOrderFront:nil];
+ else
+ [m_macWindow orderFront:nil];
+ }
[[m_macWindow contentView] setNeedsDisplay: YES];
}
else
+ {
+ // avoid propagation of orderOut to parent
+ if ([m_macWindow parentWindow] != 0)
+ [[m_macWindow parentWindow] removeChildWindow: m_macWindow];
[m_macWindow orderOut:nil];
+ }
return true;
}
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;
}
level = kCGFloatingWindowLevel;
[m_macWindow setLevel: level];
+ m_macWindowLevel = level;
}
}
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;
typedef struct
{
+ NSUInteger m_formerStyleMask;
int m_formerLevel;
NSRect m_formerFrame;
} FullScreenData ;
m_macFullScreenData = data ;
data->m_formerLevel = [m_macWindow level];
data->m_formerFrame = [m_macWindow frame];
- CGDisplayCapture( kCGDirectMainDisplay );
- [m_macWindow setLevel:CGShieldingWindowLevel()];
+ 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: NSTitledWindowMask];
+ 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;
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 );
now->Create( parent, pos, size, style , extraStyle, name );
return now;
}
+