1 /*
2  * Copyright (c) 2005-2006 Jean-François Wauthy (pollux@xfce.org)
3  *
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.
8  *
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.
13  *
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17  */
18 
19 #ifdef	HAVE_CONFIG_H
20 #include <config.h>
21 #endif /* !HAVE_CONFIG_H */
22 
23 #include <gtk/gtk.h>
24 #include <libxfce4util/libxfce4util.h>
25 #include <libxfce4ui/libxfce4ui.h>
26 
27 #include <exo/exo.h>
28 
29 #include "xfburn-main-window.h"
30 #include "xfburn-device-list.h"
31 #include "xfburn-preferences-dialog.h"
32 #include "xfburn-file-browser.h"
33 #include "xfburn-compositions-notebook.h"
34 #include "xfburn-blank-dialog.h"
35 #include "xfburn-copy-cd-dialog.h"
36 #include "xfburn-copy-dvd-dialog.h"
37 #include "xfburn-burn-image-dialog.h"
38 #include "xfburn-audio-composition.h"
39 #include "xfburn-progress-dialog.h"
40 #include "xfburn-settings.h"
41 #include "xfburn-main.h"
42 #include "xfburn-utils.h"
43 
44 #define XFBURN_MAIN_WINDOW_GET_PRIVATE(obj) (xfburn_main_window_get_instance_private(obj))
45 
46 /* private struct */
47 typedef struct {
48   GSimpleActionGroup *action_map;
49   GtkBuilder *ui_manager;
50 
51   GtkWidget *menubar;
52   GtkWidget *toolbars;
53 
54   GtkWidget *vpaned;
55 
56   GtkWidget *file_browser;
57   GtkWidget *compositions_notebook;
58 
59   gboolean support_cdr;
60   gboolean support_cdrw;
61 } XfburnMainWindowPrivate;
62 
63 /* prototypes */
64 G_DEFINE_TYPE_WITH_PRIVATE (XfburnMainWindow, xfburn_main_window, GTK_TYPE_WINDOW)
65 
66 static void xfburn_main_window_finalize (GObject *obj);
67 
68 static gboolean cb_delete_main_window (XfburnMainWindow *, GdkEvent *, XfburnMainWindowPrivate *);
69 // static void cb_edit_toolbars_view (ExoToolbarsView *, gpointer);
70 
71 static void action_about (GAction *, GVariant*, XfburnMainWindow *);
72 static void action_preferences (GAction *, GVariant*, XfburnMainWindow *);
73 
74 static void action_new_data_composition (GAction *, GVariant*, XfburnMainWindow *);
75 static void action_new_audio_composition (GAction *, GVariant*, XfburnMainWindow *);
76 
77 /*
78 static void action_load (GtkAction *, XfburnMainWindow *);
79 static void action_save (GtkAction *, XfburnMainWindow *);
80 static void action_save_as (GtkAction *, XfburnMainWindow *);
81 */
82 static void action_close (GAction *, GVariant*, XfburnMainWindow *);
83 static void action_quit (GAction *, GVariant*, XfburnMainWindow *);
84 
85 static void action_blank (GAction *, GVariant*, XfburnMainWindow *);
86 static void action_copy_cd (GAction *, GVariant*, XfburnMainWindow *);
87 static void action_burn_image (GAction *, GVariant*, XfburnMainWindow *);
88 
89 //static void action_copy_dvd (GtkAction *, XfburnMainWindow *);
90 static void action_burn_dvd_image (GAction *, GVariant*, XfburnMainWindow *);
91 
92 static void action_refresh_directorybrowser (GAction *, GVariant*, XfburnMainWindow *);
93 static void action_show_filebrowser (GSimpleAction *, GVariant*, XfburnMainWindow *);
94 static void action_show_toolbar (GSimpleAction * action, GVariant*, XfburnMainWindow * window);
95 
96 /* globals */
97 static GtkWindowClass *parent_class = NULL;
98 // upgrade to
99 static const GActionEntry action_entries[] = {
100   // { "file-menu", NULL},
101   { .name = "new-data-composition", .activate = (gActionCallback)action_new_data_composition },
102   { .name = "new-audio-composition", .activate = (gActionCallback)action_new_audio_composition},
103   { .name = "close-composition", .activate = (gActionCallback)action_close},
104   { .name = "quit", .activate = (gActionCallback)action_quit},
105   // { .name = "edit-menu", .activate = NULL},
106   { .name = "preferences", .activate = (gActionCallback)action_preferences},
107   // { "action-menu", NULL},
108   { .name = "refresh", .activate = (gActionCallback)action_refresh_directorybrowser},
109   // { "help-menu", .activate = NULL},
110   { .name = "about", .activate = (gActionCallback)action_about},
111   { .name = "blank-disc", .activate = (gActionCallback)action_blank},
112   { .name = "copy-data", .activate = (gActionCallback)action_copy_cd},
113   { .name = "burn-image", .activate = (gActionCallback)action_burn_image},
114   { .name = "burn-dvd", .activate = (gActionCallback)action_burn_dvd_image},
115 };
116 
117 static const struct {
118   const gchar * target;
119   const gchar * accel[2];
120 } accelerator[] = {
121   {"new-data-composition",{"<Control><Alt>e",NULL}},
122   {"new-audio-composition",{"<Control><Alt>A",NULL}},
123 };
124 
125 /*static const GtkActionEntry action_entries[] = {
126   {"file-menu", NULL, N_("_File"), NULL, NULL, NULL},
127   /*{"new-composition", "document-new", N_("_New composition"), "", N_("Create a new composition"),},*/
128   /*{"new-composition", "document-new", N_("_New composition"), NULL, N_("Create a new composition"),
129     G_CALLBACK (action_new_data_composition),}, */
130 /*  {"new-data-composition", "xfburn-new-data-composition", N_("New data composition"), "<Control><Alt>e", N_("New data composition"),
131     G_CALLBACK (action_new_data_composition),},
132   {"new-audio-composition", "xfburn-audio-cd", N_("New audio composition"), "<Control><Alt>A", N_("New audio composition"),
133     G_CALLBACK (action_new_audio_composition),},
134   /*{"load-composition", "document-open", N_("Load composition"), NULL, N_("Load composition"),
135    G_CALLBACK (action_load),},
136   {"save-composition", "document-save", N_("Save composition"), NULL, N_("Save composition"),
137    G_CALLBACK (action_save),},
138   {"save-composition-as", "document-save"_AS, N_("Save composition as..."), NULL, N_("Save composition as"),
139    G_CALLBACK (action_save_as),},*/
140 /*  {"close-composition", "window-close", N_("Close composition"), NULL, N_("Close composition"),
141    G_CALLBACK (action_close),},
142   {"quit", "application-exit", N_("_Quit"), NULL, N_("Quit Xfburn"), G_CALLBACK (action_quit),},
143   {"edit-menu", NULL, N_("_Edit"), NULL, NULL, NULL},
144   {"preferences", "preferences-system", N_("Prefere_nces"), NULL, N_("Show preferences dialog"),
145    G_CALLBACK (action_preferences),},
146   {"action-menu", NULL, N_("_Actions"), NULL, NULL, NULL},
147   {"view-menu", NULL, N_("_View"), NULL, NULL, NULL},
148   {"refresh", "view-refresh", N_("Refresh"), NULL, N_("Refresh file list"),
149    G_CALLBACK (action_refresh_directorybrowser),},
150   {"help-menu", NULL, N_("_Help"), NULL, NULL, NULL},
151   {"about", "gtk-about", N_("_About"), NULL, N_("Display information about Xfburn"),
152    G_CALLBACK (action_about),},
153   {"blank-disc", "xfburn-blank-cdrw", N_("Blank CD-RW"), NULL, N_("Blank CD-RW"),
154    G_CALLBACK (action_blank),},
155   {"copy-data", "xfburn-data-copy", N_("Copy Data CD"), NULL, N_("Copy Data CD"),
156    G_CALLBACK (action_copy_cd),},
157   /*{"copy-audio", "xfburn-audio-copy", N_("Copy Audio CD"), NULL, N_("Copy Audio CD"),}, */
158 /*  {"burn-image", "stock_xfburn", N_("Burn Image"), NULL, N_("Burn Image"),
159    G_CALLBACK (action_burn_image),},
160 /*  {"copy-dvd", "xfburn-data-copy", N_("Copy DVD"), NULL, N_("Copy DVD"),
161    G_CALLBACK (action_copy_dvd),}, */
162 /*  {"burn-dvd", "xfburn-burn-image", N_("Burn DVD Image"), NULL, N_("Burn DVD Image"),
163    G_CALLBACK (action_burn_dvd_image),},
164 };
165 */
166 static const GActionEntry toggle_action_entries[] = {
167   { .name = "show-filebrowser", .state = "false", .change_state = (gActionCallback)action_show_filebrowser },
168   { .name = "show-toolbar", .state = "false", .change_state = (gActionCallback)action_show_toolbar },
169 };
170 /* static const GtkToggleActionEntry toggle_action_entries[] = {
171   {"show-filebrowser", NULL, N_("Show file browser"), NULL, N_("Show/hide the file browser"),
172    G_CALLBACK (action_show_filebrowser), TRUE,},
173   {"show-toolbar", NULL, N_("Show toolbar"), NULL, N_("Show/hide the toolbar"),
174    G_CALLBACK (action_show_toolbar), TRUE,},
175 }; */
176 
177 static const gchar *toolbar_actions[] = {
178   "new-data-composition",
179   "new-audio-composition",
180 /*  "load-composition",
181   "save-composition",
182   "close-composition",*/
183   "blank-disc",
184   "copy-data",
185   //"copy-audio",
186   "burn-image",
187   "copy-dvd",
188   "burn-dvd",
189   "refresh",
190   "about",
191   "preferences",
192 };
193 
194 static XfburnMainWindow *instance = NULL;
195 
196 /**************************/
197 /* XfburnMainWindow class */
198 /**************************/
199 static void
xfburn_main_window_class_init(XfburnMainWindowClass * klass)200 xfburn_main_window_class_init (XfburnMainWindowClass * klass)
201 {
202   GObjectClass *object_class = G_OBJECT_CLASS (klass);
203 
204   parent_class = g_type_class_peek_parent (klass);
205 
206   object_class->finalize = xfburn_main_window_finalize;
207 }
208 
209 static void
xfburn_main_window_finalize(GObject * obj)210 xfburn_main_window_finalize (GObject *obj)
211 {
212   if (instance)
213     instance = NULL;
214 }
215 
216 static void
xfburn_main_window_init(XfburnMainWindow * mainwin)217 xfburn_main_window_init (XfburnMainWindow * mainwin)
218 {
219   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (mainwin);
220 
221   GtkAccelGroup *accel_group;
222   gchar *file;
223 
224   GtkWidget *vbox;
225 
226   /* the window itself */
227   gtk_window_set_position (GTK_WINDOW (mainwin), GTK_WIN_POS_CENTER_ON_PARENT);
228   gtk_window_set_title (GTK_WINDOW (mainwin), "Xfburn");
229   gtk_window_set_icon_name (GTK_WINDOW (mainwin), "stock_xfburn");
230   gtk_window_resize (GTK_WINDOW (mainwin), xfburn_settings_get_int ("main-window-width", 850),
231 		     xfburn_settings_get_int ("main-window-height", 700));
232 
233   g_signal_connect (G_OBJECT (mainwin), "delete-event", G_CALLBACK (cb_delete_main_window), priv);
234 
235   /* create ui manager */
236   priv->ui_manager = gtk_builder_new ();
237   gtk_builder_set_translation_domain (priv->ui_manager, GETTEXT_PACKAGE);
238 
239   priv->action_map = g_simple_action_group_new();
240 
241   g_action_map_add_action_entries (G_ACTION_MAP (priv->action_map), action_entries, G_N_ELEMENTS(action_entries), mainwin);
242   g_action_map_add_action_entries (G_ACTION_MAP (priv->action_map), toggle_action_entries, G_N_ELEMENTS(toggle_action_entries), mainwin);
243 
244   xfce_resource_push_path (XFCE_RESOURCE_DATA, DATADIR);
245   file = xfce_resource_lookup (XFCE_RESOURCE_DATA, "xfburn/xfburn.ui");
246 
247   if (G_LIKELY (file != NULL)) {
248     GError *error = NULL;
249     if (gtk_builder_add_from_file (priv->ui_manager, file, &error) == 0) {
250       g_warning ("Unable to load %s: %s", file, error->message);
251       g_error_free (error);
252     }
253 //    gtk_ui_manager_ensure_update (priv->ui_manager);
254     g_free (file);
255   }
256   else {
257     g_warning ("Unable to locate xfburn/xfburn.ui !");
258   }
259 
260   /* accel group */
261  /* accel_group = gtk_ui_manager_get_accel_group (priv->ui_manager);
262   gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group);
263 */
264   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
265   gtk_container_add (GTK_CONTAINER (mainwin), vbox);
266   gtk_widget_show (vbox);
267 
268   /* menubar */
269   GMenuModel *menu_model = (GMenuModel*)gtk_builder_get_object (priv->ui_manager, "main-menu");
270 
271   priv->menubar = gtk_menu_bar_new_from_model (menu_model);
272   if (G_LIKELY (priv->menubar != NULL)) {
273     gtk_widget_insert_action_group (priv->menubar, "app", G_ACTION_GROUP (priv->action_map));
274     gtk_box_pack_start (GTK_BOX (vbox), priv->menubar, FALSE, FALSE, 0);
275     gtk_widget_show (priv->menubar);
276   }
277 
278   /* toolbar */
279 /*  file = xfce_resource_lookup (XFCE_RESOURCE_DATA, "xfburn/xfburn-toolbars.ui");
280 
281   if (G_LIKELY (file != NULL)) {
282     ExoToolbarsModel *model;
283     GError *error = NULL;
284 
285     model = exo_toolbars_model_new ();
286     exo_toolbars_model_set_actions (model, (gchar **) toolbar_actions, G_N_ELEMENTS (toolbar_actions));
287     if (exo_toolbars_model_load_from_file (model, file, &error)) {
288       priv->toolbars = exo_toolbars_view_new_with_model (priv->ui_manager, model);
289       gtk_box_pack_start (GTK_BOX (vbox), priv->toolbars, FALSE, FALSE, 0);
290       gtk_widget_show (priv->toolbars);
291 
292 //      g_signal_connect (G_OBJECT (priv->toolbars), "customize", G_CALLBACK (cb_edit_toolbars_view), mainwin);
293     }
294     else {
295       g_warning ("Unable to load %s: %s", file, error->message);
296       g_error_free (error);
297     }
298 
299     g_free (file);
300   }
301   else {
302     g_warning ("Unable to locate xfburn/xfburn-toolbars.ui !");
303   }
304 */
305   priv->toolbars = gtk_toolbar_new ();
306   gtk_toolbar_set_style(GTK_TOOLBAR (priv->toolbars), GTK_TOOLBAR_BOTH);
307   gtk_widget_insert_action_group (priv->toolbars, "app", G_ACTION_GROUP (priv->action_map));
308 
309   xfburn_add_button_to_toolbar (GTK_TOOLBAR (priv->toolbars),
310     "stock_xfburn-new-data-composition", _("New data composition"), "app.new-data-composition", NULL);
311 
312   xfburn_add_button_to_toolbar (GTK_TOOLBAR (priv->toolbars),
313     "stock_xfburn-audio-cd", _("New audio composition"), "app.new-audio-composition", NULL);
314 
315   gtk_toolbar_insert (GTK_TOOLBAR (priv->toolbars), gtk_separator_tool_item_new(), -1);
316 
317   xfburn_add_button_to_toolbar (GTK_TOOLBAR (priv->toolbars),
318     "stock_xfburn-blank-cdrw", _("Blank CD-RW"), "app.blank-disc", NULL);
319 
320   xfburn_add_button_to_toolbar (GTK_TOOLBAR (priv->toolbars),
321     "stock_xfburn", _("Burn Image"), "app.burn-image", NULL);
322 
323   gtk_toolbar_insert (GTK_TOOLBAR (priv->toolbars), gtk_separator_tool_item_new(), -1);
324 
325   xfburn_add_button_to_toolbar (GTK_TOOLBAR (priv->toolbars),
326     "view-refresh", _("Refresh"), "app.refresh", _("Refresh file list"));
327 
328   gtk_box_pack_start (GTK_BOX (vbox), priv->toolbars, FALSE, FALSE, 5);
329   gtk_toolbar_set_icon_size(GTK_TOOLBAR (priv->toolbars), GTK_ICON_SIZE_SMALL_TOOLBAR);
330   gtk_tool_shell_rebuild_menu(GTK_TOOL_SHELL (priv->toolbars));
331   gtk_widget_show_all (priv->toolbars);
332 
333   /* vpaned */
334   priv->vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
335   gtk_box_pack_start (GTK_BOX (vbox), priv->vpaned, TRUE, TRUE, 0);
336   gtk_widget_show (priv->vpaned);
337 
338   /* filebrowser */
339   priv->file_browser = xfburn_file_browser_new ();
340   gtk_paned_pack1 (GTK_PANED (priv->vpaned), priv->file_browser, TRUE, FALSE);
341   gtk_widget_show (priv->file_browser);
342 
343   gtk_paned_set_position (GTK_PANED (priv->file_browser), xfburn_settings_get_int ("hpaned-position", 250));
344 
345   /* compositions notebook */
346   priv->compositions_notebook = xfburn_compositions_notebook_new ();
347   gtk_widget_show (priv->compositions_notebook);
348   gtk_paned_pack2 (GTK_PANED (priv->vpaned), priv->compositions_notebook, TRUE, FALSE);
349 
350   gtk_paned_set_position (GTK_PANED (priv->vpaned), xfburn_settings_get_int ("vpaned-position", 200));
351 
352   xfce_resource_pop_path (XFCE_RESOURCE_DATA);
353 }
354 
355 /* internals */
356 /*
357 static void
358 cb_edit_toolbars_view_done (ExoToolbarsEditorDialog * dialog, ExoToolbarsView * toolbar)
359 {
360   exo_toolbars_view_set_editing (toolbar, FALSE);
361 
362   gtk_widget_destroy (GTK_WIDGET (dialog));
363 }
364 
365 static void
366 cb_edit_toolbars_view (ExoToolbarsView * toolbar, gpointer user_data)
367 {
368   GtkWidget *editor_dialog;
369   ExoToolbarsModel *model;
370   GtkUIManager *ui_manager;
371   GtkWidget *toplevel;
372 
373   g_return_if_fail (EXO_IS_TOOLBARS_VIEW (toolbar));
374 
375   exo_toolbars_view_set_editing (toolbar, TRUE);
376 
377   model = exo_toolbars_view_get_model (EXO_TOOLBARS_VIEW (toolbar));
378   toplevel = gtk_widget_get_toplevel (GTK_WIDGET (toolbar));
379   ui_manager = exo_toolbars_view_get_ui_manager (EXO_TOOLBARS_VIEW (toolbar));
380 
381   editor_dialog = exo_toolbars_editor_dialog_new_with_model (ui_manager, model);
382   gtk_window_set_destroy_with_parent (GTK_WINDOW (editor_dialog), TRUE);
383   gtk_window_set_title (GTK_WINDOW (editor_dialog), _("Toolbar Editor"));
384   gtk_window_set_transient_for (GTK_WINDOW (editor_dialog), GTK_WINDOW (toplevel));
385   gtk_widget_show (editor_dialog);
386 
387   g_signal_connect (G_OBJECT (editor_dialog), "destroy", G_CALLBACK (cb_edit_toolbars_view_done), toolbar);
388 }
389 */
390 
391 static gboolean
cb_delete_main_window(XfburnMainWindow * mainwin,GdkEvent * event,XfburnMainWindowPrivate * priv)392 cb_delete_main_window (XfburnMainWindow * mainwin, GdkEvent * event, XfburnMainWindowPrivate *priv)
393 {
394   gint x, y;
395 
396   gtk_window_get_size (GTK_WINDOW (mainwin), &x, &y);
397   xfburn_settings_set_int ("main-window-width", x);
398   xfburn_settings_set_int ("main-window-height", y);
399 
400   xfburn_settings_set_int ("vpaned-position", gtk_paned_get_position (GTK_PANED (priv->vpaned)));
401   xfburn_settings_set_int ("hpaned-position", gtk_paned_get_position (GTK_PANED (priv->file_browser)));
402   gtk_main_quit ();
403 
404   return FALSE;
405 }
406 
407 /* actions */
408 static void
action_blank(GAction * action,GVariant * param,XfburnMainWindow * window)409 action_blank (GAction * action, GVariant* param, XfburnMainWindow * window)
410 {
411   GtkWidget *dialog;
412 
413   dialog = xfburn_blank_dialog_new ();
414   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
415   gtk_dialog_run (GTK_DIALOG (dialog));
416   gtk_widget_destroy (dialog);
417 }
418 
action_copy_cd(GAction * action,GVariant * param,XfburnMainWindow * window)419 static void action_copy_cd (GAction *action, GVariant* param, XfburnMainWindow *window)
420 {
421   /*
422   GtkWidget *dialog;
423   dialog = xfburn_copy_cd_dialog_new ();
424   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
425   gtk_dialog_run (GTK_DIALOG (dialog));
426   gtk_widget_destroy (dialog);
427   */
428 }
429 
430 static void
action_burn_image(GAction * action,GVariant * param,XfburnMainWindow * window)431 action_burn_image (GAction * action, GVariant* param, XfburnMainWindow * window)
432 {
433   GtkWidget *dialog;
434 
435   dialog = xfburn_burn_image_dialog_new ();
436   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
437   gtk_dialog_run (GTK_DIALOG (dialog));
438   gtk_widget_destroy (dialog);
439 }
440 
441 /*
442 static void
443 action_copy_dvd (GtkAction * action, XfburnMainWindow * window)
444 {
445   GtkWidget *dialog;
446 
447   dialog = xfburn_copy_dvd_dialog_new ();
448   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
449   gtk_dialog_run (GTK_DIALOG (dialog));
450   gtk_widget_destroy (dialog);
451 }
452 */
453 
454 static void
action_burn_dvd_image(GAction * action,GVariant * param,XfburnMainWindow * window)455 action_burn_dvd_image (GAction * action, GVariant* param, XfburnMainWindow * window)
456 {
457 }
458 
459 /*
460 static void
461 action_load (GtkAction *action, XfburnMainWindow * window)
462 {
463   //XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
464 
465   //xfburn_data_composition_load_from_file (XFBURN_DATA_COMPOSITION (priv->data_composition), "/tmp/test.xml");
466 }
467 
468 static void
469 action_save (GtkAction *action, XfburnMainWindow * window)
470 {
471   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
472 
473   xfburn_compositions_notebook_save_composition (XFBURN_COMPOSITIONS_NOTEBOOK (priv->compositions_notebook));
474 }
475 
476 static void
477 action_save_as (GtkAction *action, XfburnMainWindow * window)
478 {
479   //XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
480 
481 }
482 */
483 
484 static void
action_close(GAction * action,GVariant * param,XfburnMainWindow * window)485 action_close (GAction *action, GVariant* param, XfburnMainWindow * window)
486 {
487   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
488 
489   xfburn_compositions_notebook_close_composition (XFBURN_COMPOSITIONS_NOTEBOOK (priv->compositions_notebook));
490 }
491 
492 static void
action_new_data_composition(GAction * action,GVariant * param,XfburnMainWindow * window)493 action_new_data_composition (GAction *action, GVariant* param, XfburnMainWindow * window)
494 {
495   xfburn_main_window_add_data_composition_with_files (window, 0, NULL);
496 }
497 
498 static void
action_new_audio_composition(GAction * action,GVariant * param,XfburnMainWindow * window)499 action_new_audio_composition (GAction *action, GVariant* param, XfburnMainWindow * window)
500 {
501   //XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
502 
503   xfburn_main_window_add_audio_composition_with_files (window, 0, NULL);
504 }
505 
506 static void
action_quit(GAction * action,GVariant * param,XfburnMainWindow * window)507 action_quit (GAction * action, GVariant* param, XfburnMainWindow * window)
508 {
509   // if (xfce_confirm (_("Are sure you want to quit?"), "application-exit", _("_Quit")))
510   gtk_main_quit ();
511 }
512 
513 static void
action_about(GAction * action,GVariant * param,XfburnMainWindow * window)514 action_about (GAction * action, GVariant* param, XfburnMainWindow * window)
515 {
516   gint x, y;
517   GdkPixbuf *icon = NULL;
518   const gchar *auth[] = { "David Mohr david@mcbf.net Author/Maintainer",
519 			  "Mario Đanić mario@libburnia-project.org Author/Maintainer",
520 			  "Jean-François Wauthy pollux@xfce.org Retired author/maintainer",
521 			  "Rene Kjellerup rk.katana.steel@gmail.com Author/GTK+3",
522 			  NULL };
523   const gchar *translators =
524     "Mohamed Magdy mohamed.m.k@gmail.com ar\n"
525     "Pau Rul lan Ferragut paurullan@bulma.net ca\n"
526     "Michal Várady miko.vaji@gmail.com cs\n"
527     "Enrico Tröger enrico.troeger@uvena.de de\n"
528     "Fabian Nowak timstery@arcor.de de\n"
529     "Nico Schümann nico@prog.nico22.de de\n"
530     "Stavros Giannouris stavrosg2002@freemail.gr el\n"
531     "Jeff Bailes thepizzaking@gmail.com en_GB\n"
532     "Diego Rodriguez dieymir@yahoo.es es\n"
533     "Kristjan Siimson kristjan.siimson@gmail.com et\n"
534     "Piarres Beobide pi@beobide.net eu\n"
535     "Jari Rahkonen jari.rahkonen@pp1.inet.fi fi\n"
536     "Etienne Collet xanaxlnx@gmail.com fr\n"
537     "Maximilian Schleiss maximilian@xfce.org fr\n"
538     "Attila Szervác sas@321.hu hu\n"
539     "Daichi Kawahata daichi@xfce.org ja\n"
540     "ByungHyun Choi byunghyun.choi@debianusers.org kr\n"
541     "Mantas mantaz@users.sourceforge.net lt\n"
542     "Rihards Prieditis RPrieditis@inbox.lv lv\n"
543     "Terje Uriansrud ter@operamail.com nb_NO\n"
544     "Stephan Arts psybsd@gmail.com nl\n"
545     "Szymon Kałasz szymon_maestro@gazeta.pl pl\n"
546     "Fábio Nogueira deb-user-ba@ubuntu.com pt_BR\n"
547     "Og Maciel omaciel@xfce.org pt_BR\n"
548     "Nuno Miguel nunis@netcabo.pt pt_PT\n"
549     "Sergey Fedoseev fedoseev.sergey@gmail.com ru\n"
550     "Besnik Bleta besnik@programeshqip.org sq\n"
551     "Maxim V. Dziumanenko mvd@mylinux.com.ua uk\n"
552     "Dmitry Nikitin  uk\n"
553     "ﻢﺤﻣﺩ ﻊﻠﻳ ﺎﻠﻤﻜﻳ makki.ma@gmail.com ur\n"
554     "正龙 赵 longer.zhao@gmail.com zh_CN\n"
555     "Cosmo Chene cosmolax@gmail.com zh_TW\n";
556 
557   gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &x, &y);
558   icon = gtk_icon_theme_load_icon ( gtk_icon_theme_get_default(), "media-optical", x, GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
559   if (!icon)
560     icon = gtk_icon_theme_load_icon ( gtk_icon_theme_get_default(), "media-cdrom", x, GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
561   if (!icon)
562     icon = gtk_icon_theme_load_icon ( gtk_icon_theme_get_default(), "media-optical", x, GTK_ICON_LOOKUP_GENERIC_FALLBACK, NULL);
563 
564 #if !GTK_CHECK_VERSION (2, 18, 0)
565   gtk_about_dialog_set_email_hook (exo_gtk_url_about_dialog_hook, NULL, NULL);
566   gtk_about_dialog_set_url_hook (exo_gtk_url_about_dialog_hook, NULL, NULL);
567 #endif
568   gtk_show_about_dialog(GTK_WINDOW (window),
569 		  "logo", icon,
570 		  "program-name", "Xfburn",
571 		  "license", xfce_get_license_text (XFCE_LICENSE_TEXT_GPL),
572 		  "version", VERSION,
573 		  "comments", _("Another cd burning GUI"),
574 		  "website", "https://docs.xfce.org/apps/xfburn",
575 		  "copyright", "2005-2008 David Mohr, Mario Đanić, Jean-François Wauthy",
576 		  "authors", auth,
577 		  "translator-credits", translators,
578 		  NULL);
579 
580   if (G_LIKELY (icon != NULL))
581     g_object_unref (G_OBJECT (icon));
582 }
583 
584 static void
action_preferences(GAction * action,GVariant * param,XfburnMainWindow * window)585 action_preferences (GAction * action, GVariant* param, XfburnMainWindow * window)
586 {
587   GtkWidget *dialog;
588 
589   dialog = xfburn_preferences_dialog_new ();
590   gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (window));
591 
592   gtk_dialog_run (GTK_DIALOG (dialog));
593   gtk_widget_destroy (dialog);
594 }
595 
596 static void
action_refresh_directorybrowser(GAction * action,GVariant * param,XfburnMainWindow * window)597 action_refresh_directorybrowser (GAction * action, GVariant* param, XfburnMainWindow * window)
598 {
599   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
600 
601   xfburn_file_browser_refresh (XFBURN_FILE_BROWSER (priv->file_browser));
602 }
603 
604 static void
action_show_filebrowser(GSimpleAction * action,GVariant * value,XfburnMainWindow * window)605 action_show_filebrowser (GSimpleAction * action, GVariant* value, XfburnMainWindow * window)
606 {
607   if(g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN))
608     g_simple_action_set_state (action, value);
609 
610   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
611   GAction *file = g_action_map_lookup_action(G_ACTION_MAP(priv->action_map), "show-filebrowser");
612   gboolean toggle = g_variant_get_boolean  (g_action_get_state (file));
613   xfburn_settings_set_boolean ("show-filebrowser", toggle);
614 
615   if ( toggle ) {
616     gtk_widget_show (priv->file_browser);
617   }
618   else {
619     gtk_widget_hide (priv->file_browser);
620   }
621 }
622 
623 static void
action_show_toolbar(GSimpleAction * action,GVariant * value,XfburnMainWindow * window)624 action_show_toolbar (GSimpleAction * action, GVariant* value, XfburnMainWindow * window)
625 {
626   if(g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN))
627     g_simple_action_set_state (action, value);
628   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
629   GAction *tool = g_action_map_lookup_action(G_ACTION_MAP(priv->action_map), "show-toolbar");
630   gboolean toggle = g_variant_get_boolean (g_action_get_state (tool));
631 
632   xfburn_settings_set_boolean ("show-toolbar", toggle);
633 
634   if ( toggle ) {
635     gtk_widget_show (priv->toolbars);
636   }
637   else {
638     gtk_widget_hide (priv->toolbars);
639   }
640 }
641 
642 
643 /******************/
644 /* public methods */
645 /******************/
646 GtkWidget *
xfburn_main_window_new(void)647 xfburn_main_window_new (void)
648 {
649   GtkWidget *obj;
650 
651   if (G_UNLIKELY (instance)) {
652     g_error ("An instance of XfburnMainWindow has already been created");
653     return NULL;
654   }
655 
656   obj = gtk_widget_new (xfburn_main_window_get_type (), NULL);
657 
658   if (obj) {
659     XfburnMainWindow *win;
660     XfburnMainWindowPrivate *priv;
661     GAction *action;
662     GActionMap *action_map;
663     GList *device = NULL;
664     XfburnDeviceList *devlist;
665 
666     instance = win = XFBURN_MAIN_WINDOW (obj);
667     priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (win);
668     action_map = G_ACTION_MAP (priv->action_map);
669     /* load settings */
670     action = g_action_map_lookup_action (action_map, "show-filebrowser");
671     g_action_change_state (action, g_variant_new_boolean (xfburn_settings_get_boolean ("show-filebrowser", FALSE)));
672     action = g_action_map_lookup_action (action_map, "show-toolbar");
673     g_action_change_state (action, g_variant_new_boolean (xfburn_settings_get_boolean ("show-toolbar", FALSE)));
674    /* action = gtk_action_group_get_action (priv->action_group, "save-composition");
675     gtk_action_set_sensitive (GTK_ACTION (action), FALSE);*/
676 
677     /* disable action that cannot be used due to device */
678 
679     devlist = xfburn_device_list_new ();
680     g_object_get (G_OBJECT (devlist), "devices", &device, NULL);
681     g_object_unref (devlist);
682 
683     /* FIXME: this is really outdated behavior. Needs to get rewritten */
684     while (device != NULL) {
685       XfburnDevice *device_info = (XfburnDevice *) device->data;
686       gboolean cdr, cdrw;
687 
688       g_object_get (G_OBJECT (device_info), "cdr", &cdr, "cdrw", &cdrw, NULL);
689 
690       if (cdr)
691         priv->support_cdr = TRUE;
692       if (cdrw)
693         priv->support_cdrw = TRUE;
694 
695       device = g_list_next (device);
696     }
697 
698     if (!priv->support_cdr) {
699       action = g_action_map_lookup_action (action_map, "copy-data");
700       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
701       action = g_action_map_lookup_action (action_map, "copy-audio");
702       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
703       action = g_action_map_lookup_action (action_map, "burn-image");
704       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
705     }
706     if (!priv->support_cdrw) {
707       action = g_action_map_lookup_action (action_map, "blank-disc");
708       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
709     }
710 
711     /* show welcome tab */
712     xfburn_compositions_notebook_add_welcome_tab (XFBURN_COMPOSITIONS_NOTEBOOK (priv->compositions_notebook), action_map);
713   }
714 
715   return obj;
716 }
717 
718 XfburnMainWindow *
xfburn_main_window_get_instance(void)719 xfburn_main_window_get_instance (void)
720 {
721   if (!instance)
722     g_warning ("No existing instance of XfburnMainWindow");
723 
724   return instance;
725 }
726 /*
727 GtkUIManager *
728 xfburn_main_window_get_ui_manager (XfburnMainWindow *window)
729 {
730   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
731 
732   return priv->ui_manager;
733 }
734 */
735 XfburnFileBrowser *
xfburn_main_window_get_file_browser(XfburnMainWindow * window)736 xfburn_main_window_get_file_browser (XfburnMainWindow *window)
737 {
738   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
739 
740   return XFBURN_FILE_BROWSER (priv->file_browser);
741 }
742 
743 void
xfburn_main_window_add_data_composition_with_files(XfburnMainWindow * window,int filec,char ** filenames)744 xfburn_main_window_add_data_composition_with_files (XfburnMainWindow *window, int filec, char **filenames)
745 {
746   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
747   XfburnComposition *comp;
748   GSList * filelist;
749 
750   comp = xfburn_compositions_notebook_add_composition (XFBURN_COMPOSITIONS_NOTEBOOK (priv->compositions_notebook), XFBURN_DATA_COMPOSITION);
751 
752   filelist = xfburn_make_abosulet_file_list (filec, filenames);
753   xfburn_data_composition_add_files (XFBURN_DATA_COMPOSITION (comp), filelist);
754 }
755 
756 void
xfburn_main_window_add_audio_composition_with_files(XfburnMainWindow * window,int filec,char ** filenames)757 xfburn_main_window_add_audio_composition_with_files (XfburnMainWindow *window, int filec, char **filenames)
758 {
759   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
760   XfburnComposition *comp;
761   GSList * filelist;
762 
763   comp = xfburn_compositions_notebook_add_composition (XFBURN_COMPOSITIONS_NOTEBOOK (priv->compositions_notebook), XFBURN_AUDIO_COMPOSITION);
764   filelist = xfburn_make_abosulet_file_list (filec, filenames);
765   xfburn_audio_composition_add_files (XFBURN_AUDIO_COMPOSITION (comp), filelist);
766 }
767 
768 gboolean
xfburn_main_window_support_cdr(XfburnMainWindow * window)769 xfburn_main_window_support_cdr (XfburnMainWindow *window)
770 {
771   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
772 
773   return priv->support_cdr;
774 }
775 
776 gboolean
xfburn_main_window_support_cdrw(XfburnMainWindow * window)777 xfburn_main_window_support_cdrw (XfburnMainWindow *window)
778 {
779   XfburnMainWindowPrivate *priv = XFBURN_MAIN_WINDOW_GET_PRIVATE (window);
780 
781   return priv->support_cdrw;
782 }
783