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
|
public class Ephraim {
public static int main(string[] args) {
Gtk.init(ref args);
Gtk.Builder builder = new Gtk.Builder();
try {
builder.add_objects_from_file("ephraim.glade", {"MainWindow"});
} catch(Error e) {
return 1;
}
Roster roster = new Roster();
CoreConnector coreconn = new CoreConnector();
coreconn.update_contact.connect(roster.update_contact);
unowned Gtk.Window window = builder.get_object("MainWindow") as Gtk.Window;
window.hide.connect(Gtk.main_quit);
unowned Gtk.MenuItem quitItem = builder.get_object("MenuItemQuit") as Gtk.MenuItem;
quitItem.activate.connect(() => window.visible = false);
unowned Gtk.TreeView rosterView = builder.get_object("Roster") as Gtk.TreeView;
rosterView.set_model(roster);
Gee.TreeMap<string, Conversation> conversations = new Gee.TreeMap<string, Conversation>();
unowned Gtk.Notebook conversationNotebook = builder.get_object("Conversations") as Gtk.Notebook;
// FIXME
string me = "/me";
coreconn.new_conversation.connect((jid) => {
Contact contact = roster.get_contact(jid);
if(contact != null) {
conversations[jid] = new Conversation(conversationNotebook, me, jid, contact.display_string);
}
else {
conversations[jid] = new Conversation(conversationNotebook, me, jid, null);
}
conversations[jid].send_message.connect((type, message) => coreconn.send_message(jid, type, message));
});
coreconn.receive_message.connect((jid, type, message) => {
if(!(jid in conversations))
return;
conversations[jid].receive_message(type, message);
});
coreconn.sent_message.connect((jid, type, message) => {
if(!(jid in conversations))
return;
conversations[jid].sent_message(type, message);
});
if(!coreconn.start())
return 1;
rosterView.query_tooltip.connect((x, y, keyboard_tip, tooltip) => {
Gtk.TreeModel model;
Gtk.TreeIter iter;
if(!rosterView.get_tooltip_context(out x, out y, keyboard_tip, out model, null, out iter))
return false;
Value value;
model.get_value(iter, 0, out value);
Contact? c = value.get_object() as Contact;
if(c == null)
return false;
Gee.Map.Entry<string, Contact.Resource>? r = c.get_resource_with_highest_priority();
if(r == null)
return false;
tooltip.set_text("Resource: " + r.key + " (" + r.value.priority.to_string() + ")");
return true;
});
rosterView.has_tooltip = true;
rosterView.row_activated.connect((view, path, column) => {
Gtk.TreeIter iter;
roster.get_iter(out iter, path);
Value value;
roster.get_value(iter, 0, out value);
Contact contact = value.get_object() as Contact;
if(contact == null)
return;
Gee.Map.Entry<string, Contact.Resource> res = contact.get_resource_with_highest_priority();
if(res == null)
return; //FIXME
coreconn.start_conversation(contact.jid + "/" + res.key);
});
Gtk.TreeViewColumn presenceColumn = new Gtk.TreeViewColumn.with_attributes(null, new CellRendererPresence(), "contact", 0, null);
presenceColumn.min_width = 32;
rosterView.append_column(presenceColumn);
Gtk.TreeViewColumn contactColumn = new Gtk.TreeViewColumn();
Gtk.CellRenderer cellRendererContact = new CellRendererContact();
contactColumn.pack_start(cellRendererContact, true);
contactColumn.set_attributes(cellRendererContact, "contact", 0, null);
Gtk.CellRenderer cellRendererAvatar = new CellRendererAvatar();
contactColumn.pack_end(cellRendererAvatar, false);
contactColumn.set_attributes(cellRendererAvatar, "contact", 0, null);
rosterView.append_column(contactColumn);
window.visible = true;
Gtk.main();
coreconn.stop();
return 0;
}
}
|