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.
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
)
25 GtkTextBuffer
* textbuf
;
26 GtkTextIter iterbegin
, iterend
;
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 */
35 escaped_log
= anjuta_util_escape_quotes (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
);
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
);
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
,
78 _("CVS command is running! Please wait until it is finished!"));
79 gtk_dialog_run(GTK_DIALOG(dlg
));
80 gtk_widget_destroy(dlg
);
86 CVSData
* cvs_data_new(CVSPlugin
* plugin
, GtkBuilder
* bxml
)
88 CVSData
* data
= g_new0(CVSData
, 1);
89 data
->plugin
= plugin
;
95 void cvs_data_free(CVSData
* data
)
101 on_cvs_add_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
103 if (is_busy(data
->plugin
, dialog
))
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
))
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
));
125 gtk_widget_destroy (GTK_WIDGET(dialog
));
131 on_cvs_remove_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
135 if (is_busy(data
->plugin
, dialog
))
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
))
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
));
157 g_object_unref(G_OBJECT(file
));
159 anjuta_cvs_remove(ANJUTA_PLUGIN(data
->plugin
), filename
, NULL
);
160 gtk_widget_destroy (GTK_WIDGET(dialog
));
166 gtk_widget_destroy (GTK_WIDGET(dialog
));
171 on_cvs_update_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
173 if (is_busy(data
->plugin
, dialog
))
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
))
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
)),
208 gtk_widget_destroy(GTK_WIDGET(dialog
));
212 gtk_widget_destroy(GTK_WIDGET(dialog
));
219 on_cvs_commit_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
221 if (is_busy(data
->plugin
, dialog
))
226 case GTK_RESPONSE_OK
:
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))
241 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
242 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
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
);
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
))
263 anjuta_cvs_commit(ANJUTA_PLUGIN(data
->plugin
), filename
, log
, rev
,
264 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)), NULL
);
267 gtk_widget_destroy(GTK_WIDGET(dialog
));
271 gtk_widget_destroy (GTK_WIDGET(dialog
));
278 on_cvs_diff_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
280 if (is_busy(data
->plugin
, dialog
))
285 case GTK_RESPONSE_OK
:
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
)
309 /* FIXME: rdiff do not take -u in my cvs */
310 /* diff = "rdiff"; */
313 if (!check_filename(dialog
, filename
))
316 anjuta_cvs_diff(ANJUTA_PLUGIN(data
->plugin
), filename
, rev
,
317 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)), patch_style
,
321 gtk_widget_destroy (GTK_WIDGET(dialog
));
326 gtk_widget_destroy (GTK_WIDGET(dialog
));
332 on_cvs_status_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
334 if (is_busy(data
->plugin
, dialog
))
339 case GTK_RESPONSE_OK
:
341 GtkWidget
* norecurse
;
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
))
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
);
358 gtk_widget_destroy (GTK_WIDGET(dialog
));
363 gtk_widget_destroy (GTK_WIDGET(dialog
));
369 on_cvs_log_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
371 if (is_busy(data
->plugin
, dialog
))
376 case GTK_RESPONSE_OK
:
378 const gchar
* filename
;
379 GtkWidget
* norecurse
;
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
))
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
);
397 gtk_widget_destroy (GTK_WIDGET(dialog
));
402 gtk_widget_destroy (GTK_WIDGET(dialog
));
408 on_cvs_import_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
410 gchar
* dirname
= NULL
;
411 if (is_busy(data
->plugin
, dialog
))
416 case GTK_RESPONSE_OK
:
420 GtkWidget
* cvsroot_entry
;
421 GtkWidget
* module_entry
;
422 GtkWidget
* vendortag
;
423 GtkWidget
* releasetag
;
425 GtkWidget
* typecombo
;
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")))
435 module_entry
= GTK_WIDGET(gtk_builder_get_object(data
->bxml
, "cvs_module"));
436 if (!check_entry(dialog
, module_entry
, _("Module")))
438 vendortag
= GTK_WIDGET(gtk_builder_get_object(data
->bxml
, "cvs_vendor"));
439 if (!check_entry(dialog
, vendortag
, _("Vendor")))
441 releasetag
= GTK_WIDGET(gtk_builder_get_object(data
->bxml
, "cvs_release"));
442 if (!check_entry(dialog
, releasetag
, _("Release")))
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
);
450 logtext
= GTK_WIDGET(gtk_builder_get_object(data
->bxml
, "cvs_import_log"));
451 log
= get_log_from_textview(logtext
);
455 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
456 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
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
)
465 anjuta_cvs_import(ANJUTA_PLUGIN(data
->plugin
),
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
)),
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
);
477 gtk_widget_destroy(GTK_WIDGET(dialog
));
482 gtk_widget_destroy(GTK_WIDGET(dialog
));