xref: /trunk/main/sw/source/ui/wrtsh/wrtsh4.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 
32 #include <wrtsh.hxx>
33 #include <crsskip.hxx>
34 
35 
36 /*
37 * private Methoden, die den Cursor ueber Suchen bewegen. Das
38 * Aufheben der Selektion muss auf der Ebene darueber erfolgen.
39 */
40 
41 /*
42 * Der Anfang eines Wortes ist das Folgen eines nicht-
43 * Trennzeichens auf Trennzeichen. Ferner das Folgen von
44 * nicht-Satztrennern auf Satztrenner. Der Absatzanfang ist
45 * ebenfalls Wortanfang.
46 */
47 
48 
49 sal_Bool SwWrtShell::_SttWrd()
50 {
51 	if ( IsSttPara() )
52 		return 1;
53 		/*
54 			* temporaeren Cursor ohne Selektion erzeugen
55 			*/
56 	Push();
57 	ClearMark();
58 	if( !GoStartWord() )
59 			// nicht gefunden --> an den Absatzanfang
60 		SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
61 	ClearMark();
62 		// falls vorher Mark gesetzt war, zusammenfassen
63 	Combine();
64 	return 1;
65 }
66 /*
67  * Das Ende eines Wortes ist das Folgen von Trennzeichen auf
68  * nicht-Trennzeichen.	Unter dem Ende eines Wortes wird
69  * ebenfalls die Folge von Worttrennzeichen auf Interpunktions-
70  * zeichen verstanden. Das Absatzende ist ebenfalls Wortende.
71  */
72 
73 
74 
75 sal_Bool SwWrtShell::_EndWrd()
76 {
77 	if ( IsEndWrd() )
78 		return 1;
79 		// temporaeren Cursor ohne Selektion erzeugen
80 	Push();
81 	ClearMark();
82 	if( !GoEndWord() )
83 			// nicht gefunden --> an das Absatz Ende
84 		SwCrsrShell::MovePara(fnParaCurr, fnParaEnd);
85 	ClearMark();
86 		// falls vorher Mark gesetzt war, zusammenfassen
87 	Combine();
88 	return 1;
89 }
90 
91 
92 
93 sal_Bool SwWrtShell::_NxtWrd()
94 {
95     sal_Bool bRet = sal_False;
96 	while( IsEndPara() )				// wenn schon am Ende, dann naechsten ???
97 	{
98 		if(!SwCrsrShell::Right(1,CRSR_SKIP_CHARS))	// Document - Ende ??
99 		{
100 			Pop( sal_False );
101 			return bRet;
102 		}
103         bRet = IsStartWord();
104 	}
105 	Push();
106 	ClearMark();
107     while( !bRet )
108     {
109         if( !GoNextWord() )
110         {
111             if( (!IsEndPara() && !SwCrsrShell::MovePara( fnParaCurr, fnParaEnd ) )
112                 || !SwCrsrShell::Right(1,CRSR_SKIP_CHARS) )
113                 break;
114             bRet = IsStartWord();
115         }
116         else
117             bRet = sal_True;
118     }
119 	ClearMark();
120 	Combine();
121 	return bRet;
122 }
123 
124 sal_Bool SwWrtShell::_PrvWrd()
125 {
126     sal_Bool bRet = sal_False;
127 	while( IsSttPara() )
128 	{								// wenn schon am Anfang, dann naechsten ???
129 		if(!SwCrsrShell::Left(1,CRSR_SKIP_CHARS))
130 		{							// Document - Anfang ??
131 			Pop( sal_False );
132 			return bRet;
133 		}
134 		bRet = IsStartWord();
135 	}
136 	Push();
137 	ClearMark();
138     while( !bRet )
139     {
140         if( !GoPrevWord() )
141         {
142             if( (!IsSttPara() && !SwCrsrShell::MovePara( fnParaCurr, fnParaStart ) )
143                 || !SwCrsrShell::Left(1,CRSR_SKIP_CHARS) )
144                 break;
145             bRet = IsStartWord();
146         }
147         else
148             bRet = sal_True;
149     }
150 	ClearMark();
151 	Combine();
152 	return bRet;
153 }
154 
155 // --> OD 2008-08-06 #i92468#
156 // method code of <SwWrtShell::_NxtWrd()> before fix for issue i72162
157 sal_Bool SwWrtShell::_NxtWrdForDelete()
158 {
159     if ( IsEndPara() )
160     {
161         if ( !SwCrsrShell::Right(1,CRSR_SKIP_CHARS) )
162         {
163             Pop( sal_False );
164             return sal_False;
165         }
166         return sal_True;
167     }
168     Push();
169     ClearMark();
170     if ( !GoNextWord() )
171     {
172         SwCrsrShell::MovePara( fnParaCurr, fnParaEnd );
173     }
174     ClearMark();
175     Combine();
176     return sal_True;
177 }
178 
179 // method code of <SwWrtShell::_PrvWrd()> before fix for issue i72162
180 sal_Bool SwWrtShell::_PrvWrdForDelete()
181 {
182     if ( IsSttPara() )
183     {
184         if ( !SwCrsrShell::Left(1,CRSR_SKIP_CHARS) )
185         {
186             Pop( sal_False );
187             return sal_False;
188         }
189         return sal_True;
190     }
191     Push();
192     ClearMark();
193     if( !GoPrevWord() )
194     {
195         SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
196     }
197     ClearMark();
198     Combine();
199     return sal_True;
200 }
201 // <--
202 
203 
204 sal_Bool SwWrtShell::_FwdSentence()
205 {
206 	Push();
207 	ClearMark();
208 	if(!SwCrsrShell::Right(1,CRSR_SKIP_CHARS))
209 	{
210 		Pop(sal_False);
211 		return 0;
212 	}
213 	if( !GoNextSentence() && !IsEndPara() )
214 		SwCrsrShell::MovePara(fnParaCurr, fnParaEnd);
215 
216 	ClearMark();
217 	Combine();
218 	return 1;
219 }
220 
221 
222 
223 sal_Bool SwWrtShell::_BwdSentence()
224 {
225 	Push();
226 	ClearMark();
227 	if(!SwCrsrShell::Left(1,CRSR_SKIP_CHARS))
228 	{
229 		Pop(sal_False);
230 		return 0;
231 	}
232 	if(IsSttPara())
233 	{
234 		Pop();
235 		return 1;
236 	}
237 	if( !GoPrevSentence()  && !IsSttPara() )
238 			// nicht gefunden --> an den Absatz Anfang
239 		SwCrsrShell::MovePara( fnParaCurr, fnParaStart );
240 	ClearMark();
241 	Combine();
242 	return 1;
243 }
244 
245 
246 sal_Bool SwWrtShell::_FwdPara()
247 {
248 	Push();
249 	ClearMark();
250     // --> OD 2009-01-06 #i81824#
251     // going right and back again left not needed and causes too much
252     // accessibility events due to the cursor movements.
253 //    if(!SwCrsrShell::Right(1,CRSR_SKIP_CHARS))
254 //    {
255 //        Pop(sal_False);
256 //        return 0;
257 //    }
258 //    SwCrsrShell::Left(1,CRSR_SKIP_CHARS);
259     // <--
260 	sal_Bool bRet = SwCrsrShell::MovePara(fnParaNext, fnParaStart);
261 
262 	ClearMark();
263 	Combine();
264 	return bRet;
265 }
266 
267 
268 sal_Bool SwWrtShell::_BwdPara()
269 {
270 	Push();
271 	ClearMark();
272     // --> OD 2009-01-06 #i81824#
273     // going left and back again right not needed and causes too much
274     // accessibility events due to the cursor movements.
275 //    if(!SwCrsrShell::Left(1,CRSR_SKIP_CHARS))
276 //    {
277 //        Pop(sal_False);
278 //        return 0;
279 //    }
280 //    SwCrsrShell::Right(1,CRSR_SKIP_CHARS);
281     // <--
282     // --> OD 2009-01-06 #i81824#
283     // going to start of paragraph only needed, if move to previous paragraph
284     // does not happen. Otherwise, useless accessibility events are triggered
285     // due to cursor movements.
286 //    if(!IsSttOfPara())
287 //        SttPara();
288 	sal_Bool bRet = SwCrsrShell::MovePara(fnParaPrev, fnParaStart);
289     if ( !bRet && !IsSttOfPara() )
290     {
291         SttPara();
292     }
293     // <--
294 
295 	ClearMark();
296 	Combine();
297 	return bRet;
298 }
299 
300 
301