LCOV - code coverage report
Current view: top level - libreoffice/sd/source/ui/docshell - docshell.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 71 183 38.8 %
Date: 2012-12-27 Functions: 18 34 52.9 %
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 <vcl/svapp.hxx>
      23             : 
      24             : #include <sfx2/docfac.hxx>
      25             : #include <sfx2/objface.hxx>
      26             : 
      27             : #include <svx/svxids.hrc>
      28             : #include <svl/srchitem.hxx>
      29             : #include <svx/srchdlg.hxx>
      30             : #include <editeng/flstitem.hxx>
      31             : #include <svl/eitem.hxx>
      32             : #include <svl/intitem.hxx>
      33             : #include <sfx2/printer.hxx>
      34             : #include <sfx2/docfile.hxx>
      35             : #include <svx/drawitem.hxx>
      36             : #include <sfx2/dispatch.hxx>
      37             : #include <svl/whiter.hxx>
      38             : #include <svl/itempool.hxx>
      39             : #include <svtools/ctrltool.hxx>
      40             : #include <svtools/filter.hxx>
      41             : #include <sot/clsids.hxx>
      42             : #include <svl/cjkoptions.hxx>
      43             : #include <svl/visitem.hxx>
      44             : 
      45             : #include <svx/svdoutl.hxx>
      46             : 
      47             : #include <sfx2/fcontnr.hxx>
      48             : 
      49             : #include "app.hrc"
      50             : #include "app.hxx"
      51             : #include "strmname.h"
      52             : #include "stlpool.hxx"
      53             : #include "strings.hrc"
      54             : #include "View.hxx"
      55             : #include "drawdoc.hxx"
      56             : #include "sdpage.hxx"
      57             : #include "glob.hrc"
      58             : #include "res_bmp.hrc"
      59             : #include "fupoor.hxx"
      60             : #include "fusearch.hxx"
      61             : #include "ViewShell.hxx"
      62             : #include "sdresid.hxx"
      63             : #include "slideshow.hxx"
      64             : #include "drawview.hxx"
      65             : #include "FrameView.hxx"
      66             : #include "unomodel.hxx"
      67             : #include "undo/undomanager.hxx"
      68             : #include "undo/undofactory.hxx"
      69             : #include "OutlineView.hxx"
      70             : #include "ViewShellBase.hxx"
      71             : 
      72             : using namespace sd;
      73             : #define DrawDocShell
      74             : #include "sdslots.hxx"
      75             : 
      76          12 : SFX_IMPL_INTERFACE(DrawDocShell, SfxObjectShell, SdResId(0))
      77             : {
      78           3 :     SFX_CHILDWINDOW_REGISTRATION(SvxSearchDialogWrapper::GetChildWindowId());
      79           3 : }
      80             : 
      81             : 
      82             : namespace sd {
      83             : 
      84             : GraphicFilter* GetGrfFilter();
      85             : 
      86             : /*************************************************************************
      87             : |*
      88             : |* SFX-Slotmaps und -Definitionen
      89             : |*
      90             : \************************************************************************/
      91          87 : TYPEINIT1( DrawDocShell, SfxObjectShell );
      92             : 
      93         101 : SFX_IMPL_OBJECTFACTORY(
      94             :     DrawDocShell,
      95             :     SvGlobalName(SO3_SIMPRESS_CLASSID),
      96             :     SFXOBJECTSHELL_STD_NORMAL,
      97             :     "simpress" )
      98             : 
      99             : /*************************************************************************
     100             : |*
     101             : |* Construct
     102             : |*
     103             : \************************************************************************/
     104             : 
     105          18 : void DrawDocShell::Construct( bool bClipboard )
     106             : {
     107          18 :     mbInDestruction = sal_False;
     108          18 :     SetSlotFilter();     // setzt Filter zurueck
     109             : 
     110          18 :     mbOwnDocument = mpDoc == 0;
     111          18 :     if( mbOwnDocument )
     112          18 :         mpDoc = new SdDrawDocument(meDocType, this);
     113             : 
     114             :     // The document has been created so we can call UpdateRefDevice() to set
     115             :     // the document's ref device.
     116          18 :     UpdateRefDevice();
     117             : 
     118          18 :     SetBaseModel( new SdXImpressDocument( this, bClipboard ) );
     119          18 :     SetPool( &mpDoc->GetItemPool() );
     120          18 :     mpUndoManager = new sd::UndoManager;
     121          18 :     mpDoc->SetSdrUndoManager( mpUndoManager );
     122          18 :     mpDoc->SetSdrUndoFactory( new sd::UndoFactory );
     123          18 :     UpdateTablePointers();
     124          18 :     SetStyleFamily(5);       //CL: eigentlich SFX_STYLE_FAMILY_PSEUDO
     125          18 : }
     126             : 
     127             : /*************************************************************************
     128             : |*
     129             : |* Konstruktor 1
     130             : |*
     131             : \************************************************************************/
     132             : 
     133          12 : DrawDocShell::DrawDocShell(SfxObjectCreateMode eMode,
     134             :                                sal_Bool bDataObject,
     135             :                                DocumentType eDocumentType) :
     136             :     SfxObjectShell( eMode == SFX_CREATE_MODE_INTERNAL ?  SFX_CREATE_MODE_EMBEDDED : eMode),
     137             :     mpDoc(NULL),
     138             :     mpUndoManager(NULL),
     139             :     mpPrinter(NULL),
     140             :     mpViewShell(NULL),
     141             :     mpFontList(NULL),
     142             :     meDocType(eDocumentType),
     143             :     mpFilterSIDs(0),
     144             :     mbSdDataObj(bDataObject),
     145             :     mbOwnPrinter(sal_False),
     146          12 :     mbNewDocument( sal_True )
     147             : {
     148          12 :     Construct( eMode == SFX_CREATE_MODE_INTERNAL );
     149          12 : }
     150             : 
     151             : /*************************************************************************
     152             : |*
     153             : |* Konstruktor 2
     154             : |*
     155             : \************************************************************************/
     156             : 
     157           6 : DrawDocShell::DrawDocShell( const sal_uInt64 nModelCreationFlags, sal_Bool bDataObject, DocumentType eDocumentType ) :
     158             :     SfxObjectShell( nModelCreationFlags ),
     159             :     mpDoc(NULL),
     160             :     mpUndoManager(NULL),
     161             :     mpPrinter(NULL),
     162             :     mpViewShell(NULL),
     163             :     mpFontList(NULL),
     164             :     meDocType(eDocumentType),
     165             :     mpFilterSIDs(0),
     166             :     mbSdDataObj(bDataObject),
     167             :     mbOwnPrinter(sal_False),
     168           6 :     mbNewDocument( sal_True )
     169             : {
     170           6 :     Construct( sal_False );
     171           6 : }
     172             : 
     173             : /*************************************************************************
     174             : |*
     175             : |* Konstruktor 3
     176             : |*
     177             : \************************************************************************/
     178             : 
     179           0 : DrawDocShell::DrawDocShell(SdDrawDocument* pDoc, SfxObjectCreateMode eMode,
     180             :                                sal_Bool bDataObject,
     181             :                                DocumentType eDocumentType) :
     182             :     SfxObjectShell(eMode == SFX_CREATE_MODE_INTERNAL ?  SFX_CREATE_MODE_EMBEDDED : eMode),
     183             :     mpDoc(pDoc),
     184             :     mpUndoManager(NULL),
     185             :     mpPrinter(NULL),
     186             :     mpViewShell(NULL),
     187             :     mpFontList(NULL),
     188             :     meDocType(eDocumentType),
     189             :     mpFilterSIDs(0),
     190             :     mbSdDataObj(bDataObject),
     191             :     mbOwnPrinter(sal_False),
     192           0 :     mbNewDocument( sal_True )
     193             : {
     194           0 :     Construct( eMode == SFX_CREATE_MODE_INTERNAL );
     195           0 : }
     196             : 
     197             : /*************************************************************************
     198             : |*
     199             : |* Destruktor
     200             : |*
     201             : \************************************************************************/
     202             : 
     203          80 : DrawDocShell::~DrawDocShell()
     204             : {
     205             :     // Tell all listeners that the doc shell is about to be
     206             :     // destroyed.  This has been introduced for the PreviewRenderer to
     207             :     // free its view (that uses the item poll of the doc shell) but
     208             :     // may be usefull in other places as well.
     209          16 :     Broadcast(SfxSimpleHint(SFX_HINT_DYING));
     210             : 
     211          16 :     mbInDestruction = sal_True;
     212             : 
     213          16 :     SetDocShellFunction(0);
     214             : 
     215          16 :     delete mpFontList;
     216             : 
     217          16 :     if( mpDoc )
     218          16 :         mpDoc->SetSdrUndoManager( 0 );
     219          16 :     delete mpUndoManager;
     220             : 
     221          16 :     if (mbOwnPrinter)
     222           2 :         delete mpPrinter;
     223             : 
     224          16 :     if( mbOwnDocument )
     225          16 :         delete mpDoc;
     226             : 
     227             :     // damit der Navigator das Verschwinden des Dokuments mitbekommt
     228          16 :     SfxBoolItem     aItem(SID_NAVIGATOR_INIT, sal_True);
     229          16 :     SfxViewFrame*   pFrame = mpViewShell ? mpViewShell->GetFrame() : GetFrame();
     230             : 
     231          16 :     if( !pFrame )
     232          16 :         pFrame = SfxViewFrame::GetFirst( this );
     233             : 
     234          16 :     if( pFrame )
     235             :         pFrame->GetDispatcher()->Execute(
     236           0 :             SID_NAVIGATOR_INIT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L);
     237          64 : }
     238             : 
     239             : /*************************************************************************
     240             : |*
     241             : |* Slot-Stati setzen
     242             : |*
     243             : \************************************************************************/
     244             : 
     245           0 : void DrawDocShell::GetState(SfxItemSet &rSet)
     246             : {
     247             : 
     248           0 :     SfxWhichIter aIter( rSet );
     249           0 :     sal_uInt16 nWhich = aIter.FirstWhich();
     250             : 
     251           0 :     while ( nWhich )
     252             :     {
     253           0 :         sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
     254           0 :             ? GetPool().GetSlotId(nWhich)
     255           0 :             : nWhich;
     256             : 
     257           0 :         switch ( nSlotId )
     258             :         {
     259             :             case SID_SEARCH_ITEM:
     260             :             {
     261           0 :                 rSet.Put( *SD_MOD()->GetSearchItem() );
     262             :             }
     263           0 :             break;
     264             : 
     265             :             case SID_CLOSEDOC:
     266             :             {
     267           0 :                 sal_Bool bDisabled = sal_False;
     268           0 :                 if (bDisabled)
     269             :                 {
     270           0 :                     rSet.DisableItem(SID_CLOSEDOC);
     271             :                 }
     272             :                 else
     273             :                 {
     274           0 :                     GetSlotState(SID_CLOSEDOC, SfxObjectShell::GetInterface(), &rSet);
     275             :                 }
     276             :             }
     277           0 :             break;
     278             : 
     279             :             case SID_SEARCH_OPTIONS:
     280             :             {
     281             :                 sal_uInt16 nOpt = SEARCH_OPTIONS_SEARCH      |
     282             :                               SEARCH_OPTIONS_WHOLE_WORDS |
     283             :                               SEARCH_OPTIONS_BACKWARDS   |
     284             :                               SEARCH_OPTIONS_REG_EXP     |
     285             :                               SEARCH_OPTIONS_EXACT       |
     286             :                               SEARCH_OPTIONS_SIMILARITY  |
     287           0 :                               SEARCH_OPTIONS_SELECTION;
     288             : 
     289           0 :                 if (!IsReadOnly())
     290             :                 {
     291           0 :                     nOpt |= SEARCH_OPTIONS_REPLACE;
     292           0 :                     nOpt |= SEARCH_OPTIONS_REPLACE_ALL;
     293             :                 }
     294             : 
     295           0 :                 rSet.Put(SfxUInt16Item(nWhich, nOpt));
     296             :             }
     297           0 :             break;
     298             : 
     299             :             case SID_VERSION:
     300             :             {
     301           0 :                 GetSlotState( SID_VERSION, SfxObjectShell::GetInterface(), &rSet );
     302             :             }
     303           0 :             break;
     304             : 
     305             :             case SID_CHINESE_CONVERSION:
     306             :             case SID_HANGUL_HANJA_CONVERSION:
     307             :             {
     308           0 :                 rSet.Put(SfxVisibilityItem(nWhich, SvtCJKOptions().IsAnyEnabled()));
     309             :             }
     310           0 :             break;
     311             : 
     312             :             default:
     313           0 :             break;
     314             :         }
     315           0 :         nWhich = aIter.NextWhich();
     316             :     }
     317             : 
     318           0 :     SfxViewFrame* pFrame = SfxViewFrame::Current();
     319             : 
     320           0 :     if (pFrame)
     321             :     {
     322           0 :         if (rSet.GetItemState(SID_RELOAD) != SFX_ITEM_UNKNOWN)
     323             :         {
     324             :             pFrame->GetSlotState(SID_RELOAD,
     325           0 :                                  pFrame->GetInterface(), &rSet);
     326             :         }
     327           0 :     }
     328           0 : }
     329             : 
     330           0 : void DrawDocShell::InPlaceActivate( sal_Bool bActive )
     331             : {
     332           0 :     ViewShell* pViewSh = NULL;
     333           0 :     SfxViewShell* pSfxViewSh = NULL;
     334           0 :     SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(this, false);
     335           0 :     std::vector<FrameView*> &rViews = mpDoc->GetFrameViewList();
     336             : 
     337           0 :     if( !bActive )
     338             :     {
     339           0 :         std::vector<FrameView*>::iterator pIter;
     340           0 :         for ( pIter = rViews.begin(); pIter != rViews.end(); ++pIter )
     341           0 :             delete *pIter;
     342             : 
     343           0 :         rViews.clear();
     344             : 
     345           0 :         while (pSfxViewFrame)
     346             :         {
     347             :             // Anzahl FrameViews ermitteln
     348           0 :             pSfxViewSh = pSfxViewFrame->GetViewShell();
     349           0 :             pViewSh = PTR_CAST( ViewShell, pSfxViewSh );
     350             : 
     351           0 :             if ( pViewSh && pViewSh->GetFrameView() )
     352             :             {
     353           0 :                 pViewSh->WriteFrameViewData();
     354           0 :                 rViews.push_back( new FrameView( mpDoc, pViewSh->GetFrameView() ) );
     355             :             }
     356             : 
     357           0 :             pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false);
     358             :         }
     359             :     }
     360             : 
     361           0 :     SfxObjectShell::InPlaceActivate( bActive );
     362             : 
     363           0 :     if( bActive )
     364             :     {
     365           0 :         for( sal_uInt32 i = 0; pSfxViewFrame && (i < rViews.size()); i++ )
     366             :         {
     367             :             // Anzahl FrameViews ermitteln
     368           0 :             pSfxViewSh = pSfxViewFrame->GetViewShell();
     369           0 :             pViewSh = PTR_CAST( ViewShell, pSfxViewSh );
     370             : 
     371           0 :             if ( pViewSh )
     372             :             {
     373           0 :                 pViewSh->ReadFrameViewData( rViews[ i ] );
     374             :             }
     375             : 
     376           0 :             pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false);
     377             :         }
     378             :     }
     379           0 : }
     380             : 
     381             : /*************************************************************************
     382             : |*
     383             : |* SFX-Aktivierung
     384             : |*
     385             : \************************************************************************/
     386             : 
     387           0 : void DrawDocShell::Activate( sal_Bool bMDI)
     388             : {
     389           0 :     if (bMDI)
     390             :     {
     391           0 :         ApplySlotFilter();
     392           0 :         mpDoc->StartOnlineSpelling();
     393             :     }
     394           0 : }
     395             : 
     396             : /*************************************************************************
     397             : |*
     398             : |* SFX-Deaktivierung
     399             : |*
     400             : \************************************************************************/
     401             : 
     402           0 : void DrawDocShell::Deactivate( sal_Bool )
     403             : {
     404           0 : }
     405             : 
     406             : /*************************************************************************
     407             : |*
     408             : |* SFX-Undomanager zurueckgeben
     409             : |*
     410             : \************************************************************************/
     411             : 
     412         760 : ::svl::IUndoManager* DrawDocShell::GetUndoManager()
     413             : {
     414         760 :     return mpUndoManager;
     415             : }
     416             : 
     417             : 
     418             : 
     419             : /*************************************************************************
     420             : |*
     421             : |* Tabellenzeiger auffrischen
     422             : |*
     423             : \************************************************************************/
     424             : 
     425          19 : void DrawDocShell::UpdateTablePointers()
     426             : {
     427          19 :     PutItem( SvxColorListItem( mpDoc->GetColorList(), SID_COLOR_TABLE ) );
     428          19 :     PutItem( SvxGradientListItem( mpDoc->GetGradientList(), SID_GRADIENT_LIST ) );
     429          19 :     PutItem( SvxHatchListItem( mpDoc->GetHatchList(), SID_HATCH_LIST ) );
     430          19 :     PutItem( SvxBitmapListItem( mpDoc->GetBitmapList(), SID_BITMAP_LIST ) );
     431          19 :     PutItem( SvxDashListItem( mpDoc->GetDashList(), SID_DASH_LIST ) );
     432          19 :     PutItem( SvxLineEndListItem( mpDoc->GetLineEndList(), SID_LINEEND_LIST ) );
     433             : 
     434          19 :     UpdateFontList();
     435          19 : }
     436             : 
     437           0 : void DrawDocShell::CancelSearching()
     438             : {
     439           0 :     if( dynamic_cast<FuSearch*>( mxDocShellFunction.get() ) )
     440             :     {
     441           0 :         SetDocShellFunction(0);
     442             :     }
     443           0 : }
     444             : 
     445             : /*************************************************************************
     446             : |*
     447             : |*  den eingestellten SlotFilter anwenden
     448             : |*
     449             : \************************************************************************/
     450             : 
     451           0 : void DrawDocShell::ApplySlotFilter() const
     452             : {
     453           0 :     SfxViewShell* pTestViewShell = SfxViewShell::GetFirst();
     454             : 
     455           0 :     while( pTestViewShell )
     456             :     {
     457           0 :         if( pTestViewShell->GetObjectShell()
     458             :             == const_cast<DrawDocShell*>( this )
     459           0 :             && pTestViewShell->GetViewFrame()
     460           0 :             && pTestViewShell->GetViewFrame()->GetDispatcher() )
     461             :         {
     462           0 :             SfxDispatcher* pDispatcher = pTestViewShell->GetViewFrame()->GetDispatcher();
     463             : 
     464           0 :             if( mpFilterSIDs )
     465           0 :                 pDispatcher->SetSlotFilter( mbFilterEnable, mnFilterCount, mpFilterSIDs );
     466             :             else
     467           0 :                 pDispatcher->SetSlotFilter();
     468             : 
     469           0 :             if( pDispatcher->GetBindings() )
     470           0 :                 pDispatcher->GetBindings()->InvalidateAll( sal_True );
     471             :         }
     472             : 
     473           0 :         pTestViewShell = SfxViewShell::GetNext( *pTestViewShell );
     474             :     }
     475           0 : }
     476             : 
     477          57 : void DrawDocShell::SetModified( sal_Bool bSet /* = sal_True */ )
     478             : {
     479          57 :     SfxObjectShell::SetModified( bSet );
     480             : 
     481             :     // change model state, too
     482             :     // only set the changed state if modification is enabled
     483          57 :     if( IsEnableSetModified() )
     484             :     {
     485          36 :         if ( mpDoc )
     486          36 :             mpDoc->NbcSetChanged( bSet );
     487             : 
     488          36 :         Broadcast( SfxSimpleHint( SFX_HINT_DOCCHANGED ) );
     489             :     }
     490          57 : }
     491             : 
     492             : /*************************************************************************
     493             : |*
     494             : |* Callback fuer ExecuteSpellPopup()
     495             : |*
     496             : \************************************************************************/
     497             : 
     498             : // ExecuteSpellPopup now handled by DrawDocShell. This is necessary
     499             : // to get hands on the outliner and the text object.
     500           0 : IMPL_LINK(DrawDocShell, OnlineSpellCallback, SpellCallbackInfo*, pInfo)
     501             : {
     502           0 :     SdrObject* pObj = NULL;
     503           0 :     SdrOutliner* pOutl = NULL;
     504             : 
     505           0 :     if(GetViewShell())
     506             :     {
     507           0 :         pOutl = GetViewShell()->GetView()->GetTextEditOutliner();
     508           0 :         pObj = GetViewShell()->GetView()->GetTextEditObject();
     509             :     }
     510             : 
     511           0 :     mpDoc->ImpOnlineSpellCallback(pInfo, pObj, pOutl);
     512           0 :     return(0);
     513             : }
     514             : 
     515           2 : void DrawDocShell::ClearUndoBuffer()
     516             : {
     517             :     // clear possible undo buffers of outliners
     518           2 :     SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(this, false);
     519           4 :     while(pSfxViewFrame)
     520             :     {
     521           0 :         ViewShellBase* pViewShellBase = dynamic_cast< ViewShellBase* >( pSfxViewFrame->GetViewShell() );
     522           0 :         if( pViewShellBase )
     523             :         {
     524           0 :             ::boost::shared_ptr<ViewShell> pViewSh( pViewShellBase->GetMainViewShell() );
     525           0 :             if( pViewSh.get() )
     526             :             {
     527           0 :                 ::sd::View* pView = pViewSh->GetView();
     528           0 :                 if( pView )
     529             :                 {
     530           0 :                     pView->SdrEndTextEdit();
     531           0 :                     sd::OutlineView* pOutlView = dynamic_cast< sd::OutlineView* >( pView );
     532           0 :                     if( pOutlView )
     533             :                     {
     534           0 :                         SdrOutliner* pOutliner = pOutlView->GetOutliner();
     535           0 :                         if( pOutliner )
     536           0 :                             pOutliner->GetUndoManager().Clear();
     537             :                     }
     538             :                 }
     539           0 :             }
     540             :         }
     541           0 :         pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, this, false);
     542             :     }
     543             : 
     544           2 :     ::svl::IUndoManager* pUndoManager = GetUndoManager();
     545           2 :     if(pUndoManager && pUndoManager->GetUndoActionCount())
     546           0 :         pUndoManager->Clear();
     547           2 : }
     548             : 
     549           9 : } // end of namespace sd
     550             : 
     551             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10