diff options
Diffstat (limited to 'sw/inc/swcrsr.hxx')
-rw-r--r-- | sw/inc/swcrsr.hxx | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/sw/inc/swcrsr.hxx b/sw/inc/swcrsr.hxx new file mode 100644 index 000000000000..daa33e4f232a --- /dev/null +++ b/sw/inc/swcrsr.hxx @@ -0,0 +1,312 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _SWCRSR_HXX +#define _SWCRSR_HXX + +#include <com/sun/star/i18n/WordType.hpp> + +#include <pam.hxx> +#include <tblsel.hxx> +#include <cshtyp.hxx> + + +struct _SwCursor_SavePos; + +namespace com { namespace sun { namespace star { namespace util { + struct SearchOptions; +} } } } + + +// ein Basis-Struktur fuer die Parameter der Find-Methoden +// return - Werte vom Found-Aufruf. +const int FIND_NOT_FOUND = 0; +const int FIND_FOUND = 1; +const int FIND_NO_RING = 2; + +struct SwFindParas +{ + virtual int Find( SwPaM*, SwMoveFn, const SwPaM*, sal_Bool ) = 0; + virtual int IsReplaceMode() const = 0; +}; + +typedef sal_uInt16 SwCursorSelOverFlags; +namespace nsSwCursorSelOverFlags +{ + const SwCursorSelOverFlags SELOVER_NONE = 0x00; + const SwCursorSelOverFlags SELOVER_CHECKNODESSECTION = 0x01; + const SwCursorSelOverFlags SELOVER_TOGGLE = 0x02; + const SwCursorSelOverFlags SELOVER_ENABLEREVDIREKTION = 0x04; + const SwCursorSelOverFlags SELOVER_CHANGEPOS = 0x08; +} + +class SwCursor : public SwPaM +{ + friend class SwCrsrSaveState; + + _SwCursor_SavePos* pSavePos; + long mnRowSpanOffset; // required for travelling in tabs with rowspans + sal_uInt8 nCursorBidiLevel; // bidi level of the cursor + bool mbColumnSelection; // true: cursor is aprt of a column selection + + sal_uLong FindAll( SwFindParas& , SwDocPositions, SwDocPositions, FindRanges, sal_Bool& bCancel ); + + using SwPaM::Find; + +protected: + virtual _SwCursor_SavePos* CreateNewSavePos() const; + void SaveState(); + void RestoreState(); + + const _SwCursor_SavePos* GetSavePos() const { return pSavePos; } + + virtual const SwCntntFrm* DoSetBidiLevelLeftRight( + sal_Bool & io_rbLeft, sal_Bool bVisualAllowed, sal_Bool bInsertCrsr); + virtual void DoSetBidiLevelUpDown(); + virtual bool IsSelOvrCheck(int eFlags); + +public: + // single argument ctors shall be explicit. + SwCursor( const SwPosition &rPos, SwPaM* pRing, bool bColumnSel ); + virtual ~SwCursor(); + + // @@@ semantic: no copy ctor. + SwCursor( SwCursor& rCpy); +private: + // forbidden and not implemented. + //SwCursor( const SwCursor& ); + // @@@ used e.g. in core/frmedt/fetab.cxx @@@ + // SwCursor & operator= ( const SwCursor& ); +public: + + virtual SwCursor* Create( SwPaM* pRing = 0 ) const; + + virtual short MaxReplaceArived(); //returns RET_YES/RET_CANCEL/RET_NO + virtual void SaveTblBoxCntnt( const SwPosition* pPos = 0 ); + + void FillFindPos( SwDocPositions ePos, SwPosition& rPos ) const; + SwMoveFnCollection* MakeFindRange( SwDocPositions, SwDocPositions, + SwPaM* ) const; + + + sal_uLong Find( const com::sun::star::util::SearchOptions& rSearchOpt, + sal_Bool bSearchInNotes, + SwDocPositions nStart, SwDocPositions nEnde, + sal_Bool& bCancel, + FindRanges = FND_IN_BODY, + int bReplace = sal_False ); + sal_uLong Find( const SwTxtFmtColl& rFmtColl, + SwDocPositions nStart, SwDocPositions nEnde, + sal_Bool& bCancel, + FindRanges = FND_IN_BODY, + const SwTxtFmtColl* pReplFmt = 0 ); + sal_uLong Find( const SfxItemSet& rSet, sal_Bool bNoCollections, + SwDocPositions nStart, SwDocPositions nEnde, + sal_Bool& bCancel, + FindRanges = FND_IN_BODY, + const com::sun::star::util::SearchOptions* pSearchOpt = 0, + const SfxItemSet* rReplSet = 0 ); + + // UI versions + sal_Bool IsStartWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const; + sal_Bool IsEndWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const; + sal_Bool IsInWord( sal_Int16 nWordType = com::sun::star::i18n::WordType::ANYWORD_IGNOREWHITESPACES ) const; + sal_Bool IsStartEndSentence( bool bEnd ) const; + sal_Bool GoStartWord(); + sal_Bool GoEndWord(); + sal_Bool GoNextWord(); + sal_Bool GoPrevWord(); + sal_Bool SelectWord( const Point* pPt = 0 ); + + // API versions of above functions (will be used with a different + // WordType for the break iterator) + sal_Bool IsStartWordWT( sal_Int16 nWordType ) const; + sal_Bool IsEndWordWT( sal_Int16 nWordType ) const; + sal_Bool IsInWordWT( sal_Int16 nWordType ) const; + sal_Bool GoStartWordWT( sal_Int16 nWordType ); + sal_Bool GoEndWordWT( sal_Int16 nWordType ); + sal_Bool GoNextWordWT( sal_Int16 nWordType ); + sal_Bool GoPrevWordWT( sal_Int16 nWordType ); + sal_Bool SelectWordWT( sal_Int16 nWordType, const Point* pPt = 0 ); + + enum SentenceMoveType + { + NEXT_SENT, + PREV_SENT, + START_SENT, + END_SENT + }; + sal_Bool GoSentence(SentenceMoveType eMoveType); + sal_Bool GoNextSentence(){return GoSentence(NEXT_SENT);} + sal_Bool GoEndSentence(){return GoSentence(END_SENT);} + sal_Bool GoPrevSentence(){return GoSentence(PREV_SENT);} + sal_Bool GoStartSentence(){return GoSentence(START_SENT);} + sal_Bool ExpandToSentenceBorders(); + + virtual sal_Bool LeftRight( sal_Bool bLeft, sal_uInt16 nCnt, sal_uInt16 nMode, + sal_Bool bAllowVisual, sal_Bool bSkipHidden, sal_Bool bInsertCrsr ); + sal_Bool UpDown( sal_Bool bUp, sal_uInt16 nCnt, Point* pPt, long nUpDownX ); + sal_Bool LeftRightMargin( sal_Bool bLeftMargin, sal_Bool bAPI = sal_False ); + sal_Bool IsAtLeftRightMargin( sal_Bool bLeftMargin, sal_Bool bAPI = sal_False ) const; + sal_Bool SttEndDoc( sal_Bool bSttDoc ); + sal_Bool GoPrevNextCell( sal_Bool bNext, sal_uInt16 nCnt ); + + sal_Bool Left( sal_uInt16 nCnt, sal_uInt16 nMode, sal_Bool bAllowVisual, sal_Bool bSkipHidden ) + { return LeftRight( sal_True, nCnt, nMode, bAllowVisual, bSkipHidden, sal_False ); } + sal_Bool Right( sal_uInt16 nCnt, sal_uInt16 nMode, sal_Bool bAllowVisual, sal_Bool bSkipHidden ) + { return LeftRight( sal_False, nCnt, nMode, bAllowVisual, bSkipHidden, sal_False ); } + sal_Bool GoNextCell( sal_uInt16 nCnt = 1 ) { return GoPrevNextCell( sal_True, nCnt ); } + sal_Bool GoPrevCell( sal_uInt16 nCnt = 1 ) { return GoPrevNextCell( sal_False, nCnt ); } + virtual sal_Bool GotoTable( const String& rName ); + sal_Bool GotoTblBox( const String& rName ); + sal_Bool GotoRegion( const String& rName ); + sal_Bool GotoFtnAnchor(); + sal_Bool GotoFtnTxt(); + sal_Bool GotoNextFtnAnchor(); + sal_Bool GotoPrevFtnAnchor(); + sal_Bool GotoNextFtnCntnt(); + sal_Bool GotoPrevFtnCntnt(); + + sal_Bool MovePara( SwWhichPara, SwPosPara ); + sal_Bool MoveSection( SwWhichSection, SwPosSection ); + sal_Bool MoveTable( SwWhichTable, SwPosTable ); + sal_Bool MoveRegion( SwWhichRegion, SwPosRegion ); + + + // gibt es eine Selection vom Content in die Tabelle + // Return Wert gibt an, ob der Crsr auf der alten Position verbleibt + virtual sal_Bool IsSelOvr( int eFlags = + ( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION | + nsSwCursorSelOverFlags::SELOVER_TOGGLE | + nsSwCursorSelOverFlags::SELOVER_CHANGEPOS )); + virtual sal_Bool IsInProtectTable( sal_Bool bMove = sal_False, + sal_Bool bChgCrsr = sal_True ); + sal_Bool IsNoCntnt() const; + + void RestoreSavePos(); // Point auf die SavePos setzen + + // sal_True: an die Position kann der Cursor gesetzt werden + virtual sal_Bool IsAtValidPos( sal_Bool bPoint = sal_True ) const; + + // darf der Cursor in ReadOnlyBereiche? + virtual bool IsReadOnlyAvailable() const; + + virtual sal_Bool IsSkipOverProtectSections() const; + virtual sal_Bool IsSkipOverHiddenSections() const; + + sal_uInt8 GetCrsrBidiLevel() const { return nCursorBidiLevel; } + void SetCrsrBidiLevel( sal_uInt8 nNewLevel ) { nCursorBidiLevel = nNewLevel; } + + bool IsColumnSelection() const { return mbColumnSelection; } + void SetColumnSelection( bool bNew ) { mbColumnSelection = bNew; } + + long GetCrsrRowSpanOffset() const { return mnRowSpanOffset; } + void SetCrsrRowSpanOffset( long nNew ) { mnRowSpanOffset = nNew; } + + DECL_FIXEDMEMPOOL_NEWDEL( SwCursor ) +}; + + +class SwCrsrSaveState +{ + SwCursor& rCrsr; +public: + SwCrsrSaveState( SwCursor& rC ) : rCrsr( rC ) { rC.SaveState(); } + ~SwCrsrSaveState() { rCrsr.RestoreState(); } +}; + +struct _SwCursor_SavePos +{ + sal_uLong nNode; + xub_StrLen nCntnt; + _SwCursor_SavePos* pNext; + + _SwCursor_SavePos( const SwCursor& rCrsr ) + : nNode( rCrsr.GetPoint()->nNode.GetIndex() ), + nCntnt( rCrsr.GetPoint()->nContent.GetIndex() ), + pNext( 0 ) + {} + virtual ~_SwCursor_SavePos() {} + + DECL_FIXEDMEMPOOL_NEWDEL( _SwCursor_SavePos ) +}; + + + +class SwTableCursor : public virtual SwCursor +{ + +protected: + sal_uLong nTblPtNd, nTblMkNd; + xub_StrLen nTblPtCnt, nTblMkCnt; + SwSelBoxes aSelBoxes; + sal_Bool bChg : 1; + sal_Bool bParked : 1; // Tabellen-Cursor wurde geparkt + + virtual bool IsSelOvrCheck(int eFlags); + +public: + SwTableCursor( const SwPosition &rPos, SwPaM* pRing = 0 ); + SwTableCursor( SwTableCursor& ); + virtual ~SwTableCursor(); + + virtual sal_Bool LeftRight( sal_Bool bLeft, sal_uInt16 nCnt, sal_uInt16 nMode, + sal_Bool bAllowVisual, sal_Bool bSkipHidden, sal_Bool bInsertCrsr ); + virtual sal_Bool GotoTable( const String& rName ); + + void InsertBox( const SwTableBox& rTblBox ); + void DeleteBox( sal_uInt16 nPos ) { aSelBoxes.Remove( nPos ); bChg = sal_True; } + sal_uInt16 GetBoxesCount() const { return aSelBoxes.Count(); } + const SwSelBoxes& GetBoxes() const { return aSelBoxes; } + + // Baut fuer alle Boxen die Cursor auf + SwCursor* MakeBoxSels( SwCursor* pAktCrsr ); + // sind irgendwelche Boxen mit einem Schutz versehen? + sal_Bool HasReadOnlyBoxSel() const; + + // wurde der TabelleCursor veraendert ? Wenn ja speicher gleich + // die neuen Werte. + sal_Bool IsCrsrMovedUpdt(); + // wurde der TabelleCursor veraendert ? + sal_Bool IsCrsrMoved() const + { + return nTblMkNd != GetMark()->nNode.GetIndex() || + nTblPtNd != GetPoint()->nNode.GetIndex() || + nTblMkCnt != GetMark()->nContent.GetIndex() || + nTblPtCnt != GetPoint()->nContent.GetIndex(); + } + + sal_Bool IsChgd() const { return bChg; } + + // Parke den Tabellen-Cursor auf dem StartNode der Boxen. + void ParkCrsr(); + + bool NewTableSelection(); + void ActualizeSelection( const SwSelBoxes &rBoxes ); +}; + +#endif + |