xref: /aoo41x/main/sw/source/ui/wrtsh/move.cxx (revision efeef26f)
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 <sfx2/bindings.hxx>
29 #include <wrtsh.hxx>
30 #ifndef _VIEW_HXX
31 #include <view.hxx>
32 #endif
33 #include <viewopt.hxx>
34 #include <crsskip.hxx>
35 
36 /*	Immer:
37 	-	Zuruecksetzen des Cursorstacks
38 	-	Timer nachtriggern
39 	-	gfs. GCAttr
40 
41 	bei Selektion
42 	-	SttSelect()
43 
44 	sonst
45 	-	EndSelect()
46  */
47 
48 const long nReadOnlyScrollOfst = 10;
49 
50 class ShellMoveCrsr
51 {
52 	SwWrtShell* pSh;
53 	sal_Bool bAct;
54 public:
ShellMoveCrsr(SwWrtShell * pWrtSh,sal_Bool bSel)55 	inline ShellMoveCrsr( SwWrtShell* pWrtSh, sal_Bool bSel )
56 	{
57 		bAct = !pWrtSh->ActionPend() && (pWrtSh->GetFrmType(0,sal_False) & FRMTYPE_FLY_ANY);
58 		( pSh = pWrtSh )->MoveCrsr( sal_Bool(bSel) );
59 		pWrtSh->GetView().GetViewFrame()->GetBindings().Invalidate(SID_HYPERLINK_GETLINK);
60 	}
~ShellMoveCrsr()61 	inline ~ShellMoveCrsr()
62 	{
63 		if( bAct )
64 		{
65 			//Die Action wird fuer das Scrollen in "einabsaetzigen" Rahmen mit
66 			//fester Hoehe gebraucht.
67 			pSh->StartAllAction();
68 			pSh->EndAllAction();
69 		}
70 	}
71 };
72 
MoveCrsr(sal_Bool bWithSelect)73 void SwWrtShell::MoveCrsr( sal_Bool bWithSelect )
74 {
75 	ResetCursorStack();
76 	if ( IsGCAttr() )
77 	{
78 		GCAttr();
79 		ClearGCAttr();
80 	}
81 	if ( bWithSelect )
82 		SttSelect();
83 	else
84 	{
85 		EndSelect();
86 		(this->*fnKillSel)( 0, sal_False );
87 	}
88 }
89 
SimpleMove(FNSimpleMove FnSimpleMove,sal_Bool bSelect)90 sal_Bool SwWrtShell::SimpleMove( FNSimpleMove FnSimpleMove, sal_Bool bSelect )
91 {
92 	sal_Bool nRet;
93 	if( bSelect )
94 	{
95 		SttCrsrMove();
96 		MoveCrsr( sal_True );
97 		nRet = (this->*FnSimpleMove)();
98 		EndCrsrMove();
99 	}
100 	else if( 0 != ( nRet = (this->*FnSimpleMove)() ) )
101 		MoveCrsr( sal_False );
102 	return nRet;
103 }
104 
105 
Left(sal_uInt16 nMode,sal_Bool bSelect,sal_uInt16 nCount,sal_Bool bBasicCall,sal_Bool bVisual)106 sal_Bool SwWrtShell::Left( sal_uInt16 nMode, sal_Bool bSelect,
107                             sal_uInt16 nCount, sal_Bool bBasicCall, sal_Bool bVisual )
108 {
109     if ( !bSelect && !bBasicCall && IsCrsrReadonly()  && !GetViewOptions()->IsSelectionInReadonly())
110     {
111         Point aTmp( VisArea().Pos() );
112         aTmp.X() -= VisArea().Width() * nReadOnlyScrollOfst / 100;
113         rView.SetVisArea( aTmp );
114         return sal_True;
115     }
116     else
117 	{
118 		ShellMoveCrsr aTmp( this, bSelect );
119         return SwCrsrShell::Left( nCount, nMode, bVisual );
120 	}
121 }
122 
123 
124 
Right(sal_uInt16 nMode,sal_Bool bSelect,sal_uInt16 nCount,sal_Bool bBasicCall,sal_Bool bVisual)125 sal_Bool SwWrtShell::Right( sal_uInt16 nMode, sal_Bool bSelect,
126                             sal_uInt16 nCount, sal_Bool bBasicCall, sal_Bool bVisual )
127 {
128     if ( !bSelect && !bBasicCall && IsCrsrReadonly() && !GetViewOptions()->IsSelectionInReadonly() )
129     {
130         Point aTmp( VisArea().Pos() );
131         aTmp.X() += VisArea().Width() * nReadOnlyScrollOfst / 100;
132         aTmp.X() = rView.SetHScrollMax( aTmp.X() );
133         rView.SetVisArea( aTmp );
134         return sal_True;
135     }
136     else
137 	{
138 		ShellMoveCrsr aTmp( this, bSelect );
139         return SwCrsrShell::Right( nCount, nMode, bVisual );
140 	}
141 }
142 
143 
144 
Up(sal_Bool bSelect,sal_uInt16 nCount,sal_Bool bBasicCall)145 sal_Bool SwWrtShell::Up( sal_Bool bSelect, sal_uInt16 nCount, sal_Bool bBasicCall )
146 {
147     if ( !bSelect && !bBasicCall && IsCrsrReadonly()  && !GetViewOptions()->IsSelectionInReadonly())
148     {
149         Point aTmp( VisArea().Pos() );
150         aTmp.Y() -= VisArea().Height() * nReadOnlyScrollOfst / 100;
151         rView.SetVisArea( aTmp );
152         return sal_True;
153     }
154     else
155 	{
156 		ShellMoveCrsr aTmp( this, bSelect );
157 		return SwCrsrShell::Up( nCount );
158 	}
159 }
160 
161 
162 
Down(sal_Bool bSelect,sal_uInt16 nCount,sal_Bool bBasicCall)163 sal_Bool SwWrtShell::Down( sal_Bool bSelect, sal_uInt16 nCount, sal_Bool bBasicCall )
164 {
165     if ( !bSelect && !bBasicCall && IsCrsrReadonly() && !GetViewOptions()->IsSelectionInReadonly())
166     {
167         Point aTmp( VisArea().Pos() );
168         aTmp.Y() += VisArea().Height() * nReadOnlyScrollOfst / 100;
169         aTmp.Y() = rView.SetVScrollMax( aTmp.Y() );
170         rView.SetVisArea( aTmp );
171         return sal_True;
172     }
173     else
174 	{
175 		ShellMoveCrsr aTmp( this, bSelect );
176 		return SwCrsrShell::Down( nCount );
177 	}
178 }
179 
180 
181 
LeftMargin(sal_Bool bSelect,sal_Bool bBasicCall)182 sal_Bool SwWrtShell::LeftMargin( sal_Bool bSelect, sal_Bool bBasicCall )
183 {
184 	if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
185 	{
186 		Point aTmp( VisArea().Pos() );
187 		aTmp.X() = DOCUMENTBORDER;
188 		rView.SetVisArea( aTmp );
189 		return sal_True;
190 	}
191 	else
192 	{
193 		ShellMoveCrsr aTmp( this, bSelect );
194 		return SwCrsrShell::LeftMargin();
195 	}
196 }
197 
198 
199 
RightMargin(sal_Bool bSelect,sal_Bool bBasicCall)200 sal_Bool SwWrtShell::RightMargin( sal_Bool bSelect, sal_Bool bBasicCall  )
201 {
202 	if ( !bSelect && !bBasicCall && IsCrsrReadonly() )
203 	{
204 		Point aTmp( VisArea().Pos() );
205 		aTmp.X() = GetDocSize().Width() - VisArea().Width() + DOCUMENTBORDER;
206 		if( DOCUMENTBORDER > aTmp.X() )
207 			aTmp.X() = DOCUMENTBORDER;
208 		rView.SetVisArea( aTmp );
209 		return sal_True;
210 	}
211 	else
212 	{
213 		ShellMoveCrsr aTmp( this, bSelect );
214 		return SwCrsrShell::RightMargin(bBasicCall);
215 	}
216 }
217 
218 
219 
GoStart(sal_Bool bKeepArea,sal_Bool * pMoveTable,sal_Bool bSelect,sal_Bool bDontMoveRegion)220 sal_Bool SwWrtShell::GoStart( sal_Bool bKeepArea, sal_Bool *pMoveTable,
221 							sal_Bool bSelect, sal_Bool bDontMoveRegion )
222 {
223 	if ( IsCrsrInTbl() )
224 	{
225 		const sal_Bool bBoxSelection = HasBoxSelection();
226         if( !bBlockMode )
227         {
228             if ( !bSelect )
229                 EnterStdMode();
230             else
231                 SttSelect();
232         }
233 			// Tabellenzelle?
234 		if ( !bBoxSelection && (MoveSection( fnSectionCurr, fnSectionStart)
235 				|| bDontMoveRegion))
236 		{
237 			if ( pMoveTable )
238 				*pMoveTable = sal_False;
239 			return sal_True;
240 		}
241 		if( MoveTable( fnTableCurr, fnTableStart ) || bDontMoveRegion )
242 		{
243 			if ( pMoveTable )
244 				*pMoveTable = sal_True;
245 			return sal_True;
246 		}
247 		else if( bBoxSelection && pMoveTable )
248 		{
249 			// JP 09.01.96: wir haben eine Boxselektion (oder leere Zelle)
250 			// 				und wollen selektieren (pMoveTable wird im
251 			//				SelAll gesetzt). Dann darf die Tabelle nicht
252 			//				verlassen werden; sonst ist keine Selektion der
253 			//				gesamten Tabelle moeglich!
254 			*pMoveTable = sal_True;
255 			return sal_True;
256 		}
257 	}
258 
259     if( !bBlockMode )
260     {
261         if ( !bSelect )
262             EnterStdMode();
263         else
264             SttSelect();
265     }
266 	const sal_uInt16 nFrmType = GetFrmType(0,sal_False);
267 	if ( FRMTYPE_FLY_ANY & nFrmType )
268 	{
269 		if( MoveSection( fnSectionCurr, fnSectionStart ) )
270 			return sal_True;
271 		else if ( FRMTYPE_FLY_FREE & nFrmType || bDontMoveRegion )
272 			return sal_False;
273 	}
274 	if(( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FOOTNOTE ) & nFrmType )
275 	{
276 		if ( MoveSection( fnSectionCurr, fnSectionStart ) )
277 			return sal_True;
278 		else if ( bKeepArea )
279 			return sal_True;
280 	}
281 	// Bereiche ???
282 	return SwCrsrShell::MoveRegion( fnRegionCurrAndSkip, fnRegionStart ) ||
283 		   SwCrsrShell::SttEndDoc(sal_True);
284 }
285 
286 
287 
GoEnd(sal_Bool bKeepArea,sal_Bool * pMoveTable)288 sal_Bool SwWrtShell::GoEnd(sal_Bool bKeepArea, sal_Bool *pMoveTable)
289 {
290 	if ( pMoveTable && *pMoveTable )
291 		return MoveTable( fnTableCurr, fnTableEnd );
292 
293 	if ( IsCrsrInTbl() )
294 	{
295 		if ( MoveSection( fnSectionCurr, fnSectionEnd ) ||
296 			 MoveTable( fnTableCurr, fnTableEnd ) )
297 			return sal_True;
298 	}
299 	else
300 	{
301 		const sal_uInt16 nFrmType = GetFrmType(0,sal_False);
302 		if ( FRMTYPE_FLY_ANY & nFrmType )
303 		{
304 			if ( MoveSection( fnSectionCurr, fnSectionEnd ) )
305 				return sal_True;
306 			else if ( FRMTYPE_FLY_FREE & nFrmType )
307 				return sal_False;
308 		}
309 		if(( FRMTYPE_HEADER | FRMTYPE_FOOTER | FRMTYPE_FOOTNOTE ) & nFrmType )
310 		{
311 			if ( MoveSection( fnSectionCurr, fnSectionEnd) )
312 				return sal_True;
313 			else if ( bKeepArea )
314 				return sal_True;
315 		}
316 	}
317 	// Bereiche ???
318 	return SwCrsrShell::MoveRegion( fnRegionCurrAndSkip, fnRegionEnd ) ||
319 		   SwCrsrShell::SttEndDoc(sal_False);
320 }
321 
322 
323 
SttDoc(sal_Bool bSelect)324 sal_Bool SwWrtShell::SttDoc( sal_Bool bSelect )
325 {
326 	ShellMoveCrsr aTmp( this, bSelect );
327 	return GoStart(sal_False, 0, bSelect );
328 }
329 
330 
331 
EndDoc(sal_Bool bSelect)332 sal_Bool SwWrtShell::EndDoc( sal_Bool bSelect)
333 {
334 	ShellMoveCrsr aTmp( this, bSelect );
335 	return GoEnd();
336 }
337 
338 
SttNxtPg(sal_Bool bSelect)339 sal_Bool SwWrtShell::SttNxtPg( sal_Bool bSelect )
340 {
341 	ShellMoveCrsr aTmp( this, bSelect );
342 	return MovePage( fnPageNext, fnPageStart );
343 }
344 
345 
346 
SttPrvPg(sal_Bool bSelect)347 sal_Bool SwWrtShell::SttPrvPg( sal_Bool bSelect )
348 {
349 	ShellMoveCrsr aTmp( this, bSelect );
350 	return MovePage( fnPagePrev, fnPageStart );
351 }
352 
353 
354 
EndNxtPg(sal_Bool bSelect)355 sal_Bool SwWrtShell::EndNxtPg( sal_Bool bSelect )
356 {
357 	ShellMoveCrsr aTmp( this, bSelect );
358 	return MovePage( fnPageNext, fnPageEnd );
359 }
360 
361 
362 
EndPrvPg(sal_Bool bSelect)363 sal_Bool SwWrtShell::EndPrvPg( sal_Bool bSelect )
364 {
365 	ShellMoveCrsr aTmp( this, bSelect );
366 	return MovePage( fnPagePrev, fnPageEnd );
367 }
368 
369 
370 
SttPg(sal_Bool bSelect)371 sal_Bool SwWrtShell::SttPg( sal_Bool bSelect )
372 {
373 	ShellMoveCrsr aTmp( this, bSelect );
374 	return MovePage( fnPageCurr, fnPageStart );
375 }
376 
377 
378 
EndPg(sal_Bool bSelect)379 sal_Bool SwWrtShell::EndPg( sal_Bool bSelect )
380 {
381 	ShellMoveCrsr aTmp( this, bSelect );
382 	return MovePage( fnPageCurr, fnPageEnd );
383 }
384 
385 
386 
SttPara(sal_Bool bSelect)387 sal_Bool SwWrtShell::SttPara( sal_Bool bSelect )
388 {
389 	ShellMoveCrsr aTmp( this, bSelect );
390 	return MovePara( fnParaCurr, fnParaStart );
391 }
392 
393 
394 
EndPara(sal_Bool bSelect)395 sal_Bool SwWrtShell::EndPara( sal_Bool bSelect )
396 {
397 	ShellMoveCrsr aTmp( this, bSelect );
398 	return MovePara(fnParaCurr,fnParaEnd);
399 }
400 
401 
402 /*------------------------------------------------------------------------
403  Beschreibung:	Spaltenweises Springen
404  Parameter: 	mit oder ohne SSelection
405  Return:		Erfolg oder Misserfolg
406 ------------------------------------------------------------------------*/
407 
408 
409 
StartOfColumn(sal_Bool bSelect)410 sal_Bool SwWrtShell::StartOfColumn( sal_Bool bSelect )
411 {
412 	ShellMoveCrsr aTmp( this, bSelect);
413 	return MoveColumn(fnColumnCurr, fnColumnStart);
414 }
415 
416 
417 
EndOfColumn(sal_Bool bSelect)418 sal_Bool SwWrtShell::EndOfColumn( sal_Bool bSelect )
419 {
420 	ShellMoveCrsr aTmp( this, bSelect);
421 	return MoveColumn(fnColumnCurr, fnColumnEnd);
422 }
423 
424 
425 
StartOfNextColumn(sal_Bool bSelect)426 sal_Bool SwWrtShell::StartOfNextColumn( sal_Bool bSelect )
427 {
428 	ShellMoveCrsr aTmp( this, bSelect);
429 	return MoveColumn( fnColumnNext, fnColumnStart);
430 }
431 
432 
433 
EndOfNextColumn(sal_Bool bSelect)434 sal_Bool SwWrtShell::EndOfNextColumn( sal_Bool bSelect )
435 {
436 	ShellMoveCrsr aTmp( this, bSelect);
437 	return MoveColumn(fnColumnNext, fnColumnEnd);
438 }
439 
440 
441 
StartOfPrevColumn(sal_Bool bSelect)442 sal_Bool SwWrtShell::StartOfPrevColumn( sal_Bool bSelect )
443 {
444 	ShellMoveCrsr aTmp( this, bSelect);
445 	return MoveColumn(fnColumnPrev, fnColumnStart);
446 }
447 
448 
449 
EndOfPrevColumn(sal_Bool bSelect)450 sal_Bool SwWrtShell::EndOfPrevColumn( sal_Bool bSelect )
451 {
452 	ShellMoveCrsr aTmp( this, bSelect);
453 	return MoveColumn(fnColumnPrev, fnColumnEnd);
454 }
455 
456 
457 
PushCrsr(SwTwips lOffset,sal_Bool bSelect)458 sal_Bool SwWrtShell::PushCrsr(SwTwips lOffset, sal_Bool bSelect)
459 {
460 	sal_Bool bDiff = sal_False;
461 	SwRect aOldRect( GetCharRect() ), aTmpArea( VisArea() );
462 
463 	//bDestOnStack besagt, ob ich den Cursor nicht an die aktuelle Position
464 	//setzen konnte, da in diesem Bereich kein Inhalt vorhanden ist.
465 	if( !bDestOnStack )
466 	{
467 		Point aPt( aOldRect.Center() );
468 
469 		if( !IsCrsrVisible() )
470 			// set CrsrPos to top-/bottom left pos. So the pagescroll is not
471 			// be dependent on the current cursor, but on the visarea.
472 			aPt.Y() = aTmpArea.Top() + aTmpArea.Height() / 2;
473 
474 		aPt.Y() += lOffset;
475 		aDest = GetCntntPos(aPt,lOffset > 0);
476 		aDest.X() = aPt.X();
477 		bDestOnStack = sal_True;
478 	}
479 
480 	//falls wir eine Rahmenselektion hatten, muss diese nach dem
481 	//fnSetCrsr entfernt werden und damit wir da wieder hinkommen
482 	//auf dem Stack gemerkt werden.
483 	sal_Bool bIsFrmSel = sal_False;
484 
485 	sal_Bool bIsObjSel = sal_False;
486 
487 	//Zielposition liegt jetzt innerhalb des sichtbaren Bereiches -->
488 	//Cursor an die Zielposition setzen; merken, dass keine Ziel-
489 	//position mehr auf dem Stack steht.
490 	//Der neue sichtbare Bereich wird zuvor ermittelt.
491 	aTmpArea.Pos().Y() += lOffset;
492 	if( aTmpArea.IsInside(aDest) )
493 	{
494 		if( bSelect )
495 			SttSelect();
496 		else
497 			EndSelect();
498 
499 		bIsFrmSel = IsFrmSelected();
500 		bIsObjSel = 0 != IsObjSelected();
501 
502 		// Rahmenselektion aufheben
503 		if( bIsFrmSel || bIsObjSel )
504 		{
505 			UnSelectFrm();
506 			LeaveSelFrmMode();
507 			if ( bIsObjSel )
508 			{
509 				GetView().SetDrawFuncPtr( NULL );
510 				GetView().LeaveDrawCreate();
511 			}
512 
513 			CallChgLnk();
514 		}
515 
516 		(this->*fnSetCrsr)( &aDest, sal_True );
517 
518 		bDiff = aOldRect != GetCharRect();
519 
520 		if( bIsFrmSel )
521 		{
522 //			CallChgLnk();
523 			// bei Frames immer nur die obere Ecke nehmen, damit dieser
524 			// wieder selektiert werden kann
525 			aOldRect.SSize( 5, 5 );
526 		}
527 
528 			// Zuruecksetzen des Dest. SPoint Flags
529 		bDestOnStack = sal_False;
530 	}
531 
532 	// Position auf den Stack; bDiff besagt, ob ein Unterschied zwischen
533 	// der alten und der neuen Cursorposition besteht.
534 	pCrsrStack = new CrsrStack( bDiff, bIsFrmSel, aOldRect.Center(),
535 								lOffset, pCrsrStack );
536 	return !bDestOnStack && bDiff;
537 }
538 
539 
540 
PopCrsr(sal_Bool bUpdate,sal_Bool bSelect)541 sal_Bool SwWrtShell::PopCrsr(sal_Bool bUpdate, sal_Bool bSelect)
542 {
543 	if( 0 == pCrsrStack)
544 		return sal_False;
545 
546 	const sal_Bool bValidPos = pCrsrStack->bValidCurPos;
547 	if( bUpdate && bValidPos )
548 	{
549 			// falls ein Vorgaenger auf dem Stack steht, dessen Flag fuer eine
550 			// gueltige Position verwenden.
551 		SwRect aTmpArea(VisArea());
552 		aTmpArea.Pos().Y() -= pCrsrStack->lOffset;
553 		if( aTmpArea.IsInside( pCrsrStack->aDocPos ) )
554 		{
555 			if( bSelect )
556 				SttSelect();
557 			else
558 				EndSelect();
559 
560 			(this->*fnSetCrsr)(&pCrsrStack->aDocPos, !pCrsrStack->bIsFrmSel);
561 			if( pCrsrStack->bIsFrmSel && IsObjSelectable(pCrsrStack->aDocPos))
562 			{
563 				HideCrsr();
564 				SelectObj( pCrsrStack->aDocPos );
565 				EnterSelFrmMode( &pCrsrStack->aDocPos );
566 			}
567 		}
568 			// Falls eine Verschiebung zwischen dem sichtbaren Bereich
569 			// und der gemerkten Cursorpositionen auftritt, werden
570 			// alle gemerkten Positionen weggeschmissen
571 		else
572 		{
573 			_ResetCursorStack();
574 			return sal_False;
575 		}
576 	}
577 	CrsrStack *pTmp = pCrsrStack;
578 	pCrsrStack = pCrsrStack->pNext;
579 	delete pTmp;
580 	if( 0 == pCrsrStack )
581 	{
582 		ePageMove = MV_NO;
583 		bDestOnStack = sal_False;
584 	}
585 	return bValidPos;
586 }
587 
588 /*
589  * Zuruecksetzen aller gepushten Cursorpositionen; dieser werden nicht
590  * zur Anzeige gebracht ( --> Kein Start-/EndAction!!)
591  */
592 
593 
594 
_ResetCursorStack()595 void SwWrtShell::_ResetCursorStack()
596 {
597 	CrsrStack *pTmp = pCrsrStack;
598 	while(pCrsrStack)
599 	{
600 		pTmp = pCrsrStack->pNext;
601 		delete pCrsrStack;
602 		pCrsrStack = pTmp;
603 	}
604 	ePageMove = MV_NO;
605 	bDestOnStack = sal_False;
606 }
607 /**************
608 
609 	falls kein Stack existiert --> Selektionen aufheben
610 	falls Stack && Richtungswechsel
611 		--> Cursor poppen und return
612 	sonst
613 		--> Cursor pushen
614 			 Cursor umsetzen
615 
616 ***************/
617 
618 
619 
PageCrsr(SwTwips lOffset,sal_Bool bSelect)620 sal_Bool SwWrtShell::PageCrsr(SwTwips lOffset, sal_Bool bSelect)
621 {
622 	// nichts tun, wenn ein Offset von 0 angegeben wurde
623 	if(!lOffset) return sal_False;
624 		// Diente mal dazu, eine Neuformatierung fuer das Layout
625 		// zu erzwingen.
626 		// Hat so nicht funktioniert, da der Cursor nicht gesetzt
627 		// wurde, da dies innerhalb einer Start- / EndActionklammerung
628 		// nicht geschieht.
629 		// Da am Ende nur ViewShell::EndAction() gerufen wird,
630 		// findet auch hier keine Aktualisierung der Anzeige
631 		// der Cursorposition statt.
632 		// Die CrsrShell- Actionklammerung kann nicht verwendet werden,
633 		// da sie immer zu einer Anzeige des Cursors fuehrt, also auch,
634 		// wenn nach dem Blaettern in einen Bereich ohne gueltige Position
635 		// geblaettert wurde.
636 		//	ViewShell::StartAction();
637 	PageMove eDir = lOffset > 0? MV_PAGE_DOWN: MV_PAGE_UP;
638 		// Richtungswechsel und Stack vorhanden
639 	if( eDir != ePageMove && ePageMove != MV_NO && PopCrsr( sal_True, bSelect ))
640 		return sal_True;
641 
642 	const sal_Bool bRet = PushCrsr(lOffset, bSelect);
643 	ePageMove = eDir;
644 	return bRet;
645 }
646 
647 
648 
GotoPage(sal_uInt16 nPage,sal_Bool bRecord)649 sal_Bool SwWrtShell::GotoPage(sal_uInt16 nPage, sal_Bool bRecord)
650 {
651 	ShellMoveCrsr aTmp( this, sal_False);
652 	if( SwCrsrShell::GotoPage(nPage) && bRecord)
653 	{
654 		if(IsSelFrmMode())
655 		{
656 			UnSelectFrm();
657 			LeaveSelFrmMode();
658 		}
659 		return sal_True;
660 	}
661 	return sal_False;
662 }
663 
664 
665 
GotoMark(const::sw::mark::IMark * const pMark,sal_Bool bSelect,sal_Bool bStart)666 sal_Bool SwWrtShell::GotoMark( const ::sw::mark::IMark* const pMark, sal_Bool bSelect, sal_Bool bStart )
667 {
668 	ShellMoveCrsr aTmp( this, bSelect );
669 	return SwCrsrShell::GotoMark( pMark, bStart );
670 }
671 
672 
673 
SelectTxtAttr(sal_uInt16 nWhich,const SwTxtAttr * pAttr)674 sal_Bool SwWrtShell::SelectTxtAttr( sal_uInt16 nWhich, const SwTxtAttr* pAttr )
675 {
676     sal_Bool bRet;
677     {
678         MV_KONTEXT(this);
679         SttSelect();
680         bRet = SwCrsrShell::SelectTxtAttr( nWhich, sal_False, pAttr );
681     }
682     EndSelect();
683     return bRet;
684 }
685 
686 
687 
688