Put all of the UI utility functions into the "git" namespace.
[anjuta-git-plugin.git] / plugins / git / git-log-dialog.c
blob11a5b5db2a3579d55722965b78210433a564315f
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta
4 * Copyright (C) James Liggett 2007 <jrliggett@cox.net>
5 *
6 * anjuta is free software.
7 *
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
11 * any later version.
13 * anjuta is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 * See the GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with anjuta. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include "git-log-dialog.h"
27 enum
29 COL_REVISION,
31 NUM_COLS
34 typedef struct
36 Git *plugin;
37 GladeXML *gxml;
38 GtkListStore *list_store;
39 GtkCellRenderer *graph_renderer;
40 gchar *path;
41 GHashTable *refs;
42 GHashTable *filters;
43 } LogData;
45 static void
46 author_cell_function (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
47 GtkTreeModel *model, GtkTreeIter *iter,
48 gpointer user_data)
50 GitRevision *revision;
51 gchar *author;
53 gtk_tree_model_get (model, iter, COL_REVISION, &revision, -1);
54 author = git_revision_get_author (revision);
56 g_object_unref (revision);
58 g_object_set (renderer, "text", author, NULL);
60 g_free (author);
63 static void
64 date_cell_function (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
65 GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data)
67 GitRevision *revision;
68 gchar *date;
70 gtk_tree_model_get (model, iter, COL_REVISION, &revision, -1);
71 date = git_revision_get_formatted_date (revision);
73 g_object_unref (revision);
75 g_object_set (renderer, "text", date, NULL);
77 g_free (date);
80 static void
81 short_log_cell_function (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
82 GtkTreeModel *model, GtkTreeIter *iter,
83 gpointer user_data)
85 GitRevision *revision;
86 gchar *short_log;
88 gtk_tree_model_get (model, iter, COL_REVISION, &revision, -1);
89 short_log = git_revision_get_short_log (revision);
91 g_object_unref (revision);
93 g_object_set (renderer, "text", short_log, NULL);
95 g_free (short_log);
98 static void
99 ref_icon_cell_function (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
100 GtkTreeModel *model, GtkTreeIter *iter,
101 LogData *data)
103 GitRevision *revision;
104 gchar *sha;
106 gtk_tree_model_get (model, iter, COL_REVISION, &revision, -1);
107 sha = git_revision_get_sha (revision);
109 g_object_unref (revision);
111 if (g_hash_table_lookup_extended (data->refs, sha, NULL, NULL))
112 g_object_set (renderer, "stock-id", GTK_STOCK_INFO, NULL);
113 else
114 g_object_set (renderer, "stock-id", "", NULL);
116 g_free (sha);
119 static void
120 create_columns (LogData *data)
122 GtkWidget *log_changes_view;
123 gint font_size;
124 GtkTreeViewColumn *column;
125 GtkCellRenderer *renderer;
127 log_changes_view = glade_xml_get_widget (data->gxml, "log_changes_view");
128 font_size = PANGO_PIXELS (pango_font_description_get_size (GTK_WIDGET (log_changes_view)->style->font_desc));
130 /* Ref info */
131 column = gtk_tree_view_column_new ();
132 gtk_tree_view_append_column (GTK_TREE_VIEW (log_changes_view), column);
133 renderer = gtk_cell_renderer_pixbuf_new ();
134 gtk_tree_view_column_pack_start (column, renderer, TRUE);
135 gtk_tree_view_column_set_cell_data_func (column, renderer,
136 (GtkTreeCellDataFunc) ref_icon_cell_function,
137 data, NULL);
141 /* Graph */
142 column = gtk_tree_view_column_new ();
143 gtk_tree_view_append_column (GTK_TREE_VIEW (log_changes_view), column);
144 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
145 gtk_tree_view_column_set_min_width (column, font_size * 10);
146 gtk_tree_view_column_set_resizable (column, TRUE);
147 gtk_tree_view_column_pack_start (column, data->graph_renderer, TRUE);
148 gtk_tree_view_column_add_attribute (column, data->graph_renderer,
149 "revision", COL_REVISION);
150 gtk_tree_view_column_set_title (column, "Graph");
152 /* Short log */
153 column = gtk_tree_view_column_new ();
154 gtk_tree_view_append_column (GTK_TREE_VIEW (log_changes_view), column);
155 renderer = gtk_cell_renderer_text_new ();
156 g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
157 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
158 gtk_tree_view_column_set_min_width (column, font_size * 10);
159 gtk_tree_view_column_set_resizable (column, TRUE);
160 gtk_tree_view_column_set_expand (column, TRUE);
161 gtk_tree_view_column_pack_start (column, renderer, TRUE);
162 gtk_tree_view_column_set_cell_data_func (column, renderer,
163 (GtkTreeCellDataFunc) short_log_cell_function,
164 NULL, NULL);
165 gtk_tree_view_column_set_title (column, "Short log");
167 /* Author */
168 column = gtk_tree_view_column_new ();
169 gtk_tree_view_append_column (GTK_TREE_VIEW (log_changes_view), column);
170 renderer = gtk_cell_renderer_text_new ();
171 gtk_tree_view_column_set_resizable (column, TRUE);
172 gtk_tree_view_column_pack_start (column, renderer, TRUE);
173 gtk_tree_view_column_set_cell_data_func (column, renderer,
174 (GtkTreeCellDataFunc) author_cell_function,
175 NULL, NULL);
176 gtk_tree_view_column_set_title (column, "Author");
178 /* Date */
179 column = gtk_tree_view_column_new ();
180 gtk_tree_view_append_column (GTK_TREE_VIEW (log_changes_view), column);
181 renderer = gtk_cell_renderer_text_new ();
182 gtk_tree_view_column_set_resizable (column, TRUE);
183 gtk_tree_view_column_pack_start (column, renderer, TRUE);
184 gtk_tree_view_column_set_cell_data_func (column, renderer,
185 (GtkTreeCellDataFunc) date_cell_function,
186 NULL, NULL);
187 gtk_tree_view_column_set_title (column, "Date");
189 gtk_tree_view_set_model (GTK_TREE_VIEW (log_changes_view),
190 GTK_TREE_MODEL (data->list_store));
191 g_object_unref (data->list_store);
195 static void
196 on_log_command_finished (AnjutaCommand *command, guint return_code,
197 LogData *data)
199 GtkWidget *log_changes_view;
200 GtkTreeViewColumn *graph_column;
201 GQueue *queue;
202 GtkTreeIter iter;
203 GitRevision *revision;
205 log_changes_view = glade_xml_get_widget (data->gxml, "log_changes_view");
207 /* If the user is using any filters, hide the graph column, because
208 * we can't be assured that the graph will be correct with filtered output
209 * and Giggle's graph renderer doesn't seem to be written to handle this
210 * case, so it might crash when rendering. FIXME: look into improving it;
211 * qgit can handle this somewhat, maybe look there? */
212 graph_column = gtk_tree_view_get_column (GTK_TREE_VIEW (log_changes_view),
215 if (g_hash_table_size (data->filters) > 0)
216 gtk_tree_view_column_set_visible (graph_column, FALSE);
217 else
218 gtk_tree_view_column_set_visible (graph_column, TRUE);
220 g_object_ref (data->list_store);
221 gtk_tree_view_set_model (GTK_TREE_VIEW (log_changes_view), NULL);
223 queue = git_log_command_get_output_queue (GIT_LOG_COMMAND (command));
225 while (g_queue_peek_head (queue))
227 revision = g_queue_pop_head (queue);
229 gtk_list_store_append (data->list_store, &iter);
230 gtk_list_store_set (data->list_store, &iter, COL_REVISION, revision, -1);
231 g_object_unref (revision);
234 giggle_graph_renderer_validate_model (GIGGLE_GRAPH_RENDERER (data->graph_renderer),
235 GTK_TREE_MODEL (data->list_store),
236 COL_REVISION);
237 gtk_tree_view_set_model (GTK_TREE_VIEW (log_changes_view),
238 GTK_TREE_MODEL (data->list_store));
239 g_object_unref (data->list_store);
241 g_object_unref (command);
244 static void
245 on_ref_command_finished (AnjutaCommand *command, guint return_code,
246 LogData *data)
248 gchar *author;
249 gchar *grep;
250 gchar *since_date;
251 gchar *until_date;
252 gchar *since_commit;
253 gchar *until_commit;
254 GitLogCommand *log_command;
255 gint pulse_timer_id;
257 /* Get the filter data */
258 author = g_hash_table_lookup (data->filters, "author");
259 grep = g_hash_table_lookup (data->filters, "grep");
260 since_date = g_hash_table_lookup (data->filters, "since-date");
261 until_date = g_hash_table_lookup (data->filters, "until-date");
262 since_commit = g_hash_table_lookup (data->filters, "since-commit");
263 until_commit = g_hash_table_lookup (data->filters, "until-commit");
265 if (data->refs)
266 g_hash_table_unref (data->refs);
268 data->refs = git_ref_command_get_refs (GIT_REF_COMMAND (command));
269 log_command = git_log_command_new (data->plugin->project_root_directory,
270 author, grep, since_date, until_date,
271 since_commit, until_commit);
273 gtk_list_store_clear (data->list_store);
275 pulse_timer_id = git_status_bar_progress_pulse (data->plugin,
276 _("Git: Retrieving"
277 " log..."));
279 g_signal_connect (G_OBJECT (log_command), "command-finished",
280 G_CALLBACK (git_stop_status_bar_progress_pulse),
281 GUINT_TO_POINTER (pulse_timer_id));
283 g_signal_connect (G_OBJECT (log_command), "command-finished",
284 G_CALLBACK (on_log_command_finished),
285 data);
287 anjuta_command_start (ANJUTA_COMMAND (log_command));
289 g_object_unref (command);
292 static void
293 on_view_log_button_clicked (GtkButton *button, LogData *data)
295 GitRefCommand *ref_command;
297 ref_command = git_ref_command_new (data->plugin->project_root_directory);
299 g_signal_connect (G_OBJECT (ref_command), "command-finished",
300 G_CALLBACK (on_ref_command_finished),
301 data);
303 anjuta_command_start (ANJUTA_COMMAND (ref_command));
306 static void
307 on_log_vbox_destroy (GtkObject *log_vbox, LogData *data)
309 g_free (data->path);
310 g_object_unref (data->gxml);
312 if (data->refs)
313 g_hash_table_unref (data->refs);
315 g_hash_table_destroy (data->filters);
317 g_free (data);
320 static void
321 on_log_message_command_finished (AnjutaCommand *command, guint return_code,
322 LogData *data)
324 GtkWidget *log_text_view;
325 GtkTextBuffer *buffer;
326 gchar *log_message;
328 log_text_view = glade_xml_get_widget (data->gxml, "log_text_view");
329 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (log_text_view));
330 log_message = git_log_message_command_get_message (GIT_LOG_MESSAGE_COMMAND (command));
332 gtk_text_buffer_set_text (buffer, log_message, strlen (log_message));
334 g_free (log_message);
335 g_object_unref (command);
338 static gboolean
339 on_log_changes_view_row_selected (GtkTreeSelection *selection,
340 GtkTreeModel *model,
341 GtkTreePath *path,
342 gboolean path_currently_selected,
343 LogData *data)
345 GtkTreeIter iter;
346 GitRevision *revision;
347 gchar *sha;
348 GitLogMessageCommand *log_message_command;
350 if (!path_currently_selected)
352 gtk_tree_model_get_iter (model, &iter, path);
353 gtk_tree_model_get (model, &iter, COL_REVISION, &revision, -1);
354 sha = git_revision_get_sha (revision);
356 log_message_command = git_log_message_command_new (data->plugin->project_root_directory,
357 sha);
359 g_free (sha);
360 g_object_unref (revision);
362 g_signal_connect (G_OBJECT (log_message_command), "command-finished",
363 G_CALLBACK (on_log_message_command_finished),
364 data);
366 anjuta_command_start (ANJUTA_COMMAND (log_message_command));
369 return TRUE;
372 static gboolean
373 on_log_changes_view_query_tooltip (GtkWidget *log_changes_view, gint x, gint y,
374 gboolean keyboard_mode, GtkTooltip *tooltip,
375 LogData *data)
377 gboolean ret;
378 GtkTreeViewColumn *ref_column;
379 gint bin_x;
380 gint bin_y;
381 GtkTreeViewColumn *current_column;
382 GtkTreePath *path;
383 GtkTreeModel *model;
384 GtkTreeIter iter;
385 GitRevision *revision;
386 gchar *sha;
387 GList *ref_list;
388 GList *current_ref;
389 GString *tooltip_string;
390 gchar *ref_name;
391 GitRefType ref_type;
393 ret = FALSE;
395 ref_column = gtk_tree_view_get_column (GTK_TREE_VIEW (log_changes_view), 0);
397 gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW (log_changes_view),
398 x, y, &bin_x, &bin_y);
399 gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (log_changes_view), bin_x,
400 bin_y, &path, &current_column, NULL, NULL);
402 /* We need to be in the ref icon column */
403 if (current_column == ref_column)
405 model = gtk_tree_view_get_model (GTK_TREE_VIEW (log_changes_view));
406 gtk_tree_model_get_iter (model, &iter, path);
408 gtk_tree_model_get (model, &iter, COL_REVISION, &revision, -1);
409 sha = git_revision_get_sha (revision);
411 g_object_unref (revision);
413 ref_list = g_hash_table_lookup (data->refs, sha);
414 g_free (sha);
416 if (ref_list)
418 current_ref = ref_list;
419 tooltip_string = g_string_new ("");
421 while (current_ref)
423 ref_name = git_ref_get_name (GIT_REF (current_ref->data));
424 ref_type = git_ref_get_ref_type (GIT_REF (current_ref->data));
426 if (tooltip_string->len > 0)
427 g_string_append (tooltip_string, "\n");
429 switch (ref_type)
431 case GIT_REF_TYPE_BRANCH:
432 g_string_append_printf (tooltip_string,
433 _("<b>Branch:</b> %s"),
434 ref_name);
435 break;
436 case GIT_REF_TYPE_TAG:
437 g_string_append_printf (tooltip_string,
438 _("<b>Tag:</b> %s"),
439 ref_name);
440 break;
441 case GIT_REF_TYPE_REMOTE:
442 g_string_append_printf (tooltip_string,
443 _("<b>Remote:</b> %s"),
444 ref_name);
445 break;
446 default:
447 break;
450 g_free (ref_name);
451 current_ref = g_list_next (current_ref);
454 gtk_tooltip_set_markup (tooltip, tooltip_string->str);
455 g_string_free (tooltip_string, TRUE);
457 ret = TRUE;
461 gtk_tree_path_free (path);
462 return ret;
467 static gboolean
468 on_log_changes_view_button_press_event (GtkWidget *log_changes_view,
469 GdkEventButton *event,
470 Git *plugin)
472 GtkTreeSelection *selection;
474 if (event->type == GDK_BUTTON_PRESS)
476 if (event->button == 3)
478 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (log_changes_view));
480 if (gtk_tree_selection_count_selected_rows (selection) > 0)
482 gtk_menu_popup (GTK_MENU(plugin->log_popup_menu), NULL, NULL,
483 NULL, NULL, event->button, event->time);
487 return FALSE;
490 static void
491 on_log_filter_entry_changed (GtkEditable *editable, LogData *data)
493 gchar *filter_name;
494 gchar *text;
496 filter_name = g_object_get_data (G_OBJECT (editable), "filter-name");
497 text = gtk_editable_get_chars (editable, 0, -1);
499 if (strlen (text) > 0)
500 g_hash_table_insert (data->filters, filter_name, g_strdup (text));
501 else
502 g_hash_table_remove (data->filters, filter_name);
504 g_free (text);
507 static void
508 on_log_filter_date_changed (GtkCalendar *calendar, LogData *data)
510 gchar *filter_name;
511 guint year;
512 guint month;
513 guint day;
514 gchar *date;
516 filter_name = g_object_get_data (G_OBJECT (calendar), "filter-name");
518 gtk_calendar_get_date (calendar, &year, &month, &day);
519 date = g_strdup_printf ("%i-%02i-%02i", year, (month + 1), day);
520 g_hash_table_insert (data->filters, filter_name, g_strdup (date));
522 g_free (date);
525 static void
526 on_log_filter_date_check_toggled (GtkToggleButton *toggle_button, LogData *data)
528 GtkCalendar *calendar;
529 gchar *filter_name;
531 calendar = g_object_get_data (G_OBJECT (toggle_button), "calendar");
533 if (gtk_toggle_button_get_active (toggle_button))
535 gtk_widget_set_sensitive (GTK_WIDGET (calendar), TRUE);
537 /* Treat the currently selected date as a date to filter on */
538 on_log_filter_date_changed (calendar, data);
540 else
542 filter_name = g_object_get_data (G_OBJECT (calendar), "filter-name");
544 gtk_widget_set_sensitive (GTK_WIDGET (calendar), FALSE);
545 g_hash_table_remove (data->filters, filter_name);
549 static void
550 on_log_filter_clear_button_clicked (GtkButton *button, LogData *data)
552 GtkWidget *log_filter_author_entry;
553 GtkWidget *log_filter_grep_entry;
554 GtkWidget *log_filter_from_check;
555 GtkWidget *log_filter_to_check;
556 GtkWidget *log_filter_from_entry;
557 GtkWidget *log_filter_to_entry;
559 log_filter_author_entry = glade_xml_get_widget (data->gxml,
560 "log_filter_author_entry");
561 log_filter_grep_entry = glade_xml_get_widget (data->gxml,
562 "log_filter_grep_entry");
563 log_filter_from_check = glade_xml_get_widget (data->gxml,
564 "log_filter_from_check");
565 log_filter_to_check = glade_xml_get_widget (data->gxml,
566 "log_filter_to_check");
567 log_filter_from_entry = glade_xml_get_widget (data->gxml,
568 "log_filter_from_entry");
569 log_filter_to_entry = glade_xml_get_widget (data->gxml,
570 "log_filter_to_entry");
572 gtk_entry_set_text (GTK_ENTRY (log_filter_author_entry), "");
573 gtk_entry_set_text (GTK_ENTRY (log_filter_grep_entry), "");
574 gtk_entry_set_text (GTK_ENTRY (log_filter_from_entry), "");
575 gtk_entry_set_text (GTK_ENTRY (log_filter_from_entry), "");
576 gtk_entry_set_text (GTK_ENTRY (log_filter_to_entry), "");
578 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (log_filter_from_check),
579 FALSE);
580 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (log_filter_to_check),
581 FALSE);
585 static void
586 setup_filters (LogData *data)
588 GtkWidget *log_filter_author_entry;
589 GtkWidget *log_filter_grep_entry;
590 GtkWidget *log_filter_from_check;
591 GtkWidget *log_filter_to_check;
592 GtkWidget *log_filter_from_calendar;
593 GtkWidget *log_filter_to_calendar;
594 GtkWidget *log_filter_from_entry;
595 GtkWidget *log_filter_to_entry;
596 GtkWidget *log_filter_clear_button;
598 data->filters = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
599 g_free);
601 log_filter_author_entry = glade_xml_get_widget (data->gxml,
602 "log_filter_author_entry");
603 log_filter_grep_entry = glade_xml_get_widget (data->gxml,
604 "log_filter_grep_entry");
605 log_filter_from_check = glade_xml_get_widget (data->gxml,
606 "log_filter_from_check");
607 log_filter_to_check = glade_xml_get_widget (data->gxml,
608 "log_filter_to_check");
609 log_filter_from_calendar = glade_xml_get_widget (data->gxml,
610 "log_filter_from_calendar");
611 log_filter_to_calendar = glade_xml_get_widget (data->gxml,
612 "log_filter_to_calendar");
613 log_filter_from_entry = glade_xml_get_widget (data->gxml,
614 "log_filter_from_entry");
615 log_filter_to_entry = glade_xml_get_widget (data->gxml,
616 "log_filter_to_entry");
617 log_filter_clear_button = glade_xml_get_widget (data->gxml,
618 "log_filter_clear_button");
620 /* Each widget that has some kind of filter must have a "filter name"
621 * associated with it so that we can generically see how many filters
622 * the user asked for, so we can hide the graph column, and to get this
623 * information in a somewhat generic way. */
624 g_object_set_data (G_OBJECT (log_filter_author_entry), "filter-name",
625 "author");
626 g_object_set_data (G_OBJECT (log_filter_grep_entry), "filter-name",
627 "grep");
628 g_object_set_data (G_OBJECT (log_filter_from_calendar), "filter-name",
629 "since-date");
630 g_object_set_data (G_OBJECT (log_filter_to_calendar), "filter-name",
631 "until-date");
632 g_object_set_data (G_OBJECT (log_filter_from_entry), "filter-name",
633 "since-commit");
634 g_object_set_data (G_OBJECT (log_filter_to_entry), "filter-name",
635 "until-commit");
637 g_object_set_data (G_OBJECT (log_filter_from_check), "calendar",
638 log_filter_from_calendar);
639 g_object_set_data (G_OBJECT (log_filter_to_check), "calendar",
640 log_filter_to_calendar);
642 /* Each widget should have one generic handler that inserts its changes
643 * into the filter hash table as needed. */
644 g_signal_connect (G_OBJECT (log_filter_author_entry), "changed",
645 G_CALLBACK (on_log_filter_entry_changed),
646 data);
648 g_signal_connect (G_OBJECT (log_filter_grep_entry), "changed",
649 G_CALLBACK (on_log_filter_entry_changed),
650 data);
652 g_signal_connect (G_OBJECT (log_filter_from_entry), "changed",
653 G_CALLBACK (on_log_filter_entry_changed),
654 data);
656 g_signal_connect (G_OBJECT (log_filter_to_entry), "changed",
657 G_CALLBACK (on_log_filter_entry_changed),
658 data);
660 /* Calendars don't have one catch all signal that handles both month and
661 * day changes, so we have to connect to both signals. */
662 g_signal_connect (G_OBJECT (log_filter_from_calendar), "day-selected",
663 G_CALLBACK (on_log_filter_date_changed),
664 data);
666 g_signal_connect (G_OBJECT (log_filter_from_calendar), "month-changed",
667 G_CALLBACK (on_log_filter_date_changed),
668 data);
670 g_signal_connect (G_OBJECT (log_filter_to_calendar), "day-selected",
671 G_CALLBACK (on_log_filter_date_changed),
672 data);
674 g_signal_connect (G_OBJECT (log_filter_to_calendar), "month-changed",
675 G_CALLBACK (on_log_filter_date_changed),
676 data);
678 g_signal_connect (G_OBJECT (log_filter_from_check), "toggled",
679 G_CALLBACK (on_log_filter_date_check_toggled),
680 data);
682 g_signal_connect (G_OBJECT (log_filter_to_check), "toggled",
683 G_CALLBACK (on_log_filter_date_check_toggled),
684 data);
686 g_signal_connect (G_OBJECT (log_filter_clear_button), "clicked",
687 G_CALLBACK (on_log_filter_clear_button_clicked),
688 data);
691 GtkWidget *
692 git_log_window_create (Git *plugin)
694 LogData *data;
695 GtkWidget *log_window;
696 GtkWidget *log_vbox;
697 GtkWidget *log_changes_view;
698 GtkWidget *view_log_button;
699 GtkWidget *whole_project_check;
700 GtkWidget *path_entry;
701 GtkTreeSelection *selection;
703 data = g_new0 (LogData, 1);
704 data->gxml = glade_xml_new (GLADE_FILE, "log_window", NULL);
706 data->plugin = plugin;
707 data->path = NULL;
708 data->graph_renderer = giggle_graph_renderer_new ();
710 log_window = glade_xml_get_widget (data->gxml, "log_window");
711 log_vbox = glade_xml_get_widget (data->gxml, "log_vbox");
712 log_changes_view = glade_xml_get_widget (data->gxml, "log_changes_view");
713 whole_project_check = glade_xml_get_widget (data->gxml,
714 "whole_project_check");
715 path_entry = glade_xml_get_widget (data->gxml, "path_entry");
716 view_log_button = glade_xml_get_widget (data->gxml,
717 "view_log_button");
719 g_object_set_data (G_OBJECT (log_vbox), "log-data", data);
721 setup_filters (data);
723 g_signal_connect (G_OBJECT (log_changes_view), "query-tooltip",
724 G_CALLBACK (on_log_changes_view_query_tooltip),
725 data);
726 g_signal_connect (G_OBJECT (log_changes_view), "button-press-event",
727 G_CALLBACK (on_log_changes_view_button_press_event),
728 plugin);
731 g_signal_connect (G_OBJECT (view_log_button), "clicked",
732 G_CALLBACK (on_view_log_button_clicked),
733 data);
735 g_object_set_data (G_OBJECT (whole_project_check), "file-entry",
736 path_entry);
737 g_signal_connect (G_OBJECT (whole_project_check), "toggled",
738 G_CALLBACK (on_git_whole_project_toggled), plugin);
740 data->list_store = gtk_list_store_new (NUM_COLS,
741 G_TYPE_OBJECT);
742 create_columns (data);
744 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (log_changes_view));
745 gtk_tree_selection_set_select_function (selection,
746 (GtkTreeSelectionFunc) on_log_changes_view_row_selected,
747 data, NULL);
749 g_signal_connect (G_OBJECT (log_vbox), "destroy",
750 G_CALLBACK (on_log_vbox_destroy),
751 data);
753 g_object_ref (log_vbox);
754 gtk_container_remove (GTK_CONTAINER (log_window), log_vbox);
755 gtk_widget_destroy (log_window);
757 return log_vbox;
760 void
761 on_menu_git_log (GtkAction *action, Git *plugin)
763 anjuta_shell_present_widget (ANJUTA_PLUGIN (plugin)->shell,
764 plugin->log_viewer, NULL);
767 /* TODO: Enable when FM support is implemented */
768 #if 0
769 void
770 on_fm_subversion_log (GtkAction *action, Git *plugin)
772 GtkWidget *path_text_entry;
774 path_text_entry = glade_xml_get_widget (plugin->log_gxml,
775 "path_text_entry");
777 gtk_entry_set_text (GTK_ENTRY path_entry),
778 plugin->fm_current_filename);
780 anjuta_shell_present_widget (ANJUTA_PLUGIN (plugin)->shell,
781 plugin->log_viewer, NULL);
783 #endif
785 void
786 git_log_window_clear (Git *plugin)
788 LogData *data;
789 GtkWidget *log_text_view;
790 GtkTextBuffer *buffer;
792 data = g_object_get_data (G_OBJECT (plugin->log_viewer), "log-data");
793 log_text_view = glade_xml_get_widget (data->gxml, "log_text_view");
794 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (log_text_view));
796 gtk_list_store_clear (data->list_store);
797 gtk_text_buffer_set_text (buffer, "", 0);
800 GitRevision *
801 git_log_get_selected_revision (Git *plugin)
803 LogData *data;
804 GtkWidget *log_changes_view;
805 GitRevision *revision;
806 GtkTreeSelection *selection;
807 GtkTreeModel *model;
808 GtkTreeIter iter;
810 data = g_object_get_data (G_OBJECT (plugin->log_viewer), "log-data");
811 log_changes_view = glade_xml_get_widget (data->gxml, "log_changes_view");
812 revision = NULL;
814 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (log_changes_view));
815 model = gtk_tree_view_get_model (GTK_TREE_VIEW (log_changes_view));
817 gtk_tree_selection_get_selected (selection, NULL, &iter);
818 gtk_tree_model_get (model, &iter, COL_REVISION, &revision, -1);
820 return revision;