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