/* edit gimp comment
 *
 * This is a plug-in for the GIMP 1.2
 *
 * Copyright (C) Reinhard Geisler
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License (version 2) as 
 * published by the Free Software Foundation.
 *
 * 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, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/* This plug-in changes the gimp comment.
 */

/*
 * Installation:
 * gimptool --install ecomment.c
 *
 * Enjoy!
 */


#include "stdio.h"
#include "string.h"
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
#include <gtk/gtk.h>


#define PLUG_IN_NAME    "ecomment"
#define PLUG_IN_VERSION "Ecomment 0.1"
#define PLUG_IN_DATE    "5.2003"


/* type of lextract parameters */
typedef struct
{
  gchar *text;
} tparameter;


static tparameter parameter =
{
  NULL
};

/* status of parameter input: if TRUE: use plug-in; if FALSE: cancel */
gint parameter_ok=FALSE;



/********************************************************************/
/* Prototypes                                                       */
/********************************************************************/

/* communication to the GIMP */
static void query(void);

static void run(gchar      *name,
                gint        nparams,
                GimpParam  *param,
                gint       *nreturn_vals,
                GimpParam **return_vals);

/* user interface */
static gint get_parameters(void);


/********************************************************************/
/* Variables                                                        */
/********************************************************************/

/* PLUG_IN_INFO *****************************************************/
GimpPlugInInfo PLUG_IN_INFO =
{
  NULL,   /* init_proc  */
  NULL,   /* quit_proc  */
  query,  /* query_proc */
  run     /* run_proc   */
}; 

/********************************************************************/
/* procedures                                                       */
/********************************************************************/
MAIN()

/* communication to the GIMP */
static void query(void)
{
  static GimpParamDef params[] =
  {
    { GIMP_PDB_INT32,    "run_mode",    "Interactive,non-interactive"},
    { GIMP_PDB_IMAGE,    "image_id",    "Input image" },
    { GIMP_PDB_DRAWABLE, "drawable_id", "Input drawable" },
    { GIMP_PDB_STRING,   "text",        "new gimp comment"}
  };

  static GimpParamDef *return_vals  = NULL;
  static int           nparams      = sizeof(params)/sizeof(params[0]);
  static int           nreturn_vals = 0;
  

  gimp_install_procedure("plug_in_"PLUG_IN_NAME,
                         "edits the gimp comment",
                         "This plug-in edits the gimp-comment parasite.",
                         "Reinhard Geisler",
                         "Reinhard Geisler",
                         PLUG_IN_DATE,
                         "<Image>/Image/Edit Comment",
                         "RGB*,GRAY*,INDEXED*",
                         GIMP_PLUGIN,
                         nparams,
                         nreturn_vals,
                         params,
                         return_vals);
}


/********************************************************************/
static void run(gchar      *name,
                gint        nparams,
                GimpParam  *param,
                gint       *nreturn_vals,
                GimpParam **return_vals)
{
  static GimpParam  values[1];
  GimpPDBStatusType status;
  GimpRunModeType   run_mode;
#ifdef GIMP_HAVE_PARASITES
  GimpParasite *parasite;
#endif /* GIMP_HAVE_PARASITES */

  status   = GIMP_PDB_SUCCESS;
  run_mode = param[0].data.d_int32;
  *nreturn_vals = 1;
  *return_vals  = values;
  values[0].type          = GIMP_PDB_STATUS;
  values[0].data.d_status = status;

  switch(run_mode)
  {
  case GIMP_RUN_INTERACTIVE:
  case GIMP_RUN_WITH_LAST_VALS:
#ifdef GIMP_HAVE_PARASITES
    parasite=gimp_image_parasite_find(param[1].data.d_int32,"gimp-comment");
    if(parasite!=NULL)
    {
      parameter.text=g_strdup(parasite->data);
      gimp_parasite_free(parasite);
    }
#endif /* GIMP_HAVE_PARASITES */
    if(!get_parameters()) return;
    break;
  case GIMP_RUN_NONINTERACTIVE:
    if (nparams!=4)
      status=GIMP_PDB_CALLING_ERROR;
    else
    {
      parameter.text    =param[3].data.d_string;
    }
    break;
  default:
    status=GIMP_PDB_CALLING_ERROR;
    break;
  }
  values[0].data.d_status = status;
  if(status!=GIMP_PDB_SUCCESS) return;
#ifdef GIMP_HAVE_PARASITES
  if(parameter.text!=NULL)
  {
    gimp_image_parasite_detach(param[1].data.d_int32,"gimp-comment");
    gimp_image_attach_new_parasite(param[1].data.d_int32,
      "gimp-comment",0,strlen(parameter.text)+1,parameter.text);
  }
#endif /* GIMP_HAVE_PARASITES */
}



