File Annotation

Not logged in
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: