// Generated by gmmproc 2.66.8 -- DO NOT MODIFY!
#ifndef _GTKMM_RECENTMANAGER_H
#define _GTKMM_RECENTMANAGER_H

#include <gtkmmconfig.h>


#include <glibmm/ustring.h>
#include <sigc++/sigc++.h>

/* Copyright (C) 2006 The gtkmm Development Team
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <https://www.gnu.org/licenses/>.
 */


#include <vector>

#include <gdkmm/screen.h>
#include <gdkmm/pixbuf.h>

#include <gtkmm/recentinfo.h>

#include <glibmm/object.h>


#ifndef DOXYGEN_SHOULD_SKIP_THIS
using GtkRecentManager = struct _GtkRecentManager;
using GtkRecentManagerClass = struct _GtkRecentManagerClass;
#endif /* DOXYGEN_SHOULD_SKIP_THIS */


#ifndef DOXYGEN_SHOULD_SKIP_THIS
namespace Gtk
{ class GTKMM_API RecentManager_Class; } // namespace Gtk
#endif //DOXYGEN_SHOULD_SKIP_THIS

namespace Gtk
{

/**  %Exception class for Gtk::RecentManager errors.
 */
class GTKMM_API RecentManagerError : public Glib::Error
{
public:
  /**  @var Code NOT_FOUND
   * The URI specified does not exists in
   * the recently used resources list.
   * 
   *  @var Code INVALID_URI
   * The URI specified is not valid.
   * 
   *  @var Code INVALID_ENCODING
   * The supplied string is not
   * UTF-8 encoded.
   * 
   *  @var Code NOT_REGISTERED
   * No application has registered
   * the specified item.
   * 
   *  @var Code READ
   * Failure while reading the recently used
   * resources file.
   * 
   *  @var Code WRITE
   * Failure while writing the recently used
   * resources file.
   * 
   *  @var Code UNKNOWN
   * Unspecified error.
   * 
   *  @enum Code
   * 
   * %Error codes for Gtk::RecentManager operations
   * 
   * @newin{2,10}
   */
  enum Code
  {
    NOT_FOUND,
    INVALID_URI,
    INVALID_ENCODING,
    NOT_REGISTERED,
    READ,
    WRITE,
    UNKNOWN
  };

  RecentManagerError(Code error_code, const Glib::ustring& error_message);
  explicit RecentManagerError(GError* gobject);
  Code code() const;

#ifndef DOXYGEN_SHOULD_SKIP_THIS
private:

  static void throw_func(GError* gobject);

  friend GTKMM_API void wrap_init(); // uses throw_func()

  #endif //DOXYGEN_SHOULD_SKIP_THIS
};

} // namespace Gtk

#ifndef DOXYGEN_SHOULD_SKIP_THIS
namespace Glib
{

template <>
class GTKMM_API Value<Gtk::RecentManagerError::Code> : public Glib::Value_Enum<Gtk::RecentManagerError::Code>
{
public:
  static GType value_type() G_GNUC_CONST;
};

} // namespace Glib
#endif /* DOXYGEN_SHOULD_SKIP_THIS */

namespace Gtk
{


/** @defgroup RecentFiles RecentFiles
 */

/** RecentManager provides a facility for adding, removing and
 * looking up recently used files.  Each recently used file is
 * identified by its URI, and has meta-data associated to it, like
 * the names and command lines of the applications that have
 * registered it, the number of time each application has registered
 * the same file, the mime type of the file and whether the file
 * should be displayed only by the applications that have
 * registered it.
 *
 * The RecentManager acts like a database of all the recently
 * used files.  You can create new RecentManager objects, but
 * it is more efficient to use the standard recent manager for
 * the Gdk::Screen so that informations about the recently used
 * files is shared with other people using them. Normally, you
 * retrieve the recent manager for a particular screen using
 * get_for_screen() and it will contain information about current
 * recent manager for that screen.
 *
 * @newin{2,10}
 *
 * @ingroup RecentFiles
 */

class GTKMM_API RecentManager : public Glib::Object
{
  
#ifndef DOXYGEN_SHOULD_SKIP_THIS

public:
  using CppObjectType = RecentManager;
  using CppClassType = RecentManager_Class;
  using BaseObjectType = GtkRecentManager;
  using BaseClassType = GtkRecentManagerClass;

