/* This file is a part of XBibFile - a system for handling BibTeX references
 *
 * Author:    Ross Maloney
 * Date:      October 1999
 * Modified:  January 2002
 *
 */

#include  <stdio.h>
#include  <gtk/gtk.h>

#include  "xbibfile.h"

/* This file is a modified copy of phd.c so that it handles the
 * Unpublished BibTeX reference style */


GtkWidget  *labelX, *dataX;
GtkWidget  *label0, *data0;
GtkWidget  *label2, *data2;
GtkWidget  *label3, *data3;
GtkWidget  *label12, *data12;
GtkWidget  *label13, *data13, *textscroll;
GtkWidget  *label20, *data20;
GtkWidget  *label22, *data22;
GtkWidget  *label24, *data24;
GtkWidget  *label30, *data30;
GtkWidget  *label31, *data31;
GtkWidget  *label32, *data32;
GtkTextBuffer  *text13;
GtkTextIter  start, end;
PangoFontDescription  *font_desc;




/* The procedure to save the Unpublished style */

void save_unpublished(GtkWidget *widget)
{
  extern int format;
  extern int length[];
  extern char slate[][];
  extern int lengthX;
  extern char slateX[];
  extern char slate2[];
  extern char slate3[];
  extern char slate12[];
  extern char slate13[];
  extern char slate20[];
  extern char slate22[];
  extern char slate24[];
  extern char slate30[];
  extern char slate31[];
  extern char slate32[];
  extern  void error();          /* defined in file error.c */
  extern  FILE *finput;          /* defined in file xbibfile.c */
  extern  void close_window();   /* defined in file cleanup.c */

  if (format != 14) {
    error(widget, GINT_TO_POINTER(5));
    return;
  }
  strcpy(slateX, gtk_entry_get_text(GTK_ENTRY(dataX)));
  lengthX = strlen(slateX);
  strcpy(slate3, gtk_entry_get_text(GTK_ENTRY(data3)));
  length[3] = strlen(slate3);
  strcpy(slate2, gtk_entry_get_text(GTK_ENTRY(data2)));
  length[2] = strlen(slate2);
  strcpy(slate20, gtk_entry_get_text(GTK_ENTRY(data20)));
  length[20] = strlen(slate20);
  if (!(length[3] && length[2] && length[20] && lengthX)) {
    error(widget, GINT_TO_POINTER(3));
    return;
  }
  if (!finput) {
    error(widget, GINT_TO_POINTER(8));
    return;
  }
  /*  finput = stdout; */
  fprintf(finput, "\n@UNPUBLISHED{%s,\n", slateX);
  fprintf(finput, "   author = {%s},\n", slate3);
  fprintf(finput, "   title = {%s},\n", slate20);
  fprintf(finput, "   note = {%s}", slate2);
  if (length[12])
     fprintf(finput, ",\n   month = {%s}", slate12);
  if (length[24])
      fprintf(finput, ",\n   year = {%s}", slate24);
  if (length[22])
      fprintf(finput, ",\n   URL = {%s}", slate22);
  if (length[13])
      fprintf(finput, ",\n   annote = {%s}", slate13);
  if (length[30])
    fprintf(finput, ",\n   uplink = {%s}", slate30);
  if (length[31])
    fprintf(finput, ",\n   crosslink = {%s}", slate31);
  if (length[32])
    fprintf(finput, ",\n   externlink = {%s}", slate32);
  fprintf(finput, " }\n");
                      /* indicate that the reference is saved */
  format = 0;
  length[2] = 0;
  length[3] = 0;
  length[12] = 0;
  length[13] = 0;
  length[20] = 0;
  length[22] = 0;
  length[24] = 0;
  length[30] = 0;
  length[31] = 0;
  length[32] = 0;
  close_window(widget);   /* remove this reference window */
}


/* Save the Unpublished optional fields for subsequent saving */

