/**********************************************************************
This file is part of Crack dot Com's free source code release of Golgotha.
for information about compiling & licensing issues visit this URL
 If that doesn't help, contact Jonathan Clark at 
  golgotha_source@usa.net (Subject should have "GOLG" in it) 
***********************************************************************/

#include "window/window.hh"
#include "window/colorwin.hh"
#include "window/style.hh"
#include "gui/text_input.hh"
#include "gui/text.hh"
#include "app/app.hh"
#include "lisp/lisp.hh"
#include "lisp/li_init.hh"

#include "m1_info.hh"
#include "max_object.hh"

class m1_animation_dialog_class : public i4_color_window_class
{
protected:
  enum 
  //{{{
  {
    SPEED,
    DU,
    DV,
    MAXX,
    MAXY,
    MAXFRAMES,
    NONE,
    ITEMS
  };
  //}}}
  i4_text_window_class *caption[ITEMS];
  i4_text_input_class *input[ITEMS];
public:
  g1_texture_animation *special;

  void add_item(int &h, int item)
  //{{{
  {
    int dh=0;

    if (caption[item]) 
    {
      add_child(10 ,h,caption[item]); 
      dh = caption[item]->height(); 
    }
    if (input[item])
    {
      add_child(100,h,input[item]);
      dh = input[item]->height();
    }
    h += dh + 4;
  }
  //}}}

  void clear_kids()
  //{{{
  {
    for (int i=0; ispeed);
    input[SPEED]->change_text(buf);

    sprintf(buf, "%f", special->du);
    input[DU]->change_text(buf);
    sprintf(buf, "%f", special->dv);
    input[DV]->change_text(buf);

    add_item(h,SPEED);
    add_item(h,DU);
    add_item(h,DV);
  }
  //}}}

  void edit_animation()
  //{{{
  {
    int h=10;
    char buf[512];

    clear_kids();

    sprintf(buf, "%f", special->speed);
    input[SPEED]->change_text(buf);

    int frames_y = int(1.0/special->dv+0.5);

    sprintf(buf, "%d", special->frames_x);
    input[MAXX]->change_text(buf);
    sprintf(buf, "%d", frames_y);
    input[MAXY]->change_text(buf);
    sprintf(buf, "%d", special->max_frames);
    input[MAXFRAMES]->change_text(buf);

    add_item(h,SPEED);
    add_item(h,MAXX);
    add_item(h,MAXY);
    add_item(h,MAXFRAMES);
  }
  //}}}

  void edit_none()
  //{{{
  {
    int h=10;

    clear_kids();

    add_item(h,NONE);
  }
  //}}}

  void find_special()
  //{{{
  {
    m1_poly_object_class *obj = m1_info.obj;
    int i,found=-1;

    special=0;

    if (!obj) return;

    for (i=0; inum_quad; i++)
      if (obj->quad[i].get_flags(g1_quad_class::SELECTED))
        if (found==-1)
          found = i;
        else
          found = -2;

    if (found<0) return;
      
    for (i=0; inum_special; i++)
      if (obj->special[i].quad_number == found)
        special = &obj->special[i];
  }
  //}}}
  
  void init()
  //{{{
  {
    find_special();
    if (!special)
      edit_none();
    else if (special->max_frames==0)
      edit_pan();
    else
      edit_animation();
  }
  //}}}

  m1_animation_dialog_class(i4_graphical_style_class *style)
    : i4_color_window_class(400,200,style->color_hint->neutral(),style)
  //{{{
  {
    caption[SPEED]     = new i4_text_window_class(      "Frames/Tick:",style);
    input  [SPEED]     = new i4_text_input_class(style, "",200,40, this);
    caption[DU]        = new i4_text_window_class(      "DU::",style);
    input  [DU]        = new i4_text_input_class(style, "",200,40, this);
    caption[DV]        = new i4_text_window_class(      "DV:",style);
    input  [DV]        = new i4_text_input_class(style, "",200,40, this);
    caption[MAXX]      = new i4_text_window_class(      "X divisions:",style);
    input  [MAXX]      = new i4_text_input_class(style, "",200,40, this);
    caption[MAXY]      = new i4_text_window_class(      "Y divisions:",style);
    input  [MAXY]      = new i4_text_input_class(style, "",200,40, this);
    caption[MAXFRAMES] = new i4_text_window_class(      "Frames:",style);
    input  [MAXFRAMES] = new i4_text_input_class(style, "",200,40, this);
    caption[NONE]      = new i4_text_window_class(      "No special animation",style);
    input  [NONE]      = 0;

    init();
  }
  //}}}

  virtual void receive_event(i4_event *ev)
  //{{{
  {
    switch (ev->type())
    {
      case i4_event::OBJECT_MESSAGE:
      {
        if (!special)
          break;

        CAST_PTR(tev, i4_text_change_notify_event, ev);
        int found=-1;
        
        for (int i=0; iobject)
            found = i;

        i4_str::iterator p = tev->new_text->begin();
        switch (found)
        {
          case SPEED:     special->speed = p.read_float(); break;
          case DU:        special->du = p.read_float(); break;
          case DV:        special->dv = p.read_float(); break;
          case MAXFRAMES:
            special->max_frames = p.read_number(); 
            if (special->max_frames<1) special->max_frames=1;
            break;
          case MAXX:
            special->frames_x = p.read_number(); 
            if (special->frames_x<1) special->frames_x=1;
            special->du = 1.0/i4_float(special->frames_x);
            break;
          case MAXY:
          {
            int frames_y=p.read_number();
            if (frames_y<1) frames_y=1;
            special->dv = 1.0/i4_float(frames_y);
          } break;
        }
      } break;

      default:
        i4_color_window_class::receive_event(ev);
        break;
    }
  }
  //}}}
};

static i4_event_handler_reference_class m1_animation_dialog;

li_object *m1_edit_special(li_object *o, li_environment *env)
//{{{
{
  if (m1_animation_dialog.get())
    m1_animation_dialog->init();
  else
  {
    i4_graphical_style_class *style = i4_current_app->get_style();
    m1_animation_dialog = new m1_animation_dialog_class(style);
    
    style->create_mp_window(-1,-1, 
                            m1_animation_dialog->width(),
                            m1_animation_dialog->height(),
                            "Edit Special")
      ->add_child(0,0,m1_animation_dialog.get());
  }
  return 0;
}
//}}}
li_automatic_add_function(m1_edit_special, "edit_special");

//{{{ Emacs Locals
// Local Variables:
// folded-file: t
// End:
//}}}