/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2016/12/17
/// 
/// @brief  ラベルコントロール
/// 
/// ****************************************************************************


#include "CPL_WIN_Label.h"


namespace CPL {
namespace WIN {

// _____________________________________________________________________________
/// @brief 自動サイズ調整
/// 
/// @param[in] in_offs_size
///   : 最小サイズからのオフセットサイズ。
/// 
/// @return なし。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
td_Coord2 Label::GetAdjustSize( _in<td_Coord2> in_offs_size ) const
{
  Core::String str;
  GetTitle( str );
  return zzf_GetTextSize( str.GetTop() ) + in_offs_size;
}


// _____________________________________________________________________________
/// @brief 自動サイズ調整
/// 
/// @param[in] in_offs_size
///   : 最小サイズからのオフセットサイズを指定します。
/// 
/// @return なし。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Label::AdjustSize( _in<td_Coord2> in_offs_size )
{
  this->SetWindowSize( GetAdjustSize( in_offs_size ) + td_Coord2(5,0) ); // サイズ調整
}


// _____________________________________________________________________________
/// @brief クローンの生成
/// 
/// @param[in] in_hdl_win_parent : 親ウィンドウのハンドルを指定します。
/// @param[in] in_offs_x : 複製するオブジェクトの相対的なｘ座標を指定します。
/// @param[in] in_offs_y : 複製するオブジェクトの相対的なｙ座標を指定します。
/// @param[in] in_string : 新しい文字列を指定します。
/// 
/// @return 生成されたオブジェクトのポインタを返します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Label*
  Label::CreateClone
    ( _in<HWND    > in_hdl_win_parent
    , _in<int     > in_offs_x
    , _in<int     > in_offs_y
    , pin<str_type> in_string
    ) const
{
  try{
    auto hdl_win_parent = in_hdl_win_parent;
    Core::String title;
    Rect rt;
    LONG_PTR style = this->GetStyle();
    this->GetWindowRect( rt );
    if( in_string )
    {
      title = in_string;
    }
    else
    {
      this->GetTitle( title );
    }
    if( hdl_win_parent == nullptr )
    {
      hdl_win_parent = this->GetParentWindowHandle();
    }

    return
      CPL_NEW(Label)
        ( hdl_win_parent
        , title
        , td_Coord2( int(rt.left + in_offs_x), int(rt.top + in_offs_y) )
        , td_Coord2( int(rt.GetWidth()), int(rt.GetHeight()) )
        , style
        );
  }
  catch(...)
  {
    return nullptr;
  }
}


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ラベル用プロシージャ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LRESULT
  CALLBACK Label::zzf_StaticProcLabel
    ( HWND   in_hdl_window
    , UINT   in_message
    , WPARAM in_wparam
    , LPARAM in_lparam
    )
{
  Label* ptr_label = dynamic_cast<Label*>( GetHandleToPointer(in_hdl_window) );
  bool flag = false;
  if( ptr_label )
  {
    if( ptr_label->GetEventMode() != eEventMode::AllCut )
    {
      flag = ptr_label->DefaultProc_( in_message, in_wparam, in_lparam ) != 0;
    }
    else
    {
      return 0;
    }
  }
  if( !flag )
  {
    return
      ::CallWindowProc(
          zzf_LABEL_PROC(),
          in_hdl_window,
          in_message,
          in_wparam,
          in_lparam );
  }
  return 0;
}



} // namespace WIN
} // namespace CPL