  // noncopyable
  RecentManager(const RecentManager&) = delete;
  RecentManager& operator=(const RecentManager&) = delete;

private:  friend class RecentManager_Class;
  static CppClassType recentmanager_class_;

protected:
  explicit RecentManager(const Glib::ConstructParams& construct_params);
  explicit RecentManager(GtkRecentManager* castitem);

#endif /* DOXYGEN_SHOULD_SKIP_THIS */

public:

  RecentManager(RecentManager&& src) noexcept;
  RecentManager& operator=(RecentManager&& src) noexcept;

  ~RecentManager() noexcept override;

  /** Get the GType for this class, for use with the underlying GObject type system.
   */
  static GType get_type()      G_GNUC_CONST;

#ifndef DOXYGEN_SHOULD_SKIP_THIS


  static GType get_base_type() G_GNUC_CONST;
#endif

  ///Provides access to the underlying C GObject.
  GtkRecentManager*       gobj()       { return reinterpret_cast<GtkRecentManager*>(gobject_); }

  ///Provides access to the underlying C GObject.
  const GtkRecentManager* gobj() const { return reinterpret_cast<GtkRecentManager*>(gobject_); }

  ///Provides access to the underlying C instance. The caller is responsible for unrefing it. Use when directly setting fields in structs.
  GtkRecentManager* gobj_copy();

private:


protected:
  RecentManager();

public:
  
  static Glib::RefPtr<RecentManager> create();


  /** Gets a unique instance of Gtk::RecentManager, that you can share
   * in your application without caring about memory management.
   * 
   * @newin{2,10}
   * 
   * @return A unique Gtk::RecentManager. Do not ref or
   * unref it.
   */
  static Glib::RefPtr<RecentManager> get_default();

  /** Meta-data passed to add_item().  You should
   * use RecentManager::Data if you want to control the meta-data associated
   * to an entry of the recently used files list when you are adding
   * a new file to it.
   *
   * - display_name: the string to be used when displaying the file inside a RecentChooser
   * - description: a user readable description of the file
   * - mime_type: the mime type of the file
   * - app_name: the name of the application that is registering the file
   * - app_exec: the command line that should be used when launching the file
   * - groups: the list of group names to which the file belongs to
   * - is_private: whether the file should be displayed only by the applications that have registered it
  */
  class Data
  {
  public:
    Glib::ustring display_name;
    Glib::ustring description;

    Glib::ustring mime_type;

    Glib::ustring app_name;
    Glib::ustring app_exec;

    std::vector<Glib::ustring> groups;

    bool is_private;
  };

  
  /** Adds a new resource into the recently used resources list. This function
   * will try and guess some of the meta-data associated to a URI. If you
   * know some of meta-data about the document yourself, set the desired
   * fields of a RecentManager::Data structure and pass it to add_item().
   */
  bool add_item(const Glib::ustring& uri);

  /** Adds a new resource into the recently used resources list, taking
   * meta data from the given Data instead of guessing it from the URI.
   */
  bool add_item(const Glib::ustring& uri, const Data& recent_data);
  

  /** Removes a resource pointed by @a uri from the recently used resources
   * list handled by a recent manager.
   * 
   * @newin{2,10}
   * 
   * @param uri The URI of the item you wish to remove.
   * @return <tt>true</tt> if the item pointed by @a uri has been successfully
   * removed by the recently used resources list, and <tt>false</tt> otherwise.
   * 
   * @throws Glib::Error
   */
  bool remove_item(const Glib::ustring& uri);
  