void  save_unpublishedoptions(GtkWidget *widget)
{
  extern  void close_window();
  extern  int length[];
  extern  char slate12[];
  extern  char slate22[];
  extern  char slate24[];
  extern  char slate13[];
  char  *text_in_field;
  int   count;

  strcpy(slate12, gtk_entry_get_text(GTK_ENTRY(data12)));
  length[12] = strlen(slate12);
  strcpy(slate24, gtk_entry_get_text(GTK_ENTRY(data24)));
  length[24] = strlen(slate24);
  strcpy(slate22, gtk_entry_get_text(GTK_ENTRY(data22)));
  length[22] = strlen(slate22);
  count = gtk_text_buffer_get_char_count(text13);
  gtk_text_buffer_get_iter_at_offset(text13, &end, count);
  gtk_text_buffer_get_iter_at_offset(text13, &start, 0);
  strcpy(slate13, gtk_text_buffer_get_text(text13, &start, &end, FALSE)); 
  length[13] = count;
  close_window(widget);
}
 



/* Close the option entry window, but first delete the entries */

void  close_unpublishedoptions(GtkWidget *widget)
{
  extern  void  close_window();
  extern  int length[];

  length[12] = 0;
  length[22] = 0;  
  length[24] = 0;
  length[13] = 0;
  close_window(widget);
}


/* The procedure to put the optional Unpublished style fields on the screen */

void unpublishedoptions(GtkWidget *widget)
{
  extern  int format;
  GtkTooltips *tooltips;
  GtkWidget  *window;
  GtkWidget  *decoration;
  GtkWidget  *totalPane;
  GtkWidget  *field0;
  GtkWidget  *field1;
  GtkWidget  *field2;
  GtkWidget  *field3;
  GtkWidget  *key0;
  GtkWidget  *key1;

  void close_unpublishedoptions();
  void save_unpublishedoptions();

  if (format == 0) {
    error (widget, GINT_TO_POINTER(6));
    return;
  }

                    /* create the tooltip help feature */

  tooltips = gtk_tooltips_new();

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "XBibFile create");
  gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
  gtk_widget_set_usize(GTK_WIDGET(window), 400, 480);
  decoration = gtk_frame_new("Optional Unpublished fields");
  gtk_container_add(GTK_CONTAINER(window), decoration);
  totalPane = gtk_vbox_new(FALSE, 5);
  gtk_container_add(GTK_CONTAINER(decoration), totalPane);

                         /* put the text fields in place */
  field1 = gtk_hbox_new(FALSE, 0);
  data12 = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(data12), TINY);
  label12 = gtk_label_new("Month:");
  gtk_widget_set_usize(GTK_WIDGET(label12), 75, -1);
  gtk_box_pack_start(GTK_BOX(field1), label12, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field1), data12, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field1, FALSE, TRUE, 10);

  field2 = gtk_hbox_new(FALSE, 0);
  data24 = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(data24), TINY);
  label24 = gtk_label_new("Year:");
  gtk_widget_set_usize(GTK_WIDGET(label24), 75, -1);
  gtk_box_pack_start(GTK_BOX(field2), label24, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field2), data24, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field2, FALSE, TRUE, 2);

  field3 = gtk_hbox_new(FALSE, 0);
  data22 = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(data22), LARGE);
  label22 = gtk_label_new("URL:");
  gtk_widget_set_usize(GTK_WIDGET(label22), 75, -1);
  gtk_box_pack_start(GTK_BOX(field3), label22, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field3), data22, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field3, FALSE, TRUE, 2);

  text13 = gtk_text_buffer_new(NULL);
  data13 = gtk_text_view_new_with_buffer(text13);
  textscroll = gtk_scrolled_window_new(NULL, NULL);
  font_desc = pango_font_description_from_string("Sans 12");
  gtk_widget_modify_font(data13, font_desc);
  gtk_container_add(GTK_CONTAINER(textscroll), data13);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(textscroll),
                                 GTK_POLICY_AUTOMATIC,
				 GTK_POLICY_AUTOMATIC);
  gtk_widget_set_usize(GTK_WIDGET(data13), 30, 250);
  label13 = gtk_label_new("Annotation:");
  gtk_box_pack_start(GTK_BOX(totalPane), label13, FALSE, TRUE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), textscroll, FALSE, TRUE, 2);

                          /* finally, put the cancel button in place */
  field0 = gtk_hbox_new(FALSE, 0);
  key0 = gtk_button_new_with_label("CANCEL");
  gtk_widget_set_usize(GTK_WIDGET(key0), 90, -1);
  g_signal_connect(GTK_OBJECT(key0), "clicked",
                   G_CALLBACK(close_unpublishedoptions), NULL);
  gtk_tooltips_set_tip(tooltips, key0,
                       "Discard the contents of this window", NULL);
  gtk_box_pack_end(GTK_BOX(field0), key0, FALSE, FALSE, 10);
  key1 = gtk_button_new_with_label("Save");
  gtk_widget_set_usize(GTK_WIDGET(key1), 90, -1);
  g_signal_connect(GTK_OBJECT(key1), "clicked",
                   G_CALLBACK(save_unpublishedoptions), NULL);
  gtk_tooltips_set_tip(tooltips, key1,
                       "Store the contents of this window", NULL);
  gtk_box_pack_end(GTK_BOX(field0), key1, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field0, FALSE, TRUE, 10);


                         /* put the composite window on the screen */
  gtk_widget_show_all(window);
}



