/* LICENSE:
  =========================================================================
    CMPack'03 Source Code Release for OPEN-R SDK v1.0
    Copyright (C) 2003 Multirobot Lab [Project Head: Manuela Veloso]
    School of Computer Science, Carnegie Mellon University
    All rights reserved.
  ========================================================================= */

#ifdef HAVE_CONFIG_H
#  include <config.h>
#endif

#include <stdio.h>
#include <unistd.h>

#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>

#include "callbacks.h"
#include "interface.h"
#include "support.h"

#include "../../../agent/headers/field.h"

#include "../RobotViewData.h"
#include "../State.h"
#include "GuiState.h"
#include "UI.h"

void
cb_Gcc_open                            (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  static const char *file_name="log";

  DataControl->setLog(file_name);
}


void
cb_Gcc_quit                            (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  DataControl->quit();

  gtk_main_quit();
}


void
cb_Gcc_view_world_view                 (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  bool on;
  on=DataControl->getWorldViewActive();
  on = !on;
  DataControl->setWorldViewActive(on);

  if(WorldViewWin==NULL) {
    WorldViewWin = create_Gworld_view();
  }

  if(on)
    gtk_widget_show(WorldViewWin);
  else
    gtk_widget_hide(WorldViewWin);
}

void
cb_Gcc_view_ego_view                   (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  bool on;
  on=DataControl->getEgoViewActive();
  on = !on;
  DataControl->setEgoViewActive(on);

  if(EgoViewWin==NULL) {
    EgoViewWin = create_Gego_view();
  }

  if(on)
    gtk_widget_show(EgoViewWin);
  else
    gtk_widget_hide(EgoViewWin);
}

void
cb_Gcc_view_vision_rle                 (GtkMenuItem     *menuitem,
                                        gpointer         user_data)
{
  bool on;
  on=DataControl->getVisRLEActive();
  on = !on;
  DataControl->setVisRLEActive(on);

  if(VisRLEWin==NULL) {
    VisRLEWin = create_Gvis_rle();
  }

  if(on)
    gtk_widget_show(VisRLEWin);
  else
    gtk_widget_hide(VisRLEWin);

}

void
cb_Gcc_rewind                          (GtkButton       *button,
                                        gpointer         user_data)
{
  DataControl->rewindLog();
}


void
cb_Gcc_step                            (GtkButton       *button,
                                        gpointer         user_data)
{
  DataControl->stepLog();

  if(WorldViewWin) {
    GtkWidget *widget;
    widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(WorldViewWin), "Gwv_da");
    
    GdkGC *gc;
    gc=widget->style->fg_gc[widget->state];
    
    ui->drawWorldView(widget->window,gc);
  }
}


gboolean
cb_Gwv_da_expose_event                 (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)
{
  GdkGC *gc;
  gc=widget->style->fg_gc[widget->state];

  gdk_window_clear_area (widget->window,
                         event->area.x, event->area.y,
                         event->area.width, event->area.height);
  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             &event->area);

  ui->drawWorldView(widget->window,gc);

  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             NULL);

  return FALSE;
}


gboolean
cb_Gwv_da_configure_event              (GtkWidget       *widget,
                                        GdkEventConfigure *event,
                                        gpointer         user_data)
{
  ui->setSizeWorldView(widget->allocation.width, widget->allocation.height);

  return FALSE;
}


gboolean
cb_Gwv_da_key_press                    (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
  if(event->type == GDK_KEY_RELEASE)
    return FALSE;

  bool redraw=false;

  switch(event->keyval) {
  case GDK_period:
    {
      DataControl->stepLog();
      redraw = true;

    }
    break;
  case GDK_slash:
    {
      DataControl->stepLogMove();
      redraw = true;
    }
    break;
  }

  if(redraw) {
    if(WorldViewWin) {
      GtkWidget *widget;
      widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(WorldViewWin), "Gwv_da");
      
      GdkGC *gc;
      gc=widget->style->fg_gc[widget->state];
      
      ui->drawWorldView(widget->window,gc);
    }

    if(EgoViewWin) {
      GtkWidget *widget;
      widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(EgoViewWin), "Gev_da");
      
      GdkGC *gc;
      gc=widget->style->fg_gc[widget->state];
      
      ui->drawEgoView(widget->window,gc);
    }
  }

  return FALSE;
}

