xref: /trunk/main/sw/source/ui/inc/wrtsh.hxx (revision a5b190bfa3e1bed4623e2958a8877664a3b5506c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _WRTSH_HXX
28 #define _WRTSH_HXX
29 
30 #include <com/sun/star/embed/XEmbeddedObject.hpp>
31 #include "swdllapi.h"
32 #include <fesh.hxx>
33 #include <sortopt.hxx>
34 #include <swurl.hxx>
35 #include <IMark.hxx>
36 
37 class Window;
38 class OutputDevice;
39 class SbxArray;
40 class SwDoc;
41 class SpellCheck;
42 class SwViewOption;
43 class SwFlyFrmAttrMgr;
44 class SwField;
45 class SwTOXBase;
46 class SdrView;
47 class SwView;
48 class SvGlobalName;
49 class SwInputFieldList;
50 class SwSectionData;
51 class Timer;
52 class SvxMacro;
53 class SwFmtINetFmt;
54 class SvxINetBookmark;
55 class SvxAutoCorrect;
56 class NaviContentBookmark;
57 struct SwCallMouseEvent;
58 class DropEvent;
59 struct ChartSelectionInfo;
60 class SfxStringListItem;
61 class SfxRequest;
62 
63 namespace com { namespace sun { namespace star { namespace util {
64     struct SearchOptions;
65 } } } }
66 
67 
68 typedef sal_Int32 SelectionType;
69 namespace nsSelectionType
70 {
71     const SelectionType SEL_TXT             = CNT_TXT;  // Text, niemals auch Rahmen    0x0001
72     const SelectionType SEL_GRF             = CNT_GRF;  // Grafik                       0x0002
73     const SelectionType SEL_OLE             = CNT_OLE;  // OLE                          0x0010
74     const SelectionType SEL_FRM             = 0x000020; // Rahmen, keine Inhaltsform
75     const SelectionType SEL_NUM             = 0x000040; // NumListe
76     const SelectionType SEL_TBL             = 0x000080; // Cursor steht in Tabelle
77     const SelectionType SEL_TBL_CELLS       = 0x000100; // Tabellenzellen sind selektiert
78     const SelectionType SEL_DRW             = 0x000200; // Zeichenobjekte (Rechteck, Kreis...)
79     const SelectionType SEL_DRW_TXT         = 0x000400; // Draw-Textobjekte im Editmode
80     const SelectionType SEL_BEZ             = 0x000800; // Bezierobjekte editieren
81     const SelectionType SEL_DRW_FORM        = 0x001000; // Zeichenobjekte: DB-Forms
82     const SelectionType SEL_FOC_FRM_CTRL    = 0x002000; // a form control is focused. Neither set nor evaluated by the SwWrtShell itself, only by it's clients.
83     const SelectionType SEL_MEDIA           = 0x004000; // Media object
84     const SelectionType SEL_EXTRUDED_CUSTOMSHAPE = 0x008000;    // extruded custom shape
85     const SelectionType SEL_FONTWORK        = 0x010000; // fontwork
86     const SelectionType SEL_POSTIT          = 0x020000; //annotation
87 }
88 
89 
90 class SW_DLLPUBLIC SwWrtShell: public SwFEShell
91 {
92 private:
93     using SwCrsrShell::Left;
94     using SwCrsrShell::Right;
95     using SwCrsrShell::Up;
96     using SwCrsrShell::Down;
97     using SwCrsrShell::LeftMargin;
98     using SwCrsrShell::RightMargin;
99     using SwCrsrShell::SelectTxtAttr;
100     using SwCrsrShell::GotoPage;
101     using SwFEShell::InsertObject;
102     using SwEditShell::AutoCorrect;
103     using SwCrsrShell::GotoMark;
104 
105 public:
106 
107     using SwEditShell::Insert;
108 
109     typedef long (SwWrtShell::*SELECTFUNC)(const Point *, sal_Bool bProp );
110 
111     SELECTFUNC  fnDrag;
112     SELECTFUNC  fnSetCrsr;
113     SELECTFUNC  fnEndDrag;
114     SELECTFUNC  fnKillSel;
115 
116     // Alle Selektionen aufheben
117     long ResetSelect( const Point *, sal_Bool );
118 
119     //setzt den Cursorstack nach dem Bewegen mit PageUp/-Down
120     //zurueck, falls ein Stack aufgebaut ist
121     inline void ResetCursorStack();
122     SelectionType   GetSelectionType() const;
123 
124     sal_Bool    IsModePushed() const { return 0 != pModeStack; }
125     void    PushMode();
126     void    PopMode();
127 
128     void    SttSelect();
129     void    EndSelect();
130     sal_Bool    IsInSelect() const { return bInSelect; }
131     void    SetInSelect(sal_Bool bSel = sal_True) { bInSelect = bSel; }
132         // Liegt eine Text- oder Rahmenselektion vor?
133     sal_Bool    HasSelection() const { return SwCrsrShell::HasSelection() ||
134                                         IsMultiSelection() || IsSelFrmMode() || IsObjSelected(); }
135     sal_Bool Pop( sal_Bool bOldCrsr = sal_True );
136 
137     void    EnterStdMode();
138     sal_Bool    IsStdMode() const { return !bExtMode && !bAddMode && !bBlockMode; }
139 
140     void    EnterExtMode();
141     void    LeaveExtMode();
142     long    ToggleExtMode();
143     sal_Bool    IsExtMode() const { return bExtMode; }
144 
145     void    EnterAddMode();
146     void    LeaveAddMode();
147     long    ToggleAddMode();
148     sal_Bool    IsAddMode() const { return bAddMode; }
149 
150     void    EnterBlockMode();
151     void    LeaveBlockMode();
152     long    ToggleBlockMode();
153     sal_Bool    IsBlockMode() const { return bBlockMode; }
154 
155     void    SetInsMode( sal_Bool bOn = sal_True );
156     void    ToggleInsMode() { SetInsMode( !bIns ); }
157     sal_Bool    IsInsMode() const { return bIns; }
158     void    SetRedlineModeAndCheckInsMode( sal_uInt16 eMode );
159 
160     void    EnterSelFrmMode(const Point *pStartDrag = 0);
161     void    LeaveSelFrmMode();
162     sal_Bool    IsSelFrmMode() const { return bLayoutMode; }
163         // Selektion von Rahmen aufheben
164     void    UnSelectFrm();
165 
166     void    Invalidate();
167 
168     // Tabellenzellen selektieren fuer Bearbeiten von Formeln in der Ribbonbar
169     inline void SelTblCells( const Link &rLink, sal_Bool bMark = sal_True );
170     inline void EndSelTblCells();
171 
172     //Wortweisen oder zeilenweisen Selektionsmodus verlassen. Wird
173     //in der Regel in MB-Up gerufen.
174     sal_Bool    IsExtSel() const { return bSelWrd || bSelLn; }
175 
176     // erfrage, ob der akt. fnDrag - Pointer auf BeginDrag gesetzt ist
177     // Wird fuer MouseMove gebraucht, um die Bugs 55592/55931 zu umgehen.
178     inline sal_Bool Is_FnDragEQBeginDrag() const;
179 
180     //Basisabfragen
181     sal_Bool    IsInWrd()           { return IsInWord(); }
182     sal_Bool    IsSttWrd()          { return IsStartWord(); }
183     sal_Bool    IsEndWrd();
184     sal_Bool    IsSttOfPara() const { return IsSttPara(); }
185     sal_Bool    IsEndOfPara() const { return IsEndPara(); }
186 
187     //Word bzw. Satz selektieren.
188     sal_Bool    SelNearestWrd();
189     sal_Bool    SelWrd      (const Point * = 0, sal_Bool bProp=sal_False );
190     // --> FME 2004-07-30 #i32329# Enhanced selection
191     void    SelSentence (const Point * = 0, sal_Bool bProp=sal_False );
192     void    SelPara     (const Point * = 0, sal_Bool bProp=sal_False );
193     // <--
194     long    SelAll();
195 
196     //Basiscursortravelling
197 typedef sal_Bool (SwWrtShell:: *FNSimpleMove)();
198     sal_Bool SimpleMove( FNSimpleMove, sal_Bool bSelect );
199 
200     sal_Bool Left       ( sal_uInt16 nMode, sal_Bool bSelect,
201                             sal_uInt16 nCount, sal_Bool bBasicCall, sal_Bool bVisual = sal_False );
202     sal_Bool Right      ( sal_uInt16 nMode, sal_Bool bSelect,
203                             sal_uInt16 nCount, sal_Bool bBasicCall, sal_Bool bVisual = sal_False );
204     sal_Bool Up         ( sal_Bool bSelect = sal_False, sal_uInt16 nCount = 1,
205                             sal_Bool bBasicCall = sal_False );
206     sal_Bool Down       ( sal_Bool bSelect = sal_False, sal_uInt16 nCount = 1,
207                             sal_Bool bBasicCall = sal_False );
208     sal_Bool NxtWrd     ( sal_Bool bSelect = sal_False ) { return SimpleMove( &SwWrtShell::_NxtWrd, bSelect ); }
209     sal_Bool PrvWrd     ( sal_Bool bSelect = sal_False ) { return SimpleMove( &SwWrtShell::_PrvWrd, bSelect ); }
210 
211     sal_Bool LeftMargin ( sal_Bool bSelect, sal_Bool bBasicCall );
212     sal_Bool RightMargin( sal_Bool bSelect, sal_Bool bBasicCall );
213 
214     sal_Bool SttDoc     ( sal_Bool bSelect = sal_False );
215     sal_Bool EndDoc     ( sal_Bool bSelect = sal_False );
216 
217     sal_Bool SttNxtPg   ( sal_Bool bSelect = sal_False );
218     sal_Bool SttPrvPg   ( sal_Bool bSelect = sal_False );
219     sal_Bool EndNxtPg   ( sal_Bool bSelect = sal_False );
220     sal_Bool EndPrvPg   ( sal_Bool bSelect = sal_False );
221     sal_Bool SttPg      ( sal_Bool bSelect = sal_False );
222     sal_Bool EndPg      ( sal_Bool bSelect = sal_False );
223     sal_Bool SttPara    ( sal_Bool bSelect = sal_False );
224     sal_Bool EndPara    ( sal_Bool bSelect = sal_False );
225     sal_Bool FwdPara    ( sal_Bool bSelect = sal_False )
226                 { return SimpleMove( &SwWrtShell::_FwdPara, bSelect ); }
227     sal_Bool BwdPara    ( sal_Bool bSelect = sal_False )
228                 { return SimpleMove( &SwWrtShell::_BwdPara, bSelect ); }
229     sal_Bool FwdSentence( sal_Bool bSelect = sal_False )
230                 { return SimpleMove( &SwWrtShell::_FwdSentence, bSelect ); }
231     sal_Bool BwdSentence( sal_Bool bSelect = sal_False )
232                 { return SimpleMove( &SwWrtShell::_BwdSentence, bSelect ); }
233 
234     // --> FME 2004-07-30 #i20126# Enhanced table selection
235     sal_Bool SelectTableRowCol( const Point& rPt, const Point* pEnd = 0, bool bRowDrag = false );
236     // <--
237     sal_Bool SelectTableRow();
238     sal_Bool SelectTableCol();
239     sal_Bool SelectTableCell();
240 
241     sal_Bool SelectTxtAttr( sal_uInt16 nWhich, const SwTxtAttr* pAttr = 0 );
242 
243     // Spaltenweise Spruenge
244     sal_Bool StartOfColumn      ( sal_Bool bSelect = sal_False );
245     sal_Bool EndOfColumn        ( sal_Bool bSelect = sal_False );
246     sal_Bool StartOfNextColumn  ( sal_Bool bSelect = sal_False );
247     sal_Bool EndOfNextColumn    ( sal_Bool bSelect = sal_False );
248     sal_Bool StartOfPrevColumn  ( sal_Bool bSelect = sal_False );
249     sal_Bool EndOfPrevColumn    ( sal_Bool bSelect = sal_False );
250 
251     // setze den Cursor auf die Seite "nPage" an den Anfang
252     // zusaetzlich zu der gleichnamigen Implementierung in crsrsh.hxx
253     // werden hier alle bestehenden Selektionen vor dem Setzen des
254     // Cursors aufgehoben
255     sal_Bool    GotoPage( sal_uInt16 nPage, sal_Bool bRecord );
256 
257     //setzen des Cursors; merken der alten Position fuer Zurueckblaettern.
258     DECL_LINK( ExecFlyMac, void * );
259 
260     sal_Bool    PageCrsr(SwTwips lOffset, sal_Bool bSelect);
261 
262     // Felder Update
263     void    UpdateInputFlds( SwInputFieldList* pLst = 0, sal_Bool bOnlyInSel = sal_False );
264 
265     void    NoEdit(sal_Bool bHideCrsr = sal_True);
266     void    Edit();
267     sal_Bool    IsNoEdit() const { return bNoEdit; }
268 
269     sal_Bool IsRetainSelection() const { return mbRetainSelection; }
270     void SetRetainSelection( sal_Bool bRet ) { mbRetainSelection = bRet; }
271 
272     // change current data base and notify
273     void ChgDBData(const SwDBData& SwDBData);
274 
275     // Loeschen
276     long    DelToEndOfLine();
277     long    DelToStartOfLine();
278     long    DelLine();
279     long    DelLeft();
280 
281     // loescht auch Rahmen bzw. setzt den Cursor in den Rahmen,
282     // wenn bDelFrm == sal_False ist
283     long    DelRight();
284     long    DelToEndOfPara();
285     long    DelToStartOfPara();
286     long    DelToEndOfSentence();
287     long    DelToStartOfSentence();
288     long    DelNxtWord();
289     long    DelPrvWord();
290 
291     // Prueft, ob eine Wortselektion vorliegt.
292     // Gemaess den Regeln fuer intelligentes Cut / Paste
293     // werden umgebende Spaces rausgeschnitten.
294     // Liefert Art der Wortselektion zurueck (siehe enum)
295     enum word {
296             NO_WORD = 0,
297             WORD_SPACE_BEFORE = 1,
298             WORD_SPACE_AFTER = 2,
299             WORD_NO_SPACE = 3
300         };
301     int     IntelligentCut(int nSelectionType, sal_Bool bCut = sal_True);
302 
303     // Editieren
304     void    Insert(SwField &);
305     void    Insert(const String &);
306     // Graphic
307     void    Insert( const String &rPath, const String &rFilter,
308                     const Graphic &, SwFlyFrmAttrMgr * = 0,
309                     sal_Bool bRule = sal_False );
310 
311     void    InsertByWord( const String & );
312     void    InsertPageBreak(const String *pPageDesc = 0, sal_uInt16 nPgNum = 0 );
313     void    InsertLineBreak();
314     void    InsertColumnBreak();
315     void    InsertFootnote(const String &, sal_Bool bEndNote = sal_False, sal_Bool bEdit = sal_True );
316     void    SplitNode( sal_Bool bAutoFormat = sal_False, sal_Bool bCheckTableStart = sal_True );
317     sal_Bool    CanInsert();
318 
319     // Verzeichnisse
320     void    InsertTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);
321     sal_Bool    UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);
322 
323     // Numerierung und Bullets
324     /**
325        Turns on numbering or bullets.
326 
327        @param bNum    sal_True: turn on numbering
328                       sal_False: turn on bullets
329     */
330     void    NumOrBulletOn(sal_Bool bNum); // #i29560#
331     void    NumOrBulletOff(); // #i29560#
332     void    NumOn();
333     void    BulletOn();
334 
335     //OLE
336     void    InsertObject(     /*SvInPlaceObjectRef *pObj, */       // != 0 fuer Clipboard
337                           const svt::EmbeddedObjectRef&,
338                           SvGlobalName *pName = 0,      // != 0 entspr. Object erzeugen.
339                           sal_Bool bActivate = sal_True,
340                           sal_uInt16 nSlotId = 0);       // SlotId fuer Dialog
341 
342     sal_Bool    InsertOleObject( const svt::EmbeddedObjectRef& xObj, SwFlyFrmFmt **pFlyFrmFmt = 0 );
343     void    LaunchOLEObj( long nVerb = 0 );             // Server starten
344     sal_Bool    IsOLEObj() const { return GetCntType() == CNT_OLE;}
345     virtual void MoveObjectIfActive( svt::EmbeddedObjectRef& xObj, const Point& rOffset );
346     virtual void CalcAndSetScale( svt::EmbeddedObjectRef& xObj,
347                                   const SwRect *pFlyPrtRect = 0,
348                                   const SwRect *pFlyFrmRect = 0,
349                                   const bool bNoTxtFrmPrtAreaChanged = false );
350     virtual void ConnectObj( svt::EmbeddedObjectRef&  xIPObj, const SwRect &rPrt,
351                              const SwRect &rFrm );
352 
353     // Vorlagen und Formate
354 
355     // enum gibt an, was geschehen soll, wenn das Style nicht gefunden wurde
356     enum GetStyle { GETSTYLE_NOCREATE,          // keins anlegen
357                     GETSTYLE_CREATESOME,        // falls auf PoolId mapt anlegen
358                     GETSTYLE_CREATEANY };       // ggfs Standard returnen
359 
360     SwTxtFmtColl*   GetParaStyle(const String &rCollName,
361                                     GetStyle eCreate = GETSTYLE_NOCREATE);
362     SwCharFmt*      GetCharStyle(const String &rFmtName,
363                                     GetStyle eCreate = GETSTYLE_NOCREATE);
364     SwFrmFmt*       GetTblStyle(const String &rFmtName);
365 
366     void    SetPageStyle(const String &rCollName);
367 
368     String  GetCurPageStyle( const sal_Bool bCalcFrm = sal_True ) const;
369 
370     // Aktuelle Vorlage anhand der geltenden Attribute aendern
371     void    QuickUpdateStyle();
372 
373     enum DoType { UNDO, REDO, REPEAT };
374 
375     void    Do( DoType eDoType, sal_uInt16 nCnt = 1 );
376     String  GetDoString( DoType eDoType ) const;
377     String  GetRepeatString() const;
378     sal_uInt16  GetDoStrings( DoType eDoType, SfxStringListItem& rStrLstItem ) const;
379 
380     //Suchen oder Ersetzen
381     sal_uLong SearchPattern(const com::sun::star::util::SearchOptions& rSearchOpt,
382                          sal_Bool bSearchInNotes,
383                          SwDocPositions eStart, SwDocPositions eEnde,
384                          FindRanges eFlags = FND_IN_BODY,
385                          int bReplace = sal_False );
386 
387     sal_uLong SearchTempl  (const String &rTempl,
388                          SwDocPositions eStart, SwDocPositions eEnde,
389                          FindRanges eFlags = FND_IN_BODY,
390                          const String* pReplTempl = 0 );
391 
392     sal_uLong SearchAttr   (const SfxItemSet& rFindSet,
393                          sal_Bool bNoColls,
394                          SwDocPositions eStart,SwDocPositions eEnde,
395                          FindRanges eFlags = FND_IN_BODY,
396                          const com::sun::star::util::SearchOptions* pSearchOpt = 0,
397                          const SfxItemSet* pReplaceSet = 0);
398 
399     void AutoCorrect( SvxAutoCorrect& rACorr, sal_Unicode cChar = ' ' );
400 
401     // Aktion vor Cursorbewegung
402     // Hebt gfs. Selektionen auf, triggert Timer und GCAttr()
403     void    MoveCrsr( sal_Bool bWithSelect = sal_False );
404 
405     // Eingabefelder updaten
406     sal_Bool    StartInputFldDlg(SwField*, sal_Bool bNextButton, Window* pParentWin = 0, ByteString* pWindowState = 0);
407     // update DropDown fields
408     sal_Bool    StartDropDownFldDlg(SwField*, sal_Bool bNextButton, ByteString* pWindowState = 0);
409 
410     //"Handler" fuer Anederungen an der DrawView - fuer Controls.
411     virtual void DrawSelChanged( );
412 
413     // springe zum Bookmark und setze die "Selections-Flags" wieder richtig
414     sal_Bool GotoMark( const ::sw::mark::IMark* const pMark );
415     sal_Bool GotoMark( const ::sw::mark::IMark* const pMark, sal_Bool bSelect, sal_Bool bStart );
416     sal_Bool GotoMark( const ::rtl::OUString& rName );
417     sal_Bool GoNextBookmark(); // sal_True, wenn's noch eine gab
418     sal_Bool GoPrevBookmark();
419 
420     bool GotoFieldmark(::sw::mark::IFieldmark const * const pMark);
421 
422     sal_Bool GotoField( const SwFmtFld& rFld );
423 
424     // jump to the next / previous hyperlink - inside text and also
425     // on graphics
426     sal_Bool SelectNextPrevHyperlink( sal_Bool bNext = sal_True );
427 
428     // Zugehoerige SwView ermitteln
429     const SwView&       GetView() const { return rView; }
430     SwView&             GetView() { return rView; }
431 
432     //Weil es sonst keiner macht, gibt es hier eine ExecMacro()
433     void ExecMacro( const SvxMacro& rMacro, String* pRet = 0, SbxArray* pArgs = 0 );
434     // rufe ins dunkle Basic/JavaScript
435     sal_uInt16 CallEvent( sal_uInt16 nEvent, const SwCallMouseEvent& rCallEvent,
436                         sal_Bool bCheckPtr = sal_False, SbxArray* pArgs = 0,
437                         const Link* pCallBack = 0 );
438 
439     // ein Klick aus das angegebene Feld. Der Cursor steht auf diesem.
440     // Fuehre die vor definierten Aktionen aus.
441     void ClickToField( const SwField& rFld );
442     void ClickToINetAttr( const SwFmtINetFmt& rItem, sal_uInt16 nFilter = URLLOAD_NOFILTER );
443     sal_Bool ClickToINetGrf( const Point& rDocPt, sal_uInt16 nFilter = URLLOAD_NOFILTER );
444     inline sal_Bool IsInClickToEdit() const ;
445 
446     // fall ein URL-Button selektiert ist, dessen URL returnen, ansonsten
447     // einen LeerString
448     sal_Bool GetURLFromButton( String& rURL, String& rDescr ) const;
449 
450     void NavigatorPaste( const NaviContentBookmark& rBkmk,
451                          const sal_uInt16 nAction );
452 
453     // die Core erzeugt eine Selektion, das SttSelect muss gerufen werden
454     virtual void NewCoreSelection();
455 
456     virtual void ApplyViewOptions( const SwViewOption &rOpt );
457 
458     // autom. Update von Vorlagen
459     void AutoUpdateFrame(SwFrmFmt* pFmt, const SfxItemSet& rStyleSet);
460     void AutoUpdatePara(SwTxtFmtColl* pColl, const SfxItemSet& rStyleSet);
461 
462     // Link fuers einfuegen von Bereichen uebers Drag&Drop/Clipboard
463     DECL_STATIC_LINK( SwWrtShell, InsertRegionDialog, SwSectionData* );
464 
465 
466     //ctoren, der erstere ist eine Art kontrollierter copy ctor fuer weitere
467     //Sichten auf ein Dokument
468     SwWrtShell( SwWrtShell&, Window *pWin, SwView &rShell);
469     SwWrtShell( SwDoc& rDoc, Window *pWin, SwView &rShell,
470                 const SwViewOption *pViewOpt = 0);
471     virtual ~SwWrtShell();
472 
473     sal_Bool TryRemoveIndent(); // #i23725#
474 
475     String GetSelDescr() const;
476 
477 private:
478 
479     SW_DLLPRIVATE void  OpenMark();
480     SW_DLLPRIVATE void  CloseMark( sal_Bool bOkFlag );
481 
482     SW_DLLPRIVATE String    GetWrdDelim();
483     SW_DLLPRIVATE String    GetSDelim();
484     SW_DLLPRIVATE String    GetBothDelim();
485 
486     struct ModeStack
487     {
488         ModeStack   *pNext;
489         sal_Bool        bAdd,
490                     bBlock,
491                     bExt,
492                     bIns;
493         ModeStack(ModeStack *pNextMode, sal_Bool _bIns, sal_Bool _bExt, sal_Bool _bAdd, sal_Bool _bBlock):
494             pNext(pNextMode),
495             bAdd(_bAdd),
496             bBlock(_bBlock),
497             bExt(_bExt),
498             bIns(_bIns)
499              {}
500     } *pModeStack;
501 
502     // Cursor bei PageUp / -Down mitnehmen
503     enum PageMove
504     {
505         MV_NO,
506         MV_PAGE_UP,
507         MV_PAGE_DOWN
508     }  ePageMove;
509 
510     struct CrsrStack
511     {
512         Point aDocPos;
513         CrsrStack *pNext;
514         sal_Bool bValidCurPos : 1;
515         sal_Bool bIsFrmSel : 1;
516         SwTwips lOffset;
517 
518         CrsrStack( sal_Bool bValid, sal_Bool bFrmSel, const Point &rDocPos,
519                     SwTwips lOff, CrsrStack *pN )
520             : aDocPos(rDocPos),
521             pNext(pN),
522             bValidCurPos( bValid ),
523             bIsFrmSel( bFrmSel ),
524             lOffset(lOff)
525         {
526 
527 
528         }
529 
530     } *pCrsrStack;
531 
532     SwView  &rView;
533 
534     Point   aDest;
535     sal_Bool    bDestOnStack;
536     sal_Bool    HasCrsrStack() const { return 0 != pCrsrStack; }
537     SW_DLLPRIVATE sal_Bool  PushCrsr(SwTwips lOffset, sal_Bool bSelect);
538     SW_DLLPRIVATE sal_Bool  PopCrsr(sal_Bool bUpdate, sal_Bool bSelect = sal_False);
539 
540     // ENDE Cursor bei PageUp / -Down mitnehmen
541     SW_DLLPRIVATE sal_Bool _SttWrd();
542     SW_DLLPRIVATE sal_Bool _EndWrd();
543     SW_DLLPRIVATE sal_Bool _NxtWrd();
544     SW_DLLPRIVATE sal_Bool _PrvWrd();
545     // --> OD 2008-08-06 #i92468#
546     SW_DLLPRIVATE sal_Bool _NxtWrdForDelete();
547     SW_DLLPRIVATE sal_Bool _PrvWrdForDelete();
548     // <--
549     SW_DLLPRIVATE sal_Bool _FwdSentence();
550     SW_DLLPRIVATE sal_Bool _BwdSentence();
551     sal_Bool _FwdPara();
552     SW_DLLPRIVATE sal_Bool _BwdPara();
553 
554         //  Selektionen
555     sal_Bool    bIns            :1;
556     sal_Bool    bInSelect       :1;
557     sal_Bool    bExtMode        :1;
558     sal_Bool    bAddMode        :1;
559     sal_Bool    bBlockMode      :1;
560     sal_Bool    bLayoutMode     :1;
561     sal_Bool    bNoEdit         :1;
562     sal_Bool    bCopy           :1;
563     sal_Bool    bSelWrd         :1;
564     sal_Bool    bSelLn          :1;
565     sal_Bool    bIsInClickToEdit:1;
566     sal_Bool    bClearMark      :1;     // Selektion fuer ChartAutoPilot nicht loeschen
567     sal_Bool    mbRetainSelection :1; // Do not remove selections
568 
569     Point   aStart;
570     Link    aSelTblLink;
571 
572     SELECTFUNC  fnLeaveSelect;
573 
574     //setzt den Cursorstack nach dem Bewegen mit PageUp/-Down zurueck.
575     SW_DLLPRIVATE void  _ResetCursorStack();
576 
577     SW_DLLPRIVATE void  SttDragDrop(Timer *);
578 
579     using SwCrsrShell::SetCrsr;
580     SW_DLLPRIVATE long  SetCrsr(const Point *, sal_Bool bProp=sal_False );
581 
582     SW_DLLPRIVATE long  SetCrsrKillSel(const Point *, sal_Bool bProp=sal_False );
583 
584     SW_DLLPRIVATE long  StdSelect(const Point *, sal_Bool bProp=sal_False );
585     SW_DLLPRIVATE long  BeginDrag(const Point *, sal_Bool bProp=sal_False );
586     SW_DLLPRIVATE long  Drag(const Point *, sal_Bool bProp=sal_False );
587     SW_DLLPRIVATE long  EndDrag(const Point *, sal_Bool bProp=sal_False );
588 
589     SW_DLLPRIVATE long  ExtSelWrd(const Point *, sal_Bool bProp=sal_False );
590     SW_DLLPRIVATE long  ExtSelLn(const Point *, sal_Bool bProp=sal_False );
591 
592     //Verschieben von Text aus Drag and Drop; Point ist
593     //Destination fuer alle Selektionen.
594     SW_DLLPRIVATE long  MoveText(const Point *, sal_Bool bProp=sal_False );
595 
596     SW_DLLPRIVATE long  BeginFrmDrag(const Point *, sal_Bool bProp=sal_False );
597 
598     //nach SSize/Move eines Frames Update; Point ist Destination.
599     SW_DLLPRIVATE long  UpdateLayoutFrm(const Point *, sal_Bool bProp=sal_False );
600 
601     SW_DLLPRIVATE long  SttLeaveSelect(const Point *, sal_Bool bProp=sal_False );
602     SW_DLLPRIVATE long  AddLeaveSelect(const Point *, sal_Bool bProp=sal_False );
603     SW_DLLPRIVATE long  Ignore(const Point *, sal_Bool bProp=sal_False );
604 
605     SW_DLLPRIVATE void  LeaveExtSel() { bSelWrd = bSelLn = sal_False;}
606     SW_DLLPRIVATE sal_Bool  _CanInsert();
607 
608     SW_DLLPRIVATE sal_Bool  GoStart(sal_Bool KeepArea = sal_False, sal_Bool * = 0,
609             sal_Bool bSelect = sal_False, sal_Bool bDontMoveRegion = sal_False);
610     SW_DLLPRIVATE sal_Bool  GoEnd(sal_Bool KeepArea = sal_False, sal_Bool * = 0);
611 
612     enum BookMarkMove
613     {
614         BOOKMARK_INDEX,
615         BOOKMARK_NEXT,
616         BOOKMARK_PREV,
617         BOOKMARK_LAST_LAST_ENTRY
618     };
619 
620     SW_DLLPRIVATE sal_Bool MoveBookMark(BookMarkMove eFuncId, const ::sw::mark::IMark* const pMark=NULL);
621 };
622 
623 inline void SwWrtShell::ResetCursorStack()
624 {
625     if ( HasCrsrStack() )
626         _ResetCursorStack();
627 }
628 
629 inline void SwWrtShell::SelTblCells(const Link &rLink, sal_Bool bMark )
630 {
631     SetSelTblCells( sal_True );
632     bClearMark = bMark;
633     aSelTblLink = rLink;
634 }
635 inline void SwWrtShell::EndSelTblCells()
636 {
637     SetSelTblCells( sal_False );
638     bClearMark = sal_True;
639 }
640 
641 inline sal_Bool SwWrtShell::IsInClickToEdit() const { return bIsInClickToEdit; }
642 
643 inline sal_Bool SwWrtShell::Is_FnDragEQBeginDrag() const
644 {
645 #ifdef GCC
646     SELECTFUNC  fnTmp = &SwWrtShell::BeginDrag;
647     return fnDrag == fnTmp;
648 #else
649     return sal::static_int_cast< sal_Bool >(fnDrag == &SwWrtShell::BeginDrag);
650 #endif
651 }
652 
653 #endif
654