1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
7 // Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "notebook.h"
15 #include "wx/notebook.h"
18 #include "wx/imaglist.h"
22 //-----------------------------------------------------------------------------
24 //-----------------------------------------------------------------------------
26 class wxNotebookPage
: public wxObject
43 GtkNotebookPage
*m_page
;
46 GtkNotebook
*m_parent
;
49 //-----------------------------------------------------------------------------
51 //-----------------------------------------------------------------------------
53 // page change callback
54 static void gtk_notebook_page_change_callback(GtkNotebook
*WXUNUSED(widget
),
55 GtkNotebookPage
*WXUNUSED(page
),
59 wxNotebook
*notebook
= (wxNotebook
*)data
;
61 int nOld
= notebook
->GetSelection();
63 // TODO: emulate PAGE_CHANGING event
64 wxNotebookEvent
event(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED
,
68 event
.SetEventObject(notebook
);
69 notebook
->ProcessEvent(event
);
72 //-----------------------------------------------------------------------------
74 //-----------------------------------------------------------------------------
76 BEGIN_EVENT_TABLE(wxNotebook
, wxControl
)
77 EVT_SIZE(wxNotebook::OnSize
)
80 IMPLEMENT_DYNAMIC_CLASS(wxNotebook
,wxControl
)
82 void wxNotebook::Init()
85 m_pages
.DeleteContents( TRUE
);
89 wxNotebook::wxNotebook()
94 wxNotebook::wxNotebook( wxWindow
*parent
, wxWindowID id
,
95 const wxPoint
& pos
, const wxSize
& size
,
96 long style
, const wxString
& name
)
99 Create( parent
, id
, pos
, size
, style
, name
);
102 wxNotebook::~wxNotebook()
104 // don't generate change page events any more
105 if ( m_idHandler
!= 0 )
106 gtk_signal_disconnect(GTK_OBJECT(m_widget
), m_idHandler
);
113 bool wxNotebook::Create(wxWindow
*parent
, wxWindowID id
,
114 const wxPoint
& pos
, const wxSize
& size
,
115 long style
, const wxString
& name
)
119 PreCreation( parent
, id
, pos
, size
, style
, name
);
121 m_widget
= gtk_notebook_new();
122 m_idHandler
= gtk_signal_connect
124 GTK_OBJECT(m_widget
), "switch_page",
125 GTK_SIGNAL_FUNC(gtk_notebook_page_change_callback
),
136 int wxNotebook::GetSelection() const
138 if (m_pages
.Number() == 0)
141 GtkNotebookPage
*g_page
= GTK_NOTEBOOK(m_widget
)->cur_page
;
143 wxNotebookPage
*page
= NULL
;
145 wxNode
*node
= m_pages
.First();
148 page
= (wxNotebookPage
*)node
->Data();
149 if (page
->m_page
== g_page
)
154 wxCHECK_MSG( node
!= NULL
, -1, "wxNotebook: no selection?");
159 int wxNotebook::GetPageCount() const
161 return m_pages
.Number();
164 int wxNotebook::GetRowCount() const
169 wxString
wxNotebook::GetPageText( int page
) const
171 wxNotebookPage
* nb_page
= GetNotebookPage(page
);
173 return nb_page
->m_text
;
178 int wxNotebook::GetPageImage( int page
) const
180 wxNotebookPage
* nb_page
= GetNotebookPage(page
);
182 return nb_page
->m_image
;
187 wxNotebookPage
* wxNotebook::GetNotebookPage(int page
) const
189 wxNotebookPage
*nb_page
= NULL
;
191 wxNode
*node
= m_pages
.First();
194 nb_page
= (wxNotebookPage
*)node
->Data();
195 if (nb_page
->m_id
== page
)
200 wxLogDebug( "Notebook page %d not found!", page
);
205 int wxNotebook::SetSelection( int page
)
207 int selOld
= GetSelection();
208 wxNotebookPage
* nb_page
= GetNotebookPage(page
);
213 GList
*child
= GTK_NOTEBOOK(m_widget
)->children
;
216 if (nb_page
->m_page
== (GtkNotebookPage
*)child
->data
)
222 if (!child
) return -1;
224 gtk_notebook_set_page( GTK_NOTEBOOK(m_widget
), page_num
);
229 void wxNotebook::AdvanceSelection(bool bForward
)
231 int nSel
= GetSelection(),
232 nMax
= GetPageCount();
235 SetSelection(nSel
== nMax
? 0 : nSel
+ 1);
238 SetSelection(nSel
== 0 ? nMax
: nSel
- 1);
242 void wxNotebook::SetImageList( wxImageList
* imageList
)
244 m_imageList
= imageList
;
247 bool wxNotebook::SetPageText( int page
, const wxString
&text
)
249 wxNotebookPage
* nb_page
= GetNotebookPage(page
);
253 nb_page
->m_text
= text
;
258 bool wxNotebook::SetPageImage( int page
, int image
)
260 wxNotebookPage
* nb_page
= GetNotebookPage(page
);
264 nb_page
->m_image
= image
;
269 void wxNotebook::SetPageSize( const wxSize
&WXUNUSED(size
) )
271 wxFAIL_MSG("wxNotebook::SetPageSize not implemented");
274 void wxNotebook::SetPadding( const wxSize
&WXUNUSED(padding
) )
276 wxFAIL_MSG("wxNotebook::SetPadding not implemented");
279 bool wxNotebook::DeleteAllPages()
281 wxNode
*page_node
= m_pages
.First();
284 wxNotebookPage
*page
= (wxNotebookPage
*)page_node
->Data();
286 DeletePage( page
->m_id
);
288 page_node
= m_pages
.First();
294 bool wxNotebook::DeletePage( int page
)
296 wxNotebookPage
* nb_page
= GetNotebookPage(page
);
297 if (!nb_page
) return FALSE
;
300 GList
*child
= GTK_NOTEBOOK(m_widget
)->children
;
303 if (nb_page
->m_page
== (GtkNotebookPage
*)child
->data
) break;
310 delete nb_page
->m_client
;
312 // Amazingly, this is not necessary
313 // gtk_notebook_remove_page( GTK_NOTEBOOK(m_widget), page_num );
315 m_pages
.DeleteObject( nb_page
);
320 bool wxNotebook::AddPage(wxWindow
* win
, const wxString
& text
,
321 bool bSelect
, int imageId
)
323 // we've created the notebook page in AddChild(). Now we just have to set
324 // the caption for the page and set the others parameters.
326 // first, find the page
327 wxNotebookPage
*page
= NULL
;
329 wxNode
*node
= m_pages
.First();
332 page
= (wxNotebookPage
*)node
->Data();
333 if ( page
->m_client
== win
)
338 wxCHECK_MSG(page
!= NULL
, FALSE
,
339 "Can't add a page whose parent is not the notebook!");
341 // then set the attributes
343 if ( page
->m_text
.IsEmpty() )
345 page
->m_image
= imageId
;
346 gtk_label_set(page
->m_label
, page
->m_text
);
349 SetSelection(GetPageCount());
355 wxWindow
*wxNotebook::GetPage( int page
) const
357 wxNotebookPage
* nb_page
= GetNotebookPage(page
);
361 return nb_page
->m_client
;
364 void wxNotebook::AddChild( wxWindow
*win
)
366 // @@@ normally done in wxWindow::AddChild but for some reason wxNotebook
367 // case is special there (Robert?)
368 // Robert: Don't you think the code below looks different from the one
369 // in wxWindow::AddChild :-)
371 m_children
.Append(win
);
374 wxNotebookPage
*page
= new wxNotebookPage();
376 page
->m_id
= GetPageCount();
377 page
->m_label
= (GtkLabel
*)gtk_label_new("Handle");
378 page
->m_client
= win
;
379 gtk_notebook_append_page( GTK_NOTEBOOK(m_widget
), win
->m_widget
,
380 (GtkWidget
*)page
->m_label
);
381 gtk_misc_set_alignment(GTK_MISC(page
->m_label
), 0.0, 0.5);
384 (GtkNotebookPage
*) (g_list_last(GTK_NOTEBOOK(m_widget
)->children
)->data
);
386 page
->m_parent
= GTK_NOTEBOOK(m_widget
);
390 wxLogFatalError( "Notebook page creation error" );
394 m_pages
.Append( page
);
397 void wxNotebook::OnSize(wxSizeEvent
& event
)
399 // forward this event to all pages
400 wxNode
*node
= m_pages
.First();
403 wxWindow
*page
= ((wxNotebookPage
*)node
->Data())->m_client
;
404 // @@@@ the numbers I substract here are completely arbitrary, instead we
405 // should somehow calculate the size of the page from the size of the
407 page
->SetSize(event
.GetSize().GetX() - 5,
408 event
.GetSize().GetY() - 30);
410 if ( page
->GetAutoLayout() )
417 // override these 2 functions to do nothing: everything is done in OnSize
418 void wxNotebook::SetConstraintSizes(bool /* recurse */)
420 // don't set the sizes of the pages - their correct size is not yet known
421 wxControl::SetConstraintSizes(FALSE
);
424 bool wxNotebook::DoPhase(int /* nPhase */)
429 //-----------------------------------------------------------------------------
431 //-----------------------------------------------------------------------------
433 IMPLEMENT_DYNAMIC_CLASS(wxNotebookEvent
, wxCommandEvent
)