/**************************************************************
 *
 * 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_svtools.hxx"

#include <svtools/textdata.hxx>
#include <textdat2.hxx>

#include <tools/debug.hxx>

SV_IMPL_PTRARR( TextLines, TextLinePtr );
SV_IMPL_VARARR( TEWritingDirectionInfos, TEWritingDirectionInfo );


// -------------------------------------------------------------------------
// (+) class TextSelection
// -------------------------------------------------------------------------

TextSelection::TextSelection()
{
}

TextSelection::TextSelection( const TextPaM& rPaM ) :
	maStartPaM( rPaM ), maEndPaM( rPaM )
{
}

TextSelection::TextSelection( const TextPaM& rStart, const TextPaM& rEnd ) :
	maStartPaM( rStart ), maEndPaM( rEnd )
{
}

void TextSelection::Justify()
{
	if ( maEndPaM < maStartPaM )
	{
		TextPaM aTemp( maStartPaM );
		maStartPaM = maEndPaM;
		maEndPaM = aTemp;
	}
}


// -------------------------------------------------------------------------
// (+) class TETextPortionList
// -------------------------------------------------------------------------
TETextPortionList::TETextPortionList()
{
}

TETextPortionList::~TETextPortionList()
{
	Reset();
}

void TETextPortionList::Reset()
{
	for ( sal_uInt16 nPortion = 0; nPortion < Count(); nPortion++ )
		delete GetObject( nPortion );
	Remove( 0, Count() );
}

void TETextPortionList::DeleteFromPortion( sal_uInt16 nDelFrom )
{
	DBG_ASSERT( ( nDelFrom < Count() ) || ( (nDelFrom == 0) && (Count() == 0) ), "DeleteFromPortion: Out of range" );
	for ( sal_uInt16 nP = nDelFrom; nP < Count(); nP++ )
		delete GetObject( nP );
	Remove( nDelFrom, Count()-nDelFrom );
}

sal_uInt16 TETextPortionList::FindPortion( sal_uInt16 nCharPos, sal_uInt16& nPortionStart, sal_Bool bPreferStartingPortion )
{
	// Bei nCharPos an Portion-Grenze wird die linke Portion gefunden
	sal_uInt16 nTmpPos = 0;
	for ( sal_uInt16 nPortion = 0; nPortion < Count(); nPortion++ )
	{
		TETextPortion* pPortion = GetObject( nPortion );
		nTmpPos = nTmpPos + pPortion->GetLen();
		if ( nTmpPos >= nCharPos )
		{
            // take this one if we don't prefer the starting portion, or if it's the last one
            if ( ( nTmpPos != nCharPos ) || !bPreferStartingPortion || ( nPortion == Count() - 1 ) )
            {
			    nPortionStart = nTmpPos - pPortion->GetLen();
			    return nPortion;
            }
		}
	}
	DBG_ERROR( "FindPortion: Nicht gefunden!" );
	return ( Count() - 1 );
}

/*
sal_uInt16 TETextPortionList::GetPortionStartIndex( sal_uInt16 nPortion )
{
	sal_uInt16 nPos = 0;
	for ( sal_uInt16 nP = 0; nP < nPortion; nP++ )
	{
		TETextPortion* pPortion = GetObject( nP );
		nPos += pPortion->GetLen();
	}
	return nPos;
}
*/


// -------------------------------------------------------------------------
// (+) class TEParaPortion
// -------------------------------------------------------------------------
TEParaPortion::TEParaPortion( TextNode* pN )
{
	mpNode = pN;
	mnInvalidPosStart = mnInvalidDiff = 0;
	mbInvalid = sal_True;
	mbSimple = sal_False;
}

TEParaPortion::~TEParaPortion()
{
}

void TEParaPortion::MarkInvalid( sal_uInt16 nStart, short nDiff )
{
	if ( mbInvalid == sal_False )
	{
		mnInvalidPosStart = ( nDiff >= 0 ) ? nStart : ( nStart + nDiff );
		mnInvalidDiff = nDiff;
	}
	else
	{
		// Einfaches hintereinander tippen
		if ( ( nDiff > 0 ) && ( mnInvalidDiff > 0 ) &&
			 ( ( mnInvalidPosStart+mnInvalidDiff ) == nStart ) )
		{
			mnInvalidDiff = mnInvalidDiff + nDiff;
		}
		// Einfaches hintereinander loeschen
		else if ( ( nDiff < 0 ) && ( mnInvalidDiff < 0 ) && ( mnInvalidPosStart == nStart ) )
		{
			mnInvalidPosStart = mnInvalidPosStart + nDiff;
			mnInvalidDiff = mnInvalidDiff + nDiff;
		}
		else
		{
			DBG_ASSERT( ( nDiff >= 0 ) || ( (nStart+nDiff) >= 0 ), "MarkInvalid: Diff out of Range" );
			mnInvalidPosStart = Min( mnInvalidPosStart, (sal_uInt16) ( (nDiff < 0) ? nStart+nDiff : nDiff ) );
			mnInvalidDiff = 0;
			mbSimple = sal_False;
		}
	}

    maWritingDirectionInfos.Remove( 0, maWritingDirectionInfos.Count() );

    mbInvalid = sal_True;
}

