#include "Gtk_LdapTreeItem.h"
-#include <gtk--/base.h>
Gtk_LdapTreeItem::Gtk_LdapTreeItem() : Gtk_TreeItem() {
this->objectClass = NULL;
}
-Gtk_LdapTreeItem::Gtk_LdapTreeItem(char *c, My_Window *w) : Gtk_TreeItem() {
- this->rdn = c;
+Gtk_LdapTreeItem::Gtk_LdapTreeItem(char *c, My_Window *w, LDAP *ld) : Gtk_TreeItem() {
+ debug("Gtk_LdapTreeItem::Gtk_LdapTreeItem(%s)\n", c);
+ char **s;
+ this->dn = c;
+ s = ldap_explode_dn(this->dn, 1);
+ this->rdn = g_strdup_printf("%s", s[0]);
this->par = w;
+ this->ld = ld;
this->objectClass = NULL;
+ this->getDetails();
+ this->createPopupMenu();
+}
+
+void Gtk_LdapTreeItem::setDnd() {
+ debug("Gtk_LdapTreeItem::setDnd()\n");
+ this->set_events(get_events()|GDK_ALL_EVENTS_MASK);
+ this->drag_dest_set(GTK_DEST_DEFAULT_ALL, target_table, n_targets, static_cast <GdkDragAction> (GDK_ACTION_COPY|GDK_ACTION_MOVE));
+ this->drag_data_received.connect(slot(this, &(Gtk_LdapTreeItem::item_drag_data_received)));
+ this->drag_drop.connect(slot(this,&Gtk_LdapTreeItem::target_drag_drop));
+ this->drag_source_set(static_cast<GdkModifierType>(GDK_BUTTON1_MASK|GDK_BUTTON3_MASK), target_table, n_targets, static_cast<GdkDragAction>(GDK_ACTION_COPY|GDK_ACTION_MOVE));
+ gtk_drag_source_set(GTK_WIDGET(this->gtkobj()), static_cast<GdkModifierType>(GDK_BUTTON1_MASK|GDK_BUTTON3_MASK), target_table, n_targets, static_cast<GdkDragAction>(GDK_ACTION_COPY|GDK_ACTION_MOVE));
+ this->drag_data_get.connect(slot(this, &Gtk_LdapTreeItem::source_drag_data_get));
+ this->drag_data_delete.connect(slot(this,&Gtk_LdapTreeItem::source_drag_data_delete));
+ this->drag_leave.connect(slot(this,&Gtk_LdapTreeItem::target_drag_leave));
+
}
Gtk_LdapTreeItem::Gtk_LdapTreeItem(GtkTreeItem *t) : Gtk_TreeItem(t) {
delete this;
}
+Gtk_LdapTree* Gtk_LdapTreeItem::getSubtree(LDAP *ld, int counter) {
+ debug("Gtk_LdapTreeItem::getSubtree(%s)\n", this->dn);
+ if (counter <= 0) return NULL;
+ if (this->gtkobj()->subtree != NULL) {
+ //return (Gtk_LdapTree *)GTK_TREE(this->gtkobj()->subtree);
+ debug("This item has a subtree\n");
+ return (Gtk_LdapTree *)this->get_subtree(); //gtkobj()->subtree);
+ }
+ counter--;
+ Gtk_LdapTree *subtree = NULL, *tree = NULL;
+ Gtk_LdapTreeItem *subtreeitem = NULL;
+ LDAPMessage *r_i = NULL, *entry = NULL;
+ gchar *c;
+ char **s;
+ int entriesCount = 0, error;
+
+ this->ld = ld;
+ if (this->dn == "cn=config" || this->dn == "cn=monitor" || this->dn == "cn=schema") error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, 0, &r_i);
+ else {
+ if (strcasecmp(this->objectClass,"alias") == 0) error = ldap_search_s(this->ld, this->getAttribute("aliasedobjectname"), LDAP_SCOPE_ONELEVEL, "objectclass=*", NULL, 0, &r_i);
+ else error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_ONELEVEL, "objectclass=*", NULL, 0, &r_i);
+ }
+// printf("%s\n", ldap_err2string(error));
+ entriesCount = ldap_count_entries(this->ld, r_i);
+ debug("%i results\n", entriesCount);
+ if (entriesCount != 0) {
+ tree = new Gtk_LdapTree();
+ // this->set_subtree(*tree);
+ tree->set_selection_mode(GTK_SELECTION_BROWSE);
+ tree->set_view_mode(GTK_TREE_VIEW_ITEM);
+ tree->set_view_lines(false);
+ entry = ldap_first_entry(this->ld, r_i);
+ // float i = 1;
+ gfloat percent = 100/entriesCount;
+ debug("percent is %f\n", percent);
+ // this->par->progress.set_percentage(percent/100);
+ // this->par->progress.show();
+ while (entry != NULL) {
+ subtreeitem = new Gtk_LdapTreeItem(ldap_get_dn(this->ld, entry), this->par, this->ld);
+ debug("inserting %s into %s\n",subtreeitem->rdn,this->rdn);
+ tree->append(*subtreeitem);
+ subtree = subtreeitem->getSubtree(this->ld, counter);
+ subtreeitem->show();
+ if (subtree != NULL) subtreeitem->set_subtree(*subtree);
+ // subtreeitem->setDnd();
+ debug("done\n");
+ entry = ldap_next_entry(this->ld, entry);
+ // gfloat pvalue = (i*percent)/100;
+ // cout << pvalue << " %" << endl;
+ // this->par->progress.update(pvalue);
+ // this->par->progress.show();
+ // i++;
+ }
+ // this->set_subtree(*tree);
+ // this->par->progress.update(0);
+ // this->par->progress->show();
+ }
+// this->getDetails();
+ debug("done\n");
+ return tree;
+}
+
void Gtk_LdapTreeItem::setType(int t) {
-// cout << "Gtk_LdapTreeItem::setType(" << t << ")" << endl;
+ debug("Gtk_LdapTreeItem::setType(%s)\n", this->objectClass);
Gtk_Pixmap *xpm_icon;
Gtk_Label *label;
- if (this->getchild() != NULL) {
- xpm_label = new Gtk_HBox(GTK_HBOX(this->getchild()->gtkobj()));
- xpm_label->remove_c(xpm_label->children()->nth_data(0));
- xpm_label->remove_c(xpm_label->children()->nth_data(0));
+ if (this->get_child() != NULL) {
+ debug("got a child here");
+ //xpm_label = new Gtk_HBox(this->get_child());
+ this->remove();
+ /*
+ //xpm_label = new Gtk_HBox(*GTK_HBOX(this->get_child()->gtkobj()));
+ xpm_label = new Gtk_HBox(this->get_child()); //->gtkobj());
+ //xpm_label->remove_c(xpm_label->children().nth_data(0));
+ Gtk_HBox::BoxList &list = xpm_label->children();
+ Gtk_HBox::BoxList::iterator i = list.begin();
+ xpm_label->remove(*i);
+ //xpm_label->remove_c(xpm_label->children().nth_data(0));
+ xpm_label->remove(*xpm_label->children().begin());
+ */
}
- else xpm_label = new Gtk_HBox();
+ xpm_label = new Gtk_HBox();
if (strcasecmp(this->objectClass,"organization") == 0)
- xpm_icon=new Gtk_Pixmap(*xpm_label, root_node);
+ //xpm_icon=new Gtk_Pixmap(*xpm_label, root_node);
+ xpm_icon=new Gtk_Pixmap(root_node);
else if (strcasecmp(this->objectClass,"organizationalunit") == 0)
- xpm_icon=new Gtk_Pixmap(*xpm_label, branch_node);
+ //xpm_icon=new Gtk_Pixmap(*xpm_label, branch_node);
+ xpm_icon=new Gtk_Pixmap(branch_node);
else if (strcasecmp(this->objectClass,"person") == 0)
- xpm_icon=new Gtk_Pixmap(*xpm_label, leaf_node);
- else xpm_icon=new Gtk_Pixmap(*xpm_label, general_node);
+ //xpm_icon=new Gtk_Pixmap(*xpm_label, leaf_node);
+ xpm_icon=new Gtk_Pixmap(leaf_node);
+ else if (strcasecmp(this->objectClass,"alias") == 0)
+ //xpm_icon=new Gtk_Pixmap(*xpm_label, alias_node);
+ xpm_icon=new Gtk_Pixmap(alias_node);
+ else if (strcasecmp(this->objectClass,"rfc822mailgroup") == 0)
+ //xpm_icon=new Gtk_Pixmap(*xpm_label, rfc822mailgroup_node);
+ xpm_icon=new Gtk_Pixmap(rfc822mailgroup_node);
+ else if (strcasecmp(this->objectClass,"LDAPsubentry") == 0)
+ xpm_icon=new Gtk_Pixmap(monitor);
+ else //xpm_icon=new Gtk_Pixmap(*xpm_label, general_node);
+ xpm_icon=new Gtk_Pixmap(general_node);
label = new Gtk_Label(this->rdn);
xpm_label->pack_start(*xpm_icon, false, false, 1);
xpm_label->pack_start(*label, false, false, 1);
- if (this->getchild() == NULL) this->add(xpm_label);
- label->show();
- xpm_label->show();
- xpm_icon->show();
+ if (this->get_child() == NULL) {
+ debug("no children - GREAT!!");
+ this->add(*xpm_label);
+ }
+ //label->show();
+ //xpm_icon->show();
+ //xpm_label->show();
+ show_all();
}
int Gtk_LdapTreeItem::showDetails() {
-// cout << "Gtk_LdapTreeItem::showDetails()" << endl;
+ debug("Gtk_LdapTreeItem::showDetails()\n");
+ if (this->notebook == NULL) this->getDetails();
if (this->notebook != NULL) {
- if (par->viewport->getchild() != NULL) {
- par->viewport->remove_c(par->viewport->getchild()->gtkobj());
+ debug("Have a notebook here");
+ if (par->viewport2->get_child() != NULL) {
+ debug(" and the viewport has children");
+ //par->viewport2->remove(par->viewport2->get_child());
+ par->viewport2->remove();
+ debug(" which have been removed");
}
- par->viewport->add(this->notebook);
+ else debug(" and viewport has no children");
+ par->viewport2->add(*this->notebook);
this->notebook->show();
- par->viewport->show();
+ par->viewport2->show();
return 0;
}
- else this->getDetails();
- this->showDetails();
+ else debug("No notebook and no details");
return 0;
}
+char* Gtk_LdapTreeItem::getAttribute(char *c) {
+ int entriesCount, error;
+ BerElement *ber;
+ LDAPMessage *entry;
+ char *attribute, **values;
+ error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, 0, &this->result_identifier);
+ entriesCount = ldap_count_entries(this->ld, this->result_identifier);
+ if (entriesCount == 0) return 0;
+ for (entry = ldap_first_entry(ld, result_identifier); entry != NULL; entry = ldap_next_entry(ld, result_identifier)) {
+ for (attribute = ldap_first_attribute(ld, entry, &ber); attribute != NULL; attribute = ldap_next_attribute(ld, entry, ber)) {
+ values = ldap_get_values(ld, entry, attribute);
+ if (strcasecmp(attribute, "aliasedobjectname") == 0) {
+ this->aliasedObjectName = strdup(values[0]);
+ }
+ }
+ }
+ return this->aliasedObjectName;
+}
+
int Gtk_LdapTreeItem::getDetails() {
-// cout << "Gtk_LdapTreeItem::getDetails()" << endl;
+ debug("Gtk_LdapTreeItem::getDetails()\n");
int error, entriesCount;
BerElement *ber;
LDAPMessage *entry;
char *attribute, **values;
+ char attrib[32];
Gtk_CList *table;
Gtk_Label *label;
GList *child_list;
- Gtk_Notebook *g;
Gtk_Viewport *viewport;
- error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, 0, &result_identifier);
- entriesCount = ldap_count_entries(ld, result_identifier);
+ error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, 0, &this->result_identifier);
+ entriesCount = ldap_count_entries(this->ld, this->result_identifier);
if (entriesCount == 0) return 0;
- notebook = new Gtk_Notebook();
- notebook->set_tab_pos(GTK_POS_LEFT);
+ this->notebook = new Gtk_Notebook();
+ this->notebook->set_tab_pos(GTK_POS_LEFT);
const gchar *titles[] = { "values" };
for (entry = ldap_first_entry(ld, result_identifier); entry != NULL; entry = ldap_next_entry(ld, result_identifier)) {
for (attribute = ldap_first_attribute(ld, entry, &ber); attribute != NULL; attribute = ldap_next_attribute(ld, entry, ber)) {
values = ldap_get_values(ld, entry, attribute);
if (strcasecmp(attribute, "objectclass") == 0) {
+ // debug("processing objectclass\n");
if (strcasecmp(values[0],"top") == 0)
this->objectClass = strdup(values[1]);
- else this->objectClass = values[0];
+ else this->objectClass = strdup(values[0]);
}
table = new Gtk_CList(1, titles);
for (int i=0; i<ldap_count_values(values); i++) {
+ // debug("%i:%s\n",i, values[i]);
const gchar *t[] = { values[i] };
table->append(t);
}
ldap_value_free(values);
- label = new Gtk_Label(attribute);
- notebook->append_page(*table, *label);
+ sprintf(attrib, "%s", attribute);
+ label = new Gtk_Label(attrib);
+ label->set_alignment(0, 0);
+ label->set_justify(GTK_JUSTIFY_LEFT);
+ this->notebook->pages().push_back(Gtk_Notebook_Helpers::TabElem(*table, *label));
table->show();
label->show();
}
}
this->setType(1);
-// cout << ".";
+ debug("done\n");
return 0;
}
+
+void Gtk_LdapTreeItem::createPopupMenu() {
+ debug("Gtk_LdapTreeItem::createPopupMenu()\n");
+ Gtk_MenuItem *item;
+
+ this->menu = new Gtk_Menu();
+
+ item = new Gtk_MenuItem("Add");
+ this->menu->add(*item);
+ item = new Gtk_MenuItem("Delete");
+ this->menu->add(*item);
+ item = new Gtk_MenuItem();
+ this->menu->add(*item);
+ item = new Gtk_MenuItem("Cut");
+ this->menu->add(*item);
+ item = new Gtk_MenuItem("Copy");
+ this->menu->add(*item);
+ item = new Gtk_MenuItem("Paste");
+ this->menu->add(*item);
+ this->menu->show_all();
+ this->menu->activate();
+}
+/*
+void Gtk_LdapTreeItem::show_impl() {
+ debug("%s showed\n", this->dn);
+// Gtk_c_signals_Base *sig=(Gtk_c_signals_Base *)internal_getsignalbase();
+// sig->show(GTK_WIDGET(gtkobj()));
+}
+*/
+/*
void Gtk_LdapTreeItem::select_impl() {
-// cout << this->dn << " selected" << endl;
-// gtk_item_select(GTK_ITEM(GTK_TREE_ITEM(this->gtkobj())));
- Gtk_c_signals_Item *sig=(Gtk_c_signals_Item *)internal_getsignalbase();
- if (!sig->select) return;
- sig->select(GTK_ITEM(gtkobj()));
+ debug("%s selected\n", this->dn);
this->showDetails();
+ Gtk_TreeItem::select_impl();
}
+*/
void Gtk_LdapTreeItem::collapse_impl() {
-// cout << this->dn << " collapsed" << endl;
- Gtk_c_signals_TreeItem *sig=(Gtk_c_signals_TreeItem *)internal_getsignalbase();
- if (!sig->collapse) return;
- sig->collapse(GTK_TREE_ITEM(gtkobj()));
-// gtk_widget_hide(GTK_WIDGET(GTK_TREE(GTK_TREE_ITEM (this->gtkobj())->subtree)));
+ debug("%s collapsed\n", this->dn);
+ Gtk_TreeItem::collapse_impl();
}
void Gtk_LdapTreeItem::expand_impl() {
-// cout << this->dn << " expanded" << endl;
- Gtk_c_signals_TreeItem *sig=(Gtk_c_signals_TreeItem *)internal_getsignalbase();
- if (!sig->expand) return;
- sig->expand(GTK_TREE_ITEM(gtkobj()));
-// Gtk_Tree *t;
-// t = new Gtk_Tree(GTK_TREE(GTK_TREE_ITEM(this->gtkobj())->subtree));
-// bool vis = t->visible();
-// if (vis == false) {
-// gtk_widget_show(GTK_WIDGET(GTK_TREE(GTK_TREE_ITEM (this->gtkobj())->subtree)));
-// cout << this->dn << " expanded" << endl;
-// }
-// else {
-// gtk_widget_hide(GTK_WIDGET(GTK_TREE(GTK_TREE_ITEM (this->gtkobj())->subtree)));
-// cout << this->dn << " collapsed" << endl;
-// }
+ debug("%s expanded\n",this->dn);
+ Gtk_LdapTreeItem *item;
+ G_List<GtkWidget> *list;
+ Gtk_Tree *tree;
+ Gtk_TreeItem::expand_impl();
+}
+
+void Gtk_LdapTreeItem::click() {
+ debug("%s clicked\n", this->dn);
+}
+
+/*
+gint Gtk_LdapTreeItem::button_press_event_impl(GdkEventButton *p0) {
+ debug("Gtk_LdapTreeItem::button_press_event_impl(%i)\n", p0->button);
+ GdkEventButton *bevent = (GdkEventButton *) p0;
+ if (p0->button == 3) gtk_menu_popup(this->menu->gtkobj(), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
+ Gtk_TreeItem::button_press_event_impl(p0);
+// Gtk_TreeItem::select_impl();
+}
+*/
+
+void Gtk_LdapTreeItem::item_drag_data_received(GdkDragContext *context,
+ gint x,
+ gint y,
+ GtkSelectionData *data,
+ guint info,
+ guint time) {
+ debug("Gtk_LdapTreeItem::item_drag_data_received\n");
+ Gdk_DragContext gdc(context);
+ if ((data->length >= 0) && (data->format == 8)) {
+ cout << "Received \"" << (gchar *)data->data << "\" in label" << endl;
+ Gtk_Widget::drag_finish(gdc, true, false, time);
+ return;
+ }
+
+ Gtk_Widget::drag_finish(gdc , false, false, time);
}
+
+gboolean Gtk_LdapTreeItem::target_drag_drop(GdkDragContext *context,
+ gint x, gint y, guint theTime) {
+ debug("Gtk_LdapTreeItem::target_drag_drop\n");
+ cout << "drop" << endl;
+ have_drag = false;
+
+// pixmap.set(trashcan_closed, trashcan_closed_mask);
+
+ Gdk_DragContext gdc(context);
+ Gdk_Atom *ga = static_cast <GdkAtom *>(context->targets->data);
+ if (context->targets) {
+ this->drag_get_data(gdc, *ga, theTime);
+ return true;
+ }
+
+ return false;
+}
+
+
+void Gtk_LdapTreeItem::source_drag_data_get(GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint info, guint32 time) {
+ debug("Gtk_LdapTreeItem::source_drag_data_get\n");
+ if (info == TARGET_ROOTWIN) {
+ cout << "I was dropped on the rootwin" << endl;
+ }
+ else {
+ if ( info == TARGET_URL ) {
+ gtk_selection_data_set(selection_data,
+ selection_data->target, 8,
+ reinterpret_cast < const unsigned char * >
+ ("file:///home/otaylor/images/weave.png"), 37);
+ }
+ else {
+ gtk_selection_data_set(selection_data,
+ selection_data->target, 8,
+ reinterpret_cast <const unsigned char *>
+ ("I'm Data!"), 9);
+ }
+ }
+}
+
+void Gtk_LdapTreeItem::source_drag_data_delete(GdkDragContext *context) {
+ debug("Gtk_LdapTreeItem::source_drag_data_delete\n");
+ debug("Delete the data!\n");
+}
+
+void Gtk_LdapTreeItem::target_drag_leave(GdkDragContext *context, guint time) {
+ debug("Gtk_LdapTreeItem::target_drag_leave\n");
+ this->have_drag = false;
+// pixmap.set(trashcan_closed, trashcan_closed_mask);
+}
+