+/////////////////////////////////////////////////////////////////////////////
+// Name: tabctrl.cpp
+// Purpose:
+// Author: Robert Roebling
+// Created: 01/02/97
+// Id:
+// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
+// Licence: wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "tabctrl.h"
+#endif
+
+#include "wx/tabctrl.h"
+#include "wx/utils.h"
+#include "wx/imaglist.h"
+
+#include "wx/gtk/win_gtk.h"
+
+//-----------------------------------------------------------------------------
+// wxTabPage
+//-----------------------------------------------------------------------------
+
+class wxTabPage: public wxObject
+{
+ public:
+
+ int m_id;
+ wxString m_text;
+ int m_image;
+ void *m_clientData;
+ GtkNotebookPage *m_page;
+ GtkWidget *m_wxwindow;
+ wxList m_children;
+
+ wxTabPage(void)
+ {
+ m_id = -1;
+ m_text = "";
+ m_image = -1;
+ m_clientData = NULL;
+ m_page = NULL;
+ m_wxwindow = NULL;
+ };
+
+};
+
+//-----------------------------------------------------------------------------
+// wxTabCtrl
+//-----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(wxTabCtrl, wxControl)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(wxTabCtrl,wxControl)
+
+wxTabCtrl::wxTabCtrl(void)
+{
+ m_imageList = NULL;
+ m_pages.DeleteContents( TRUE );
+};
+
+wxTabCtrl::wxTabCtrl( wxWindow *parent, const wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const long style, const wxString& name )
+{
+ m_imageList = NULL;
+ m_pages.DeleteContents( TRUE );
+ Create( parent, id, pos, size, style, name );
+};
+
+wxTabCtrl::~wxTabCtrl(void)
+{
+ if (m_imageList) delete m_imageList;
+ DeleteAllItems();
+};
+
+bool wxTabCtrl::Create(wxWindow *parent, const wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const long style, const wxString& name )
+{
+ m_needParent = TRUE;
+
+ PreCreation( parent, id, pos, size, style, name );
+
+ m_widget = gtk_notebook_new();
+
+ PostCreation();
+
+ Show( TRUE );
+
+ return TRUE;
+};
+
+int wxTabCtrl::GetSelection(void) const
+{
+ return gtk_notebook_current_page( GTK_NOTEBOOK(m_widget) );
+};
+
+wxImageList* wxTabCtrl::GetImageList(void) const
+{
+ return m_imageList;
+};
+
+int wxTabCtrl::GetItemCount(void) const
+{
+ return m_pages.Number();
+};
+
+bool wxTabCtrl::GetItemRect( const int WXUNUSED(item), wxRect& WXUNUSED(rect) ) const
+{
+ return FALSE;
+};
+
+int wxTabCtrl::GetRowCount(void) const
+{
+ return 1;
+};
+
+wxString wxTabCtrl::GetItemText( const int item ) const
+{
+ wxNode *node = m_pages.Nth( item );
+ if (node)
+ {
+ wxTabPage *page = (wxTabPage*)node->Data();
+ return page->m_text;
+ };
+ return "";
+};
+
+int wxTabCtrl::GetItemImage( const int item ) const
+{
+ wxNode *node = m_pages.Nth( item );
+ if (node)
+ {
+ wxTabPage *page = (wxTabPage*)node->Data();
+ return page->m_image;
+ };
+ return -1;
+};
+
+void* wxTabCtrl::GetItemData( const int item ) const
+{
+ wxNode *node = m_pages.Nth( item );
+ if (node)
+ {
+ wxTabPage *page = (wxTabPage*)node->Data();
+ return page->m_clientData;
+ };
+ return NULL;
+};
+
+int wxTabCtrl::SetSelection( const int item )
+{
+ wxTabPage *page = NULL;
+
+ wxNode *node = m_pages.First();
+ while (node)
+ {
+ page = (wxTabPage*)node->Data();
+ if (page->m_id == item) break;
+ page = NULL;
+ node = node->Next();
+ };
+ if (!page) return -1;
+
+ int page_num = 0;
+ GList *child = GTK_NOTEBOOK(m_widget)->children;
+ while (child)
+ {
+ if (page->m_page == (GtkNotebookPage*)child->data) break;
+ page_num++;
+ child = child->next;
+ };
+
+ if (!child) return -1;
+
+ gtk_notebook_set_page( GTK_NOTEBOOK(m_widget), page_num );
+
+ return item;
+};
+
+void wxTabCtrl::SetImageList( wxImageList* imageList )
+{
+ m_imageList = imageList;
+};
+
+bool wxTabCtrl::SetItemText( const int WXUNUSED(item), const wxString& WXUNUSED(text) )
+{
+ return TRUE;
+};
+
+bool wxTabCtrl::SetItemImage( const int WXUNUSED(item), const int WXUNUSED(image) )
+{
+ return TRUE;
+};
+
+bool wxTabCtrl::SetItemData( const int WXUNUSED(item), void* WXUNUSED(data) )
+{
+ return TRUE;
+};
+
+void wxTabCtrl::SetItemSize( const wxSize &WXUNUSED(size) )
+{
+};
+
+void wxTabCtrl::SetPadding( const wxSize &WXUNUSED(padding) )
+{
+};
+
+bool wxTabCtrl::DeleteAllItems(void)
+{
+ wxNode *page_node = m_pages.First();
+ while (page_node)
+ {
+ wxTabPage *page = (wxTabPage*)page_node->Data();
+
+ wxNode *node = page->m_children.First();
+ while (node)
+ {
+ wxWindow *child = (wxWindow*)node->Data();
+ delete child;
+
+ node = node->Next();
+ };
+
+ gtk_widget_destroy( page->m_wxwindow );
+
+ m_pages.DeleteObject( page );
+
+ page_node = m_pages.First();
+ };
+
+ return TRUE;
+};
+
+bool wxTabCtrl::DeleteItem( const int item )
+{
+ wxTabPage *page = NULL;
+
+ wxNode *node = m_pages.First();
+ while (node)
+ {
+ page = (wxTabPage*)node->Data();
+ if (page->m_id == item) break;
+ node = node->Next();
+ };
+ if (!node) return FALSE;
+
+ node = page->m_children.First();
+ while (node)
+ {
+ wxWindow *child = (wxWindow*)node->Data();
+ delete child;
+
+ node = node->Next();
+ };
+
+ gtk_widget_destroy( page->m_wxwindow );
+
+ m_pages.DeleteObject( page );
+
+ return TRUE;
+};
+
+int wxTabCtrl::HitTest( const wxPoint &WXUNUSED(pt), long &WXUNUSED(flags) )
+{
+ return wxTAB_HITTEST_NOWHERE;
+};
+
+int wxTabCtrl::InsertItem( const int item, const wxString &text, const int imageId, void* data )
+{
+ wxTabPage *page = new wxTabPage;
+
+ page->m_text = text;
+ if (page->m_text.IsNull()) page->m_text = "";
+ page->m_id = item;
+ page->m_image = imageId;
+ page->m_clientData = data;
+
+ GtkWidget *label_widget = gtk_label_new( page->m_text );
+ gtk_misc_set_alignment( GTK_MISC(label_widget), 0.0, 0.5 );
+
+ page->m_wxwindow = gtk_myfixed_new();
+ gtk_widget_show( page->m_wxwindow );
+ gtk_widget_set_usize( page->m_wxwindow, 100, 100 );
+
+ gtk_notebook_append_page( GTK_NOTEBOOK(m_widget), page->m_wxwindow, label_widget );
+
+ page->m_page = GTK_NOTEBOOK(m_widget)->cur_page;
+
+ m_pages.Append( page );
+
+ return item;
+};
+
+void wxTabCtrl::AddChild( wxWindow *win )
+{
+ GtkNotebookPage *g_page = GTK_NOTEBOOK(m_widget)->cur_page;
+
+ wxTabPage *page = NULL;
+
+ wxNode *node = m_pages.First();
+ while (node)
+ {
+ page = (wxTabPage*)node->Data();
+ if (page->m_page == g_page) break;
+ node = node->Next();
+ };
+
+ if (!page) wxFatalError( "wxTabCtrl error" );
+
+ gtk_myfixed_put( GTK_MYFIXED(page->m_wxwindow), win->m_widget, win->m_x, win->m_y );
+ gtk_widget_set_usize( win->m_widget, win->m_width, win->m_height );
+
+ page->m_children.Append( win );
+};
+
+//-----------------------------------------------------------------------------
+// wxTabEvent
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxTabEvent, wxCommandEvent)
+
+wxTabEvent::wxTabEvent( WXTYPE commandType, int id ) :
+ wxCommandEvent(commandType, id)
+{
+};
\ No newline at end of file