39
39
#include "common.h"
40
40
#include "configfile.h"
43
#include "errorchain.h"
45
#include "gq-browser-model.h"
42
47
#include "gq-browser-node-dn.h"
43
48
#include "gq-browser-node-server.h"
44
49
#include "gq-browser-node-reference.h"
50
#include "gq-diff-tab.h"
51
#include "gq-input-form.h"
45
52
#include "gq-server-list.h"
51
#include "errorchain.h"
53
#include "gq-tree-view.h"
54
#include "gq-utilities.h"
55
#include "gq-window.h"
58
60
#include "search.h"
64
65
#include "browse-dnd.h"
67
static gboolean button_press_on_tree_item(GtkWidget *tree,
68
GdkEventButton *event,
72
static void tree_row_refresh(GtkMenuItem *menuitem, GqTab *tab);
74
void record_path(GqTab *tab, GqBrowserNode *entry,
75
GQTreeWidget *ctreeroot, GQTreeWidgetNode *node)
68
struct GqTabBrowsePrivate {
69
GqInputForm* input_form;
70
#warning "FIXME: get rid of this scrolled window"
71
GtkWidget * pane2_scrwin;
74
#define P(i) (G_TYPE_INSTANCE_GET_PRIVATE((i), GQ_TYPE_TAB_BROWSE, struct GqTabBrowsePrivate))
76
static void tree_row_refresh(GqTab *tab);
79
gq_tab_browse_set_content(GqTabBrowse* self,
82
g_return_if_fail(GQ_IS_TAB_BROWSE(self));
83
g_return_if_fail(!content || GTK_IS_WIDGET(content));
85
if(GTK_IS_WIDGET(P(self)->pane2_scrwin) && GTK_BIN(P(self)->pane2_scrwin)->child) {
86
gtk_container_remove(GTK_CONTAINER(P(self)->pane2_scrwin),
87
GTK_BIN(P(self)->pane2_scrwin)->child);
90
if(GTK_IS_WIDGET(content)) {
91
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(P(self)->pane2_scrwin),
97
gq_tab_browse_set_input_form(GqTabBrowse* self,
98
GqInputForm* input_form)
100
g_return_if_fail(GQ_IS_TAB_BROWSE(self));
101
g_return_if_fail(!input_form || GQ_IS_INPUT_FORM(input_form));
103
if(P(self)->input_form) {
104
/* but first get current hide status */
105
#warning "FIXME: if this is a HACK, remove it"
106
/* HACK: store hide status it in the browse-tab data-structure */
107
self->hidden = gq_input_form_get_hide(P(self)->input_form);
108
g_object_unref(P(self)->input_form);
109
P(self)->input_form = NULL;
113
P(self)->input_form = g_object_ref(input_form);
114
gq_tab_browse_set_content(self, GTK_WIDGET(input_form));
117
g_object_notify(G_OBJECT(self), "input-form");
120
#ifndef USE_TREE_VIEW
121
#define gq_tree_node_parent(model, node_p) (node_p = row->parent)
122
#define gq_browser_model_get_node(model, node) (GQ_BROWSER_NODE(gq_tree_get_node_data(model, iter)))
124
#define gq_tree_node_parent(model, iter) gtk_tree_model_iter_parent(model, &parent, iter)
127
#warning "hide this one"
129
record_path(GqTab *tab,
130
#ifndef USE_TREE_VIEW
132
GQTreeWidgetNode *iter
140
GtkTreeIter parent = *iter;
278
344
g_object_set_data(G_OBJECT(ctree), "in-tree_row_selected", GINT_TO_POINTER(0));
346
GtkTreeModel * model;
349
switch(gtk_tree_selection_count_selected_rows(selection)) {
352
gq_tab_browse_set_content(GQ_TAB_BROWSE(tab), NULL);
355
selected = gtk_tree_selection_get_selected_rows(selection, &model);
356
if(gtk_tree_model_get_iter(model, &iter, selected->data)) {
357
GqBrowserNode* node = gq_browser_model_get_node(GQ_BROWSER_MODEL(model), &iter);
358
int ctx = error_new_context(_("Selecting entry"),
359
GTK_WIDGET(gtk_tree_selection_get_tree_view(selection)));
360
gq_browser_node_select(node, ctx, model, &iter, tab);
365
g_warning("Got invalid selection.");
282
static void tree_row_refresh(GtkMenuItem *menuitem, GqTab *tab)
378
tree_row_refresh(GqTab *tab)
284
380
GQTreeWidget *ctree;
285
GQTreeWidgetNode *node;
286
381
GqBrowserNode *entry;
288
383
ctree = GQ_TAB_BROWSE(tab)->ctreeroot;
289
node = GQ_TAB_BROWSE(tab)->tree_row_popped_up;
290
entry = GQ_BROWSER_NODE(gq_tree_get_node_data (ctree, node));
384
entry = gq_browser_model_get_node(gtk_tree_view_get_model(ctree),
385
&GQ_TAB_BROWSE(tab)->tree_row_popped_up);
292
387
if (!entry) return;
295
390
int ctx = error_new_context(_("Refreshing entry"),
296
391
GTK_WIDGET(ctree));
298
/* delete old struct inputform (if any) */
299
struct inputform *iform = GQ_TAB_BROWSE(tab)->inputform;
301
/* but first get current hide status */
302
/* HACK: store hide status it in the browse-tab
304
GQ_TAB_BROWSE(tab)->hidden = iform->hide_status;
306
inputform_free(iform);
307
GQ_TAB_BROWSE(tab)->inputform = NULL;
310
GQ_BROWSER_NODE_GET_CLASS(entry)->refresh(entry, ctx, ctree, node, tab);
393
/* delete old GqInputForm (if any) */
394
gq_tab_browse_set_input_form(GQ_TAB_BROWSE(tab), NULL);
396
GQ_BROWSER_NODE_GET_CLASS(entry)->refresh(entry, ctx, ctree, &GQ_TAB_BROWSE(tab)->tree_row_popped_up, tab);
311
397
error_flush(ctx);
315
401
/* server & ref */
316
void tree_row_close_connection(GtkMenuItem *menuitem, GqTab *tab)
403
tree_row_close_connection(GqTab *tab)
319
GQTreeWidgetNode *node;
322
ctree = GQ_TAB_BROWSE(tab)->ctreeroot;
323
node = GQ_TAB_BROWSE(tab)->tree_row_popped_up;
324
server = server_from_node(ctree, node);
325
close_connection(server, TRUE);
327
statusbar_msg(_("Closed connection to server %s"), server->name);
408
tview = GTK_TREE_VIEW(GQ_TAB_BROWSE(tab)->ctreeroot);
409
server = gq_browser_node_get_server(gq_browser_model_get_node(gtk_tree_view_get_model(tview),
410
&GQ_TAB_BROWSE(tab)->tree_row_popped_up));
411
close_connection(server, TRUE);
413
statusbar_msg(_("Closed connection to server %s"), gq_server_get_name(server));
486
#warning "FIXME: solve this the OO way"
397
487
if(type == GQ_TYPE_BROWSER_NODE_DN) {
488
#ifndef USE_TREE_VIEW
398
489
node = show_dn(context, ctree, node, c + 1, FALSE);
493
gtk_tree_view_get_model(GTK_TREE_VIEW(ctree)),
494
(I == path) ? NULL : &node,
400
501
else if(type == GQ_TYPE_BROWSER_NODE_REFERENCE) {
502
#ifndef USE_TREE_VIEW
401
503
gq_tree_expand_node (ctree, node);
403
505
gq_tree_widget_find_by_row_data_custom(GQ_TREE_WIDGET(ctree),
405
507
(gpointer)(c + 1),
406
508
(GCompareFunc) cmp_name);
408
511
else if(type == GQ_TYPE_BROWSER_NODE_SERVER) {
409
512
server = gq_server_list_get_by_name(gq_server_list_get(), c + 1);
410
513
if (server != NULL) {
514
#ifndef USE_TREE_VIEW
411
515
node = tree_node_from_server_dn(ctree, server,
414
519
/* FIXME - popup error? */
520
#ifndef USE_TREE_VIEW
526
#ifndef USE_TREE_VIEW
419
527
if (node == NULL) break;
530
#ifndef USE_TREE_VIEW
421
531
if (node) gq_tree_select_node(ctree, node);
533
g_warning("FIXME: port this");
424
537
if (!progress->cancelled) {
451
564
GQ_TAB_BROWSE(tab)->update_lock--;
454
GqTab *new_browsemode()
456
GQTreeWidget *ctreeroot;
457
GtkWidget *browsemode_vbox, *spacer;
458
GtkWidget *mainpane, *pane2_vbox, *pane1_scrwin, *pane2_scrwin;
459
GqTabBrowse *modeinfo;
460
GqTab *tab = g_object_new(GQ_TYPE_TAB_BROWSE, NULL);
461
tab->type = BROWSE_MODE;
463
modeinfo = GQ_TAB_BROWSE(tab);
465
browsemode_vbox = gtk_vbox_new(FALSE, 0);
467
spacer = gtk_hbox_new(FALSE, 0);
468
gtk_widget_show(spacer);
469
gtk_box_pack_start(GTK_BOX(browsemode_vbox), spacer, FALSE, FALSE, 3);
471
mainpane = gtk_hpaned_new();
472
gtk_container_border_width(GTK_CONTAINER(mainpane), 2);
473
gtk_widget_show(mainpane);
474
gtk_box_pack_start(GTK_BOX(browsemode_vbox), mainpane, TRUE, TRUE, 0);
475
GQ_TAB_BROWSE(tab)->mainpane = mainpane;
477
ctreeroot = gq_tree_widget_new ();
478
modeinfo->ctreeroot = ctreeroot;
480
gq_tree_widget_set_selection_mode(GQ_TREE_WIDGET(ctreeroot), GTK_SELECTION_BROWSE);
481
gq_tree_widget_set_column_auto_resize(GQ_TREE_WIDGET(ctreeroot), 0, TRUE);
482
if (config->sort_browse) {
483
gtk_clist_set_auto_sort(GTK_CLIST(ctreeroot), TRUE);
486
gq_tree_widget_set_select_callback(GQ_TREE_WIDGET(ctreeroot),
487
G_CALLBACK(tree_row_selected),
489
gq_tree_widget_set_expand_callback(GQ_TREE_WIDGET(ctreeroot),
490
G_CALLBACK(tree_row_expanded),
492
g_signal_connect(ctreeroot, "button_press_event",
493
G_CALLBACK(button_press_on_tree_item), tab);
496
browse_dnd_setup(GTK_WIDGET(ctreeroot), tab);
497
#endif /* BROWSER_DND */
499
add_all_servers(GQ_TREE_WIDGET(ctreeroot));
500
gtk_widget_show(GTK_WIDGET (ctreeroot));
502
pane1_scrwin = gtk_scrolled_window_new(NULL, NULL);
503
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pane1_scrwin),
504
GTK_POLICY_AUTOMATIC,
505
GTK_POLICY_AUTOMATIC);
506
gtk_widget_show(pane1_scrwin);
508
gtk_paned_set_position(GTK_PANED(mainpane), 300);
509
gtk_paned_pack1(GTK_PANED(mainpane), pane1_scrwin, FALSE, FALSE);
510
gtk_container_add(GTK_CONTAINER(pane1_scrwin), GTK_WIDGET(ctreeroot));
512
// FIXME: remove this scrolled window, we only keep it for API compatibility
513
pane2_scrwin = gtk_scrolled_window_new(NULL, NULL);
514
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pane2_scrwin),
517
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pane2_scrwin),
519
gtk_widget_show(pane2_scrwin);
520
modeinfo->pane2_scrwin = pane2_scrwin;
522
pane2_vbox = gtk_vbox_new(FALSE, 5);
523
gtk_widget_show(pane2_vbox);
524
modeinfo->pane2_vbox = pane2_vbox;
526
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pane2_scrwin), pane2_vbox);
528
gtk_paned_pack2(GTK_PANED(mainpane), pane2_scrwin, TRUE, FALSE);
530
gtk_widget_show(browsemode_vbox);
532
/* prepare for proper cleanup */
533
g_signal_connect_swapped(browsemode_vbox, "destroy",
534
G_CALLBACK(g_object_unref), tab);
536
tab->content = browsemode_vbox;
537
gtk_object_set_data(GTK_OBJECT(tab->content), "tab", tab);
541
GqServer *server_from_node(GQTreeWidget *ctreeroot,
542
GQTreeWidgetNode *node)
544
GQTreeWidgetRow *row = NULL;
545
GqBrowserNode *entry;
547
for ( ; node ; node = row->parent ) {
548
row = GQ_TREE_WIDGET_ROW(node);
549
entry = GQ_BROWSER_NODE(gq_tree_get_node_data (ctreeroot,
551
if (GQ_IS_BROWSER_NODE_SERVER(entry)) {
552
return GQ_BROWSER_NODE_SERVER(entry)->server;
554
if (GQ_IS_BROWSER_NODE_REFERENCE(entry)) {
555
return GQ_BROWSER_NODE_REFERENCE(entry)->server;
568
gq_tab_browse_new(void)
570
return g_object_new(GQ_TYPE_TAB_BROWSE, NULL);
573
#ifndef USE_TREE_VIEW
575
server_from_node(GQTreeWidget * ctreeroot,
576
GQTreeWidgetNode* node)
578
#warning "FIXME: remove this function"
579
return gq_browser_node_get_server(GQ_BROWSER_NODE(gq_tree_get_node_data(ctreeroot, node)));
583
server_from_node(GtkTreeModel* model,
586
#warning "FIXME: remove this function"
587
GqBrowserNode* node = NULL;
588
g_return_val_if_fail(GQ_IS_BROWSER_MODEL(model), NULL);
589
g_return_val_if_fail(gq_browser_model_validate(model, iter), NULL);
591
node = gq_browser_model_get_node(GQ_BROWSER_MODEL(model), iter);
592
g_return_val_if_fail(GQ_IS_BROWSER_NODE(node), NULL);
594
return gq_browser_node_get_server(node);
561
598
static int dn_row_compare_func(GqBrowserNodeDn *row_data, char *dn)
563
600
if (row_data == NULL || !GQ_IS_BROWSER_NODE_DN(row_data)) return 1;
565
return strcasecmp(dn, row_data->dn);
602
return strcasecmp(dn, gq_browser_node_dn_get_dn(row_data));
569
606
* returns this DN's GQTreeWidgetNode
608
#ifndef USE_TREE_VIEW
572
609
GQTreeWidgetNode *node_from_dn(GQTreeWidget *ctreeroot,
573
610
GQTreeWidgetNode *top,
792
877
g_string_insert(s, 0, dnparts[i]);
794
879
/* printf("try %s at %08lx\n", s->str, node); */
880
#ifndef USE_TREE_VIEW
795
881
if (node) gq_tree_expand_node(tree, node);
797
found = node_from_dn(tree, node, s->str);
883
g_warning("FIXME: port this");
886
#ifndef USE_TREE_VIEW
887
found = node_from_dn(model, iter, s->str);
889
if (gq_browser_model_validate(model, &found)) {
801
891
} else if (node) {
893
if(!node_from_dn(model, iter, found, s->str) && iter) {
802
895
/* check if the object with this dn actually exists. If
803
896
it does, we add it to the tree by hand, as we
804
897
probably cannot see it due to a size limit */
898
#ifndef USE_TREE_VIEW
806
899
GqServer *server = server_from_node(tree, node);
901
GqServer* server = server_from_node(model, iter);
809
905
if ((ld = open_connection(error_context, server)) != NULL) {
873
973
gq_exploded_free(dnparts);
874
974
g_string_free(s, TRUE);
876
if (found && select_node) {
976
#ifndef USE_TREE_VIEW
977
if (gq_browser_model_validate(gtk_tree_view_get_model(self->ctreeroot), &found) && select_node) {
877
978
gq_tree_select_node(tree, found);
878
979
gq_tree_widget_scroll_to(tree, node,
984
g_warning("FIXME: implement this passage");
986
#ifndef USE_TREE_VIEW
883
987
if (found) return found;
993
browse_tab_open_diff(GqTabBrowse* self)
996
GqTab* tab = new_modetab(&mainwin, GQ_TYPE_DIFF_TAB, TRUE);
997
GList* selected = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(self->ctreeroot), &model);
1000
for(i = 0, it = selected; it; i++, it = g_list_next(it)) {
1002
if(!gtk_tree_model_get_iter(model, &iter, it->data)) {
1003
g_warning("Got an invalid selection");
1006
gq_diff_tab_set_entry(GQ_DIFF_TAB(tab), i,
1007
gq_browser_node_dn_get_entry(gq_browser_model_get_node(GQ_BROWSER_MODEL(model),
1010
g_list_foreach(selected, gtk_tree_path_free, NULL);
1011
g_list_free(selected);
1015
browse_tab_check_dn_node(GtkTreeModel* model,
1020
gboolean* is_dn = data;
1022
if(!GQ_IS_BROWSER_NODE_DN(gq_browser_model_get_node(GQ_BROWSER_MODEL(model), iter))) {
891
1031
* the return values here are related to handling of button events only.
893
static gboolean button_press_on_tree_item(GtkWidget *tree,
894
GdkEventButton *event,
1034
button_press_on_tree_item(GtkWidget * tree,
1035
GdkEventButton* event,
897
GtkWidget *ctreeroot;
898
GtkWidget *root_menu, *menu, *menu_item, *label;
899
GQTreeWidgetNode *ctree_node;
900
GqBrowserNodeDn *entry;
902
if (event->type == GDK_BUTTON_PRESS && event->button == 3
903
&& event->window == GTK_CLIST(tree)->clist_window) {
905
ctree_node = gq_tree_get_node_at (GQ_TREE_WIDGET(tree), event->x, event->y);
907
if (ctree_node == NULL)
910
ctreeroot = GTK_WIDGET(GQ_TAB_BROWSE(tab)->ctreeroot);
912
entry = GQ_BROWSER_NODE_DN(gq_tree_get_node_data (GQ_TREE_WIDGET(ctreeroot), GQ_TREE_WIDGET_NODE(ctree_node)));
914
if (entry == NULL) return TRUE;
915
if (GQ_BROWSER_NODE_GET_CLASS(entry)->popup) {
916
/* The get_name method already does UTF-8 decoding */
917
name = GQ_BROWSER_NODE_GET_CLASS(entry)->get_name(GQ_BROWSER_NODE(entry), FALSE);
919
GQ_TAB_BROWSE(tab)->tree_row_popped_up = ctree_node;
921
/* hack, hack. Need to pass both the ctree_node and tab... */
922
GQ_TAB_BROWSE(tab)->selected_ctree_node = ctree_node;
924
root_menu = gtk_menu_item_new_with_label("Root");
925
gtk_widget_show(root_menu);
926
menu = gtk_menu_new();
928
gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu);
930
label = gtk_menu_item_new_with_label(name);
931
gtk_widget_set_sensitive(label, FALSE);
932
gtk_widget_show(label);
934
gtk_menu_append(GTK_MENU(menu), label);
935
gtk_menu_set_title(GTK_MENU(menu), name);
937
menu_item = gtk_separator_menu_item_new();
939
gtk_menu_append(GTK_MENU(menu), menu_item);
940
gtk_widget_set_sensitive(menu_item, FALSE);
941
gtk_widget_show(menu_item);
943
if (name) g_free(name);
945
/* The common Refresh item */
946
menu_item = gtk_menu_item_new_with_label(_("Refresh"));
947
gtk_menu_append(GTK_MENU(menu), menu_item);
948
gtk_widget_show(menu_item);
950
g_signal_connect(menu_item, "activate",
951
G_CALLBACK(tree_row_refresh),
954
GQ_BROWSER_NODE_GET_CLASS(entry)->popup(GQ_BROWSER_NODE(entry), menu,
955
GQ_TREE_WIDGET (ctreeroot), ctree_node, tab);
957
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
958
event->button, event->time);
960
g_signal_stop_emission_by_name(ctreeroot,
961
"button_press_event");
1038
if(event->type == GDK_BUTTON_PRESS && event->button == 3)
1040
GqBrowserNodeDn* entry;
1041
GtkTreeModel* model;
1047
if(event->window != gtk_tree_view_get_bin_window(GTK_TREE_VIEW(tree)))
1052
if(!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree), event->x, event->y,
1053
&path, NULL, NULL, NULL))
1058
model = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));
1060
if(!gtk_tree_model_get_iter(model, &GQ_TAB_BROWSE(tab)->tree_row_popped_up, path))
1062
gtk_tree_path_free(path);
1066
entry = gq_browser_model_get_node(GQ_BROWSER_MODEL(model), &GQ_TAB_BROWSE(tab)->tree_row_popped_up);
1068
name = gq_browser_node_get_name(GQ_BROWSER_NODE(entry), FALSE);
1069
menu = gtk_menu_new();
1071
item = gtk_menu_item_new_with_label(name);
1072
gtk_widget_set_sensitive(item, FALSE);
1073
gtk_widget_show(item);
1074
gtk_menu_append(GTK_MENU(menu), item);
1075
gtk_menu_set_title(GTK_MENU(menu), name);
1077
item = gtk_separator_menu_item_new();
1078
gtk_widget_show(item);
1079
gtk_menu_append(GTK_MENU(menu), item);
1081
gq_browser_node_popup(entry, menu,
1082
GTK_TREE_VIEW(tree), &GQ_TAB_BROWSE(tab)->tree_row_popped_up, tab);
1084
item = gtk_separator_menu_item_new();
1085
gtk_widget_show(item);
1086
gtk_menu_append(GTK_MENU(menu), item);
1088
item = gtk_menu_item_new_with_label(_("Compare Items"));
1089
g_signal_connect_swapped(item, "activate",
1090
G_CALLBACK(browse_tab_open_diff), tab);
1091
gtk_widget_show(item);
1092
gtk_menu_append(GTK_MENU(menu), item);
1094
if(gtk_tree_selection_count_selected_rows(gtk_tree_view_get_selection(tree)) == 2) {
1095
gboolean is_dn = TRUE;
1096
gtk_tree_selection_selected_foreach(gtk_tree_view_get_selection(tree),
1097
browse_tab_check_dn_node,
1100
gtk_widget_set_sensitive(item, is_dn);
1104
gtk_widget_set_sensitive(item, FALSE);
1107
/* The common Refresh item */
1108
item = gtk_image_menu_item_new_from_stock(GTK_STOCK_REFRESH, NULL);
1109
gtk_widget_show(item);
1110
gtk_menu_append(GTK_MENU(menu), item);
1112
g_signal_connect_swapped(item, "activate",
1113
G_CALLBACK(tree_row_refresh), tab);
1115
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
1116
event->button, event->time);
1117
gtk_tree_path_free(path);
1035
1195
g_list_foreach(csl.list, (GFunc)g_object_unref, NULL);
1036
1196
g_list_free(csl.list);
1041
1202
G_DEFINE_TYPE(GqTabBrowse, gq_tab_browse, GQ_TYPE_TAB);
1044
gq_tab_browse_init(GqTabBrowse* self) {}
1210
gq_tab_browse_init(GqTabBrowse* self)
1212
#define modeinfo self
1213
GtkTreeViewColumn* column;
1214
GtkTreeSelection * selection;
1215
GtkCellRenderer * renderer;
1216
GtkTreeModel * model;
1217
GtkWidget *mainpane, *pane1_scrwin;
1218
GtkWidget *browsemode_vbox, *spacer;
1219
GqTab * tab = GQ_TAB(self);
1221
browsemode_vbox = gtk_vbox_new(FALSE, 0);
1223
spacer = gtk_hbox_new(FALSE, 0);
1224
gtk_widget_show(spacer);
1225
gtk_box_pack_start(GTK_BOX(browsemode_vbox), spacer, FALSE, FALSE, 3);
1227
mainpane = gtk_hpaned_new();
1228
gtk_container_border_width(GTK_CONTAINER(mainpane), 2);
1229
gtk_widget_show(mainpane);
1230
gtk_box_pack_start(GTK_BOX(browsemode_vbox), mainpane, TRUE, TRUE, 0);
1231
GQ_TAB_BROWSE(tab)->mainpane = mainpane;
1232
#ifndef USE_TREE_VIEW
1233
ctreeroot = gq_tree_widget_new ();
1234
modeinfo->ctreeroot = ctreeroot;
1236
gq_tree_widget_set_selection_mode(GQ_TREE_WIDGET(ctreeroot), GTK_SELECTION_BROWSE);
1237
gq_tree_widget_set_column_auto_resize(GQ_TREE_WIDGET(ctreeroot), 0, TRUE);
1238
if (config->sort_browse) {
1239
gtk_clist_set_auto_sort(GTK_CLIST(ctreeroot), TRUE);
1242
gq_tree_widget_set_select_callback(GQ_TREE_WIDGET(ctreeroot),
1243
G_CALLBACK(tree_row_selected),
1245
gq_tree_widget_set_expand_callback(GQ_TREE_WIDGET(ctreeroot),
1246
G_CALLBACK(tree_row_expanded),
1248
g_signal_connect(ctreeroot, "button_press_event",
1249
G_CALLBACK(button_press_on_tree_item), tab);
1252
browse_dnd_setup(GTK_WIDGET(ctreeroot), tab);
1253
#endif /* BROWSER_DND */
1255
add_all_servers(GQ_TREE_WIDGET(ctreeroot));
1257
/* set up the tree view */
1258
modeinfo->ctreeroot = GTK_TREE_VIEW(gq_tree_view_new());
1259
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(modeinfo->ctreeroot), FALSE);
1261
column = gtk_tree_view_column_new();
1262
renderer = gtk_cell_renderer_pixbuf_new();
1263
gtk_tree_view_column_pack_start(column, renderer, FALSE);
1264
gtk_tree_view_column_add_attribute(column, renderer,
1265
"icon-name", GQ_BROWSER_MODEL_COL_TYPE);
1266
renderer = gtk_cell_renderer_text_new();
1267
gtk_tree_view_column_pack_start(column, renderer, TRUE);
1268
gtk_tree_view_column_add_attribute(column, renderer,
1269
"text", GQ_BROWSER_MODEL_COL_NAME);
1270
gtk_tree_view_append_column(GTK_TREE_VIEW(modeinfo->ctreeroot), column);
1271
g_signal_connect(modeinfo->ctreeroot, "button-press-event",
1272
G_CALLBACK(button_press_on_tree_item), tab);
1274
/* set up the selection */
1275
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(modeinfo->ctreeroot));
1276
gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
1277
g_signal_connect(selection, "changed",
1278
G_CALLBACK(browser_tree_selection_changed), tab);
1280
/* set up the model */
1281
#warning "FIXME: add a sort model"
1282
model = gq_browser_model_new();
1283
gtk_tree_view_set_model(GTK_TREE_VIEW(modeinfo->ctreeroot), model);
1284
g_object_unref(model);
1286
gtk_widget_show(GTK_WIDGET(modeinfo->ctreeroot));
1288
pane1_scrwin = gtk_scrolled_window_new(NULL, NULL);
1289
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pane1_scrwin),
1290
GTK_POLICY_AUTOMATIC,
1292
#ifdef USE_TREE_VIEW
1293
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(pane1_scrwin),
1296
gtk_widget_show(pane1_scrwin);
1298
#warning "FIXME: calculate a good default from the window size; load and save to config"
1299
gtk_paned_set_position(GTK_PANED(mainpane), 300);
1300
gtk_paned_pack1(GTK_PANED(mainpane), pane1_scrwin, FALSE, FALSE);
1301
gtk_container_add(GTK_CONTAINER(pane1_scrwin), GTK_WIDGET(modeinfo->ctreeroot));
1303
// FIXME: remove this scrolled window, we only keep it for API compatibility
1304
P(self)->pane2_scrwin = gtk_scrolled_window_new(NULL, NULL);
1305
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(P(self)->pane2_scrwin),
1308
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(P(self)->pane2_scrwin),
1311
gtk_widget_show(P(self)->pane2_scrwin);
1313
gtk_paned_pack2(GTK_PANED(mainpane), P(self)->pane2_scrwin, TRUE, FALSE);
1315
gtk_widget_show(browsemode_vbox);
1317
/* prepare for proper cleanup */
1318
g_signal_connect_swapped(browsemode_vbox, "destroy",
1319
G_CALLBACK(g_object_unref), tab);
1321
tab->content = browsemode_vbox;
1322
gtk_object_set_data(GTK_OBJECT(tab->content), "tab", tab);
1047
1327
tab_dispose(GObject* object)
1049
1329
GqTabBrowse* self = GQ_TAB_BROWSE(object);
1051
if(self->inputform) {
1052
inputform_free(self->inputform);
1331
gq_tab_browse_set_input_form(self, NULL);
1056
1333
G_OBJECT_CLASS(gq_tab_browse_parent_class)->dispose(object);
1350
tab_get_property(GObject * object,
1356
case PROP_INPUT_FORM:
1357
g_value_set_object(value, P(object)->input_form);
1360
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
1366
tab_set_property(GObject * object,
1368
GValue const* value,
1372
case PROP_INPUT_FORM:
1373
gq_tab_browse_set_input_form(GQ_TAB_BROWSE(object), g_value_get_object(value));
1376
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
1073
1382
gq_tab_browse_class_init(GqTabBrowseClass* self_class)
1075
1384
GObjectClass* object_class = G_OBJECT_CLASS(self_class);
1076
1385
GqTabClass* tab_class = GQ_TAB_CLASS(self_class);
1078
object_class->dispose = tab_dispose;
1079
object_class->finalize = tab_finalize;
1388
object_class->dispose = tab_dispose;
1389
object_class->finalize = tab_finalize;
1390
object_class->get_property = tab_get_property;
1391
object_class->set_property = tab_set_property;
1393
g_object_class_install_property(object_class,
1395
g_param_spec_object("input-form",
1397
_("The input form to be used for display"),
1399
G_PARAM_READWRITE));
1081
1401
tab_class->save_snapshot = browse_save_snapshot;
1082
1402
tab_class->restore_snapshot = browse_restore_snapshot;
1404
/* GqTabBrowseClass */
1405
g_type_class_add_private(self_class, sizeof(struct GqTabBrowsePrivate));