1 /*
2 gnauralRecentMenu.c
3
4 Copyright (C) 20101014 Bret Logan
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include "main.h"
26 #include "gnauralXML.h"
27 #include "gnauralRecentMenu.h"
28
29 GtkRecentManager *gnauralRecentMenu_recent_manager = NULL;
30 GtkWidget *gnauralRecentMenu_recent_menu = NULL;
31
32 ///////////////////////////////////////////
33 //20101014: takes an initted GtkBuilder
gnauralRecentMenu_Init(GtkBuilder * xml)34 void gnauralRecentMenu_Init (GtkBuilder * xml)
35 {
36 gnauralRecentMenu_recent_manager = gtk_recent_manager_get_default ();
37 gnauralRecentMenu_recent_menu =
38 (GtkWidget *) gnauralRecentMenu_recent_create_menu ();
39 g_signal_connect (G_OBJECT (gnauralRecentMenu_recent_menu), "item-activated",
40 G_CALLBACK (gnauralRecentMenu_on_open_recent_activate),
41 NULL);
42 gtk_menu_item_set_submenu (GTK_MENU_ITEM
43 (gtk_builder_get_object (xml, "menuitem_recent")),
44 gnauralRecentMenu_recent_menu);
45 }
46
47 ///////////////////////////////////////////
48 //added 20101014
gnauralRecentMenu_on_open_recent_activate(GtkRecentChooser * chooser,gpointer user_data)49 void gnauralRecentMenu_on_open_recent_activate (GtkRecentChooser * chooser,
50 gpointer user_data)
51 {
52 GtkRecentInfo *item;
53 gchar *filename;
54 gchar *utf8_filename = NULL;
55 GtkWidget *dialog;
56 const gchar *uri;
57
58 g_return_if_fail (chooser && GTK_IS_RECENT_CHOOSER (chooser));
59 item = gtk_recent_chooser_get_current_item (chooser);
60 if (!item)
61 return;
62 uri = gtk_recent_info_get_uri (item);
63 filename = g_filename_from_uri (uri, NULL, NULL);
64 if (filename != NULL)
65 {
66 utf8_filename = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
67 g_free (filename);
68 }
69
70 if (!utf8_filename || (0 != main_TestPathOrFileExistence (utf8_filename)))
71 {
72 dialog = gtk_message_dialog_new (NULL,
73 GTK_DIALOG_DESTROY_WITH_PARENT,
74 GTK_MESSAGE_ERROR,
75 GTK_BUTTONS_CLOSE,
76 "'%s' no longer exists", utf8_filename);
77 gtk_dialog_run (GTK_DIALOG (dialog));
78 gtk_widget_destroy (dialog);
79 gtk_recent_manager_remove_item (gnauralRecentMenu_recent_manager, uri,
80 NULL);
81 }
82 else
83 {
84 gxml_XMLReadFile (utf8_filename, main_drawing_area, FALSE);
85 }
86
87 gtk_recent_info_unref (item);
88 return;
89 }
90
91 ////////////////////////////////////////////
92 //added 20101014 Create a menu of recent files
gnauralRecentMenu_recent_create_menu(void)93 GtkWidget *gnauralRecentMenu_recent_create_menu (void)
94 {
95 GtkWidget *recent_menu;
96 GtkRecentFilter *recent_filter;
97
98 recent_menu =
99 gtk_recent_chooser_menu_new_for_manager (gnauralRecentMenu_recent_manager);
100 gtk_recent_chooser_menu_set_show_numbers (GTK_RECENT_CHOOSER_MENU
101 (recent_menu), TRUE);
102
103 //20110527 - set FALSE because of massive crash bug introduce in a recent
104 //GTK+ win release, occurring when it couldn't find the proper icon:
105 gtk_recent_chooser_set_show_icons (GTK_RECENT_CHOOSER (recent_menu), FALSE);
106 gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (recent_menu), 8);
107 gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (recent_menu),
108 GTK_RECENT_SORT_MRU);
109 gtk_recent_chooser_set_local_only (GTK_RECENT_CHOOSER (recent_menu), TRUE);
110
111 recent_filter = gtk_recent_filter_new ();
112 gtk_recent_filter_add_mime_type (recent_filter, GNAURAL_MIME_TYPE);
113 gtk_recent_filter_add_pattern (recent_filter, "*.gnaural");
114 gtk_recent_chooser_set_filter (GTK_RECENT_CHOOSER (recent_menu),
115 recent_filter);
116 SG_DBGOUT ("gnauralRecentMenu_recent_create_menu");
117 return recent_menu;
118 }
119
120 ////////////////////////////////////////////
121 //added 20101014
gnauralRecentMenu_add_utf8_filename(const gchar * utf8_filename)122 void gnauralRecentMenu_add_utf8_filename (const gchar * utf8_filename)
123 {
124 GtkRecentData *recent_data;
125 gchar *filename;
126 gchar *uri;
127 gchar *pwd;
128 static gchar *groups[2] = {
129 "gnaural",
130 NULL
131 };
132
133 recent_data = g_slice_new (GtkRecentData);
134 recent_data->display_name = NULL;
135 recent_data->description = NULL;
136 recent_data->mime_type = GNAURAL_MIME_TYPE;
137 recent_data->app_name = (gchar *) g_get_application_name ();
138 recent_data->app_exec = g_strjoin (" ", g_get_prgname (), "%f", NULL);
139 recent_data->groups = groups;
140 recent_data->is_private = FALSE;
141 filename = g_filename_from_utf8 (utf8_filename, -1, NULL, NULL, NULL);
142 if (filename != NULL)
143 {
144 if (!g_path_is_absolute (filename))
145 {
146 gchar *absolute_filename;
147 pwd = g_get_current_dir ();
148 absolute_filename = g_build_filename (pwd, filename, NULL);
149 g_free (pwd);
150 g_free (filename);
151 filename = absolute_filename;
152 }
153 uri = g_filename_to_uri (filename, NULL, NULL);
154 if (uri != NULL)
155 {
156 gtk_recent_manager_add_full (gnauralRecentMenu_recent_manager, uri,
157 recent_data);
158 g_free (uri);
159 }
160 g_free (filename);
161 }
162 g_free (recent_data->app_exec);
163 g_slice_free (GtkRecentData, recent_data);
164 }
165