1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) James Liggett 2007 <jrliggett@cox.net>
6 * anjuta is free software.
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)
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"
38 GtkListStore
*list_store
;
39 GtkCellRenderer
*graph_renderer
;
46 author_cell_function (GtkTreeViewColumn
*column
, GtkCellRenderer
*renderer
,
47 GtkTreeModel
*model
, GtkTreeIter
*iter
,
50 GitRevision
*revision
;
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
);
64 date_cell_function (GtkTreeViewColumn
*column
, GtkCellRenderer
*renderer
,
65 GtkTreeModel
*model
, GtkTreeIter
*iter
, gpointer user_data
)
67 GitRevision
*revision
;
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
);
81 short_log_cell_function (GtkTreeViewColumn
*column
, GtkCellRenderer
*renderer
,
82 GtkTreeModel
*model
, GtkTreeIter
*iter
,
85 GitRevision
*revision
;
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
);
99 ref_icon_cell_function (GtkTreeViewColumn
*column
, GtkCellRenderer
*renderer
,
100 GtkTreeModel
*model
, GtkTreeIter
*iter
,
103 GitRevision
*revision
;
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
);
114 g_object_set (renderer
, "stock-id", "", NULL
);
120 create_columns (LogData
*data
)
122 GtkWidget
*log_changes_view
;
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
));
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
,
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");
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
,
165 gtk_tree_view_column_set_title (column
, "Short log");
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
,
176 gtk_tree_view_column_set_title (column
, "Author");
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
,
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
);
196 on_log_command_finished (AnjutaCommand
*command
, guint return_code
,
199 GtkWidget
*log_changes_view
;
200 GtkTreeViewColumn
*graph_column
;
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
);
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
),
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
);
245 on_ref_command_finished (AnjutaCommand
*command
, guint return_code
,
254 GitLogCommand
*log_command
;
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");
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
,
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
),
287 anjuta_command_start (ANJUTA_COMMAND (log_command
));
289 g_object_unref (command
);
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
),
303 anjuta_command_start (ANJUTA_COMMAND (ref_command
));
307 on_log_vbox_destroy (GtkObject
*log_vbox
, LogData
*data
)
310 g_object_unref (data
->gxml
);
313 g_hash_table_unref (data
->refs
);
315 g_hash_table_destroy (data
->filters
);
321 on_log_message_command_finished (AnjutaCommand
*command
, guint return_code
,
324 GtkWidget
*log_text_view
;
325 GtkTextBuffer
*buffer
;
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
);
339 on_log_changes_view_row_selected (GtkTreeSelection
*selection
,
342 gboolean path_currently_selected
,
346 GitRevision
*revision
;
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
,
360 g_object_unref (revision
);
362 g_signal_connect (G_OBJECT (log_message_command
), "command-finished",
363 G_CALLBACK (on_log_message_command_finished
),
366 anjuta_command_start (ANJUTA_COMMAND (log_message_command
));
373 on_log_changes_view_query_tooltip (GtkWidget
*log_changes_view
, gint x
, gint y
,
374 gboolean keyboard_mode
, GtkTooltip
*tooltip
,
378 GtkTreeViewColumn
*ref_column
;
381 GtkTreeViewColumn
*current_column
;
385 GitRevision
*revision
;
389 GString
*tooltip_string
;
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
, ¤t_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
);
418 current_ref
= ref_list
;
419 tooltip_string
= g_string_new ("");
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");
431 case GIT_REF_TYPE_BRANCH
:
432 g_string_append_printf (tooltip_string
,
433 _("<b>Branch:</b> %s"),
436 case GIT_REF_TYPE_TAG
:
437 g_string_append_printf (tooltip_string
,
441 case GIT_REF_TYPE_REMOTE
:
442 g_string_append_printf (tooltip_string
,
443 _("<b>Remote:</b> %s"),
451 current_ref
= g_list_next (current_ref
);
454 gtk_tooltip_set_markup (tooltip
, tooltip_string
->str
);
455 g_string_free (tooltip_string
, TRUE
);
461 gtk_tree_path_free (path
);
468 on_log_changes_view_button_press_event (GtkWidget
*log_changes_view
,
469 GdkEventButton
*event
,
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
);
491 on_log_filter_entry_changed (GtkEditable
*editable
, LogData
*data
)
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
));
502 g_hash_table_remove (data
->filters
, filter_name
);
508 on_log_filter_date_changed (GtkCalendar
*calendar
, LogData
*data
)
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
));
526 on_log_filter_date_check_toggled (GtkToggleButton
*toggle_button
, LogData
*data
)
528 GtkCalendar
*calendar
;
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
);
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
);
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
),
580 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (log_filter_to_check
),
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
,
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",
626 g_object_set_data (G_OBJECT (log_filter_grep_entry
), "filter-name",
628 g_object_set_data (G_OBJECT (log_filter_from_calendar
), "filter-name",
630 g_object_set_data (G_OBJECT (log_filter_to_calendar
), "filter-name",
632 g_object_set_data (G_OBJECT (log_filter_from_entry
), "filter-name",
634 g_object_set_data (G_OBJECT (log_filter_to_entry
), "filter-name",
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
),
648 g_signal_connect (G_OBJECT (log_filter_grep_entry
), "changed",
649 G_CALLBACK (on_log_filter_entry_changed
),
652 g_signal_connect (G_OBJECT (log_filter_from_entry
), "changed",
653 G_CALLBACK (on_log_filter_entry_changed
),
656 g_signal_connect (G_OBJECT (log_filter_to_entry
), "changed",
657 G_CALLBACK (on_log_filter_entry_changed
),
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
),
666 g_signal_connect (G_OBJECT (log_filter_from_calendar
), "month-changed",
667 G_CALLBACK (on_log_filter_date_changed
),
670 g_signal_connect (G_OBJECT (log_filter_to_calendar
), "day-selected",
671 G_CALLBACK (on_log_filter_date_changed
),
674 g_signal_connect (G_OBJECT (log_filter_to_calendar
), "month-changed",
675 G_CALLBACK (on_log_filter_date_changed
),
678 g_signal_connect (G_OBJECT (log_filter_from_check
), "toggled",
679 G_CALLBACK (on_log_filter_date_check_toggled
),
682 g_signal_connect (G_OBJECT (log_filter_to_check
), "toggled",
683 G_CALLBACK (on_log_filter_date_check_toggled
),
686 g_signal_connect (G_OBJECT (log_filter_clear_button
), "clicked",
687 G_CALLBACK (on_log_filter_clear_button_clicked
),
692 git_log_window_create (Git
*plugin
)
695 GtkWidget
*log_window
;
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
;
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
,
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
),
726 g_signal_connect (G_OBJECT (log_changes_view
), "button-press-event",
727 G_CALLBACK (on_log_changes_view_button_press_event
),
731 g_signal_connect (G_OBJECT (view_log_button
), "clicked",
732 G_CALLBACK (on_view_log_button_clicked
),
735 g_object_set_data (G_OBJECT (whole_project_check
), "file-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
,
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
,
749 g_signal_connect (G_OBJECT (log_vbox
), "destroy",
750 G_CALLBACK (on_log_vbox_destroy
),
753 g_object_ref (log_vbox
);
754 gtk_container_remove (GTK_CONTAINER (log_window
), log_vbox
);
755 gtk_widget_destroy (log_window
);
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 */
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
,
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
);
786 git_log_window_clear (Git
*plugin
)
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);
801 git_log_get_selected_revision (Git
*plugin
)
804 GtkWidget
*log_changes_view
;
805 GitRevision
*revision
;
806 GtkTreeSelection
*selection
;
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");
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);