/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   2010/X/X - 2015/11/14
/// 
/// @brief  グラフィカルユーザーコンポーネント基本部分。
/// 
/// ****************************************************************************



//#include "CPL_GUC_Base.h"
#include "CPL_GUC_Component.h"
#include "CPL_GUC_Base.h"


namespace CPL {
namespace GUC {
  


const DX::RectColor4P kCOLOR4P_BLACK       = kCOLOR_BLACK      ;
const DX::RectColor4P kCOLOR4P_DARKGRAY    = kCOLOR_DARKGRAY   ;
const DX::RectColor4P kCOLOR4P_GRAY        = kCOLOR_GRAY       ;
const DX::RectColor4P kCOLOR4P_LIGHTGRAY   = kCOLOR_LIGHTGRAY  ;
const DX::RectColor4P kCOLOR4P_WHITE       = kCOLOR_WHITE      ;
const DX::RectColor4P kCOLOR4P_ORANGE      = kCOLOR_ORANGE     ;
const DX::RectColor4P kCOLOR4P_BROWN       = kCOLOR_BROWN      ;
const DX::RectColor4P kCOLOR4P_DARKRED     = kCOLOR_DARKRED    ;
const DX::RectColor4P kCOLOR4P_RED         = kCOLOR_RED        ;
const DX::RectColor4P kCOLOR4P_PINK        = kCOLOR_PINK       ;
const DX::RectColor4P kCOLOR4P_DARKGREEN   = kCOLOR_DARKGREEN  ;
const DX::RectColor4P kCOLOR4P_GREEN       = kCOLOR_GREEN      ;
const DX::RectColor4P kCOLOR4P_LIME        = kCOLOR_LIME       ;
const DX::RectColor4P kCOLOR4P_LIGHTGREEN  = kCOLOR_LIGHTGREEN ;
const DX::RectColor4P kCOLOR4P_DARKBLUE    = kCOLOR_DARKBLUE   ;
const DX::RectColor4P kCOLOR4P_BLUE        = kCOLOR_BLUE       ;
const DX::RectColor4P kCOLOR4P_LIGHTBLUE   = kCOLOR_LIGHTBLUE  ;
const DX::RectColor4P kCOLOR4P_CYAN        = kCOLOR_CYAN       ;
const DX::RectColor4P kCOLOR4P_GREENYELLOW = kCOLOR_GREENYELLOW;
const DX::RectColor4P kCOLOR4P_OLIVE       = kCOLOR_OLIVE      ;
const DX::RectColor4P kCOLOR4P_YELLOW      = kCOLOR_YELLOW     ;
const DX::RectColor4P kCOLOR4P_LIGHTYELLOW = kCOLOR_LIGHTYELLOW;
const DX::RectColor4P kCOLOR4P_PURPLE      = kCOLOR_PURPLE     ;
const DX::RectColor4P kCOLOR4P_BLUEVIOLET  = kCOLOR_BLUEVIOLET ;
const DX::RectColor4P kCOLOR4P_MAGENTA     = kCOLOR_MAGENTA    ;
const DX::RectColor4P kCOLOR4P_GOLD        = kCOLOR_GOLD       ;
const DX::RectColor4P kCOLOR4P_SILVER      = kCOLOR_SILVER     ;

// _____________________________________________________________________________
/// @brief GUC初期化。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void
  Initialize
    ( _in<DX::DXDevice*             > in_ptr_d3ddev
    , _in<sdptr<DX::FontDrawManager>> in_sp_font   )
{
  static WIN::ComInitializer ci;

  Component::SetD3DDevice( in_ptr_d3ddev );
  Component::SetDrawFontManager( in_sp_font );
}



// _____________________________________________________________________________
/// @brief コンストラクタ（４点４状態に単色設定）
/// 
/// @param[in] in_color : カラー(CDI::ColorType)データを指定します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DrawColorSet::DrawColorSet( _in<CDI::ColorType> in_color )
{
  color_default   =
  color_highlight =
  color_active    =
  color_invalid   = DX::RectColor4P( in_color );
}

// _____________________________________________________________________________
/// @brief コンストラクタ（４状態に全てに同色の４点カラーを指定）
/// 
/// @param[in] in_color4p : ４点カラー(DX::RectColor4P)データを指定します。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DrawColorSet::DrawColorSet( _in<DX::RectColor4P> in_color4p )
  : color_default  ( in_color4p )
  , color_highlight( in_color4p )
  , color_active   ( in_color4p )
  , color_invalid  ( in_color4p )
{
}

// _____________________________________________________________________________
/// @brief コンストラクタ（４状態の全てに単色カラーを指定）
/// 
/// @param[in] in_color_default   : デフォルトの単色カラー。
/// @param[in] in_color_highlight : 強調１の単色カラー。
/// @param[in] in_color_active    : 強調２の単色カラー。
/// @param[in] in_color_invalid   : 無効時の単色カラー。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DrawColorSet::DrawColorSet
( _in<CDI::ColorType> in_color_default
, _in<CDI::ColorType> in_color_highlight
, _in<CDI::ColorType> in_color_active
, _in<CDI::ColorType> in_color_invalid
) : color_default  ( in_color_default   )
  , color_highlight( in_color_highlight )
  , color_active   ( in_color_active    )
  , color_invalid  ( in_color_invalid   )
{
}

//// _____________________________________________________________________________
///// @brief コンストラクタ（４状態の全てに４点カラーを指定）
///// 
///// @param[in] in_sp_color_default   : デフォルトの４点カラー。
///// @param[in] in_sp_color_highlight : 強調１の４点カラー。
///// @param[in] in_sp_color_active    : 強調２の４点カラー。
///// @param[in] in_sp_color_invalid   : 無効時の４点カラー。
//// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//DrawColorSet::DrawColorSet
//( _in<sdptr<DX::RectColor4P>> in_sp_color_default
//, _in<sdptr<DX::RectColor4P>> in_sp_color_highlight
//, _in<sdptr<DX::RectColor4P>> in_sp_color_active
//, _in<sdptr<DX::RectColor4P>> in_sp_color_invalid
//) : sp_color_default  ( in_sp_color_default   )
//  , sp_color_highlight( in_sp_color_highlight )
//  , sp_color_active   ( in_sp_color_active    )
//  , sp_color_invalid  ( in_sp_color_invalid   )
//{
//}


// _____________________________________________________________________________
/// @brief コンストラクタ（４状態の全てに４点カラーを指定）
/// 
/// @param[in] in_color4p_default   : デフォルトの４点カラー。
/// @param[in] in_color4p_highlight : 強調１の４点カラー。
/// @param[in] in_color4p_active    : 強調２の４点カラー。
/// @param[in] in_color4p_invalid   : 無効時の４点カラー。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DrawColorSet::DrawColorSet
( _in<DX::RectColor4P> in_color4p_default
, _in<DX::RectColor4P> in_color4p_highlight
, _in<DX::RectColor4P> in_color4p_active
, _in<DX::RectColor4P> in_color4p_invalid
) : color_default  ( in_color4p_default   )
  , color_highlight( in_color4p_highlight )
  , color_active   ( in_color4p_active    )
  , color_invalid  ( in_color4p_invalid   )
{
}


// _____________________________________________________________________________
/// @brief コピーコンストラクタ
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DrawColorSet::DrawColorSet( cref<DrawColorSet> in_dcs )
  : color_default  ( in_dcs.color_default   )
  , color_highlight( in_dcs.color_highlight )
  , color_active   ( in_dcs.color_active    )
  , color_invalid  ( in_dcs.color_invalid   )
{
}



// _____________________________________________________________________________
/// @brief GUC用のカラーパターンの定義。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
namespace ColorPattern
{
  //

