1
/* Copyright 2016 Software Freedom Conservancy Inc.
3
* This software is licensed under the GNU Lesser General Public License
4
* (version 2.1 or later). See the COPYING file in this distribution.
8
* A wrapper around Gtk.Statusbar that predefines messages and context areas so
9
* you don't have to keep track of them elsewhere. You can activate and
10
* deactivate messages, instead of worrying about context areas and stacks.
11
* Internally, activations are reference counted, and every new activation
12
* pushes the message to the top of its context area's stack. Only when
13
* the number of deactivations equals the number of activations is the message
14
* removed from the stack entirely.
16
public class StatusBar : Gtk.Statusbar {
20
OUTBOX_SAVE_SENT_MAIL_FAILED;
22
internal string get_text() {
24
case Message.OUTBOX_SENDING:
25
/// Displayed in the space-limited status bar while a message is in the process of being sent.
27
case Message.OUTBOX_SEND_FAILURE:
28
/// Displayed in the space-limited status bar when a message fails to be sent due to error.
29
return _("Error sending email");
30
case Message.OUTBOX_SAVE_SENT_MAIL_FAILED:
31
// Displayed in the space-limited status bar when a message fails to be uploaded
32
// to Sent Mail after being sent.
33
return _("Error saving sent mail");
39
internal Context get_context() {
41
case Message.OUTBOX_SENDING:
42
return Context.OUTBOX;
43
case Message.OUTBOX_SEND_FAILURE:
44
return Context.OUTBOX;
45
case Message.OUTBOX_SAVE_SENT_MAIL_FAILED:
46
return Context.OUTBOX;
53
internal enum Context {
57
private Gee.HashMap<Context, uint> context_ids = new Gee.HashMap<Context, uint>();
58
private Gee.HashMap<Message, uint> message_ids = new Gee.HashMap<Message, uint>();
59
private Gee.HashMap<Message, int> message_counts = new Gee.HashMap<Message, int>();
62
set_context_id(Context.OUTBOX);
65
private void set_context_id(Context context) {
66
context_ids.set(context, get_context_id(context.to_string()));
69
private int get_count(Message message) {
70
return (message_counts.has_key(message) ? message_counts.get(message) : 0);
73
private void push_message(Message message) {
74
message_ids.set(message, push(context_ids.get(message.get_context()), message.get_text()));
77
private void remove_message(Message message) {
78
remove(context_ids.get(message.get_context()), message_ids.get(message));
79
message_ids.unset(message);
83
* Return whether the message has been activated more times than it has
86
public bool is_message_active(Message message) {
87
return message_ids.has_key(message);
90
public void activate_message(Message message) {
91
if (is_message_active(message))
92
remove_message(message);
94
push_message(message);
95
message_counts.set(message, get_count(message) + 1);
98
public void deactivate_message(Message message) {
99
if (!is_message_active(message))
102
int count = get_count(message);
104
remove_message(message);
105
message_counts.set(message, count - 1);