]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/cocoa/notebook.mm
Add wxTimer::StartOnce().
[wxWidgets.git] / src / osx / cocoa / notebook.mm
index e085d76899d84eab834f18f03302459301902fe2..86820dc0eaf4c8effe7c36aacab8b09205e06d27 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
-// RCS-ID:      $Id: notebmac.cpp 55079 2008-08-13 14:56:42Z PC $
+// RCS-ID:      $Id$
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
@@ -30,7 +30,7 @@
 // controller
 //
 
-@interface wxTabViewController : NSObject
+@interface wxTabViewController : NSObject wxOSX_10_6_AND_LATER(<NSTabViewDelegate>)
 {
 }
 
 
 @interface wxNSTabView : NSTabView
 {
-    wxWidgetCocoaImpl* impl;
 }
 
-- (void)setImplementation: (wxWidgetCocoaImpl *) theImplementation;
-- (wxWidgetCocoaImpl*) implementation;
-- (BOOL) isFlipped;
-
 @end
 
 @implementation wxTabViewController
 
 - (id) init
 {
-    [super init];
+    self = [super init];
     return self;
 }
 
 - (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem
 {
+    wxUnusedVar(tabViewItem);
     wxNSTabView* view = (wxNSTabView*) tabView;
-    wxWidgetCocoaImpl* viewimpl = [view implementation];
+    wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( view );
+
     if ( viewimpl )
     {
-        wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
+        // wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
     }
     return YES;
 }
 
-- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
-
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
 {
+    wxUnusedVar(tabViewItem);
     wxNSTabView* view = (wxNSTabView*) tabView;
-    wxWidgetCocoaImpl* viewimpl = [view implementation];
+    wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( view );
     if ( viewimpl )
     {
         wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
-        wxpeer->HandleClicked(0);
+        wxpeer->OSXHandleClicked(0);
     }
 }
 
 
 @implementation wxNSTabView
 
-- (void)setImplementation: (wxWidgetCocoaImpl *) theImplementation
++ (void)initialize
 {
-    impl = theImplementation;
+    static BOOL initialized = NO;
+    if (!initialized)
+    {
+        initialized = YES;
+        wxOSXCocoaClassAddWXMethods( self );
+    }
 }
 
-- (wxWidgetCocoaImpl*) implementation
+@end
+
+// ========================================================================
+// WXCTabViewImageItem
+// ========================================================================
+@interface WXCTabViewImageItem : NSTabViewItem
 {
-    return impl;
+    NSImage *m_image;
 }
+- (id)init;
+- (void)dealloc;
+- (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel;
+- (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect;
+- (NSImage*)image;
+- (void)setImage:(NSImage*)image;
+@end // interface WXCTabViewImageItem : NSTabViewItem
 
-- (BOOL) isFlipped
+
+@implementation WXCTabViewImageItem : NSTabViewItem
+- (id)init
 {
-    return YES;
+    m_image = nil;
+    return [super initWithIdentifier:nil];
+}
+- (void)dealloc
+{
+    [m_image release];
+    [super dealloc];
+}
+- (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel
+{
+    NSSize labelSize = [super sizeOfLabel:shouldTruncateLabel];
+    if(!m_image)
+        return labelSize;
+    NSSize imageSize = [m_image size];
+    // scale image size
+    if(imageSize.height > labelSize.height)
+    {
+        imageSize.width *= labelSize.height/imageSize.height;
+        imageSize.height *= labelSize.height/imageSize.height;
+        [m_image setScalesWhenResized:YES];
+        [m_image setSize: imageSize];
+    }
+    labelSize.width += imageSize.width;
+    return labelSize;
+}
+- (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect
+{
+    if(m_image)
+    {
+        NSSize imageSize = [m_image size];
+        [m_image compositeToPoint:NSMakePoint(tabRect.origin.x,
+                tabRect.origin.y+imageSize.height)
+            operation:NSCompositeSourceOver];
+        tabRect.size.width -= imageSize.width;
+        tabRect.origin.x += imageSize.width;
+    }
+    [super drawLabel:shouldTruncateLabel inRect:tabRect];
+}
+- (NSImage*)image
+{
+    return m_image;
+}
+- (void)setImage:(NSImage*)image
+{
+    [image retain];
+    [m_image release];
+    m_image = image;
+    if(!m_image)
+        return;
+    [[NSPasteboard generalPasteboard]
+        declareTypes:[NSArray arrayWithObject:NSTIFFPboardType]
+        owner:nil];
+    [[NSPasteboard generalPasteboard]
+        setData:[m_image TIFFRepresentation]
+        forType:NSTIFFPboardType];
 }
+@end // implementation WXCTabViewImageItem : NSTabViewItem
 
-@end
 
 class wxCocoaTabView : public wxWidgetCocoaImpl
 {
@@ -108,18 +178,18 @@ public:
     wxCocoaTabView( wxWindowMac* peer , WXWidget w ) : wxWidgetCocoaImpl(peer, w)
     {
     }
-    
-    void GetContentArea( int &left , int &top , int &width , int &height ) const 
+
+    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;
+        left = (int)r.origin.x;
+        top = (int)r.origin.y;
+        width = (int)r.size.width;
+        height = (int)r.size.height;
     }
-    
-    void SetValue( wxInt32 value ) 
+
+    void SetValue( wxInt32 value )
     {
         wxNSTabView* slf = (wxNSTabView*) m_osxView;
         // avoid 'changed' events when setting the tab programmatically
@@ -128,7 +198,7 @@ public:
         [slf selectTabViewItemAtIndex:(value-1)];
         [slf setDelegate:controller];
     }
-    
+
     wxInt32 GetValue() const
     {
         wxNSTabView* slf = (wxNSTabView*) m_osxView;
@@ -138,7 +208,7 @@ public:
         else
             return [slf indexOfTabViewItem:selectedItem]+1;
     }
-    
+
     void SetMaximum( wxInt32 maximum )
     {
         wxNSTabView* slf = (wxNSTabView*) m_osxView;
@@ -146,12 +216,12 @@ public:
         // 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];
+                NSTabViewItem* item = [[WXCTabViewImageItem alloc] init];
                 [slf addTabViewItem:item];
                 [item release];
             }
@@ -170,9 +240,9 @@ public:
     void SetupTabs( const wxNotebook& notebook)
     {
         int pcount = notebook.GetPageCount();
-        
+
         SetMaximum( pcount );
-        
+
         for ( int i = 0 ; i < pcount ; ++i )
         {
             wxNotebookPage* page = notebook.GetPage(i);
@@ -183,13 +253,35 @@ public:
             if ( notebook.GetImageList() && notebook.GetPageImage(i) >= 0 )
             {
                 const wxBitmap bmap = notebook.GetImageList()->GetBitmap( notebook.GetPageImage( i ) ) ;
-                if ( bmap.Ok() )
+                if ( bmap.IsOk() )
                 {
-                    // TODO how to set an image on a tab
+                    [(WXCTabViewImageItem*) item setImage: bmap.GetNSImage()];
                 }
             }
         }
     }
+
+    int TabHitTest(const wxPoint & pt, long* flags)
+    {
+        int retval = wxNOT_FOUND;
+        
+        NSPoint nspt = wxToNSPoint( m_osxView, pt );
+        
+        wxNSTabView* slf = (wxNSTabView*) m_osxView;
+        
+        NSTabViewItem* hitItem = [slf tabViewItemAtPoint:nspt];
+        
+        if (!hitItem) {
+            if ( flags )
+                *flags = wxBK_HITTEST_NOWHERE;
+        } else {
+            retval = [slf indexOfTabViewItem:hitItem];
+            if ( flags )
+                *flags = wxBK_HITTEST_ONLABEL;
+        }
+        
+        return retval; 
+    }
 };
 
 
@@ -229,27 +321,25 @@ public:
     m_peer = new wxMacControl( this );
     OSStatus err = CreateTabsControl(
         MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds,
-        tabsize, tabstyle, 0, NULL, m_peer->GetControlRefAddr() );
+        tabsize, tabstyle, 0, NULL, GetPeer()->GetControlRefAddr() );
     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))
 {
     static wxTabViewController* controller = NULL;
 
     if ( !controller )
         controller =[[wxTabViewController alloc] init];
 
-    NSView* sv = (wxpeer->GetParent()->GetHandle() );
-    
     NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
-    
+
     NSTabViewType tabstyle = NSTopTabsBezelBorder;
     if ( style & wxBK_LEFT )
         tabstyle = NSLeftTabsBezelBorder;
@@ -257,12 +347,10 @@ wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
         tabstyle = NSRightTabsBezelBorder;
     else if ( style & wxBK_BOTTOM )
         tabstyle = NSBottomTabsBezelBorder;
-    
+
     wxNSTabView* v = [[wxNSTabView alloc] initWithFrame:r];
-    [sv addSubview:v];
     [v setTabViewType:tabstyle];
     wxWidgetCocoaImpl* c = new wxCocoaTabView( wxpeer, v );
-    [v setImplementation:c];
     [v setDelegate: controller];
     return c;
 }