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