Updated Spanish translation
[anjuta.git] / plugins / cvs-plugin / cvs-callbacks.c
blob7b15bd791c729cf4636aed75c167a26e4252678d
1 /*
2 * cvs-callbacks.c (c) 2005 Johannes Schmid
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Library General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #include "cvs-callbacks.h"
19 #include "cvs-execute.h"
20 #include "cvs-interface.h"
22 static gchar* get_log_from_textview(GtkWidget* textview)
24 gchar* log;
25 GtkTextBuffer* textbuf;
26 GtkTextIter iterbegin, iterend;
27 gchar* escaped_log;
29 textbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
30 gtk_text_buffer_get_start_iter(textbuf, &iterbegin);
31 gtk_text_buffer_get_end_iter(textbuf, &iterend) ;
32 log = gtk_text_buffer_get_text(textbuf, &iterbegin, &iterend, FALSE);
33 /* #warning FIXME: Check for escape chars in log */
34 /* Fixed. -naba*/
35 escaped_log = anjuta_util_escape_quotes (log);
36 return escaped_log;
40 static gboolean check_filename(GtkDialog* dialog, const gchar* filename)
42 if (!strlen(filename))
44 GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(dialog),
45 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO,
46 GTK_BUTTONS_CLOSE, _("Please enter a filename!"));
47 gtk_dialog_run(GTK_DIALOG(dlg));
48 gtk_widget_destroy(dlg);
49 return FALSE;
51 return TRUE;
54 static gboolean check_entry(GtkDialog* dialog, GtkWidget* entry,
55 const gchar* stringname)
57 if (!strlen(gtk_entry_get_text(GTK_ENTRY(entry))))
59 gchar* message = g_strdup_printf(_("Please fill field: %s"), stringname);
60 GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(dialog),
61 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO,
62 GTK_BUTTONS_CLOSE, "%s", message);
63 gtk_dialog_run(GTK_DIALOG(dlg));
64 gtk_widget_destroy(dlg);
65 return FALSE;
67 return TRUE;
70 static gboolean
71 is_busy (CVSPlugin* plugin, GtkDialog* dialog)
73 if (plugin->executing_command)
75 GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(dialog),
76 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO,
77 GTK_BUTTONS_CLOSE,
78 _("CVS command is running! Please wait until it is finished!"));
79 gtk_dialog_run(GTK_DIALOG(dlg));
80 gtk_widget_destroy(dlg);
81 return TRUE;
83 return FALSE;
86 CVSData* cvs_data_new(CVSPlugin* plugin, GtkBuilder* bxml)
88 CVSData* data = g_new0(CVSData, 1);
89 data->plugin = plugin;
90 data->bxml = bxml;
92 return data;
95 void cvs_data_free(CVSData* data)
97 g_free(data);
100 void
101 on_cvs_add_response(GtkDialog* dialog, gint response, CVSData* data)
103 if (is_busy(data->plugin, dialog))
104 return;
106 switch (response)
108 case GTK_RESPONSE_OK:
110 GtkWidget* binary = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_binary"));
111 GtkWidget* fileentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_add_filename"));
113 const gchar* filename = gtk_entry_get_text(GTK_ENTRY(fileentry));
114 if (!check_filename(dialog, filename))
115 break;
117 anjuta_cvs_add(ANJUTA_PLUGIN(data->plugin), filename,
118 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(binary)), NULL);
120 gtk_widget_destroy(GTK_WIDGET(dialog));
121 cvs_data_free(data);
122 break;
124 default:
125 gtk_widget_destroy (GTK_WIDGET(dialog));
126 cvs_data_free(data);
130 void
131 on_cvs_remove_response(GtkDialog* dialog, gint response, CVSData* data)
133 GFile* file;
135 if (is_busy(data->plugin, dialog))
136 return;
138 switch (response)
140 case GTK_RESPONSE_OK:
142 GtkWidget* fileentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_remove_filename"));
143 const gchar* filename = gtk_entry_get_text(GTK_ENTRY(fileentry));
145 if (!check_filename(dialog, filename))
146 break;
148 file = g_file_new_for_uri(gtk_entry_get_text(GTK_ENTRY(fileentry)));
149 if (!g_file_delete(file, NULL, NULL))
151 anjuta_util_dialog_error
152 (GTK_WINDOW(dialog),_("Unable to delete file"), NULL);
153 gtk_widget_destroy(GTK_WIDGET(dialog));
154 cvs_data_free(data);
155 break;
157 g_object_unref(G_OBJECT(file));
159 anjuta_cvs_remove(ANJUTA_PLUGIN(data->plugin), filename, NULL);
160 gtk_widget_destroy (GTK_WIDGET(dialog));
161 cvs_data_free(data);
162 break;
164 default:
165 cvs_data_free(data);
166 gtk_widget_destroy (GTK_WIDGET(dialog));
170 void
171 on_cvs_update_response(GtkDialog* dialog, gint response, CVSData* data)
173 if (is_busy(data->plugin, dialog))
174 return;
176 switch (response)
178 case GTK_RESPONSE_OK:
180 const gchar* revision;
182 GtkWidget* createdir;
183 GtkWidget* removedir;
184 GtkWidget* norecurse;
185 GtkWidget* removesticky;
186 GtkWidget* revisionentry;
187 GtkWidget* fileentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_update_filename"));
188 const gchar* filename = g_strdup(gtk_entry_get_text(GTK_ENTRY(fileentry)));
190 norecurse = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_update_norecurse"));
191 removedir = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_removedir"));
192 createdir = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_createdir"));
193 revisionentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_update_revision"));
194 revision = gtk_entry_get_text(GTK_ENTRY(revisionentry));
195 removesticky = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_removesticky"));
197 if (!check_filename(dialog, filename))
198 break;
200 anjuta_cvs_update(ANJUTA_PLUGIN(data->plugin), filename,
201 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse)),
202 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(removedir)),
203 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(createdir)),
204 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(removesticky)),
205 revision, NULL);
207 cvs_data_free(data);
208 gtk_widget_destroy(GTK_WIDGET(dialog));
209 break;
211 default:
212 gtk_widget_destroy(GTK_WIDGET(dialog));
213 cvs_data_free(data);
214 break;
218 void
219 on_cvs_commit_response(GtkDialog* dialog, gint response, CVSData* data)
221 if (is_busy(data->plugin, dialog))
222 return;
224 switch (response)
226 case GTK_RESPONSE_OK:
228 gchar* log;
229 const gchar* rev;
230 GtkWidget* logtext;
231 GtkWidget* revisionentry;
232 GtkWidget* norecurse;
233 GtkWidget* fileentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_commit_filename"));
234 const gchar* filename = gtk_entry_get_text(GTK_ENTRY(fileentry));
236 logtext = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_commit_log"));
237 log = get_log_from_textview(logtext);
238 if (!g_utf8_strlen(log, -1))
240 gint result;
241 GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(dialog),
242 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO,
243 GTK_BUTTONS_YES_NO,
244 _("Are you sure that you want to pass an empty log message?"));
245 result = gtk_dialog_run(GTK_DIALOG(dlg));
246 if (result == GTK_RESPONSE_NO)
248 gtk_widget_hide(dlg);
249 gtk_widget_destroy(dlg);
250 break;
252 gtk_widget_destroy(dlg);
255 revisionentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_commit_revision"));
256 rev = gtk_entry_get_text(GTK_ENTRY(revisionentry));
258 norecurse = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_commit_norecurse"));
260 if (!check_filename(dialog, filename))
261 break;
263 anjuta_cvs_commit(ANJUTA_PLUGIN(data->plugin), filename, log, rev,
264 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse)), NULL);
266 cvs_data_free(data);
267 gtk_widget_destroy(GTK_WIDGET(dialog));
268 break;
270 default:
271 gtk_widget_destroy (GTK_WIDGET(dialog));
272 cvs_data_free(data);
273 break;
277 void
278 on_cvs_diff_response(GtkDialog* dialog, gint response, CVSData* data)
280 if (is_busy(data->plugin, dialog))
281 return;
283 switch (response)
285 case GTK_RESPONSE_OK:
287 const gchar* rev;
288 int diff_type_nr;
289 gboolean unified = FALSE;
290 gboolean patch_style = FALSE;
292 GtkWidget* norecurse;
293 GtkWidget* revisionentry;
294 GtkWidget* diff_type;
296 GtkWidget* fileentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_diff_filename"));
297 const gchar* filename = g_strdup(gtk_entry_get_text(GTK_ENTRY(fileentry)));
300 revisionentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_diff_revision"));
301 rev = gtk_entry_get_text(GTK_ENTRY(revisionentry));
302 norecurse = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_diff_norecurse"));
304 diff_type = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_diff_type"));
305 diff_type_nr = gtk_combo_box_get_active(GTK_COMBO_BOX(diff_type));
306 if (diff_type_nr == DIFF_PATCH)
308 unified = TRUE;
309 /* FIXME: rdiff do not take -u in my cvs */
310 /* diff = "rdiff"; */
313 if (!check_filename(dialog, filename))
314 break;
316 anjuta_cvs_diff(ANJUTA_PLUGIN(data->plugin), filename, rev,
317 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse)), patch_style,
318 unified, NULL);
320 cvs_data_free(data);
321 gtk_widget_destroy (GTK_WIDGET(dialog));
322 break;
324 default:
325 cvs_data_free(data);
326 gtk_widget_destroy (GTK_WIDGET(dialog));
327 break;
331 void
332 on_cvs_status_response(GtkDialog* dialog, gint response, CVSData* data)
334 if (is_busy(data->plugin, dialog))
335 return;
337 switch (response)
339 case GTK_RESPONSE_OK:
341 GtkWidget* norecurse;
342 GtkWidget* verbose;
343 GtkWidget* fileentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_status_filename"));
344 const gchar* filename = gtk_entry_get_text(GTK_ENTRY(fileentry));
346 norecurse = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_status_norecurse"));
347 verbose = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_status_verbose"));
350 if (!check_filename(dialog, filename))
351 break;
353 anjuta_cvs_status(ANJUTA_PLUGIN(data->plugin), filename,
354 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse)),
355 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(verbose)), NULL);
357 cvs_data_free(data);
358 gtk_widget_destroy (GTK_WIDGET(dialog));
359 break;
361 default:
362 cvs_data_free(data);
363 gtk_widget_destroy (GTK_WIDGET(dialog));
364 break;
368 void
369 on_cvs_log_response(GtkDialog* dialog, gint response, CVSData* data)
371 if (is_busy(data->plugin, dialog))
372 return;
374 switch (response)
376 case GTK_RESPONSE_OK:
378 const gchar* filename;
379 GtkWidget* norecurse;
380 GtkWidget* verbose;
381 GtkWidget* fileentry;
383 norecurse = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_logdialog_norecurse"));
384 verbose = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_logdialog_verbose"));
386 fileentry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_logdialog_filename"));
387 filename = gtk_entry_get_text(GTK_ENTRY(fileentry));
388 if (!check_filename(dialog, filename))
389 break;
391 anjuta_cvs_log(ANJUTA_PLUGIN(data->plugin), filename,
392 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse)),
393 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(verbose)), NULL);
396 cvs_data_free(data);
397 gtk_widget_destroy (GTK_WIDGET(dialog));
398 break;
400 default:
401 cvs_data_free(data);
402 gtk_widget_destroy (GTK_WIDGET(dialog));
403 break;
407 void
408 on_cvs_import_response(GtkDialog* dialog, gint response, CVSData* data)
410 gchar* dirname = NULL;
411 if (is_busy(data->plugin, dialog))
412 return;
414 switch (response)
416 case GTK_RESPONSE_OK:
418 GtkWidget* username;
419 GtkWidget* password;
420 GtkWidget* cvsroot_entry;
421 GtkWidget* module_entry;
422 GtkWidget* vendortag;
423 GtkWidget* releasetag;
424 GtkWidget* logtext;
425 GtkWidget* typecombo;
426 GtkFileChooser* dir;
427 gchar* log;
429 username = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_username"));
430 password = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_password"));
432 cvsroot_entry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_cvsroot"));
433 if (!check_entry(dialog, cvsroot_entry, _("CVSROOT")))
434 break;
435 module_entry = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_module"));
436 if (!check_entry(dialog, module_entry, _("Module")))
437 break;
438 vendortag = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_vendor"));
439 if (!check_entry(dialog, vendortag, _("Vendor")))
440 break;
441 releasetag = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_release"));
442 if (!check_entry(dialog, releasetag, _("Release")))
443 break;
444 typecombo = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_server_type"));
445 dir = GTK_FILE_CHOOSER(gtk_builder_get_object(data->bxml, "cvs_rootdir"));
446 dirname = gtk_file_chooser_get_filename (dir);
447 if (!dirname)
448 break;
450 logtext = GTK_WIDGET(gtk_builder_get_object(data->bxml, "cvs_import_log"));
451 log = get_log_from_textview(logtext);
452 if (!strlen(log))
454 gint result;
455 GtkWidget* dlg = gtk_message_dialog_new(GTK_WINDOW(dialog),
456 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO,
457 GTK_BUTTONS_YES_NO,
458 _("Are you sure that you do not want a log message?"));
459 result = gtk_dialog_run(GTK_DIALOG(dlg));
460 gtk_widget_destroy(dlg);
461 if (result == GTK_RESPONSE_NO)
462 break;
465 anjuta_cvs_import(ANJUTA_PLUGIN(data->plugin),
466 dirname,
467 gtk_entry_get_text(GTK_ENTRY(cvsroot_entry)),
468 gtk_entry_get_text(GTK_ENTRY(module_entry)),
469 gtk_entry_get_text(GTK_ENTRY(vendortag)),
470 gtk_entry_get_text(GTK_ENTRY(releasetag)),
471 log,
472 gtk_combo_box_get_active(GTK_COMBO_BOX(typecombo)),
473 gtk_entry_get_text(GTK_ENTRY(username)),
474 gtk_entry_get_text(GTK_ENTRY(password)), NULL);
476 cvs_data_free(data);
477 gtk_widget_destroy(GTK_WIDGET(dialog));
478 break;
480 default:
481 cvs_data_free(data);
482 gtk_widget_destroy(GTK_WIDGET(dialog));
483 break;
485 g_free(dirname);