xref: /AOO41X/main/sw/inc/swcrsr.hxx (revision 1d2dbeb0b7301723c6d13094e87a8714ef81a328)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _SWCRSR_HXX
24 #define _SWCRSR_HXX
25 
26 #include <com/sun/star/i18n/WordType.hpp>
27 
28 #include <pam.hxx>
29 #include <tblsel.hxx>
30 #include <cshtyp.hxx>
31 
32 
33 struct _SwCursor_SavePos;
34 
35 namespace com { namespace sun { namespace star { namespace util {
36     struct SearchOptions;
37 } } } }
38 
39 
40 // ein Basis-Struktur fuer die Parameter der Find-Methoden
41 // return - Werte vom Found-Aufruf.
42 const int FIND_NOT_FOUND    = 0;
43 const int FIND_FOUND        = 1;
44 const int FIND_NO_RING      = 2;
45 
46 struct SwFindParas
47 {
48     virtual int Find( SwPaM*, SwMoveFn, const SwPaM*, sal_Bool ) = 0;
49     virtual int IsReplaceMode() const = 0;
50 };
51 
52 typedef sal_uInt16 SwCursorSelOverFlags;
53 namespace nsSwCursorSelOverFlags
54 {
55     const SwCursorSelOverFlags SELOVER_NONE                = 0x00;
56     const SwCursorSelOverFlags SELOVER_CHECKNODESSECTION   = 0x01;
57     const SwCursorSelOverFlags SELOVER_TOGGLE              = 0x02;
58     const SwCursorSelOverFlags SELOVER_ENABLEREVDIREKTION  = 0x04;
59     const SwCursorSelOverFlags SELOVER_CHANGEPOS           = 0x08;
60 }
61 
62 class SwCursor : public SwPaM
63 {
64     friend class SwCrsrSaveState;
65 
66     _SwCursor_SavePos* pSavePos;
67     long mnRowSpanOffset;        // required for travelling in tabs with rowspans
68     sal_uInt8 nCursorBidiLevel;       // bidi level of the cursor
69     bool mbColumnSelection;      // true: cursor is aprt of a column selection
70 
71     sal_uLong FindAll( SwFindParas& , SwDocPositions, SwDocPositions, FindRanges, sal_Bool& bCancel );
72 
73     using SwPaM::Find;
74 
75 protected:
76     virtual _SwCursor_SavePos* CreateNewSavePos() const;
77     void SaveState();
78     void RestoreState();
79 
GetSavePos() const80     const _SwCursor_SavePos* GetSavePos() const { return pSavePos; }
81 
82     virtual const SwCntntFrm* DoSetBidiLevelLeftRight(
83         sal_Bool & io_rbLeft, sal_Bool bVisualAllowed, sal_Bool bInsertCrsr);
84     virtual void DoSetBidiLevelUpDown();
85     virtual bool IsSelOvrCheck(int eFlags);
86 
87 public:
88     // single argument ctors shall be explicit.
89     SwCursor( const SwPosition &rPos, SwPaM* pRing, bool bColumnSel );
90     virtual ~SwCursor();
91 
92     // @@@ semantic: no copy ctor.
93     SwCursor( SwCursor& rCpy);
94 
95 public:
96 
97     virtual SwCursor* Create( SwPaM* pRing = 0 ) const;
98 
99     virtual short MaxReplaceArived(); //returns RET_YES/RET_CANCEL/RET_NO
100     virtual void SaveTblBoxCntnt( const SwPosition* pPos = 0 );
101 
102     void FillFindPos( SwDocPositions ePos, SwPosition& rPos ) const;
103     SwMoveFnCollection* MakeFindRange( SwDocPositions, SwDocPositions,
104                                         SwPaM* ) const;
105 
106 
107     sal_uLong Find( const com::sun::star::util::SearchOptions& rSearchOpt,
108                 sal_Bool bSearchInNotes,
109                 SwDocPositions nStart, SwDocPositions nEnde,
110                 sal_Bool& bCancel,
111                 FindRanges = FND_IN_BODY,
112                 int bReplace = sal_False );
113     sal_uLong Find( const SwTxtFmtColl& rFmtColl,
114                 SwDocPositions nStart, SwDocPositions nEnde,
115                 sal_Bool& bCancel,
116                 FindRanges = FND_IN_BODY,
117                 const SwTxtFmtColl* pReplFmt = 0 );
118     sal_uLong Find( const SfxItemSet& rSet, sal_Bool bNoCollections,
119                 SwDocPositions nStart, SwDocPositions nEnde,
120                 sal_Bool& bCancel,
121                 FindRanges = FND_IN_BODY,
122                 const com::sun::star::util::SearchOptions* pSearchOpt = 0,
123                 const SfxItemSet* rReplSet = 0 );
124 
125     // UI versions
126     sal_Bool IsStartWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const;
127     sal_Bool IsEndWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const;
128     sal_Bool IsInWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const;
129     sal_Bool IsStartEndSentence( bool bEnd ) const;
130     sal_Bool GoStartWord();
131     sal_Bool GoEndWord();
132     sal_Bool GoNextWord();
133     sal_Bool GoPrevWord();
134     sal_Bool SelectWord( ViewShell* pViewShell, const Point* pPt = 0 );
135 
136     // API versions of above functions (will be used with a different
137     // WordType for the break iterator)
138     sal_Bool IsStartWordWT( sal_Int16 nWordType ) const;
139     sal_Bool IsEndWordWT( sal_Int16 nWordType ) const;
140     sal_Bool IsInWordWT( sal_Int16 nWordType ) const;
141     sal_Bool GoStartWordWT( sal_Int16 nWordType );
142     sal_Bool GoEndWordWT( sal_Int16 nWordType );
143     sal_Bool GoNextWordWT( sal_Int16 nWordType );
144     sal_Bool GoPrevWordWT( sal_Int16 nWordType );
145     sal_Bool SelectWordWT( ViewShell* pViewShell, sal_Int16 nWordType, const Point* pPt = 0 );
146 
147     enum SentenceMoveType
148     {
149         NEXT_SENT,
150         PREV_SENT,
151         START_SENT,
152         END_SENT
153     };
154     sal_Bool GoSentence(SentenceMoveType eMoveType);
GoNextSentence()155     sal_Bool GoNextSentence(){return GoSentence(NEXT_SENT);}
GoEndSentence()156     sal_Bool GoEndSentence(){return GoSentence(END_SENT);}
GoPrevSentence()157     sal_Bool GoPrevSentence(){return GoSentence(PREV_SENT);}
GoStartSentence()158     sal_Bool GoStartSentence(){return GoSentence(START_SENT);}
159     sal_Bool ExpandToSentenceBorders();
160 
161     virtual sal_Bool LeftRight( sal_Bool bLeft, sal_uInt16 nCnt, sal_uInt16 nMode,
162         sal_Bool bAllowVisual, sal_Bool bSkipHidden, sal_Bool bInsertCrsr );
163     sal_Bool UpDown( sal_Bool bUp, sal_uInt16 nCnt, Point* pPt, long nUpDownX );
164     sal_Bool LeftRightMargin( sal_Bool bLeftMargin, sal_Bool bAPI = sal_False );
165     sal_Bool IsAtLeftRightMargin( sal_Bool bLeftMargin, sal_Bool bAPI = sal_False ) const;
166     sal_Bool SttEndDoc( sal_Bool bSttDoc );
167     sal_Bool GoPrevNextCell( sal_Bool bNext, sal_uInt16 nCnt );
168 
Left(sal_uInt16 nCnt,sal_uInt16 nMode,sal_Bool bAllowVisual,sal_Bool bSkipHidden)169     sal_Bool Left( sal_uInt16 nCnt, sal_uInt16 nMode, sal_Bool bAllowVisual, sal_Bool bSkipHidden )
170                                     { return LeftRight( sal_True, nCnt, nMode, bAllowVisual, bSkipHidden, sal_False ); }
Right(sal_uInt16 nCnt,sal_uInt16 nMode,sal_Bool bAllowVisual,sal_Bool bSkipHidden)171     sal_Bool Right( sal_uInt16 nCnt, sal_uInt16 nMode, sal_Bool bAllowVisual, sal_Bool bSkipHidden )
172                                     { return LeftRight( sal_False, nCnt, nMode, bAllowVisual, bSkipHidden, sal_False ); }
GoNextCell(sal_uInt16 nCnt=1)173     sal_Bool GoNextCell( sal_uInt16 nCnt = 1 )  { return GoPrevNextCell( sal_True, nCnt ); }
GoPrevCell(sal_uInt16 nCnt=1)174     sal_Bool GoPrevCell( sal_uInt16 nCnt = 1 )  { return GoPrevNextCell( sal_False, nCnt ); }
175     virtual sal_Bool GotoTable( const String& rName );
176     sal_Bool GotoTblBox( const String& rName );
177     sal_Bool GotoRegion( const String& rName );
178     sal_Bool GotoFtnAnchor();
179     sal_Bool GotoFtnTxt();
180     sal_Bool GotoNextFtnAnchor();
181     sal_Bool GotoPrevFtnAnchor();
182     sal_Bool GotoNextFtnCntnt();
183     sal_Bool GotoPrevFtnCntnt();
184 
185     sal_Bool MovePara( SwWhichPara, SwPosPara );
186     sal_Bool MoveSection( SwWhichSection, SwPosSection );
187     sal_Bool MoveTable( SwWhichTable, SwPosTable );
188     sal_Bool MoveRegion( SwWhichRegion, SwPosRegion );
189 
190 
191     // gibt es eine Selection vom Content in die Tabelle
192     // Return Wert gibt an, ob der Crsr auf der alten Position verbleibt
193     virtual sal_Bool IsSelOvr( int eFlags =
194                                 ( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION |
195                                   nsSwCursorSelOverFlags::SELOVER_TOGGLE |
196                                   nsSwCursorSelOverFlags::SELOVER_CHANGEPOS ));
197     virtual sal_Bool IsInProtectTable( sal_Bool bMove = sal_False,
198                                         sal_Bool bChgCrsr = sal_True );
199     sal_Bool IsNoCntnt() const;
200 
201     void RestoreSavePos();      // Point auf die SavePos setzen
202 
203     // sal_True: an die Position kann der Cursor gesetzt werden
204     virtual sal_Bool IsAtValidPos( sal_Bool bPoint = sal_True ) const;
205 
206     // darf der Cursor in ReadOnlyBereiche?
207     virtual bool IsReadOnlyAvailable() const;
208 
209     virtual sal_Bool IsSkipOverProtectSections() const;
210     virtual sal_Bool IsSkipOverHiddenSections() const;
211 
GetCrsrBidiLevel() const212     sal_uInt8 GetCrsrBidiLevel() const { return nCursorBidiLevel; }
SetCrsrBidiLevel(sal_uInt8 nNewLevel)213     void SetCrsrBidiLevel( sal_uInt8 nNewLevel ) { nCursorBidiLevel = nNewLevel; }
214 
IsColumnSelection() const215     bool IsColumnSelection() const { return mbColumnSelection; }
SetColumnSelection(bool bNew)216     void SetColumnSelection( bool bNew ) { mbColumnSelection = bNew; }
217 
GetCrsrRowSpanOffset() const218     long GetCrsrRowSpanOffset() const { return mnRowSpanOffset; }
SetCrsrRowSpanOffset(long nNew)219     void SetCrsrRowSpanOffset( long nNew ) { mnRowSpanOffset = nNew; }
220 
221     DECL_FIXEDMEMPOOL_NEWDEL( SwCursor )
222 };
223 
224 
225 class SwCrsrSaveState
226 {
227     SwCursor& rCrsr;
228 public:
SwCrsrSaveState(SwCursor & rC)229     SwCrsrSaveState( SwCursor& rC ) : rCrsr( rC ) { rC.SaveState(); }
~SwCrsrSaveState()230     ~SwCrsrSaveState() { rCrsr.RestoreState(); }
231 };
232 
233 struct _SwCursor_SavePos
234 {
235     sal_uLong nNode;
236     xub_StrLen nCntnt;
237     _SwCursor_SavePos* pNext;
238 
_SwCursor_SavePos_SwCursor_SavePos239     _SwCursor_SavePos( const SwCursor& rCrsr )
240         : nNode( rCrsr.GetPoint()->nNode.GetIndex() ),
241         nCntnt( rCrsr.GetPoint()->nContent.GetIndex() ),
242         pNext( 0 )
243     {}
~_SwCursor_SavePos_SwCursor_SavePos244     virtual ~_SwCursor_SavePos() {}
245 
246     DECL_FIXEDMEMPOOL_NEWDEL( _SwCursor_SavePos )
247 };
248 
249 
250 
251 class SwTableCursor : public virtual SwCursor
252 {
253 
254 protected:
255     sal_uLong nTblPtNd, nTblMkNd;
256     xub_StrLen nTblPtCnt, nTblMkCnt;
257     SwSelBoxes aSelBoxes;
258     sal_Bool bChg : 1;
259     sal_Bool bParked : 1;       // Tabellen-Cursor wurde geparkt
260 
261     virtual bool IsSelOvrCheck(int eFlags);
262 
263 public:
264     SwTableCursor( const SwPosition &rPos, SwPaM* pRing = 0 );
265     SwTableCursor( SwTableCursor& );
266     virtual ~SwTableCursor();
267 
268     virtual sal_Bool LeftRight( sal_Bool bLeft, sal_uInt16 nCnt, sal_uInt16 nMode,
269         sal_Bool bAllowVisual, sal_Bool bSkipHidden, sal_Bool bInsertCrsr );
270     virtual sal_Bool GotoTable( const String& rName );
271 
272     void InsertBox( const SwTableBox& rTblBox );
DeleteBox(sal_uInt16 nPos)273     void DeleteBox( sal_uInt16 nPos ) { aSelBoxes.Remove( nPos ); bChg = sal_True; }
GetBoxesCount() const274     sal_uInt16 GetBoxesCount() const { return aSelBoxes.Count(); }
GetBoxes() const275     const SwSelBoxes& GetBoxes() const { return aSelBoxes; }
276 
277         // Baut fuer alle Boxen die Cursor auf
278     SwCursor* MakeBoxSels( SwCursor* pAktCrsr );
279         // sind irgendwelche Boxen mit einem Schutz versehen?
280     sal_Bool HasReadOnlyBoxSel() const;
281 
282         // wurde der TabelleCursor veraendert ? Wenn ja speicher gleich
283         // die neuen Werte.
284     sal_Bool IsCrsrMovedUpdt();
285         // wurde der TabelleCursor veraendert ?
IsCrsrMoved() const286     sal_Bool IsCrsrMoved() const
287     {
288         return  nTblMkNd != GetMark()->nNode.GetIndex() ||
289                 nTblPtNd != GetPoint()->nNode.GetIndex() ||
290                 nTblMkCnt != GetMark()->nContent.GetIndex() ||
291                 nTblPtCnt != GetPoint()->nContent.GetIndex();
292     }
293 
IsChgd() const294     sal_Bool IsChgd() const { return bChg; }
295 
296     // Parke den Tabellen-Cursor auf dem StartNode der Boxen.
297     void ParkCrsr();
298 
299     bool NewTableSelection();
300     void ActualizeSelection( const SwSelBoxes &rBoxes );
301 };
302 
303 #endif
304 
305