void TEParaPortion::MarkSelectionInvalid( sal_uInt16 nStart, sal_uInt16 /*nEnd*/ )
{
	if ( mbInvalid == sal_False )
	{
		mnInvalidPosStart = nStart;
//		nInvalidPosEnd = nEnd;
	}
	else
	{
		mnInvalidPosStart = Min( mnInvalidPosStart, nStart );
//		nInvalidPosEnd = pNode->Len();
	}

    maWritingDirectionInfos.Remove( 0, maWritingDirectionInfos.Count() );

    mnInvalidDiff = 0;
	mbInvalid = sal_True;
	mbSimple = sal_False;
}

sal_uInt16 TEParaPortion::GetLineNumber( sal_uInt16 nChar, sal_Bool bInclEnd )
{
	for ( sal_uInt16 nLine = 0; nLine < maLines.Count(); nLine++ )
	{
		TextLine* pLine = maLines.GetObject( nLine );
		if ( ( bInclEnd && ( pLine->GetEnd() >= nChar ) ) ||
			 ( pLine->GetEnd() > nChar ) )
		{
			return nLine;
		}
	}

	// Dann sollte es am Ende der letzten Zeile sein!
	DBG_ASSERT( nChar == maLines[ maLines.Count() - 1 ]->GetEnd(), "Index voll daneben!" );
	DBG_ASSERT( !bInclEnd, "Zeile nicht gefunden: FindLine" );
	return ( maLines.Count() - 1 );
}


void TEParaPortion::CorrectValuesBehindLastFormattedLine( sal_uInt16 nLastFormattedLine )
{
	sal_uInt16 nLines = maLines.Count();
	DBG_ASSERT( nLines, "CorrectPortionNumbersFromLine: Leere Portion?" );
	if ( nLastFormattedLine < ( nLines - 1 ) )
	{
		const TextLine* pLastFormatted = maLines[ nLastFormattedLine ];
		const TextLine* pUnformatted = maLines[ nLastFormattedLine+1 ];
		short nPortionDiff = pUnformatted->GetStartPortion() - pLastFormatted->GetEndPortion();
		short nTextDiff = pUnformatted->GetStart() - pLastFormatted->GetEnd();
		nTextDiff++;	// LastFormatted->GetEnd() war incl. => 1 zuviel abgezogen!

		// Die erste unformatierte muss genau eine Portion hinter der letzten der
		// formatierten beginnen:
		// Wenn in der geaenderten Zeile eine Portion gesplittet wurde,
		// kann nLastEnd > nNextStart sein!
		short nPDiff = sal::static_int_cast< short >(-( nPortionDiff-1 ));
		short nTDiff = sal::static_int_cast< short >(-( nTextDiff-1 ));
		if ( nPDiff || nTDiff )
		{
			for ( sal_uInt16 nL = nLastFormattedLine+1; nL < nLines; nL++ )
			{
				TextLine* pLine = maLines[ nL ];

				pLine->GetStartPortion() = pLine->GetStartPortion() + nPDiff;
				pLine->GetEndPortion() = pLine->GetEndPortion() + nPDiff;

				pLine->GetStart() = pLine->GetStart() + nTDiff;
				pLine->GetEnd() = pLine->GetEnd() + nTDiff;

				pLine->SetValid();
			}
		}
	}
}

// -------------------------------------------------------------------------
// (+) class TEParaPortions
// -------------------------------------------------------------------------
TEParaPortions::TEParaPortions()
{
}

TEParaPortions::~TEParaPortions()
{
	Reset();
}

void TEParaPortions::Reset()
{
	TEParaPortions::iterator aIter( begin() );
	while ( aIter != end() )
		delete *aIter++;
	clear();
}

// -------------------------------------------------------------------------
// (+) class IdleFormatter
// -------------------------------------------------------------------------
IdleFormatter::IdleFormatter()
{
	mpView = 0;
	mnRestarts = 0;
}

IdleFormatter::~IdleFormatter()
{
	mpView = 0;
}

void IdleFormatter::DoIdleFormat( TextView* pV, sal_uInt16 nMaxRestarts )
{
	mpView = pV;

	if ( IsActive() )
		mnRestarts++;

	if ( mnRestarts > nMaxRestarts )
	{
		mnRestarts = 0;
		((Link&)GetTimeoutHdl()).Call( this );
	}
	else
	{
		Start();
	}
}

void IdleFormatter::ForceTimeout()
{
	if ( IsActive() )
	{
		Stop();
		mnRestarts = 0;
		((Link&)GetTimeoutHdl()).Call( this );
	}
}

TYPEINIT1( TextHint, SfxSimpleHint );

TextHint::TextHint( sal_uLong Id ) : SfxSimpleHint( Id )
{
	mnValue = 0;
}

TextHint::TextHint( sal_uLong Id, sal_uLong nValue ) : SfxSimpleHint( Id )
{
	mnValue = nValue;
}

TEIMEInfos::TEIMEInfos( const TextPaM& rPos, const String& rOldTextAfterStartPos )
: aOldTextAfterStartPos( rOldTextAfterStartPos )
{
	aPos = rPos;
	nLen = 0;
	bCursor = sal_True;
	pAttribs = NULL;
	bWasCursorOverwrite = sal_False;
}

TEIMEInfos::~TEIMEInfos()
{
	delete[] pAttribs;
}

void TEIMEInfos::CopyAttribs( const sal_uInt16* pA, sal_uInt16 nL )
{
	nLen = nL;
	delete pAttribs;
	pAttribs = new sal_uInt16[ nL ];
	memcpy( pAttribs, pA, nL*sizeof(sal_uInt16) );
}

void TEIMEInfos::DestroyAttribs()
{
	delete pAttribs;
	pAttribs = NULL;
    nLen = 0;
}
