/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2016/11/25
/// 
/// @brief  Win32 タブコントロール。
/// 
/// ****************************************************************************

#pragma once

#include "CPL_WIN_Window.h"


namespace CPL {
namespace WIN {



// _____________________________________________________________________________
/// @brief タブコントロール
///
// *****************************************************************************
class TabWindow
  : virtual public Window
{
private:
  Core::Array::Static< sdptr<Container> >
      m_tab_comp_table;
  int m_flag_auto_tab; // タブ切り替えを自動で行うかどうか（0:無効 !0:有効）

  static LRESULT CALLBACK
    zzf_StaticProcTab
      ( HWND   in_hdl_window
      , UINT   in_message
      , WPARAM in_wparam
      , LPARAM in_lparam
      );
  CPL_SINGLETON_INIT( WNDPROC, zzf_TAB_PROC, nullptr )

  SDEF
    DefaultProc_
      ( _in<UINT  > in_message
      , _in<WPARAM> in_wparam
      , _in<LPARAM> in_lparam
      ) override;

public:
  // 
  virtual void  AddTabWindow( _in<sdptr<Container>> in_sp_win );
  virtual void  AddTabWindow( pio<str_type> in_title );
  virtual void  DrawTab();
  virtual int   TabChange( _in<int> in_tab_no = -1 );
  virtual td_Coord2
                GetAdjustSize( _in<BOOL> in_flag_tab_check ) const override;
  virtual void
    AdjustSize
      ( _in<td_Coord2> in_offs_size      = td_Coord2(1,1)
      , _in<BOOL     > in_flag_tab_check = true
      ) override;
  virtual int   GetSelectIndex() const;
  virtual auto  GetAllTabSize() const->td_Coord2;
  virtual int   GetAllTabWidth() const { return GetAllTabSize().x; }   // タブの全てが収まる最小幅を取得
  virtual int   GetAllTabHeight() const { return GetAllTabSize().y; }  // タブの全てが収まる最小高を取得
  virtual U32   GetTabWindowIndex( pin<Container> in_ptr_check_window ) const;
  virtual sdptr<Container>
                GetSelectWindow() const;
  virtual int   IsAutoTabs() const { return m_flag_auto_tab; }
  virtual void  SetAutoTabs( _in<bool> in_flag_out ){ m_flag_auto_tab = in_flag_out; }
  virtual void  ShowSelectFormOnly() const;


  TabWindow
  ( _in<HWND     > in_hdl_win_parent
  , _in<td_Coord2> in_pos          = kPOS_DEFAULT
  , _in<td_Coord2> in_size         = kSIZE_DEFAULT
  , _in<bool     > in_flag_bottom  = false
  , _in<int      > in_tab_capacity = 64
  );
  TabWindow( _in<int> in_tab_capacity = 64 )
    : m_tab_comp_table( in_tab_capacity )
  {}
  virtual ~TabWindow(){}
  

  //// _____________________________________________________________________________
  ///// @brief タブコントロール　Pimpl実装用
  /////
  //// *****************************************************************************
  //class Binder
  //  : public Window::Binder
  //{
  //private:
  //  TabWindow*       getEntity()       { return dynamic_cast<TabWindow*      >(&*impl); }
  //  TabWindow const* getEntity() const { return dynamic_cast<TabWindow const*>(&*impl); }

  //public:
  //  void     AddTabWindow   ( _in<sdptr<Container>> in_sp_win ){        getEntity()->AddTabWindow( in_sp_win );     }
  //  void     AddTabWindow   ( pio<str_type> in_title )         {        getEntity()->AddTabWindow( in_title );      }
  //  void     DrawTab        ()                                 {        getEntity()->DrawTab();                     }
  //  int      TabChange      ( _in<int > in_tab_no = -1 )       { return getEntity()->TabChange( in_tab_no );        }
  //  auto     GetAdjustSize  ( _in<bool> in_tab_check )   const { return getEntity()->GetAdjustSize( in_tab_check ); }
  //  void     AdjustSize     ( _in<td_Coord2> in_offs_size = td_Coord2(1,1)
  //                          , _in<bool     > in_tab_check = true ){ getEntity()->AdjustSize(); }
  //  int      GetSelectIndex () const { return getEntity()->GetSelectIndex();  }
  //  auto     GetAllTabSize  () const { return getEntity()->GetAllTabSize();   }
  //  int      GetAllTabWidth () const { return getEntity()->GetAllTabWidth();  }
  //  int      GetAllTabHeight() const { return getEntity()->GetAllTabHeight(); }
  //  sdptr<Container>
  //           GetSelectWindow() const { return getEntity()->GetSelectWindow(); }


  //  Binder
  //  ( _in<HWND     > in_hdl_win_parent
  //  , _in<td_Coord2> in_pos          = td_Coord2(CW_USEDEFAULT,CW_USEDEFAULT)
  //  , _in<td_Coord2> in_size         = td_Coord2(CW_USEDEFAULT,CW_USEDEFAULT)
  //  , _in<bool     > in_flag_down    = false
  //  , _in<int      > in_tab_capacity = 64
  //  ) : Window::Binder
  //      ( CPL_NEW(TabWindow)( in_hdl_win_parent, in_pos, in_size, in_flag_down, in_tab_capacity ) )
  //  {}
  //protected:
  //  // 継承用
  //  Binder( TabWindow* in_ptr_tab_window )
  //    : Window::Binder( in_ptr_tab_window )
  //  {}
  //};

};



} // namespace WIN
} // namespace CPL
