/**********************************************************************
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 I4_KEY_ITEM_HH
#define I4_KEY_ITEM_HH


#include "menu/menu.hh"
#include "font/font.hh"
#include "window/style.hh"
#include "device/keys.hh"

class i4_key_item_class : public i4_menu_item_class
{
  protected :

  i4_color_hint_class *color;
  i4_font_hint_class *font;

  i4_str *text;
  w16 pad_lr, pad_ud;
  w16 use_key, key_modifiers;
  i4_bool key_focused, valid;

  public :
  i4_bool has_keyboard_focus() { return key_focused; }

  i4_key_item_class(
               const i4_const_str &_text,
               i4_color_hint_class *color_hint,
               i4_font_hint_class *font_hint,
               i4_graphical_style_class *style,
               w16 key=I4_NO_KEY,
               w16 key_modifiers=0,
               w16 pad_left_right=0,
               w16 pad_up_down=0
               );


  ~i4_key_item_class();

  char *name() { return "key_item"; }

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

  // called when selected or key is pressed
  virtual void action() = 0;

  // if usage is disallowed then the item will be grayed out on the menu
  void allow_use()    { valid=i4_T; }
  void disallow_use() { valid=i4_F; } 
  virtual void do_press()
  {
    if (!valid) return;
    else i4_menu_item_class::do_press();
  }

  i4_menu_item_class *copy()
  {
    return 0;      // don't use this key_item anymore..
  }

} ;

class i4_key_accel_watcher_class : public i4_event_handler_class
{
  struct key_item_pointer_type
  {    
    i4_key_item_class *modkey[8];
    i4_key_item_class **get_from_modifiers(w16 modifiers);
  } 
  user[I4_NUM_KEYS];
  

  w32 total;
  i4_bool initialized;
public:
  i4_key_accel_watcher_class();
  void watch_key(i4_key_item_class *who, w16 key, w16 modifiers);
  void unwatch_key(i4_key_item_class *who, w16 key, w16 modifiers);
  void receive_event(i4_event *ev);
  
  char *name() { return "key accel watcher"; }
};



#endif