/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2016/11/17
/// 
/// @brief  Win32 テキストボックスコンポーネント
/// 
/// ****************************************************************************



#include "CPL_WIN_TextBox.h"
#include "../../Base/CPL_WIN_Keyboard.h"


namespace CPL {
namespace WIN {


// _____________________________________________________________________________
/// @brief テキストボックス作成。
/// 
/// @param[in] in_hdl_win_parent
///   : 親のウィンドウハンドル。
/// @param[in] in_pos
///   : ウィンドウの左上隅の座標を指定します。
/// @param[in] in_size
///   : ウィンドウまたはクライアントのサイズを指定します。
/// @param[in] in_win_style
///   : テキストボックスのスタイル。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TextBox::TextBox
( _in<HWND     > in_hdl_win_parent
, _in<td_Coord2> in_pos
, _in<td_Coord2> in_size
, _in<LONG_PTR > in_win_style
)
{
//  zzf_RichLib() = LoadLibrary("RICHED20.DLL");
  bool flag_create =
    zzf_Create
      ( in_hdl_win_parent
      , SwS("")
      , in_pos
      , in_size
      , -1
      , in_win_style
      , 0
      , this
      );
  if( !flag_create )
  {
    CPL_THROW( CPL_WIN_MSG_NOT_CREATE_TEXTBOX );
  }
  
  zzf_StaticInitilize();
  // サブクラス化
  zzf_SetProc( zzf_StaticProcTextBox );
}


// _____________________________________________________________________________
/// @brief 静的初期化関数
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int TextBox::zzf_StaticInitilize()
{
  zzf_TEXTBOX_PROC() = zzf_GetProc( m_hdl_window );
  return true;
}


// _____________________________________________________________________________
/// @brief デストラクタ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TextBox::~TextBox()
{
//  ::FreeLibrary( zzf_RichLib() );
}


// _____________________________________________________________________________
/// @brief テキストボックスオリジナルプロシージャ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LRESULT CALLBACK
  TextBox::zzf_StaticProcTextBox
    ( HWND   in_hdl_window
    , UINT   in_message
    , WPARAM in_wparam
    , LPARAM in_lparam
    )
{
  TextBox* ptr_text_box = dynamic_cast<TextBox*>(GetHandleToPointer(in_hdl_window));
  bool flag = false;
  if( ptr_text_box )
  {
    if( ptr_text_box->GetEventMode() != eEventMode::AllCut ) // イベントが有効ならば
    {
      if( in_message == WM_CHAR  &&  in_wparam == VK_TAB )
      {
        if( Keyboard::Shift() )
        {
          ::SetFocus( ptr_text_box->GetNodePrev()->GetWindowHandle() );
        }
        else
        {
          ::SetFocus( ptr_text_box->GetNodeNext()->GetWindowHandle() );
        }
        return 0;
      }
      else
      if( in_message == WM_SETFONT )
      {
        return
          ::CallWindowProc
            ( zzf_TEXTBOX_PROC()
            , in_hdl_window
            , in_message
            , in_wparam
            , in_lparam
            );
      }
      flag = ptr_text_box->DefaultProc_( in_message, in_wparam, in_lparam ) != 0;
    }
    else // イベント無効
    {
      return 0;
    }
  }
  
  if( !flag )
  {
    return
      ::CallWindowProc
        ( zzf_TEXTBOX_PROC()
        , in_hdl_window
        , in_message
        , in_wparam
        , in_lparam
        );
  }
  else
  {
    return 0;
  }
}



} // namespace WIN
} // namespace CPL

