/**********************************************************************
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) 
***********************************************************************/

#ifndef TEXT_INPUT_HH
#define TEXT_INPUT_HH

#include "window/window.hh"
#include "window/style.hh"
#include "string/string.hh"
#include "time/timedev.hh"

class i4_text_change_notify_event : public i4_object_message_event_class
{
public:
  i4_str *new_text;

  i4_text_change_notify_event(void *object,
                              i4_str *str) 
    : i4_object_message_event_class(object),
      new_text(new i4_str(*str)) { }
               
  virtual i4_event *copy() { return new i4_text_change_notify_event(object, new_text); }
  virtual dispatch_time when()  { return NOW; } 
  ~i4_text_change_notify_event() { delete new_text; }
};


class i4_query_text_input_class : public i4_query_message_event_class
{  
public:

  i4_str *copy_of_data;

  i4_query_text_input_class() { copy_of_data=0; }

  virtual i4_event  *copy() 
  {
    i4_query_text_input_class *t=new i4_query_text_input_class;
    if (copy_of_data)
      t->copy_of_data=new i4_str(*copy_of_data,copy_of_data->length()+1);
    return t;
  }

  ~i4_query_text_input_class()
  {
    if (copy_of_data)
      delete copy_of_data;
  }

} ;

class i4_text_input_class : public i4_window_class
{
protected:
  i4_event_handler_class *change_notify;
  i4_str *st;
  i4_font_class *font;
  int max_width;

  sw32 cursor_x;       // position of the cursor
  sw32 left_x;         // how many characters to skip in string before drawing at left side

  i4_bool need_cancel_blink;             // do we have a timer event currently?
  i4_bool cursor_on;                     // this gets toggled by the timer event
  i4_time_device_class::id blink_timer;  // if we have a time ever scheduled
  i4_bool selecting;
  i4_coord last_x,last_y;
  i4_bool changed, sent_change;


  sw32 hi_x1, hi_x2;   // hilight start and end
  i4_graphical_style_class *style;
  i4_bool selected;

  // this will find the character the mouse is on, this should work for non-constantly spaced
  // character strings as well
  w32 mouse_to_cursor();
  void request_blink();
  void stop_blink();
  void sustain_cursor();
  void del_selected();
  void move_cursor_right();
  void move_cursor_left();
  void move_cursor_end();

  virtual void draw_deco(i4_draw_context_class &context);
  void become_active();
  void become_unactive();

  void note_change()
  {
    changed=i4_T;
    sent_change=i4_F;
  }

public:  
  char *name() { return "text_input"; }

  void send_to_parent(i4_event *ev)  {    parent->receive_event(ev);  }

  i4_text_input_class(i4_graphical_style_class *style,
                      const i4_const_str &default_string,
                      w32 width,                         // width in pixels of window
                      w32 max_width,
                      i4_event_handler_class *change_notify=0,
                      i4_font_class *font=0);            // uses style->normal_font by default



  virtual void draw(i4_draw_context_class &context);
  virtual void receive_event(i4_event *ev);

  void change_text(const i4_const_str &new_st);
  i4_str *get_edit_string() { return st; }          // don't delete this return string!
  sw32 get_number();                                // assuming text is a proper numbe


  ~i4_text_input_class();
} ;


i4_window_class *i4_create_text_input(i4_graphical_style_class *style,
                                      const i4_const_str &default_string,
                                      w32 width,            // width in pixels of window
                                      w32 max_width);

#endif