]> git.sur5r.net Git - openldap/blob - contrib/gtk-tool/Gtk_LdapTreeItem.cc
some minor changes - d'n'd support forthcoming
[openldap] / contrib / gtk-tool / Gtk_LdapTreeItem.cc
1 #include "Gtk_LdapTreeItem.h"
2
3 Gtk_LdapTreeItem::Gtk_LdapTreeItem() : Gtk_TreeItem() {
4         this->objectClass = NULL;
5 }
6
7 Gtk_LdapTreeItem::Gtk_LdapTreeItem(char *c, My_Window *w, LDAP *ld) : Gtk_TreeItem() {
8         debug("Gtk_LdapTreeItem::Gtk_LdapTreeItem(%s)\n", c);
9         char **s;
10         this->dn = c;
11         s = ldap_explode_dn(this->dn, 1);
12         this->rdn = g_strdup_printf("%s", s[0]);
13         this->par = w;
14         this->ld = ld;
15         this->objectClass = NULL;
16         this->getDetails();
17         this->createPopupMenu();
18 }
19
20 void Gtk_LdapTreeItem::setDnd() {
21         debug("Gtk_LdapTreeItem::setDnd()\n");
22         this->set_events(get_events()|GDK_ALL_EVENTS_MASK);
23         this->drag_dest_set(GTK_DEST_DEFAULT_ALL, target_table, n_targets, static_cast <GdkDragAction> (GDK_ACTION_COPY|GDK_ACTION_MOVE));
24         this->drag_data_received.connect(slot(this, &(Gtk_LdapTreeItem::item_drag_data_received)));
25         this->drag_drop.connect(slot(this,&Gtk_LdapTreeItem::target_drag_drop));
26         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));
27         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));
28         this->drag_data_get.connect(slot(this, &Gtk_LdapTreeItem::source_drag_data_get));
29         this->drag_data_delete.connect(slot(this,&Gtk_LdapTreeItem::source_drag_data_delete));
30         this->drag_leave.connect(slot(this,&Gtk_LdapTreeItem::target_drag_leave));
31
32 }
33
34 Gtk_LdapTreeItem::Gtk_LdapTreeItem(GtkTreeItem *t) : Gtk_TreeItem(t) {
35 }
36
37 Gtk_LdapTreeItem::~Gtk_LdapTreeItem() {
38         cout << "Bye" << endl;
39         delete this;
40 }
41
42 Gtk_LdapTree* Gtk_LdapTreeItem::getSubtree(LDAP *ld, int counter) {
43         debug("Gtk_LdapTreeItem::getSubtree(%s)\n", this->dn);
44         if (counter <= 0) return NULL;
45         if (this->gtkobj()->subtree != NULL) {
46                 //return (Gtk_LdapTree *)GTK_TREE(this->gtkobj()->subtree);
47                 debug("This item has a subtree\n");
48                 return (Gtk_LdapTree *)this->get_subtree(); //gtkobj()->subtree);
49         }
50         counter--;
51         Gtk_LdapTree *subtree = NULL, *tree = NULL;
52         Gtk_LdapTreeItem *subtreeitem = NULL;
53         LDAPMessage *r_i = NULL, *entry = NULL;
54         gchar *c;
55         char **s;
56         int entriesCount = 0, error;
57
58         this->ld = ld;
59         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);
60         else {
61                 if (strcasecmp(this->objectClass,"alias") == 0) error = ldap_search_s(this->ld, this->getAttribute("aliasedobjectname"), LDAP_SCOPE_ONELEVEL, "objectclass=*", NULL, 0, &r_i);
62                 else error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_ONELEVEL, "objectclass=*", NULL, 0, &r_i);
63         }
64 //      printf("%s\n", ldap_err2string(error));
65         entriesCount = ldap_count_entries(this->ld, r_i);
66         debug("%i results\n", entriesCount);
67         if (entriesCount != 0) { 
68                 tree = new Gtk_LdapTree();
69         //      this->set_subtree(*tree);
70                 tree->set_selection_mode(GTK_SELECTION_BROWSE);
71                 tree->set_view_mode(GTK_TREE_VIEW_ITEM);
72                 tree->set_view_lines(false);
73                 entry = ldap_first_entry(this->ld, r_i);
74         //      float i = 1;
75                 gfloat percent = 100/entriesCount;
76                 debug("percent is %f\n", percent);
77         //      this->par->progress.set_percentage(percent/100);
78         //      this->par->progress.show();
79                 while (entry != NULL) {
80                         subtreeitem = new Gtk_LdapTreeItem(ldap_get_dn(this->ld, entry), this->par, this->ld);
81                         debug("inserting %s into %s\n",subtreeitem->rdn,this->rdn);
82                         tree->append(*subtreeitem);
83                         subtree = subtreeitem->getSubtree(this->ld, counter);
84                         subtreeitem->show();
85                         if (subtree != NULL) subtreeitem->set_subtree(*subtree);
86                 //      subtreeitem->setDnd();
87                         debug("done\n");
88                         entry = ldap_next_entry(this->ld, entry);
89                 //      gfloat pvalue = (i*percent)/100;
90                 //      cout << pvalue << " %" << endl;
91                 //      this->par->progress.update(pvalue);
92                 //      this->par->progress.show();
93                 //      i++;
94                 }
95         //      this->set_subtree(*tree);
96         //      this->par->progress.update(0);
97         //      this->par->progress->show();
98         }
99 //      this->getDetails();
100         debug("done\n");
101         return tree;
102 }
103
104 void Gtk_LdapTreeItem::setType(int t) {
105         debug("Gtk_LdapTreeItem::setType(%s)\n", this->objectClass);
106         Gtk_Pixmap *xpm_icon;
107         Gtk_Label *label;
108         if (this->get_child() != NULL) {
109                 debug("got a child here");
110                 //xpm_label = new Gtk_HBox(this->get_child());
111                 this->remove();
112                 /*
113                 //xpm_label = new Gtk_HBox(*GTK_HBOX(this->get_child()->gtkobj()));
114                 xpm_label = new Gtk_HBox(this->get_child()); //->gtkobj());
115                 //xpm_label->remove_c(xpm_label->children().nth_data(0));
116                 Gtk_HBox::BoxList &list = xpm_label->children();
117                 Gtk_HBox::BoxList::iterator i = list.begin();
118                 xpm_label->remove(*i);
119                 //xpm_label->remove_c(xpm_label->children().nth_data(0));
120                 xpm_label->remove(*xpm_label->children().begin());
121                 */
122         }
123         xpm_label = new Gtk_HBox();
124         if (strcasecmp(this->objectClass,"organization") == 0)
125                 //xpm_icon=new Gtk_Pixmap(*xpm_label, root_node);
126                 xpm_icon=new Gtk_Pixmap(root_node);
127         else if (strcasecmp(this->objectClass,"organizationalunit") == 0)
128                 //xpm_icon=new Gtk_Pixmap(*xpm_label, branch_node);
129                 xpm_icon=new Gtk_Pixmap(branch_node);
130         else if (strcasecmp(this->objectClass,"person") == 0)
131                 //xpm_icon=new Gtk_Pixmap(*xpm_label, leaf_node);
132                 xpm_icon=new Gtk_Pixmap(leaf_node);
133         else if (strcasecmp(this->objectClass,"alias") == 0)
134                 //xpm_icon=new Gtk_Pixmap(*xpm_label, alias_node);
135                 xpm_icon=new Gtk_Pixmap(alias_node);
136         else if (strcasecmp(this->objectClass,"rfc822mailgroup") == 0)
137                 //xpm_icon=new Gtk_Pixmap(*xpm_label, rfc822mailgroup_node);
138                 xpm_icon=new Gtk_Pixmap(rfc822mailgroup_node);
139         else if (strcasecmp(this->objectClass,"LDAPsubentry") == 0)
140                 xpm_icon=new Gtk_Pixmap(monitor);
141         else //xpm_icon=new Gtk_Pixmap(*xpm_label, general_node);
142                 xpm_icon=new Gtk_Pixmap(general_node);
143         label = new Gtk_Label(this->rdn);
144         xpm_label->pack_start(*xpm_icon, false, false, 1);
145         xpm_label->pack_start(*label, false, false, 1);
146         if (this->get_child() == NULL) {
147                 debug("no children - GREAT!!");
148                 this->add(*xpm_label);
149         }
150         //label->show();
151         //xpm_icon->show();
152         //xpm_label->show();
153         show_all();
154 }
155
156 int Gtk_LdapTreeItem::showDetails() {
157         debug("Gtk_LdapTreeItem::showDetails()\n");
158         if (this->notebook == NULL) this->getDetails();
159         if (this->notebook != NULL) {
160                 debug("Have a notebook here");
161                 if (par->viewport2->get_child() != NULL) {
162                         debug(" and the viewport has children");
163                         //par->viewport2->remove(par->viewport2->get_child());
164                         par->viewport2->remove();
165                         debug(" which have been removed");
166                 }
167                 else debug(" and viewport has no children");
168                 par->viewport2->add(*this->notebook);
169                 this->notebook->show();
170                 par->viewport2->show();
171                 return 0;
172         }
173         else debug("No notebook and no details");
174         return 0;
175 }
176
177 char* Gtk_LdapTreeItem::getAttribute(char *c) {
178         int entriesCount, error;
179         BerElement *ber;
180         LDAPMessage *entry;
181         char *attribute, **values;
182         error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, 0, &this->result_identifier);
183         entriesCount = ldap_count_entries(this->ld, this->result_identifier);
184         if (entriesCount == 0) return 0;
185         for (entry = ldap_first_entry(ld, result_identifier); entry != NULL; entry = ldap_next_entry(ld, result_identifier)) {
186                 for (attribute = ldap_first_attribute(ld, entry, &ber); attribute != NULL; attribute = ldap_next_attribute(ld, entry, ber)) {
187                         values = ldap_get_values(ld, entry, attribute);
188                         if (strcasecmp(attribute, "aliasedobjectname") == 0) {
189                                 this->aliasedObjectName = strdup(values[0]);
190                         }
191                 }
192         }
193         return this->aliasedObjectName;
194 }
195
196 int Gtk_LdapTreeItem::getDetails() {
197         debug("Gtk_LdapTreeItem::getDetails()\n");
198         int error, entriesCount;
199         BerElement *ber;
200         LDAPMessage *entry;
201         char *attribute, **values;
202         char attrib[32];
203         Gtk_CList *table;
204         Gtk_Label *label;
205         GList *child_list;
206         Gtk_Viewport *viewport;
207         error = ldap_search_s(this->ld, this->dn, LDAP_SCOPE_BASE, "objectclass=*", NULL, 0, &this->result_identifier);
208         entriesCount = ldap_count_entries(this->ld, this->result_identifier);
209         if (entriesCount == 0) return 0;
210         this->notebook = new Gtk_Notebook();
211         this->notebook->set_tab_pos(GTK_POS_LEFT);
212         const gchar *titles[] = { "values" };
213         
214         for (entry = ldap_first_entry(ld, result_identifier); entry != NULL; entry = ldap_next_entry(ld, result_identifier)) {
215                 for (attribute = ldap_first_attribute(ld, entry, &ber); attribute != NULL; attribute = ldap_next_attribute(ld, entry, ber)) {
216                         values = ldap_get_values(ld, entry, attribute);
217                         if (strcasecmp(attribute, "objectclass") == 0) {
218                         //      debug("processing objectclass\n");
219                                 if (strcasecmp(values[0],"top") == 0)
220                                         this->objectClass = strdup(values[1]);
221                                 else this->objectClass = strdup(values[0]);
222                         }
223                         table = new Gtk_CList(1, titles);
224                         for (int i=0; i<ldap_count_values(values); i++) {
225                         //      debug("%i:%s\n",i, values[i]);
226                                 const gchar *t[] = { values[i] };
227                                 table->append(t);
228                         }
229                         ldap_value_free(values);
230                         sprintf(attrib, "%s", attribute);
231                         label = new Gtk_Label(attrib);
232                         label->set_alignment(0, 0);
233                         label->set_justify(GTK_JUSTIFY_LEFT);
234                         this->notebook->pages().push_back(Gtk_Notebook_Helpers::TabElem(*table, *label));
235                         table->show();
236                         label->show();
237                 }
238         }
239         this->setType(1);
240         debug("done\n");
241         return 0;
242 }
243
244 void Gtk_LdapTreeItem::createPopupMenu() {
245         debug("Gtk_LdapTreeItem::createPopupMenu()\n");
246         Gtk_MenuItem *item;
247
248         this->menu = new Gtk_Menu();
249         
250         item = new Gtk_MenuItem("Add");
251         this->menu->add(*item);
252         item = new Gtk_MenuItem("Delete");
253         this->menu->add(*item);
254         item = new Gtk_MenuItem();
255         this->menu->add(*item);
256         item = new Gtk_MenuItem("Cut");
257         this->menu->add(*item);
258         item = new Gtk_MenuItem("Copy");
259         this->menu->add(*item);
260         item = new Gtk_MenuItem("Paste");
261         this->menu->add(*item);
262         this->menu->show_all();
263         this->menu->activate();
264 }
265 /*
266 void Gtk_LdapTreeItem::show_impl() {
267         debug("%s showed\n", this->dn);
268 //      Gtk_c_signals_Base *sig=(Gtk_c_signals_Base *)internal_getsignalbase();
269 //      sig->show(GTK_WIDGET(gtkobj()));
270 }
271 */
272 /*
273 void Gtk_LdapTreeItem::select_impl() {
274         debug("%s selected\n", this->dn);
275         this->showDetails();
276         Gtk_TreeItem::select_impl();
277 }
278 */
279
280 void Gtk_LdapTreeItem::collapse_impl() {
281         debug("%s collapsed\n", this->dn);
282         Gtk_TreeItem::collapse_impl();
283 }
284
285 void Gtk_LdapTreeItem::expand_impl() {
286         debug("%s expanded\n",this->dn);
287         Gtk_LdapTreeItem *item;
288         G_List<GtkWidget> *list;
289         Gtk_Tree *tree;
290         Gtk_TreeItem::expand_impl();
291 }
292
293 void Gtk_LdapTreeItem::click() {
294         debug("%s clicked\n", this->dn);
295 }
296
297 /*
298 gint Gtk_LdapTreeItem::button_press_event_impl(GdkEventButton *p0) {
299         debug("Gtk_LdapTreeItem::button_press_event_impl(%i)\n", p0->button);
300         GdkEventButton *bevent = (GdkEventButton *) p0;
301         if (p0->button == 3) gtk_menu_popup(this->menu->gtkobj(), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
302         Gtk_TreeItem::button_press_event_impl(p0);
303 //      Gtk_TreeItem::select_impl();
304 }
305 */
306
307 void Gtk_LdapTreeItem::item_drag_data_received(GdkDragContext *context,
308                                     gint                x,
309                                     gint                y,
310                                     GtkSelectionData   *data,
311                                     guint               info,
312                                     guint               time) {
313         debug("Gtk_LdapTreeItem::item_drag_data_received\n");
314         Gdk_DragContext gdc(context);
315         if ((data->length >= 0) && (data->format == 8)) {
316                 cout << "Received \"" << (gchar *)data->data << "\" in label" << endl;
317                 Gtk_Widget::drag_finish(gdc, true, false, time);
318                 return;
319         }
320
321         Gtk_Widget::drag_finish(gdc , false, false, time);
322 }
323
324 gboolean Gtk_LdapTreeItem::target_drag_drop(GdkDragContext *context,
325                             gint x, gint y, guint theTime) {
326         debug("Gtk_LdapTreeItem::target_drag_drop\n");
327         cout << "drop" << endl;
328         have_drag = false;
329
330 //      pixmap.set(trashcan_closed, trashcan_closed_mask);
331
332         Gdk_DragContext gdc(context);
333         Gdk_Atom *ga = static_cast <GdkAtom *>(context->targets->data);
334         if (context->targets) {
335                 this->drag_get_data(gdc, *ga, theTime);
336                 return true;
337         }
338
339         return false;
340 }
341
342
343 void Gtk_LdapTreeItem::source_drag_data_get(GdkDragContext      *context,
344                                  GtkSelectionData *selection_data,
345                                  guint info, guint32 time) {
346         debug("Gtk_LdapTreeItem::source_drag_data_get\n");
347         if (info == TARGET_ROOTWIN) {
348                 cout << "I was dropped on the rootwin" << endl;
349         }
350         else {
351                 if ( info == TARGET_URL ) {
352                         gtk_selection_data_set(selection_data,
353                                 selection_data->target, 8,
354                                 reinterpret_cast < const unsigned char * >
355                                 ("file:///home/otaylor/images/weave.png"), 37);
356                 }
357                 else {
358                         gtk_selection_data_set(selection_data,
359                                 selection_data->target, 8,
360                                 reinterpret_cast <const unsigned char *>
361                                 ("I'm Data!"), 9);
362                 }
363         }
364 }
365
366 void Gtk_LdapTreeItem::source_drag_data_delete(GdkDragContext *context) {
367         debug("Gtk_LdapTreeItem::source_drag_data_delete\n");
368         debug("Delete the data!\n");
369 }
370
371 void Gtk_LdapTreeItem::target_drag_leave(GdkDragContext *context, guint time) {
372   debug("Gtk_LdapTreeItem::target_drag_leave\n");
373   this->have_drag = false;
374 //  pixmap.set(trashcan_closed, trashcan_closed_mask);
375 }
376