3
3
* Ekiga -- A VoIP and Video-Conferencing application
4
* Copyright (C) 2000-2007 Damien Sandras
4
* Copyright (C) 2000-2009 Damien Sandras <dsandras@seconix.com>
6
6
* This program is free software; you can redistribute it and/or modify
7
7
* it under the terms of the GNU General Public License as published by
8
8
* the Free Software Foundation; either version 2 of the License, or (at
28
28
* form-dialog.cpp - description
29
29
* ------------------------------------------
30
30
* begin : written in 2007 by Julien Puydt
31
* copyright : (c) 2007 by Julien Puydt
31
* copyright : (c) 2007-2008 by Julien Puydt
32
32
* description : implementation of a gtk+ representation of forms
36
37
#include <algorithm>
38
39
#include <iostream>
40
#include <glib/gi18n.h>
40
42
#include "toolbox.h"
41
43
#include "form-dialog-gtk.h"
215
221
TextSubmitter (const std::string _name,
216
222
const std::string _description,
223
const std::string _tooltip,
217
225
GtkWidget *_widget): name(_name),
218
226
description(_description),
225
235
void submit (Ekiga::FormBuilder &builder)
227
237
builder.text (name, description,
228
gtk_entry_get_text (GTK_ENTRY (widget)));
238
gtk_entry_get_text (GTK_ENTRY (widget)), tooltip,
233
244
const std::string name;
234
245
const std::string description;
246
const std::string tooltip;
235
248
GtkWidget *widget;
253
268
void submit (Ekiga::FormBuilder &builder)
255
270
builder.private_text (name, description,
256
gtk_entry_get_text (GTK_ENTRY (widget)));
271
gtk_entry_get_text (GTK_ENTRY (widget)),
261
277
const std::string name;
262
278
const std::string description;
279
const std::string tooltip;
263
281
GtkWidget *widget;
305
327
SingleChoiceSubmitter (const std::string _name,
306
328
const std::string _description,
307
329
const std::map<std::string, std::string> _choices,
308
331
GtkWidget *_combo): name(_name),
309
332
description(_description),
310
333
choices(_choices),
332
356
gtk_tree_model_get (model, &iter, COLUMN_VALUE, &cvalue, -1);
334
358
builder.single_choice (name, description,
335
std::string (cvalue), choices);
359
std::string (cvalue), choices,
353
379
MultipleChoiceSubmitter (const std::string _name,
354
380
const std::string _description,
355
381
const std::map<std::string, std::string> _choices,
356
383
GtkWidget *_tree_view):
357
384
name(_name), description(_description),
358
choices(_choices), tree_view (_tree_view)
385
choices(_choices), advanced(_advanced), tree_view (_tree_view)
361
388
~MultipleChoiceSubmitter ()
403
430
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter));
406
builder.multiple_choice (name, description, values, choices);
433
builder.multiple_choice (name, description, values, choices, advanced);
422
450
EditableSetSubmitter (const std::string _name,
423
451
const std::string _description,
424
453
GtkWidget *_tree_view):
425
name(_name), description(_description), tree_view(_tree_view)
454
name(_name), description(_description), advanced(_advanced), tree_view(_tree_view)
428
457
~EditableSetSubmitter ()
466
495
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter));
469
builder.editable_set (name, description, values, proposed_values);
498
builder.editable_set (name, description, values, proposed_values, advanced);
474
503
const std::string name;
475
504
const std::string description;
476
506
GtkWidget *tree_view;
617
648
vbox = gtk_vbox_new (FALSE, 0);
618
649
gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
619
650
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, FALSE, FALSE, 0);
651
gtk_widget_show (vbox);
621
653
preamble = gtk_vbox_new (FALSE, 0);
622
654
gtk_box_pack_start (GTK_BOX (vbox), preamble, FALSE, FALSE, 0);
626
658
gtk_table_set_col_spacings (GTK_TABLE (fields), 2);
627
659
gtk_box_pack_start (GTK_BOX (vbox), fields, FALSE, FALSE, 3);
661
advanced_fields = gtk_table_new (0, 2, FALSE);
662
gtk_table_set_row_spacings (GTK_TABLE (advanced_fields), 2);
663
gtk_table_set_col_spacings (GTK_TABLE (advanced_fields), 2);
664
expander = gtk_expander_new (_("Advanced"));
665
gtk_container_add (GTK_CONTAINER (expander), advanced_fields);
666
gtk_box_pack_start (GTK_BOX (vbox), expander, FALSE, FALSE, 3);
629
668
labels_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
630
669
options_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
632
request.visit (*this);
671
request->visit (*this);
648
687
FormDialog::run ()
650
gtk_widget_show_all (window);
689
gtk_widget_show_all (preamble);
690
gtk_widget_show_all (fields);
691
if (advanced_rows > 0)
692
gtk_widget_show_all (expander);
693
gtk_widget_show (window);
651
694
switch (gtk_dialog_run (GTK_DIALOG (window))) {
653
696
case GTK_RESPONSE_ACCEPT:
715
758
gtk_button_set_relief (GTK_BUTTON (widget), GTK_RELIEF_NONE);
716
759
gtk_box_pack_start (GTK_BOX (preamble), widget, FALSE, FALSE, 0);
718
g_signal_connect_data (G_OBJECT (widget), "clicked",
761
g_signal_connect_data (widget, "clicked",
719
762
G_CALLBACK (link_clicked_cb), (gpointer) g_strdup (_uri.c_str ()),
720
763
(GClosureNotify) g_free, (GConnectFlags) 0);
752
795
FormDialog::boolean (const std::string name,
753
796
const std::string description,
756
800
GtkWidget *widget = NULL;
757
801
BooleanSubmitter *submitter = NULL;
760
gtk_table_resize (GTK_TABLE (fields), rows, 2);
803
grow_fields (advanced);
762
805
widget = gtk_check_button_new_with_label (description.c_str ());
763
806
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), value);
764
gtk_table_attach_defaults (GTK_TABLE (fields), widget,
765
0, 2, rows -1, rows);
767
submitter = new BooleanSubmitter (name, description, widget);
809
gtk_table_attach_defaults (GTK_TABLE (advanced_fields), widget,
810
0, 2, advanced_rows -1, advanced_rows);
813
gtk_table_attach_defaults (GTK_TABLE (fields), widget,
814
0, 2, rows -1, rows);
817
submitter = new BooleanSubmitter (name, description, advanced, widget);
768
818
submitters.push_back (submitter);
772
822
FormDialog::text (const std::string name,
773
823
const std::string description,
774
const std::string value)
824
const std::string value,
825
const std::string tooltip,
776
828
GtkWidget *label = NULL;
777
829
GtkWidget *widget = NULL;
790
841
g_free (label_text);
792
843
widget = gtk_entry_new ();
844
gtk_widget_set_tooltip_text (widget, tooltip.c_str ());
793
845
gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
794
846
gtk_entry_set_activates_default (GTK_ENTRY (widget), true);
795
847
gtk_size_group_add_widget (options_group, widget);
796
848
gtk_entry_set_text (GTK_ENTRY (widget), value.c_str ());
798
gtk_table_attach (GTK_TABLE (fields), label,
799
0, 1, rows - 1, rows,
800
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
801
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
803
gtk_table_attach (GTK_TABLE (fields), widget,
804
1, 2, rows - 1, rows,
805
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
806
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
809
submitter = new TextSubmitter (name, description, widget);
852
gtk_table_attach (GTK_TABLE (advanced_fields), label,
853
0, 1, advanced_rows - 1, advanced_rows,
854
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
855
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
857
gtk_table_attach (GTK_TABLE (advanced_fields), widget,
858
1, 2, advanced_rows - 1, advanced_rows,
859
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
860
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
864
gtk_table_attach (GTK_TABLE (fields), label,
865
0, 1, rows - 1, rows,
866
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
867
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
869
gtk_table_attach (GTK_TABLE (fields), widget,
870
1, 2, rows - 1, rows,
871
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
872
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
876
submitter = new TextSubmitter (name, description, tooltip, advanced, widget);
810
877
submitters.push_back (submitter);
833
901
g_free (label_text);
835
903
widget = gtk_entry_new ();
904
gtk_widget_set_tooltip_text (widget, tooltip.c_str ());
836
905
gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget);
837
906
gtk_entry_set_activates_default (GTK_ENTRY (widget), true);
838
907
gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
839
908
gtk_size_group_add_widget (options_group, widget);
840
909
gtk_entry_set_text (GTK_ENTRY (widget), value.c_str ());
842
gtk_table_attach (GTK_TABLE (fields), label,
843
0, 1, rows - 1, rows,
844
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
845
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
847
gtk_table_attach (GTK_TABLE (fields), widget,
848
1, 2, rows - 1, rows,
849
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
850
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
853
submitter = new PrivateTextSubmitter (name, description, widget);
913
gtk_table_attach (GTK_TABLE (advanced_fields), label,
914
0, 1, advanced_rows - 1, advanced_rows,
915
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
916
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
918
gtk_table_attach (GTK_TABLE (advanced_fields), widget,
919
1, 2, advanced_rows - 1, advanced_rows,
920
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
921
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
925
gtk_table_attach (GTK_TABLE (fields), label,
926
0, 1, rows - 1, rows,
927
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
928
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
930
gtk_table_attach (GTK_TABLE (fields), widget,
931
1, 2, rows - 1, rows,
932
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
933
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
937
submitter = new PrivateTextSubmitter (name, description, advanced, widget);
854
938
submitters.push_back (submitter);
866
951
GtkTextBuffer *buffer = NULL;
867
952
MultiTextSubmitter *submitter = NULL;
870
gtk_table_resize (GTK_TABLE (fields), rows, 2);
954
grow_fields (advanced);
872
956
label = gtk_label_new_with_mnemonic (description.c_str ());
873
957
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
874
958
gtk_label_set_line_wrap_mode (GTK_LABEL (label), PANGO_WRAP_WORD);
875
gtk_table_attach_defaults (GTK_TABLE (fields), label,
876
0, 2, rows -1, rows);
878
gtk_table_resize (GTK_TABLE (fields), rows, 2);
961
gtk_table_attach_defaults (GTK_TABLE (advanced_fields), label,
962
0, 2, advanced_rows -1, advanced_rows);
965
gtk_table_attach_defaults (GTK_TABLE (fields), label,
966
0, 2, rows -1, rows);
969
grow_fields (advanced);
880
971
widget = gtk_text_view_new ();
881
972
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget));
885
976
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller),
886
977
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
887
978
gtk_container_add (GTK_CONTAINER (scroller), widget);
888
gtk_table_attach_defaults (GTK_TABLE (fields), scroller,
889
0, 2, rows -1, rows);
891
submitter = new MultiTextSubmitter (name, description, buffer);
982
gtk_table_attach_defaults (GTK_TABLE (advanced_fields), scroller,
983
0, 2, advanced_rows -1, advanced_rows);
986
gtk_table_attach_defaults (GTK_TABLE (fields), scroller,
987
0, 2, rows -1, rows);
990
submitter = new MultiTextSubmitter (name, description, advanced, buffer);
892
991
submitters.push_back (submitter);
897
996
FormDialog::single_choice (const std::string name,
898
997
const std::string description,
899
998
const std::string value,
900
const std::map<std::string, std::string> choices)
999
const std::map<std::string, std::string> choices,
902
1002
GtkWidget *label = NULL;
903
1003
gchar* label_text = NULL;
941
1040
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
944
gtk_table_attach (GTK_TABLE (fields), label,
946
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
947
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
949
gtk_table_attach (GTK_TABLE (fields), widget,
951
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
952
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
955
submitter = new SingleChoiceSubmitter (name, description, choices, widget);
1045
gtk_table_attach (GTK_TABLE (advanced_fields), label,
1046
0, 1, advanced_rows -1, advanced_rows,
1047
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1048
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1050
gtk_table_attach (GTK_TABLE (advanced_fields), widget,
1051
1, 2, advanced_rows -1, advanced_rows,
1052
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1053
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1057
gtk_table_attach (GTK_TABLE (fields), label,
1058
0, 1, rows -1, rows,
1059
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1060
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1062
gtk_table_attach (GTK_TABLE (fields), widget,
1063
1, 2, rows -1, rows,
1064
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1065
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1069
submitter = new SingleChoiceSubmitter (name, description, choices,
956
1071
submitters.push_back (submitter);
961
1076
FormDialog::multiple_choice (const std::string name,
962
1077
const std::string description,
963
1078
const std::set<std::string> values,
964
const std::map<std::string, std::string> choices)
1079
const std::map<std::string, std::string> choices,
966
1082
GtkWidget *label = NULL;
967
1083
GtkWidget *scroll = NULL;
987
1102
gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), label_text);
988
1103
g_free (label_text);
990
gtk_table_attach (GTK_TABLE (fields), label,
991
0, 2, rows - 1, rows,
992
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
993
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
996
1105
/* The GtkListStore containing the choices */
997
1106
tree_view = gtk_tree_view_new ();
998
1107
list_store = gtk_list_store_new (MultipleChoiceSubmitter::COLUMN_NUMBER,
1017
1126
"active", MultipleChoiceSubmitter::COLUMN_ACTIVE,
1019
1128
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
1020
g_signal_connect (G_OBJECT (renderer), "toggled",
1129
g_signal_connect (renderer, "toggled",
1021
1130
G_CALLBACK (multiple_choice_choice_toggled_cb), list_store);
1023
1132
renderer = gtk_cell_renderer_text_new ();
1046
gtk_table_resize (GTK_TABLE (fields), rows, 2);
1047
gtk_table_attach (GTK_TABLE (fields), frame,
1048
0, 2, rows - 1, rows,
1049
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1050
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1053
submitter = new MultipleChoiceSubmitter (name, description, choices, tree_view);
1156
gtk_table_attach (GTK_TABLE (advanced_fields), label,
1157
0, 2, advanced_rows - 1, advanced_rows,
1158
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1159
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1161
gtk_table_attach (GTK_TABLE (advanced_fields), frame,
1162
0, 2, advanced_rows - 1, advanced_rows,
1163
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1164
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1168
gtk_table_attach (GTK_TABLE (fields), label,
1169
0, 2, rows - 1, rows,
1170
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1171
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1173
gtk_table_attach (GTK_TABLE (fields), frame,
1174
0, 2, rows - 1, rows,
1175
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1176
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1180
submitter = new MultipleChoiceSubmitter (name, description,
1181
choices, advanced, tree_view);
1054
1182
submitters.push_back (submitter);
1058
1186
FormDialog::editable_set (const std::string name,
1059
1187
const std::string description,
1060
1188
const std::set<std::string> values,
1061
const std::set<std::string> proposed_values)
1189
const std::set<std::string> proposed_values,
1063
1192
GtkWidget *label = NULL;
1064
1193
GtkWidget *scroll = NULL;
1087
1215
gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), label_text);
1088
1216
g_free (label_text);
1090
gtk_table_attach (GTK_TABLE (fields), label,
1091
0, 2, rows - 1, rows,
1092
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1093
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1096
1218
/* The GtkListStore containing the values */
1097
1219
list_store = gtk_list_store_new (EditableSetSubmitter::COLUMN_NUMBER,
1098
1220
G_TYPE_BOOLEAN, G_TYPE_STRING);
1116
1238
"active", EditableSetSubmitter::COLUMN_ACTIVE,
1118
1240
gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
1119
g_signal_connect (G_OBJECT (renderer), "toggled",
1241
g_signal_connect (renderer, "toggled",
1120
1242
G_CALLBACK (editable_set_choice_toggled_cb), list_store);
1122
1244
renderer = gtk_cell_renderer_text_new ();
1155
gtk_table_resize (GTK_TABLE (fields), rows, 2);
1156
gtk_table_attach (GTK_TABLE (fields), frame,
1157
0, 2, rows - 1, rows,
1158
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1159
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1278
gtk_table_attach (GTK_TABLE (advanced_fields), label,
1279
0, 2, advanced_rows - 1, advanced_rows,
1280
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1281
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1283
gtk_table_attach (GTK_TABLE (advanced_fields), frame,
1284
0, 2, advanced_rows - 1, advanced_rows,
1285
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1286
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1290
gtk_table_attach (GTK_TABLE (fields), label,
1291
0, 2, rows - 1, rows,
1292
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1293
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1295
gtk_table_attach (GTK_TABLE (fields), frame,
1296
0, 2, rows - 1, rows,
1297
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1298
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1162
1302
hbox = gtk_hbox_new (FALSE, 2);
1163
1303
entry = gtk_entry_new ();
1165
1305
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 2);
1166
1306
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 2);
1168
g_signal_connect (G_OBJECT (entry), "activate",
1308
g_signal_connect (entry, "activate",
1169
1309
(GCallback) editable_set_add_value_activated_cb,
1170
1310
(gpointer) tree_view);
1172
g_signal_connect (G_OBJECT (button), "clicked",
1312
g_signal_connect (button, "clicked",
1173
1313
(GCallback) editable_set_add_value_clicked_cb,
1174
1314
(gpointer) entry);
1177
gtk_table_resize (GTK_TABLE (fields), rows, 2);
1178
gtk_table_attach (GTK_TABLE (fields), hbox,
1179
0, 2, rows - 1, rows,
1180
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1181
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1184
submitter = new EditableSetSubmitter (name, description, tree_view);
1317
grow_fields (advanced);
1321
gtk_table_attach (GTK_TABLE (advanced_fields), hbox,
1322
0, 2, advanced_rows - 1, advanced_rows,
1323
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1324
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1328
gtk_table_attach (GTK_TABLE (fields), hbox,
1329
0, 2, rows - 1, rows,
1330
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1331
(GtkAttachOptions) (GTK_FILL|GTK_EXPAND),
1335
submitter = new EditableSetSubmitter (name, description, advanced, tree_view);
1185
1336
submitters.push_back (submitter);
1191
1342
Ekiga::FormBuilder builder;
1193
gtk_widget_hide_all (GTK_WIDGET (window));
1344
gtk_widget_hide (GTK_WIDGET (window));
1195
1346
for (std::list<Submitter *>::iterator iter = submitters.begin ();
1196
1347
iter != submitters.end ();
1198
1349
(*iter)->submit (builder);
1200
request.submit (builder);
1351
request->submit (builder);
1204
1355
FormDialog::cancel ()
1206
gtk_widget_hide_all (GTK_WIDGET (window));
1357
gtk_widget_hide (GTK_WIDGET (window));
1362
FormDialog::grow_fields (bool advanced)
1367
gtk_table_resize (GTK_TABLE (advanced_fields), advanced_rows, 2);
1371
gtk_table_resize (GTK_TABLE (fields), rows, 2);