xref: /trunk/main/sw/inc/crsrsh.hxx (revision af7a586e)
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 #ifndef SW_CRSRSH_HXX
24 #define SW_CRSRSH_HXX
25 
26 #include <com/sun/star/i18n/WordType.hpp>
27 
28 #include <tools/string.hxx>
29 #include <tools/link.hxx>
30 #include <tools/rtti.hxx>
31 
32 #include <IShellCursorSupplier.hxx>
33 #include "swdllapi.h"
34 #include <swtypes.hxx>          // fuer SWPOSDOC
35 #include <viewsh.hxx>           // fuer ViewShell
36 #include <calbck.hxx>           // fuer SwClient
37 #include <cshtyp.hxx>           // fuer die CursorShell Typen
38 #include <crstate.hxx>          // fuer die CursorMove-Staties
39 #include <toxe.hxx>             // SwTOXSearchDir
40 #include <tblsel.hxx>               //SwTblSearchType
41 #include <viscrs.hxx>
42 #include <node.hxx>
43 #include <tblsel.hxx>
44 #include <IDocumentMarkAccess.hxx>
45 
46 
47 // einige Forward Deklarationen
48 
49 class KeyCode;
50 class SfxItemSet;
51 class SfxPoolItem;
52 class SwCntntFrm;
53 class SwCrsrShell;
54 class SwCursor;
55 class SwField;
56 class SwFieldType;
57 class SwFmt;
58 class SwFmtFld;
59 class SwNodeIndex;
60 class SwPaM;
61 class SwShellCrsr;
62 class SwShellTableCrsr;
63 class SwTableNode;
64 class SwTxtFmtColl;
65 class SwVisCrsr;
66 class SwTxtINetFmt;
67 class SwFmtINetFmt;
68 class SwTxtAttr;
69 class SwTableBox;
70 class SwCellFrms;
71 class SwTOXMark;
72 class SwRedline;
73 class IBlockCursor;
74 class SwCntntNode;
75 class SwPostItField;
76 class SwTxtFld;
77 struct SwPosition;
78 
79 namespace com { namespace sun { namespace star { namespace util {
80     struct SearchOptions;
81 } } } }
82 
83 namespace com { namespace sun { namespace star { namespace text {
84     class XTextRange;
85 }}}}
86 
87 namespace com { namespace sun { namespace star { namespace container {
88     class XStringKeyMap;
89 }}}}
90 
91 // enum und struktur, um ueber die Doc-Position Informationen zu erfragen
92 
93 struct SwContentAtPos
94 {
95     enum IsAttrAtPos
96     {
97         SW_NOTHING          = 0x0000,
98         SW_FIELD            = 0x0001,
99         SW_CLICKFIELD       = 0x0002,
100         SW_FTN              = 0x0004,
101         SW_INETATTR         = 0x0008,
102         SW_TABLEBOXFML      = 0x0010,
103         SW_REDLINE          = 0x0020,
104         SW_OUTLINE          = 0x0040,
105         SW_TOXMARK          = 0x0080,
106         SW_REFMARK          = 0x0100,
107         SW_NUMLABEL         = 0x0200, // #i23726#
108         SW_CONTENT_CHECK    = 0x0400, // --> FME 2005-05-13 #i43742# <--
109         SW_SMARTTAG         = 0x0800,
110         SW_FORMCTRL         = 0x1000
111 #ifndef PRODUCT
112         ,SW_CURR_ATTRS      = 0x4000        // nur zum Debuggen
113         ,SW_TABLEBOXVALUE   = 0x8000        // nur zum Debuggen
114 #endif
115     } eCntntAtPos;
116 
117     union {
118         const SwField* pFld;
119         const SfxPoolItem* pAttr;
120         const SwRedline* pRedl;
121         SwCntntNode * pNode; // #i23726#
122         const sw::mark::IFieldmark* pFldmark;
123     } aFnd;
124 
125     int nDist; // #i23726#
126 
127     String sStr;
128     const SwTxtAttr* pFndTxtAttr;
129 
SwContentAtPosSwContentAtPos130     SwContentAtPos( int eGetAtPos = 0xffff )
131         : eCntntAtPos( (IsAttrAtPos)eGetAtPos )
132     {
133         aFnd.pFld = 0;
134         pFndTxtAttr = 0;
135         nDist = 0; // #i23726#
136     }
137 
138     // befindet sich der Node in einem geschuetzten Bereich?
139     sal_Bool IsInProtectSect() const;
140     bool     IsInRTLText()const;
141 };
142 
143 // ReturnWerte von SetCrsr (werden verodert)
144 const int CRSR_POSOLD = 0x01,   // Cursor bleibt an alter Doc-Position
145           CRSR_POSCHG = 0x02;   // Position vom Layout veraendert
146 
147 // Helperfunction to resolve backward references in regular expressions
148 
149 String *ReplaceBackReferences( const com::sun::star::util::SearchOptions& rSearchOpt, SwPaM* pPam );
150 
151 // die Cursor - Shell
152 class SW_DLLPUBLIC SwCrsrShell
153     : public ViewShell
154     , public SwModify
155     , public ::sw::IShellCursorSupplier
156 {
157     friend class SwCallLink;
158     friend class SwVisCrsr;
159     friend class SwSelPaintRects;
160     friend class SwChgLinkFlag;
161 
162     //Braucht den Crsr als IntrnlCrsr.
163     friend sal_Bool GetAutoSumSel( const SwCrsrShell&, SwCellFrms& );
164 
165 public:     // public, damit defaultet werden kann !!
166 
167     /* ein enum fuer den Aufruf von UpdateCrsr */
168     enum CrsrFlag {
169         UPDOWN      = (1 << 0),     // Up/Down auf Spalte halten
170         SCROLLWIN   = (1 << 1),     // Window Scrollen
171         CHKRANGE    = (1 << 2),     // ueberpruefen von ueberlappenden PaM's
172         NOCALRECT   = (1 << 3),     // CharRect nicht neu berechnen
173         READONLY    = (1 << 4)      // Sichtbar machen trotz Readonly
174     };
175 
176 private:
177 
178     SwRect  aCharRect;          // Char-SRectangle auf dem der Cursor steht
179     Point   aCrsrHeight;        // Hohe&Offset von sichtbaren Cursor
180     Point   aOldRBPos;          // Right/Bottom von letzter VisArea
181                                 // (wird im Invalidate vom Cursor benutzt)
182 
183 
184     // um event. Macro was anhaengt auszufuehren.
185     Link aFlyMacroLnk;          // Link will be called, if the Crsr is set
186                                 // into a fly. A macro can be then becalled
187     Link aChgLnk;               // link will be called by every attribut/
188                                 // format changes at cursor position.
189     Link aGrfArrivedLnk;        // Link calls to UI if a grafik is arrived
190 
191 
192     SwShellCrsr* pCurCrsr;      // der aktuelle Cursor
193     SwShellCrsr* pCrsrStk;      // Stack fuer den Cursor
194     SwVisCrsr *pVisCrsr;        // der Sichtbare-Cursor
195 
196     IBlockCursor *pBlockCrsr;   // interface of cursor for block (=rectangular) selection
197 
198     SwShellTableCrsr* pTblCrsr; // Tabellen-Crsr; nur in Tabellen, wenn
199                                 // die Selection ueber 2 Spalten liegt
200 
201     SwNodeIndex* pBoxIdx;       // fuers erkennen der veraenderten
202     SwTableBox* pBoxPtr;        // Tabellen-Zelle
203 
204     long nUpDownX;              // versuche den Cursor bei Up/Down immer in
205                                 // der gleichen Spalte zu bewegen
206     long nLeftFrmPos;
207     sal_uLong nAktNode;             // save CursorPos at Start-Action
208     xub_StrLen nAktCntnt;
209     sal_uInt16 nAktNdTyp;
210     bool bAktSelection;
211 
212     /*
213      * Mit den Methoden SttCrsrMove und EndCrsrMove wird dieser Zaehler
214      * Inc-/Decrementiert. Solange der Zaehler ungleich 0 ist, erfolgt
215      * auf den akt. Cursor kein Update. Dadurch koennen "komplizierte"
216      * Cursorbewegungen (ueber Find()) realisiert werden.
217      */
218     sal_uInt16 nCrsrMove;
219     sal_uInt16 nBasicActionCnt;     // Actions, die vom Basic geklammert wurden
220     CrsrMoveState eMvState;     // Status fuers Crsr-Travelling - GetCrsrOfst
221 
222     String sMarkedListId;
223     int nMarkedListLevel;
224 
225     sal_Bool bHasFocus : 1;         // Shell ist in einem Window "aktiv"
226     sal_Bool bSVCrsrVis : 1;        // SV-Cursor Un-/Sichtbar
227     sal_Bool bChgCallFlag : 1;      // Attributaenderung innerhalb von
228                                 // Start- und EndAction
229     sal_Bool bVisPortChgd : 1;      // befindet sich im VisPortChg-Aufruf
230                                 // (wird im Invalidate vom Cursor benutzt)
231 
232     sal_Bool bCallChgLnk : 1;       // Flag fuer abgeleitete Klassen:
233                                 // sal_True -> ChgLnk callen
234                                 // Zugriff nur ueber SwChgLinkFlag
235     sal_Bool bAllProtect : 1;       // Flag fuer Bereiche
236                                 // sal_True -> alles geschuetzt / versteckt
237     sal_Bool bInCMvVisportChgd : 1; // Flag fuer CrsrMoves
238                                 // sal_True -> die Sicht wurde verschoben
239     sal_Bool bGCAttr : 1;           // sal_True -> es existieren nichtaufgespannte Attr.
240     sal_Bool bIgnoreReadonly : 1;   // sal_True -> Beim naechsten EndAction trotz
241                                 // Readonly den Crsr sichtbar machen.
242     sal_Bool bSelTblCells : 1;      // sal_True -> Zellen uebers InputWin selektieren
243     sal_Bool bAutoUpdateCells : 1;  // sal_True -> Zellen werden autoformatiert
244     sal_Bool bBasicHideCrsr : 1;    // sal_True -> HideCrsr vom Basic
245     sal_Bool bSetCrsrInReadOnly : 1;// sal_True -> Cursor darf in ReadOnly-Bereiche
246     sal_Bool bOverwriteCrsr : 1;    // sal_True -> show Overwrite Crsr
247 
248     // OD 11.02.2003 #100556# - flag to allow/avoid execution of marcos (default: true)
249     bool mbMacroExecAllowed : 1;
250 
251     SW_DLLPRIVATE void UpdateCrsr(
252         sal_uInt16 eFlags = SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE,
253         sal_Bool bIdleEnd = sal_False );
254 
255     SW_DLLPRIVATE void _ParkPams( SwPaM* pDelRg, SwShellCrsr** ppDelRing );
256 
257     // -> #i27615#
258 
259     /** Mark a certain list level of a certain list
260 
261         OD 2008-04-02 #refactorlists#
262         levels of a certain lists are marked now
263 
264         @param sListId    list Id of the list whose level is marked
265         @param nLevel     to be marked list level
266 
267         An empty sListId denotes that no level of a list is marked.
268      */
269     SW_DLLPRIVATE void MarkListLevel( const String& sListId,
270                                       const int nLevel );
271     // <- #i27615#
272 
273     // private method(s) accessed from public inline method(s) must be exported.
274                   sal_Bool LeftRight( sal_Bool, sal_uInt16, sal_uInt16, sal_Bool );
275     SW_DLLPRIVATE sal_Bool UpDown( sal_Bool, sal_uInt16 );
276     SW_DLLPRIVATE sal_Bool LRMargin( sal_Bool, sal_Bool bAPI = sal_False );
277     SW_DLLPRIVATE sal_Bool IsAtLRMargin( sal_Bool, sal_Bool bAPI = sal_False ) const;
278 
279     SW_DLLPRIVATE short GetTextDirection( const Point* pPt = 0 ) const;
280 
281 typedef sal_Bool (SwCursor:: *FNCrsr)();
282     SW_DLLPRIVATE sal_Bool CallCrsrFN( FNCrsr );
283 
284     SW_DLLPRIVATE const SwRedline* _GotoRedline( sal_uInt16 nArrPos, sal_Bool bSelect );
285 
286 protected:
287 
288     inline SwMoveFnCollection* MakeFindRange( sal_uInt16, sal_uInt16, SwPaM* ) const;
289 
290     /*
291      * Compare-Methode for the StackCursor and the current Cursor.
292      * The Methods return -1, 0, 1 for lower, equal, greater. The enum
293      * CrsrCompareType says which position is compared.
294      */
295     enum CrsrCompareType {
296         StackPtStackMk,
297         StackPtCurrPt,
298         StackPtCurrMk,
299         StackMkCurrPt,
300         StackMkCurrMk,
301         CurrPtCurrMk
302     };
303     int CompareCursor( CrsrCompareType eType ) const;
304 
305     // Setzt alle PaMs in OldNode auf NewPos + Offset
306     void PaMCorrAbs(const SwNodeIndex &rOldNode, const SwPosition &rNewPos,
307                     const xub_StrLen nOffset = 0 );
308 
309     // --> FME 2004-07-30 #i32329# Enhanced table selection
310     sal_Bool _SelTblRowOrCol( bool bRow, bool bRowSimple = false );
311     // <--
312 
313     // --> FME 2005-01-31 #i41424# Only update the marked number levels if necessary
314     bool SetInFrontOfLabel( sal_Bool bNew );
315     // <--
316 
317     void RefreshBlockCursor();
318 
319     /** Updates the marked list level according to the cursor.
320     */
321     SW_DLLPRIVATE void UpdateMarkedListLevel();
322 
323 protected:
324     virtual void Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew);
325 
326 public:
327     TYPEINFO();
328     SwCrsrShell( SwDoc& rDoc, Window *pWin, const SwViewOption *pOpt = 0 );
329     // verkleideter Copy-Constructor
330     SwCrsrShell( SwCrsrShell& rShell, Window *pWin );
331     virtual ~SwCrsrShell();
332 
333     // IShellCursorSupplier
334     virtual SwPaM & CreateNewShellCursor();
335     virtual SwPaM & GetCurrentShellCursor();
336 
337     // neuen Cusror erzeugen und den alten anhaengen
338     SwPaM * CreateCrsr();
339     // loesche den aktuellen Cursor und der folgende wird zum Aktuellen
340     sal_Bool DestroyCrsr();
341     // TableCursor in normale Cursor verwandeln, Tablemode aufheben
342     void TblCrsrToCursor();
343     // enter block mode, change normal cursor into block cursor
344     void CrsrToBlockCrsr();
345     // leave block mode, change block cursor into normal cursor
346     void BlockCrsrToCrsr();
347 
348     // SelAll() selects the document body content
349     // if ExtendedSelect() is called afterwards, the whole nodes array is selected
350     // only for usage in special cases allowed!
351     void ExtendedSelectAll();
352 
353     SwPaM* GetCrsr( sal_Bool bMakeTblCrsr = sal_True ) const;
354     inline SwCursor* GetSwCrsr( sal_Bool bMakeTblCrsr = sal_True ) const;
355     // nur den akt. Cursor returnen
_GetCrsr()356           SwShellCrsr* _GetCrsr()                       { return pCurCrsr; }
_GetCrsr() const357     const SwShellCrsr* _GetCrsr() const                 { return pCurCrsr; }
358 
359     // uebergebenen Cursor anzeigen - fuer UNO
360     void    SetSelection(const SwPaM& rCrsr);
361 
362     // alle Cursor aus den ContentNodes entfernen und auf 0 setzen.
363     // Wurde aus der FEShell hierher verschoben.
364     void ParkCrsr( const SwNodeIndex &rIdx );
365 
366     // gebe den akt. Cursor-Stack zurueck.
367     // ( Wird in der EditShell beim Loeschen von Inhalten benoetigt! )
368     inline SwPaM* GetStkCrsr() const;
369 
370     // Start der Klammerung, SV-Cursor und selektierte Bereiche hiden
371     void StartAction();
372     // Ende der Klammerung, SV-Cursor und selektierte Bereiche anzeigen
373     void EndAction( const sal_Bool bIdleEnd = sal_False );
374 
375     // Basiscursortravelling
GetUpDownX() const376     long GetUpDownX() const             { return nUpDownX; }
377 
Left(sal_uInt16 nCnt,sal_uInt16 nMode,sal_Bool bAllowVisual=sal_False)378     sal_Bool Left( sal_uInt16 nCnt, sal_uInt16 nMode, sal_Bool bAllowVisual = sal_False )
379         { return LeftRight( sal_True, nCnt, nMode, bAllowVisual ); }
Right(sal_uInt16 nCnt,sal_uInt16 nMode,sal_Bool bAllowVisual=sal_False)380     sal_Bool Right( sal_uInt16 nCnt, sal_uInt16 nMode, sal_Bool bAllowVisual = sal_False )
381         { return LeftRight( sal_False, nCnt, nMode, bAllowVisual ); }
Up(sal_uInt16 nCnt=1)382     sal_Bool Up( sal_uInt16 nCnt = 1 )      { return UpDown( sal_True, nCnt ); }
Down(sal_uInt16 nCnt=1)383     sal_Bool Down( sal_uInt16 nCnt = 1 )    { return UpDown( sal_False, nCnt ); }
LeftMargin()384     sal_Bool LeftMargin()               { return LRMargin( sal_True ); }
RightMargin(sal_Bool bAPI=sal_False)385     sal_Bool RightMargin(sal_Bool bAPI = sal_False) { return LRMargin( sal_False, bAPI ); }
386     sal_Bool SttEndDoc( sal_Bool bStt );
387 
388     sal_Bool MovePage( SwWhichPage, SwPosPage );
389     sal_Bool MovePara( SwWhichPara, SwPosPara );
390     sal_Bool MoveSection( SwWhichSection, SwPosSection );
391     sal_Bool MoveTable( SwWhichTable, SwPosTable );
392     sal_Bool MoveColumn( SwWhichColumn, SwPosColumn );
393     sal_Bool MoveRegion( SwWhichRegion, SwPosRegion );
394 
395     // die Suchfunktionen
396     sal_uLong Find( const com::sun::star::util::SearchOptions& rSearchOpt,
397                 sal_Bool bSearchInNotes,
398                 SwDocPositions eStart, SwDocPositions eEnde,
399                 sal_Bool& bCancel,
400                 FindRanges eRng, int bReplace = sal_False );
401 
402     sal_uLong Find( const SwTxtFmtColl& rFmtColl,
403                 SwDocPositions eStart, SwDocPositions eEnde,
404                 sal_Bool& bCancel,
405                 FindRanges eRng, const SwTxtFmtColl* pReplFmt = 0 );
406 
407     sal_uLong Find( const SfxItemSet& rSet, sal_Bool bNoCollections,
408                 SwDocPositions eStart, SwDocPositions eEnde,
409                 sal_Bool& bCancel,
410                 FindRanges eRng,
411                 const com::sun::star::util::SearchOptions* pSearchOpt = 0,
412                 const SfxItemSet* rReplSet = 0 );
413 
414     // Positionieren des Cursors
415     // returnt
416     //  CRSR_POSCHG: wenn der ob der SPoint vom Layout korrigiert wurde.
417     //  CRSR_POSOLD: wenn der Crsr nicht veraendert wurde
418     int SetCrsr( const Point &rPt, sal_Bool bOnlyText = sal_False, bool bBlock = true );
419 
420 
421     /*
422      * Benachrichtung, dass der sichtbare Bereich sich geaendert
423      * hat. aVisArea wird neu gesetzt, anschliessend wird
424      * gescrollt. Das uebergebene Rectangle liegt auf
425      * Pixelgrenzen, um Pixelfehler beim Scrollen zu vermeiden.
426      */
427     virtual void VisPortChgd( const SwRect & );
428 
429     /*
430      * Virtuelle PaintMethode, damit die Selection nach dem Paint wieder
431      * sichtbar wird.
432      */
433     void Paint( const Rectangle & rRect );
434 
435     // Bereiche
436     inline void SetMark();
437     inline sal_Bool HasMark();
438 
439     void ClearMark();
440 
441     /**
442        Ensure point and mark of the current PaM are in a specific order.
443 
444        @param bPointFirst TRUE: If the point is behind the mark then
445        swap the PaM. FALSE: If the mark is behind the point then swap
446        the PaM.
447     */
448     void NormalizePam(sal_Bool bPointFirst = sal_True);
449 
450     void SwapPam();
451     sal_Bool ChgCurrPam( const Point & rPt,
452                      sal_Bool bTstOnly = sal_True,      //Nur testen, nicht setzen
453                      sal_Bool bTstHit  = sal_False );   //Nur genaue Treffer
454     void KillPams();
455 
456     // erzeuge eine Kopie vom Cursor und speicher diese im Stack
457     void Push();
458     /*
459      *  Loescht einen Cursor (gesteuert durch bOldCrsr)
460      *      - vom Stack oder    ( bOldCrsr = sal_True )
461      *      - den aktuellen und der auf dem Stack stehende wird zum aktuellen
462      *
463      *  Return:  es war auf dem Stack noch einer vorhanden
464      */
465     sal_Bool Pop( sal_Bool bOldCrsr = sal_True );
466     /*
467      * Verbinde zwei Cursor miteinander.
468      * Loesche vom Stack den obersten und setzen dessen Mark im Aktuellen.
469      */
470     void Combine();
471 
472 #if !defined(DBG_UTIL)
SttCrsrMove()473     void SttCrsrMove() { ++nCrsrMove; StartAction(); }
EndCrsrMove(const sal_Bool bIdleEnd=sal_False)474     void EndCrsrMove( const sal_Bool bIdleEnd = sal_False )
475             { EndAction( bIdleEnd ); --nCrsrMove; }
476 #else
477     void SttCrsrMove();
478     void EndCrsrMove( const sal_Bool bIdleEnd = sal_False );
479 #endif
480 
481     /*
482      * Beim Abgeben des Focuses werden die selektierten Bereiche nicht mehr
483      * angezeigt; andererseits beim Erhalten des Focuses, werden alle selek-
484      * tierten Bereiche wieder angezeigt. (Bereiche muessen neu berechnet
485      * werden!)
486      */
HasShFcs() const487     sal_Bool HasShFcs() const { return bHasFocus; }
488     void ShLooseFcs();
489     void ShGetFcs( sal_Bool bUpdate = sal_True );
490 
491     // Methoden zum Anzeigen bzw. Verstecken des sichtbaren Text-Cursors
492     void ShowCrsr();
493     void HideCrsr();
494     // Methoden zum Anzeigen bzw. Verstecken der selektierten Bereiche mit
495     // dem sichtbaren Cursor
496     void ShowCrsrs( sal_Bool bCrsrVis );
497     void HideCrsrs();
498 
IsOverwriteCrsr() const499     sal_Bool IsOverwriteCrsr() const { return bOverwriteCrsr; }
SetOverwriteCrsr(sal_Bool bFlag)500     void SetOverwriteCrsr( sal_Bool bFlag ) { bOverwriteCrsr = bFlag; }
501 
502     // gebe den aktuellen Frame, in dem der Cursor steht, zurueck
503     SwCntntFrm *GetCurrFrm( const sal_Bool bCalcFrm = sal_True ) const;
504 
505     //sal_True wenn der Crsr wenn der Crsr wegen Readonly gehidet ist,
506     //sal_False wenn der arbeitet (trotz Readonly).
507     sal_Bool IsCrsrReadonly() const;
508     // Cursor steht in etwas geschuetztem oder in die Selektion umspannt
509     // etwas geschuetztes.
510     sal_Bool HasReadonlySel() const;
511     // darf der Cursor in ReadOnlyBereiche?
IsReadOnlyAvailable() const512     sal_Bool IsReadOnlyAvailable() const { return bSetCrsrInReadOnly; }
513     void SetReadOnlyAvailable( sal_Bool bFlag );
514     sal_Bool IsOverReadOnlyPos( const Point& rPt ) const;
515 
516     // Methoden fuer aFlyMacroLnk
SetFlyMacroLnk(const Link & rLnk)517     void        SetFlyMacroLnk( const Link& rLnk ) { aFlyMacroLnk = rLnk; }
GetFlyMacroLnk() const518     const Link& GetFlyMacroLnk() const             { return aFlyMacroLnk; }
519 
520     // Methoden geben/aendern den Link fuer die Attribut/Format-Aenderungen
SetChgLnk(const Link & rLnk)521     void        SetChgLnk( const Link &rLnk ) { aChgLnk = rLnk; }
GetChgLnk() const522     const Link& GetChgLnk() const             { return aChgLnk; }
523 
524     // Methoden geben/aendern den Link fuers "Grafik vollstaendig geladen"
SetGrfArrivedLnk(const Link & rLnk)525     void        SetGrfArrivedLnk( const Link &rLnk ) { aGrfArrivedLnk = rLnk; }
GetGrfArrivedLnk() const526     const Link& GetGrfArrivedLnk() const             { return aGrfArrivedLnk; }
527 
528     //ChgLink callen, innerhalb einer Action wird der Ruf verzoegert.
529     void CallChgLnk();
530 
531     // Abfrage, ob der aktuelle Cursor eine Selektion aufspannt,
532     // also, ob Mark gesetzt und SPoint und Mark unterschiedlich sind.
533     sal_Bool HasSelection() const;
534 
535     // Abfrage, ob ueberhaupt eine Selektion existiert, sprich der akt. Cursor
536     // aufgespannt oder nicht der einzigste ist.
537     inline sal_Bool IsSelection() const;
538     // returns if multiple cursors are available
539     inline sal_Bool IsMultiSelection() const;
540 
541     // Abfrage, ob ein kompletter Absatz selektiert wurde
542     sal_Bool IsSelFullPara() const;
543     // Abfrage, ob die Selektion in einem Absatz ist
544     inline sal_Bool IsSelOnePara() const;
545 
546     //Sollte fuer das Clipboard der WaitPtr geschaltet werden.
547     sal_Bool ShouldWait() const;
548 
549     /*
550      * liefert das SRectangle, auf dem der Cursor steht.
551      */
GetCharRect() const552     const SwRect &GetCharRect() const { return aCharRect; }
553 
554     // Obtains character rectangle at the position.
555     sal_Bool GetCharRectAt( SwRect& rOrig, const SwPosition& rPos,
556                                   SwCrsrMoveState *pCMS = 0 ) const;
557 
558     /*
559      * liefert zurueck, ob der Cursor sich ganz oder teilweise im
560      * sichtbaren Bereich befindet.
561      */
IsCrsrVisible() const562     sal_Bool IsCrsrVisible() const { return VisArea().IsOver( GetCharRect() ); }
563 
564     // gebe die aktuelle Seitennummer zurueck:
565     // sal_True:  in der der Cursor steht
566     // sal_False: die am oberen Rand sichtbar ist
567     void GetPageNum( sal_uInt16 &rnPhyNum, sal_uInt16 &rnVirtNum,
568                      sal_Bool bAtCrsrPos = sal_True, const sal_Bool bCalcFrm = sal_True );
569     // bestimme in welche Richtung "leere Seiten" behandelt werden!
570     // (wird benutzt im PhyPage.. )
571     sal_uInt16 GetNextPrevPageNum( sal_Bool bNext = sal_True );
572 
573     // setze den Cursor auf die Seite "nPage" an den Anfang
574     sal_Bool GotoPage( sal_uInt16 nPage );
575 
576     // gebe alle Dokumentseiten zurueck
577     sal_uInt16 GetPageCnt();
578 
579     // Gehe zur naechsten Selection
580     sal_Bool GoNextCrsr();
581     // gehe zur vorherigen Selection
582     sal_Bool GoPrevCrsr();
583 
584     // at CurCrsr.SPoint
585     ::sw::mark::IMark* SetBookmark(
586         const KeyCode&,
587         const ::rtl::OUString& rName,
588         const ::rtl::OUString& rShortName,
589         IDocumentMarkAccess::MarkType eMark = IDocumentMarkAccess::BOOKMARK);
590     bool GotoMark( const ::sw::mark::IMark* const pMark );    // sets CurCrsr.SPoint
591     bool GotoMark( const ::sw::mark::IMark* const pMark, bool bAtStart );
592     bool GoNextBookmark(); // true, if there was one
593     bool GoPrevBookmark();
594 
595     bool IsFormProtected();
596     ::sw::mark::IFieldmark* GetCurrentFieldmark();
597     ::sw::mark::IFieldmark* GetFieldmarkAfter();
598     ::sw::mark::IFieldmark* GetFieldmarkBefore();
599     bool GotoFieldmark( const ::sw::mark::IFieldmark* const pMark );
600 
601     // aktualisiere den Crsrs, d.H. setze ihn wieder in den Content.
602     // Das sollte nur aufgerufen werden, wenn der Cursor z.B. beim
603     // Loeschen von Rahmen irgendwohin gesetzt wurde. Die Position
604     // ergibt sich aus seiner aktuellen Position im Layout !!
605     void UpdateCrsrPos();
606 
607     // returne den am akt. Cursor selektierten Text. Dieser wird mit
608     // Felder etc. aufgefuellt!!
609     String GetSelTxt() const;
610     // gebe nur den Text ab der akt. Cursor Position zurueck (bis zum NodeEnde)
611     String GetText() const;
612 
613     // pruefe ob vom aktuellen Crsr der SPoint/Mark in einer Tabelle stehen
614     inline const SwTableNode* IsCrsrInTbl( sal_Bool bIsPtInTbl = sal_True ) const;
615     // erfrage die Document - Layout - Position vom akt. Crsr
616     inline Point& GetCrsrDocPos( sal_Bool bPoint = sal_True ) const;
617     inline sal_Bool IsCrsrPtAtEnd() const;
618 
619     inline const  SwPaM* GetTblCrs() const;
620     inline        SwPaM* GetTblCrs();
621 
622     sal_Bool IsTblComplex() const;
623     sal_Bool IsTblComplexForChart();
624     // erfrage die akt. TabellenSelektion als Text
625     String GetBoxNms() const;
626 
627     // setze Crsr in die naechsten/vorherigen Celle
628     sal_Bool GoNextCell( sal_Bool bAppendLine = sal_True );
629     sal_Bool GoPrevCell();
630     // gehe zu dieser Box (wenn vorhanden und in Tabelle!)
631     sal_Bool GotoTable( const String& rName );
632 
633     // select a table row, column or box (based on the current cursor)
SelTblRow()634     sal_Bool SelTblRow() { return _SelTblRowOrCol( true  ); }
SelTblCol()635     sal_Bool SelTblCol() { return _SelTblRowOrCol( false ); }
636     sal_Bool SelTblBox();
637     // --> FME 2004-07-30 #i32329# Enhanced table selection
638     sal_Bool SelTbl();
639     // <--
640 
641     // zum naechsten/vorhergehenden Punkt auf gleicher Ebene
642     sal_Bool GotoNextNum();
643     sal_Bool GotoPrevNum();
644 
645         // zu diesem Gliederungspunkt
646     sal_Bool GotoOutline( const String& rName );
647         // zum naechsten/vorhergehenden oder angegebenen OultineNode
648     void GotoOutline( sal_uInt16 nIdx );
649         // suche die "Outline-Position" im Nodes-Array vom akt. Kaiptel
650     sal_uInt16 GetOutlinePos( sal_uInt8 nLevel = UCHAR_MAX );
651         // selektiere den angeben Bereich von OutlineNodes. Optional
652         // inclusive der Childs. Die sal_uInt16 sind die Positionen im
653         // OutlineNds-Array!! (EditShell)
654     sal_Bool MakeOutlineSel( sal_uInt16 nSttPos, sal_uInt16 nEndPos,
655                         sal_Bool bWithChilds = sal_False );
656 
657     sal_Bool GotoNextOutline();         // naechster Node mit Outline-Num.
658     sal_Bool GotoPrevOutline();         // vorheriger Node mit Outline-Num.
659 
660     /** Delivers the current shell cursor
661 
662         Some operations have to run on the current cursor ring,
663         some on the pTblCrsr (if exist) or the current cursor ring and
664         some on the pTblCrsr or pBlockCrsr or the current cursor ring.
665         This small function checks the existence and delivers the wished cursor.
666 
667         @param bBlock [bool]
668         if the block cursor is of interest or not
669 
670         @return pTblCrsr if exist,
671         pBlockCrsr if exist and of interest (param bBlock)
672         otherwise pCurCrsr
673     */
674     SwShellCrsr* getShellCrsr( bool bBlock );
getShellCrsr(bool bBlock) const675     const SwShellCrsr* getShellCrsr( bool bBlock ) const
676         { return (const_cast<SwCrsrShell*>(this))->getShellCrsr( bBlock ); }
677 
IsBlockMode() const678     FASTBOOL IsBlockMode() const { return 0 != pBlockCrsr; }
GetBlockCrsr() const679     const IBlockCursor* GetBlockCrsr() const { return pBlockCrsr; }
GetBlockCrsr()680     IBlockCursor* GetBlockCrsr() { return pBlockCrsr; }
681 
682         // ist der Crsr in einer Tabelle und ist die Selection ueber
683         // zwei Spalten
IsTableMode() const684     sal_Bool IsTableMode() const { return 0 != pTblCrsr; }
685 
686         // erfrage den Tabellen Crsr; ausserhalb von Tabellen immer 0
GetTableCrsr() const687     const SwShellTableCrsr* GetTableCrsr() const { return pTblCrsr; }
GetTableCrsr()688     SwShellTableCrsr* GetTableCrsr() { return pTblCrsr; }
689     sal_uInt16 UpdateTblSelBoxes();
690 
691     sal_Bool GotoFtnTxt();      // springe aus dem Content zur Fussnote
692     sal_Bool GotoFtnAnchor();   // springe aus der Fussnote zum Anker
693     sal_Bool GotoPrevFtnAnchor();
694     sal_Bool GotoNextFtnAnchor();
695 
696     sal_Bool GotoFlyAnchor();       // springe aus dem Rahmen zum Anker
697     sal_Bool GotoHeaderTxt();       // springe aus dem Content zum Header
698     sal_Bool GotoFooterTxt();       // springe aus dem Content zum Footer
699     // springe in den Header/Footer des angegebenen oder akt. PageDesc
700     sal_Bool SetCrsrInHdFt( sal_uInt16 nDescNo = USHRT_MAX,
701                             sal_Bool bInHeader = sal_True );
702     // is point of cursor in header/footer. pbInHeader return sal_True if it is
703     // in a headerframe otherwise in a footerframe
704     sal_Bool IsInHeaderFooter( sal_Bool* pbInHeader = 0 ) const;
705 
706     // springe zum naechsten Verzeichnis [mit dem Namen]
707     sal_Bool GotoNextTOXBase( const String* = 0 );
708     // springe zum vorherigen Verzeichnis [mit dem Namen]
709     sal_Bool GotoPrevTOXBase( const String* = 0 );
710     sal_Bool GotoTOXMarkBase();     // springe zum Verzeichnis vom TOXMark
711     // springe zum naechsten (vorherigen) Verzeichniseintrag
712     sal_Bool GotoNxtPrvTOXMark( sal_Bool bNext = sal_True );
713     // Zur naechsten/ vorherigen Verzeichnismarke dieses Typs traveln
714     const SwTOXMark& GotoTOXMark( const SwTOXMark& rStart, SwTOXSearch eDir );
715 
716     // springe zum naechsten (vorherigen) Tabellenformel
717     // optional auch nur zu kaputten Formeln springen
718     sal_Bool GotoNxtPrvTblFormula( sal_Bool bNext = sal_True,
719                                     sal_Bool bOnlyErrors = sal_False );
720     // jump to the next / previous hyperlink - inside text and also
721     // on graphics
722     sal_Bool SelectNxtPrvHyperlink( sal_Bool bNext = sal_True );
723 
724     // springe zu dieser Refmark
725     sal_Bool GotoRefMark( const String& rRefMark, sal_uInt16 nSubType = 0,
726                             sal_uInt16 nSeqNo = 0 );
727 
728     // hole vom Start/Ende der akt. Selection das nte Zeichen
729     sal_Unicode GetChar( sal_Bool bEnd = sal_True, long nOffset = 0 );
730     // erweiter die akt. Selection am Anfang/Ende um n Zeichen
731     sal_Bool ExtendSelection( sal_Bool bEnd = sal_True, xub_StrLen nCount = 1 );
732     // setze nur den sichtbaren Cursor an die angegebene Dokument-Pos.
733     // returnt sal_False: wenn der ob der SPoint vom Layout korrigiert wurde.
734     // (wird zum Anzeigen von Drag&Drop/Copy-Cursor benoetigt)
735     sal_Bool SetVisCrsr( const Point &rPt );
736     inline void UnSetVisCrsr();
737 
738     // springe zum nachsten/vorherigen Feld des entsprechenden Types
739     sal_Bool MoveFldType(
740         const SwFieldType* pFldType,
741         const bool bNext,
742         const sal_uInt16 nResType = USHRT_MAX,
743         const bool bAddSetExpressionFldsToInputFlds = true );
744     // springe genau zu diesem Feld
745     sal_Bool GotoFld( const SwFmtFld& rFld );
746 
747     SwTxtFld* GetTxtFldAtPos(
748         const SwPosition* pPos,
749         const bool bIncludeInputFldAtStart ) const;
750     SwField* GetFieldAtCrsr(
751         const SwPaM* pCrsr,
752         const bool bIncludeInputFldAtStart ) const;
753     SwField* GetCurFld( const bool bIncludeInputFldAtStart = false ) const;
754     bool CrsrInsideInputFld() const;
755     bool PosInsideInputFld( const SwPosition& rPos ) const;
756     bool DocPtInsideInputFld( const Point& rDocPt ) const;
757     xub_StrLen StartOfInputFldAtPos( const SwPosition& rPos ) const;
758     xub_StrLen EndOfInputFldAtPos( const SwPosition& rPos ) const;
759 
760     // returne die Anzahl der Cursor im Ring (Flag besagt ob man nur
761     // aufgepspannte haben will - sprich etwas selektiert ist (Basic))
762     sal_uInt16 GetCrsrCnt( sal_Bool bAll = sal_True ) const;
763 
764     // Char Travelling - Methoden (in crstrvl1.cxx)
765     sal_Bool GoStartWord();
766     sal_Bool GoEndWord();
767     sal_Bool GoNextWord();
768     sal_Bool GoPrevWord();
769     sal_Bool GoNextSentence();
770     sal_Bool GoPrevSentence();
771     sal_Bool GoStartSentence();
772     sal_Bool GoEndSentence();
773     sal_Bool SelectWord( const Point* pPt = 0 );
774     sal_Bool ExpandToSentenceBorders();
775 
776 	// Position vom akt. Cursor erfragen
777     sal_Bool IsStartWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES )const;
778     sal_Bool IsEndWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const;
779     sal_Bool IsInWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const;
780     sal_Bool IsStartSentence() const;
781     sal_Bool IsEndSentence() const;
782     sal_Bool IsSttPara() const;
783     sal_Bool IsEndPara() const;
784     sal_Bool IsStartOfDoc() const;
785     sal_Bool IsEndOfDoc() const;
786     sal_Bool IsInFrontOfLabel() const;
IsAtLeftMargin() const787     sal_Bool IsAtLeftMargin()   const       { return IsAtLRMargin( sal_True ); }
IsAtRightMargin(sal_Bool bAPI=sal_False) const788     sal_Bool IsAtRightMargin(sal_Bool bAPI = sal_False) const   { return IsAtLRMargin( sal_False, bAPI ); }
789 
790     // loesche alle erzeugten Crsr, setze den Tabellen-Crsr und den letzten
791     // Cursor auf seinen TextNode (oder StartNode?).
792     // Beim naechsten ::GetCrsr werden sie wieder alle erzeugt.
793     // Wird fuers Drag&Drop/ClipBorad-Paste in Tabellen benoetigt.
794     sal_Bool ParkTblCrsr();
795 
796     // gibt es nicht aufgespannte Attribute?
IsGCAttr() const797     sal_Bool IsGCAttr() const { return bGCAttr; }
ClearGCAttr()798     void ClearGCAttr() { bGCAttr = sal_False; }
UpdateAttr()799     void    UpdateAttr() {  bGCAttr = sal_True; }
800 
801     // ist das gesamte Dokument geschuetzt/versteckt?? (fuer UI,..)
IsAllProtect() const802     sal_Bool IsAllProtect() const { return bAllProtect; }
803 
804 #ifdef SW_CRSR_TIMER
805     // setze das Flag am VisCrsr, ob dieser ueber Timer getriggert (sal_True)
806     // oder direkt (sal_False) angezeigt wird. (default ist Timer getriggert)
807     sal_Bool ChgCrsrTimerFlag( sal_Bool bTimerOn = sal_True );
808 #endif
809 
BasicActionPend() const810     sal_Bool BasicActionPend() const    { return nBasicActionCnt != nStartAction; }
811 
812         // springe zum benannten Bereich
813     sal_Bool GotoRegion( const String& rName );
814 
815     // zeige die aktuelle Selektion an
816     virtual void MakeSelVisible();
817 
818     // setzte den Cursor auf einen NICHT geschuetzten/versteckten Node
819     sal_Bool FindValidCntntNode( sal_Bool bOnlyText = sal_False );
820 
821     sal_Bool GetContentAtPos( const Point& rPt,
822                             SwContentAtPos& rCntntAtPos,
823                             sal_Bool bSetCrsr = sal_False,
824                             SwRect* pFldRect = 0 );
825 
826     // --> OD 2008-06-19 #i90516#
827     const SwPostItField* GetPostItFieldAtCursor() const;
828     // <--
829 
830     // get smart tags at point position
831     void GetSmartTagTerm( const Point& rPt,
832                           SwRect& rSelectRect,
833                           ::com::sun::star::uno::Sequence< rtl::OUString >& rSmartTagTypes,
834                           ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::container::XStringKeyMap > >& rStringKeyMaps,
835                           ::com::sun::star::uno::Reference<com::sun::star::text::XTextRange>& rRange );
836 
837     // get smart tags at current cursor position
838     void GetSmartTagTerm( ::com::sun::star::uno::Sequence< rtl::OUString >& rSmartTagTypes,
839                           ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::container::XStringKeyMap > >& rStringKeyMaps,
840                           ::com::sun::star::uno::Reference<com::sun::star::text::XTextRange>& rRange ) const;
841 
842     sal_Bool IsPageAtPos( const Point &rPt ) const;
843 
844         // Attribut selelktieren
845     sal_Bool SelectTxtAttr( sal_uInt16 nWhich, sal_Bool bExpand, const SwTxtAttr* pAttr = 0 );
846     sal_Bool GotoINetAttr( const SwTxtINetFmt& rAttr );
847     const SwFmtINetFmt* FindINetAttr( const String& rName ) const;
848 
849     sal_Bool SelectTxt( const xub_StrLen nStart,
850                         const xub_StrLen nEnd );
851 
852     sal_Bool CheckTblBoxCntnt( const SwPosition* pPos = 0 );
853     void SaveTblBoxCntnt( const SwPosition* pPos = 0 );
854     void ClearTblBoxCntnt();
855     sal_Bool EndAllTblBoxEdit();
856 
SetSelTblCells(sal_Bool bFlag)857     void SetSelTblCells( sal_Bool bFlag )           { bSelTblCells = bFlag; }
IsSelTblCells() const858     sal_Bool IsSelTblCells() const                  { return bSelTblCells; }
859 
IsAutoUpdateCells() const860     sal_Bool IsAutoUpdateCells() const              { return bAutoUpdateCells; }
SetAutoUpdateCells(sal_Bool bFlag)861     void SetAutoUpdateCells( sal_Bool bFlag )       { bAutoUpdateCells = bFlag; }
862 
863     sal_Bool GetShadowCrsrPos( const Point& rPt, SwFillMode eFillMode,
864                             SwRect& rRect, short& rOrient );
865     sal_Bool SetShadowCrsrPos( const Point& rPt, SwFillMode eFillMode );
866 
867     const SwRedline* SelNextRedline();
868     const SwRedline* SelPrevRedline();
869     const SwRedline* GotoRedline( sal_uInt16 nArrPos, sal_Bool bSelect = sal_False );
870 
871     // is cursor or the point in/over a vertical formatted text?
872     sal_Bool IsInVerticalText( const Point* pPt = 0 ) const;
873     // is cursor or the point in/over a right to left formatted text?
874     sal_Bool IsInRightToLeftText( const Point* pPt = 0 ) const;
875 
876     void FirePageChangeEvent(sal_uInt16 nOldPage, sal_uInt16 nNewPage);
877 	SwFrm* oldColFrm;
878 	bool   bColumnChange();
879     void FireSectionChangeEvent(sal_uInt16 nOldSection, sal_uInt16 nNewSection);
880     void FireColumnChangeEvent(sal_uInt16 nOldColumn, sal_uInt16 nNewColumn);
881     // If the current cursor position is inside a hidden range, the hidden range
882     // is selected and true is returned:
883     bool SelectHiddenRange();
884 
885     // remove all invalid cursors
886     void ClearUpCrsrs();
887 
888     // OD 11.02.2003 #100556# - set/get flag to allow/avoid execution of macros
SetMacroExecAllowed(const bool _bMacroExecAllowed)889     inline void SetMacroExecAllowed( const bool _bMacroExecAllowed )
890     {
891         mbMacroExecAllowed = _bMacroExecAllowed;
892     }
IsMacroExecAllowed()893     inline bool IsMacroExecAllowed()
894     {
895         return mbMacroExecAllowed;
896     }
897 
898     // #111827#
899     /**
900        Returns textual description of the current selection.
901 
902        - If the current selection is a multi-selection the result is
903          STR_MULTISEL.
904        - Else the result is the text of the selection.
905 
906        @return the textual description of the current selection
907      */
908     String GetCrsrDescr() const;
909 };
910 
911 
912 // Cursor Inlines:
MakeFindRange(sal_uInt16 nStt,sal_uInt16 nEnd,SwPaM * pPam) const913 inline SwMoveFnCollection* SwCrsrShell::MakeFindRange(
914             sal_uInt16 nStt, sal_uInt16 nEnd, SwPaM* pPam ) const
915 {
916     return pCurCrsr->MakeFindRange( (SwDocPositions)nStt, (SwDocPositions)nEnd, pPam );
917 }
918 
GetSwCrsr(sal_Bool bMakeTblCrsr) const919 inline SwCursor* SwCrsrShell::GetSwCrsr( sal_Bool bMakeTblCrsr ) const
920 {
921     return (SwCursor*)GetCrsr( bMakeTblCrsr );
922 }
923 
GetStkCrsr() const924 inline SwPaM* SwCrsrShell::GetStkCrsr() const { return pCrsrStk; }
925 
SetMark()926 inline void SwCrsrShell::SetMark() { pCurCrsr->SetMark(); }
927 
HasMark()928 inline sal_Bool SwCrsrShell::HasMark() { return( pCurCrsr->HasMark() ); }
929 
IsSelection() const930 inline sal_Bool SwCrsrShell::IsSelection() const
931 {
932     return IsTableMode() || pCurCrsr->HasMark() ||
933             pCurCrsr->GetNext() != pCurCrsr;
934 }
IsMultiSelection() const935 inline sal_Bool SwCrsrShell::IsMultiSelection() const
936 {
937     return pCurCrsr->GetNext() != pCurCrsr;
938 }
939 
IsSelOnePara() const940 inline sal_Bool SwCrsrShell::IsSelOnePara() const
941 {
942     return pCurCrsr == pCurCrsr->GetNext() &&
943            pCurCrsr->GetPoint()->nNode == pCurCrsr->GetMark()->nNode;
944 }
945 
IsCrsrInTbl(sal_Bool bIsPtInTbl) const946 inline const SwTableNode* SwCrsrShell::IsCrsrInTbl( sal_Bool bIsPtInTbl ) const
947 {
948     return pCurCrsr->GetNode( bIsPtInTbl )->FindTableNode();
949 }
950 
IsCrsrPtAtEnd() const951 inline sal_Bool SwCrsrShell::IsCrsrPtAtEnd() const
952 {
953     return pCurCrsr->End() == pCurCrsr->GetPoint();
954 }
955 
GetCrsrDocPos(sal_Bool bPoint) const956 inline Point& SwCrsrShell::GetCrsrDocPos( sal_Bool bPoint ) const
957 {
958     return bPoint ? pCurCrsr->GetPtPos() : pCurCrsr->GetMkPos();
959 }
960 
GetTblCrs() const961 inline const SwPaM* SwCrsrShell::GetTblCrs() const
962 {
963     return pTblCrsr;
964 }
965 
GetTblCrs()966 inline SwPaM* SwCrsrShell::GetTblCrs()
967 {
968     return pTblCrsr;
969 }
970 
UnSetVisCrsr()971 inline void SwCrsrShell::UnSetVisCrsr()
972 {
973     pVisCrsr->Hide();
974     pVisCrsr->SetDragCrsr( sal_False );
975 }
976 
977 #endif  // _CRSRSH_HXX
978