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