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

GtkWidget *text;
GtkWidget *filewindow;
gchar *selected_filename;
  
void close_application(GtkWidget *widget, gpointer data)
{
     gtk_main_quit();
}

void open_file(GtkFileSelection *selector, gpointer user_data) {
   char buffer[1024];
   FILE *file;
   int nchars;
   selected_filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(filewindow));
   file = fopen(selected_filename, "r");
   gtk_text_freeze (GTK_TEXT (text));
   gtk_text_set_point(GTK_TEXT(text), 0);
   gtk_text_forward_delete(GTK_TEXT(text), gtk_text_get_length(GTK_TEXT(text)));    
   while (1)
      {
        nchars = fread(buffer, 1, 1024, file);
        gtk_text_insert(GTK_TEXT(text), NULL, NULL, NULL, buffer, nchars);
        if (nchars < 1024) break;
      }
   gtk_text_thaw (GTK_TEXT (text));
   fclose(file);
}

void save_file(GtkFileSelection *selector, gpointer user_data) {
   gchar *buffer;
   FILE *file;
   selected_filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(filewindow));
   file = fopen(selected_filename, "w");
   buffer = gtk_editable_get_chars(GTK_EDITABLE (text), 0, -1);
   fputs(buffer, file);
   fclose(file);
}

void file_open (void)
{
 filewindow = gtk_file_selection_new ("Select File");
 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(filewindow)->ok_button), "clicked", open_file, NULL);
 gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(filewindow)->ok_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) filewindow);
 gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(filewindow)->cancel_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) filewindow);
 gtk_widget_show(filewindow); 
};

void save (void)
{
 filewindow = gtk_file_selection_new ("Select File");
 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(filewindow)->ok_button), "clicked", save_file, NULL);
 gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(filewindow)->ok_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) filewindow);
 gtk_widget_show(filewindow); 
};

void new_file (void)
{
gtk_text_freeze (GTK_TEXT(text));
gtk_text_set_point(GTK_TEXT(text), 0);
gtk_text_forward_delete(GTK_TEXT(text), gtk_text_get_length(GTK_TEXT(text)));
gtk_text_thaw (GTK_TEXT(text));
}

void show_about (void)
{
 GtkWidget *aboutwindow;
 GtkWidget *label;
 GtkWidget *okbutton;
 GtkWidget *aboutbox;
 
 aboutwindow = gtk_dialog_new ();
 gtk_widget_set_usize (aboutwindow, 350, 230);
 gtk_window_set_title (GTK_WINDOW (aboutwindow), "About GEX");
 okbutton = gtk_button_new_with_label ("Ok");
 label = gtk_label_new ("GEX Editor eXtrordinare"); 
 aboutbox = gtk_text_new (NULL, NULL);
 gtk_signal_connect_object (GTK_OBJECT (okbutton), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) aboutwindow);
 gtk_text_insert (GTK_TEXT(aboutbox), NULL, NULL, NULL, "Written by Gabriel \"Ace\" Devenyi\n", -1);
 gtk_text_insert (GTK_TEXT(aboutbox), NULL, NULL, NULL, "GEX Version Beta1\n", -1);
 gtk_text_insert (GTK_TEXT(aboutbox), NULL, NULL, NULL, "Built August 22, 2001", -1);
 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (aboutwindow)->vbox),label, TRUE, TRUE, 0);
 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (aboutwindow)->vbox),aboutbox, FALSE, FALSE, 0);
 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (aboutwindow)->action_area),okbutton, TRUE, TRUE, 0);
 
 gtk_widget_show (label);
 gtk_widget_show (aboutbox);
 gtk_widget_show (okbutton);
 gtk_widget_show (aboutwindow);
}

static GtkItemFactoryEntry menu_items[] = {
  { "/_File",         NULL,         NULL, 0, "<Branch>" },
  { "/File/_New",     "<control>N", new_file, 0, NULL },
  { "/File/_Open",    "<control>O", file_open, 0, NULL },
  { "/File/_Save",    "<control>S", save, 0, NULL },
  { "/File/sep1",     NULL,         NULL, 0, "<Separator>" },
  { "/File/Quit",     "<control>Q", gtk_main_quit, 0, NULL },
  { "/_Help",         NULL,         NULL, 0, "<LastBranch>" },
  { "/_Help/About",   NULL,         show_about, 0, NULL }
};

void setup_menus (GtkWidget *window, GtkWidget ** menubar)
{
 GtkItemFactory *item_factory;
 GtkAccelGroup *accel_group;
 gint number_menu_items = sizeof (menu_items) / sizeof (menu_items[0]);
 
 accel_group = gtk_accel_group_new (); 
 item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
 gtk_item_factory_create_items (item_factory, number_menu_items, menu_items, NULL);  
 gtk_accel_group_attach (accel_group, GTK_OBJECT (window));
  
  if (menubar)
  *menubar = gtk_item_factory_get_widget (item_factory, "<main>");
} 

int main(int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *v_box_main;
  GtkWidget *menubar;
  GtkWidget *hbox_sub;
  GtkWidget *vscrollbar;
  
  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_widget_set_usize (window, 600, 500);
  gtk_window_set_title (GTK_WINDOW (window), "GEX Editor");
  gtk_container_set_border_width (GTK_CONTAINER (window), 0);
  gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC(close_application), NULL);
  
  
  v_box_main = gtk_vbox_new(FALSE,0);
  hbox_sub = gtk_hbox_new(FALSE,0);  
  text =  gtk_text_new(NULL,NULL);
  vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
  gtk_text_set_editable(GTK_TEXT(text), TRUE);
  setup_menus (window, &menubar);
    
  gtk_box_pack_start(GTK_BOX(v_box_main), menubar, FALSE, FALSE, 0);
  gtk_box_pack_start(GTK_BOX(v_box_main), hbox_sub, TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(hbox_sub), text, TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(hbox_sub), vscrollbar, FALSE, FALSE,0);  
  gtk_container_add (GTK_CONTAINER (window), v_box_main);

  gtk_widget_show(vscrollbar);
  gtk_widget_show(v_box_main);
  gtk_widget_show(hbox_sub);
  gtk_widget_show (menubar);
  gtk_widget_show(text);   
  gtk_widget_show (window);
  gtk_widget_realize(text);
  
  gtk_main();
  return 0;
}
