LCOV - code coverage report
Current view: top level - sd/source/ui/docshell - docshel4.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 154 537 28.7 %
Date: 2014-04-11 Functions: 16 32 50.0 %
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             : 
      21             : #include "DrawDocShell.hxx"
      22             : #include <com/sun/star/document/PrinterIndependentLayout.hpp>
      23             : #include <tools/urlobj.hxx>
      24             : #include <sfx2/progress.hxx>
      25             : #include <vcl/waitobj.hxx>
      26             : #include <svx/svxids.hrc>
      27             : #include <editeng/flstitem.hxx>
      28             : #include <editeng/eeitem.hxx>
      29             : #include <svl/aeitem.hxx>
      30             : #include <svl/flagitem.hxx>
      31             : #include <sot/storage.hxx>
      32             : #include <sfx2/dinfdlg.hxx>
      33             : #include <sfx2/docfile.hxx>
      34             : #include <sfx2/docfilt.hxx>
      35             : #include <sfx2/dispatch.hxx>
      36             : #include <svx/svdotext.hxx>
      37             : #include <svl/style.hxx>
      38             : #include <sfx2/printer.hxx>
      39             : #include <svtools/ctrltool.hxx>
      40             : #include <svtools/sfxecode.hxx>
      41             : #include <comphelper/classids.hxx>
      42             : #include <sot/formats.hxx>
      43             : #include <sfx2/request.hxx>
      44             : #include <unotools/fltrcfg.hxx>
      45             : #include <sfx2/frame.hxx>
      46             : #include <sfx2/viewfrm.hxx>
      47             : #include <unotools/saveopt.hxx>
      48             : #include <com/sun/star/drawing/XDrawPage.hpp>
      49             : #include <com/sun/star/drawing/XDrawView.hpp>
      50             : #include <comphelper/processfactory.hxx>
      51             : 
      52             : #include "app.hrc"
      53             : #include "glob.hrc"
      54             : #include "strings.hrc"
      55             : #include "strmname.h"
      56             : #include "FrameView.hxx"
      57             : #include "optsitem.hxx"
      58             : #include "Outliner.hxx"
      59             : #include "sdattr.hxx"
      60             : #include "drawdoc.hxx"
      61             : #include "ViewShell.hxx"
      62             : #include "sdmod.hxx"
      63             : #include "View.hxx"
      64             : #include "sdpage.hxx"
      65             : #include "sdresid.hxx"
      66             : #include "DrawViewShell.hxx"
      67             : #include "ViewShellBase.hxx"
      68             : #include "Window.hxx"
      69             : #include "OutlineViewShell.hxx"
      70             : #include "sdxmlwrp.hxx"
      71             : #include "sdpptwrp.hxx"
      72             : #include "sdcgmfilter.hxx"
      73             : #include "sdgrffilter.hxx"
      74             : #include "sdhtmlfilter.hxx"
      75             : #include "framework/FrameworkHelper.hxx"
      76             : 
      77             : #include "SdUnoDrawView.hxx"
      78             : 
      79             : using namespace ::com::sun::star;
      80             : using namespace ::com::sun::star::uno;
      81             : using ::sd::framework::FrameworkHelper;
      82             : 
      83             : 
      84             : namespace sd {
      85             : 
      86             : /**
      87             :  * Creates (if necessary) and returns a SfxPrinter
      88             :  */
      89        1750 : SfxPrinter* DrawDocShell::GetPrinter(sal_Bool bCreate)
      90             : {
      91        1750 :     if (bCreate && !mpPrinter)
      92             :     {
      93             :         // create ItemSet with special pool area
      94           0 :         SfxItemSet* pSet = new SfxItemSet( GetPool(),
      95             :                             SID_PRINTER_NOTFOUND_WARN,  SID_PRINTER_NOTFOUND_WARN,
      96             :                             SID_PRINTER_CHANGESTODOC,   SID_PRINTER_CHANGESTODOC,
      97             :                             ATTR_OPTIONS_PRINT,         ATTR_OPTIONS_PRINT,
      98           0 :                             0 );
      99             :         // set PrintOptionsSet
     100             :         SdOptionsPrintItem aPrintItem( ATTR_OPTIONS_PRINT,
     101           0 :                             SD_MOD()->GetSdOptions(mpDoc->GetDocumentType()));
     102           0 :         SfxFlagItem aFlagItem( SID_PRINTER_CHANGESTODOC );
     103           0 :         sal_uInt16      nFlags = 0;
     104             : 
     105           0 :         nFlags =  (aPrintItem.GetOptionsPrint().IsWarningSize() ? SFX_PRINTER_CHG_SIZE : 0) |
     106           0 :                 (aPrintItem.GetOptionsPrint().IsWarningOrientation() ? SFX_PRINTER_CHG_ORIENTATION : 0);
     107           0 :         aFlagItem.SetValue( nFlags );
     108             : 
     109           0 :         pSet->Put( aPrintItem );
     110           0 :         pSet->Put( SfxBoolItem( SID_PRINTER_NOTFOUND_WARN, aPrintItem.GetOptionsPrint().IsWarningPrinter() ) );
     111           0 :         pSet->Put( aFlagItem );
     112             : 
     113           0 :         mpPrinter = new SfxPrinter(pSet);
     114           0 :         mbOwnPrinter = sal_True;
     115             : 
     116             :         // set output quality
     117           0 :         sal_uInt16 nQuality = aPrintItem.GetOptionsPrint().GetOutputQuality();
     118             : 
     119           0 :         sal_uLong nMode = DRAWMODE_DEFAULT;
     120             :         // 1 == Grayscale, 2 == Black & White (with grayscale images)
     121           0 :         if( nQuality == 1 )
     122           0 :             nMode = DRAWMODE_GRAYLINE | DRAWMODE_GRAYFILL | DRAWMODE_GRAYTEXT | DRAWMODE_GRAYBITMAP | DRAWMODE_GRAYGRADIENT;
     123           0 :         else if( nQuality == 2 )
     124           0 :             nMode = DRAWMODE_BLACKLINE | DRAWMODE_WHITEFILL | DRAWMODE_BLACKTEXT | DRAWMODE_GRAYBITMAP | DRAWMODE_WHITEGRADIENT;
     125             : 
     126           0 :         mpPrinter->SetDrawMode( nMode );
     127             : 
     128           0 :         MapMode aMM (mpPrinter->GetMapMode());
     129           0 :         aMM.SetMapUnit(MAP_100TH_MM);
     130           0 :         mpPrinter->SetMapMode(aMM);
     131           0 :         UpdateRefDevice();
     132             :     }
     133        1750 :     return mpPrinter;
     134             : }
     135             : 
     136             : /**
     137             :  * Set new SfxPrinter (transfer of ownership)
     138             :  */
     139           2 : void DrawDocShell::SetPrinter(SfxPrinter *pNewPrinter)
     140             : {
     141           2 :     if ( mpViewShell )
     142             :     {
     143           0 :         ::sd::View* pView = mpViewShell->GetView();
     144           0 :         if ( pView->IsTextEdit() )
     145           0 :             pView->SdrEndTextEdit();
     146             :     }
     147             : 
     148           2 :     if ( mpPrinter && mbOwnPrinter && (mpPrinter != pNewPrinter) )
     149             :     {
     150           0 :         delete mpPrinter;
     151             :     }
     152             : 
     153           2 :     mpPrinter = pNewPrinter;
     154           2 :     mbOwnPrinter = sal_True;
     155           2 :     if ( mpDoc->GetPrinterIndependentLayout() == ::com::sun::star::document::PrinterIndependentLayout::DISABLED )
     156           1 :         UpdateFontList();
     157           2 :     UpdateRefDevice();
     158           2 : }
     159             : 
     160         167 : void DrawDocShell::UpdateFontList()
     161             : {
     162         167 :     delete mpFontList;
     163         167 :     OutputDevice* pRefDevice = NULL;
     164         167 :     if ( mpDoc->GetPrinterIndependentLayout() == ::com::sun::star::document::PrinterIndependentLayout::DISABLED )
     165           1 :         pRefDevice = GetPrinter(sal_True);
     166             :     else
     167         166 :         pRefDevice = SD_MOD()->GetVirtualRefDevice();
     168         167 :     mpFontList = new FontList( pRefDevice, NULL, false );
     169         167 :     SvxFontListItem aFontListItem( mpFontList, SID_ATTR_CHAR_FONTLIST );
     170         167 :     PutItem( aFontListItem );
     171         167 : }
     172             : 
     173           0 : Printer* DrawDocShell::GetDocumentPrinter()
     174             : {
     175           0 :     return GetPrinter(sal_False);
     176             : }
     177             : 
     178           0 : void DrawDocShell::OnDocumentPrinterChanged(Printer* pNewPrinter)
     179             : {
     180             :     // if we already have a printer, see if its the same
     181           0 :     if( mpPrinter )
     182             :     {
     183             :         // easy case
     184           0 :         if( mpPrinter == pNewPrinter )
     185           0 :             return;
     186             : 
     187             :         // compare if its the same printer with the same job setup
     188           0 :         if( (mpPrinter->GetName() == pNewPrinter->GetName()) &&
     189           0 :             (mpPrinter->GetJobSetup() == pNewPrinter->GetJobSetup()))
     190           0 :             return;
     191             :     }
     192             : 
     193             :     //  if (mpPrinter->IsA(SfxPrinter))
     194             :     {
     195             :         // Since we do not have RTTI we use a hard cast (...)
     196           0 :         SetPrinter((SfxPrinter*) pNewPrinter);
     197             : 
     198             :         // container owns printer
     199           0 :         mbOwnPrinter = sal_False;
     200             :     }
     201             : }
     202             : 
     203         324 : void DrawDocShell::UpdateRefDevice()
     204             : {
     205         324 :     if( mpDoc )
     206             :     {
     207             :         // Determine the device for which the output will be formatted.
     208         170 :         OutputDevice* pRefDevice = NULL;
     209         170 :         switch (mpDoc->GetPrinterIndependentLayout())
     210             :         {
     211             :             case ::com::sun::star::document::PrinterIndependentLayout::DISABLED:
     212           2 :                 pRefDevice = mpPrinter;
     213           2 :                 break;
     214             : 
     215             :             case ::com::sun::star::document::PrinterIndependentLayout::ENABLED:
     216         168 :                 pRefDevice = SD_MOD()->GetVirtualRefDevice();
     217         168 :                 break;
     218             : 
     219             :             default:
     220             :                 // We are confronted with an invalid or un-implemented
     221             :                 // layout mode.  Use the printer as formatting device
     222             :                 // as a fall-back.
     223             :                 DBG_ASSERT(false, "DrawDocShell::UpdateRefDevice(): Unexpected printer layout mode");
     224             : 
     225           0 :                 pRefDevice = mpPrinter;
     226           0 :                 break;
     227             :         }
     228         170 :         mpDoc->SetRefDevice( pRefDevice );
     229             : 
     230         170 :         ::sd::Outliner* pOutl = mpDoc->GetOutliner( sal_False );
     231             : 
     232         170 :         if( pOutl )
     233           0 :             pOutl->SetRefDevice( pRefDevice );
     234             : 
     235         170 :         ::sd::Outliner* pInternalOutl = mpDoc->GetInternalOutliner( sal_False );
     236             : 
     237         170 :         if( pInternalOutl )
     238          16 :             pInternalOutl->SetRefDevice( pRefDevice );
     239             :     }
     240         324 : }
     241             : 
     242             : /**
     243             :  * Creates new document, opens streams
     244             :  */
     245         120 : bool DrawDocShell::InitNew( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage )
     246             : {
     247         120 :     bool bRet = SfxObjectShell::InitNew( xStorage );
     248             : 
     249         120 :     Rectangle aVisArea( Point(0, 0), Size(14100, 10000) );
     250         120 :     SetVisArea(aVisArea);
     251             : 
     252         120 :     if (bRet)
     253             :     {
     254         120 :         if( !mbSdDataObj )
     255         120 :             mpDoc->NewOrLoadCompleted(NEW_DOC);  // otherwise calling
     256             :                                                 // NewOrLoadCompleted(NEW_LOADED) in
     257             :                                                 // SdDrawDocument::AllocModel()
     258             :     }
     259         120 :     return bRet;
     260             : }
     261             : 
     262             : /**
     263             :  * loads pools and document
     264             :  */
     265          12 : bool DrawDocShell::Load( SfxMedium& rMedium )
     266             : {
     267          12 :     mbNewDocument = sal_False;
     268             : 
     269          12 :     sal_Bool    bRet = sal_False;
     270          12 :     bool       bStartPresentation = false;
     271          12 :     ErrCode nError = ERRCODE_NONE;
     272             : 
     273          12 :     SfxItemSet* pSet = rMedium.GetItemSet();
     274             : 
     275             : 
     276          12 :     if( pSet )
     277             :     {
     278          12 :         if( (  SFX_ITEM_SET == pSet->GetItemState(SID_PREVIEW ) ) && ( (SfxBoolItem&) ( pSet->Get( SID_PREVIEW ) ) ).GetValue() )
     279             :         {
     280           0 :             mpDoc->SetStarDrawPreviewMode( true );
     281             :         }
     282             : 
     283          12 :         if( SFX_ITEM_SET == pSet->GetItemState(SID_DOC_STARTPRESENTATION)&&
     284           0 :             ( (SfxBoolItem&) ( pSet->Get( SID_DOC_STARTPRESENTATION ) ) ).GetValue() )
     285             :         {
     286           0 :             bStartPresentation = true;
     287           0 :             mpDoc->SetStartWithPresentation( true );
     288             :         }
     289             :     }
     290             : 
     291          12 :     bRet = SfxObjectShell::Load( rMedium );
     292          12 :     if( bRet )
     293             :     {
     294          12 :         bRet = SdXMLFilter( rMedium, *this, sal_True, SDXMLMODE_Normal, SotStorage::GetVersion( rMedium.GetStorage() ) ).Import( nError );
     295             :     }
     296             : 
     297          12 :     if( bRet )
     298             :     {
     299          12 :         UpdateTablePointers();
     300             : 
     301             :         // If we're an embedded OLE object, use tight bounds
     302             :         // for our visArea. No point in showing the user lots of empty
     303             :         // space. Had to remove the check for empty VisArea below,
     304             :         // since XML load always sets a VisArea before.
     305             :         //TODO/LATER: looks a little bit strange!
     306          12 :         if( ( GetCreateMode() == SFX_CREATE_MODE_EMBEDDED ) && SfxObjectShell::GetVisArea( ASPECT_CONTENT ).IsEmpty() )
     307             :         {
     308           0 :             SdPage* pPage = mpDoc->GetSdPage( 0, PK_STANDARD );
     309             : 
     310           0 :             if( pPage )
     311           0 :                 SetVisArea( Rectangle( pPage->GetAllObjBoundRect() ) );
     312             :         }
     313             : 
     314          12 :         FinishedLoading( SFX_LOADED_ALL );
     315             : 
     316          12 :         const INetURLObject aUrl;
     317          12 :         SfxObjectShell::SetAutoLoad( aUrl, 0, false );
     318             :     }
     319             :     else
     320             :     {
     321           0 :         if( nError == ERRCODE_IO_BROKENPACKAGE )
     322           0 :             SetError( ERRCODE_IO_BROKENPACKAGE, OSL_LOG_PREFIX );
     323             : 
     324             :         // TODO/LATER: correct error handling?!
     325             :         //pStore->SetError( SVSTREAM_WRONGVERSION, OUString( OSL_LOG_PREFIX ) );
     326             :         else
     327           0 :             SetError( ERRCODE_ABORT, OSL_LOG_PREFIX );
     328             :     }
     329             : 
     330             :     // tell SFX to change viewshell when in preview mode
     331          12 :     if( IsPreview() || bStartPresentation )
     332             :     {
     333           0 :         SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
     334           0 :         if( pMediumSet )
     335           0 :             pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, bStartPresentation ? 1 : 5 ) );
     336             :     }
     337             : 
     338          12 :     return bRet;
     339             : }
     340             : 
     341             : /**
     342             :  * loads content for organizer
     343             :  */
     344           0 : bool DrawDocShell::LoadFrom( SfxMedium& rMedium )
     345             : {
     346           0 :     mbNewDocument = sal_False;
     347             : 
     348           0 :     WaitObject* pWait = NULL;
     349           0 :     if( mpViewShell )
     350           0 :         pWait = new WaitObject( (Window*) mpViewShell->GetActiveWindow() );
     351             : 
     352           0 :     mpDoc->NewOrLoadCompleted( NEW_DOC );
     353           0 :     mpDoc->CreateFirstPages();
     354           0 :     mpDoc->StopWorkStartupDelay();
     355             : 
     356             :     // TODO/LATER: nobody is interested in the error code?!
     357           0 :     ErrCode nError = ERRCODE_NONE;
     358           0 :     bool bRet = SdXMLFilter( rMedium, *this, sal_True, SDXMLMODE_Organizer, SotStorage::GetVersion( rMedium.GetStorage() ) ).Import( nError );
     359             : 
     360             : 
     361             :     // tell SFX to change viewshell when in preview mode
     362           0 :     if( IsPreview() )
     363             :     {
     364           0 :         SfxItemSet *pSet = GetMedium()->GetItemSet();
     365             : 
     366           0 :         if( pSet )
     367           0 :             pSet->Put( SfxUInt16Item( SID_VIEW_ID, 5 ) );
     368             :     }
     369             : 
     370           0 :     delete pWait;
     371             : 
     372           0 :     return bRet;
     373             : }
     374             : 
     375             : /**
     376             :  * load from 3rd party format
     377             :  */
     378          25 : bool DrawDocShell::ImportFrom(SfxMedium &rMedium,
     379             :         uno::Reference<text::XTextRange> const& xInsertPosition)
     380             : {
     381          25 :     const sal_Bool bRet = SfxObjectShell::ImportFrom(rMedium, xInsertPosition);
     382             : 
     383          25 :     SfxItemSet* pSet = rMedium.GetItemSet();
     384          25 :     if( pSet )
     385             :     {
     386          25 :         if( SFX_ITEM_SET == pSet->GetItemState(SID_DOC_STARTPRESENTATION)&&
     387           0 :             ( (SfxBoolItem&) ( pSet->Get( SID_DOC_STARTPRESENTATION ) ) ).GetValue() )
     388             :         {
     389           0 :             mpDoc->SetStartWithPresentation( true );
     390             : 
     391             :             // tell SFX to change viewshell when in preview mode
     392           0 :             if( IsPreview() )
     393             :             {
     394           0 :                 SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
     395           0 :                 if( pMediumSet )
     396           0 :                     pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, 1 ) );
     397             :             }
     398             :         }
     399             :     }
     400             : 
     401          25 :     return bRet;
     402             : }
     403             : 
     404             : /**
     405             :  * load from a foreign format
     406             :  */
     407          12 : bool DrawDocShell::ConvertFrom( SfxMedium& rMedium )
     408             : {
     409          12 :     mbNewDocument = sal_False;
     410             : 
     411          12 :     const OUString  aFilterName( rMedium.GetFilter()->GetFilterName() );
     412          12 :     bool            bRet = false;
     413          12 :     bool            bStartPresentation = false;
     414             : 
     415          12 :     SetWaitCursor( true );
     416             : 
     417          12 :     SfxItemSet* pSet = rMedium.GetItemSet();
     418          12 :     if( pSet )
     419             :     {
     420          12 :         if( (  SFX_ITEM_SET == pSet->GetItemState(SID_PREVIEW ) ) && ( (SfxBoolItem&) ( pSet->Get( SID_PREVIEW ) ) ).GetValue() )
     421             :         {
     422           0 :             mpDoc->SetStarDrawPreviewMode( true );
     423             :         }
     424             : 
     425          12 :         if( SFX_ITEM_SET == pSet->GetItemState(SID_DOC_STARTPRESENTATION)&&
     426           0 :             ( (SfxBoolItem&) ( pSet->Get( SID_DOC_STARTPRESENTATION ) ) ).GetValue() )
     427             :         {
     428           0 :             bStartPresentation = true;
     429           0 :             mpDoc->SetStartWithPresentation( true );
     430             :         }
     431             :     }
     432             : 
     433          24 :     if( aFilterName == pFilterPowerPoint97
     434           2 :         || aFilterName == pFilterPowerPoint97Template
     435          14 :         || aFilterName == pFilterPowerPoint97AutoPlay)
     436             :     {
     437          10 :         mpDoc->StopWorkStartupDelay();
     438          10 :         bRet = SdPPTFilter( rMedium, *this, sal_True ).Import();
     439             :     }
     440           3 :     else if (aFilterName.indexOf("impress8") >= 0 ||
     441           1 :              aFilterName.indexOf("draw8") >= 0)
     442             :     {
     443             :         // TODO/LATER: nobody is interested in the error code?!
     444           2 :         mpDoc->CreateFirstPages();
     445           2 :         mpDoc->StopWorkStartupDelay();
     446           2 :         ErrCode nError = ERRCODE_NONE;
     447           2 :         bRet = SdXMLFilter( rMedium, *this, sal_True ).Import( nError );
     448             : 
     449             :     }
     450           0 :     else if (aFilterName.indexOf("StarOffice XML (Draw)") >= 0 ||
     451           0 :              aFilterName.indexOf("StarOffice XML (Impress)") >= 0)
     452             :     {
     453             :         // TODO/LATER: nobody is interested in the error code?!
     454           0 :         mpDoc->CreateFirstPages();
     455           0 :         mpDoc->StopWorkStartupDelay();
     456           0 :         ErrCode nError = ERRCODE_NONE;
     457           0 :         bRet = SdXMLFilter( rMedium, *this, sal_True, SDXMLMODE_Normal, SOFFICE_FILEFORMAT_60 ).Import( nError );
     458             :     }
     459           0 :     else if( aFilterName.equals( "CGM - Computer Graphics Metafile" ) )
     460             :     {
     461           0 :         mpDoc->CreateFirstPages();
     462           0 :         mpDoc->StopWorkStartupDelay();
     463           0 :         bRet = SdCGMFilter( rMedium, *this, sal_True ).Import();
     464             :     }
     465             :     else
     466             :     {
     467           0 :         mpDoc->CreateFirstPages();
     468           0 :         mpDoc->StopWorkStartupDelay();
     469           0 :         bRet = SdGRFFilter( rMedium, *this ).Import();
     470             :     }
     471             : 
     472          12 :     FinishedLoading( SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES );
     473             : 
     474             :     // tell SFX to change viewshell when in preview mode
     475          12 :     if( IsPreview() )
     476             :     {
     477           0 :         SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
     478             : 
     479           0 :         if( pMediumSet )
     480           0 :             pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, 5 ) );
     481             :     }
     482          12 :     SetWaitCursor( false );
     483             : 
     484             :     // tell SFX to change viewshell when in preview mode
     485          12 :     if( IsPreview() || bStartPresentation )
     486             :     {
     487           0 :         SfxItemSet *pMediumSet = GetMedium()->GetItemSet();
     488           0 :         if( pMediumSet )
     489           0 :             pMediumSet->Put( SfxUInt16Item( SID_VIEW_ID, bStartPresentation ? 1 : 5 ) );
     490             :     }
     491             : 
     492          12 :     return bRet;
     493             : }
     494             : 
     495             : /**
     496             :  * Writes pools and document to the open streams
     497             :  */
     498           0 : bool DrawDocShell::Save()
     499             : {
     500           0 :     mpDoc->StopWorkStartupDelay();
     501             : 
     502             :     //TODO/LATER: why this?!
     503           0 :     if( GetCreateMode() == SFX_CREATE_MODE_STANDARD )
     504           0 :         SfxObjectShell::SetVisArea( Rectangle() );
     505             : 
     506           0 :     bool bRet = SfxObjectShell::Save();
     507             : 
     508           0 :     if( bRet )
     509             :     {
     510             :         // Call UpdateDocInfoForSave() before export
     511           0 :         UpdateDocInfoForSave();
     512             : 
     513           0 :         bRet = SdXMLFilter( *GetMedium(), *this, sal_True, SDXMLMODE_Normal, SotStorage::GetVersion( GetMedium()->GetStorage() ) ).Export();
     514             :     }
     515             : 
     516           0 :     return bRet;
     517             : }
     518             : 
     519             : /**
     520             :  * Writes pools and document to the provided storage
     521             :  */
     522          20 : bool DrawDocShell::SaveAs( SfxMedium& rMedium )
     523             : {
     524          20 :     mpDoc->setDocAccTitle(OUString());
     525          20 :     SfxViewFrame* pFrame1 = SfxViewFrame::GetFirst( this );
     526          20 :     if (pFrame1)
     527             :     {
     528           2 :         ::Window* pWindow = &pFrame1->GetWindow();
     529           2 :         if ( pWindow )
     530             :         {
     531           2 :             ::Window* pSysWin = pWindow->GetSystemWindow();
     532           2 :             if ( pSysWin )
     533             :             {
     534           2 :                 pSysWin->SetAccessibleName(OUString());
     535             :             }
     536             :         }
     537             :     }
     538          20 :     mpDoc->StopWorkStartupDelay();
     539             : 
     540             :     //TODO/LATER: why this?!
     541          20 :     if( GetCreateMode() == SFX_CREATE_MODE_STANDARD )
     542           2 :         SfxObjectShell::SetVisArea( Rectangle() );
     543             : 
     544          20 :     sal_uInt32  nVBWarning = ERRCODE_NONE;
     545          20 :     bool    bRet = SfxObjectShell::SaveAs( rMedium );
     546             : 
     547          20 :     if( bRet )
     548             :     {
     549             :         // Call UpdateDocInfoForSave() before export
     550          20 :         UpdateDocInfoForSave();
     551          20 :         bRet = SdXMLFilter( rMedium, *this, sal_True, SDXMLMODE_Normal, SotStorage::GetVersion( rMedium.GetStorage() ) ).Export();
     552             :     }
     553             : 
     554          20 :     if( GetError() == ERRCODE_NONE )
     555           4 :         SetError( nVBWarning, OSL_LOG_PREFIX );
     556             : 
     557          20 :     return bRet;
     558             : }
     559             : 
     560             : /**
     561             :  * save to foreign format
     562             :  */
     563           0 : bool DrawDocShell::ConvertTo( SfxMedium& rMedium )
     564             : {
     565           0 :     bool bRet = false;
     566             : 
     567           0 :     if( mpDoc->GetPageCount() )
     568             :     {
     569           0 :         const SfxFilter*    pMediumFilter = rMedium.GetFilter();
     570           0 :         const OUString aTypeName( pMediumFilter->GetTypeName() );
     571           0 :         SdFilter*           pFilter = NULL;
     572             : 
     573           0 :         if( aTypeName.indexOf( "graphic_HTML" ) >= 0 )
     574             :         {
     575           0 :             pFilter = new SdHTMLFilter( rMedium, *this, sal_True );
     576             :         }
     577           0 :         else if( aTypeName.indexOf( "MS_PowerPoint_97" ) >= 0 )
     578             :         {
     579           0 :             pFilter = new SdPPTFilter( rMedium, *this, sal_True );
     580           0 :             ((SdPPTFilter*)pFilter)->PreSaveBasic();
     581             :         }
     582           0 :         else if ( aTypeName.indexOf( "CGM_Computer_Graphics_Metafile" ) >= 0 )
     583             :         {
     584           0 :             pFilter = new SdCGMFilter( rMedium, *this, sal_True );
     585             :         }
     586           0 :         else if( aTypeName.indexOf( "draw8" ) >= 0 ||
     587           0 :                  aTypeName.indexOf( "impress8" ) >= 0 )
     588             :         {
     589           0 :             pFilter = new SdXMLFilter( rMedium, *this, sal_True );
     590           0 :             UpdateDocInfoForSave();
     591             :         }
     592           0 :         else if( aTypeName.indexOf( "StarOffice_XML_Impress" ) >= 0 ||
     593           0 :                  aTypeName.indexOf( "StarOffice_XML_Draw" ) >= 0 )
     594             :         {
     595           0 :             pFilter = new SdXMLFilter( rMedium, *this, sal_True, SDXMLMODE_Normal, SOFFICE_FILEFORMAT_60 );
     596           0 :             UpdateDocInfoForSave();
     597             :         }
     598             :         else
     599             :         {
     600           0 :             pFilter = new SdGRFFilter( rMedium, *this );
     601             :         }
     602             : 
     603           0 :         if( pFilter )
     604             :         {
     605           0 :             const sal_uLong nOldSwapMode = mpDoc->GetSwapGraphicsMode();
     606             : 
     607           0 :             mpDoc->SetSwapGraphicsMode( SDR_SWAPGRAPHICSMODE_TEMP );
     608             : 
     609           0 :             bRet = pFilter->Export();
     610           0 :             if( !bRet )
     611           0 :                 mpDoc->SetSwapGraphicsMode( nOldSwapMode );
     612             : 
     613           0 :             delete pFilter;
     614           0 :         }
     615             :     }
     616             : 
     617           0 :     return  bRet;
     618             : }
     619             : 
     620             : /**
     621             :  * Reopen own streams to ensure that nobody else can prevent use from opening
     622             :  * them.
     623             :  */
     624          34 : bool DrawDocShell::SaveCompleted( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage )
     625             : {
     626          34 :     bool bRet = false;
     627             : 
     628          34 :     if( SfxObjectShell::SaveCompleted(xStorage) )
     629             :     {
     630          34 :         mpDoc->NbcSetChanged( sal_False );
     631             : 
     632          34 :         if( mpViewShell )
     633             :         {
     634           2 :             if( mpViewShell->ISA( OutlineViewShell ) )
     635           0 :                 static_cast<OutlineView*>(mpViewShell->GetView())
     636           0 :                     ->GetOutliner()->ClearModifyFlag();
     637             : 
     638           2 :             SdrOutliner* pOutl = mpViewShell->GetView()->GetTextEditOutliner();
     639           2 :             if( pOutl )
     640             :             {
     641           0 :                 SdrObject* pObj = mpViewShell->GetView()->GetTextEditObject();
     642           0 :                 if( pObj )
     643           0 :                     pObj->NbcSetOutlinerParaObject( pOutl->CreateParaObject() );
     644             : 
     645           0 :                 pOutl->ClearModifyFlag();
     646             :             }
     647             :         }
     648             : 
     649          34 :         bRet = true;
     650             : 
     651           2 :         SfxViewFrame* pFrame = ( mpViewShell && mpViewShell->GetViewFrame() ) ?
     652           2 :                                mpViewShell->GetViewFrame() :
     653          36 :                                SfxViewFrame::Current();
     654             : 
     655          34 :         if( pFrame )
     656          34 :             pFrame->GetBindings().Invalidate( SID_NAVIGATOR_STATE, true, false );
     657             :     }
     658          34 :     return bRet;
     659             : }
     660             : 
     661        2988 : SdDrawDocument* DrawDocShell::GetDoc()
     662             : {
     663        2988 :     return mpDoc;
     664             : }
     665             : 
     666           5 : SfxStyleSheetBasePool* DrawDocShell::GetStyleSheetPool()
     667             : {
     668           5 :     return( (SfxStyleSheetBasePool*) mpDoc->GetStyleSheetPool() );
     669             : }
     670             : 
     671           0 : sal_Bool DrawDocShell::GotoBookmark(const OUString& rBookmark)
     672             : {
     673           0 :     sal_Bool bFound = sal_False;
     674             : 
     675           0 :     if (mpViewShell && mpViewShell->ISA(DrawViewShell))
     676             :     {
     677           0 :         DrawViewShell* pDrawViewShell = static_cast<DrawViewShell*>(mpViewShell);
     678           0 :         ViewShellBase& rBase (mpViewShell->GetViewShellBase());
     679             : 
     680           0 :         sal_Bool bIsMasterPage = sal_False;
     681           0 :         sal_uInt16 nPageNumber = SDRPAGE_NOTFOUND;
     682           0 :         SdrObject* pObj = NULL;
     683             : 
     684           0 :         OUString sBookmark( rBookmark );
     685           0 :         const OUString sInteraction( "action?" );
     686           0 :         if ( sBookmark.match( sInteraction ) )
     687             :         {
     688           0 :             const OUString sJump( "jump=" );
     689           0 :             if ( sBookmark.match( sJump, sInteraction.getLength() ) )
     690             :             {
     691           0 :                 OUString aDestination( sBookmark.copy( sInteraction.getLength() + sJump.getLength() ) );
     692           0 :                 if ( aDestination.match( "firstslide" ) )
     693             :                 {
     694           0 :                     nPageNumber = 1;
     695             :                 }
     696           0 :                 else if ( aDestination.match( "lastslide" ) )
     697             :                 {
     698           0 :                     nPageNumber = mpDoc->GetPageCount() - 2;
     699             :                 }
     700           0 :                 else if ( aDestination.match( "previousslide" ) )
     701             :                 {
     702           0 :                     SdPage* pPage = pDrawViewShell->GetActualPage();
     703           0 :                     nPageNumber = pPage->GetPageNum();
     704           0 :                     nPageNumber = nPageNumber > 2 ? nPageNumber - 2 : SDRPAGE_NOTFOUND;
     705             :                 }
     706           0 :                 else if ( aDestination.match( "nextslide" ) )
     707             :                 {
     708           0 :                     SdPage* pPage = pDrawViewShell->GetActualPage();
     709           0 :                     nPageNumber = pPage->GetPageNum() + 2;
     710           0 :                     if ( nPageNumber >= mpDoc->GetPageCount() )
     711           0 :                         nPageNumber = SDRPAGE_NOTFOUND;
     712           0 :                 }
     713           0 :             }
     714             :         }
     715             :         else
     716             :         {
     717           0 :             OUString aBookmark( rBookmark );
     718             : 
     719             :             // Is the bookmark a page?
     720           0 :             nPageNumber = mpDoc->GetPageByName( aBookmark, bIsMasterPage );
     721             : 
     722           0 :             if (nPageNumber == SDRPAGE_NOTFOUND)
     723             :             {
     724             :                 // Is the bookmark a object?
     725           0 :                 pObj = mpDoc->GetObj(aBookmark);
     726             : 
     727           0 :                 if (pObj)
     728             :                 {
     729           0 :                     nPageNumber = pObj->GetPage()->GetPageNum();
     730             :                 }
     731           0 :             }
     732             :         }
     733           0 :         if (nPageNumber != SDRPAGE_NOTFOUND)
     734             :         {
     735             :             // Jump to the bookmarked page.  This is done in three steps.
     736             : 
     737           0 :             bFound = sal_True;
     738             :             SdPage* pPage;
     739           0 :             if (bIsMasterPage)
     740           0 :                 pPage = (SdPage*) mpDoc->GetMasterPage(nPageNumber);
     741             :             else
     742           0 :                 pPage = (SdPage*) mpDoc->GetPage(nPageNumber);
     743             : 
     744             :             // 1.) Change the view shell to the edit view, the notes view,
     745             :             // or the handout view.
     746           0 :             PageKind eNewPageKind = pPage->GetPageKind();
     747             : 
     748           0 :             if( (eNewPageKind != PK_STANDARD) && (mpDoc->GetDocumentType() == DOCUMENT_TYPE_DRAW) )
     749           0 :                 return sal_False;
     750             : 
     751           0 :             if (eNewPageKind != pDrawViewShell->GetPageKind())
     752             :             {
     753             :                 // change work area
     754           0 :                 GetFrameView()->SetPageKind(eNewPageKind);
     755           0 :                 OUString sViewURL;
     756           0 :                 switch (eNewPageKind)
     757             :                 {
     758             :                     case PK_STANDARD:
     759           0 :                         sViewURL = FrameworkHelper::msImpressViewURL;
     760           0 :                         break;
     761             :                     case PK_NOTES:
     762           0 :                         sViewURL = FrameworkHelper::msNotesViewURL;
     763           0 :                         break;
     764             :                     case PK_HANDOUT:
     765           0 :                         sViewURL = FrameworkHelper::msHandoutViewURL;
     766           0 :                         break;
     767             :                     default:
     768           0 :                         break;
     769             :                 }
     770           0 :                 if (!sViewURL.isEmpty())
     771             :                 {
     772             :                     ::boost::shared_ptr<FrameworkHelper> pHelper (
     773           0 :                         FrameworkHelper::Instance(rBase));
     774             :                     pHelper->RequestView(
     775             :                         sViewURL,
     776           0 :                         FrameworkHelper::msCenterPaneURL);
     777           0 :                     pHelper->WaitForUpdate();
     778             : 
     779             :                     // Get the new DrawViewShell.
     780           0 :                     mpViewShell = pHelper->GetViewShell(FrameworkHelper::msCenterPaneURL).get();
     781           0 :                     pDrawViewShell = dynamic_cast<sd::DrawViewShell*>(mpViewShell);
     782             :                 }
     783             :                 else
     784             :                 {
     785           0 :                     pDrawViewShell = NULL;
     786           0 :                 }
     787             :             }
     788             : 
     789           0 :             if (pDrawViewShell != NULL)
     790             :             {
     791             :                 // Set the edit mode to either the normal edit mode or the
     792             :                 // master page mode.
     793           0 :                 EditMode eNewEditMode = EM_PAGE;
     794           0 :                 if (bIsMasterPage)
     795             :                 {
     796           0 :                     eNewEditMode = EM_MASTERPAGE;
     797             :                 }
     798             : 
     799           0 :                 if (eNewEditMode != pDrawViewShell->GetEditMode())
     800             :                 {
     801             :                     // EditMode setzen
     802           0 :                     pDrawViewShell->ChangeEditMode(eNewEditMode, false);
     803             :                 }
     804             : 
     805             :                 // Make the bookmarked page the current page.  This is done
     806             :                 // by using the API because this takes care of all the
     807             :                 // little things to be done.  Especially writing the view
     808             :                 // data to the frame view.
     809           0 :                 sal_uInt16 nSdPgNum = (nPageNumber - 1) / 2;
     810           0 :                 Reference<drawing::XDrawView> xController (rBase.GetController(), UNO_QUERY);
     811           0 :                 if (xController.is())
     812             :                 {
     813           0 :                     Reference<drawing::XDrawPage> xDrawPage (pPage->getUnoPage(), UNO_QUERY);
     814           0 :                     xController->setCurrentPage (xDrawPage);
     815             :                 }
     816             :                 else
     817             :                 {
     818             :                     // As a fall back switch to the page via the core.
     819             :                     DBG_ASSERT (xController.is(),
     820             :                         "DrawDocShell::GotoBookmark: can't switch page via API");
     821           0 :                     pDrawViewShell->SwitchPage(nSdPgNum);
     822             :                 }
     823             : 
     824           0 :                 if (pObj != NULL)
     825             :                 {
     826             :                     // show and select object
     827           0 :                     pDrawViewShell->MakeVisible(pObj->GetLogicRect(),
     828           0 :                         *pDrawViewShell->GetActiveWindow());
     829           0 :                     pDrawViewShell->GetView()->UnmarkAll();
     830           0 :                     pDrawViewShell->GetView()->MarkObj(
     831             :                         pObj,
     832           0 :                         pDrawViewShell->GetView()->GetSdrPageView(), false);
     833           0 :                 }
     834             :             }
     835             :         }
     836             : 
     837           0 :         SfxBindings& rBindings = (pDrawViewShell->GetViewFrame()!=NULL
     838           0 :             ? pDrawViewShell->GetViewFrame()
     839           0 :             : SfxViewFrame::Current() )->GetBindings();
     840             : 
     841           0 :         rBindings.Invalidate(SID_NAVIGATOR_STATE, true, false);
     842           0 :         rBindings.Invalidate(SID_NAVIGATOR_PAGENAME);
     843             :     }
     844             : 
     845           0 :     return (bFound);
     846             : }
     847             : 
     848             : //If  object  is marked , return true , else return false .
     849           0 : sal_Bool DrawDocShell::IsMarked(  SdrObject* pObject  )
     850             : {
     851           0 :        sal_Bool bisMarked =sal_False;
     852             : 
     853           0 :      if (mpViewShell && mpViewShell->ISA(DrawViewShell))
     854             :     {
     855           0 :         DrawViewShell* pDrViewSh = (DrawViewShell*) mpViewShell;
     856           0 :         if (pObject )
     857             :         {
     858           0 :               bisMarked = pDrViewSh->GetView()->IsObjMarked(pObject);
     859             :         }
     860             :      }
     861           0 :     return  bisMarked;
     862             : }
     863             : //If  object  is marked , return true , else return false .
     864           0 : sal_Bool DrawDocShell::GetObjectIsmarked(const OUString& rBookmark)
     865             : {
     866             :     OSL_TRACE("GotoBookmark %s",
     867             :         OUStringToOString(rBookmark, RTL_TEXTENCODING_UTF8).getStr());
     868           0 :      sal_Bool bUnMark = sal_False;
     869             : 
     870           0 :     if (mpViewShell && mpViewShell->ISA(DrawViewShell))
     871             :     {
     872           0 :         DrawViewShell* pDrViewSh = (DrawViewShell*) mpViewShell;
     873             : 
     874           0 :         OUString aBookmark( rBookmark );
     875             : 
     876           0 :         if( rBookmark.startsWith("#") )
     877           0 :             aBookmark = rBookmark.copy( 1 );
     878             : 
     879             :         // Ist das Bookmark eine Seite?
     880             :         sal_Bool        bIsMasterPage;
     881           0 :         sal_uInt16      nPgNum = mpDoc->GetPageByName( aBookmark, bIsMasterPage );
     882           0 :         SdrObject*  pObj = NULL;
     883             : 
     884           0 :         if (nPgNum == SDRPAGE_NOTFOUND)
     885             :         {
     886             :             // Ist das Bookmark ein Objekt?
     887           0 :             pObj = mpDoc->GetObj(aBookmark);
     888             : 
     889           0 :             if (pObj)
     890             :             {
     891           0 :                 nPgNum = pObj->GetPage()->GetPageNum();
     892             :             }
     893             :         }
     894             : 
     895           0 :         if (nPgNum != SDRPAGE_NOTFOUND)
     896             :         {
     897             :             /**********************************************************
     898             :             * Zur Seite springen
     899             :             **********************************************************/
     900             : 
     901           0 :             SdPage* pPage = (SdPage*) mpDoc->GetPage(nPgNum);
     902             : 
     903           0 :             PageKind eNewPageKind = pPage->GetPageKind();
     904             : 
     905           0 :             if (eNewPageKind != pDrViewSh->GetPageKind())
     906             :             {
     907             :                 // Arbeitsbereich wechseln
     908           0 :                 GetFrameView()->SetPageKind(eNewPageKind);
     909           0 :                 ( ( mpViewShell && mpViewShell->GetViewFrame() ) ?
     910           0 :                   mpViewShell->GetViewFrame() : SfxViewFrame::Current() )->
     911           0 :                   GetDispatcher()->Execute( SID_VIEWSHELL0, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD );
     912             : 
     913             :                 // Die aktuelle ViewShell hat sich geaendert!
     914           0 :                 pDrViewSh = (DrawViewShell*) mpViewShell;
     915             :             }
     916             : 
     917           0 :             EditMode eNewEditMode = EM_PAGE;
     918             : 
     919           0 :             if( bIsMasterPage )
     920             :             {
     921           0 :                 eNewEditMode = EM_MASTERPAGE;
     922             :             }
     923             : 
     924           0 :             if (eNewEditMode != pDrViewSh->GetEditMode())
     925             :             {
     926             :                 // EditMode setzen
     927           0 :                 pDrViewSh->ChangeEditMode(eNewEditMode, false);
     928             :             }
     929             : 
     930             :             // Jump to the page.  This is done by using the API because this
     931             :             // takes care of all the little things to be done.  Especially
     932             :             // writing the view data to the frame view (see bug #107803#).
     933           0 :             sal_uInt16 nSdPgNum = (nPgNum - 1) / 2;
     934             :             SdUnoDrawView* pUnoDrawView = new SdUnoDrawView (
     935             :                 *pDrViewSh,
     936           0 :                 *pDrViewSh->GetView());
     937           0 :             if (pUnoDrawView != NULL)
     938             :             {
     939             :                 ::com::sun::star::uno::Reference<
     940             :                       ::com::sun::star::drawing::XDrawPage> xDrawPage (
     941           0 :                           pPage->getUnoPage(), ::com::sun::star::uno::UNO_QUERY);
     942           0 :                 pUnoDrawView->setCurrentPage (xDrawPage);
     943             :             }
     944             :             else
     945             :             {
     946             :                 // As a fall back switch to the page via the core.
     947             :                 DBG_ASSERT (pUnoDrawView!=NULL,
     948             :                     "SdDrawDocShell::GotoBookmark: can't switch page via API");
     949           0 :                 pDrViewSh->SwitchPage(nSdPgNum);
     950             :             }
     951           0 :             delete pUnoDrawView;
     952             : 
     953             : 
     954           0 :             if (pObj)
     955             :             {
     956             :                 // Objekt einblenden und selektieren
     957           0 :                 pDrViewSh->MakeVisible(pObj->GetLogicRect(),
     958           0 :                                        *pDrViewSh->GetActiveWindow());
     959             : 
     960           0 :                  bUnMark = pDrViewSh->GetView()->IsObjMarked(pObj);
     961             : 
     962             : 
     963             :             }
     964           0 :         }
     965             :     }
     966             : 
     967           0 :     return ( bUnMark);
     968             : }
     969             : //realize multi-selection of objects
     970           0 : sal_Bool DrawDocShell::GotoTreeBookmark(const OUString& rBookmark)
     971             : {
     972             :     OSL_TRACE("GotoBookmark %s",
     973             :         OUStringToOString(rBookmark, RTL_TEXTENCODING_UTF8).getStr());
     974           0 :     sal_Bool bFound = sal_False;
     975             : 
     976           0 :     if (mpViewShell && mpViewShell->ISA(DrawViewShell))
     977             :     {
     978           0 :         DrawViewShell* pDrViewSh = (DrawViewShell*) mpViewShell;
     979             : 
     980           0 :         OUString aBookmark( rBookmark );
     981             : 
     982           0 :         if( rBookmark.startsWith("#") )
     983           0 :             aBookmark = rBookmark.copy( 1 );
     984             : 
     985             :         // Ist das Bookmark eine Seite?
     986             :         sal_Bool        bIsMasterPage;
     987           0 :         sal_uInt16      nPgNum = mpDoc->GetPageByName( aBookmark, bIsMasterPage );
     988           0 :         SdrObject*  pObj = NULL;
     989             : 
     990           0 :         if (nPgNum == SDRPAGE_NOTFOUND)
     991             :         {
     992             :             // Ist das Bookmark ein Objekt?
     993           0 :             pObj = mpDoc->GetObj(aBookmark);
     994             : 
     995           0 :             if (pObj)
     996             :             {
     997           0 :                 nPgNum = pObj->GetPage()->GetPageNum();
     998             :             }
     999             :         }
    1000             : 
    1001           0 :         if (nPgNum != SDRPAGE_NOTFOUND)
    1002             :         {
    1003             :             /**********************************************************
    1004             :             * Zur Seite springen
    1005             :             **********************************************************/
    1006           0 :             bFound = sal_True;
    1007           0 :             SdPage* pPage = (SdPage*) mpDoc->GetPage(nPgNum);
    1008             : 
    1009           0 :             PageKind eNewPageKind = pPage->GetPageKind();
    1010             : 
    1011           0 :             if (eNewPageKind != pDrViewSh->GetPageKind())
    1012             :             {
    1013             :                 // Arbeitsbereich wechseln
    1014           0 :                 GetFrameView()->SetPageKind(eNewPageKind);
    1015           0 :                 ( ( mpViewShell && mpViewShell->GetViewFrame() ) ?
    1016           0 :                   mpViewShell->GetViewFrame() : SfxViewFrame::Current() )->
    1017           0 :                   GetDispatcher()->Execute( SID_VIEWSHELL0, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD );
    1018             : 
    1019             :                 // Die aktuelle ViewShell hat sich geaendert!
    1020           0 :                 pDrViewSh = (DrawViewShell*) mpViewShell;
    1021             :             }
    1022             : 
    1023           0 :             EditMode eNewEditMode = EM_PAGE;
    1024             : 
    1025           0 :             if( bIsMasterPage )
    1026             :             {
    1027           0 :                 eNewEditMode = EM_MASTERPAGE;
    1028             :             }
    1029             : 
    1030           0 :             if (eNewEditMode != pDrViewSh->GetEditMode())
    1031             :             {
    1032             :                 // EditMode setzen
    1033           0 :                 pDrViewSh->ChangeEditMode(eNewEditMode, false);
    1034             :             }
    1035             : 
    1036             :             // Jump to the page.  This is done by using the API because this
    1037             :             // takes care of all the little things to be done.  Especially
    1038             :             // writing the view data to the frame view (see bug #107803#).
    1039           0 :             sal_uInt16 nSdPgNum = (nPgNum - 1) / 2;
    1040             :             SdUnoDrawView* pUnoDrawView = new SdUnoDrawView (
    1041             :                 *pDrViewSh,
    1042           0 :                 *pDrViewSh->GetView());
    1043           0 :             if (pUnoDrawView != NULL)
    1044             :             {
    1045             :                 ::com::sun::star::uno::Reference<
    1046             :                       ::com::sun::star::drawing::XDrawPage> xDrawPage (
    1047           0 :                           pPage->getUnoPage(), ::com::sun::star::uno::UNO_QUERY);
    1048           0 :                 pUnoDrawView->setCurrentPage (xDrawPage);
    1049             :             }
    1050             :             else
    1051             :             {
    1052             :                 // As a fall back switch to the page via the core.
    1053             :                 DBG_ASSERT (pUnoDrawView!=NULL,
    1054             :                     "SdDrawDocShell::GotoBookmark: can't switch page via API");
    1055           0 :                 pDrViewSh->SwitchPage(nSdPgNum);
    1056             :             }
    1057           0 :             delete pUnoDrawView;
    1058             : 
    1059             : 
    1060           0 :             if (pObj)
    1061             :             {
    1062             :                 // Objekt einblenden und selektieren
    1063           0 :                 pDrViewSh->MakeVisible(pObj->GetLogicRect(),
    1064           0 :                                        *pDrViewSh->GetActiveWindow());
    1065           0 :                       sal_Bool bUnMark = pDrViewSh->GetView()->IsObjMarked(pObj);
    1066           0 :                 pDrViewSh->GetView()->MarkObj(pObj, pDrViewSh->GetView()->GetSdrPageView(), bUnMark);
    1067             :             }
    1068             :         }
    1069             : 
    1070           0 :         SfxBindings& rBindings = ( ( mpViewShell && mpViewShell->GetViewFrame() ) ?
    1071           0 :                                  mpViewShell->GetViewFrame() : SfxViewFrame::Current() )->GetBindings();
    1072             : 
    1073           0 :         rBindings.Invalidate(SID_NAVIGATOR_STATE, true, false);
    1074           0 :         rBindings.Invalidate(SID_NAVIGATOR_PAGENAME);
    1075             :     }
    1076             : 
    1077           0 :     return (bFound);
    1078             : }
    1079             : 
    1080             : /**
    1081             :  * If it should become a document template.
    1082             :  */
    1083          20 : bool DrawDocShell::SaveAsOwnFormat( SfxMedium& rMedium )
    1084             : {
    1085             : 
    1086          20 :     const SfxFilter* pFilter = rMedium.GetFilter();
    1087             : 
    1088          20 :     if (pFilter->IsOwnTemplateFormat())
    1089             :     {
    1090             :         /* now the StarDraw specialty:
    1091             :            we assign known layout names to the layout template of the first
    1092             :            page, we set the layout names of the affected masterpages and pages.
    1093             :            We inform all text objects of the affected standard, note and
    1094             :            masterpages about the name change.
    1095             :         */
    1096             : 
    1097           0 :         OUString aLayoutName;
    1098             : 
    1099             :         SfxStringItem* pLayoutItem;
    1100           0 :         if( rMedium.GetItemSet()->GetItemState(SID_TEMPLATE_NAME, false, (const SfxPoolItem**) & pLayoutItem ) == SFX_ITEM_SET )
    1101             :         {
    1102           0 :             aLayoutName = pLayoutItem->GetValue();
    1103             :         }
    1104             :         else
    1105             :         {
    1106           0 :             INetURLObject aURL( rMedium.GetName() );
    1107           0 :             aURL.removeExtension();
    1108           0 :             aLayoutName = aURL.getName();
    1109             :         }
    1110             : 
    1111           0 :         if (!aLayoutName.isEmpty())
    1112             :         {
    1113           0 :             sal_uInt32 nCount = mpDoc->GetMasterSdPageCount(PK_STANDARD);
    1114           0 :             for (sal_uInt32 i = 0; i < nCount; ++i)
    1115             :             {
    1116           0 :                 OUString aOldPageLayoutName = mpDoc->GetMasterSdPage(i, PK_STANDARD)->GetLayoutName();
    1117           0 :                 OUString aNewLayoutName = aLayoutName;
    1118             :                 // Don't add suffix for the first master page
    1119           0 :                 if( i > 0 )
    1120           0 :                     aNewLayoutName += OUString::number(i);
    1121             : 
    1122           0 :                 mpDoc->RenameLayoutTemplate(aOldPageLayoutName, aNewLayoutName);
    1123           0 :             }
    1124           0 :         }
    1125             :     }
    1126             : 
    1127          20 :     return SfxObjectShell::SaveAsOwnFormat(rMedium);
    1128             : }
    1129             : 
    1130             : 
    1131         157 : void DrawDocShell::FillClass(SvGlobalName* pClassName,
    1132             :                                         sal_uInt32*  pFormat,
    1133             :                                         OUString* ,
    1134             :                                         OUString* pFullTypeName,
    1135             :                                         OUString* pShortTypeName,
    1136             :                                         sal_Int32 nFileFormat,
    1137             :                                         bool bTemplate /* = false */) const
    1138             : {
    1139         157 :     if (nFileFormat == SOFFICE_FILEFORMAT_60)
    1140             :     {
    1141           0 :         if ( meDocType == DOCUMENT_TYPE_DRAW )
    1142             :         {
    1143           0 :             *pClassName = SvGlobalName(SO3_SDRAW_CLASSID_60);
    1144           0 :             *pFormat = SOT_FORMATSTR_ID_STARDRAW_60;
    1145           0 :             *pFullTypeName = OUString(SdResId(STR_GRAPHIC_DOCUMENT_FULLTYPE_60));
    1146             :         }
    1147             :         else
    1148             :         {
    1149           0 :             *pClassName = SvGlobalName(SO3_SIMPRESS_CLASSID_60);
    1150           0 :             *pFormat = SOT_FORMATSTR_ID_STARIMPRESS_60;
    1151           0 :             *pFullTypeName = OUString(SdResId(STR_IMPRESS_DOCUMENT_FULLTYPE_60));
    1152             :         }
    1153             :     }
    1154         157 :     else if (nFileFormat == SOFFICE_FILEFORMAT_8)
    1155             :     {
    1156         157 :         if ( meDocType == DOCUMENT_TYPE_DRAW )
    1157             :         {
    1158         101 :             *pClassName = SvGlobalName(SO3_SDRAW_CLASSID_60);
    1159         101 :             *pFormat = bTemplate ? SOT_FORMATSTR_ID_STARDRAW_8_TEMPLATE : SOT_FORMATSTR_ID_STARDRAW_8;
    1160         101 :             *pFullTypeName = "Draw 8"; // HACK: method will be removed with new storage API
    1161             :         }
    1162             :         else
    1163             :         {
    1164          56 :             *pClassName = SvGlobalName(SO3_SIMPRESS_CLASSID_60);
    1165          56 :             *pFormat = bTemplate ? SOT_FORMATSTR_ID_STARIMPRESS_8_TEMPLATE : SOT_FORMATSTR_ID_STARIMPRESS_8;
    1166          56 :             *pFullTypeName = "Impress 8"; // HACK: method will be removed with new storage API
    1167             :         }
    1168             :     }
    1169             : 
    1170         314 :     *pShortTypeName = OUString(SdResId( (meDocType == DOCUMENT_TYPE_DRAW) ?
    1171         157 :                                       STR_GRAPHIC_DOCUMENT : STR_IMPRESS_DOCUMENT ));
    1172         157 : }
    1173             : 
    1174           0 : OutputDevice* DrawDocShell::GetDocumentRefDev (void)
    1175             : {
    1176           0 :     OutputDevice* pReferenceDevice = SfxObjectShell::GetDocumentRefDev ();
    1177             :     // Only when our parent does not have a reference device then we return
    1178             :     // our own.
    1179           0 :     if (pReferenceDevice == NULL && mpDoc != NULL)
    1180           0 :         pReferenceDevice = mpDoc->GetRefDevice ();
    1181           0 :     return pReferenceDevice;
    1182             : }
    1183             : 
    1184             : /** executes the SID_OPENDOC slot to let the framework open a document
    1185             :     with the given URL and this document as a referer */
    1186           0 : void DrawDocShell::OpenBookmark( const OUString& rBookmarkURL )
    1187             : {
    1188           0 :     SfxStringItem   aStrItem( SID_FILE_NAME, rBookmarkURL );
    1189           0 :     SfxStringItem   aReferer( SID_REFERER, GetMedium()->GetName() );
    1190           0 :     const SfxPoolItem* ppArgs[] = { &aStrItem, &aReferer, 0 };
    1191           0 :     ( mpViewShell ? mpViewShell->GetViewFrame() : SfxViewFrame::Current() )->GetBindings().Execute( SID_OPENHYPERLINK, ppArgs );
    1192           0 : }
    1193             : 
    1194           0 : SfxDocumentInfoDialog* DrawDocShell::CreateDocumentInfoDialog( ::Window *pParent, const SfxItemSet &rSet )
    1195             : {
    1196           0 :     SfxDocumentInfoDialog* pDlg   = new SfxDocumentInfoDialog( pParent, rSet );
    1197           0 :     DrawDocShell*          pDocSh = PTR_CAST(DrawDocShell,SfxObjectShell::Current());
    1198             : 
    1199           0 :     if( pDocSh == this )
    1200             :     {
    1201           0 :         pDlg->AddFontTabPage();
    1202             :     }
    1203           0 :     return pDlg;
    1204             : }
    1205             : 
    1206           0 : void DrawDocShell::setDocAccTitle( const OUString& rTitle )
    1207             : {
    1208           0 :     if (mpDoc )
    1209             :     {
    1210           0 :         mpDoc->setDocAccTitle( rTitle );
    1211             :     }
    1212           0 : }
    1213             : 
    1214           0 : const OUString DrawDocShell::getDocAccTitle() const
    1215             : {
    1216           0 :     OUString sRet;
    1217           0 :     if (mpDoc)
    1218             :     {
    1219           0 :         sRet =  mpDoc->getDocAccTitle();
    1220             :     }
    1221             : 
    1222           0 :     return sRet;
    1223             : }
    1224             : 
    1225           0 : void DrawDocShell::setDocReadOnly( sal_Bool bReadOnly)
    1226             : {
    1227           0 :     if (mpDoc )
    1228             :     {
    1229           0 :         mpDoc->setDocReadOnly( bReadOnly );
    1230             :     }
    1231           0 : }
    1232             : 
    1233           0 : sal_Bool DrawDocShell::getDocReadOnly() const
    1234             : {
    1235           0 :     if  (mpDoc)
    1236             :     {
    1237           0 :         return mpDoc->getDocReadOnly();
    1238             :     }
    1239             : 
    1240           0 :     return sal_False;
    1241             : }
    1242          48 : } // end of namespace sd
    1243             : 
    1244             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10