gboolean
cb_Gev_da_expose_event                 (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)
{
  GdkGC *gc;
  gc=widget->style->fg_gc[widget->state];

  gdk_window_clear_area (widget->window,
                         event->area.x, event->area.y,
                         event->area.width, event->area.height);
  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             &event->area);

  ui->drawEgoView(widget->window,gc);

  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             NULL);

  return FALSE;
}


gboolean
cb_Gev_da_configure_event              (GtkWidget       *widget,
                                        GdkEventConfigure *event,
                                        gpointer         user_data)
{
  ui->setSizeEgoView(widget->allocation.width, widget->allocation.height);

  return FALSE;
}


gboolean
cb_Gev_da_key_press                    (GtkWidget       *widget,
                                        GdkEventKey     *event,
                                        gpointer         user_data)
{
  ui->setSizeEgoView(widget->allocation.width, widget->allocation.height);

  return FALSE;
}


extern int guiReadFd;

void
cb_Process_GUI_Pipe(void *data,gint fd,GdkInputCondition) {
  char buf[256];
  bool got_byte=false;

  while(read(guiReadFd,buf,256)>0)
    got_byte=true;

  //printf("update requested\n");

  if(got_byte && WorldViewWin) {
    GtkWidget *widget;
    GdkGC *gc;

    widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(WorldViewWin), "Gwv_da");
    gc=widget->style->fg_gc[widget->state];
    ui->drawWorldView(widget->window,gc);
  }

  if(got_byte && EgoViewWin) {
    GtkWidget *widget;
    GdkGC *gc;

    widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(EgoViewWin), "Gev_da");
    gc=widget->style->fg_gc[widget->state];
    ui->drawEgoView(widget->window,gc);
  }

  if(got_byte && VisRLEWin) {
    GtkWidget *widget;
    GdkGC *gc;

    widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(VisRLEWin), "Gvrle_da");
    gc=widget->style->fg_gc[widget->state];
    ui->drawVisRLE(widget->window,gc);
  }
}

gboolean
cb_Gvrle_da_expose_event               (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)
{
  GdkGC *gc;
  gc=widget->style->fg_gc[widget->state];

  gdk_window_clear_area (widget->window,
                         event->area.x, event->area.y,
                         event->area.width, event->area.height);
  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             &event->area);

  {
    GdkGCValues gc_values;
    gdk_gc_get_values(gc,&gc_values);

    ui->drawVisRLE(widget->window,gc);

    gdk_gc_set_foreground(gc,&gc_values.foreground);
    gdk_gc_set_background(gc,&gc_values.background);
  }
  

  gdk_gc_set_clip_rectangle (widget->style->fg_gc[widget->state],
                             NULL);


  return FALSE;
}


gboolean
cb_Gvrle_da_configure_event            (GtkWidget       *widget,
                                        GdkEventConfigure *event,
                                        gpointer         user_data)
{
  ui->setSizeVisRLE(widget->allocation.width, widget->allocation.height);

  return FALSE;
}



void
cb_Gev_vis_rad_map_toggled             (GtkToggleButton *togglebutton,
                                        gpointer         user_data)
{
  bool on;
  on=DataControl->getEVVisRadMapActive();
  on = !on;
  DataControl->setEVVisRadMapActive(on);

  GtkWidget *widget;
  GdkGC *gc;
  
  widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(EgoViewWin), "Gev_da");
  gc=widget->style->fg_gc[widget->state];
  ui->drawEgoView(widget->window,gc);
}


void
cb_Gev_mod_rad_map_toggled             (GtkToggleButton *togglebutton,
                                        gpointer         user_data)
{
  bool on;
  on=DataControl->getEVModRadMapActive();
  on = !on;
  DataControl->setEVModRadMapActive(on);

  GtkWidget *widget;
  GdkGC *gc;
  
  widget = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(EgoViewWin), "Gev_da");
  gc=widget->style->fg_gc[widget->state];
  ui->drawEgoView(widget->window,gc);
}
