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