  // 標準グラデーション。
  DX::RectColor4P GradationNormal( float in_alpha )
  {
    static DX::RectColor4P const
      color4p
        ( DX::ColorType(1.0f,1.0f,1.0f,in_alpha)
        , DX::ColorType(0.9f,0.9f,0.9f,in_alpha)
        , DX::ColorType(0.9f,0.9f,0.9f,in_alpha)
        , DX::ColorType(0.9f*0.9f,0.9f*0.9f,0.9f*0.9f,in_alpha)
        );
    return color4p;
  }

  // _____________________________________________________________________________
  // 通常の静的なコンポーネント（マウス等で反応しないパターン）
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  // 背景カラーの取得。
  DrawColorSet StaticBG( float in_alpha )
  {
    auto const gradiation = GradationNormal( in_alpha );
    return
      DrawColorSet
        ( kCOLOR4P_WHITE * gradiation
        , kCOLOR4P_WHITE * gradiation
        , kCOLOR4P_WHITE * gradiation
        , kCOLOR4P_GRAY  * gradiation
        );
  }
  // フレームカラーの取得。
  DrawColorSet StaticFrame( float in_alpha )
  {
    return
      DrawColorSet
        ( kCOLOR4P_BLACK
        , kCOLOR4P_BLACK
        , kCOLOR4P_BLACK
        , kCOLOR4P_LIGHTGRAY
        );
  }
  // テキストカラーの取得。
  DrawColorSet StaticText( float in_alpha )
  {
    return
      DrawColorSet
        ( kCOLOR4P_BLACK
        , kCOLOR4P_BLACK
        , kCOLOR4P_BLACK
        , kCOLOR4P_LIGHTGRAY
        );
  }


