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