/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   2010/X/X - 2017/02/01
/// 
/// @brief  ラベルボックスコンポーネント。
/// 
/// ****************************************************************************


#include "CPL_GUC_Label.h"


namespace CPL {
namespace GUC {

// _____________________________________________________________________________
/// @brief コンストラクタ
/// 
/// @copydoc doxycomment::arg_in_sp_component_for_parent
/// @copydoc doxycomment::arg_in_position_for_component
/// @copydoc doxycomment::arg_in_size_for_component
/// @copydoc doxycomment::arg_in_string_for_label
/// @param[in] in_flags_draw_style
///   : テキスト描画位置フラグ。\n
///   : CPL::DX::FDM_IDを参照してください。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Label::Label
( _in<sdptr<Component>> in_sp_component_for_parent
, _in<float2          > in_position_for_component
, _in<float2          > in_size_for_component
, pin<td_DefChar      > in_string_for_label
, _in<U32             > in_flags_draw_style
) : td_base
    ( in_sp_component_for_parent
    , in_position_for_component
    , in_size_for_component
    )
  , m_text( in_string_for_label )
  , m_flags_draw_text_style( in_flags_draw_style )
{
  if( in_size_for_component.x <= 0  ||  in_size_for_component.y <= 0 )
  {
    AdjustSize();
  }

  zzf_setupDrawState( false, false, true ); // 描画ステートのデフォルト設定。
  zzf_SetInitializedLevel( zzf_GetClassLevel() );
}


// _____________________________________________________________________________
/// @brief コピーコンストラクタ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Label::Label( cref<Label> in_label )
  : td_base( in_label )
  , m_text( in_label.m_text )
  , m_flags_draw_text_style( in_label.m_flags_draw_text_style )
{
}


// _____________________________________________________________________________
/// @brief クライアント描画イベント。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Label::On_DrawClient( _in<float4> in_rect )
{
  // color
  auto sp_colorset_text = GetColorParameterText();
  auto ptr_color = &sp_colorset_text->color_default;
  if( !IsEnable() )
  {
    ptr_color = &sp_colorset_text->color_invalid;
  }
  else
  if( sm_sp_ac_comp() == this->GetLinkMyself() )
  {
    if( WIN::Mouse::GetDownL() )
    {
      ptr_color = &sp_colorset_text->color_active;
    }
    else
    {
      ptr_color = &sp_colorset_text->color_highlight;
    }
  }

  auto rect = in_rect;
  rect.x += 2;
  rect.y++;

  //short4 rt = IsDrawFrame() ? short4(rect + short4( 1, 1, -1, -1 )) : rect;
  rect.left++;
  rect.top++;
  zzf_DrawText
    ( rect
    , m_text
    , *ptr_color
    , 0.0f
    , float2( 0, 0 )
    , m_flags_draw_text_style
    );
}

// _____________________________________________________________________________
/// @copydoc CPL::GUC::Component::GetAdjustSize(_in<BOOL>)const
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
float2 Label::GetAdjustSize( _in<BOOL> in_flag_show ) const noexcept
{
//#ifdef CPL_UNICODE
  float2 size =
    sm_def_font_mng()->GetStringLineSize( m_text, 0, nullptr );
//#else
//  Core::StringW wstr;
//  Core::ChangeCodeStrings( wstr, m_text );
//  float2 size =
//    sm_def_font_mng()->GetStringLineSize( wstr, 0, nullptr );
//#endif
  return size + float2(4);
}








// _____________________________________________________________________________
/// @brief コンストラクタ。
/// 
/// @copydetails doxycomment::arg_in_sp_component_for_parent
/// @copydoc doxycomment::arg_in_position_for_component
/// @param[in] in_str_caption
///   : キャプションの文字列を指定します。
/// @param[in] in_str_message
///   : メッセージの文字列を指定します。
/// @param[in] in_width_caption
///   : キャプションの幅を指定します。
/// @param[in] in_width_message
///   : メッセージエリアの幅を指定します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CaptionMessage::CaptionMessage
( _in<sdptr<Component>> in_sp_component_for_parent
, _in<float2          > in_position_for_component
, pin<td_DefChar      > in_str_caption
, pin<td_DefChar      > in_str_message
, _in<float           > in_width_caption
, _in<float           > in_width_message
) : CPl_GUC_CAPTION_MESSAGE_BASE
    ( in_sp_component_for_parent
    , in_position_for_component
    , in_str_caption
    , in_width_caption
    )
{
//  StackEventMode sem( this, EVMODE_CHILD_CUT ); // 子供からのイベントを無効化
  auto const height_line = GetLineHeight();

  // メッセージ用ラベルコンポーネントの作成と設定。
  m_sp_item =
    Factory<Label>::Create
      ( this->GetLinkMyself()
      , float2( m_sp_caption->GetSize().x, 0 )
      , float2( in_width_message, height_line + 1 ) 
      , in_str_message
      );
  m_sp_item->SetStateDrawFrame( true );

  // コンテナを表示。
  SetStateVisible( true );
  
  // クラスレベルの設定。
  zzf_SetInitializedLevel( zzf_GetClassLevel() );

  // サイズ調整。
  AdjustSize();
}


// _____________________________________________________________________________
/// @brief コピーコンストラクタ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CaptionMessage::CaptionMessage( cref<CaptionMessage> in_caption_message )
  : td_base( in_caption_message )
{
}


// _____________________________________________________________________________
/// @copydoc CPL::GUC::Component::CreateClone
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sdptr<Component>
  CaptionMessage::CreateClone
    ( _in<sdptr<Component>> in_sp_component_for_parent
    , _in<float2          > in_offset_position_from_original
    ) const
{
  return
    zzz_CreateClone_Basic<td_self>
      ( in_sp_component_for_parent
      , in_offset_position_from_original
      );
}



} // namespace GUC
} // namespace CPL