summaryrefslogtreecommitdiff
path: root/sw/source/core/edit/edglbldc.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/edit/edglbldc.cxx')
-rw-r--r--sw/source/core/edit/edglbldc.cxx412
1 files changed, 412 insertions, 0 deletions
diff --git a/sw/source/core/edit/edglbldc.cxx b/sw/source/core/edit/edglbldc.cxx
new file mode 100644
index 000000000000..94cc61bc0499
--- /dev/null
+++ b/sw/source/core/edit/edglbldc.cxx
@@ -0,0 +1,412 @@
+/* -*- 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#include <doc.hxx>
+#include <IDocumentUndoRedo.hxx>
+#include <editsh.hxx>
+#include <pam.hxx>
+#include <ndtxt.hxx>
+#include <docary.hxx>
+#include <swwait.hxx>
+#include <swundo.hxx> // fuer die UndoIds
+#include <section.hxx>
+#include <doctxm.hxx>
+#include <edglbldc.hxx>
+
+
+SV_IMPL_OP_PTRARR_SORT( SwGlblDocContents, SwGlblDocContentPtr )
+
+sal_Bool SwEditShell::IsGlobalDoc() const
+{
+ return getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT);
+}
+
+void SwEditShell::SetGlblDocSaveLinks( sal_Bool bFlag )
+{
+ getIDocumentSettingAccess()->set(IDocumentSettingAccess::GLOBAL_DOCUMENT_SAVE_LINKS, bFlag);
+ if( !GetDoc()->IsModified() ) // Bug 57028
+ {
+ GetDoc()->GetIDocumentUndoRedo().SetUndoNoResetModified();
+ }
+ GetDoc()->SetModified();
+}
+
+sal_Bool SwEditShell::IsGlblDocSaveLinks() const
+{
+ return getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT_SAVE_LINKS);
+}
+
+sal_uInt16 SwEditShell::GetGlobalDocContent( SwGlblDocContents& rArr ) const
+{
+ if( rArr.Count() )
+ rArr.DeleteAndDestroy( 0, rArr.Count() );
+
+ if( !getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) )
+ return 0;
+
+ // dann alle gelinkten Bereiche auf der obersten Ebene
+ SwDoc* pMyDoc = GetDoc();
+ const SwSectionFmts& rSectFmts = pMyDoc->GetSections();
+ sal_uInt16 n;
+
+ for( n = rSectFmts.Count(); n; )
+ {
+ const SwSection* pSect = rSectFmts[ --n ]->GetGlobalDocSection();
+ if( pSect )
+ {
+ SwGlblDocContentPtr pNew;
+ switch( pSect->GetType() )
+ {
+ case TOX_HEADER_SECTION: break; // ignore
+ case TOX_CONTENT_SECTION:
+ OSL_ENSURE( pSect->ISA( SwTOXBaseSection ), "keine TOXBaseSection!" );
+ pNew = new SwGlblDocContent( (SwTOXBaseSection*)pSect );
+ break;
+
+ default:
+ pNew = new SwGlblDocContent( pSect );
+ break;
+ }
+ if( !rArr.Insert( pNew ) )
+ delete pNew;
+ }
+ }
+
+ // und als letztes die Dummies (sonstiger Text) einfuegen
+ SwNode* pNd;
+ sal_uLong nSttIdx = pMyDoc->GetNodes().GetEndOfExtras().GetIndex() + 2;
+ for( n = 0; n < rArr.Count(); ++n )
+ {
+ const SwGlblDocContent& rNew = *rArr[ n ];
+ // suche von StartPos bis rNew.DocPos nach einem Content Node.
+ // Existiert dieser, so muss ein DummyEintrag eingefuegt werden.
+ for( ; nSttIdx < rNew.GetDocPos(); ++nSttIdx )
+ if( ( pNd = pMyDoc->GetNodes()[ nSttIdx ])->IsCntntNode()
+ || pNd->IsSectionNode() || pNd->IsTableNode() )
+ {
+ SwGlblDocContentPtr pNew = new SwGlblDocContent( nSttIdx );
+ if( !rArr.Insert( pNew ) )
+ delete pNew;
+ else
+ ++n; // auf die naechste Position
+ break;
+ }
+
+ // StartPosition aufs Ende setzen
+ nSttIdx = pMyDoc->GetNodes()[ rNew.GetDocPos() ]->EndOfSectionIndex();
+ ++nSttIdx;
+ }
+
+ // sollte man das Ende auch noch setzen??
+ if( rArr.Count() )
+ {
+ sal_uLong nNdEnd = pMyDoc->GetNodes().GetEndOfContent().GetIndex();
+ for( ; nSttIdx < nNdEnd; ++nSttIdx )
+ if( ( pNd = pMyDoc->GetNodes()[ nSttIdx ])->IsCntntNode()
+ || pNd->IsSectionNode() || pNd->IsTableNode() )
+ {
+ SwGlblDocContentPtr pNew = new SwGlblDocContent( nSttIdx );
+ if( !rArr.Insert( pNew ) )
+ delete pNew;
+ break;
+ }
+ }
+ else
+ {
+ SwGlblDocContentPtr pNew = new SwGlblDocContent(
+ pMyDoc->GetNodes().GetEndOfExtras().GetIndex() + 2 );
+ rArr.Insert( pNew );
+ }
+ return rArr.Count();
+}
+
+sal_Bool SwEditShell::InsertGlobalDocContent( const SwGlblDocContent& rInsPos,
+ SwSectionData & rNew)
+{
+ if( !getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) )
+ return sal_False;
+
+ SET_CURR_SHELL( this );
+ StartAllAction();
+
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetNext() != pCrsr || IsTableMode() )
+ ClearMark();
+
+ SwPosition& rPos = *pCrsr->GetPoint();
+ rPos.nNode = rInsPos.GetDocPos();
+
+ sal_Bool bEndUndo = sal_False;
+ SwDoc* pMyDoc = GetDoc();
+ SwTxtNode *const pTxtNd = rPos.nNode.GetNode().GetTxtNode();
+ if( pTxtNd )
+ rPos.nContent.Assign( pTxtNd, 0 );
+ else
+ {
+ bEndUndo = sal_True;
+ pMyDoc->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
+ rPos.nNode--;
+ pMyDoc->AppendTxtNode( rPos );
+ pCrsr->SetMark();
+ }
+
+ InsertSection( rNew );
+
+ if( bEndUndo )
+ {
+ pMyDoc->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
+ }
+ EndAllAction();
+
+ return sal_True;
+}
+
+sal_Bool SwEditShell::InsertGlobalDocContent( const SwGlblDocContent& rInsPos,
+ const SwTOXBase& rTOX )
+{
+ if( !getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) )
+ return sal_False;
+
+ SET_CURR_SHELL( this );
+ StartAllAction();
+
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetNext() != pCrsr || IsTableMode() )
+ ClearMark();
+
+ SwPosition& rPos = *pCrsr->GetPoint();
+ rPos.nNode = rInsPos.GetDocPos();
+
+ sal_Bool bEndUndo = sal_False;
+ SwDoc* pMyDoc = GetDoc();
+ SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
+ if( pTxtNd && pTxtNd->GetTxt().Len() && rPos.nNode.GetIndex() + 1 !=
+ pMyDoc->GetNodes().GetEndOfContent().GetIndex() )
+ rPos.nContent.Assign( pTxtNd, 0 );
+ else
+ {
+ bEndUndo = sal_True;
+ pMyDoc->GetIDocumentUndoRedo().StartUndo( UNDO_START, NULL );
+ rPos.nNode--;
+ pMyDoc->AppendTxtNode( rPos );
+ }
+
+ InsertTableOf( rTOX );
+
+ if( bEndUndo )
+ {
+ pMyDoc->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
+ }
+ EndAllAction();
+
+ return sal_True;
+}
+
+sal_Bool SwEditShell::InsertGlobalDocContent( const SwGlblDocContent& rInsPos )
+{
+ if( !getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) )
+ return sal_False;
+
+ SET_CURR_SHELL( this );
+ StartAllAction();
+
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetNext() != pCrsr || IsTableMode() )
+ ClearMark();
+
+ SwPosition& rPos = *pCrsr->GetPoint();
+ rPos.nNode = rInsPos.GetDocPos() - 1;
+ rPos.nContent.Assign( 0, 0 );
+
+ SwDoc* pMyDoc = GetDoc();
+ pMyDoc->AppendTxtNode( rPos );
+ EndAllAction();
+ return sal_True;
+}
+
+sal_Bool SwEditShell::DeleteGlobalDocContent( const SwGlblDocContents& rArr ,
+ sal_uInt16 nDelPos )
+{
+ if( !getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) )
+ return sal_False;
+
+ SET_CURR_SHELL( this );
+ StartAllAction();
+ StartUndo( UNDO_START );
+
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetNext() != pCrsr || IsTableMode() )
+ ClearMark();
+
+ SwPosition& rPos = *pCrsr->GetPoint();
+
+ SwDoc* pMyDoc = GetDoc();
+ const SwGlblDocContent& rDelPos = *rArr[ nDelPos ];
+ sal_uLong nDelIdx = rDelPos.GetDocPos();
+ if( 1 == rArr.Count() )
+ {
+ // ein Node muss aber da bleiben!
+ rPos.nNode = nDelIdx - 1;
+ rPos.nContent.Assign( 0, 0 );
+
+ pMyDoc->AppendTxtNode( rPos );
+ ++nDelIdx;
+ }
+
+ switch( rDelPos.GetType() )
+ {
+ case GLBLDOC_UNKNOWN:
+ {
+ rPos.nNode = nDelIdx;
+ pCrsr->SetMark();
+ if( ++nDelPos < rArr.Count() )
+ rPos.nNode = rArr[ nDelPos ]->GetDocPos();
+ else
+ rPos.nNode = pMyDoc->GetNodes().GetEndOfContent();
+ rPos.nNode--;
+ if( !pMyDoc->DelFullPara( *pCrsr ) )
+ Delete();
+ }
+ break;
+
+ case GLBLDOC_TOXBASE:
+ {
+ SwTOXBaseSection* pTOX = (SwTOXBaseSection*)rDelPos.GetTOX();
+ pMyDoc->DeleteTOX( *pTOX, sal_True );
+ }
+ break;
+
+ case GLBLDOC_SECTION:
+ {
+ SwSectionFmt* pSectFmt = (SwSectionFmt*)rDelPos.GetSection()->GetFmt();
+ pMyDoc->DelSectionFmt( pSectFmt, sal_True );
+ }
+ break;
+ }
+
+ EndUndo( UNDO_END );
+ EndAllAction();
+ return sal_True;
+}
+
+sal_Bool SwEditShell::MoveGlobalDocContent( const SwGlblDocContents& rArr ,
+ sal_uInt16 nFromPos, sal_uInt16 nToPos,
+ sal_uInt16 nInsPos )
+{
+ if( !getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) ||
+ nFromPos >= rArr.Count() || nToPos > rArr.Count() ||
+ nInsPos > rArr.Count() || nFromPos >= nToPos ||
+ ( nFromPos <= nInsPos && nInsPos <= nToPos ) )
+ return sal_False;
+
+ SET_CURR_SHELL( this );
+ StartAllAction();
+
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetNext() != pCrsr || IsTableMode() )
+ ClearMark();
+
+ SwDoc* pMyDoc = GetDoc();
+ SwNodeRange aRg( pMyDoc->GetNodes(), rArr[ nFromPos ]->GetDocPos() );
+ if( nToPos < rArr.Count() )
+ aRg.aEnd = rArr[ nToPos ]->GetDocPos();
+ else
+ aRg.aEnd = pMyDoc->GetNodes().GetEndOfContent();
+
+ SwNodeIndex aInsPos( pMyDoc->GetNodes() );
+ if( nInsPos < rArr.Count() )
+ aInsPos = rArr[ nInsPos ]->GetDocPos();
+ else
+ aInsPos = pMyDoc->GetNodes().GetEndOfContent();
+
+ bool bRet = pMyDoc->MoveNodeRange( aRg, aInsPos,
+ static_cast<IDocumentContentOperations::SwMoveFlags>(
+ IDocumentContentOperations::DOC_MOVEALLFLYS
+ | IDocumentContentOperations::DOC_CREATEUNDOOBJ ));
+
+ EndAllAction();
+ return bRet;
+}
+
+sal_Bool SwEditShell::GotoGlobalDocContent( const SwGlblDocContent& rPos )
+{
+ if( !getIDocumentSettingAccess()->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) )
+ return sal_False;
+
+ SET_CURR_SHELL( this );
+ SttCrsrMove();
+
+ SwPaM* pCrsr = GetCrsr();
+ if( pCrsr->GetNext() != pCrsr || IsTableMode() )
+ ClearMark();
+
+ SwPosition& rCrsrPos = *pCrsr->GetPoint();
+ rCrsrPos.nNode = rPos.GetDocPos();
+
+ SwDoc* pMyDoc = GetDoc();
+ SwCntntNode * pCNd = rCrsrPos.nNode.GetNode().GetCntntNode();
+ if( !pCNd )
+ pCNd = pMyDoc->GetNodes().GoNext( &rCrsrPos.nNode );
+
+ rCrsrPos.nContent.Assign( pCNd, 0 );
+
+ EndCrsrMove();
+ return sal_True;
+}
+
+SwGlblDocContent::SwGlblDocContent( sal_uLong nPos )
+{
+ eType = GLBLDOC_UNKNOWN;
+ PTR.pTOX = 0;
+ nDocPos = nPos;
+}
+
+SwGlblDocContent::SwGlblDocContent( const SwTOXBaseSection* pTOX )
+{
+ eType = GLBLDOC_TOXBASE;
+ PTR.pTOX = pTOX;
+
+ const SwSectionNode* pSectNd = pTOX->GetFmt()->GetSectionNode();
+ nDocPos = pSectNd ? pSectNd->GetIndex() : 0;
+}
+
+SwGlblDocContent::SwGlblDocContent( const SwSection* pSect )
+{
+ eType = GLBLDOC_SECTION;
+ PTR.pSect = pSect;
+
+ const SwSectionNode* pSectNd = pSect->GetFmt()->GetSectionNode();
+ nDocPos = pSectNd ? pSectNd->GetIndex() : 0;
+}
+
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */