#ifndef __CHECKBOX_H
#define __CHECKBOX_H

#include <api/wnd/wndclass/guiobjwnd.h>
#include <api/script/objects/c_script/h_guiobject.h>
#include <api/script/objects/c_script/h_button.h>

#define  CHECKBOX_PARENT GuiObjectWnd

class TextClicks;
class ToggleClicks;


/**
  Class 

  @short 
  @author Nullsoft
  @ver 1.0
  @see 
*/
class CheckBox : public CHECKBOX_PARENT {
  
  public:

    CheckBox(const wchar_t *_text = L"ERROR", const wchar_t *_radioid = NULL);
    virtual ~CheckBox();

    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    virtual int onInit();

    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    virtual int getPreferences(int what);

    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    void toggle(int self_switch);  // this is called by the click catchers.

    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    void setActivated(int activated, int writetocfg=1);
    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    int isActivated();

    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    void setText(const wchar_t *_text);
    const wchar_t *getText();
    void setRadioid(const wchar_t *_radioid);
    const wchar_t *getRadioid() { return radioid; }
    void setRadioVal(const wchar_t *val, int use_radioval=TRUE);
    const wchar_t *getRadioVal() { return radioval; }

    
#ifdef WASABI_COMPILE_CONFIG
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    virtual int onReloadConfig();
#endif
    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    virtual void onNewContent();

    virtual int wantFocus() { return 1; }
    virtual int onChar(unsigned int c);

    virtual void setAction(const wchar_t *str);
    virtual void setActionTarget(const wchar_t *target);
    virtual void setActionParam(const wchar_t *param);
    virtual const wchar_t *getActionParam();

  protected:
    virtual void onToggle(); //override to catch toggles

  private:

    void doAction();
    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    void updateText();

    TextClicks *textclicks;
    ToggleClicks *toggleclicks;
    StringW text;
    StringW radioid;
    GuiObject *buttonGuiObj;
    StringW radioval;
    int use_radioval;
    StringW action, action_target, action_param;
};


/**
  Class 

  @short 
  @author Nullsoft
  @ver 1.0
  @see 
*/
class TextClicks : public H_GuiObject {
  public:
    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    TextClicks(ScriptObject *textobj, CheckBox *_callback) :
        
        /**
          Method
        
          @see 
          @ret 
          @param 
        */
        callback(_callback), H_GuiObject(textobj) {
    }

    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    virtual void hook_onLeftButtonDown(int x, int y) {
      callback->toggle(0);
    }
  private:
    CheckBox *callback;
};


/**
  Class 

  @short 
  @author Nullsoft
  @ver 1.0
  @see 
*/
class ToggleClicks : public H_Button {
  public:
    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    ToggleClicks(ScriptObject *button, CheckBox *_callback) :
        
        /**
          Method
        
          @see 
          @ret 
          @param 
        */
        callback(_callback), H_Button(button) {
        inhere=0;
    }

    
    /**
      Method
    
      @see 
      @ret 
      @param 
    */
    virtual void hook_onActivate(int activate) {
      if (inhere) return;
      inhere=1;
      callback->toggle(1);
      inhere=0;
    }

  private:
    CheckBox *callback;
    int inhere;
};


#endif