The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*
 * Copyright (c) 2006 by the gtk2-perl team (see the file AUTHORS)
 *
 * Licensed under the LGPL, see LICENSE file for more information.
 *
 * $Id$
 */

#include "gtk2perl.h"

static gint
gtk2perl_recent_sort_func (GtkRecentInfo *a,
			   GtkRecentInfo *b,
			   gpointer       user_data)
{
  GPerlCallback *callback = (GPerlCallback *) user_data;
  GValue value = { 0, };
  gint retval;

  g_value_init (&value, callback->return_type);

  gperl_callback_invoke (callback, &value, a, b);
  retval = g_value_get_int (&value);

  g_value_unset (&value);

  return retval;
}

static GPerlCallback *
gtk2perl_recent_sort_func_create (SV *func,
				  SV *data)
{
  GType param_types[2];

  param_types[0] = GTK_TYPE_RECENT_INFO;
  param_types[1] = GTK_TYPE_RECENT_INFO;

  return gperl_callback_new (func, data,
		  	     G_N_ELEMENTS (param_types), param_types,
			     G_TYPE_INT);
}

MODULE = Gtk2::RecentChooser	PACKAGE = Gtk2::RecentChooser	PREFIX = gtk_recent_chooser_


=for enum GtkRecentSortType
=cut

=for enum GtkRecentChooserError
=cut

#
# Configuration
#
void
gtk_recent_chooser_set_show_private (GtkRecentChooser *chooser, gboolean show_private)

gboolean
gtk_recent_chooser_get_show_private (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_show_not_found (GtkRecentChooser *chooser, gboolean show_not_found)

gboolean
gtk_recent_chooser_get_show_not_found (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_select_multiple (GtkRecentChooser *chooser, gboolean select_multiple)

gboolean
gtk_recent_chooser_get_select_multiple (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_limit (GtkRecentChooser *chooser, gint limit)

gint
gtk_recent_chooser_get_limit (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_local_only (GtkRecentChooser *chooser, gboolean local_only)

gboolean
gtk_recent_chooser_get_local_only (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_show_tips (GtkRecentChooser *chooser, gboolean show_tips)

gboolean
gtk_recent_chooser_get_show_tips (GtkRecentChooser *chooser)

# these are a gtk mistake, and we should not bind them.
##void
##gtk_recent_chooser_set_show_numbers (GtkRecentChooser *chooser, gboolean show_numbers)
##
##gboolean
##gtk_recent_chooser_get_show_numbers (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_show_icons (GtkRecentChooser *chooser, gboolean show_icons)

gboolean
gtk_recent_chooser_get_show_icons (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_sort_type (GtkRecentChooser *chooser, GtkRecentSortType sort_type)

GtkRecentSortType
gtk_recent_chooser_get_sort_type (GtkRecentChooser *chooser)

void
gtk_recent_chooser_set_sort_func (chooser, sort_func, sort_data=NULL)
	GtkRecentChooser *chooser
	SV *sort_func
	SV *sort_data
    PREINIT:
        GPerlCallback *func;
    CODE:
        func = gtk2perl_recent_sort_func_create (sort_func, sort_data);
	gtk_recent_chooser_set_sort_func (chooser,
					  gtk2perl_recent_sort_func,
					  func,
					  (GDestroyNotify) gperl_callback_destroy);

#
# Items handling
#
=for apidoc __gerror__
=cut
void
gtk_recent_chooser_set_current_uri (GtkRecentChooser *chooser, const gchar *uri)
    PREINIT:
        GError *error = NULL;
    CODE:
        gtk_recent_chooser_set_current_uri (chooser, uri, &error);
	if (error)
		gperl_croak_gerror (NULL, error);

gchar_own *
gtk_recent_chooser_get_current_uri (GtkRecentChooser *chooser)

GtkRecentInfo *
gtk_recent_chooser_get_current_item (GtkRecentChooser *chooser)

=for apidoc __gerror__
=cut
void
gtk_recent_chooser_select_uri (GtkRecentChooser *chooser, const gchar *uri)
    PREINIT:
        GError *error = NULL;
    CODE:
        gtk_recent_chooser_select_uri (chooser, uri, &error);
	if (error)
		gperl_croak_gerror (NULL, error);

void
gtk_recent_chooser_unselect_uri (GtkRecentChooser *chooser, const gchar *uri)

void
gtk_recent_chooser_select_all (GtkRecentChooser *chooser)

void
gtk_recent_chooser_unselect_all (GtkRecentChooser *chooser)

=for apidoc
=for signature (list) = $chooser->get_items
=cut
void
gtk_recent_chooser_get_items (GtkRecentChooser *chooser)
    PREINIT:
        GList *items, *l;
    PPCODE:
        items = gtk_recent_chooser_get_items (chooser);

	for (l = items; l != NULL; l = l->next)
		XPUSHs (sv_2mortal (newSVGtkRecentInfo_own (l->data)));

	g_list_free (items);

=for apidoc
=for signature (list) = $chooser->get_uris
=cut
void
gtk_recent_chooser_get_uris (GtkRecentChooser *chooser)
    PREINIT:
        gchar **uris;
	gsize length, i;
    PPCODE:
        uris = gtk_recent_chooser_get_uris (chooser, &length);
	if (length == 0)
		XSRETURN_EMPTY;

	EXTEND (SP, length);
	for (i = 0; i < length; i++)
		PUSHs (sv_2mortal (newSVGChar (uris[i])));

	g_strfreev (uris);

#
# Filters
#
void
gtk_recent_chooser_add_filter (GtkRecentChooser *chooser, GtkRecentFilter *filter)

void
gtk_recent_chooser_remove_filter (GtkRecentChooser *chooser, GtkRecentFilter *filter)

=for apidoc
=for signature (filters) = $chooser->list_filters
=cut
void
gtk_recent_chooser_list_filters (GtkRecentChooser *chooser)
    PREINIT:
        GSList *filters, *i;
    PPCODE:
        filters = gtk_recent_chooser_list_filters (chooser);
	for (i = filters; i != NULL; i = i->next)
		XPUSHs (sv_2mortal (newSVGtkRecentFilter (i->data)));
	g_slist_free (filters);

void
gtk_recent_chooser_set_filter (GtkRecentChooser *chooser, GtkRecentFilter *filter)

GtkRecentFilter *
gtk_recent_chooser_get_filter (GtkRecentChooser *chooser)