dcdd144598 2011-02-23 kinaba: #include "stdafx.h" dcdd144598 2011-02-23 kinaba: #include "ip_doc.h" dcdd144598 2011-02-23 kinaba: using namespace editwing; dcdd144598 2011-02-23 kinaba: using namespace editwing::doc; 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_text.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: //---- 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: //---- ip_cursor.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: // 公開インターフェイス dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Document::Document() : busy_(false) dcdd144598 2011-02-23 kinaba: { impl_ = new DocImpl( *this ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Document::~Document() dcdd144598 2011-02-23 kinaba: {} dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::Execute( const Command& c ) dcdd144598 2011-02-23 kinaba: { impl_->Execute( c ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::SetKeyword( const unicode* b, ulong s ) dcdd144598 2011-02-23 kinaba: { impl_->SetKeyword( b, s ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::AddHandler( DocEvHandler* h ) dcdd144598 2011-02-23 kinaba: { impl_->AddHandler( h ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::DelHandler( DocEvHandler* h ) dcdd144598 2011-02-23 kinaba: { impl_->DelHandler( h ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::OpenFile( aptr<TextFileR> t ) dcdd144598 2011-02-23 kinaba: { impl_->OpenFile( t ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::SaveFile( TextFileW& t ) dcdd144598 2011-02-23 kinaba: { impl_->SaveFile( t ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::ClearAll() dcdd144598 2011-02-23 kinaba: { impl_->ClearAll(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong Document::tln() const dcdd144598 2011-02-23 kinaba: { return impl_->tln(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: const unicode* Document::tl( ulong i ) const dcdd144598 2011-02-23 kinaba: { return impl_->tl( i ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong Document::len( ulong i ) const dcdd144598 2011-02-23 kinaba: { return impl_->len( i ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong Document::getRangeLength( const DPos& s, const DPos& e ) const dcdd144598 2011-02-23 kinaba: { return impl_->getRangeLength( s, e ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::getText( unicode* b, const DPos& s, const DPos& e ) const dcdd144598 2011-02-23 kinaba: { impl_->getText( b, s, e ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool Document::isUndoAble() const dcdd144598 2011-02-23 kinaba: { return impl_->isUndoAble(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool Document::isRedoAble() const dcdd144598 2011-02-23 kinaba: { return impl_->isRedoAble(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool Document::isModified() const dcdd144598 2011-02-23 kinaba: { return impl_->isModified(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::ClearModifyFlag() dcdd144598 2011-02-23 kinaba: { impl_->ClearModifyFlag(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::Undo() dcdd144598 2011-02-23 kinaba: { impl_->Undo(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::Redo() dcdd144598 2011-02-23 kinaba: { impl_->Redo(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void Document::SetUndoLimit( long lim ) dcdd144598 2011-02-23 kinaba: { impl_->SetUndoLimit( lim ); } 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 DocImpl::AddHandler( DocEvHandler* eh ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ハンドラ追加 dcdd144598 2011-02-23 kinaba: pEvHan_.Add( eh ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::DelHandler( DocEvHandler* eh ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 後ろから見て行って… dcdd144598 2011-02-23 kinaba: const int last = pEvHan_.size() - 1; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // …見つけたら削除 dcdd144598 2011-02-23 kinaba: for( int i=last; i>=0; --i ) dcdd144598 2011-02-23 kinaba: if( pEvHan_[i] == eh ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: pEvHan_[i] = pEvHan_[last]; dcdd144598 2011-02-23 kinaba: pEvHan_.ForceSize( last ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::Fire_TEXTUPDATE dcdd144598 2011-02-23 kinaba: ( const DPos& s, const DPos& e, const DPos& e2, bool reparsed, bool nmlcmd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: AutoLock lk(this); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 全部にイベント通知 dcdd144598 2011-02-23 kinaba: for( ulong i=0, ie=pEvHan_.size(); i<ie; ++i ) dcdd144598 2011-02-23 kinaba: pEvHan_[i]->on_text_update( s, e, e2, reparsed, nmlcmd ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::Fire_KEYWORDCHANGE() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: AutoLock lk(this); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 全部にイベント通知 dcdd144598 2011-02-23 kinaba: for( ulong i=0, ie=pEvHan_.size(); i<ie; ++i ) dcdd144598 2011-02-23 kinaba: pEvHan_[i]->on_keyword_change(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::Fire_MODIFYFLAGCHANGE() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: AutoLock lk(this); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 全部にイベント通知 dcdd144598 2011-02-23 kinaba: bool b = urdo_.isModified(); dcdd144598 2011-02-23 kinaba: for( ulong i=0, ie=pEvHan_.size(); i<ie; ++i ) dcdd144598 2011-02-23 kinaba: pEvHan_[i]->on_dirtyflag_change( b ); 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: // UnDo,ReDo 処理 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UnReDoChain::Node::Node( Command* c, Node* p, Node* n ) dcdd144598 2011-02-23 kinaba: : cmd_ ( c ) dcdd144598 2011-02-23 kinaba: , prev_( p ) dcdd144598 2011-02-23 kinaba: , next_( n ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UnReDoChain::Node::Node() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: next_ = prev_ = this; dcdd144598 2011-02-23 kinaba: cmd_ = NULL; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UnReDoChain::Node::~Node() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: delete cmd_; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void UnReDoChain::Node::ResetCommand( Command* cmd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: delete cmd_; dcdd144598 2011-02-23 kinaba: cmd_ = cmd; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UnReDoChain::UnReDoChain() dcdd144598 2011-02-23 kinaba: : lastOp_ ( &headTail_ ) dcdd144598 2011-02-23 kinaba: , savedPos_( &headTail_ ) dcdd144598 2011-02-23 kinaba: , num_ ( 0 ) dcdd144598 2011-02-23 kinaba: , limit_ ( static_cast<ulong>(-1) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UnReDoChain::~UnReDoChain() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Clear(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong UnReDoChain::Node::ChainDelete(Node*& savedPos_ref) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( cmd_ == NULL ) dcdd144598 2011-02-23 kinaba: return 0; dcdd144598 2011-02-23 kinaba: if( savedPos_ref == this ) dcdd144598 2011-02-23 kinaba: savedPos_ref = NULL; dcdd144598 2011-02-23 kinaba: dptr<Node> d(this); dcdd144598 2011-02-23 kinaba: return 1 + next_->ChainDelete(savedPos_ref); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void UnReDoChain::Clear() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: headTail_.next_->ChainDelete(savedPos_); dcdd144598 2011-02-23 kinaba: headTail_.next_ = headTail_.prev_ = lastOp_ = savedPos_ = &headTail_; dcdd144598 2011-02-23 kinaba: num_ = 0; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void UnReDoChain::SetLimit( long lim ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: limit_ = Max( 1UL, ulong(lim) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void UnReDoChain::Undo( Document& doc ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: lastOp_->ResetCommand( (*lastOp_->cmd_)(doc) ); dcdd144598 2011-02-23 kinaba: lastOp_ = lastOp_->prev_; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void UnReDoChain::Redo( Document& doc ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: lastOp_ = lastOp_->next_; dcdd144598 2011-02-23 kinaba: lastOp_->ResetCommand( (*lastOp_->cmd_)(doc) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void UnReDoChain::NewlyExec( const Command& cmd, Document& doc ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Command* nCmd = cmd(doc); dcdd144598 2011-02-23 kinaba: if( nCmd != NULL ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: num_ -= (lastOp_->next_->ChainDelete(savedPos_) - 1); dcdd144598 2011-02-23 kinaba: lastOp_ = lastOp_->next_ = new Node(nCmd,lastOp_,&headTail_); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: while( limit_ < num_ ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 回数制限を越えたので、古い物を削除 dcdd144598 2011-02-23 kinaba: Node* old = headTail_.next_; dcdd144598 2011-02-23 kinaba: headTail_.next_ = old->next_; dcdd144598 2011-02-23 kinaba: old->next_->prev_ = &headTail_; dcdd144598 2011-02-23 kinaba: if( old != &headTail_ ) dcdd144598 2011-02-23 kinaba: delete old; dcdd144598 2011-02-23 kinaba: if( savedPos_ == &headTail_ ) dcdd144598 2011-02-23 kinaba: savedPos_ = NULL; dcdd144598 2011-02-23 kinaba: else if( savedPos_ == old ) dcdd144598 2011-02-23 kinaba: savedPos_ = &headTail_; dcdd144598 2011-02-23 kinaba: --num_; 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: bool DocImpl::isUndoAble() const dcdd144598 2011-02-23 kinaba: { return urdo_.isUndoAble(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool DocImpl::isRedoAble() const dcdd144598 2011-02-23 kinaba: { return urdo_.isRedoAble(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool DocImpl::isModified() const dcdd144598 2011-02-23 kinaba: { return urdo_.isModified(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::SetUndoLimit( long lim ) dcdd144598 2011-02-23 kinaba: { urdo_.SetLimit( lim ); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::ClearModifyFlag() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: bool b = urdo_.isModified(); dcdd144598 2011-02-23 kinaba: urdo_.SavedHere(); dcdd144598 2011-02-23 kinaba: if( b != urdo_.isModified() ) dcdd144598 2011-02-23 kinaba: Fire_MODIFYFLAGCHANGE(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::Undo() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( urdo_.isUndoAble() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: bool b = urdo_.isModified(); dcdd144598 2011-02-23 kinaba: urdo_.Undo(doc_); dcdd144598 2011-02-23 kinaba: if( b != urdo_.isModified() ) dcdd144598 2011-02-23 kinaba: Fire_MODIFYFLAGCHANGE(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::Redo() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( urdo_.isRedoAble() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: bool b = urdo_.isModified(); dcdd144598 2011-02-23 kinaba: urdo_.Redo(doc_); dcdd144598 2011-02-23 kinaba: if( b != urdo_.isModified() ) dcdd144598 2011-02-23 kinaba: Fire_MODIFYFLAGCHANGE(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::Execute( const Command& cmd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: bool b = urdo_.isModified(); dcdd144598 2011-02-23 kinaba: urdo_.NewlyExec( cmd, doc_ ); dcdd144598 2011-02-23 kinaba: if( b != urdo_.isModified() ) dcdd144598 2011-02-23 kinaba: Fire_MODIFYFLAGCHANGE(); 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: DPos DocImpl::leftOf( const DPos& dp, bool wide ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( dp.ad == 0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 行の先頭だが、ファイルの先頭ではない場合 dcdd144598 2011-02-23 kinaba: // 一つ前の行の行末へ dcdd144598 2011-02-23 kinaba: if( dp.tl > 0 ) dcdd144598 2011-02-23 kinaba: return DPos( dp.tl-1, len(dp.tl-1) ); dcdd144598 2011-02-23 kinaba: return dp; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else if( !wide ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 行の途中で、普通に1文字戻る場合 dcdd144598 2011-02-23 kinaba: const unicode* l = tl(dp.tl); dcdd144598 2011-02-23 kinaba: if( dp.ad>=2 && isLowSurrogate(l[dp.ad-1]) && isHighSurrogate(l[dp.ad-2]) ) dcdd144598 2011-02-23 kinaba: return DPos( dp.tl, dp.ad-2 ); dcdd144598 2011-02-23 kinaba: return DPos( dp.tl, dp.ad-1 ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 行の途中で、1単語分戻る場合 dcdd144598 2011-02-23 kinaba: const uchar* f = pl(dp.tl); dcdd144598 2011-02-23 kinaba: ulong s = dp.ad-1; dcdd144598 2011-02-23 kinaba: while( (f[s]>>5)==0 && 0<=s ) dcdd144598 2011-02-23 kinaba: --s; dcdd144598 2011-02-23 kinaba: return DPos( dp.tl, s ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DPos DocImpl::rightOf( const DPos& dp, bool wide ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( dp.ad == len(dp.tl) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 行末だが、ファイルの終わりではない場合 dcdd144598 2011-02-23 kinaba: // 一つ後の行の先頭へ dcdd144598 2011-02-23 kinaba: if( dp.tl < tln()-1 ) dcdd144598 2011-02-23 kinaba: return DPos( dp.tl+1, 0 ); dcdd144598 2011-02-23 kinaba: return dp; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else if( !wide ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 行の途中で、普通に1文字進む場合 dcdd144598 2011-02-23 kinaba: const unicode* l = tl(dp.tl); dcdd144598 2011-02-23 kinaba: // 番兵 0x007f が l の末尾にいるので長さチェックは不要 dcdd144598 2011-02-23 kinaba: if( isHighSurrogate(l[dp.ad]) && isLowSurrogate(l[dp.ad+1]) ) dcdd144598 2011-02-23 kinaba: return DPos( dp.tl, dp.ad+2 ); dcdd144598 2011-02-23 kinaba: return DPos( dp.tl, dp.ad+1 ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 行の途中で、普通に1単語進む場合 dcdd144598 2011-02-23 kinaba: const uchar* f = pl(dp.tl); dcdd144598 2011-02-23 kinaba: const ulong e = len(dp.tl); dcdd144598 2011-02-23 kinaba: ulong s = dp.ad; dcdd144598 2011-02-23 kinaba: const ulong t = (f[s]>>5); dcdd144598 2011-02-23 kinaba: s += t; dcdd144598 2011-02-23 kinaba: if( s >= e ) dcdd144598 2011-02-23 kinaba: s = e; dcdd144598 2011-02-23 kinaba: else if( t==7 || t==0 ) dcdd144598 2011-02-23 kinaba: while( (f[s]>>5)==0 && s<e ) dcdd144598 2011-02-23 kinaba: ++s; dcdd144598 2011-02-23 kinaba: return DPos( dp.tl, s ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DPos DocImpl::wordStartOf( const DPos& dp ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( dp.ad == 0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 行の先頭 dcdd144598 2011-02-23 kinaba: return dp; 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: const uchar* f = pl(dp.tl); dcdd144598 2011-02-23 kinaba: ulong s = dp.ad; dcdd144598 2011-02-23 kinaba: while( (f[s]>>5)==0 && 0<=s ) dcdd144598 2011-02-23 kinaba: --s; dcdd144598 2011-02-23 kinaba: return DPos( dp.tl, s ); 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: ulong DocImpl::getRangeLength( const DPos& s, const DPos& e ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // とりあえず全部足す dcdd144598 2011-02-23 kinaba: ulong ans=0, tl=s.tl, te=e.tl; dcdd144598 2011-02-23 kinaba: for( ; tl<=te; ++tl ) dcdd144598 2011-02-23 kinaba: ans += len(tl); dcdd144598 2011-02-23 kinaba: // 先頭行の分を引く dcdd144598 2011-02-23 kinaba: ans -= s.ad; dcdd144598 2011-02-23 kinaba: // 最終行の分を引く dcdd144598 2011-02-23 kinaba: ans -= len(te) - e.ad; dcdd144598 2011-02-23 kinaba: // 改行コード(CRLF)の分を加える dcdd144598 2011-02-23 kinaba: ans += (e.tl-s.tl) * 2; dcdd144598 2011-02-23 kinaba: // おしまい dcdd144598 2011-02-23 kinaba: return ans; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::getText( unicode* buf, const DPos& s, const DPos& e ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( s.tl == e.tl ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 一行だけの場合 dcdd144598 2011-02-23 kinaba: text_[s.tl].CopyAt( s.ad, e.ad-s.ad, buf ); dcdd144598 2011-02-23 kinaba: buf[e.ad-s.ad] = L'\0'; 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: buf += text_[s.tl].CopyToTail( s.ad, buf ); dcdd144598 2011-02-23 kinaba: *buf++ = L'\r', *buf++ = L'\n'; dcdd144598 2011-02-23 kinaba: // 途中をコピー dcdd144598 2011-02-23 kinaba: for( ulong i=s.tl+1; i<e.tl; i++ ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: buf += text_[i].CopyToTail( 0, buf ); dcdd144598 2011-02-23 kinaba: *buf++ = L'\r', *buf++ = L'\n'; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: // 終了行の先頭をコピー dcdd144598 2011-02-23 kinaba: buf += text_[e.tl].CopyAt( 0, e.ad, buf ); dcdd144598 2011-02-23 kinaba: *buf = L'\0'; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::CorrectPos( DPos& pos ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 正常範囲に収まるように修正 dcdd144598 2011-02-23 kinaba: pos.tl = Min( pos.tl, tln()-1 ); dcdd144598 2011-02-23 kinaba: pos.ad = Min( pos.ad, len(pos.tl) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::CorrectPos( DPos& s, DPos& e ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 必ずs<=eになるように修正 dcdd144598 2011-02-23 kinaba: if( s > e ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ulong t; dcdd144598 2011-02-23 kinaba: t=s.ad, s.ad=e.ad, e.ad=t; dcdd144598 2011-02-23 kinaba: t=s.tl, s.tl=e.tl, e.tl=t; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool DocImpl::DeletingOperation dcdd144598 2011-02-23 kinaba: ( DPos& s, DPos& e, unicode*& undobuf, ulong& undosiz ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: AutoLock lk( this ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 位置補正 dcdd144598 2011-02-23 kinaba: CorrectPos( s ); dcdd144598 2011-02-23 kinaba: CorrectPos( e ); dcdd144598 2011-02-23 kinaba: CorrectPos( s, e ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 削除される量をカウント dcdd144598 2011-02-23 kinaba: undosiz = getRangeLength( s, e ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Undo操作用バッファ確保 dcdd144598 2011-02-23 kinaba: undobuf = new unicode[undosiz+1]; dcdd144598 2011-02-23 kinaba: getText( undobuf, s, e ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 削除る dcdd144598 2011-02-23 kinaba: if( s.tl == e.tl ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 一行内削除 dcdd144598 2011-02-23 kinaba: text_[s.tl].RemoveAt( s.ad, e.ad-s.ad ); 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: text_[s.tl].RemoveToTail( s.ad ); dcdd144598 2011-02-23 kinaba: // 終了行の残り部分をくっつける dcdd144598 2011-02-23 kinaba: text_[s.tl].InsertToTail( tl(e.tl)+e.ad, len(e.tl)-e.ad ); dcdd144598 2011-02-23 kinaba: // いらん行を削除 dcdd144598 2011-02-23 kinaba: text_.RemoveAt( s.tl+1, e.tl-s.tl ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 再解析 dcdd144598 2011-02-23 kinaba: return ReParse( s.tl, s.tl ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool DocImpl::InsertingOperation dcdd144598 2011-02-23 kinaba: ( DPos& s, const unicode* str, ulong len, DPos& e ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: AutoLock lk( this ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 位置補正 dcdd144598 2011-02-23 kinaba: CorrectPos( s ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // よーい、どん! dcdd144598 2011-02-23 kinaba: e.ad = s.ad; dcdd144598 2011-02-23 kinaba: e.tl = s.tl; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 指定文字列を改行で切り分ける準備 dcdd144598 2011-02-23 kinaba: const unicode* lineStr; dcdd144598 2011-02-23 kinaba: ulong lineLen; dcdd144598 2011-02-23 kinaba: UniReader r( str, len, &lineStr, &lineLen ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 一行目… dcdd144598 2011-02-23 kinaba: r.getLine(); dcdd144598 2011-02-23 kinaba: text_[e.tl].InsertAt( e.ad, lineStr, lineLen ); dcdd144598 2011-02-23 kinaba: e.ad += lineLen; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( !r.isEmpty() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 二行目〜最終行 dcdd144598 2011-02-23 kinaba: do dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: r.getLine(); dcdd144598 2011-02-23 kinaba: text_.InsertAt( ++e.tl, new Line(lineStr,lineLen) ); dcdd144598 2011-02-23 kinaba: } while( !r.isEmpty() ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 一行目の最後尾に残ってた文字列を最終行へ dcdd144598 2011-02-23 kinaba: Line& fl = text_[s.tl]; dcdd144598 2011-02-23 kinaba: Line& ed = text_[e.tl]; dcdd144598 2011-02-23 kinaba: const ulong ln = fl.size()-e.ad; dcdd144598 2011-02-23 kinaba: if( ln ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ed.InsertToTail( fl.str()+e.ad, ln ); dcdd144598 2011-02-23 kinaba: fl.RemoveToTail( e.ad ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 終了位置記録 dcdd144598 2011-02-23 kinaba: e.ad = lineLen; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 再解析 dcdd144598 2011-02-23 kinaba: return ReParse( s.tl, e.tl ); 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: Insert::Insert( const DPos& s, const unicode* str, ulong len, bool del ) dcdd144598 2011-02-23 kinaba: : stt_( s ) dcdd144598 2011-02-23 kinaba: , buf_( str ) dcdd144598 2011-02-23 kinaba: , len_( len ) dcdd144598 2011-02-23 kinaba: , del_( del ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Insert::~Insert() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( del_ ) dcdd144598 2011-02-23 kinaba: delete const_cast<unicode*>(buf_); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Command* Insert::operator()( Document& d ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DocImpl& di = d.impl(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 挿入 dcdd144598 2011-02-23 kinaba: DPos s=stt_, e; dcdd144598 2011-02-23 kinaba: bool aa = di.InsertingOperation( s, buf_, len_, e ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // イベント発火 dcdd144598 2011-02-23 kinaba: di.Fire_TEXTUPDATE( s, s, e, aa, true ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 逆操作オブジェクトを返す dcdd144598 2011-02-23 kinaba: return new Delete( s, e ); 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: Delete::Delete( const DPos& s, const DPos& e ) dcdd144598 2011-02-23 kinaba: : stt_( s ) dcdd144598 2011-02-23 kinaba: , end_( e ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Command* Delete::operator()( Document& d ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DocImpl& di = d.impl(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 削除 dcdd144598 2011-02-23 kinaba: unicode* buf; dcdd144598 2011-02-23 kinaba: ulong siz; dcdd144598 2011-02-23 kinaba: DPos s = stt_, e=end_; dcdd144598 2011-02-23 kinaba: bool aa = di.DeletingOperation( s, e, buf, siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // イベント発火 dcdd144598 2011-02-23 kinaba: di.Fire_TEXTUPDATE( s, e, s, aa, true ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 逆操作オブジェクトを返す dcdd144598 2011-02-23 kinaba: return new Insert( s, buf, siz, 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: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Replace::Replace( dcdd144598 2011-02-23 kinaba: const DPos& s, const DPos& e, const unicode* str, ulong len, bool del ) dcdd144598 2011-02-23 kinaba: : stt_( s ) dcdd144598 2011-02-23 kinaba: , end_( e ) dcdd144598 2011-02-23 kinaba: , buf_( str ) dcdd144598 2011-02-23 kinaba: , len_( len ) dcdd144598 2011-02-23 kinaba: , del_( del ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Replace::~Replace() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( del_ ) dcdd144598 2011-02-23 kinaba: delete const_cast<unicode*>(buf_); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Command* Replace::operator()( Document& d ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DocImpl& di = d.impl(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 削除 dcdd144598 2011-02-23 kinaba: unicode* buf; dcdd144598 2011-02-23 kinaba: ulong siz; dcdd144598 2011-02-23 kinaba: DPos s=stt_, e=end_; dcdd144598 2011-02-23 kinaba: bool aa = di.DeletingOperation( s, e, buf, siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 挿入 dcdd144598 2011-02-23 kinaba: DPos e2; dcdd144598 2011-02-23 kinaba: aa = (di.InsertingOperation( s, buf_, len_, e2 ) || aa); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // イベント発火 dcdd144598 2011-02-23 kinaba: di.Fire_TEXTUPDATE( s, e, e2, aa, true ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 逆操作オブジェクトを返す dcdd144598 2011-02-23 kinaba: return new Replace( s, e2, buf, siz, 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: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Command* MacroCommand::operator()( Document& doc ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: doc.setBusyFlag(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: MacroCommand* undo = new MacroCommand; dcdd144598 2011-02-23 kinaba: undo->arr_.ForceSize( size() ); dcdd144598 2011-02-23 kinaba: for( ulong i=0,e=arr_.size(); i<e; ++i ) dcdd144598 2011-02-23 kinaba: undo->arr_[e-i-1] = (*arr_[i])(doc); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: doc.setBusyFlag(false); dcdd144598 2011-02-23 kinaba: return undo; 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 DocImpl::SaveFile( TextFileW& tf ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: urdo_.SavedHere(); dcdd144598 2011-02-23 kinaba: for( ulong i=0,iLast=tln()-1; i<=iLast; ++i ) dcdd144598 2011-02-23 kinaba: tf.WriteLine( tl(i), len(i), i==iLast ); 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 DocImpl::ClearAll() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 全部削除 dcdd144598 2011-02-23 kinaba: Execute( Delete( DPos(0,0), DPos(0xffffffff,0xffffffff) ) ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Undo-Redoチェインをクリア dcdd144598 2011-02-23 kinaba: urdo_.Clear(); dcdd144598 2011-02-23 kinaba: urdo_.SavedHere(); dcdd144598 2011-02-23 kinaba: Fire_MODIFYFLAGCHANGE(); 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 DocImpl::OpenFile( aptr<TextFileR> tf ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ToDo: マルチスレッド化 dcdd144598 2011-02-23 kinaba: //currentOpeningFile_ = tf; dcdd144598 2011-02-23 kinaba: //thd().Run( *this ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 挿入 dcdd144598 2011-02-23 kinaba: DPos e(0,0); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: unicode buf[1024]; dcdd144598 2011-02-23 kinaba: for( ulong i=0; tf->state(); ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( size_t L = tf->ReadLine( buf, countof(buf) ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DPos p(i,0xffffffff); dcdd144598 2011-02-23 kinaba: InsertingOperation( p, buf, (ulong)L, e ); dcdd144598 2011-02-23 kinaba: i = tln() - 1; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: if( tf->state() == 1 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DPos p(i++,0xffffffff); dcdd144598 2011-02-23 kinaba: InsertingOperation( p, L"\n", 1, e ); 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: Fire_TEXTUPDATE( DPos(0,0), DPos(0,0), e, true, false ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void DocImpl::StartThread() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: /* dcdd144598 2011-02-23 kinaba: // ToDo: dcdd144598 2011-02-23 kinaba: aptr<TextFileR> tf = currentOpeningFile_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 挿入 dcdd144598 2011-02-23 kinaba: unicode buf[1024]; dcdd144598 2011-02-23 kinaba: while( !isExitRequested() && tf->state() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ulong i, j; dcdd144598 2011-02-23 kinaba: DPos s(i=tln()-1, j=len(i)), e; dcdd144598 2011-02-23 kinaba: if( ulong L = tf->ReadLine( buf, countof(buf) ) ) dcdd144598 2011-02-23 kinaba: InsertingOperation( s, buf, L, e ); dcdd144598 2011-02-23 kinaba: if( tf->state() == 1 ) dcdd144598 2011-02-23 kinaba: InsertingOperation( DPos(i,0xffffffff), L"\n", 1, e ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // イベント発火 dcdd144598 2011-02-23 kinaba: Fire_TEXTUPDATE( s, s, e, true, false ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: */ dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: