]> git.saurik.com Git - wxWidgets.git/blob - src/osx/cocoa/notebook.mm
notify the event loop that synthesized events are on the queue, wait for them to...
[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 *flags = wxBK_HITTEST_NOWHERE;
276 } else {
277 retval = [slf indexOfTabViewItem:hitItem];
278 *flags = wxBK_HITTEST_ONLABEL;
279 }
280
281 return retval;
282 }
283 };
284
285
286 /*
287 #if 0
288 Rect bounds = wxMacGetBoundsForControl( this, pos, size );
289
290 if ( bounds.right <= bounds.left )
291 bounds.right = bounds.left + 100;
292 if ( bounds.bottom <= bounds.top )
293 bounds.bottom = bounds.top + 100;
294
295 UInt16 tabstyle = kControlTabDirectionNorth;
296 if ( HasFlag(wxBK_LEFT) )
297 tabstyle = kControlTabDirectionWest;
298 else if ( HasFlag( wxBK_RIGHT ) )
299 tabstyle = kControlTabDirectionEast;
300 else if ( HasFlag( wxBK_BOTTOM ) )
301 tabstyle = kControlTabDirectionSouth;
302
303 ControlTabSize tabsize;
304 switch (GetWindowVariant())
305 {
306 case wxWINDOW_VARIANT_MINI:
307 tabsize = 3 ;
308 break;
309
310 case wxWINDOW_VARIANT_SMALL:
311 tabsize = kControlTabSizeSmall;
312 break;
313
314 default:
315 tabsize = kControlTabSizeLarge;
316 break;
317 }
318
319 m_peer = new wxMacControl( this );
320 OSStatus err = CreateTabsControl(
321 MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds,
322 tabsize, tabstyle, 0, NULL, GetPeer()->GetControlRefAddr() );
323 verify_noerr( err );
324 #endif
325 */
326 wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
327 wxWindowMac* WXUNUSED(parent),
328 wxWindowID WXUNUSED(id),
329 const wxPoint& pos,
330 const wxSize& size,
331 long style,
332 long WXUNUSED(extraStyle))
333 {
334 static wxTabViewController* controller = NULL;
335
336 if ( !controller )
337 controller =[[wxTabViewController alloc] init];
338
339 NSRect r = wxOSXGetFrameForControl( wxpeer, pos , size ) ;
340
341 NSTabViewType tabstyle = NSTopTabsBezelBorder;
342 if ( style & wxBK_LEFT )
343 tabstyle = NSLeftTabsBezelBorder;
344 else if ( style & wxBK_RIGHT )
345 tabstyle = NSRightTabsBezelBorder;
346 else if ( style & wxBK_BOTTOM )
347 tabstyle = NSBottomTabsBezelBorder;
348
349 wxNSTabView* v = [[wxNSTabView alloc] initWithFrame:r];
350 [v setTabViewType:tabstyle];
351 wxWidgetCocoaImpl* c = new wxCocoaTabView( wxpeer, v );
352 [v setDelegate: controller];
353 return c;
354 }
355
356 #endif