/**************************************************************
 * 
 * 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 <wrtsh.hxx>
#include <crsskip.hxx>


/*
* private Methoden, die den Cursor ueber Suchen bewegen. Das
* Aufheben der Selektion muss auf der Ebene darueber erfolgen.
*/

/*
* Der Anfang eines Wortes ist das Folgen eines nicht-
* Trennzeichens auf Trennzeichen. Ferner das Folgen von
* nicht-Satztrennern auf Satztrenner. Der Absatzanfang ist
* ebenfalls Wortanfang.
*/


sal_Bool SwWrtShell::_SttWrd()
{
	if ( IsSttPara() )
		return 1;
		/*
			* temporaeren Cursor ohne Selektion erzeugen
			*/
	Push();
	ClearMark();
	if( !GoStartWord() )
			// nicht gefunden --> an den Absatzanfang
		SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
	ClearMark();
		// falls vorher Mark gesetzt war, zusammenfassen
	Combine();
	return 1;
}
/*
 * Das Ende eines Wortes ist das Folgen von Trennzeichen auf
 * nicht-Trennzeichen.	Unter dem Ende eines Wortes wird
 * ebenfalls die Folge von Worttrennzeichen auf Interpunktions-
 * zeichen verstanden. Das Absatzende ist ebenfalls Wortende.
 */



sal_Bool SwWrtShell::_EndWrd()
{
	if ( IsEndWrd() )
		return 1;
		// temporaeren Cursor ohne Selektion erzeugen
	Push();
	ClearMark();
	if( !GoEndWord() )
			// nicht gefunden --> an das Absatz Ende
		SwCrsrShell::MovePara(fnParaCurr, fnParaEnd);
	ClearMark();
		// falls vorher Mark gesetzt war, zusammenfassen
	Combine();
	return 1;
}



sal_Bool SwWrtShell::_NxtWrd()
{
    sal_Bool bRet = sal_False;
	while( IsEndPara() )				// wenn schon am Ende, dann naechsten ???
	{
		if(!SwCrsrShell::Right(1,CRSR_SKIP_CHARS))	// Document - Ende ??
		{
			Pop( sal_False );
			return bRet;
		}
        bRet = IsStartWord();
	}
	Push();
	ClearMark();
    while( !bRet )
    {
        if( !GoNextWord() )
        {
            if( (!IsEndPara() && !SwCrsrShell::MovePara( fnParaCurr, fnParaEnd ) )
                || !SwCrsrShell::Right(1,CRSR_SKIP_CHARS) )
                break;
            bRet = IsStartWord();
        }
        else
            bRet = sal_True;
    }
	ClearMark();
	Combine();
	return bRet;
}

sal_Bool SwWrtShell::_PrvWrd()
{
    sal_Bool bRet = sal_False;
	while( IsSttPara() )
	{								// wenn schon am Anfang, dann naechsten ???
		if(!SwCrsrShell::Left(1,CRSR_SKIP_CHARS))
		{							// Document - Anfang ??
			Pop( sal_False );
			return bRet;
		}
		bRet = IsStartWord();
	}
	Push();
	ClearMark();
    while( !bRet )
    {
        if( !GoPrevWord() )
        {
            if( (!IsSttPara() && !SwCrsrShell::MovePara( fnParaCurr, fnParaStart ) )
                || !SwCrsrShell::Left(1,CRSR_SKIP_CHARS) )
                break;
            bRet = IsStartWord();
        }
        else
            bRet = sal_True;
    }
	ClearMark();
	Combine();
	return bRet;
}

// --> OD 2008-08-06 #i92468#
// method code of <SwWrtShell::_NxtWrd()> before fix for issue i72162
sal_Bool SwWrtShell::_NxtWrdForDelete()
{
    if ( IsEndPara() )
    {
        if ( !SwCrsrShell::Right(1,CRSR_SKIP_CHARS) )
        {
            Pop( sal_False );
            return sal_False;
        }
        return sal_True;
    }
    Push();
    ClearMark();
    if ( !GoNextWord() )
    {
        SwCrsrShell::MovePara( fnParaCurr, fnParaEnd );
    }
    ClearMark();
    Combine();
    return sal_True;
}

// method code of <SwWrtShell::_PrvWrd()> before fix for issue i72162
sal_Bool SwWrtShell::_PrvWrdForDelete()
{
    if ( IsSttPara() )
    {
        if ( !SwCrsrShell::Left(1,CRSR_SKIP_CHARS) )
        {
            Pop( sal_False );
            return sal_False;
        }
        return sal_True;
    }
    Push();
    ClearMark();
    if( !GoPrevWord() )
    {
        SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
    }
    ClearMark();
    Combine();
    return sal_True;
}
// <--


sal_Bool SwWrtShell::_FwdSentence()
{
	Push();
	ClearMark();
	if(!SwCrsrShell::Right(1,CRSR_SKIP_CHARS))
	{
		Pop(sal_False);
		return 0;
	}
	if( !GoNextSentence() && !IsEndPara() )
		SwCrsrShell::MovePara(fnParaCurr, fnParaEnd);

	ClearMark();
	Combine();
	return 1;
}



sal_Bool SwWrtShell::_BwdSentence()
{
	Push();
	ClearMark();
	if(!SwCrsrShell::Left(1,CRSR_SKIP_CHARS))
	{
		Pop(sal_False);
		return 0;
	}
	if(IsSttPara())
	{
		Pop();
		return 1;
	}
	if( !GoPrevSentence()  && !IsSttPara() )
			// nicht gefunden --> an den Absatz Anfang
		SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
	ClearMark();
	Combine();
	return 1;
}


sal_Bool SwWrtShell::_FwdPara()
{
	Push();
	ClearMark();
    // --> OD 2009-01-06 #i81824#
    // going right and back again left not needed and causes too much
    // accessibility events due to the cursor movements.
//    if(!SwCrsrShell::Right(1,CRSR_SKIP_CHARS))
//    {
//        Pop(sal_False);
//        return 0;
//    }
//    SwCrsrShell::Left(1,CRSR_SKIP_CHARS);
    // <--
	sal_Bool bRet = SwCrsrShell::MovePara(fnParaNext, fnParaStart);

	ClearMark();
	Combine();
	return bRet;
}


sal_Bool SwWrtShell::_BwdPara()
{
	Push();
	ClearMark();
    // --> OD 2009-01-06 #i81824#
    // going left and back again right not needed and causes too much
    // accessibility events due to the cursor movements.
//    if(!SwCrsrShell::Left(1,CRSR_SKIP_CHARS))
//    {
//        Pop(sal_False);
//        return 0;
//    }
//    SwCrsrShell::Right(1,CRSR_SKIP_CHARS);
    // <--
    // --> OD 2009-01-06 #i81824#
    // going to start of paragraph only needed, if move to previous paragraph
    // does not happen. Otherwise, useless accessibility events are triggered
    // due to cursor movements.
//    if(!IsSttOfPara())
//        SttPara();
	sal_Bool bRet = SwCrsrShell::MovePara(fnParaPrev, fnParaStart);
    if ( !bRet && !IsSttOfPara() )
    {
        SttPara();
    }
    // <--

	ClearMark();
	Combine();
	return bRet;
}