xref: /trunk/main/sdext/source/minimizer/pagecollector.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir  /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sdext.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "pagecollector.hxx"
32*cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
33*cdf0e10cSrcweir #include <com/sun/star/presentation/XPresentationPage.hpp>
34*cdf0e10cSrcweir #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
35*cdf0e10cSrcweir #include <com/sun/star/drawing/XMasterPageTarget.hpp>
36*cdf0e10cSrcweir #include <com/sun/star/presentation/XCustomPresentationSupplier.hpp>
37*cdf0e10cSrcweir #include <com/sun/star/container/XNameContainer.hpp>
38*cdf0e10cSrcweir #include <com/sun/star/container/XIndexContainer.hpp>
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir using namespace ::rtl;
41*cdf0e10cSrcweir using namespace ::com::sun::star;
42*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
43*cdf0e10cSrcweir using namespace ::com::sun::star::awt;
44*cdf0e10cSrcweir using namespace ::com::sun::star::drawing;
45*cdf0e10cSrcweir using namespace ::com::sun::star::frame;
46*cdf0e10cSrcweir using namespace ::com::sun::star::beans;
47*cdf0e10cSrcweir using namespace ::com::sun::star::container;
48*cdf0e10cSrcweir using namespace ::com::sun::star::presentation;
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir void PageCollector::CollectCustomShowPages( const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& rxModel, const rtl::OUString& rCustomShowName, std::vector< Reference< XDrawPage > >& rUsedPageList )
51*cdf0e10cSrcweir {
52*cdf0e10cSrcweir     try
53*cdf0e10cSrcweir     {
54*cdf0e10cSrcweir         Reference< XCustomPresentationSupplier > aXCPSup( rxModel, UNO_QUERY_THROW );
55*cdf0e10cSrcweir         Reference< XNameContainer > aXCont( aXCPSup->getCustomPresentations() );
56*cdf0e10cSrcweir         if ( aXCont.is() )
57*cdf0e10cSrcweir         {
58*cdf0e10cSrcweir             // creating a list of every page that is used within our customshow
59*cdf0e10cSrcweir             Sequence< OUString> aNameSeq( aXCont->getElementNames() );
60*cdf0e10cSrcweir             const OUString* pUString = aNameSeq.getArray();
61*cdf0e10cSrcweir             sal_Int32 i, nCount = aNameSeq.getLength();
62*cdf0e10cSrcweir             for ( i = 0; i < nCount; i++ )
63*cdf0e10cSrcweir             {
64*cdf0e10cSrcweir                 if ( pUString[ i ] == rCustomShowName )
65*cdf0e10cSrcweir                 {
66*cdf0e10cSrcweir                     Reference< container::XIndexContainer > aXIC( aXCont->getByName( pUString[ i ] ), UNO_QUERY_THROW );
67*cdf0e10cSrcweir                     sal_Int32 j, nSlideCount = aXIC->getCount();
68*cdf0e10cSrcweir                     for ( j = 0; j < nSlideCount; j++ )
69*cdf0e10cSrcweir                     {
70*cdf0e10cSrcweir                         Reference< XDrawPage > xDrawPage( aXIC->getByIndex( j ), UNO_QUERY_THROW );
71*cdf0e10cSrcweir                         std::vector< Reference< XDrawPage > >::iterator aIter( rUsedPageList.begin() );
72*cdf0e10cSrcweir                         std::vector< Reference< XDrawPage > >::iterator aEnd( rUsedPageList.end() );
73*cdf0e10cSrcweir                         while( aIter != aEnd )
74*cdf0e10cSrcweir                         {
75*cdf0e10cSrcweir                             if ( *aIter == xDrawPage )
76*cdf0e10cSrcweir                                 break;
77*cdf0e10cSrcweir                             aIter++;
78*cdf0e10cSrcweir                         }
79*cdf0e10cSrcweir                         if ( aIter == aEnd )
80*cdf0e10cSrcweir                             rUsedPageList.push_back( xDrawPage );
81*cdf0e10cSrcweir                     }
82*cdf0e10cSrcweir                 }
83*cdf0e10cSrcweir             }
84*cdf0e10cSrcweir         }
85*cdf0e10cSrcweir     }
86*cdf0e10cSrcweir     catch( Exception& )
87*cdf0e10cSrcweir     {
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir     }
90*cdf0e10cSrcweir }
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir void PageCollector::CollectNonCustomShowPages( const com::sun::star::uno::Reference< com::sun::star::frame::XModel >& rxModel, const rtl::OUString& rCustomShowName, std::vector< Reference< XDrawPage > >& rNonUsedPageList )
93*cdf0e10cSrcweir {
94*cdf0e10cSrcweir     try
95*cdf0e10cSrcweir     {
96*cdf0e10cSrcweir         std::vector< Reference< XDrawPage > > vUsedPageList;
97*cdf0e10cSrcweir         PageCollector::CollectCustomShowPages( rxModel, rCustomShowName, vUsedPageList );
98*cdf0e10cSrcweir         if ( vUsedPageList.size() )
99*cdf0e10cSrcweir         {
100*cdf0e10cSrcweir             Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
101*cdf0e10cSrcweir             Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_QUERY_THROW );
102*cdf0e10cSrcweir             for ( sal_Int32 j = 0; j < xDrawPages->getCount(); j++ )
103*cdf0e10cSrcweir             {
104*cdf0e10cSrcweir                 Reference< XDrawPage > xDrawPage( xDrawPages->getByIndex( j ), UNO_QUERY_THROW );
105*cdf0e10cSrcweir                 std::vector< Reference< XDrawPage > >::iterator aIter( vUsedPageList.begin() );
106*cdf0e10cSrcweir                 std::vector< Reference< XDrawPage > >::iterator aEnd( vUsedPageList.end() );
107*cdf0e10cSrcweir                 while( aIter != aEnd )
108*cdf0e10cSrcweir                 {
109*cdf0e10cSrcweir                     if ( *aIter == xDrawPage )
110*cdf0e10cSrcweir                         break;
111*cdf0e10cSrcweir                     aIter++;
112*cdf0e10cSrcweir                 }
113*cdf0e10cSrcweir                 if ( aIter == aEnd )
114*cdf0e10cSrcweir                     rNonUsedPageList.push_back( xDrawPage );
115*cdf0e10cSrcweir             }
116*cdf0e10cSrcweir         }
117*cdf0e10cSrcweir     }
118*cdf0e10cSrcweir     catch( Exception& )
119*cdf0e10cSrcweir     {
120*cdf0e10cSrcweir     }
121*cdf0e10cSrcweir }
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir void PageCollector::CollectMasterPages( const Reference< XModel >& rxModel, std::vector< PageCollector::MasterPageEntity >& rMasterPageList )
125*cdf0e10cSrcweir {
126*cdf0e10cSrcweir     typedef std::vector< MasterPageEntity > MasterPageList;
127*cdf0e10cSrcweir     typedef MasterPageList::iterator MasterPageIter;
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir     try
130*cdf0e10cSrcweir     {
131*cdf0e10cSrcweir         // generating list of all master pages
132*cdf0e10cSrcweir         Reference< XMasterPagesSupplier > xMasterPagesSupplier( rxModel, UNO_QUERY_THROW );
133*cdf0e10cSrcweir         Reference< XDrawPages > xMasterPages( xMasterPagesSupplier->getMasterPages(), UNO_QUERY_THROW );
134*cdf0e10cSrcweir         for ( sal_Int32 i = 0; i < xMasterPages->getCount(); i++ )
135*cdf0e10cSrcweir         {
136*cdf0e10cSrcweir             Reference< XDrawPage > xMasterPage( xMasterPages->getByIndex( i ), UNO_QUERY_THROW );
137*cdf0e10cSrcweir             MasterPageIter aIter( rMasterPageList.begin() );
138*cdf0e10cSrcweir             MasterPageIter aEnd ( rMasterPageList.end() );
139*cdf0e10cSrcweir             while( aIter != aEnd )
140*cdf0e10cSrcweir             {
141*cdf0e10cSrcweir                 if ( aIter->xMasterPage == xMasterPage )
142*cdf0e10cSrcweir                     break;
143*cdf0e10cSrcweir                 aIter++;
144*cdf0e10cSrcweir             }
145*cdf0e10cSrcweir             if ( aIter == aEnd )
146*cdf0e10cSrcweir             {
147*cdf0e10cSrcweir                 MasterPageEntity aMasterPageEntity;
148*cdf0e10cSrcweir                 aMasterPageEntity.xMasterPage = xMasterPage;
149*cdf0e10cSrcweir                 aMasterPageEntity.bUsed = sal_False;
150*cdf0e10cSrcweir                 rMasterPageList.push_back( aMasterPageEntity );
151*cdf0e10cSrcweir             }
152*cdf0e10cSrcweir         }
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir         // mark masterpages which are referenced by drawpages
155*cdf0e10cSrcweir         Reference< XDrawPagesSupplier > xDrawPagesSupplier( rxModel, UNO_QUERY_THROW );
156*cdf0e10cSrcweir         Reference< XDrawPages > xDrawPages( xDrawPagesSupplier->getDrawPages(), UNO_QUERY_THROW );
157*cdf0e10cSrcweir         for ( sal_Int32 j = 0; j < xDrawPages->getCount(); j++ )
158*cdf0e10cSrcweir         {
159*cdf0e10cSrcweir             Reference< XMasterPageTarget > xMasterPageTarget( xDrawPages->getByIndex( j ), UNO_QUERY_THROW );
160*cdf0e10cSrcweir             Reference< XDrawPage > xMasterPage( xMasterPageTarget->getMasterPage(), UNO_QUERY_THROW );
161*cdf0e10cSrcweir             MasterPageIter aIter( rMasterPageList.begin() );
162*cdf0e10cSrcweir             MasterPageIter aEnd ( rMasterPageList.end() );
163*cdf0e10cSrcweir             while( aIter != aEnd )
164*cdf0e10cSrcweir             {
165*cdf0e10cSrcweir                 if ( aIter->xMasterPage == xMasterPage )
166*cdf0e10cSrcweir                 {
167*cdf0e10cSrcweir                     aIter->bUsed = sal_True;
168*cdf0e10cSrcweir                     break;
169*cdf0e10cSrcweir                 }
170*cdf0e10cSrcweir                 aIter++;
171*cdf0e10cSrcweir             }
172*cdf0e10cSrcweir             if ( aIter == aEnd )
173*cdf0e10cSrcweir                 throw uno::RuntimeException();
174*cdf0e10cSrcweir         }
175*cdf0e10cSrcweir     }
176*cdf0e10cSrcweir     catch( Exception& )
177*cdf0e10cSrcweir     {
178*cdf0e10cSrcweir     }
179*cdf0e10cSrcweir }
180*cdf0e10cSrcweir 
181