/* The procedure to put the basic Unpublished style on the screen */

void unpublished(GtkWidget *widget)
{
  GtkTooltips *tooltips;
  GtkWidget  *window;
  GtkWidget  *decoration;
  GtkWidget  *totalPane;
  GtkWidget  *opDecoration;
  GtkWidget  *field0;
  GtkWidget  *field1;
  GtkWidget  *option;
  GtkWidget  *controls;
  GtkWidget  *key1;
  GtkWidget  *key2;
  GtkWidget  *key3;
  GtkWidget  *key4;
  GtkWidget  *field2;
  GtkWidget  *field3;
  GtkWidget  *field4;
  extern int  format;
  extern char slate0[];

  extern  void linkwindow();
  extern void closure_check();  /* defined in file cleanup.c */
  extern void close_window();   /* defined in file cleanup.c */
  void  unpublishedoptions();
  void  save_unpublished();

                         /* create the tooltip help feature */

  tooltips = gtk_tooltips_new();

  format = 14;           /* indicate processing of UNPUBLISHED */

                         /* create the wondow and its top panel */
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "XBibFile create");
  gtk_window_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
  decoration = gtk_frame_new("Unpublished type required fields");
  gtk_widget_set_usize(GTK_WIDGET(window), 450, 300);
  gtk_container_add(GTK_CONTAINER(window), decoration);
  totalPane = gtk_vbox_new(FALSE, 5);
  gtk_container_add(GTK_CONTAINER(decoration), totalPane);

  field1 = gtk_hbox_new(FALSE,0);
  dataX = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(dataX), SMALL);
  gtk_widget_set_usize(GTK_WIDGET(dataX), 345, -1);
  labelX = gtk_label_new("Tag/s:");
  gtk_widget_set_usize(GTK_WIDGET(labelX), 65, -1);
  gtk_box_pack_start(GTK_BOX(field1), labelX, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field1), dataX, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field1, FALSE, TRUE, 10);

  field0 = gtk_hbox_new(FALSE, 0);
  data0 = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(data0), LARGE);
  gtk_widget_set_usize(GTK_WIDGET(data0), 345, -1);
  label0 = gtk_label_new("File used:");
  gtk_widget_set_usize(GTK_WIDGET(label0), 65, -1);
  gtk_entry_set_text(GTK_ENTRY(data0), slate0);
  gtk_box_pack_start(GTK_BOX(field0), label0, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field0), data0, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field0, FALSE, TRUE, 2);

                         /* position the remaining field entries */
  field2 = gtk_hbox_new(FALSE, 0);
  data3 = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(data3), LARGE);
  gtk_widget_set_usize(GTK_WIDGET(data3), 345, -1);
  label3 = gtk_label_new("Author/s:");
  gtk_widget_set_usize(GTK_WIDGET(label3), 65, -1);
  gtk_box_pack_start(GTK_BOX(field2), label3, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field2), data3, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field2, FALSE, TRUE, 8);

  field3 = gtk_hbox_new(FALSE, 0);
  data20 = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(data20), LARGE);
  gtk_widget_set_usize(GTK_WIDGET(data20), 345, -1);
  label20 = gtk_label_new("Title:");
  gtk_widget_set_usize(GTK_WIDGET(label20), 65, -1);
  gtk_box_pack_start(GTK_BOX(field3), label20, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field3), data20, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field3, FALSE, TRUE, 2);

  field4 = gtk_hbox_new(FALSE, 0);
  data2 = gtk_entry_new();
  gtk_entry_set_max_length(GTK_ENTRY(data2), LARGE);
  gtk_widget_set_usize(GTK_WIDGET(data2), 345, -1);
  label2 = gtk_label_new("Note:");
  gtk_widget_set_usize(GTK_WIDGET(label2), 65, -1);
  gtk_box_pack_start(GTK_BOX(field4), label2, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(field4), data2, FALSE, FALSE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), field4, FALSE, TRUE, 2);

                         /* put the control keys on to the window */
  option = gtk_hbox_new(FALSE, 0);
  key2 = gtk_button_new_with_label("Optional fields");
  gtk_widget_set_usize(GTK_WIDGET(key2), 130, -1);
  g_signal_connect(GTK_OBJECT(key2), "clicked",
                   G_CALLBACK(unpublishedoptions), NULL);
  gtk_tooltips_set_tip(tooltips, key2,
        "Click here to get window containing remaining fields for Unpublished",
                       NULL);
  gtk_box_pack_start(GTK_BOX(option), key2, FALSE, FALSE, 10);
  controls = gtk_hbox_new(FALSE, 0);
  key1 = gtk_button_new_with_label("Save");
  gtk_widget_set_usize(GTK_WIDGET(key1), 90, -1);
  g_signal_connect(GTK_OBJECT(key1), "clicked",
                   G_CALLBACK(save_unpublished), NULL);
  gtk_tooltips_set_tip(tooltips, key1,
                       "Store this Unpublished reference in database", NULL);
  gtk_box_pack_start(GTK_BOX(controls), key1, FALSE, FALSE, 30);
  key3 = gtk_button_new_with_label("Cancel");
  gtk_widget_set_usize(GTK_WIDGET(key3), 90, -1);
  g_signal_connect(GTK_OBJECT(key3), "clicked",
                   G_CALLBACK(closure_check), NULL);
  gtk_tooltips_set_tip(tooltips, key3,
                       "Discard this Unpublished entry", NULL);
  gtk_box_pack_start(GTK_BOX(controls), key3, FALSE, FALSE, 30);
  key4 = gtk_button_new_with_label("Linking");
  gtk_widget_set_usize(GTK_WIDGET(key4), 90, -1);
  g_signal_connect(GTK_OBJECT(key4), "clicked",
                   G_CALLBACK(linkwindow), NULL);
  gtk_tooltips_set_tip(tooltips, key4,
        "Click here for window to create links for this Unpublished reference",
                        NULL);
  gtk_box_pack_start(GTK_BOX(controls), key4, FALSE, FALSE, 30);
  gtk_box_pack_start(GTK_BOX(totalPane), option, FALSE, TRUE, 10);
  gtk_box_pack_start(GTK_BOX(totalPane), controls, FALSE, TRUE, 10);


  format = 14;

                         /* make the composite visible on screen */
  gtk_widget_show_all(window);
}