/* PIKA - Photo and Image Kooker Application
 * a rebranding of The GNU Image Manipulation Program (created with heckimp)
 * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio
 *
 * Original copyright, applying to most contents (license remains unchanged): 
 * Copyright (C) 1995-1997 Spencer Kimball and Peter Mattis
 *
 * pikapluginmanager.h
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#ifndef __PIKA_PLUG_IN_MANAGER_H__
#define __PIKA_PLUG_IN_MANAGER_H__


#include "core/pikaobject.h"


#define PIKA_TYPE_PLUG_IN_MANAGER            (pika_plug_in_manager_get_type ())
#define PIKA_PLUG_IN_MANAGER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), PIKA_TYPE_PLUG_IN_MANAGER, PikaPlugInManager))
#define PIKA_PLUG_IN_MANAGER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), PIKA_TYPE_PLUG_IN_MANAGER, PikaPlugInManagerClass))
#define PIKA_IS_PLUG_IN_MANAGER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PIKA_TYPE_PLUG_IN_MANAGER))
#define PIKA_IS_PLUG_IN_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIKA_TYPE_PLUG_IN_MANAGER))


typedef struct _PikaPlugInManagerClass PikaPlugInManagerClass;

struct _PikaPlugInManager
{
  PikaObject         parent_instance;

  Pika              *pika;

  GSList            *plug_in_defs;
  gboolean           write_pluginrc;

  GSList            *plug_in_procedures;

  GSList            *load_procs;
  GSList            *save_procs;
  GSList            *export_procs;
  GSList            *raw_load_procs;
  GSList            *batch_procs;

  GSList            *display_load_procs;
  GSList            *display_save_procs;
  GSList            *display_export_procs;
  GSList            *display_raw_load_procs;

  GSList            *menu_branches;
  GSList            *help_domains;

  PikaPlugIn        *current_plug_in;
  GSList            *open_plug_ins;
  GSList            *plug_in_stack;

  PikaPlugInShm     *shm;
  PikaInterpreterDB *interpreter_db;
  PikaEnvironTable  *environ_table;
  PikaPlugInDebug   *debug;
  GList             *data_list;
};

struct _PikaPlugInManagerClass
{
  PikaObjectClass  parent_class;

  void (* plug_in_opened)    (PikaPlugInManager *manager,
                              PikaPlugIn        *plug_in);
  void (* plug_in_closed)    (PikaPlugInManager *manager,
                              PikaPlugIn        *plug_in);

  void (* menu_branch_added) (PikaPlugInManager *manager,
                              GFile             *file,
                              const gchar       *menu_path,
                              const gchar       *menu_label);
};


GType               pika_plug_in_manager_get_type (void) G_GNUC_CONST;

PikaPlugInManager * pika_plug_in_manager_new      (Pika                *pika);

void    pika_plug_in_manager_initialize           (PikaPlugInManager   *manager,
                                                   PikaInitStatusFunc   status_callback);
void    pika_plug_in_manager_exit                 (PikaPlugInManager   *manager);

/* Register a plug-in. This function is public for file load-save
 * handlers, which are organized around the plug-in data structure.
 * This could all be done a little better, but oh well.  -josh
 */
void    pika_plug_in_manager_add_procedure        (PikaPlugInManager   *manager,
                                                   PikaPlugInProcedure *procedure);

void    pika_plug_in_manager_add_batch_procedure  (PikaPlugInManager      *manager,
                                                   PikaPlugInProcedure    *proc);
GSList * pika_plug_in_manager_get_batch_procedures (PikaPlugInManager      *manager);

void    pika_plug_in_manager_add_temp_proc        (PikaPlugInManager      *manager,
                                                   PikaTemporaryProcedure *procedure);
void    pika_plug_in_manager_remove_temp_proc     (PikaPlugInManager      *manager,
                                                   PikaTemporaryProcedure *procedure);

void    pika_plug_in_manager_add_open_plug_in     (PikaPlugInManager   *manager,
                                                   PikaPlugIn          *plug_in);
void    pika_plug_in_manager_remove_open_plug_in  (PikaPlugInManager   *manager,
                                                   PikaPlugIn          *plug_in);

void    pika_plug_in_manager_plug_in_push         (PikaPlugInManager   *manager,
                                                   PikaPlugIn          *plug_in);
void    pika_plug_in_manager_plug_in_pop          (PikaPlugInManager   *manager);


#endif  /* __PIKA_PLUG_IN_MANAGER_H__ */
