File Annotation

Not logged in
dcdd144598 2011-02-23        kinaba: #include "stdafx.h"
dcdd144598 2011-02-23        kinaba: #include "ip_view.h"
dcdd144598 2011-02-23        kinaba: using namespace editwing;
dcdd144598 2011-02-23        kinaba: using namespace editwing::view;
dcdd144598 2011-02-23        kinaba: using doc::Insert;
dcdd144598 2011-02-23        kinaba: using doc::Delete;
dcdd144598 2011-02-23        kinaba: using doc::Replace;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: //---- ip_cursor.cpp カーソルコントロール
dcdd144598 2011-02-23        kinaba: //
dcdd144598 2011-02-23        kinaba: //		カレットを表示したりIMEに適当に対応したり色々。
dcdd144598 2011-02-23        kinaba: //		ところで疑問なのだが Caret って「カレット」と
dcdd144598 2011-02-23        kinaba: //		読むのか「キャレット」と読むのか?
dcdd144598 2011-02-23        kinaba: //
dcdd144598 2011-02-23        kinaba: //---- ip_text.cpp   文字列操作・他
dcdd144598 2011-02-23        kinaba: //---- ip_parse.cpp  キーワード解析
dcdd144598 2011-02-23        kinaba: //---- ip_wrap.cpp   折り返し
dcdd144598 2011-02-23        kinaba: //---- ip_scroll.cpp スクロール
dcdd144598 2011-02-23        kinaba: //---- ip_draw.cpp   描画・他
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // Caret制御用ラッパー
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class editwing::view::Caret : public Object
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: public:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	Caret( HWND wnd )
dcdd144598 2011-02-23        kinaba: 		: hwnd_( wnd ), created_( false ) {}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	~Caret()
dcdd144598 2011-02-23        kinaba: 		{ Destroy(); }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	void Show()
dcdd144598 2011-02-23        kinaba: 		{ if( created_ ) ::ShowCaret( hwnd_ ); }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	void Hide()
dcdd144598 2011-02-23        kinaba: 		{ if( created_ ) ::HideCaret( hwnd_ ); }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	void Destroy()
dcdd144598 2011-02-23        kinaba: 		{ if( created_ ) ::DestroyCaret(), created_=false; }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	void SetPos( int x, int y )
dcdd144598 2011-02-23        kinaba: 		{ if( created_ ) ::SetCaretPos(x,y), ime().SetPos(hwnd_,x,y); }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	void Create( int H, int W, const LOGFONT& lf )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			if( created_ )
dcdd144598 2011-02-23        kinaba: 				::DestroyCaret();
dcdd144598 2011-02-23        kinaba: 			created_ = true;
dcdd144598 2011-02-23        kinaba: 			::CreateCaret( hwnd_, NULL, W, H );
dcdd144598 2011-02-23        kinaba: 			ime().SetFont( hwnd_, lf );
dcdd144598 2011-02-23        kinaba: 			Show();
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	bool isAlive()
dcdd144598 2011-02-23        kinaba: 		{ return created_; }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	HWND hwnd()
dcdd144598 2011-02-23        kinaba: 		{ return hwnd_; }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	const HWND hwnd_;
dcdd144598 2011-02-23        kinaba: 	bool    created_;
dcdd144598 2011-02-23        kinaba: };
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // カーソル初期化
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Cursor::Cursor( HWND wnd, ViewImpl& vw, doc::DocImpl& dc )
dcdd144598 2011-02-23        kinaba: 	: view_   ( vw )
dcdd144598 2011-02-23        kinaba: 	, doc_    ( dc )
dcdd144598 2011-02-23        kinaba: 	, pEvHan_ ( &defaultHandler_ )
dcdd144598 2011-02-23        kinaba: 	, caret_  ( new Caret(wnd) )
dcdd144598 2011-02-23        kinaba: 	, bIns_   ( true )
dcdd144598 2011-02-23        kinaba: 	, bRO_    ( false )
dcdd144598 2011-02-23        kinaba: 	, timerID_( 0 )
dcdd144598 2011-02-23        kinaba: 	, lineSelectMode_( false )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// てきとーに情報初期化
dcdd144598 2011-02-23        kinaba: 	::SystemParametersInfo( SPI_GETKEYBOARDSPEED, 0, &keyRepTime_, 0 );
dcdd144598 2011-02-23        kinaba: 	cur_.tl = cur_.ad = cur_.vl = cur_.rl = 0;
dcdd144598 2011-02-23        kinaba: 	cur_.vx = cur_.rx = 0; sel_ = cur_;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Cursor::~Cursor()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::AddHandler( CurEvHandler* ev )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	pEvHan_ = ev;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::DelHandler( CurEvHandler* ev )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( ev == pEvHan_ )
dcdd144598 2011-02-23        kinaba: 		pEvHan_ = &defaultHandler_;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // ヘルパー関数群
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::UpdateCaretPos()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// メンバ変数の値を元に、実際にCaretを動かす処理
dcdd144598 2011-02-23        kinaba: 	int x, y;
dcdd144598 2011-02-23        kinaba: 	view_.GetOrigin( &x, &y );
dcdd144598 2011-02-23        kinaba: 	x += cur_.vx;
dcdd144598 2011-02-23        kinaba: 	y += cur_.vl * view_.fnt().H();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 行番号ゾーンにCaretがあっても困るので左に追いやる
dcdd144598 2011-02-23        kinaba: 	if( 0<x && x<view_.left() )
dcdd144598 2011-02-23        kinaba: 		x = -view_.left();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// セット
dcdd144598 2011-02-23        kinaba: 	caret_->SetPos( x, y );
dcdd144598 2011-02-23        kinaba: 	pEvHan_->on_move( cur_, sel_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Redraw( const VPos& s, const VPos& e )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	int x, y; // 原点
dcdd144598 2011-02-23        kinaba: 	view_.GetOrigin( &x, &y );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	POINT sp = {x+s.vx, y+s.vl*view_.fnt().H()};
dcdd144598 2011-02-23        kinaba: 	POINT ep = {x+e.vx, y+e.vl*view_.fnt().H()};
dcdd144598 2011-02-23        kinaba: 	if( s > e ) // Swap
dcdd144598 2011-02-23        kinaba: 		sp.x^=ep.x, ep.x^=sp.x, sp.x^=ep.x,
dcdd144598 2011-02-23        kinaba: 		sp.y^=ep.y, ep.y^=sp.y, sp.y^=ep.y;
dcdd144598 2011-02-23        kinaba: 	ep.x+=2;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 手抜き16bitチェック入り…
dcdd144598 2011-02-23        kinaba: 	const long LFT = view_.left();
dcdd144598 2011-02-23        kinaba: 	const long RHT = view_.right();
dcdd144598 2011-02-23        kinaba: 	const long TOP = 0;
dcdd144598 2011-02-23        kinaba: 	const int  BTM = view_.bottom();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( sp.y == ep.y )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		RECT rc = { Max(LFT,sp.x), sp.y, Min(RHT,ep.x), sp.y+view_.fnt().H() };
dcdd144598 2011-02-23        kinaba: 		::InvalidateRect( caret_->hwnd(), &rc, FALSE );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		RECT rc = { Max(LFT,sp.x), Max(TOP,sp.y), RHT, Min<int>(BTM,sp.y+view_.fnt().H()) };
dcdd144598 2011-02-23        kinaba: 		::InvalidateRect( caret_->hwnd(), &rc, FALSE );
dcdd144598 2011-02-23        kinaba: 		RECT re = { LFT, Max(TOP,ep.y), Min(RHT,ep.x), Min<int>(BTM,ep.y+view_.fnt().H()) };
dcdd144598 2011-02-23        kinaba: 		::InvalidateRect( caret_->hwnd(), &re, FALSE );
dcdd144598 2011-02-23        kinaba: 		RECT rd = { LFT, Max(TOP,rc.bottom), RHT, Min<int>((long)BTM,re.top) };
dcdd144598 2011-02-23        kinaba: 		::InvalidateRect( caret_->hwnd(), &rd, FALSE );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool Cursor::getCurPos( const VPos** start, const VPos** end ) const
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	*start = *end = &cur_;
dcdd144598 2011-02-23        kinaba: 	if( cur_==sel_ )//|| !caret_->isAlive() )
dcdd144598 2011-02-23        kinaba: 		return false;
dcdd144598 2011-02-23        kinaba: 	if( cur_ < sel_ )
dcdd144598 2011-02-23        kinaba: 		*end = &sel_;
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 		*start = &sel_;
dcdd144598 2011-02-23        kinaba: 	return true;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // Viewからの指令を処理
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_setfocus()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	caret_->Create( view_.fnt().H(),
dcdd144598 2011-02-23        kinaba: 		(bIns_ ? 2 : view_.fnt().W()), view_.fnt().LogFont() );
dcdd144598 2011-02-23        kinaba: 	UpdateCaretPos();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_killfocus()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	caret_->Destroy();
dcdd144598 2011-02-23        kinaba: 	Redraw( cur_, sel_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_scroll_begin()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	caret_->Hide();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_scroll_end()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	UpdateCaretPos();
dcdd144598 2011-02-23        kinaba: 	caret_->Show();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::ResetPos()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 設定変更などに対応
dcdd144598 2011-02-23        kinaba: 	view_.ConvDPosToVPos( cur_, &cur_ );
dcdd144598 2011-02-23        kinaba: 	view_.ConvDPosToVPos( sel_, &sel_ );
dcdd144598 2011-02-23        kinaba: 	UpdateCaretPos();
dcdd144598 2011-02-23        kinaba: 	if( caret_->isAlive() )
dcdd144598 2011-02-23        kinaba: 		view_.ScrollTo( cur_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_text_update
dcdd144598 2011-02-23        kinaba: 	( const DPos& s, const DPos& e, const DPos& e2, bool mCur )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	VPos* search_base  = NULL;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( mCur && s==cur_ && e==sel_ )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		search_base = &cur_;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else if( mCur && s==sel_ && e==cur_ )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		search_base = &sel_;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		Redraw( cur_, sel_ );
dcdd144598 2011-02-23        kinaba: 		if( mCur && caret_->isAlive() )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			if( cur_ <= s )
dcdd144598 2011-02-23        kinaba: 				search_base = &cur_;
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			if( s < cur_ )
dcdd144598 2011-02-23        kinaba: 			{
dcdd144598 2011-02-23        kinaba: 				if( cur_ <= e )
dcdd144598 2011-02-23        kinaba: 					cur_ = e2;
dcdd144598 2011-02-23        kinaba: 				else if( cur_.tl == e.tl )
dcdd144598 2011-02-23        kinaba: 					cur_.tl=e2.tl, cur_.ad=e2.ad+cur_.ad-e.ad;
dcdd144598 2011-02-23        kinaba: 				else
dcdd144598 2011-02-23        kinaba: 					cur_.tl=e2.tl-e.tl;
dcdd144598 2011-02-23        kinaba: 				view_.ConvDPosToVPos( cur_, &cur_ );
dcdd144598 2011-02-23        kinaba: 			}
dcdd144598 2011-02-23        kinaba: 			if( s < sel_ )
dcdd144598 2011-02-23        kinaba: 				sel_ = cur_;
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( mCur )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		view_.ConvDPosToVPos( e2, &cur_, search_base );
dcdd144598 2011-02-23        kinaba: 		sel_ = cur_;
dcdd144598 2011-02-23        kinaba: 		if( caret_->isAlive() )
dcdd144598 2011-02-23        kinaba: 			view_.ScrollTo( cur_ );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	UpdateCaretPos();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // キー入力への対応
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void CurEvHandler::on_char( Cursor& cur, unicode wch )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	cur.InputChar( wch );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void CurEvHandler::on_ime( Cursor& cur, unicode* str, ulong len )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	cur.Input( str, len );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void CurEvHandler::on_key( Cursor& cur, int vk, bool sft, bool ctl )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	switch( vk )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 	case VK_HOME:	cur.Home( ctl, sft );	break;
dcdd144598 2011-02-23        kinaba: 	case VK_END:	cur.End( ctl, sft );	break;
dcdd144598 2011-02-23        kinaba: 	case VK_RIGHT:	cur.Right( ctl, sft );	break;
dcdd144598 2011-02-23        kinaba: 	case VK_LEFT:	cur.Left( ctl, sft );	break;
dcdd144598 2011-02-23        kinaba: 	case VK_UP:		cur.Up( ctl, sft );		break;
dcdd144598 2011-02-23        kinaba: 	case VK_DOWN:	cur.Down( ctl, sft );	break;
dcdd144598 2011-02-23        kinaba: 	case VK_PRIOR:	cur.PageUp( sft );		break;
dcdd144598 2011-02-23        kinaba: 	case VK_NEXT:	cur.PageDown( sft );	break;
dcdd144598 2011-02-23        kinaba: 	case VK_DELETE:	cur.Del();				break;
dcdd144598 2011-02-23        kinaba: 	case VK_BACK:	cur.DelBack();			break;
dcdd144598 2011-02-23        kinaba: 	case VK_INSERT: cur.SetInsMode(!cur.isInsMode()); break;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_char( TCHAR ch )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( !bRO_ && ch!=0x7f
dcdd144598 2011-02-23        kinaba: 	 && ((unsigned)ch>=0x20 || ch==TEXT('\r') || ch==TEXT('\t')) )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 	#ifdef _UNICODE
dcdd144598 2011-02-23        kinaba: 		pEvHan_->on_char( *this, ch );
dcdd144598 2011-02-23        kinaba: 	#else
dcdd144598 2011-02-23        kinaba: 		unicode wc = ch;
dcdd144598 2011-02-23        kinaba: 		if( ch & 0x80 ) // 非ASCII文字にはトリビアルでない変換が必要
dcdd144598 2011-02-23        kinaba: 			::MultiByteToWideChar( CP_ACP, MB_COMPOSITE, &ch, 1, &wc, 1 );
dcdd144598 2011-02-23        kinaba: 		pEvHan_->on_char( *this, wc );
dcdd144598 2011-02-23        kinaba: 	#endif
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_ime_composition( LPARAM lp )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	view_.ScrollTo( cur_ );
dcdd144598 2011-02-23        kinaba: 	if( !bRO_ && (lp&GCS_RESULTSTR) )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		unicode* str;
dcdd144598 2011-02-23        kinaba: 		ulong    len;
dcdd144598 2011-02-23        kinaba: 		ime().GetString( caret_->hwnd(), &str, &len );
dcdd144598 2011-02-23        kinaba: 		if( str )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			pEvHan_->on_ime( *this, str, len );
dcdd144598 2011-02-23        kinaba: 			delete [] str;
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_keydown( int vk, LPARAM flag )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	bool sft = (::GetKeyState(VK_SHIFT)>>15)!=0;
dcdd144598 2011-02-23        kinaba: 	bool ctl = (::GetKeyState(VK_CONTROL)>>15)!=0;
dcdd144598 2011-02-23        kinaba: 	pEvHan_->on_key( *this, vk, sft, ctl );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // モード切替
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::SetInsMode( bool bIns )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	bIns_ = bIns;
dcdd144598 2011-02-23        kinaba: 	on_setfocus();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::SetROMode( bool bRO )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	bRO_ = bRO;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // 文字入力・削除
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::InputChar( unicode ch )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 「上書モード & 選択状態でない & 行末でない」なら右一文字選択
dcdd144598 2011-02-23        kinaba: 	if( !bIns_ && cur_==sel_ && doc_.len(cur_.tl)!=cur_.ad )
dcdd144598 2011-02-23        kinaba: 		Right( false, true );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 入力
dcdd144598 2011-02-23        kinaba: 	Input( &ch, 1 );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Input( const unicode* str, ulong len )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( cur_==sel_ )
dcdd144598 2011-02-23        kinaba: 		doc_.Execute( Insert( cur_, str, len ) );
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 		doc_.Execute( Replace( cur_, sel_, str, len ) );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Input( const char* str, ulong len )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	unicode* ustr = new unicode[ len*4 ];
dcdd144598 2011-02-23        kinaba: 	len = ::MultiByteToWideChar( CP_ACP, 0, str, len, ustr, len*4 );
dcdd144598 2011-02-23        kinaba: 	Input( ustr, len );
dcdd144598 2011-02-23        kinaba: 	delete [] ustr;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::DelBack()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 選択状態なら BackSpace == Delete
dcdd144598 2011-02-23        kinaba: 	// でなければ、 BackSpace == Left + Delete (手抜き
dcdd144598 2011-02-23        kinaba: 	if( cur_ == sel_ )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		if( cur_.tl==0 && cur_.ad==0 )
dcdd144598 2011-02-23        kinaba: 			return;
dcdd144598 2011-02-23        kinaba: 		Left( false, false );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	Del();
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Del()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 選択状態なら cur_ 〜 sel_ を削除
dcdd144598 2011-02-23        kinaba: 	// でなければ、 cur_ 〜 rightOf(cur_) を削除
dcdd144598 2011-02-23        kinaba: 	DPos dp = (cur_==sel_ ? doc_.rightOf(cur_) : (DPos)sel_ );
dcdd144598 2011-02-23        kinaba: 	if( cur_ != dp )
dcdd144598 2011-02-23        kinaba: 		doc_.Execute( Delete( cur_, dp ) );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // テキスト取得
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: ki::aarr<unicode> Cursor::getSelectedStr() const
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	DPos dm=cur_, dM=sel_;
dcdd144598 2011-02-23        kinaba: 	if( cur_ > sel_ )
dcdd144598 2011-02-23        kinaba: 		dm=sel_, dM=cur_;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// テキスト取得
dcdd144598 2011-02-23        kinaba: 	int len = doc_.getRangeLength( dm, dM );
dcdd144598 2011-02-23        kinaba: 	ki::aarr<unicode> ub( new unicode[len+1] );
dcdd144598 2011-02-23        kinaba: 	doc_.getText( ub.get(), dm, dM );
dcdd144598 2011-02-23        kinaba: 	return ub;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // クリップボード処理
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Cut()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( cur_ != sel_ )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// コピーして削除
dcdd144598 2011-02-23        kinaba: 		Copy();
dcdd144598 2011-02-23        kinaba: 		Del();
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Copy()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	Clipboard clp( caret_->hwnd(), false );
dcdd144598 2011-02-23        kinaba: 	if( cur_==sel_ || !clp.isOpened() )
dcdd144598 2011-02-23        kinaba: 		return;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	DPos dm=cur_, dM=sel_;
dcdd144598 2011-02-23        kinaba: 	if( cur_ > sel_ )
dcdd144598 2011-02-23        kinaba: 		dm=sel_, dM=cur_;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	HGLOBAL  h;
dcdd144598 2011-02-23        kinaba: 	unicode* p;
dcdd144598 2011-02-23        kinaba: 	int    len = doc_.getRangeLength( dm, dM );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( app().isNT() )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// NT系ならそのままダイレクトに
dcdd144598 2011-02-23        kinaba: 		h = ::GlobalAlloc( GMEM_MOVEABLE, (len+1)*2 );
dcdd144598 2011-02-23        kinaba: 		doc_.getText( static_cast<unicode*>(::GlobalLock(h)), dm, dM );
dcdd144598 2011-02-23        kinaba: 		::GlobalUnlock( h );
dcdd144598 2011-02-23        kinaba: 		clp.SetData( CF_UNICODETEXT, h );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 9x系なら変換が必要
dcdd144598 2011-02-23        kinaba: 		h = ::GlobalAlloc( GMEM_MOVEABLE, (len+1)*3 );
dcdd144598 2011-02-23        kinaba: 		p = new unicode[len+1];
dcdd144598 2011-02-23        kinaba: 		doc_.getText( p, dm, dM );
dcdd144598 2011-02-23        kinaba: 		::WideCharToMultiByte( CP_ACP, 0, p, -1,
dcdd144598 2011-02-23        kinaba: 			static_cast<char*>(::GlobalLock(h)), (len+1)*3, NULL, NULL );
dcdd144598 2011-02-23        kinaba: 		::GlobalUnlock( h );
dcdd144598 2011-02-23        kinaba: 		clp.SetData( CF_TEXT, h );
dcdd144598 2011-02-23        kinaba: 		delete [] p;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Paste()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	Clipboard clp( caret_->hwnd(), true );
dcdd144598 2011-02-23        kinaba: 	if( clp.isOpened() )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		Clipboard::Text txt = clp.GetUnicodeText();
dcdd144598 2011-02-23        kinaba: 		if( txt.data() != NULL )
dcdd144598 2011-02-23        kinaba: 			doc_.Execute(
dcdd144598 2011-02-23        kinaba: 				Replace( cur_, sel_, txt.data(), my_lstrlenW(txt.data()) )
dcdd144598 2011-02-23        kinaba: 			);
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // カーソル移動
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::MoveCur( const DPos& dp, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	VPos vp;
dcdd144598 2011-02-23        kinaba: 	view_.ConvDPosToVPos( dp, &vp );
dcdd144598 2011-02-23        kinaba: 	MoveTo( vp, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::MoveTo( const VPos& vp, bool sel )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( sel )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 選択状態が変わる範囲を再描画
dcdd144598 2011-02-23        kinaba: 		Redraw( vp, cur_ );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 選択解除される範囲を再描画
dcdd144598 2011-02-23        kinaba: 		if( cur_ != sel_ )
dcdd144598 2011-02-23        kinaba: 			Redraw( cur_, sel_ );
dcdd144598 2011-02-23        kinaba: 		sel_ = vp;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	cur_ = vp;
dcdd144598 2011-02-23        kinaba: 	UpdateCaretPos();
dcdd144598 2011-02-23        kinaba: 	view_.ScrollTo( cur_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Home( bool wide, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	VPos np;
dcdd144598 2011-02-23        kinaba: 	np.ad = np.vx = np.rx = np.rl = 0;
dcdd144598 2011-02-23        kinaba: 	if( wide ) // 文書の頭へ
dcdd144598 2011-02-23        kinaba: 		np.tl = np.vl = 0;
dcdd144598 2011-02-23        kinaba: 	else // 行の頭へ
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 1.07.4 --> 1.08 :: Virtual Home
dcdd144598 2011-02-23        kinaba: 		// np.tl = cur_.tl, np.vl = cur_.vl-cur_.rl;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		if( cur_.rl == 0 )
dcdd144598 2011-02-23        kinaba: 			np.tl = cur_.tl, np.vl = cur_.vl-cur_.rl;
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 			view_.ConvDPosToVPos( doc_.rightOf(DPos(cur_.tl, view_.rlend(cur_.tl,cur_.rl-1))), &np, &cur_ );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	MoveTo( np, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::End( bool wide, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	VPos np;
dcdd144598 2011-02-23        kinaba: 	if( wide ) // 文書の末尾へ
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		np.tl = doc_.tln()-1;
dcdd144598 2011-02-23        kinaba: 		np.vl = view_.vln()-1;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else // 行の末尾へ
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 1.07.4 --> 1.08 :: Virtual End
dcdd144598 2011-02-23        kinaba: 		// np.tl = cur_.tl;
dcdd144598 2011-02-23        kinaba: 		// np.vl = cur_.vl + view_.rln(np.tl) - 1 - cur_.rl;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		view_.ConvDPosToVPos( DPos(cur_.tl, view_.rlend(cur_.tl,cur_.rl)), &np, &cur_ );
dcdd144598 2011-02-23        kinaba: 		MoveTo( np, select );
dcdd144598 2011-02-23        kinaba: 		return;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	np.ad = doc_.len(np.tl);
dcdd144598 2011-02-23        kinaba: 	np.rl = view_.rln(np.tl)-1;
dcdd144598 2011-02-23        kinaba: 	np.rx = np.vx = view_.GetLastWidth( np.tl );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	MoveTo( np, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Ud( int dy, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// はみ出す場合は、先頭行/終端行で止まるように制限
dcdd144598 2011-02-23        kinaba: 	VPos np = cur_;
dcdd144598 2011-02-23        kinaba: 	if( (signed)np.vl + dy < 0 )
dcdd144598 2011-02-23        kinaba: 		dy = -(signed)np.vl;
dcdd144598 2011-02-23        kinaba: 	else if( np.vl + dy >= view_.vln() )
dcdd144598 2011-02-23        kinaba: 		dy = view_.vln()-np.vl-1;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	np.vl += dy;
dcdd144598 2011-02-23        kinaba: 	np.rl += dy;
dcdd144598 2011-02-23        kinaba: 	if( dy<0 ) // 上へ戻る場合
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// ジャンプ先論理行の行頭へDash!
dcdd144598 2011-02-23        kinaba: 		while( (signed)np.rl < 0 )
dcdd144598 2011-02-23        kinaba: 			np.rl += view_.rln(--np.tl);
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else if( dy>0 ) // 下へ進む場合
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// ジャンプ先論理行の行頭へDash!
dcdd144598 2011-02-23        kinaba: 		while( (signed)np.rl > 0 )
dcdd144598 2011-02-23        kinaba: 			np.rl -= view_.rln(np.tl++);
dcdd144598 2011-02-23        kinaba: 		if( (signed)np.rl < 0 )
dcdd144598 2011-02-23        kinaba: 			np.rl += view_.rln(--np.tl); //行き過ぎ修正〜
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// x座標決定にかかる
dcdd144598 2011-02-23        kinaba: 	const unicode* str = doc_.tl(np.tl);
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 右寄せになってる。不自然?
dcdd144598 2011-02-23        kinaba: 	np.ad = (np.rl==0 ? 0 : view_.rlend(np.tl,np.rl-1)+1);
dcdd144598 2011-02-23        kinaba: 	np.vx = (np.rl==0 ? 0 : view_.fnt().W(&str[np.ad-1]));
dcdd144598 2011-02-23        kinaba: 	while( np.vx < np.rx && np.ad < view_.rlend(np.tl,np.rl) )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// 左寄せにしてみた。
dcdd144598 2011-02-23        kinaba: 		ulong newvx;
dcdd144598 2011-02-23        kinaba: 		if( str[np.ad] == L'\t' )
dcdd144598 2011-02-23        kinaba: 			newvx = view_.fnt().nextTab(np.vx);
dcdd144598 2011-02-23        kinaba: 		else
dcdd144598 2011-02-23        kinaba: 			newvx = np.vx + view_.fnt().W(&str[np.ad]);
dcdd144598 2011-02-23        kinaba: 		if( newvx > ulong(np.rx) )
dcdd144598 2011-02-23        kinaba: 			break;
dcdd144598 2011-02-23        kinaba: 		np.vx = newvx;
dcdd144598 2011-02-23        kinaba: 		++np.ad;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	MoveTo( np, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Up( bool wide, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	Ud( wide?-3:-1, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Down( bool wide, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	Ud( wide?3:1, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::PageUp( bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	Ud( -view_.cy()/view_.fnt().H(), select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::PageDown( bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	Ud( view_.cy()/view_.fnt().H(), select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Left( bool wide, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	VPos np;
dcdd144598 2011-02-23        kinaba: 	if( cur_!=sel_ && !select )
dcdd144598 2011-02-23        kinaba: 		np = Min( cur_, sel_ ), np.rx = np.vx;
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 		view_.ConvDPosToVPos( doc_.leftOf(cur_,wide), &np, &cur_ );
dcdd144598 2011-02-23        kinaba: 	MoveTo( np, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::Right( bool wide, bool select )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	VPos np;
dcdd144598 2011-02-23        kinaba: 	if( cur_!=sel_ && !select )
dcdd144598 2011-02-23        kinaba: 		np = Max( cur_, sel_ ), np.rx = np.vx;
dcdd144598 2011-02-23        kinaba: 	else
dcdd144598 2011-02-23        kinaba: 		view_.ConvDPosToVPos( doc_.rightOf(cur_,wide), &np, &cur_ );
dcdd144598 2011-02-23        kinaba: 	MoveTo( np, select );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // マウス入力への対応
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_lbutton_dbl( short x, short y )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 行番号ゾーンの場合は特に何もしない
dcdd144598 2011-02-23        kinaba: 	if( view_.lna()-view_.fnt().F() < x )
dcdd144598 2011-02-23        kinaba: 		// 行末の場合も特に何もしない
dcdd144598 2011-02-23        kinaba: 		if( cur_.ad != doc_.len(cur_.tl) )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			VPos np;
dcdd144598 2011-02-23        kinaba: 			view_.ConvDPosToVPos( doc_.wordStartOf(cur_), &np, &cur_ );
dcdd144598 2011-02-23        kinaba: 			MoveTo( np, false );
dcdd144598 2011-02-23        kinaba: 			Right( true, true );
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool Cursor::on_contextmenu( short x, short y )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// Not Tracked
dcdd144598 2011-02-23        kinaba: 	return false;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_lbutton_down( short x, short y, bool shift )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( !shift )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// これまでの選択範囲をクリア
dcdd144598 2011-02-23        kinaba: 		Redraw( cur_, sel_ );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		// 行番号ゾーンのクリックだったら、行選択モードに
dcdd144598 2011-02-23        kinaba: 		lineSelectMode_ = ( x < view_.lna()-view_.fnt().F() );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		// 選択開始位置を調整
dcdd144598 2011-02-23        kinaba: 		view_.GetVPos( x, y, &sel_ );
dcdd144598 2011-02-23        kinaba: 		if( lineSelectMode_ )
dcdd144598 2011-02-23        kinaba: 			view_.ConvDPosToVPos( DPos(sel_.tl,0), &sel_, &sel_ );
dcdd144598 2011-02-23        kinaba: 		cur_ = sel_;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// 移動!
dcdd144598 2011-02-23        kinaba: 	MoveByMouse( dragX_=x, dragY_=y );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	// マウス位置の追跡開始
dcdd144598 2011-02-23        kinaba: 	timerID_ = ::SetTimer( caret_->hwnd(), 178116, keyRepTime_, NULL );
dcdd144598 2011-02-23        kinaba: 	::SetCapture( caret_->hwnd() );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_lbutton_up( short x, short y )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 追跡解除
dcdd144598 2011-02-23        kinaba: 	if( timerID_ != 0 )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		::ReleaseCapture();
dcdd144598 2011-02-23        kinaba: 		::KillTimer( caret_->hwnd(), timerID_ );
dcdd144598 2011-02-23        kinaba: 		timerID_ = 0;
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_mouse_move( short x, short y )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( timerID_ != 0 )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		// View内部ならMouseMoveに反応
dcdd144598 2011-02-23        kinaba: 		POINT pt = { dragX_=x, dragY_=y };
dcdd144598 2011-02-23        kinaba: 		if( PtInRect( &view_.zone(), pt ) )
dcdd144598 2011-02-23        kinaba: 			MoveByMouse( dragX_, dragY_ );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::on_timer()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// View外部ならTimerに反応
dcdd144598 2011-02-23        kinaba: 	POINT pt = { dragX_, dragY_ };
dcdd144598 2011-02-23        kinaba: 	if( !PtInRect( &view_.zone(), pt ) )
dcdd144598 2011-02-23        kinaba: 		MoveByMouse( dragX_, dragY_ );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: void Cursor::MoveByMouse( int x, int y )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	VPos vp;
dcdd144598 2011-02-23        kinaba: 	view_.GetVPos( x, y, &vp, lineSelectMode_ );
dcdd144598 2011-02-23        kinaba: 	MoveTo( vp, true );
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: // 再変換
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: int Cursor::on_ime_reconvertstring( RECONVERTSTRING* rs )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( ! isSelected() || cur_.tl != sel_.tl )
dcdd144598 2011-02-23        kinaba: 		return 0;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: #ifdef _UNICODE
dcdd144598 2011-02-23        kinaba: 	aarr<unicode> str = getSelectedStr();
dcdd144598 2011-02-23        kinaba: #else
dcdd144598 2011-02-23        kinaba: 	aarr<char> str;
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		aarr<unicode> ub = getSelectedStr();
dcdd144598 2011-02-23        kinaba: 		ulong len;
dcdd144598 2011-02-23        kinaba: 		for(len=0; ub[len]; ++len);
dcdd144598 2011-02-23        kinaba: 		ki::aarr<char> nw( new TCHAR[(len+1)*3] );
dcdd144598 2011-02-23        kinaba: 		str = nw;
dcdd144598 2011-02-23        kinaba: 		::WideCharToMultiByte( CP_ACP, 0, ub.get(), -1,
dcdd144598 2011-02-23        kinaba: 			str.get(), (len+1)*3, NULL, NULL );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: #endif
dcdd144598 2011-02-23        kinaba: 	const ulong len = ::lstrlen(str.get());
dcdd144598 2011-02-23        kinaba: 	if( rs != NULL )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		rs->dwSize            = sizeof(RECONVERTSTRING) + (len+1)*sizeof(TCHAR);
dcdd144598 2011-02-23        kinaba: 		rs->dwVersion         = 0;
dcdd144598 2011-02-23        kinaba: 		rs->dwStrOffset       = sizeof(RECONVERTSTRING);
dcdd144598 2011-02-23        kinaba: 		rs->dwStrLen          = len;
dcdd144598 2011-02-23        kinaba: 		rs->dwCompStrOffset   = 0;
dcdd144598 2011-02-23        kinaba: 		rs->dwCompStrLen      = len;
dcdd144598 2011-02-23        kinaba: 		rs->dwTargetStrOffset = 0;
dcdd144598 2011-02-23        kinaba: 		rs->dwTargetStrLen    = len;
dcdd144598 2011-02-23        kinaba: 		memmove( ((char*)rs)+rs->dwStrOffset, str.get(), (len+1)*sizeof(TCHAR) );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 		if( sel_ < cur_ )
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			DPos psel_ = sel_;
dcdd144598 2011-02-23        kinaba: 			MoveCur( cur_, false );
dcdd144598 2011-02-23        kinaba: 			MoveCur( psel_, true );
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	return sizeof(RECONVERTSTRING) + (len+1)*sizeof(TCHAR);
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: bool Cursor::on_ime_confirmreconvertstring( RECONVERTSTRING* rs )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	return false;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: