/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   2002/X/X - 2014/03/10
/// 
/// @brief  Win32 マウス管理。
/// 
/// ****************************************************************************

#pragma once

#include "../GUI/Container/CPL_WIN_Component.h"


namespace CPL {
namespace WIN {


// _____________________________________________________________________________
/// @brief マウス管理オブジェクト
///
/// ※ ダブルクリックはデフォルトプロシージャでなく、オリジナルでの実装。
// *****************************************************************************
class Mouse
{
  class Impl;
public:
  friend class Component;
  friend class Button;

   Mouse(){}
  ~Mouse(){}

  static void   downL_();
  static void   downM_();
  static void   downR_();
  static void   upL_();
  static void   upM_();
  static void   upR_();
  static void   setManualFlag_( bool in_flag );

public:
  static void   Setup( int in_hold_num );

  static long2  GetPos      ();
  static long   GetX        ();
  static long   GetY        ();
  static long2  GetMovePos  ();
  static long   GetMoveX    ();
  static long   GetMoveY    ();
  static long2  GetOldPos   ();
  static long2  GetScreenPos();

  static bool   GetDownL();
  static bool   GetDownM();
  static bool   GetDownR();
  static HWND   GetWindowHandle();

  static bool   IsMultiClickL( _in<int> in_click_num );
  static bool   IsMultiClickM( _in<int> in_click_num );
  static bool   IsMultiClickR( _in<int> in_click_num );
  static bool   IsManualMove();
  static void   ResetManualFlag();

  static void   SetFlagDownL( _in<bool> in_flag_down_L );
  static void   SetFlagDownM( _in<bool> in_flag_down_M );
  static void   SetFlagDownR( _in<bool> in_flag_down_R );

  static void   SetPos( _in<HWND> in_hdl_win_move, _in<LPARAM> in_lparam );
  static void   SetPos( _in<int> in_X, _in<int> in_Y );
  static void   SetPos( _in<HWND> in_hdl_window, _in<int> in_X, _in<int> in_Y );
};




} // namespace WIN
} // namespace CPL
