///////////////////////////////////////////////////////////////////////////////
-// Name: cocoa/toplevel.mm
+// Name: src/cocoa/toplevel.mm
// Purpose: implements wxTopLevelWindow for Cocoa
-// Author: David Elliott
+// Author: David Elliott
// Modified by:
// Created: 2002/11/27
// RCS-ID: $Id$
// Copyright: (c) 2002 David Elliott
-// Licence: wxWindows licence
+// Licence: wxWidgets licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+
+#include "wx/toplevel.h"
+
#ifndef WX_PRECOMP
#include "wx/window.h"
- #include "wx/toplevel.h"
#include "wx/menuitem.h"
#include "wx/frame.h"
#include "wx/log.h"
#include "wx/cocoa/autorelease.h"
#include "wx/cocoa/string.h"
-#import <AppKit/NSView.h>
-#import <AppKit/NSWindow.h>
+#include "wx/cocoa/objc/NSView.h"
+#include "wx/cocoa/objc/NSWindow.h"
#import <AppKit/NSPanel.h>
+#import <AppKit/NSButtonCell.h>
+#import <AppKit/NSControl.h>
+
// ----------------------------------------------------------------------------
// globals
// ----------------------------------------------------------------------------
wxTopLevelWindows.Append(this);
if(!CreateBase(parent,winid,pos,size,style,wxDefaultValidator,name))
- return FALSE;
+ return false;
if ( parent )
parent->AddChild(this);
if(style & wxFRAME_TOOL_WINDOW)
cocoaStyle |= NSUtilityWindowMask;
- wxPoint realpos = pos;
- wxSize realsize = size;
- // FIXME: this is lame
- if(realpos.x==-1)
- realpos.x=100;
- if(realpos.y==-1)
- realpos.y=100;
- if(realsize.x==-1)
- realsize.x=200;
- if(realsize.y==-1)
- realsize.y=200;
+ // Create frame and check and handle default position and size
+ int realx,
+ realy;
+
+ // WX has no set default position - the carbon port caps the low
+ // end at 20, 50. Here we do the same, except instead of setting
+ // it to 20 and 50, we set it to 100 and 100 if the values are too low
+ if (pos.x < 20)
+ realx = 100;
+ else
+ realx = pos.x;
+
+ if (pos.y < 50)
+ realy = 100;
+ else
+ realy = pos.y;
+
+ int realw = WidthDefault(size.x);
+ int realh = HeightDefault(size.y);
+
// NOTE: y-origin needs to be flipped.
- NSRect cocoaRect = [NSWindow contentRectForFrameRect:NSMakeRect(realpos.x,realpos.y,realsize.x,realsize.y) styleMask:cocoaStyle];
+ NSRect cocoaRect = [NSWindow
+ contentRectForFrameRect:NSMakeRect(realx,realy,realw,realh)
+ styleMask:cocoaStyle];
m_cocoaNSWindow = NULL;
m_cocoaNSView = NULL;
+ // NOTE: We may need to deal with the contentView becoming a wx NSView as well.
+ NSWindow *newWindow;
+ // Create a WXNSPanel or a WXNSWindow depending on what type of window is desired.
if(style & wxFRAME_TOOL_WINDOW)
- SetNSWindow([[NSPanel alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO]);
+ newWindow = [[WXNSPanel alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO];
else
- SetNSWindow([[NSWindow alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO]);
+ newWindow = [[WXNSWindow alloc] initWithContentRect:cocoaRect styleMask:cocoaStyle backing:NSBackingStoreBuffered defer:NO];
+ // Make sure the default content view is a WXNSView
+ [newWindow setContentView: [[WX_GET_OBJC_CLASS(WXNSView) alloc] initWithFrame: [[newWindow contentView] frame]]];
+ // Associate the window and view
+ SetNSWindow(newWindow);
+
// 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.
if(style & wxSTAY_ON_TOP)
[m_cocoaNSWindow setLevel:NSFloatingWindowLevel];
[m_cocoaNSWindow setTitle:wxNSStringWithWxString(title)];
- return TRUE;
+ return true;
}
wxTopLevelWindowCocoa::~wxTopLevelWindowCocoa()
wxASSERT(sm_cocoaDeactivateWindow!=this);
wxAutoNSAutoreleasePool pool;
DestroyChildren();
+ if(m_cocoaNSView)
+ SendDestroyEvent();
SetNSWindow(NULL);
}
[cocoaNSWindow retain];
[m_cocoaNSWindow release];
m_cocoaNSWindow = cocoaNSWindow;
+ // NOTE: We are no longer using posing so we won't get events on the
+ // window's view unless it was explicitly created as the wx view class.
if(m_cocoaNSWindow)
SetNSView([m_cocoaNSWindow contentView]);
else
{
DeactivatePendingWindow();
wxLogTrace(wxTRACE_COCOA,wxT("wxTopLevelWindowCocoa=%p::CocoaDelegate_windowDidBecomeKey"),this);
- wxActivateEvent event(wxEVT_ACTIVATE, TRUE, GetId());
+ wxActivateEvent event(wxEVT_ACTIVATE, true, GetId());
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
}
void wxTopLevelWindowCocoa::CocoaDelegate_windowDidResignKey(void)
{
wxLogTrace(wxTRACE_COCOA,wxT("wxTopLevelWindowCocoa=%p::CocoaDelegate_windowDidResignKey"),this);
- wxActivateEvent event(wxEVT_ACTIVATE, FALSE, GetId());
+ wxActivateEvent event(wxEVT_ACTIVATE, false, GetId());
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
}
bool wxTopLevelWindowCocoa::IsMaximized() const
{
- return false ;
+ return false ;
}
void wxTopLevelWindowCocoa::Iconize(bool iconize)
bool wxTopLevelWindowCocoa::IsIconized() const
{
- return FALSE;
+ return false;
}
void wxTopLevelWindowCocoa::Restore()
wxAutoNSAutoreleasePool pool;
if(show)
{
- // Send the window a size event because wxWindows apps expect it
+ // Send the window a size event because wxWidgets apps expect it
// NOTE: This should really only be done the first time a window
// is shown. I doubt this will cause any problems though.
wxSizeEvent event(GetSize(), GetId());
// wxTopLevelWindowCocoa misc
// ----------------------------------------------------------------------------
+void wxTopLevelWindowCocoa::SetTitle(const wxString& title)
+{
+ [m_cocoaNSWindow setTitle:wxNSStringWithWxString(title)];
+}
+
+wxString wxTopLevelWindowCocoa::GetTitle() const
+{
+ return wxStringWithNSString([m_cocoaNSWindow title]);
+}
+
+wxWindow* wxTopLevelWindowCocoa::SetDefaultItem(wxWindow *win)
+{
+ wxWindow *old = wxTopLevelWindowBase::SetDefaultItem(win);
+ NSView *newView = win->GetNSView();
+
+ NSCell *newCell;
+ // newView does not have to be an NSControl, we only cast to NSControl*
+ // to silence the warning about cell not being implemented.
+ if(newView != nil && [newView respondsToSelector:@selector(cell)])
+ newCell = [(NSControl*)newView cell];
+ else
+ newCell = nil;
+
+ if(newCell != nil && ![newCell isKindOfClass:[NSButtonCell class]])
+ { // It's not an NSButtonCell, set the default to nil.
+ newCell = nil;
+ }
+
+ [GetNSWindow() setDefaultButtonCell:(NSButtonCell*)newCell];
+ return old;
+}
+
bool wxTopLevelWindowCocoa::ShowFullScreen(bool show, long style)
{
- return FALSE;
+ return false;
}
bool wxTopLevelWindowCocoa::IsFullScreen() const
{
- return FALSE;
+ return false;
}
void wxTopLevelWindowCocoa::CocoaSetWxWindowSize(int width, int height)
*y=(int)cocoaRect.origin.y;
wxLogTrace(wxTRACE_COCOA_TopLevelWindow_Size,wxT("wxTopLevelWindow=%p::DoGetPosition = (%d,%d)"),this,(int)cocoaRect.origin.x,(int)cocoaRect.origin.y);
}
-