Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <config_features.h>
21 :
22 : #include <hintids.hxx>
23 : #include <vcl/layout.hxx>
24 : #include <vcl/msgbox.hxx>
25 : #include <vcl/svapp.hxx>
26 : #include <vcl/wrkwin.hxx>
27 : #include <vcl/jobset.hxx>
28 : #include <svl/whiter.hxx>
29 : #include <svl/zforlist.hxx>
30 : #include <svl/eitem.hxx>
31 : #include <svl/stritem.hxx>
32 : #include <svl/PasswordHelper.hxx>
33 : #include <editeng/adjustitem.hxx>
34 : #include <basic/sbx.hxx>
35 : #include <unotools/moduleoptions.hxx>
36 : #include <unotools/misccfg.hxx>
37 : #include <sfx2/request.hxx>
38 : #include <sfx2/passwd.hxx>
39 : #include <sfx2/bindings.hxx>
40 : #include <sfx2/docfile.hxx>
41 : #include <sfx2/evntconf.hxx>
42 : #include <sfx2/docfilt.hxx>
43 : #include <sfx2/printer.hxx>
44 : #include <sfx2/linkmgr.hxx>
45 : #include <svl/srchitem.hxx>
46 : #include <editeng/flstitem.hxx>
47 : #include <sfx2/htmlmode.hxx>
48 : #include <svtools/soerr.hxx>
49 : #include <comphelper/classids.hxx>
50 : #include <basic/basmgr.hxx>
51 : #include <basic/sbmod.hxx>
52 : #include <swevent.hxx>
53 : #include <fmtpdsc.hxx>
54 : #include <fmtfsize.hxx>
55 : #include <fmtfld.hxx>
56 : #include <node.hxx>
57 : #include <swwait.hxx>
58 : #include <printdata.hxx>
59 : #include <frmatr.hxx>
60 : #include <view.hxx>
61 : #include <edtwin.hxx>
62 : #include <PostItMgr.hxx>
63 : #include <wrtsh.hxx>
64 : #include <docsh.hxx>
65 : #include <basesh.hxx>
66 : #include <viewopt.hxx>
67 : #include <wdocsh.hxx>
68 : #include <swmodule.hxx>
69 : #include <globdoc.hxx>
70 : #include <usrpref.hxx>
71 : #include <shellio.hxx>
72 : #include <docstyle.hxx>
73 : #include <doc.hxx>
74 : #include <docfunc.hxx>
75 : #include <drawdoc.hxx>
76 : #include <IDocumentUndoRedo.hxx>
77 : #include <IDocumentSettingAccess.hxx>
78 : #include <IDocumentLinksAdministration.hxx>
79 : #include <IDocumentDeviceAccess.hxx>
80 : #include <IDocumentDrawModelAccess.hxx>
81 : #include <IDocumentRedlineAccess.hxx>
82 : #include <IDocumentStatistics.hxx>
83 : #include <IDocumentState.hxx>
84 : #include <docstat.hxx>
85 : #include <pagedesc.hxx>
86 : #include <pview.hxx>
87 : #include <mdiexp.hxx>
88 : #include <swbaslnk.hxx>
89 : #include <srcview.hxx>
90 : #include <ndindex.hxx>
91 : #include <ndole.hxx>
92 : #include <swcli.hxx>
93 : #include <txtftn.hxx>
94 : #include <ftnidx.hxx>
95 : #include <fldbas.hxx>
96 : #include <docary.hxx>
97 : #include <swerror.h>
98 : #include <helpid.h>
99 : #include <cmdid.h>
100 : #include <globals.hrc>
101 : #include <app.hrc>
102 :
103 : #include <cfgid.h>
104 : #include <unotools/fltrcfg.hxx>
105 : #include <svtools/htmlcfg.hxx>
106 : #include <sfx2/fcontnr.hxx>
107 : #include <sfx2/viewfrm.hxx>
108 : #include <sfx2/objface.hxx>
109 : #include <comphelper/storagehelper.hxx>
110 :
111 : #define SwDocShell
112 : #include <sfx2/msg.hxx>
113 : #include <swslots.hxx>
114 : #include <com/sun/star/document/UpdateDocMode.hpp>
115 :
116 : #include <com/sun/star/document/XDocumentProperties.hpp>
117 : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
118 : #include <com/sun/star/sdb/DatabaseContext.hpp>
119 : #include <com/sun/star/sdb/XDocumentDataSource.hpp>
120 :
121 : #include <unomid.h>
122 : #include <unotextrange.hxx>
123 :
124 : #include <sfx2/Metadatable.hxx>
125 : #include <calbck.hxx>
126 : #include <dbmgr.hxx>
127 :
128 : #include <sal/log.hxx>
129 : #include <LibreOfficeKit/LibreOfficeKitEnums.h>
130 :
131 : using namespace ::com::sun::star;
132 : using namespace ::com::sun::star::uno;
133 : using namespace ::com::sun::star::script;
134 : using namespace ::com::sun::star::container;
135 :
136 62067 : SFX_IMPL_SUPERCLASS_INTERFACE(SwDocShell, SfxObjectShell)
137 :
138 59 : void SwDocShell::InitInterface_Impl()
139 : {
140 59 : }
141 :
142 1123221 : TYPEINIT2(SwDocShell, SfxObjectShell, SfxListener);
143 :
144 649158 : SFX_IMPL_OBJECTFACTORY(SwDocShell, SvGlobalName(SO3_SW_CLASSID), SfxObjectShellFlags::STD_NORMAL|SfxObjectShellFlags::HASMENU, "swriter" )
145 :
146 0 : bool SwDocShell::InsertGeneratedStream(SfxMedium & rMedium,
147 : uno::Reference<text::XTextRange> const& xInsertPosition)
148 : {
149 0 : SwUnoInternalPaM aPam(*GetDoc()); // must have doc since called from SwView
150 0 : if (!::sw::XTextRangeToSwPaM(aPam, xInsertPosition))
151 0 : return false;
152 : // similar to SwView::InsertMedium
153 0 : SwReader *pReader(0);
154 0 : Reader *const pRead = StartConvertFrom(rMedium, &pReader, 0, &aPam);
155 0 : if (!pRead)
156 0 : return false;
157 0 : sal_uLong const nError = pReader->Read(*pRead);
158 0 : delete pReader;
159 0 : return 0 == nError;
160 : }
161 :
162 : // Prepare loading
163 148 : Reader* SwDocShell::StartConvertFrom(SfxMedium& rMedium, SwReader** ppRdr,
164 : SwCrsrShell *pCrsrShell,
165 : SwPaM* pPaM )
166 : {
167 148 : bool bAPICall = false;
168 : const SfxPoolItem* pApiItem;
169 : const SfxItemSet* pMedSet;
170 296 : if( 0 != ( pMedSet = rMedium.GetItemSet() ) && SfxItemState::SET ==
171 148 : pMedSet->GetItemState( FN_API_CALL, true, &pApiItem ) )
172 0 : bAPICall = static_cast<const SfxBoolItem*>(pApiItem)->GetValue();
173 :
174 148 : const SfxFilter* pFlt = rMedium.GetFilter();
175 148 : if( !pFlt )
176 : {
177 0 : if(!bAPICall)
178 : {
179 0 : ScopedVclPtr<InfoBox>::Create( nullptr, SW_RESSTR(STR_CANTOPEN))->Execute();
180 : }
181 0 : return 0;
182 : }
183 148 : OUString aFileName( rMedium.GetName() );
184 148 : SwRead pRead = SwReaderWriter::GetReader( pFlt->GetUserData() );
185 148 : if( !pRead )
186 0 : return 0;
187 :
188 296 : if( rMedium.IsStorage()
189 0 : ? SW_STORAGE_READER & pRead->GetReaderType()
190 148 : : SW_STREAM_READER & pRead->GetReaderType() )
191 : {
192 0 : *ppRdr = pPaM ? new SwReader( rMedium, aFileName, *pPaM ) :
193 : pCrsrShell ?
194 0 : new SwReader( rMedium, aFileName, *pCrsrShell->GetCrsr() )
195 148 : : new SwReader( rMedium, aFileName, m_pDoc );
196 : }
197 : else
198 0 : return 0;
199 :
200 : // #i30171# set the UpdateDocMode at the SwDocShell
201 148 : SFX_ITEMSET_ARG( rMedium.GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, false);
202 148 : m_nUpdateDocMode = pUpdateDocItem ? pUpdateDocItem->GetValue() : document::UpdateDocMode::NO_UPDATE;
203 :
204 148 : if (!pFlt->GetDefaultTemplate().isEmpty())
205 0 : pRead->SetTemplateName( pFlt->GetDefaultTemplate() );
206 :
207 152 : if( pRead == ReadAscii && 0 != rMedium.GetInStream() &&
208 4 : pFlt->GetUserData() == FILTER_TEXT_DLG )
209 : {
210 3 : SwAsciiOptions aOpt;
211 : const SfxItemSet* pSet;
212 : const SfxPoolItem* pItem;
213 6 : if( 0 != ( pSet = rMedium.GetItemSet() ) && SfxItemState::SET ==
214 3 : pSet->GetItemState( SID_FILE_FILTEROPTIONS, true, &pItem ) )
215 3 : aOpt.ReadUserData( static_cast<const SfxStringItem*>(pItem)->GetValue() );
216 :
217 3 : if( pRead )
218 3 : pRead->GetReaderOpt().SetASCIIOpts( aOpt );
219 : }
220 :
221 148 : return pRead;
222 : }
223 :
224 : // Loading
225 148 : bool SwDocShell::ConvertFrom( SfxMedium& rMedium )
226 : {
227 : SwReader* pRdr;
228 148 : SwRead pRead = StartConvertFrom(rMedium, &pRdr);
229 148 : if (!pRead)
230 0 : return false; // #129881# return if no reader is found
231 148 : tools::SvRef<SotStorage> pStg=pRead->getSotStorageRef(); // #i45333# save sot storage ref in case of recursive calls
232 :
233 148 : m_pDoc->setDocAccTitle(OUString());
234 148 : SfxViewFrame* pFrame1 = SfxViewFrame::GetFirst( this );
235 148 : if (pFrame1)
236 : {
237 0 : vcl::Window* pWindow = &pFrame1->GetWindow();
238 0 : if ( pWindow )
239 : {
240 0 : vcl::Window* pSysWin = pWindow->GetSystemWindow();
241 0 : if ( pSysWin )
242 : {
243 0 : pSysWin->SetAccessibleName(OUString());
244 : }
245 : }
246 : }
247 296 : SwWait aWait( *this, true );
248 :
249 : // Suppress SfxProgress, when we are Embedded
250 148 : SW_MOD()->SetEmbeddedLoadSave(
251 296 : SfxObjectCreateMode::EMBEDDED == GetCreateMode() );
252 :
253 148 : pRdr->GetDoc()->getIDocumentSettingAccess().set(DocumentSettingId::HTML_MODE, ISA(SwWebDocShell));
254 :
255 : // Restore the pool default if reading a saved document.
256 148 : m_pDoc->RemoveAllFormatLanguageDependencies();
257 :
258 148 : sal_uLong nErr = pRdr->Read( *pRead );
259 :
260 : // Maybe put away one old Doc
261 148 : if (m_pDoc != pRdr->GetDoc())
262 : {
263 0 : RemoveLink();
264 0 : m_pDoc = pRdr->GetDoc();
265 :
266 0 : AddLink();
267 :
268 0 : if (!m_xBasePool.is())
269 0 : m_xBasePool = new SwDocStyleSheetPool( *m_pDoc, SfxObjectCreateMode::ORGANIZER == GetCreateMode() );
270 : }
271 :
272 148 : UpdateFontList();
273 148 : InitDrawModelAndDocShell(this, m_pDoc ? m_pDoc->getIDocumentDrawModelAccess().GetDrawModel() : 0);
274 :
275 148 : delete pRdr;
276 :
277 148 : SW_MOD()->SetEmbeddedLoadSave( false );
278 :
279 148 : SetError( nErr, OUString( OSL_LOG_PREFIX ) );
280 148 : bool bOk = !IsError( nErr );
281 :
282 148 : if (bOk && !m_pDoc->IsInLoadAsynchron())
283 : {
284 145 : LoadingFinished();
285 : }
286 :
287 148 : pRead->setSotStorageRef(pStg); // #i45333# save sot storage ref in case of recursive calls
288 :
289 296 : return bOk;
290 : }
291 :
292 : // Saving the Default-Format, Stg present
293 0 : bool SwDocShell::Save()
294 : {
295 : //#i3370# remove quick help to prevent saving of autocorrection suggestions
296 0 : if (m_pView)
297 0 : m_pView->GetEditWin().StopQuickHelp();
298 0 : SwWait aWait( *this, true );
299 :
300 0 : CalcLayoutForOLEObjects(); // format for OLE objets
301 : // #i62875#
302 : // reset compatibility flag <DoNotCaptureDrawObjsOnPage>, if possible
303 0 : if (m_pWrtShell && m_pDoc &&
304 0 : m_pDoc->getIDocumentSettingAccess().get(DocumentSettingId::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE) &&
305 0 : docfunc::AllDrawObjsOnPage(*m_pDoc))
306 : {
307 0 : m_pDoc->getIDocumentSettingAccess().set(DocumentSettingId::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE, false);
308 : }
309 :
310 0 : sal_uLong nErr = ERR_SWG_WRITE_ERROR, nVBWarning = ERRCODE_NONE;
311 0 : if( SfxObjectShell::Save() )
312 : {
313 0 : switch( GetCreateMode() )
314 : {
315 : case SfxObjectCreateMode::INTERNAL:
316 0 : nErr = 0;
317 0 : break;
318 :
319 : case SfxObjectCreateMode::ORGANIZER:
320 : {
321 0 : WriterRef xWrt;
322 0 : ::GetXMLWriter( aEmptyOUStr, GetMedium()->GetBaseURL( true ), xWrt );
323 0 : xWrt->SetOrganizerMode( true );
324 0 : SwWriter aWrt( *GetMedium(), *m_pDoc );
325 0 : nErr = aWrt.Write( xWrt );
326 0 : xWrt->SetOrganizerMode( false );
327 : }
328 0 : break;
329 :
330 : case SfxObjectCreateMode::EMBEDDED:
331 : // Suppress SfxProgress, if we are Embedded
332 0 : SW_MOD()->SetEmbeddedLoadSave( true );
333 : // no break;
334 :
335 : case SfxObjectCreateMode::STANDARD:
336 : case SfxObjectCreateMode::PREVIEW:
337 : default:
338 : {
339 0 : if (m_pDoc->ContainsMSVBasic())
340 : {
341 0 : if( SvtFilterOptions::Get().IsLoadWordBasicStorage() )
342 0 : nVBWarning = GetSaveWarningOfMSVBAStorage( (SfxObjectShell&) (*this) );
343 0 : m_pDoc->SetContainsMSVBasic( false );
344 : }
345 :
346 : // End TableBox Edit!
347 0 : if (m_pWrtShell)
348 0 : m_pWrtShell->EndAllTableBoxEdit();
349 :
350 0 : WriterRef xWrt;
351 0 : ::GetXMLWriter( aEmptyOUStr, GetMedium()->GetBaseURL( true ), xWrt );
352 :
353 0 : bool bLockedView(false);
354 0 : if (m_pWrtShell)
355 : {
356 0 : bLockedView = m_pWrtShell->IsViewLocked();
357 0 : m_pWrtShell->LockView( true ); //lock visible section
358 : }
359 :
360 0 : SwWriter aWrt( *GetMedium(), *m_pDoc );
361 0 : nErr = aWrt.Write( xWrt );
362 :
363 0 : if (m_pWrtShell)
364 0 : m_pWrtShell->LockView( bLockedView );
365 : }
366 0 : break;
367 : }
368 0 : SW_MOD()->SetEmbeddedLoadSave( false );
369 : }
370 0 : SetError( nErr ? nErr : nVBWarning, OUString( OSL_LOG_PREFIX ) );
371 :
372 : SfxViewFrame *const pFrm =
373 0 : (m_pWrtShell) ? m_pWrtShell->GetView().GetViewFrame() : nullptr;
374 0 : if( pFrm )
375 : {
376 0 : pFrm->GetBindings().SetState(SfxBoolItem(SID_DOC_MODIFIED, false));
377 : }
378 0 : return !IsError( nErr );
379 : }
380 :
381 : // Save using the Defaultformat
382 70 : bool SwDocShell::SaveAs( SfxMedium& rMedium )
383 : {
384 70 : SwWait aWait( *this, true );
385 : //#i3370# remove quick help to prevent saving of autocorrection suggestions
386 70 : if (m_pView)
387 66 : m_pView->GetEditWin().StopQuickHelp();
388 :
389 : //#i91811# mod if we have an active margin window, write back the text
390 136 : if (m_pView &&
391 136 : m_pView->GetPostItMgr() &&
392 66 : m_pView->GetPostItMgr()->HasActiveSidebarWin())
393 : {
394 0 : m_pView->GetPostItMgr()->UpdateDataOnActiveSidebarWin();
395 : }
396 :
397 70 : if (m_pDoc->getIDocumentSettingAccess().get(DocumentSettingId::GLOBAL_DOCUMENT) &&
398 0 : !m_pDoc->getIDocumentSettingAccess().get(DocumentSettingId::GLOBAL_DOCUMENT_SAVE_LINKS))
399 0 : RemoveOLEObjects();
400 :
401 : {
402 : // Task 75666 - is the Document imported by our Microsoft-Filters?
403 70 : const SfxFilter* pOldFilter = GetMedium()->GetFilter();
404 134 : if( pOldFilter &&
405 128 : ( pOldFilter->GetUserData() == FILTER_WW8 ||
406 128 : pOldFilter->GetUserData() == "CWW6" ||
407 64 : pOldFilter->GetUserData() == "WW6" ) )
408 : {
409 : // when saving it in our own fileformat, then remove the template
410 : // name from the docinfo.
411 : uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
412 0 : GetModel(), uno::UNO_QUERY_THROW);
413 : uno::Reference<document::XDocumentProperties> xDocProps
414 0 : = xDPS->getDocumentProperties();
415 0 : xDocProps->setTemplateName(OUString());
416 0 : xDocProps->setTemplateURL(OUString());
417 0 : xDocProps->setTemplateDate(::util::DateTime());
418 : }
419 : }
420 :
421 70 : CalcLayoutForOLEObjects(); // format for OLE objets
422 :
423 70 : if (!m_pDoc->GetDBManager()->getEmbeddedName().isEmpty())
424 : {
425 : // We have an embedded data source definition, need to re-store it,
426 : // otherwise relative references will break when the new file is in a
427 : // different directory.
428 1 : uno::Reference<sdb::XDatabaseContext> xDatabaseContext = sdb::DatabaseContext::create(comphelper::getProcessComponentContext());
429 :
430 1 : const INetURLObject& rOldURLObject = GetMedium()->GetURLObject();
431 2 : OUString aURL = "vnd.sun.star.pkg://";
432 1 : aURL += INetURLObject::encode(rOldURLObject.GetMainURL(INetURLObject::DECODE_WITH_CHARSET), INetURLObject::PART_AUTHORITY, INetURLObject::ENCODE_ALL);
433 1 : aURL += "/" + INetURLObject::encode(m_pDoc->GetDBManager()->getEmbeddedName(), INetURLObject::PART_FPATH, INetURLObject::ENCODE_ALL);
434 :
435 2 : uno::Reference<sdb::XDocumentDataSource> xDataSource(xDatabaseContext->getByName(aURL), uno::UNO_QUERY);
436 2 : uno::Reference<frame::XStorable> xStorable(xDataSource->getDatabaseDocument(), uno::UNO_QUERY);
437 2 : SwDBManager::StoreEmbeddedDataSource(xStorable, rMedium.GetOutputStorage(), m_pDoc->GetDBManager()->getEmbeddedName(), rMedium.GetName());
438 : }
439 :
440 : // #i62875#
441 : // reset compatibility flag <DoNotCaptureDrawObjsOnPage>, if possible
442 136 : if (m_pWrtShell &&
443 70 : m_pDoc->getIDocumentSettingAccess().get(DocumentSettingId::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE) &&
444 0 : docfunc::AllDrawObjsOnPage(*m_pDoc))
445 : {
446 0 : m_pDoc->getIDocumentSettingAccess().set(DocumentSettingId::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE, false);
447 : }
448 :
449 70 : sal_uLong nErr = ERR_SWG_WRITE_ERROR, nVBWarning = ERRCODE_NONE;
450 140 : uno::Reference < embed::XStorage > xStor = rMedium.GetOutputStorage();
451 70 : if( SfxObjectShell::SaveAs( rMedium ) )
452 : {
453 70 : if( GetDoc()->getIDocumentSettingAccess().get(DocumentSettingId::GLOBAL_DOCUMENT) && !ISA( SwGlobalDocShell ) )
454 : {
455 : // This is to set the correct class id if SaveAs is
456 : // called from SwDoc::SplitDoc to save a normal doc as
457 : // global doc. In this case, SaveAs is called at a
458 : // normal doc shell, therefore, SfxInplaceObject::SaveAs
459 : // will set the wrong class id.
460 0 : SvGlobalName aClassName;
461 : // The document is closed explicitly, but using SfxObjectShellLock is still more correct here
462 : SfxObjectShellLock xDocSh =
463 0 : new SwGlobalDocShell( SfxObjectCreateMode::INTERNAL );
464 : // the global document can not be a template
465 0 : xDocSh->SetupStorage( xStor, SotStorage::GetVersion( xStor ), false );
466 0 : xDocSh->DoClose();
467 : }
468 :
469 70 : if (m_pDoc->ContainsMSVBasic())
470 : {
471 0 : if( SvtFilterOptions::Get().IsLoadWordBasicStorage() )
472 0 : nVBWarning = GetSaveWarningOfMSVBAStorage( (SfxObjectShell&) *this );
473 0 : m_pDoc->SetContainsMSVBasic( false );
474 : }
475 :
476 : // End TableBox Edit!
477 70 : if (m_pWrtShell)
478 66 : m_pWrtShell->EndAllTableBoxEdit();
479 :
480 : // Remember and preserve Modified-Flag without calling the Link
481 : // (for OLE; after Statement from MM)
482 70 : bool bIsModified = m_pDoc->getIDocumentState().IsModified();
483 70 : m_pDoc->GetIDocumentUndoRedo().LockUndoNoModifiedPosition();
484 70 : Link<> aOldOLELnk( m_pDoc->GetOle2Link() );
485 70 : m_pDoc->SetOle2Link( Link<>() );
486 :
487 : // Suppress SfxProgress when we are Embedded
488 70 : SW_MOD()->SetEmbeddedLoadSave(
489 140 : SfxObjectCreateMode::EMBEDDED == GetCreateMode() );
490 :
491 70 : WriterRef xWrt;
492 70 : ::GetXMLWriter( aEmptyOUStr, rMedium.GetBaseURL( true ), xWrt );
493 :
494 70 : bool bLockedView(false);
495 70 : if (m_pWrtShell)
496 : {
497 66 : bLockedView = m_pWrtShell->IsViewLocked();
498 66 : m_pWrtShell->LockView( true ); //lock visible section
499 : }
500 :
501 140 : SwWriter aWrt( rMedium, *m_pDoc );
502 70 : nErr = aWrt.Write( xWrt );
503 :
504 70 : if (m_pWrtShell)
505 66 : m_pWrtShell->LockView( bLockedView );
506 :
507 70 : if( bIsModified )
508 : {
509 27 : m_pDoc->getIDocumentState().SetModified();
510 27 : m_pDoc->GetIDocumentUndoRedo().UnLockUndoNoModifiedPosition();
511 : }
512 70 : m_pDoc->SetOle2Link( aOldOLELnk );
513 :
514 70 : SW_MOD()->SetEmbeddedLoadSave( false );
515 :
516 : // Increase RSID
517 140 : m_pDoc->setRsid( m_pDoc->getRsid() );
518 : }
519 70 : SetError( nErr ? nErr : nVBWarning, OUString( OSL_LOG_PREFIX ) );
520 :
521 140 : return !IsError( nErr );
522 : }
523 :
524 : // Save all Formats
525 48 : static SwSrcView* lcl_GetSourceView( SwDocShell* pSh )
526 : {
527 : // are we in SourceView?
528 48 : SfxViewFrame* pVFrame = SfxViewFrame::GetFirst( pSh );
529 48 : SfxViewShell* pViewShell = pVFrame ? pVFrame->GetViewShell() : 0;
530 48 : return PTR_CAST( SwSrcView, pViewShell);
531 : }
532 :
533 48 : bool SwDocShell::ConvertTo( SfxMedium& rMedium )
534 : {
535 48 : const SfxFilter* pFlt = rMedium.GetFilter();
536 48 : if( !pFlt )
537 0 : return false;
538 :
539 48 : WriterRef xWriter;
540 48 : SwReaderWriter::GetWriter( pFlt->GetUserData(), rMedium.GetBaseURL( true ), xWriter );
541 48 : if( !xWriter.Is() )
542 : { // Filter not available
543 : ScopedVclPtr<InfoBox>::Create( nullptr,
544 0 : SW_RESSTR(STR_DLLNOTFOUND) )->Execute();
545 0 : return false;
546 : }
547 :
548 : //#i3370# remove quick help to prevent saving of autocorrection suggestions
549 48 : if (m_pView)
550 45 : m_pView->GetEditWin().StopQuickHelp();
551 :
552 : //#i91811# mod if we have an active margin window, write back the text
553 93 : if (m_pView &&
554 93 : m_pView->GetPostItMgr() &&
555 45 : m_pView->GetPostItMgr()->HasActiveSidebarWin())
556 : {
557 0 : m_pView->GetPostItMgr()->UpdateDataOnActiveSidebarWin();
558 : }
559 :
560 48 : sal_uLong nVBWarning = 0;
561 :
562 48 : if (m_pDoc->ContainsMSVBasic())
563 : {
564 0 : bool bSave = pFlt->GetUserData() == "CWW8"
565 0 : && SvtFilterOptions::Get().IsLoadWordBasicStorage();
566 :
567 0 : if ( bSave )
568 : {
569 0 : tools::SvRef<SotStorage> xStg = new SotStorage( rMedium.GetOutStream(), false );
570 : OSL_ENSURE( !xStg->GetError(), "No storage available for storing VBA macros!" );
571 0 : if ( !xStg->GetError() )
572 : {
573 0 : nVBWarning = SaveOrDelMSVBAStorage( (SfxObjectShell&) *this, *xStg, bSave, OUString("Macros") );
574 0 : xStg->Commit();
575 0 : m_pDoc->SetContainsMSVBasic( true );
576 0 : }
577 : }
578 : }
579 :
580 : // End TableBox Edit!
581 48 : if (m_pWrtShell)
582 45 : m_pWrtShell->EndAllTableBoxEdit();
583 :
584 48 : if( pFlt->GetUserData() == "HTML" )
585 : {
586 : #if HAVE_FEATURE_SCRIPTING
587 15 : SvxHtmlOptions& rHtmlOpt = SvxHtmlOptions::Get();
588 15 : if( !rHtmlOpt.IsStarBasic() && rHtmlOpt.IsStarBasicWarning() && HasBasic() )
589 : {
590 15 : uno::Reference< XLibraryContainer > xLibCont(GetBasicContainer(), UNO_QUERY);
591 30 : uno::Reference< XNameAccess > xLib;
592 30 : Sequence<OUString> aNames = xLibCont->getElementNames();
593 15 : const OUString* pNames = aNames.getConstArray();
594 30 : for(sal_Int32 nLib = 0; nLib < aNames.getLength(); nLib++)
595 : {
596 15 : Any aLib = xLibCont->getByName(pNames[nLib]);
597 15 : aLib >>= xLib;
598 15 : if(xLib.is())
599 : {
600 15 : Sequence<OUString> aModNames = xLib->getElementNames();
601 15 : if(aModNames.getLength())
602 : {
603 0 : SetError(WARN_SWG_HTML_NO_MACROS, OUString( OSL_LOG_PREFIX ) );
604 0 : break;
605 15 : }
606 : }
607 30 : }
608 : }
609 : #endif
610 : }
611 :
612 : // #i76360# Update document statistics
613 48 : if ( !rMedium.IsSkipImages() )
614 45 : m_pDoc->getIDocumentStatistics().UpdateDocStat( false, true );
615 :
616 48 : CalcLayoutForOLEObjects(); // format for OLE objets
617 : // #i62875#
618 : // reset compatibility flag <DoNotCaptureDrawObjsOnPage>, if possible
619 93 : if (m_pWrtShell &&
620 48 : m_pDoc->getIDocumentSettingAccess().get(DocumentSettingId::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE) &&
621 0 : docfunc::AllDrawObjsOnPage(*m_pDoc))
622 : {
623 0 : m_pDoc->getIDocumentSettingAccess().set(DocumentSettingId::DO_NOT_CAPTURE_DRAW_OBJS_ON_PAGE, false);
624 : }
625 :
626 80 : if( xWriter->IsStgWriter() &&
627 64 : ( pFlt->GetUserData() == FILTER_XML ||
628 64 : pFlt->GetUserData() == FILTER_XMLV ||
629 32 : pFlt->GetUserData() == FILTER_XMLVW ) )
630 : {
631 : // determine the own Type
632 0 : sal_uInt8 nMyType = 0;
633 0 : if( ISA( SwWebDocShell) )
634 0 : nMyType = 1;
635 0 : else if( ISA( SwGlobalDocShell) )
636 0 : nMyType = 2;
637 :
638 : // determine the desired Type
639 0 : sal_uInt8 nSaveType = 0;
640 0 : SotClipboardFormatId nSaveClipId = pFlt->GetFormat();
641 0 : if( SotClipboardFormatId::STARWRITERWEB_8 == nSaveClipId ||
642 0 : SotClipboardFormatId::STARWRITERWEB_60 == nSaveClipId ||
643 0 : SotClipboardFormatId::STARWRITERWEB_50 == nSaveClipId ||
644 : SotClipboardFormatId::STARWRITERWEB_40 == nSaveClipId )
645 0 : nSaveType = 1;
646 0 : else if( SotClipboardFormatId::STARWRITERGLOB_8 == nSaveClipId ||
647 0 : SotClipboardFormatId::STARWRITERGLOB_8_TEMPLATE == nSaveClipId ||
648 0 : SotClipboardFormatId::STARWRITERGLOB_60 == nSaveClipId ||
649 0 : SotClipboardFormatId::STARWRITERGLOB_50 == nSaveClipId ||
650 : SotClipboardFormatId::STARWRITERGLOB_40 == nSaveClipId )
651 0 : nSaveType = 2;
652 :
653 : // Change Flags of the Document accordingly
654 0 : bool bIsHTMLModeSave = GetDoc()->getIDocumentSettingAccess().get(DocumentSettingId::HTML_MODE);
655 0 : bool bIsGlobalDocSave = GetDoc()->getIDocumentSettingAccess().get(DocumentSettingId::GLOBAL_DOCUMENT);
656 0 : bool bIsGlblDocSaveLinksSave = GetDoc()->getIDocumentSettingAccess().get(DocumentSettingId::GLOBAL_DOCUMENT_SAVE_LINKS);
657 0 : if( nMyType != nSaveType )
658 : {
659 0 : GetDoc()->getIDocumentSettingAccess().set(DocumentSettingId::HTML_MODE, 1 == nSaveType);
660 0 : GetDoc()->getIDocumentSettingAccess().set(DocumentSettingId::GLOBAL_DOCUMENT, 2 == nSaveType);
661 0 : if( 2 != nSaveType )
662 0 : GetDoc()->getIDocumentSettingAccess().set(DocumentSettingId::GLOBAL_DOCUMENT_SAVE_LINKS, false);
663 : }
664 :
665 : // if the target format is storage based, then the output storage must be already created
666 0 : if ( rMedium.IsStorage() )
667 : {
668 : // set MediaType on target storage
669 : // (MediaType will be queried during SaveAs)
670 : try
671 : {
672 : // TODO/MBA: testing
673 0 : uno::Reference < beans::XPropertySet > xSet( rMedium.GetStorage(), uno::UNO_QUERY );
674 0 : if ( xSet.is() )
675 0 : xSet->setPropertyValue("MediaType", uno::makeAny( OUString( SotExchange::GetFormatMimeType( nSaveClipId ) ) ) );
676 : }
677 0 : catch (const uno::Exception&)
678 : {
679 : }
680 : }
681 :
682 : // Now normally save the Document
683 0 : bool bRet = SaveAs( rMedium );
684 :
685 0 : if( nMyType != nSaveType )
686 : {
687 0 : GetDoc()->getIDocumentSettingAccess().set(DocumentSettingId::HTML_MODE, bIsHTMLModeSave );
688 0 : GetDoc()->getIDocumentSettingAccess().set(DocumentSettingId::GLOBAL_DOCUMENT, bIsGlobalDocSave);
689 0 : GetDoc()->getIDocumentSettingAccess().set(DocumentSettingId::GLOBAL_DOCUMENT_SAVE_LINKS, bIsGlblDocSaveLinksSave);
690 : }
691 :
692 0 : return bRet;
693 : }
694 :
695 48 : if( pFlt->GetUserData() == FILTER_TEXT_DLG &&
696 0 : (m_pWrtShell || !::lcl_GetSourceView(this)))
697 : {
698 0 : SwAsciiOptions aOpt;
699 0 : OUString sItemOpt;
700 : const SfxItemSet* pSet;
701 : const SfxPoolItem* pItem;
702 0 : if( 0 != ( pSet = rMedium.GetItemSet() ) )
703 : {
704 0 : if( SfxItemState::SET == pSet->GetItemState( SID_FILE_FILTEROPTIONS,
705 0 : true, &pItem ) )
706 0 : sItemOpt = static_cast<const SfxStringItem*>(pItem)->GetValue();
707 : }
708 0 : if(!sItemOpt.isEmpty())
709 0 : aOpt.ReadUserData( sItemOpt );
710 :
711 0 : xWriter->SetAsciiOptions( aOpt );
712 : }
713 :
714 : // Suppress SfxProgress when we are Embedded
715 48 : SW_MOD()->SetEmbeddedLoadSave(
716 96 : SfxObjectCreateMode::EMBEDDED == GetCreateMode());
717 :
718 : // Span Context in order to suppress the Selection's View
719 : sal_uLong nErrno;
720 96 : const OUString aFileName( rMedium.GetName() );
721 :
722 : // No View, so the whole Document!
723 48 : if (m_pWrtShell && !Application::IsHeadlessModeEnabled())
724 : {
725 0 : SwWait aWait( *this, true );
726 : // #i106906#
727 0 : const bool bFormerLockView = m_pWrtShell->IsViewLocked();
728 0 : m_pWrtShell->LockView( true );
729 0 : m_pWrtShell->StartAllAction();
730 0 : m_pWrtShell->Push();
731 0 : SwWriter aWrt( rMedium, *m_pWrtShell, true );
732 0 : nErrno = aWrt.Write( xWriter, &aFileName );
733 : //JP 16.05.97: In case the SFX revokes the View while saving
734 0 : if (m_pWrtShell)
735 : {
736 0 : m_pWrtShell->Pop(false);
737 0 : m_pWrtShell->EndAllAction();
738 : // #i106906#
739 0 : m_pWrtShell->LockView( bFormerLockView );
740 0 : }
741 : }
742 : else
743 : {
744 : // are we in SourceView?
745 48 : SwSrcView* pSrcView = ::lcl_GetSourceView( this );
746 48 : if( pSrcView )
747 : {
748 0 : pSrcView->SaveContentTo(rMedium);
749 0 : nErrno = 0;
750 : }
751 : else
752 : {
753 48 : SwWriter aWrt( rMedium, *m_pDoc );
754 48 : nErrno = aWrt.Write( xWriter, &aFileName );
755 : }
756 : }
757 :
758 48 : SW_MOD()->SetEmbeddedLoadSave( false );
759 48 : SetError( nErrno ? nErrno : nVBWarning, OUString( OSL_LOG_PREFIX ) );
760 48 : if( !rMedium.IsStorage() )
761 48 : rMedium.CloseOutStream();
762 :
763 96 : return !IsError( nErrno );
764 : }
765 :
766 : // Hands off
767 : // do not yet activate, must deliver TRUE
768 156 : bool SwDocShell::SaveCompleted( const uno::Reference < embed::XStorage >& xStor )
769 : {
770 156 : bool bRet = SfxObjectShell::SaveCompleted( xStor );
771 156 : if( bRet )
772 : {
773 : // Do not decide until here, whether Saving was successful or not
774 156 : if( IsModified() )
775 3 : m_pDoc->getIDocumentState().SetModified();
776 : else
777 153 : m_pDoc->getIDocumentState().ResetModified();
778 : }
779 :
780 156 : if (m_pOLEChildList)
781 : {
782 0 : bool bResetModified = IsEnableSetModified();
783 0 : if( bResetModified )
784 0 : EnableSetModified( false );
785 :
786 0 : uno::Sequence < OUString > aNames = m_pOLEChildList->GetObjectNames();
787 0 : for( sal_Int32 n = aNames.getLength(); n; n-- )
788 : {
789 0 : if (!m_pOLEChildList->MoveEmbeddedObject(aNames[n-1], GetEmbeddedObjectContainer()))
790 : {
791 : OSL_FAIL("Copying of objects didn't work!" );
792 : }
793 : }
794 :
795 0 : DELETEZ(m_pOLEChildList);
796 0 : if( bResetModified )
797 0 : EnableSetModified( true );
798 : }
799 156 : return bRet;
800 : }
801 :
802 : // Draw()-Override for OLE2 (Sfx)
803 347 : void SwDocShell::Draw( OutputDevice* pDev, const JobSetup& rSetup,
804 : sal_uInt16 nAspect )
805 : {
806 : //fix #25341# Draw should not affect the Modified
807 : bool bResetModified;
808 347 : if ( (bResetModified = IsEnableSetModified()) )
809 281 : EnableSetModified( false );
810 :
811 : // When there is a JobSetup connected to the Document, we copy it to
812 : // reconnect it after PrtOle2. We don't use an empty JobSetup because
813 : // that would only lead to questionable results after expensive
814 : // reformatting (Preview!)
815 347 : JobSetup *pOrig = 0;
816 347 : if ( !rSetup.GetPrinterName().isEmpty() && ASPECT_THUMBNAIL != nAspect )
817 : {
818 0 : pOrig = const_cast<JobSetup*>(m_pDoc->getIDocumentDeviceAccess().getJobsetup());
819 0 : if( pOrig ) // then we copy that
820 0 : pOrig = new JobSetup( *pOrig );
821 0 : m_pDoc->getIDocumentDeviceAccess().setJobsetup( rSetup );
822 : }
823 :
824 : Rectangle aRect( nAspect == ASPECT_THUMBNAIL ?
825 347 : GetVisArea( nAspect ) : GetVisArea( ASPECT_CONTENT ) );
826 :
827 347 : pDev->Push();
828 347 : pDev->SetFillColor();
829 347 : pDev->SetLineColor();
830 347 : pDev->SetBackground();
831 347 : const bool bWeb = this->ISA(SwWebDocShell);
832 347 : SwPrintData aOpts;
833 347 : SwViewShell::PrtOle2(m_pDoc, SW_MOD()->GetUsrPref(bWeb), aOpts, pDev, aRect);
834 347 : pDev->Pop();
835 :
836 347 : if( pOrig )
837 : {
838 0 : m_pDoc->getIDocumentDeviceAccess().setJobsetup( *pOrig );
839 0 : delete pOrig;
840 : }
841 347 : if ( bResetModified )
842 281 : EnableSetModified( true );
843 347 : }
844 :
845 507 : void SwDocShell::SetVisArea( const Rectangle &rRect )
846 : {
847 507 : Rectangle aRect( rRect );
848 507 : if (m_pView)
849 : {
850 0 : Size aSz( m_pView->GetDocSz() );
851 0 : aSz.Width() += DOCUMENTBORDER; aSz.Height() += DOCUMENTBORDER;
852 0 : long nMoveX = 0, nMoveY = 0;
853 0 : if ( aRect.Right() > aSz.Width() )
854 0 : nMoveX = aSz.Width() - aRect.Right();
855 0 : if ( aRect.Bottom() > aSz.Height() )
856 0 : nMoveY = aSz.Height() - aRect.Bottom();
857 0 : aRect.Move( nMoveX, nMoveY );
858 0 : nMoveX = aRect.Left() < 0 ? -aRect.Left() : 0;
859 0 : nMoveY = aRect.Top() < 0 ? -aRect.Top() : 0;
860 0 : aRect.Move( nMoveX, nMoveY );
861 :
862 : // Calls SfxInPlaceObject::SetVisArea()!
863 0 : m_pView->SetVisArea( aRect, true );
864 : }
865 : else
866 507 : SfxObjectShell::SetVisArea( aRect );
867 507 : }
868 :
869 13195 : Rectangle SwDocShell::GetVisArea( sal_uInt16 nAspect ) const
870 : {
871 13195 : if ( nAspect == ASPECT_THUMBNAIL )
872 : {
873 : // Preview: set VisArea to the first page.
874 264 : SwNodeIndex aIdx( m_pDoc->GetNodes().GetEndOfExtras(), 1 );
875 264 : SwContentNode* pNd = m_pDoc->GetNodes().GoNext( &aIdx );
876 :
877 264 : const SwRect aPageRect = pNd->FindPageFrmRect( false, 0, false );
878 264 : return aPageRect.SVRect();
879 : }
880 12931 : return SfxObjectShell::GetVisArea( nAspect );
881 : }
882 :
883 2346 : Printer *SwDocShell::GetDocumentPrinter()
884 : {
885 2346 : return m_pDoc->getIDocumentDeviceAccess().getPrinter( false );
886 : }
887 :
888 685 : OutputDevice* SwDocShell::GetDocumentRefDev()
889 : {
890 685 : return m_pDoc->getIDocumentDeviceAccess().getReferenceDevice( false );
891 : }
892 :
893 0 : void SwDocShell::OnDocumentPrinterChanged( Printer * pNewPrinter )
894 : {
895 0 : if ( pNewPrinter )
896 0 : GetDoc()->getIDocumentDeviceAccess().setJobsetup( pNewPrinter->GetJobSetup() );
897 : else
898 0 : GetDoc()->getIDocumentDeviceAccess().setPrinter( 0, true, true );
899 0 : }
900 :
901 51 : sal_uLong SwDocShell::GetMiscStatus() const
902 : {
903 51 : return SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE;
904 : }
905 :
906 : // #i20883# Digital Signatures and Encryption
907 0 : HiddenInformation SwDocShell::GetHiddenInformationState( HiddenInformation nStates )
908 : {
909 : // get global state like HiddenInformation::DOCUMENTVERSIONS
910 0 : HiddenInformation nState = SfxObjectShell::GetHiddenInformationState( nStates );
911 :
912 0 : if ( nStates & HiddenInformation::RECORDEDCHANGES )
913 : {
914 0 : if ( !GetDoc()->getIDocumentRedlineAccess().GetRedlineTable().empty() )
915 0 : nState |= HiddenInformation::RECORDEDCHANGES;
916 : }
917 0 : if ( nStates & HiddenInformation::NOTES )
918 : {
919 : OSL_ENSURE( GetWrtShell(), "No SwWrtShell, no information" );
920 0 : if ( GetWrtShell() )
921 : {
922 0 : SwFieldType* pType = GetWrtShell()->GetFieldType( RES_POSTITFLD, aEmptyOUStr );
923 0 : SwIterator<SwFormatField,SwFieldType> aIter( *pType );
924 0 : SwFormatField* pFirst = aIter.First();
925 0 : while( pFirst )
926 : {
927 0 : if( pFirst->GetTextField() && pFirst->IsFieldInDoc() )
928 : {
929 0 : nState |= HiddenInformation::NOTES;
930 0 : break;
931 : }
932 0 : pFirst = aIter.Next();
933 0 : }
934 : }
935 : }
936 :
937 0 : return nState;
938 : }
939 :
940 1657 : void SwDocShell::GetState(SfxItemSet& rSet)
941 : {
942 1657 : SfxWhichIter aIter(rSet);
943 1657 : sal_uInt16 nWhich = aIter.FirstWhich();
944 :
945 5946 : while (nWhich)
946 : {
947 2632 : switch (nWhich)
948 : {
949 : case SID_PRINTPREVIEW:
950 : {
951 1318 : bool bDisable = IsInPlaceActive();
952 : // Disable "multiple layout"
953 1318 : if ( !bDisable )
954 : {
955 1318 : SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(this);
956 3943 : while (pTmpFrm) // Look for Preview
957 : {
958 2636 : if ( PTR_CAST(SwView, pTmpFrm->GetViewShell()) &&
959 1318 : static_cast<SwView*>(pTmpFrm->GetViewShell())->GetWrtShell().GetViewOptions()->getBrowseMode() )
960 : {
961 11 : bDisable = true;
962 11 : break;
963 : }
964 1307 : pTmpFrm = SfxViewFrame::GetNext(*pTmpFrm, this);
965 : }
966 : }
967 : // End of disabled "multiple layout"
968 1318 : if ( bDisable )
969 11 : rSet.DisableItem( SID_PRINTPREVIEW );
970 : else
971 : {
972 1307 : SfxBoolItem aBool( SID_PRINTPREVIEW, false );
973 1307 : if( PTR_CAST( SwPagePreview, SfxViewShell::Current()) )
974 0 : aBool.SetValue( true );
975 1307 : rSet.Put( aBool );
976 : }
977 : }
978 1318 : break;
979 : case SID_SOURCEVIEW:
980 : {
981 1 : SfxViewShell* pCurrView = GetView() ? static_cast<SfxViewShell*>(GetView())
982 1 : : SfxViewShell::Current();
983 1 : bool bSourceView = 0 != PTR_CAST(SwSrcView, pCurrView);
984 1 : rSet.Put(SfxBoolItem(SID_SOURCEVIEW, bSourceView));
985 : }
986 1 : break;
987 : case SID_HTML_MODE:
988 0 : rSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(this)));
989 0 : break;
990 :
991 : case FN_ABSTRACT_STARIMPRESS:
992 : case FN_OUTLINE_TO_IMPRESS:
993 : {
994 0 : SvtModuleOptions aMOpt;
995 0 : if ( !aMOpt.IsImpress() )
996 0 : rSet.DisableItem( nWhich );
997 : }
998 : /* no break here */
999 : case FN_ABSTRACT_NEWDOC:
1000 : case FN_OUTLINE_TO_CLIPBOARD:
1001 : {
1002 0 : if ( GetDoc()->GetNodes().GetOutLineNds().empty() )
1003 0 : rSet.DisableItem( nWhich );
1004 : }
1005 0 : break;
1006 : case SID_BROWSER_MODE:
1007 : case FN_PRINT_LAYOUT:
1008 : {
1009 0 : bool bState = GetDoc()->getIDocumentSettingAccess().get(DocumentSettingId::BROWSE_MODE);
1010 0 : if(FN_PRINT_LAYOUT == nWhich)
1011 0 : bState = !bState;
1012 0 : rSet.Put( SfxBoolItem( nWhich, bState));
1013 : }
1014 0 : break;
1015 :
1016 : case FN_NEW_GLOBAL_DOC:
1017 0 : if ( ISA(SwGlobalDocShell) )
1018 0 : rSet.DisableItem( nWhich );
1019 0 : break;
1020 :
1021 : case FN_NEW_HTML_DOC:
1022 0 : if( ISA( SwWebDocShell ) )
1023 0 : rSet.DisableItem( nWhich );
1024 0 : break;
1025 :
1026 : case FN_OPEN_FILE:
1027 1313 : if( ISA( SwWebDocShell ) )
1028 0 : rSet.DisableItem( nWhich );
1029 1313 : break;
1030 :
1031 : case SID_ATTR_YEAR2000:
1032 : {
1033 0 : const SvNumberFormatter* pFormatr = m_pDoc->GetNumberFormatter(false);
1034 : rSet.Put( SfxUInt16Item( nWhich,
1035 : static_cast< sal_uInt16 >(
1036 0 : pFormatr ? pFormatr->GetYear2000()
1037 0 : : ::utl::MiscCfg().GetYear2000() )));
1038 : }
1039 0 : break;
1040 : case SID_ATTR_CHAR_FONTLIST:
1041 : {
1042 0 : rSet.Put( SvxFontListItem(m_pFontList, SID_ATTR_CHAR_FONTLIST) );
1043 : }
1044 0 : break;
1045 : case SID_MAIL_PREPAREEXPORT:
1046 : {
1047 : //check if linked content or possibly hidden content is available
1048 : //m_pDoc->UpdateFields( NULL, false );
1049 0 : sfx2::LinkManager& rLnkMgr = m_pDoc->getIDocumentLinksAdministration().GetLinkManager();
1050 0 : const ::sfx2::SvBaseLinks& rLnks = rLnkMgr.GetLinks();
1051 0 : bool bRet = false;
1052 0 : if( !rLnks.empty() )
1053 0 : bRet = true;
1054 : else
1055 : {
1056 : //sections with hidden flag, hidden character attribute, hidden paragraph/text or conditional text fields
1057 0 : bRet = m_pDoc->HasInvisibleContent();
1058 : }
1059 0 : rSet.Put( SfxBoolItem( nWhich, bRet ) );
1060 : }
1061 0 : break;
1062 :
1063 : default: OSL_ENSURE(false,"You cannot get here!");
1064 :
1065 : }
1066 2632 : nWhich = aIter.NextWhich();
1067 1657 : }
1068 1657 : }
1069 :
1070 : // OLE-Hdls
1071 1729012 : IMPL_LINK( SwDocShell, Ole2ModifiedHdl, void *, p )
1072 : {
1073 : // the Status is handed over from Doc (see doc.cxx)
1074 : // Bit 0: -> old state
1075 : // Bit 1: -> new state
1076 864506 : sal_IntPtr nStatus = reinterpret_cast<sal_IntPtr>(p);
1077 864506 : if( IsEnableSetModified() )
1078 102804 : SetModified( (nStatus & 2) != 0 );
1079 864506 : return 0;
1080 : }
1081 :
1082 : // return Pool here, because virtual
1083 90041 : SfxStyleSheetBasePool* SwDocShell::GetStyleSheetPool()
1084 : {
1085 90041 : return m_xBasePool.get();
1086 : }
1087 :
1088 0 : sfx2::StyleManager* SwDocShell::GetStyleManager()
1089 : {
1090 0 : return m_pStyleManager.get();
1091 : }
1092 :
1093 8191 : void SwDocShell::SetView(SwView* pVw)
1094 : {
1095 8191 : SetViewShell_Impl(pVw);
1096 8191 : m_pView = pVw;
1097 8191 : if (m_pView)
1098 5434 : m_pWrtShell = &m_pView->GetWrtShell();
1099 : else
1100 2757 : m_pWrtShell = 0;
1101 8191 : }
1102 :
1103 0 : void SwDocShell::PrepareReload()
1104 : {
1105 0 : }
1106 :
1107 : // #i59688#
1108 : // linked graphics are now loaded on demand.
1109 : // Thus, loading of linked graphics no longer needed and necessary for
1110 : // the load of document being finished.
1111 435 : void SwDocShell::LoadingFinished()
1112 : {
1113 : // #i38810#
1114 : // Original fix fails after integration of cws xmlsec11:
1115 : // interface <SfxObjectShell::EnableSetModified(..)> no longer works, because
1116 : // <SfxObjectShell::FinishedLoading(..)> doesn't care about its status and
1117 : // enables the document modification again.
1118 : // Thus, manuell modify the document, if its modified and its links are updated
1119 : // before <FinishedLoading(..)> is called.
1120 435 : const bool bHasDocToStayModified( m_pDoc->getIDocumentState().IsModified() && m_pDoc->getIDocumentLinksAdministration().LinksUpdated() );
1121 :
1122 435 : FinishedLoading( SfxLoadedFlags::ALL );
1123 435 : SfxViewFrame* pVFrame = SfxViewFrame::GetFirst(this);
1124 435 : if(pVFrame)
1125 : {
1126 0 : SfxViewShell* pShell = pVFrame->GetViewShell();
1127 0 : if(PTR_CAST(SwSrcView, pShell))
1128 0 : static_cast<SwSrcView*>(pShell)->Load(this);
1129 : }
1130 :
1131 : // #i38810#
1132 435 : if ( bHasDocToStayModified && !m_pDoc->getIDocumentState().IsModified() )
1133 : {
1134 0 : m_pDoc->getIDocumentState().SetModified();
1135 : }
1136 435 : }
1137 :
1138 : // a Transfer is cancelled (is called from SFX)
1139 2699 : void SwDocShell::CancelTransfers()
1140 : {
1141 : // Cancel all links from LinkManager
1142 2699 : m_pDoc->getIDocumentLinksAdministration().GetLinkManager().CancelTransfers();
1143 2699 : SfxObjectShell::CancelTransfers();
1144 2699 : }
1145 :
1146 1103 : SwEditShell * SwDocShell::GetEditShell()
1147 : {
1148 1103 : return m_pWrtShell;
1149 : }
1150 :
1151 0 : SwFEShell* SwDocShell::GetFEShell()
1152 : {
1153 0 : return m_pWrtShell;
1154 : }
1155 :
1156 0 : void SwDocShell::RemoveOLEObjects()
1157 : {
1158 0 : SwIterator<SwContentNode,SwFormatColl> aIter( *m_pDoc->GetDfltGrfFormatColl() );
1159 0 : for( SwContentNode* pNd = aIter.First(); pNd; pNd = aIter.Next() )
1160 : {
1161 0 : SwOLENode* pOLENd = pNd->GetOLENode();
1162 0 : if( pOLENd && ( pOLENd->IsOLEObjectDeleted() ||
1163 0 : pOLENd->IsInGlobalDocSection() ) )
1164 : {
1165 0 : if (!m_pOLEChildList)
1166 0 : m_pOLEChildList = new comphelper::EmbeddedObjectContainer;
1167 :
1168 0 : OUString aObjName = pOLENd->GetOLEObj().GetCurrentPersistName();
1169 0 : GetEmbeddedObjectContainer().MoveEmbeddedObject( aObjName, *m_pOLEChildList );
1170 : }
1171 0 : }
1172 0 : }
1173 :
1174 : // When a document is loaded, SwDoc::PrtOLENotify is called to update
1175 : // the sizes of math objects. However, for objects that do not have a
1176 : // SwFrm at this time, only a flag is set (bIsOLESizeInvalid) and the
1177 : // size change takes place later, while calculating the layout in the
1178 : // idle handler. If this document is saved now, it is saved with invalid
1179 : // sizes. For this reason, the layout has to be calculated before a document is
1180 : // saved, but of course only id there are OLE objects with bOLESizeInvalid set.
1181 118 : void SwDocShell::CalcLayoutForOLEObjects()
1182 : {
1183 118 : if (!m_pWrtShell)
1184 125 : return;
1185 :
1186 111 : SwIterator<SwContentNode,SwFormatColl> aIter( *m_pDoc->GetDfltGrfFormatColl() );
1187 141 : for( SwContentNode* pNd = aIter.First(); pNd; pNd = aIter.Next() )
1188 : {
1189 30 : SwOLENode* pOLENd = pNd->GetOLENode();
1190 30 : if( pOLENd && pOLENd->IsOLESizeInvalid() )
1191 : {
1192 0 : m_pWrtShell->CalcLayout();
1193 0 : break;
1194 : }
1195 111 : }
1196 : }
1197 :
1198 : // #i42634# Overwrites SfxObjectShell::UpdateLinks
1199 : // This new function is necessary to trigger update of links in docs
1200 : // read by the binary filter:
1201 1959 : void SwDocShell::UpdateLinks()
1202 : {
1203 1959 : GetDoc()->getIDocumentLinksAdministration().UpdateLinks(true);
1204 : // #i50703# Update footnote numbers
1205 1959 : SwTextFootnote::SetUniqueSeqRefNo( *GetDoc() );
1206 1959 : SwNodeIndex aTmp( GetDoc()->GetNodes() );
1207 1959 : GetDoc()->GetFootnoteIdxs().UpdateFootnote( aTmp );
1208 1959 : }
1209 :
1210 : uno::Reference< frame::XController >
1211 0 : SwDocShell::GetController()
1212 : {
1213 0 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > aRet;
1214 : // #i82346# No view in page preview
1215 0 : if ( GetView() )
1216 0 : aRet = GetView()->GetController();
1217 0 : return aRet;
1218 : }
1219 :
1220 : static const char* s_EventNames[] =
1221 : {
1222 : "OnPageCountChange",
1223 : "OnMailMerge",
1224 : "OnMailMergeFinished",
1225 : "OnFieldMerge",
1226 : "OnFieldMergeFinished",
1227 : "OnLayoutFinished"
1228 : };
1229 : static sal_Int32 const s_nEvents(sizeof(s_EventNames)/sizeof(s_EventNames[0]));
1230 :
1231 69 : Sequence< OUString > SwDocShell::GetEventNames()
1232 : {
1233 69 : Sequence< OUString > aRet = SfxObjectShell::GetEventNames();
1234 69 : sal_Int32 nLen = aRet.getLength();
1235 69 : aRet.realloc(nLen + 6);
1236 69 : OUString* pNames = aRet.getArray();
1237 69 : pNames[nLen++] = GetEventName(0);
1238 69 : pNames[nLen++] = GetEventName(1);
1239 69 : pNames[nLen++] = GetEventName(2);
1240 69 : pNames[nLen++] = GetEventName(3);
1241 69 : pNames[nLen++] = GetEventName(4);
1242 69 : pNames[nLen] = GetEventName(5);
1243 :
1244 69 : return aRet;
1245 : }
1246 :
1247 6301 : OUString SwDocShell::GetEventName( sal_Int32 nIndex )
1248 : {
1249 6301 : if (nIndex < s_nEvents)
1250 : {
1251 6301 : return OUString::createFromAscii(s_EventNames[nIndex]);
1252 : }
1253 0 : return OUString();
1254 : }
1255 :
1256 1 : const ::sfx2::IXmlIdRegistry* SwDocShell::GetXmlIdRegistry() const
1257 : {
1258 1 : return m_pDoc ? &m_pDoc->GetXmlIdRegistry() : 0;
1259 : }
1260 :
1261 1320 : bool SwDocShell::IsChangeRecording() const
1262 : {
1263 1320 : return (m_pWrtShell->GetRedlineMode() & nsRedlineMode_t::REDLINE_ON) != 0;
1264 : }
1265 :
1266 2 : bool SwDocShell::HasChangeRecordProtection() const
1267 : {
1268 2 : return m_pWrtShell->getIDocumentRedlineAccess()->GetRedlinePassword().getLength() > 0;
1269 : }
1270 :
1271 0 : void SwDocShell::SetChangeRecording( bool bActivate )
1272 : {
1273 0 : sal_uInt16 nOn = bActivate ? nsRedlineMode_t::REDLINE_ON : 0;
1274 0 : sal_uInt16 nMode = m_pWrtShell->GetRedlineMode();
1275 0 : m_pWrtShell->SetRedlineModeAndCheckInsMode( (nMode & ~nsRedlineMode_t::REDLINE_ON) | nOn);
1276 0 : }
1277 :
1278 0 : bool SwDocShell::SetProtectionPassword( const OUString &rNewPassword )
1279 : {
1280 0 : const SfxAllItemSet aSet( GetPool() );
1281 0 : const SfxItemSet* pArgs = &aSet;
1282 0 : const SfxPoolItem* pItem = NULL;
1283 :
1284 0 : IDocumentRedlineAccess* pIDRA = m_pWrtShell->getIDocumentRedlineAccess();
1285 0 : Sequence< sal_Int8 > aPasswd = pIDRA->GetRedlinePassword();
1286 0 : if (pArgs && SfxItemState::SET == pArgs->GetItemState( FN_REDLINE_PROTECT, false, &pItem )
1287 0 : && static_cast<const SfxBoolItem*>(pItem)->GetValue() == (aPasswd.getLength() > 0))
1288 0 : return false;
1289 :
1290 0 : bool bRes = false;
1291 :
1292 0 : if (!rNewPassword.isEmpty())
1293 : {
1294 : // when password protection is applied change tracking must always be active
1295 0 : SetChangeRecording( true );
1296 :
1297 0 : Sequence< sal_Int8 > aNewPasswd;
1298 0 : SvPasswordHelper::GetHashPassword( aNewPasswd, rNewPassword );
1299 0 : pIDRA->SetRedlinePassword( aNewPasswd );
1300 0 : bRes = true;
1301 : }
1302 : else
1303 : {
1304 0 : pIDRA->SetRedlinePassword( Sequence< sal_Int8 >() );
1305 0 : bRes = true;
1306 : }
1307 :
1308 0 : return bRes;
1309 : }
1310 :
1311 0 : bool SwDocShell::GetProtectionHash( /*out*/ ::com::sun::star::uno::Sequence< sal_Int8 > &rPasswordHash )
1312 : {
1313 0 : bool bRes = false;
1314 :
1315 0 : const SfxAllItemSet aSet( GetPool() );
1316 0 : const SfxItemSet* pArgs = &aSet;
1317 0 : const SfxPoolItem* pItem = NULL;
1318 :
1319 0 : IDocumentRedlineAccess* pIDRA = m_pWrtShell->getIDocumentRedlineAccess();
1320 0 : Sequence< sal_Int8 > aPasswdHash( pIDRA->GetRedlinePassword() );
1321 0 : if (pArgs && SfxItemState::SET == pArgs->GetItemState( FN_REDLINE_PROTECT, false, &pItem )
1322 0 : && static_cast<const SfxBoolItem*>(pItem)->GetValue() == (aPasswdHash.getLength() != 0))
1323 0 : return false;
1324 0 : rPasswordHash = aPasswdHash;
1325 0 : bRes = true;
1326 :
1327 0 : return bRes;
1328 : }
1329 :
1330 0 : void SwDocShell::libreOfficeKitCallback(int nType, const char* pPayload) const
1331 : {
1332 0 : if (!m_pDoc)
1333 0 : return;
1334 :
1335 0 : SwDrawModel* pDrawModel = m_pDoc->getIDocumentDrawModelAccess().GetDrawModel();
1336 0 : pDrawModel->libreOfficeKitCallback(nType, pPayload);
1337 : }
1338 :
1339 37551 : bool SwDocShell::isTiledRendering() const
1340 : {
1341 37551 : SwDrawModel* pDrawModel = m_pDoc->getIDocumentDrawModelAccess().GetDrawModel();
1342 37551 : return pDrawModel->isTiledRendering();
1343 177 : }
1344 :
1345 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|