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