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"
21 #include "glade/glade.h"
22 #include <libgnomevfs/gnome-vfs.h>
24 static gchar
* get_log_from_textview(GtkWidget
* textview
)
27 GtkTextBuffer
* textbuf
;
28 GtkTextIter iterbegin
, iterend
;
31 textbuf
= gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview
));
32 gtk_text_buffer_get_start_iter(textbuf
, &iterbegin
);
33 gtk_text_buffer_get_end_iter(textbuf
, &iterend
) ;
34 log
= gtk_text_buffer_get_text(textbuf
, &iterbegin
, &iterend
, FALSE
);
35 /* #warning FIXME: Check for escape chars in log */
37 escaped_log
= anjuta_util_escape_quotes (log
);
42 static gboolean
check_filename(GtkDialog
* dialog
, const gchar
* filename
)
44 if (!strlen(filename
))
46 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
47 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
48 GTK_BUTTONS_CLOSE
, _("Please enter a filename!"));
49 gtk_dialog_run(GTK_DIALOG(dlg
));
50 gtk_widget_destroy(dlg
);
56 static gboolean
check_entry(GtkDialog
* dialog
, GtkWidget
* entry
,
57 const gchar
* stringname
)
59 if (!strlen(gtk_entry_get_text(GTK_ENTRY(entry
))))
61 gchar
* message
= g_strdup_printf(_("Please fill field: %s"), stringname
);
62 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
63 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
64 GTK_BUTTONS_CLOSE
, message
);
65 gtk_dialog_run(GTK_DIALOG(dlg
));
66 gtk_widget_destroy(dlg
);
74 is_busy (CVSPlugin
* plugin
, GtkDialog
* dialog
)
76 if (plugin
->executing_command
)
78 GtkWidget
* dlg
= gtk_message_dialog_new(GTK_WINDOW(dialog
),
79 GTK_DIALOG_DESTROY_WITH_PARENT
, GTK_MESSAGE_INFO
,
81 _("CVS command is running! Please wait until it is finished!"));
82 gtk_dialog_run(GTK_DIALOG(dlg
));
83 gtk_widget_destroy(dlg
);
89 CVSData
* cvs_data_new(CVSPlugin
* plugin
, GladeXML
* gxml
)
91 CVSData
* data
= g_new0(CVSData
, 1);
92 data
->plugin
= plugin
;
98 void cvs_data_free(CVSData
* data
)
104 on_cvs_add_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
106 if (is_busy(data
->plugin
, dialog
))
111 case GTK_RESPONSE_OK
:
113 GtkWidget
* binary
= glade_xml_get_widget(data
->gxml
, "cvs_binary");
114 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "cvs_filename");
116 const gchar
* filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
117 if (!check_filename(dialog
, filename
))
120 anjuta_cvs_add(ANJUTA_PLUGIN(data
->plugin
), filename
,
121 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(binary
)), NULL
);
123 gtk_widget_destroy(GTK_WIDGET(dialog
));
128 gtk_widget_destroy (GTK_WIDGET(dialog
));
134 on_cvs_remove_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
136 if (is_busy(data
->plugin
, dialog
))
141 case GTK_RESPONSE_OK
:
143 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "cvs_filename");
144 const gchar
* filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
146 if (!check_filename(dialog
, filename
))
149 if (gnome_vfs_unlink(gtk_entry_get_text(GTK_ENTRY(fileentry
)))
152 anjuta_util_dialog_error
153 (GTK_WINDOW(dialog
),_("Unable to delete file"), NULL
);
154 gtk_widget_destroy(GTK_WIDGET(dialog
));
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
= glade_xml_get_widget(data
->gxml
, "cvs_filename");
188 const gchar
* filename
= g_strdup(gtk_entry_get_text(GTK_ENTRY(fileentry
)));
190 norecurse
= glade_xml_get_widget(data
->gxml
, "cvs_norecurse");
191 removedir
= glade_xml_get_widget(data
->gxml
, "cvs_removedir");
192 createdir
= glade_xml_get_widget(data
->gxml
, "cvs_createdir");
193 revisionentry
= glade_xml_get_widget(data
->gxml
, "cvs_revision");
194 revision
= gtk_entry_get_text(GTK_ENTRY(revisionentry
));
195 removesticky
= glade_xml_get_widget(data
->gxml
, "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
= glade_xml_get_widget(data
->gxml
, "cvs_filename");
234 const gchar
* filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
236 logtext
= glade_xml_get_widget(data
->gxml
, "cvs_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 do not want a 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
= glade_xml_get_widget(data
->gxml
, "cvs_revision");
256 rev
= gtk_entry_get_text(GTK_ENTRY(revisionentry
));
258 norecurse
= glade_xml_get_widget(data
->gxml
, "cvs_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
;
295 GtkWidget
* unified_diff
;
297 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "cvs_filename");
298 const gchar
* filename
= g_strdup(gtk_entry_get_text(GTK_ENTRY(fileentry
)));
301 revisionentry
= glade_xml_get_widget(data
->gxml
, "cvs_revision");
302 rev
= gtk_entry_get_text(GTK_ENTRY(revisionentry
));
303 norecurse
= glade_xml_get_widget(data
->gxml
, "cvs_norecurse");
305 diff_type
= glade_xml_get_widget(data
->gxml
, "cvs_diff_type");
306 unified_diff
= glade_xml_get_widget(data
->gxml
, "cvs_unified");
307 diff_type_nr
= gtk_combo_box_get_active(GTK_COMBO_BOX(diff_type
));
308 if (diff_type_nr
== DIFF_PATCH
)
311 /* FIXME: rdiff do not take -u in my cvs */
312 /* diff = "rdiff"; */
315 if (!check_filename(dialog
, filename
))
318 anjuta_cvs_diff(ANJUTA_PLUGIN(data
->plugin
), filename
, rev
,
319 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)), patch_style
,
323 gtk_widget_destroy (GTK_WIDGET(dialog
));
328 gtk_widget_destroy (GTK_WIDGET(dialog
));
334 on_cvs_status_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
336 if (is_busy(data
->plugin
, dialog
))
341 case GTK_RESPONSE_OK
:
343 GtkWidget
* norecurse
;
345 GtkWidget
* fileentry
= glade_xml_get_widget(data
->gxml
, "cvs_filename");
346 const gchar
* filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
348 norecurse
= glade_xml_get_widget(data
->gxml
, "cvs_norecurse");
349 verbose
= glade_xml_get_widget(data
->gxml
, "cvs_verbose");
352 if (!check_filename(dialog
, filename
))
355 anjuta_cvs_status(ANJUTA_PLUGIN(data
->plugin
), filename
,
356 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)),
357 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(verbose
)), NULL
);
360 gtk_widget_destroy (GTK_WIDGET(dialog
));
365 gtk_widget_destroy (GTK_WIDGET(dialog
));
371 on_cvs_log_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
373 if (is_busy(data
->plugin
, dialog
))
378 case GTK_RESPONSE_OK
:
380 const gchar
* filename
;
381 GtkWidget
* norecurse
;
383 GtkWidget
* fileentry
;
385 norecurse
= glade_xml_get_widget(data
->gxml
, "cvs_norecurse");
386 verbose
= glade_xml_get_widget(data
->gxml
, "cvs_verbose");
388 fileentry
= glade_xml_get_widget(data
->gxml
, "cvs_filename");
389 filename
= gtk_entry_get_text(GTK_ENTRY(fileentry
));
390 if (!check_filename(dialog
, filename
))
393 anjuta_cvs_log(ANJUTA_PLUGIN(data
->plugin
), filename
,
394 !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(norecurse
)),
395 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(verbose
)), NULL
);
399 gtk_widget_destroy (GTK_WIDGET(dialog
));
404 gtk_widget_destroy (GTK_WIDGET(dialog
));
410 on_cvs_import_response(GtkDialog
* dialog
, gint response
, CVSData
* data
)
412 if (is_busy(data
->plugin
, dialog
))
417 case GTK_RESPONSE_OK
:
421 GtkWidget
* cvsroot_entry
;
422 GtkWidget
* module_entry
;
423 GtkWidget
* vendortag
;
424 GtkWidget
* releasetag
;
426 GtkWidget
* typecombo
;
430 username
= glade_xml_get_widget(data
->gxml
, "cvs_username");
431 password
= glade_xml_get_widget(data
->gxml
, "cvs_password");
433 cvsroot_entry
= glade_xml_get_widget(data
->gxml
, "cvs_cvsroot");
434 if (!check_entry(dialog
, cvsroot_entry
, _("CVSROOT")))
436 module_entry
= glade_xml_get_widget(data
->gxml
, "cvs_module");
437 if (!check_entry(dialog
, module_entry
, _("Module")))
439 vendortag
= glade_xml_get_widget(data
->gxml
, "cvs_vendor");
440 if (!check_entry(dialog
, vendortag
, _("Vendor")))
442 releasetag
= glade_xml_get_widget(data
->gxml
, "cvs_release");
443 if (!check_entry(dialog
, releasetag
, _("Release")))
445 typecombo
= glade_xml_get_widget(data
->gxml
, "cvs_server_type");
446 direntry
= glade_xml_get_widget(data
->gxml
, "cvs_rootdir");
447 if (!check_entry(dialog
, direntry
, _("Directory")))
450 logtext
= glade_xml_get_widget(data
->gxml
, "cvs_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
),
466 gtk_entry_get_text(GTK_ENTRY(direntry
)),
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
));