From e1ae13450cf3ad12df82bd6a2111eedd6d169ef7 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 29 Jul 2011 14:23:21 +1000 Subject: Add a webview widget for displaying the log The widget is currently bolted in alongside the existing log display widget for comparison. This includes some debugging cruft like showing the secret notebook tabs. The webview is populated from the store_events treestore, allowing all of the existing node-management and ordering code to be used. Attempting to replace this logic in Javascript was demonstratably too hard. This approach keeps the Javascript code down to the 4 GtkTreeModel signals. TODO: - icons - pretty printed dates - expanders - supporting smileys, links, etc. - using the correct font, etc. - removing the debugging --- libempathy-gtk/empathy-log-window.c | 133 ++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index e5c935011..04f224290 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -83,6 +84,7 @@ struct _EmpathyLogWindowPriv GtkWidget *treeview_what; GtkWidget *treeview_when; GtkWidget *treeview_events; + GtkWidget *webview; GtkTreeStore *store_events; @@ -360,6 +362,103 @@ toolbutton_av_clicked (GtkToolButton *toolbutton, TRUE, video, gtk_get_current_event_time ()); } +static void +insert_or_change_row (EmpathyLogWindow *self, + const char *method, + GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter) +{ + char *str = gtk_tree_path_to_string (path); + char *script, *text; + + gtk_tree_model_get (model, iter, + COL_EVENTS_TEXT, &text, + -1); + + script = g_strdup_printf ("javascript:%s([%s], '%s');", + method, + g_strdelimit (str, ":", ','), + text); + + // g_print ("%s\n", script); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), + script); + + g_free (str); + g_free (text); + g_free (script); +} + +static void +store_events_row_inserted (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + EmpathyLogWindow *self) +{ + insert_or_change_row (self, "insertRow", model, path, iter); +} + +static void +store_events_row_changed (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + EmpathyLogWindow *self) +{ + insert_or_change_row (self, "changeRow", model, path, iter); +} + +static void +store_events_row_deleted (GtkTreeModel *model, + GtkTreePath *path, + EmpathyLogWindow *self) +{ + char *str = gtk_tree_path_to_string (path); + char *script; + + script = g_strdup_printf ("javascript:deleteRow([%s]);", + g_strdelimit (str, ":", ',')); + + // g_print ("%s\n", script); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), + script); + + g_free (str); + g_free (script); +} + +static void +store_events_rows_reordered (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + int *new_order, + EmpathyLogWindow *self) +{ + char *str = gtk_tree_path_to_string (path); + int i, children = gtk_tree_model_iter_n_children (model, iter); + char **new_order_strv, *new_order_s; + char *script; + + new_order_strv = g_new0 (char *, children + 1); + + for (i = 0; i < children; i++) + new_order_strv[i] = g_strdup_printf ("%i", new_order[i]); + + new_order_s = g_strjoinv (",", new_order_strv); + + script = g_strdup_printf ("javascript:reorderRows([%s], [%s]);", + str == NULL ? "" : g_strdelimit (str, ":", ','), + new_order_s); + + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), + script); + + g_free (str); + g_free (script); + g_free (new_order_s); + g_strfreev (new_order_strv); +} + static GObject * empathy_log_window_constructor (GType type, guint n_props, @@ -444,7 +543,9 @@ empathy_log_window_init (EmpathyLogWindow *self) EmpathyAccountChooser *account_chooser; GtkBuilder *gui; gchar *filename; + GFile *gfile; GtkWidget *vbox, *accounts, *search, *label, *quit; + GtkWidget *sw; self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_LOG_WINDOW, EmpathyLogWindowPriv); @@ -564,6 +665,38 @@ empathy_log_window_init (EmpathyLogWindow *self) log_window_who_populate (self); + /* events */ + sw = gtk_scrolled_window_new (NULL, NULL); + self->priv->webview = webkit_web_view_new (); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), self->priv->webview); + + filename = empathy_file_lookup ("empathy-log-window.html", "data"); + gfile = g_file_new_for_path (filename); + g_free (filename); + + webkit_web_view_load_uri (WEBKIT_WEB_VIEW (self->priv->webview), + g_file_get_uri (gfile)); + g_object_unref (gfile); + + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), + sw, gtk_label_new ("webview")); + gtk_widget_show_all (sw); + + /* listen to changes to the treemodel */ + g_signal_connect (self->priv->store_events, "row-inserted", + G_CALLBACK (store_events_row_inserted), self); + g_signal_connect (self->priv->store_events, "row-changed", + G_CALLBACK (store_events_row_changed), self); + g_signal_connect (self->priv->store_events, "row-deleted", + G_CALLBACK (store_events_row_deleted), self); + g_signal_connect (self->priv->store_events, "rows-reordered", + G_CALLBACK (store_events_rows_reordered), self); + + // debug + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->priv->notebook), TRUE); + gtk_widget_show (GTK_WIDGET (self)); } -- cgit v1.2.3 From 3b86a347cd3e859c427b7e596d949d6ce0094840 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 1 Aug 2011 13:05:30 +1000 Subject: Use webkit-utils in LogWindow webview --- libempathy-gtk/empathy-log-window.c | 101 ++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 45 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index 04f224290..9459ce26b 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -60,6 +60,8 @@ #include "empathy-images.h" #include "empathy-theme-manager.h" #include "empathy-ui-utils.h" +// FIXME: this work forces a dependency on webkit +#include "empathy-webkit-utils.h" #define DEBUG_FLAG EMPATHY_DEBUG_OTHER #include @@ -1189,8 +1191,10 @@ log_window_append_chat_message (TplEvent *event, { GtkTreeStore *store = log_window->priv->store_events; GtkTreeIter iter, parent; - gchar *pretty_date, *alias, *body, *msg; + gchar *pretty_date, *alias, *body; GDateTime *date; + EmpathyStringParser *parsers; + GString *msg; date = g_date_time_new_from_unix_utc ( tpl_event_get_timestamp (event)); @@ -1199,62 +1203,69 @@ log_window_append_chat_message (TplEvent *event, get_parent_iter_for_message (event, message, &parent); - msg = g_markup_escape_text (empathy_message_get_body (message), -1); alias = g_markup_escape_text ( tpl_entity_get_alias (tpl_event_get_sender (event)), -1); - /* If the user is searching, highlight the matched text */ - if (!EMP_STR_EMPTY (log_window->priv->last_find)) - { - gchar *str = g_regex_escape_string (log_window->priv->last_find, -1); - gchar *replacement = g_markup_printf_escaped ( - "%s", - log_window->priv->last_find); - GError *error = NULL; - GRegex *regex = g_regex_new (str, 0, 0, &error); - - if (regex == NULL) - { - DEBUG ("Could not create regex: %s", error->message); - g_error_free (error); - } - else - { - gchar *new_msg = g_regex_replace_literal (regex, - empathy_message_get_body (message), -1, 0, replacement, - 0, &error); - - if (new_msg != NULL) - { - /* We pass ownership of new_msg to msg, which is freed later */ - g_free (msg); - msg = new_msg; - } - else - { - DEBUG ("Error while performing string substitution: %s", - error->message); - g_error_free (error); - } - } - - g_free (str); - g_free (replacement); - - tp_clear_pointer (®ex, g_regex_unref); - } + // /* If the user is searching, highlight the matched text */ + // if (!EMP_STR_EMPTY (log_window->priv->last_find)) + // { + // gchar *str = g_regex_escape_string (log_window->priv->last_find, -1); + // gchar *replacement = g_markup_printf_escaped ( + // "%s", + // log_window->priv->last_find); + // GError *error = NULL; + // GRegex *regex = g_regex_new (str, 0, 0, &error); + + // if (regex == NULL) + // { + // DEBUG ("Could not create regex: %s", error->message); + // g_error_free (error); + // } + // else + // { + // gchar *new_msg = g_regex_replace_literal (regex, + // empathy_message_get_body (message), -1, 0, replacement, + // 0, &error); + + // if (new_msg != NULL) + // { + // /* We pass ownership of new_msg to msg, which is freed later */ + // g_free (msg); + // msg = new_msg; + // } + // else + // { + // DEBUG ("Error while performing string substitution: %s", + // error->message); + // g_error_free (error); + // } + // } + + // g_free (str); + // g_free (replacement); + + // tp_clear_pointer (®ex, g_regex_unref); + // } + + /* escape the text */ + // FIXME: handle smileys + parsers = empathy_webkit_get_string_parser (FALSE); + msg = g_string_new (""); + + empathy_string_parser_substr (empathy_message_get_body (message), -1, + parsers, msg); if (tpl_text_event_get_message_type (TPL_TEXT_EVENT (event)) == TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION) { /* Translators: this is an emote: '* Danielle waves' */ - body = g_strdup_printf (_("* %s %s"), alias, msg); + body = g_strdup_printf (_("* %s %s"), alias, msg->str); } else { /* Translators: this is a message: 'Danielle: hello' * The string in bold is the sender's name */ - body = g_strdup_printf (_("%s: %s"), alias, msg); + body = g_strdup_printf (_("%s: %s"), alias, msg->str); } gtk_tree_store_append (store, &iter, &parent); @@ -1268,7 +1279,7 @@ log_window_append_chat_message (TplEvent *event, COL_EVENTS_EVENT, event, -1); - g_free (msg); + g_string_free (msg, TRUE); g_free (body); g_free (alias); g_free (pretty_date); -- cgit v1.2.3 From 7565c39bfa0f118fb513c0af86a5ba0ef7976277 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 1 Aug 2011 15:42:43 +1000 Subject: Add expander toggles --- libempathy-gtk/empathy-log-window.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index 9459ce26b..ef6450f36 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -429,6 +429,27 @@ store_events_row_deleted (GtkTreeModel *model, g_free (script); } +static void +store_events_has_child_rows (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + EmpathyLogWindow *self) +{ + char *str = gtk_tree_path_to_string (path); + char *script; + + script = g_strdup_printf ("javascript:hasChildRows([%s], %u);", + g_strdelimit (str, ":", ','), + gtk_tree_model_iter_has_child (model, iter)); + + // g_print ("%s\n", script); + webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), + script); + + g_free (str); + g_free (script); +} + static void store_events_rows_reordered (GtkTreeModel *model, GtkTreePath *path, @@ -695,6 +716,8 @@ empathy_log_window_init (EmpathyLogWindow *self) G_CALLBACK (store_events_row_deleted), self); g_signal_connect (self->priv->store_events, "rows-reordered", G_CALLBACK (store_events_rows_reordered), self); + g_signal_connect (self->priv->store_events, "row-has-child-toggled", + G_CALLBACK (store_events_has_child_rows), self); // debug gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->priv->notebook), TRUE); -- cgit v1.2.3 From 0f84b8fa5a7f061cb5f82ed489e22f15ae2bc7cc Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 1 Aug 2011 15:51:23 +1000 Subject: Handle links via external browser --- libempathy-gtk/empathy-log-window.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index ef6450f36..f81ea4cfe 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -482,6 +482,21 @@ store_events_rows_reordered (GtkTreeModel *model, g_strfreev (new_order_strv); } +static gboolean +events_webview_handle_navigation (WebKitWebView *webview, + WebKitWebFrame *frame, + WebKitNetworkRequest *request, + WebKitWebNavigationAction *navigation_action, + WebKitWebPolicyDecision *policy_decision, + EmpathyLogWindow *window) +{ + empathy_url_show (GTK_WIDGET (webview), + webkit_network_request_get_uri (request)); + + webkit_web_policy_decision_ignore (policy_decision); + return TRUE; +} + static GObject * empathy_log_window_constructor (GType type, guint n_props, @@ -703,6 +718,10 @@ empathy_log_window_init (EmpathyLogWindow *self) g_file_get_uri (gfile)); g_object_unref (gfile); + /* handle all navigation externally */ + g_signal_connect (self->priv->webview, "navigation-policy-decision-requested", + G_CALLBACK (events_webview_handle_navigation), self); + gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), sw, gtk_label_new ("webview")); gtk_widget_show_all (sw); -- cgit v1.2.3 From 79de445e7b21747cbc7893737a5d6756da184274 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Thu, 4 Aug 2011 12:14:11 +1000 Subject: Support smileys in log viewer --- libempathy-gtk/empathy-log-window.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index f81ea4cfe..8869d4acd 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -121,6 +122,8 @@ struct _EmpathyLogWindowPriv TpAccount *selected_account; gchar *selected_chat_id; gboolean selected_is_chatroom; + + GSettings *gsettings_chat; }; static void log_window_search_entry_changed_cb (GtkWidget *entry, @@ -546,6 +549,7 @@ empathy_log_window_dispose (GObject *object) tp_clear_object (&self->priv->selected_account); tp_clear_object (&self->priv->selected_contact); tp_clear_object (&self->priv->camera_monitor); + tp_clear_object (&self->priv->gsettings_chat); G_OBJECT_CLASS (empathy_log_window_parent_class)->dispose (object); } @@ -594,6 +598,8 @@ empathy_log_window_init (EmpathyLogWindow *self) self->priv->log_manager = tpl_log_manager_dup_singleton (); + self->priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA); + gtk_window_set_title (GTK_WINDOW (self), _("History")); gtk_widget_set_can_focus (GTK_WIDGET (self), FALSE); gtk_window_set_default_size (GTK_WINDOW (self), 800, 600); @@ -1290,8 +1296,9 @@ log_window_append_chat_message (TplEvent *event, // } /* escape the text */ - // FIXME: handle smileys - parsers = empathy_webkit_get_string_parser (FALSE); + parsers = empathy_webkit_get_string_parser ( + g_settings_get_boolean (log_window->priv->gsettings_chat, + EMPATHY_PREFS_CHAT_SHOW_SMILEYS)); msg = g_string_new (""); empathy_string_parser_substr (empathy_message_get_body (message), -1, -- cgit v1.2.3 From e15b7f70a43898e4978836fdf8efbed0bebeaea4 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 5 Aug 2011 14:43:00 +1000 Subject: Replace highlighting of search strings --- libempathy-gtk/empathy-log-window.c | 47 +++++-------------------------------- 1 file changed, 6 insertions(+), 41 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index 8869d4acd..b5c2e48cf 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -1254,47 +1254,6 @@ log_window_append_chat_message (TplEvent *event, alias = g_markup_escape_text ( tpl_entity_get_alias (tpl_event_get_sender (event)), -1); - // /* If the user is searching, highlight the matched text */ - // if (!EMP_STR_EMPTY (log_window->priv->last_find)) - // { - // gchar *str = g_regex_escape_string (log_window->priv->last_find, -1); - // gchar *replacement = g_markup_printf_escaped ( - // "%s", - // log_window->priv->last_find); - // GError *error = NULL; - // GRegex *regex = g_regex_new (str, 0, 0, &error); - - // if (regex == NULL) - // { - // DEBUG ("Could not create regex: %s", error->message); - // g_error_free (error); - // } - // else - // { - // gchar *new_msg = g_regex_replace_literal (regex, - // empathy_message_get_body (message), -1, 0, replacement, - // 0, &error); - - // if (new_msg != NULL) - // { - // /* We pass ownership of new_msg to msg, which is freed later */ - // g_free (msg); - // msg = new_msg; - // } - // else - // { - // DEBUG ("Error while performing string substitution: %s", - // error->message); - // g_error_free (error); - // } - // } - - // g_free (str); - // g_free (replacement); - - // tp_clear_pointer (®ex, g_regex_unref); - // } - /* escape the text */ parsers = empathy_webkit_get_string_parser ( g_settings_get_boolean (log_window->priv->gsettings_chat, @@ -1977,6 +1936,8 @@ log_window_find_populate (EmpathyLogWindow *self, if (EMP_STR_EMPTY (search_criteria)) { tp_clear_pointer (&self->priv->hits, tpl_log_manager_search_free); + webkit_web_view_set_highlight_text_matches ( + WEBKIT_WEB_VIEW (self->priv->webview), FALSE); log_window_who_populate (self); return; } @@ -1985,6 +1946,10 @@ log_window_find_populate (EmpathyLogWindow *self, log_window_when_changed_cb, self); + /* highlight the search text */ + webkit_web_view_mark_text_matches (WEBKIT_WEB_VIEW (self->priv->webview), + search_criteria, FALSE, 0); + tpl_log_manager_search_async (self->priv->log_manager, search_criteria, TPL_EVENT_MASK_ANY, log_manager_searched_new_cb, NULL); -- cgit v1.2.3 From 7424ac01d5010aaa101c2b5841daf840b4d0e20c Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Sun, 7 Aug 2011 13:17:31 +1000 Subject: Remove treeview_events -- make the webview the only viewing component Still some commented out code to reimplement. --- libempathy-gtk/empathy-log-window.c | 166 +++++++++++++----------------------- 1 file changed, 58 insertions(+), 108 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index b5c2e48cf..cd1daac22 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -86,7 +86,6 @@ struct _EmpathyLogWindowPriv GtkWidget *treeview_who; GtkWidget *treeview_what; GtkWidget *treeview_when; - GtkWidget *treeview_events; GtkWidget *webview; GtkTreeStore *store_events; @@ -551,6 +550,8 @@ empathy_log_window_dispose (GObject *object) tp_clear_object (&self->priv->camera_monitor); tp_clear_object (&self->priv->gsettings_chat); + tp_clear_object (&self->priv->store_events); + G_OBJECT_CLASS (empathy_log_window_parent_class)->dispose (object); } @@ -587,7 +588,7 @@ empathy_log_window_init (EmpathyLogWindow *self) gchar *filename; GFile *gfile; GtkWidget *vbox, *accounts, *search, *label, *quit; - GtkWidget *sw; + GtkWidget *scrolledwindow_events; self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_LOG_WINDOW, EmpathyLogWindowPriv); @@ -617,7 +618,7 @@ empathy_log_window_init (EmpathyLogWindow *self) "treeview_who", &self->priv->treeview_who, "treeview_what", &self->priv->treeview_what, "treeview_when", &self->priv->treeview_when, - "treeview_events", &self->priv->treeview_events, + "scrolledwindow_events", &scrolledwindow_events, "notebook", &self->priv->notebook, "spinner", &self->priv->spinner, NULL); @@ -710,11 +711,12 @@ empathy_log_window_init (EmpathyLogWindow *self) log_window_who_populate (self); /* events */ - sw = gtk_scrolled_window_new (NULL, NULL); self->priv->webview = webkit_web_view_new (); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_events), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), self->priv->webview); + gtk_container_add (GTK_CONTAINER (scrolledwindow_events), + self->priv->webview); + gtk_widget_show (self->priv->webview); filename = empathy_file_lookup ("empathy-log-window.html", "data"); gfile = g_file_new_for_path (filename); @@ -728,10 +730,6 @@ empathy_log_window_init (EmpathyLogWindow *self) g_signal_connect (self->priv->webview, "navigation-policy-decision-requested", G_CALLBACK (events_webview_handle_navigation), self); - gtk_notebook_append_page (GTK_NOTEBOOK (self->priv->notebook), - sw, gtk_label_new ("webview")); - gtk_widget_show_all (sw); - /* listen to changes to the treemodel */ g_signal_connect (self->priv->store_events, "row-inserted", G_CALLBACK (store_events_row_inserted), self); @@ -744,9 +742,6 @@ empathy_log_window_init (EmpathyLogWindow *self) g_signal_connect (self->priv->store_events, "row-has-child-toggled", G_CALLBACK (store_events_has_child_rows), self); - // debug - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->priv->notebook), TRUE); - gtk_widget_show (GTK_WIDGET (self)); } @@ -2066,15 +2061,16 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *self) /* If the Who pane doesn't contain a contact (e.g. it has many * selected, or has 'Anyone', let's try to get the contact from * the selected event. */ - view = GTK_TREE_VIEW (self->priv->treeview_events); - model = gtk_tree_view_get_model (view); - selection = gtk_tree_view_get_selection (view); + goto out; // FIXME: reimplement + // view = GTK_TREE_VIEW (self->priv->treeview_events); + // model = gtk_tree_view_get_model (view); + // selection = gtk_tree_view_get_selection (view); - if (gtk_tree_selection_count_selected_rows (selection) != 1) - goto out; + // if (gtk_tree_selection_count_selected_rows (selection) != 1) + // goto out; - if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) - goto out; + // if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) + // goto out; gtk_tree_model_get (model, &iter, COL_EVENTS_ACCOUNT, &account, @@ -2482,40 +2478,33 @@ who_row_is_separator (GtkTreeModel *model, return (type == COL_TYPE_SEPARATOR); } -static void -log_window_events_changed_cb (GtkTreeSelection *selection, - EmpathyLogWindow *self) -{ - DEBUG ("log_window_events_changed_cb"); - - log_window_update_buttons_sensitivity (self); -} - -static void -log_window_events_row_activated_cb (GtkTreeView *view, - GtkTreePath *path, - GtkTreeViewColumn *column, - EmpathyLogWindow *self) -{ - if (gtk_tree_view_row_expanded (view, path)) - gtk_tree_view_collapse_row (view, path); - else - gtk_tree_view_expand_row (view, path, FALSE); -} +// static void +// log_window_events_changed_cb (GtkTreeSelection *selection, +// EmpathyLogWindow *self) +// { +// DEBUG ("log_window_events_changed_cb"); +// +// log_window_update_buttons_sensitivity (self); +// } + +// static void +// log_window_events_row_activated_cb (GtkTreeView *view, +// GtkTreePath *path, +// GtkTreeViewColumn *column, +// EmpathyLogWindow *self) +// { +// if (gtk_tree_view_row_expanded (view, path)) +// gtk_tree_view_collapse_row (view, path); +// else +// gtk_tree_view_expand_row (view, path, FALSE); +// } static void log_window_events_setup (EmpathyLogWindow *self) { - GtkTreeView *view; GtkTreeModel *model; - GtkTreeSelection *selection; GtkTreeSortable *sortable; - GtkTreeViewColumn *column; GtkTreeStore *store; - GtkCellRenderer *cell; - - view = GTK_TREE_VIEW (self->priv->treeview_events); - selection = gtk_tree_view_get_selection (view); /* new store */ self->priv->store_events = store = gtk_tree_store_new (COL_EVENTS_COUNT, @@ -2531,49 +2520,9 @@ log_window_events_setup (EmpathyLogWindow *self) model = GTK_TREE_MODEL (store); sortable = GTK_TREE_SORTABLE (store); - gtk_tree_view_set_model (view, model); - - /* new column */ - column = gtk_tree_view_column_new (); - - cell = gtk_cell_renderer_pixbuf_new (); - gtk_tree_view_column_pack_start (column, cell, FALSE); - gtk_tree_view_column_add_attribute (column, cell, - "icon-name", COL_EVENTS_ICON); - - cell = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (column, cell, TRUE); - gtk_tree_view_column_add_attribute (column, cell, - "markup", COL_EVENTS_TEXT); - - cell = gtk_cell_renderer_text_new (); - g_object_set (cell, "xalign", 1.0, NULL); - gtk_tree_view_column_pack_end (column, cell, FALSE); - gtk_tree_view_column_add_attribute (column, cell, - "text", COL_EVENTS_PRETTY_DATE); - - gtk_tree_view_append_column (view, column); - - /* set up treeview properties */ - gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); - gtk_tree_view_set_headers_visible (view, FALSE); - gtk_tree_sortable_set_sort_column_id (sortable, COL_EVENTS_TS, GTK_SORT_ASCENDING); - - gtk_tree_view_set_enable_search (view, FALSE); - - /* set up signals */ - g_signal_connect (selection, "changed", - G_CALLBACK (log_window_events_changed_cb), - self); - - g_signal_connect (view, "row-activated", - G_CALLBACK (log_window_events_row_activated_cb), - self); - - g_object_unref (store); } static void @@ -3033,15 +2982,16 @@ log_window_what_setup (EmpathyLogWindow *self) static void log_window_maybe_expand_events (void) { - GtkTreeView *view; - GtkTreeModel *model; + // GtkTreeView *view; + // GtkTreeModel *model; - view = GTK_TREE_VIEW (log_window->priv->treeview_events); - model = gtk_tree_view_get_model (view); + // FIXME: reimplement + // view = GTK_TREE_VIEW (log_window->priv->treeview_events); + // model = gtk_tree_view_get_model (view); - /* If there's only one result, expand it */ - if (gtk_tree_model_iter_n_children (model, NULL) == 1) - gtk_tree_view_expand_all (view); + // /* If there's only one result, expand it */ + // if (gtk_tree_model_iter_n_children (model, NULL) == 1) + // gtk_tree_view_expand_all (view); } static gboolean @@ -3090,13 +3040,13 @@ log_window_got_messages_for_date_cb (GObject *manager, gpointer user_data) { Ctx *ctx = user_data; - GtkTreeView *view; - GtkTreeModel *model; - GtkTreeIter iter; + // GtkTreeView *view; + // GtkTreeModel *model; + // GtkTreeIter iter; GList *events; GList *l; GError *error = NULL; - gint n; + // gint n; if (log_window == NULL) { @@ -3170,18 +3120,18 @@ log_window_got_messages_for_date_cb (GObject *manager, } g_list_free (events); - view = GTK_TREE_VIEW (log_window->priv->treeview_events); - model = gtk_tree_view_get_model (view); - n = gtk_tree_model_iter_n_children (model, NULL) - 1; + // view = GTK_TREE_VIEW (log_window->priv->treeview_events); + // model = gtk_tree_view_get_model (view); + // n = gtk_tree_model_iter_n_children (model, NULL) - 1; - if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) - { - GtkTreePath *path; + // if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) + // { + // GtkTreePath *path; - path = gtk_tree_model_get_path (model, &iter); - gtk_tree_view_scroll_to_cell (view, path, NULL, FALSE, 0, 0); - gtk_tree_path_free (path); - } + // path = gtk_tree_model_get_path (model, &iter); + // gtk_tree_view_scroll_to_cell (view, path, NULL, FALSE, 0, 0); + // gtk_tree_path_free (path); + // } out: ctx_free (ctx); -- cgit v1.2.3 From daae637bdf6ea311c306eefe298e5760e2af22dc Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 8 Aug 2011 11:15:06 +1000 Subject: Reimplement log_window_maybe_expand_events() --- libempathy-gtk/empathy-log-window.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index cd1daac22..bb8b1ce42 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -2982,16 +2982,13 @@ log_window_what_setup (EmpathyLogWindow *self) static void log_window_maybe_expand_events (void) { - // GtkTreeView *view; - // GtkTreeModel *model; + GtkTreeModel *model = GTK_TREE_MODEL (log_window->priv->store_events); - // FIXME: reimplement - // view = GTK_TREE_VIEW (log_window->priv->treeview_events); - // model = gtk_tree_view_get_model (view); - - // /* If there's only one result, expand it */ - // if (gtk_tree_model_iter_n_children (model, NULL) == 1) - // gtk_tree_view_expand_all (view); + /* If there's only one result, expand it */ + if (gtk_tree_model_iter_n_children (model, NULL) == 1) + webkit_web_view_execute_script ( + WEBKIT_WEB_VIEW (log_window->priv->webview), + "javascript:expandAll()"); } static gboolean -- cgit v1.2.3 From a23b86b6a47b06cc9b37cafd892b73229c2d97d3 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 9 Aug 2011 11:41:11 +1000 Subject: Use this utility in the log viewer It should also be used for the Adium theme, but this also supports fonts specified in the Adium theme, which we need to support. --- libempathy-gtk/empathy-log-window.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index bb8b1ce42..fdf433307 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -123,6 +123,7 @@ struct _EmpathyLogWindowPriv gboolean selected_is_chatroom; GSettings *gsettings_chat; + GSettings *gsettings_desktop; }; static void log_window_search_entry_changed_cb (GtkWidget *entry, @@ -548,7 +549,9 @@ empathy_log_window_dispose (GObject *object) tp_clear_object (&self->priv->selected_account); tp_clear_object (&self->priv->selected_contact); tp_clear_object (&self->priv->camera_monitor); + tp_clear_object (&self->priv->gsettings_chat); + tp_clear_object (&self->priv->gsettings_desktop); tp_clear_object (&self->priv->store_events); @@ -600,6 +603,8 @@ empathy_log_window_init (EmpathyLogWindow *self) self->priv->log_manager = tpl_log_manager_dup_singleton (); self->priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA); + self->priv->gsettings_desktop = g_settings_new ( + EMPATHY_PREFS_DESKTOP_INTERFACE_SCHEMA); gtk_window_set_title (GTK_WINDOW (self), _("History")); gtk_widget_set_can_focus (GTK_WIDGET (self), FALSE); @@ -718,6 +723,10 @@ empathy_log_window_init (EmpathyLogWindow *self) self->priv->webview); gtk_widget_show (self->priv->webview); + empathy_webkit_bind_font_setting (WEBKIT_WEB_VIEW (self->priv->webview), + self->priv->gsettings_desktop, + EMPATHY_PREFS_DESKTOP_INTERFACE_FONT_NAME); + filename = empathy_file_lookup ("empathy-log-window.html", "data"); gfile = g_file_new_for_path (filename); g_free (filename); -- cgit v1.2.3 From 4133101266b116d34b04a69e9957c0502daf72e8 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 9 Aug 2011 14:05:28 +1000 Subject: Add dates to new log viewer --- libempathy-gtk/empathy-log-window.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index fdf433307..f2aafda31 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -375,16 +375,18 @@ insert_or_change_row (EmpathyLogWindow *self, GtkTreeIter *iter) { char *str = gtk_tree_path_to_string (path); - char *script, *text; + char *script, *text, *date; gtk_tree_model_get (model, iter, COL_EVENTS_TEXT, &text, + COL_EVENTS_PRETTY_DATE, &date, -1); - script = g_strdup_printf ("javascript:%s([%s], '%s');", + script = g_strdup_printf ("javascript:%s([%s], '%s', '%s');", method, g_strdelimit (str, ":", ','), - text); + text, + date); // g_print ("%s\n", script); webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), @@ -392,6 +394,7 @@ insert_or_change_row (EmpathyLogWindow *self, g_free (str); g_free (text); + g_free (date); g_free (script); } -- cgit v1.2.3 From 14899f2d17dd5943b28fb83e79aa998125159fff Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 9 Aug 2011 14:21:35 +1000 Subject: Add icons to the new log viewer --- libempathy-gtk/empathy-log-window.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index f2aafda31..ba634205b 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -375,17 +375,33 @@ insert_or_change_row (EmpathyLogWindow *self, GtkTreeIter *iter) { char *str = gtk_tree_path_to_string (path); - char *script, *text, *date; + char *script, *text, *date, *stock_icon; + char *icon = NULL; gtk_tree_model_get (model, iter, COL_EVENTS_TEXT, &text, COL_EVENTS_PRETTY_DATE, &date, + COL_EVENTS_ICON, &stock_icon, -1); - script = g_strdup_printf ("javascript:%s([%s], '%s', '%s');", + if (!tp_str_empty (stock_icon)) + { + GtkIconInfo *icon_info = gtk_icon_theme_lookup_icon ( + gtk_icon_theme_get_default (), + stock_icon, + GTK_ICON_SIZE_MENU, 0); + + if (icon_info != NULL) + icon = g_strdup (gtk_icon_info_get_filename (icon_info)); + + gtk_icon_info_free (icon_info); + } + + script = g_strdup_printf ("javascript:%s([%s], '%s', '%s', '%s');", method, g_strdelimit (str, ":", ','), text, + icon != NULL ? icon: "", date); // g_print ("%s\n", script); @@ -395,6 +411,8 @@ insert_or_change_row (EmpathyLogWindow *self, g_free (str); g_free (text); g_free (date); + g_free (stock_icon); + g_free (icon); g_free (script); } -- cgit v1.2.3 From dccd3368d1ee4d4cf4c96628f81ba4bd184e7461 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 9 Aug 2011 14:44:04 +1000 Subject: Remove old code --- libempathy-gtk/empathy-log-window.c | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index ba634205b..b0910532d 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -404,7 +404,6 @@ insert_or_change_row (EmpathyLogWindow *self, icon != NULL ? icon: "", date); - // g_print ("%s\n", script); webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), script); @@ -445,7 +444,6 @@ store_events_row_deleted (GtkTreeModel *model, script = g_strdup_printf ("javascript:deleteRow([%s]);", g_strdelimit (str, ":", ',')); - // g_print ("%s\n", script); webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), script); @@ -466,7 +464,6 @@ store_events_has_child_rows (GtkTreeModel *model, g_strdelimit (str, ":", ','), gtk_tree_model_iter_has_child (model, iter)); - // g_print ("%s\n", script); webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), script); @@ -2517,18 +2514,6 @@ who_row_is_separator (GtkTreeModel *model, // log_window_update_buttons_sensitivity (self); // } -// static void -// log_window_events_row_activated_cb (GtkTreeView *view, -// GtkTreePath *path, -// GtkTreeViewColumn *column, -// EmpathyLogWindow *self) -// { -// if (gtk_tree_view_row_expanded (view, path)) -// gtk_tree_view_collapse_row (view, path); -// else -// gtk_tree_view_expand_row (view, path, FALSE); -// } - static void log_window_events_setup (EmpathyLogWindow *self) { -- cgit v1.2.3 From 3dfc7d6b26f17b0b00762b3fe7b509d7be73b30f Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 12 Aug 2011 08:42:04 +1000 Subject: Remove unused variable --- libempathy-gtk/empathy-log-window.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index b0910532d..a27b238e5 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -2517,7 +2517,6 @@ who_row_is_separator (GtkTreeModel *model, static void log_window_events_setup (EmpathyLogWindow *self) { - GtkTreeModel *model; GtkTreeSortable *sortable; GtkTreeStore *store; @@ -2532,7 +2531,6 @@ log_window_events_setup (EmpathyLogWindow *self) TPL_TYPE_ENTITY, /* target */ TPL_TYPE_EVENT); /* event */ - model = GTK_TREE_MODEL (store); sortable = GTK_TREE_SORTABLE (store); gtk_tree_sortable_set_sort_column_id (sortable, -- cgit v1.2.3 From d5024011258a052ea3b88e95d0098f3901bb98cc Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Fri, 12 Aug 2011 08:47:48 +1000 Subject: Style fix --- libempathy-gtk/empathy-log-window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index a27b238e5..bbf9e0480 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -401,7 +401,7 @@ insert_or_change_row (EmpathyLogWindow *self, method, g_strdelimit (str, ":", ','), text, - icon != NULL ? icon: "", + icon != NULL ? icon : "", date); webkit_web_view_execute_script (WEBKIT_WEB_VIEW (self->priv->webview), -- cgit v1.2.3 From 6cf57d879945059cd974a3ee6d02d81edff47438 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 16 Aug 2011 13:38:23 +1000 Subject: Make WebKit compulsory It is now required for the log viewer, furthermore it will be required once we remove non-adium themes. --- libempathy-gtk/empathy-log-window.c | 1 - 1 file changed, 1 deletion(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index bbf9e0480..ac05740cf 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -61,7 +61,6 @@ #include "empathy-images.h" #include "empathy-theme-manager.h" #include "empathy-ui-utils.h" -// FIXME: this work forces a dependency on webkit #include "empathy-webkit-utils.h" #define DEBUG_FLAG EMPATHY_DEBUG_OTHER -- cgit v1.2.3 From 9d1f95bebe28683a23f56568539ee2c56655b80c Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 16 Aug 2011 13:55:56 +1000 Subject: Reimplement scrollToRow N.B. This has not been properly tested, because I'm not actually sure how to exhaust this codepath. --- libempathy-gtk/empathy-log-window.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index ac05740cf..b4501af57 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -3049,13 +3049,12 @@ log_window_got_messages_for_date_cb (GObject *manager, gpointer user_data) { Ctx *ctx = user_data; - // GtkTreeView *view; - // GtkTreeModel *model; - // GtkTreeIter iter; + GtkTreeModel *model; + GtkTreeIter iter; GList *events; GList *l; GError *error = NULL; - // gint n; + gint n; if (log_window == NULL) { @@ -3129,18 +3128,28 @@ log_window_got_messages_for_date_cb (GObject *manager, } g_list_free (events); - // view = GTK_TREE_VIEW (log_window->priv->treeview_events); - // model = gtk_tree_view_get_model (view); - // n = gtk_tree_model_iter_n_children (model, NULL) - 1; + model = GTK_TREE_MODEL (log_window->priv->store_events); + n = gtk_tree_model_iter_n_children (model, NULL) - 1; + + if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) + { + GtkTreePath *path; + char *str, *script; + + path = gtk_tree_model_get_path (model, &iter); + str = gtk_tree_path_to_string (path); - // if (n >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, n)) - // { - // GtkTreePath *path; + script = g_strdup_printf ("javascript:scrollToRow([%s]);", + g_strdelimit (str, ":", ',')); - // path = gtk_tree_model_get_path (model, &iter); - // gtk_tree_view_scroll_to_cell (view, path, NULL, FALSE, 0, 0); - // gtk_tree_path_free (path); - // } + webkit_web_view_execute_script ( + WEBKIT_WEB_VIEW (log_window->priv->webview), + script); + + gtk_tree_path_free (path); + g_free (str); + g_free (script); + } out: ctx_free (ctx); -- cgit v1.2.3 From ede83c3b09c25b9e08c0aa54d842d844b582e0d8 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 16 Aug 2011 16:15:38 +1000 Subject: Allow clicking on a row to select the contact Does not currently highlight the row. --- libempathy-gtk/empathy-log-window.c | 112 ++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 29 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index b4501af57..c4a260889 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -66,6 +66,8 @@ #define DEBUG_FLAG EMPATHY_DEBUG_OTHER #include +#define EMPATHY_NS "http://live.gnome.org/Empathy" + G_DEFINE_TYPE (EmpathyLogWindow, empathy_log_window, GTK_TYPE_WINDOW); struct _EmpathyLogWindowPriv @@ -105,6 +107,7 @@ struct _EmpathyLogWindowPriv TpBaseClient *observer; EmpathyContact *selected_contact; + EmpathyContact *events_contact; EmpathyCameraMonitor *camera_monitor; GBinding *button_video_binding; @@ -150,6 +153,9 @@ static void log_window_delete_menu_clicked_cb (GtkMenuItem *menuitem, static void start_spinner (void); static void log_window_create_observer (EmpathyLogWindow *window); +static gboolean log_window_events_button_press_event (GtkWidget *webview, + GdkEventButton *event, EmpathyLogWindow *self); +static void log_window_update_buttons_sensitivity (EmpathyLogWindow *self); static void empathy_account_chooser_filter_has_logs (TpAccount *account, @@ -565,6 +571,7 @@ empathy_log_window_dispose (GObject *object) tp_clear_object (&self->priv->log_manager); tp_clear_object (&self->priv->selected_account); tp_clear_object (&self->priv->selected_contact); + tp_clear_object (&self->priv->events_contact); tp_clear_object (&self->priv->camera_monitor); tp_clear_object (&self->priv->gsettings_chat); @@ -768,6 +775,11 @@ empathy_log_window_init (EmpathyLogWindow *self) g_signal_connect (self->priv->store_events, "row-has-child-toggled", G_CALLBACK (store_events_has_child_rows), self); + /* track clicked row */ + g_signal_connect (self->priv->webview, "button-press-event", + G_CALLBACK (log_window_events_button_press_event), self); + + log_window_update_buttons_sensitivity (self); gtk_widget_show (GTK_WIDGET (self)); } @@ -2039,8 +2051,10 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *self) GtkTreePath *path; gboolean profile, chat, call, video; - tp_clear_object (&self->priv->selected_contact); + profile = chat = call = video = FALSE; + tp_clear_object (&self->priv->button_video_binding); + tp_clear_object (&self->priv->selected_contact); view = GTK_TREE_VIEW (self->priv->treeview_who); model = gtk_tree_view_get_model (view); @@ -2087,27 +2101,11 @@ log_window_update_buttons_sensitivity (EmpathyLogWindow *self) /* If the Who pane doesn't contain a contact (e.g. it has many * selected, or has 'Anyone', let's try to get the contact from * the selected event. */ - goto out; // FIXME: reimplement - // view = GTK_TREE_VIEW (self->priv->treeview_events); - // model = gtk_tree_view_get_model (view); - // selection = gtk_tree_view_get_selection (view); - // if (gtk_tree_selection_count_selected_rows (selection) != 1) - // goto out; - - // if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) - // goto out; - - gtk_tree_model_get (model, &iter, - COL_EVENTS_ACCOUNT, &account, - COL_EVENTS_TARGET, &target, - -1); - - self->priv->selected_contact = empathy_contact_from_tpl_contact (account, - target); - - g_object_unref (account); - g_object_unref (target); + if (self->priv->events_contact != NULL) + self->priv->selected_contact = g_object_ref (self->priv->events_contact); + else + goto out; capabilities = empathy_contact_get_capabilities (self->priv->selected_contact); @@ -2504,14 +2502,70 @@ who_row_is_separator (GtkTreeModel *model, return (type == COL_TYPE_SEPARATOR); } -// static void -// log_window_events_changed_cb (GtkTreeSelection *selection, -// EmpathyLogWindow *self) -// { -// DEBUG ("log_window_events_changed_cb"); -// -// log_window_update_buttons_sensitivity (self); -// } +static gboolean +log_window_events_button_press_event (GtkWidget *webview, + GdkEventButton *event, + EmpathyLogWindow *self) +{ + WebKitHitTestResult *hit = webkit_web_view_get_hit_test_result ( + WEBKIT_WEB_VIEW (webview), event); + WebKitDOMNode *inner_node; + + tp_clear_object (&self->priv->events_contact); + + g_object_get (hit, + "inner-node", &inner_node, + NULL); + + if (inner_node != NULL) + { + GtkTreeModel *model = GTK_TREE_MODEL (self->priv->store_events); + WebKitDOMNode *node; + const char *path = NULL; + GtkTreeIter iter; + + /* walk back up the DOM tree looking for a node with empathy:path set */ + for (node = inner_node; node != NULL; + node = webkit_dom_node_get_parent_node (node)) + { + if (!WEBKIT_DOM_IS_ELEMENT (node)) + continue; + + path = webkit_dom_element_get_attribute_ns ( + WEBKIT_DOM_ELEMENT (node), EMPATHY_NS, "path"); + + if (!tp_str_empty (path)) + break; + } + + /* look up the contact for this path */ + if (!tp_str_empty (path) && + gtk_tree_model_get_iter_from_string (model, &iter, path)) + { + TpAccount *account; + TplEntity *target; + + gtk_tree_model_get (model, &iter, + COL_EVENTS_ACCOUNT, &account, + COL_EVENTS_TARGET, &target, + -1); + + self->priv->events_contact = empathy_contact_from_tpl_contact ( + account, target); + + g_object_unref (account); + g_object_unref (target); + } + + g_object_unref (inner_node); + } + + g_object_unref (hit); + + log_window_update_buttons_sensitivity (self); + + return FALSE; +} static void log_window_events_setup (EmpathyLogWindow *self) -- cgit v1.2.3 From dc7080f5071a9130bbd9288b50f807b41a5f9864 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Wed, 17 Aug 2011 15:44:22 +1000 Subject: Use context menu utility in log viewer --- libempathy-gtk/empathy-log-window.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'libempathy-gtk/empathy-log-window.c') diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c index c4a260889..219d0cc11 100644 --- a/libempathy-gtk/empathy-log-window.c +++ b/libempathy-gtk/empathy-log-window.c @@ -2502,13 +2502,12 @@ who_row_is_separator (GtkTreeModel *model, return (type == COL_TYPE_SEPARATOR); } -static gboolean -log_window_events_button_press_event (GtkWidget *webview, - GdkEventButton *event, - EmpathyLogWindow *self) +static void +log_window_find_row (EmpathyLogWindow *self, + GdkEventButton *event) { WebKitHitTestResult *hit = webkit_web_view_get_hit_test_result ( - WEBKIT_WEB_VIEW (webview), event); + WEBKIT_WEB_VIEW (self->priv->webview), event); WebKitDOMNode *inner_node; tp_clear_object (&self->priv->events_contact); @@ -2563,6 +2562,27 @@ log_window_events_button_press_event (GtkWidget *webview, g_object_unref (hit); log_window_update_buttons_sensitivity (self); +} + +static gboolean +log_window_events_button_press_event (GtkWidget *webview, + GdkEventButton *event, + EmpathyLogWindow *self) +{ + switch (event->button) + { + case 1: + log_window_find_row (self, event); + break; + + case 3: + empathy_webkit_context_menu_for_event ( + WEBKIT_WEB_VIEW (webview), event, 0); + return TRUE; + + default: + break; + } return FALSE; } -- cgit v1.2.3