From: Vadim Zeitlin Date: Mon, 31 May 1999 17:14:12 +0000 (+0000) Subject: treectrl.cpp renamed to treegtk.cpp due to usage of VPATH in makefiles X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/28d2a709de9d2e85f70d78affadaf1a5930b23d4 treectrl.cpp renamed to treegtk.cpp due to usage of VPATH in makefiles git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2603 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/treectrl.cpp b/src/gtk/treectrl.cpp deleted file mode 100644 index 6d8fa194e1..0000000000 --- a/src/gtk/treectrl.cpp +++ /dev/null @@ -1,936 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: treectrl.cpp -// Purpose: wxTreeCtrl -// Author: Denis Pershin -// Modified by: -// Created: 07/05/98 -// RCS-ID: $Id$ -// Copyright: (c) Denis Pershin -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation "treectrl.h" -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#ifndef WX_PRECOMP -#include "wx/wx.h" -#endif - -#include "wx/gtk/treectrl.h" -#include -#include "wx/log.h" - -#include - -//static void wxConvertToGtkTreeItem(wxTreeCtrl *owner, wxTreeItem& info, GtkTreeItem **gtkItem); -//static void wxConvertFromGtkTreeItem(wxTreeItem& info, GtkTreeItem *gtkItem); - -static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data); -static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data); -static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data); - -// static void gtk_treectrl_next_callback (GtkWidget *widget, gpointer data); -// static void gtk_treectrl_next_visible_callback (GtkWidget *widget, gpointer data); -// static void gtk_treectrl_next_selected_callback (GtkWidget *widget, gpointer data); - -static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem); -static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem); -static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem); - -static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem) { - wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); - if (owner == NULL) - return; - -// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); - owner->SendExpanding(GTK_TREE_ITEM(widget)); - owner->SendExpanded(GTK_TREE_ITEM(widget)); -}; - -static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem) { - wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); - if (owner == NULL) - return; - -// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); - owner->SendCollapsing(GTK_TREE_ITEM(widget)); - owner->SendCollapsed(GTK_TREE_ITEM(widget)); -}; - -static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem) { - wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); - if (owner == NULL) - return; - -// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); - owner->SendSelChanging(GTK_TREE_ITEM(widget)); - owner->SendSelChanged(GTK_TREE_ITEM(widget)); -} - -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl) - -#endif - -void wxTreeCtrl::Init() { - m_imageListNormal = NULL; - m_imageListState = NULL; - m_textCtrl = NULL; -} - -bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, - const wxSize& size, long style, - const wxValidator& validator, const wxString& name) { - Init(); - - int x = pos.x; - int y = pos.y; - int width = size.x; - int height = size.y; - - m_windowStyle = style; - - SetParent(parent); - - if (width <= 0) - width = 100; - if (height <= 0) - height = 30; - if (x < 0) - x = 0; - if (y < 0) - y = 0; - - m_needParent = TRUE; - -printf("precreate\n"); - PreCreation( parent, id, pos, size, style, name ); - -printf("1\n"); - - m_widget = gtk_scrolled_window_new(NULL, NULL); -printf("2\n"); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(m_widget), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - -printf("3\n"); - m_tree = GTK_TREE(gtk_tree_new()); - -printf("4\n"); - gtk_container_add(GTK_CONTAINER(m_widget), GTK_WIDGET(m_tree)); -printf("5\n"); - gtk_widget_show(GTK_WIDGET(m_tree)); - - SetName(name); - SetValidator(validator); - -printf("Robert's new insertion code :-)\n"); - m_parent->DoAddChild( this ); -printf("postcreate\n"); - PostCreation(); - - gtk_widget_realize(GTK_WIDGET(m_tree)); - - Show(TRUE); - - return TRUE; -} - -wxTreeCtrl::~wxTreeCtrl(void) { - if (m_textCtrl) - delete m_textCtrl; -} - -// Attributes -static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data) { - int count = (*((int *)data)); - - count++; - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_count_callback, data); -} - -size_t wxTreeCtrl::GetCount() const { - int count = 0; - - if (m_anchor != NULL) - gtk_treectrl_count_callback(GTK_WIDGET(m_anchor), &count); - return count; -} - -unsigned int wxTreeCtrl::GetIndent() const { - return m_tree->indent_value; -} - -void wxTreeCtrl::SetIndent(unsigned int indent) { - m_tree->indent_value = indent; -} - -wxImageList *wxTreeCtrl::GetImageList() const { - return m_imageListNormal; -} - -wxImageList *wxTreeCtrl::GetStateImageList() const { - return m_imageListState; -} - -void wxTreeCtrl::SetImageList(wxImageList *imageList) { - m_imageListNormal = imageList; -} - -void wxTreeCtrl::SetStateImageList(wxImageList *imageList) { - m_imageListState = imageList; -} - -wxString wxTreeCtrl::GetItemText(const wxTreeItemId &item) const { - char *t; - - if (!item.IsOk()) - return wxString(""); - - GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); - gtk_label_get(l, &t); - - return t; -} - -int wxTreeCtrl::GetItemImage(const wxTreeItemId& item) const { - if (!item.IsOk()) - return (-1); - - return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "image"); -} - -int wxTreeCtrl::GetItemSelectedImage(const wxTreeItemId& item) const { - if (!item.IsOk()) - return (-1); - - return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage"); -} - -wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const { - if (!item.IsOk()) - return NULL; - - return (wxTreeItemData *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "data"); -} - -void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) { - if (!item.IsOk()) - return; - - GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); - gtk_label_set(l, text); -} - -void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image) { - if (!item.IsOk()) - return; - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "image", (void *)image); -} - -void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image) { - if (!item.IsOk()) - return; - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage", (void *)image); -} - -void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data) { - if (!item.IsOk()) - return; - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "data", data); -} - -bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const { - return GTK_WIDGET_VISIBLE(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - - if (p->subtree == NULL) - return wxFalse; - - if (GTK_TREE(p->subtree)->children == NULL) - return wxFalse; - - if (g_list_length(GTK_TREE(p->subtree)->children) == 0) - return wxFalse; - - return wxTrue; -} - -bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const { - return (((GtkTreeItem *)item)->expanded != 0); -} - -bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return wxFalse; - - if (g_list_index(GTK_TREE(parent)->children, p) == -1) - return wxFalse; - - return wxTrue; -} - -wxTreeItemId wxTreeCtrl::GetRootItem() const { - return m_anchor; -} - -static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data) { - GtkTreeItem *p = (*((GtkTreeItem **)data)); - - GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); - - if (tree->selection != NULL) { - p = (GtkTreeItem *)tree->selection->data; - return; - } - - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_selected_callback, data); -} - -wxTreeItemId wxTreeCtrl::GetSelection() const { - GtkTreeItem *p = NULL; - - if (m_anchor == NULL) - return NULL; - - gtk_treectrl_first_selected_callback(GTK_WIDGET(m_anchor), &p); - - return p; -} - -wxTreeItemId wxTreeCtrl::GetParent(const wxTreeItemId& item) const { - if (item.IsOk()) - return (GtkTreeItem *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "parent"); - - return NULL; -} - -wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item, long& cookie) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - cookie = 0; - return GTK_TREE_ITEM(g_list_first(GTK_TREE(parent)->children)->data); -} - -wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& item, long& cookie) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - cookie++; - return GTK_TREE_ITEM(g_list_nth(GTK_TREE(parent)->children, cookie)->data); -} - -wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const -{ - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - wxCHECK_MSG( GTK_IS_TREE(parent), NULL, "invalid tree item" ); - - return GTK_TREE_ITEM(g_list_last(GTK_TREE(parent)->children)->data); -} - -wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (g_list_index(GTK_TREE(parent)->children, p) == -1) - return NULL; - - return GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); -} - -wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (g_list_index(GTK_TREE(parent)->children, p) == -1) - return NULL; - - return GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); -} - -static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data) { - GtkTreeItem *p = (*((GtkTreeItem **)data)); - - GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); - - if (tree->children != NULL) { - guint len = g_list_length(tree->children); - for (guint i=0; ichildren, i)->data)))) { - p = GTK_TREE_ITEM((GtkTreeItem *)g_list_nth(tree->children, i)->data); - return; - } - } - } - - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_visible_callback, data); -} - -wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const { - GtkTreeItem *p = NULL; - - if (m_anchor == NULL) - return NULL; - - gtk_treectrl_first_visible_callback(GTK_WIDGET(m_anchor), &p); - - return p; -} - -wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); - GtkTreeItem *q; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (parent->children == NULL) - return NULL; - - q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); - - while (q != p) { - q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, q))->data); - if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) - return q; - } - - return NULL; -} - -wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); - GtkTreeItem *q; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (parent->children == NULL) - return NULL; - - q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); - - while (q != p) { - q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, q))->data); - if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) - return q; - } - - return NULL; -} - -wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text, int image, - int selectedImage, wxTreeItemData *data) { - return p_InsertItem(0, text, image, selectedImage, data); -} - -wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent, - const wxString& text, int image, int selectedImage, - wxTreeItemData *data) { -#warning "Need to implement PrependItem" - return NULL; -} - -wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, - const wxTreeItemId& idPrevious, const wxString& text, - int image, int selectedImage, wxTreeItemData *data) { -#warning "Need to implement InsertItem" - return NULL; -} - -wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent, - const wxString& text, int image, int selectedImage, - wxTreeItemData *data) { - return p_InsertItem(parent, text, image, selectedImage, data); -} - -wxTreeItemId wxTreeCtrl::p_InsertItem(GtkTreeItem *p, - const wxString& text, int image, int selectedImage, - wxTreeItemData *data) { - GtkTreeItem *item; - -printf("begin insert\n"); - - item = GTK_TREE_ITEM(gtk_tree_item_new()); - - GtkHBox *m_box = GTK_HBOX(gtk_hbox_new(FALSE, 0)); - gtk_container_add (GTK_CONTAINER (item), GTK_WIDGET(m_box)); - - gtk_object_set_data(GTK_OBJECT(item), "w_box", m_box); - - const wxBitmap *bmp; - const wxImageList *list; - if ((list = GetImageList(wxIMAGE_LIST_NORMAL)) != NULL) - if ((bmp = list->GetBitmap(image)) != NULL) - if (bmp->Ok()) { - GdkBitmap *mask = NULL; - if (bmp->GetMask()) - mask = bmp->GetMask()->GetBitmap(); - GtkPixmap *m_image_widget = GTK_PIXMAP(gtk_pixmap_new(bmp->GetPixmap(), mask)); - gtk_misc_set_alignment (GTK_MISC (m_image_widget), 0.0, 0.5); - gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_image_widget), FALSE, FALSE, 0); - gtk_object_set_data(GTK_OBJECT(item), "w_image", (void *)m_image_widget); - gtk_object_set_data(GTK_OBJECT(item), "image", (void *)image); - gtk_widget_show (GTK_WIDGET(m_image_widget)); - } - GtkLabel *m_label_widget = GTK_LABEL(gtk_label_new ((char *)(const char *)text)); - gtk_misc_set_alignment (GTK_MISC (m_label_widget), 0.5, 0.5); - gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_label_widget), FALSE, FALSE, 0); - gtk_object_set_data(GTK_OBJECT(item), "w_label", m_label_widget); - gtk_widget_show (GTK_WIDGET(m_label_widget)); - - gtk_widget_show(GTK_WIDGET(m_box)); - - gtk_object_set_data(GTK_OBJECT(item), "owner", this); - gtk_object_set_data(GTK_OBJECT(item), "data", data); - gtk_object_set_data(GTK_OBJECT(item), "parent", p); - - if (p != 0) { - if (p->subtree == NULL) { - GtkTree *tree = GTK_TREE(gtk_tree_new()); - gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); - gtk_widget_show(GTK_WIDGET(tree)); - p->expanded = 1; - } - - gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); - } else { -printf("Adding root\n"); -printf("m_tree = %p\n", m_tree); - m_anchor = item; - gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); - } - - gtk_widget_show(GTK_WIDGET(item)); - - gtk_signal_connect(GTK_OBJECT(item), "select", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "deselect", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "expand", - GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); - gtk_signal_connect(GTK_OBJECT(item), "collapse", - GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); - - return item; -} - -void wxTreeCtrl::Delete(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - GtkTreeItem *parent = GTK_TREE_ITEM(GTK_WIDGET((GtkTreeItem *)item)->parent); - if (parent == NULL) - return; - - gtk_container_remove(GTK_CONTAINER(parent), GTK_WIDGET((GtkTreeItem *)item)); - - return; -} - -void wxTreeCtrl::DeleteAllItems() { - gtk_tree_item_remove_subtree(m_anchor); -} - -void wxTreeCtrl::Expand(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -void wxTreeCtrl::Collapse(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); - gtk_tree_item_remove_subtree(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -void wxTreeCtrl::Toggle(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - if (((GtkTreeItem *)item)->expanded) - gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); - else - gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -static void gtk_treectrl_unselect_callback(GtkWidget *widget, gpointer data) { - GtkTreeItem *p; - - GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); - - if (tree->selection != NULL) { - guint len = g_list_length(tree->selection); - for (guint i=0; iselection, i)->data); - gtk_tree_unselect_child(tree, GTK_WIDGET(p)); - } - } - - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_unselect_callback, data); -} - -void wxTreeCtrl::Unselect() { - if (m_anchor == NULL) - return; - - gtk_treectrl_unselect_callback(GTK_WIDGET(m_anchor), NULL); -} - -void wxTreeCtrl::SelectItem(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_select((GtkTreeItem *)item); -} - -void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item) { -#warning "Need to implement EnsureVisible" -} - -void wxTreeCtrl::ScrollTo(const wxTreeItemId& item) { -#warning "Need to implement ScrollTo" -} - -wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item, - wxClassInfo* textControlClass) { - wxASSERT( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)) ); -#warning "Need to implement EditLabel" -/* - char *s; - m_editItem = item; - - GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label"); - gtk_label_get(m_label, &s); - - m_textCtrl = new wxTextCtrl(this, -1, s); -// m_textCtrl->SetValue(s); - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "w_edit", m_textCtrl->m_widget); - - gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)item), GTK_WIDGET(m_label)); - gtk_container_add(GTK_CONTAINER((GtkTreeItem *)item), m_textCtrl->m_widget); - -*/ - return m_textCtrl; -} - -wxTextCtrl* wxTreeCtrl::GetEditControl() const { - return m_textCtrl; -} - -void wxTreeCtrl::EndEditLabel(const wxTreeItemId& item, bool discardChanges) { -#warning "Need to implement EndEditLabel" -/* - GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_label"); - gtk_label_set(m_label, m_textCtrl->GetValue()); - - gtk_object_remove_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_edit"); - - gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)m_editItem), m_textCtrl->m_widget); - gtk_container_add(GTK_CONTAINER((GtkTreeItem *)m_editItem), GTK_WIDGET(m_label)); - - delete m_textCtrl; - m_textCtrl = NULL; -*/ -} - -void wxTreeCtrl::ExpandItem(const wxTreeItemId& item, int action) { - switch (action) { - case wxTREE_EXPAND_EXPAND: - Expand(item); - break; - - case wxTREE_EXPAND_COLLAPSE: - Collapse(item); - break; - - case wxTREE_EXPAND_COLLAPSE_RESET: - CollapseAndReset(item); - break; - - case wxTREE_EXPAND_TOGGLE: - Toggle(item); - break; - - default: - wxFAIL_MSG("unknown action in wxTreeCtrl::ExpandItem"); - } -} - -wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, - const wxString& text, int image, int selImage, - long insertAfter) { -// InsertItem(parent, insertAfter, text, image, selImage); - #warning "Need to implement InsertItem" - return NULL; -} - -/* Old functions -long wxTreeCtrl::GetChild(long item) const { - GtkTreeItem *p; - GtkTreeItem *next = NULL; - - p = findGtkTreeItem(item); - GList *list = gtk_container_children(GTK_CONTAINER(p)); - next = GTK_TREE_ITEM(list->data);; - - if (next != NULL) - return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); - - return (-1); -} - -long wxTreeCtrl::GetFirstVisibleItem(void) const { - GtkTreeItem *next = NULL; - - GList *list = gtk_container_children(GTK_CONTAINER(m_anchor)); - next = GTK_TREE_ITEM(list->data);; -// gtk_container_foreach(GTK_CONTAINER(m_anchor), gtk_treectrl_next_visible_callback, &next); - - if (next != NULL) - return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); - - return (-1); -} - -long wxTreeCtrl::GetNextVisibleItem(long item) const { - GtkTreeItem *p; - GtkTreeItem *next = NULL; - - p = findGtkTreeItem(item); - GList *list = gtk_container_children(GTK_CONTAINER(p)); - next = GTK_TREE_ITEM(list->data);; -// gtk_container_foreach(GTK_CONTAINER(p), gtk_treectrl_next_visible_callback, &next); - - if (next != NULL) - return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); - - return (-1); -} - -bool wxTreeCtrl::GetItem(wxTreeItem& info) const { - GtkTreeItem *p; - - p = findGtkTreeItem(info.m_itemId); - - if (p == NULL) { - wxLogSysError("TreeCtrl::GetItem failed"); - return FALSE; - } - - wxConvertFromGtkTreeItem(info, p); - - return TRUE; -} - -bool wxTreeCtrl::SetItem(wxTreeItem& info) { - GtkTreeItem *p; - - p = findGtkTreeItem(info.m_itemId); - - if (p == NULL) { - wxLogSysError("TreeCtrl::SetItem failed"); - return FALSE; - } - - wxConvertToGtkTreeItem(this, info, &p); - - return TRUE; -} - -int wxTreeCtrl::GetItemState(long item, long stateMask) const { - wxTreeItem info; - - info.m_mask = wxTREE_MASK_STATE ; - info.m_stateMask = stateMask; - info.m_itemId = item; - - if (!GetItem(info)) - return 0; - - return info.m_state; -} - -bool wxTreeCtrl::SetItemState(long item, long state, long stateMask) { - wxTreeItem info; - - info.m_mask = wxTREE_MASK_STATE ; - info.m_state = state; - info.m_stateMask = stateMask; - info.m_itemId = item; - - return SetItem(info); -} -*/ - -// Operations -/* -bool wxTreeCtrl::DeleteChildren(long item) { - GtkTreeItem *p; - - p = findGtkTreeItem(item); - if (p == NULL) - return FALSE; - - gtk_tree_item_remove_subtree(GTK_TREE_ITEM(p)); - - return TRUE; -} -*/ - -/* -long wxTreeCtrl::InsertItem(long parent, wxTreeItem& info, long insertAfter) { - GtkTreeItem *p; - GtkTreeItem *item = NULL; - - info.m_itemId = m_curitemId; - m_curitemId++; - - wxConvertToGtkTreeItem(this, info, &item); - - if (parent != 0) { - p = findGtkTreeItem(parent); - if (p->subtree == NULL) { - GtkTree *tree = GTK_TREE(gtk_tree_new()); - gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); - gtk_widget_show(GTK_WIDGET(tree)); - p->expanded = 1; - } - - gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); - } else { - m_anchor = item; - gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); - } - - if ((info.m_mask & wxTREE_MASK_CHILDREN) != 0) { - GtkTree *tree = GTK_TREE(gtk_tree_new()); - gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), GTK_WIDGET(tree)); - gtk_widget_show(GTK_WIDGET(tree)); - } - - gtk_widget_show(GTK_WIDGET(item)); - - gtk_signal_connect(GTK_OBJECT(item), "select", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "deselect", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "expand", - GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); - gtk_signal_connect(GTK_OBJECT(item), "collapse", - GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); - - return info.m_itemId; -} - -long wxTreeCtrl::InsertItem(long parent, const wxString& label, int image, - int selImage, long insertAfter) { - - wxTreeItem info; - info.m_text = label; - info.m_mask = wxTREE_MASK_TEXT; - if (image > -1) { - info.m_mask |= wxTREE_MASK_IMAGE | wxTREE_MASK_SELECTED_IMAGE; - info.m_image = image; - if (selImage == -1) - info.m_selectedImage = image; - else - info.m_selectedImage = selImage; - } - - return InsertItem(parent, info, insertAfter); -} -*/ - -void wxTreeCtrl::SendMessage(wxEventType command, const wxTreeItemId& item) { - wxTreeEvent event(command, GetId()); - event.SetEventObject(this); - event.m_item = item; - ProcessEvent(event); -} - -void wxTreeCtrl::SendExpanding(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDING, item); -} - -void wxTreeCtrl::SendExpanded(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDED, item); -} - -void wxTreeCtrl::SendCollapsing(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, item); -} - -void wxTreeCtrl::SendCollapsed(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSED, item); -} - -void wxTreeCtrl::SendSelChanging(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGED, item); -} - -void wxTreeCtrl::SendSelChanged(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGING, item); -} - -// Tree event -IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxCommandEvent) - -wxTreeEvent::wxTreeEvent(wxEventType commandType, int id): - wxCommandEvent(commandType, id) { - m_code = 0; - m_itemOld = 0; -} diff --git a/src/gtk/treegtk.cpp b/src/gtk/treegtk.cpp new file mode 100644 index 0000000000..6d8fa194e1 --- /dev/null +++ b/src/gtk/treegtk.cpp @@ -0,0 +1,936 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: treectrl.cpp +// Purpose: wxTreeCtrl +// Author: Denis Pershin +// Modified by: +// Created: 07/05/98 +// RCS-ID: $Id$ +// Copyright: (c) Denis Pershin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "treectrl.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "wx/gtk/treectrl.h" +#include +#include "wx/log.h" + +#include + +//static void wxConvertToGtkTreeItem(wxTreeCtrl *owner, wxTreeItem& info, GtkTreeItem **gtkItem); +//static void wxConvertFromGtkTreeItem(wxTreeItem& info, GtkTreeItem *gtkItem); + +static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data); +static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data); +static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data); + +// static void gtk_treectrl_next_callback (GtkWidget *widget, gpointer data); +// static void gtk_treectrl_next_visible_callback (GtkWidget *widget, gpointer data); +// static void gtk_treectrl_next_selected_callback (GtkWidget *widget, gpointer data); + +static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem); +static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem); +static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem); + +static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem) { + wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); + if (owner == NULL) + return; + +// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); + owner->SendExpanding(GTK_TREE_ITEM(widget)); + owner->SendExpanded(GTK_TREE_ITEM(widget)); +}; + +static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem) { + wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); + if (owner == NULL) + return; + +// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); + owner->SendCollapsing(GTK_TREE_ITEM(widget)); + owner->SendCollapsed(GTK_TREE_ITEM(widget)); +}; + +static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem) { + wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); + if (owner == NULL) + return; + +// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); + owner->SendSelChanging(GTK_TREE_ITEM(widget)); + owner->SendSelChanged(GTK_TREE_ITEM(widget)); +} + +#if !USE_SHARED_LIBRARY +IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl) + +#endif + +void wxTreeCtrl::Init() { + m_imageListNormal = NULL; + m_imageListState = NULL; + m_textCtrl = NULL; +} + +bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& validator, const wxString& name) { + Init(); + + int x = pos.x; + int y = pos.y; + int width = size.x; + int height = size.y; + + m_windowStyle = style; + + SetParent(parent); + + if (width <= 0) + width = 100; + if (height <= 0) + height = 30; + if (x < 0) + x = 0; + if (y < 0) + y = 0; + + m_needParent = TRUE; + +printf("precreate\n"); + PreCreation( parent, id, pos, size, style, name ); + +printf("1\n"); + + m_widget = gtk_scrolled_window_new(NULL, NULL); +printf("2\n"); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(m_widget), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + +printf("3\n"); + m_tree = GTK_TREE(gtk_tree_new()); + +printf("4\n"); + gtk_container_add(GTK_CONTAINER(m_widget), GTK_WIDGET(m_tree)); +printf("5\n"); + gtk_widget_show(GTK_WIDGET(m_tree)); + + SetName(name); + SetValidator(validator); + +printf("Robert's new insertion code :-)\n"); + m_parent->DoAddChild( this ); +printf("postcreate\n"); + PostCreation(); + + gtk_widget_realize(GTK_WIDGET(m_tree)); + + Show(TRUE); + + return TRUE; +} + +wxTreeCtrl::~wxTreeCtrl(void) { + if (m_textCtrl) + delete m_textCtrl; +} + +// Attributes +static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data) { + int count = (*((int *)data)); + + count++; + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_count_callback, data); +} + +size_t wxTreeCtrl::GetCount() const { + int count = 0; + + if (m_anchor != NULL) + gtk_treectrl_count_callback(GTK_WIDGET(m_anchor), &count); + return count; +} + +unsigned int wxTreeCtrl::GetIndent() const { + return m_tree->indent_value; +} + +void wxTreeCtrl::SetIndent(unsigned int indent) { + m_tree->indent_value = indent; +} + +wxImageList *wxTreeCtrl::GetImageList() const { + return m_imageListNormal; +} + +wxImageList *wxTreeCtrl::GetStateImageList() const { + return m_imageListState; +} + +void wxTreeCtrl::SetImageList(wxImageList *imageList) { + m_imageListNormal = imageList; +} + +void wxTreeCtrl::SetStateImageList(wxImageList *imageList) { + m_imageListState = imageList; +} + +wxString wxTreeCtrl::GetItemText(const wxTreeItemId &item) const { + char *t; + + if (!item.IsOk()) + return wxString(""); + + GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); + gtk_label_get(l, &t); + + return t; +} + +int wxTreeCtrl::GetItemImage(const wxTreeItemId& item) const { + if (!item.IsOk()) + return (-1); + + return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "image"); +} + +int wxTreeCtrl::GetItemSelectedImage(const wxTreeItemId& item) const { + if (!item.IsOk()) + return (-1); + + return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage"); +} + +wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const { + if (!item.IsOk()) + return NULL; + + return (wxTreeItemData *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "data"); +} + +void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) { + if (!item.IsOk()) + return; + + GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); + gtk_label_set(l, text); +} + +void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image) { + if (!item.IsOk()) + return; + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "image", (void *)image); +} + +void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image) { + if (!item.IsOk()) + return; + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage", (void *)image); +} + +void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data) { + if (!item.IsOk()) + return; + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "data", data); +} + +bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const { + return GTK_WIDGET_VISIBLE(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + + if (p->subtree == NULL) + return wxFalse; + + if (GTK_TREE(p->subtree)->children == NULL) + return wxFalse; + + if (g_list_length(GTK_TREE(p->subtree)->children) == 0) + return wxFalse; + + return wxTrue; +} + +bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const { + return (((GtkTreeItem *)item)->expanded != 0); +} + +bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return wxFalse; + + if (g_list_index(GTK_TREE(parent)->children, p) == -1) + return wxFalse; + + return wxTrue; +} + +wxTreeItemId wxTreeCtrl::GetRootItem() const { + return m_anchor; +} + +static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data) { + GtkTreeItem *p = (*((GtkTreeItem **)data)); + + GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); + + if (tree->selection != NULL) { + p = (GtkTreeItem *)tree->selection->data; + return; + } + + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_selected_callback, data); +} + +wxTreeItemId wxTreeCtrl::GetSelection() const { + GtkTreeItem *p = NULL; + + if (m_anchor == NULL) + return NULL; + + gtk_treectrl_first_selected_callback(GTK_WIDGET(m_anchor), &p); + + return p; +} + +wxTreeItemId wxTreeCtrl::GetParent(const wxTreeItemId& item) const { + if (item.IsOk()) + return (GtkTreeItem *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "parent"); + + return NULL; +} + +wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item, long& cookie) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + cookie = 0; + return GTK_TREE_ITEM(g_list_first(GTK_TREE(parent)->children)->data); +} + +wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& item, long& cookie) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + cookie++; + return GTK_TREE_ITEM(g_list_nth(GTK_TREE(parent)->children, cookie)->data); +} + +wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const +{ + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + wxCHECK_MSG( GTK_IS_TREE(parent), NULL, "invalid tree item" ); + + return GTK_TREE_ITEM(g_list_last(GTK_TREE(parent)->children)->data); +} + +wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (g_list_index(GTK_TREE(parent)->children, p) == -1) + return NULL; + + return GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); +} + +wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (g_list_index(GTK_TREE(parent)->children, p) == -1) + return NULL; + + return GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); +} + +static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data) { + GtkTreeItem *p = (*((GtkTreeItem **)data)); + + GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); + + if (tree->children != NULL) { + guint len = g_list_length(tree->children); + for (guint i=0; ichildren, i)->data)))) { + p = GTK_TREE_ITEM((GtkTreeItem *)g_list_nth(tree->children, i)->data); + return; + } + } + } + + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_visible_callback, data); +} + +wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const { + GtkTreeItem *p = NULL; + + if (m_anchor == NULL) + return NULL; + + gtk_treectrl_first_visible_callback(GTK_WIDGET(m_anchor), &p); + + return p; +} + +wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); + GtkTreeItem *q; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (parent->children == NULL) + return NULL; + + q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); + + while (q != p) { + q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, q))->data); + if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) + return q; + } + + return NULL; +} + +wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); + GtkTreeItem *q; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (parent->children == NULL) + return NULL; + + q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); + + while (q != p) { + q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, q))->data); + if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) + return q; + } + + return NULL; +} + +wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text, int image, + int selectedImage, wxTreeItemData *data) { + return p_InsertItem(0, text, image, selectedImage, data); +} + +wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent, + const wxString& text, int image, int selectedImage, + wxTreeItemData *data) { +#warning "Need to implement PrependItem" + return NULL; +} + +wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, const wxString& text, + int image, int selectedImage, wxTreeItemData *data) { +#warning "Need to implement InsertItem" + return NULL; +} + +wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent, + const wxString& text, int image, int selectedImage, + wxTreeItemData *data) { + return p_InsertItem(parent, text, image, selectedImage, data); +} + +wxTreeItemId wxTreeCtrl::p_InsertItem(GtkTreeItem *p, + const wxString& text, int image, int selectedImage, + wxTreeItemData *data) { + GtkTreeItem *item; + +printf("begin insert\n"); + + item = GTK_TREE_ITEM(gtk_tree_item_new()); + + GtkHBox *m_box = GTK_HBOX(gtk_hbox_new(FALSE, 0)); + gtk_container_add (GTK_CONTAINER (item), GTK_WIDGET(m_box)); + + gtk_object_set_data(GTK_OBJECT(item), "w_box", m_box); + + const wxBitmap *bmp; + const wxImageList *list; + if ((list = GetImageList(wxIMAGE_LIST_NORMAL)) != NULL) + if ((bmp = list->GetBitmap(image)) != NULL) + if (bmp->Ok()) { + GdkBitmap *mask = NULL; + if (bmp->GetMask()) + mask = bmp->GetMask()->GetBitmap(); + GtkPixmap *m_image_widget = GTK_PIXMAP(gtk_pixmap_new(bmp->GetPixmap(), mask)); + gtk_misc_set_alignment (GTK_MISC (m_image_widget), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_image_widget), FALSE, FALSE, 0); + gtk_object_set_data(GTK_OBJECT(item), "w_image", (void *)m_image_widget); + gtk_object_set_data(GTK_OBJECT(item), "image", (void *)image); + gtk_widget_show (GTK_WIDGET(m_image_widget)); + } + GtkLabel *m_label_widget = GTK_LABEL(gtk_label_new ((char *)(const char *)text)); + gtk_misc_set_alignment (GTK_MISC (m_label_widget), 0.5, 0.5); + gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_label_widget), FALSE, FALSE, 0); + gtk_object_set_data(GTK_OBJECT(item), "w_label", m_label_widget); + gtk_widget_show (GTK_WIDGET(m_label_widget)); + + gtk_widget_show(GTK_WIDGET(m_box)); + + gtk_object_set_data(GTK_OBJECT(item), "owner", this); + gtk_object_set_data(GTK_OBJECT(item), "data", data); + gtk_object_set_data(GTK_OBJECT(item), "parent", p); + + if (p != 0) { + if (p->subtree == NULL) { + GtkTree *tree = GTK_TREE(gtk_tree_new()); + gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); + gtk_widget_show(GTK_WIDGET(tree)); + p->expanded = 1; + } + + gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); + } else { +printf("Adding root\n"); +printf("m_tree = %p\n", m_tree); + m_anchor = item; + gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); + } + + gtk_widget_show(GTK_WIDGET(item)); + + gtk_signal_connect(GTK_OBJECT(item), "select", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "deselect", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "expand", + GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); + gtk_signal_connect(GTK_OBJECT(item), "collapse", + GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); + + return item; +} + +void wxTreeCtrl::Delete(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + GtkTreeItem *parent = GTK_TREE_ITEM(GTK_WIDGET((GtkTreeItem *)item)->parent); + if (parent == NULL) + return; + + gtk_container_remove(GTK_CONTAINER(parent), GTK_WIDGET((GtkTreeItem *)item)); + + return; +} + +void wxTreeCtrl::DeleteAllItems() { + gtk_tree_item_remove_subtree(m_anchor); +} + +void wxTreeCtrl::Expand(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +void wxTreeCtrl::Collapse(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); + gtk_tree_item_remove_subtree(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +void wxTreeCtrl::Toggle(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + if (((GtkTreeItem *)item)->expanded) + gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); + else + gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +static void gtk_treectrl_unselect_callback(GtkWidget *widget, gpointer data) { + GtkTreeItem *p; + + GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); + + if (tree->selection != NULL) { + guint len = g_list_length(tree->selection); + for (guint i=0; iselection, i)->data); + gtk_tree_unselect_child(tree, GTK_WIDGET(p)); + } + } + + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_unselect_callback, data); +} + +void wxTreeCtrl::Unselect() { + if (m_anchor == NULL) + return; + + gtk_treectrl_unselect_callback(GTK_WIDGET(m_anchor), NULL); +} + +void wxTreeCtrl::SelectItem(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_select((GtkTreeItem *)item); +} + +void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item) { +#warning "Need to implement EnsureVisible" +} + +void wxTreeCtrl::ScrollTo(const wxTreeItemId& item) { +#warning "Need to implement ScrollTo" +} + +wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item, + wxClassInfo* textControlClass) { + wxASSERT( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)) ); +#warning "Need to implement EditLabel" +/* + char *s; + m_editItem = item; + + GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label"); + gtk_label_get(m_label, &s); + + m_textCtrl = new wxTextCtrl(this, -1, s); +// m_textCtrl->SetValue(s); + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "w_edit", m_textCtrl->m_widget); + + gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)item), GTK_WIDGET(m_label)); + gtk_container_add(GTK_CONTAINER((GtkTreeItem *)item), m_textCtrl->m_widget); + +*/ + return m_textCtrl; +} + +wxTextCtrl* wxTreeCtrl::GetEditControl() const { + return m_textCtrl; +} + +void wxTreeCtrl::EndEditLabel(const wxTreeItemId& item, bool discardChanges) { +#warning "Need to implement EndEditLabel" +/* + GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_label"); + gtk_label_set(m_label, m_textCtrl->GetValue()); + + gtk_object_remove_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_edit"); + + gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)m_editItem), m_textCtrl->m_widget); + gtk_container_add(GTK_CONTAINER((GtkTreeItem *)m_editItem), GTK_WIDGET(m_label)); + + delete m_textCtrl; + m_textCtrl = NULL; +*/ +} + +void wxTreeCtrl::ExpandItem(const wxTreeItemId& item, int action) { + switch (action) { + case wxTREE_EXPAND_EXPAND: + Expand(item); + break; + + case wxTREE_EXPAND_COLLAPSE: + Collapse(item); + break; + + case wxTREE_EXPAND_COLLAPSE_RESET: + CollapseAndReset(item); + break; + + case wxTREE_EXPAND_TOGGLE: + Toggle(item); + break; + + default: + wxFAIL_MSG("unknown action in wxTreeCtrl::ExpandItem"); + } +} + +wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, + const wxString& text, int image, int selImage, + long insertAfter) { +// InsertItem(parent, insertAfter, text, image, selImage); + #warning "Need to implement InsertItem" + return NULL; +} + +/* Old functions +long wxTreeCtrl::GetChild(long item) const { + GtkTreeItem *p; + GtkTreeItem *next = NULL; + + p = findGtkTreeItem(item); + GList *list = gtk_container_children(GTK_CONTAINER(p)); + next = GTK_TREE_ITEM(list->data);; + + if (next != NULL) + return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); + + return (-1); +} + +long wxTreeCtrl::GetFirstVisibleItem(void) const { + GtkTreeItem *next = NULL; + + GList *list = gtk_container_children(GTK_CONTAINER(m_anchor)); + next = GTK_TREE_ITEM(list->data);; +// gtk_container_foreach(GTK_CONTAINER(m_anchor), gtk_treectrl_next_visible_callback, &next); + + if (next != NULL) + return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); + + return (-1); +} + +long wxTreeCtrl::GetNextVisibleItem(long item) const { + GtkTreeItem *p; + GtkTreeItem *next = NULL; + + p = findGtkTreeItem(item); + GList *list = gtk_container_children(GTK_CONTAINER(p)); + next = GTK_TREE_ITEM(list->data);; +// gtk_container_foreach(GTK_CONTAINER(p), gtk_treectrl_next_visible_callback, &next); + + if (next != NULL) + return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); + + return (-1); +} + +bool wxTreeCtrl::GetItem(wxTreeItem& info) const { + GtkTreeItem *p; + + p = findGtkTreeItem(info.m_itemId); + + if (p == NULL) { + wxLogSysError("TreeCtrl::GetItem failed"); + return FALSE; + } + + wxConvertFromGtkTreeItem(info, p); + + return TRUE; +} + +bool wxTreeCtrl::SetItem(wxTreeItem& info) { + GtkTreeItem *p; + + p = findGtkTreeItem(info.m_itemId); + + if (p == NULL) { + wxLogSysError("TreeCtrl::SetItem failed"); + return FALSE; + } + + wxConvertToGtkTreeItem(this, info, &p); + + return TRUE; +} + +int wxTreeCtrl::GetItemState(long item, long stateMask) const { + wxTreeItem info; + + info.m_mask = wxTREE_MASK_STATE ; + info.m_stateMask = stateMask; + info.m_itemId = item; + + if (!GetItem(info)) + return 0; + + return info.m_state; +} + +bool wxTreeCtrl::SetItemState(long item, long state, long stateMask) { + wxTreeItem info; + + info.m_mask = wxTREE_MASK_STATE ; + info.m_state = state; + info.m_stateMask = stateMask; + info.m_itemId = item; + + return SetItem(info); +} +*/ + +// Operations +/* +bool wxTreeCtrl::DeleteChildren(long item) { + GtkTreeItem *p; + + p = findGtkTreeItem(item); + if (p == NULL) + return FALSE; + + gtk_tree_item_remove_subtree(GTK_TREE_ITEM(p)); + + return TRUE; +} +*/ + +/* +long wxTreeCtrl::InsertItem(long parent, wxTreeItem& info, long insertAfter) { + GtkTreeItem *p; + GtkTreeItem *item = NULL; + + info.m_itemId = m_curitemId; + m_curitemId++; + + wxConvertToGtkTreeItem(this, info, &item); + + if (parent != 0) { + p = findGtkTreeItem(parent); + if (p->subtree == NULL) { + GtkTree *tree = GTK_TREE(gtk_tree_new()); + gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); + gtk_widget_show(GTK_WIDGET(tree)); + p->expanded = 1; + } + + gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); + } else { + m_anchor = item; + gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); + } + + if ((info.m_mask & wxTREE_MASK_CHILDREN) != 0) { + GtkTree *tree = GTK_TREE(gtk_tree_new()); + gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), GTK_WIDGET(tree)); + gtk_widget_show(GTK_WIDGET(tree)); + } + + gtk_widget_show(GTK_WIDGET(item)); + + gtk_signal_connect(GTK_OBJECT(item), "select", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "deselect", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "expand", + GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); + gtk_signal_connect(GTK_OBJECT(item), "collapse", + GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); + + return info.m_itemId; +} + +long wxTreeCtrl::InsertItem(long parent, const wxString& label, int image, + int selImage, long insertAfter) { + + wxTreeItem info; + info.m_text = label; + info.m_mask = wxTREE_MASK_TEXT; + if (image > -1) { + info.m_mask |= wxTREE_MASK_IMAGE | wxTREE_MASK_SELECTED_IMAGE; + info.m_image = image; + if (selImage == -1) + info.m_selectedImage = image; + else + info.m_selectedImage = selImage; + } + + return InsertItem(parent, info, insertAfter); +} +*/ + +void wxTreeCtrl::SendMessage(wxEventType command, const wxTreeItemId& item) { + wxTreeEvent event(command, GetId()); + event.SetEventObject(this); + event.m_item = item; + ProcessEvent(event); +} + +void wxTreeCtrl::SendExpanding(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDING, item); +} + +void wxTreeCtrl::SendExpanded(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDED, item); +} + +void wxTreeCtrl::SendCollapsing(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, item); +} + +void wxTreeCtrl::SendCollapsed(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSED, item); +} + +void wxTreeCtrl::SendSelChanging(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGED, item); +} + +void wxTreeCtrl::SendSelChanged(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGING, item); +} + +// Tree event +IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxCommandEvent) + +wxTreeEvent::wxTreeEvent(wxEventType commandType, int id): + wxCommandEvent(commandType, id) { + m_code = 0; + m_itemOld = 0; +} diff --git a/src/gtk1/treectrl.cpp b/src/gtk1/treectrl.cpp deleted file mode 100644 index 6d8fa194e1..0000000000 --- a/src/gtk1/treectrl.cpp +++ /dev/null @@ -1,936 +0,0 @@ -///////////////////////////////////////////////////////////////////////////// -// Name: treectrl.cpp -// Purpose: wxTreeCtrl -// Author: Denis Pershin -// Modified by: -// Created: 07/05/98 -// RCS-ID: $Id$ -// Copyright: (c) Denis Pershin -// Licence: wxWindows licence -///////////////////////////////////////////////////////////////////////////// - -#ifdef __GNUG__ -#pragma implementation "treectrl.h" -#endif - -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#ifndef WX_PRECOMP -#include "wx/wx.h" -#endif - -#include "wx/gtk/treectrl.h" -#include -#include "wx/log.h" - -#include - -//static void wxConvertToGtkTreeItem(wxTreeCtrl *owner, wxTreeItem& info, GtkTreeItem **gtkItem); -//static void wxConvertFromGtkTreeItem(wxTreeItem& info, GtkTreeItem *gtkItem); - -static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data); -static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data); -static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data); - -// static void gtk_treectrl_next_callback (GtkWidget *widget, gpointer data); -// static void gtk_treectrl_next_visible_callback (GtkWidget *widget, gpointer data); -// static void gtk_treectrl_next_selected_callback (GtkWidget *widget, gpointer data); - -static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem); -static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem); -static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem); - -static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem) { - wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); - if (owner == NULL) - return; - -// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); - owner->SendExpanding(GTK_TREE_ITEM(widget)); - owner->SendExpanded(GTK_TREE_ITEM(widget)); -}; - -static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem) { - wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); - if (owner == NULL) - return; - -// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); - owner->SendCollapsing(GTK_TREE_ITEM(widget)); - owner->SendCollapsed(GTK_TREE_ITEM(widget)); -}; - -static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem) { - wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); - if (owner == NULL) - return; - -// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); - owner->SendSelChanging(GTK_TREE_ITEM(widget)); - owner->SendSelChanged(GTK_TREE_ITEM(widget)); -} - -#if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl) - -#endif - -void wxTreeCtrl::Init() { - m_imageListNormal = NULL; - m_imageListState = NULL; - m_textCtrl = NULL; -} - -bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, - const wxSize& size, long style, - const wxValidator& validator, const wxString& name) { - Init(); - - int x = pos.x; - int y = pos.y; - int width = size.x; - int height = size.y; - - m_windowStyle = style; - - SetParent(parent); - - if (width <= 0) - width = 100; - if (height <= 0) - height = 30; - if (x < 0) - x = 0; - if (y < 0) - y = 0; - - m_needParent = TRUE; - -printf("precreate\n"); - PreCreation( parent, id, pos, size, style, name ); - -printf("1\n"); - - m_widget = gtk_scrolled_window_new(NULL, NULL); -printf("2\n"); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(m_widget), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - -printf("3\n"); - m_tree = GTK_TREE(gtk_tree_new()); - -printf("4\n"); - gtk_container_add(GTK_CONTAINER(m_widget), GTK_WIDGET(m_tree)); -printf("5\n"); - gtk_widget_show(GTK_WIDGET(m_tree)); - - SetName(name); - SetValidator(validator); - -printf("Robert's new insertion code :-)\n"); - m_parent->DoAddChild( this ); -printf("postcreate\n"); - PostCreation(); - - gtk_widget_realize(GTK_WIDGET(m_tree)); - - Show(TRUE); - - return TRUE; -} - -wxTreeCtrl::~wxTreeCtrl(void) { - if (m_textCtrl) - delete m_textCtrl; -} - -// Attributes -static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data) { - int count = (*((int *)data)); - - count++; - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_count_callback, data); -} - -size_t wxTreeCtrl::GetCount() const { - int count = 0; - - if (m_anchor != NULL) - gtk_treectrl_count_callback(GTK_WIDGET(m_anchor), &count); - return count; -} - -unsigned int wxTreeCtrl::GetIndent() const { - return m_tree->indent_value; -} - -void wxTreeCtrl::SetIndent(unsigned int indent) { - m_tree->indent_value = indent; -} - -wxImageList *wxTreeCtrl::GetImageList() const { - return m_imageListNormal; -} - -wxImageList *wxTreeCtrl::GetStateImageList() const { - return m_imageListState; -} - -void wxTreeCtrl::SetImageList(wxImageList *imageList) { - m_imageListNormal = imageList; -} - -void wxTreeCtrl::SetStateImageList(wxImageList *imageList) { - m_imageListState = imageList; -} - -wxString wxTreeCtrl::GetItemText(const wxTreeItemId &item) const { - char *t; - - if (!item.IsOk()) - return wxString(""); - - GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); - gtk_label_get(l, &t); - - return t; -} - -int wxTreeCtrl::GetItemImage(const wxTreeItemId& item) const { - if (!item.IsOk()) - return (-1); - - return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "image"); -} - -int wxTreeCtrl::GetItemSelectedImage(const wxTreeItemId& item) const { - if (!item.IsOk()) - return (-1); - - return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage"); -} - -wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const { - if (!item.IsOk()) - return NULL; - - return (wxTreeItemData *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "data"); -} - -void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) { - if (!item.IsOk()) - return; - - GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); - gtk_label_set(l, text); -} - -void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image) { - if (!item.IsOk()) - return; - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "image", (void *)image); -} - -void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image) { - if (!item.IsOk()) - return; - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage", (void *)image); -} - -void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data) { - if (!item.IsOk()) - return; - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "data", data); -} - -bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const { - return GTK_WIDGET_VISIBLE(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - - if (p->subtree == NULL) - return wxFalse; - - if (GTK_TREE(p->subtree)->children == NULL) - return wxFalse; - - if (g_list_length(GTK_TREE(p->subtree)->children) == 0) - return wxFalse; - - return wxTrue; -} - -bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const { - return (((GtkTreeItem *)item)->expanded != 0); -} - -bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return wxFalse; - - if (g_list_index(GTK_TREE(parent)->children, p) == -1) - return wxFalse; - - return wxTrue; -} - -wxTreeItemId wxTreeCtrl::GetRootItem() const { - return m_anchor; -} - -static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data) { - GtkTreeItem *p = (*((GtkTreeItem **)data)); - - GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); - - if (tree->selection != NULL) { - p = (GtkTreeItem *)tree->selection->data; - return; - } - - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_selected_callback, data); -} - -wxTreeItemId wxTreeCtrl::GetSelection() const { - GtkTreeItem *p = NULL; - - if (m_anchor == NULL) - return NULL; - - gtk_treectrl_first_selected_callback(GTK_WIDGET(m_anchor), &p); - - return p; -} - -wxTreeItemId wxTreeCtrl::GetParent(const wxTreeItemId& item) const { - if (item.IsOk()) - return (GtkTreeItem *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "parent"); - - return NULL; -} - -wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item, long& cookie) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - cookie = 0; - return GTK_TREE_ITEM(g_list_first(GTK_TREE(parent)->children)->data); -} - -wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& item, long& cookie) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - cookie++; - return GTK_TREE_ITEM(g_list_nth(GTK_TREE(parent)->children, cookie)->data); -} - -wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const -{ - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - wxCHECK_MSG( GTK_IS_TREE(parent), NULL, "invalid tree item" ); - - return GTK_TREE_ITEM(g_list_last(GTK_TREE(parent)->children)->data); -} - -wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (g_list_index(GTK_TREE(parent)->children, p) == -1) - return NULL; - - return GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); -} - -wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkWidget *parent = GTK_WIDGET(p)->parent; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (g_list_index(GTK_TREE(parent)->children, p) == -1) - return NULL; - - return GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); -} - -static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data) { - GtkTreeItem *p = (*((GtkTreeItem **)data)); - - GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); - - if (tree->children != NULL) { - guint len = g_list_length(tree->children); - for (guint i=0; ichildren, i)->data)))) { - p = GTK_TREE_ITEM((GtkTreeItem *)g_list_nth(tree->children, i)->data); - return; - } - } - } - - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_visible_callback, data); -} - -wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const { - GtkTreeItem *p = NULL; - - if (m_anchor == NULL) - return NULL; - - gtk_treectrl_first_visible_callback(GTK_WIDGET(m_anchor), &p); - - return p; -} - -wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); - GtkTreeItem *q; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (parent->children == NULL) - return NULL; - - q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); - - while (q != p) { - q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, q))->data); - if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) - return q; - } - - return NULL; -} - -wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const { - GtkTreeItem *p = (GtkTreeItem *)item; - GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); - GtkTreeItem *q; - - if (!GTK_IS_TREE(parent)) - return NULL; - - if (parent->children == NULL) - return NULL; - - q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); - - while (q != p) { - q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, q))->data); - if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) - return q; - } - - return NULL; -} - -wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text, int image, - int selectedImage, wxTreeItemData *data) { - return p_InsertItem(0, text, image, selectedImage, data); -} - -wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent, - const wxString& text, int image, int selectedImage, - wxTreeItemData *data) { -#warning "Need to implement PrependItem" - return NULL; -} - -wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, - const wxTreeItemId& idPrevious, const wxString& text, - int image, int selectedImage, wxTreeItemData *data) { -#warning "Need to implement InsertItem" - return NULL; -} - -wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent, - const wxString& text, int image, int selectedImage, - wxTreeItemData *data) { - return p_InsertItem(parent, text, image, selectedImage, data); -} - -wxTreeItemId wxTreeCtrl::p_InsertItem(GtkTreeItem *p, - const wxString& text, int image, int selectedImage, - wxTreeItemData *data) { - GtkTreeItem *item; - -printf("begin insert\n"); - - item = GTK_TREE_ITEM(gtk_tree_item_new()); - - GtkHBox *m_box = GTK_HBOX(gtk_hbox_new(FALSE, 0)); - gtk_container_add (GTK_CONTAINER (item), GTK_WIDGET(m_box)); - - gtk_object_set_data(GTK_OBJECT(item), "w_box", m_box); - - const wxBitmap *bmp; - const wxImageList *list; - if ((list = GetImageList(wxIMAGE_LIST_NORMAL)) != NULL) - if ((bmp = list->GetBitmap(image)) != NULL) - if (bmp->Ok()) { - GdkBitmap *mask = NULL; - if (bmp->GetMask()) - mask = bmp->GetMask()->GetBitmap(); - GtkPixmap *m_image_widget = GTK_PIXMAP(gtk_pixmap_new(bmp->GetPixmap(), mask)); - gtk_misc_set_alignment (GTK_MISC (m_image_widget), 0.0, 0.5); - gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_image_widget), FALSE, FALSE, 0); - gtk_object_set_data(GTK_OBJECT(item), "w_image", (void *)m_image_widget); - gtk_object_set_data(GTK_OBJECT(item), "image", (void *)image); - gtk_widget_show (GTK_WIDGET(m_image_widget)); - } - GtkLabel *m_label_widget = GTK_LABEL(gtk_label_new ((char *)(const char *)text)); - gtk_misc_set_alignment (GTK_MISC (m_label_widget), 0.5, 0.5); - gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_label_widget), FALSE, FALSE, 0); - gtk_object_set_data(GTK_OBJECT(item), "w_label", m_label_widget); - gtk_widget_show (GTK_WIDGET(m_label_widget)); - - gtk_widget_show(GTK_WIDGET(m_box)); - - gtk_object_set_data(GTK_OBJECT(item), "owner", this); - gtk_object_set_data(GTK_OBJECT(item), "data", data); - gtk_object_set_data(GTK_OBJECT(item), "parent", p); - - if (p != 0) { - if (p->subtree == NULL) { - GtkTree *tree = GTK_TREE(gtk_tree_new()); - gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); - gtk_widget_show(GTK_WIDGET(tree)); - p->expanded = 1; - } - - gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); - } else { -printf("Adding root\n"); -printf("m_tree = %p\n", m_tree); - m_anchor = item; - gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); - } - - gtk_widget_show(GTK_WIDGET(item)); - - gtk_signal_connect(GTK_OBJECT(item), "select", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "deselect", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "expand", - GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); - gtk_signal_connect(GTK_OBJECT(item), "collapse", - GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); - - return item; -} - -void wxTreeCtrl::Delete(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - GtkTreeItem *parent = GTK_TREE_ITEM(GTK_WIDGET((GtkTreeItem *)item)->parent); - if (parent == NULL) - return; - - gtk_container_remove(GTK_CONTAINER(parent), GTK_WIDGET((GtkTreeItem *)item)); - - return; -} - -void wxTreeCtrl::DeleteAllItems() { - gtk_tree_item_remove_subtree(m_anchor); -} - -void wxTreeCtrl::Expand(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -void wxTreeCtrl::Collapse(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); - gtk_tree_item_remove_subtree(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -void wxTreeCtrl::Toggle(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - if (((GtkTreeItem *)item)->expanded) - gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); - else - gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); -} - -static void gtk_treectrl_unselect_callback(GtkWidget *widget, gpointer data) { - GtkTreeItem *p; - - GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); - - if (tree->selection != NULL) { - guint len = g_list_length(tree->selection); - for (guint i=0; iselection, i)->data); - gtk_tree_unselect_child(tree, GTK_WIDGET(p)); - } - } - - if (GTK_IS_CONTAINER(widget)) - gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_unselect_callback, data); -} - -void wxTreeCtrl::Unselect() { - if (m_anchor == NULL) - return; - - gtk_treectrl_unselect_callback(GTK_WIDGET(m_anchor), NULL); -} - -void wxTreeCtrl::SelectItem(const wxTreeItemId& item) { - if (!item.IsOk()) - return; - - gtk_tree_item_select((GtkTreeItem *)item); -} - -void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item) { -#warning "Need to implement EnsureVisible" -} - -void wxTreeCtrl::ScrollTo(const wxTreeItemId& item) { -#warning "Need to implement ScrollTo" -} - -wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item, - wxClassInfo* textControlClass) { - wxASSERT( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)) ); -#warning "Need to implement EditLabel" -/* - char *s; - m_editItem = item; - - GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label"); - gtk_label_get(m_label, &s); - - m_textCtrl = new wxTextCtrl(this, -1, s); -// m_textCtrl->SetValue(s); - - gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "w_edit", m_textCtrl->m_widget); - - gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)item), GTK_WIDGET(m_label)); - gtk_container_add(GTK_CONTAINER((GtkTreeItem *)item), m_textCtrl->m_widget); - -*/ - return m_textCtrl; -} - -wxTextCtrl* wxTreeCtrl::GetEditControl() const { - return m_textCtrl; -} - -void wxTreeCtrl::EndEditLabel(const wxTreeItemId& item, bool discardChanges) { -#warning "Need to implement EndEditLabel" -/* - GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_label"); - gtk_label_set(m_label, m_textCtrl->GetValue()); - - gtk_object_remove_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_edit"); - - gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)m_editItem), m_textCtrl->m_widget); - gtk_container_add(GTK_CONTAINER((GtkTreeItem *)m_editItem), GTK_WIDGET(m_label)); - - delete m_textCtrl; - m_textCtrl = NULL; -*/ -} - -void wxTreeCtrl::ExpandItem(const wxTreeItemId& item, int action) { - switch (action) { - case wxTREE_EXPAND_EXPAND: - Expand(item); - break; - - case wxTREE_EXPAND_COLLAPSE: - Collapse(item); - break; - - case wxTREE_EXPAND_COLLAPSE_RESET: - CollapseAndReset(item); - break; - - case wxTREE_EXPAND_TOGGLE: - Toggle(item); - break; - - default: - wxFAIL_MSG("unknown action in wxTreeCtrl::ExpandItem"); - } -} - -wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, - const wxString& text, int image, int selImage, - long insertAfter) { -// InsertItem(parent, insertAfter, text, image, selImage); - #warning "Need to implement InsertItem" - return NULL; -} - -/* Old functions -long wxTreeCtrl::GetChild(long item) const { - GtkTreeItem *p; - GtkTreeItem *next = NULL; - - p = findGtkTreeItem(item); - GList *list = gtk_container_children(GTK_CONTAINER(p)); - next = GTK_TREE_ITEM(list->data);; - - if (next != NULL) - return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); - - return (-1); -} - -long wxTreeCtrl::GetFirstVisibleItem(void) const { - GtkTreeItem *next = NULL; - - GList *list = gtk_container_children(GTK_CONTAINER(m_anchor)); - next = GTK_TREE_ITEM(list->data);; -// gtk_container_foreach(GTK_CONTAINER(m_anchor), gtk_treectrl_next_visible_callback, &next); - - if (next != NULL) - return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); - - return (-1); -} - -long wxTreeCtrl::GetNextVisibleItem(long item) const { - GtkTreeItem *p; - GtkTreeItem *next = NULL; - - p = findGtkTreeItem(item); - GList *list = gtk_container_children(GTK_CONTAINER(p)); - next = GTK_TREE_ITEM(list->data);; -// gtk_container_foreach(GTK_CONTAINER(p), gtk_treectrl_next_visible_callback, &next); - - if (next != NULL) - return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); - - return (-1); -} - -bool wxTreeCtrl::GetItem(wxTreeItem& info) const { - GtkTreeItem *p; - - p = findGtkTreeItem(info.m_itemId); - - if (p == NULL) { - wxLogSysError("TreeCtrl::GetItem failed"); - return FALSE; - } - - wxConvertFromGtkTreeItem(info, p); - - return TRUE; -} - -bool wxTreeCtrl::SetItem(wxTreeItem& info) { - GtkTreeItem *p; - - p = findGtkTreeItem(info.m_itemId); - - if (p == NULL) { - wxLogSysError("TreeCtrl::SetItem failed"); - return FALSE; - } - - wxConvertToGtkTreeItem(this, info, &p); - - return TRUE; -} - -int wxTreeCtrl::GetItemState(long item, long stateMask) const { - wxTreeItem info; - - info.m_mask = wxTREE_MASK_STATE ; - info.m_stateMask = stateMask; - info.m_itemId = item; - - if (!GetItem(info)) - return 0; - - return info.m_state; -} - -bool wxTreeCtrl::SetItemState(long item, long state, long stateMask) { - wxTreeItem info; - - info.m_mask = wxTREE_MASK_STATE ; - info.m_state = state; - info.m_stateMask = stateMask; - info.m_itemId = item; - - return SetItem(info); -} -*/ - -// Operations -/* -bool wxTreeCtrl::DeleteChildren(long item) { - GtkTreeItem *p; - - p = findGtkTreeItem(item); - if (p == NULL) - return FALSE; - - gtk_tree_item_remove_subtree(GTK_TREE_ITEM(p)); - - return TRUE; -} -*/ - -/* -long wxTreeCtrl::InsertItem(long parent, wxTreeItem& info, long insertAfter) { - GtkTreeItem *p; - GtkTreeItem *item = NULL; - - info.m_itemId = m_curitemId; - m_curitemId++; - - wxConvertToGtkTreeItem(this, info, &item); - - if (parent != 0) { - p = findGtkTreeItem(parent); - if (p->subtree == NULL) { - GtkTree *tree = GTK_TREE(gtk_tree_new()); - gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); - gtk_widget_show(GTK_WIDGET(tree)); - p->expanded = 1; - } - - gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); - } else { - m_anchor = item; - gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); - } - - if ((info.m_mask & wxTREE_MASK_CHILDREN) != 0) { - GtkTree *tree = GTK_TREE(gtk_tree_new()); - gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), GTK_WIDGET(tree)); - gtk_widget_show(GTK_WIDGET(tree)); - } - - gtk_widget_show(GTK_WIDGET(item)); - - gtk_signal_connect(GTK_OBJECT(item), "select", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "deselect", - GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); - - gtk_signal_connect(GTK_OBJECT(item), "expand", - GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); - gtk_signal_connect(GTK_OBJECT(item), "collapse", - GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); - - return info.m_itemId; -} - -long wxTreeCtrl::InsertItem(long parent, const wxString& label, int image, - int selImage, long insertAfter) { - - wxTreeItem info; - info.m_text = label; - info.m_mask = wxTREE_MASK_TEXT; - if (image > -1) { - info.m_mask |= wxTREE_MASK_IMAGE | wxTREE_MASK_SELECTED_IMAGE; - info.m_image = image; - if (selImage == -1) - info.m_selectedImage = image; - else - info.m_selectedImage = selImage; - } - - return InsertItem(parent, info, insertAfter); -} -*/ - -void wxTreeCtrl::SendMessage(wxEventType command, const wxTreeItemId& item) { - wxTreeEvent event(command, GetId()); - event.SetEventObject(this); - event.m_item = item; - ProcessEvent(event); -} - -void wxTreeCtrl::SendExpanding(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDING, item); -} - -void wxTreeCtrl::SendExpanded(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDED, item); -} - -void wxTreeCtrl::SendCollapsing(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, item); -} - -void wxTreeCtrl::SendCollapsed(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSED, item); -} - -void wxTreeCtrl::SendSelChanging(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGED, item); -} - -void wxTreeCtrl::SendSelChanged(const wxTreeItemId& item) { - SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGING, item); -} - -// Tree event -IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxCommandEvent) - -wxTreeEvent::wxTreeEvent(wxEventType commandType, int id): - wxCommandEvent(commandType, id) { - m_code = 0; - m_itemOld = 0; -} diff --git a/src/gtk1/treegtk.cpp b/src/gtk1/treegtk.cpp new file mode 100644 index 0000000000..6d8fa194e1 --- /dev/null +++ b/src/gtk1/treegtk.cpp @@ -0,0 +1,936 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: treectrl.cpp +// Purpose: wxTreeCtrl +// Author: Denis Pershin +// Modified by: +// Created: 07/05/98 +// RCS-ID: $Id$ +// Copyright: (c) Denis Pershin +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#pragma implementation "treectrl.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "wx/gtk/treectrl.h" +#include +#include "wx/log.h" + +#include + +//static void wxConvertToGtkTreeItem(wxTreeCtrl *owner, wxTreeItem& info, GtkTreeItem **gtkItem); +//static void wxConvertFromGtkTreeItem(wxTreeItem& info, GtkTreeItem *gtkItem); + +static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data); +static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data); +static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data); + +// static void gtk_treectrl_next_callback (GtkWidget *widget, gpointer data); +// static void gtk_treectrl_next_visible_callback (GtkWidget *widget, gpointer data); +// static void gtk_treectrl_next_selected_callback (GtkWidget *widget, gpointer data); + +static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem); +static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem); +static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem); + +static void gtk_treeitem_expand_callback(GtkWidget *widget, wxTreeItemId *treeitem) { + wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); + if (owner == NULL) + return; + +// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); + owner->SendExpanding(GTK_TREE_ITEM(widget)); + owner->SendExpanded(GTK_TREE_ITEM(widget)); +}; + +static void gtk_treeitem_collapse_callback(GtkWidget *widget, wxTreeItemId *treeitem) { + wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); + if (owner == NULL) + return; + +// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); + owner->SendCollapsing(GTK_TREE_ITEM(widget)); + owner->SendCollapsed(GTK_TREE_ITEM(widget)); +}; + +static void gtk_treeitem_select_callback(GtkWidget *widget, wxTreeItemId *treeitem) { + wxTreeCtrl *owner = (wxTreeCtrl *)gtk_object_get_data(GTK_OBJECT(widget), "owner"); + if (owner == NULL) + return; + +// long id = (long)gtk_object_get_data(GTK_OBJECT(widget), "id"); + owner->SendSelChanging(GTK_TREE_ITEM(widget)); + owner->SendSelChanged(GTK_TREE_ITEM(widget)); +} + +#if !USE_SHARED_LIBRARY +IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl) + +#endif + +void wxTreeCtrl::Init() { + m_imageListNormal = NULL; + m_imageListState = NULL; + m_textCtrl = NULL; +} + +bool wxTreeCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, + const wxSize& size, long style, + const wxValidator& validator, const wxString& name) { + Init(); + + int x = pos.x; + int y = pos.y; + int width = size.x; + int height = size.y; + + m_windowStyle = style; + + SetParent(parent); + + if (width <= 0) + width = 100; + if (height <= 0) + height = 30; + if (x < 0) + x = 0; + if (y < 0) + y = 0; + + m_needParent = TRUE; + +printf("precreate\n"); + PreCreation( parent, id, pos, size, style, name ); + +printf("1\n"); + + m_widget = gtk_scrolled_window_new(NULL, NULL); +printf("2\n"); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(m_widget), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + +printf("3\n"); + m_tree = GTK_TREE(gtk_tree_new()); + +printf("4\n"); + gtk_container_add(GTK_CONTAINER(m_widget), GTK_WIDGET(m_tree)); +printf("5\n"); + gtk_widget_show(GTK_WIDGET(m_tree)); + + SetName(name); + SetValidator(validator); + +printf("Robert's new insertion code :-)\n"); + m_parent->DoAddChild( this ); +printf("postcreate\n"); + PostCreation(); + + gtk_widget_realize(GTK_WIDGET(m_tree)); + + Show(TRUE); + + return TRUE; +} + +wxTreeCtrl::~wxTreeCtrl(void) { + if (m_textCtrl) + delete m_textCtrl; +} + +// Attributes +static void gtk_treectrl_count_callback (GtkWidget *widget, gpointer data) { + int count = (*((int *)data)); + + count++; + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_count_callback, data); +} + +size_t wxTreeCtrl::GetCount() const { + int count = 0; + + if (m_anchor != NULL) + gtk_treectrl_count_callback(GTK_WIDGET(m_anchor), &count); + return count; +} + +unsigned int wxTreeCtrl::GetIndent() const { + return m_tree->indent_value; +} + +void wxTreeCtrl::SetIndent(unsigned int indent) { + m_tree->indent_value = indent; +} + +wxImageList *wxTreeCtrl::GetImageList() const { + return m_imageListNormal; +} + +wxImageList *wxTreeCtrl::GetStateImageList() const { + return m_imageListState; +} + +void wxTreeCtrl::SetImageList(wxImageList *imageList) { + m_imageListNormal = imageList; +} + +void wxTreeCtrl::SetStateImageList(wxImageList *imageList) { + m_imageListState = imageList; +} + +wxString wxTreeCtrl::GetItemText(const wxTreeItemId &item) const { + char *t; + + if (!item.IsOk()) + return wxString(""); + + GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); + gtk_label_get(l, &t); + + return t; +} + +int wxTreeCtrl::GetItemImage(const wxTreeItemId& item) const { + if (!item.IsOk()) + return (-1); + + return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "image"); +} + +int wxTreeCtrl::GetItemSelectedImage(const wxTreeItemId& item) const { + if (!item.IsOk()) + return (-1); + + return (int)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage"); +} + +wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const { + if (!item.IsOk()) + return NULL; + + return (wxTreeItemData *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "data"); +} + +void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text) { + if (!item.IsOk()) + return; + + GtkLabel *l = GTK_LABEL(gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label")); + gtk_label_set(l, text); +} + +void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image) { + if (!item.IsOk()) + return; + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "image", (void *)image); +} + +void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image) { + if (!item.IsOk()) + return; + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "selectedImage", (void *)image); +} + +void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data) { + if (!item.IsOk()) + return; + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "data", data); +} + +bool wxTreeCtrl::IsVisible(const wxTreeItemId& item) const { + return GTK_WIDGET_VISIBLE(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + + if (p->subtree == NULL) + return wxFalse; + + if (GTK_TREE(p->subtree)->children == NULL) + return wxFalse; + + if (g_list_length(GTK_TREE(p->subtree)->children) == 0) + return wxFalse; + + return wxTrue; +} + +bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const { + return (((GtkTreeItem *)item)->expanded != 0); +} + +bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return wxFalse; + + if (g_list_index(GTK_TREE(parent)->children, p) == -1) + return wxFalse; + + return wxTrue; +} + +wxTreeItemId wxTreeCtrl::GetRootItem() const { + return m_anchor; +} + +static void gtk_treectrl_first_selected_callback(GtkWidget *widget, gpointer data) { + GtkTreeItem *p = (*((GtkTreeItem **)data)); + + GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); + + if (tree->selection != NULL) { + p = (GtkTreeItem *)tree->selection->data; + return; + } + + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_selected_callback, data); +} + +wxTreeItemId wxTreeCtrl::GetSelection() const { + GtkTreeItem *p = NULL; + + if (m_anchor == NULL) + return NULL; + + gtk_treectrl_first_selected_callback(GTK_WIDGET(m_anchor), &p); + + return p; +} + +wxTreeItemId wxTreeCtrl::GetParent(const wxTreeItemId& item) const { + if (item.IsOk()) + return (GtkTreeItem *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "parent"); + + return NULL; +} + +wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item, long& cookie) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + cookie = 0; + return GTK_TREE_ITEM(g_list_first(GTK_TREE(parent)->children)->data); +} + +wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& item, long& cookie) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + cookie++; + return GTK_TREE_ITEM(g_list_nth(GTK_TREE(parent)->children, cookie)->data); +} + +wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const +{ + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + wxCHECK_MSG( GTK_IS_TREE(parent), NULL, "invalid tree item" ); + + return GTK_TREE_ITEM(g_list_last(GTK_TREE(parent)->children)->data); +} + +wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (g_list_index(GTK_TREE(parent)->children, p) == -1) + return NULL; + + return GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); +} + +wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkWidget *parent = GTK_WIDGET(p)->parent; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (g_list_index(GTK_TREE(parent)->children, p) == -1) + return NULL; + + return GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); +} + +static void gtk_treectrl_first_visible_callback(GtkWidget *widget, gpointer data) { + GtkTreeItem *p = (*((GtkTreeItem **)data)); + + GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); + + if (tree->children != NULL) { + guint len = g_list_length(tree->children); + for (guint i=0; ichildren, i)->data)))) { + p = GTK_TREE_ITEM((GtkTreeItem *)g_list_nth(tree->children, i)->data); + return; + } + } + } + + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_first_visible_callback, data); +} + +wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const { + GtkTreeItem *p = NULL; + + if (m_anchor == NULL) + return NULL; + + gtk_treectrl_first_visible_callback(GTK_WIDGET(m_anchor), &p); + + return p; +} + +wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); + GtkTreeItem *q; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (parent->children == NULL) + return NULL; + + q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, p))->data); + + while (q != p) { + q = GTK_TREE_ITEM(g_list_next(g_list_find(GTK_TREE(parent)->children, q))->data); + if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) + return q; + } + + return NULL; +} + +wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const { + GtkTreeItem *p = (GtkTreeItem *)item; + GtkTree *parent = GTK_TREE(GTK_WIDGET(p)->parent); + GtkTreeItem *q; + + if (!GTK_IS_TREE(parent)) + return NULL; + + if (parent->children == NULL) + return NULL; + + q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, p))->data); + + while (q != p) { + q = GTK_TREE_ITEM(g_list_previous(g_list_find(GTK_TREE(parent)->children, q))->data); + if (GTK_WIDGET_VISIBLE(GTK_WIDGET(q))) + return q; + } + + return NULL; +} + +wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text, int image, + int selectedImage, wxTreeItemData *data) { + return p_InsertItem(0, text, image, selectedImage, data); +} + +wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent, + const wxString& text, int image, int selectedImage, + wxTreeItemData *data) { +#warning "Need to implement PrependItem" + return NULL; +} + +wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, + const wxTreeItemId& idPrevious, const wxString& text, + int image, int selectedImage, wxTreeItemData *data) { +#warning "Need to implement InsertItem" + return NULL; +} + +wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parent, + const wxString& text, int image, int selectedImage, + wxTreeItemData *data) { + return p_InsertItem(parent, text, image, selectedImage, data); +} + +wxTreeItemId wxTreeCtrl::p_InsertItem(GtkTreeItem *p, + const wxString& text, int image, int selectedImage, + wxTreeItemData *data) { + GtkTreeItem *item; + +printf("begin insert\n"); + + item = GTK_TREE_ITEM(gtk_tree_item_new()); + + GtkHBox *m_box = GTK_HBOX(gtk_hbox_new(FALSE, 0)); + gtk_container_add (GTK_CONTAINER (item), GTK_WIDGET(m_box)); + + gtk_object_set_data(GTK_OBJECT(item), "w_box", m_box); + + const wxBitmap *bmp; + const wxImageList *list; + if ((list = GetImageList(wxIMAGE_LIST_NORMAL)) != NULL) + if ((bmp = list->GetBitmap(image)) != NULL) + if (bmp->Ok()) { + GdkBitmap *mask = NULL; + if (bmp->GetMask()) + mask = bmp->GetMask()->GetBitmap(); + GtkPixmap *m_image_widget = GTK_PIXMAP(gtk_pixmap_new(bmp->GetPixmap(), mask)); + gtk_misc_set_alignment (GTK_MISC (m_image_widget), 0.0, 0.5); + gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_image_widget), FALSE, FALSE, 0); + gtk_object_set_data(GTK_OBJECT(item), "w_image", (void *)m_image_widget); + gtk_object_set_data(GTK_OBJECT(item), "image", (void *)image); + gtk_widget_show (GTK_WIDGET(m_image_widget)); + } + GtkLabel *m_label_widget = GTK_LABEL(gtk_label_new ((char *)(const char *)text)); + gtk_misc_set_alignment (GTK_MISC (m_label_widget), 0.5, 0.5); + gtk_box_pack_start(GTK_BOX(m_box), GTK_WIDGET(m_label_widget), FALSE, FALSE, 0); + gtk_object_set_data(GTK_OBJECT(item), "w_label", m_label_widget); + gtk_widget_show (GTK_WIDGET(m_label_widget)); + + gtk_widget_show(GTK_WIDGET(m_box)); + + gtk_object_set_data(GTK_OBJECT(item), "owner", this); + gtk_object_set_data(GTK_OBJECT(item), "data", data); + gtk_object_set_data(GTK_OBJECT(item), "parent", p); + + if (p != 0) { + if (p->subtree == NULL) { + GtkTree *tree = GTK_TREE(gtk_tree_new()); + gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); + gtk_widget_show(GTK_WIDGET(tree)); + p->expanded = 1; + } + + gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); + } else { +printf("Adding root\n"); +printf("m_tree = %p\n", m_tree); + m_anchor = item; + gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); + } + + gtk_widget_show(GTK_WIDGET(item)); + + gtk_signal_connect(GTK_OBJECT(item), "select", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "deselect", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "expand", + GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); + gtk_signal_connect(GTK_OBJECT(item), "collapse", + GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); + + return item; +} + +void wxTreeCtrl::Delete(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + GtkTreeItem *parent = GTK_TREE_ITEM(GTK_WIDGET((GtkTreeItem *)item)->parent); + if (parent == NULL) + return; + + gtk_container_remove(GTK_CONTAINER(parent), GTK_WIDGET((GtkTreeItem *)item)); + + return; +} + +void wxTreeCtrl::DeleteAllItems() { + gtk_tree_item_remove_subtree(m_anchor); +} + +void wxTreeCtrl::Expand(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +void wxTreeCtrl::Collapse(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); + gtk_tree_item_remove_subtree(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +void wxTreeCtrl::Toggle(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + if (((GtkTreeItem *)item)->expanded) + gtk_tree_item_collapse(GTK_TREE_ITEM((GtkTreeItem *)item)); + else + gtk_tree_item_expand(GTK_TREE_ITEM((GtkTreeItem *)item)); +} + +static void gtk_treectrl_unselect_callback(GtkWidget *widget, gpointer data) { + GtkTreeItem *p; + + GtkTree *tree = GTK_TREE(GTK_TREE_ITEM(widget)->subtree); + + if (tree->selection != NULL) { + guint len = g_list_length(tree->selection); + for (guint i=0; iselection, i)->data); + gtk_tree_unselect_child(tree, GTK_WIDGET(p)); + } + } + + if (GTK_IS_CONTAINER(widget)) + gtk_container_foreach(GTK_CONTAINER(widget), gtk_treectrl_unselect_callback, data); +} + +void wxTreeCtrl::Unselect() { + if (m_anchor == NULL) + return; + + gtk_treectrl_unselect_callback(GTK_WIDGET(m_anchor), NULL); +} + +void wxTreeCtrl::SelectItem(const wxTreeItemId& item) { + if (!item.IsOk()) + return; + + gtk_tree_item_select((GtkTreeItem *)item); +} + +void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item) { +#warning "Need to implement EnsureVisible" +} + +void wxTreeCtrl::ScrollTo(const wxTreeItemId& item) { +#warning "Need to implement ScrollTo" +} + +wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item, + wxClassInfo* textControlClass) { + wxASSERT( textControlClass->IsKindOf(CLASSINFO(wxTextCtrl)) ); +#warning "Need to implement EditLabel" +/* + char *s; + m_editItem = item; + + GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)item), "w_label"); + gtk_label_get(m_label, &s); + + m_textCtrl = new wxTextCtrl(this, -1, s); +// m_textCtrl->SetValue(s); + + gtk_object_set_data(GTK_OBJECT((GtkTreeItem *)item), "w_edit", m_textCtrl->m_widget); + + gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)item), GTK_WIDGET(m_label)); + gtk_container_add(GTK_CONTAINER((GtkTreeItem *)item), m_textCtrl->m_widget); + +*/ + return m_textCtrl; +} + +wxTextCtrl* wxTreeCtrl::GetEditControl() const { + return m_textCtrl; +} + +void wxTreeCtrl::EndEditLabel(const wxTreeItemId& item, bool discardChanges) { +#warning "Need to implement EndEditLabel" +/* + GtkLabel *m_label = (GtkLabel *)gtk_object_get_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_label"); + gtk_label_set(m_label, m_textCtrl->GetValue()); + + gtk_object_remove_data(GTK_OBJECT((GtkTreeItem *)m_editItem), "w_edit"); + + gtk_container_remove(GTK_CONTAINER((GtkTreeItem *)m_editItem), m_textCtrl->m_widget); + gtk_container_add(GTK_CONTAINER((GtkTreeItem *)m_editItem), GTK_WIDGET(m_label)); + + delete m_textCtrl; + m_textCtrl = NULL; +*/ +} + +void wxTreeCtrl::ExpandItem(const wxTreeItemId& item, int action) { + switch (action) { + case wxTREE_EXPAND_EXPAND: + Expand(item); + break; + + case wxTREE_EXPAND_COLLAPSE: + Collapse(item); + break; + + case wxTREE_EXPAND_COLLAPSE_RESET: + CollapseAndReset(item); + break; + + case wxTREE_EXPAND_TOGGLE: + Toggle(item); + break; + + default: + wxFAIL_MSG("unknown action in wxTreeCtrl::ExpandItem"); + } +} + +wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parent, + const wxString& text, int image, int selImage, + long insertAfter) { +// InsertItem(parent, insertAfter, text, image, selImage); + #warning "Need to implement InsertItem" + return NULL; +} + +/* Old functions +long wxTreeCtrl::GetChild(long item) const { + GtkTreeItem *p; + GtkTreeItem *next = NULL; + + p = findGtkTreeItem(item); + GList *list = gtk_container_children(GTK_CONTAINER(p)); + next = GTK_TREE_ITEM(list->data);; + + if (next != NULL) + return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); + + return (-1); +} + +long wxTreeCtrl::GetFirstVisibleItem(void) const { + GtkTreeItem *next = NULL; + + GList *list = gtk_container_children(GTK_CONTAINER(m_anchor)); + next = GTK_TREE_ITEM(list->data);; +// gtk_container_foreach(GTK_CONTAINER(m_anchor), gtk_treectrl_next_visible_callback, &next); + + if (next != NULL) + return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); + + return (-1); +} + +long wxTreeCtrl::GetNextVisibleItem(long item) const { + GtkTreeItem *p; + GtkTreeItem *next = NULL; + + p = findGtkTreeItem(item); + GList *list = gtk_container_children(GTK_CONTAINER(p)); + next = GTK_TREE_ITEM(list->data);; +// gtk_container_foreach(GTK_CONTAINER(p), gtk_treectrl_next_visible_callback, &next); + + if (next != NULL) + return (long)gtk_object_get_data(GTK_OBJECT(next), "id"); + + return (-1); +} + +bool wxTreeCtrl::GetItem(wxTreeItem& info) const { + GtkTreeItem *p; + + p = findGtkTreeItem(info.m_itemId); + + if (p == NULL) { + wxLogSysError("TreeCtrl::GetItem failed"); + return FALSE; + } + + wxConvertFromGtkTreeItem(info, p); + + return TRUE; +} + +bool wxTreeCtrl::SetItem(wxTreeItem& info) { + GtkTreeItem *p; + + p = findGtkTreeItem(info.m_itemId); + + if (p == NULL) { + wxLogSysError("TreeCtrl::SetItem failed"); + return FALSE; + } + + wxConvertToGtkTreeItem(this, info, &p); + + return TRUE; +} + +int wxTreeCtrl::GetItemState(long item, long stateMask) const { + wxTreeItem info; + + info.m_mask = wxTREE_MASK_STATE ; + info.m_stateMask = stateMask; + info.m_itemId = item; + + if (!GetItem(info)) + return 0; + + return info.m_state; +} + +bool wxTreeCtrl::SetItemState(long item, long state, long stateMask) { + wxTreeItem info; + + info.m_mask = wxTREE_MASK_STATE ; + info.m_state = state; + info.m_stateMask = stateMask; + info.m_itemId = item; + + return SetItem(info); +} +*/ + +// Operations +/* +bool wxTreeCtrl::DeleteChildren(long item) { + GtkTreeItem *p; + + p = findGtkTreeItem(item); + if (p == NULL) + return FALSE; + + gtk_tree_item_remove_subtree(GTK_TREE_ITEM(p)); + + return TRUE; +} +*/ + +/* +long wxTreeCtrl::InsertItem(long parent, wxTreeItem& info, long insertAfter) { + GtkTreeItem *p; + GtkTreeItem *item = NULL; + + info.m_itemId = m_curitemId; + m_curitemId++; + + wxConvertToGtkTreeItem(this, info, &item); + + if (parent != 0) { + p = findGtkTreeItem(parent); + if (p->subtree == NULL) { + GtkTree *tree = GTK_TREE(gtk_tree_new()); + gtk_tree_item_set_subtree(GTK_TREE_ITEM(p), GTK_WIDGET(tree)); + gtk_widget_show(GTK_WIDGET(tree)); + p->expanded = 1; + } + + gtk_container_add(GTK_CONTAINER(p->subtree), GTK_WIDGET(item)); + } else { + m_anchor = item; + gtk_container_add(GTK_CONTAINER(m_tree), GTK_WIDGET(item)); + } + + if ((info.m_mask & wxTREE_MASK_CHILDREN) != 0) { + GtkTree *tree = GTK_TREE(gtk_tree_new()); + gtk_tree_item_set_subtree(GTK_TREE_ITEM(item), GTK_WIDGET(tree)); + gtk_widget_show(GTK_WIDGET(tree)); + } + + gtk_widget_show(GTK_WIDGET(item)); + + gtk_signal_connect(GTK_OBJECT(item), "select", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "deselect", + GTK_SIGNAL_FUNC(gtk_treeitem_select_callback), (gpointer)this ); + + gtk_signal_connect(GTK_OBJECT(item), "expand", + GTK_SIGNAL_FUNC(gtk_treeitem_expand_callback), (gpointer)this ); + gtk_signal_connect(GTK_OBJECT(item), "collapse", + GTK_SIGNAL_FUNC(gtk_treeitem_collapse_callback), (gpointer)this ); + + return info.m_itemId; +} + +long wxTreeCtrl::InsertItem(long parent, const wxString& label, int image, + int selImage, long insertAfter) { + + wxTreeItem info; + info.m_text = label; + info.m_mask = wxTREE_MASK_TEXT; + if (image > -1) { + info.m_mask |= wxTREE_MASK_IMAGE | wxTREE_MASK_SELECTED_IMAGE; + info.m_image = image; + if (selImage == -1) + info.m_selectedImage = image; + else + info.m_selectedImage = selImage; + } + + return InsertItem(parent, info, insertAfter); +} +*/ + +void wxTreeCtrl::SendMessage(wxEventType command, const wxTreeItemId& item) { + wxTreeEvent event(command, GetId()); + event.SetEventObject(this); + event.m_item = item; + ProcessEvent(event); +} + +void wxTreeCtrl::SendExpanding(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDING, item); +} + +void wxTreeCtrl::SendExpanded(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_EXPANDED, item); +} + +void wxTreeCtrl::SendCollapsing(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSING, item); +} + +void wxTreeCtrl::SendCollapsed(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_ITEM_COLLAPSED, item); +} + +void wxTreeCtrl::SendSelChanging(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGED, item); +} + +void wxTreeCtrl::SendSelChanged(const wxTreeItemId& item) { + SendMessage(wxEVT_COMMAND_TREE_SEL_CHANGING, item); +} + +// Tree event +IMPLEMENT_DYNAMIC_CLASS(wxTreeEvent, wxCommandEvent) + +wxTreeEvent::wxTreeEvent(wxEventType commandType, int id): + wxCommandEvent(commandType, id) { + m_code = 0; + m_itemOld = 0; +}