/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2016/11/27
/// 
/// @brief  Win32 数値入力ボックスコンポーネント
/// 
/// ****************************************************************************

#pragma once

#include "CPL_WIN_TextBox.h"


namespace CPL {
namespace WIN {

  
// _____________________________________________________________________________
/// @brief 数値入力ボックス
///
// *****************************************************************************
class NumBox
  : public TextBox
{
public:
  friend class Container;

  CPL_SCOPED_ENUM
    ( eNumMode, int
    , Float = 1 // 実数
    , Int   // 10進整数
    , IntX  // 16進整数
    );

private:
  virtual SDEF DefaultProc_( _in<UINT> in_message, _in<WPARAM> in_wparam, _in<LPARAM> in_lparam );

protected:
  eNumMode   m_flag_integer; // 整数値のみ扱うかどうか（0:実数 1:10進整数 2:16進整数）
  double2    m_limit_d;
  S64x2      m_limit_i;
  double_ptr m_ptr_reference_d; // 
  S64_ptr    m_ptr_reference_i;

public:
  virtual double   GetValue() const ;
  virtual void     GetValue( rout<double> out_value ) const ;
  virtual void     GetValue( rout<float > out_value ) const ;
  virtual void     GetValue( rout<S32   > out_value ) const ;
  virtual void     GetValue( rout<S64   > out_value ) const ;
  virtual double   GetMin() const { return m_limit_d.x; }
  virtual double   GetMax() const { return m_limit_d.y; }
  virtual S64      GetMinI64() const { return m_limit_i.x; }
  virtual S64      GetMaxI64() const { return m_limit_i.y; }
  virtual eNumMode GetMode() const { return m_flag_integer; }

  virtual void  SetValue( _in<double> in_num );
  virtual void  SetValue( _in<float > in_num ){ SetValue( (double)in_num ); }
  virtual void  SetValue( _in<S64   > in_num );
  virtual void  SetValue( _in<S32   > in_num ){ SetValue( (S64)in_num ); }
  virtual void  SetIntegerMode( eNumMode in_mode );
  virtual void  SetMin( _in<double> in_min );
  virtual void  SetMin( _in<S64   > in_min );
  virtual void  SetMax( _in<double> in_max );
  virtual void  SetMax( _in<S64   > in_max );
  virtual void  SetLimit( _in<double> in_min, _in<double> in_max )
  {
    SetMin( in_min );
    SetMax( in_max );
  }
  virtual void  SetLimit( _in<S64> in_min, _in<S64> in_max )
  {
    SetMin( in_min );
    SetMax( in_max );
  }
  virtual void  SetReferenceAddress( pio<double> io_ptr_data )
  {
    m_ptr_reference_d = io_ptr_data;
  }
  virtual void  SetReferenceAddress( pio<S64> io_ptr_data )
  {
    m_ptr_reference_i = io_ptr_data;
  }

  virtual Component*
    CreateClone
      ( _in<HWND> in_hdl_win_parent
      , _in<int > in_offs_x
      , _in<int > in_offs_y
      ) const;

  NumBox
  ( _in<HWND     > in_hdl_win_parent
  , _in<td_Coord2> in_ptr_pos
  , _in<td_Coord2> in_ptr_size
  , _in<LONG_PTR > in_win_style = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOHSCROLL
  );
};


} // namespace WIN
} // namespace CPL
