X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c005ff76d730891c038de560b49a0c39fa6924f..7f4dc78d358e4f33fbc53d9d4469a735cf0fd19b:/src/gtk/tabctrl.cpp diff --git a/src/gtk/tabctrl.cpp b/src/gtk/tabctrl.cpp new file mode 100644 index 0000000000..a12cf6ca59 --- /dev/null +++ b/src/gtk/tabctrl.cpp @@ -0,0 +1,329 @@ +///////////////////////////////////////////////////////////////////////////// +// 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