////////////////////////////////////////////////////////////////////////////
// CCursor クラスのインタフェース宣言
//
////////////////////////////////////////////////////////////////////////////

#if !defined( CURSOR_H_INCLUDED_ )
#define CURSOR_H_INCLUDED_

#include "TaEdit_std.h"
#include "LineData.h"


#include <X11/keysym.h>
#include "ScrollInfoPacket.h"
#include "TaEditDoc.h"
#include "XimMgr.h"

class CTaEditDraw;

class CCursor : public CCPInterface
{
public:
	CCursor( const CTaEditDraw *argpDraw, const CTaEditDoc *argpDoc, VClsPtr< CXimMgr > argXimMgr );
	~CCursor();

	// カーソル位置の設定
	void SetCurPos( T_CurPos argPos, ScrollInfoPacket *pPacket, bool OnShift, bool RedrawCursor = TRUE );
	void SetCurPos( T_CurPos argPos, ScrollInfoPacket *pPacket, const T_SelRange& rArgSelRange, bool RedrawCursor = TRUE );

	// 一定時間ごとのカーソルの描画
	void OnTimer();

	// 再描画された
	void OnRedraw();

	// カーソルの移動
	void Up( ScrollInfoPacket *pPacket, bool OnShift );
	void Down( ScrollInfoPacket *pPacket, bool OnShift );
	void Right( ScrollInfoPacket *pPacket, bool OnShift, bool OnCtrl );
	void Left( ScrollInfoPacket *pPacket, bool OnShift, bool OnCtrl );
	void PageUp( ScrollInfoPacket *pPacket, bool OnShift );
	void PageDown( ScrollInfoPacket *pPacket, bool OnShift );
	void End( ScrollInfoPacket *pPacket, bool OnShift, bool OnCtrl );
	void Home( ScrollInfoPacket *pPacket, bool OnShift, bool OnCtrl );

	// 単語の選択
	void SelectWord( ScrollInfoPacket *pPacket, const T_CurPos &rPos );

	// カーソル位置の取得
	const T_CurPos& GetCurPos() const;

	// XIMの位置を再設定する
	void RefleshXIMPos() const;

	// 指定された文字が選択範囲に含まれているか否か
	bool IsCharSelected( const T_CurPos &r ) const;

	// 選択範囲を取得
	const T_SelRange& GetSelRange() const;

	// カーソルの描画位置（X座標）を取得（テキストの先頭を0とした値）
	int GetCurPosX() const;

protected:
	// 画面をスクロールする必要の有無を判断する
	void JdgIsScroll( ScrollInfoPacket *pPacket ) const;

	// キー操作による選択範囲の変化を処理する
	void ProcSelRange( const T_CurPos &Before, const T_CurPos &After, bool OnShift, ScrollInfoPacket *pPacket );

	// 選択範囲が変化した行の範囲を求める
	void Calc_SRChangeLine( int *pSLine, int *pELine, const T_SelRange& rSR1, const T_SelRange& rSR2 ) const;

	// 切り取り・コピーメニューの有効・無効を更新する
	void UpdateCopyPasteMenuSensitive() const;

	// 指定されたカーソル位置のX座標を求める
	int CalcXPosition( T_CurPos pos ) const;

	// カーソルの描画位置を算出（画面の左上を0とした値）
	void CalcDrawCurPos( int *px, int *py ) const;

	// 指定された行において、指定されたX座標に最も近い文字位置を算出する
	int CalcCPosByXPosition( int line, int xpos ) const;

	// 単語単位での移動において、移動先を求める
	int WordSkip( const wstring &rStr, int cpos, int IsRight, const wstring &rWordCharSet ) const;

protected:
	const CTaEditDoc *pDoc;
	T_CurPos CurPos;	// カーソルのある位置（行・列）
	int xpPos;	// 最後にカーソルを描画した位置　Ｘ
	int ypPos;	// 同Ｙ

	bool CurDFlg;	// カーソルが現在描画されているか否か

	T_SelRange SelRange;	// 選択範囲	// （選択範囲が0文字の場合は
						// 　選択されていないことを示す）
	T_CurPos SelStartPos;	// 選択を開始する位置

	const CTaEditDraw *pDraw;	// ドローウィジット
	VClsPtr< CXimMgr > pXimMgr;	// XIM管理オブジェクト

};

#endif // CURSOR_H_INCLUDED_