/***************************************************************************/
/* user interface                                                          */
/***************************************************************************/

/* exit ********************************************************************/
static void dialog_close_callback(GtkWidget *widget, gpointer data)
{
  fflush(stderr);
  gtk_main_quit();
}


/* click "OK" **************************************************************/
static void dialog_ok_callback(GtkWidget *widget, gpointer data)
{
  /* get image comment */
  if(parameter.text!=NULL) g_free(parameter.text);
  parameter.text=gtk_editable_get_chars(
    GTK_EDITABLE(gtk_object_get_data(GTK_OBJECT(data),"text")),0,-1);
  if(parameter.text!=NULL && strlen(parameter.text)==0)
  {
    g_free(parameter.text);
    parameter.text=NULL;
  }

  parameter_ok=TRUE;
  gtk_widget_destroy(GTK_WIDGET(data));
}


/* create label ***************************************************************/
GtkWidget *create_label(gchar *string, gdouble num, GtkWidget *table,
                        gint left, gint right, gint row)
{
  GtkWidget *label;
  gchar     *string_2;

  if(num>=0)
  {
    string_2=g_strdup_printf("%g",num);
    label=gtk_label_new(string_2);
    g_free(string_2);
    gtk_table_attach(GTK_TABLE(table),label,right,right+1,row,row+1,
                     GTK_FILL,GTK_FILL,0,0);
    gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5);
    gtk_widget_show(label);    
  }
  label=gtk_label_new(string);
  gtk_table_attach(GTK_TABLE(table),label,left,right,row,row+1,
                   GTK_FILL,GTK_FILL,0,0);
  gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5);
  gtk_widget_show(label);
  return label;
}


/****************************************************************************/
/* edit comment                                                             */
/****************************************************************************/
static gint get_parameters(void)
{
  GtkWidget *dlg;
  GtkWidget *button;
  GtkWidget *text;
  GtkWidget *scrollbar;
  GtkWidget *table;

  gchar **argv;
  gint argc;
  
  argc   =1;
  argv   =g_new(gchar*,1);
  argv[0]=g_strdup(PLUG_IN_NAME);
  
  gtk_init(&argc,&argv);
  gtk_rc_parse(gimp_gtkrc());
  
  /* open new dialog */
  dlg=gtk_dialog_new();
  
  gtk_window_set_title(GTK_WINDOW(dlg),PLUG_IN_VERSION);
  gtk_window_position(GTK_WINDOW(dlg),GTK_WIN_POS_MOUSE);
  gtk_signal_connect(GTK_OBJECT(dlg),"destroy",
                     (GtkSignalFunc)dialog_close_callback,NULL);
  
  /* Action area... */
  /* button "OK"*/
  button=gtk_button_new_with_label("OK");
  GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
  gtk_signal_connect(GTK_OBJECT(button),"clicked",
                     (GtkSignalFunc)dialog_ok_callback,dlg);
  gtk_box_pack_start_defaults(
    GTK_BOX(GTK_DIALOG(dlg)->action_area),button);
  gtk_widget_grab_default(button);
  gtk_widget_show(button);

  /* button "Cancel"*/
  button=gtk_button_new_with_label("Cancel");
  GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
  gtk_signal_connect_object(GTK_OBJECT(button),"clicked",
                            (GtkSignalFunc)dialog_close_callback,NULL);
  gtk_box_pack_start_defaults(
    GTK_BOX(GTK_DIALOG(dlg)->action_area),button);
  gtk_widget_show(button);  
  
  /* image comment */
  table=gtk_table_new(2,2,FALSE);
  gtk_container_border_width(GTK_CONTAINER(table),10);
  gtk_table_set_col_spacings(GTK_TABLE(table),5);
  gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dlg)->vbox),table);

  create_label("Image Comment:",-1,table,0,1,0);
  text=gtk_text_new(NULL,NULL);
  gtk_text_set_editable(GTK_TEXT(text),TRUE);
  gtk_text_set_line_wrap(GTK_TEXT(text),TRUE);
  gtk_table_attach(GTK_TABLE(table),text,0,1,1,2,
                   GTK_EXPAND|GTK_SHRINK|GTK_FILL,
                   GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
  if(parameter.text!=NULL)
    gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,parameter.text,-1);
  gtk_widget_set_usize(text,400,80);

  scrollbar=gtk_vscrollbar_new(GTK_TEXT(text)->vadj);
  gtk_table_attach(GTK_TABLE(table),scrollbar,1,2,1,2,
                   GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
  gtk_widget_show(scrollbar);
  gtk_object_set_data(GTK_OBJECT(dlg),"text",text); 
  gtk_widget_show(text);
  gtk_widget_show(table);

  gtk_widget_show(dlg);
  gtk_main();
  gdk_flush();

  return parameter_ok;
}
