]> git.saurik.com Git - wxWidgets.git/blob - src/osx/carbon/notebmac.cpp
Fit modeless preferences dialog to its contents too.
[wxWidgets.git] / src / osx / carbon / notebmac.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/notebmac.cpp
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 // check that the page index is valid
31 #define IS_VALID_PAGE(nPage) ((nPage) < GetPageCount())
32
33 class wxCarbonTabView : public wxMacControl
34 {
35 public:
36 wxCarbonTabView( wxWindowMac* peer ) : wxMacControl(peer )
37 {
38 }
39
40 // Added by Mark Newsam
41 // When a page is added or deleted to the notebook this function updates
42 // information held in the control so that it matches the order
43 // the user would expect.
44 //
45 void SetupTabs( const wxNotebook& notebook)
46 {
47 const size_t countPages = notebook.GetPageCount();
48 SetMaximum( countPages ) ;
49
50 wxNotebookPage *page;
51 ControlTabInfoRecV1 info;
52
53 for (size_t ii = 0; ii < countPages; ii++)
54 {
55 page = (wxNotebookPage*) notebook.GetPage(ii);
56 info.version = kControlTabInfoVersionOne;
57 info.iconSuiteID = 0;
58 wxCFStringRef cflabel( page->GetLabel(), page->GetFont().GetEncoding() ) ;
59 info.name = cflabel ;
60 SetData<ControlTabInfoRecV1>( ii + 1, kControlTabInfoTag, &info ) ;
61
62 if ( notebook.GetImageList() && notebook.GetPageImage(ii) >= 0 )
63 {
64 const wxBitmap bmap = notebook.GetImageList()->GetBitmap( notebook.GetPageImage( ii ) ) ;
65 if ( bmap.IsOk() )
66 {
67 ControlButtonContentInfo info ;
68
69 wxMacCreateBitmapButton( &info, bmap ) ;
70
71 OSStatus err = SetData<ControlButtonContentInfo>( ii + 1, kControlTabImageContentTag, &info );
72 if ( err != noErr )
73 {
74 wxFAIL_MSG("Error when setting icon on tab");
75 }
76
77 wxMacReleaseBitmapButton( &info ) ;
78 }
79 }
80 SetTabEnabled( ii + 1, true ) ;
81 }
82 }
83
84 int TabHitTest(const wxPoint & pt, long* flags)
85 {
86 int resultV = wxNOT_FOUND;
87
88 wxNotebook *notebookpeer = wxDynamicCast( GetWXPeer() , wxNotebook );
89 if ( NULL == notebookpeer )
90 return wxNOT_FOUND;
91
92 const int countPages = notebookpeer->GetPageCount();
93
94 // we have to convert from Client to Window relative coordinates
95 wxPoint adjustedPt = pt + GetWXPeer()->GetClientAreaOrigin();
96 // and now to HIView native ones
97 adjustedPt.x -= GetWXPeer()->MacGetLeftBorderSize() ;
98 adjustedPt.y -= GetWXPeer()->MacGetTopBorderSize() ;
99
100 HIPoint hipoint= { adjustedPt.x , adjustedPt.y } ;
101 HIViewPartCode outPart = 0 ;
102 OSStatus err = HIViewGetPartHit( GetControlRef(), &hipoint, &outPart );
103
104 int max = GetMaximum() ;
105 if ( outPart == 0 && max > 0 )
106 {
107 // this is a hack, as unfortunately a hit on an already selected tab returns 0,
108 // so we have to go some extra miles to make sure we select something different
109 // and try again ..
110 int val = GetValue() ;
111 int maxval = max ;
112 if ( max == 1 )
113 {
114 SetMaximum( 2 ) ;
115 maxval = 2 ;
116 }
117
118 if ( val == 1 )
119 SetValue( maxval ) ;
120 else
121 SetValue( 1 ) ;
122
123 err = HIViewGetPartHit( GetControlRef(), &hipoint, &outPart );
124
125 SetValue( val ) ;
126 if ( max == 1 )
127 SetMaximum( 1 ) ;
128 }
129
130 if ( outPart >= 1 && outPart <= countPages )
131 resultV = outPart - 1 ;
132
133 if (flags != NULL)
134 {
135 *flags = 0;
136
137 // we cannot differentiate better
138 if (resultV >= 0)
139 *flags |= wxBK_HITTEST_ONLABEL;
140 else
141 *flags |= wxBK_HITTEST_NOWHERE;
142 }
143
144 return resultV;
145
146 }
147
148 };
149
150 wxWidgetImplType* wxWidgetImpl::CreateTabView( wxWindowMac* wxpeer,
151 wxWindowMac* parent,
152 wxWindowID WXUNUSED(id),
153 const wxPoint& pos,
154 const wxSize& size,
155 long style,
156 long WXUNUSED(extraStyle))
157 {
158 Rect bounds = wxMacGetBoundsForControl( wxpeer, pos, size );
159
160 if ( bounds.right <= bounds.left )
161 bounds.right = bounds.left + 100;
162 if ( bounds.bottom <= bounds.top )
163 bounds.bottom = bounds.top + 100;
164
165 UInt16 tabstyle = kControlTabDirectionNorth;
166 if ( style & wxBK_LEFT )
167 tabstyle = kControlTabDirectionWest;
168 else if ( style & wxBK_RIGHT )
169 tabstyle = kControlTabDirectionEast;
170 else if ( style & wxBK_BOTTOM )
171 tabstyle = kControlTabDirectionSouth;
172
173 ControlTabSize tabsize;
174 switch (wxpeer->GetWindowVariant())
175 {
176 case wxWINDOW_VARIANT_MINI:
177 tabsize = 3 ;
178 break;
179
180 case wxWINDOW_VARIANT_SMALL:
181 tabsize = kControlTabSizeSmall;
182 break;
183
184 default:
185 tabsize = kControlTabSizeLarge;
186 break;
187 }
188
189 wxMacControl* peer = new wxCarbonTabView( wxpeer );
190
191 OSStatus err = CreateTabsControl(
192 MAC_WXHWND(parent->MacGetTopLevelWindowRef()), &bounds,
193 tabsize, tabstyle, 0, NULL, peer->GetControlRefAddr() );
194 verify_noerr( err );
195
196 return peer;
197 }
198
199 #endif