Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <editeng/numitem.hxx>
21 :
22 : #include <unotools/ucbstreamhelper.hxx>
23 : #include <vcl/wrkwin.hxx>
24 : #include <svl/urihelper.hxx>
25 : #include <svx/svxids.hrc>
26 : #include <filter/msfilter/svdfppt.hxx>
27 : #include <svx/svditer.hxx>
28 : #include <sfx2/docfile.hxx>
29 : #include <sfx2/app.hxx>
30 : #include <svx/svdograf.hxx>
31 : #include <svx/svdlayer.hxx>
32 : #include <vcl/msgbox.hxx>
33 : #include <svl/style.hxx>
34 : #include <svx/xflclit.hxx>
35 : #include <editeng/eeitem.hxx>
36 : #include <editeng/colritem.hxx>
37 : #include <svl/whiter.hxx>
38 : #include <svx/xgrad.hxx>
39 : #include <svx/xflgrit.hxx>
40 : #include <svx/xbtmpit.hxx>
41 : #include <svx/xlnclit.hxx>
42 : #include <editeng/adjustitem.hxx>
43 : #include <editeng/editeng.hxx>
44 : #include <editeng/bulletitem.hxx>
45 : #include <editeng/lrspitem.hxx>
46 : #include <editeng/lspcitem.hxx>
47 : #include <editeng/tstpitem.hxx>
48 :
49 : #include <sfx2/docinf.hxx>
50 :
51 : #include "glob.hrc"
52 : #include "pptin.hxx"
53 : #include "Outliner.hxx"
54 : #include "drawdoc.hxx"
55 : #include "sdpage.hxx"
56 : #include "sdresid.hxx"
57 : #include "pres.hxx"
58 : #include "stlpool.hxx"
59 : #include "anminfo.hxx"
60 : #include <svx/gallery.hxx>
61 : #include <tools/urlobj.hxx>
62 : #include <svl/itempool.hxx>
63 : #include <editeng/fhgtitem.hxx>
64 : #include <svx/svdopage.hxx>
65 : #include <svx/svdomedia.hxx>
66 : #include <svx/svdogrp.hxx>
67 : #include "propread.hxx"
68 : #include <cusshow.hxx>
69 : #include <vcl/bmpacc.hxx>
70 : #include "customshowlist.hxx"
71 :
72 : #include "../../ui/inc/DrawDocShell.hxx"
73 : #include "../../ui/inc/FrameView.hxx"
74 : #include "../../ui/inc/optsitem.hxx"
75 :
76 : #include <unotools/fltrcfg.hxx>
77 : #include <sfx2/progress.hxx>
78 : #include <unotools/localfilehelper.hxx>
79 : #include <editeng/editstat.hxx>
80 : #include <unotools/pathoptions.hxx>
81 : #include <sfx2/docfac.hxx>
82 : #define MAX_USER_MOVE 2
83 :
84 : #include "pptinanimations.hxx"
85 : #include "ppt97animations.hxx"
86 :
87 : #include <com/sun/star/document/XDocumentProperties.hpp>
88 : #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
89 :
90 : #include <comphelper/string.hxx>
91 : #include <oox/ole/olehelper.hxx>
92 :
93 : #include <cassert>
94 : #include <boost/make_shared.hpp>
95 :
96 : using namespace ::com::sun::star;
97 :
98 20 : SdPPTImport::SdPPTImport( SdDrawDocument* pDocument, SvStream& rDocStream, SvStorage& rStorage, SfxMedium& rMedium )
99 : {
100 :
101 20 : sal_uInt32 nImportFlags = 0;
102 :
103 : #ifdef DBG_UTIL
104 : PropRead* pSummaryInformation = new PropRead( rStorage, OUString( "\005SummaryInformation" ) );
105 : if ( pSummaryInformation->IsValid() )
106 : {
107 : pSummaryInformation->Read();
108 : sal_uInt8 aPropSetGUID[ 16 ] =
109 : {
110 : 0xe0, 0x85, 0x9f, 0xf2, 0xf9, 0x4f, 0x68, 0x10, 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9
111 : };
112 : Section* pSection = (Section*)pSummaryInformation->GetSection( aPropSetGUID );
113 : if ( pSection )
114 : {
115 : PropItem aPropItem;
116 : if ( pSection->GetProperty( PID_COMMENTS, aPropItem ) )
117 : {
118 : OUString aComment;
119 : aPropItem.Read( aComment );
120 : if ( aComment.indexOf( "Applixware" ) >= 0 )
121 : {
122 : nImportFlags |= PPT_IMPORTFLAGS_NO_TEXT_ASSERT;
123 : }
124 : }
125 : }
126 : }
127 : delete pSummaryInformation;
128 : #endif
129 :
130 20 : PowerPointImportParam aParam( rDocStream, nImportFlags );
131 20 : SvStream* pCurrentUserStream = rStorage.OpenSotStream( OUString( "Current User" ), STREAM_STD_READ );
132 20 : if( pCurrentUserStream )
133 : {
134 20 : ReadPptCurrentUserAtom( *pCurrentUserStream, aParam.aCurrentUserAtom );
135 20 : delete pCurrentUserStream;
136 : }
137 :
138 20 : if( pDocument )
139 : {
140 : // iterate over all styles
141 20 : SdStyleSheetPool* pStyleSheetPool = pDocument->GetSdStyleSheetPool();
142 : SfxStyleSheetIteratorPtr aIter =
143 20 : boost::make_shared<SfxStyleSheetIterator>(pStyleSheetPool, SFX_STYLE_FAMILY_ALL);
144 :
145 1580 : for (SfxStyleSheetBase *pSheet = aIter->First(); pSheet; pSheet = aIter->Next())
146 : {
147 1560 : SfxItemSet& rSet = pSheet->GetItemSet();
148 : // if autokerning is set in style, override it, ppt has no autokerning
149 1560 : if( rSet.GetItemState( EE_CHAR_PAIRKERNING, false ) == SfxItemState::SET )
150 160 : rSet.ClearItem( EE_CHAR_PAIRKERNING );
151 20 : }
152 : }
153 :
154 20 : pFilter = new ImplSdPPTImport( pDocument, rStorage, rMedium, aParam );
155 20 : }
156 :
157 20 : bool SdPPTImport::Import()
158 : {
159 20 : return pFilter->Import();
160 : }
161 :
162 20 : SdPPTImport::~SdPPTImport()
163 : {
164 20 : delete pFilter;
165 20 : }
166 :
167 20 : ImplSdPPTImport::ImplSdPPTImport( SdDrawDocument* pDocument, SvStorage& rStorage_, SfxMedium& rMedium, PowerPointImportParam& rParam )
168 : : SdrPowerPointImport(rParam, rMedium.GetBaseURL())
169 : , mrMed(rMedium)
170 : , mrStorage(rStorage_)
171 : , mbDocumentFound(false)
172 : , mnFilterOptions(0)
173 : , mpDoc(pDocument)
174 : , mePresChange(PRESCHANGE_MANUAL)
175 : , mnBackgroundLayerID(0)
176 20 : , mnBackgroundObjectsLayerID(0)
177 : {
178 20 : if ( bOk )
179 : {
180 18 : mbDocumentFound = SeekToDocument( &maDocHd ); // maDocHd = the latest DocumentHeader
181 36 : while ( SeekToRec( rStCtrl, PPT_PST_Document, nStreamLen, &maDocHd ) )
182 0 : mbDocumentFound = true;
183 :
184 18 : sal_uInt32 nDggContainerOfs = 0;
185 :
186 18 : if ( mbDocumentFound )
187 : {
188 18 : sal_uLong nPosMerk = rStCtrl.Tell();
189 :
190 18 : pStData = rStorage_.OpenSotStream( OUString( "Pictures" ), STREAM_STD_READ );
191 :
192 18 : rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
193 18 : sal_uLong nDocLen = maDocHd.GetRecEndFilePos();
194 18 : DffRecordHeader aPPDGHd;
195 18 : if ( SeekToRec( rStCtrl, PPT_PST_PPDrawingGroup, nDocLen, &aPPDGHd ) )
196 : {
197 18 : sal_uLong nPPDGLen = aPPDGHd.GetRecEndFilePos();
198 18 : if ( SeekToRec( rStCtrl, DFF_msofbtDggContainer, nPPDGLen, NULL ) )
199 18 : nDggContainerOfs = rStCtrl.Tell();
200 : }
201 18 : rStCtrl.Seek( nPosMerk );
202 : }
203 18 : sal_uInt32 nSvxMSDffOLEConvFlags2 = 0;
204 :
205 18 : const SvtFilterOptions& rBasOpt = SvtFilterOptions::Get();
206 18 : if ( rBasOpt.IsLoadPPointBasicCode() )
207 18 : mnFilterOptions |= 1;
208 18 : if ( rBasOpt.IsMathType2Math() )
209 18 : nSvxMSDffOLEConvFlags2 |= OLE_MATHTYPE_2_STARMATH;
210 18 : if ( rBasOpt.IsWinWord2Writer() )
211 18 : nSvxMSDffOLEConvFlags2 |= OLE_WINWORD_2_STARWRITER;
212 18 : if ( rBasOpt.IsExcel2Calc() )
213 18 : nSvxMSDffOLEConvFlags2 |= OLE_EXCEL_2_STARCALC;
214 18 : if ( rBasOpt.IsPowerPoint2Impress() )
215 18 : nSvxMSDffOLEConvFlags2 |= OLE_POWERPOINT_2_STARIMPRESS;
216 :
217 18 : InitSvxMSDffManager( nDggContainerOfs, pStData, nSvxMSDffOLEConvFlags2 );
218 : SetSvxMSDffSettings( SVXMSDFF_SETTINGS_CROP_BITMAPS
219 18 : | SVXMSDFF_SETTINGS_IMPORT_PPT );
220 18 : SetModel( mpDoc, 576 );
221 : }
222 20 : }
223 :
224 : // Dtor
225 60 : ImplSdPPTImport::~ImplSdPPTImport()
226 : {
227 20 : delete pStData;
228 40 : }
229 :
230 : // Import
231 20 : bool ImplSdPPTImport::Import()
232 : {
233 20 : if ( !bOk )
234 2 : return false;
235 :
236 18 : pSdrModel->setLock(true);
237 18 : pSdrModel->EnableUndo(false);
238 :
239 18 : SdrOutliner& rOutl = mpDoc->GetDrawOutliner();
240 18 : sal_uInt32 nControlWord = rOutl.GetEditEngine().GetControlWord();
241 18 : nControlWord |= EE_CNTRL_ULSPACESUMMATION;
242 18 : nControlWord &=~ EE_CNTRL_ULSPACEFIRSTPARA;
243 18 : ((EditEngine&)rOutl.GetEditEngine()).SetControlWord( nControlWord );
244 :
245 18 : SdrLayerAdmin& rAdmin = mpDoc->GetLayerAdmin();
246 18 : mnBackgroundLayerID = rAdmin.GetLayerID( SD_RESSTR( STR_LAYER_BCKGRND ), false );
247 18 : mnBackgroundObjectsLayerID = rAdmin.GetLayerID( SD_RESSTR( STR_LAYER_BCKGRNDOBJ ), false );
248 :
249 18 : ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh();
250 18 : if ( pDocShell )
251 18 : SeekOle( pDocShell, mnFilterOptions );
252 :
253 : // hyperlinks
254 18 : PropRead* pDInfoSec2 = new PropRead( mrStorage, OUString( "\005DocumentSummaryInformation" ) );
255 18 : if ( pDInfoSec2->IsValid() )
256 : {
257 18 : PropItem aPropItem;
258 :
259 : sal_uInt32 nType, nPropSize, nPropCount;
260 :
261 18 : pDInfoSec2->Read();
262 :
263 : sal_uInt8 aPropSetGUID[ 16 ] =
264 : {
265 : 0x02, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae
266 18 : };
267 18 : Section* pSection = (Section*)pDInfoSec2->GetSection( aPropSetGUID );
268 18 : if ( pSection )
269 : {
270 18 : if ( pSection->GetProperty( PID_SLIDECOUNT, aPropItem ) )
271 : {
272 8 : aPropItem.ReadUInt32( nType );
273 8 : if ( ( nType == VT_I4 ) || ( nType == VT_UI4 ) )
274 : {
275 : // examine PID_HEADINGPAIR to get the correct entry for PID_DOCPARTS
276 : sal_uInt32 nSlideCount, nVecCount;
277 8 : aPropItem.ReadUInt32( nSlideCount );
278 8 : if ( nSlideCount && pSection->GetProperty( PID_HEADINGPAIR, aPropItem ) )
279 : {
280 8 : sal_uInt32 nSlideTitleIndex = 0, nSlideTitleCount = 0;
281 : sal_uInt32 i, nTemp;
282 :
283 8 : OUString aUString;
284 :
285 8 : aPropItem.ReadUInt32( nType )
286 8 : .ReadUInt32( nVecCount );
287 :
288 8 : if ( ( nType == ( VT_VARIANT | VT_VECTOR ) ) && ( nVecCount ^ 1 ) )
289 : {
290 8 : nVecCount >>= 1;
291 8 : sal_uInt32 nEntryCount = 0;
292 32 : for ( i = 0; i < nVecCount; i++ )
293 : {
294 24 : if ( !aPropItem.Read( aUString, VT_EMPTY, false ) )
295 0 : break;
296 24 : aPropItem.ReadUInt32( nType );
297 24 : if ( ( nType != VT_I4 ) && ( nType != VT_UI4 ) )
298 0 : break;
299 24 : aPropItem.ReadUInt32( nTemp );
300 24 : if ( aUString == "Slide Titles" || aUString == "Folientitel" )
301 : {
302 4 : nSlideTitleCount = nTemp;
303 4 : nSlideTitleIndex = nEntryCount;
304 : }
305 24 : nEntryCount += nTemp;
306 : }
307 : }
308 8 : if ( ( nSlideCount == nSlideTitleCount ) && pSection->GetProperty( PID_DOCPARTS, aPropItem ) )
309 : {
310 4 : aPropItem.ReadUInt32( nType )
311 4 : .ReadUInt32( nVecCount );
312 :
313 4 : if ( ( nVecCount >= ( nSlideTitleIndex + nSlideTitleCount ) )
314 4 : && ( nType == ( VT_LPSTR | VT_VECTOR ) ) )
315 : {
316 22 : for ( i = 0; i != nSlideTitleIndex; i++ )
317 : {
318 18 : aPropItem.ReadUInt32( nTemp );
319 18 : aPropItem.SeekRel( nTemp );
320 : }
321 10 : for ( i = 0; i < nSlideTitleCount; i++ )
322 : {
323 6 : if ( !aPropItem.Read( aUString, nType, false ) )
324 0 : break;
325 :
326 6 : OUString aString( aUString );
327 6 : if ( aString == "No Slide Title" )
328 0 : aString = OUString();
329 : else
330 : {
331 : std::vector<OUString>::const_iterator pIter =
332 6 : std::find(maSlideNameList.begin(),maSlideNameList.end(),aString);
333 :
334 6 : if (pIter != maSlideNameList.end())
335 2 : aString = OUString();
336 : }
337 6 : maSlideNameList.push_back( aString );
338 6 : }
339 : }
340 8 : }
341 : }
342 : }
343 : }
344 :
345 : sal_uInt8 aUserPropSetGUID[ 16 ] =
346 : {
347 : 0x05, 0xd5, 0xcd, 0xd5, 0x9c, 0x2e, 0x1b, 0x10, 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae
348 18 : };
349 18 : pSection = (Section*)pDInfoSec2->GetSection( aUserPropSetGUID );
350 18 : if ( pSection )
351 : {
352 10 : Dictionary aDict;
353 10 : if ( pSection->GetDictionary( aDict ) )
354 : {
355 10 : Dictionary::const_iterator iter = aDict.find( OUString("_PID_HLINKS") );
356 :
357 10 : if ( iter != aDict.end() )
358 : {
359 4 : if ( pSection->GetProperty( iter->second, aPropItem ) )
360 : {
361 4 : aPropItem.Seek( STREAM_SEEK_TO_BEGIN );
362 4 : aPropItem.ReadUInt32( nType );
363 4 : if ( nType == VT_BLOB )
364 : {
365 4 : aPropItem.ReadUInt32( nPropSize )
366 4 : .ReadUInt32( nPropCount );
367 :
368 4 : if ( ! ( nPropCount % 6 ) )
369 : {
370 : sal_uInt32 i;
371 :
372 4 : nPropCount /= 6; // 6 propertys a hyperlink
373 :
374 4 : SdHyperlinkEntry* pHyperlink = 0;
375 8 : for ( i = 0; i < nPropCount; i++ )
376 : {
377 0 : pHyperlink = new SdHyperlinkEntry;
378 0 : pHyperlink->nIndex = 0;
379 0 : aPropItem.ReadUInt32( nType );
380 0 : if ( nType != VT_I4 )
381 0 : break;
382 0 : aPropItem.ReadInt32( pHyperlink->nPrivate1 )
383 0 : .ReadUInt32( nType );
384 0 : if ( nType != VT_I4 )
385 0 : break;
386 0 : aPropItem.ReadInt32( pHyperlink->nPrivate2 )
387 0 : .ReadUInt32( nType );
388 0 : if ( nType != VT_I4 )
389 0 : break;
390 0 : aPropItem.ReadInt32( pHyperlink->nPrivate3 )
391 0 : .ReadUInt32( nType );
392 0 : if ( nType != VT_I4 )
393 0 : break;
394 0 : aPropItem.ReadInt32( pHyperlink->nInfo );
395 0 : if ( !aPropItem.Read( pHyperlink->aTarget, VT_EMPTY ) )
396 0 : break;
397 :
398 : // Convert '\\' notation to 'smb://'
399 0 : INetURLObject aUrl( pHyperlink->aTarget, INET_PROT_FILE );
400 0 : pHyperlink->aTarget = aUrl.GetMainURL( INetURLObject::NO_DECODE );
401 :
402 0 : if ( !aPropItem.Read( pHyperlink->aSubAdress, VT_EMPTY ) )
403 0 : break;
404 0 : pHyperlink->nStartPos = pHyperlink->nEndPos = -1;
405 :
406 0 : if ( !pHyperlink->aSubAdress.isEmpty() ) // get the converted subadress
407 : {
408 0 : sal_uInt32 nPageNumber = 0;
409 0 : OUString aString( pHyperlink->aSubAdress );
410 0 : OString aStringAry[ 3 ];
411 0 : sal_uInt16 nTokenCount = comphelper::string::getTokenCount(aString, ',');
412 0 : if ( nTokenCount > 3 )
413 0 : nTokenCount = 3;
414 : sal_uInt16 nToken;
415 0 : for( nToken = 0; nToken < nTokenCount; nToken++ )
416 0 : aStringAry[nToken] = OUStringToOString(aString.getToken( nToken, (sal_Unicode)',' ), RTL_TEXTENCODING_UTF8);
417 :
418 0 : bool bDocInternalSubAddress = false;
419 :
420 : // first pass, searching for a SlideId
421 0 : for( nToken = 0; nToken < nTokenCount; nToken++ )
422 : {
423 0 : if (comphelper::string::isdigitAsciiString(aStringAry[nToken]))
424 : {
425 0 : sal_Int32 nNumber = aStringAry[ nToken ].toInt32();
426 0 : if ( nNumber & ~0xff )
427 : {
428 0 : PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE );
429 0 : if ( pPageList )
430 : {
431 0 : sal_uInt16 nPage = pPageList->FindPage( nNumber );
432 0 : if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND )
433 : {
434 0 : nPageNumber = nPage;
435 0 : bDocInternalSubAddress = true;
436 0 : break;
437 : }
438 : }
439 : }
440 : }
441 : }
442 0 : if ( !bDocInternalSubAddress )
443 : { // second pass, searching for a SlideName
444 0 : for ( nToken = 0; nToken < nTokenCount; nToken++ )
445 : {
446 0 : OUString aToken(OStringToOUString(aStringAry[nToken], RTL_TEXTENCODING_UTF8));
447 : std::vector<OUString>::const_iterator pIter =
448 0 : std::find(maSlideNameList.begin(),maSlideNameList.end(),aToken);
449 :
450 0 : if (pIter != maSlideNameList.end())
451 : {
452 0 : nPageNumber = pIter - maSlideNameList.begin();
453 0 : bDocInternalSubAddress = true;
454 : }
455 0 : }
456 : }
457 0 : if ( !bDocInternalSubAddress )
458 : { // third pass, searching for a slide number
459 0 : for ( nToken = 0; nToken < nTokenCount; nToken++ )
460 : {
461 0 : if (comphelper::string::isdigitAsciiString(aStringAry[nToken]))
462 : {
463 0 : sal_Int32 nNumber = aStringAry[ nToken ].toInt32();
464 0 : if ( ( nNumber & ~0xff ) == 0 )
465 : {
466 0 : nPageNumber = (sal_uInt32)nNumber - 1;
467 0 : bDocInternalSubAddress = true;
468 0 : break;
469 : }
470 : }
471 : }
472 : }
473 : // if a document internal sub address
474 0 : if ( bDocInternalSubAddress )
475 : {
476 0 : if ( nPageNumber < maSlideNameList.size() )
477 0 : pHyperlink->aConvSubString = maSlideNameList[ nPageNumber ];
478 0 : if ( pHyperlink->aConvSubString.isEmpty() )
479 : {
480 0 : pHyperlink->aConvSubString = OUString( SdResId( STR_PAGE ) ) + " " + ( mpDoc->CreatePageNumValue( (sal_uInt16)nPageNumber + 1 ) );
481 : }
482 : } else {
483 : // if sub address is given but not internal, use it as it is
484 0 : if ( pHyperlink->aConvSubString.isEmpty() )
485 : {
486 0 : pHyperlink->aConvSubString = aString;
487 : }
488 0 : }
489 : }
490 0 : aHyperList.push_back( pHyperlink );
491 0 : }
492 4 : if ( i != nPropCount )
493 0 : delete pHyperlink;
494 : }
495 : }
496 : }
497 : }
498 10 : }
499 : }
500 18 : }
501 : }
502 18 : delete pDInfoSec2;
503 :
504 18 : if ( mbDocumentFound )
505 : {
506 18 : rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
507 : // read hyperlist / set indices of the entries
508 18 : DffRecordHeader aHyperHd;
509 18 : if ( SeekToRec( rStCtrl, PPT_PST_ExObjList, maDocHd.GetRecEndFilePos(), &aHyperHd ) )
510 : {
511 8 : sal_uInt32 nExObjHyperListLen = aHyperHd.GetRecEndFilePos();
512 16 : for ( size_t i = 0, n = aHyperList.size(); i < n; ++i )
513 : {
514 0 : SdHyperlinkEntry* pPtr = aHyperList[ i ];
515 0 : DffRecordHeader aHyperE;
516 0 : if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlink, nExObjHyperListLen, &aHyperE ) )
517 0 : break;
518 0 : if ( !SeekToRec( rStCtrl, PPT_PST_ExHyperlinkAtom, nExObjHyperListLen, NULL, 0 ) )
519 0 : break;
520 0 : rStCtrl.SeekRel( 8 );
521 0 : rStCtrl.ReadUInt32( pPtr->nIndex );
522 0 : aHyperE.SeekToEndOfRecord( rStCtrl );
523 : }
524 : }
525 : }
526 :
527 18 : Size aVisAreaSize;
528 18 : switch ( aUserEditAtom.eLastViewType )
529 : {
530 : case 5 : // notes master
531 : case 3 : // notes
532 0 : aVisAreaSize = aDocAtom.GetNotesPageSize();
533 0 : break;
534 : default :
535 18 : aVisAreaSize = aDocAtom.GetSlidesPageSize();
536 : }
537 18 : Scale( aVisAreaSize );
538 18 : pDocShell->SetVisArea( Rectangle( Point(), aVisAreaSize ) );
539 :
540 : // create master pages:
541 :
542 : SfxProgress* pStbMgr = new SfxProgress( pDocShell, SD_RESSTR( STR_POWERPOINT_IMPORT ),
543 18 : pMasterPages->size() + pSlidePages->size() + pNotePages->size() );
544 :
545 18 : sal_uInt32 nImportedPages = 0;
546 : {
547 18 : sal_uInt16 nMasterAnz = GetPageCount( PPT_MASTERPAGE );
548 :
549 76 : for ( sal_uInt16 nMasterNum = 0; nMasterNum < nMasterAnz; nMasterNum++ )
550 : {
551 58 : SetPageNum( nMasterNum, PPT_MASTERPAGE );
552 58 : SdPage* pPage = (SdPage*)MakeBlancPage( true );
553 58 : if ( pPage )
554 : {
555 58 : bool bNotesMaster = (*GetPageList( eAktPageKind ) )[ nAktPageNum ].bNotesMaster;
556 58 : bool bStarDrawFiller = (*GetPageList( eAktPageKind ) )[ nAktPageNum ].bStarDrawFiller;
557 :
558 58 : PageKind ePgKind = ( bNotesMaster ) ? PK_NOTES : PK_STANDARD;
559 58 : bool bHandout = (*GetPageList( eAktPageKind ) )[ nAktPageNum ].bHandoutMaster;
560 58 : if ( bHandout )
561 18 : ePgKind = PK_HANDOUT;
562 :
563 58 : pPage->SetPageKind( ePgKind );
564 58 : pSdrModel->InsertMasterPage( (SdrPage*)pPage );
565 58 : if ( bNotesMaster && bStarDrawFiller )
566 8 : ((SdPage*)pPage)->SetAutoLayout( AUTOLAYOUT_NOTES, true );
567 58 : if ( nMasterNum )
568 : {
569 40 : boost::optional< sal_Int16 > oStartNumbering;
570 : SfxStyleSheet* pSheet;
571 40 : if ( nMasterNum == 1 )
572 : {
573 : // standardsheet
574 18 : pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find(SD_RESSTR(STR_STANDARD_STYLESHEET_NAME), SD_STYLE_FAMILY_GRAPHICS );
575 18 : if ( pSheet )
576 : {
577 18 : SfxItemSet& rItemSet = pSheet->GetItemSet();
578 18 : PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 );
579 36 : PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 );
580 18 : aParagraph.AppendPortion( aPortion );
581 18 : aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL );
582 36 : aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff );
583 : }
584 : }
585 :
586 : // PSEUDO
587 40 : pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find(SD_RESSTR(STR_PSEUDOSHEET_BACKGROUNDOBJECTS), SD_STYLE_FAMILY_PSEUDO );
588 40 : if ( pSheet )
589 : {
590 40 : SfxItemSet& rItemSet = pSheet->GetItemSet();
591 40 : PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 );
592 80 : PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_TEXT_IN_SHAPE, 0 );
593 40 : aParagraph.AppendPortion( aPortion );
594 40 : aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL );
595 80 : aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff );
596 : }
597 :
598 : // create layoutstylesheets, set layoutname and stylesheet
599 : // (only on standard and not pages)
600 :
601 80 : OUString aLayoutName( SD_RESSTR( STR_LAYOUT_DEFAULT_NAME ) );
602 40 : if ( nMasterNum > 2 )
603 : {
604 4 : if ( ePgKind == PK_STANDARD )
605 : { // standard page: create new presentation layout
606 2 : aLayoutName = SD_RESSTR( STR_LAYOUT_DEFAULT_TITLE_NAME );
607 2 : aLayoutName += OUString::number( (sal_Int32)( ( nMasterNum + 1 ) / 2 - 1 ) );
608 2 : ( (SdStyleSheetPool*)mpDoc->GetStyleSheetPool() )->CreateLayoutStyleSheets( aLayoutName );
609 : }
610 : else // note page: use presentation layout of standard page
611 2 : aLayoutName = ( (SdPage*)mpDoc->GetMasterPage( nMasterNum - 1 ) )->GetName();
612 : }
613 40 : pPage->SetName( aLayoutName );
614 40 : aLayoutName += SD_LT_SEPARATOR;
615 40 : aLayoutName += SD_RESSTR( STR_LAYOUT_OUTLINE );
616 40 : pPage->SetLayoutName( aLayoutName );
617 :
618 : // set stylesheets
619 40 : if ( pPage->GetPageKind() == PK_STANDARD )
620 : {
621 20 : sal_uInt32 nTitleInstance = TSS_TYPE_PAGETITLE;
622 20 : sal_uInt32 nOutlinerInstance = TSS_TYPE_BODY;
623 20 : const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom();
624 20 : bool bSwapStyleSheet = pSlideLayout->eLayout == PPT_LAYOUT_TITLEMASTERSLIDE;
625 20 : if ( bSwapStyleSheet )
626 : {
627 0 : nTitleInstance = TSS_TYPE_TITLE;
628 0 : nOutlinerInstance = TSS_TYPE_SUBTITLE;
629 : }
630 :
631 : // titelstylesheet
632 20 : pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE );
633 20 : if ( pSheet )
634 : {
635 20 : SfxItemSet& rItemSet = pSheet->GetItemSet();
636 20 : PPTParagraphObj aParagraph( *pPPTStyleSheet, nTitleInstance, 0 );
637 40 : PPTPortionObj aPortion( *pPPTStyleSheet, nTitleInstance, 0 );
638 20 : aParagraph.AppendPortion( aPortion );
639 20 : aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL );
640 40 : aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff );
641 : }
642 :
643 : // outlinerstylesheet
644 : sal_uInt16 nLevel;
645 : PPTParagraphObj* pParagraphs[ 9 ];
646 20 : PPTParagraphObj* pPreviousPara = NULL;
647 :
648 200 : for ( nLevel = 0; nLevel < 9; nLevel++ )
649 : {
650 180 : OUString aName( pPage->GetLayoutName() );
651 180 : aName += " ";
652 180 : aName += OUString::number( nLevel + 1 );
653 180 : SfxStyleSheet* pOutlineSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( aName, SD_STYLE_FAMILY_MASTERPAGE );
654 : DBG_ASSERT( pOutlineSheet, "Template for outline object not found" );
655 180 : if ( pOutlineSheet )
656 : {
657 180 : pParagraphs[ nLevel ] = new PPTParagraphObj( *pPPTStyleSheet, nOutlinerInstance, nLevel );
658 180 : SfxItemSet& rItemSet = pOutlineSheet->GetItemSet();
659 180 : PPTPortionObj aPortion( *pPPTStyleSheet, nOutlinerInstance, nLevel );
660 180 : pParagraphs[ nLevel ]->AppendPortion( aPortion );
661 180 : pParagraphs[ nLevel ]->ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, pPreviousPara );
662 180 : aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff );
663 180 : pPreviousPara = pParagraphs[ nLevel ];
664 : }
665 : else
666 0 : pParagraphs[ nLevel ] = NULL;
667 180 : }
668 20 : for ( nLevel = 0; nLevel < 9; delete pParagraphs[ nLevel++ ] ) ;
669 :
670 : // subtitle stylesheet
671 20 : pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TEXT );
672 20 : if ( pSheet )
673 : {
674 20 : SfxItemSet& rItemSet = pSheet->GetItemSet();
675 20 : PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_SUBTITLE, 0 );
676 40 : PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_SUBTITLE, 0 );
677 20 : aParagraph.AppendPortion( aPortion );
678 20 : aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL );
679 40 : aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff );
680 : }
681 : }
682 20 : else if ( ePgKind == PK_NOTES )
683 : {
684 20 : pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_NOTES );
685 20 : if ( pSheet )
686 : {
687 20 : SfxItemSet& rItemSet = pSheet->GetItemSet();
688 20 : PPTParagraphObj aParagraph( *pPPTStyleSheet, TSS_TYPE_NOTES, 0 );
689 40 : PPTPortionObj aPortion( *pPPTStyleSheet, TSS_TYPE_NOTES, 0 );
690 20 : aParagraph.AppendPortion( aPortion );
691 20 : aParagraph.ApplyTo( rItemSet, oStartNumbering, (SdrPowerPointImport&)*this, 0xffffffff, NULL );
692 40 : aPortion.ApplyTo( rItemSet, (SdrPowerPointImport&)*this, 0xffffffff );
693 : }
694 40 : }
695 : }
696 : }
697 : }
698 : }
699 : SdPage* pMPage;
700 : sal_uInt16 i;
701 76 : for ( i = 0; i < mpDoc->GetMasterPageCount() && ( (pMPage = (SdPage*)mpDoc->GetMasterPage( i )) != 0 ); i++ )
702 : {
703 58 : SetPageNum( i, PPT_MASTERPAGE );
704 :
705 : // importing master page objects
706 58 : PptSlidePersistList* pList = GetPageList( eAktPageKind );
707 58 : PptSlidePersistEntry* pPersist = ( pList && ( nAktPageNum < pList->size() ) )
708 116 : ? &(*pList)[ nAktPageNum ] : NULL;
709 58 : if ( pPersist )
710 : {
711 58 : if ( pPersist->bStarDrawFiller && pPersist->bNotesMaster && ( nAktPageNum > 2 ) && ( ( nAktPageNum & 1 ) == 0 ) )
712 : {
713 2 : pSdrModel->DeleteMasterPage( nAktPageNum );
714 2 : SdrPage* pNotesClone = ((SdPage*)pSdrModel->GetMasterPage( 2 ))->Clone();
715 2 : pSdrModel->InsertMasterPage( pNotesClone, nAktPageNum );
716 2 : if ( pNotesClone )
717 : {
718 2 : OUString aLayoutName( ((SdPage*)pSdrModel->GetMasterPage( nAktPageNum - 1 ))->GetLayoutName() );
719 2 : ((SdPage*)pNotesClone)->SetPresentationLayout( aLayoutName, false, false, false );
720 2 : ((SdPage*)pNotesClone)->SetLayoutName( aLayoutName );
721 2 : }
722 : }
723 56 : else if ( pPersist->bStarDrawFiller == false )
724 : {
725 36 : PptSlidePersistEntry* pE = pPersist;
726 72 : while( ( pE->aSlideAtom.nFlags & 4 ) && pE->aSlideAtom.nMasterId )
727 : {
728 0 : sal_uInt16 nNextMaster = pMasterPages->FindPage( pE->aSlideAtom.nMasterId );
729 0 : if ( nNextMaster == PPTSLIDEPERSIST_ENTRY_NOTFOUND )
730 0 : break;
731 : else
732 0 : pE = &(*pList)[ nNextMaster ];
733 : }
734 36 : SdrObject* pObj = ImportPageBackgroundObject( *pMPage, pE->nBackgroundOffset, true ); // import background
735 36 : if ( pObj )
736 36 : pMPage->NbcInsertObject( pObj );
737 :
738 36 : bool bNewAnimationsUsed = false;
739 36 : ProcessData aProcessData( (*pList)[ nAktPageNum ], (SdPage*)pMPage );
740 36 : sal_uInt32 nFPosMerk = rStCtrl.Tell();
741 36 : DffRecordHeader aPageHd;
742 36 : if ( SeekToAktPage( &aPageHd ) )
743 : {
744 590 : while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPageHd.GetRecEndFilePos() ) )
745 : {
746 518 : DffRecordHeader aHd;
747 518 : ReadDffRecordHeader( rStCtrl, aHd );
748 518 : switch( aHd.nRecType )
749 : {
750 : case PPT_PST_PPDrawing :
751 : {
752 36 : aHd.SeekToBegOfRecord( rStCtrl );
753 36 : DffRecordHeader aPPDrawHd;
754 36 : if ( SeekToRec( rStCtrl, PPT_PST_PPDrawing, aHd.GetRecEndFilePos(), &aPPDrawHd ) )
755 : {
756 36 : sal_uInt32 nPPDrawEnd = aPPDrawHd.GetRecEndFilePos();
757 36 : DffRecordHeader aEscherF002Hd;
758 36 : if ( SeekToRec( rStCtrl, DFF_msofbtDgContainer, nPPDrawEnd, &aEscherF002Hd ) )
759 : {
760 36 : sal_uInt32 nEscherF002End = aEscherF002Hd.GetRecEndFilePos();
761 36 : DffRecordHeader aEscherObjListHd;
762 36 : if ( SeekToRec( rStCtrl, DFF_msofbtSpgrContainer, nEscherF002End, &aEscherObjListHd ) )
763 : {
764 36 : sal_uInt32 nObjCount = 0;
765 286 : while( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aEscherObjListHd.GetRecEndFilePos() ) )
766 : {
767 214 : DffRecordHeader aHd2;
768 214 : ReadDffRecordHeader( rStCtrl, aHd2 );
769 214 : if ( ( aHd2.nRecType == DFF_msofbtSpContainer ) || ( aHd2.nRecType == DFF_msofbtSpgrContainer ) )
770 : {
771 214 : if ( nObjCount++ ) // skipping the first object
772 : {
773 178 : Rectangle aEmpty;
774 178 : aHd2.SeekToBegOfRecord( rStCtrl );
775 178 : SdrObject* pImpObj = ImportObj( rStCtrl, (void*)&aProcessData, aEmpty, aEmpty );
776 178 : if ( pImpObj )
777 : {
778 178 : pImpObj->SetLayer( mnBackgroundObjectsLayerID );
779 178 : pMPage->NbcInsertObject( pImpObj );
780 : }
781 : }
782 : }
783 214 : aHd2.SeekToEndOfRecord( rStCtrl );
784 : }
785 : }
786 : }
787 : }
788 : }
789 36 : break;
790 :
791 : case PPT_PST_ProgTags :
792 : {
793 14 : DffRecordHeader aProgTagHd;
794 14 : if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) )
795 : {
796 52 : while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aProgTagHd.GetRecEndFilePos() ) )
797 : {
798 24 : DffRecordHeader aProgTagContentHd;
799 24 : ReadDffRecordHeader( rStCtrl, aProgTagContentHd );
800 24 : switch( aProgTagContentHd.nRecType )
801 : {
802 : case DFF_msofbtAnimGroup :
803 : {
804 4 : ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > xPage( pMPage->getUnoPage(), ::com::sun::star::uno::UNO_QUERY );
805 8 : ppt::AnimationImporter aImporter( this, rStCtrl );
806 8 : bNewAnimationsUsed = aImporter.import( xPage, aProgTagContentHd ) > 0;
807 : }
808 4 : break;
809 : }
810 24 : aProgTagContentHd.SeekToEndOfRecord( rStCtrl );
811 : }
812 : }
813 : }
814 14 : break;
815 : }
816 518 : aHd.SeekToEndOfRecord( rStCtrl );
817 : }
818 : }
819 36 : rStCtrl.Seek( nFPosMerk );
820 36 : ImportPageEffect( (SdPage*)pMPage, bNewAnimationsUsed );
821 :
822 : // background object
823 36 : pObj = pMPage->GetObj( 0 );
824 36 : if ( pObj && pObj->GetObjIdentifier() == OBJ_RECT )
825 : {
826 36 : if ( pMPage->GetPageKind() == PK_STANDARD )
827 : {
828 : // transform data from imported background object to new form
829 : // and delete the object. It was used as container to transport
830 : // the attributes of the MasterPage background fill
831 20 : SfxStyleSheet* pSheet = pMPage->GetStyleSheetForMasterPageBackground();
832 :
833 20 : if(pSheet)
834 : {
835 : // if we have a StyleSheet (for Masterpages), set attributes there and use it
836 20 : pSheet->GetItemSet().ClearItem();
837 20 : pSheet->GetItemSet().Put(pObj->GetMergedItemSet());
838 20 : pMPage->getSdrPageProperties().ClearItem();
839 20 : pMPage->getSdrPageProperties().SetStyleSheet(pSheet);
840 : }
841 : else
842 : {
843 : // without StyleSheet, set attributes directly. This
844 : // should not be done at all and is an error (will be asserted by SdrPage)
845 0 : pMPage->getSdrPageProperties().ClearItem();
846 0 : pMPage->getSdrPageProperties().PutItemSet(pObj->GetMergedItemSet());
847 : }
848 :
849 20 : pMPage->RemoveObject(pObj->GetOrdNum());
850 20 : SdrObject::Free(pObj);
851 : }
852 36 : }
853 : }
854 : }
855 58 : if( pStbMgr )
856 58 : pStbMgr->SetState( nImportedPages++ );
857 : }
858 :
859 : // importing slide pages
860 : {
861 18 : sal_uInt32 nFPosMerk = rStCtrl.Tell();
862 18 : PptPageKind ePageKind = eAktPageKind;
863 18 : sal_uInt16 nPageNum = nAktPageNum;
864 :
865 18 : SdPage* pHandoutPage = (SdPage*)MakeBlancPage( false );
866 18 : pHandoutPage->SetPageKind( PK_HANDOUT );
867 18 : pSdrModel->InsertPage( pHandoutPage );
868 :
869 18 : sal_uInt16 nPageAnz = GetPageCount( PPT_SLIDEPAGE );
870 18 : if ( nPageAnz )
871 : {
872 92 : for ( sal_uInt16 nPage = 0; nPage < nPageAnz; nPage++ )
873 : {
874 74 : bool bNewAnimationsUsed = false;
875 :
876 74 : mePresChange = PRESCHANGE_SEMIAUTO;
877 74 : SetPageNum( nPage, PPT_SLIDEPAGE );
878 74 : SdPage* pPage = (SdPage*)MakeBlancPage( false );
879 74 : PptSlidePersistEntry* pMasterPersist = NULL;
880 74 : if ( HasMasterPage( nPage, PPT_SLIDEPAGE ) ) // try to get the LayoutName from the masterpage
881 : {
882 74 : sal_uInt16 nMasterNum = GetMasterPageIndex( nAktPageNum, eAktPageKind );
883 74 : pPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nMasterNum));
884 74 : PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
885 74 : if ( pPageList && nMasterNum < pPageList->size() )
886 74 : pMasterPersist = &(*pPageList)[ nMasterNum ];
887 74 : pPage->SetLayoutName(((SdPage&)pPage->TRG_GetMasterPage()).GetLayoutName());
888 : }
889 74 : pPage->SetPageKind( PK_STANDARD );
890 74 : pSdrModel->InsertPage( pPage ); // SJ: #i29625# because of form controls, the
891 74 : ImportPage( pPage, pMasterPersist ); // page must be inserted before importing
892 74 : SetHeaderFooterPageSettings( pPage, pMasterPersist );
893 : // CWS preseng01: pPage->SetPageKind( PK_STANDARD );
894 :
895 74 : DffRecordHeader aPageHd;
896 74 : if ( SeekToAktPage( &aPageHd ) )
897 : {
898 74 : aPageHd.SeekToContent( rStCtrl );
899 474 : while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPageHd.GetRecEndFilePos() ) )
900 : {
901 326 : DffRecordHeader aHd;
902 326 : ReadDffRecordHeader( rStCtrl, aHd );
903 326 : switch ( aHd.nRecType )
904 : {
905 : case PPT_PST_ProgTags :
906 : {
907 74 : DffRecordHeader aProgTagHd;
908 74 : if ( SeekToContentOfProgTag( 10, rStCtrl, aPageHd, aProgTagHd ) )
909 : {
910 416 : while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aProgTagHd.GetRecEndFilePos() ) )
911 : {
912 268 : DffRecordHeader aProgTagContentHd;
913 268 : ReadDffRecordHeader( rStCtrl, aProgTagContentHd );
914 268 : switch( aProgTagContentHd.nRecType )
915 : {
916 : case DFF_msofbtAnimGroup :
917 : {
918 72 : ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > xPage( pPage->getUnoPage(), ::com::sun::star::uno::UNO_QUERY );
919 144 : ppt::AnimationImporter aImporter( this, rStCtrl );
920 144 : bNewAnimationsUsed = aImporter.import( xPage, aProgTagContentHd ) > 0;
921 : }
922 72 : break;
923 :
924 : case PPT_PST_HashCodeAtom : // ???
925 72 : break;
926 :
927 : case PPT_PST_SlideTime10Atom : // ??? don't know, this atom is always 8 bytes big
928 52 : break; // and is appearing in nearly every l10 progtag
929 : }
930 268 : aProgTagContentHd.SeekToEndOfRecord( rStCtrl );
931 : }
932 : }
933 : }
934 74 : break;
935 :
936 : case PPT_PST_HeadersFooters :
937 : case PPT_PST_PPDrawing :
938 : default:
939 252 : break;
940 : }
941 :
942 326 : aHd.SeekToEndOfRecord( rStCtrl );
943 : }
944 74 : ImportPageEffect( (SdPage*)pPage, bNewAnimationsUsed );
945 : }
946 :
947 : // creating the corresponding note page
948 74 : eAktPageKind = PPT_NOTEPAGE;
949 74 : SdPage* pNotesPage = (SdPage*)MakeBlancPage( false );
950 74 : sal_uInt16 nNotesMasterNum = GetMasterPageIndex( nPage, PPT_SLIDEPAGE ) + 1;
951 74 : sal_uInt32 nNotesPageId = GetNotesPageId( nPage );
952 74 : if ( nNotesPageId )
953 : {
954 44 : nImportedPages++;
955 44 : sal_uInt16 nNotesPageIndex = pNotePages->FindPage( nNotesPageId );
956 44 : if ( nNotesPageIndex == PPTSLIDEPERSIST_ENTRY_NOTFOUND )
957 0 : nNotesPageIndex = 0;
958 44 : SetPageNum( nNotesPageIndex, PPT_NOTEPAGE );
959 44 : PptSlidePersistEntry* pMasterPersist2 = NULL;
960 44 : if ( HasMasterPage( nNotesPageIndex, PPT_NOTEPAGE ) ) // try to get the LayoutName from the masterpage
961 : {
962 44 : pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum));
963 44 : PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
964 44 : if ( pPageList && nNotesMasterNum < pPageList->size() )
965 44 : pMasterPersist2 = &(*pPageList)[ nNotesMasterNum ];
966 44 : pNotesPage->SetLayoutName( ((SdPage&)pNotesPage->TRG_GetMasterPage()).GetLayoutName() );
967 : }
968 44 : pNotesPage->SetPageKind( PK_NOTES );
969 44 : pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum));
970 44 : pSdrModel->InsertPage( pNotesPage ); // SJ: #i29625# because of form controls, the
971 44 : ImportPage( pNotesPage, pMasterPersist2 ); // page must be inserted before importing
972 44 : SetHeaderFooterPageSettings( pNotesPage, pMasterPersist2 );
973 44 : pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES, false );
974 : }
975 : else
976 : {
977 30 : pNotesPage->SetPageKind( PK_NOTES );
978 30 : pNotesPage->TRG_SetMasterPage(*pSdrModel->GetMasterPage(nNotesMasterNum));
979 30 : pNotesPage->SetAutoLayout( AUTOLAYOUT_NOTES, true );
980 30 : pSdrModel->InsertPage( pNotesPage );
981 30 : SdrObject* pPageObj = pNotesPage->GetPresObj( PRESOBJ_PAGE, 1 );
982 30 : if ( pPageObj )
983 30 : ((SdrPageObj*)pPageObj)->SetReferencedPage(pSdrModel->GetPage(( nPage << 1 ) + 1));
984 : }
985 :
986 74 : if( pStbMgr )
987 74 : pStbMgr->SetState( nImportedPages++ );
988 : }
989 : }
990 : else
991 : {
992 : // that can happen by document templates
993 0 : eAktPageKind = PPT_SLIDEPAGE;
994 0 : SdrPage* pPage = MakeBlancPage( false );
995 0 : pSdrModel->InsertPage( pPage );
996 :
997 : // #i37397#, trying to set the title master for the first page
998 0 : sal_uInt16 nMaster, nMasterCount = pSdrModel->GetMasterPageCount();
999 0 : SdPage* pFoundMaster = NULL;
1000 0 : for ( nMaster = 1; nMaster < nMasterCount; nMaster++ )
1001 : {
1002 0 : SdPage* pMaster = static_cast<SdPage*>( pSdrModel->GetMasterPage( nMaster ) );
1003 0 : if ( pMaster->GetPageKind() == PK_STANDARD )
1004 : {
1005 0 : SetPageNum( nMaster, PPT_MASTERPAGE );
1006 0 : if ( !pFoundMaster )
1007 0 : pFoundMaster = pMaster;
1008 0 : else if ( GetSlideLayoutAtom()->eLayout == PPT_LAYOUT_TITLEMASTERSLIDE )
1009 0 : pFoundMaster = pMaster;
1010 0 : if ( GetSlideLayoutAtom()->eLayout == PPT_LAYOUT_TITLEMASTERSLIDE )
1011 0 : break;
1012 : }
1013 : }
1014 0 : if ( pFoundMaster )
1015 : {
1016 0 : ((SdPage*)pPage)->TRG_SetMasterPage( *((SdPage*)pFoundMaster) );
1017 0 : ((SdPage*)pPage)->SetLayoutName( ((SdPage*)pFoundMaster)->GetLayoutName() );
1018 : }
1019 0 : ((SdPage*)pPage)->SetAutoLayout( AUTOLAYOUT_TITLE, true, true );
1020 :
1021 0 : eAktPageKind = PPT_NOTEPAGE;
1022 0 : SdrPage* pNPage = MakeBlancPage( false );
1023 0 : pSdrModel->InsertPage( pNPage );
1024 : }
1025 18 : SetPageNum( nPageNum, ePageKind );
1026 18 : rStCtrl.Seek( nFPosMerk );
1027 : }
1028 :
1029 : // create handout and note pages
1030 18 : bOk = mpDoc->CreateMissingNotesAndHandoutPages();
1031 18 : if ( bOk )
1032 : {
1033 92 : for ( i = 0; i < mpDoc->GetSdPageCount( PK_STANDARD ); i++ )
1034 : {
1035 :
1036 : // set AutoLayout
1037 74 : SetPageNum( i, PPT_SLIDEPAGE );
1038 74 : SdPage* pPage = mpDoc->GetSdPage( i, PK_STANDARD );
1039 74 : AutoLayout eAutoLayout = AUTOLAYOUT_NONE;
1040 74 : const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom();
1041 74 : if ( pSlideLayout )
1042 : {
1043 74 : switch ( pSlideLayout->eLayout ) // presentation layout for standard pages
1044 : {
1045 : case PPT_LAYOUT_TITLEANDBODYSLIDE :
1046 : {
1047 50 : eAutoLayout = AUTOLAYOUT_ENUM;
1048 50 : sal_uInt16 nID1 = pSlideLayout->aPlaceholderId[ 1 ];
1049 50 : switch ( nID1 )
1050 : {
1051 : case PPT_PLACEHOLDER_BODY :
1052 40 : eAutoLayout = AUTOLAYOUT_ENUM;
1053 40 : break;
1054 : case PPT_PLACEHOLDER_TABLE :
1055 2 : eAutoLayout = AUTOLAYOUT_TAB;
1056 2 : break;
1057 : case PPT_PLACEHOLDER_ORGANISZATIONCHART :
1058 0 : eAutoLayout = AUTOLAYOUT_ORG;
1059 0 : break;
1060 : case PPT_PLACEHOLDER_GRAPH :
1061 6 : eAutoLayout = AUTOLAYOUT_CHART;
1062 6 : break;
1063 : case PPT_PLACEHOLDER_OBJECT :
1064 2 : eAutoLayout = AUTOLAYOUT_OBJ;
1065 2 : break;
1066 : case PPT_PLACEHOLDER_VERTICALTEXTBODY :
1067 0 : eAutoLayout = AUTOLAYOUT_TITLE_VERTICAL_OUTLINE;
1068 0 : break;
1069 : }
1070 : }
1071 50 : break;
1072 :
1073 : case PPT_LAYOUT_2COLUMNSANDTITLE :
1074 : {
1075 4 : eAutoLayout = AUTOLAYOUT_2TEXT;
1076 4 : sal_uInt16 nID1 = pSlideLayout->aPlaceholderId[ 1 ];
1077 4 : sal_uInt16 nID2 = pSlideLayout->aPlaceholderId[ 2 ];
1078 4 : if ( nID1 == PPT_PLACEHOLDER_BODY && nID2 == PPT_PLACEHOLDER_GRAPH )
1079 0 : eAutoLayout = AUTOLAYOUT_TEXTCHART;
1080 4 : else if ( nID1 == PPT_PLACEHOLDER_GRAPH && nID2 == PPT_PLACEHOLDER_BODY )
1081 0 : eAutoLayout = AUTOLAYOUT_CHARTTEXT;
1082 4 : else if ( nID1 == PPT_PLACEHOLDER_BODY && nID2 == PPT_PLACEHOLDER_CLIPART )
1083 0 : eAutoLayout = AUTOLAYOUT_TEXTCLIP;
1084 4 : else if ( nID1 == PPT_PLACEHOLDER_CLIPART && nID2 == PPT_PLACEHOLDER_BODY )
1085 0 : eAutoLayout = AUTOLAYOUT_CLIPTEXT;
1086 4 : else if ( nID1 == PPT_PLACEHOLDER_CLIPART && nID2 == PPT_PLACEHOLDER_VERTICALTEXTBODY )
1087 0 : eAutoLayout = AUTOLAYOUT_TITLE_VERTICAL_OUTLINE_CLIPART;
1088 4 : else if ( ( nID1 == PPT_PLACEHOLDER_BODY )
1089 2 : && ( ( nID2 == PPT_PLACEHOLDER_OBJECT ) || ( nID2 == PPT_PLACEHOLDER_MEDIACLIP ) ) )
1090 2 : eAutoLayout = AUTOLAYOUT_TEXTOBJ;
1091 2 : else if ( ( nID2 == PPT_PLACEHOLDER_BODY )
1092 0 : && ( ( nID1 == PPT_PLACEHOLDER_OBJECT ) || ( nID1 == PPT_PLACEHOLDER_MEDIACLIP ) ) )
1093 0 : eAutoLayout = AUTOLAYOUT_OBJTEXT;
1094 2 : else if ( ( nID1 == PPT_PLACEHOLDER_OBJECT ) && ( nID2 == PPT_PLACEHOLDER_OBJECT ) )
1095 2 : eAutoLayout = AUTOLAYOUT_OBJ;
1096 : }
1097 4 : break;
1098 :
1099 : case PPT_LAYOUT_2ROWSANDTITLE :
1100 : {
1101 0 : eAutoLayout = AUTOLAYOUT_2TEXT;
1102 0 : sal_uInt16 nID1 = pSlideLayout->aPlaceholderId[ 1 ];
1103 0 : sal_uInt16 nID2 = pSlideLayout->aPlaceholderId[ 2 ];
1104 0 : if ( nID1 == PPT_PLACEHOLDER_BODY && nID2 == PPT_PLACEHOLDER_OBJECT )
1105 0 : eAutoLayout = AUTOLAYOUT_TEXTOVEROBJ;
1106 0 : else if ( nID1 == PPT_PLACEHOLDER_OBJECT && nID2 == PPT_PLACEHOLDER_BODY )
1107 0 : eAutoLayout = AUTOLAYOUT_OBJOVERTEXT;
1108 : }
1109 0 : break;
1110 :
1111 : case PPT_LAYOUT_TITLESLIDE :
1112 8 : eAutoLayout = AUTOLAYOUT_TITLE;
1113 8 : break;
1114 : case PPT_LAYOUT_ONLYTITLE :
1115 0 : eAutoLayout = AUTOLAYOUT_ONLY_TITLE;
1116 0 : break;
1117 : case PPT_LAYOUT_RIGHTCOLUMN2ROWS :
1118 6 : eAutoLayout = AUTOLAYOUT_TEXT2OBJ;
1119 6 : break;
1120 : case PPT_LAYOUT_LEFTCOLUMN2ROWS :
1121 0 : eAutoLayout = AUTOLAYOUT_2OBJTEXT;
1122 0 : break;
1123 : case PPT_LAYOUT_TOPROW2COLUMN :
1124 0 : eAutoLayout = AUTOLAYOUT_2OBJOVERTEXT;
1125 0 : break;
1126 : case PPT_LAYOUT_4OBJECTS :
1127 0 : eAutoLayout = AUTOLAYOUT_4OBJ;
1128 0 : break;
1129 : case PPT_LAYOUT_BIGOBJECT :
1130 0 : eAutoLayout = AUTOLAYOUT_OBJ;
1131 0 : break;
1132 : case PPT_LAYOUT_TITLERIGHTBODYLEFT :
1133 0 : eAutoLayout = AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE; // AUTOLAYOUT_ENUM;
1134 0 : break;
1135 : case PPT_LAYOUT_TITLERIGHT2BODIESLEFT :
1136 0 : eAutoLayout = AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART; // AUTOLAYOUT_TEXT2OBJ;
1137 0 : break;
1138 :
1139 : case PPT_LAYOUT_BOTTOMROW2COLUMNS :
1140 : case PPT_LAYOUT_BLANCSLIDE :
1141 : case PPT_LAYOUT_MASTERSLIDE : // layout of the standard and title master page
1142 : case PPT_LAYOUT_TITLEMASTERSLIDE :
1143 : case PPT_LAYOUT_MASTERNOTES : // layout of the note master page
1144 : case PPT_LAYOUT_NOTESTITLEBODY : // presentation layout for note pages
1145 : case PPT_LAYOUT_HANDOUTLAYOUT : // presentation layout for handout
1146 6 : eAutoLayout = AUTOLAYOUT_NONE;
1147 6 : break;
1148 : }
1149 74 : if ( eAutoLayout != AUTOLAYOUT_NONE )
1150 68 : pPage->SetAutoLayout( eAutoLayout, false );
1151 : }
1152 : }
1153 :
1154 : // handout master page: auto layout
1155 18 : SdPage* pHandoutMPage = mpDoc->GetMasterSdPage( 0, PK_HANDOUT );
1156 18 : pHandoutMPage->SetAutoLayout( AUTOLAYOUT_HANDOUT6, true, true );
1157 : }
1158 :
1159 18 : sal_uInt32 nSlideCount = GetPageCount();
1160 24 : for ( i = 0; ( i < nSlideCount) && ( i < maSlideNameList.size() ); i++ )
1161 : {
1162 6 : SdPage* pPage = mpDoc->GetSdPage( i, PK_STANDARD );
1163 6 : OUString &aName = maSlideNameList[ i ];
1164 6 : if ( pPage )
1165 : {
1166 6 : if ( !aName.isEmpty() )
1167 4 : pPage->SetName( aName );
1168 : else
1169 2 : aName = pPage->GetName();
1170 : }
1171 : }
1172 18 : if ( mbDocumentFound )
1173 : {
1174 18 : mpDoc->SetSummationOfParagraphs( true );
1175 18 : if ( pDocShell )
1176 : {
1177 18 : ::sd::FrameView* pFrameView = mpDoc->GetFrameView( 0 );
1178 18 : if ( !pFrameView )
1179 : {
1180 18 : std::vector<sd::FrameView*> &rViews = mpDoc->GetFrameViewList();
1181 18 : pFrameView = new ::sd::FrameView( mpDoc );
1182 18 : rViews.push_back( pFrameView );
1183 : }
1184 18 : if ( pFrameView )
1185 : {
1186 18 : sal_uInt16 nSelectedPage = 0;
1187 18 : PageKind ePageKind = PK_STANDARD;
1188 18 : EditMode eEditMode = EM_PAGE;
1189 :
1190 18 : switch ( aUserEditAtom.eLastViewType )
1191 : {
1192 : case 7 : // outliner view
1193 : {
1194 0 : SfxItemSet* pSet = mrMed.GetItemSet();
1195 0 : if ( pSet )
1196 0 : pSet->Put( SfxUInt16Item( SID_VIEW_ID, 3 ) );
1197 : }
1198 0 : break;
1199 : case 8 : // slide sorter
1200 : {
1201 0 : SfxItemSet* pSet = mrMed.GetItemSet();
1202 0 : if ( pSet )
1203 0 : pSet->Put( SfxUInt16Item( SID_VIEW_ID, 2 ) );
1204 : }
1205 0 : break;
1206 : case 10 : // titlemaster
1207 0 : nSelectedPage = 1;
1208 : //fall-through
1209 : case 2 : // master
1210 : {
1211 0 : ePageKind = PK_STANDARD;
1212 0 : eEditMode = EM_MASTERPAGE;
1213 : }
1214 0 : break;
1215 : case 5 : // notes master
1216 0 : eEditMode = EM_MASTERPAGE;
1217 : //fall-through
1218 : case 3 : // notes
1219 0 : ePageKind = PK_NOTES;
1220 0 : break;
1221 : case 4 : // handout
1222 0 : ePageKind = PK_HANDOUT;
1223 0 : break;
1224 : default :
1225 : case 1 : // normal
1226 18 : break;
1227 : }
1228 18 : pFrameView->SetPageKind( ePageKind );
1229 18 : pFrameView->SetSelectedPage( nSelectedPage );
1230 18 : pFrameView->SetViewShEditMode( eEditMode, ePageKind );
1231 : }
1232 : }
1233 18 : DffRecordHeader aCustomShowHeader;
1234 : // read and set custom show
1235 18 : rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
1236 18 : if ( SeekToRec( rStCtrl, PPT_PST_NamedShows, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) )
1237 : {
1238 0 : DffRecordHeader aCuHeader;
1239 0 : while( SeekToRec( rStCtrl, PPT_PST_NamedShow, aCustomShowHeader.GetRecEndFilePos(), &aCuHeader ) )
1240 : {
1241 0 : DffRecordHeader aContent;
1242 0 : if ( SeekToRec( rStCtrl, PPT_PST_CString, aCuHeader.GetRecEndFilePos(), &aContent ) )
1243 : {
1244 0 : OUString aCuShow;
1245 0 : aContent.SeekToBegOfRecord( rStCtrl );
1246 0 : if ( ReadString( aCuShow ) )
1247 : {
1248 0 : if ( SeekToRec( rStCtrl, PPT_PST_NamedShowSlides, aCuHeader.GetRecEndFilePos(), &aContent ) )
1249 : {
1250 0 : PptSlidePersistList* pPageList = GetPageList( PPT_SLIDEPAGE );
1251 0 : sal_uInt32 nSCount = aContent.nRecLen >> 2;
1252 0 : if ( pPageList && nSCount )
1253 : {
1254 0 : SdCustomShowList* pList = mpDoc->GetCustomShowList( true );
1255 0 : if ( pList )
1256 : {
1257 0 : SdCustomShow* pSdCustomShow = new SdCustomShow( mpDoc );
1258 0 : if ( pSdCustomShow )
1259 : {
1260 0 : pSdCustomShow->SetName( aCuShow );
1261 0 : sal_uInt32 nFound = 0;
1262 0 : for ( sal_uInt32 nS = 0; nS < nSCount; nS++ )
1263 : {
1264 : sal_uInt32 nPageNumber;
1265 0 : rStCtrl.ReadUInt32( nPageNumber );
1266 0 : sal_uInt16 nPage = pPageList->FindPage( nPageNumber );
1267 0 : if ( nPage != PPTSLIDEPERSIST_ENTRY_NOTFOUND )
1268 : {
1269 0 : SdPage* pPage = mpDoc->GetSdPage( nPage, PK_STANDARD );
1270 0 : if ( pPage )
1271 : {
1272 0 : pSdCustomShow->PagesVector().push_back( pPage );
1273 0 : nFound++;
1274 : }
1275 : }
1276 : }
1277 0 : if ( nFound )
1278 0 : pList->push_back( pSdCustomShow );
1279 : else
1280 0 : delete pSdCustomShow;
1281 : }
1282 : }
1283 : }
1284 : }
1285 0 : }
1286 : }
1287 : }
1288 : }
1289 : // this is defaulted, maybe there is no SSDocInfoAtom
1290 18 : OUStringBuffer aCustomShow;
1291 18 : sal_uInt32 nFlags = 1; // Bit 0: Auto advance
1292 18 : sal_uInt16 nStartSlide = 0;
1293 :
1294 : // read the pres. configuration
1295 18 : rStCtrl.Seek( maDocHd.GetRecBegFilePos() + 8 );
1296 18 : if ( SeekToRec( rStCtrl, PPT_PST_SSDocInfoAtom, maDocHd.GetRecEndFilePos(), &aCustomShowHeader ) )
1297 : {
1298 10 : sal_uInt32 nPenColor = 0x1000000;
1299 10 : sal_Int32 nRestartTime = 0x7fffffff;
1300 10 : sal_Int16 nEndSlide = 0;
1301 10 : rStCtrl.ReadUInt32( nPenColor )
1302 10 : .ReadInt32( nRestartTime )
1303 10 : .ReadUInt16( nStartSlide )
1304 10 : .ReadInt16( nEndSlide );
1305 :
1306 : sal_Unicode nChar;
1307 10 : for ( sal_uInt32 i2 = 0; i2 < 32; i2++ )
1308 : {
1309 10 : rStCtrl.ReadUInt16( nChar );
1310 10 : if ( nChar )
1311 0 : aCustomShow.append( nChar );
1312 : else
1313 : {
1314 10 : rStCtrl.SeekRel( ( 31 - i2 ) << 1 );
1315 10 : break;
1316 : }
1317 : }
1318 10 : rStCtrl.ReadUInt32( nFlags );
1319 : }
1320 : // set the current custom show
1321 18 : if ( !aCustomShow.isEmpty() )
1322 : {
1323 0 : SdCustomShowList* pList = mpDoc->GetCustomShowList( false );
1324 0 : if ( pList )
1325 : {
1326 0 : SdCustomShow* pPtr = NULL;
1327 0 : OUString aCustomShowStr = aCustomShow.makeStringAndClear();
1328 0 : for( pPtr = pList->First(); pPtr; pPtr = pList->Next() )
1329 : {
1330 0 : if ( pPtr->GetName() == aCustomShowStr )
1331 0 : break;
1332 : }
1333 0 : if ( !pPtr )
1334 0 : pList->First();
1335 : }
1336 : }
1337 18 : sd::PresentationSettings& rPresSettings = mpDoc->getPresentationSettings();
1338 :
1339 18 : rPresSettings.mbManual = ( nFlags & 1 ) == 0;
1340 18 : rPresSettings.mbAnimationAllowed = ( nFlags & 2 ) == 0;
1341 18 : rPresSettings.mbAll = ( nFlags & 4 ) == 0;
1342 18 : rPresSettings.mbCustomShow = ( nFlags & 8 ) != 0;
1343 18 : rPresSettings.mbEndless = ( nFlags & 0x80 ) != 0;
1344 18 : rPresSettings.mbFullScreen = ( nFlags & 0x10 ) == 0;
1345 :
1346 18 : if ( nStartSlide && ( nStartSlide <= GetPageCount() ) )
1347 : {
1348 0 : SdPage* pPage = mpDoc->GetSdPage( nStartSlide - 1, PK_STANDARD );
1349 0 : if ( pPage )
1350 0 : rPresSettings.maPresPage = pPage->GetName();
1351 18 : }
1352 : }
1353 :
1354 18 : delete pStbMgr;
1355 :
1356 : // read DocumentProperties
1357 : uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
1358 18 : mpDoc->GetObjectShell()->GetModel(), uno::UNO_QUERY_THROW);
1359 : uno::Reference<document::XDocumentProperties> xDocProps
1360 36 : = xDPS->getDocumentProperties();
1361 18 : sfx2::LoadOlePropertySet(xDocProps, &mrStorage);
1362 18 : xDocProps->setTemplateName(OUString());
1363 :
1364 18 : pSdrModel->setLock(false);
1365 18 : pSdrModel->EnableUndo(true);
1366 36 : return bOk;
1367 : }
1368 :
1369 118 : void ImplSdPPTImport::SetHeaderFooterPageSettings( SdPage* pPage, const PptSlidePersistEntry* pMasterPersist )
1370 : {
1371 : sal_uInt32 i;
1372 118 : PptSlidePersistList* pList = GetPageList( eAktPageKind );
1373 118 : if ( ( !pList ) || ( pList->size() <= nAktPageNum ) )
1374 118 : return;
1375 118 : PptSlidePersistEntry& rSlidePersist = (*pList)[ nAktPageNum ];
1376 118 : HeaderFooterEntry* pHFE = rSlidePersist.pHeaderFooterEntry;
1377 118 : if ( pHFE )
1378 : {
1379 590 : for ( i = 0; i < 4; i++ )
1380 : {
1381 472 : bool bVisible = pHFE->IsToDisplay( i );
1382 472 : if ( ( eAktPageKind == PPT_SLIDEPAGE )
1383 296 : && ( rSlidePersist.aSlideAtom.aLayout.eLayout == PPT_LAYOUT_TITLESLIDE )
1384 32 : && ( aDocAtom.bTitlePlaceholdersOmitted ) )
1385 : {
1386 0 : bVisible = false;
1387 : }
1388 472 : if ( bVisible && pMasterPersist )
1389 : {
1390 360 : sal_uInt32 nPosition = pHFE->NeedToImportInstance( i, rSlidePersist );
1391 360 : if ( nPosition )
1392 : {
1393 8 : Rectangle aEmpty;
1394 8 : bVisible = false;
1395 8 : rStCtrl.Seek( nPosition );
1396 8 : ProcessData aProcessData( rSlidePersist, (SdPage*)pPage );
1397 8 : SdrObject* pObj = ImportObj( rStCtrl, (void*)&aProcessData, aEmpty, aEmpty );
1398 8 : if ( pObj )
1399 8 : pPage->NbcInsertObject( pObj, 0 );
1400 : }
1401 : }
1402 472 : OUString aPlaceHolderString = pHFE->pPlaceholder[ i ];
1403 :
1404 944 : sd::HeaderFooterSettings rHeaderFooterSettings( pPage->getHeaderFooterSettings() );
1405 472 : switch( i )
1406 : {
1407 : case 0 :
1408 : {
1409 118 : rHeaderFooterSettings.mbDateTimeVisible = bVisible;
1410 118 : rHeaderFooterSettings.mbDateTimeIsFixed = ( pHFE->nAtom & 0x20000 ) == 0;
1411 118 : rHeaderFooterSettings.maDateTimeText = aPlaceHolderString;
1412 : SvxDateFormat eDateFormat;
1413 : SvxTimeFormat eTimeFormat;
1414 118 : PPTFieldEntry::GetDateTime( pHFE->nAtom & 0xff, eDateFormat, eTimeFormat );
1415 118 : rHeaderFooterSettings.meDateTimeFormat = eDateFormat | ( eTimeFormat << 4 );
1416 : }
1417 118 : break;
1418 : case 1 :
1419 : {
1420 118 : rHeaderFooterSettings.mbHeaderVisible = bVisible;
1421 118 : rHeaderFooterSettings.maHeaderText = aPlaceHolderString;
1422 : }
1423 118 : break;
1424 : case 2 :
1425 : {
1426 118 : rHeaderFooterSettings.mbFooterVisible = bVisible;
1427 118 : rHeaderFooterSettings.maFooterText = aPlaceHolderString;
1428 : }
1429 118 : break;
1430 : case 3 :
1431 : {
1432 118 : rHeaderFooterSettings.mbSlideNumberVisible = bVisible;
1433 : }
1434 118 : break;
1435 : }
1436 472 : pPage->setHeaderFooterSettings( rHeaderFooterSettings );
1437 472 : }
1438 : }
1439 : }
1440 :
1441 : // Import of pages
1442 : struct Ppt97AnimationStlSortHelper
1443 : {
1444 : bool operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 );
1445 : };
1446 :
1447 0 : bool Ppt97AnimationStlSortHelper::operator()( const std::pair< SdrObject*, Ppt97AnimationPtr >& p1, const std::pair< SdrObject*, Ppt97AnimationPtr >& p2 )
1448 : {
1449 0 : if( !p1.second.get() || !p2.second.get() )
1450 0 : return true;
1451 0 : if( *p1.second < *p2.second )
1452 0 : return true;
1453 0 : if( *p1.second > *p2.second )
1454 0 : return false;
1455 0 : if( p1.first->GetOrdNum() < p2.first->GetOrdNum() )
1456 0 : return true;
1457 0 : return false;
1458 : }
1459 :
1460 110 : void ImplSdPPTImport::ImportPageEffect( SdPage* pPage, const bool bNewAnimationsUsed )
1461 : {
1462 110 : sal_uLong nFilePosMerk = rStCtrl.Tell();
1463 :
1464 : // set PageKind at page (up to now only PK_STANDARD or PK_NOTES)
1465 110 : if ( pPage->GetPageKind() == PK_STANDARD )
1466 : {
1467 94 : PptSlidePersistList* pPersistList = GetPageList( eAktPageKind );
1468 94 : PptSlidePersistEntry* pActualSlidePersist = ( pPersistList && ( nAktPageNum < pPersistList->size() ) )
1469 188 : ? &(*pPersistList)[ nAktPageNum ] : NULL;
1470 :
1471 94 : if ( pActualSlidePersist && ( eAktPageKind == PPT_SLIDEPAGE ) )
1472 : {
1473 74 : if ( ! ( pActualSlidePersist->aSlideAtom.nFlags & 1 ) ) // do not follow master objects ?
1474 : {
1475 0 : if(pPage->TRG_HasMasterPage())
1476 : {
1477 0 : SetOfByte aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
1478 0 : aVisibleLayers.Set(mnBackgroundObjectsLayerID, false);
1479 0 : pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
1480 : }
1481 : }
1482 : }
1483 94 : DffRecordHeader aPageRecHd;
1484 94 : if ( SeekToAktPage( &aPageRecHd ) )
1485 : {
1486 94 : sal_uLong nPageRecEnd = aPageRecHd.GetRecEndFilePos();
1487 :
1488 94 : bool bTryTwice = ( eAktPageKind == PPT_SLIDEPAGE );
1489 94 : bool bSSSlideInfoAtom = false;
1490 : while ( true )
1491 : {
1492 978 : while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nPageRecEnd ) )
1493 : {
1494 790 : DffRecordHeader aHd;
1495 790 : ReadDffRecordHeader( rStCtrl, aHd );
1496 790 : switch ( aHd.nRecType )
1497 : {
1498 : case PPT_PST_SSSlideInfoAtom:
1499 : {
1500 14 : bSSSlideInfoAtom = true;
1501 14 : if ( eAktPageKind == PPT_MASTERPAGE )
1502 : {
1503 0 : if ( pActualSlidePersist )
1504 0 : pActualSlidePersist->aPersistAtom.nReserved = aHd.GetRecBegFilePos();
1505 : }
1506 : else
1507 : {
1508 : sal_Int8 nDirection, nTransitionType, nByteDummy, nSpeed;
1509 : sal_Int16 nBuildFlags;
1510 : sal_Int32 nSlideTime, nSoundRef;
1511 14 : rStCtrl.ReadInt32( nSlideTime ) // time to show (in Ticks)
1512 14 : .ReadInt32( nSoundRef ) // Index of SoundCollection
1513 14 : .ReadSChar( nDirection ) // direction of fade effect
1514 14 : .ReadSChar( nTransitionType ) // fade effect
1515 14 : .ReadInt16( nBuildFlags ) // Buildflags (s.u.)
1516 14 : .ReadSChar( nSpeed ) // speed (slow, medium, fast)
1517 14 : .ReadSChar( nByteDummy ).ReadSChar( nByteDummy ).ReadSChar( nByteDummy );
1518 :
1519 14 : switch ( nTransitionType )
1520 : {
1521 : case PPT_TRANSITION_TYPE_BLINDS :
1522 : {
1523 0 : if ( nDirection == 0 )
1524 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_VERTICAL_STRIPES ); // fade vertical
1525 0 : else if ( nDirection == 1 )
1526 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_HORIZONTAL_STRIPES ); // fade horizontal
1527 : }
1528 0 : break;
1529 : case PPT_TRANSITION_TYPE_CHECKER :
1530 : {
1531 0 : if ( nDirection == 0 )
1532 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_HORIZONTAL_CHECKERBOARD ); // fade vertical with offset ??
1533 0 : else if ( nDirection == 1 )
1534 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_VERTICAL_CHECKERBOARD ); // fade horizontal with offset ??
1535 : }
1536 0 : break;
1537 : case PPT_TRANSITION_TYPE_COVER :
1538 : {
1539 0 : if ( nDirection == 0 )
1540 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_RIGHT ); // overlay from right
1541 0 : else if ( nDirection == 1 )
1542 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_BOTTOM ); // overlay from bottom
1543 0 : else if ( nDirection == 2 )
1544 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_LEFT ); // overlay from left
1545 0 : else if ( nDirection == 3 )
1546 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_TOP ); // overlay from top
1547 0 : else if ( nDirection == 4 )
1548 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_LOWERRIGHT ); // overlay from bottom right ??
1549 0 : else if ( nDirection == 5 )
1550 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_LOWERLEFT ); // overlay from bottom left ??
1551 0 : else if ( nDirection == 6 )
1552 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_UPPERRIGHT ); // overlay from top right
1553 0 : else if ( nDirection == 7 )
1554 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_MOVE_FROM_UPPERLEFT ); // overlay from top left ??
1555 : }
1556 0 : break;
1557 : case PPT_TRANSITION_TYPE_NONE :
1558 : {
1559 14 : if ( nBuildFlags )
1560 : {
1561 14 : if ( nDirection == 0 )
1562 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_NONE ); // direct
1563 14 : else if ( nDirection == 1 )
1564 : {
1565 0 : pPage->setTransitionType( animations::TransitionType::BARWIPE );
1566 0 : pPage->setTransitionSubtype( animations::TransitionSubType::FADEOVERCOLOR );
1567 0 : pPage->setTransitionFadeColor( 0 );
1568 : }
1569 : }
1570 : else
1571 0 : pPage->setTransitionType( 0 );
1572 : }
1573 14 : break;
1574 : case PPT_TRANSITION_TYPE_DISSOLVE :
1575 0 : pPage->SetFadeEffect(::com::sun::star::presentation::FadeEffect_DISSOLVE); // dissolve
1576 0 : break;
1577 : case PPT_TRANSITION_TYPE_RANDOM_BARS :
1578 : {
1579 0 : if ( nDirection == 0 )
1580 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_HORIZONTAL_LINES ); // horizontal lines
1581 0 : else if ( nDirection == 1 )
1582 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_VERTICAL_LINES ); // vertical lines
1583 : }
1584 0 : break;
1585 : case PPT_TRANSITION_TYPE_SPLIT :
1586 : {
1587 0 : if ( nDirection == 0 )
1588 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_OPEN_VERTICAL ); // open horizontal ??
1589 0 : else if ( nDirection == 1 )
1590 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_CLOSE_VERTICAL ); // close horizontal ??
1591 0 : else if ( nDirection == 2 )
1592 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_OPEN_HORIZONTAL ); // open vertical ??
1593 0 : else if ( nDirection == 3 )
1594 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_CLOSE_HORIZONTAL ); // close vertical ??
1595 : }
1596 0 : break;
1597 : case PPT_TRANSITION_TYPE_STRIPS :
1598 : {
1599 0 : if ( nDirection == 4 )
1600 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_LOWERRIGHT ); // diagonal to top left
1601 0 : else if ( nDirection == 5 )
1602 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_LOWERLEFT ); // diagonal to top right
1603 0 : else if ( nDirection == 6 )
1604 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_UPPERRIGHT ); // diagonal to bottom left
1605 0 : else if ( nDirection == 7 )
1606 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_UPPERLEFT ); // diagonal to bottom right
1607 : }
1608 0 : break;
1609 : case PPT_TRANSITION_TYPE_PULL :
1610 : {
1611 0 : if ( nDirection == 0 )
1612 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_LEFT ); // uncover to left
1613 0 : else if ( nDirection == 1 )
1614 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_TOP ); // uncover to top
1615 0 : else if ( nDirection == 2 )
1616 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_RIGHT ); // uncover to right
1617 0 : else if ( nDirection == 3 )
1618 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_BOTTOM ); // uncover to bottom
1619 0 : else if ( nDirection == 4 )
1620 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_UPPERLEFT ); // uncover to top left
1621 0 : else if ( nDirection == 5 )
1622 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_UPPERRIGHT ); // uncover to top right
1623 0 : else if ( nDirection == 6 )
1624 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_LOWERLEFT ); // uncover to bottom left
1625 0 : else if ( nDirection == 7 )
1626 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_UNCOVER_TO_LOWERRIGHT ); // uncover to bottom right
1627 : }
1628 0 : break;
1629 : case PPT_TRANSITION_TYPE_WIPE :
1630 : {
1631 0 : if ( nDirection == 0 )
1632 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_RIGHT ); // roll from right
1633 0 : else if ( nDirection == 1 )
1634 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_BOTTOM ); // roll from bottom
1635 0 : else if ( nDirection == 2 )
1636 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_LEFT ); // roll from left
1637 0 : else if ( nDirection == 3 )
1638 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_TOP ); // roll from top
1639 : }
1640 0 : break;
1641 : case PPT_TRANSITION_TYPE_RANDOM :
1642 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_RANDOM ); // automatic
1643 0 : break;
1644 : case PPT_TRANSITION_TYPE_FADE :
1645 : {
1646 0 : pPage->setTransitionType( animations::TransitionType::FADE );
1647 0 : pPage->setTransitionSubtype( animations::TransitionSubType::FADEOVERCOLOR );
1648 0 : pPage->setTransitionFadeColor( 0 );
1649 : }
1650 0 : break;
1651 : case PPT_TRANSITION_TYPE_ZOOM :
1652 : {
1653 0 : if ( nDirection == 0 )
1654 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_FROM_CENTER ); // fade from center
1655 0 : else if ( nDirection == 1 )
1656 0 : pPage->SetFadeEffect( ::com::sun::star::presentation::FadeEffect_FADE_TO_CENTER ); // fade from the outside
1657 : }
1658 0 : break;
1659 : case PPT_TRANSITION_TYPE_DIAMOND :
1660 : {
1661 0 : pPage->setTransitionType( animations::TransitionType::IRISWIPE );
1662 0 : pPage->setTransitionSubtype( animations::TransitionSubType::DIAMOND );
1663 : }
1664 0 : break;
1665 : case PPT_TRANSITION_TYPE_PLUS :
1666 : {
1667 0 : pPage->setTransitionType( animations::TransitionType::FOURBOXWIPE );
1668 0 : pPage->setTransitionSubtype( animations::TransitionSubType::CORNERSOUT );
1669 : }
1670 0 : break;
1671 : case PPT_TRANSITION_TYPE_CIRCLE :
1672 : {
1673 0 : pPage->setTransitionType( animations::TransitionType::ELLIPSEWIPE );
1674 0 : pPage->setTransitionSubtype( animations::TransitionSubType::CIRCLE );
1675 : }
1676 0 : break;
1677 : case PPT_TRANSITION_TYPE_WEDGE :
1678 : {
1679 0 : pPage->setTransitionType( animations::TransitionType::FANWIPE );
1680 0 : pPage->setTransitionSubtype( animations::TransitionSubType::CENTERTOP );
1681 : }
1682 0 : break;
1683 : case PPT_TRANSITION_TYPE_WHEEL :
1684 : {
1685 0 : pPage->setTransitionType( animations::TransitionType::PINWHEELWIPE );
1686 : sal_Int16 nSubType;
1687 0 : switch( nDirection )
1688 : {
1689 : default:
1690 0 : case 1 : nSubType = animations::TransitionSubType::ONEBLADE; break;
1691 0 : case 2 : nSubType = animations::TransitionSubType::TWOBLADEVERTICAL; break;
1692 0 : case 3 : nSubType = animations::TransitionSubType::THREEBLADE; break;
1693 0 : case 4 : nSubType = animations::TransitionSubType::FOURBLADE; break;
1694 0 : case 8 : nSubType = animations::TransitionSubType::EIGHTBLADE; break;
1695 : }
1696 0 : pPage->setTransitionSubtype( nSubType );
1697 : }
1698 0 : break;
1699 : case PPT_TRANSITION_TYPE_PUSH :
1700 : {
1701 0 : pPage->setTransitionType( animations::TransitionType::PUSHWIPE );
1702 : sal_Int16 nSubType;
1703 0 : switch( nDirection )
1704 : {
1705 : default:
1706 0 : case 0 : nSubType = animations::TransitionSubType::FROMRIGHT; break;
1707 0 : case 1 : nSubType = animations::TransitionSubType::FROMBOTTOM; break;
1708 0 : case 2 : nSubType = animations::TransitionSubType::FROMLEFT; break;
1709 0 : case 3 : nSubType = animations::TransitionSubType::FROMTOP; break;
1710 : }
1711 0 : pPage->setTransitionSubtype( nSubType );
1712 : }
1713 0 : break;
1714 : case PPT_TRANSITION_TYPE_COMB :
1715 : {
1716 0 : pPage->setTransitionType( animations::TransitionType::PUSHWIPE );
1717 0 : pPage->setTransitionSubtype( nDirection ? animations::TransitionSubType::COMBVERTICAL : animations::TransitionSubType::COMBHORIZONTAL );
1718 : }
1719 0 : break;
1720 : case PPT_TRANSITION_TYPE_NEWSFLASH :
1721 : {
1722 0 : pPage->setTransitionType( animations::TransitionType::ZOOM );
1723 0 : pPage->setTransitionSubtype( animations::TransitionSubType::ROTATEIN );
1724 : }
1725 0 : break;
1726 : case PPT_TRANSITION_TYPE_SMOOTHFADE :
1727 : {
1728 0 : pPage->setTransitionType( animations::TransitionType::FADE );
1729 0 : pPage->setTransitionSubtype( animations::TransitionSubType::CROSSFADE );
1730 : }
1731 0 : break;
1732 : }
1733 :
1734 14 : if ( nSpeed == 0 )
1735 0 : pPage->setTransitionDuration( 3.0 ); // slow
1736 14 : else if ( nSpeed == 1 )
1737 10 : pPage->setTransitionDuration( 2.0 ); // medium
1738 4 : else if ( nSpeed == 2 )
1739 4 : pPage->setTransitionDuration( 1.0 ); // fast
1740 :
1741 14 : if ( nBuildFlags & 0x400 ) // slidechange by time
1742 : { // time to show (in Ticks)
1743 0 : pPage->SetPresChange( PRESCHANGE_AUTO );
1744 0 : pPage->SetTime( nSlideTime / 1000.0 );
1745 : }
1746 : else
1747 14 : pPage->SetPresChange( mePresChange );
1748 :
1749 14 : if ( nBuildFlags & 4 )
1750 0 : pPage->SetExcluded( true ); // don't show slide
1751 14 : if ( nBuildFlags & 16 )
1752 : { // slide with sound effect
1753 10 : pPage->SetSound( true );
1754 10 : OUString aSoundFile( ReadSound( nSoundRef ) );
1755 10 : pPage->SetSoundFile( aSoundFile );
1756 : }
1757 14 : if ( nBuildFlags & ( 1 << 6 ) ) // Loop until next sound
1758 0 : pPage->SetLoopSound( true );
1759 14 : if ( nBuildFlags & ( 1 << 8 ) ) // Stop the previous sound
1760 0 : pPage->SetStopSound( true );
1761 14 : break;
1762 : }
1763 : }
1764 : }
1765 790 : aHd.SeekToEndOfRecord( rStCtrl );
1766 : }
1767 94 : if ( bTryTwice && ( bSSSlideInfoAtom == false ) )
1768 : {
1769 60 : bTryTwice = false;
1770 60 : if ( HasMasterPage( nAktPageNum, eAktPageKind ) )
1771 : {
1772 60 : sal_uInt16 nMasterNum = GetMasterPageIndex( nAktPageNum, eAktPageKind );
1773 60 : PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
1774 60 : if ( pPageList && ( nMasterNum < pPageList->size() ) )
1775 : {
1776 : assert( !pPageList->is_null( nMasterNum ) );
1777 60 : const PptSlidePersistEntry& rE = (*pPageList)[ nMasterNum ];
1778 60 : sal_uInt32 nOfs = rE.aPersistAtom.nReserved;
1779 60 : if ( nOfs )
1780 : {
1781 0 : rStCtrl.Seek( nOfs );
1782 0 : nPageRecEnd = nOfs + 16;
1783 0 : continue;
1784 : }
1785 : }
1786 :
1787 : }
1788 : }
1789 94 : break;
1790 0 : }
1791 : }
1792 : }
1793 :
1794 110 : if ( !bNewAnimationsUsed )
1795 : {
1796 88 : tAnimationVector aAnimationsOnThisPage;
1797 :
1798 : // add effects from page in correct order
1799 176 : SdrObjListIter aSdrIter( *pPage, IM_FLAT );
1800 606 : while ( aSdrIter.IsMore() )
1801 : {
1802 430 : SdrObject* pObj = aSdrIter.Next();
1803 430 : tAnimationMap::iterator aFound = maAnimations.find( pObj );
1804 430 : if( aFound != maAnimations.end() )
1805 : {
1806 0 : std::pair< SdrObject*, Ppt97AnimationPtr > aPair( (*aFound).first, (*aFound).second );
1807 0 : aAnimationsOnThisPage.push_back( aPair );
1808 : }
1809 : }
1810 :
1811 : Ppt97AnimationStlSortHelper aSortHelper;
1812 88 : std::sort( aAnimationsOnThisPage.begin(), aAnimationsOnThisPage.end(), aSortHelper );
1813 :
1814 88 : tAnimationVector::iterator aIter( aAnimationsOnThisPage.begin() );
1815 88 : const tAnimationVector::iterator aEnd( aAnimationsOnThisPage.end() );
1816 :
1817 88 : for( ;aIter != aEnd; ++aIter )
1818 : {
1819 0 : Ppt97AnimationPtr pPpt97Animation = (*aIter).second;;
1820 0 : if( pPpt97Animation.get() )
1821 0 : pPpt97Animation->createAndSetCustomAnimationEffect( (*aIter).first );
1822 88 : }
1823 : }
1824 110 : rStCtrl.Seek( nFilePosMerk );
1825 110 : }
1826 :
1827 : // import of sounds
1828 :
1829 : // Not only the sounds are imported as string, they are also inserted to
1830 : // the gallery if they are not already there.
1831 10 : OUString ImplSdPPTImport::ReadSound(sal_uInt32 nSoundRef) const
1832 : {
1833 10 : OUString aRetval;
1834 10 : sal_uInt32 nPosMerk = rStCtrl.Tell();
1835 10 : DffRecordHeader aDocHd;
1836 10 : if ( SeekToDocument( &aDocHd ) )
1837 : {
1838 10 : sal_uInt32 nSoundLen = aDocHd.GetRecEndFilePos();
1839 10 : DffRecordHeader aSoundBlockRecHd;
1840 10 : if( SeekToRec( rStCtrl, PPT_PST_SoundCollection, nSoundLen, &aSoundBlockRecHd ) )
1841 : {
1842 0 : sal_uInt32 nDataLen = aSoundBlockRecHd.GetRecEndFilePos();
1843 0 : DffRecordHeader aSoundRecHd;
1844 0 : bool bRefStrValid = false;
1845 0 : bool bDone = false;
1846 :
1847 0 : while( !bDone && SeekToRec( rStCtrl, PPT_PST_Sound, nDataLen, &aSoundRecHd ) )
1848 : {
1849 0 : sal_uInt32 nStrLen = aSoundRecHd.GetRecEndFilePos();
1850 0 : OUString aRefStr;
1851 0 : sal_uInt32 nPosMerk2 = rStCtrl.Tell();
1852 0 : if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen, NULL, 2 ) )
1853 : {
1854 0 : if ( ReadString( aRefStr ) )
1855 0 : bRefStrValid = true;
1856 : }
1857 0 : if ( bRefStrValid )
1858 : {
1859 0 : if ( OUString::number(nSoundRef) == aRefStr )
1860 : {
1861 0 : rStCtrl.Seek( nPosMerk2 );
1862 0 : if ( SeekToRec( rStCtrl, PPT_PST_CString, nStrLen, NULL, 0 ) )
1863 : {
1864 0 : ReadString( aRetval );
1865 0 : bDone = true;
1866 : }
1867 : }
1868 : }
1869 0 : if ( bDone )
1870 : {
1871 : // Check if this sound file already exists.
1872 : // If not, it is exported to our local sound directory.
1873 0 : bool bSoundExists = false;
1874 0 : ::std::vector< OUString > aSoundList;
1875 :
1876 0 : GalleryExplorer::FillObjList( GALLERY_THEME_SOUNDS, aSoundList );
1877 0 : GalleryExplorer::FillObjList( GALLERY_THEME_USERSOUNDS, aSoundList );
1878 :
1879 0 : for( size_t n = 0; ( n < aSoundList.size() ) && !bSoundExists; ++n )
1880 : {
1881 0 : INetURLObject aURL( aSoundList[ n ] );
1882 :
1883 0 : if( aURL.GetName() == aRetval )
1884 : {
1885 0 : aRetval = aSoundList[ n ];
1886 0 : bSoundExists = true;
1887 : }
1888 0 : }
1889 :
1890 0 : aSoundList.clear();
1891 :
1892 0 : if ( !bSoundExists )
1893 : {
1894 0 : rStCtrl.Seek( nPosMerk2 );
1895 0 : DffRecordHeader aSoundDataRecHd;
1896 0 : if ( SeekToRec( rStCtrl, PPT_PST_SoundData, nStrLen, &aSoundDataRecHd, 0 ) )
1897 : {
1898 0 : OUString aGalleryDir( SvtPathOptions().GetGalleryPath() );
1899 0 : sal_Int32 nTokenCount = comphelper::string::getTokenCount(aGalleryDir, ';');
1900 0 : INetURLObject aGalleryUserSound( aGalleryDir.getToken( nTokenCount - 1, ';' ) );
1901 :
1902 0 : aGalleryUserSound.Append( aRetval );
1903 0 : sal_uInt32 nSoundDataLen = aSoundDataRecHd.nRecLen;
1904 0 : sal_uInt8* pBuf = new sal_uInt8[ nSoundDataLen ];
1905 :
1906 0 : rStCtrl.Read( pBuf, nSoundDataLen );
1907 0 : SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aGalleryUserSound.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
1908 :
1909 0 : if( pOStm )
1910 : {
1911 0 : pOStm->Write( pBuf, nSoundDataLen );
1912 :
1913 0 : if( pOStm->GetError() == ERRCODE_NONE )
1914 : {
1915 0 : GalleryExplorer::InsertURL( GALLERY_THEME_USERSOUNDS, aGalleryUserSound.GetMainURL( INetURLObject::NO_DECODE ) );
1916 0 : aRetval = aGalleryUserSound.GetMainURL( INetURLObject::NO_DECODE );
1917 : }
1918 :
1919 0 : delete pOStm;
1920 : }
1921 :
1922 0 : delete[] pBuf;
1923 : }
1924 0 : }
1925 : }
1926 0 : if ( !bDone )
1927 0 : aSoundRecHd.SeekToEndOfRecord( rStCtrl );
1928 0 : }
1929 : }
1930 : }
1931 10 : rStCtrl.Seek( nPosMerk );
1932 10 : return aRetval;
1933 : }
1934 :
1935 : // media object import, the return value is the url to the media object
1936 0 : OUString ImplSdPPTImport::ReadMedia( sal_uInt32 nMediaRef ) const
1937 : {
1938 0 : OUString aRetVal;
1939 0 : DffRecordHeader* pHd( const_cast<ImplSdPPTImport*>(this)->aDocRecManager.GetRecordHeader( PPT_PST_ExObjList, SEEK_FROM_BEGINNING ) );
1940 0 : if ( pHd )
1941 : {
1942 0 : pHd->SeekToContent( rStCtrl );
1943 0 : while ( ( rStCtrl.Tell() < pHd->GetRecEndFilePos() ) && aRetVal.isEmpty() )
1944 : {
1945 0 : DffRecordHeader aHdMovie;
1946 0 : ReadDffRecordHeader( rStCtrl, aHdMovie );
1947 0 : switch( aHdMovie.nRecType )
1948 : {
1949 : case PPT_PST_ExAviMovie :
1950 : case PPT_PST_ExMCIMovie :
1951 : {
1952 0 : DffRecordHeader aExVideoHd;
1953 0 : if ( SeekToRec( rStCtrl, PPT_PST_ExVideo, aHdMovie.GetRecEndFilePos(), &aExVideoHd ) )
1954 : {
1955 0 : DffRecordHeader aExMediaAtomHd;
1956 0 : if ( SeekToRec( rStCtrl, PPT_PST_ExMediaAtom, aExVideoHd.GetRecEndFilePos(), &aExMediaAtomHd ) )
1957 : {
1958 : sal_uInt32 nRef;
1959 0 : rStCtrl.ReadUInt32( nRef );
1960 0 : if ( nRef == nMediaRef )
1961 : {
1962 0 : aExVideoHd.SeekToContent( rStCtrl );
1963 0 : while( rStCtrl.Tell() < aExVideoHd.GetRecEndFilePos() )
1964 : {
1965 0 : DffRecordHeader aHd;
1966 0 : ReadDffRecordHeader( rStCtrl, aHd );
1967 0 : switch( aHd.nRecType )
1968 : {
1969 : case PPT_PST_CString :
1970 : {
1971 0 : aHd.SeekToBegOfRecord( rStCtrl );
1972 0 : OUString aStr;
1973 0 : if ( ReadString( aStr ) )
1974 : {
1975 0 : if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aStr, aRetVal ) )
1976 : {
1977 0 : aRetVal = INetURLObject( aRetVal ).GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
1978 : }else{
1979 0 : aRetVal = aStr;
1980 : }
1981 0 : }
1982 : }
1983 0 : break;
1984 : }
1985 0 : aHd.SeekToEndOfRecord( rStCtrl );
1986 : }
1987 0 : break;
1988 : }
1989 : }
1990 : }
1991 : }
1992 0 : break;
1993 : }
1994 0 : aHdMovie.SeekToEndOfRecord( rStCtrl );
1995 : }
1996 : }
1997 0 : return aRetVal;
1998 : }
1999 :
2000 : // import of objects
2001 0 : void ImplSdPPTImport::FillSdAnimationInfo( SdAnimationInfo* pInfo, PptInteractiveInfoAtom* pIAtom, const OUString& aMacroName )
2002 : {
2003 : // set local information into pInfo
2004 0 : if( pIAtom->nSoundRef )
2005 : {
2006 0 : pInfo->SetBookmark( ReadSound( pIAtom->nSoundRef ) ); // path to sound file in MS DOS notation
2007 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_SOUND; // RunProgramAction
2008 : }
2009 :
2010 0 : switch ( pIAtom->nAction )
2011 : {
2012 :
2013 : case 0x02 : // RunProgramAction
2014 : {
2015 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PROGRAM;
2016 0 : pInfo->SetBookmark( aMacroName ); // program name in aBookmark
2017 : }
2018 0 : break;
2019 : case 0x03 : // JumpAction
2020 : {
2021 0 : switch( pIAtom->nJump )
2022 : {
2023 : case 0x01 :
2024 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_NEXTPAGE; // Next slide
2025 0 : break;
2026 : case 0x02 :
2027 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PREVPAGE; // Previous slide
2028 0 : break;
2029 : case 0x03 :
2030 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_FIRSTPAGE; // First slide
2031 0 : break;
2032 : case 0x04 :
2033 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_LASTPAGE; // last Slide
2034 0 : break;
2035 : case 0x05 :
2036 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PREVPAGE; // Last slide viewed
2037 0 : break;
2038 : case 0x06 :
2039 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_STOPPRESENTATION; // End show
2040 0 : break;
2041 : default :
2042 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_NONE; // 0x00: no action, else unknown
2043 0 : break;
2044 : }
2045 : }
2046 0 : break;
2047 : case 0x04 :
2048 : {
2049 0 : SdHyperlinkEntry* pPtr = NULL;
2050 0 : for ( size_t i = 0, n = aHyperList.size(); i < n; ++i ) {
2051 0 : if ( aHyperList[ i ]->nIndex == pIAtom->nExHyperlinkId ) {
2052 0 : pPtr = aHyperList[ i ];
2053 0 : break;
2054 : }
2055 : }
2056 0 : if ( pPtr )
2057 : {
2058 0 : switch( pIAtom->nHyperlinkType )
2059 : {
2060 : case 9:
2061 : case 8: // hyperlink : URL
2062 : {
2063 0 : if ( !pPtr->aTarget.isEmpty() )
2064 : {
2065 0 : ::sd::DrawDocShell* pDocShell = mpDoc->GetDocSh();
2066 0 : if ( pDocShell )
2067 : {
2068 0 : OUString aBaseURL = pDocShell->GetMedium()->GetBaseURL();
2069 0 : OUString aBookmarkURL( pInfo->GetBookmark() );
2070 0 : INetURLObject aURL( pPtr->aTarget );
2071 0 : if( INET_PROT_NOT_VALID == aURL.GetProtocol() )
2072 0 : utl::LocalFileHelper::ConvertSystemPathToURL( pPtr->aTarget, aBaseURL, aBookmarkURL );
2073 0 : if( aBookmarkURL.isEmpty() )
2074 0 : aBookmarkURL = URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), pPtr->aTarget, URIHelper::GetMaybeFileHdl(), true );
2075 0 : pInfo->SetBookmark( aBookmarkURL );
2076 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_PROGRAM;
2077 : }
2078 : }
2079 : }
2080 0 : break;
2081 :
2082 : case 10:
2083 0 : break;
2084 :
2085 : case 7: // hyperlink to a page
2086 : {
2087 0 : if ( !pPtr->aConvSubString.isEmpty() )
2088 : {
2089 0 : pInfo->meClickAction = ::com::sun::star::presentation::ClickAction_BOOKMARK;
2090 0 : pInfo->SetBookmark( pPtr->aConvSubString );
2091 : }
2092 : }
2093 0 : break;
2094 : }
2095 : }
2096 : }
2097 0 : break;
2098 : case 0x05 : // OLEAction ( OLEVerb to use, 0==first, 1==secnd, .. )
2099 : case 0x06 : // MediaAction
2100 : case 0x07 : // CustomShowAction
2101 : default : // 0x00: no action, else unknown action
2102 0 : break;
2103 : }
2104 0 : }
2105 :
2106 1304 : SdrObject* ImplSdPPTImport::ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj* pObj, SdPage* pPage,
2107 : SfxStyleSheet* pSheet, SfxStyleSheet** ppStyleSheetAry ) const
2108 : {
2109 : SfxStyleSheet* pStyleSheetAry[ 9 ];
2110 1304 : SdrTextObj* pText = pObj;
2111 1304 : SdrObject* pRet = pText;
2112 :
2113 1304 : ppStyleSheetAry = NULL;
2114 :
2115 1304 : PresObjKind ePresKind = PRESOBJ_NONE;
2116 1304 : PptOEPlaceholderAtom* pPlaceHolder = pTextObj->GetOEPlaceHolderAtom();
2117 1304 : OUString aPresentationText;
2118 1304 : if ( pPlaceHolder )
2119 : {
2120 356 : switch( pPlaceHolder->nPlaceholderId )
2121 : {
2122 : case PPT_PLACEHOLDER_MASTERNOTESSLIDEIMAGE :
2123 : case PPT_PLACEHOLDER_MASTERCENTEREDTITLE :
2124 : case PPT_PLACEHOLDER_MASTERTITLE :
2125 : {
2126 32 : ePresKind = PRESOBJ_TITLE;
2127 32 : aPresentationText = pPage->GetPresObjText( ePresKind );
2128 : }
2129 32 : break;
2130 : case PPT_PLACEHOLDER_MASTERBODY :
2131 : {
2132 20 : ePresKind = PRESOBJ_OUTLINE;
2133 20 : aPresentationText = pPage->GetPresObjText( ePresKind );
2134 : }
2135 20 : break;
2136 : case PPT_PLACEHOLDER_MASTERSUBTITLE :
2137 : {
2138 0 : ePresKind = PRESOBJ_TEXT;
2139 0 : aPresentationText = pPage->GetPresObjText( ePresKind );
2140 : }
2141 0 : break;
2142 : case PPT_PLACEHOLDER_MASTERNOTESBODYIMAGE :
2143 : {
2144 12 : ePresKind = PRESOBJ_NOTES;
2145 12 : aPresentationText = pPage->GetPresObjText( ePresKind );
2146 : }
2147 12 : break;
2148 34 : case PPT_PLACEHOLDER_MASTERDATE : ePresKind = PRESOBJ_DATETIME; break;
2149 32 : case PPT_PLACEHOLDER_MASTERSLIDENUMBER : ePresKind = PRESOBJ_SLIDENUMBER;break;
2150 34 : case PPT_PLACEHOLDER_MASTERFOOTER : ePresKind = PRESOBJ_FOOTER; break;
2151 18 : case PPT_PLACEHOLDER_MASTERHEADER : ePresKind = PRESOBJ_HEADER; break;
2152 : }
2153 : }
2154 1304 : switch ( pTextObj->GetDestinationInstance() )
2155 : {
2156 : case TSS_TYPE_PAGETITLE :
2157 : case TSS_TYPE_TITLE :
2158 : {
2159 88 : pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE );
2160 88 : if ( pSheet )
2161 88 : ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
2162 : DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" );
2163 : }
2164 88 : break;
2165 : case TSS_TYPE_SUBTITLE :
2166 : {
2167 8 : pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TEXT );
2168 8 : if ( pSheet )
2169 8 : ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
2170 : DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for subtitleobject (SJ)" );
2171 : }
2172 8 : break;
2173 : case TSS_TYPE_BODY :
2174 : case TSS_TYPE_HALFBODY :
2175 : case TSS_TYPE_QUARTERBODY :
2176 : {
2177 680 : for ( sal_uInt16 nLevel = 9; nLevel; nLevel-- )
2178 : {
2179 612 : OUString aName( pPage->GetLayoutName() );
2180 612 : aName += " ";
2181 612 : aName += OUString::number( nLevel );
2182 612 : pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find( aName, SD_STYLE_FAMILY_MASTERPAGE );
2183 612 : if ( pSheet )
2184 612 : pText->StartListening( *pSheet );
2185 612 : pStyleSheetAry[ nLevel - 1 ] = pSheet;
2186 612 : }
2187 : DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for outlinerobject (SJ)" );
2188 68 : if ( pSheet )
2189 68 : ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
2190 68 : ppStyleSheetAry = &pStyleSheetAry[ 0 ];
2191 : }
2192 68 : break;
2193 : case TSS_TYPE_NOTES :
2194 : {
2195 66 : if ( pPlaceHolder && ( ( pPlaceHolder->nPlaceholderId == PPT_PLACEHOLDER_NOTESSLIDEIMAGE )
2196 66 : || ( pPlaceHolder->nPlaceholderId == PPT_PLACEHOLDER_MASTERNOTESSLIDEIMAGE ) ) )
2197 : {
2198 12 : pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE );
2199 12 : if ( pSheet )
2200 12 : ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
2201 12 : DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for titleobject (SJ)" );
2202 : }
2203 : else
2204 : {
2205 54 : pSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_NOTES );
2206 : DBG_ASSERT( pSheet, "ImplSdPPTImport::ApplyTextObj -> could not get stylesheet for notesobj (SJ)" );
2207 54 : if ( pSheet )
2208 54 : ((SdrAttrObj*)pText)->SdrAttrObj::NbcSetStyleSheet( pSheet, true );
2209 : }
2210 : }
2211 66 : break;
2212 : case TSS_TYPE_UNUSED :
2213 : case TSS_TYPE_TEXT_IN_SHAPE :
2214 : {
2215 1074 : switch( ePresKind )
2216 : {
2217 : case PRESOBJ_DATETIME :
2218 : case PRESOBJ_SLIDENUMBER :
2219 : case PRESOBJ_FOOTER :
2220 : case PRESOBJ_HEADER :
2221 118 : pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find(SD_RESSTR(STR_PSEUDOSHEET_BACKGROUNDOBJECTS), SD_STYLE_FAMILY_PSEUDO );
2222 118 : break;
2223 : default :
2224 956 : pSheet = (SfxStyleSheet*)mpDoc->GetStyleSheetPool()->Find(SD_RESSTR(STR_STANDARD_STYLESHEET_NAME), SD_STYLE_FAMILY_GRAPHICS );
2225 : }
2226 : }
2227 1074 : break;
2228 : }
2229 1304 : pText = (SdrTextObj*)SdrPowerPointImport::ApplyTextObj( pTextObj, pText, pPage, pSheet, ppStyleSheetAry );
2230 1304 : if ( pPlaceHolder && pPlaceHolder->nPlaceholderId )
2231 : {
2232 356 : if ( eAktPageKind == PPT_MASTERPAGE )
2233 : {
2234 174 : bool bCreatePlaceHolder = ( pTextObj->GetInstance() != TSS_TYPE_UNUSED );
2235 158 : bool bIsHeaderFooter = ( ePresKind == PRESOBJ_HEADER) || (ePresKind == PRESOBJ_FOOTER)
2236 300 : || (ePresKind == PRESOBJ_DATETIME) || (ePresKind == PRESOBJ_SLIDENUMBER);
2237 174 : if ( bCreatePlaceHolder && ( pTextObj->GetInstance() == TSS_TYPE_TEXT_IN_SHAPE ) )
2238 110 : bCreatePlaceHolder = bIsHeaderFooter;
2239 174 : if ( bCreatePlaceHolder )
2240 : {
2241 174 : if ( !bIsHeaderFooter )
2242 : {
2243 64 : pText->SetNotVisibleAsMaster( true );
2244 64 : pText->SetEmptyPresObj( true );
2245 : }
2246 174 : pText->SetUserCall( pPage );
2247 174 : pPage->InsertPresObj( pText, ePresKind );
2248 174 : SdrOutliner* pOutl = NULL;
2249 174 : if ( pTextObj->GetInstance() == TSS_TYPE_NOTES )
2250 24 : pOutl = GetDrawOutliner( pText );
2251 174 : if ( !aPresentationText.isEmpty() )
2252 64 : pPage->SetObjText( (SdrTextObj*)pText, pOutl, ePresKind, aPresentationText );
2253 :
2254 174 : if ( pPage->GetPageKind() != PK_NOTES && pPage->GetPageKind() != PK_HANDOUT)
2255 : {
2256 88 : SfxStyleSheet* pSheet2( pPage->GetStyleSheetForPresObj( ePresKind ) );
2257 88 : if ( pSheet2 )
2258 : {
2259 88 : SfxItemSet& rItemSet = pSheet2->GetItemSet();
2260 88 : rItemSet.Put( (SdrMetricItem&)pText->GetMergedItem( SDRATTR_TEXT_LEFTDIST ) );
2261 88 : rItemSet.Put( (SdrMetricItem&)pText->GetMergedItem( SDRATTR_TEXT_RIGHTDIST ) );
2262 88 : rItemSet.Put( (SdrMetricItem&)pText->GetMergedItem( SDRATTR_TEXT_UPPERDIST ) );
2263 88 : rItemSet.Put( (SdrMetricItem&)pText->GetMergedItem( SDRATTR_TEXT_LOWERDIST ) );
2264 88 : rItemSet.Put( (SdrTextVertAdjustItem&)pText->GetMergedItem( SDRATTR_TEXT_VERTADJUST ) );
2265 88 : rItemSet.Put( (SdrTextHorzAdjustItem&)pText->GetMergedItem( SDRATTR_TEXT_HORZADJUST ) );
2266 176 : if ( pTextObj->GetInstance() == TSS_TYPE_TITLE
2267 88 : || pTextObj->GetInstance() == TSS_TYPE_SUBTITLE)
2268 : {
2269 0 : rItemSet.Put( pText->GetMergedItemSet() );
2270 : }
2271 : }
2272 88 : pText->NbcSetStyleSheet( pSheet2, false );
2273 : }
2274 :
2275 174 : SfxItemSet aTempAttr( mpDoc->GetPool() );
2276 348 : SdrMetricItem aMinHeight( makeSdrTextMinFrameHeightItem(pText->GetLogicRect().GetSize().Height()) );
2277 174 : aTempAttr.Put( aMinHeight );
2278 348 : SdrOnOffItem aAutoGrowHeight( makeSdrTextAutoGrowHeightItem(false) );
2279 174 : aTempAttr.Put( aAutoGrowHeight );
2280 348 : pText->SetMergedItemSet(aTempAttr);
2281 : }
2282 : else
2283 : {
2284 0 : pRet = NULL;
2285 : }
2286 : }
2287 : else
2288 : {
2289 182 : const PptSlideLayoutAtom* pSlideLayout = GetSlideLayoutAtom();
2290 182 : if ( pSlideLayout || ( eAktPageKind == PPT_NOTEPAGE ) )
2291 : {
2292 182 : sal_uInt32 nPlacementId = pPlaceHolder->nPlacementId;
2293 182 : sal_Int16 nPlaceholderId = pPlaceHolder->nPlaceholderId;
2294 :
2295 182 : if ( eAktPageKind == PPT_SLIDEPAGE )
2296 : {
2297 132 : PresObjKind ePresObjKind = PRESOBJ_NONE;
2298 132 : bool bEmptyPresObj = true;
2299 132 : bool bVertical = false;
2300 132 : if ( ( pTextObj->GetShapeType() == mso_sptRectangle ) || ( pTextObj->GetShapeType() == mso_sptTextBox ) )
2301 : {
2302 : //if a placeholder with some custom attribute,the pTextObj will keep those attr,whose text size is zero,
2303 : //so sdPage should renew a PresObj to process placeholder.
2304 126 : bEmptyPresObj = ( pTextObj->Count() == 0 ) || ( pTextObj->Count() == 1 && pTextObj->First()->GetTextSize() == 0 );
2305 126 : switch ( nPlaceholderId )
2306 : {
2307 0 : case PPT_PLACEHOLDER_NOTESBODY : ePresObjKind = PRESOBJ_NOTES; break;
2308 : case PPT_PLACEHOLDER_VERTICALTEXTTITLE :
2309 0 : bVertical = true; // PASSTHROUGH !!!
2310 64 : case PPT_PLACEHOLDER_TITLE : ePresObjKind = PRESOBJ_TITLE; break;
2311 : case PPT_PLACEHOLDER_VERTICALTEXTBODY :
2312 0 : bVertical = true; // PASSTHROUGH !!!
2313 48 : case PPT_PLACEHOLDER_BODY : ePresObjKind = PRESOBJ_OUTLINE; break;
2314 6 : case PPT_PLACEHOLDER_CENTEREDTITLE : ePresObjKind = PRESOBJ_TITLE; break;
2315 8 : case PPT_PLACEHOLDER_SUBTITLE : ePresObjKind = PRESOBJ_TEXT; break; // PRESOBJ_OUTLINE
2316 :
2317 : default :
2318 : {
2319 0 : if ( pTextObj->Count() == 0 )
2320 : {
2321 0 : switch ( nPlaceholderId )
2322 : {
2323 : case PPT_PLACEHOLDER_MEDIACLIP :
2324 0 : case PPT_PLACEHOLDER_OBJECT : ePresObjKind = PRESOBJ_OBJECT; break;
2325 0 : case PPT_PLACEHOLDER_GRAPH : ePresObjKind = PRESOBJ_CHART; break;
2326 0 : case PPT_PLACEHOLDER_TABLE : ePresObjKind = PRESOBJ_TABLE; break;
2327 0 : case PPT_PLACEHOLDER_CLIPART : ePresObjKind = PRESOBJ_GRAPHIC; break;
2328 0 : case PPT_PLACEHOLDER_ORGANISZATIONCHART : ePresObjKind = PRESOBJ_ORGCHART; break;
2329 : }
2330 : }
2331 : };
2332 : }
2333 : }
2334 6 : else if ( pTextObj->GetShapeType() == mso_sptPictureFrame )
2335 : {
2336 6 : if ( !pTextObj->Count() && pObj->ISA( SdrGrafObj ) )
2337 : {
2338 0 : bEmptyPresObj = false;
2339 0 : switch ( nPlaceholderId )
2340 : {
2341 : case PPT_PLACEHOLDER_MEDIACLIP :
2342 0 : case PPT_PLACEHOLDER_OBJECT : ePresObjKind = PRESOBJ_OBJECT; break;
2343 0 : case PPT_PLACEHOLDER_GRAPH : ePresObjKind = PRESOBJ_CHART; break;
2344 0 : case PPT_PLACEHOLDER_TABLE : ePresObjKind = PRESOBJ_CALC; break;
2345 0 : case PPT_PLACEHOLDER_CLIPART : ePresObjKind = PRESOBJ_GRAPHIC; break;
2346 0 : case PPT_PLACEHOLDER_ORGANISZATIONCHART : ePresObjKind = PRESOBJ_ORGCHART; break;
2347 : }
2348 : }
2349 : }
2350 132 : if ( ePresObjKind != PRESOBJ_NONE )
2351 : {
2352 126 : if ( !bEmptyPresObj )
2353 : {
2354 106 : pPage->InsertPresObj( pRet, ePresObjKind );
2355 : }
2356 : else
2357 : {
2358 20 : SdrObject* pPresObj = pPage->CreatePresObj( ePresObjKind, bVertical, pText->GetLogicRect(), true );
2359 20 : pPresObj->SetUserCall( pPage );
2360 :
2361 20 : SfxItemSet aSet( pSdrModel->GetItemPool() );
2362 20 : ApplyAttributes( rStCtrl, aSet );
2363 20 : pPresObj->SetLogicRect(pText->GetLogicRect());
2364 20 : ApplyTextAnchorAttributes( *pTextObj, aSet );
2365 : //set custom font attribute of the placeholder
2366 20 : if ( pTextObj->Count() == 1 )
2367 : {
2368 8 : PPTParagraphObj* pPara = pTextObj->First();
2369 8 : PPTPortionObj* pPor = NULL;
2370 8 : if ( pPara && pPara->GetTextSize() == 0 && (pPor = pPara->First()))
2371 : {
2372 8 : pPor->ApplyTo(aSet, (SdrPowerPointImport&)*this, pTextObj->GetDestinationInstance());
2373 : }
2374 : }
2375 20 : pPresObj->SetMergedItemSet(aSet);
2376 :
2377 20 : if ((eAktPageKind != PPT_NOTEPAGE) && (nPlacementId != 0xffffffff) && pPage->TRG_HasMasterPage())
2378 : {
2379 12 : SdrObject* pTitleObj = ((SdPage&)pPage->TRG_GetMasterPage()).GetPresObj( PRESOBJ_TITLE );
2380 12 : SdrObject* pOutlineObj = ((SdPage&)pPage->TRG_GetMasterPage()).GetPresObj( PRESOBJ_OUTLINE );
2381 :
2382 12 : Rectangle aTitleRect;
2383 12 : Rectangle aOutlineRect;
2384 12 : Size aOutlineSize;
2385 :
2386 12 : if ( pTitleObj )
2387 12 : aTitleRect = pTitleObj->GetLogicRect();
2388 12 : if ( pOutlineObj )
2389 : {
2390 12 : aOutlineRect = pOutlineObj->GetLogicRect();
2391 12 : aOutlineSize = aOutlineRect.GetSize();
2392 : }
2393 12 : Rectangle aLogicRect( pPresObj->GetLogicRect() );
2394 12 : Size aLogicSize( aLogicRect.GetSize() );
2395 :
2396 12 : switch ( nPlacementId )
2397 : {
2398 : case 0 : // position in title area
2399 : {
2400 10 : if ( aLogicRect != aTitleRect )
2401 10 : pPresObj->SetUserCall( NULL );
2402 : }
2403 10 : break;
2404 :
2405 : case 1:
2406 : {
2407 2 : if ( pSlideLayout->eLayout == PPT_LAYOUT_TITLEANDBODYSLIDE )
2408 : { // position in outline area
2409 0 : if ( aLogicRect != aOutlineRect )
2410 0 : pPresObj->SetUserCall( NULL );
2411 : }
2412 2 : else if ( pSlideLayout->eLayout == PPT_LAYOUT_2COLUMNSANDTITLE )
2413 : { // position in outline area left
2414 0 : if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
2415 0 : std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE ||
2416 0 : std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE ||
2417 0 : (double)aLogicSize.Width() / aOutlineSize.Width() < 0.48 ||
2418 0 : (double)aLogicSize.Width() / aOutlineSize.Width() > 0.5)
2419 : {
2420 0 : pPresObj->SetUserCall(NULL);
2421 : }
2422 : }
2423 2 : else if ( pSlideLayout->eLayout == PPT_LAYOUT_2ROWSANDTITLE )
2424 : { // position in outline area top
2425 0 : if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
2426 0 : std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE ||
2427 0 : std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE)
2428 : {
2429 0 : pPresObj->SetUserCall( NULL );
2430 : }
2431 : }
2432 2 : else if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
2433 0 : std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE)
2434 : { // position in outline area top left
2435 2 : pPresObj->SetUserCall( NULL );
2436 : }
2437 : }
2438 2 : break;
2439 :
2440 : case 2:
2441 : {
2442 0 : if ( pSlideLayout->eLayout == PPT_LAYOUT_2COLUMNSANDTITLE )
2443 : { // position in outline area right
2444 0 : if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE ||
2445 0 : std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE ||
2446 0 : std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE ||
2447 0 : (double)aLogicSize.Width() / aOutlineSize.Width() < 0.48 ||
2448 0 : (double)aLogicSize.Width() / aOutlineSize.Width() > 0.5)
2449 : {
2450 0 : pPresObj->SetUserCall( NULL );
2451 : }
2452 : }
2453 0 : else if ( pSlideLayout->eLayout == PPT_LAYOUT_2ROWSANDTITLE )
2454 : { // position in outline area bottom
2455 0 : if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
2456 0 : std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE ||
2457 0 : std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE)
2458 : {
2459 0 : pPresObj->SetUserCall( NULL );
2460 : }
2461 : }
2462 0 : else if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE ||
2463 0 : std::abs(aLogicRect.Top() - aOutlineRect.Top()) > MAX_USER_MOVE)
2464 : { // position in outline area top right
2465 0 : pPresObj->SetUserCall(NULL);
2466 : }
2467 : }
2468 0 : break;
2469 :
2470 : case 3:
2471 : { // position in outline area bottom left
2472 0 : if (std::abs(aLogicRect.Left() - aOutlineRect.Left()) > MAX_USER_MOVE ||
2473 0 : std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE)
2474 : {
2475 0 : pPresObj->SetUserCall( NULL );
2476 : }
2477 : }
2478 0 : break;
2479 :
2480 : case 4:
2481 : { // position in outline area bottom right
2482 0 : if (std::abs(aLogicRect.Right() - aOutlineRect.Right()) > MAX_USER_MOVE ||
2483 0 : std::abs(aLogicRect.Bottom() - aOutlineRect.Bottom()) > MAX_USER_MOVE)
2484 : {
2485 0 : pObj->SetUserCall( NULL );
2486 : }
2487 : }
2488 0 : break;
2489 : }
2490 : }
2491 20 : pRet = NULL; // return zero cause this obj was already inserted by CreatePresObj
2492 : }
2493 : }
2494 6 : else if ( !pTextObj->Count() )
2495 6 : pRet = NULL;
2496 : }
2497 : }
2498 : }
2499 : }
2500 1304 : if ( pRet != pText )
2501 : {
2502 26 : SdrObject* pFree( pText );
2503 26 : SdrObject::Free( pFree );
2504 : }
2505 1304 : return pRet;
2506 : }
2507 :
2508 2590 : SdrObject* ImplSdPPTImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, void* pData, Rectangle& rTextRect, SdrObject* pRet )
2509 : {
2510 2590 : SdrObject* pObj = SdrPowerPointImport::ProcessObj( rSt, rObjData, pData, rTextRect, pRet );
2511 :
2512 : // read animation effect of object
2513 2590 : if ( pObj )
2514 : {
2515 : // further setup placeholder objects
2516 2570 : if( pObj->ISA(SdrPageObj) && pData )
2517 : {
2518 40 : const ProcessData* pProcessData=(const ProcessData*)pData;
2519 40 : if( pProcessData->pPage )
2520 40 : pProcessData->pPage->InsertPresObj( pObj, PRESOBJ_PAGE );
2521 : }
2522 :
2523 2570 : bool bInhabitanceChecked = false;
2524 2570 : bool bAnimationInfoFound = false;
2525 2570 : DffRecordHeader aMasterShapeHd;
2526 :
2527 2570 : if ( maShapeRecords.SeekToContent( rSt, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) )
2528 : {
2529 452 : DffRecordHeader& rHdClientData = *maShapeRecords.Current();
2530 : while( true )
2531 : {
2532 622 : sal_uInt32 nClientDataLen = rHdClientData.GetRecEndFilePos();
2533 622 : DffRecordHeader aHd;
2534 642 : do
2535 : {
2536 642 : ReadDffRecordHeader( rSt, aHd );
2537 642 : sal_uInt32 nHdRecEnd = aHd.GetRecEndFilePos();
2538 642 : switch ( aHd.nRecType )
2539 : {
2540 : case PPT_PST_AnimationInfo :
2541 : {
2542 78 : DffRecordHeader aHdAnimInfoAtom;
2543 78 : if ( SeekToRec( rSt, PPT_PST_AnimationInfoAtom, nHdRecEnd, &aHdAnimInfoAtom ) )
2544 : {
2545 : // read data from stream
2546 78 : Ppt97AnimationPtr pAnimation( new Ppt97Animation( rSt ) );
2547 : // store animation information
2548 78 : if( pAnimation->HasEffect() )
2549 : {
2550 : // translate color to RGB
2551 78 : pAnimation->SetDimColor( MSO_CLR_ToColor(pAnimation->GetDimColor()).GetColor() );
2552 : // translate sound bits to file url
2553 78 : if( pAnimation->HasSoundEffect() )
2554 0 : pAnimation->SetSoundFileUrl( ReadSound( pAnimation->GetSoundRef() ) );
2555 :
2556 78 : bool bDontAnimateInvisibleShape = false;
2557 : {
2558 78 : SdrTextObj* pTextObj = dynamic_cast<SdrTextObj*>(pObj);
2559 :
2560 188 : if( pTextObj && pTextObj->HasText() &&
2561 166 : !pObj->ISA( SdrObjGroup ) &&
2562 44 : pAnimation->HasAnimateAssociatedShape() )
2563 : {
2564 12 : const SfxItemSet& rObjItemSet = pObj->GetMergedItemSet();
2565 :
2566 12 : drawing::FillStyle eFillStyle = ((XFillStyleItem&)(rObjItemSet.Get(XATTR_FILLSTYLE))).GetValue();
2567 12 : XLineStyle eLineStyle = ((XLineStyleItem&)(rObjItemSet.Get(XATTR_LINESTYLE))).GetValue();
2568 :
2569 12 : if ( ( eFillStyle == drawing::FillStyle_NONE ) && ( eLineStyle == XLINE_NONE ) )
2570 10 : bDontAnimateInvisibleShape = true;
2571 : }
2572 : }
2573 78 : if( bDontAnimateInvisibleShape )
2574 10 : pAnimation->SetAnimateAssociatedShape(false);
2575 :
2576 : //maybe some actions necessary to ensure that animations on master pages are played before animations on normal pages
2577 : ///mabe todo in future: bool bIsEffectOnMasterPage = !bInhabitanceChecked;?
2578 :
2579 78 : maAnimations[pObj] = pAnimation;
2580 :
2581 78 : bAnimationInfoFound = true;
2582 78 : }
2583 : }
2584 : }
2585 78 : break;
2586 : case PPT_PST_InteractiveInfo:
2587 : {
2588 0 : sal_uInt32 nFilePosMerk2 = rSt.Tell();
2589 0 : OUString aMacroName;
2590 :
2591 0 : if(SeekToRec( rSt, PPT_PST_CString, nHdRecEnd, NULL, 0 ) )
2592 0 : ReadString(aMacroName);
2593 :
2594 0 : rSt.Seek( nFilePosMerk2 );
2595 0 : DffRecordHeader aHdInteractiveInfoAtom;
2596 0 : if ( SeekToRec( rSt, PPT_PST_InteractiveInfoAtom, nHdRecEnd, &aHdInteractiveInfoAtom ) )
2597 : {
2598 : PptInteractiveInfoAtom aInteractiveInfoAtom;
2599 0 : ReadPptInteractiveInfoAtom( rSt, aInteractiveInfoAtom );
2600 :
2601 : // interactive object
2602 0 : SdAnimationInfo* pInfo = SdDrawDocument::GetShapeUserData(*pObj, true);
2603 :
2604 0 : ( (ImplSdPPTImport*) this )->FillSdAnimationInfo( pInfo, &aInteractiveInfoAtom, aMacroName );
2605 0 : if ( aInteractiveInfoAtom.nAction == 6 ) // Sj -> media action
2606 : {
2607 0 : rHdClientData.SeekToContent( rStCtrl );
2608 0 : DffRecordHeader aObjRefAtomHd;
2609 0 : if ( SeekToRec( rSt, PPT_PST_ExObjRefAtom, nHdRecEnd, &aObjRefAtomHd ) )
2610 : {
2611 : sal_uInt32 nRef;
2612 0 : rSt.ReadUInt32( nRef );
2613 0 : OUString aMediaURL( ReadMedia( nRef ) );
2614 0 : if ( aMediaURL.isEmpty() )
2615 0 : aMediaURL = ReadSound( nRef );
2616 0 : if ( !aMediaURL.isEmpty() )
2617 : {
2618 0 : SdrMediaObj* pMediaObj = new SdrMediaObj( pObj->GetSnapRect() );
2619 0 : pMediaObj->SetModel( pObj->GetModel() );
2620 0 : pMediaObj->SetMergedItemSet( pObj->GetMergedItemSet() );
2621 :
2622 : //--remove object from maAnimations list and add the new object instead
2623 0 : Ppt97AnimationPtr pAnimation;
2624 : {
2625 0 : tAnimationMap::iterator aFound = maAnimations.find( pObj );
2626 0 : if( aFound != maAnimations.end() )
2627 : {
2628 0 : pAnimation = (*aFound).second;
2629 0 : maAnimations.erase(aFound);
2630 : }
2631 0 : maAnimations[pMediaObj] = pAnimation;
2632 : }
2633 :
2634 0 : SdrObject::Free( pObj ), pObj = pMediaObj; // SJ: hoping that pObj is not inserted in any list
2635 0 : pMediaObj->setURL( aMediaURL, ""/*TODO?*/ );
2636 0 : }
2637 : }
2638 : }
2639 0 : }
2640 : }
2641 0 : break;
2642 : }
2643 642 : aHd.SeekToEndOfRecord( rSt );
2644 : }
2645 642 : while( ( rSt.GetError() == 0 ) && ( rSt.Tell() < nClientDataLen ) );
2646 :
2647 622 : if ( bInhabitanceChecked || bAnimationInfoFound )
2648 : break;
2649 374 : bInhabitanceChecked = true;
2650 374 : if ( ! ( IsProperty( DFF_Prop_hspMaster ) && SeekToShape( rSt, pData, GetPropertyValue( DFF_Prop_hspMaster ) ) ) )
2651 204 : break;
2652 170 : ReadDffRecordHeader( rSt, aMasterShapeHd );
2653 170 : if ( !SeekToRec( rSt, DFF_msofbtClientData, aMasterShapeHd.GetRecEndFilePos(), &aMasterShapeHd ) )
2654 0 : break;
2655 170 : aMasterShapeHd.SeekToContent( rSt );
2656 170 : rHdClientData = aMasterShapeHd;
2657 170 : }
2658 : }
2659 : }
2660 2590 : return pObj;
2661 : }
2662 :
2663 : bool
2664 0 : ImplSdPPTImport::ReadFormControl( SotStorageRef& rSrc1, com::sun::star::uno::Reference< com::sun::star::form::XFormComponent > & rFormComp ) const
2665 : {
2666 0 : uno::Reference< frame::XModel > xModel;
2667 0 : if ( mpDoc->GetDocSh() )
2668 : {
2669 0 : xModel = mpDoc->GetDocSh()->GetModel();
2670 0 : oox::ole::MSConvertOCXControls mCtrlImporter( xModel );
2671 0 : return mCtrlImporter.ReadOCXStorage( rSrc1, rFormComp );
2672 : }
2673 0 : return false;
2674 : }
2675 :
2676 : // exported function
2677 20 : extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL ImportPPT(
2678 : SdDrawDocument* pDocument, SvStream& rDocStream, SvStorage& rStorage, SfxMedium& rMedium )
2679 : {
2680 20 : SdPPTImport* pImport = new SdPPTImport( pDocument, rDocStream, rStorage, rMedium );
2681 20 : bool bRet = pImport->Import();
2682 :
2683 20 : delete pImport;
2684 :
2685 20 : return bRet;
2686 24 : }
2687 :
2688 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|