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