/** * gnm_app_history_get_list: * * creating it if necessary. * * Return value: (element-type char) (transfer full): the list, which must be * freed along with the strings in it. **/ GSList * gnm_app_history_get_list (int max_elements) { GSList *res = NULL; GList *items, *l; GtkFileFilter *filter; int n_elements = 0; if (app->recent == NULL) return NULL; items = gtk_recent_manager_get_items (app->recent); items = g_list_sort (items, (GCompareFunc)compare_mru); filter = gnm_app_create_opener_filter (NULL); for (l = items; l && n_elements < max_elements; l = l->next) { GtkRecentInfo *ri = l->data; const char *uri = gtk_recent_info_get_uri (ri); gboolean want_it; if (gtk_recent_info_has_application (ri, g_get_application_name ())) { want_it = TRUE; } else { GtkFileFilterInfo fi; char *display_name = g_filename_display_basename (uri); memset (&fi, 0, sizeof (fi)); fi.contains = (GTK_FILE_FILTER_MIME_TYPE | GTK_FILE_FILTER_URI | GTK_FILE_FILTER_DISPLAY_NAME); fi.uri = uri; fi.mime_type = gtk_recent_info_get_mime_type (ri); fi.display_name = display_name; want_it = gtk_file_filter_filter (filter, &fi); g_free (display_name); } if (want_it) { char *filename = go_filename_from_uri (uri); if (filename && !g_file_test (filename, G_FILE_TEST_EXISTS)) want_it = FALSE; g_free (filename); } if (want_it) { res = g_slist_prepend (res, g_strdup (uri)); n_elements++; } } g_list_free_full (items, (GDestroyNotify)gtk_recent_info_unref); g_object_ref_sink (filter); g_object_unref (filter); return g_slist_reverse (res); }
/** * go_gtk_url_is_writeable: * @parent : #GtkWindow * @uri : * @overwrite_by_default : * * Check if it makes sense to try saving. * If it's an existing file and writable for us, ask if we want to overwrite. * We check for other problems, but if we miss any, the saver will report. * So it doesn't have to be bulletproof. * * FIXME: The message boxes should really be children of the file selector, * not the workbook. **/ gboolean go_gtk_url_is_writeable (GtkWindow *parent, char const *uri, gboolean overwrite_by_default) { gboolean result = TRUE; char *filename; if (uri == NULL || uri[0] == '\0') result = FALSE; filename = go_filename_from_uri (uri); if (!filename) return TRUE; /* Just assume writable. */ if (G_IS_DIR_SEPARATOR (filename [strlen (filename) - 1]) || g_file_test (filename, G_FILE_TEST_IS_DIR)) { go_gtk_notice_dialog (parent, GTK_MESSAGE_ERROR, _("%s\nis a directory name"), uri); result = FALSE; } else if (go_file_access (uri, W_OK) != 0 && errno != ENOENT) { go_gtk_notice_dialog (parent, GTK_MESSAGE_ERROR, _("You do not have permission to save to\n%s"), uri); result = FALSE; } else if (g_file_test (filename, G_FILE_TEST_EXISTS)) { char *dirname = go_dirname_from_uri (uri, TRUE); char *basename = go_basename_from_uri (uri); char *msg = g_markup_printf_escaped ( _("A file called <i>%s</i> already exists in %s.\n\n" "Do you want to save over it?"), basename, dirname); GtkWidget *dialog = gtk_message_dialog_new_with_markup (parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, msg); gtk_dialog_set_default_response (GTK_DIALOG (dialog), overwrite_by_default ? GTK_RESPONSE_OK : GTK_RESPONSE_CANCEL); result = GTK_RESPONSE_OK == go_gtk_dialog_run (GTK_DIALOG (dialog), parent); g_free (dirname); g_free (basename); g_free (msg); } g_free (filename); return result; }
static void url_renderer_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { GtkRecentInfo *ri = NULL; const char *uri; char *markup, *shortname, *filename, *longname; gtk_tree_model_get (model, iter, RECENT_COL_INFO, &ri, -1); uri = gtk_recent_info_get_uri (ri); filename = go_filename_from_uri (uri); if (filename) { shortname = g_filename_display_basename (filename); } else { shortname = g_filename_display_basename (uri); } if (filename) { longname = g_strdup (filename); } else { char *duri = g_uri_unescape_string (uri, NULL); longname = duri ? g_filename_display_name (duri) : g_strdup (uri); g_free (duri); } markup = g_markup_printf_escaped (_("<b>%s</b>\n" "<small>Location: %s</small>"), shortname, longname); g_object_set (cell, "markup", markup, NULL); g_free (markup); g_free (shortname); g_free (longname); g_free (filename); gtk_recent_info_unref (ri); }