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 $
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 ************************************************************************/
33 #include <tools/string.hxx>
34 #include <tools/link.hxx>
35 #include <tools/rtti.hxx>
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
47 #include <IDocumentMarkAccess.hxx>
51 // einige Forward Deklarationen
66 class SwShellTableCrsr
;
78 class SwCntntNode
; // #i23726#
79 // --> OD 2008-06-19 #i90516#
84 namespace com
{ namespace sun
{ namespace star
{ namespace util
{
88 namespace com
{ namespace sun
{ namespace star
{ namespace text
{
92 namespace com
{ namespace sun
{ namespace star
{ namespace container
{
96 // enum und struktur, um ueber die Doc-Position Informationen zu erfragen
104 SW_CLICKFIELD
= 0x0002,
106 SW_INETATTR
= 0x0008,
107 SW_TABLEBOXFML
= 0x0010,
112 SW_NUMLABEL
= 0x0200, // #i23726#
113 SW_CONTENT_CHECK
= 0x0400, // --> FME 2005-05-13 #i43742# <--
114 SW_SMARTTAG
= 0x0800,
117 ,SW_CURR_ATTRS
= 0x4000 // nur zum Debuggen
118 ,SW_TABLEBOXVALUE
= 0x8000 // nur zum Debuggen
124 const SfxPoolItem
* pAttr
;
125 const SwRedline
* pRedl
;
126 SwCntntNode
* pNode
; // #i23726#
127 const sw::mark::IFieldmark
* pFldmark
;
130 int nDist
; // #i23726#
133 const SwTxtAttr
* pFndTxtAttr
;
135 SwContentAtPos( int eGetAtPos
= 0xffff )
136 : eCntntAtPos( (IsAttrAtPos
)eGetAtPos
)
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 */
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
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
209 ULONG nAktNode
; // save CursorPos at Start-Action
210 xub_StrLen nAktCntnt
;
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.
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
;
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
);
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
,
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
);
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
{
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 );
317 // --> FME 2005-01-31 #i41424# Only update the marked number levels if necessary
318 bool SetInFrontOfLabel( BOOL bNew
);
321 void RefreshBlockCursor();
323 /** Updates the marked list level according to the cursor.
325 SW_DLLPRIVATE
void UpdateMarkedListLevel();
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
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
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
,
397 SwDocPositions eStart
, SwDocPositions eEnde
,
399 FindRanges eRng
, int bReplace
= FALSE
);
401 ULONG
Find( const SwTxtFmtColl
& rFmtColl
,
402 SwDocPositions eStart
, SwDocPositions eEnde
,
404 FindRanges eRng
, const SwTxtFmtColl
* pReplFmt
= 0 );
406 ULONG
Find( const SfxItemSet
& rSet
, BOOL bNoCollections
,
407 SwDocPositions eStart
, SwDocPositions eEnde
,
410 const com::sun::star::util::SearchOptions
* pSearchOpt
= 0,
411 const SfxItemSet
* rReplSet
= 0 );
413 // Positionieren des Cursors
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
432 void Paint( const Rectangle
& rRect
);
435 inline void SetMark();
436 inline BOOL
HasMark();
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
447 void NormalizePam(BOOL bPointFirst
= TRUE
);
450 BOOL
ChgCurrPam( const Point
& rPt
,
451 BOOL bTstOnly
= TRUE
, //Nur testen, nicht setzen
452 BOOL bTstHit
= FALSE
); //Nur genaue Treffer
455 // erzeuge eine Kopie vom Cursor und speicher diese im Stack
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.
471 #if defined( PRODUCT )
472 void SttCrsrMove() { ++nCrsrMove
; StartAction(); }
473 void EndCrsrMove( const BOOL bIdleEnd
= FALSE
)
474 { EndAction( bIdleEnd
); --nCrsrMove
; }
477 void EndCrsrMove( const BOOL bIdleEnd
= FALSE
);
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
486 BOOL
HasShFcs() const { return bHasFocus
; }
488 void ShGetFcs( BOOL bUpdate
= TRUE
);
490 // Methoden zum Anzeigen bzw. Verstecken des sichtbaren Text-Cursors
493 // Methoden zum Anzeigen bzw. Verstecken der selektierten Bereiche mit
494 // dem sichtbaren Cursor
495 void ShowCrsrs( BOOL bCrsrVis
);
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.
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
573 // Gehe zur naechsten Selection
575 // gehe zur vorherigen Selection
579 ::sw::mark::IMark
* SetBookmark(
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
);
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 ); }
631 // --> FME 2004-07-30 #i32329# Enhanced table selection
635 // zum naechsten/vorhergehenden Punkt auf gleicher Ebene
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.
662 if the block cursor is of interest or not
664 @return pTblCrsr if exist,
665 pBlockCrsr if exist and of interest (param bBlock)
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
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
716 BOOL
SelectNxtPrvHyperlink( BOOL bNext
= TRUE
);
718 // springe zu dieser Refmark
719 BOOL
GotoRefMark( const String
& rRefMark
, USHORT nSubType
= 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)
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.
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
; }
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
);
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;
808 // get smart tags at point position
809 void GetSmartTagTerm( const Point
& rPt
,
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
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
;
874 Returns textual description of the current selection.
876 - If the current selection is a multi-selection the result is
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();
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
942 inline SwPaM
* SwCrsrShell::GetTblCrs()
947 inline void SwCrsrShell::UnSetVisCrsr()
950 pVisCrsr
->SetDragCrsr( FALSE
);
953 #endif // _CRSRSH_HXX