]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/notebook.mm
fixing coordinate conversions for captured windows
[wxWidgets.git] / src / osx / cocoa / notebook.mm
index 297650a5542ccfc9aba2e79bd3704ccec392ffeb..bba36f5d942a676467d7cbf8ce3d4e17c4d56765 100644 (file)
 #include "wx/imaglist.h"
 #include "wx/osx/private.h"
 
-@interface wxNSTabView : NSTabView
+//
+// controller
+//
+
+@interface wxTabViewController : NSObject wxOSX_10_6_AND_LATER(<NSTabViewDelegate>)
 {
-    wxWidgetImpl* m_impl;
 }
 
-- (void)setImplementation: (wxWidgetImpl *) theImplementation;
-- (wxWidgetImpl*) implementation;
-- (BOOL) isFlipped;
-- (int) intValue;
-- (void) setIntValue:(int) v;
+- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
 
 @end
 
-@implementation wxNSTabView
-
-- (void)setImplementation: (wxWidgetImpl *) theImplementation
+@interface wxNSTabView : NSTabView
 {
-    m_impl = theImplementation;
 }
 
-- (wxWidgetImpl*) implementation
+@end
+
+@implementation wxTabViewController
+
+- (id) init
 {
-    return m_impl;
+    [super init];
+    return self;
 }
 
-- (BOOL) isFlipped
+- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem
 {
+    wxUnusedVar(tabViewItem);
+    wxNSTabView* view = (wxNSTabView*) tabView;
+    wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( view );
+
+    if ( viewimpl )
+    {
+        // wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
+    }
     return YES;
 }
 
-- (int) intValue
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
+
 {
-    NSTabViewItem* selectedItem = [self selectedTabViewItem];
-    if ( selectedItem == nil )
-        return 0;
-    else
-        return [self indexOfTabViewItem:selectedItem]+1;
+    wxUnusedVar(tabViewItem);
+    wxNSTabView* view = (wxNSTabView*) tabView;
+    wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( view );
+    if ( viewimpl )
+    {
+        wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
+        wxpeer->OSXHandleClicked(0);
+    }
 }
 
-- (void) setIntValue:(int) v
+@end
+
+@implementation wxNSTabView
+
++ (void)initialize
 {
-    [self selectTabViewItemAtIndex:(v-1)];
+    static BOOL initialized = NO;
+    if (!initialized)
+    {
+        initialized = YES;
+        wxOSXCocoaClassAddWXMethods( self );
+    }
 }
 
 @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 = (int)r.origin.x;
+        top = (int)r.origin.y;
+        width = (int)r.size.width;
+        height = (int)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 );
     verify_noerr( err );
 #endif
 */
-wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer, 
-                                    wxWindowMac* parent, 
-                                    wxWindowID id, 
-                                    const wxPoint& pos, 
+wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
+                                    wxWindowMac* WXUNUSED(parent),
+                                    wxWindowID WXUNUSED(id),
+                                    const wxPoint& pos,
                                     const wxSize& size,
-                                    long style, 
-                                    long extraStyle)
+                                    long style,
+                                    long WXUNUSED(extraStyle))
 {
-    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;
-    */
-    
+    static wxTabViewController* controller = NULL;
+
+    if ( !controller )
+        controller =[[wxTabViewController alloc] init];
+
+    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;
     else if ( style & wxBK_BOTTOM )
         tabstyle = NSBottomTabsBezelBorder;
-    
+
     wxNSTabView* v = [[wxNSTabView alloc] initWithFrame:r];
-    [sv addSubview:v];
     [v setTabViewType:tabstyle];
-    wxWidgetCocoaImpl* c = new wxWidgetCocoaImpl( wxpeer, v );
-    [v setImplementation:c];
+    wxWidgetCocoaImpl* c = new wxCocoaTabView( wxpeer, v );
+    [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