73
124
static void findbutton_clicked_callback(GqTab *tab);
75
static gboolean search_button_press_on_tree_item(GtkWidget *clist,
76
GdkEventButton *event,
79
126
static void servername_changed_callback(GqTab *tab);
80
static int select_entry_callback(GtkWidget *clist, gint row, gint column,
81
GdkEventButton *event, GqTab *tab);
82
static void search_edit_entry_callback(GqTab *tab);
127
static void search_edit_entry_callback(GqTabSearch *tab);
83
128
static void search_new_from_entry_callback(GtkWidget *w, GqTab *tab);
84
129
static void delete_search_entry(GqTab *tab);
86
static void search_save_snapshot(int error_context,
87
char *state_name, GqTab *tab)
92
hist = GQ_TAB_SEARCH(tab)->history;
94
state_value_set_list(state_name, "history", hist);
97
state_value_set_list(state_name, "attributes", GQ_TAB_SEARCH(tab)->attrs);
98
state_value_set_int(state_name, "chase", GQ_TAB_SEARCH(tab)->chase_ref);
99
state_value_set_int(state_name, "max-depth", GQ_TAB_SEARCH(tab)->max_depth);
100
state_value_set_int(state_name, "scope", GQ_TAB_SEARCH(tab)->scope);
102
state_value_set_int(state_name, "last-options-tab",
103
GQ_TAB_SEARCH(tab)->last_options_tab);
105
tmp = gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(GQ_TAB_SEARCH(tab)->serverlist_combo)->entry), 0, -1);
106
state_value_set_string(state_name, "lastserver", tmp);
111
search_restore_selection(GQServerList* list, GqServer* server, gpointer user_data) {
112
gpointer**i_tab_and_servername = user_data;
113
gint *i = (gint*)i_tab_and_servername[0];
114
GqTab* tab = GQ_TAB(i_tab_and_servername[1]);
115
gchar const* servername = (gchar const*)i_tab_and_servername[2];
117
if(!strcasecmp(server->name, servername)) {
118
gtk_list_select_item(GTK_LIST(GTK_COMBO(GQ_TAB_SEARCH(tab)->serverlist_combo)->list), *i);
124
static void search_restore_snapshot(int error_context,
125
char *state_name, GqTab *tab,
126
struct pbar_win *progress)
130
const char *lastserver;
132
lastserver = state_value_get_string(state_name, "lastserver", NULL);
133
if(lastserver && lastserver[0]) {
135
gpointer i_tab_and_servername[3] = {
140
gq_server_list_foreach(gq_server_list_get(), search_restore_selection, i_tab_and_servername);
132
gq_tab_search_get_base_dn(GqTabSearch const* self)
134
g_return_val_if_fail(GQ_IS_TAB_SEARCH(self), NULL);
136
return gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(P(self)->searchbase_combo)->entry));
140
gq_tab_search_set_base_dn(GqTabSearch* self,
141
gchar const* base_dn)
143
g_return_if_fail(GQ_IS_TAB_SEARCH(self));
144
g_return_if_fail(!base_dn || *base_dn);
146
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(P(self)->searchbase_combo)->entry),
149
#warning "FIXME: enable"
150
//g_object_notify(G_OBJECT(self), "base-dn");
154
gq_tab_search_get_mode(GqTabSearch const* self)
159
gtk_combo_box_get_active_iter(GTK_COMBO_BOX(P(self)->searchmode_combo), &iter);
160
gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(P(self)->searchmode_combo)), &iter,
161
MODE_COL_MODE, &mode,
168
tab_search_set_mode(GqTabSearch* self,
176
combo = GTK_COMBO_BOX(P(self)->searchmode_combo);
177
model = gtk_combo_box_get_model(combo);
178
gtk_tree_model_iter_nth_child(model, &iter, NULL, mode);
179
gtk_tree_model_get(model, &iter,
180
MODE_COL_MODE, &mode2,
183
g_return_if_fail(mode == mode2);
185
gtk_combo_box_set_active_iter(combo, &iter);
189
gq_tab_search_get_server(GqTabSearch const* self)
193
g_return_val_if_fail(GQ_IS_TAB_SEARCH(self), NULL);
194
g_return_val_if_fail(GTK_IS_COMBO_BOX(P(self)->serverlist_combo), NULL);
195
g_return_val_if_fail(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(P(self)->serverlist_combo), &iter), NULL);
197
return gq_server_model_get_server(GQ_SERVER_MODEL(gtk_combo_box_get_model(GTK_COMBO_BOX(P(self)->serverlist_combo))), &iter);
201
gq_tab_search_set_server(GqTabSearch* self,
204
g_return_if_fail(GQ_IS_TAB_SEARCH(self));
205
g_return_if_fail(!server || GQ_IS_SERVER(server));
207
#warning "FIXME: this connection could be better (so that the entry gets updated when the server gets renamed etc.)"
208
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(P(self)->serverlist_combo)->entry),
209
gq_server_get_name(server));
211
#warning "FIXME: enable"
212
//g_object_notify(G_OBJECT(self), "server");
216
search_save_snapshot(int error_context G_GNUC_UNUSED,
224
hist = P(tab)->history;
226
state_value_set_list(state_name, "history", hist);
229
state_value_set_list(state_name, "attributes", P(tab)->attrs);
230
state_value_set_int(state_name, "chase", P(tab)->chase_ref);
231
state_value_set_int(state_name, "max-depth", P(tab)->max_depth);
232
state_value_set_int(state_name, "scope", P(tab)->scope);
233
state_value_set_enum(state_name, "search-mode",
234
gq_tab_search_get_mode(GQ_TAB_SEARCH(tab)),
235
GQ_TYPE_SEARCH_MODE);
237
state_value_set_int(state_name, "last-options-tab", P(tab)->last_options_tab);
239
gtk_combo_box_get_active_iter(GTK_COMBO_BOX(P(tab)->serverlist_combo), &iter);
240
server = gq_server_model_get_server(GQ_SERVER_MODEL(gtk_combo_box_get_model(GTK_COMBO_BOX(P(tab)->serverlist_combo))),
242
state_value_set_string(state_name, "lastserver", gq_server_get_name(server));
245
static void search_restore_snapshot(int error_context G_GNUC_UNUSED,
248
struct pbar_win *progress G_GNUC_UNUSED)
252
gchar const* lastserver;
254
lastserver = state_value_get_string(state_name, "lastserver", NULL);
255
if(lastserver && lastserver[0]) {
256
GqServer* server = gq_server_list_get_by_name(gq_server_list_get(), lastserver);
260
model = gtk_combo_box_get_model(GTK_COMBO_BOX(P(tab)->serverlist_combo));
261
if(gq_server_model_get_iter(GQ_SERVER_MODEL(model), &iter, server)) {
262
gtk_combo_box_set_active_iter(GTK_COMBO_BOX(P(tab)->serverlist_combo), &iter);
267
mode = state_value_get_enum(state_name, "search-mode",
268
GQ_SEARCH_MODE_BEGINS_WITH,
269
GQ_TYPE_SEARCH_MODE);
270
tab_search_set_mode(GQ_TAB_SEARCH(tab), mode);
143
272
if (config->restore_search_history) {
144
273
const GList *hist = state_value_get_list(state_name, "history");
148
searchhist = GQ_TAB_SEARCH(tab)->history;
277
searchhist = P(tab)->history;
149
278
for (I = hist ; I ; I = g_list_next(I)) {
150
279
searchhist = g_list_append(searchhist, g_strdup(I->data));
152
281
searchhist = g_list_insert(searchhist, "", 0);
153
gtk_combo_set_popdown_strings(GTK_COMBO(GQ_TAB_SEARCH(tab)->search_combo), searchhist);
282
gtk_combo_set_popdown_strings(GTK_COMBO(P(tab)->search_combo), searchhist);
154
283
searchhist = g_list_remove(searchhist, searchhist->data);
155
GQ_TAB_SEARCH(tab)->history = searchhist;
284
P(tab)->history = searchhist;
158
287
/* independently configurable? */
160
GQ_TAB_SEARCH(tab)->chase_ref =
161
state_value_get_int(state_name, "chase", 1);
162
GQ_TAB_SEARCH(tab)->max_depth =
163
state_value_get_int(state_name, "max-depth", 7);
164
GQ_TAB_SEARCH(tab)->scope =
165
state_value_get_int(state_name, "scope", LDAP_SCOPE_SUBTREE);
167
GQ_TAB_SEARCH(tab)->attrs = free_list_of_strings(GQ_TAB_SEARCH(tab)->attrs);
168
GQ_TAB_SEARCH(tab)->attrs =
288
P(tab)->chase_ref = state_value_get_int(state_name, "chase", 1);
289
P(tab)->max_depth = state_value_get_int(state_name, "max-depth", 7);
290
P(tab)->scope = state_value_get_int(state_name, "scope", LDAP_SCOPE_SUBTREE);
292
P(tab)->attrs = free_list_of_strings(P(tab)->attrs);
169
294
copy_list_of_strings(state_value_get_list(state_name,
172
GQ_TAB_SEARCH(tab)->last_options_tab =
173
state_value_get_int(state_name, "last-options-tab", 0);
297
P(tab)->last_options_tab = state_value_get_int(state_name, "last-options-tab", 0);
177
301
static GtkWidget *current_search_options_window = NULL;
179
static void search_options_destroyed(GtkWidget *w)
304
search_options_destroyed(void)
181
current_search_options_window = NULL;
306
current_search_options_window = NULL;
184
309
struct so_windata {
718
837
create_search_options_window(tab);
722
GqTab *new_searchmode()
724
GtkWidget *main_clist, *searchmode_vbox, *hbox1, *scrwin;
725
GtkWidget *searchcombo, *servcombo, *searchbase_combo;
726
GtkWidget *findbutton, *optbutton;
728
GqTabSearch *modeinfo;
729
GqTab *tab = g_object_new(GQ_TYPE_TAB_SEARCH, NULL);
730
const GList *last_attr;
732
tab->type = SEARCH_MODE;
734
modeinfo = GQ_TAB_SEARCH(tab);
736
modeinfo->scope = state_value_get_int(lastoptions, "scope",
738
modeinfo->chase_ref = state_value_get_int(lastoptions, "chase", 1);
739
modeinfo->max_depth = state_value_get_int(lastoptions, "max-depth", 7);
740
modeinfo->last_options_tab =
741
state_value_get_int(lastoptions, "last-options-tab", 0);
743
/* copy attribute list */
744
last_attr = state_value_get_list(lastoptions, "attributes");
746
modeinfo->attrs = free_list_of_strings(modeinfo->attrs);
747
modeinfo->attrs = copy_list_of_strings(last_attr);
751
searchmode_vbox = gtk_vbox_new(FALSE, 0);
752
hbox1 = gtk_hbox_new(FALSE, 0);
753
gtk_widget_show(hbox1);
754
gtk_box_pack_start(GTK_BOX(searchmode_vbox), hbox1, FALSE, FALSE, 3);
756
/* Initially the list is empty. It might be changed to the data
757
read from the persistant storage later on*/
758
searchhist = modeinfo->history;
760
/* searchterm combo box */
761
GQ_TAB_SEARCH(tab)->search_combo = searchcombo = gtk_combo_new();
762
gtk_combo_disable_activate(GTK_COMBO(searchcombo));
764
gtk_combo_set_popdown_strings(GTK_COMBO(searchcombo), searchhist);
765
gtk_widget_show(searchcombo);
766
GTK_WIDGET_SET_FLAGS(GTK_COMBO(searchcombo)->entry, GTK_CAN_FOCUS);
767
GTK_WIDGET_SET_FLAGS(GTK_COMBO(searchcombo)->entry, GTK_RECEIVES_DEFAULT);
768
gtk_box_pack_start(GTK_BOX(hbox1), searchcombo,
769
TRUE, TRUE, SEARCHBOX_PADDING);
770
g_signal_connect_swapped(GTK_COMBO(searchcombo)->entry, "activate",
771
G_CALLBACK(findbutton_clicked_callback),
773
tab->focus = GTK_COMBO(searchcombo)->entry;
775
/* LDAP server combo box */
776
servcombo = gtk_combo_new();
777
fill_serverlist_combo(servcombo);
778
gtk_box_pack_start(GTK_BOX(hbox1), servcombo,
779
FALSE, TRUE, SEARCHBOX_PADDING);
780
gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(servcombo)->entry), FALSE);
781
g_signal_connect_swapped(GTK_COMBO(servcombo)->entry, "changed",
782
G_CALLBACK(servername_changed_callback),
784
#ifdef OLD_FOCUS_HANDLING
785
GTK_WIDGET_UNSET_FLAGS(GTK_ENTRY(GTK_COMBO(servcombo)->entry), GTK_CAN_FOCUS);
786
GTK_WIDGET_UNSET_FLAGS(GTK_BUTTON(GTK_COMBO(servcombo)->button), GTK_CAN_FOCUS);
788
gtk_widget_show(servcombo);
789
modeinfo->serverlist_combo = servcombo;
791
/* search base combo box */
792
searchbase_combo = gtk_combo_new();
794
if(gq_server_list_n_servers(gq_server_list_get())) {
795
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(searchbase_combo)->entry),
796
gq_server_list_get_server(gq_server_list_get(), 0)->basedn);
799
gtk_box_pack_start(GTK_BOX(hbox1), searchbase_combo,
800
FALSE, TRUE, SEARCHBOX_PADDING);
801
g_signal_connect(GTK_COMBO(searchbase_combo)->button, "button_press_event",
802
G_CALLBACK(searchbase_button_clicked), tab);
803
#ifdef OLD_FOCUS_HANDLING
804
GTK_WIDGET_UNSET_FLAGS(GTK_ENTRY(GTK_COMBO(searchbase_combo)->entry), GTK_CAN_FOCUS);
805
GTK_WIDGET_UNSET_FLAGS(GTK_BUTTON(GTK_COMBO(searchbase_combo)->button), GTK_CAN_FOCUS);
807
gtk_widget_show(searchbase_combo);
808
modeinfo->searchbase_combo = searchbase_combo;
811
findbutton = gq_button_new_with_label(_("_Find"));
812
#ifdef OLD_FOCUS_HANDLING
813
GTK_WIDGET_UNSET_FLAGS(findbutton, GTK_CAN_FOCUS);
815
gtk_widget_show(findbutton);
816
gtk_box_pack_start(GTK_BOX(hbox1), findbutton,
817
FALSE, TRUE, SEARCHBOX_PADDING);
818
gtk_container_border_width(GTK_CONTAINER (findbutton), 0);
819
g_signal_connect_swapped(findbutton, "clicked",
820
G_CALLBACK(findbutton_clicked_callback),
824
optbutton = gq_button_new_with_label(_("_Options"));
825
#ifdef OLD_FOCUS_HANDLING
826
GTK_WIDGET_UNSET_FLAGS(optbutton, GTK_CAN_FOCUS);
828
gtk_widget_show(optbutton);
829
gtk_box_pack_start(GTK_BOX(hbox1), optbutton,
830
FALSE, TRUE, SEARCHBOX_PADDING);
831
gtk_container_border_width(GTK_CONTAINER (optbutton), 0);
832
g_signal_connect_swapped(optbutton, "clicked",
833
G_CALLBACK(optbutton_clicked_callback),
837
/* dummy clist, gets replaced on first search */
838
scrwin = gtk_scrolled_window_new(NULL, NULL);
839
gtk_widget_show(scrwin);
840
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrwin),
841
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
842
main_clist = gtk_clist_new(1);
843
gtk_clist_set_selection_mode(GTK_CLIST(main_clist),
844
GTK_SELECTION_EXTENDED);
845
gtk_clist_set_column_title(GTK_CLIST(main_clist), 0, "");
846
gtk_clist_column_titles_show(GTK_CLIST(main_clist));
847
gtk_widget_show(main_clist);
848
gtk_clist_column_titles_passive(GTK_CLIST(main_clist));
849
modeinfo->main_clist = main_clist;
851
gtk_container_add(GTK_CONTAINER(scrwin), main_clist);
852
gtk_box_pack_start(GTK_BOX(searchmode_vbox), scrwin, TRUE, TRUE, 0);
854
gtk_widget_show(searchmode_vbox);
856
g_signal_connect_swapped(searchmode_vbox, "destroy",
857
G_CALLBACK(g_object_unref), tab);
859
tab->content = searchmode_vbox;
860
gtk_object_set_data(GTK_OBJECT(tab->content), "tab", tab);
865
static void servername_changed_callback(GqTab *tab)
841
set_selected(GtkTreeModel* model,
842
GtkTreePath * path G_GNUC_UNUSED,
846
GqServerDn* sdn = NULL;
847
gtk_tree_model_get(model, iter,
850
g_object_set_data_full(search_tab,
857
results_selection_changed(GtkTreeSelection* selection,
860
GqServerDn* entry = NULL;
862
switch(gtk_tree_selection_count_selected_rows(selection)) {
864
gtk_tree_selection_selected_foreach(selection, set_selected, self);
865
entry = g_object_get_data(G_OBJECT(self), "selected-entry");
870
gq_input_form_set_entry(GQ_INPUT_FORM(P(self)->results_display), entry);
871
g_object_set_data(G_OBJECT(self), "selected-entry", NULL);
875
results_button_pressed(GtkWidget * treeview,
876
GdkEventButton* event,
879
if(event->button == 1 && event->type == GDK_2BUTTON_PRESS) {
880
search_edit_entry_callback(self);
884
else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) {
885
GtkTreeView* view = GTK_TREE_VIEW(treeview);
886
GtkTreePath* path = NULL;
887
GqServerDn * set = NULL;
889
if(gtk_tree_view_get_path_at_pos(view, event->x, event->y,
890
&path, NULL, NULL, NULL))
892
GtkTreeModel* model = gtk_tree_view_get_model(view);
894
gtk_tree_model_get_iter(model, &iter, path);
895
gtk_tree_model_get(model, &iter,
898
gtk_tree_path_free(path);
901
results_popup_menu(self, event, set);
911
gq_tab_search_new(void)
913
return g_object_new(GQ_TYPE_TAB_SEARCH, NULL);
918
servername_changed_callback(GqTab *tab)
867
920
GList *searchbase_list;
868
GtkWidget *servcombo, *searchbase_combo;
869
GqServer *cur_server;
870
char *cur_servername;
872
servcombo = GQ_TAB_SEARCH(tab)->serverlist_combo;
873
cur_servername = gtk_editable_get_chars(GTK_EDITABLE(GTK_COMBO(servcombo)->entry), 0, -1);
874
cur_server = gq_server_list_get_by_name(gq_server_list_get(), cur_servername);
875
g_free(cur_servername);
877
/* make sure searchbase gets refreshed next time the searchbase combo button is
878
pressed. Just insert the server's default base DN for now */
879
GQ_TAB_SEARCH(tab)->populated_searchbase = 0;
880
searchbase_combo = GQ_TAB_SEARCH(tab)->searchbase_combo;
882
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(searchbase_combo)->entry), cur_server->basedn);
883
searchbase_list = g_list_append(NULL, cur_server->basedn);
884
gtk_combo_set_popdown_strings(GTK_COMBO(searchbase_combo), searchbase_list);
885
g_list_free(searchbase_list);
924
if(!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(P(tab)->serverlist_combo), &iter)) {
928
server = gq_server_model_get_server(GQ_SERVER_MODEL(gtk_combo_box_get_model(GTK_COMBO_BOX(P(tab)->serverlist_combo))),
931
/* make sure searchbase gets refreshed next time the searchbase combo button is
932
pressed. Just insert the server's default base DN for now */
933
P(tab)->populated_searchbase = 0;
935
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(P(tab)->searchbase_combo)->entry), server->basedn);
936
searchbase_list = g_list_append(NULL, server->basedn);
937
gtk_combo_set_popdown_strings(GTK_COMBO(P(tab)->searchbase_combo), searchbase_list);
938
g_list_free(searchbase_list);
891
static gint searchbase_button_clicked(GtkWidget *widget,
943
static gint searchbase_button_clicked(GtkWidget *widget,
892
944
GdkEventButton *event, GqTab *tab)
894
946
GList *searchbase_list;
895
947
GList *suffixes_list, *temp;
896
GtkWidget *servcombo, *searchbase_combo;
897
948
GqServer *server;
898
949
int found_default_searchbase;
899
950
char *cur_servername;
1823
1802
gtk_widget_show(menu_item);
1827
1804
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
1828
1805
event->button, event->time);
1833
void find_in_browser(GqTab *tab)
1835
GQTreeWidget *ctree;
1836
struct dn_on_server *set;
1839
set = GQ_TAB_SEARCH(tab)->set;
1840
GQ_TAB_SEARCH(tab)->set = NULL;
1841
if(set == NULL || set->dn == NULL || strlen(set->dn) == 0)
1844
/* find last used browser... */
1846
browsetab = get_last_of_mode(BROWSE_MODE);
1849
ctree = GQ_TAB_BROWSE(browsetab)->ctreeroot;
1850
ctx = error_new_context(_("Finding entry in browser"),
1852
show_server_dn(ctx, ctree, set->server, set->dn, TRUE);
1853
go_to_page(browsetab);
1856
single_warning_popup(_("No browser available"));
1861
void add_all_to_browser(GqTab *tab)
1863
GQTreeWidget *ctree;
1864
struct dn_on_server *cur_resultset;
1867
GtkWidget *clist = GQ_TAB_SEARCH(tab)->main_clist;
1869
/* find last used browser... */
1871
browsetab = get_last_of_mode(BROWSE_MODE);
1874
ctree = GQ_TAB_BROWSE(browsetab)->ctreeroot;
1875
ctx = error_new_context(_("Adding all to browser"),
1878
gtk_clist_freeze(GTK_CLIST(ctree));
1880
(cur_resultset = gtk_clist_get_row_data(GTK_CLIST(clist), i)) != NULL ;
1882
show_server_dn(ctx, ctree,
1883
cur_resultset->server, cur_resultset->dn, FALSE);
1885
gtk_clist_thaw(GTK_CLIST(ctree));
1886
go_to_page(browsetab);
1890
single_warning_popup(_("No browser available"));
1894
static void add_selected_to_browser(GqTab *tab)
1896
GQTreeWidget *ctree;
1897
struct dn_on_server *cur_resultset;
1899
GtkWidget *clist = GQ_TAB_SEARCH(tab)->main_clist;
1902
/* find last used browser... */
1904
browsetab = get_last_of_mode(BROWSE_MODE);
1907
ctree = GQ_TAB_BROWSE(browsetab)->ctreeroot;
1908
ctx = error_new_context(_("Adding selected entries to browser"), GTK_WIDGET(ctree));
1910
gtk_clist_freeze(GTK_CLIST(ctree));
1912
sel = GTK_CLIST(clist)->selection;
1914
for (I = sel ; I ; I = g_list_next(I)) {
1915
cur_resultset = gtk_clist_get_row_data(GTK_CLIST(clist), GPOINTER_TO_INT(I->data));
1918
cur_resultset->server, cur_resultset->dn, FALSE);
1920
gtk_clist_thaw(GTK_CLIST(ctree));
1921
go_to_page(browsetab);
1925
single_warning_popup(_("No browser available"));
1931
static void export_search_selected_entry(GqTab *tab)
1933
struct dn_on_server *cur_resultset;
1935
GtkWidget *clist = GQ_TAB_SEARCH(tab)->main_clist;
1938
/* find last used browser... */
1940
browsetab = get_last_of_mode(BROWSE_MODE);
1942
GList *to_export = NULL;
1943
struct dn_on_server *dos;
1946
sel = GTK_CLIST(clist)->selection;
1948
for (I = sel ; I ; I = g_list_next(I)) {
1949
cur_resultset = gtk_clist_get_row_data(GTK_CLIST(clist), GPOINTER_TO_INT(I->data));
1951
dos = new_dn_on_server(cur_resultset->dn,
1952
cur_resultset->server);
1953
to_export = g_list_append(to_export, dos);
1955
error_context = error_new_context(_("Exporting selected entries to LDIF"),
1810
find_in_browser_foreach(GtkTreeModel* model,
1811
GtkTreePath * path G_GNUC_UNUSED,
1813
gpointer data G_GNUC_UNUSED)
1818
gtk_tree_model_get(model, iter,
1822
/* find last used browser... */
1823
browsetab = gq_window_get_last_tab(&mainwin, GQ_TYPE_TAB_BROWSE);
1827
ctree = GQ_TAB_BROWSE(browsetab)->ctreeroot;
1828
ctx = error_new_context(_("Finding entry in browser"),
1830
show_server_dn(ctx, model, gq_server_dn_get_server(sdn),
1831
gq_server_dn_get_dn(sdn), TRUE);
1832
go_to_page(browsetab);
1835
#warning "FIXME: just open a browser"
1836
single_warning_popup(_("No browser available"));
1841
find_in_browser(GqTab *tab)
1843
#warning "FIXME: store the already used browsers and open new ones if necessary"
1844
GtkTreeSelection* sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(P(tab)->results_treeview));
1845
gtk_tree_selection_selected_foreach(sel, find_in_browser_foreach, tab);
1849
struct ServerDnShowData {
1851
GtkWidget* treeview;
1855
server_dn_show_b(GtkTreeModel* model,
1856
GtkTreePath * path G_GNUC_UNUSED,
1860
struct ServerDnShowData* data = pdata;
1861
GqServerDn* dn = NULL;
1863
gtk_tree_model_get(model, iter,
1867
show_server_dn(data->context, model,
1868
gq_server_dn_get_server(dn),
1869
gq_server_dn_get_dn(dn), FALSE);
1875
add_all_to_browser(GqTab *tab)
1878
struct ServerDnShowData data = {
1882
/* find last used browser... */
1883
browsetab = gq_window_get_last_tab(&mainwin, GQ_TYPE_TAB_BROWSE);
1885
#warning "FIXME: just open a fucking browser"
1886
single_warning_popup(_("No browser available"));
1890
data.context = error_new_context(_("Adding all to browser"), P(tab)->results_treeview);
1891
data.treeview = GTK_WIDGET(GQ_TAB_BROWSE(browsetab)->ctreeroot);
1892
gtk_tree_model_foreach(GTK_TREE_MODEL(P(tab)->results_liststore),
1895
error_flush(data.context);
1896
go_to_page(browsetab);
1900
server_dn_show(GtkTreeModel* model,
1905
server_dn_show_b(model, path,
1910
add_selected_to_browser(GqTab *tab)
1913
struct ServerDnShowData data = {
1917
/* find last used browser... */
1918
browsetab = gq_window_get_last_tab(&mainwin, GQ_TYPE_TAB_BROWSE);
1920
#warning "FIXME: just open a fucking browser"
1921
single_warning_popup(_("No browser available"));
1925
data.context = error_new_context(_("Adding selected entries to browser"),
1926
P(tab)->results_treeview);
1927
data.treeview = GTK_WIDGET(GQ_TAB_BROWSE(browsetab)->ctreeroot);
1929
gtk_clist_freeze(GTK_CLIST(GQ_TAB_BROWSE(browsetab)->ctreeroot));
1930
gtk_tree_selection_selected_foreach(gtk_tree_view_get_selection(GTK_TREE_VIEW(P(tab)->results_treeview)),
1933
gtk_clist_thaw(GTK_CLIST(GQ_TAB_BROWSE(browsetab)->ctreeroot));
1934
go_to_page(browsetab);
1936
error_flush(data.context);
1940
collect_selected(GtkTreeModel* model,
1941
GtkTreePath * path G_GNUC_UNUSED,
1946
GList **list = data;
1948
gtk_tree_model_get(model, iter,
1951
*list = g_list_prepend(*list, g_object_ref(entry));
1955
export_search_selected_entry(GqTab* tab)
1959
/* find last used browser... */
1961
browsetab = gq_window_get_last_tab(&mainwin, GQ_TYPE_TAB_BROWSE);
1963
GtkTreeSelection* sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(P(tab)->results_treeview));
1965
GList * list = NULL;
1967
gtk_tree_selection_selected_foreach(sel, collect_selected, &list);
1969
error_context = error_new_context(_("Exporting selected entries to LDIF"),
1956
1970
tab->win->mainwin);
1958
export_many(error_context, tab->win->mainwin, to_export);
1972
gq_export_server_dns(error_context, GTK_WINDOW(tab->win->mainwin), list);
1960
error_flush(error_context);
1974
error_flush(error_context);
1976
#warning "FIXME: just open a fucking browser"
1962
1977
single_warning_popup(_("No browser available"));
1966
static void delete_search_selected(GqTab *tab)
1968
struct dn_on_server *set;
1969
GtkWidget *clist = GQ_TAB_SEARCH(tab)->main_clist;
1972
sel = GTK_CLIST(clist)->selection;
1973
if (g_list_length(sel) > 0) {
1975
question_popup(_("Do you really want to delete the selected entries?"),
1976
_("Do you really want to delete the selected entries?")
1979
/* FIXME: sort by ldapserver and keep connection open across
1983
int ctx = error_new_context(_("Deleting selected entries"),
1986
for (I = g_list_last(sel) ; I ; I = g_list_previous(I)) {
1987
set = gtk_clist_get_row_data(GTK_CLIST(clist),
1988
GPOINTER_TO_INT(I->data));
1989
if (delete_entry(ctx, set->server, set->dn)) {
1990
deld = g_list_append(deld, I->data);
1993
gtk_clist_freeze(GTK_CLIST(clist));
1994
for (I = g_list_first(deld) ; I ; I = g_list_next(I)) {
1995
gtk_clist_remove(GTK_CLIST(clist),
1996
GPOINTER_TO_INT(I->data));
1999
gtk_clist_thaw(GTK_CLIST(clist));
2006
static void search_new_from_entry_callback(GtkWidget *w, GqTab *tab)
2008
struct dn_on_server *set;
2011
set = GQ_TAB_SEARCH(tab)->set;
2012
GQ_TAB_SEARCH(tab)->set = NULL;
2013
if(set == NULL || set->dn == NULL)
2016
error_context = error_new_context(_("Creating new entry from search result"), w);
2018
new_from_entry(error_context, set->server, set->dn);
2020
error_flush(error_context);
2023
static void search_edit_entry_callback(GqTab *tab)
2025
struct dn_on_server *set;
2027
set = GQ_TAB_SEARCH(tab)->set;
2028
GQ_TAB_SEARCH(tab)->set = NULL;
2029
if(set == NULL || set->dn == NULL)
2032
edit_entry(set->server, set->dn);
2035
static void delete_search_entry(GqTab *tab)
2037
struct dn_on_server *set;
2040
set = GQ_TAB_SEARCH(tab)->set;
2041
GQ_TAB_SEARCH(tab)->set = NULL;
2042
if(set == NULL || set->dn == NULL)
2045
ctx = error_new_context(_("Deleting entry"),
2046
GQ_TAB_SEARCH(tab)->main_clist);
2048
delete_entry(ctx, set->server, set->dn);
2053
static int select_entry_callback(GtkWidget *clist, gint row, gint column,
2054
GdkEventButton *event, GqTab *tab)
2056
struct dn_on_server *set;
2059
set = gtk_clist_get_row_data(GTK_CLIST(clist), row);
2061
if(event->button == 1 && event->type == GDK_2BUTTON_PRESS) {
2062
GQ_TAB_SEARCH(tab)->set = set;
2063
search_edit_entry_callback(tab);
2071
static gboolean search_button_press_on_tree_item(GtkWidget *clist,
2072
GdkEventButton *event,
2075
struct dn_on_server *set;
2076
int rc, row, column;
2078
if (event->type == GDK_BUTTON_PRESS && event->button == 3
2079
&& event->window == GTK_CLIST(clist)->clist_window) {
2080
rc = gtk_clist_get_selection_info(GTK_CLIST(clist),
2081
event->x, event->y, &row, &column);
2085
set = gtk_clist_get_row_data(GTK_CLIST(clist), row);
2086
results_popup_menu(tab, event, set);
2088
g_signal_stop_emission_by_name(clist,
2089
"button_press_event");
2095
void fill_out_search(GqTab *tab,
2097
const char *search_base_dn)
2099
GtkCombo *server_combo, *searchbase_combo;
2101
if (!search_base_dn) {
2102
search_base_dn = server->basedn;
2105
server_combo = (GtkCombo *) GQ_TAB_SEARCH(tab)->serverlist_combo;
2106
searchbase_combo = (GtkCombo *) GQ_TAB_SEARCH(tab)->searchbase_combo;
2108
gtk_entry_set_text(GTK_ENTRY(server_combo->entry), server->name);
2109
gtk_entry_set_text(GTK_ENTRY(searchbase_combo->entry), search_base_dn);
2111
gtk_editable_set_position(GTK_EDITABLE(server_combo->entry), 0);
2112
gtk_editable_set_position(GTK_EDITABLE(searchbase_combo->entry), 0);
2114
/* make tab visible */
1982
server_dn_queue_for_delete(GtkTreeModel* model,
1983
GtkTreePath * path G_GNUC_UNUSED,
1987
GqServerDn* entry = NULL;
1988
GList **to_delete = data;
1990
gtk_tree_model_get(model, iter,
1994
*to_delete = g_list_prepend(*to_delete, g_object_ref(entry));
1998
delete_search_selected(GqTab *tab)
2000
GtkTreeSelection* sel;
2002
GtkWidget * treeview = P(tab)->results_treeview;
2003
GList * to_delete = NULL,
2007
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
2009
#warning "FIXME: we should realize this earlier"
2010
g_return_if_fail(!gtk_tree_selection_count_selected_rows(sel));
2012
#warning "FIXME: start working on undelete support so this question gets obsolete"
2013
#warning "FIXME: set a parent window"
2014
if(!question_popup(NULL,
2015
_("Do you really want to delete the selected entries?"),
2016
_("Do you really want to delete the selected entries?")))
2021
// TRANSLATORS: there is a unicode symbold for the ellipsis (...): u2026
2022
context = error_new_context(_("Preparing deletion..."),
2024
gtk_tree_selection_selected_foreach(sel,
2025
server_dn_queue_for_delete,
2027
error_flush(context);
2029
/* FIXME: sort by ldapserver and keep connection open across
2031
context = error_new_context(_("Deleting selected entries"),
2034
for (iterator = g_list_last(to_delete) ; iterator ; iterator = g_list_previous(iterator)) {
2035
entry = iterator->data;
2037
if(delete_entry(context, gq_server_dn_get_server(entry),
2038
gq_server_dn_get_dn(entry)))
2040
//deld = g_list_append(deld, I->data);
2043
#warning "FIXME: cancel deletion, revert the beginning and return to a clean directory state"
2047
#warning "FIXME: remove the deleted entries from the search list"
2048
for (iterator = g_list_first(to_delete) ; iterator ; iterator = g_list_next(iterator)) {
2050
gtk_clist_remove(GTK_CLIST(clist),
2051
GPOINTER_TO_INT(I->data));
2053
g_object_unref(iterator->data);
2054
iterator->data = NULL;
2056
g_list_free(to_delete);
2058
error_flush(context);
2062
search_tab_new_from_entry_foreach(GtkTreeModel* model,
2063
GtkTreePath * path G_GNUC_UNUSED,
2070
gtk_tree_model_get(model, iter,
2074
error_context = error_new_context(_("Creating new entry from search result"), data);
2076
#warning "FIXME: set the parent window somehow"
2077
new_from_entry(gq_server_dn_get_server(set),
2078
gq_server_dn_get_dn(set));
2080
error_flush(error_context);
2083
#warning "FIXME: check whether the widget is necessary if the tab is a widget"
2085
search_new_from_entry_callback(GtkWidget* w,
2086
GqTab * tab G_GNUC_UNUSED)
2088
GtkTreeSelection* sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(P(tab)->results_treeview));
2089
gtk_tree_selection_selected_foreach(sel, search_tab_new_from_entry_foreach, w);
2093
search_tab_edit_entry_foreach(GtkTreeModel* model,
2094
GtkTreePath * path G_GNUC_UNUSED,
2098
G_GNUC_UNUSED GqTabSearch* self = GQ_TAB_SEARCH(data);
2101
gtk_tree_model_get(model, iter,
2105
edit_entry(gq_server_dn_get_server(set),
2106
gq_server_dn_get_dn(set));
2110
search_edit_entry_callback(GqTabSearch *self)
2112
GtkTreeSelection* sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(P(self)->results_treeview));
2113
gtk_tree_selection_selected_foreach(sel, search_tab_edit_entry_foreach, self);
2117
delete_search_entry_foreach(GtkTreeModel* model,
2118
GtkTreePath * path G_GNUC_UNUSED,
2122
GqTabSearch* self = GQ_TAB_SEARCH(data);
2126
#warning "FIXME: add some way to visualize deleted items and/or deletion problems in the tree"
2127
#warning "FIXME: queue items for deletion, delete async and remove items from the search results"
2128
gtk_tree_model_get(model, iter,
2132
ctx = error_new_context(_("Deleting entry"),
2133
P(self)->results_treeview);
2135
delete_entry(ctx, gq_server_dn_get_server(set),
2136
gq_server_dn_get_dn(set));
2142
delete_search_entry(GqTab *tab)
2144
GtkTreeSelection* sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(P(tab)->results_treeview));
2145
gtk_tree_selection_selected_foreach(sel, delete_search_entry_foreach, tab);
2149
fill_out_search(GqTab * tab,
2151
gchar const* search_base_dn)
2153
#warning "FIXME: take a GqTabSearch as the first parameter"
2154
g_return_if_fail(GQ_IS_TAB_SEARCH(tab));
2155
g_return_if_fail(GQ_IS_SERVER(server));
2156
g_return_if_fail(!search_base_dn || *search_base_dn);
2158
if (!search_base_dn) {
2159
search_base_dn = server->basedn;
2162
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(P(tab)->serverlist_combo)->entry), gq_server_get_name(server));
2163
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(P(tab)->searchbase_combo)->entry), search_base_dn);
2165
gtk_editable_set_position(GTK_EDITABLE(GTK_COMBO(P(tab)->serverlist_combo)->entry), 0);
2166
gtk_editable_set_position(GTK_EDITABLE(GTK_COMBO(P(tab)->searchbase_combo)->entry), 0);
2168
/* make tab visible */
2119
2173
G_DEFINE_TYPE(GqTabSearch, gq_tab_search, GQ_TYPE_TAB);
2122
gq_tab_search_init(GqTabSearch* self) {}
2125
tab_dispose(GObject* object)
2176
gq_tab_search_init(GqTabSearch* self)
2127
GqTabSearch* self = GQ_TAB_SEARCH(object);
2129
if(self->main_clist) {
2130
gtk_clist_clear(GTK_CLIST(self->main_clist));
2131
gtk_widget_destroy(self->main_clist);
2132
self->main_clist = NULL;
2135
G_OBJECT_CLASS(gq_tab_search_parent_class)->dispose(object);
2178
GtkWidget *searchmode_vbox, *table, *scrwin;
2179
GtkWidget *findbutton, *optbutton;
2182
#define modeinfo self
2183
const GList *last_attr;
2184
GtkCellRenderer* renderer;
2185
GtkTreeModel* model;
2186
GqTab * tab = GQ_TAB(self);
2191
P(modeinfo)->scope = state_value_get_int(lastoptions, "scope",
2192
LDAP_SCOPE_SUBTREE);
2193
P(modeinfo)->chase_ref = state_value_get_int(lastoptions, "chase", 1);
2194
P(self)->max_depth = state_value_get_int(lastoptions, "max-depth", 7);
2195
P(self)->last_options_tab = state_value_get_int(lastoptions, "last-options-tab", 0);
2197
/* copy attribute list */
2198
last_attr = state_value_get_list(lastoptions, "attributes");
2200
P(self)->attrs = free_list_of_strings(P(self)->attrs);
2201
P(self)->attrs = copy_list_of_strings(last_attr);
2204
searchmode_vbox = gtk_vbox_new(FALSE, 0);
2205
table = gtk_table_new(2, 5, FALSE);
2206
gtk_container_set_border_width(GTK_CONTAINER(table), 6);
2207
gtk_table_set_row_spacings(GTK_TABLE(table), 6);
2208
gtk_table_set_col_spacings(GTK_TABLE(table), 6);
2209
gtk_widget_show(table);
2210
gtk_box_pack_start(GTK_BOX(searchmode_vbox), table, FALSE, FALSE, 3);
2213
label = gtk_label_new(NULL);
2214
label_text = g_strdup_printf("<b>%s</b>", _("Search:"));
2215
gtk_label_set_markup(GTK_LABEL(label), label_text);
2218
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
2219
gtk_widget_show(label);
2220
gtk_table_attach(GTK_TABLE(table), label,
2222
GTK_FILL, GTK_EXPAND,
2225
model = GTK_TREE_MODEL(gtk_list_store_new(MODE_N_COLUMNS, G_TYPE_INT, G_TYPE_STRING));
2228
gchar const* text = NULL;
2231
case GQ_SEARCH_MODE_BEGINS_WITH:
2232
text = _("Attribute begins with");
2234
case GQ_SEARCH_MODE_ENDS_WITH:
2235
text = _("Attribute ends with");
2237
case GQ_SEARCH_MODE_CONTAINS:
2238
text = _("Attribute matches");
2240
case GQ_SEARCH_MODE_EQUALS:
2241
text = _("Attribute matches exactly");
2248
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
2249
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
2251
MODE_COL_TEXT, text,
2257
P(tab)->searchmode_combo = gtk_combo_box_new_with_model(model);
2258
gtk_combo_box_set_active(GTK_COMBO_BOX(P(tab)->searchmode_combo), 0);
2259
renderer = gtk_cell_renderer_text_new();
2260
gtk_cell_layout_pack_end(GTK_CELL_LAYOUT(P(tab)->searchmode_combo),
2263
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(P(tab)->searchmode_combo),
2267
g_object_unref(model);
2268
gtk_widget_show(P(tab)->searchmode_combo);
2269
gtk_table_attach(GTK_TABLE(table), P(tab)->searchmode_combo,
2271
GTK_FILL, GTK_EXPAND | GTK_FILL,
2274
/* searchterm combo box */
2275
P(tab)->search_combo = gtk_combo_new();
2276
gtk_combo_disable_activate(GTK_COMBO(P(tab)->search_combo));
2277
if(P(self)->history) {
2278
gtk_combo_set_popdown_strings(GTK_COMBO(P(tab)->search_combo), P(self)->history);
2280
gtk_widget_show(P(tab)->search_combo);
2281
GTK_WIDGET_SET_FLAGS(GTK_COMBO(P(tab)->search_combo)->entry, GTK_CAN_FOCUS);
2282
GTK_WIDGET_SET_FLAGS(GTK_COMBO(P(tab)->search_combo)->entry, GTK_RECEIVES_DEFAULT);
2283
gtk_table_attach(GTK_TABLE(table), P(tab)->search_combo,
2285
GTK_EXPAND | GTK_FILL, GTK_EXPAND,
2287
g_signal_connect_swapped(GTK_COMBO(P(tab)->search_combo)->entry, "activate",
2288
G_CALLBACK(findbutton_clicked_callback), tab);
2289
tab->focus = GTK_COMBO(P(tab)->search_combo)->entry;
2292
label = gtk_label_new(_("Server"));
2293
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
2294
gtk_widget_show(label);
2295
gtk_table_attach(GTK_TABLE(table), label,
2297
GTK_FILL, GTK_EXPAND,
2300
/* LDAP server combo box */
2301
P(self)->serverlist_combo = gtk_combo_box_new();
2303
GtkCellRenderer* renderer;
2304
GtkTreeModel* model = gq_server_model_new(gq_server_list_get());
2305
gtk_combo_box_set_model(GTK_COMBO_BOX(P(self)->serverlist_combo),
2307
g_object_unref(model);
2308
gtk_combo_box_set_active(GTK_COMBO_BOX(P(self)->serverlist_combo), 0);
2310
renderer = gtk_cell_renderer_pixbuf_new();
2311
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(P(self)->serverlist_combo),
2313
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(P(self)->serverlist_combo), renderer,
2314
"icon-name", GQ_SERVER_MODEL_COL_STATUS,
2316
renderer = gtk_cell_renderer_text_new();
2317
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(P(self)->serverlist_combo),
2319
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(P(self)->serverlist_combo),
2321
"text", GQ_SERVER_MODEL_COL_NAME,
2324
gtk_table_attach(GTK_TABLE(table), P(self)->serverlist_combo,
2326
GTK_FILL, GTK_EXPAND,
2328
g_signal_connect_swapped(P(self)->serverlist_combo, "changed",
2329
G_CALLBACK(servername_changed_callback), tab);
2330
gtk_widget_show(P(self)->serverlist_combo);
2333
label = gtk_label_new(_("Base DN"));
2334
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
2335
gtk_widget_show(label);
2336
gtk_table_attach(GTK_TABLE(table), label,
2338
GTK_FILL, GTK_EXPAND,
2341
/* search base combo box */
2342
P(self)->searchbase_combo = gtk_combo_new();
2344
if(gq_server_list_n_servers(gq_server_list_get())) {
2345
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(P(self)->searchbase_combo)->entry),
2346
gq_server_list_get_server(gq_server_list_get(), 0)->basedn);
2349
gtk_table_attach(GTK_TABLE(table), P(self)->searchbase_combo,
2351
GTK_EXPAND | GTK_FILL, GTK_EXPAND,
2353
g_signal_connect(GTK_COMBO(P(self)->searchbase_combo)->button, "button_press_event",
2354
G_CALLBACK(searchbase_button_clicked), tab);
2355
gtk_widget_show(P(self)->searchbase_combo);
2358
findbutton = gq_button_new_with_label(_("_Find"));
2359
gtk_widget_show(findbutton);
2360
gtk_table_attach(GTK_TABLE(table), findbutton,
2362
GTK_FILL, GTK_EXPAND | GTK_FILL,
2364
gtk_container_border_width(GTK_CONTAINER (findbutton), 0);
2365
g_signal_connect_swapped(findbutton, "clicked",
2366
G_CALLBACK(findbutton_clicked_callback),
2369
/* Options button */
2370
optbutton = gq_button_new_with_label(_("_Options"));
2371
gtk_widget_show(optbutton);
2372
gtk_table_attach(GTK_TABLE(table), optbutton,
2374
GTK_FILL, GTK_EXPAND | GTK_FILL,
2376
gtk_container_border_width(GTK_CONTAINER (optbutton), 0);
2377
g_signal_connect_swapped(optbutton, "clicked",
2378
G_CALLBACK(optbutton_clicked_callback),
2382
#warning "FIXME: save the paned position"
2383
paned = gtk_hpaned_new();
2384
gtk_widget_show(paned);
2385
gtk_box_pack_start(GTK_BOX(searchmode_vbox), paned, TRUE, TRUE, 0);
2387
/* search result display */
2388
/* this is added before the tree, because setting the tree model causes
2389
* a "changed" event on the tree selection wich requires the results
2390
* display to be set */
2391
P(self)->results_display = gq_input_form_new();
2392
gtk_widget_show(P(self)->results_display);
2393
gtk_paned_pack2(GTK_PANED(paned), P(self)->results_display,
2395
gq_input_form_set_editable(GQ_INPUT_FORM(P(self)->results_display), TRUE);
2397
/* results treeview */
2398
scrwin = gtk_scrolled_window_new(NULL, NULL);
2399
gtk_paned_pack1(GTK_PANED(paned), scrwin,
2401
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrwin),
2402
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2403
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrwin),
2405
P(self)->results_treeview = gtk_tree_view_new();
2406
gtk_container_add(GTK_CONTAINER(scrwin), P(self)->results_treeview);
2407
gtk_widget_show_all(scrwin);
2408
g_signal_connect(P(self)->results_treeview, "button-press-event",
2409
G_CALLBACK(results_button_pressed), self);
2410
gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(P(self)->results_treeview)),
2411
GTK_SELECTION_MULTIPLE);
2412
g_signal_connect(gtk_tree_view_get_selection(GTK_TREE_VIEW(P(self)->results_treeview)), "changed",
2413
G_CALLBACK(results_selection_changed), self);
2414
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(P(self)->results_treeview), -1,
2415
_("Distinguished Name (DN)"), gtk_cell_renderer_text_new(),
2416
"text", RES_COL_NAME,
2418
#warning "FIXME: add attribute and match columns"
2420
#warning "FIXME: let the tree view support sort columns"
2421
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(P(self)->results_treeview), -1,
2422
_("Attribute"), gtk_cell_renderer_text_new(),
2423
#warning "FIXME: add the attribute column"
2426
gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(P(self)->results_treeview), -1,
2427
_("Match"), gtk_cell_renderer_text_new(),
2428
#warning "FIXME: add the match column"
2433
P(self)->results_liststore = gtk_list_store_new(RES_N_COLUMNS, G_TYPE_STRING, GQ_TYPE_SERVER_DN);
2434
gtk_tree_view_set_model(GTK_TREE_VIEW(P(self)->results_treeview),
2435
GTK_TREE_MODEL(P(self)->results_liststore));
2436
g_object_unref(P(self)->results_liststore);
2438
gtk_widget_show(searchmode_vbox);
2440
g_signal_connect_swapped(searchmode_vbox, "destroy",
2441
G_CALLBACK(g_object_unref), tab);
2443
tab->content = searchmode_vbox;
2444
gtk_object_set_data(GTK_OBJECT(tab->content), "tab", tab);