1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
3 * subversion-callbacks.c (c) 2005 Johannes Schmid
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Library General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 #include "subversion-callbacks.h"
20 #include "svn-backend.h"
21 #include "glade/glade.h"
22 #include <libgnomevfs/gnome-vfs.h>
24 #include <libanjuta/interfaces/ianjuta-document-manager.h>
25 #include <libanjuta/interfaces/ianjuta-editor.h>
27 static void on_editor_destroy(Subversion
* plugin
, GObject
* editor
)
29 plugin
->diff_editor
= NULL
;
32 static gchar
* get_log_from_textview(GtkWidget
* textview
)
35 GtkTextBuffer
* textbuf
;
36 GtkTextIter iterbegin
, iterend
;
39 textbuf
= gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview
));
40 gtk_text_buffer_get_start_iter(textbuf
, &iterbegin
);
41 gtk_text_buffer_get_end_iter(textbuf
, &iterend
) ;
42 log
= gtk_text_buffer_get_text(textbuf
, &iterbegin
, &iterend
, FALSE
);
43 /* #warning FIXME: Check for escape chars in log */
45 escaped_log
= anjuta_util_escape_quotes (log
);
50 static gboolean
check_filename(GtkDialog
* dialog
, const gchar
* filename
)
52 if (!strlen(filename
))
54 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
55 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
56 GTK_BUTTONS_CLOSE
, _("Please enter a filename!"));
57 gtk_dialog_run(GTK_DIALOG(dlg
));
58 gtk_widget_destroy(dlg
);
65 is_busy (GtkDialog
* dialog
, Subversion
* plugin
)
67 if (svn_backend_busy(plugin
->backend
))
69 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
70 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
72 _("Subversion command is running! Please wait until it is finished!"));
73 gtk_dialog_run(GTK_DIALOG(dlg
));
74 gtk_widget_destroy(dlg
);
80 /* static gboolean check_entry(GtkDialog* dialog, GtkWidget* entry,
81 const gchar* stringname)
83 if (!strlen(gtk_entry_get_text(GTK_ENTRY(entry))))
85 gchar* message = g_strdup_printf(_("Please fill field: %s"), stringname);
86 GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(dialog),
87 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO,
88 GTK_BUTTONS_CLOSE, message);
89 gtk_dialog_run(GTK_DIALOG(dlg));
90 gtk_widget_destroy(dlg);
97 SubversionData
* subversion_data_new(Subversion
* plugin
, GladeXML
* gxml
)
99 SubversionData
* data
= g_new0(SubversionData
, 1);
100 data
->plugin
= plugin
;
106 void subversion_data_free(SubversionData
* data
)
112 on_subversion_add_response(GtkDialog
* dialog
, gint response
, SubversionData
* data
)
117 case GTK_RESPONSE_OK
:
119 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "subversion_filename");
120 GtkWidget
* force
= glade_xml_get_widget(data
->gxml
, "subversion_force");
121 GtkWidget
* recurse
= glade_xml_get_widget(data
->gxml
, "subversion_recurse");
123 const gchar
* filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
125 if (is_busy(dialog
, data
->plugin
))
128 if (!check_filename(dialog
, filename
))
131 svn_backend_add(data
->plugin
->backend
, filename
,
132 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(force
)),
133 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(recurse
)));
135 gtk_widget_destroy(GTK_WIDGET(dialog
));
136 subversion_data_free(data
);
141 gtk_widget_destroy (GTK_WIDGET(dialog
));
142 subversion_data_free(data
);
148 on_subversion_remove_response(GtkDialog
* dialog
, gint response
, SubversionData
* data
)
152 case GTK_RESPONSE_OK
:
154 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "subversion_filename");
155 GtkWidget
* force
= glade_xml_get_widget(data
->gxml
, "subversion_force");
156 const gchar
* filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
158 if (is_busy(dialog
, data
->plugin
))
161 if (!check_filename(dialog
, filename
))
165 svn_backend_remove(data
->plugin
->backend
, filename
,
166 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(force
)));
167 subversion_data_free(data
);
168 gtk_widget_destroy (GTK_WIDGET(dialog
));
173 subversion_data_free(data
);
174 gtk_widget_destroy (GTK_WIDGET(dialog
));
180 on_subversion_update_response(GtkDialog
* dialog
, gint response
, SubversionData
* data
)
184 case GTK_RESPONSE_OK
:
186 const gchar
* revision
;
188 GtkWidget
* norecurse
;
189 GtkWidget
* revisionentry
;
190 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "subversion_filename");
191 const gchar
* filename
= g_strdup(gtk_entry_get_text(GTK_ENTRY(fileentry
)));
193 if (is_busy(dialog
, data
->plugin
))
196 norecurse
= glade_xml_get_widget(data
->gxml
, "subversion_norecurse");
197 revisionentry
= glade_xml_get_widget(data
->gxml
, "subversion_revision");
198 revision
= gtk_entry_get_text(GTK_ENTRY(revisionentry
));
200 if (!check_filename(dialog
, filename
))
203 svn_backend_update(data
->plugin
->backend
, filename
, revision
,
204 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)));
206 subversion_data_free(data
);
207 gtk_widget_destroy(GTK_WIDGET(dialog
));
212 gtk_widget_destroy(GTK_WIDGET(dialog
));
213 subversion_data_free(data
);
220 on_subversion_commit_response(GtkDialog
* dialog
, gint response
, SubversionData
* data
)
224 case GTK_RESPONSE_OK
:
228 GtkWidget
* norecurse
;
229 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "subversion_filename");
230 const gchar
* filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
232 if (is_busy(dialog
, data
->plugin
))
235 logtext
= glade_xml_get_widget(data
->gxml
, "subversion_log");
236 log
= get_log_from_textview(logtext
);
237 if (!g_utf8_strlen(log
, -1))
240 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
241 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
243 _("Are you sure that you do not want a log message?"));
244 result
= gtk_dialog_run(GTK_DIALOG(dlg
));
245 gtk_widget_destroy(dlg
);
246 if (result
== GTK_RESPONSE_NO
)
250 norecurse
= glade_xml_get_widget(data
->gxml
, "subversion_norecurse");
252 if (!check_filename(dialog
, filename
))
255 svn_backend_commit(data
->plugin
->backend
, filename
, log
,
256 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)));
257 subversion_data_free(data
);
258 gtk_widget_destroy(GTK_WIDGET(dialog
));
263 subversion_data_free(data
);
264 gtk_widget_destroy(GTK_WIDGET(dialog
));
271 on_subversion_diff_response(GtkDialog
* dialog
, gint response
, SubversionData
* data
)
275 case GTK_RESPONSE_OK
:
277 IAnjutaDocumentManager
*docman
;
278 const gchar
* revision
;
280 GtkWidget
* norecurse
;
281 GtkWidget
* revisionentry
;
282 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "subversion_filename");
283 const gchar
* filename
= g_strdup(gtk_entry_get_text(GTK_ENTRY(fileentry
)));
285 if (is_busy(dialog
, data
->plugin
))
288 norecurse
= glade_xml_get_widget(data
->gxml
, "subversion_norecurse");
289 revisionentry
= glade_xml_get_widget(data
->gxml
, "subversion_revision");
290 revision
= gtk_entry_get_text(GTK_ENTRY(revisionentry
));
292 if (!check_filename(dialog
, filename
))
295 docman
= anjuta_shell_get_interface (ANJUTA_PLUGIN (data
->plugin
)->shell
,
296 IAnjutaDocumentManager
, NULL
);
297 data
->plugin
->diff_editor
= ianjuta_document_manager_add_buffer(docman
, _("svn.diff"), "", NULL
);
298 g_object_weak_ref(G_OBJECT(data
->plugin
->diff_editor
),
299 (GWeakNotify
)(on_editor_destroy
), data
->plugin
);
301 svn_backend_diff(data
->plugin
->backend
, filename
, revision
,
302 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)));
304 subversion_data_free(data
);
305 gtk_widget_destroy(GTK_WIDGET(dialog
));
310 gtk_widget_destroy(GTK_WIDGET(dialog
));
311 subversion_data_free(data
);