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

Generated by: LCOV version 1.10