LCOV - code coverage report
Current view: top level - sw/source/uibase/app - docsh.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 306 632 48.4 %
Date: 2015-06-13 12:38:46 Functions: 38 53 71.7 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11