notebook.mm 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name: src/cocoa/notebook.mm
  3. // Purpose: wxNotebook
  4. // Author: David Elliott
  5. // Modified by:
  6. // Created: 2004/04/08
  7. // Copyright: (c) 2004 David Elliott
  8. // Licence: wxWindows licence
  9. /////////////////////////////////////////////////////////////////////////////
  10. #include "wx/wxprec.h"
  11. #if wxUSE_NOTEBOOK
  12. #ifndef WX_PRECOMP
  13. #include "wx/app.h"
  14. #endif //WX_PRECOMP
  15. #include "wx/notebook.h"
  16. #include "wx/imaglist.h"
  17. #include "wx/cocoa/autorelease.h"
  18. #include "wx/cocoa/string.h"
  19. #include "wx/cocoa/objc/objc_uniquifying.h"
  20. #import <AppKit/NSTabView.h>
  21. #import <AppKit/NSTabViewItem.h>
  22. #import <AppKit/NSImage.h>
  23. // testing:
  24. #import <AppKit/NSPasteboard.h>
  25. #import <Foundation/NSArray.h>
  26. // ========================================================================
  27. // WXCTabViewImageItem
  28. // ========================================================================
  29. @interface WXCTabViewImageItem : NSTabViewItem
  30. {
  31. NSImage *m_image;
  32. }
  33. - (id)init;
  34. - (id)initWithIdentifier: (id)identifier;
  35. - (void)dealloc;
  36. - (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel;
  37. - (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect;
  38. - (NSImage*)image;
  39. - (void)setImage:(NSImage*)image;
  40. @end // interface WXCTabViewImageItem : NSTabViewItem
  41. WX_DECLARE_GET_OBJC_CLASS(WXCTabViewImageItem,NSTabViewItem)
  42. @implementation WXCTabViewImageItem : NSTabViewItem
  43. - (id)init
  44. {
  45. return [self initWithIdentifier:nil];
  46. }
  47. - (id)initWithIdentifier: (id)identifier;
  48. {
  49. m_image = nil;
  50. return [super initWithIdentifier:identifier];
  51. }
  52. - (void)dealloc
  53. {
  54. [m_image release];
  55. [super dealloc];
  56. }
  57. - (NSSize)sizeOfLabel:(BOOL)shouldTruncateLabel
  58. {
  59. NSSize labelSize = [super sizeOfLabel:shouldTruncateLabel];
  60. if(!m_image)
  61. return labelSize;
  62. NSSize imageSize = [m_image size];
  63. // scale image size
  64. if(imageSize.height > labelSize.height)
  65. {
  66. imageSize.width *= labelSize.height/imageSize.height;
  67. imageSize.height *= labelSize.height/imageSize.height;
  68. [m_image setScalesWhenResized:YES];
  69. [m_image setSize: imageSize];
  70. }
  71. labelSize.width += imageSize.width;
  72. return labelSize;
  73. }
  74. - (void)drawLabel:(BOOL)shouldTruncateLabel inRect:(NSRect)tabRect
  75. {
  76. if(m_image)
  77. {
  78. NSSize imageSize = [m_image size];
  79. [m_image compositeToPoint:NSMakePoint(tabRect.origin.x,
  80. tabRect.origin.y+imageSize.height)
  81. operation:NSCompositeSourceOver];
  82. tabRect.size.width -= imageSize.width;
  83. tabRect.origin.x += imageSize.width;
  84. }
  85. [super drawLabel:shouldTruncateLabel inRect:tabRect];
  86. }
  87. - (NSImage*)image
  88. {
  89. return m_image;
  90. }
  91. - (void)setImage:(NSImage*)image
  92. {
  93. [image retain];
  94. [m_image release];
  95. m_image = image;
  96. if(!m_image)
  97. return;
  98. [[NSPasteboard generalPasteboard]
  99. declareTypes:[NSArray arrayWithObject:NSTIFFPboardType]
  100. owner:nil];
  101. [[NSPasteboard generalPasteboard]
  102. setData:[m_image TIFFRepresentation]
  103. forType:NSTIFFPboardType];
  104. }
  105. @end // implementation WXCTabViewImageItem : NSTabViewItem
  106. WX_IMPLEMENT_GET_OBJC_CLASS(WXCTabViewImageItem,NSTabViewItem)
  107. // ========================================================================
  108. // wxNotebook
  109. // ========================================================================
  110. BEGIN_EVENT_TABLE(wxNotebook, wxNotebookBase)
  111. END_EVENT_TABLE()
  112. WX_IMPLEMENT_COCOA_OWNER(wxNotebook,NSTabView,NSView,NSView)
  113. bool wxNotebook::Create(wxWindow *parent, wxWindowID winid,
  114. const wxPoint& pos,
  115. const wxSize& size,
  116. long style,
  117. const wxString& name)
  118. {
  119. wxAutoNSAutoreleasePool pool;
  120. if(!CreateControl(parent,winid,pos,size,style,wxDefaultValidator,name))
  121. return false;
  122. m_cocoaNSView = NULL;
  123. SetNSTabView([[NSTabView alloc] initWithFrame:MakeDefaultNSRect(size)]);
  124. do
  125. {
  126. NSTabViewType tabViewType;
  127. if(style & wxNB_TOP)
  128. tabViewType = NSTopTabsBezelBorder;
  129. else if(style & wxNB_LEFT)
  130. tabViewType = NSLeftTabsBezelBorder;
  131. else if(style & wxNB_RIGHT)
  132. tabViewType = NSRightTabsBezelBorder;
  133. else if(style & wxNB_BOTTOM)
  134. tabViewType = NSBottomTabsBezelBorder;
  135. else
  136. break;
  137. [GetNSTabView() setTabViewType:tabViewType];
  138. } while(0);
  139. if(m_parent)
  140. m_parent->CocoaAddChild(this);
  141. SetInitialFrameRect(pos,size);
  142. return true;
  143. }
  144. wxNotebook::~wxNotebook()
  145. {
  146. }
  147. void wxNotebook::SetPadding(const wxSize& padding)
  148. { // Can't do
  149. }
  150. void wxNotebook::SetTabSize(const wxSize& sz)
  151. { // Can't do
  152. }
  153. void wxNotebook::SetPageSize(const wxSize& size)
  154. {
  155. }
  156. wxNotebookPage *wxNotebook::DoRemovePage(size_t nPage)
  157. {
  158. wxNotebookPage *page = wxNotebookBase::DoRemovePage(nPage);
  159. if(!page)
  160. return NULL;
  161. NSTabViewItem *tvitem = [GetNSTabView() tabViewItemAtIndex: nPage];
  162. wxASSERT(tvitem);
  163. [tvitem retain];
  164. [GetNSTabView() removeTabViewItem:tvitem];
  165. // Remove the child window as a notebook page
  166. wxASSERT(static_cast<NSView*>([tvitem view]) == page->GetNSViewForSuperview());
  167. [tvitem setView:nil];
  168. [tvitem release];
  169. // Make it back into a normal child window
  170. [m_cocoaNSView addSubview: page->GetNSViewForSuperview()];
  171. return page;
  172. }
  173. bool wxNotebook::DeletePage(size_t nPage)
  174. {
  175. return wxNotebookBase::DeletePage(nPage);
  176. }
  177. bool wxNotebook::InsertPage( size_t pos,
  178. wxNotebookPage *page, const wxString& title,
  179. bool bSelect, int imageId)
  180. {
  181. wxAutoNSAutoreleasePool pool;
  182. m_pages.Insert(page,pos);
  183. NSTabViewItem *tvitem = [[WX_GET_OBJC_CLASS(WXCTabViewImageItem) alloc] initWithIdentifier:nil];
  184. [tvitem setLabel: wxNSStringWithWxString(title)];
  185. const wxBitmap *bmp = (imageId!=-1)?m_imageList->GetBitmapPtr(imageId):NULL;
  186. if(bmp)
  187. [(WXCTabViewImageItem*) tvitem setImage: bmp->GetNSImage(true)];
  188. NSView *pageNSView = page->GetNSViewForSuperview();
  189. // Remove it as a normal child
  190. wxASSERT(m_cocoaNSView == [pageNSView superview]);
  191. [pageNSView removeFromSuperview];
  192. // And make it a notebook page
  193. [tvitem setView: pageNSView];
  194. [GetNSTabView() insertTabViewItem:tvitem atIndex:pos];
  195. [tvitem release];
  196. return true;
  197. }
  198. bool wxNotebook::DeleteAllPages()
  199. {
  200. while(!m_pages.IsEmpty())
  201. DeletePage(0);
  202. return true;
  203. }
  204. bool wxNotebook::SetPageText(size_t nPage, const wxString& title)
  205. {
  206. NSTabViewItem *tvitem = [GetNSTabView() tabViewItemAtIndex: nPage];
  207. if(!tvitem)
  208. return false;
  209. [tvitem setLabel: wxNSStringWithWxString(title)];
  210. return true;
  211. }
  212. wxString wxNotebook::GetPageText(size_t nPage) const
  213. {
  214. return wxStringWithNSString([[GetNSTabView() tabViewItemAtIndex: nPage] label]);
  215. }
  216. int wxNotebook::GetPageImage(size_t nPage) const
  217. {
  218. // To do this we'd need to keep track of this, which we don't!
  219. return -1;
  220. }
  221. bool wxNotebook::SetPageImage(size_t nPage, int nImage)
  222. {
  223. const wxBitmap *bmp = nImage!=-1?m_imageList->GetBitmapPtr(nImage):NULL;
  224. if(!bmp)
  225. return false;
  226. NSTabViewItem *tvitem = [GetNSTabView() tabViewItemAtIndex: nPage];
  227. if(!tvitem)
  228. return false;
  229. [(WXCTabViewImageItem*) tvitem setImage: bmp->GetNSImage(true)];
  230. return true;
  231. }
  232. int wxNotebook::SetSelection(size_t nPage)
  233. {
  234. const int pageOld = GetSelection();
  235. if ( !SendPageChangingEvent(nPage) )
  236. return pageOld;
  237. int page = ChangeSelection(nPage);
  238. if ( page != wxNOT_FOUND )
  239. {
  240. SendPageChangedEvent(pageOld);
  241. }
  242. return page;
  243. }
  244. int wxNotebook::ChangeSelection(size_t nPage)
  245. {
  246. wxAutoNSAutoreleasePool pool;
  247. [GetNSTabView() selectTabViewItemAtIndex:nPage];
  248. return GetSelection();
  249. }
  250. int wxNotebook::GetSelection() const
  251. {
  252. NSTabViewItem *selectedItem = [GetNSTabView() selectedTabViewItem];
  253. if(!selectedItem)
  254. return wxNOT_FOUND;
  255. return [GetNSTabView() indexOfTabViewItem:selectedItem];
  256. }
  257. void wxNotebook::CocoaDelegate_tabView_didSelectTabViewItem(WX_NSTabViewItem tabViewItem)
  258. {
  259. // FIXME: oldSel probably == newSel
  260. wxBookCtrlEvent event(wxEVT_NOTEBOOK_PAGE_CHANGED, GetId(),
  261. [GetNSTabView() indexOfTabViewItem:tabViewItem], GetSelection());
  262. event.SetEventObject(this);
  263. GetEventHandler()->ProcessEvent(event);
  264. }
  265. bool wxNotebook::CocoaDelegate_tabView_shouldSelectTabViewItem(WX_NSTabViewItem tabViewItem)
  266. {
  267. wxBookCtrlEvent event(wxEVT_NOTEBOOK_PAGE_CHANGING, GetId(),
  268. [GetNSTabView() indexOfTabViewItem:tabViewItem], GetSelection());
  269. event.SetEventObject(this);
  270. return !HandleWindowEvent(event) || event.IsAllowed();
  271. }
  272. #endif // wxUSE_NOTEBOOK