xref: /trunk/main/sw/source/core/doc/docglos.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
32 #include <com/sun/star/document/XDocumentProperties.hpp>
33 #include <com/sun/star/beans/XPropertySet.hpp>
34 #include <com/sun/star/beans/XPropertySetInfo.hpp>
35 
36 #include <doc.hxx>
37 #include <IDocumentUndoRedo.hxx>
38 #include <shellio.hxx>
39 #include <pam.hxx>
40 #include <swundo.hxx>
41 #include <ndtxt.hxx>
42 #include <acorrect.hxx>
43 #include <crsrsh.hxx>
44 #include <docsh.hxx>
45 
46 
47 using namespace ::com::sun::star;
48 
49 
50 /// copy document properties via public interface
51 static void lcl_copyDocumentProperties(
52         uno::Reference<document::XDocumentProperties> i_xSource,
53         uno::Reference<document::XDocumentProperties> i_xTarget) {
54     DBG_ASSERT(i_xSource.is(), "null reference");
55     DBG_ASSERT(i_xTarget.is(), "null reference");
56 
57     i_xTarget->setAuthor(i_xSource->getAuthor());
58     i_xTarget->setGenerator(i_xSource->getGenerator());
59     i_xTarget->setCreationDate(i_xSource->getCreationDate());
60     i_xTarget->setTitle(i_xSource->getTitle());
61     i_xTarget->setSubject(i_xSource->getSubject());
62     i_xTarget->setDescription(i_xSource->getDescription());
63     i_xTarget->setKeywords(i_xSource->getKeywords());
64     i_xTarget->setLanguage(i_xSource->getLanguage());
65     i_xTarget->setModifiedBy(i_xSource->getModifiedBy());
66     i_xTarget->setModificationDate(i_xSource->getModificationDate());
67     i_xTarget->setPrintedBy(i_xSource->getPrintedBy());
68     i_xTarget->setPrintDate(i_xSource->getPrintDate());
69     i_xTarget->setTemplateName(i_xSource->getTemplateName());
70     i_xTarget->setTemplateURL(i_xSource->getTemplateURL());
71     i_xTarget->setTemplateDate(i_xSource->getTemplateDate());
72     i_xTarget->setAutoloadURL(i_xSource->getAutoloadURL());
73     i_xTarget->setAutoloadSecs(i_xSource->getAutoloadSecs());
74     i_xTarget->setDefaultTarget(i_xSource->getDefaultTarget());
75     i_xTarget->setDocumentStatistics(i_xSource->getDocumentStatistics());
76     i_xTarget->setEditingCycles(i_xSource->getEditingCycles());
77     i_xTarget->setEditingDuration(i_xSource->getEditingDuration());
78 
79     uno::Reference<beans::XPropertySet> xSourceUDSet(
80         i_xSource->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
81     uno::Reference<beans::XPropertyContainer> xTargetUD(
82         i_xTarget->getUserDefinedProperties());
83     uno::Reference<beans::XPropertySet> xTargetUDSet(xTargetUD,
84         uno::UNO_QUERY_THROW);
85     uno::Sequence<beans::Property> tgtprops
86         = xTargetUDSet->getPropertySetInfo()->getProperties();
87     for (sal_Int32 i = 0; i < tgtprops.getLength(); ++i) {
88         try {
89             xTargetUD->removeProperty(tgtprops [i].Name);
90         } catch (uno::Exception &) {
91             // ignore
92         }
93     }
94     try {
95         uno::Reference<beans::XPropertySetInfo> xSetInfo
96             = xSourceUDSet->getPropertySetInfo();
97         uno::Sequence<beans::Property> srcprops = xSetInfo->getProperties();
98         for (sal_Int32 i = 0; i < srcprops.getLength(); ++i) {
99             ::rtl::OUString name = srcprops[i].Name;
100             xTargetUD->addProperty(name, srcprops[i].Attributes,
101                 xSourceUDSet->getPropertyValue(name));
102         }
103     } catch (uno::Exception &) {
104         // ignore
105     }
106 }
107 
108 /* -----------------22.07.99 11:47-------------------
109     Description: inserts an AutoText block
110  --------------------------------------------------*/
111 sal_Bool SwDoc::InsertGlossary( SwTextBlocks& rBlock, const String& rEntry,
112                             SwPaM& rPaM, SwCrsrShell* pShell )
113 {
114     sal_Bool bRet = sal_False;
115     sal_uInt16 nIdx = rBlock.GetIndex( rEntry );
116     if( (sal_uInt16) -1 != nIdx )
117     {
118         // Bug #70238# ask the TextOnly-Flag before BeginGetDoc, because
119         //              the method closed the Storage!
120         sal_Bool bSav_IsInsGlossary = mbInsOnlyTxtGlssry;
121         mbInsOnlyTxtGlssry = rBlock.IsOnlyTextBlock( nIdx );
122 
123         if( rBlock.BeginGetDoc( nIdx ) )
124         {
125             SwDoc* pGDoc = rBlock.GetDoc();
126 
127             // alle FixFelder aktualisieren. Dann aber auch mit der
128             // richtigen DocInfo!
129             // FIXME: UGLY: Because we cannot limit the range in which to do
130             // field updates, we must update the fixed fields at the glossary
131             // entry document.
132             // To be able to do this, we copy the document properties of the
133             // target document to the glossary document
134 //            DBG_ASSERT(GetDocShell(), "no SwDocShell"); // may be clipboard!
135             DBG_ASSERT(pGDoc->GetDocShell(), "no SwDocShell at glossary");
136             if (GetDocShell() && pGDoc->GetDocShell()) {
137                 uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
138                     GetDocShell()->GetModel(), uno::UNO_QUERY_THROW);
139                 uno::Reference<document::XDocumentProperties> xDocProps(
140                     xDPS->getDocumentProperties() );
141                 uno::Reference<document::XDocumentPropertiesSupplier> xGlosDPS(
142                     pGDoc->GetDocShell()->GetModel(), uno::UNO_QUERY_THROW);
143                 uno::Reference<document::XDocumentProperties> xGlosDocProps(
144                     xGlosDPS->getDocumentProperties() );
145                 lcl_copyDocumentProperties(xDocProps, xGlosDocProps);
146         }
147             pGDoc->SetFixFields(false, NULL);
148 
149             //StartAllAction();
150             LockExpFlds();
151 
152             SwNodeIndex aStt( pGDoc->GetNodes().GetEndOfExtras(), 1 );
153             SwCntntNode* pCntntNd = pGDoc->GetNodes().GoNext( &aStt );
154             const SwTableNode* pTblNd = pCntntNd->FindTableNode();
155             SwPaM aCpyPam( pTblNd ? *(SwNode*)pTblNd : *(SwNode*)pCntntNd );
156             aCpyPam.SetMark();
157 
158             // dann bis zum Ende vom Nodes Array
159             aCpyPam.GetPoint()->nNode = pGDoc->GetNodes().GetEndOfContent().GetIndex()-1;
160             pCntntNd = aCpyPam.GetCntntNode();
161             aCpyPam.GetPoint()->nContent.Assign( pCntntNd, pCntntNd->Len() );
162 
163             GetIDocumentUndoRedo().StartUndo( UNDO_INSGLOSSARY, NULL );
164             SwPaM *_pStartCrsr = &rPaM, *__pStartCrsr = _pStartCrsr;
165             do {
166 
167                 SwPosition& rInsPos = *_pStartCrsr->GetPoint();
168                 SwStartNode* pBoxSttNd = (SwStartNode*)rInsPos.nNode.GetNode().
169                                             FindTableBoxStartNode();
170 
171                 if( pBoxSttNd && 2 == pBoxSttNd->EndOfSectionIndex() -
172                                       pBoxSttNd->GetIndex() &&
173                     aCpyPam.GetPoint()->nNode != aCpyPam.GetMark()->nNode )
174                 {
175                     // es wird mehr als 1 Node in die akt. Box kopiert.
176                     // Dann muessen die BoxAttribute aber entfernt werden.
177                     ClearBoxNumAttrs( rInsPos.nNode );
178                 }
179 
180                 SwDontExpandItem aACD;
181                 aACD.SaveDontExpandItems( rInsPos );
182 
183                 pGDoc->CopyRange( aCpyPam, rInsPos, false );
184 
185                 aACD.RestoreDontExpandItems( rInsPos );
186                 if( pShell )
187                     pShell->SaveTblBoxCntnt( &rInsPos );
188             } while( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) !=
189                         __pStartCrsr );
190             GetIDocumentUndoRedo().EndUndo( UNDO_INSGLOSSARY, NULL );
191 
192             UnlockExpFlds();
193             if( !IsExpFldsLocked() )
194                 UpdateExpFlds(NULL, true);
195             bRet = sal_True;
196         }
197         mbInsOnlyTxtGlssry = bSav_IsInsGlossary;
198     }
199     rBlock.EndGetDoc();
200     return bRet;
201 }
202 
203 
204