1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski #ifndef _PAM_HXX 24*b1cdbd2cSJim Jagielski #define _PAM_HXX 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include <stddef.h> // fuer MemPool 27*b1cdbd2cSJim Jagielski #include <tools/gen.hxx> 28*b1cdbd2cSJim Jagielski #include <tools/mempool.hxx> 29*b1cdbd2cSJim Jagielski #include <cshtyp.hxx> // fuer die Funktions-Definitionen 30*b1cdbd2cSJim Jagielski #include <ring.hxx> // Superklasse 31*b1cdbd2cSJim Jagielski #include <index.hxx> // fuer SwIndex 32*b1cdbd2cSJim Jagielski #include <ndindex.hxx> // fuer SwNodeIndex 33*b1cdbd2cSJim Jagielski #include "swdllapi.h" 34*b1cdbd2cSJim Jagielski 35*b1cdbd2cSJim Jagielski class SwFmt; 36*b1cdbd2cSJim Jagielski class SfxPoolItem; 37*b1cdbd2cSJim Jagielski class SfxItemSet; 38*b1cdbd2cSJim Jagielski class SwDoc; 39*b1cdbd2cSJim Jagielski class SwNode; 40*b1cdbd2cSJim Jagielski class SwCntntNode; 41*b1cdbd2cSJim Jagielski class SwPaM; 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski namespace com { namespace sun { namespace star { namespace util { 44*b1cdbd2cSJim Jagielski struct SearchOptions; 45*b1cdbd2cSJim Jagielski } } } } 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski namespace utl { 48*b1cdbd2cSJim Jagielski class TextSearch; 49*b1cdbd2cSJim Jagielski } 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski struct SW_DLLPUBLIC SwPosition 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski SwNodeIndex nNode; 54*b1cdbd2cSJim Jagielski SwIndex nContent; 55*b1cdbd2cSJim Jagielski 56*b1cdbd2cSJim Jagielski SwPosition( const SwNodeIndex &rNode, const SwIndex &rCntnt ); 57*b1cdbd2cSJim Jagielski explicit SwPosition( const SwNodeIndex &rNode ); 58*b1cdbd2cSJim Jagielski explicit SwPosition( const SwNode& rNode ); 59*b1cdbd2cSJim Jagielski explicit SwPosition( SwCntntNode& rNode, const xub_StrLen nOffset = 0 ); 60*b1cdbd2cSJim Jagielski 61*b1cdbd2cSJim Jagielski SwPosition( const SwPosition & ); 62*b1cdbd2cSJim Jagielski SwPosition &operator=(const SwPosition &); 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski // #111827# 65*b1cdbd2cSJim Jagielski /** 66*b1cdbd2cSJim Jagielski Returns the document this position is in. 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski @return the document this position is in. 69*b1cdbd2cSJim Jagielski */ 70*b1cdbd2cSJim Jagielski SwDoc * GetDoc() const; 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski sal_Bool operator < (const SwPosition &) const; 73*b1cdbd2cSJim Jagielski sal_Bool operator > (const SwPosition &) const; 74*b1cdbd2cSJim Jagielski sal_Bool operator <=(const SwPosition &) const; 75*b1cdbd2cSJim Jagielski sal_Bool operator >=(const SwPosition &) const; 76*b1cdbd2cSJim Jagielski sal_Bool operator ==(const SwPosition &) const; 77*b1cdbd2cSJim Jagielski sal_Bool operator !=(const SwPosition &) const; 78*b1cdbd2cSJim Jagielski }; 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski // das Ergebnis eines Positions Vergleiches 82*b1cdbd2cSJim Jagielski enum SwComparePosition { 83*b1cdbd2cSJim Jagielski POS_BEFORE, // Pos1 liegt vor Pos2 84*b1cdbd2cSJim Jagielski POS_BEHIND, // Pos1 liegt hinter Pos2 85*b1cdbd2cSJim Jagielski POS_INSIDE, // Pos1 liegt vollstaendig in Pos2 86*b1cdbd2cSJim Jagielski POS_OUTSIDE, // Pos2 liegt vollstaendig in Pos1 87*b1cdbd2cSJim Jagielski POS_EQUAL, // Pos1 ist genauso gross wie Pos2 88*b1cdbd2cSJim Jagielski POS_OVERLAP_BEFORE, // Pos1 ueberlappt Pos2 am Anfang 89*b1cdbd2cSJim Jagielski POS_OVERLAP_BEHIND, // Pos1 ueberlappt Pos2 am Ende 90*b1cdbd2cSJim Jagielski POS_COLLIDE_START, // Pos1 Start stoesst an Pos2 Ende 91*b1cdbd2cSJim Jagielski POS_COLLIDE_END // Pos1 End stoesst an Pos2 Start 92*b1cdbd2cSJim Jagielski }; 93*b1cdbd2cSJim Jagielski SwComparePosition ComparePosition( 94*b1cdbd2cSJim Jagielski const SwPosition& rStt1, const SwPosition& rEnd1, 95*b1cdbd2cSJim Jagielski const SwPosition& rStt2, const SwPosition& rEnd2 ); 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski SwComparePosition ComparePosition( 98*b1cdbd2cSJim Jagielski const unsigned long nStt1, const unsigned long nEnd1, 99*b1cdbd2cSJim Jagielski const unsigned long nStt2, const unsigned long nEnd2 ); 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski // SwPointAndMark / SwPaM 103*b1cdbd2cSJim Jagielski struct SwMoveFnCollection; 104*b1cdbd2cSJim Jagielski typedef SwMoveFnCollection* SwMoveFn; 105*b1cdbd2cSJim Jagielski SW_DLLPUBLIC extern SwMoveFn fnMoveForward; // SwPam::Move()/Find() default argument. 106*b1cdbd2cSJim Jagielski SW_DLLPUBLIC extern SwMoveFn fnMoveBackward; 107*b1cdbd2cSJim Jagielski 108*b1cdbd2cSJim Jagielski typedef sal_Bool (*SwGoInDoc)( SwPaM& rPam, SwMoveFn fnMove ); 109*b1cdbd2cSJim Jagielski SW_DLLPUBLIC extern SwGoInDoc fnGoDoc; 110*b1cdbd2cSJim Jagielski extern SwGoInDoc fnGoSection; 111*b1cdbd2cSJim Jagielski SW_DLLPUBLIC extern SwGoInDoc fnGoNode; 112*b1cdbd2cSJim Jagielski SW_DLLPUBLIC extern SwGoInDoc fnGoCntnt; // SwPam::Move() default argument. 113*b1cdbd2cSJim Jagielski extern SwGoInDoc fnGoCntntCells; 114*b1cdbd2cSJim Jagielski extern SwGoInDoc fnGoCntntSkipHidden; 115*b1cdbd2cSJim Jagielski extern SwGoInDoc fnGoCntntCellsSkipHidden; 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski void _InitPam(); 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski class SW_DLLPUBLIC SwPaM : public Ring 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski SwPosition m_Bound1; 122*b1cdbd2cSJim Jagielski SwPosition m_Bound2; 123*b1cdbd2cSJim Jagielski SwPosition * m_pPoint; // points at either m_Bound1 or m_Bound2 124*b1cdbd2cSJim Jagielski SwPosition * m_pMark; // points at either m_Bound1 or m_Bound2 125*b1cdbd2cSJim Jagielski bool m_bIsInFrontOfLabel; 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski SwPaM* MakeRegion( SwMoveFn fnMove, const SwPaM * pOrigRg = 0 ); 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski public: 130*b1cdbd2cSJim Jagielski SwPaM( const SwPosition& rPos, SwPaM* pRing = 0 ); 131*b1cdbd2cSJim Jagielski SwPaM( const SwPosition& rMk, const SwPosition& rPt, SwPaM* pRing = 0 ); 132*b1cdbd2cSJim Jagielski SwPaM( const SwNodeIndex& rMk, const SwNodeIndex& rPt, 133*b1cdbd2cSJim Jagielski long nMkOffset = 0, long nPtOffset = 0, SwPaM* pRing = 0 ); 134*b1cdbd2cSJim Jagielski SwPaM( const SwNode& rMk, const SwNode& rPt, 135*b1cdbd2cSJim Jagielski long nMkOffset = 0, long nPtOffset = 0, SwPaM* pRing = 0 ); 136*b1cdbd2cSJim Jagielski SwPaM( const SwNodeIndex& rMk, xub_StrLen nMkCntnt, 137*b1cdbd2cSJim Jagielski const SwNodeIndex& rPt, xub_StrLen nPtCntnt, SwPaM* pRing = 0 ); 138*b1cdbd2cSJim Jagielski SwPaM( const SwNode& rMk, xub_StrLen nMkCntnt, 139*b1cdbd2cSJim Jagielski const SwNode& rPt, xub_StrLen nPtCntnt, SwPaM* pRing = 0 ); 140*b1cdbd2cSJim Jagielski SwPaM( const SwNode& rNd, xub_StrLen nCntnt = 0, SwPaM* pRing = 0 ); 141*b1cdbd2cSJim Jagielski SwPaM( const SwNodeIndex& rNd, xub_StrLen nCntnt = 0, SwPaM* pRing = 0 ); 142*b1cdbd2cSJim Jagielski virtual ~SwPaM(); 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski // @@@ semantic: no copy ctor. 145*b1cdbd2cSJim Jagielski SwPaM( SwPaM & ); 146*b1cdbd2cSJim Jagielski // @@@ semantic: no copy assignment for super class Ring. 147*b1cdbd2cSJim Jagielski SwPaM& operator=( const SwPaM & ); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski // Bewegen des Cursors 150*b1cdbd2cSJim Jagielski sal_Bool Move( SwMoveFn fnMove = fnMoveForward, 151*b1cdbd2cSJim Jagielski SwGoInDoc fnGo = fnGoCntnt ); 152*b1cdbd2cSJim Jagielski 153*b1cdbd2cSJim Jagielski // Suchen 154*b1cdbd2cSJim Jagielski sal_uInt8 Find( const com::sun::star::util::SearchOptions& rSearchOpt, 155*b1cdbd2cSJim Jagielski sal_Bool bSearchInNotes, 156*b1cdbd2cSJim Jagielski utl::TextSearch& rSTxt, 157*b1cdbd2cSJim Jagielski SwMoveFn fnMove = fnMoveForward, 158*b1cdbd2cSJim Jagielski const SwPaM *pPam =0, sal_Bool bInReadOnly = sal_False); 159*b1cdbd2cSJim Jagielski sal_Bool Find( const SwFmt& rFmt, 160*b1cdbd2cSJim Jagielski SwMoveFn fnMove = fnMoveForward, 161*b1cdbd2cSJim Jagielski const SwPaM *pPam =0, sal_Bool bInReadOnly = sal_False); 162*b1cdbd2cSJim Jagielski sal_Bool Find( const SfxPoolItem& rAttr, sal_Bool bValue = sal_True, 163*b1cdbd2cSJim Jagielski SwMoveFn fnMove = fnMoveForward, 164*b1cdbd2cSJim Jagielski const SwPaM *pPam =0, sal_Bool bInReadOnly = sal_False ); 165*b1cdbd2cSJim Jagielski sal_Bool Find( const SfxItemSet& rAttr, sal_Bool bNoColls, 166*b1cdbd2cSJim Jagielski SwMoveFn fnMove, 167*b1cdbd2cSJim Jagielski const SwPaM *pPam, sal_Bool bInReadOnly, sal_Bool bMoveFirst ); 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski bool DoSearch( const com::sun::star::util::SearchOptions& rSearchOpt, utl::TextSearch& rSTxt, 170*b1cdbd2cSJim Jagielski SwMoveFn fnMove, sal_Bool bSrchForward, sal_Bool bRegSearch, sal_Bool bChkEmptyPara, sal_Bool bChkParaEnd, 171*b1cdbd2cSJim Jagielski xub_StrLen &nStart, xub_StrLen &nEnde,xub_StrLen nTxtLen,SwNode* pNode, SwPaM* pPam); 172*b1cdbd2cSJim Jagielski IsInFrontOfLabel() const173*b1cdbd2cSJim Jagielski inline bool IsInFrontOfLabel() const { return m_bIsInFrontOfLabel; } _SetInFrontOfLabel(bool bNew)174*b1cdbd2cSJim Jagielski inline void _SetInFrontOfLabel( bool bNew ) { m_bIsInFrontOfLabel = bNew; } 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski virtual void SetMark(); 177*b1cdbd2cSJim Jagielski DeleteMark()178*b1cdbd2cSJim Jagielski void DeleteMark() 179*b1cdbd2cSJim Jagielski { 180*b1cdbd2cSJim Jagielski if (m_pMark != m_pPoint) 181*b1cdbd2cSJim Jagielski { 182*b1cdbd2cSJim Jagielski // clear the mark position; this helps if mark's SwIndex is 183*b1cdbd2cSJim Jagielski // registered at some node, and that node is then deleted 184*b1cdbd2cSJim Jagielski *m_pMark = SwPosition( SwNodeIndex( GetNode()->GetNodes() ) ); 185*b1cdbd2cSJim Jagielski m_pMark = m_pPoint; 186*b1cdbd2cSJim Jagielski } 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski #ifndef DBG_UTIL 189*b1cdbd2cSJim Jagielski Exchange()190*b1cdbd2cSJim Jagielski void Exchange() 191*b1cdbd2cSJim Jagielski { 192*b1cdbd2cSJim Jagielski if (m_pPoint != m_pMark) 193*b1cdbd2cSJim Jagielski { 194*b1cdbd2cSJim Jagielski SwPosition *pTmp = m_pPoint; 195*b1cdbd2cSJim Jagielski m_pPoint = m_pMark; 196*b1cdbd2cSJim Jagielski m_pMark = pTmp; 197*b1cdbd2cSJim Jagielski } 198*b1cdbd2cSJim Jagielski } 199*b1cdbd2cSJim Jagielski #else 200*b1cdbd2cSJim Jagielski void Exchange(); 201*b1cdbd2cSJim Jagielski #endif 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski /** A PaM marks a selection if Point and Mark are distinct positions. 204*b1cdbd2cSJim Jagielski @return true iff the PaM spans a selection 205*b1cdbd2cSJim Jagielski */ HasMark() const206*b1cdbd2cSJim Jagielski bool HasMark() const { return m_pPoint == m_pMark ? false : true; } 207*b1cdbd2cSJim Jagielski GetPoint() const208*b1cdbd2cSJim Jagielski const SwPosition *GetPoint() const { return m_pPoint; } GetPoint()209*b1cdbd2cSJim Jagielski SwPosition *GetPoint() { return m_pPoint; } GetMark() const210*b1cdbd2cSJim Jagielski const SwPosition *GetMark() const { return m_pMark; } GetMark()211*b1cdbd2cSJim Jagielski SwPosition *GetMark() { return m_pMark; } 212*b1cdbd2cSJim Jagielski Start() const213*b1cdbd2cSJim Jagielski const SwPosition *Start() const 214*b1cdbd2cSJim Jagielski { return (*m_pPoint) <= (*m_pMark) ? m_pPoint : m_pMark; } Start()215*b1cdbd2cSJim Jagielski SwPosition *Start() 216*b1cdbd2cSJim Jagielski { return (*m_pPoint) <= (*m_pMark) ? m_pPoint : m_pMark; } 217*b1cdbd2cSJim Jagielski End() const218*b1cdbd2cSJim Jagielski const SwPosition *End() const 219*b1cdbd2cSJim Jagielski { return (*m_pPoint) > (*m_pMark) ? m_pPoint : m_pMark; } End()220*b1cdbd2cSJim Jagielski SwPosition *End() 221*b1cdbd2cSJim Jagielski { return (*m_pPoint) > (*m_pMark) ? m_pPoint : m_pMark; } 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski /// @return current Node at Point/Mark GetNode(bool bPoint=true) const224*b1cdbd2cSJim Jagielski SwNode * GetNode ( bool bPoint = true ) const 225*b1cdbd2cSJim Jagielski { 226*b1cdbd2cSJim Jagielski return &( bPoint ? m_pPoint->nNode : m_pMark->nNode ).GetNode(); 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski /// @return current ContentNode at Point/Mark GetCntntNode(bool bPoint=true) const230*b1cdbd2cSJim Jagielski SwCntntNode* GetCntntNode( bool bPoint = true ) const 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski return GetNode(bPoint)->GetCntntNode(); 233*b1cdbd2cSJim Jagielski } 234*b1cdbd2cSJim Jagielski 235*b1cdbd2cSJim Jagielski /** 236*b1cdbd2cSJim Jagielski Normalizes PaM, i.e. sort point and mark. 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski @param bPointFirst sal_True: If the point is behind the mark then swap. 239*b1cdbd2cSJim Jagielski sal_False: If the mark is behind the point then swap. 240*b1cdbd2cSJim Jagielski */ 241*b1cdbd2cSJim Jagielski SwPaM & Normalize(sal_Bool bPointFirst = sal_True); 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski /// @return the document (SwDoc) at which the PaM is registered GetDoc() const244*b1cdbd2cSJim Jagielski SwDoc* GetDoc() const { return m_pPoint->nNode.GetNode().GetDoc(); } 245*b1cdbd2cSJim Jagielski GetBound(bool bOne=true)246*b1cdbd2cSJim Jagielski SwPosition& GetBound( bool bOne = true ) 247*b1cdbd2cSJim Jagielski { return bOne ? m_Bound1 : m_Bound2; } GetBound(bool bOne=true) const248*b1cdbd2cSJim Jagielski const SwPosition& GetBound( bool bOne = true ) const 249*b1cdbd2cSJim Jagielski { return bOne ? m_Bound1 : m_Bound2; } 250*b1cdbd2cSJim Jagielski 251*b1cdbd2cSJim Jagielski // erfrage die Seitennummer auf der der Cursor steht 252*b1cdbd2cSJim Jagielski sal_uInt16 GetPageNum( sal_Bool bAtPoint = sal_True, const Point* pLayPos = 0 ); 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski // steht in etwas geschuetztem oder in die Selektion umspannt 255*b1cdbd2cSJim Jagielski // etwas geschuetztes. 256*b1cdbd2cSJim Jagielski sal_Bool HasReadonlySel( const bool bFormView ) const; 257*b1cdbd2cSJim Jagielski ContainsPosition(const SwPosition & rPos)258*b1cdbd2cSJim Jagielski sal_Bool ContainsPosition(const SwPosition & rPos) 259*b1cdbd2cSJim Jagielski { return *Start() <= rPos && rPos <= *End(); } 260*b1cdbd2cSJim Jagielski 261*b1cdbd2cSJim Jagielski static sal_Bool Overlap(const SwPaM & a, const SwPaM & b); 262*b1cdbd2cSJim Jagielski 263*b1cdbd2cSJim Jagielski static sal_Bool LessThan(const SwPaM & a, const SwPaM & b); 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski DECL_FIXEDMEMPOOL_NEWDEL(SwPaM); 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski String GetTxt() const; 268*b1cdbd2cSJim Jagielski void InvalidatePaM(); 269*b1cdbd2cSJim Jagielski }; 270*b1cdbd2cSJim Jagielski 271*b1cdbd2cSJim Jagielski 272*b1cdbd2cSJim Jagielski sal_Bool CheckNodesRange( const SwNodeIndex&, const SwNodeIndex&, sal_Bool ); 273*b1cdbd2cSJim Jagielski sal_Bool GoInCntnt( SwPaM & rPam, SwMoveFn fnMove ); 274*b1cdbd2cSJim Jagielski 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski #endif // _PAM_HXX 277