  // _____________________________________________________________________________
  // 動的なコンポーネント。
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  // 背景カラーの取得。
  DrawColorSet DynamicBG( float in_alpha )
  {
    auto const gradiation = GradationNormal( in_alpha );
    return
      DrawColorSet
        ( kCOLOR4P_WHITE     * gradiation
        , (kCOLOR4P_WHITE + kCOLOR4P_LIGHTBLUE) / 2.0f * gradiation
        , (kCOLOR4P_WHITE + kCOLOR4P_PINK) / 2.0f * gradiation
        , kCOLOR4P_GRAY      * gradiation
        );
  }
  // フレームカラーの取得。
  DrawColorSet DynamicFrame( float in_alpha )
  {
    return
      DrawColorSet
        ( kCOLOR4P_BLACK
        , kCOLOR4P_DARKBLUE
        , kCOLOR4P_DARKRED
        , kCOLOR4P_LIGHTGRAY
        );
  }
  // テキストカラーの取得。
  DrawColorSet DynamicText( float in_alpha )
  {
    return
      DrawColorSet
        ( kCOLOR4P_BLACK
        , kCOLOR4P_DARKBLUE
        , kCOLOR4P_DARKRED
        , kCOLOR4P_LIGHTGRAY
        );
  }
}



} // namespace GUC


// _____________________________________________________________________________
/// @brief DX::ColorTypeからタグ形式へ変換
/// 
/// @param[in] in_color_set : GUC::DrawColorSetへの参照
/// 
/// @return タグオブジェクトを返す。
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TBTag ToTag( _in<GUC::DrawColorSet> in_color_set )
{
  return 
    TBTag
    { "DrawColorSet"
    , (ToTag( in_color_set.color_default   ), "Default"   )
    , (ToTag( in_color_set.color_highlight ), "Highlight" )
    , (ToTag( in_color_set.color_active    ), "Active"    )
    , (ToTag( in_color_set.color_invalid   ), "Invalid"   )
    };
}

// _____________________________________________________________________________
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GUC::DrawColorSet& operator << ( rio<GUC::DrawColorSet> c, _in<TBTag> in_tag )
{
  auto sp_item = in_tag.GetTagChild();
  if( sp_item ) c.color_default   << *sp_item, sp_item = sp_item->GetTagChild();
  if( sp_item ) c.color_highlight << *sp_item, sp_item = sp_item->GetTagChild();
  if( sp_item ) c.color_active    << *sp_item, sp_item = sp_item->GetTagChild();
  if( sp_item ) c.color_invalid   << *sp_item;
  return c;
}


} // namespace CPL