]> git.saurik.com Git - wxWidgets.git/blob - src/osx/cocoa/notebook.mm
Extract PipeIOHandler class into a header and rename to wxWakeUpPipe.
[wxWidgets.git] / src / osx / cocoa / notebook.mm
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/cocoa/notebook.mm
3 // Purpose: implementation of wxNotebook
4 // Author: Stefan Csomor
5 // Modified by:
6 // Created: 1998-01-01
7 // RCS-ID: $Id$
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 #include "wx/wxprec.h"
13
14 #if wxUSE_NOTEBOOK
15
16 #include "wx/notebook.h"
17
18 #ifndef WX_PRECOMP
19 #include "wx/string.h"
20 #include "wx/log.h"
21 #include "wx/app.h"
22 #include "wx/image.h"
23 #endif
24
25 #include "wx/string.h"
26 #include "wx/imaglist.h"
27 #include "wx/osx/private.h"
28
29 //
30 // controller
31 //
32
33 @interface wxTabViewController : NSObject wxOSX_10_6_AND_LATER(<NSTabViewDelegate>)
34 {
35 }
36
37 - (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem;
38 - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
39
40 @end
41
42 @interface wxNSTabView : NSTabView
43 {
44 }
45
46 @end
47
48 @implementation wxTabViewController
49
50 - (id) init
51 {
52 self = [super init];
53 return self;
54 }
55
56 - (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem
57 {
58 wxUnusedVar(tabViewItem);
59 wxNSTabView* view = (wxNSTabView*) tabView;
60 wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( view );
61
62 if ( viewimpl )
63 {
64 // wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
65 }
66 return YES;
67 }
68
69 - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
70 {
71 wxUnusedVar(tabViewItem);
72 wxNSTabView* view = (wxNSTabView*) tabView;
73 wxWidgetCocoaImpl* viewimpl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( view );
74 if ( viewimpl )
75 {
76 wxNotebook* wxpeer = (wxNotebook*) viewimpl->GetWXPeer();
77 wxpeer->OSXHandleClicked(0);
78 }
79 }
80
81 @end
82
83 @implementation wxNSTabView
84
85 + (void)initialize
86 {
87 static BOOL initialized = NO;
88 if (!initialized)
89 {
90 initialized = YES;
91 wxOSXCocoaClassAddWXMethods( self );
92 }
93 }
94
95 @end
96
97 // ========================================================================
98 // WXCTabViewImageItem
99 // ========================================================================
100 @interface WXCTabViewImageItem : NSTabViewItem
101 {
102 NSImage *m_image;
103 }
104 - (id)init;
105 - (void)dealloc;
106 - (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel;
107 - (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect;
108 - (NSImage*)image;
109 - (void)setImage:(NSImage*)image;
110 @end // interface WXCTabViewImageItem : NSTabViewItem
111
112
113 @implementation WXCTabViewImageItem : NSTabViewItem
114 - (id)init
115 {
116 m_image = nil;
117 return [super initWithIdentifier:nil];
118 }
119 - (void)dealloc
120 {
121 [m_image release];
122 [super dealloc];
123 }
124 - (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel
125 {
126 NSSize labelSize = [super sizeOfLabel:shouldTruncateLabel];
127 if(!m_image)
128 return labelSize;
129 NSSize imageSize = [m_image size];
130 // scale image size
131 if(imageSize.height > labelSize.height)
132 {
133 imageSize.width *= labelSize.height/imageSize.height;
134 imageSize.height *= labelSize.height/imageSize.height;
135 [m_image setScalesWhenResized:YES];
136 [m_image setSize: imageSize];
137 }
138 labelSize.width += imageSize.width;
139 return labelSize;
140 }
141 - (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect
142 {
143 if(m_image)
144 {
145 NSSize imageSize = [m_image size];
146 [m_image compositeToPoint:NSMakePoint(tabRect.origin.x,
147 tabRect.origin.y+imageSize.height)
148 operation:NSCompositeSourceOver];
149 tabRect.size.width -= imageSize.width;
150 tabRect.origin.x += imageSize.width;
151 }
152 [super drawLabel:shouldTruncateLabel inRect:tabRect];
153 }
154 - (NSImage*)image
155 {
156 return m_image;
157 }
158 - (void)setImage:(NSImage*)image
159 {
160 [image retain];
161 [m_image release];
162 m_image = image;
163 if(!m_image)
164 return;
165 [[NSPasteboard generalPasteboard]
166 declareTypes:[NSArray arrayWithObject:NSTIFFPboardType]
167 owner:nil];
168 [[NSPasteboard generalPasteboard]
169 setData:[m_image TIFFRepresentation]
170 forType:NSTIFFPboardType];
171 }
172 @end // implementation WXCTabViewImageItem : NSTabViewItem
173
174
175 class wxCocoaTabView : public wxWidgetCocoaImpl
176 {
177 public:
178 wxCocoaTabView( wxWindowMac* peer , WXWidget w ) : wxWidgetCocoaImpl(peer, w)
179 {
180 }
181
182 void GetContentArea( int &left , int &top , int &width , int &height ) const
183 {
184 wxNSTabView* slf = (wxNSTabView*) m_osxView;
185 NSRect r = [slf contentRect];
186 left = (int)r.origin.x;
187 top = (int)r.origin.y;
188 width = (int)r.size.width;
189 height = (int)r.size.height;
190 }
191
192 void SetValue( wxInt32 value )
193 {
194 wxNSTabView* slf = (wxNSTabView*) m_osxView;
195 // avoid 'changed' events when setting the tab programmatically
196 wxTabViewController* controller = [slf delegate];
197 [slf setDelegate:nil];
198 [slf selectTabViewItemAtIndex:(value-1)];
199 [slf setDelegate:controller];
200 }
201
202 wxInt32 GetValue() const
203 {
204 wxNSTabView* slf = (wxNSTabView*) m_osxView;
205 NSTabViewItem* selectedItem = [slf selectedTabViewItem];
206 if ( selectedItem == nil )
207 return 0;
208 else
209 return [slf indexOfTabViewItem:selectedItem]+1;
210 }
211
212 void SetMaximum( wxInt32 maximum )
213 {
214 wxNSTabView* slf = (wxNSTabView*) m_osxView;
215 int cocoacount = [slf numberOfTabViewItems ];
216 // avoid 'changed' events when setting the tab programmatically
217 wxTabViewController* controller = [slf delegate];
218 [slf setDelegate:nil];
219
220 if ( maximum > cocoacount )
221 {
222 for ( int i = cocoacount ; i < maximum ; ++i )
223 {
224 NSTabViewItem* item = [[WXCTabViewImageItem alloc] init];
225 [slf addTabViewItem:item];
226 [item release];
227 }
228 }
229 else if ( maximum < cocoacount )
230 {
231 for ( int i = cocoacount -1 ; i >= maximum ; --i )
232 {
233 NSTabViewItem* item = [(wxNSTabView*) m_osxView tabViewItemAtIndex:i];
234 [slf removeTabViewItem:item];
235 }
236 }
237 [slf setDelegate:controller];
238 }
239
240 void SetupTabs( const wxNotebook& notebook)
241 {
242 int pcount = notebook.GetPageCount();
243
244 SetMaximum( pcount );
245
246 for ( int i = 0 ; i < pcount ; ++i )
247 {
248 wxNotebookPage* page = notebook.GetPage(i);
249 NSTabViewItem* item = [(wxNSTabView*) m_osxView tabViewItemAtIndex:i];
250 [item setView:page->GetHandle() ];
251 wxCFStringRef cf( page->GetLabel() , notebook.GetFont().GetEncoding() );
252 [item setLabel:cf.AsNSString()];
253 if ( notebook.GetImageList() && notebook.GetPageImage(i) >= 0 )
254 {
255 const wxBitmap bmap = notebook.GetImageList()->GetBitmap( notebook.GetPageImage( i ) ) ;
256 if ( bmap.IsOk() )
257 {
258 [(WXCTabViewImageItem*) item setImage: bmap.GetNSImage()];
259 }
260 }
261 }
262 }
263
264 int TabHitTest(const wxPoint & pt, long* flags)
265 {
266 int retval = wxNOT_FOUND;
267
268 NSPoint nspt = wxToNSPoint( m_osxView, pt );
269
270 wxNSTabView* slf = (wxNSTabView*) m_osxView;
271
272 NSTabViewItem* hitItem = [slf tabViewItemAtPoint:nspt];
273
274 if (!hitItem) {
275 if ( flags )
276 *flags = wxBK_HITTEST_NOWHERE;
277 } else {
278 retval = [slf indexOfTabViewItem:hitItem];
279 if ( flags )
280 *flags = wxBK_HITTEST_ONLABEL;
281 }
282
283 return retval;
284 }
285 };
286
287
288 /*
289 #if 0
290 Rect bounds = wxMacGetBoundsForControl( this, pos, size );
291
292 if ( bounds.right <= bounds.left )
293 bounds.right = bounds.left + 100;
294 if ( bounds.bottom <= bounds.top )
295 bounds.bottom = bounds.top + 100;
296
297 UInt16 tabstyle = kControlTabDirectionNorth;
298 if ( HasFlag(wxBK_LEFT) )
299 tabstyle = kControlTabDirectionWest;
300 else if ( HasFlag( wxBK_RIGHT ) )
301 tabstyle = kControlTabDirectionEast;
302 else if ( HasFlag( wxBK_BOTTOM ) )
303 tabstyle = kControlTabDirectionSouth;
304
305 ControlTabSize tabsize;
306 switch (GetWindowVariant())
307 {
308 case wxWINDOW_VARIANT_MINI:
309 tabsize = 3 ;
310 break;
311
312 case wxWINDOW_VARIANT_SMALL:
313 tabsize = kControlTabSizeSmall;
314 break;
315
316 default:
317 tabsize = kControlTabSizeLarge;
318 break;
319 }
320
321 m_peer = new wxMacControl( this );
322 OSStatus err = CreateTabsControl(
323 MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds,
324 tabsize, tabstyle, 0, NULL, GetPeer()->GetControlRefAddr() );
325 verify_noerr( err );
326 #endif
327 */
328 wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
329 wxWindowMac* WXUNUSED(parent),
330 wxWindowID WXUNUSED(id),
331 const wxPoint& pos,
332 const wxSize& size,
333 long style,
334 long WXUNUSED(extraStyle))
335 {
336 static wxTabViewController* controller = NULL;
337
338 if ( !controller )
339 controller =[[wxTabViewController alloc] init];
340
341 NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
342
343 NSTabViewType tabstyle = NSTopTabsBezelBorder;
344 if ( style & wxBK_LEFT )
345 tabstyle = NSLeftTabsBezelBorder;
346 else if ( style & wxBK_RIGHT )
347 tabstyle = NSRightTabsBezelBorder;
348 else if ( style & wxBK_BOTTOM )
349 tabstyle = NSBottomTabsBezelBorder;
350
351 wxNSTabView* v = [[wxNSTabView alloc] initWithFrame:r];
352 [v setTabViewType:tabstyle];
353 wxWidgetCocoaImpl* c = new wxCocoaTabView( wxpeer, v );
354 [v setDelegate: controller];
355 return c;
356 }
357
358 #endif