xref: /AOO41X/main/sw/source/ui/wrtsh/move.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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