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: