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

#include <Scintilla.h>
#include <SciLexer.h>
#define PLAT_GTK 1
#include <ScintillaWidget.h>
#include "fuser.h"

#include "editwindow.h"

static GList * editors = NULL;

static int exit_app(GtkWidget*w, GdkEventAny*e, gpointer p) {
  gtk_main_quit();
  return w||e||p||1;	// Avoid warnings
}


static int expose(GtkWidget*w, GdkEventExpose*e, gpointer p) {
  g_print("expose %s\n", (char *)p);
    
  GdkRectangle area;
  area.x = 0;
  area.y = 0;
  area.width = 10;
  area.height = 10;
   
  return FALSE;	
}


static int button_press(GtkWidget*w, GdkEventButton*e, gpointer p) {
  g_print("%s state:%d button:%d\n", (char *)p, e->state, e->button);
  if (e->button == 3) {
    return TRUE;
  }
  return FALSE;	
}


static GtkTargetEntry drop_target_entry = {
  .target = "move-buffer",
  .flags = GTK_TARGET_SAME_APP,
  .info = 1
};

GtkWidget * apex_bar_new() {

  GtkWidget * bar = gtk_hbox_new (FALSE, 0);
  GtkWidget * layout_box = gtk_button_new_with_label("X");  

  gtk_drag_source_set(layout_box,
    GDK_BUTTON1_MASK,
    &drop_target_entry,
    1,
    GDK_ACTION_COPY);
  
  GtkWidget * tag = scintilla_new(); 
  ScintillaObject * scitag = SCINTILLA(tag);
  
  scintilla_set_id(scitag, 1);
  scintilla_send_message(scitag, SCI_STYLECLEARALL, 0, 0);
  scintilla_send_message(scitag, SCI_SETLEXER, SCLEX_CPP, 0);
  scintilla_send_message(scitag, SCI_SETKEYWORDS, 0, (sptr_t)"Get Put Cut Pase");
  scintilla_send_message(scitag, SCI_STYLESETFORE, SCE_C_COMMENT, 0x008000);
  scintilla_send_message(scitag, SCI_STYLESETFORE, SCE_C_COMMENTLINE, 0x008000);
  scintilla_send_message(scitag, SCI_STYLESETFORE, SCE_C_NUMBER, 0x808000);
  scintilla_send_message(scitag, SCI_STYLESETFORE, SCE_C_WORD, 0x800000);
  scintilla_send_message(scitag, SCI_STYLESETFORE, SCE_C_STRING, 0x800080);
  scintilla_send_message(scitag, SCI_STYLESETBOLD, SCE_C_OPERATOR, 1);
  scintilla_send_message(scitag, SCI_SETWRAPMODE, 1, 0);
  scintilla_send_message(scitag, SCI_SETMARGINWIDTHN, 1, 0);
  
  scintilla_send_message(scitag, SCI_INSERTTEXT, 0, (sptr_t)
    "$~/home/bar.txt Put Get Cut Paste | make"
  );  
  
  int pixel_height = scintilla_send_message(scitag, SCI_TEXTHEIGHT, 0, 0);
  
  gtk_widget_set_usize(tag, 500, pixel_height);
  
  gtk_signal_connect(GTK_OBJECT(tag), "button-press-event",
    GTK_SIGNAL_FUNC(button_press), "pressed");
  gtk_signal_connect(GTK_OBJECT(tag), "button-release-event",
    GTK_SIGNAL_FUNC(button_press), "released");

  gtk_box_pack_start (GTK_BOX(bar), layout_box, FALSE, FALSE, 0);
  gtk_box_pack_start (GTK_BOX(bar), tag, TRUE, TRUE, 0);
  
  return bar;
}

GtkWidget * apex_window_new(GtkWidget * app) {

  // Everything is stacked in vbox
  GtkWidget * vbox = gtk_vbox_new (FALSE, 0);

  // Create the body
  GtkWidget * body = scintilla_new();
  ScintillaObject * sci = SCINTILLA(body);

  gtk_signal_connect(GTK_OBJECT(body), "button-press-event",
    GTK_SIGNAL_FUNC(button_press), "pressed");
  gtk_signal_connect(GTK_OBJECT(body), "button-release-event",
    GTK_SIGNAL_FUNC(button_press), "released");
  gtk_signal_connect(GTK_OBJECT(body), "expose-event",
    GTK_SIGNAL_FUNC(expose), "edit");
  
  gtk_signal_connect(GTK_OBJECT(app), "delete_event",
    GTK_SIGNAL_FUNC(exit_app), 0);

  scintilla_set_id(sci, 0);
  gtk_widget_set_usize(body, 500, 300);

  scintilla_send_message(sci, SCI_STYLECLEARALL, 0, 0);
  scintilla_send_message(sci, SCI_SETLEXER, SCLEX_CPP, 0);
  scintilla_send_message(sci, SCI_SETKEYWORDS, 0, (sptr_t)"int char");
  scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_COMMENT, 0x008000);
  scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_COMMENTLINE, 0x008000);
  scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_NUMBER, 0x808000);
  scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_WORD, 0x800000);
  scintilla_send_message(sci, SCI_STYLESETFORE, SCE_C_STRING, 0x800080);
  scintilla_send_message(sci, SCI_STYLESETBOLD, SCE_C_OPERATOR, 1);
  scintilla_send_message(sci, SCI_INSERTTEXT, 0, (sptr_t)
    "int main(int argc, char **argv) {\n"
    "    // Start up the gnome\n"
    "    gnome_init(\"stest\", \"1.0\", argc, argv);\n}"
  );  

  GtkWidget * bar = apex_bar_new();

  gtk_box_pack_start (GTK_BOX(vbox), bar, FALSE, FALSE, 0);
  gtk_box_pack_start (GTK_BOX(vbox), body, TRUE, TRUE, 0);

  // gtk_container_set_focus_chain() is probably what is needed to avoid tabbing into the button  
  
  // Instantiate and populate an ApexEditor and append it to the editors list.
  ApexEditor * neweditor =  g_new(ApexEditor, 1);
  GList * bar_children = gtk_container_get_children(GTK_CONTAINER(bar));
  
  neweditor->layout_box = GTK_WIDGET(g_list_nth_data(bar_children, 0));
  neweditor->tag = GTK_WIDGET(g_list_nth_data(bar_children, 1));
  neweditor->edit = vbox;
  neweditor->body = body;
  
  editors = g_list_append(editors, neweditor);

  return vbox;
}
