Add progress handling to GitCommand
[anjuta-git-plugin.git] / plugins / subversion / subversion-diff-dialog.c
blobeb008a32b6ec5c4aa3009c8ffee15b21bdadf11a
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>
6 * Portions based on the original Subversion plugin
7 * Copyright (C) Johannes Schmid 2005
8 *
9 * anjuta is free software.
11 * You may redistribute it and/or modify it under the terms of the
12 * GNU General Public License, as published by the Free Software
13 * Foundation; either version 2 of the License, or (at your option)
14 * any later version.
16 * anjuta is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19 * See the GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with anjuta. If not, write to:
23 * The Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor
25 * Boston, MA 02110-1301, USA.
28 #include "subversion-diff-dialog.h"
30 static void
31 on_subversion_diff_response(GtkDialog* dialog, gint response, SubversionData* data)
33 GtkWidget *diff_path_entry;
34 GtkWidget *diff_no_recursive_check;
35 GtkWidget *diff_revision_entry;
36 GtkWidget *diff_save_open_files_check;
37 const gchar *path;
38 const gchar *revision_text;
39 glong revision;
40 IAnjutaDocumentManager *docman;
41 gchar *filename;
42 gchar *editor_name;
43 IAnjutaEditor *editor;
44 SvnDiffCommand *diff_command;
45 guint pulse_timer_id;
47 switch (response)
49 case GTK_RESPONSE_OK:
51 diff_path_entry = glade_xml_get_widget (data->gxml,
52 "diff_path_entry");
53 diff_no_recursive_check = glade_xml_get_widget (data->gxml,
54 "diff_no_recursive_check");
55 diff_revision_entry = glade_xml_get_widget (data->gxml,
56 "diff_revision_entry");
57 diff_save_open_files_check = glade_xml_get_widget (data->gxml,
58 "diff_save_open_files_check");
59 path = g_strdup (gtk_entry_get_text (GTK_ENTRY (diff_path_entry)));
60 revision_text = gtk_entry_get_text (GTK_ENTRY (diff_revision_entry));
61 revision = atol (revision_text);
63 if (!check_input (GTK_WIDGET (dialog), diff_path_entry,
64 _("Please enter a path.")))
66 break;
69 docman = anjuta_shell_get_interface (ANJUTA_PLUGIN (data->plugin)->shell,
70 IAnjutaDocumentManager, NULL);
71 filename = get_filename_from_full_path ((gchar *) path);
72 editor_name = g_strdup_printf ("[Head/Working Copy] %s.diff",
73 filename);
74 editor = ianjuta_document_manager_add_buffer(docman, editor_name,
75 "", NULL);
77 g_free (filename);
78 g_free (editor_name);
80 diff_command = svn_diff_command_new ((gchar *) path,
81 SVN_DIFF_REVISION_NONE,
82 SVN_DIFF_REVISION_NONE,
83 !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (diff_no_recursive_check)));
85 pulse_timer_id = status_bar_progress_pulse (data->plugin,
86 _("Subversion: "
87 "Retrieving "
88 "diff..."));
90 g_signal_connect (G_OBJECT (diff_command), "command-finished",
91 G_CALLBACK (stop_status_bar_progress_pulse),
92 GUINT_TO_POINTER (pulse_timer_id));
95 g_signal_connect (G_OBJECT (diff_command), "command-finished",
96 G_CALLBACK (on_diff_command_finished),
97 data->plugin);
99 g_signal_connect (G_OBJECT (diff_command), "data-arrived",
100 G_CALLBACK (send_diff_command_output_to_editor),
101 editor);
103 g_object_weak_ref (G_OBJECT (editor),
104 (GWeakNotify) disconnect_data_arrived_signals,
105 diff_command);
107 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (diff_save_open_files_check)))
108 ianjuta_file_savable_save (IANJUTA_FILE_SAVABLE (docman), NULL);
110 anjuta_command_start (ANJUTA_COMMAND (diff_command));
112 subversion_data_free(data);
113 gtk_widget_destroy(GTK_WIDGET(dialog));
114 break;
116 default:
118 gtk_widget_destroy(GTK_WIDGET(dialog));
119 subversion_data_free(data);
120 break;
125 static void
126 subversion_diff_dialog (GtkAction *action, Subversion *plugin, gchar *filename)
128 GladeXML *gxml;
129 GtkWidget *subversion_diff;
130 GtkWidget *diff_path_entry;
131 GtkWidget *diff_whole_project_check;
132 SubversionData *data;
134 gxml = glade_xml_new (GLADE_FILE, "subversion_diff", NULL);
135 subversion_diff = glade_xml_get_widget(gxml, "subversion_diff");
136 diff_path_entry = glade_xml_get_widget(gxml, "diff_path_entry");
137 diff_whole_project_check = glade_xml_get_widget(gxml,
138 "diff_whole_project_check");
139 data = subversion_data_new (plugin, gxml);
141 g_object_set_data (G_OBJECT (diff_whole_project_check), "fileentry",
142 diff_path_entry);
144 if (filename)
145 gtk_entry_set_text (GTK_ENTRY (diff_path_entry), filename);
148 g_signal_connect(G_OBJECT (diff_whole_project_check), "toggled",
149 G_CALLBACK (on_whole_project_toggled),
150 plugin);
151 init_whole_project (plugin, diff_whole_project_check, !filename);
154 g_signal_connect (G_OBJECT (subversion_diff), "response",
155 G_CALLBACK (on_subversion_diff_response),
156 data);
158 gtk_widget_show (subversion_diff);
161 void
162 on_menu_subversion_diff (GtkAction* action, Subversion* plugin)
164 subversion_diff_dialog (action, plugin, NULL);
167 void
168 on_fm_subversion_diff (GtkAction *action, Subversion *plugin)
170 subversion_diff_dialog (action, plugin, plugin->fm_current_filename);