summaryrefslogtreecommitdiff
path: root/binfilter/bf_sw/source/core/crsr/sw_swcrsr.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'binfilter/bf_sw/source/core/crsr/sw_swcrsr.cxx')
-rw-r--r--binfilter/bf_sw/source/core/crsr/sw_swcrsr.cxx471
1 files changed, 471 insertions, 0 deletions
diff --git a/binfilter/bf_sw/source/core/crsr/sw_swcrsr.cxx b/binfilter/bf_sw/source/core/crsr/sw_swcrsr.cxx
new file mode 100644
index 000000000000..5fd3581e5974
--- /dev/null
+++ b/binfilter/bf_sw/source/core/crsr/sw_swcrsr.cxx
@@ -0,0 +1,471 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma hdrstop
+#endif
+
+#include <hintids.hxx>
+
+
+#include <com/sun/star/i18n/WordType.hdl>
+#include <com/sun/star/i18n/CharType.hdl>
+
+
+
+#include <errhdl.hxx>
+
+#include <unocrsr.hxx>
+
+#include <horiornt.hxx>
+
+#include <doc.hxx>
+#include <section.hxx>
+#include <docsh.hxx>
+#include <crsskip.hxx>
+#include <mdiexp.hxx> // ...Percent()
+#include <statstr.hrc> // ResId fuer Statusleiste
+namespace binfilter {
+
+using namespace ::com::sun::star::i18n;
+
+static const USHORT coSrchRplcThreshold = 60000;
+
+struct _PercentHdl
+{
+ SwDocShell* pDSh;
+ ULONG nActPos;
+ BOOL bBack, bNodeIdx;
+
+ _PercentHdl( ULONG nStt, ULONG nEnd, SwDocShell* pSh )
+ : pDSh( pSh )
+ {
+ nActPos = nStt;
+ if( 0 != ( bBack = (nStt > nEnd )) )
+ {
+ ULONG n = nStt; nStt = nEnd; nEnd = n;
+ }
+ ::binfilter::StartProgress( STR_STATSTR_SEARCH, nStt, nEnd, 0 );
+ }
+
+ _PercentHdl( const SwPaM& rPam )
+ : pDSh( (SwDocShell*)rPam.GetDoc()->GetDocShell() )
+ {
+ ULONG nStt, nEnd;
+ if( rPam.GetPoint()->nNode == rPam.GetMark()->nNode )
+ {
+ bNodeIdx = FALSE;
+ nStt = rPam.GetMark()->nContent.GetIndex();
+ nEnd = rPam.GetPoint()->nContent.GetIndex();
+ }
+ else
+ {
+ nStt = rPam.GetMark()->nNode.GetIndex();
+ nEnd = rPam.GetPoint()->nNode.GetIndex();
+ }
+ nActPos = nStt;
+ if( 0 != ( bBack = (nStt > nEnd )) )
+ {
+ ULONG n = nStt; nStt = nEnd; nEnd = n;
+ }
+ ::binfilter::StartProgress( STR_STATSTR_SEARCH, nStt, nEnd, pDSh );
+ }
+
+ ~_PercentHdl() { ::binfilter::EndProgress( pDSh ); }
+
+ void NextPos( ULONG nPos ) const
+ { ::binfilter::SetProgressState( bBack ? nActPos - nPos : nPos, pDSh ); }
+
+ void NextPos( SwPosition& rPos ) const
+ {
+ ULONG nPos;
+ if( bNodeIdx )
+ nPos = rPos.nNode.GetIndex();
+ else
+ nPos = rPos.nContent.GetIndex();
+ ::binfilter::SetProgressState( bBack ? nActPos - nPos : nPos, pDSh );
+ }
+};
+
+/*N*/ SwCursor::SwCursor( const SwPosition &rPos, SwPaM* pRing )
+/*N*/ : SwPaM( rPos, pRing ), pSavePos( 0 ), nCursorBidiLevel( 0 )
+/*N*/ {
+/*N*/ }
+
+
+/*N*/ SwCursor::~SwCursor()
+/*N*/ {
+/*N*/ while( pSavePos )
+/*N*/ {
+/*?*/ _SwCursor_SavePos* pNext = pSavePos->pNext;
+/*?*/ delete pSavePos;
+/*?*/ pSavePos = pNext;
+/*N*/ }
+/*N*/ }
+
+
+/*N*/ SwCursor::operator SwTableCursor* () { return 0; }
+/*N*/ SwCursor::operator SwShellCrsr* () { return 0; }
+/*N*/ SwCursor::operator SwShellTableCrsr* () { return 0; }
+/*N*/ SwCursor::operator SwUnoCrsr* () { return 0; }
+/*N*/ SwCursor::operator SwUnoTableCrsr* () { return 0; }
+
+
+// Sicher die aktuelle Position, damit ggfs. auf diese zurueck
+// gefallen werden kann. Die SavePos Objekte werden als Stack verwaltet,
+// damit das auch alles bei verschachtelten Aufrufen funktioniert.
+// Das CreateNewSavePos ist virtual, damit abgeleitete Klassen vom Cursor
+// gegebenenfalls eigene SaveObjecte anlegen und in den virtuellen
+// Check-Routinen verwenden koennen.
+
+/*N*/ void SwCursor::SaveState()
+/*N*/ {
+/*N*/ _SwCursor_SavePos* pNew = CreateNewSavePos();
+/*N*/ pNew->pNext = pSavePos;
+/*N*/ pSavePos = pNew;
+/*N*/ }
+
+/*N*/ void SwCursor::RestoreState()
+/*N*/ {
+/*N*/ _SwCursor_SavePos* pDel = pSavePos;
+/*N*/ pSavePos = pSavePos->pNext;
+/*N*/ delete pDel;
+/*N*/ }
+
+/*N*/ _SwCursor_SavePos* SwCursor::CreateNewSavePos() const
+/*N*/ {
+/*N*/ return new _SwCursor_SavePos( *this );
+/*N*/ }
+
+// stelle fest, ob sich der Point ausserhalb des Content-Bereichs
+// vom Nodes-Array befindet
+
+
+/*N*/ FASTBOOL SwCursor::IsSelOvr( int eFlags )
+/*N*/ {
+/*N*/ SwTableCursor* pTblCrsr = *this;
+/*N*/ SwDoc* pDoc = GetDoc();
+/*N*/ SwNodes& rNds = pDoc->GetNodes();
+/*N*/
+/*N*/ BOOL bSkipOverHiddenSections, bSkipOverProtectSections;
+/*N*/ SwUnoCrsr* pUnoCrsr = *this;
+/*N*/ if( pUnoCrsr )
+/*N*/ {
+/*N*/ bSkipOverHiddenSections = pUnoCrsr->IsSkipOverHiddenSections();
+/*N*/ bSkipOverProtectSections = pUnoCrsr->IsSkipOverProtectSections();
+/*N*/ }
+/*N*/ else
+/*N*/ {
+/*?*/ bSkipOverHiddenSections = TRUE;
+/*?*/ bSkipOverProtectSections = !IsReadOnlyAvailable();
+/*N*/ }
+
+ // Bereiche vom Nodes-Array ueberpruefen
+/*N*/ if( (SELOVER_CHECKNODESSECTION & eFlags) && pTblCrsr && HasMark() )
+/*N*/ {
+/*?*/ SwNodeIndex aOldPos( rNds, pSavePos->nNode );
+/*?*/ if( !CheckNodesRange( aOldPos, GetPoint()->nNode, TRUE ))
+/*?*/ {
+/*?*/ GetPoint()->nNode = aOldPos;
+/*?*/ GetPoint()->nContent.Assign( GetCntntNode(), pSavePos->nCntnt );
+/*?*/ return TRUE;
+/*?*/ }
+/*N*/ }
+
+// neu: Bereiche ueberpruefen
+// Anfang
+/*N*/ if( pSavePos->nNode != GetPoint()->nNode.GetIndex() &&
+/*N*/ //JP 28.10.97: Bug 45129 - im UI-ReadOnly ist alles erlaubt
+/*N*/ ( !pDoc->GetDocShell() || !pDoc->GetDocShell()->IsReadOnlyUI() ))
+/*N*/ {
+/*N*/ // teste doch mal die neuen Sections:
+/*N*/ SwNodeIndex& rPtIdx = GetPoint()->nNode;
+/*N*/ const SwSectionNode* pSectNd = rPtIdx.GetNode().FindSectionNode();
+/*N*/ if( pSectNd &&
+/*N*/ ((bSkipOverHiddenSections && pSectNd->GetSection().IsHiddenFlag() ) ||
+/*N*/ (bSkipOverProtectSections && pSectNd->GetSection().IsProtectFlag() )))
+/*N*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 if( 0 == ( SELOVER_CHANGEPOS & eFlags ) )
+/*N*/ }
+
+ // oder sollte eine geschuetzte Section innerhalb der Selektion liegen?
+/*N*/ if( HasMark() && bSkipOverProtectSections)
+/*N*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 ULONG nSttIdx = GetMark()->nNode.GetIndex(),
+/*N*/ }
+/*?*/
+/*N*/ }
+// Ende
+// neu: Bereiche ueberpruefen
+
+/*N*/ const SwNode* pNd = &GetPoint()->nNode.GetNode();
+/*N*/ if( pNd->IsCntntNode() && 0 == (SwUnoCrsr*)*this )
+/*N*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 const SwCntntFrm* pFrm = ((SwCntntNode*)pNd)->GetFrm();
+/*N*/ }
+
+ // darf der Cursor in geschuetzen "Nodes" stehen?
+/*N*/ if( 0 == ( SELOVER_CHANGEPOS & eFlags ) && !IsAtValidPos() )
+/*N*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 DeleteMark();
+/*N*/ }
+
+/*N*/ if( !HasMark() )
+/*N*/ return FALSE;
+/*N*/
+/*N*/ //JP 19.08.98: teste mal auf ungueltige Selektion - sprich ueber
+/*N*/ // GrundSections:
+/*N*/ if( !::binfilter::CheckNodesRange( GetMark()->nNode, GetPoint()->nNode, TRUE ))
+/*N*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 DeleteMark();
+/*N*/ }
+
+/*N*/ const SwTableNode* pPtNd = pNd->FindTableNode();
+
+/*N*/ if( (pNd = &GetMark()->nNode.GetNode())->IsCntntNode() &&
+/*N*/ !((SwCntntNode*)pNd)->GetFrm() && 0 == (SwUnoCrsr*)*this )
+/*N*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 DeleteMark();
+/*N*/ }
+
+/*N*/ const SwTableNode* pMrkNd = pNd->FindTableNode();
+/*N*/
+/*N*/ // beide in keinem oder beide im gleichen TableNode
+/*N*/ if( ( !pMrkNd && !pPtNd ) || pPtNd == pMrkNd )
+/*N*/ return FALSE;
+
+ // in unterschiedlichen Tabellen oder nur Mark in der Tabelle
+/*?*/ if( ( pPtNd && pMrkNd ) || pMrkNd )
+/*?*/ { // dann lasse das nicht zu, alte Pos zurueck
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 RestoreSavePos();
+/*?*/ }
+
+ // ACHTUNG: dieses kann nicht im TableMode geschehen !!
+/*?*/ if( pPtNd ) // nur Point in Tabelle, dann gehe hinter/vor diese
+/*?*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 if( SELOVER_CHANGEPOS & eFlags )
+/*?*/ }
+/*?*/ return FALSE; // was bleibt noch ??
+/*N*/ }
+
+#if defined( UNX ) || defined( MAC )
+#define IDX (*pCellStt)
+#else
+#define IDX aCellStt
+#endif
+
+
+/*N*/ FASTBOOL SwCursor::IsInProtectTable( FASTBOOL bMove, FASTBOOL bChgCrsr )
+/*N*/ {
+/*N*/ // stehe ich in einer Tabelle ??
+/*N*/ SwDoc* pDoc = GetDoc();
+/*N*/ SwCntntNode* pCNd = GetCntntNode();
+/*N*/ if( !pCNd || pSavePos->nNode == GetPoint()->nNode.GetIndex() ||
+/*N*/ !pCNd->FindTableNode() ||
+/*N*/ !pCNd->IsProtect() ||
+/*N*/ IsReadOnlyAvailable() )
+/*N*/ return FALSE;
+
+/*?*/ if( !bMove )
+/*?*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 if( bChgCrsr )
+/*?*/ }
+/*?*/
+/*?*/ // wir stehen in einer geschuetzten TabellenZelle
+/*?*/ // von Oben nach Unten Traveln ?
+/*?*/ if( pSavePos->nNode < GetPoint()->nNode.GetIndex() )
+/*?*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 // suche die naechste "gueltige" Box
+/*?*/
+/*?*/ }
+/*?*/
+/*?*/ // suche die vorherige "gueltige" Box
+/*?*/ {
+/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 // liegt vor dem StartNode der Zelle ein weiterer EndNode, dann
+/*?*/ // gibt es auch eine vorherige Zelle
+/*?*/ }
+/*?*/
+/*?*/ ASSERT( FALSE, "sollte nie erreicht werden oder??" );
+/*?*/ return FALSE;
+/*N*/ }
+
+// TRUE: an die Position kann der Cursor gesetzt werden
+/*N*/ FASTBOOL SwCursor::IsAtValidPos( BOOL bPoint ) const
+/*N*/ {
+DBG_BF_ASSERT(0, "STRIP"); return FALSE; //STRIP001 const SwDoc* pDoc = GetDoc();
+/*N*/ }
+
+/*N*/ void SwCursor::SaveTblBoxCntnt( const SwPosition* ) {}
+
+// setze den SRange fuer das Suchen im Dokument
+
+
+
+
+
+
+
+
+// diese Methode "sucht" fuer alle Anwendungsfaelle, denn in SwFindParas
+// steht immer die richtigen Parameter und die entsprechende Find-Methode
+
+/*M*/ ULONG SwCursor::FindAll( SwFindParas& rParas,
+/*M*/ SwDocPositions nStart, SwDocPositions nEnde,
+/*M*/ FindRanges eFndRngs, BOOL& bCancel )
+/*M*/ {DBG_BF_ASSERT(0, "STRIP"); return 0;//STRIP001
+/*M*/ }
+
+
+
+
+/*N*/ FASTBOOL SwCursor::IsStartWord() const
+/*N*/ {
+/*N*/ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ return bRet;
+/*N*/ }
+
+/*N*/ FASTBOOL SwCursor::IsEndWord() const
+/*N*/ {
+ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ return bRet;
+/*N*/ }
+
+
+/*N*/ FASTBOOL SwCursor::GoStartWord()
+/*N*/ {
+/*N*/ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ return bRet;
+/*N*/ }
+
+/*N*/ FASTBOOL SwCursor::GoEndWord()
+/*N*/ {
+/*N*/ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ return bRet;
+/*N*/ }
+
+/*N*/ FASTBOOL SwCursor::GoNextWord()
+/*N*/ {
+/*?*/ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ return bRet;
+/*N*/ }
+
+/*N*/ FASTBOOL SwCursor::GoPrevWord()
+/*N*/ {
+/*?*/ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ return bRet;
+/*N*/ }
+
+
+//-----------------------------------------------------------------------------
+/*N*/ FASTBOOL SwCursor::GoSentence( SentenceMoveType eMoveType )
+/*N*/ {
+/*?*/ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); return FALSE;//STRIP001
+/*N*/ }
+
+
+/*N*/ FASTBOOL SwCursor::LeftRight( BOOL bLeft, USHORT nCnt, USHORT nMode,
+/*N*/ BOOL bVisualAllowed, BOOL bInsertCrsr )
+/*N*/ {
+/*N*/ SwTableCursor* pTblCrsr = (SwTableCursor*)*this;
+/*N*/ if( pTblCrsr )
+/*N*/ return bLeft ? pTblCrsr->GoPrevCell( nCnt )
+/*N*/ : pTblCrsr->GoNextCell( nCnt );
+/*N*/
+/*N*/ // calculate cursor bidi level
+/*N*/ const SwCntntFrm* pSttFrm = NULL;
+/*N*/ SwNode& rNode = GetPoint()->nNode.GetNode();
+/*N*/ const BOOL bDoNotSetBidiLevel = 0 != (SwUnoCrsr*)*this;
+/*N*/
+/*N*/ if ( ! bDoNotSetBidiLevel )
+/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ }
+/*N*/
+/*N*/ // kann der Cursor n-mal weiterverschoben werden ?
+/*N*/ SwCrsrSaveState aSave( *this );
+/*N*/ SwMoveFn fnMove = bLeft ? fnMoveBackward : fnMoveForward;
+/*N*/ SwGoInDoc fnGo = CRSR_SKIP_CELLS == nMode ? fnGoCntntCells : fnGoCntnt;
+/*N*/ while( nCnt && Move( fnMove, fnGo ) )
+/*N*/ --nCnt;
+/*N*/
+/*N*/ // here come some special rules for visual cursor travelling
+/*N*/ if ( pSttFrm )
+/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001
+/*N*/ }
+/*N*/
+/*N*/ return 0 == nCnt && !IsInProtectTable( TRUE ) &&
+/*N*/ !IsSelOvr( SELOVER_TOGGLE | SELOVER_CHANGEPOS );
+/*N*/ }
+
+/*N*/ FASTBOOL SwCursor::UpDown( BOOL bUp, USHORT nCnt,
+/*N*/ Point* pPt, long nUpDownX )
+/*N*/ {
+DBG_BF_ASSERT(0, "STRIP"); return FALSE;//STRIP001 SwTableCursor* pTblCrsr = (SwTableCursor*)*this;
+/*N*/ }
+
+/*N*/ FASTBOOL SwCursor::GotoTblBox( const String& rName )
+/*N*/ {
+/*N*/ FASTBOOL bRet = FALSE;DBG_BF_ASSERT(0, "STRIP"); return FALSE;//STRIP001
+/*N*/ }
+
+/*N*/ FASTBOOL SwCursor::MovePara(SwWhichPara fnWhichPara, SwPosPara fnPosPara )
+/*N*/ {
+/*N*/ //JP 28.8.2001: for optimization test something before
+/*N*/ const SwNode* pNd;
+/*N*/ if( fnWhichPara == fnParaCurr ||
+/*N*/ (( pNd = &GetPoint()->nNode.GetNode())->IsTxtNode() &&
+/*N*/ pNd->GetNodes()[ pNd->GetIndex() +
+/*N*/ (fnWhichPara == fnParaNext ? 1 : -1 ) ]->IsTxtNode() ) )
+/*N*/ {
+/*N*/ return (*fnWhichPara)( *this, fnPosPara );
+/*N*/ }
+/*N*/ // else we must use the SaveStructure, because the next/prev is not
+/*N*/ // a same node type.
+/*N*/ SwCrsrSaveState aSave( *this );
+/*N*/ return (*fnWhichPara)( *this, fnPosPara ) &&
+/*N*/ !IsInProtectTable( TRUE ) &&
+/*N*/ !IsSelOvr( SELOVER_TOGGLE | SELOVER_CHANGEPOS );
+/*N*/ }
+
+
+/*N*/ FASTBOOL SwCursor::MoveSection( SwWhichSection fnWhichSect,
+/*N*/ SwPosSection fnPosSect)
+/*N*/ {
+/*N*/ SwCrsrSaveState aSave( *this );
+/*N*/ return (*fnWhichSect)( *this, fnPosSect ) &&
+/*N*/ !IsInProtectTable( TRUE ) &&
+/*N*/ !IsSelOvr( SELOVER_TOGGLE | SELOVER_CHANGEPOS );
+/*N*/ }
+
+/*N*/ SwTableCursor::~SwTableCursor() {}
+
+/*N*/ SwTableCursor::operator SwTableCursor* () { return this; }
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */