xref: /aoo4110/main/sw/inc/pam.hxx (revision b1cdbd2c)
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