]> git.saurik.com Git - wxWidgets.git/commitdiff
committing current cocoa state just to be safe ...
authorStefan Csomor <csomor@advancedconcepts.ch>
Sat, 30 Aug 2008 08:03:32 +0000 (08:03 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Sat, 30 Aug 2008 08:03:32 +0000 (08:03 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55366 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

22 files changed:
src/osx/cocoa/bmpbuttn.mm
src/osx/cocoa/button.mm
src/osx/cocoa/checkbox.mm
src/osx/cocoa/choice.mm [new file with mode: 0644]
src/osx/cocoa/dialog.mm
src/osx/cocoa/evtloop.mm
src/osx/cocoa/gauge.mm [new file with mode: 0644]
src/osx/cocoa/listbox.mm [new file with mode: 0644]
src/osx/cocoa/menu.mm [new file with mode: 0644]
src/osx/cocoa/menuitem.mm [new file with mode: 0644]
src/osx/cocoa/nonownedwnd.mm
src/osx/cocoa/notebook.mm
src/osx/cocoa/radiobut.mm
src/osx/cocoa/scrolbar.mm [new file with mode: 0644]
src/osx/cocoa/slider.mm [new file with mode: 0644]
src/osx/cocoa/statbox.mm
src/osx/cocoa/statline.mm
src/osx/cocoa/stattext.mm
src/osx/cocoa/textctrl.mm [new file with mode: 0644]
src/osx/cocoa/tglbtn.mm
src/osx/cocoa/utils.mm
src/osx/cocoa/window.mm

index ac47c4f03f2cee48d2a4634681894fd8a9694dad..87a99d0f8099aaf8dbc2db4de42dd0d90378841a 100644 (file)
@@ -33,8 +33,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapButton( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
     
     [v setBezelStyle:NSRegularSquareBezelStyle];
index 789b07d0863be42eb511ac99cfe3862327a0c852..ec396993247ea9a991e6e718f16e77b925a43feb 100644 (file)
@@ -34,7 +34,7 @@ wxSize wxButton::DoGetBestSize() const
     {
         case wxWINDOW_VARIANT_NORMAL:
         case wxWINDOW_VARIANT_LARGE:
-            sz.y = 20 ;
+            sz.y = 23 ;
             break;
 
         case wxWINDOW_VARIANT_SMALL:
@@ -49,6 +49,21 @@ wxSize wxButton::DoGetBestSize() const
             break;
     }
 
+    wxRect r ;
+        
+    m_peer->GetBestRect(&r);
+
+    if ( r.GetWidth() == 0 && r.GetHeight() == 0 )
+    {
+    }
+    sz.x = r.GetWidth();
+    sz.y = r.GetHeight();
+
+    int wBtn = 96;
+    
+    if ((wBtn > sz.x) || ( GetWindowStyle() & wxBU_EXACTFIT))
+        sz.x = wBtn;
+
 #if wxOSX_USE_CARBON
     Rect    bestsize = { 0 , 0 , 0 , 0 } ;
     m_peer->GetBestRect( &bestsize ) ;
@@ -111,7 +126,7 @@ wxSize wxButton::GetDefaultSize()
 - (id)initWithFrame:(NSRect)frame
 {
     [super initWithFrame:frame];
-    m_impl = NULL;
+    impl = NULL;
     [self setTarget: self];
     [self setAction: @selector(clickedAction:)];
     return self;
@@ -119,9 +134,9 @@ wxSize wxButton::GetDefaultSize()
 
 - (void) clickedAction: (id) sender
 {
-    if ( m_impl )
+    if ( impl )
     {
-        wxButton* wxpeer = (wxButton*) m_impl->GetWXPeer();
+        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
         if ( wxpeer )
             wxpeer->HandleClicked(0);
     }
@@ -129,12 +144,12 @@ wxSize wxButton::GetDefaultSize()
 
 - (void)setImplementation: (wxWidgetImpl *) theImplementation
 {
-    m_impl = theImplementation;
+    impl = theImplementation;
 }
 
 - (wxWidgetImpl*) implementation
 {
-    return m_impl;
+    return impl;
 }
 
 - (BOOL) isFlipped
@@ -185,8 +200,7 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
     
     if ( id == wxID_HELP )
@@ -256,12 +270,33 @@ wxWidgetImplType* wxWidgetImpl::CreateButton( wxWindowMac* wxpeer,
 
 void wxWidgetCocoaImpl::SetDefaultButton( bool isDefault )
 { 
-    [m_osxView setKeyEquivalent: isDefault ? @"\r" : nil ];
-//    SetData(kControlButtonPart , kControlPushButtonDefaultTag , (Boolean) isDefault ) ;
+    if ( [m_osxView isKindOfClass:[NSButton class]] )
+        [(NSButton*)m_osxView setKeyEquivalent: isDefault ? @"\r" : nil ];
 }
 
 void wxWidgetCocoaImpl::PerformClick() 
 {
 }
 
-// TODO for the disclosure button : NSDisclosureBezelStyle and the button type to NSOnOffButton.
+wxWidgetImplType* wxWidgetImpl::CreateDisclosureTriangle( wxWindowMac* wxpeer, 
+                                    wxWindowMac* parent, 
+                                    wxWindowID id, 
+                                    const wxString& label,
+                                    const wxPoint& pos, 
+                                    const wxSize& size,
+                                    long style, 
+                                    long extraStyle) 
+{
+    NSView* sv = (wxpeer->GetParent()->GetHandle() );
+    
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+    wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
+    [v setBezelStyle:NSDisclosureBezelStyle];
+    [v setButtonType:NSOnOffButton];
+    [v setTitle:wxCFStringRef( label).AsNSString()];
+    [v setImagePosition:NSImageRight];
+    [sv addSubview:v];
+    wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
+    [v setImplementation:c];
+    return c;
+}
index 47962106a394f7cd5754642c1e2397d211bfe3d7..0bca191ba836a67aac4c1b2856f617962e154fc5 100644 (file)
@@ -27,8 +27,7 @@ wxWidgetImplType* wxWidgetImpl::CreateCheckBox( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
 
     [v setButtonType:NSSwitchButton];    
diff --git a/src/osx/cocoa/choice.mm b/src/osx/cocoa/choice.mm
new file mode 100644 (file)
index 0000000..50d1bac
--- /dev/null
@@ -0,0 +1,105 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/choice.mm
+// Purpose:     wxChoice
+// Author:      Stefan Csomor
+// Modified by:
+// Created:     1998-01-01
+// RCS-ID:      $Id: choice.cpp 54129 2008-06-11 19:30:52Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#if wxUSE_CHOICE
+
+#include "wx/choice.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/menu.h"
+    #include "wx/dcclient.h"
+#endif
+
+#include "wx/osx/private.h"
+
+@interface wxNSPopUpButton : NSPopUpButton
+{
+    wxWidgetImpl* impl;
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation;
+- (wxWidgetImpl*) implementation;
+- (BOOL) isFlipped;
+- (void) clickedAction: (id) sender;
+
+@end
+
+@implementation wxNSPopUpButton
+
+- (id)initWithFrame:(NSRect)frame pullsDown:(BOOL) pd
+{
+    [super initWithFrame:frame pullsDown:pd];
+    impl = NULL;
+    [self setTarget: self];
+    [self setAction: @selector(clickedAction:)];
+    return self;
+}
+
+- (void) clickedAction: (id) sender
+{
+    if ( impl )
+    {
+        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->HandleClicked(0);
+    }
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxWidgetImpl*) implementation
+{
+    return impl;
+}
+
+- (BOOL) isFlipped
+{
+    return YES;
+}
+
+- (int) intValue
+{
+   return [self indexOfSelectedItem];
+}
+
+- (void) setIntValue: (int) v
+{
+    [self selectItemAtIndex:v];
+}
+
+@end
+
+wxWidgetImplType* wxWidgetImpl::CreateChoice( wxWindowMac* wxpeer, 
+                                    wxWindowMac* parent, 
+                                    wxWindowID id, 
+                                    wxMenu* menu,
+                                    const wxPoint& pos, 
+                                    const wxSize& size,
+                                    long style, 
+                                    long extraStylew)
+{
+    NSView* sv = (wxpeer->GetParent()->GetHandle() );
+    
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+    wxNSPopUpButton* v = [[wxNSPopUpButton alloc] initWithFrame:r pullsDown:NO];
+    [sv addSubview:v];
+    [v setMenu: menu->GetHMenu()];
+    wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
+    [v setImplementation:c];
+    return c;
+}
+
+#endif // wxUSE_CHOICE
index 9d99165c63813cc8139bf700e99f01a59f193cbd..e5a9d3f6581691fa11e581505cc257617282ea2c 100644 (file)
@@ -26,6 +26,9 @@ extern wxList wxModalDialogs;
 
 void wxDialog::DoShowModal()
 {
+    wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") );
+
+    wxModalDialogs.Append(this);
 
     SetFocus() ;
 /*
@@ -41,12 +44,12 @@ void wxDialog::DoShowModal()
         resetGroupParent = true;
     }
 */
-
     NSWindow* theWindow = GetWXWindow();
     
     NSModalSession session = [NSApp beginModalSessionForWindow:theWindow];
     while (IsModal()) 
     {
+        wxMacAutoreleasePool autoreleasepool;
         if ([NSApp runModalSession:session] != NSRunContinuesResponse)
             break;
         // TODO should we do some idle processing ?
index a8a8c561d7a0551747ff1fe093d29fd520b7709d..d7082f1578cf4b9436de470737818cf244b45dba 100644 (file)
@@ -50,6 +50,7 @@ void wxGUIEventLoop::WakeUp()
 
 bool wxGUIEventLoop::Pending() const
 {
+    wxMacAutoreleasePool autoreleasepool;
     // a pointer to the event is returned if there is one, or nil if not
     return [[NSApplication sharedApplication]
             nextEventMatchingMask: NSAnyEventMask
diff --git a/src/osx/cocoa/gauge.mm b/src/osx/cocoa/gauge.mm
new file mode 100644 (file)
index 0000000..80ed675
--- /dev/null
@@ -0,0 +1,124 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        gauge.mm
+// Purpose:     wxGauge class
+// Author:      Stefan Csomor
+// Modified by:
+// Created:     1998-01-01
+// RCS-ID:      $Id: gauge.cpp 54820 2008-07-29 20:04:11Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:       wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#if wxUSE_GAUGE
+
+#include "wx/gauge.h"
+
+#include "wx/osx/private.h"
+
+@interface wxNSProgressIndicator : NSProgressIndicator
+{
+    wxWidgetImpl* impl;
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation;
+- (wxWidgetImpl*) implementation;
+- (BOOL) isFlipped;
+
+@end
+
+@implementation wxNSProgressIndicator
+
+- (id)initWithFrame:(NSRect)frame
+{
+    [super initWithFrame:frame];
+    impl = NULL;
+    return self;
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxWidgetImpl*) implementation
+{
+    return impl;
+}
+
+- (BOOL) isFlipped
+{
+    return YES;
+}
+
+@end
+
+class wxOSXGaugeCocoaImpl : public wxWidgetCocoaImpl
+{
+public :
+    wxOSXGaugeCocoaImpl( wxWindowMac* peer, WXWidget w) : wxWidgetCocoaImpl( peer, w )
+    {
+    }
+    
+    void SetMaximum(wxInt32 v)
+    {
+        SetDeterminateMode();
+        wxWidgetCocoaImpl::SetMaximum( v ) ;
+    }
+    
+    void SetValue(wxInt32 v)
+    {
+        SetDeterminateMode();
+        wxWidgetCocoaImpl::SetValue( v ) ;
+    }
+    
+    void PulseGauge()
+    {
+        if ( ![(wxNSProgressIndicator*)m_osxView isIndeterminate] )
+        {
+            [(wxNSProgressIndicator*)m_osxView setIndeterminate:YES];
+            [(wxNSProgressIndicator*)m_osxView startAnimation:nil];
+        }
+    }
+protected:
+    void SetDeterminateMode()
+    {
+       // switch back to determinate mode if necessary
+        if ( [(wxNSProgressIndicator*)m_osxView isIndeterminate]  )
+        {
+            [(wxNSProgressIndicator*)m_osxView stopAnimation:nil];
+            [(wxNSProgressIndicator*)m_osxView setIndeterminate:NO];
+        }
+    }
+};
+
+
+wxWidgetImplType* wxWidgetImpl::CreateGauge( wxWindowMac* wxpeer, 
+                                    wxWindowMac* parent, 
+                                    wxWindowID id, 
+                                    wxInt32 value,
+                                    wxInt32 minimum,
+                                    wxInt32 maximum,
+                                    const wxPoint& pos, 
+                                    const wxSize& size,
+                                    long style, 
+                                    long extraStyle)
+{
+    NSView* sv = (wxpeer->GetParent()->GetHandle() );
+    
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+    wxNSProgressIndicator* v = [[wxNSProgressIndicator alloc] initWithFrame:r];
+
+    [v setMinValue: minimum];
+    [v setMaxValue: maximum];
+    [v setIndeterminate:FALSE];
+    [v setDoubleValue: (double) value];
+    [sv addSubview:v];
+    wxWidgetCocoaImpl* c = new wxOSXGaugeCocoaImpl( wxpeer, v );
+    [v setImplementation:c];
+    return c;
+}
+
+#endif // wxUSE_GAUGE
+
diff --git a/src/osx/cocoa/listbox.mm b/src/osx/cocoa/listbox.mm
new file mode 100644 (file)
index 0000000..2d43f98
--- /dev/null
@@ -0,0 +1,617 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/listbox.mm
+// Purpose:     wxListBox
+// Author:      Stefan Csomor
+// Modified by:
+// Created:     1998-01-01
+// RCS-ID:      $Id: listbox.cpp 54820 2008-07-29 20:04:11Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#if wxUSE_LISTBOX
+
+#include "wx/listbox.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/intl.h"
+    #include "wx/utils.h"
+    #include "wx/settings.h"
+    #include "wx/arrstr.h"
+    #include "wx/dcclient.h"
+#endif
+
+#include "wx/osx/private.h"
+
+#include <vector>
+
+// forward decls
+
+class wxListWidgetCocoaImpl;
+
+@interface wxNSTableDataSource : NSObject
+{
+    wxListWidgetCocoaImpl* impl;
+}
+
+- (id)tableView:(NSTableView *)aTableView 
+        objectValueForTableColumn:(NSTableColumn *)aTableColumn 
+        row:(NSInteger)rowIndex;
+
+- (id)tableView:(NSTableView *)aTableView 
+        setObjectValue:(NSTableColumn *)aTableColumn 
+        row:(NSInteger)rowIndex;
+        
+- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView;
+
+- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation;
+- (wxListWidgetCocoaImpl*) implementation;
+
+@end
+
+@interface wxNSTableView : NSTableView
+{
+    wxListWidgetCocoaImpl* impl;
+}
+
+- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation;
+- (wxListWidgetCocoaImpl*) implementation;
+
+@end
+
+//
+// table column
+//
+
+class wxCocoaTableColumn;
+
+@interface wxNSTableColumn : NSTableColumn
+{
+    wxCocoaTableColumn* column;
+}
+
+- (void) setColumn: (wxCocoaTableColumn*) col;
+
+- (wxCocoaTableColumn*) column;
+
+@end
+
+class WXDLLIMPEXP_CORE wxCocoaTableColumn : public wxListWidgetColumn
+{
+public :
+    wxCocoaTableColumn( wxNSTableColumn* column, bool editable ) 
+        : m_column( column ), m_editable(editable)
+    {
+    }
+    
+    ~wxCocoaTableColumn()
+    {
+    }
+    
+    wxNSTableColumn* GetNSTableColumn() const { return m_column ; }
+    
+    bool IsEditable() const { return m_editable; }
+    
+protected :
+    wxNSTableColumn* m_column;
+    bool m_editable;
+} ;
+
+NSString* column1 = @"1";
+
+class wxListWidgetCocoaImpl : public wxWidgetCocoaImpl, public wxListWidgetImpl
+{
+public :
+    wxListWidgetCocoaImpl( wxWindowMac* peer, NSScrollView* view, wxNSTableView* tableview, wxNSTableDataSource* data );
+    
+    ~wxListWidgetCocoaImpl();
+    
+    virtual wxListWidgetColumn*     InsertTextColumn( unsigned pos, const wxString& title, bool editable = false, 
+                                wxAlignment just = wxALIGN_LEFT , int defaultWidth = -1)  ;
+    virtual wxListWidgetColumn*     InsertCheckColumn( unsigned pos , const wxString& title, bool editable = false, 
+                                wxAlignment just = wxALIGN_LEFT , int defaultWidth =  -1)  ;
+    
+    // add and remove
+    
+    virtual void            ListDelete( unsigned int n ) ;    
+    virtual void            ListInsert( unsigned int n ) ;
+    virtual void            ListClear() ;
+
+    // selecting
+
+    virtual void            ListDeselectAll();
+    
+    virtual void            ListSetSelection( unsigned int n, bool select, bool multi ) ;
+    virtual int             ListGetSelection() const ;
+    
+    virtual int             ListGetSelections( wxArrayInt& aSelections ) const ;
+    
+    virtual bool            ListIsSelected( unsigned int n ) const ;
+    
+    // display
+
+    virtual void            ListScrollTo( unsigned int n ) ;
+
+    // accessing content
+
+    virtual unsigned int    ListGetCount() const ;
+    
+    int                     ListGetColumnType( int col )
+    {
+        return col;
+    }
+    virtual void            UpdateLine( unsigned int n, wxListWidgetColumn* col = NULL ) ;
+    virtual void            UpdateLineToEnd( unsigned int n);
+protected :
+    wxNSTableView*          m_tableView ;
+    
+    wxNSTableDataSource*    m_dataSource;
+} ;
+
+//
+// implementations
+//
+
+@implementation wxNSTableColumn
+
+- (id) init
+{
+    [super init];
+    column = nil;
+    return self;
+}
+
+- (void) setColumn: (wxCocoaTableColumn*) col
+{
+    column = col;
+}
+
+- (wxCocoaTableColumn*) column
+{
+    return column;
+}
+
+@end
+
+class wxNSTableViewCellValue : public wxListWidgetCellValue
+{
+public :
+    wxNSTableViewCellValue( id &v ) : value(v)
+    {
+    }
+    
+    virtual ~wxNSTableViewCellValue() {}
+
+    virtual void Set( CFStringRef v )
+    {
+        value = [[(NSString*)v retain] autorelease];
+    }
+    virtual void Set( const wxString& value ) 
+    {
+        Set( (CFStringRef) wxCFStringRef( value ) );
+    }
+    virtual void Set( int v ) 
+    {
+        value = [NSNumber numberWithInt:v];
+    }
+    
+    virtual int GetIntValue() const 
+    {
+        if ( [value isKindOfClass:[NSNumber class]] )
+            return [ (NSNumber*) value intValue ];
+            
+        return 0;
+    }
+    
+    virtual wxString GetStringValue() const 
+    {
+        if ( [value isKindOfClass:[NSString class]] )
+            return wxCFStringRef( (CFStringRef) [value retain] ).AsString();
+            
+        return wxEmptyString;
+    }
+        
+protected:
+    id& value;
+} ;
+
+@implementation wxNSTableDataSource
+
+- (id) init
+{
+    [super init];
+    impl = nil;
+    return self;
+}
+
+- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxListWidgetCocoaImpl*) implementation
+{
+    return impl;
+}
+
+- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
+{
+    if ( impl )
+        return impl->ListGetCount();
+    return 0;
+}
+
+- (id)tableView:(NSTableView *)aTableView 
+        objectValueForTableColumn:(NSTableColumn *)aTableColumn 
+        row:(NSInteger)rowIndex
+{
+    wxNSTableColumn* tablecol = (wxNSTableColumn *)aTableColumn;
+    wxListBox* lb = dynamic_cast<wxListBox*>(impl->GetWXPeer());
+    wxCocoaTableColumn* col = [tablecol column];
+    id value = nil;
+    wxNSTableViewCellValue cellvalue(value);
+    lb->GetValueCallback(rowIndex, col, cellvalue);
+    return value;
+}
+
+- (void)tableView:(NSTableView *)aTableView 
+        setObjectValue:(id)value forTableColumn:(NSTableColumn *)aTableColumn 
+        row:(NSInteger)rowIndex
+{
+    wxNSTableColumn* tablecol = (wxNSTableColumn *)aTableColumn;
+    wxListBox* lb = dynamic_cast<wxListBox*>(impl->GetWXPeer());
+    wxCocoaTableColumn* col = [tablecol column];
+    wxNSTableViewCellValue cellvalue(value);
+    lb->SetValueCallback(rowIndex, col, cellvalue);
+}
+
+@end
+
+@implementation wxNSTableView
+
+- (void)setImplementation: (wxListWidgetCocoaImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxListWidgetCocoaImpl*) implementation
+{
+    return impl;
+}
+
+
+@end
+
+//
+//
+//
+
+wxListWidgetCocoaImpl::wxListWidgetCocoaImpl( wxWindowMac* peer, NSScrollView* view, wxNSTableView* tableview, wxNSTableDataSource* data ) :
+    wxWidgetCocoaImpl( peer, view ), m_tableView(tableview), m_dataSource(data)
+{
+}
+
+wxListWidgetCocoaImpl::~wxListWidgetCocoaImpl()
+{
+    [m_dataSource release];
+}
+
+unsigned int wxListWidgetCocoaImpl::ListGetCount() const 
+{
+    wxListBox* lb = dynamic_cast<wxListBox*> ( GetWXPeer() );
+    return lb->GetCount();
+}
+
+//
+// columns
+//
+
+wxListWidgetColumn* wxListWidgetCocoaImpl::InsertTextColumn( unsigned pos, const wxString& title, bool editable, 
+                                wxAlignment just, int defaultWidth) 
+{
+    wxNSTableColumn* col1 = [[wxNSTableColumn alloc] init];
+    [col1 setEditable:editable];
+    
+    unsigned formerColCount = [m_tableView numberOfColumns];
+    
+    // there's apparently no way to insert at a specific position
+    [m_tableView addTableColumn:col1 ];
+    if ( pos < formerColCount )
+        [m_tableView moveColumn:formerColCount toColumn:pos];
+        
+    if ( defaultWidth >= 0 )
+    {
+        [col1 setMaxWidth:defaultWidth];
+        [col1 setMinWidth:defaultWidth];
+    }
+    
+    wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
+    [col1 setColumn:wxcol];
+
+    // owned by the tableview
+    [col1 release];
+    return wxcol;
+}
+
+wxListWidgetColumn* wxListWidgetCocoaImpl::InsertCheckColumn( unsigned pos , const wxString& title, bool editable, 
+                                wxAlignment just, int defaultWidth ) 
+{
+   wxNSTableColumn* col1 = [[wxNSTableColumn alloc] init];
+    [col1 setEditable:editable];
+    // set your custom cell & set it up
+    NSButtonCell* checkbox = [[NSButtonCell alloc] init];
+    [checkbox setTitle:@""];
+    [checkbox setButtonType:NSSwitchButton];
+    [col1 setDataCell:checkbox] ;
+    [checkbox release];
+             
+    unsigned formerColCount = [m_tableView numberOfColumns];
+    
+    // there's apparently no way to insert at a specific position
+    [m_tableView addTableColumn:col1 ];
+    if ( pos < formerColCount )
+        [m_tableView moveColumn:formerColCount toColumn:pos];
+        
+    if ( defaultWidth >= 0 )
+    {
+        [col1 setMaxWidth:defaultWidth];
+        [col1 setMinWidth:defaultWidth];
+    }
+    
+    wxCocoaTableColumn* wxcol = new wxCocoaTableColumn( col1, editable );
+    [col1 setColumn:wxcol];
+
+    // owned by the tableview
+    [col1 release];
+    return wxcol;
+}
+
+
+//
+// inserting / removing lines
+//
+
+void wxListWidgetCocoaImpl::ListInsert( unsigned int n ) 
+{
+#if 0
+    {
+        wxListBoxCocoaLine* line = new wxListBoxCocoaLine();
+        line->SetLabel(items[i]);
+        if ( m_items.size() <= n+i )
+            m_items.push_back( line );
+        else
+            m_items.insert(m_items.begin()+n, line);
+/*
+        NSMutableDictionary* line = [[NSMutableDictionary alloc] init];
+        [line setObject:wxCFStringRef(items[i]).AsNSString() forKey:column1];
+        NSMutableArray* array = [m_dataSource items];
+        if ( [array count] <= n+i )
+            [array addObject:line];
+        else
+            [array insertObject:line atIndex:n];
+*/
+    }
+#endif
+    [m_tableView reloadData];
+}
+
+void wxListWidgetCocoaImpl::ListDelete( unsigned int n ) 
+{
+    [m_tableView reloadData];
+}
+
+void wxListWidgetCocoaImpl::ListClear() 
+{
+    [m_tableView reloadData];
+}
+
+// selecting
+
+void wxListWidgetCocoaImpl::ListDeselectAll()
+{
+    [m_tableView deselectAll:nil];
+}
+
+void wxListWidgetCocoaImpl::ListSetSelection( unsigned int n, bool select, bool multi ) 
+{
+    // TODO
+    if ( select )
+        [m_tableView selectRow: n byExtendingSelection:multi];
+    else
+        [m_tableView deselectRow: n];
+
+}
+
+int wxListWidgetCocoaImpl::ListGetSelection() const 
+{
+    return 0;
+}
+
+int wxListWidgetCocoaImpl::ListGetSelections( wxArrayInt& aSelections ) const 
+{
+    return 0;
+}
+
+bool wxListWidgetCocoaImpl::ListIsSelected( unsigned int n ) const 
+{
+    return false;
+}
+
+// display
+
+void wxListWidgetCocoaImpl::ListScrollTo( unsigned int n ) 
+{
+    [m_tableView scrollRowToVisible:n];
+}
+
+    
+void wxListWidgetCocoaImpl::UpdateLine( unsigned int n, wxListWidgetColumn* col ) 
+{
+    // TODO optimize
+    [m_tableView reloadData];
+}
+
+void wxListWidgetCocoaImpl::UpdateLineToEnd( unsigned int n) 
+{
+    // TODO optimize
+    [m_tableView reloadData];
+}
+
+
+// accessing content
+
+
+wxWidgetImplType* wxWidgetImpl::CreateListBox( wxWindowMac* wxpeer, 
+                                    wxWindowMac* parent, 
+                                    wxWindowID id, 
+                                    const wxPoint& pos, 
+                                    const wxSize& size,
+                                    long style, 
+                                    long extraStyle)
+{
+    NSView* superv = (wxpeer->GetParent()->GetHandle() );
+    
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+    NSScrollView* scrollview = [[NSScrollView alloc] initWithFrame:r];
+    
+    // use same scroll flags logic as msw
+    
+    [scrollview setHasVerticalScroller:YES];
+    
+    if ( style & wxLB_HSCROLL )
+        [scrollview setHasHorizontalScroller:YES];
+    
+    [scrollview setAutohidesScrollers: ((style & wxLB_ALWAYS_SB) ? NO : YES)];
+    
+    // setting up the true table
+    
+    wxNSTableView* tableview = [[wxNSTableView alloc] init];
+    [scrollview setDocumentView:tableview];
+    [tableview release];
+    
+    // only one multi-select mode available
+    if ( (style & wxLB_EXTENDED) || (style & wxLB_MULTIPLE) )
+        [tableview setAllowsMultipleSelection:YES];
+        
+    // simple listboxes have no header row
+    [tableview setHeaderView:nil];
+    
+    [tableview setColumnAutoresizingStyle:NSTableViewLastColumnOnlyAutoresizingStyle];
+    wxNSTableDataSource* ds = [[ wxNSTableDataSource alloc] init];
+    [tableview setDataSource:ds];
+    [superv addSubview:scrollview];
+    wxListWidgetCocoaImpl* c = new wxListWidgetCocoaImpl( wxpeer, scrollview, tableview, ds );
+    [tableview setImplementation:c];
+    [ds setImplementation:c];
+    return c;
+}
+
+int wxListBox::DoListHitTest(const wxPoint& inpoint) const
+{
+#if wxOSX_USE_CARBON
+    OSStatus err;
+
+    // There are few reasons why this is complicated:
+    // 1) There is no native HitTest function for Mac
+    // 2) GetDataBrowserItemPartBounds only works on visible items
+    // 3) We can't do it through GetDataBrowserTableView[Item]RowHeight
+    //    because what it returns is basically inaccurate in the context
+    //    of the coordinates we want here, but we use this as a guess
+    //    for where the first visible item lies
+
+    wxPoint point = inpoint;
+
+    // get column property ID (req. for call to itempartbounds)
+    DataBrowserTableViewColumnID colId = 0;
+    err = GetDataBrowserTableViewColumnProperty(m_peer->GetControlRef(), 0, &colId);
+    wxCHECK_MSG(err == noErr, wxNOT_FOUND, wxT("Unexpected error from GetDataBrowserTableViewColumnProperty"));
+
+    // OK, first we need to find the first visible item we have -
+    // this will be the "low" for our binary search. There is no real
+    // easy way around this, as we will need to do a SLOW linear search
+    // until we find a visible item, but we can do a cheap calculation
+    // via the row height to speed things up a bit
+    UInt32 scrollx, scrolly;
+    err = GetDataBrowserScrollPosition(m_peer->GetControlRef(), &scrollx, &scrolly);
+    wxCHECK_MSG(err == noErr, wxNOT_FOUND, wxT("Unexpected error from GetDataBrowserScrollPosition"));
+
+    UInt16 height;
+    err = GetDataBrowserTableViewRowHeight(m_peer->GetControlRef(), &height);
+    wxCHECK_MSG(err == noErr, wxNOT_FOUND, wxT("Unexpected error from GetDataBrowserTableViewRowHeight"));
+
+    // these indices are 0-based, as usual, so we need to add 1 to them when
+    // passing them to data browser functions which use 1-based indices
+    int low = scrolly / height,
+        high = GetCount() - 1;
+
+    // search for the first visible item (note that the scroll guess above
+    // is the low bounds of where the item might lie so we only use that as a
+    // starting point - we should reach it within 1 or 2 iterations of the loop)
+    while ( low <= high )
+    {
+        Rect bounds;
+        err = GetDataBrowserItemPartBounds(
+            m_peer->GetControlRef(), low + 1, colId,
+            kDataBrowserPropertyEnclosingPart,
+            &bounds); // note +1 to translate to Mac ID
+        if ( err == noErr )
+            break;
+
+        // errDataBrowserItemNotFound is expected as it simply means that the
+        // item is not currently visible -- but other errors are not
+        wxCHECK_MSG( err == errDataBrowserItemNotFound, wxNOT_FOUND,
+                     wxT("Unexpected error from GetDataBrowserItemPartBounds") );
+
+        low++;
+    }
+
+    // NOW do a binary search for where the item lies, searching low again if
+    // we hit an item that isn't visible
+    while ( low <= high )
+    {
+        int mid = (low + high) / 2;
+
+        Rect bounds;
+        err = GetDataBrowserItemPartBounds(
+            m_peer->GetControlRef(), mid + 1, colId,
+            kDataBrowserPropertyEnclosingPart,
+            &bounds); //note +1 to trans to mac id
+        wxCHECK_MSG( err == noErr || err == errDataBrowserItemNotFound,
+                     wxNOT_FOUND,
+                     wxT("Unexpected error from GetDataBrowserItemPartBounds") );
+
+        if ( err == errDataBrowserItemNotFound )
+        {
+            // item not visible, attempt to find a visible one
+            // search lower
+            high = mid - 1;
+        }
+        else // visible item, do actual hitttest
+        {
+            // if point is within the bounds, return this item (since we assume
+            // all x coords of items are equal we only test the x coord in
+            // equality)
+            if ((point.x >= bounds.left && point.x <= bounds.right) &&
+                (point.y >= bounds.top && point.y <= bounds.bottom) )
+            {
+                // found!
+                return mid;
+            }
+
+            if ( point.y < bounds.top )
+                // index(bounds) greater then key(point)
+                high = mid - 1;
+            else
+                // index(bounds) less then key(point)
+                low = mid + 1;
+        }
+    }
+#endif
+    return wxNOT_FOUND;
+}
+
+#endif // wxUSE_LISTBOX
diff --git a/src/osx/cocoa/menu.mm b/src/osx/cocoa/menu.mm
new file mode 100644 (file)
index 0000000..3bac02b
--- /dev/null
@@ -0,0 +1,193 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/menu.mm
+// Purpose:     wxMenu, wxMenuBar, wxMenuItem
+// Author:      Stefan Csomor
+// Modified by:
+// Created:     1998-01-01
+// RCS-ID:      $Id: menu.cpp 54129 2008-06-11 19:30:52Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+// ============================================================================
+// headers & declarations
+// ============================================================================
+
+// wxWidgets headers
+// -----------------
+
+#include "wx/wxprec.h"
+
+#include "wx/menu.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/frame.h"
+    #include "wx/menuitem.h"
+#endif
+
+#include "wx/osx/private.h"
+
+// other standard headers
+// ----------------------
+#include <string.h>
+
+@class wxNSMenuItem;
+
+@interface wxNSMenu : NSMenu
+{
+   wxMenuImpl* impl;
+}
+
+- (void) setImplementation:(wxMenuImpl*) item;
+- (wxMenuImpl*) implementation;
+
+@end 
+
+@implementation wxNSMenu
+
+- (id) init
+{
+    [super init];
+    return self;
+}
+
+- (void)setImplementation: (wxMenuImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxMenuImpl*) implementation
+{
+    return impl;
+}
+
+@end
+
+@interface wxNSMenuController : NSObject
+{
+}
+
+- (void)menuWillOpen:(NSMenu *)menu;
+- (void)menuDidClose:(NSMenu *)menu;
+- (void)menu:(NSMenu *)menu willHighlightItem:(NSMenuItem *)item;
+
+@end
+
+@implementation wxNSMenuController
+
+- (id) init
+{
+    [super init];
+    return self;
+}
+
+- (void)menuWillOpen:(NSMenu *)smenu
+{
+    wxNSMenu* menu = (wxNSMenu*) smenu;
+    wxMenuImpl* menuimpl = [menu implementation];
+    if ( menuimpl )
+    {
+        wxMenu* wxpeer = (wxMenu*) menuimpl->GetWXPeer();
+        wxpeer->HandleMenuOpened();
+    }
+}
+
+- (void)menuDidClose:(NSMenu *)smenu
+{
+    wxNSMenu* menu = (wxNSMenu*) smenu;
+    wxMenuImpl* menuimpl = [menu implementation];
+    if ( menuimpl )
+    {
+        wxMenu* wxpeer = (wxMenu*) menuimpl->GetWXPeer();
+        wxpeer->HandleMenuClosed();
+    }
+}
+
+- (void)menu:(NSMenu *)smenu willHighlightItem:(NSMenuItem *)item
+{
+    wxNSMenu* menu = (wxNSMenu*) smenu;
+    wxMenuImpl* menuimpl = [menu implementation];
+    if ( menuimpl )
+    {
+        wxMenu* wxpeer = (wxMenu*) menuimpl->GetWXPeer();
+        if ( [ item isKindOfClass:[wxNSMenuItem class] ] )
+        {
+            wxMenuItemImpl* menuitemimpl = (wxMenuItemImpl*) [ (wxNSMenuItem*) item implementation ];
+            if ( wxpeer && menuitemimpl )
+            {
+                wxpeer->HandleMenuItemHighlighted( menuitemimpl->GetWXPeer() );
+            }
+        }
+    }
+}
+
+@end
+
+class wxMenuCocoaImpl : public wxMenuImpl 
+{
+public :
+    wxMenuCocoaImpl( wxMenu* peer , NSMenu* menu) : wxMenuImpl(peer), m_osxMenu(menu)
+    {
+    }
+    
+    virtual ~wxMenuCocoaImpl();
+        
+    virtual void InsertOrAppend(wxMenuItem *pItem, size_t pos) 
+    {
+        if ( pos == (size_t) -1 )
+            [m_osxMenu addItem:(NSMenuItem*) pItem->GetPeer()->GetHMenuItem() ];
+        else
+            [m_osxMenu insertItem:(NSMenuItem*) pItem->GetPeer()->GetHMenuItem() atIndex:pos];
+    }
+        
+    virtual void Remove( wxMenuItem *pItem ) 
+    {
+        [m_osxMenu removeItem:(NSMenuItem*) pItem->GetPeer()->GetHMenuItem()];
+    }
+    
+    virtual void MakeRoot()
+    {
+        [NSApp setMainMenu:m_osxMenu];
+        [NSApp setAppleMenu:[[m_osxMenu itemAtIndex:0] submenu]];
+    }
+
+    virtual void Enable( bool enable )
+    {
+    }
+    
+    virtual void SetTitle( const wxString& text )
+    {
+        wxCFStringRef cfText(text);
+        [m_osxMenu setTitle:cfText.AsNSString()];
+    }
+
+    WXHMENU GetHMenu() { return m_osxMenu; }
+
+    static wxMenuImpl* Create( wxMenu* peer, const wxString& title );
+    static wxMenuImpl* CreateRootMenu( wxMenu* peer );
+protected :
+    NSMenu* m_osxMenu;
+} ;
+
+wxMenuCocoaImpl::~wxMenuCocoaImpl()
+{
+    [m_osxMenu release];
+}
+
+wxMenuImpl* wxMenuImpl::Create( wxMenu* peer, const wxString& title )
+{
+    static wxNSMenuController* controller = NULL;
+    if ( controller == NULL )
+    {
+        controller = [[wxNSMenuController alloc] init];
+    }
+    wxCFStringRef cfText( title );
+    wxNSMenu* menu = [[wxNSMenu alloc] initWithTitle:cfText.AsNSString()];
+    wxMenuImpl* c = new wxMenuCocoaImpl( peer, menu );
+    [menu setDelegate:controller];
+    [menu setImplementation:c];
+    return c;
+}
diff --git a/src/osx/cocoa/menuitem.mm b/src/osx/cocoa/menuitem.mm
new file mode 100644 (file)
index 0000000..87132b4
--- /dev/null
@@ -0,0 +1,274 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/menuitem.mm
+// Purpose:     wxMenuItem implementation
+// Author:      Stefan Csomor
+// Modified by:
+// Created:     1998-01-01
+// RCS-ID:      $Id: menuitem.cpp 54129 2008-06-11 19:30:52Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:     wxWindows licence
+///////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#include "wx/menuitem.h"
+#include "wx/stockitem.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/menu.h"
+#endif // WX_PRECOMP
+
+#include "wx/osx/private.h"
+
+@interface wxNSMenuItem : NSMenuItem
+{
+   wxMenuItemImpl* impl;
+}
+
+- (void) setImplementation:(wxMenuItemImpl*) item;
+- (wxMenuItemImpl*) implementation;
+
+- (void) clickedAction: (id) sender;
+- (BOOL)validateMenuItem:(NSMenuItem *) menuItem;
+
+@end 
+
+@implementation wxNSMenuItem
+
+- (id) init
+{
+    [super init];
+     return self;
+}
+
+- (void) clickedAction: (id) sender
+{
+    if ( impl )
+    {
+        impl->GetWXPeer()->GetMenu()->HandleCommandProcess(impl->GetWXPeer());
+     }
+}
+
+- (BOOL)validateMenuItem:(NSMenuItem *) menuItem
+{
+    if( impl )
+    {
+        impl->GetWXPeer()->GetMenu()->HandleCommandUpdateStatus(impl->GetWXPeer());
+        return impl->GetWXPeer()->IsEnabled();
+    }
+    return YES ;
+}
+
+- (void)setImplementation: (wxMenuItemImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxMenuItemImpl*) implementation
+{
+    return impl;
+}
+
+@end
+
+void wxMacCocoaMenuItemSetAccelerator( NSMenuItem* menuItem, wxAcceleratorEntry* entry )
+{
+    unsigned int modifiers = 0 ;
+    int key = entry->GetKeyCode() ;
+    if ( key )
+    {
+        if (entry->GetFlags() & wxACCEL_CTRL);
+            modifiers |= NSCommandKeyMask;
+
+        if (entry->GetFlags() & wxACCEL_ALT)
+            modifiers |= NSAlternateKeyMask ;
+
+        // this may be ignored later for alpha chars
+
+        if (entry->GetFlags() & wxACCEL_SHIFT)
+            modifiers |= NSShiftKeyMask ;
+
+        unichar shortcut = 0;
+        if ( key >= WXK_F1 && key <= WXK_F15 )
+        {
+            modifiers |= NSFunctionKeyMask ;
+            shortcut = NSF1FunctionKey + ( key - WXK_F1 );
+        }
+        else
+        {
+            switch ( key )
+            {
+/*
+                // standard function keys from here
+                case WXK_TAB :
+                    modifiers |= NSFunctionKeyMask ;
+                    shortcut = NSTabCharacter ;
+                    break ;
+
+                case kEnterCharCode :
+                    modifiers |= NSFunctionKeyMask ;
+                    cocoaKey = NSTabCharacter ;
+                    break ;
+
+                case WXK_RETURN :
+                    modifiers |= NSFunctionKeyMask ;
+                    cocoaKey = NSTabCharacter ;
+                    break ;
+
+                case WXK_ESCAPE :
+                    modifiers |= NSFunctionKeyMask ;
+                    cocoaKey = kEscapeCharCode ;
+                    break ;
+
+                case WXK_SPACE :
+                    shortcut = ' ' ;
+                    break ;
+
+
+                case WXK_CLEAR :
+                    cocoaKey = kClearCharCode ;
+                    break ;
+
+                case WXK_PAGEUP :
+                    cocoaKey = kPageUpCharCode ;
+                    break ;
+
+                case WXK_PAGEDOWN :
+                    cocoaKey = kPageDownCharCode ;
+                    break ;
+
+                case WXK_LEFT :
+                    cocoaKey = kLeftArrowCharCode ;
+                    break ;
+
+                case WXK_UP :
+                    cocoaKey = kUpArrowCharCode ;
+                    break ;
+
+                case WXK_RIGHT :
+                    cocoaKey = kRightArrowCharCode ;
+                    break ;
+
+                case WXK_DOWN :
+                    cocoaKey = kDownArrowCharCode ;
+                    break ;
+
+                case WXK_HOME :
+                    cocoaKey = kHomeCharCode ;
+                    break ;
+
+                case WXK_END :
+                    cocoaKey = kEndCharCode ;
+                    break ;
+*/
+                // TODO Test all above with their function key equiv.
+                // from NSEvent.h
+                default :
+                    if(entry->GetFlags() & wxACCEL_SHIFT)
+                        shortcut = toupper(key);
+                    else
+                        shortcut = tolower(key);
+                    break ;
+            }
+        }
+
+        [menuItem setKeyEquivalent:[NSString stringWithCharacters:&shortcut length:1]];
+        [menuItem setKeyEquivalentModifierMask:modifiers];
+    }
+}
+
+class wxMenuItemCocoaImpl : public wxMenuItemImpl 
+{
+public :
+    wxMenuItemCocoaImpl( wxMenuItem* peer, NSMenuItem* item ) : wxMenuItemImpl(peer), m_osxMenuItem(item)
+    {
+    }
+    
+    ~wxMenuItemCocoaImpl();
+        
+    void SetBitmap( const wxBitmap& bitmap ) 
+    {
+        [m_osxMenuItem setImage:bitmap.GetNSImage()];
+    }
+    
+    void Enable( bool enable ) 
+    {
+        [m_osxMenuItem setEnabled:enable];
+    }
+    
+    void Check( bool check ) 
+    {
+        [m_osxMenuItem setState:( check ?  NSOnState :  NSOffState) ];
+    }
+    
+    void Hide( bool hide )
+    {
+        [m_osxMenuItem setHidden:hide ];
+    }
+    
+    void SetLabel( const wxString& text, wxAcceleratorEntry *entry ) 
+    {
+        wxCFStringRef cfText(text);
+        [m_osxMenuItem setTitle:cfText.AsNSString()];
+        
+        if ( entry )
+            wxMacCocoaMenuItemSetAccelerator( m_osxMenuItem, entry );
+
+    }
+    
+    void * GetHMenuItem() { return m_osxMenuItem; }
+
+protected :
+    NSMenuItem* m_osxMenuItem ;
+} ;
+
+wxMenuItemCocoaImpl::~wxMenuItemCocoaImpl()
+{
+}
+
+
+wxMenuItemImpl* wxMenuItemImpl::Create( wxMenuItem* peer, wxMenu *pParentMenu,
+                       int id,
+                       const wxString& text,
+                       wxAcceleratorEntry *entry,
+                       const wxString& strHelp,
+                       wxItemKind kind,
+                       wxMenu *pSubMenu )
+{
+    wxMenuItemImpl* c = NULL;
+    NSMenuItem* item = nil;
+    
+    if ( kind == wxITEM_SEPARATOR )
+    {
+        item = [[NSMenuItem separatorItem] retain];
+    }
+    else
+    {
+        wxCFStringRef cfText(text);
+        wxNSMenuItem* temp = [ [ wxNSMenuItem alloc ] init ];
+        if ( ! pParentMenu->GetNoEventsMode() )
+        {
+            [temp setTarget: temp];
+            [temp setAction: @selector(clickedAction:)];
+        }
+        [temp setTitle:cfText.AsNSString()];
+        if ( pSubMenu )
+        {
+            pSubMenu->GetPeer()->SetTitle( text );
+            [temp setSubmenu:pSubMenu->GetHMenu()];
+        }
+        else
+        {
+            if ( entry )
+                wxMacCocoaMenuItemSetAccelerator( temp, entry );
+        }
+        item = temp;
+    }
+    c = new wxMenuItemCocoaImpl( peer, item );
+    if ( kind != wxITEM_SEPARATOR )
+    {
+        [(wxNSMenuItem*)item setImplementation:c];
+    }
+    return c;
+}
index b63421373c7f35ea79758afecbb895b77adfa33a..d17ce38b68c45e6553fd780eeda4d63dd43e4354 100644 (file)
@@ -21,9 +21,6 @@
 #include "wx/osx/private.h"
 #endif
 
-#if wxOSX_USE_COCOA
-
-
 NSRect wxToNSRect( NSView* parent, const wxRect& r )
 {
     NSRect frame = parent ? [parent bounds] : [[NSScreen mainScreen] frame];
@@ -64,6 +61,143 @@ wxPoint wxFromNSPoint( NSView* parent, const NSPoint& p )
     return wxPoint( x, y);
 }
 
+//
+// wx native implementation classes
+//
+
+@interface wxNSWindow : NSWindow
+
+{
+    wxNonOwnedWindowCocoaImpl* impl;
+}
+
+- (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation;
+- (wxNonOwnedWindowCocoaImpl*) implementation;
+
+@end
+
+@implementation wxNSWindow
+
+- (void)setImplementation: (wxNonOwnedWindowCocoaImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxNonOwnedWindowCocoaImpl*) implementation
+{
+    return impl;
+}
+
+
+@end
+
+@interface wxNSPanel : wxNSWindow
+
+{
+}
+
+@end
+
+@implementation wxNSPanel 
+
+@end
+
+
+//
+// controller
+//
+
+@interface wxNonOwnedWindowController : NSObject
+{
+}
+
+- (void)windowDidResize:(NSNotification *)notification;
+- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize;
+- (void)windowDidResignMain:(NSNotification *)notification;
+- (void)windowDidBecomeMain:(NSNotification *)notification;
+- (void)windowDidMove:(NSNotification *)notification;
+- (BOOL)windowShouldClose:(id)window;
+
+@end
+
+@implementation wxNonOwnedWindowController
+
+- (id) init
+{
+    [super init];
+    return self;
+}
+
+- (BOOL)windowShouldClose:(id)nwindow
+{
+    wxNSWindow* window = (wxNSWindow*) nwindow;
+    wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation];
+    if ( windowimpl )
+    {
+        wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->Close();
+    }
+    return NO;
+}
+
+- (NSSize)windowWillResize:(NSWindow *)window
+                    toSize:(NSSize)proposedFrameSize
+{
+    // todo
+    return proposedFrameSize;
+}
+
+- (void)windowDidResize:(NSNotification *)notification
+{
+    wxNSWindow* window = (wxNSWindow*) [notification object];
+    wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation];
+    if ( windowimpl )
+    {
+        wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->HandleResized(0);
+    }
+}
+
+- (void)windowDidMove:(NSNotification *)notification
+{
+    wxNSWindow* window = (wxNSWindow*) [notification object];
+    wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation];
+    if ( windowimpl )
+    {
+        wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->HandleMoved(0);
+    }
+}
+
+- (void)windowDidBecomeMain:(NSNotification *)notification
+{
+    wxNSWindow* window = (wxNSWindow*) [notification object];
+    wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation];
+    if ( windowimpl )
+    {
+        wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->HandleActivated(0, true);
+    }
+}
+
+- (void)windowDidResignMain:(NSNotification *)notification
+{
+    wxNSWindow* window = (wxNSWindow*) [notification object];
+    wxNonOwnedWindowCocoaImpl* windowimpl = [window implementation];
+    if ( windowimpl )
+    {
+        wxNonOwnedWindow* wxpeer = windowimpl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->HandleActivated(0, false);
+    }
+}
+
+@end
+
 IMPLEMENT_DYNAMIC_CLASS( wxNonOwnedWindowCocoaImpl , wxNonOwnedWindowImpl )
 
 wxNonOwnedWindowCocoaImpl::wxNonOwnedWindowCocoaImpl( wxNonOwnedWindow* nonownedwnd) : 
@@ -92,12 +226,18 @@ void wxNonOwnedWindowCocoaImpl::Destroy()
 void wxNonOwnedWindowCocoaImpl::Create( wxWindow* parent, const wxPoint& pos, const wxSize& size,
 long style, long extraStyle, const wxString& name )
 {
+    static wxNonOwnedWindowController* controller = NULL;
+    
+    if ( !controller )
+        controller =[[wxNonOwnedWindowController alloc] init];
+
+
     int windowstyle = NSBorderlessWindowMask;
     
     if ( style & wxFRAME_TOOL_WINDOW )
-        m_macWindow = [NSPanel alloc];
+        m_macWindow = [wxNSPanel alloc];
     else
-        m_macWindow = [NSWindow alloc];
+        m_macWindow = [wxNSWindow alloc];
     
     CGWindowLevel level = kCGNormalWindowLevelKey;
     
@@ -180,6 +320,8 @@ long style, long extraStyle, const wxString& name )
     
     NSRect r = wxToNSRect( NULL, wxRect( pos, size) );
     
+    [m_macWindow setImplementation:this];
+    
     [m_macWindow initWithContentRect:r
         styleMask:windowstyle
         backing:NSBackingStoreBuffered
@@ -187,6 +329,9 @@ long style, long extraStyle, const wxString& name )
         ];
         
     [m_macWindow setLevel:level];
+
+    [m_macWindow setDelegate:controller];
+    
     // [m_macWindow makeKeyAndOrderFront:nil];
 }
 
@@ -373,4 +518,38 @@ bool wxNonOwnedWindowCocoaImpl::ShowFullScreen(bool show, long style)
 void wxNonOwnedWindowCocoaImpl::RequestUserAttention(int WXUNUSED(flags))
 {
 }
-#endif
+
+void wxNonOwnedWindowCocoaImpl::ScreenToWindow( int *x, int *y )
+{
+    wxPoint p((x ? *x : 0), (y ? *y : 0) );
+    /*
+    NSPoint nspt = wxToNSPoint( NULL, p );
+    
+    nspt = [[m_macWindow contentView] convertPoint:p toV:nil];
+    p = wxFromNSPoint( 
+    */
+    if ( x )
+        *x = p.x;
+    if ( y )
+        *y = p.y;
+}
+
+void wxNonOwnedWindowCocoaImpl::WindowToScreen( int *x, int *y )
+{
+    wxPoint p(  (x ? *x : 0), (y ? *y : 0) );
+    /*
+    p = [m_macWindow convertPoint:p toWindow:nil];
+    */
+    if ( x )
+        *x = p.x;
+    if ( y )
+        *y = p.y;
+}
+
+wxNonOwnedWindowImpl* wxNonOwnedWindowImpl::CreateNonOwnedWindow( wxNonOwnedWindow* wxpeer, wxWindow* parent, const wxPoint& pos, const wxSize& size,
+    long style, long extraStyle, const wxString& name )
+{
+    wxNonOwnedWindowImpl* now = new wxNonOwnedWindowCocoaImpl( wxpeer );
+    now->Create( parent, pos, size, style , extraStyle, name );
+    return now;
+}
\ No newline at end of file
index 297650a5542ccfc9aba2e79bd3704ccec392ffeb..e085d76899d84eab834f18f03302459301902fe2 100644 (file)
 #include "wx/imaglist.h"
 #include "wx/osx/private.h"
 
+//
+// controller
+//
+
+@interface wxTabViewController : NSObject
+{
+}
+
+- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+
+@end
+
 @interface wxNSTabView : NSTabView
 {
-    wxWidgetImpl* m_impl;
+    wxWidgetCocoaImpl* impl;
 }
 
-- (void)setImplementation: (wxWidgetImpl *) theImplementation;
-- (wxWidgetImpl*) implementation;
+- (void)setImplementation: (wxWidgetCocoaImpl *) theImplementation;
+- (wxWidgetCocoaImpl*) implementation;
 - (BOOL) isFlipped;
-- (int) intValue;
-- (void) setIntValue:(int) v;
 
 @end
 
-@implementation wxNSTabView
+@implementation wxTabViewController
 
-- (void)setImplementation: (wxWidgetImpl *) theImplementation
+- (id) init
 {
-    m_impl = theImplementation;
+    [super init];
+    return self;
 }
 
-- (wxWidgetImpl*) implementation
+- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem
 {
-    return m_impl;
+    wxNSTabView* view = (wxNSTabView*) tabView;
+    wxWidgetCocoaImpl* viewimpl = [view implementation];
+    if ( viewimpl )
+    {
+        wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
+    }
+    return YES;
 }
 
-- (BOOL) isFlipped
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+
 {
-    return YES;
+    wxNSTabView* view = (wxNSTabView*) tabView;
+    wxWidgetCocoaImpl* viewimpl = [view implementation];
+    if ( viewimpl )
+    {
+        wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
+        wxpeer->HandleClicked(0);
+    }
+}
+
+@end
+
+@implementation wxNSTabView
+
+- (void)setImplementation: (wxWidgetCocoaImpl *) theImplementation
+{
+    impl = theImplementation;
 }
 
-- (int) intValue
+- (wxWidgetCocoaImpl*) implementation
 {
-    NSTabViewItem* selectedItem = [self selectedTabViewItem];
-    if ( selectedItem == nil )
-        return 0;
-    else
-        return [self indexOfTabViewItem:selectedItem]+1;
+    return impl;
 }
 
-- (void) setIntValue:(int) v
+- (BOOL) isFlipped
 {
-    [self selectTabViewItemAtIndex:(v-1)];
+    return YES;
 }
 
 @end
 
+class wxCocoaTabView : public wxWidgetCocoaImpl
+{
+public:
+    wxCocoaTabView( wxWindowMac* peer , WXWidget w ) : wxWidgetCocoaImpl(peer, w)
+    {
+    }
+    
+    void GetContentArea( int &left , int &top , int &width , int &height ) const 
+    {
+        wxNSTabView* slf = (wxNSTabView*) m_osxView;
+        NSRect r = [slf contentRect];
+        left = r.origin.x;
+        top = r.origin.y;
+        width = r.size.width;
+        height = r.size.height;
+    }
+    
+    void SetValue( wxInt32 value ) 
+    {
+        wxNSTabView* slf = (wxNSTabView*) m_osxView;
+        // avoid 'changed' events when setting the tab programmatically
+        wxTabViewController* controller = [slf delegate];
+        [slf setDelegate:nil];
+        [slf selectTabViewItemAtIndex:(value-1)];
+        [slf setDelegate:controller];
+    }
+    
+    wxInt32 GetValue() const
+    {
+        wxNSTabView* slf = (wxNSTabView*) m_osxView;
+        NSTabViewItem* selectedItem = [slf selectedTabViewItem];
+        if ( selectedItem == nil )
+            return 0;
+        else
+            return [slf indexOfTabViewItem:selectedItem]+1;
+    }
+    
+    void SetMaximum( wxInt32 maximum )
+    {
+        wxNSTabView* slf = (wxNSTabView*) m_osxView;
+        int cocoacount = [slf numberOfTabViewItems ];
+        // avoid 'changed' events when setting the tab programmatically
+        wxTabViewController* controller = [slf delegate];
+        [slf setDelegate:nil];
+        
+        if ( maximum > cocoacount )
+        {
+            for ( int i = cocoacount ; i < maximum ; ++i )
+            {
+                NSTabViewItem* item = [[NSTabViewItem alloc] init];
+                [slf addTabViewItem:item];
+                [item release];
+            }
+        }
+        else if ( maximum < cocoacount )
+        {
+            for ( int i = cocoacount -1 ; i >= maximum ; --i )
+            {
+                NSTabViewItem* item = [(wxNSTabView*) m_osxView tabViewItemAtIndex:i];
+                [slf removeTabViewItem:item];
+            }
+        }
+        [slf setDelegate:controller];
+    }
+
+    void SetupTabs( const wxNotebook& notebook)
+    {
+        int pcount = notebook.GetPageCount();
+        
+        SetMaximum( pcount );
+        
+        for ( int i = 0 ; i < pcount ; ++i )
+        {
+            wxNotebookPage* page = notebook.GetPage(i);
+            NSTabViewItem* item = [(wxNSTabView*) m_osxView tabViewItemAtIndex:i];
+            [item setView:page->GetHandle() ];
+            wxCFStringRef cf( page->GetLabel() , notebook.GetFont().GetEncoding() );
+            [item setLabel:cf.AsNSString()];
+            if ( notebook.GetImageList() && notebook.GetPageImage(i) >= 0 )
+            {
+                const wxBitmap bmap = notebook.GetImageList()->GetBitmap( notebook.GetPageImage( i ) ) ;
+                if ( bmap.Ok() )
+                {
+                    // TODO how to set an image on a tab
+                }
+            }
+        }
+    }
+};
+
+
 /*
 #if 0
     Rect bounds = wxMacGetBoundsForControl( this, pos, size );
@@ -120,18 +241,17 @@ wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
                                     long style, 
                                     long extraStyle)
 {
+    static wxTabViewController* controller = NULL;
+
+    if ( !controller )
+        controller =[[wxTabViewController alloc] init];
+
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
-    /*    if ( bounds.right <= bounds.left )
-        bounds.right = bounds.left + 100;
-    if ( bounds.bottom <= bounds.top )
-        bounds.bottom = bounds.top + 100;
-    */
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     
     NSTabViewType tabstyle = NSTopTabsBezelBorder;
-   if ( style & wxBK_LEFT )
+    if ( style & wxBK_LEFT )
         tabstyle = NSLeftTabsBezelBorder;
     else if ( style & wxBK_RIGHT )
         tabstyle = NSRightTabsBezelBorder;
@@ -141,77 +261,10 @@ wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
     wxNSTabView* v = [[wxNSTabView alloc] initWithFrame:r];
     [sv addSubview:v];
     [v setTabViewType:tabstyle];
-    wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
+    wxWidgetCocoaImpl* c = new wxCocoaTabView( wxpeer, v );
     [v setImplementation:c];
+    [v setDelegate: controller];
     return c;
 }
 
-void wxWidgetCocoaImpl::SetupTabs( const wxNotebook& notebook)
-{
-    int pcount = notebook.GetPageCount();
-    int cocoacount = [ (wxNSTabView*) m_osxView numberOfTabViewItems ];
-    
-    if ( pcount > cocoacount )
-    {
-        for ( int i = cocoacount ; i < pcount ; ++i )
-        {
-            NSTabViewItem* item = [[NSTabViewItem alloc] init];
-            [(wxNSTabView*) m_osxView addTabViewItem:item];
-            [item release];
-        }
-    }
-    else if ( pcount < cocoacount )
-    {
-        for ( int i = cocoacount -1 ; i >= pcount ; --i )
-        {
-            NSTabViewItem* item = [(wxNSTabView*) m_osxView tabViewItemAtIndex:i];
-            [(wxNSTabView*) m_osxView removeTabViewItem:item];
-        }
-    }
-    
-    for ( int i = 0 ; i < pcount ; ++i )
-    {
-        wxNotebookPage* page = notebook.GetPage(i);
-        NSTabViewItem* item = [(wxNSTabView*) m_osxView tabViewItemAtIndex:i];
-        [item setLabel:wxCFStringRef( page->GetLabel() , notebook.GetFont().GetEncoding() ).AsNSString()];
-    }
-/*
-    SetMaximum( GetPageCount() ) ;
-
-    wxNotebookPage *page;
-    ControlTabInfoRecV1 info;
-
-    const size_t countPages = GetPageCount();
-    for (size_t ii = 0; ii < countPages; ii++)
-    {
-        page = (wxNotebookPage*) notebook->GetPage[ii];
-        info.version = kControlTabInfoVersionOne;
-        info.iconSuiteID = 0;
-        wxCFStringRef cflabel( page->GetLabel(), GetFont().GetEncoding() ) ;
-        info.name = cflabel ;
-        SetData<ControlTabInfoRecV1>( ii + 1, kControlTabInfoTag, &info ) ;
-
-        if ( GetImageList() && GetPageImage(ii) >= 0 )
-        {
-            const wxBitmap bmap = GetImageList()->GetBitmap( GetPageImage( ii ) ) ;
-            if ( bmap.Ok() )
-            {
-                ControlButtonContentInfo info ;
-
-                wxMacCreateBitmapButton( &info, bmap ) ;
-
-                OSStatus err = SetData<ControlButtonContentInfo>( ii + 1, kControlTabImageContentTag, &info );
-                if ( err != noErr )
-                {
-                    wxFAIL_MSG("Error when setting icon on tab");
-                }
-
-                wxMacReleaseBitmapButton( &info ) ;
-            }
-        }
-        SetTabEnabled( ii + 1, true ) ;
-    }
-*/
-}
-
 #endif
index 86b9a4660afc0a65e16e592b32ae030af77a57dc..6ade4cba1ce06b9c0ad4258301f3868bb9966784 100644 (file)
@@ -27,8 +27,7 @@ wxWidgetImplType* wxWidgetImpl::CreateRadioButton( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
 
     [v setButtonType:NSRadioButton];    
diff --git a/src/osx/cocoa/scrolbar.mm b/src/osx/cocoa/scrolbar.mm
new file mode 100644 (file)
index 0000000..5571d10
--- /dev/null
@@ -0,0 +1,123 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/scrolbar.mm
+// Purpose:     wxScrollBar
+// Author:      Stefan Csomor
+// Modified by:
+// Created:     1998-01-01
+// RCS-ID:      $Id: scrolbar.cpp 54129 2008-06-11 19:30:52Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:       wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#include "wx/scrolbar.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/settings.h"
+#endif
+
+#include "wx/osx/private.h"
+
+@interface wxNSScroller : NSScroller
+{
+    wxWidgetImpl* impl;
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation;
+- (wxWidgetImpl*) implementation;
+- (BOOL) isFlipped;
+ - (void) clickedAction: (id) sender;
+
+@end
+
+@implementation wxNSScroller
+
+- (id)initWithFrame:(NSRect)frame
+{
+    [super initWithFrame:frame];
+    impl = NULL;
+    [self setTarget: self];
+    [self setAction: @selector(clickedAction:)];
+    return self;
+}
+
+- (void) clickedAction: (id) sender
+{
+    if ( impl )
+    {
+        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->HandleClicked(0);
+    }
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxWidgetImpl*) implementation
+{
+    return impl ;
+}
+
+- (BOOL) isFlipped
+{
+    return YES;
+}
+
+@end
+
+class wxOSXScrollBarCocoaImpl : public wxWidgetCocoaImpl
+{
+public :
+    wxOSXScrollBarCocoaImpl( wxWindowMac* peer, WXWidget w) : wxWidgetCocoaImpl( peer, w )
+    {
+    }
+    
+    void SetMaximum(wxInt32 v)
+    {
+        m_maximum = v;
+    }
+    
+    void    SetScrollThumb( wxInt32 value, wxInt32 thumbSize ) 
+    {
+        double v = ((double) value)/m_maximum;
+        double t = ((double) thumbSize)/m_maximum;
+#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+        [(wxNSScroller*) m_osxView setFloatValue:v knobProportion:t];
+#else
+        [(wxNSScroller*) m_osxView setDoubleValue:v];
+        [(wxNSScroller*) m_osxView setKnobProportion:t];
+#endif
+    }
+    
+    wxInt32 GetValue() const
+    {
+        return [(wxNSScroller*) m_osxView floatValue] * m_maximum;
+    }
+protected:
+    wxInt32 m_maximum;
+};
+
+wxWidgetImplType* wxWidgetImpl::CreateScrollBar( wxWindowMac* wxpeer, 
+                                    wxWindowMac* parent, 
+                                    wxWindowID id, 
+                                    const wxPoint& pos, 
+                                    const wxSize& size,
+                                    long style, 
+                                    long extraStyle)
+{
+    NSView* sv = (wxpeer->GetParent()->GetHandle() );
+    
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+    wxNSScroller* v = [[wxNSScroller alloc] initWithFrame:r];
+
+    [sv addSubview:v];
+    wxWidgetCocoaImpl* c = new wxOSXScrollBarCocoaImpl( wxpeer, v );
+    [v setImplementation:c];
+    return c;
+}
diff --git a/src/osx/cocoa/slider.mm b/src/osx/cocoa/slider.mm
new file mode 100644 (file)
index 0000000..a80fb43
--- /dev/null
@@ -0,0 +1,108 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/slider.mm
+// Purpose:     wxSlider
+// Author:      Stefan Csomor
+// Modified by:
+// Created:     1998-01-01
+// RCS-ID:      $Id: slider.cpp 54129 2008-06-11 19:30:52Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:       wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#if wxUSE_SLIDER
+
+#include "wx/slider.h"
+#include "wx/osx/private.h"
+
+@interface wxNSSlider : NSSlider
+{
+    wxWidgetImpl* impl;
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation;
+- (wxWidgetImpl*) implementation;
+- (BOOL) isFlipped;
+ - (void) clickedAction: (id) sender;
+
+@end
+
+@implementation wxNSSlider
+
+- (id)initWithFrame:(NSRect)frame
+{
+    [super initWithFrame:frame];
+    impl = NULL;
+    [self setTarget: self];
+    [self setAction: @selector(clickedAction:)];
+    return self;
+}
+
+- (void) clickedAction: (id) sender
+{
+    if ( impl )
+    {
+        wxWindow* wxpeer = (wxWindow*) impl->GetWXPeer();
+        if ( wxpeer )
+            wxpeer->HandleClicked(0);
+    }
+}
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxWidgetImpl*) implementation
+{
+    return impl;
+}
+
+- (BOOL) isFlipped
+{
+    return YES;
+}
+
+@end
+
+wxWidgetImplType* wxWidgetImpl::CreateSlider( wxWindowMac* wxpeer, 
+                                    wxWindowMac* parent, 
+                                    wxWindowID id, 
+                                    wxInt32 value,
+                                    wxInt32 minimum,
+                                    wxInt32 maximum,
+                                    const wxPoint& pos, 
+                                    const wxSize& size,
+                                    long style, 
+                                    long extraStyle)
+{
+    NSView* sv = (wxpeer->GetParent()->GetHandle() );
+    
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+    wxNSSlider* v = [[wxNSSlider alloc] initWithFrame:r];
+
+    int tickMarks = 0;
+    if ( style & wxSL_AUTOTICKS )
+    {
+        tickMarks = (maximum - minimum) + 1; // +1 for the 0 value
+
+        // keep the number of tickmarks from becoming unwieldly, therefore below it is ok to cast
+        // it to a UInt16
+        while (tickMarks > 20)
+            tickMarks /= 5;
+            
+        [v setNumberOfTickMarks:tickMarks];
+        [v setTickMarkPosition:NSTickMarkBelow];
+    }
+
+    [v setMinValue: minimum];
+    [v setMaxValue: maximum];
+    [v setFloatValue: (double) value];
+    [sv addSubview:v];
+    wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
+    [v setImplementation:c];
+    return c;
+}
+
+#endif // wxUSE_SLIDER
index 4ec49e32fa9fc2b7328b6cfec37bd8ac3cf5fcb1..f1e60f923c9ba3922cdf4ce72a2eec128990ae04 100644 (file)
 #include "wx/statbox.h"
 #include "wx/osx/private.h"
 
+@implementation wxNSBox
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxWidgetImpl*) implementation
+{
+    return impl;
+}
+
+- (BOOL) isFlipped
+{
+    return NO;
+}
+
+@end
+
 wxWidgetImplType* wxWidgetImpl::CreateGroupBox( wxWindowMac* wxpeer, 
                                     wxWindowMac* parent, 
                                     wxWindowID id, 
@@ -27,8 +46,7 @@ wxWidgetImplType* wxWidgetImpl::CreateGroupBox( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSBox* v = [[wxNSBox alloc] initWithFrame:r];
     [sv addSubview:v];
     wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
index 9293e4f82a593763ca2ea5c4f1fcc3eacb102bfb..6fc86cc2e212e476e891ad8e0c36b41b3e563644 100644 (file)
 
 #include "wx/osx/private.h"
 
-@implementation wxNSBox
-
-- (void)setImplementation: (wxWidgetImpl *) theImplementation
-{
-    m_impl = theImplementation;
-}
-
-- (wxWidgetImpl*) implementation
-{
-    return m_impl;
-}
-
-- (BOOL) isFlipped
-{
-    return YES;
-}
-
-@end
-
 wxWidgetImplType* wxWidgetImpl::CreateStaticLine( wxWindowMac* wxpeer, 
                                     wxWindowMac* parent, 
                                     wxWindowID id, 
@@ -62,8 +43,7 @@ wxWidgetImplType* wxWidgetImpl::CreateStaticLine( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSBox* v = [[wxNSBox alloc] initWithFrame:r];
     [sv addSubview:v];
     wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
index f35aebba813be85b83d37de2aef2b9fe50df97f9..a30082c99010e6cb8422b77da00cc188b652cff6 100644 (file)
@@ -92,43 +92,6 @@ wxSize wxStaticText::DoGetBestSize() const
           to allow correct dynamic ellipsizing of the label
 */
 
-@interface wxNSTextField : NSTextField
-{
-    wxWidgetImpl* m_impl;
-}
-
-- (void)setImplementation: (wxWidgetImpl *) theImplementation;
-- (wxWidgetImpl*) implementation;
-- (BOOL) isFlipped;
-
-@end
-
-@implementation wxNSTextField
-
-- (void)setImplementation: (wxWidgetImpl *) theImplementation
-{
-    m_impl = theImplementation;
-}
-
-- (wxWidgetImpl*) implementation
-{
-    return m_impl;
-}
-
-- (BOOL) isFlipped
-{
-    return YES;
-}
-
-// use our common calls
-- (void) setTitle:(NSString *) title
-{
-    [self setStringValue: title];
-}
-
-@end
-
-
 wxWidgetImplType* wxWidgetImpl::CreateStaticText( wxWindowMac* wxpeer, 
                                     wxWindowMac* parent, 
                                     wxWindowID id, 
@@ -140,8 +103,7 @@ wxWidgetImplType* wxWidgetImpl::CreateStaticText( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSTextField* v = [[wxNSTextField alloc] initWithFrame:r];
     [sv addSubview:v];
 
diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm
new file mode 100644 (file)
index 0000000..163f8a1
--- /dev/null
@@ -0,0 +1,138 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/cocoa/textctrl.mm
+// Purpose:     wxTextCtrl
+// Author:      Stefan Csomor
+// Modified by: Ryan Norton (MLTE GetLineLength and GetLineText)
+// Created:     1998-01-01
+// RCS-ID:      $Id: textctrl.cpp 54820 2008-07-29 20:04:11Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#if wxUSE_TEXTCTRL
+
+#include "wx/textctrl.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/intl.h"
+    #include "wx/app.h"
+    #include "wx/utils.h"
+    #include "wx/dc.h"
+    #include "wx/button.h"
+    #include "wx/menu.h"
+    #include "wx/settings.h"
+    #include "wx/msgdlg.h"
+    #include "wx/toplevel.h"
+#endif
+
+#ifdef __DARWIN__
+    #include <sys/types.h>
+    #include <sys/stat.h>
+#else
+    #include <stat.h>
+#endif
+
+#if wxUSE_STD_IOSTREAM
+    #if wxUSE_IOSTREAMH
+        #include <fstream.h>
+    #else
+        #include <fstream>
+    #endif
+#endif
+
+#include "wx/filefn.h"
+#include "wx/sysopt.h"
+#include "wx/thread.h"
+
+#include "wx/osx/private.h"
+#include "wx/osx/carbon/private/mactext.h"
+
+
+@implementation wxNSTextField
+
+- (void)setImplementation: (wxWidgetImpl *) theImplementation
+{
+    impl = theImplementation;
+}
+
+- (wxWidgetImpl*) implementation
+{
+    return impl;
+}
+
+- (BOOL) isFlipped
+{
+    return YES;
+}
+
+// use our common calls
+- (void) setTitle:(NSString *) title
+{
+    [self setStringValue: title];
+}
+
+@end
+
+class wxNSTextFieldControl : public wxMacTextControl
+{
+public :
+    wxNSTextFieldControl( wxTextCtrl *wxPeer, WXWidget w ) : wxMacTextControl(wxPeer, w)
+    {
+    }
+    virtual ~wxNSTextFieldControl()
+    {
+    }
+
+    virtual void VisibilityChanged(bool shown){}
+    virtual wxString GetStringValue() const 
+    {
+        wxCFStringRef cf( (CFStringRef) [[(wxNSTextField*) m_osxView stringValue] retain] );
+        return cf.AsString(m_wxPeer->GetFont().GetEncoding());
+    }
+    virtual void SetStringValue( const wxString &str) 
+    {
+        [(wxNSTextField*) m_osxView setStringValue: wxCFStringRef( str , m_wxPeer->GetFont().GetEncoding() ).AsNSString()];
+    }
+    virtual void Copy() {}
+    virtual void Cut() {}
+    virtual void Paste() {}
+    virtual bool CanPaste() const { return false;}
+    virtual void SetEditable(bool editable) {}
+    virtual void GetSelection( long* from, long* to) const {}
+    virtual void SetSelection( long from , long to ){}
+    virtual void WriteText(const wxString& str) 
+    {
+        // temp hack to get logging working early
+        wxString former = GetStringValue();
+        SetStringValue( former + str );
+    }
+};
+
+wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, 
+                                    wxWindowMac* parent, 
+                                    wxWindowID id, 
+                                    const wxString& str,
+                                    const wxPoint& pos, 
+                                    const wxSize& size,
+                                    long style, 
+                                    long extraStyle)
+{
+    NSView* sv = (wxpeer->GetParent()->GetHandle() );
+    
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
+    wxNSTextField* v = [[wxNSTextField alloc] initWithFrame:r];
+    [sv addSubview:v];
+
+    //[v setBezeled:NO];
+    //[v setEditable:NO];
+    //[v setDrawsBackground:NO];
+    
+    wxWidgetCocoaImpl* c = new wxNSTextFieldControl( wxpeer, v );
+    [v setImplementation:c];
+    return c;
+}
+
+
+#endif // wxUSE_TEXTCTRL
index d638d955f8443deda2076044a6487ad26f1a2f80..de93bd3bf022dea458d3b9fcc38d28ed3779d994 100644 (file)
@@ -36,8 +36,7 @@ wxWidgetImplType* wxWidgetImpl::CreateToggleButton( wxWindowMac* wxpeer,
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
     
     [v setBezelStyle:NSRoundedBezelStyle];    
@@ -59,8 +58,7 @@ wxWidgetImplType* wxWidgetImpl::CreateBitmapToggleButton( wxWindowMac* wxpeer,
 {    
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSButton* v = [[wxNSButton alloc] initWithFrame:r];
     
     [v setBezelStyle:NSRegularSquareBezelStyle];
index 279adf36fc7684a3160118bd58cf492f6039a08b..a9cdfeff837872c7d2cd1641dc311c512d832946 100644 (file)
@@ -30,9 +30,7 @@
 
 #if wxUSE_GUI
 #if wxOSX_USE_COCOA_OR_CARBON
-    #include "wx/osx/uma.h"
     #include <CoreServices/CoreServices.h>
-    #include <Carbon/Carbon.h>
     #include "wx/osx/private/timer.h"
 #endif
 #endif // wxUSE_GUI
@@ -57,6 +55,17 @@ void wxMacWakeUp()
 }
 
 #endif // wxUSE_BASE
+bool wxApp::DoInitGui()
+{
+    [NSApplication sharedApplication];
+    [NSApp finishLaunching];
+    return true;
+}
+
+void wxApp::DoCleanUp()
+{
+}
 
 #if wxUSE_GUI
 
@@ -82,7 +91,7 @@ void wxGetMousePosition( int* x, int* y )
 
 wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
 {
-    return new wxCarbonTimerImpl(timer);
+    return new wxOSXTimerImpl(timer);
 }
 
 int gs_wxBusyCursorCount = 0;
index 90311dff78f3891f7bb103c56b1de2bb24d966d9..9345dc988c0a37e38d151bf0421098ba7cc87c3b 100644 (file)
 #include "wx/osx/private.h"
 #endif
 
-#if wxOSX_USE_COCOA
+NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin )
+{
+    int x, y, w, h ;
+
+    window->MacGetBoundsForControl( pos , size , x , y, w, h , adjustForOrigin ) ;
+    wxRect bounds(x,y,w,h);
+    NSView* sv = (window->GetParent()->GetHandle() );
+
+    return wxToNSRect( sv, bounds );
+}
 
 @interface wxNSView : NSView
 {
-    wxWidgetImpl* m_impl;
+    wxWidgetImpl* impl;
 }
 
 - (void)drawRect: (NSRect) rect;
@@ -59,7 +68,7 @@ void SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent )
     wxevent.m_altDown = modifiers & NSAlternateKeyMask;
     wxevent.m_metaDown = modifiers & NSCommandKeyMask;
     wxevent.m_clickCount = clickCount;
-    wxevent.SetTimestamp( [nsEvent timestamp] ) ;
+    wxevent.SetTimestamp( [nsEvent timestamp] * 1000.0 ) ;
 /*
     // a control click is interpreted as a right click
     bool thisButtonIsFakeRight = false ;
@@ -182,12 +191,15 @@ void SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent )
 
 @implementation wxNSView
 
+#define OSX_DEBUG_DRAWING 0
+
 - (void)drawRect: (NSRect) rect
 {
-    if ( m_impl )
+    if ( impl )
     {
         CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
         CGContextSaveGState( context );
+#if OSX_DEBUG_DRAWING
         CGContextBeginPath( context );
         CGContextMoveToPoint(context, 0, 0);
         NSRect bounds = [self bounds];
@@ -200,19 +212,33 @@ void SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent )
         CGContextAddLineToPoint(context, bounds.size.width-10, bounds.size.height);
         CGContextClosePath( context );
         CGContextStrokePath(context);
+#endif
 
         if ( [ self isFlipped ] == NO )
         {
             CGContextTranslateCTM( context, 0,  [self bounds].size.height );
             CGContextScaleCTM( context, 1, -1 );
         }
-        m_impl->GetWXPeer()->MacSetCGContextRef( context );
+        
+        wxRegion updateRgn;
+        const NSRect *rects;
+        int count ;
+
+        [self getRectsBeingDrawn:&rects count:&count];
+        for ( int i = 0 ; i < count ; ++i )
+        {
+            updateRgn.Union(wxFromNSRect(self, rects[i]) );
+        }
 
+        wxWindow* wxpeer = impl->GetWXPeer();
+        wxpeer->GetUpdateRegion() = updateRgn;
+        wxpeer->MacSetCGContextRef( context );
+        
         wxPaintEvent event;
         event.SetTimestamp(0); //  todo
-        event.SetEventObject(m_impl->GetWXPeer());
-        m_impl->GetWXPeer()->HandleWindowEvent(event);
-        
+        event.SetEventObject(wxpeer);
+        wxpeer->HandleWindowEvent(event);
+                
         CGContextRestoreGState( context );
     }
 }
@@ -256,17 +282,17 @@ void SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent )
     SetupMouseEvent( wxevent , event ) ;
     wxevent.m_x = pt.x;
     wxevent.m_y = pt.y;
-    m_impl->GetWXPeer()->HandleWindowEvent(wxevent);
+    impl->GetWXPeer()->HandleWindowEvent(wxevent);
 }
 
 - (void)setImplementation: (wxWidgetImpl *) theImplementation
 {
-    m_impl = theImplementation;
+    impl = theImplementation;
 }
 
 - (wxWidgetImpl*) implementation
 {
-    return m_impl;
+    return impl;
 }
 
 - (BOOL) isFlipped
@@ -313,7 +339,14 @@ void wxWidgetCocoaImpl::Init()
 
 wxWidgetCocoaImpl::~wxWidgetCocoaImpl()
 {
-    [m_osxView setImplementation:NULL];
+    if ( [m_osxView respondsToSelector:@selector(setImplementation:) ] )
+        [m_osxView setImplementation:NULL];
+    if ( !IsRootControl() )
+    {
+        NSView *sv = [m_osxView superview];
+        if ( sv != nil )
+            [m_osxView removeFromSuperview];
+    }
     [m_osxView release];
 }
     
@@ -322,6 +355,11 @@ bool wxWidgetCocoaImpl::IsVisible() const
     return [m_osxView isHiddenOrHasHiddenAncestor] == NO;
 }
 
+void wxWidgetCocoaImpl::SetVisibility( bool visible )
+{
+    [m_osxView setHidden:(visible ? NO:YES)];
+}
+
 void wxWidgetCocoaImpl::Raise()
 {
 }
@@ -354,7 +392,7 @@ void wxWidgetCocoaImpl::GetSize( int &width, int &height ) const
     height = rect.size.height;
 }
 
-void wxWidgetCocoaImpl::GetContentArea( int&left, int &top, int &width, int &height )
+void wxWidgetCocoaImpl::GetContentArea( int&left, int &top, int &width, int &height ) const
 {
     left = top = 0;
     GetSize( width, height );
@@ -373,19 +411,23 @@ bool wxWidgetCocoaImpl::GetNeedsDisplay() const
     return [m_osxView needsDisplay];
 }
 
-void wxWidgetCocoaImpl::CanFocus() const
+bool wxWidgetCocoaImpl::CanFocus() const
 {
-    return [m_osxView acceptsFirstResponder] == YES;
+    return [m_osxView canBecomeKeyView] == YES;
 }
 
 bool wxWidgetCocoaImpl::HasFocus() const
 {
-    return [m_osxView isFirstResponder] == YES;
+    return ( [[m_osxView window] firstResponder] == m_osxView );
 }
 
 bool wxWidgetCocoaImpl::SetFocus() 
 {
-    [m_osxView makeKeyWindow] ;
+    if ( [m_osxView canBecomeKeyView] == NO )
+        return false;
+        
+    [[m_osxView window] makeFirstResponder: m_osxView] ;
+    return true;
 }
 
 
@@ -401,18 +443,121 @@ void wxWidgetCocoaImpl::Embed( wxWidgetImpl *parent )
     [container addSubview:m_osxView];
 }
 
+void wxWidgetCocoaImpl::SetBackgroundColour( const wxColour &WXUNUSED(col) )
+{
+    // m_osxView.backgroundColor = [[UIColor alloc] initWithCGColor:col.GetCGColor()];
+}
+
+void wxWidgetCocoaImpl::SetLabel( const wxString& title, wxFontEncoding encoding )
+{
+    if ( [m_osxView respondsToSelector:@selector(setTitle:) ] )
+    {
+        wxCFStringRef cf( title , m_wxPeer->GetFont().GetEncoding() );
+        [m_osxView setTitle:cf.AsNSString()];
+    }
+}
+    
+
+void  wxWidgetImpl::Convert( wxPoint *pt , wxWidgetImpl *from , wxWidgetImpl *to )
+{
+    NSPoint p = wxToNSPoint( from->GetWXWidget(), *pt );
+    p = [from->GetWXWidget() convertPoint:p toView:to->GetWXWidget() ]; 
+    *pt = wxFromNSPoint( to->GetWXWidget(), p );
+}
+
+wxInt32 wxWidgetCocoaImpl::GetValue() const 
+{
+    return [(NSControl*)m_osxView intValue];
+}
+
+void wxWidgetCocoaImpl::SetValue( wxInt32 v ) 
+{
+    if (  [m_osxView respondsToSelector:@selector(setIntValue:)] )
+    {
+        [m_osxView setIntValue:v];
+    }
+    else if (  [m_osxView respondsToSelector:@selector(setFloatValue:)] )
+    {
+        [m_osxView setFloatValue:(double)v];
+    }
+    else if (  [m_osxView respondsToSelector:@selector(setDoubleValue:)] )
+    {
+        [m_osxView setDoubleValue:(double)v];
+    }
+}
+
+void wxWidgetCocoaImpl::SetMinimum( wxInt32 v ) 
+{
+    if (  [m_osxView respondsToSelector:@selector(setMinValue:)] )
+    {
+        [m_osxView setMinValue:(double)v];
+    }
+}
+
+void wxWidgetCocoaImpl::SetMaximum( wxInt32 v ) 
+{
+    if (  [m_osxView respondsToSelector:@selector(setMaxValue:)] )
+    {
+        [m_osxView setMaxValue:(double)v];
+    }
+}
+
+void wxWidgetCocoaImpl::SetBitmap( const wxBitmap& bitmap )
+{
+    if (  [m_osxView respondsToSelector:@selector(setImage:)] )
+    {
+        [m_osxView setImage:bitmap.GetNSImage()];
+    }
+}
+
+void wxWidgetCocoaImpl::SetupTabs( const wxNotebook& notebook)
+{
+    // implementation in subclass
+}
+
+void wxWidgetCocoaImpl::GetBestRect( wxRect *r ) const
+{
+    r->x = r->y = r->width = r->height = 0;
+//    if (  [m_osxView isKindOfClass:[NSControl class]] )
+    if (  [m_osxView respondsToSelector:@selector(sizeToFit)] )
+    {
+        NSRect former = [m_osxView frame];
+        [m_osxView sizeToFit];
+        NSRect best = [m_osxView frame];
+        [m_osxView setFrame:former];
+        r->width = best.size.width;
+        r->height = best.size.height;
+    }
+}
+
+bool wxWidgetCocoaImpl::IsEnabled() const
+{
+    return [m_osxView enable];
+}
+
+void wxWidgetCocoaImpl::Enable( bool enable )
+{
+    [m_osxView setEnabled:enable];
+}
+
+void wxWidgetCocoaImpl::PulseGauge()
+{
+}
+
+void wxWidgetCocoaImpl::SetScrollThumb( wxInt32 val, wxInt32 view )
+{
+}
 
 //
 // Factory methods
 //
 
-wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, const wxPoint& pos, const wxSize& size,
-                            long style, long extraStyle, const wxString& name)
+wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
+                            long style, long extraStyle)
 {
     NSView* sv = (wxpeer->GetParent()->GetHandle() );
     
-    NSRect r = wxToNSRect( sv, wxRect( pos, size) );
-    // Rect bounds = wxMacGetBoundsForControl( wxpeer, pos , size ) ;
+    NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
     wxNSView* v = [[wxNSView alloc] initWithFrame:r];
     [sv addSubview:v];
     wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
@@ -429,6 +574,3 @@ wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now )
     [tlw setContentView:v];
     return c;
 }
-
-
-#endif