1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
using Gee;
using Gtk;
using Dino.Entities;
using Xmpp.Xep;
namespace Dino.Ui.ContactDetails {
public class MucConfigFormProvider : Plugins.ContactDetailsProvider {
public override string id { get { return "muc_config_form"; } }
private StreamInteractor stream_interactor;
public MucConfigFormProvider(StreamInteractor stream_interactor) {
this.stream_interactor = stream_interactor;
}
public override void populate(Conversation conversation, Plugins.ContactDetails contact_details) {
if (conversation.type_ == Conversation.Type.GROUPCHAT) {
Xmpp.Core.XmppStream? stream = stream_interactor.get_stream(conversation.account);
if (stream == null) return;
stream_interactor.get_module(MucManager.IDENTITY).get_config_form(conversation.account, conversation.counterpart, (jid, data_form) => {
contact_details.save.connect(() => { data_form.submit(); });
Idle.add(() => {
for (int i = 0; i < data_form.fields.size; i++) {
DataForms.DataForm.Field field = data_form.fields[i];
add_field(field, contact_details);
}
return false;
});
});
}
}
public static void add_field(DataForms.DataForm.Field field, Plugins.ContactDetails contact_details) {
string label = field.label ?? "";
string? desc = null;
switch (field.var) {
case "muc#roomconfig_roomname":
label = _("Name of the room");
break;
case "muc#roomconfig_roomdesc":
label = _("Description of the room");
break;
case "muc#roomconfig_persistentroom":
label = _("Persistent");
desc = _("The room will persist after the last occupant exits");
break;
case "muc#roomconfig_publicroom":
label = _("Publicly searchable");
break;
case "muc#roomconfig_changesubject":
label = _("Occupants may change subject");
break;
case "muc#roomconfig_whois":
label = _("Discover real JIDs");
desc = _("Who may discover real JIDs?");
break;
case "muc#roomconfig_roomsecret":
label = _("Password");
desc = _("Password required to enter the room. Leave empty for none");
break;
case "muc#roomconfig_moderatedroom":
label = _("Moderated");
desc = _("Only occupants with voice may send messages");
break;
case "muc#roomconfig_membersonly":
label = _("Members only");
desc = _("Only members may enter the room");
break;
case "muc#roomconfig_historylength":
label = _("Message history");
desc = _("Maximum number of history messages returned by the room");
break;
}
Widget? widget = get_widget(field);
if (widget != null) contact_details.add(_("Room Configuration"), label, desc, widget);
}
private static Widget? get_widget(DataForms.DataForm.Field field) {
switch (field.type_) {
case DataForms.DataForm.Type.BOOLEAN:
DataForms.DataForm.BooleanField boolean_field = field as DataForms.DataForm.BooleanField;
Switch sw = new Switch() { active=boolean_field.value, valign=Align.CENTER, visible=true };
sw.state_set.connect((state) => {
boolean_field.value = state;
return false;
});
return sw;
case DataForms.DataForm.Type.JID_MULTI:
return null;
case DataForms.DataForm.Type.LIST_SINGLE:
DataForms.DataForm.ListSingleField list_single_field = field as DataForms.DataForm.ListSingleField;
ComboBoxText combobox = new ComboBoxText() { valign=Align.CENTER, visible=true };
for (int i = 0; i < list_single_field.options.size; i++) {
DataForms.DataForm.Option option = list_single_field.options[i];
combobox.append(option.value, option.label);
if (option.value == list_single_field.value) combobox.active = i;
}
combobox.changed.connect(() => {
list_single_field.value = combobox.get_active_id();
});
return combobox;
case DataForms.DataForm.Type.LIST_MULTI:
return null;
case DataForms.DataForm.Type.TEXT_PRIVATE:
DataForms.DataForm.TextPrivateField text_private_field = field as DataForms.DataForm.TextPrivateField;
Entry entry = new Entry() { text=text_private_field.value ?? "", valign=Align.CENTER, visible=true, visibility=false };
entry.key_release_event.connect(() => {
text_private_field.value = entry.text;
return false;
});
return entry;
case DataForms.DataForm.Type.TEXT_SINGLE:
DataForms.DataForm.TextSingleField text_single_field = field as DataForms.DataForm.TextSingleField;
Entry entry = new Entry() { text=text_single_field.value ?? "", valign=Align.CENTER, visible=true };
entry.key_release_event.connect(() => {
text_single_field.value = entry.text;
return false;
});
return entry;
default:
return null;
}
}
}
}
|