/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"



#include "doc.hxx"
#include "lineinfo.hxx"
#include "charfmt.hxx"
#include "poolfmt.hxx"
#include "rootfrm.hxx"
#include "viewsh.hxx"
#include <set>
void SwDoc::SetLineNumberInfo( const SwLineNumberInfo &rNew )
{
	SwRootFrm* pTmpRoot = GetCurrentLayout();//swmod 080219
	if (  pTmpRoot &&
		 (rNew.IsCountBlankLines() != pLineNumberInfo->IsCountBlankLines() ||
		  rNew.IsRestartEachPage() != pLineNumberInfo->IsRestartEachPage()) )
	{
		std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();//swmod 080225 
		pTmpRoot->StartAllAction();
        // FME 2007-08-14 #i80120# Invalidate size, because ChgThisLines()
        // is only (onny may only be) called by the formatting routines
        //pTmpRoot->InvalidateAllCntnt( INV_LINENUM | INV_SIZE );
		std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::bind2nd(std::mem_fun(&SwRootFrm::InvalidateAllCntnt), INV_LINENUM | INV_SIZE));//swmod 080226
		 pTmpRoot->EndAllAction();
	}	//swmod 080219
	*pLineNumberInfo = rNew;
	SetModified();
}

const SwLineNumberInfo& SwDoc::GetLineNumberInfo() const
{
    return *pLineNumberInfo;
}

SwLineNumberInfo::SwLineNumberInfo() :
	nPosFromLeft( MM50 ),
	nCountBy( 5 ),
	nDividerCountBy( 3 ),
	ePos( LINENUMBER_POS_LEFT ),
	bPaintLineNumbers( sal_False ),
	bCountBlankLines( sal_True ),
	bCountInFlys( sal_False ),
	bRestartEachPage( sal_False )
{
}

SwLineNumberInfo::SwLineNumberInfo(const SwLineNumberInfo &rCpy ) : SwClient(),
	aType( rCpy.GetNumType() ),
	aDivider( rCpy.GetDivider() ),
	nPosFromLeft( rCpy.GetPosFromLeft() ),
	nCountBy( rCpy.GetCountBy() ),
	nDividerCountBy( rCpy.GetDividerCountBy() ),
	ePos( rCpy.GetPos() ),
	bPaintLineNumbers( rCpy.IsPaintLineNumbers() ),
	bCountBlankLines( rCpy.IsCountBlankLines() ),
	bCountInFlys( rCpy.IsCountInFlys() ),
	bRestartEachPage( rCpy.IsRestartEachPage() )
{
	if ( rCpy.GetRegisteredIn() )
		((SwModify*)rCpy.GetRegisteredIn())->Add( this );
}

SwLineNumberInfo& SwLineNumberInfo::operator=(const SwLineNumberInfo &rCpy)
{
	if ( rCpy.GetRegisteredIn() )
		((SwModify*)rCpy.GetRegisteredIn())->Add( this );
	else if ( GetRegisteredIn() )
		GetRegisteredInNonConst()->Remove( this );

	aType = rCpy.GetNumType();
	aDivider = rCpy.GetDivider();
	nPosFromLeft = rCpy.GetPosFromLeft();
	nCountBy = rCpy.GetCountBy();
	nDividerCountBy = rCpy.GetDividerCountBy();
	ePos = rCpy.GetPos();
	bPaintLineNumbers = rCpy.IsPaintLineNumbers();
	bCountBlankLines = rCpy.IsCountBlankLines();
	bCountInFlys = rCpy.IsCountInFlys();
	bRestartEachPage = rCpy.IsRestartEachPage();

	return *this;
}

sal_Bool SwLineNumberInfo::operator==( const SwLineNumberInfo& rInf ) const
{
	return  GetRegisteredIn() == rInf.GetRegisteredIn() &&
			aType.GetNumberingType() == rInf.GetNumType().GetNumberingType() &&
			aDivider == rInf.GetDivider() &&
			nPosFromLeft == rInf.GetPosFromLeft() &&
			nCountBy == rInf.GetCountBy() &&
			nDividerCountBy == rInf.GetDividerCountBy() &&
			ePos == rInf.GetPos() &&
			bPaintLineNumbers == rInf.IsPaintLineNumbers() &&
			bCountBlankLines == rInf.IsCountBlankLines() &&
			bCountInFlys == rInf.IsCountInFlys() &&
			bRestartEachPage == rInf.IsRestartEachPage();
}


SwCharFmt* SwLineNumberInfo::GetCharFmt( IDocumentStylePoolAccess& rIDSPA ) const
{
	if ( !GetRegisteredIn() )
	{
        SwCharFmt* pFmt = rIDSPA.GetCharFmtFromPool( RES_POOLCHR_LINENUM );
		pFmt->Add( (SwClient*)this );
	}
	return (SwCharFmt*)GetRegisteredIn();
}

void SwLineNumberInfo::SetCharFmt( SwCharFmt *pChFmt )
{
	ASSERT( pChFmt, "SetCharFmt, 0 is not a valid pointer" );
	pChFmt->Add( this );
}

void SwLineNumberInfo::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
{
	CheckRegistration( pOld, pNew );
	SwDoc *pDoc = ((SwCharFmt*)GetRegisteredIn())->GetDoc();
	SwRootFrm* pRoot = pDoc->GetCurrentLayout();
	if( pRoot )
	{
		pRoot->StartAllAction();
		std::set<SwRootFrm*> aAllLayouts = pDoc->GetAllLayouts();
		std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllAddPaintRect));//swmod 080305
		//pRoot->GetCurrShell()->AddPaintRect( pRoot->Frm() );
		pRoot->EndAllAction();
	}
}