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