  /** Searches for a URI inside the recently used resources list, and
   * returns a Gtk::RecentInfo-struct containing informations about the resource
   * like its MIME type, or its display name.
   * 
   * @newin{2,10}
   * 
   * @param uri A URI.
   * @return A Gtk::RecentInfo-struct containing information
   * about the resource pointed by @a uri, or <tt>nullptr</tt> if the URI was
   * not registered in the recently used resources list. Free with
   * Gtk::RecentInfo::unref().
   * 
   * @throws Glib::Error
   */
  Glib::RefPtr<RecentInfo> lookup_item(const Glib::ustring& uri);
  
  /** Searches for a URI inside the recently used resources list, and
   * returns a Gtk::RecentInfo-struct containing informations about the resource
   * like its MIME type, or its display name.
   * 
   * @newin{2,10}
   * 
   * @param uri A URI.
   * @return A Gtk::RecentInfo-struct containing information
   * about the resource pointed by @a uri, or <tt>nullptr</tt> if the URI was
   * not registered in the recently used resources list. Free with
   * Gtk::RecentInfo::unref().
   * 
   * @throws Glib::Error
   */
  Glib::RefPtr<const RecentInfo> lookup_item(const Glib::ustring& uri) const;
  
  /** Checks whether there is a recently used resource registered
   * with @a uri inside the recent manager.
   * 
   * @newin{2,10}
   * 
   * @param uri A URI.
   * @return <tt>true</tt> if the resource was found, <tt>false</tt> otherwise.
   */
  bool has_item(const Glib::ustring& uri) const;
  
  /** Changes the location of a recently used resource from @a uri to @a new_uri.
   * 
   * Please note that this function will not affect the resource pointed
   * by the URIs, but only the URI used in the recently used resources list.
   * 
   * @newin{2,10}
   * 
   * @param uri The URI of a recently used resource.
   * @param new_uri The new URI of the recently used resource, or
   * <tt>nullptr</tt> to remove the item pointed by @a uri in the list.
   * @return <tt>true</tt> on success.
   * 
   * @throws Glib::Error
   */
  bool move_item(const Glib::ustring& uri, const Glib::ustring& new_uri);

 
  /** Gets the list of recently used resources.
   * 
   * @newin{2,10}
   * 
   * @return A list of
   * newly allocated Gtk::RecentInfo objects.
   */
  std::vector<Glib::RefPtr<RecentInfo> > get_items() const;

  
  /** Purges every item from the recently used resources list.
   * 
   * @newin{2,10}
   * 
   * @return The number of items that have been removed from the
   * recently used resources list.
   * 
   * @throws Glib::Error
   */
  int purge_items();

  //TODO: Who needs this typedef? Remove when we can break API?
  /// For instance, void on_changed();
  typedef sigc::slot<void> SlotChanged;

  
  /**
   * @par Slot Prototype:
   * <tt>void on_my_%changed()</tt>
   *
   * Flags: Run First
   *
   * Emitted when the current recently used resources manager changes
   * its contents, either by calling Gtk::RecentManager::add_item() or
   * by another application.
   * 
   * @newin{2,10}
   */

  Glib::SignalProxy< void > signal_changed();


  /** The full path to the file to be used to store and read the
   * recently used resources list
   * 
   * @newin{2,10}
   *
   * Default value: ""
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Glib::ustring > property_filename() const;


  /** The size of the recently used resources list.
   * 
   * @newin{2,10}
   *
   * Default value: 0
   *
   * @return A PropertyProxy_ReadOnly that allows you to get the value of the property,
   * or receive notification when the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< int > property_size() const;


public:

public:
  //C++ methods used to invoke GTK+ virtual functions:

protected:
  //GTK+ Virtual Functions (override these to change behaviour):

  //Default Signal Handlers::
  /// This is a default handler for the signal signal_changed().
  virtual void on_changed();


};

} // namespace Gtk


namespace Glib
{
  /** A Glib::wrap() method for this object.
   *
   * @param object The C instance.
   * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref.
   * @result A C++ instance that wraps this C instance.
   *
   * @relates Gtk::RecentManager
   */
  GTKMM_API
  Glib::RefPtr<Gtk::RecentManager> wrap(GtkRecentManager* object, bool take_copy = false);
}


#endif /* _GTKMM_RECENTMANAGER_H */

