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