1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_filter.hxx"
26 #include <osl/endian.h>
27 #include <vcl/svapp.hxx>
28 #include <unotools/tempfile.hxx>
29 #include <math.h>
30 #include <editeng/eeitem.hxx>
31 #include <sot/storage.hxx>
32 #include <sot/storinfo.hxx>
33 #include <sot/stg.hxx>
34 #include <com/sun/star/embed/Aspects.hpp>
35 #include <com/sun/star/office/XAnnotation.hpp>
36 #include <com/sun/star/office/XAnnotationAccess.hpp>
37 #include <com/sun/star/text/XText.hpp>
38 #include <com/sun/star/geometry/RealPoint2D.hpp>
39 #include <com/sun/star/util/DateTime.hpp>
40 #include <com/sun/star/drawing/BitmapMode.hpp>
41 #include <unotools/streamwrap.hxx>
42 #include <filter/msfilter/svdfppt.hxx>
43 #include <svx/xpoly.hxx>
44 #include <svx/svdtrans.hxx>
45 #include <svx/svdmodel.hxx>
46 #include <svx/svdpage.hxx>
47 #include <svx/svdobj.hxx>
48 #include <svx/svdogrp.hxx>
49 #include <svx/svdorect.hxx>
50 #include <svx/svdopage.hxx>
51 #include <svx/svdograf.hxx>
52 #include <svx/svdopath.hxx>
53 #include <svx/svdocirc.hxx>
54 #include <svx/svdocapt.hxx>
55 #include <svx/svdotable.hxx>
56 #include <editeng/outlobj.hxx>
57 #include <svx/svdattr.hxx>
58 #include "svx/xattr.hxx"
59 #include "svx/svditext.hxx"
60 #include <svx/svdetc.hxx>
61 #include <editeng/bulitem.hxx>
62 #include <svx/polysc3d.hxx>
63 #include <svx/extrud3d.hxx>
64 #include <svx/svdoashp.hxx>
65 #include <editeng/tstpitem.hxx>
66 #include <editeng/unoprnms.hxx>
67 #include <editeng/editids.hrc>
68
69 #if defined(JOEENV) && defined(JOEDEBUG)
70 #include "impinccv.h" // etwas Testkram
71 #endif
72
73 #if defined(DBG_EXTRACTOLEOBJECTS) || defined(DBG_EXTRACTFONTMETRICS)
74 #include <tools/urlobj.hxx>
75 #include <unotools/localfilehelper.hxx>
76 #endif
77
78 #define ITEMVALUE(ItemSet,Id,Cast) ((const Cast&)(ItemSet).Get(Id)).GetValue()
79 #include <editeng/adjitem.hxx>
80 #include <editeng/escpitem.hxx>
81 #include <editeng/colritem.hxx>
82 #include <editeng/fhgtitem.hxx>
83 #include <editeng/wghtitem.hxx>
84 #include <editeng/postitem.hxx>
85 #include <editeng/udlnitem.hxx>
86 #include <editeng/crsditem.hxx>
87 #include <editeng/shdditem.hxx>
88 #include <editeng/charreliefitem.hxx>
89 #include <editeng/fontitem.hxx>
90 #include <svx/svdoutl.hxx>
91 #include <editeng/editeng.hxx>
92 #include <editeng/lspcitem.hxx>
93 #include <editeng/ulspitem.hxx>
94 #include <editeng/lrspitem.hxx>
95 #include <vcl/metric.hxx>
96 #include <vcl/bmpacc.hxx>
97 #include <svx/svditer.hxx>
98 #include <svx/svdoedge.hxx>
99 #include <svx/sxekitm.hxx>
100 #include <editeng/flditem.hxx>
101 #include <svtools/sychconv.hxx>
102 #include <tools/zcodec.hxx>
103 #include <filter/msfilter/svxmsbas.hxx>
104 #include <sfx2/objsh.hxx>
105 #include <editeng/brshitem.hxx>
106 #include <editeng/langitem.hxx>
107 #include <svx/svdoole2.hxx>
108 #include <svx/unoapi.hxx>
109 #include <toolkit/helper/vclunohelper.hxx>
110 #include <com/sun/star/container/XIndexContainer.hpp>
111 #include <com/sun/star/drawing/XShapes.hpp>
112 #include <com/sun/star/drawing/XControlShape.hpp>
113 #include <com/sun/star/form/XFormComponent.hpp>
114 #include <com/sun/star/beans/XPropertySet.hpp>
115 #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
116 #include <com/sun/star/drawing/XMasterPagesSupplier.hpp>
117 #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
118 #include <com/sun/star/awt/Size.hpp>
119 #include <com/sun/star/awt/Point.hpp>
120 #include <com/sun/star/drawing/FillStyle.hpp>
121 #include <com/sun/star/drawing/TextVerticalAdjust.hpp>
122 #include <editeng/writingmodeitem.hxx>
123 #include <vcl/print.hxx>
124 #include <editeng/svxfont.hxx>
125 #include <editeng/frmdiritem.hxx>
126 #include <svx/sdtfchim.hxx>
127 #include <unotools/ucbstreamhelper.hxx>
128 #include <editeng/scripttypeitem.hxx>
129 #include "com/sun/star/awt/Gradient.hpp"
130 #include <com/sun/star/table/XMergeableCellRange.hpp>
131 #include <com/sun/star/table/BorderLine.hpp>
132 #include <vcl/virdev.hxx>
133 #include <algorithm>
134 #include <set>
135
136 ////////////////////////////////////////////////////////////////////////////////////////////////////
137
138 // PPT ColorScheme Slots
139 #define PPT_COLSCHEME (0x08000000)
140 #define PPT_COLSCHEME_HINTERGRUND (0x08000000)
141 #define PPT_COLSCHEME_TEXT_UND_ZEILEN (0x08000001)
142 #define PPT_COLSCHEME_SCHATTEN (0x08000002)
143 #define PPT_COLSCHEME_TITELTEXT (0x08000003)
144 #define PPT_COLSCHEME_FUELLBEREICHE (0x08000004)
145 #define PPT_COLSCHEME_AKZENT (0x08000005)
146 #define PPT_COLSCHEME_A_UND_HYPERLINK (0x08000006)
147 #define PPT_COLSCHEME_A_H_GESICHERT (0x08000007)
148
149 ////////////////////////////////////////////////////////////////////////////////////////////////////
150
151 #define ANSI_CHARSET 0
152 #define DEFAULT_CHARSET 1
153 #define SYMBOL_CHARSET 2
154 #define SHIFTJIS_CHARSET 128
155 #define HANGEUL_CHARSET 129
156 #define CHINESEBIG5_CHARSET 136
157 #define OEM_CHARSET 255
158
159 ////////////////////////////////////////////////////////////////////////////////////////////////////
160
161 /* Font Families */
162 #define FF_DONTCARE 0x00
163 #define FF_ROMAN 0x10
164 #define FF_SWISS 0x20
165 #define FF_MODERN 0x30
166 #define FF_SCRIPT 0x40
167 #define FF_DECORATIVE 0x50
168
169 ////////////////////////////////////////////////////////////////////////////////////////////////////
170
171 #define DEFAULT_PITCH 0x00
172 #define FIXED_PITCH 0x01
173 #define VARIABLE_PITCH 0x02
174
175 using namespace ::com::sun::star ;
176 using namespace uno ;
177 using namespace beans ;
178 using namespace drawing ;
179 using namespace container ;
180 using namespace table ;
181
182 ////////////////////////////////////////////////////////////////////////////////////////////////////
183
PowerPointImportParam(SvStream & rDocStrm,sal_uInt32 nFlags,MSFilterTracer * pT)184 PowerPointImportParam::PowerPointImportParam( SvStream& rDocStrm, sal_uInt32 nFlags, MSFilterTracer* pT ) :
185 rDocStream ( rDocStrm ),
186 nImportFlags ( nFlags ),
187 pTracer ( pT )
188 {
189 }
190
191 ////////////////////////////////////////////////////////////////////////////////////////////////////
192
operator >>(SvStream & rIn,PptCurrentUserAtom & rAtom)193 SvStream& operator>>( SvStream& rIn, PptCurrentUserAtom& rAtom )
194 {
195 DffRecordHeader aHd;
196 rIn >> aHd;
197 if ( aHd.nRecType == PPT_PST_CurrentUserAtom )
198 {
199 sal_uInt32 nLen;
200 sal_uInt16 nUserNameLen, nPad;
201 rIn >> nLen
202 >> rAtom.nMagic
203 >> rAtom.nCurrentUserEdit
204 >> nUserNameLen
205 >> rAtom.nDocFileVersion
206 >> rAtom.nMajorVersion
207 >> rAtom.nMinorVersion
208 >> nPad;
209 SvxMSDffManager::MSDFFReadZString( rIn, rAtom.aCurrentUser, nUserNameLen, sal_True );
210 }
211 aHd.SeekToEndOfRecord( rIn );
212 return rIn;
213 }
214
Clear()215 void PptSlidePersistAtom::Clear()
216 {
217 nReserved = nPsrReference = nFlags = nNumberTexts = nSlideId = 0;
218 }
219
operator >>(SvStream & rIn,PptSlidePersistAtom & rAtom)220 SvStream& operator>>( SvStream& rIn, PptSlidePersistAtom& rAtom )
221 {
222 DffRecordHeader aHd;
223 rIn >> aHd
224 >> rAtom.nPsrReference
225 >> rAtom.nFlags
226 >> rAtom.nNumberTexts
227 >> rAtom.nSlideId;
228 // >> rAtom.nReserved;
229 aHd.SeekToEndOfRecord( rIn );
230 return rIn;
231 }
232
233 SV_IMPL_PTRARR(_PptSlidePersistList,PptSlidePersistEntry*);
234
FindPage(sal_uInt32 nId) const235 sal_uInt16 PptSlidePersistList::FindPage(sal_uInt32 nId) const
236 {
237 for ( sal_uInt16 i=0; i < Count(); i++ )
238 {
239 if (operator[](i)->GetSlideId()==nId) return i;
240 }
241 return PPTSLIDEPERSIST_ENTRY_NOTFOUND;
242 }
243
244 ////////////////////////////////////////////////////////////////////////////////////////////////////
245
operator >>(SvStream & rIn,PptInteractiveInfoAtom & rAtom)246 SvStream& operator>>( SvStream& rIn, PptInteractiveInfoAtom& rAtom )
247 {
248 rIn >> rAtom.nSoundRef
249 >> rAtom.nExHyperlinkId
250 >> rAtom.nAction
251 >> rAtom.nOleVerb
252 >> rAtom.nJump
253 >> rAtom.nFlags
254 >> rAtom.nHyperlinkType
255 >> rAtom.nUnknown1
256 >> rAtom.nUnknown2
257 >> rAtom.nUnknown3;
258 return rIn;
259 }
260
operator >>(SvStream & rIn,PptExOleObjAtom & rAtom)261 SvStream& operator>>( SvStream& rIn, PptExOleObjAtom& rAtom )
262 {
263 rIn >> rAtom.nAspect
264 >> rAtom.nDummy1
265 >> rAtom.nId
266 >> rAtom.nDummy2
267 >> rAtom.nPersistPtr
268 >> rAtom.nDummy4;
269 return rIn;
270 }
271
GetPageSize(const Size & rSiz) const272 Size PptDocumentAtom::GetPageSize(const Size& rSiz) const
273 {
274 return rSiz;
275 /*
276 Size aRet;
277 switch ( eSlidesPageFormat )
278 {
279 // Wenn man in PowerPoint als Seitenformat "Bildschirmgroesse"
280 // einstellt, dann zeigt dieser Dialog zwar 24x18cm an, die
281 // angezeigte Seite ist aber anders. Das sieht man, wenn man
282 // ein Rechteck seitenfuellend aufzieht und sich dessen Groesse
283 // ansieht. Die importierten Abmessungen sind auf jeden Fall
284 // die, die auch im Ppt-File stehen. Ich denke, das es sich
285 // hier eher um ein Bug in PowerPoint handelt, das im
286 // Seitenformat-Dialog bei "Bildschirmgroesse" falsche Masse
287 // angezeigt werden (vielleicht ja auch bildschirmabhaengig?).
288 // case PPTPF_SCREEN : aRet.Width()=4082; aRet.Height()=5443; break;
289 case PPTPF_USLETTER: aRet.Width()=4896; aRet.Height()=6336; break;
290 case PPTPF_A4 : aRet.Width()=4762; aRet.Height()=6735; break;
291 // case PPTPF_35MMDIA : aRet.Width()=4082; aRet.Height()=6123; break;
292 // case PPTPF_OVERHEAD: aRet.Width()=4082; aRet.Height()=5443; break;
293 }
294 if ( aRet.Width() )
295 {
296 if ( rSiz.Width() > rSiz.Height() )
297 { // Querformat
298 long nMerk = aRet.Width();
299 aRet.Width() = aRet.Height();
300 aRet.Height() = nMerk;
301 }
302 }
303 else // CustomFormat oder Unbekannt oder Screen,Dia,Overhead
304 aRet = rSiz;
305 return aRet;
306 */
307 }
308
operator >>(SvStream & rIn,PptDocumentAtom & rAtom)309 SvStream& operator>>(SvStream& rIn, PptDocumentAtom& rAtom)
310 {
311 // Tatsaechliches Format:
312 // 00 aSlidePageSizeXY 8
313 // 08 aNotesPageSizeXY 8
314 // 16 aZoomRatio (OLE) 8
315 // 24 nNotesMasterPersist 4
316 // 28 nHandoutMasterPersist 4
317 // 32 n1stPageNumber 2
318 // 34 ePageFormat 2
319 // 36 bEmbeddedTrueType 1
320 // 37 bOmitTitlePlace 1
321 // 38 bRightToLeft 1
322 // 39 bShowComments 1
323
324 DffRecordHeader aHd;
325 sal_Int32 nSlideX,nSlideY, nNoticeX, nNoticeY, nDummy;
326 sal_uInt16 nSlidePageFormat;
327 sal_Int8 nEmbeddedTrueType, nTitlePlaceHoldersOmitted, nRightToLeft, nShowComments;
328
329 rIn >> aHd
330 >> nSlideX >> nSlideY
331 >> nNoticeX >> nNoticeY
332 >> nDummy >> nDummy // ZoomRation ueberspringen
333 >> rAtom.nNotesMasterPersist
334 >> rAtom.nHandoutMasterPersist
335 >> rAtom.n1stPageNumber
336 >> nSlidePageFormat
337 >> nEmbeddedTrueType
338 >> nTitlePlaceHoldersOmitted
339 >> nRightToLeft
340 >> nShowComments;
341 rAtom.aSlidesPageSize.Width() = nSlideX;
342 rAtom.aSlidesPageSize.Height() = nSlideY;
343 rAtom.aNotesPageSize.Width() = nNoticeX;
344 rAtom.aNotesPageSize.Height() = nNoticeY;
345 rAtom.eSlidesPageFormat = (PptPageFormat)nSlidePageFormat;
346 rAtom.bEmbeddedTrueType = nEmbeddedTrueType;
347 rAtom.bTitlePlaceholdersOmitted = nTitlePlaceHoldersOmitted;
348 rAtom.bRightToLeft = nRightToLeft;
349 rAtom.bShowComments = nShowComments;
350 aHd.SeekToEndOfRecord( rIn );
351 return rIn;
352 }
353
354 ////////////////////////////////////////////////////////////////////////////////////////////////////
355
Clear()356 void PptSlideLayoutAtom::Clear()
357 {
358 eLayout = 0;
359 for ( sal_uInt16 i = 0; i < 8; i++ )
360 {
361 aPlaceholderId[ i ] = 0;
362 aPlacementId[ i ] = 0;
363 }
364 }
365
operator >>(SvStream & rIn,PptSlideLayoutAtom & rAtom)366 SvStream& operator>>( SvStream& rIn, PptSlideLayoutAtom& rAtom )
367 {
368 rIn >> rAtom.eLayout;
369 rIn.Read( rAtom.aPlaceholderId, 8 );
370 return rIn;
371 }
372
373 ////////////////////////////////////////////////////////////////////////////////////////////////////
374
operator >>(SvStream & rIn,PptSlideAtom & rAtom)375 SvStream& operator>>( SvStream& rIn, PptSlideAtom& rAtom )
376 {
377 DffRecordHeader aHd;
378 rIn >> aHd
379 >> rAtom.aLayout
380 >> rAtom.nMasterId
381 >> rAtom.nNotesId
382 >> rAtom.nFlags;
383 aHd.SeekToEndOfRecord( rIn );
384 return rIn;
385 }
386
Clear()387 void PptSlideAtom::Clear()
388 {
389 nMasterId = nNotesId = 0;
390 nFlags = 0;
391 }
392
393 ////////////////////////////////////////////////////////////////////////////////////////////////////
394
operator >>(SvStream & rIn,PptNotesAtom & rAtom)395 SvStream& operator>>( SvStream& rIn, PptNotesAtom& rAtom )
396 {
397 DffRecordHeader aHd;
398 rIn >> aHd
399 >> rAtom.nSlideId
400 >> rAtom.nFlags;
401 aHd.SeekToEndOfRecord( rIn );
402 return rIn;
403 }
404
Clear()405 void PptNotesAtom::Clear()
406 {
407 nSlideId = 0;
408 nFlags = 0;
409 }
410
411 ////////////////////////////////////////////////////////////////////////////////////////////////////
412
Clear()413 void PptColorSchemeAtom::Clear()
414 {
415 memset(&aData[0], 0, 32);
416 }
417
GetColor(sal_uInt16 nNum) const418 Color PptColorSchemeAtom::GetColor( sal_uInt16 nNum ) const
419 {
420 Color aRetval;
421 if ( nNum < 8 )
422 {
423 nNum <<= 2;
424 aRetval.SetRed( aData[ nNum++ ] );
425 aRetval.SetGreen( aData[ nNum++ ] );
426 aRetval.SetBlue( aData[ nNum++ ] );
427 }
428 return aRetval;
429 }
430
operator >>(SvStream & rIn,PptColorSchemeAtom & rAtom)431 SvStream& operator>>( SvStream& rIn, PptColorSchemeAtom& rAtom )
432 {
433 DffRecordHeader aHd;
434 rIn >> aHd;
435 rIn.Read( rAtom.aData, 32 );
436 aHd.SeekToEndOfRecord( rIn );
437 return rIn;
438 }
439
440 ////////////////////////////////////////////////////////////////////////////////////////////////////
441
operator >>(SvStream & rIn,PptFontEntityAtom & rAtom)442 SvStream& operator>>( SvStream& rIn, PptFontEntityAtom& rAtom )
443 {
444 DffRecordHeader aHd;
445 rIn >> aHd;
446 sal_Unicode nTemp, cData[ 32 ];
447 rIn.Read( cData, 64 );
448
449 sal_uInt8 lfCharset, lfPitchAndFamily;
450
451 rIn >> lfCharset
452 >> rAtom.lfClipPrecision
453 >> rAtom.lfQuality
454 >> lfPitchAndFamily;
455
456 switch( lfCharset )
457 {
458 case SYMBOL_CHARSET :
459 rAtom.eCharSet = RTL_TEXTENCODING_SYMBOL;
460 break;
461 case ANSI_CHARSET :
462 rAtom.eCharSet = RTL_TEXTENCODING_MS_1252;
463 break;
464
465 // case DEFAULT_CHARSET :
466 // case SHIFTJIS_CHARSET :
467 // case HANGEUL_CHARSET :
468 // case CHINESEBIG5_CHARSET :
469 // case OEM_CHARSET :
470 default :
471 rAtom.eCharSet = gsl_getSystemTextEncoding();
472 }
473 switch ( lfPitchAndFamily & 0xf0 )
474 {
475 case FF_ROMAN:
476 rAtom.eFamily = FAMILY_ROMAN;
477 break;
478
479 case FF_SWISS:
480 rAtom.eFamily = FAMILY_SWISS;
481 break;
482
483 case FF_MODERN:
484 rAtom.eFamily = FAMILY_MODERN;
485 break;
486
487 case FF_SCRIPT:
488 rAtom.eFamily = FAMILY_SCRIPT;
489 break;
490
491 case FF_DECORATIVE:
492 rAtom.eFamily = FAMILY_DECORATIVE;
493 break;
494
495 default:
496 rAtom.eFamily = FAMILY_DONTKNOW;
497 break;
498 }
499
500 switch ( lfPitchAndFamily & 0x0f )
501 {
502 case FIXED_PITCH:
503 rAtom.ePitch = PITCH_FIXED;
504 break;
505
506 case DEFAULT_PITCH:
507 case VARIABLE_PITCH:
508 default:
509 rAtom.ePitch = PITCH_VARIABLE;
510 break;
511 }
512 sal_uInt16 i;
513 for ( i = 0; i < 32; i++ )
514 {
515 nTemp = cData[ i ];
516 if ( !nTemp )
517 break;
518 #ifdef OSL_BIGENDIAN
519 cData[ i ] = ( nTemp >> 8 ) | ( nTemp << 8 );
520 #endif
521 }
522 rAtom.aName = String( cData, i );
523 OutputDevice* pDev = (OutputDevice*)Application::GetDefaultDevice();
524 rAtom.bAvailable = pDev->IsFontAvailable( rAtom.aName );
525 aHd.SeekToEndOfRecord( rIn );
526 return rIn;
527 }
528
529 SV_DECL_PTRARR_DEL( PptFontEntityAtomList, PptFontEntityAtom*, 16, 16 )
530 SV_IMPL_PTRARR( PptFontEntityAtomList, PptFontEntityAtom* );
531
532 class PptFontCollection: public PptFontEntityAtomList {
533 };
534
535 ////////////////////////////////////////////////////////////////////////////////////////////////////
536
operator >>(SvStream & rIn,PptUserEditAtom & rAtom)537 SvStream& operator>>( SvStream& rIn, PptUserEditAtom& rAtom )
538 {
539 rIn >> rAtom.aHd
540 >> rAtom.nLastSlideID
541 >> rAtom.nVersion
542 >> rAtom.nOffsetLastEdit
543 >> rAtom.nOffsetPersistDirectory
544 >> rAtom.nDocumentRef
545 >> rAtom.nMaxPersistWritten
546 >> rAtom.eLastViewType;
547 rAtom.aHd.SeekToEndOfRecord(rIn);
548 return rIn;
549 }
550
551 ////////////////////////////////////////////////////////////////////////////////////////////////////
552
Clear()553 void PptOEPlaceholderAtom::Clear()
554 {
555 nPlacementId = 0;
556 nPlaceholderSize = nPlaceholderId = 0;
557 }
558
operator >>(SvStream & rIn,PptOEPlaceholderAtom & rAtom)559 SvStream& operator>>( SvStream& rIn, PptOEPlaceholderAtom& rAtom )
560 {
561 rIn >> rAtom.nPlacementId
562 >> rAtom.nPlaceholderId
563 >> rAtom.nPlaceholderSize;
564 return rIn;
565 }
566
567 ////////////////////////////////////////////////////////////////////////////////////////////////////
568
PptSlidePersistEntry()569 PptSlidePersistEntry::PptSlidePersistEntry() :
570 pStyleSheet ( NULL ),
571 pHeaderFooterEntry ( NULL ),
572 pSolverContainer ( NULL ),
573 nSlidePersistStartOffset( 0 ),
574 nSlidePersistEndOffset ( 0 ),
575 nBackgroundOffset ( 0 ),
576 nDrawingDgId ( 0xffffffff ),
577 pPresentationObjects ( NULL ),
578 pBObj ( NULL ),
579 bBObjIsTemporary ( sal_True ),
580 ePageKind ( PPT_MASTERPAGE ),
581 bNotesMaster ( sal_False ),
582 bHandoutMaster ( sal_False ),
583 bStarDrawFiller ( sal_False )
584 {
585 HeaderFooterOfs[ 0 ] = HeaderFooterOfs[ 1 ] = HeaderFooterOfs[ 2 ] = HeaderFooterOfs[ 3 ] = 0;
586 }
587
588
~PptSlidePersistEntry()589 PptSlidePersistEntry::~PptSlidePersistEntry()
590 {
591 delete pStyleSheet;
592 delete pHeaderFooterEntry;
593 delete pSolverContainer;
594 delete[] pPresentationObjects;
595 };
596
597 ////////////////////////////////////////////////////////////////////////////////////////////////////
598 ////////////////////////////////////////////////////////////////////////////////////////////////////
599 ////////////////////////////////////////////////////////////////////////////////////////////////////
600
SdrEscherImport(PowerPointImportParam & rParam,const String & rBaseURL)601 SdrEscherImport::SdrEscherImport( PowerPointImportParam& rParam, const String& rBaseURL ) :
602 SvxMSDffManager ( rParam.rDocStream, rBaseURL, rParam.pTracer ),
603 pFonts ( NULL ),
604 nStreamLen ( 0 ),
605 nTextStylesIndex ( 0xffff ),
606 eCharSetSystem ( gsl_getSystemTextEncoding() ),
607 bWingdingsChecked ( sal_False ),
608 bWingdingsAvailable ( sal_False ),
609 bMonotypeSortsChecked ( sal_False ),
610 bMonotypeSortsAvailable ( sal_False ),
611 bTimesNewRomanChecked ( sal_False ),
612 bTimesNewRomanAvailable ( sal_False ),
613 rImportParam ( rParam )
614 {
615 }
616
~SdrEscherImport()617 SdrEscherImport::~SdrEscherImport()
618 {
619 void* pPtr;
620 for ( pPtr = aOleObjectList.First(); pPtr; pPtr = aOleObjectList.Next() )
621 delete (PPTOleEntry*)pPtr;
622 delete pFonts;
623 }
624
GetSlideLayoutAtom() const625 const PptSlideLayoutAtom* SdrEscherImport::GetSlideLayoutAtom() const
626 {
627 return NULL;
628 }
629
ReadString(String & rStr) const630 sal_Bool SdrEscherImport::ReadString( String& rStr ) const
631 {
632 sal_Bool bRet = sal_False;
633 DffRecordHeader aStrHd;
634 rStCtrl >> aStrHd;
635 if (aStrHd.nRecType == PPT_PST_TextBytesAtom
636 || aStrHd.nRecType == PPT_PST_TextCharsAtom
637 || aStrHd.nRecType == PPT_PST_CString)
638 {
639 sal_Bool bUniCode =
640 (aStrHd.nRecType == PPT_PST_TextCharsAtom
641 || aStrHd.nRecType == PPT_PST_CString);
642 bRet=sal_True;
643 sal_uLong nBytes = aStrHd.nRecLen;
644 MSDFFReadZString( rStCtrl, rStr, nBytes, bUniCode );
645 aStrHd.SeekToEndOfRecord( rStCtrl );
646 }
647 else
648 aStrHd.SeekToBegOfRecord( rStCtrl );
649 return bRet;
650 }
651
GetColorFromPalette(sal_uInt16,Color &) const652 FASTBOOL SdrEscherImport::GetColorFromPalette(sal_uInt16 /*nNum*/, Color& /*rColor*/) const
653 {
654 return sal_False;
655 }
656
SeekToShape(SvStream &,void *,sal_uInt32) const657 sal_Bool SdrEscherImport::SeekToShape( SvStream& /*rSt*/, void* /*pClientData*/, sal_uInt32 /*nId*/) const
658 {
659 return sal_False;
660 }
661
GetFontEnityAtom(sal_uInt32 nNum) const662 PptFontEntityAtom* SdrEscherImport::GetFontEnityAtom( sal_uInt32 nNum ) const
663 {
664 PptFontEntityAtom* pRetValue = NULL;
665 if ( pFonts && ( nNum < pFonts->Count() ) )
666 pRetValue = (*pFonts)[ (sal_uInt16)nNum ];
667 return pRetValue;
668 }
669
GetCharSet(sal_uInt32 nNum) const670 CharSet SdrEscherImport::GetCharSet( sal_uInt32 nNum ) const
671 {
672 CharSet eRetValue( eCharSetSystem );
673 if ( pFonts && ( nNum < pFonts->Count() ) )
674 eRetValue = (*pFonts)[ (sal_uInt16)nNum ]->eCharSet;
675 return eRetValue;
676 }
677
IsFontAvailable(sal_uInt32 nNum) const678 sal_Bool SdrEscherImport::IsFontAvailable( sal_uInt32 nNum ) const
679 {
680 sal_Bool bRetValue = sal_False;
681 if ( pFonts && ( nNum < pFonts->Count() ) )
682 bRetValue = (*pFonts)[ (sal_uInt16)nNum ]->bAvailable;
683 return bRetValue;
684 }
685
ReadObjText(PPTTextObj *,SdrObject * pObj,SdPage *) const686 SdrObject* SdrEscherImport::ReadObjText( PPTTextObj* /*pTextObj*/, SdrObject* pObj, SdPage* /*pPage*/) const
687 {
688 return pObj;
689 }
690
ProcessClientAnchor2(SvStream & rSt,DffRecordHeader & rHd,void *,DffObjData & rObj)691 void SdrEscherImport::ProcessClientAnchor2( SvStream& rSt, DffRecordHeader& rHd, void* /*pData*/, DffObjData& rObj )
692 {
693 sal_Int32 l, t, r, b;
694 if ( rHd.nRecLen == 16 )
695 {
696 rSt >> l >> t >> r >> b;
697 }
698 else
699 {
700 sal_Int16 ls, ts, rs, bs;
701 rSt >> ts >> ls >> rs >> bs; // etwas seltsame Koordinatenreihenfolge ...
702 l = ls, t = ts, r = rs, b = bs;
703 }
704 Scale( l );
705 Scale( t );
706 Scale( r );
707 Scale( b );
708 rObj.aChildAnchor = Rectangle( l, t, r, b );
709 rObj.bChildAnchor = sal_True;
710 return;
711 };
712
RecolorGraphic(SvStream & rSt,sal_uInt32 nRecLen,Graphic & rGraphic)713 void SdrEscherImport::RecolorGraphic( SvStream& rSt, sal_uInt32 nRecLen, Graphic& rGraphic )
714 {
715 if ( rGraphic.GetType() == GRAPHIC_GDIMETAFILE )
716 {
717 sal_uInt16 nX, nGlobalColorsCount, nFillColorsCount;
718
719 rSt >> nX
720 >> nGlobalColorsCount
721 >> nFillColorsCount
722 >> nX
723 >> nX
724 >> nX;
725
726 if ( ( nGlobalColorsCount <= 64 ) && ( nFillColorsCount <= 64 ) )
727 {
728 if ( (sal_uInt32)( ( nGlobalColorsCount + nFillColorsCount ) * 44 + 12 ) == nRecLen )
729 {
730 sal_uInt32 OriginalGlobalColors[ 64 ];
731 sal_uInt32 NewGlobalColors[ 64 ];
732 sal_uInt32 OriginalFillColors[ 64 ];
733 sal_uInt32 NewFillColors[ 64 ];
734
735 sal_uInt32 i, j, nGlobalColorsChanged, nFillColorsChanged;
736 nGlobalColorsChanged = nFillColorsChanged = 0;
737
738 sal_uInt32* pCurrentOriginal = OriginalGlobalColors;
739 sal_uInt32* pCurrentNew = NewGlobalColors;
740 sal_uInt32* pCount = &nGlobalColorsChanged;
741 i = nGlobalColorsCount;
742
743 for ( j = 0; j < 2; j++ )
744 {
745 for ( ; i > 0; i-- )
746 {
747 sal_uInt32 nIndex, nPos = rSt.Tell();
748 sal_uInt8 nDummy, nRed, nGreen, nBlue;
749 sal_uInt16 nChanged;
750 rSt >> nChanged;
751 if ( nChanged & 1 )
752 {
753 sal_uInt32 nColor = 0;
754 rSt >> nDummy
755 >> nRed
756 >> nDummy
757 >> nGreen
758 >> nDummy
759 >> nBlue
760 >> nIndex;
761
762 if ( nIndex < 8 )
763 {
764 Color aColor = MSO_CLR_ToColor( nIndex << 24 );
765 nRed = aColor.GetRed();
766 nGreen = aColor.GetGreen();
767 nBlue = aColor.GetBlue();
768 }
769 nColor = nRed | ( nGreen << 8 ) | ( nBlue << 16 );
770 *pCurrentNew++ = nColor;
771 rSt >> nDummy
772 >> nRed
773 >> nDummy
774 >> nGreen
775 >> nDummy
776 >> nBlue;
777 nColor = nRed | ( nGreen << 8 ) | ( nBlue << 16 );
778 *pCurrentOriginal++ = nColor;
779 (*pCount)++;
780 }
781 rSt.Seek( nPos + 44 );
782 }
783 pCurrentOriginal = OriginalFillColors;
784 pCurrentNew = NewFillColors;
785 pCount = &nFillColorsChanged;
786 i = nFillColorsCount;
787 }
788 if ( nGlobalColorsChanged || nFillColorsChanged )
789 {
790 Color* pSearchColors = new Color[ nGlobalColorsChanged ];
791 Color* pReplaceColors = new Color[ nGlobalColorsChanged ];
792
793 for ( j = 0; j < nGlobalColorsChanged; j++ )
794 {
795 sal_uInt32 nSearch = OriginalGlobalColors[ j ];
796 sal_uInt32 nReplace = NewGlobalColors[ j ];
797
798 pSearchColors[ j ].SetRed( (sal_uInt8)nSearch );
799 pSearchColors[ j ].SetGreen( (sal_uInt8)( nSearch >> 8 ) );
800 pSearchColors[ j ].SetBlue( (sal_uInt8)( nSearch >> 16 ) );
801
802 pReplaceColors[ j ].SetRed( (sal_uInt8)nReplace );
803 pReplaceColors[ j ].SetGreen( (sal_uInt8)( nReplace >> 8 ) );
804 pReplaceColors[ j ].SetBlue( (sal_uInt8)( nReplace >> 16 ) );
805 }
806 GDIMetaFile aGdiMetaFile( rGraphic.GetGDIMetaFile() );
807 aGdiMetaFile.ReplaceColors( pSearchColors, pReplaceColors,
808 nGlobalColorsChanged, NULL );
809 rGraphic = aGdiMetaFile;
810
811 delete[] pSearchColors;
812 delete[] pReplaceColors;
813 }
814 }
815 }
816 }
817 }
818
819 /* ProcessObject is called from ImplSdPPTImport::ProcessObj to handle all application specific things,
820 such as the import of text, animation effects, header footer and placeholder.
821
822 The parameter pOriginalObj is the object as it was imported by our general escher import, it must either
823 be deleted or it can be returned to be inserted into the sdr page.
824 */
ProcessObj(SvStream & rSt,DffObjData & rObjData,void * pData,Rectangle & rTextRect,SdrObject * pOriginalObj)825 SdrObject* SdrEscherImport::ProcessObj( SvStream& rSt, DffObjData& rObjData, void* pData, Rectangle& rTextRect, SdrObject* pOriginalObj )
826 {
827 if ( pOriginalObj && pOriginalObj->ISA( SdrObjCustomShape ) )
828 pOriginalObj->SetMergedItem( SdrTextFixedCellHeightItem( sal_True ) );
829
830 // we are initializing our return value with the object that was imported by our escher import
831 SdrObject* pRet = pOriginalObj;
832
833 ProcessData& rData = *((ProcessData*)pData);
834 PptSlidePersistEntry& rPersistEntry = rData.rPersistEntry;
835
836 if ( ! ( rObjData.nSpFlags & SP_FGROUP ) ) // sj: #114758# ...
837 {
838 PptOEPlaceholderAtom aPlaceholderAtom;
839 sal_Int16 nHeaderFooterInstance = -1;
840
841 if ( maShapeRecords.SeekToContent( rSt, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) )
842 {
843 DffRecordHeader aClientDataHd;
844 while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < maShapeRecords.Current()->GetRecEndFilePos() ) )
845 {
846 rSt >> aClientDataHd;
847 switch ( aClientDataHd.nRecType )
848 {
849 // importing header/footer object from master page
850 case PPT_PST_OEPlaceholderAtom :
851 {
852 rSt >> aPlaceholderAtom;
853 if ( nHeaderFooterInstance == -1 )
854 {
855 switch ( aPlaceholderAtom.nPlaceholderId )
856 {
857 case PPT_PLACEHOLDER_MASTERSLIDENUMBER : nHeaderFooterInstance++;
858 case PPT_PLACEHOLDER_MASTERFOOTER : nHeaderFooterInstance++;
859 case PPT_PLACEHOLDER_MASTERHEADER : nHeaderFooterInstance++;
860 case PPT_PLACEHOLDER_MASTERDATE : nHeaderFooterInstance++; break;
861 }
862 if ( ! ( nHeaderFooterInstance & 0xfffc ) ) // is this a valid instance ( 0->3 )
863 rPersistEntry.HeaderFooterOfs[ nHeaderFooterInstance ] = rObjData.rSpHd.GetRecBegFilePos();
864 }
865 }
866 break;
867
868 case PPT_PST_RecolorInfoAtom :
869 {
870 if ( pRet && ( pRet->ISA( SdrGrafObj ) && ((SdrGrafObj*)pRet)->HasGDIMetaFile() ) )
871 {
872 Graphic aGraphic( ((SdrGrafObj*)pRet)->GetGraphic() );
873 RecolorGraphic( rSt, aClientDataHd.nRecLen, aGraphic );
874 ((SdrGrafObj*)pRet)->SetGraphic( aGraphic );
875 }
876 }
877 break;
878 }
879 aClientDataHd.SeekToEndOfRecord( rSt );
880 }
881 }
882 if ( ( aPlaceholderAtom.nPlaceholderId == PPT_PLACEHOLDER_NOTESSLIDEIMAGE ) && ( rPersistEntry.bNotesMaster == sal_False ) )
883 {
884 sal_uInt16 nPageNum = pSdrModel->GetPageCount();
885 if ( nPageNum > 0 )
886 nPageNum--;
887
888 // replacing the object which we will return with a SdrPageObj
889 SdrObject::Free( pRet );
890 pRet = new SdrPageObj( rObjData.aBoundRect, pSdrModel->GetPage( nPageNum - 1 ) );
891 }
892 else
893 {
894 // try to load some ppt text
895 PPTTextObj aTextObj( rSt, (SdrPowerPointImport&)*this, rPersistEntry, &rObjData );
896 if ( ( aTextObj.Count() || aTextObj.GetOEPlaceHolderAtom() ) )
897 {
898 sal_Bool bVerticalText = sal_False;
899 // and if the text object is not empty, it must be applied to pRet, the object we
900 // initially got from our escher import
901 sal_Int32 nTextRotationAngle = 0;
902 if ( IsProperty( DFF_Prop_txflTextFlow ) )
903 {
904 MSO_TextFlow eTextFlow = (MSO_TextFlow)( GetPropertyValue( DFF_Prop_txflTextFlow ) & 0xFFFF );
905 switch( eTextFlow )
906 {
907 case mso_txflBtoT : // Bottom to Top non-@, unten -> oben
908 nTextRotationAngle += 9000;
909 break;
910 case mso_txflTtoBA : /* #68110# */ // Top to Bottom @-font, oben -> unten
911 case mso_txflTtoBN : // Top to Bottom non-@, oben -> unten
912 case mso_txflVertN : // Vertical, non-@, oben -> unten
913 bVerticalText = !bVerticalText; // nTextRotationAngle += 27000;
914 break;
915 // case mso_txflHorzN : // Horizontal non-@, normal
916 // case mso_txflHorzA : // Horizontal @-font, normal
917 default: break;
918 }
919 }
920 sal_Int32 nFontDirection = GetPropertyValue( DFF_Prop_cdirFont, mso_cdir0 );
921 nTextRotationAngle -= nFontDirection * 9000;
922 if ( ( nFontDirection == 1 ) || ( nFontDirection == 3 ) ) // #104546#
923 {
924 bVerticalText = !bVerticalText;
925 /*
926 sal_Int32 nHalfWidth = ( rTextRect.GetWidth() + 1 ) >> 1;
927 sal_Int32 nHalfHeight = ( rTextRect.GetHeight() + 1 ) >> 1;
928 Point aTopLeft( rTextRect.Left() + nHalfWidth - nHalfHeight,
929 rTextRect.Top() + nHalfHeight - nHalfWidth );
930 Size aNewSize( rTextRect.GetHeight(), rTextRect.GetWidth() );
931 Rectangle aNewRect( aTopLeft, aNewSize );
932 rTextRect = aNewRect;
933 */
934 }
935 aTextObj.SetVertical( bVerticalText );
936 if ( pRet )
937 {
938 sal_Bool bDeleteSource = aTextObj.GetOEPlaceHolderAtom() != 0;
939 if ( bDeleteSource && ( pRet->ISA( SdrGrafObj ) == sal_False ) // we are not allowed to get
940 && ( pRet->ISA( SdrObjGroup ) == sal_False ) // grouped placeholder objects
941 && ( pRet->ISA( SdrOle2Obj ) == sal_False ) )
942 SdrObject::Free( pRet );
943 }
944 sal_uInt32 nTextFlags = aTextObj.GetTextFlags();
945 sal_Int32 nTextLeft = GetPropertyValue( DFF_Prop_dxTextLeft, 25 * 3600 ); // 0.25 cm (emu)
946 sal_Int32 nTextRight = GetPropertyValue( DFF_Prop_dxTextRight, 25 * 3600 ); // 0.25 cm (emu)
947 sal_Int32 nTextTop = GetPropertyValue( DFF_Prop_dyTextTop, 13 * 3600 ); // 0.13 cm (emu)
948 sal_Int32 nTextBottom = GetPropertyValue( DFF_Prop_dyTextBottom, 13 * 3600 );
949 ScaleEmu( nTextLeft );
950 ScaleEmu( nTextRight );
951 ScaleEmu( nTextTop );
952 ScaleEmu( nTextBottom );
953
954 sal_Int32 nMinFrameWidth = 0;
955 sal_Int32 nMinFrameHeight = 0;
956 sal_Bool bAutoGrowWidth, bAutoGrowHeight;
957
958 SdrTextVertAdjust eTVA;
959 SdrTextHorzAdjust eTHA;
960
961 nTextFlags &= PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT
962 | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_CENTER | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_BLOCK;
963
964 if ( bVerticalText )
965 {
966 eTVA = SDRTEXTVERTADJUST_BLOCK;
967 eTHA = SDRTEXTHORZADJUST_CENTER;
968
969 // Textverankerung lesen
970 MSO_Anchor eTextAnchor = (MSO_Anchor)GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
971
972 switch( eTextAnchor )
973 {
974 case mso_anchorTop:
975 case mso_anchorTopCentered:
976 case mso_anchorTopBaseline:
977 case mso_anchorTopCenteredBaseline:
978 eTHA = SDRTEXTHORZADJUST_RIGHT;
979 break;
980
981 case mso_anchorMiddle :
982 case mso_anchorMiddleCentered:
983 eTHA = SDRTEXTHORZADJUST_CENTER;
984 break;
985
986 case mso_anchorBottom:
987 case mso_anchorBottomCentered:
988 case mso_anchorBottomBaseline:
989 case mso_anchorBottomCenteredBaseline:
990 eTHA = SDRTEXTHORZADJUST_LEFT;
991 break;
992 }
993 // if there is a 100% use of following attributes, the textbox can been aligned also in vertical direction
994 switch ( eTextAnchor )
995 {
996 case mso_anchorTopCentered :
997 case mso_anchorMiddleCentered :
998 case mso_anchorBottomCentered :
999 case mso_anchorTopCenteredBaseline:
1000 case mso_anchorBottomCenteredBaseline:
1001 {
1002 // check if it is sensible to use the centered alignment
1003 sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT;
1004 if ( ( nTextFlags & nMask ) != nMask ) // if the textobject has left and also right aligned paragraphs
1005 eTVA = SDRTEXTVERTADJUST_CENTER; // the text has to be displayed using the full width;
1006 }
1007 break;
1008
1009 default :
1010 {
1011 if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT )
1012 eTVA = SDRTEXTVERTADJUST_TOP;
1013 else if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT )
1014 eTVA = SDRTEXTVERTADJUST_BOTTOM;
1015 }
1016 break;
1017 }
1018 nMinFrameWidth = rTextRect.GetWidth() - ( nTextLeft + nTextRight );
1019 }
1020 else
1021 {
1022 eTVA = SDRTEXTVERTADJUST_CENTER;
1023 eTHA = SDRTEXTHORZADJUST_BLOCK;
1024
1025 // Textverankerung lesen
1026 MSO_Anchor eTextAnchor = (MSO_Anchor)GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
1027
1028 switch( eTextAnchor )
1029 {
1030 case mso_anchorTop:
1031 case mso_anchorTopCentered:
1032 case mso_anchorTopBaseline:
1033 case mso_anchorTopCenteredBaseline:
1034 eTVA = SDRTEXTVERTADJUST_TOP;
1035 break;
1036
1037 case mso_anchorMiddle :
1038 case mso_anchorMiddleCentered:
1039 eTVA = SDRTEXTVERTADJUST_CENTER;
1040 break;
1041
1042 case mso_anchorBottom:
1043 case mso_anchorBottomCentered:
1044 case mso_anchorBottomBaseline:
1045 case mso_anchorBottomCenteredBaseline:
1046 eTVA = SDRTEXTVERTADJUST_BOTTOM;
1047 break;
1048 }
1049 // if there is a 100% usage of following attributes, the textbox can be aligned also in horizontal direction
1050 switch ( eTextAnchor )
1051 {
1052 case mso_anchorTopCentered :
1053 case mso_anchorMiddleCentered :
1054 case mso_anchorBottomCentered :
1055 case mso_anchorTopCenteredBaseline:
1056 case mso_anchorBottomCenteredBaseline:
1057 {
1058 // check if it is sensible to use the centered alignment
1059 sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT;
1060 if ( ( nTextFlags & nMask ) != nMask ) // if the textobject has left and also right aligned paragraphs
1061 eTHA = SDRTEXTHORZADJUST_CENTER; // the text has to be displayed using the full width;
1062 }
1063 break;
1064
1065 default :
1066 {
1067 if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT )
1068 eTHA = SDRTEXTHORZADJUST_LEFT;
1069 else if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT )
1070 eTHA = SDRTEXTHORZADJUST_RIGHT;
1071 }
1072 break;
1073 }
1074 nMinFrameHeight = rTextRect.GetHeight() - ( nTextTop + nTextBottom );
1075 }
1076
1077 SdrObjKind eTextKind = OBJ_RECT;
1078 if ( ( aPlaceholderAtom.nPlaceholderId == PPT_PLACEHOLDER_NOTESSLIDEIMAGE )
1079 || ( aPlaceholderAtom.nPlaceholderId == PPT_PLACEHOLDER_MASTERNOTESSLIDEIMAGE ) )
1080 {
1081 aTextObj.SetInstance( 2 );
1082 eTextKind = OBJ_TITLETEXT;
1083 }
1084 else if ( ( aPlaceholderAtom.nPlaceholderId == PPT_PLACEHOLDER_MASTERNOTESBODYIMAGE )
1085 || ( aPlaceholderAtom.nPlaceholderId == PPT_PLACEHOLDER_NOTESBODY ) )
1086 {
1087 aTextObj.SetInstance( 2 );
1088 eTextKind = OBJ_TEXT;
1089 }
1090
1091 sal_uInt32 nDestinationInstance = aTextObj.GetInstance();
1092 if ( rPersistEntry.ePageKind == PPT_MASTERPAGE )
1093 {
1094 if ( !rPersistEntry.pPresentationObjects )
1095 {
1096 rPersistEntry.pPresentationObjects = new sal_uInt32[ PPT_STYLESHEETENTRYS ];
1097 memset( rPersistEntry.pPresentationObjects, 0, PPT_STYLESHEETENTRYS * 4 );
1098 }
1099 if ( !rPersistEntry.pPresentationObjects[ nDestinationInstance ] )
1100 rPersistEntry.pPresentationObjects[ nDestinationInstance ] = rObjData.rSpHd.GetRecBegFilePos();
1101 }
1102 switch ( nDestinationInstance )
1103 {
1104 case TSS_TYPE_PAGETITLE :
1105 case TSS_TYPE_TITLE :
1106 {
1107 if ( GetSlideLayoutAtom()->eLayout == PPT_LAYOUT_TITLEMASTERSLIDE )
1108 nDestinationInstance = TSS_TYPE_TITLE;
1109 else
1110 nDestinationInstance = TSS_TYPE_PAGETITLE;
1111 }
1112 break;
1113 case TSS_TYPE_BODY :
1114 // case TSS_TYPE_SUBTITLE :
1115 case TSS_TYPE_HALFBODY :
1116 case TSS_TYPE_QUARTERBODY :
1117 nDestinationInstance = TSS_TYPE_BODY;
1118 break;
1119 }
1120 aTextObj.SetDestinationInstance( (sal_uInt16)nDestinationInstance );
1121
1122 switch ( aTextObj.GetInstance() )
1123 {
1124 case TSS_TYPE_PAGETITLE :
1125 case TSS_TYPE_TITLE : eTextKind = OBJ_TITLETEXT; break;
1126 case TSS_TYPE_SUBTITLE : eTextKind = OBJ_TEXT; break;
1127 case TSS_TYPE_BODY :
1128 case TSS_TYPE_HALFBODY :
1129 case TSS_TYPE_QUARTERBODY : eTextKind = OBJ_OUTLINETEXT; break;
1130 }
1131 if ( aTextObj.GetDestinationInstance() != TSS_TYPE_TEXT_IN_SHAPE )
1132 {
1133 if ( !aTextObj.GetOEPlaceHolderAtom() || !aTextObj.GetOEPlaceHolderAtom()->nPlaceholderId )
1134 {
1135 aTextObj.SetDestinationInstance( TSS_TYPE_TEXT_IN_SHAPE );
1136 eTextKind = OBJ_RECT;
1137 }
1138 }
1139 SdrObject* pTObj = NULL;
1140 sal_Bool bWordWrap = (MSO_WrapMode)GetPropertyValue( DFF_Prop_WrapText, mso_wrapSquare ) != mso_wrapNone;
1141 sal_Bool bFitShapeToText = ( GetPropertyValue( DFF_Prop_FitTextToShape ) & 2 ) != 0;
1142
1143 if ( pRet && pRet->ISA( SdrObjCustomShape ) && ( eTextKind == OBJ_RECT ) )
1144 {
1145 bAutoGrowHeight = bFitShapeToText;
1146 if ( bWordWrap )
1147 bAutoGrowWidth = sal_False;
1148 else
1149 bAutoGrowWidth = sal_True;
1150 pTObj = pRet;
1151 pRet = NULL;
1152 }
1153 else
1154 {
1155 if ( pRet && pRet->ISA( SdrObjCustomShape ) )
1156 {
1157 SdrObject::Free( pRet );
1158 pRet = NULL;
1159 }
1160 pTObj = new SdrRectObj( eTextKind != OBJ_RECT ? eTextKind : OBJ_TEXT );
1161 pTObj->SetModel( pSdrModel );
1162 SfxItemSet aSet( pSdrModel->GetItemPool() );
1163 if ( !pRet )
1164 ((SdrEscherImport*)this)->ApplyAttributes( rSt, aSet, rObjData );
1165 pTObj->SetMergedItemSet( aSet );
1166 if ( pRet )
1167 {
1168 pTObj->SetMergedItem( XLineStyleItem( XLINE_NONE ) );
1169 pTObj->SetMergedItem( XFillStyleItem( XFILL_NONE ) );
1170 }
1171 if ( bVerticalText )
1172 {
1173 bAutoGrowWidth = bFitShapeToText;
1174 bAutoGrowHeight = sal_False;
1175 }
1176 else
1177 {
1178 bAutoGrowWidth = sal_False;
1179
1180 // #119885# re-activationg bFitShapeToText here, could not find deeper explanations
1181 // for it (it was from 2005). Keeping the old comment here for reference
1182 // old comment: // bFitShapeToText; can't be used, because we cut the text if it is too height,
1183 bAutoGrowHeight = bFitShapeToText;
1184 }
1185 }
1186 pTObj->SetMergedItem( SvxFrameDirectionItem( bVerticalText ? FRMDIR_VERT_TOP_RIGHT : FRMDIR_HORI_LEFT_TOP, EE_PARA_WRITINGDIR ) );
1187
1188 if ( !pTObj->ISA( SdrObjCustomShape ) )
1189 {
1190 pTObj->SetMergedItem( SdrTextAutoGrowWidthItem( bAutoGrowWidth ) );
1191 pTObj->SetMergedItem( SdrTextAutoGrowHeightItem( bAutoGrowHeight ) );
1192 }
1193 else
1194 {
1195 pTObj->SetMergedItem( SdrTextWordWrapItem( bWordWrap ) );
1196 pTObj->SetMergedItem( SdrTextAutoGrowHeightItem( bFitShapeToText ) );
1197 }
1198
1199 pTObj->SetMergedItem( SdrTextVertAdjustItem( eTVA ) );
1200 pTObj->SetMergedItem( SdrTextHorzAdjustItem( eTHA ) );
1201
1202 if ( nMinFrameHeight < 0 )
1203 nMinFrameHeight = 0;
1204 if ( !pTObj->ISA( SdrObjCustomShape ) )
1205 pTObj->SetMergedItem( SdrTextMinFrameHeightItem( nMinFrameHeight ) );
1206
1207 if ( nMinFrameWidth < 0 )
1208 nMinFrameWidth = 0;
1209 if ( !pTObj->ISA( SdrObjCustomShape ) )
1210 pTObj->SetMergedItem( SdrTextMinFrameWidthItem( nMinFrameWidth ) );
1211
1212 // Abstaende an den Raendern der Textbox setzen
1213 pTObj->SetMergedItem( SdrTextLeftDistItem( nTextLeft ) );
1214 pTObj->SetMergedItem( SdrTextRightDistItem( nTextRight ) );
1215 pTObj->SetMergedItem( SdrTextUpperDistItem( nTextTop ) );
1216 pTObj->SetMergedItem( SdrTextLowerDistItem( nTextBottom ) );
1217 pTObj->SetMergedItem( SdrTextFixedCellHeightItem( sal_True ) );
1218
1219 if ( !pTObj->ISA( SdrObjCustomShape ) )
1220 pTObj->SetSnapRect( rTextRect );
1221 pTObj = ReadObjText( &aTextObj, pTObj, rData.pPage );
1222 if ( pTObj )
1223 {
1224 /* check if our new snaprect makes trouble,
1225 because we do not display the ADJUST_BLOCK
1226 properly if the textsize is bigger than the
1227 snaprect of the object. Then we will use
1228 ADJUST_CENTER instead of ADJUST_BLOCK.
1229 */
1230 if ( !pTObj->ISA( SdrObjCustomShape ) && !bFitShapeToText && !bWordWrap )
1231 {
1232 SdrTextObj* pText = PTR_CAST( SdrTextObj, pTObj );
1233 if ( pText )
1234 {
1235 if ( bVerticalText )
1236 {
1237 if ( eTVA == SDRTEXTVERTADJUST_BLOCK )
1238 {
1239 Size aTextSize( pText->GetTextSize() );
1240 aTextSize.Width() += nTextLeft + nTextRight;
1241 aTextSize.Height() += nTextTop + nTextBottom;
1242 if ( rTextRect.GetHeight() < aTextSize.Height() )
1243 pTObj->SetMergedItem( SdrTextVertAdjustItem( SDRTEXTVERTADJUST_CENTER ) );
1244 }
1245 }
1246 else
1247 {
1248 if ( eTHA == SDRTEXTHORZADJUST_BLOCK )
1249 {
1250 Size aTextSize( pText->GetTextSize() );
1251 aTextSize.Width() += nTextLeft + nTextRight;
1252 aTextSize.Height() += nTextTop + nTextBottom;
1253 if ( rTextRect.GetWidth() < aTextSize.Width() )
1254 pTObj->SetMergedItem( SdrTextHorzAdjustItem( SDRTEXTHORZADJUST_CENTER ) );
1255 }
1256 }
1257 }
1258 }
1259 // rotate text with shape ?
1260 sal_Int32 nAngle = ( rObjData.nSpFlags & SP_FFLIPV ) ? -mnFix16Angle : mnFix16Angle; // #72116# vertical flip -> rotate by using the other way
1261 nAngle += nTextRotationAngle;
1262
1263 if ( pTObj->ISA( SdrObjCustomShape ) )
1264 {
1265 /*
1266 if ( nTextRotationAngle )
1267 {
1268 double fTextRotateAngle = (double)nTextRotationAngle / 100.0;
1269 SdrCustomShapeGeometryItem aGeometryItem( (SdrCustomShapeGeometryItem&)((SdrObjCustomShape*)pTObj)->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) );
1270 const rtl::OUString sTextRotateAngle( RTL_CONSTASCII_USTRINGPARAM ( "TextRotateAngle" ) );
1271 PropertyValue aPropValue;
1272 aPropValue.Name = sTextRotateAngle;
1273 aPropValue.Value <<= fTextRotateAngle;
1274 aGeometryItem.SetPropertyValue( aPropValue );
1275 ((SdrObjCustomShape*)pTObj)->SetMergedItem( aGeometryItem );
1276 }
1277 */
1278 }
1279 else
1280 {
1281 if ( rObjData.nSpFlags & SP_FFLIPV )
1282 {
1283 double a = 18000 * nPi180;
1284 pTObj->Rotate( rTextRect.Center(), 18000, sin( a ), cos( a ) );
1285 }
1286 if ( rObjData.nSpFlags & SP_FFLIPH )
1287 nAngle = 36000 - nAngle;
1288 if ( nAngle )
1289 {
1290 double a = nAngle * nPi180;
1291 pTObj->NbcRotate( rObjData.aBoundRect.Center(), nAngle, sin( a ), cos( a ) );
1292 }
1293 }
1294 if ( pRet )
1295 {
1296 SdrObject* pGroup = new SdrObjGroup;
1297 pGroup->GetSubList()->NbcInsertObject( pRet );
1298 pGroup->GetSubList()->NbcInsertObject( pTObj );
1299 pRet = pGroup;
1300 }
1301 else
1302 pRet = pTObj;
1303 }
1304 }
1305 }
1306 }
1307 else
1308 {
1309 if ( maShapeRecords.SeekToContent( rSt, DFF_msofbtUDefProp, SEEK_FROM_CURRENT_AND_RESTART ) )
1310 {
1311 maShapeRecords.Current()->SeekToBegOfRecord( rSt );
1312 DffPropertyReader aSecPropSet( *this );
1313 aSecPropSet.ReadPropSet( rSt, (ProcessData*)pData );
1314 sal_Int32 nTableProperties = aSecPropSet.GetPropertyValue( DFF_Prop_tableProperties, 0 );
1315 if ( nTableProperties & 3 )
1316 {
1317 if ( aSecPropSet.SeekToContent( DFF_Prop_tableRowProperties, rSt ) )
1318 {
1319 sal_Int16 i, nRowCount = 0;
1320 rSt >> nRowCount >> i >> i;
1321 if ( nRowCount )
1322 {
1323 sal_uInt32* pTableArry = new sal_uInt32[ nRowCount + 2 ];
1324 pTableArry[ 0 ] = nTableProperties;
1325 pTableArry[ 1 ] = nRowCount;
1326 for ( i = 0; i < nRowCount; i++ )
1327 rSt >> pTableArry[ i + 2 ];
1328 rData.pTableRowProperties = pTableArry;
1329 }
1330 }
1331 }
1332 }
1333 }
1334 if ( pRet ) // sj: #i38501#, and and taking care of connections to group objects
1335 {
1336 if ( rObjData.nSpFlags & SP_FBACKGROUND )
1337 {
1338 pRet->NbcSetSnapRect( Rectangle( Point(), ((SdrPage*)rData.pPage)->GetSize() ) ); // Groesse setzen
1339 }
1340 if ( rPersistEntry.pSolverContainer )
1341 {
1342 for ( SvxMSDffConnectorRule* pPtr = (SvxMSDffConnectorRule*)rPersistEntry.pSolverContainer->aCList.First();
1343 pPtr; pPtr = (SvxMSDffConnectorRule*)rPersistEntry.pSolverContainer->aCList.Next() )
1344 {
1345 if ( rObjData.nShapeId == pPtr->nShapeC )
1346 pPtr->pCObj = pRet;
1347 else
1348 {
1349 SdrObject* pConnectObj = pRet;
1350 if ( pOriginalObj && pRet->ISA( SdrObjGroup ) )
1351 { /* check if the original object from the escherimport is part of the group object,
1352 if this is the case, we will use the original object to connect to */
1353 SdrObjListIter aIter( *pRet, IM_DEEPWITHGROUPS );
1354 while( aIter.IsMore() )
1355 {
1356 SdrObject* pPartObj = aIter.Next();
1357 if ( pPartObj == pOriginalObj )
1358 {
1359 pConnectObj = pPartObj;
1360 break;
1361 }
1362 }
1363 }
1364 if ( rObjData.nShapeId == pPtr->nShapeA )
1365 {
1366 pPtr->pAObj = pConnectObj;
1367 pPtr->nSpFlagsA = rObjData.nSpFlags;
1368 }
1369 if ( rObjData.nShapeId == pPtr->nShapeB )
1370 {
1371 pPtr->pBObj = pConnectObj;
1372 pPtr->nSpFlagsB = rObjData.nSpFlags;
1373 }
1374 }
1375 }
1376 }
1377 if ( rPersistEntry.ePageKind == PPT_MASTERPAGE )
1378 { // maybe the escher clusterlist is not correct, but we have to got the right page by using the
1379 // spMaster property, so we are patching the table
1380 if ( rPersistEntry.nDrawingDgId != 0xffffffff )
1381 {
1382 sal_uInt32 nSec = ( rObjData.nShapeId >> 10 ) - 1;
1383 if ( mpFidcls && ( nSec < mnIdClusters ) )
1384 mpFidcls[ nSec ].dgid = rPersistEntry.nDrawingDgId; // insert the correct drawing id;
1385 }
1386 }
1387 if ( GetPropertyValue( DFF_Prop_fNoFillHitTest ) & 0x10 )
1388 {
1389 if ( (MSO_FillType)GetPropertyValue( DFF_Prop_fillType, mso_fillSolid ) == mso_fillBackground )
1390 {
1391 if ( !rData.pBackgroundColoredObjects )
1392 rData.pBackgroundColoredObjects = new List;
1393 rData.pBackgroundColoredObjects->Insert( pRet, LIST_APPEND );
1394 }
1395 }
1396 }
1397 return pRet;
1398 }
1399
1400 ////////////////////////////////////////////////////////////////////////////////////////////////////
1401
CheckWingdings() const1402 void SdrEscherImport::CheckWingdings() const
1403 {
1404 OutputDevice* pDev = (OutputDevice*)Application::GetDefaultDevice();
1405 ((SdrEscherImport*)this)->bWingdingsAvailable = pDev->IsFontAvailable( String( RTL_CONSTASCII_USTRINGPARAM( "WINGDINGS" ) ) );
1406 ((SdrEscherImport*)this)->bWingdingsChecked = sal_True;
1407 }
1408
CheckMonotypeSorts() const1409 void SdrEscherImport::CheckMonotypeSorts() const
1410 {
1411 OutputDevice* pDev = (OutputDevice*)Application::GetDefaultDevice();
1412 ((SdrEscherImport*)this)->bMonotypeSortsAvailable = pDev->IsFontAvailable( String( RTL_CONSTASCII_USTRINGPARAM( "MONOTYPE SORTS" ) ) );
1413 ((SdrEscherImport*)this)->bMonotypeSortsChecked = sal_True;
1414 }
1415
CheckTimesNewRoman() const1416 void SdrEscherImport::CheckTimesNewRoman() const
1417 {
1418 OutputDevice* pDev = (OutputDevice*)Application::GetDefaultDevice();
1419 ((SdrEscherImport*)this)->bTimesNewRomanAvailable = pDev->IsFontAvailable( String( RTL_CONSTASCII_USTRINGPARAM( "TIMES NEW ROMAN" ) ) );
1420 ((SdrEscherImport*)this)->bTimesNewRomanChecked = sal_True;
1421 }
1422
1423 ////////////////////////////////////////////////////////////////////////////////////////////////////
1424 ////////////////////////////////////////////////////////////////////////////////////////////////////
1425 ////////////////////////////////////////////////////////////////////////////////////////////////////
1426
SdrPowerPointImport(PowerPointImportParam & rParam,const String & rBaseURL)1427 SdrPowerPointImport::SdrPowerPointImport( PowerPointImportParam& rParam, const String& rBaseURL ) :
1428 SdrEscherImport ( rParam, rBaseURL ),
1429 bOk ( rStCtrl.GetErrorCode() == SVSTREAM_OK ),
1430 pPersistPtr ( NULL ),
1431 nPersistPtrAnz ( 0 ),
1432 pDefaultSheet ( NULL ),
1433 pMasterPages ( NULL ),
1434 pSlidePages ( NULL ),
1435 pNotePages ( NULL ),
1436 nAktPageNum ( 0 ),
1437 nDocStreamPos ( 0 ),
1438 nPageColorsNum ( 0xFFFF ),
1439 ePageColorsKind ( PPT_MASTERPAGE ),
1440 eAktPageKind ( PPT_MASTERPAGE )
1441 {
1442 DffRecordHeader* pHd;
1443 if ( bOk )
1444 {
1445 rStCtrl.Seek( STREAM_SEEK_TO_END );
1446 nStreamLen = rStCtrl.Tell();
1447
1448 // try to allocate the UserEditAtom via CurrentUserAtom
1449 sal_uInt32 nCurrentUserEdit = rParam.aCurrentUserAtom.nCurrentUserEdit;
1450 if ( nCurrentUserEdit )
1451 {
1452 rStCtrl.Seek( nCurrentUserEdit );
1453 rStCtrl >> aUserEditAtom;
1454 }
1455 if ( !aUserEditAtom.nOffsetPersistDirectory )
1456 { // if there is no UserEditAtom try to search the last one
1457
1458 rStCtrl.Seek( 0 );
1459 DffRecordManager aPptRecManager; // contains all first level container and atoms
1460 aPptRecManager.Consume( rStCtrl, sal_False, nStreamLen );
1461 for ( pHd = aPptRecManager.Last(); pHd; pHd = aPptRecManager.Prev() )
1462 {
1463 if ( pHd->nRecType == PPT_PST_UserEditAtom )
1464 {
1465 pHd->SeekToBegOfRecord( rStCtrl );
1466 rStCtrl >> aUserEditAtom;
1467 break;
1468 }
1469 }
1470 if ( !pHd )
1471 bOk = sal_False;
1472 }
1473 }
1474 if ( rStCtrl.GetError() != 0 )
1475 bOk = sal_False;
1476
1477 if ( bOk )
1478 {
1479 nPersistPtrAnz = aUserEditAtom.nMaxPersistWritten + 1;
1480 if ( ( nPersistPtrAnz >> 2 ) > nStreamLen ) // sj: at least nPersistPtrAnz is not allowed to be greater than filesize
1481 bOk = sal_False; // (it should not be greater than the PPT_PST_PersistPtrIncrementalBlock, but
1482 // we are reading this block later, so we do not have access yet)
1483
1484 if ( bOk && ( nPersistPtrAnz < ( SAL_MAX_UINT32 / sizeof( sal_uInt32 ) ) ) )
1485 pPersistPtr = new (std::nothrow) sal_uInt32[ nPersistPtrAnz ];
1486 if ( !pPersistPtr )
1487 bOk = sal_False;
1488 if ( bOk )
1489 {
1490 memset( pPersistPtr, 0x00, nPersistPtrAnz * 4 );
1491
1492 // SJ: new search mechanism from bottom to top (Issue 21122)
1493 PptUserEditAtom aCurrentEditAtom( aUserEditAtom );
1494 sal_uInt32 nCurrentEditAtomStrmPos = aCurrentEditAtom.aHd.GetRecEndFilePos();
1495 while( nCurrentEditAtomStrmPos )
1496 {
1497 sal_uInt32 nPersistIncPos = aCurrentEditAtom.nOffsetPersistDirectory;
1498 if ( nPersistIncPos )
1499 {
1500 rStCtrl.Seek( nPersistIncPos );
1501 DffRecordHeader aPersistHd;
1502 rStCtrl >> aPersistHd;
1503 if ( aPersistHd.nRecType == PPT_PST_PersistPtrIncrementalBlock )
1504 {
1505 sal_uLong nPibLen = aPersistHd.GetRecEndFilePos();
1506 while ( bOk && ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < nPibLen ) )
1507 {
1508 sal_uInt32 nOfs, nAnz;
1509 rStCtrl >> nOfs;
1510 nAnz = nOfs;
1511 nOfs &= 0x000FFFFF;
1512 nAnz >>= 20;
1513 while ( bOk && ( rStCtrl.GetError() == 0 ) && ( nAnz > 0 ) && ( nOfs <= nPersistPtrAnz ) )
1514 {
1515 sal_uInt32 nPt;
1516 rStCtrl >> nPt;
1517 if ( !pPersistPtr[ nOfs ] )
1518 {
1519 pPersistPtr[ nOfs ] = nPt;
1520 if ( pPersistPtr[ nOfs ] > nStreamLen )
1521 {
1522 bOk = sal_False;
1523 DBG_ERROR("SdrPowerPointImport::Ctor(): Ungueltiger Eintrag im Persist-Directory!");
1524 }
1525 }
1526 nAnz--;
1527 nOfs++;
1528 }
1529 if ( bOk && nAnz > 0 )
1530 {
1531 DBG_ERROR("SdrPowerPointImport::Ctor(): Nicht alle Persist-Directory Entraege gelesen!");
1532 bOk = sal_False;
1533 }
1534 }
1535 }
1536 }
1537 nCurrentEditAtomStrmPos = aCurrentEditAtom.nOffsetLastEdit < nCurrentEditAtomStrmPos ? aCurrentEditAtom.nOffsetLastEdit : 0;
1538 if ( nCurrentEditAtomStrmPos )
1539 {
1540 rStCtrl.Seek( nCurrentEditAtomStrmPos );
1541 rStCtrl >> aCurrentEditAtom;
1542 }
1543 }
1544 }
1545 }
1546 if ( rStCtrl.GetError() != 0 )
1547 bOk = sal_False;
1548 if ( bOk )
1549 { // Document PersistEntry checken
1550 nDocStreamPos = aUserEditAtom.nDocumentRef;
1551 if ( nDocStreamPos > nPersistPtrAnz )
1552 {
1553 DBG_ERROR("SdrPowerPointImport::Ctor(): aUserEditAtom.nDocumentRef ungueltig!");
1554 bOk = sal_False;
1555 }
1556 }
1557 if ( bOk )
1558 { // Document FilePos checken
1559 nDocStreamPos = pPersistPtr[ nDocStreamPos ];
1560 if ( nDocStreamPos >= nStreamLen )
1561 {
1562 DBG_ERROR("SdrPowerPointImport::Ctor(): nDocStreamPos >= nStreamLen!");
1563 bOk = sal_False;
1564 }
1565 }
1566 if ( bOk )
1567 {
1568 rStCtrl.Seek( nDocStreamPos );
1569 aDocRecManager.Consume( rStCtrl );
1570
1571 DffRecordHeader aDocHd;
1572 rStCtrl >> aDocHd;
1573 // DocumentAtom lesen
1574 DffRecordHeader aDocAtomHd;
1575 rStCtrl >> aDocAtomHd;
1576 if ( aDocHd.nRecType == PPT_PST_Document && aDocAtomHd.nRecType == PPT_PST_DocumentAtom )
1577 {
1578 aDocAtomHd.SeekToBegOfRecord( rStCtrl );
1579 rStCtrl >> aDocAtom;
1580 }
1581 else
1582 bOk = sal_False;
1583
1584 if ( bOk )
1585 {
1586 if ( !pFonts )
1587 ReadFontCollection();
1588
1589 // reading TxPF, TxSI
1590 PPTTextCharacterStyleAtomInterpreter aTxCFStyle; // SJ: ToDo, this atom needs to be interpreted, it contains character default styles for standard objects (instance4)
1591 PPTTextParagraphStyleAtomInterpreter aTxPFStyle;
1592 PPTTextSpecInfoAtomInterpreter aTxSIStyle; // styles (default language setting ... )
1593
1594 DffRecordHeader* pEnvHd = aDocRecManager.GetRecordHeader( PPT_PST_Environment );
1595 if ( pEnvHd )
1596 {
1597 pEnvHd->SeekToContent( rStCtrl );
1598 DffRecordHeader aTxPFStyleRecHd;
1599 if ( SeekToRec( rStCtrl, PPT_PST_TxPFStyleAtom, pEnvHd->GetRecEndFilePos(), &aTxPFStyleRecHd ) )
1600 aTxPFStyle.Read( rStCtrl, aTxPFStyleRecHd );
1601
1602 pEnvHd->SeekToContent( rStCtrl );
1603 DffRecordHeader aTxSIStyleRecHd;
1604 if ( SeekToRec( rStCtrl, PPT_PST_TxSIStyleAtom, pEnvHd->GetRecEndFilePos(), &aTxSIStyleRecHd ) )
1605 {
1606 aTxSIStyle.Read( rStCtrl, aTxSIStyleRecHd, PPT_PST_TxSIStyleAtom );
1607 #ifdef DBG_UTIL
1608 if ( !aTxSIStyle.bValid )
1609 {
1610 if (!(rImportParam.nImportFlags & PPT_IMPORTFLAGS_NO_TEXT_ASSERT ))
1611 {
1612 DBG_ERROR( "SdrTextSpecInfoAtomInterpreter::Ctor(): parsing error, this document needs to be analysed (SJ)" );
1613 }
1614 }
1615 #endif
1616 }
1617 }
1618
1619 // todo:: PPT_PST_TxPFStyleAtom
1620
1621 // SlidePersists Lesen
1622 pMasterPages=new PptSlidePersistList;
1623 pSlidePages =new PptSlidePersistList;
1624 pNotePages =new PptSlidePersistList;
1625
1626 // now always creating the handout page, it will be the first in our masterpage list
1627 PptSlidePersistEntry* pE = new PptSlidePersistEntry;
1628 pE->aPersistAtom.nPsrReference = aDocAtom.nHandoutMasterPersist;
1629 pE->bHandoutMaster = sal_True;
1630 if ( !aDocAtom.nHandoutMasterPersist )
1631 pE->bStarDrawFiller = sal_True; // this is a dummy master page
1632 pMasterPages->C40_INSERT( PptSlidePersistEntry, pE, 0 );
1633
1634 sal_uInt16 nPageListNum = 0;
1635 DffRecordHeader* pSlideListWithTextHd = aDocRecManager.GetRecordHeader( PPT_PST_SlideListWithText );
1636 PptSlidePersistEntry* pPreviousPersist = NULL;
1637 while ( pSlideListWithTextHd && ( nPageListNum < 3 ) )
1638 {
1639 pSlideListWithTextHd->SeekToContent( rStCtrl );
1640 PptSlidePersistList* pPageList = GetPageList( PptPageKind( nPageListNum ) );
1641 sal_uInt32 nSlideListWithTextHdEndOffset = pSlideListWithTextHd->GetRecEndFilePos();
1642 while ( SeekToRec( rStCtrl, PPT_PST_SlidePersistAtom, nSlideListWithTextHdEndOffset ) )
1643 {
1644 if ( pPreviousPersist )
1645 pPreviousPersist->nSlidePersistEndOffset = rStCtrl.Tell();
1646 PptSlidePersistEntry* pE2 = new PptSlidePersistEntry;
1647 rStCtrl >> pE2->aPersistAtom;
1648 pE2->nSlidePersistStartOffset = rStCtrl.Tell();
1649 pE2->ePageKind = PptPageKind( nPageListNum );
1650 pPageList->C40_INSERT( PptSlidePersistEntry, pE2, pPageList->Count() );
1651 pPreviousPersist = pE2;
1652 }
1653 if ( pPreviousPersist )
1654 pPreviousPersist->nSlidePersistEndOffset = nSlideListWithTextHdEndOffset;
1655 pSlideListWithTextHd = aDocRecManager.GetRecordHeader( PPT_PST_SlideListWithText, SEEK_FROM_CURRENT );
1656 nPageListNum++;
1657 }
1658
1659 // we will ensure that there is at least one master page
1660 if ( pMasterPages->Count() == 1 ) // -> there is only a handout page available
1661 {
1662 PptSlidePersistEntry* pE2 = new PptSlidePersistEntry;
1663 pE2->bStarDrawFiller = sal_True; // this is a dummy master page
1664 pMasterPages->C40_INSERT( PptSlidePersistEntry, pE2, 1 );
1665 }
1666
1667 // now we will insert at least one notes master for each master page
1668 sal_uInt16 nMasterPage;
1669 sal_uInt16 nMasterPages = pMasterPages->Count() - 1;
1670 for ( nMasterPage = 0; nMasterPage < nMasterPages; nMasterPage++ )
1671 {
1672 PptSlidePersistEntry* pE2 = new PptSlidePersistEntry;
1673 pE2->bNotesMaster = sal_True;
1674 pE2->bStarDrawFiller = sal_True; // this is a dummy master page
1675 if ( !nMasterPage && aDocAtom.nNotesMasterPersist )
1676 { // special treatment for the first notes master
1677 pE2->aPersistAtom.nPsrReference = aDocAtom.nNotesMasterPersist;
1678 pE2->bStarDrawFiller = sal_False; // this is a dummy master page
1679 }
1680 pMasterPages->C40_INSERT( PptSlidePersistEntry, pE2, ( nMasterPage + 1 ) << 1 );
1681 }
1682
1683 // Zu jeder Page noch das SlideAtom bzw. NotesAtom lesen, soweit vorhanden
1684 nPageListNum = 0;
1685 for ( nPageListNum = 0; nPageListNum < 3; nPageListNum++ )
1686 {
1687 PptSlidePersistList* pPageList = GetPageList( PptPageKind( nPageListNum ) );
1688 for ( sal_uInt16 nPageNum = 0; nPageNum < pPageList->Count(); nPageNum++ )
1689 {
1690 PptSlidePersistEntry* pE2 = (*pPageList)[ nPageNum ];
1691 sal_uLong nPersist = pE2->aPersistAtom.nPsrReference;
1692 if ( ( nPersist > 0 ) && ( nPersist < nPersistPtrAnz ) )
1693 {
1694 sal_uLong nFPos = pPersistPtr[ nPersist ];
1695 if ( nFPos < nStreamLen )
1696 {
1697 rStCtrl.Seek( nFPos );
1698 DffRecordHeader aSlideHd;
1699 rStCtrl >> aSlideHd;
1700 if ( SeekToRec( rStCtrl, PPT_PST_SlideAtom, aSlideHd.GetRecEndFilePos() ) )
1701 rStCtrl >> pE2->aSlideAtom;
1702 else if ( SeekToRec( rStCtrl, PPT_PST_NotesAtom, aSlideHd.GetRecEndFilePos() ) )
1703 rStCtrl >> pE2->aNotesAtom;
1704 aSlideHd.SeekToContent( rStCtrl );
1705
1706 DffRecordHeader aPPTDrawingHd;
1707 if ( SeekToRec( rStCtrl, PPT_PST_PPDrawing, aSlideHd.GetRecEndFilePos(), &aPPTDrawingHd ) )
1708 {
1709 DffRecordHeader aPPTDgContainer;
1710 if ( SeekToRec( rStCtrl, DFF_msofbtDgContainer, aPPTDrawingHd.GetRecEndFilePos(), &aPPTDgContainer ) )
1711 {
1712 if ( SeekToRec( rStCtrl, DFF_msofbtDg, aPPTDrawingHd.GetRecEndFilePos() ) )
1713 {
1714 DffRecordHeader aDgRecordHeader;
1715 rStCtrl >> aDgRecordHeader;
1716 pE2->nDrawingDgId = aDgRecordHeader.nRecInstance;
1717 aDgRecordHeader.SeekToEndOfRecord( rStCtrl );
1718 }
1719 if ( SeekToRec( rStCtrl, DFF_msofbtSolverContainer, aPPTDgContainer.GetRecEndFilePos() ) )
1720 {
1721 pE2->pSolverContainer = new SvxMSDffSolverContainer;
1722 rStCtrl >> *( pE2->pSolverContainer );
1723 }
1724 aPPTDgContainer.SeekToBegOfRecord( rStCtrl );
1725 SetDgContainer( rStCtrl ); // set this, so that the escherimport is knowing of our drawings
1726 }
1727 }
1728 // office xp is supporting more than one stylesheet
1729 if ( ( pE2->ePageKind == PPT_MASTERPAGE ) && ( pE2->aSlideAtom.nMasterId == 0 ) && ( pE2->bNotesMaster == 0 ) )
1730 {
1731 PPTTextSpecInfo aTxSI( 0 );
1732 if ( aTxSIStyle.bValid && aTxSIStyle.aList.Count() )
1733 aTxSI = *( ( (PPTTextSpecInfo*)aTxSIStyle.aList.GetObject( 0 ) ) );
1734
1735 pE2->pStyleSheet = new PPTStyleSheet( aSlideHd, rStCtrl, *this, aTxCFStyle, aTxPFStyle, aTxSI );
1736 pDefaultSheet = pE2->pStyleSheet;
1737 }
1738 if ( SeekToRec( rStCtrl, PPT_PST_ColorSchemeAtom, aSlideHd.GetRecEndFilePos() ) )
1739 rStCtrl >> pE2->aColorScheme;
1740 else
1741 {
1742 DBG_ERROR( "SdrPowerPointImport::Ctor(): could not get SlideColorScheme! (SJ)" );
1743 }
1744 }
1745 else
1746 {
1747 DBG_ERROR("SdrPowerPointImport::Ctor(): Persist-Eintrag fehlerhaft! (SJ)");
1748 }
1749 }
1750 }
1751 }
1752 DffRecordHeader* pHeadersFootersHd = aDocRecManager.GetRecordHeader( PPT_PST_HeadersFooters, SEEK_FROM_BEGINNING );
1753 if ( pHeadersFootersHd )
1754 {
1755 HeaderFooterEntry aNormalMaster, aNotesMaster;
1756 for ( ; pHeadersFootersHd; pHeadersFootersHd = aDocRecManager.GetRecordHeader( PPT_PST_HeadersFooters, SEEK_FROM_CURRENT ) )
1757 {
1758 if ( pHeadersFootersHd->nRecInstance == 3 ) // normal master
1759 ImportHeaderFooterContainer( *pHeadersFootersHd, aNormalMaster );
1760 else if ( pHeadersFootersHd->nRecInstance == 4 ) // notes master
1761 ImportHeaderFooterContainer( *pHeadersFootersHd, aNotesMaster );
1762 }
1763 for ( sal_uInt16 i = 0; i < pMasterPages->Count(); i++ )
1764 {
1765 if ( (*pMasterPages)[ i ]->bNotesMaster )
1766 (*pMasterPages)[ i ]->pHeaderFooterEntry = new HeaderFooterEntry( aNotesMaster );
1767 else
1768 (*pMasterPages)[ i ]->pHeaderFooterEntry = new HeaderFooterEntry( aNormalMaster );
1769 }
1770 }
1771 }
1772 }
1773 if ( ( rStCtrl.GetError() != 0 ) || ( pDefaultSheet == NULL ) )
1774 bOk = sal_False;
1775 pPPTStyleSheet = pDefaultSheet;
1776 rStCtrl.Seek( 0 );
1777 }
1778
~SdrPowerPointImport()1779 SdrPowerPointImport::~SdrPowerPointImport()
1780 {
1781 for ( void* pPtr = aHyperList.First(); pPtr; pPtr = aHyperList.Next() )
1782 delete (SdHyperlinkEntry*)pPtr;
1783 delete pMasterPages;
1784 delete pSlidePages;
1785 delete pNotePages;
1786 delete[] pPersistPtr;
1787 }
1788
InsertControl(const com::sun::star::uno::Reference<com::sun::star::form::XFormComponent> & rFComp,const com::sun::star::awt::Size & rSize,com::sun::star::uno::Reference<com::sun::star::drawing::XShape> * pShape,sal_Bool)1789 sal_Bool PPTConvertOCXControls::InsertControl(
1790 const com::sun::star::uno::Reference<
1791 com::sun::star::form::XFormComponent > &rFComp,
1792 const com::sun::star::awt::Size& rSize,
1793 com::sun::star::uno::Reference<
1794 com::sun::star::drawing::XShape > *pShape,
1795 sal_Bool /*bFloatingCtrl*/)
1796 {
1797 sal_Bool bRetValue = sal_False;
1798 try
1799 {
1800 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape;
1801
1802 const ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexContainer > & rFormComps =
1803 GetFormComps();
1804
1805 ::com::sun::star::uno::Any aTmp( &rFComp, ::getCppuType((const ::com::sun::star::uno::Reference<
1806 com::sun::star::form::XFormComponent >*)0) );
1807
1808 rFormComps->insertByIndex( rFormComps->getCount(), aTmp );
1809
1810 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & rServiceFactory =
1811 GetServiceFactory();
1812 if( rServiceFactory.is() )
1813 {
1814 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xCreate = rServiceFactory
1815 ->createInstance(String( RTL_CONSTASCII_STRINGPARAM( "com.sun.star.drawing.ControlShape" ) ) );
1816 if( xCreate.is() )
1817 {
1818 xShape = ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >(xCreate, ::com::sun::star::uno::UNO_QUERY);
1819 if ( xShape.is() )
1820 {
1821 xShape->setSize(rSize);
1822 // GetShapes()->add( xShape );
1823 // Das Control-Model am Control-Shape setzen
1824 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XControlShape > xControlShape( xShape,
1825 ::com::sun::star::uno::UNO_QUERY );
1826 ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > xControlModel( rFComp,
1827 ::com::sun::star::uno::UNO_QUERY );
1828 if ( xControlShape.is() && xControlModel.is() )
1829 {
1830 xControlShape->setControl( xControlModel );
1831 if (pShape)
1832 *pShape = xShape;
1833 bRetValue = sal_True;
1834 }
1835 }
1836 }
1837 }
1838 }
1839 catch( ... )
1840 {
1841 bRetValue = sal_False;
1842 }
1843 return bRetValue;
1844 };
1845
GetDrawPage()1846 const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >& PPTConvertOCXControls::GetDrawPage()
1847 {
1848 if( !xDrawPage.is() && pDocSh )
1849 {
1850 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > xModel( pDocSh->GetModel() );
1851 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPages > xDrawPages;
1852 switch( ePageKind )
1853 {
1854 case PPT_SLIDEPAGE :
1855 case PPT_NOTEPAGE :
1856 {
1857 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPagesSupplier >
1858 xDrawPagesSupplier( xModel, ::com::sun::star::uno::UNO_QUERY);
1859 if ( xDrawPagesSupplier.is() )
1860 xDrawPages = xDrawPagesSupplier->getDrawPages();
1861 }
1862 break;
1863
1864 case PPT_MASTERPAGE :
1865 {
1866 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XMasterPagesSupplier >
1867 xMasterPagesSupplier( xModel, ::com::sun::star::uno::UNO_QUERY);
1868 if ( xMasterPagesSupplier.is() )
1869 xDrawPages = xMasterPagesSupplier->getMasterPages();
1870 }
1871 break;
1872 }
1873 if ( xDrawPages.is() && xDrawPages->getCount() )
1874 {
1875 xDrawPages->getCount();
1876 ::com::sun::star::uno::Any aAny( xDrawPages->getByIndex( xDrawPages->getCount() - 1 ) );
1877 aAny >>= xDrawPage;
1878 }
1879 }
1880 return xDrawPage;
1881 }
1882
SdrPowerPointOLEDecompress(SvStream & rOutput,SvStream & rInput,sal_uInt32 nInputSize)1883 sal_Bool SdrPowerPointOLEDecompress( SvStream& rOutput, SvStream& rInput, sal_uInt32 nInputSize )
1884 {
1885 sal_uInt32 nOldPos = rInput.Tell();
1886 char* pBuf = new char[ nInputSize ];
1887 rInput.Read( pBuf, nInputSize );
1888 ZCodec aZCodec( 0x8000, 0x8000 );
1889 aZCodec.BeginCompression();
1890 SvMemoryStream aSource( pBuf, nInputSize, STREAM_READ );
1891 aZCodec.Decompress( aSource, rOutput );
1892 const sal_Bool bSuccess(0L != aZCodec.EndCompression());
1893 delete[] pBuf;
1894 rInput.Seek( nOldPos );
1895 return bSuccess;
1896 }
1897
1898 // --> OD 2004-12-14 #i32596# - add new parameter <_nCalledByGroup>
ImportOLE(long nOLEId,const Graphic & rGraf,const Rectangle & rBoundRect,const Rectangle & rVisArea,const int,sal_Int64) const1899 SdrObject* SdrPowerPointImport::ImportOLE( long nOLEId,
1900 const Graphic& rGraf,
1901 const Rectangle& rBoundRect,
1902 const Rectangle& rVisArea,
1903 const int /*_nCalledByGroup*/,
1904 sal_Int64 /*nAspect*/ ) const
1905 // <--
1906 {
1907 SdrObject* pRet = NULL;
1908
1909 sal_uInt32 nOldPos = rStCtrl.Tell();
1910
1911 Graphic aGraphic( rGraf );
1912
1913 if ( ((SdrPowerPointImport*)this)->maShapeRecords.SeekToContent( rStCtrl, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) )
1914 {
1915 DffRecordHeader aPlaceHd;
1916 while ( ( rStCtrl.GetError() == 0 )
1917 && ( rStCtrl.Tell() < ((SdrPowerPointImport*)this)->maShapeRecords.Current()->GetRecEndFilePos() ) )
1918 {
1919 rStCtrl >> aPlaceHd;
1920 if ( aPlaceHd.nRecType == PPT_PST_RecolorInfoAtom )
1921 {
1922 ((SdrPowerPointImport*)this)->RecolorGraphic( rStCtrl, aPlaceHd.nRecLen, aGraphic );
1923 break;
1924 }
1925 else
1926 aPlaceHd.SeekToEndOfRecord( rStCtrl );
1927 }
1928 }
1929
1930 PPTOleEntry* pOe;
1931 for ( pOe = (PPTOleEntry*)((SdrPowerPointImport*)this)->aOleObjectList.First(); pOe;
1932 pOe = (PPTOleEntry*)((SdrPowerPointImport*)this)->aOleObjectList.Next() )
1933 {
1934 if ( pOe->nId != (sal_uInt32)nOLEId )
1935 continue;
1936
1937 rStCtrl.Seek( pOe->nRecHdOfs );
1938
1939 DffRecordHeader aHd;
1940 rStCtrl >> aHd;
1941
1942 sal_uInt32 nLen = aHd.nRecLen - 4;
1943 if ( (sal_Int32)nLen > 0 )
1944 {
1945 sal_Bool bSuccess = sal_False;
1946
1947 rStCtrl.SeekRel( 4 );
1948
1949 ::utl::TempFile aTmpFile;
1950 aTmpFile.EnableKillingFile( sal_True );
1951
1952 if ( aTmpFile.IsValid() )
1953 {
1954 SvStream* pDest = ::utl::UcbStreamHelper::CreateStream( aTmpFile.GetURL(), STREAM_TRUNC | STREAM_WRITE );
1955 if ( pDest )
1956 bSuccess = SdrPowerPointOLEDecompress( *pDest, rStCtrl, nLen );
1957 delete pDest;
1958 }
1959 if ( bSuccess )
1960 {
1961 SvStream* pDest = ::utl::UcbStreamHelper::CreateStream( aTmpFile.GetURL(), STREAM_READ );
1962 Storage* pObjStor = pDest ? new Storage( *pDest, sal_True ) : NULL;
1963 if ( pObjStor )
1964 {
1965 SotStorageRef xObjStor( new SotStorage( pObjStor ) );
1966 if ( xObjStor.Is() && !xObjStor->GetError() )
1967 {
1968 if ( xObjStor->GetClassName() == SvGlobalName() )
1969 {
1970 ClsId aId( pObjStor->GetClassId() );
1971 xObjStor->SetClass( SvGlobalName( aId.n1, aId.n2, aId.n3, aId.n4, aId.n5, aId.n6, aId.n7, aId.n8, aId.n9, aId.n10, aId.n11 ),
1972 pObjStor->GetFormat(), pObjStor->GetUserName() );
1973 }
1974 SotStorageStreamRef xSrcTst = xObjStor->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "\1Ole" ) ) );
1975 if ( xSrcTst.Is() )
1976 {
1977 sal_uInt8 aTestA[ 10 ];
1978 sal_Bool bGetItAsOle = ( sizeof( aTestA ) == xSrcTst->Read( aTestA, sizeof( aTestA ) ) );
1979 if ( !bGetItAsOle )
1980 { // maybe there is a contentsstream in here
1981 xSrcTst = xObjStor->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "Contents" ) ), STREAM_READWRITE | STREAM_NOCREATE );
1982 bGetItAsOle = ( xSrcTst.Is() && sizeof( aTestA ) == xSrcTst->Read( aTestA, sizeof( aTestA ) ) );
1983 }
1984 if ( bGetItAsOle )
1985 {
1986 ::rtl::OUString aNm;
1987 // if ( nSvxMSDffOLEConvFlags )
1988 {
1989 uno::Reference < embed::XStorage > xDestStorage( pOe->pShell->GetStorage() );
1990 uno::Reference < embed::XEmbeddedObject > xObj =
1991 CheckForConvertToSOObj( nSvxMSDffOLEConvFlags, *xObjStor, xDestStorage, rGraf, rVisArea );
1992 if( xObj.is() )
1993 {
1994 pOe->pShell->getEmbeddedObjectContainer().InsertEmbeddedObject( xObj, aNm );
1995
1996 svt::EmbeddedObjectRef aObj( xObj, pOe->nAspect );
1997
1998 // TODO/LATER: need MediaType for Graphic
1999 aObj.SetGraphic( rGraf, ::rtl::OUString() );
2000 pRet = new SdrOle2Obj( aObj, aNm, rBoundRect, sal_False );
2001 }
2002 }
2003 if ( !pRet && ( pOe->nType == PPT_PST_ExControl ) )
2004 {
2005 PPTConvertOCXControls aPPTConvertOCXControls( pOe->pShell, eAktPageKind );
2006 ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > xShape;
2007 if ( aPPTConvertOCXControls.ReadOCXStream( xObjStor, &xShape, sal_False ) )
2008 pRet = GetSdrObjectFromXShape( xShape );
2009 }
2010 if ( !pRet )
2011 {
2012 aNm = pOe->pShell->getEmbeddedObjectContainer().CreateUniqueObjectName();
2013 ErrCode aErrCode = 0;
2014
2015 // object is not an own object
2016 SotStorageRef xTarget = SotStorage::OpenOLEStorage( pOe->pShell->GetStorage(), aNm, STREAM_READWRITE );
2017 if ( xObjStor.Is() && xTarget.Is() )
2018 {
2019 xObjStor->CopyTo( xTarget );
2020 if( !xTarget->GetError() )
2021 xTarget->Commit();
2022 if( xTarget->GetError() )
2023 aErrCode = xTarget->GetError();
2024 }
2025 xTarget.Clear();
2026
2027 uno::Reference < embed::XEmbeddedObject > xObj =
2028 pOe->pShell->getEmbeddedObjectContainer().GetEmbeddedObject( aNm );
2029 if ( xObj.is() )
2030 {
2031 if ( pOe->nAspect != embed::Aspects::MSOLE_ICON )
2032 {
2033 //TODO/LATER: keep on hacking?!
2034 // modifiziert wollen wir nicht werden
2035 //xInplaceObj->EnableSetModified( sal_False );
2036 if ( rVisArea.IsEmpty() )
2037 {
2038 MapUnit aMapUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( pOe->nAspect ) );
2039 Size aSize( OutputDevice::LogicToLogic( aGraphic.GetPrefSize(),
2040 aGraphic.GetPrefMapMode(), MapMode( aMapUnit ) ) );
2041
2042 awt::Size aSz;
2043 aSz.Width = aSize.Width();
2044 aSz.Height = aSize.Height();
2045 xObj->setVisualAreaSize( pOe->nAspect, aSz );
2046 }
2047 else
2048 {
2049 awt::Size aSize( rVisArea.GetSize().Width(), rVisArea.GetSize().Height() );
2050 xObj->setVisualAreaSize( pOe->nAspect, aSize );
2051 }
2052 //xInplaceObj->EnableSetModified( sal_True );
2053 }
2054
2055 svt::EmbeddedObjectRef aObj( xObj, pOe->nAspect );
2056
2057 // TODO/LATER: need MediaType for Graphic
2058 aObj.SetGraphic( aGraphic, ::rtl::OUString() );
2059
2060 pRet = new SdrOle2Obj( aObj, aNm, rBoundRect, sal_False );
2061 }
2062 }
2063 }
2064 }
2065 }
2066 }
2067 delete pDest;
2068 }
2069 }
2070 }
2071 rStCtrl.Seek( nOldPos );
2072
2073 return pRet;
2074 }
2075
ImportExOleObjStg(sal_uInt32 nPersistPtr,sal_uInt32 & nOleId) const2076 SvMemoryStream* SdrPowerPointImport::ImportExOleObjStg( sal_uInt32 nPersistPtr, sal_uInt32& nOleId ) const
2077 {
2078 SvMemoryStream* pRet = NULL;
2079 if ( nPersistPtr && ( nPersistPtr < nPersistPtrAnz ) )
2080 {
2081 sal_uInt32 nOldPos, nOfs = pPersistPtr[ nPersistPtr ];
2082 nOldPos = rStCtrl.Tell();
2083 rStCtrl.Seek( nOfs );
2084 DffRecordHeader aHd;
2085 rStCtrl >> aHd;
2086 if ( aHd.nRecType == DFF_PST_ExOleObjStg )
2087 {
2088 sal_uInt32 nLen = aHd.nRecLen - 4;
2089 if ( (sal_Int32)nLen > 0 )
2090 {
2091 rStCtrl >> nOleId;
2092 pRet = new SvMemoryStream;
2093 ZCodec aZCodec( 0x8000, 0x8000 );
2094 aZCodec.BeginCompression();
2095 aZCodec.Decompress( rStCtrl, *pRet );
2096 if ( !aZCodec.EndCompression() )
2097 delete pRet, pRet = NULL;
2098 }
2099 }
2100 rStCtrl.Seek( nOldPos );
2101 }
2102 return pRet;
2103 }
2104
SeekOle(SfxObjectShell * pShell,sal_uInt32 nFilterOptions)2105 void SdrPowerPointImport::SeekOle( SfxObjectShell* pShell, sal_uInt32 nFilterOptions )
2106 {
2107 if ( pShell )
2108 {
2109 DffRecordHeader* pHd;
2110
2111 sal_uInt32 nOldPos = rStCtrl.Tell();
2112 if ( nFilterOptions & 1 )
2113 {
2114 pHd = aDocRecManager.GetRecordHeader( PPT_PST_List, SEEK_FROM_BEGINNING );
2115 if ( pHd )
2116 {
2117 // we try to locate the basic atom
2118 pHd->SeekToContent( rStCtrl );
2119 if ( SeekToRec( rStCtrl, PPT_PST_VBAInfo, pHd->GetRecEndFilePos(), pHd ) )
2120 {
2121 if ( SeekToRec( rStCtrl, PPT_PST_VBAInfoAtom, pHd->GetRecEndFilePos(), pHd ) )
2122 {
2123 sal_uInt32 nPersistPtr, nIDoNotKnow1, nIDoNotKnow2;
2124 rStCtrl >> nPersistPtr
2125 >> nIDoNotKnow1
2126 >> nIDoNotKnow2;
2127
2128 sal_uInt32 nOleId;
2129 SvMemoryStream* pBas = ImportExOleObjStg( nPersistPtr, nOleId );
2130 if ( pBas )
2131 {
2132 SotStorageRef xSource( new SotStorage( pBas, sal_True ) );
2133 SotStorageRef xDest( new SotStorage( new SvMemoryStream(), sal_True ) );
2134 if ( xSource.Is() && xDest.Is() )
2135 {
2136 // is this a visual basic storage ?
2137 SotStorageRef xSubStorage = xSource->OpenSotStorage( String( RTL_CONSTASCII_USTRINGPARAM( "VBA" ) ),
2138 STREAM_READWRITE | STREAM_NOCREATE | STREAM_SHARE_DENYALL );
2139 if( xSubStorage.Is() && ( SVSTREAM_OK == xSubStorage->GetError() ) )
2140 {
2141 SotStorageRef xMacros = xDest->OpenSotStorage( String( RTL_CONSTASCII_USTRINGPARAM( "MACROS" ) ) );
2142 if ( xMacros.Is() )
2143 {
2144 SvStorageInfoList aList;
2145 xSource->FillInfoList( &aList );
2146 sal_uInt32 i;
2147
2148 sal_Bool bCopied = sal_True;
2149 for ( i = 0; i < aList.Count(); i++ ) // copy all entrys
2150 {
2151 const SvStorageInfo& rInfo = aList[ i ];
2152 if ( !xSource->CopyTo( rInfo.GetName(), xMacros, rInfo.GetName() ) )
2153 bCopied = sal_False;
2154 }
2155 if ( i && bCopied )
2156 {
2157 SvxImportMSVBasic aMSVBas( *pShell, *xDest, sal_True, sal_False );
2158 //int nSuccess = aMSVBas.Import( String( RTL_CONSTASCII_USTRINGPARAM( "MACROS" ) ),
2159 // String( RTL_CONSTASCII_USTRINGPARAM( "VBA" ) ), TRUE, FALSE );
2160
2161 uno::Reference < embed::XStorage > xDoc( pShell->GetStorage() );
2162 if ( xDoc.is() )
2163 {
2164 SotStorageRef xVBA = SotStorage::OpenOLEStorage( xDoc, String( RTL_CONSTASCII_USTRINGPARAM( "_MS_VBA_Macros" ) ) );
2165 if ( xVBA.Is() && ( xVBA->GetError() == SVSTREAM_OK ) )
2166 {
2167 SotStorageRef xSubVBA = xVBA->OpenSotStorage( String( RTL_CONSTASCII_USTRINGPARAM( "_MS_VBA_Overhead" ) ) );
2168 if ( xSubVBA.Is() && ( xSubVBA->GetError() == SVSTREAM_OK ) )
2169 {
2170 SotStorageStreamRef xOriginal = xSubVBA->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM( "_MS_VBA_Overhead2" ) ) );
2171 if ( xOriginal.Is() && ( xOriginal->GetError() == SVSTREAM_OK ) )
2172 {
2173 if ( nPersistPtr && ( nPersistPtr < nPersistPtrAnz ) )
2174 {
2175 rStCtrl.Seek( pPersistPtr[ nPersistPtr ] );
2176 rStCtrl >> *pHd;
2177
2178 *xOriginal << nIDoNotKnow1
2179 << nIDoNotKnow2;
2180
2181 sal_uInt32 nSource, nToCopy, nBufSize;
2182 nSource = rStCtrl.Tell();
2183 nToCopy = pHd->nRecLen;
2184 sal_uInt8* pBuf = new sal_uInt8[ 0x40000 ]; // 256KB Buffer
2185 if ( pBuf )
2186 {
2187 while ( nToCopy )
2188 {
2189 nBufSize = ( nToCopy >= 0x40000 ) ? 0x40000 : nToCopy;
2190 rStCtrl.Read( pBuf, nBufSize );
2191 xOriginal->Write( pBuf, nBufSize );
2192 nToCopy -= nBufSize;
2193 }
2194 delete[] pBuf;
2195 }
2196 }
2197 }
2198 }
2199 }
2200 }
2201 }
2202 }
2203 }
2204 }
2205 }
2206 }
2207 }
2208 }
2209 }
2210 pHd = aDocRecManager.GetRecordHeader( PPT_PST_ExObjList, SEEK_FROM_BEGINNING );
2211 if ( pHd )
2212 {
2213 DffRecordManager* pExObjListManager = NULL;
2214 DffRecordHeader* pExEmbed = NULL;
2215
2216 pHd->SeekToBegOfRecord( rStCtrl );
2217 pExObjListManager = new DffRecordManager( rStCtrl );
2218 sal_uInt16 i, nRecType(PPT_PST_ExEmbed);
2219
2220 for ( i = 0; i < 2; i++ )
2221 {
2222 switch ( i )
2223 {
2224 case 0 : nRecType = PPT_PST_ExEmbed; break;
2225 case 1 : nRecType = PPT_PST_ExControl; break;
2226 }
2227 for ( pExEmbed = pExObjListManager->GetRecordHeader( nRecType, SEEK_FROM_BEGINNING );
2228 pExEmbed; pExEmbed = pExObjListManager->GetRecordHeader( nRecType, SEEK_FROM_CURRENT ) )
2229 {
2230 pExEmbed->SeekToContent( rStCtrl );
2231
2232 DffRecordHeader aExOleAtHd;
2233 if ( SeekToRec( rStCtrl, PPT_PST_ExOleObjAtom, pExEmbed->GetRecEndFilePos(), &aExOleAtHd ) )
2234 {
2235 PptExOleObjAtom aAt;
2236 rStCtrl >> aAt;
2237
2238 if ( aAt.nPersistPtr && ( aAt.nPersistPtr < nPersistPtrAnz ) )
2239 {
2240 sal_uInt32 nId;
2241 rStCtrl.Seek( pPersistPtr[ aAt.nPersistPtr ] );
2242 DffRecordHeader aHd;
2243 rStCtrl >> aHd;
2244 if ( aHd.nRecType == DFF_PST_ExOleObjStg )
2245 {
2246 rStCtrl >> nId;
2247 aOleObjectList.Insert(
2248 new PPTOleEntry( aAt.nId, aHd.nFilePos, pShell, nRecType, aAt.nAspect ) );
2249 }
2250 }
2251 }
2252 }
2253 }
2254 delete pExObjListManager;
2255 }
2256 rStCtrl.Seek( nOldPos );
2257 }
2258 }
2259
ReadFontCollection()2260 sal_Bool SdrPowerPointImport::ReadFontCollection()
2261 {
2262 sal_Bool bRet = sal_False;
2263 DffRecordHeader* pEnvHd = aDocRecManager.GetRecordHeader( PPT_PST_Environment );
2264 if ( pEnvHd )
2265 {
2266 sal_uLong nFPosMerk = rStCtrl.Tell(); // FilePos merken fuer spaetere Restauration
2267 pEnvHd->SeekToContent( rStCtrl );
2268 DffRecordHeader aListHd;
2269 if ( SeekToRec( rStCtrl, PPT_PST_FontCollection, pEnvHd->GetRecEndFilePos(), &aListHd ) )
2270 {
2271 sal_uInt16 nCount2 = 0;
2272 VirtualDevice* pVDev = NULL;
2273 while ( SeekToRec( rStCtrl, PPT_PST_FontEntityAtom, aListHd.GetRecEndFilePos() ) )
2274 {
2275 bRet = sal_True;
2276 if ( !pFonts )
2277 pFonts = new PptFontCollection;
2278 PptFontEntityAtom* pFont = new PptFontEntityAtom;
2279 rStCtrl >> *pFont;
2280
2281 Font aFont;
2282 aFont.SetCharSet( pFont->eCharSet );
2283 aFont.SetName( pFont->aName );
2284 aFont.SetFamily( pFont->eFamily );
2285 aFont.SetPitch( pFont->ePitch );
2286 aFont.SetHeight( 100 );
2287
2288 if ( mbTracing && !pFont->bAvailable )
2289 mpTracer->Trace( rtl::OUString::createFromAscii( "sd1000" ), pFont->aName );
2290
2291 #ifdef DBG_EXTRACTFONTMETRICS
2292
2293 SvxFont aTmpFont( aFont );
2294
2295 if ( !pVDev )
2296 pVDev = new VirtualDevice;
2297 aTmpFont.SetPhysFont( pVDev );
2298 FontMetric aMetric( pVDev->GetFontMetric() );
2299 sal_uInt16 nTxtHeight = (sal_uInt16)aMetric.GetAscent() + (sal_uInt16)aMetric.GetDescent();
2300
2301 String aFileURLStr;
2302 if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( Application::GetAppFileName(), aFileURLStr ) )
2303 {
2304 INetURLObject aURL( aFileURLStr );
2305 aURL.SetName( String( RTL_CONSTASCII_STRINGPARAM( "dbgfontmetrics.txt" ) ) );
2306
2307 SvStream* pDbgOut = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
2308 if( pDbgOut )
2309 {
2310 pDbgOut->Seek( STREAM_SEEK_TO_END );
2311
2312 Printer* pPrinter = NULL;
2313 if ( pSdrModel->GetRefDevice() && pSdrModel->GetRefDevice()->GetOutDevType() == OUTDEV_PRINTER )
2314 pPrinter = (Printer*)pSdrModel->GetRefDevice();
2315 if ( pPrinter )
2316 {
2317 Font aOldFont( pPrinter->GetFont() );
2318 aFont.SetKerning( sal_True );
2319 pPrinter->SetFont( aFont );
2320 aMetric = pPrinter->GetFontMetric();
2321 pPrinter->SetFont( aOldFont );
2322 }
2323
2324 if ( ( pPrinter == NULL ) || ( aMetric.GetIntLeading() == 0 ) )
2325 {
2326 VirtualDevice aVirDev( 1 );
2327 aVirDev.SetFont( aFont );
2328 aMetric = aVirDev.GetFontMetric();
2329 }
2330 ByteString aFontName( aFont.GetName(), RTL_TEXTENCODING_UTF8 );
2331 ByteString aHeight( ByteString::CreateFromInt32( aMetric.GetLineHeight() ) );
2332 ByteString aAscent( ByteString::CreateFromInt32( aMetric.GetAscent() ) );
2333 ByteString aDescent( ByteString::CreateFromInt32( aMetric.GetDescent() ) );
2334 ByteString aLeading( ByteString::CreateFromInt32( aMetric.GetIntLeading() ) );
2335 ByteString aPhysHeight( ByteString::CreateFromInt32( nTxtHeight ) );
2336
2337 *pDbgOut << (sal_uInt8)0xa
2338 << "FontName : " << aFontName.GetBuffer() << (sal_uInt8)0xa
2339 << " Height: " << aHeight.GetBuffer() << (sal_uInt8)0xa
2340 << " Ascent: " << aAscent.GetBuffer() << (sal_uInt8)0xa
2341 << " Descent:" << aDescent.GetBuffer() << (sal_uInt8)0xa
2342 << " Leading:" << aLeading.GetBuffer() << (sal_uInt8)0xa
2343 << "PhysHeight :" << aPhysHeight.GetBuffer()<< (sal_uInt8)0xa;
2344 }
2345 delete pDbgOut;
2346 }
2347 #endif
2348 // following block is necessary, because our old PowerPoint export did not set the
2349 // correct charset
2350 if ( pFont->aName.EqualsIgnoreCaseAscii( "Wingdings" ) ||
2351 pFont->aName.EqualsIgnoreCaseAscii( "Wingdings 2" ) ||
2352 pFont->aName.EqualsIgnoreCaseAscii( "Wingdings 3" ) ||
2353 pFont->aName.EqualsIgnoreCaseAscii( "Monotype Sorts" ) ||
2354 pFont->aName.EqualsIgnoreCaseAscii( "Monotype Sorts 2" ) ||
2355 pFont->aName.EqualsIgnoreCaseAscii( "Webdings" ) ||
2356 pFont->aName.EqualsIgnoreCaseAscii( "StarBats" ) ||
2357 pFont->aName.EqualsIgnoreCaseAscii( "StarMath" ) ||
2358 pFont->aName.EqualsIgnoreCaseAscii( "ZapfDingbats" ) )
2359 {
2360 pFont->eCharSet = RTL_TEXTENCODING_SYMBOL;
2361 };
2362 pFonts->C40_INSERT( PptFontEntityAtom, pFont, nCount2++ );
2363 }
2364 delete pVDev;
2365 }
2366 rStCtrl.Seek( nFPosMerk ); // FilePos restaurieren
2367 }
2368 return bRet;
2369 }
2370
GetPageList(PptPageKind ePageKind) const2371 PptSlidePersistList* SdrPowerPointImport::GetPageList(PptPageKind ePageKind) const
2372 {
2373 if ( ePageKind == PPT_MASTERPAGE )
2374 return pMasterPages;
2375 if ( ePageKind == PPT_SLIDEPAGE )
2376 return pSlidePages;
2377 if ( ePageKind == PPT_NOTEPAGE )
2378 return pNotePages;
2379 return NULL;
2380 }
2381
GetDrawOutliner(SdrTextObj * pSdrText) const2382 SdrOutliner* SdrPowerPointImport::GetDrawOutliner( SdrTextObj* pSdrText ) const
2383 {
2384 if ( !pSdrText )
2385 return NULL;
2386 else
2387 return &pSdrText->ImpGetDrawOutliner();
2388 }
2389
2390
ReadObjText(PPTTextObj * pTextObj,SdrObject * pSdrObj,SdPage * pPage) const2391 SdrObject* SdrPowerPointImport::ReadObjText( PPTTextObj* pTextObj, SdrObject* pSdrObj, SdPage* pPage ) const
2392 {
2393 SdrTextObj* pText = PTR_CAST( SdrTextObj, pSdrObj );
2394 if ( pText )
2395 {
2396 if ( !ApplyTextObj( pTextObj, pText, pPage, NULL, NULL ) )
2397 pSdrObj = NULL;
2398 }
2399 return pSdrObj;
2400 }
2401
2402
ApplyTextObj(PPTTextObj * pTextObj,SdrTextObj * pSdrText,SdPage *,SfxStyleSheet * pSheet,SfxStyleSheet ** ppStyleSheetAry) const2403 SdrObject* SdrPowerPointImport::ApplyTextObj( PPTTextObj* pTextObj, SdrTextObj* pSdrText, SdPage* /*pPage*/,
2404 SfxStyleSheet* pSheet, SfxStyleSheet** ppStyleSheetAry ) const
2405 {
2406 SdrTextObj* pText = pSdrText;
2407 if ( pTextObj->Count() )
2408 {
2409 sal_uInt32 nDestinationInstance = pTextObj->GetDestinationInstance() ;
2410 SdrOutliner& rOutliner = pText->ImpGetDrawOutliner();
2411 if ( ( pText->GetObjInventor() == SdrInventor ) && ( pText->GetObjIdentifier() == OBJ_TITLETEXT ) ) // Outliner-Style fuer Titel-Textobjekt?!? (->von DL)
2412 rOutliner.Init( OUTLINERMODE_TITLEOBJECT ); // Outliner reset
2413
2414 sal_Bool bOldUpdateMode = rOutliner.GetUpdateMode();
2415 rOutliner.SetUpdateMode( sal_False );
2416 if ( pSheet )
2417 {
2418 if ( rOutliner.GetStyleSheet( 0 ) != pSheet )
2419 rOutliner.SetStyleSheet( 0, pSheet );
2420 }
2421 rOutliner.SetVertical( pTextObj->GetVertical() );
2422 const PPTParagraphObj* pPreviousParagraph = NULL;
2423 for ( PPTParagraphObj* pPara = pTextObj->First(); pPara; pPara = pTextObj->Next() )
2424 {
2425 sal_uInt32 nTextSize = pPara->GetTextSize();
2426 if ( ! ( nTextSize & 0xffff0000 ) )
2427 {
2428 PPTPortionObj* pPortion;
2429 sal_Unicode* pParaText = new sal_Unicode[ nTextSize ];
2430 sal_uInt32 nCurrentIndex = 0;
2431 for ( pPortion = pPara->First(); pPortion; pPortion = pPara->Next() )
2432 {
2433 if ( pPortion->mpFieldItem )
2434 pParaText[ nCurrentIndex++ ] = ' ';
2435 else
2436 {
2437 sal_uInt32 nCharacters = pPortion->Count();
2438 const sal_Unicode* pSource = pPortion->maString.GetBuffer();
2439 sal_Unicode* pDest = pParaText + nCurrentIndex;
2440
2441 sal_uInt32 nFont;
2442 pPortion->GetAttrib( PPT_CharAttr_Font, nFont, pTextObj->GetInstance() );
2443 PptFontEntityAtom* pFontEnityAtom = GetFontEnityAtom( nFont );
2444 if ( pFontEnityAtom && ( pFontEnityAtom->eCharSet == RTL_TEXTENCODING_SYMBOL ) )
2445 {
2446 sal_uInt32 i;
2447 sal_Unicode nUnicode;
2448 for ( i = 0; i < nCharacters; i++ )
2449 {
2450 nUnicode = pSource[ i ];
2451 if ( ! ( nUnicode & 0xff00 ) )
2452 nUnicode |= 0xf000;
2453 pDest[ i ] = nUnicode;
2454 }
2455 }
2456 else
2457 memcpy( pDest, pSource, nCharacters << 1 );
2458 nCurrentIndex += nCharacters;
2459 }
2460 }
2461 sal_uInt32 nParaIndex = pTextObj->GetCurrentIndex();
2462 SfxStyleSheet* pS = ( ppStyleSheetAry ) ? ppStyleSheetAry[ pPara->pParaSet->mnDepth ] : pSheet;
2463
2464 ESelection aSelection( nParaIndex, 0, nParaIndex, 0 );
2465 rOutliner.Insert( String(), nParaIndex, pPara->pParaSet->mnDepth );
2466 rOutliner.QuickInsertText( String( pParaText, (sal_uInt16)nCurrentIndex ), aSelection );
2467 rOutliner.SetParaAttribs( nParaIndex, rOutliner.GetEmptyItemSet() );
2468 if ( pS )
2469 rOutliner.SetStyleSheet( nParaIndex, pS );
2470
2471 for ( pPortion = pPara->First(); pPortion; pPortion = pPara->Next() )
2472 {
2473 SfxItemSet aPortionAttribs( rOutliner.GetEmptyItemSet() );
2474 SvxFieldItem* pFieldItem = pPortion->GetTextField();
2475 if ( pFieldItem )
2476 {
2477 rOutliner.QuickInsertField( *pFieldItem, ESelection( nParaIndex, aSelection.nEndPos, nParaIndex, aSelection.nEndPos + 1 ) );
2478 aSelection.nEndPos++;
2479 delete pFieldItem;
2480 }
2481 else
2482 {
2483 const sal_Unicode *pF, *pPtr = pPortion->maString.GetBuffer();
2484 const sal_Unicode *pMax = pPtr + pPortion->maString.Len();
2485 sal_Int32 nLen;
2486 for ( pF = pPtr; pPtr < pMax; pPtr++ )
2487 {
2488 if ( *pPtr == 0xb )
2489 {
2490 nLen = pPtr - pF;
2491 if ( nLen )
2492 aSelection.nEndPos =
2493 sal::static_int_cast< sal_uInt16 >(
2494 aSelection.nEndPos + nLen );
2495 pF = pPtr + 1;
2496 rOutliner.QuickInsertLineBreak( ESelection( nParaIndex, aSelection.nEndPos, nParaIndex, aSelection.nEndPos + 1 ) );
2497 aSelection.nEndPos++;
2498 }
2499 }
2500 nLen = pPtr - pF;
2501 if ( nLen )
2502 aSelection.nEndPos = sal::static_int_cast< sal_uInt16 >(
2503 aSelection.nEndPos + nLen );
2504 }
2505 pPortion->ApplyTo( aPortionAttribs, (SdrPowerPointImport&)*this, nDestinationInstance, pTextObj );
2506 rOutliner.QuickSetAttribs( aPortionAttribs, aSelection );
2507 aSelection.nStartPos = aSelection.nEndPos;
2508 }
2509 boost::optional< sal_Int16 > oStartNumbering;
2510 SfxItemSet aParagraphAttribs( rOutliner.GetEmptyItemSet() );
2511 pPara->ApplyTo( aParagraphAttribs, oStartNumbering, (SdrPowerPointImport&)*this, nDestinationInstance, pPreviousParagraph );
2512
2513 sal_uInt32 nIsBullet2 = 0; //, nInstance = nDestinationInstance != 0xffffffff ? nDestinationInstance : pTextObj->GetInstance();
2514 pPara->GetAttrib( PPT_ParaAttr_BulletOn, nIsBullet2, nDestinationInstance );
2515 if ( !nIsBullet2 )
2516 aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE, sal_False ) );
2517
2518
2519 pPreviousParagraph = pPara;
2520 if ( !aSelection.nStartPos ) // in PPT empty paragraphs never gets a bullet
2521 {
2522 aParagraphAttribs.Put( SfxBoolItem( EE_PARA_BULLETSTATE, sal_False ) );
2523 // rOutliner.SetDepth( rOutliner.GetParagraph( nParaIndex ), -1 );
2524 }
2525 aSelection.nStartPos = 0;
2526 rOutliner.QuickSetAttribs( aParagraphAttribs, aSelection );
2527 delete[] pParaText;
2528 }
2529 }
2530 OutlinerParaObject* pNewText = rOutliner.CreateParaObject();
2531 rOutliner.Clear();
2532 rOutliner.SetUpdateMode( bOldUpdateMode );
2533 pText->SetOutlinerParaObject( pNewText );
2534 }
2535 return pText;
2536 }
2537
SeekToDocument(DffRecordHeader * pRecHd) const2538 sal_Bool SdrPowerPointImport::SeekToDocument( DffRecordHeader* pRecHd ) const
2539 {
2540 sal_Bool bRet;
2541 sal_uLong nFPosMerk = rStCtrl.Tell(); // FilePos merken fuer ggf. spaetere Restauration
2542 rStCtrl.Seek( nDocStreamPos );
2543 DffRecordHeader aDocHd;
2544 rStCtrl >> aDocHd;
2545 bRet = aDocHd.nRecType == PPT_PST_Document;
2546 if ( bRet )
2547 {
2548 if ( pRecHd )
2549 *pRecHd = aDocHd;
2550 else
2551 aDocHd.SeekToBegOfRecord( rStCtrl );
2552 }
2553 if ( !bRet )
2554 rStCtrl.Seek( nFPosMerk ); // FilePos restaurieren
2555 return bRet;
2556 }
2557
SeekToContentOfProgTag(sal_Int32 nVersion,SvStream & rSt,const DffRecordHeader & rSourceHd,DffRecordHeader & rContentHd)2558 sal_Bool SdrPowerPointImport::SeekToContentOfProgTag( sal_Int32 nVersion, SvStream& rSt,
2559 const DffRecordHeader& rSourceHd, DffRecordHeader& rContentHd )
2560 {
2561 sal_Bool bRetValue = sal_False;
2562 sal_uInt32 nOldPos = rSt.Tell();
2563
2564 DffRecordHeader aProgTagsHd, aProgTagBinaryDataHd;
2565 rSourceHd.SeekToContent( rSt );
2566 sal_Bool bFound = rSourceHd.nRecType == PPT_PST_ProgTags;
2567 if ( !bFound )
2568 bFound = SeekToRec( rSt, PPT_PST_ProgTags, rSourceHd.GetRecEndFilePos(), &aProgTagsHd );
2569 if ( bFound )
2570 {
2571 while( SeekToRec( rSt, PPT_PST_ProgBinaryTag, aProgTagsHd.GetRecEndFilePos(), &aProgTagBinaryDataHd ) )
2572 {
2573 rSt >> rContentHd;
2574 if ( rContentHd.nRecType == PPT_PST_CString )
2575 {
2576 sal_uInt16 n = 6;
2577 sal_uInt32 i = rContentHd.nRecLen >> 1;
2578 if ( i > n )
2579 {
2580 String aPre, aSuf;
2581 sal_Unicode *pTmp = aPre.AllocBuffer( n );
2582 while ( n-- )
2583 rSt >> *pTmp++;
2584 n = (sal_uInt16)( i - 6 );
2585 pTmp = aSuf.AllocBuffer( n );
2586 while ( n-- )
2587 rSt >> *pTmp++;
2588 sal_Int32 nV = aSuf.ToInt32();
2589 if ( ( nV == nVersion ) && ( aPre == String( RTL_CONSTASCII_USTRINGPARAM( "___PPT" ) ) ) )
2590 {
2591 rContentHd.SeekToEndOfRecord( rSt );
2592 rSt >> rContentHd;
2593 if ( rContentHd.nRecType == PPT_PST_BinaryTagData )
2594 {
2595 bRetValue = sal_True;
2596 break;
2597 }
2598 }
2599 }
2600 }
2601 aProgTagBinaryDataHd.SeekToEndOfRecord( rSt );
2602 }
2603 }
2604 if ( !bRetValue )
2605 rSt.Seek( nOldPos );
2606 return bRetValue;
2607 }
2608
GetAktPageId()2609 sal_uInt32 SdrPowerPointImport::GetAktPageId()
2610 {
2611 PptSlidePersistList* pList = GetPageList( eAktPageKind );
2612 if ( pList && nAktPageNum < pList->Count() )
2613 return (*pList)[ (sal_uInt16)nAktPageNum ]->aPersistAtom.nSlideId;
2614 return 0;
2615 }
2616
SeekToAktPage(DffRecordHeader * pRecHd) const2617 sal_Bool SdrPowerPointImport::SeekToAktPage( DffRecordHeader* pRecHd ) const
2618 {
2619 sal_Bool bRet = sal_False;
2620 PptSlidePersistList* pList = GetPageList( eAktPageKind );
2621 if ( pList && ( nAktPageNum < pList->Count() ) )
2622 {
2623 sal_uLong nPersist = (*pList)[ (sal_uInt16)nAktPageNum ]->aPersistAtom.nPsrReference;
2624 if ( nPersist > 0 && nPersist < nPersistPtrAnz )
2625 {
2626 sal_uLong nFPos = 0;
2627 nFPos = pPersistPtr[ nPersist ];
2628 if ( nFPos < nStreamLen )
2629 {
2630 rStCtrl.Seek( nFPos );
2631 if ( pRecHd )
2632 rStCtrl >> *pRecHd;
2633 bRet = sal_True;
2634 }
2635 }
2636 }
2637 return bRet;
2638 }
2639
GetPageCount(PptPageKind ePageKind) const2640 sal_uInt16 SdrPowerPointImport::GetPageCount( PptPageKind ePageKind ) const
2641 {
2642 PptSlidePersistList* pList = GetPageList( ePageKind );
2643 if ( pList )
2644 return pList->Count();
2645 return 0;
2646 }
2647
SetPageNum(sal_uInt16 nPageNum,PptPageKind eKind)2648 void SdrPowerPointImport::SetPageNum( sal_uInt16 nPageNum, PptPageKind eKind )
2649 {
2650 eAktPageKind = eKind;
2651 nAktPageNum = nPageNum;
2652
2653 pPPTStyleSheet = NULL;
2654
2655 sal_Bool bHasMasterPage = sal_True;
2656 sal_uInt16 nMasterIndex = 0;
2657
2658 if ( eKind == PPT_MASTERPAGE )
2659 nMasterIndex = nPageNum;
2660 else
2661 {
2662 if ( HasMasterPage( nPageNum, eKind ) )
2663 nMasterIndex = GetMasterPageIndex( nPageNum, eKind );
2664 else
2665 bHasMasterPage = sal_False;
2666 }
2667 if ( bHasMasterPage )
2668 {
2669 PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
2670 if ( pPageList && nMasterIndex < pPageList->Count() )
2671 {
2672 PptSlidePersistEntry* pMasterPersist = (*pPageList)[ nMasterIndex ];
2673 if ( ( pMasterPersist->pStyleSheet == NULL ) && pMasterPersist->aSlideAtom.nMasterId )
2674 {
2675 nMasterIndex = pMasterPages->FindPage( pMasterPersist->aSlideAtom.nMasterId );
2676 if ( nMasterIndex != PPTSLIDEPERSIST_ENTRY_NOTFOUND )
2677 pMasterPersist = (*pPageList)[ nMasterIndex ];
2678 }
2679 pPPTStyleSheet = pMasterPersist->pStyleSheet;
2680 }
2681 }
2682 if ( !pPPTStyleSheet )
2683 pPPTStyleSheet = pDefaultSheet;
2684 }
2685
GetPageSize() const2686 Size SdrPowerPointImport::GetPageSize() const
2687 {
2688 Size aRet( IsNoteOrHandout( nAktPageNum, eAktPageKind ) ? aDocAtom.GetNotesPageSize() : aDocAtom.GetSlidesPageSize() );
2689 Scale( aRet );
2690 // PPT arbeitet nur mit Einheiten zu 576DPI. Um Ungenauigkeiten zu
2691 // vermeiden runde ich die letzte Nachkommastelle metrisch weg.
2692 if ( nMapMul > 2 * nMapDiv )
2693 {
2694 MapUnit eMap = pSdrModel->GetScaleUnit();
2695 bool bInch = IsInch( eMap );
2696 long nInchMul = 1, nInchDiv = 1;
2697 if ( bInch )
2698 { // Size temporaer (zum runden) in nach metric konvertieren
2699 Fraction aFact(GetMapFactor(eMap,MAP_100TH_MM).X());
2700 nInchMul = aFact.GetNumerator();
2701 nInchDiv = aFact.GetDenominator();
2702 aRet.Width() = BigMulDiv( aRet.Width(), nInchMul, nInchDiv );
2703 aRet.Height() = BigMulDiv( aRet.Height(), nInchMul, nInchDiv );
2704 }
2705 aRet.Width() += 5; aRet.Width() /= 10; aRet.Width()*=10;
2706 aRet.Height() += 5; aRet.Height() /= 10; aRet.Height()*=10;
2707 if ( bInch )
2708 {
2709 aRet.Width() = BigMulDiv( aRet.Width(), nInchDiv, nInchMul );
2710 aRet.Height() = BigMulDiv( aRet.Height(), nInchDiv, nInchMul );
2711 }
2712 }
2713 return aRet;
2714 }
2715
GetColorFromPalette(sal_uInt16 nNum,Color & rColor) const2716 FASTBOOL SdrPowerPointImport::GetColorFromPalette( sal_uInt16 nNum, Color& rColor ) const
2717 {
2718 if ( nPageColorsNum != nAktPageNum || ePageColorsKind != eAktPageKind )
2719 {
2720 sal_uInt16 nSlideFlags = 0;
2721 PptSlidePersistList* pPageList = GetPageList( eAktPageKind );
2722 if ( pPageList && ( nAktPageNum < pPageList->Count() ) )
2723 {
2724 PptSlidePersistEntry* pE = (*pPageList)[ nAktPageNum ];
2725 if ( pE )
2726 nSlideFlags = pE->aSlideAtom.nFlags;
2727 if ( ! ( nSlideFlags & 2 ) )
2728 ((SdrPowerPointImport*)this)->aPageColors = pE->aColorScheme;
2729 }
2730 if ( nSlideFlags & 2 ) // follow master colorscheme?
2731 {
2732 PptSlidePersistList* pPageList2 = GetPageList( PPT_MASTERPAGE );
2733 if ( pPageList2 )
2734 {
2735 PptSlidePersistEntry* pMasterPersist = NULL;
2736 if ( eAktPageKind == PPT_MASTERPAGE )
2737 pMasterPersist = (*pPageList2)[ nAktPageNum ];
2738 else
2739 {
2740 if ( HasMasterPage( nAktPageNum, eAktPageKind ) )
2741 {
2742 sal_uInt16 nMasterNum = GetMasterPageIndex( nAktPageNum, eAktPageKind );
2743 if ( nMasterNum < pPageList2->Count() )
2744 pMasterPersist = (*pPageList2)[ nMasterNum ];
2745 }
2746 }
2747 if ( pMasterPersist )
2748 {
2749 while( ( pMasterPersist && pMasterPersist->aSlideAtom.nFlags & 2 ) // it is possible that a masterpage
2750 && pMasterPersist->aSlideAtom.nMasterId ) // itself is following a master colorscheme
2751 {
2752 sal_uInt16 nNextMaster = pMasterPages->FindPage( pMasterPersist->aSlideAtom.nMasterId );
2753 if ( nNextMaster == PPTSLIDEPERSIST_ENTRY_NOTFOUND )
2754 break;
2755 else
2756 pMasterPersist = (*pPageList2)[ nNextMaster ];
2757 }
2758 ((SdrPowerPointImport*)this)->aPageColors = pMasterPersist->aColorScheme;
2759 }
2760 }
2761 }
2762 // momentanes Farbschema eintragen
2763 ((SdrPowerPointImport*)this)->nPageColorsNum = nAktPageNum;
2764 ((SdrPowerPointImport*)this)->ePageColorsKind = eAktPageKind;
2765 }
2766 rColor = aPageColors.GetColor( nNum );
2767 return sal_True;
2768 }
2769
SeekToShape(SvStream & rSt,void * pClientData,sal_uInt32 nId) const2770 sal_Bool SdrPowerPointImport::SeekToShape( SvStream& rSt, void* pClientData, sal_uInt32 nId ) const
2771 {
2772 sal_Bool bRet = SvxMSDffManager::SeekToShape( rSt, pClientData, nId );
2773 if ( !bRet )
2774 {
2775 ProcessData& rData = *( (ProcessData*)pClientData );
2776 PptSlidePersistEntry& rPersistEntry = rData.rPersistEntry;
2777 if ( rPersistEntry.ePageKind == PPT_SLIDEPAGE )
2778 {
2779 if ( HasMasterPage( nAktPageNum, eAktPageKind ) )
2780 {
2781 sal_uInt16 nMasterNum = GetMasterPageIndex( nAktPageNum, eAktPageKind );
2782 PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
2783 if ( pPageList && ( nMasterNum < pPageList->Count() ) )
2784 {
2785 PptSlidePersistEntry* pPersist = (*pPageList)[ nMasterNum ]; // get the masterpage's persistentry
2786 if ( pPersist && pPersist->pPresentationObjects )
2787 {
2788 sal_uInt32 nCurrent(0L);
2789 DffRecordList* pCList = maShapeRecords.pCList; // we got a backup of the current position
2790 if ( pCList )
2791 nCurrent = pCList->nCurrent;
2792 if ( ((SdrEscherImport*)this )->maShapeRecords.SeekToContent( rSt, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) )
2793 {
2794 sal_uInt32 nStreamPos = rSt.Tell();
2795 PPTTextObj aTextObj( rSt, (SdrPowerPointImport&)*this, rPersistEntry, NULL );
2796 if ( aTextObj.Count() || aTextObj.GetOEPlaceHolderAtom() )
2797 {
2798 sal_uInt32 nShapePos = 0;
2799 switch ( aTextObj.GetInstance() )
2800 {
2801 case TSS_TYPE_TITLE :
2802 nShapePos = pPersist->pPresentationObjects[ TSS_TYPE_PAGETITLE ];
2803 break;
2804 case TSS_TYPE_PAGETITLE :
2805 nShapePos = pPersist->pPresentationObjects[ TSS_TYPE_PAGETITLE ];
2806 break;
2807 case TSS_TYPE_SUBTITLE :
2808 case TSS_TYPE_HALFBODY :
2809 case TSS_TYPE_QUARTERBODY :
2810 case TSS_TYPE_BODY :
2811 nShapePos = pPersist->pPresentationObjects[ TSS_TYPE_BODY ];
2812 break;
2813 // case TSS_TYPE_NOTES :
2814 // case TSS_TYPE_UNUSED :
2815 // case TSS_TYPE_TEXT_IN_SHAPE :
2816 }
2817 if ( nShapePos )
2818 {
2819 rSt.Seek( nShapePos );
2820 bRet = sal_True;
2821 }
2822 }
2823 if ( !bRet )
2824 rSt.Seek( nStreamPos );
2825 }
2826 if ( pCList ) // restoring
2827 pCList->nCurrent = nCurrent;
2828 ((SdrEscherImport*)this )->maShapeRecords.pCList = pCList;
2829 }
2830 }
2831 }
2832 }
2833 }
2834 return bRet;
2835 }
2836
MakeBlancPage(sal_Bool bMaster) const2837 SdrPage* SdrPowerPointImport::MakeBlancPage( sal_Bool bMaster ) const
2838 {
2839 SdrPage* pRet = pSdrModel->AllocPage( bMaster );
2840 pRet->SetSize( GetPageSize() );
2841
2842 /*
2843 SJ (21.08.00) : since bug #77576# i decided not to set a border size.
2844
2845 Size aPageSize( aDocAtom.GetSlidesPageSize() ); // PageSize in 576DPI-Units
2846 long nHMarg = aPageSize.Width() - aDocAtom.aSlidesPageSize.Width();
2847 long nVMarg = aPageSize.Height() - aDocAtom.aSlidesPageSize.Height();
2848 if ( nHMarg > 0 )
2849 {
2850 Scale( nHMarg );
2851 pRet->SetLftBorder( nHMarg / 2 );
2852 pRet->SetRgtBorder( nHMarg - nHMarg / 2 );
2853 }
2854 if ( nVMarg > 0 )
2855 {
2856 Scale( nVMarg );
2857 pRet->SetUppBorder( nVMarg / 2 );
2858 pRet->SetLwrBorder( nVMarg - nVMarg / 2 );
2859 }
2860 */
2861 return pRet;
2862 }
2863
ImportComment10(SvxMSDffManager & rMan,SvStream & rStCtrl,SdrPage * pPage,DffRecordHeader & rComment10Hd)2864 void ImportComment10( SvxMSDffManager& rMan, SvStream& rStCtrl, SdrPage* pPage, DffRecordHeader& rComment10Hd )
2865 {
2866 rtl::OUString sAuthor;
2867 rtl::OUString sText;
2868 rtl::OUString sInitials;
2869
2870 sal_Int32 nIndex = 0;
2871 util::DateTime aDateTime;
2872 sal_Int32 nPosX = 0;
2873 sal_Int32 nPosY = 0;
2874
2875 while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < rComment10Hd.GetRecEndFilePos() ) )
2876 {
2877 DffRecordHeader aCommentHd;
2878 rStCtrl >> aCommentHd;
2879 switch( aCommentHd.nRecType )
2880 {
2881 case PPT_PST_CString :
2882 {
2883 String aString;
2884 SvxMSDffManager::MSDFFReadZString( rStCtrl, aString, aCommentHd.nRecLen, sal_True );
2885 switch ( aCommentHd.nRecInstance )
2886 {
2887 case 0 : sAuthor = aString; break;
2888 case 1 : sText = aString; break;
2889 case 2 : sInitials = aString; break;
2890 }
2891 }
2892 break;
2893
2894 case PPT_PST_CommentAtom10 :
2895 {
2896 rStCtrl >> nIndex
2897 >> aDateTime.Year
2898 >> aDateTime.Month
2899 >> aDateTime.Day // DayOfWeek
2900 >> aDateTime.Day
2901 >> aDateTime.Hours
2902 >> aDateTime.Minutes
2903 >> aDateTime.Seconds
2904 >> aDateTime.HundredthSeconds
2905 >> nPosX
2906 >> nPosY;
2907
2908 aDateTime.HundredthSeconds /= 10;
2909 }
2910 break;
2911 }
2912 aCommentHd.SeekToEndOfRecord( rStCtrl );
2913 }
2914 Point aPosition( nPosX, nPosY );
2915 rMan.Scale( aPosition );
2916
2917 try
2918 {
2919 uno::Reference< office::XAnnotationAccess > xAnnotationAccess( pPage->getUnoPage(), UNO_QUERY_THROW );
2920 uno::Reference< office::XAnnotation > xAnnotation( xAnnotationAccess->createAndInsertAnnotation() );
2921 xAnnotation->setPosition( geometry::RealPoint2D( aPosition.X() / 100.0, aPosition.Y() / 100.0 ) );
2922 xAnnotation->setAuthor( sAuthor );
2923 xAnnotation->setDateTime( aDateTime );
2924 uno::Reference< text::XText > xText( xAnnotation->getTextRange() );
2925 xText->setString( sText );
2926 }
2927 catch( uno::Exception& )
2928 {
2929
2930 }
2931 }
2932
2933
2934 // be sure not to import masterpages with this method
ImportPage(SdrPage * pRet,const PptSlidePersistEntry * pMasterPersist)2935 void SdrPowerPointImport::ImportPage( SdrPage* pRet, const PptSlidePersistEntry* pMasterPersist )
2936 {
2937 sal_uInt32 nMerk = rStCtrl.Tell();
2938 PptSlidePersistList* pList = GetPageList( eAktPageKind );
2939 if ( ( !pList ) || ( pList->Count() <= nAktPageNum ) )
2940 return;
2941 PptSlidePersistEntry& rSlidePersist = *(*pList)[ nAktPageNum ];
2942 if ( rSlidePersist.bStarDrawFiller )
2943 return;
2944
2945 DffRecordHeader aPageHd;
2946 if ( SeekToAktPage( &aPageHd ) )
2947 {
2948 if ( mbTracing )
2949 mpTracer->AddAttribute( eAktPageKind == PPT_SLIDEPAGE
2950 ? rtl::OUString::createFromAscii( "Page" )
2951 : rtl::OUString::createFromAscii( "NotesPage" ),
2952 rtl::OUString::valueOf( (sal_Int32)nAktPageNum + 1 ) );
2953
2954 rSlidePersist.pHeaderFooterEntry = new HeaderFooterEntry( pMasterPersist );
2955 ProcessData aProcessData( rSlidePersist, (SdPage*)pRet );
2956 sal_Size nLastPosition;
2957 while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPageHd.GetRecEndFilePos() ) )
2958 {
2959 nLastPosition = rStCtrl.Tell();
2960 DffRecordHeader aHd;
2961 rStCtrl >> aHd;
2962 switch ( aHd.nRecType )
2963 {
2964 case PPT_PST_HeadersFooters :
2965 {
2966 ImportHeaderFooterContainer( aHd, *rSlidePersist.pHeaderFooterEntry );
2967 }
2968 break;
2969
2970 case PPT_PST_ProgTags :
2971 {
2972 DffRecordHeader aContentDataHd;
2973 if ( SeekToContentOfProgTag( 10, rStCtrl, aHd, aContentDataHd ) )
2974 {
2975 DffRecordHeader aComment10Hd;
2976 while( ( rStCtrl.GetError() == 0 ) && SeekToRec( rStCtrl, PPT_PST_Comment10, aContentDataHd.GetRecEndFilePos(), &aComment10Hd ) )
2977 {
2978 ImportComment10( *this, rStCtrl, pRet, aComment10Hd );
2979 aComment10Hd.SeekToEndOfRecord( rStCtrl );
2980 }
2981 }
2982 }
2983 break;
2984
2985 case PPT_PST_PPDrawing :
2986 {
2987 DffRecordHeader aPPDrawHd;
2988 if ( SeekToRec( rStCtrl, DFF_msofbtDgContainer, aHd.GetRecEndFilePos(), &aPPDrawHd ) )
2989 {
2990 sal_uInt32 nPPDrawOfs = rStCtrl.Tell();
2991
2992 // importing the background object before importing the page
2993 while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPPDrawHd.GetRecEndFilePos() ) )
2994 {
2995 DffRecordHeader aEscherObjListHd;
2996 rStCtrl >> aEscherObjListHd;
2997 switch ( aEscherObjListHd.nRecType )
2998 {
2999 case DFF_msofbtSpContainer :
3000 {
3001 Rectangle aPageSize( Point(), pRet->GetSize() );
3002 if ( rSlidePersist.aSlideAtom.nFlags & 4 ) // follow master background ?
3003 {
3004 if ( HasMasterPage( nAktPageNum, eAktPageKind ) )
3005 {
3006 sal_uInt16 nMasterNum = GetMasterPageIndex( nAktPageNum, eAktPageKind );
3007 PptSlidePersistList* pPageList = GetPageList( PPT_MASTERPAGE );
3008 PptSlidePersistEntry* pE = (*pPageList)[ nMasterNum ];
3009 while( ( pE->aSlideAtom.nFlags & 4 ) && pE->aSlideAtom.nMasterId )
3010 {
3011 sal_uInt16 nNextMaster = pMasterPages->FindPage( pE->aSlideAtom.nMasterId );
3012 if ( nNextMaster == PPTSLIDEPERSIST_ENTRY_NOTFOUND )
3013 break;
3014 else
3015 pE = (*pPageList)[ nNextMaster ];
3016 }
3017 if ( pE->nBackgroundOffset )
3018 {
3019 // do not follow master colorscheme ?
3020 sal_Bool bTemporary = ( rSlidePersist.aSlideAtom.nFlags & 2 ) != 0;
3021 sal_uInt32 nPos = rStCtrl.Tell();
3022 rStCtrl.Seek( pE->nBackgroundOffset );
3023 rSlidePersist.pBObj = ImportObj( rStCtrl, (void*)&aProcessData, aPageSize, aPageSize );
3024 rSlidePersist.bBObjIsTemporary = bTemporary;
3025 rStCtrl.Seek( nPos );
3026 }
3027 }
3028 }
3029 else
3030 {
3031 DffRecordHeader aShapeHd;
3032 rStCtrl >> aShapeHd;
3033 if ( aShapeHd.nRecType == DFF_msofbtSp )
3034 {
3035 sal_uInt32 nSpFlags;
3036 rStCtrl >> nSpFlags >> nSpFlags;
3037 if ( nSpFlags & SP_FBACKGROUND )
3038 {
3039 aEscherObjListHd.SeekToBegOfRecord( rStCtrl );
3040 rSlidePersist.pBObj = ImportObj( rStCtrl, (void*)&aProcessData, aPageSize, aPageSize );
3041 rSlidePersist.bBObjIsTemporary = sal_False;
3042 }
3043 }
3044 }
3045 }
3046 break;
3047 }
3048 if ( aEscherObjListHd.nRecType == DFF_msofbtSpContainer )
3049 break;
3050 aEscherObjListHd.SeekToEndOfRecord( rStCtrl );
3051 }
3052
3053 // now importing page
3054 rStCtrl.Seek( nPPDrawOfs );
3055 while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aPPDrawHd.GetRecEndFilePos() ) )
3056 {
3057 DffRecordHeader aEscherObjListHd;
3058 rStCtrl >> aEscherObjListHd;
3059 switch ( aEscherObjListHd.nRecType )
3060 {
3061 case DFF_msofbtSpgrContainer :
3062 {
3063 DffRecordHeader aShapeHd;
3064 if ( SeekToRec( rStCtrl, DFF_msofbtSpContainer, aEscherObjListHd.GetRecEndFilePos(), &aShapeHd ) )
3065 {
3066 sal_Size nShapeLastPosition;
3067 aShapeHd.SeekToEndOfRecord( rStCtrl );
3068 while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < aEscherObjListHd.GetRecEndFilePos() ) )
3069 {
3070 nShapeLastPosition = rStCtrl.Tell();
3071 rStCtrl >> aShapeHd;
3072 if ( ( aShapeHd.nRecType == DFF_msofbtSpContainer ) || ( aShapeHd.nRecType == DFF_msofbtSpgrContainer ) )
3073 {
3074 Rectangle aEmpty;
3075 aShapeHd.SeekToBegOfRecord( rStCtrl );
3076 sal_Int32 nShapeId;
3077 aProcessData.pTableRowProperties = NULL;
3078 SdrObject* pObj = ImportObj( rStCtrl, (void*)&aProcessData, aEmpty, aEmpty, 0, &nShapeId );
3079 if ( pObj )
3080 {
3081 if ( aProcessData.pTableRowProperties )
3082 pObj = CreateTable( pObj, aProcessData.pTableRowProperties, aProcessData.rPersistEntry.pSolverContainer );
3083
3084 pRet->NbcInsertObject( pObj );
3085
3086 if( nShapeId )
3087 insertShapeId( nShapeId, pObj );
3088 }
3089 }
3090 aShapeHd.SeekToEndOfRecord( rStCtrl );
3091 if (rStCtrl.Tell() == nShapeLastPosition) {
3092 // We are inside an endless loop
3093 break;
3094 }
3095 }
3096 }
3097 }
3098 break;
3099 }
3100 if ( aEscherObjListHd.nRecType == DFF_msofbtSpgrContainer )
3101 break;
3102 aEscherObjListHd.SeekToEndOfRecord( rStCtrl );
3103 }
3104
3105 /* There are a lot of Shapes who are dependent to
3106 the current background color */
3107 if ( rSlidePersist.ePageKind == PPT_SLIDEPAGE )
3108 {
3109 List* pList2 = aProcessData.pBackgroundColoredObjects;
3110 if ( pList2 )
3111 {
3112 if ( rSlidePersist.pBObj )
3113 {
3114 void* pPtr;
3115 const SfxPoolItem* pPoolItem = NULL;
3116 const SfxItemSet& rObjectItemSet = rSlidePersist.pBObj->GetMergedItemSet();
3117
3118 //SfxItemState eState = rObjectItemSet.GetItemState( XATTR_FILLCOLOR, sal_False, &pPoolItem );
3119 if ( pPoolItem )
3120 {
3121 SfxItemSet aNewSet(*rObjectItemSet.GetPool());
3122 aNewSet.Put(*pPoolItem);
3123 aNewSet.Put(XFillStyleItem( XFILL_SOLID ));
3124
3125 for ( pPtr = pList2->First(); pPtr; pPtr = pList2->Next() )
3126 {
3127 ((SdrObject*)pPtr)->SetMergedItemSet(aNewSet);
3128 }
3129 }
3130 }
3131 }
3132 }
3133 if ( rSlidePersist.pBObj )
3134 {
3135 // #i99386# transfer the attributes from the temporary BackgroundObject
3136 // to the Page and delete it. Maybe rSlidePersist.bBObjIsTemporary is
3137 // obsolete here, too.
3138 pRet->getSdrPageProperties().ClearItem();
3139 pRet->getSdrPageProperties().PutItemSet(rSlidePersist.pBObj->GetMergedItemSet());
3140 SdrObject::Free( rSlidePersist.pBObj );
3141 }
3142 }
3143 }
3144 break;
3145 }
3146 aHd.SeekToEndOfRecord( rStCtrl );
3147 if (rStCtrl.Tell() == nLastPosition) {
3148 // We are inside an endless loop
3149 break;
3150 }
3151 }
3152 if ( rSlidePersist.pSolverContainer )
3153 SolveSolver( *rSlidePersist.pSolverContainer );
3154 if ( mbTracing )
3155 mpTracer->RemoveAttribute( eAktPageKind == PPT_SLIDEPAGE
3156 ? rtl::OUString::createFromAscii( "Page" )
3157 : rtl::OUString::createFromAscii( "NotesPage" ) );
3158 }
3159 rStCtrl.Seek( nMerk );
3160 }
3161
GetSlideLayoutAtom() const3162 const PptSlideLayoutAtom* SdrPowerPointImport::GetSlideLayoutAtom() const
3163 {
3164 PptSlidePersistList* pPageList = GetPageList( eAktPageKind );
3165 if ( pPageList && nAktPageNum < pPageList->Count() )
3166 {
3167 PptSlidePersistEntry* pE = (*pPageList)[ nAktPageNum ];
3168 if ( pE )
3169 return &pE->aSlideAtom.aLayout;
3170 }
3171 return NULL;
3172 }
3173
IsNoteOrHandout(sal_uInt16 nPageNum,PptPageKind) const3174 sal_Bool SdrPowerPointImport::IsNoteOrHandout( sal_uInt16 nPageNum, PptPageKind /*ePageKind*/) const
3175 {
3176 sal_Bool bNote = eAktPageKind == PPT_NOTEPAGE;
3177 if ( eAktPageKind == PPT_MASTERPAGE )
3178 bNote = ( nPageNum & 1 ) == 0;
3179 return bNote;
3180 }
3181
GetMasterPageId(sal_uInt16 nPageNum,PptPageKind ePageKind) const3182 sal_uInt32 SdrPowerPointImport::GetMasterPageId( sal_uInt16 nPageNum, PptPageKind ePageKind ) const
3183 {
3184 PptSlidePersistList* pPageList = GetPageList( ePageKind );
3185 if ( pPageList && nPageNum < pPageList->Count() )
3186 return (*pPageList)[ nPageNum ]->aSlideAtom.nMasterId;
3187 return 0;
3188 }
3189
GetNotesPageId(sal_uInt16 nPageNum) const3190 sal_uInt32 SdrPowerPointImport::GetNotesPageId( sal_uInt16 nPageNum ) const
3191 {
3192 PptSlidePersistList* pPageList=GetPageList( PPT_SLIDEPAGE );
3193 if ( pPageList && nPageNum < pPageList->Count() )
3194 return (*pPageList)[ nPageNum ]->aSlideAtom.nNotesId;
3195 return 0;
3196 }
3197
HasMasterPage(sal_uInt16 nPageNum,PptPageKind ePageKind) const3198 sal_Bool SdrPowerPointImport::HasMasterPage( sal_uInt16 nPageNum, PptPageKind ePageKind ) const
3199 {
3200 if ( ePageKind == PPT_NOTEPAGE )
3201 return aDocAtom.nNotesMasterPersist != 0;
3202 if ( ePageKind == PPT_MASTERPAGE )
3203 return sal_False;
3204 return GetMasterPageId( nPageNum, ePageKind ) != 0;
3205 }
3206
GetMasterPageIndex(sal_uInt16 nPageNum,PptPageKind ePageKind) const3207 sal_uInt16 SdrPowerPointImport::GetMasterPageIndex( sal_uInt16 nPageNum, PptPageKind ePageKind ) const
3208 {
3209 sal_uInt16 nIdx = 0;
3210 if ( ePageKind == PPT_NOTEPAGE )
3211 return 2;
3212 sal_uInt32 nId = GetMasterPageId( nPageNum, ePageKind );
3213 if ( nId && pMasterPages )
3214 {
3215 nIdx = pMasterPages->FindPage( nId );
3216 if ( nIdx == PPTSLIDEPERSIST_ENTRY_NOTFOUND )
3217 nIdx = 0;
3218 }
3219 return nIdx;
3220 }
3221
ImportPageBackgroundObject(const SdrPage & rPage,sal_uInt32 & nBgFileOffset,sal_Bool bForce)3222 SdrObject* SdrPowerPointImport::ImportPageBackgroundObject( const SdrPage& rPage, sal_uInt32& nBgFileOffset, sal_Bool bForce )
3223 {
3224 SdrObject* pRet = NULL;
3225 sal_Bool bCreateObj = bForce;
3226 SfxItemSet* pSet = NULL;
3227 sal_uLong nFPosMerk = rStCtrl.Tell(); // FilePos merken fuer spaetere Restauration
3228 DffRecordHeader aPageHd;
3229 if ( SeekToAktPage( &aPageHd ) )
3230 { // und nun die Hintergrundattribute der Page suchen
3231 sal_uLong nPageRecEnd = aPageHd.GetRecEndFilePos();
3232 DffRecordHeader aPPDrawHd;
3233 if ( SeekToRec( rStCtrl, PPT_PST_PPDrawing, nPageRecEnd, &aPPDrawHd ) )
3234 {
3235 sal_uLong nPPDrawEnd = aPPDrawHd.GetRecEndFilePos();
3236 DffRecordHeader aEscherF002Hd;
3237 if ( SeekToRec( rStCtrl, DFF_msofbtDgContainer, nPPDrawEnd, &aEscherF002Hd ) )
3238 {
3239 sal_uLong nEscherF002End = aEscherF002Hd.GetRecEndFilePos();
3240 DffRecordHeader aEscherObjectHd;
3241 if ( SeekToRec( rStCtrl, DFF_msofbtSpContainer, nEscherF002End, &aEscherObjectHd ) )
3242 {
3243 nBgFileOffset = aEscherObjectHd.GetRecBegFilePos();
3244 //sal_uLong nEscherObjectEnd = aEscherObjectHd.GetRecEndFilePos();
3245 //DffRecordHeader aEscherPropertiesHd;
3246 if ( SeekToRec( rStCtrl, DFF_msofbtOPT,nEscherF002End ) )
3247 {
3248 rStCtrl >> (DffPropertyReader&)*this;
3249 mnFix16Angle = Fix16ToAngle( GetPropertyValue( DFF_Prop_Rotation, 0 ) );
3250 sal_uInt32 nColor = GetPropertyValue( DFF_Prop_fillColor, 0xffffff );
3251 pSet = new SfxItemSet( pSdrModel->GetItemPool() );
3252 DffObjData aObjData( aEscherObjectHd, Rectangle( 0, 0, 28000, 21000 ), 0 );
3253 ApplyAttributes( rStCtrl, *pSet, aObjData );
3254 Color aColor( MSO_CLR_ToColor( nColor ) );
3255 pSet->Put( XFillColorItem( String(), aColor ) );
3256 }
3257 }
3258 }
3259 }
3260 }
3261 rStCtrl.Seek( nFPosMerk ); // FilePos restaurieren
3262 if ( bCreateObj )
3263 {
3264 if ( !pSet )
3265 {
3266 pSet = new SfxItemSet( pSdrModel->GetItemPool() );
3267 pSet->Put( XFillStyleItem( XFILL_NONE ) );
3268 }
3269 pSet->Put( XLineStyleItem( XLINE_NONE ) );
3270 Rectangle aRect( rPage.GetLftBorder(), rPage.GetUppBorder(), rPage.GetWdt()-rPage.GetRgtBorder(), rPage.GetHgt()-rPage.GetLwrBorder() );
3271 pRet = new SdrRectObj( aRect );
3272 pRet->SetModel( pSdrModel );
3273
3274 pRet->SetMergedItemSet(*pSet);
3275
3276 pRet->SetMarkProtect( sal_True );
3277 pRet->SetMoveProtect( sal_True );
3278 pRet->SetResizeProtect( sal_True );
3279 }
3280 delete pSet;
3281 return pRet;
3282 }
3283
3284 ////////////////////////////////////////////////////////////////////////////////////////////////////
3285
HeaderFooterEntry(const PptSlidePersistEntry * pMPE)3286 HeaderFooterEntry::HeaderFooterEntry( const PptSlidePersistEntry* pMPE ) :
3287 pMasterPersist ( pMPE ),
3288 nAtom ( 0 )
3289 {
3290 if ( pMPE )
3291 {
3292 HeaderFooterEntry* pMHFE = pMPE->pHeaderFooterEntry;
3293 if ( pMHFE )
3294 {
3295 nAtom = pMPE->pHeaderFooterEntry->nAtom;
3296 pPlaceholder[ 0 ] = pMHFE->pPlaceholder[ 0 ];
3297 pPlaceholder[ 1 ] = pMHFE->pPlaceholder[ 1 ];
3298 pPlaceholder[ 2 ] = pMHFE->pPlaceholder[ 2 ];
3299 pPlaceholder[ 3 ] = pMHFE->pPlaceholder[ 3 ];
3300 }
3301 }
3302 }
3303
~HeaderFooterEntry()3304 HeaderFooterEntry::~HeaderFooterEntry()
3305 {
3306 }
3307
GetMaskForInstance(sal_uInt32 nInstance)3308 sal_uInt32 HeaderFooterEntry::GetMaskForInstance( sal_uInt32 nInstance )
3309 {
3310 sal_uInt32 nRet = 0;
3311 switch ( nInstance )
3312 {
3313 case 0 : nRet = 0x07ffff; break;
3314 case 1 : nRet = 0x100000; break;
3315 case 2 : nRet = 0x200000; break;
3316 case 3 : nRet = 0x080000; break;
3317 }
3318 return nRet;
3319 }
3320
IsToDisplay(sal_uInt32 nInstance)3321 sal_uInt32 HeaderFooterEntry::IsToDisplay( sal_uInt32 nInstance )
3322 {
3323 sal_uInt32 nMask = 0;
3324 switch ( nInstance )
3325 {
3326 case 0 : nMask = 0x010000; break;
3327 case 1 : nMask = 0x100000; break;
3328 case 2 : nMask = 0x200000; break;
3329 case 3 : nMask = 0x080000; break;
3330 }
3331 return ( nAtom & nMask );
3332 }
3333
3334 // The following method checks if the slide is using a different colorscheme than
3335 // its master, if this is the fact, then the HeaderFooter must probably be
3336 // imported as real sdrobject. In this case, the return value is the offset to the
3337 // master header footer object, so it can be re-loaded with a different color set
NeedToImportInstance(const sal_uInt32 nInstance,const PptSlidePersistEntry & rSlidePersist)3338 sal_uInt32 HeaderFooterEntry::NeedToImportInstance( const sal_uInt32 nInstance, const PptSlidePersistEntry& rSlidePersist )
3339 {
3340 sal_uInt32 nRet = 0;
3341 if ( pMasterPersist )
3342 {
3343 if ( !( rSlidePersist.aSlideAtom.nFlags & 2 ) )
3344 { // not following the master persist, so we have to check if the colors are changed
3345 if ( memcmp( &rSlidePersist.aColorScheme, &pMasterPersist->aColorScheme, 32 ) )
3346 {
3347 nRet = pMasterPersist->HeaderFooterOfs[ nInstance ];
3348 }
3349 }
3350 }
3351 return nRet;
3352 }
3353
ImportHeaderFooterContainer(DffRecordHeader & rHd,HeaderFooterEntry & rE)3354 void SdrEscherImport::ImportHeaderFooterContainer( DffRecordHeader& rHd, HeaderFooterEntry& rE )
3355 {
3356 rHd.SeekToContent( rStCtrl );
3357 while ( ( rStCtrl.GetError() == 0 ) && ( rStCtrl.Tell() < rHd.GetRecEndFilePos() ) )
3358 {
3359 DffRecordHeader aHd;
3360 rStCtrl >> aHd;
3361 switch ( aHd.nRecType )
3362 {
3363 case PPT_PST_HeadersFootersAtom :
3364 rStCtrl >> rE.nAtom;
3365 break;
3366
3367 case PPT_PST_CString :
3368 {
3369 if ( aHd.nRecInstance < 4 )
3370 MSDFFReadZString( rStCtrl, rE.pPlaceholder[ aHd.nRecInstance ], aHd.nRecLen, sal_True );
3371 }
3372 break;
3373 }
3374 aHd.SeekToEndOfRecord( rStCtrl );
3375 }
3376 }
3377
3378 //static sal_Unicode PPTExportMapper( sal_Unicode nUni, sal_Bool& bNeedsStarBats )
3379 //{
3380 // bNeedsStarBats = sal_False;
3381 //
3382 // sal_Unicode cLo, cReplace;
3383 // cLo = cReplace = 0;
3384 // switch ( nUni )
3385 // {
3386 // case 132 : cLo = 175; break;
3387 // case 147 : cLo = 174; break;
3388 // // Currency
3389 // case 0x00A2: cReplace = 224; break;
3390 // case 0x00A4: cReplace = 225; break;
3391 // case 0x00A5: cReplace = 226; break;
3392 // case 0x20A1: cReplace = 228; break;
3393 // case 0x20A2: cReplace = 229; break;
3394 // case 0x20A3: cReplace = 230; break;
3395 // case 0x20A4: cReplace = 231; break;
3396 // case 0x20A7: cReplace = 227; break;
3397 // case 0x20A8: cReplace = 234; break;
3398 // case 0x20A9: cReplace = 232; break;
3399 // case 0x20AB: cReplace = 233; break;
3400 // case 0x20AC: cReplace = 128; break;
3401 // // Punctuation and other
3402 // case 0x201A: cReplace = 130; break; // SINGLE LOW-9 QUOTATION MARK
3403 // case 0x0192: cReplace = 131; break; // LATIN SMALL LETTER F WITH HOOK
3404 // case 0x201E: // DOUBLE LOW-9 QUOTATION MARK
3405 // case 0x301F: // LOW DOUBLE PRIME QUOTATION MARK
3406 // cReplace = 132; break;
3407 // case 0x2026: cReplace = 133; break; // HORIZONTAL ELLIPSES
3408 // case 0x2020: cReplace = 134; break; // DAGGER
3409 // case 0x2021: cReplace = 135; break; // DOUBLE DAGGER
3410 // case 0x02C6: cReplace = 136; break; // MODIFIER LETTER CIRCUMFLEX ACCENT
3411 // case 0x2030: cReplace = 137; break; // PER MILLE SIGN
3412 // case 0x0160: cReplace = 138; break; // LATIN CAPITAL LETTER S WITH CARON
3413 // case 0x2039: cReplace = 139; break; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
3414 // case 0x0152: cReplace = 140; break; // LATIN CAPITAL LIGATURE OE
3415 // case 0x017D: cReplace = 142; break; // LATIN CAPITAL LETTER Z WITH CARON
3416 // case 0x2018: // LEFT SINGLE QUOTATION MARK
3417 // case 0x02BB: // MODIFIER LETTER TURNED COMMA
3418 // cReplace = 145; break;
3419 // case 0x2019: // RIGHT SINGLE QUOTATION MARK
3420 // case 0x02BC: // MODIFIER LETTER APOSTROPHE
3421 // cReplace = 146; break;
3422 // case 0x201C: // LEFT DOUBLE QUOTATION MARK
3423 // case 0x301D: // REVERSED DOUBLE PRIME QUOTATION MARK
3424 // cReplace = 147; break;
3425 // case 0x201D: // RIGHT DOUBLE QUOTATION MARK
3426 // case 0x301E: // REVERSED DOUBLE PRIME QUOTATION MARK
3427 // cReplace = 148; break;
3428 // case 0x2022: cReplace = 149; break; // BULLET
3429 // case 0x2013: cReplace = 150; break; // EN DASH
3430 // case 0x2014: cReplace = 151; break; // EM DASH
3431 // case 0x02DC: cReplace = 152; break; // SMALL TILDE
3432 // case 0x2122: cReplace = 153; break; // TRADE MARK SIGN
3433 // case 0x0161: cReplace = 154; break; // LATIN SMALL LETTER S WITH CARON
3434 // case 0x203A: cReplace = 155; break; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
3435 // case 0x0153: cReplace = 156; break; // LATIN SMALL LIGATURE OE
3436 // case 0x017E: cReplace = 158; break; // LATIN SMALL LETTER Z WITH CARON
3437 // case 0x0178: cReplace = 159; break; // LATIN CAPITAL LETTER Y WITH DIAERESIS
3438 // case 0x00B6: cReplace = 222; break; // PILCROW SIGN / PARAGRAPH SIGN
3439 // }
3440 // if ( cReplace )
3441 // {
3442 // bNeedsStarBats = sal_True;
3443 // return cReplace;
3444 // }
3445 // else
3446 // return cLo;
3447 //}
3448
3449 // no longer needed
PPTSubstitute(sal_uInt16,sal_Unicode,sal_uInt32 &,Font &,char) const3450 sal_Unicode SdrPowerPointImport::PPTSubstitute( sal_uInt16 /*nFont*/, sal_Unicode /*nChar*/,
3451 sal_uInt32& /*nMappedFontId*/, Font& /*rFont*/, char /*nDefault*/) const
3452 {
3453 return 0;
3454 }
3455
3456 ////////////////////////////////////////////////////////////////////////////////////////////////////
3457
PPTBuGraEntry(Graphic & rGraphic,sal_uInt32 nInst)3458 PPTBuGraEntry::PPTBuGraEntry( Graphic& rGraphic, sal_uInt32 nInst ) :
3459 nInstance ( nInst ),
3460 aBuGra ( rGraphic ) {}
3461
PPTExtParaLevel()3462 PPTExtParaLevel::PPTExtParaLevel()
3463 : mnExtParagraphMask( 0 )
3464 , mnBuBlip( 0xffff )
3465 , mnHasAnm( 0 )
3466 , mnAnmScheme( 0 )
3467 , mpfPP10Ext( 0 )
3468 , mnExtCharacterMask( 0 )
3469 , mcfPP10Ext( 0 )
3470 , mbSet( sal_False )
3471 {}
3472
operator >>(SvStream & rIn,PPTExtParaLevel & rLevel)3473 SvStream& operator>>( SvStream& rIn, PPTExtParaLevel& rLevel )
3474 {
3475 rLevel.mbSet = sal_True;
3476 rIn >> rLevel.mnExtParagraphMask;
3477 if ( rLevel.mnExtParagraphMask & 0x00800000 )
3478 rIn >> rLevel.mnBuBlip;
3479 if ( rLevel.mnExtParagraphMask & 0x02000000 )
3480 rIn >> rLevel.mnHasAnm;
3481 if ( rLevel.mnExtParagraphMask & 0x01000000 )
3482 rIn >> rLevel.mnAnmScheme;
3483 if ( rLevel.mnExtParagraphMask & 0x04000000 )
3484 rIn >> rLevel.mpfPP10Ext;
3485 rIn >> rLevel.mnExtCharacterMask;
3486 if ( rLevel.mnExtCharacterMask & 0x100000 )
3487 rIn >> rLevel.mcfPP10Ext;
3488 return rIn;
3489 }
3490
GetGraphic(sal_uInt32 nInstance,Graphic & rGraph) const3491 sal_Bool PPTExtParaProv::GetGraphic( sal_uInt32 nInstance, Graphic& rGraph ) const
3492 {
3493 sal_Bool bRetValue = sal_False;
3494 PPTBuGraEntry* pPtr = NULL;
3495 if ( nInstance < aBuGraList.Count() )
3496 {
3497 pPtr = (PPTBuGraEntry*)aBuGraList.GetObject( nInstance );
3498 if ( pPtr->nInstance == nInstance )
3499 bRetValue = sal_True;
3500 }
3501 if ( !bRetValue )
3502 {
3503 sal_uInt32 i;
3504 for ( i = 0; i < aBuGraList.Count(); i++ )
3505 {
3506 pPtr = (PPTBuGraEntry*)aBuGraList.GetObject( i );
3507 if ( pPtr->nInstance == nInstance )
3508 {
3509 bRetValue = sal_True;
3510 break;
3511 }
3512 }
3513 }
3514 if ( bRetValue )
3515 rGraph = pPtr->aBuGra;
3516 return bRetValue;
3517 }
3518
PPTExtParaProv(SdrPowerPointImport & rMan,SvStream & rSt,const DffRecordHeader * pHd)3519 PPTExtParaProv::PPTExtParaProv( SdrPowerPointImport& rMan, SvStream& rSt, const DffRecordHeader* pHd ) :
3520 bStyles ( sal_False ),
3521 bGraphics ( sal_False )
3522 {
3523 sal_uInt32 nOldPos = rSt.Tell();
3524
3525 // here we have to get the graphical bullets...
3526
3527 DffRecordHeader aHd;
3528 DffRecordHeader aContentDataHd;
3529
3530 const DffRecordHeader* pListHd = rMan.aDocRecManager.GetRecordHeader( PPT_PST_List, SEEK_FROM_BEGINNING );
3531 while( pListHd )
3532 {
3533 pListHd->SeekToContent( rSt );
3534 if ( !rMan.SeekToContentOfProgTag( 9, rSt, *pListHd, aContentDataHd ) )
3535 break;
3536 while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aContentDataHd.GetRecEndFilePos() ) )
3537 {
3538 rSt >> aHd;
3539 switch ( aHd.nRecType )
3540 {
3541 case PPT_PST_ExtendedBuGraContainer :
3542 {
3543 while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aHd.GetRecEndFilePos() ) )
3544 {
3545 sal_uInt16 nType;
3546 DffRecordHeader aBuGraAtomHd;
3547 rSt >> aBuGraAtomHd;
3548 if ( aBuGraAtomHd.nRecType == PPT_PST_ExtendedBuGraAtom )
3549 {
3550 rSt >> nType;
3551 Graphic aGraphic;
3552 if ( rMan.GetBLIPDirect( rSt, aGraphic, NULL ) )
3553 {
3554 sal_uInt32 nInstance = aBuGraAtomHd.nRecInstance;
3555 PPTBuGraEntry* pBuGra = new PPTBuGraEntry( aGraphic, nInstance );
3556 sal_uInt32 n = 0;
3557 sal_uInt32 nBuGraCount = aBuGraList.Count();
3558 if ( nBuGraCount )
3559 {
3560 if ( ( (PPTBuGraEntry*)aBuGraList.GetObject( nBuGraCount - 1 ) )->nInstance < nInstance )
3561 n = nBuGraCount;
3562 else
3563 { // maybe the instances are not sorted, we sort it
3564 for ( n = 0; n < nBuGraCount; n++ )
3565 { // sorting fields ( hi >> lo )
3566 if ( ( (PPTBuGraEntry*)aBuGraList.GetObject( n ) )->nInstance < nInstance )
3567 break;
3568 }
3569 }
3570 }
3571 aBuGraList.Insert( pBuGra, (sal_uInt32)n );
3572 }
3573 #ifdef DBG_UTIL
3574 else DBG_ERROR( "PPTExParaProv::PPTExParaProv - bullet graphic is not valid (SJ)" );
3575 #endif
3576 }
3577 #ifdef DBG_UTIL
3578 else DBG_ERROR( "PPTExParaProv::PPTExParaProv - unknown atom interpreting the PPT_PST_ExtendedBuGraContainer (SJ)" );
3579 #endif
3580 aBuGraAtomHd.SeekToEndOfRecord( rSt );
3581 }
3582 if ( aBuGraList.Count() )
3583 bGraphics = sal_True;
3584 }
3585 break;
3586
3587 case PPT_PST_ExtendedPresRuleContainer :
3588 aExtendedPresRules.Consume( rSt, sal_False, aHd.GetRecEndFilePos() );
3589 break;
3590 #ifdef DBG_UTIL
3591 default :
3592 DBG_ERROR( "PPTExParaProv::PPTExParaProv - unknown atom reading ppt2000 num rules (SJ)" );
3593 case PPT_PST_MasterText : // first seen in: ms-tt02.ppt
3594 case PPT_PST_SrKinsoku :
3595 case PPT_PST_NewlyAddedAtom4016 :
3596 case PPT_PST_NewlyAddedAtomByPPT2000_6010 :
3597 case PPT_PST_NewlyAddedAtomByPPT2000_6011 :
3598 case PPT_PST_NewlyAddedAtomByXP1037 :
3599 case PPT_PST_NewlyAddedAtomByXP12004 :
3600 case PPT_PST_NewlyAddedAtomByXP14001 :
3601 break;
3602 #endif
3603 }
3604 aHd.SeekToEndOfRecord( rSt );
3605 }
3606 break;
3607 }
3608
3609 while( pHd )
3610 { // get the extended paragraph styles on mainmaster ( graphical bullets, num ruling ... )
3611 if ( !rMan.SeekToContentOfProgTag( 9, rSt, *pHd, aContentDataHd ) )
3612 break;
3613 while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aContentDataHd.GetRecEndFilePos() ) )
3614 {
3615 rSt >> aHd;
3616 switch ( aHd.nRecType )
3617 {
3618 case PPT_PST_ExtendedParagraphMasterAtom :
3619 {
3620 if ( aHd.nRecInstance < PPT_STYLESHEETENTRYS )
3621 {
3622 sal_uInt16 nDepth, i = 0;
3623 rSt >> nDepth;
3624 if ( i <= 5 )
3625 {
3626
3627 while ( ( rSt.GetError() == 0 ) && ( rSt.Tell() < aHd.GetRecEndFilePos() ) && ( i < nDepth ) )
3628 {
3629 bStyles = sal_True;
3630 rSt >> aExtParaSheet[ aHd.nRecInstance ].aExtParaLevel[ i++ ];
3631 }
3632 #ifdef DBG_UTIL
3633 if ( rSt.Tell() != aHd.GetRecEndFilePos() )
3634 DBG_ERROR( "PPTExParaProv::PPTExParaProv - error reading PPT_PST_ExtendedParagraphMasterAtom (SJ)" );
3635 #endif
3636 }
3637 #ifdef DBG_UTIL
3638 else DBG_ERROR( "PPTExParaProv::PPTExParaProv - depth is greater than 5 (SJ)" );
3639 #endif
3640 }
3641 #ifdef DBG_UTIL
3642 else DBG_ERROR( "PPTExParaProv::PPTExParaProv - instance out of range (SJ)" );
3643 #endif
3644 }
3645 break;
3646 default :
3647 DBG_ERROR( "PPTExParaProv::PPTExParaProv - unknown atom, assuming PPT_PST_ExtendedParagraphMasterAtom (SJ)" );
3648 case PPT_PST_NewlyAddedAtomByXP11008 :
3649 case PPT_PST_NewlyAddedAtomByXP11010 :
3650 case PPT_PST_NewlyAddedAtomByXP12010 :
3651 case PPT_PST_NewlyAddedAtomByXP12011 :
3652 case 0xf144 :
3653 break;
3654 }
3655 aHd.SeekToEndOfRecord( rSt );
3656 }
3657 break;
3658 }
3659 rSt.Seek( nOldPos );
3660 }
3661
~PPTExtParaProv()3662 PPTExtParaProv::~PPTExtParaProv()
3663 {
3664 void* pPtr;
3665 for ( pPtr = aBuGraList.First(); pPtr; pPtr = aBuGraList.Next() )
3666 delete (PPTBuGraEntry*)pPtr;
3667 }
3668
3669 ////////////////////////////////////////////////////////////////////////////////////////////////////
3670
PPTNumberFormatCreator(PPTExtParaProv * pParaProv)3671 PPTNumberFormatCreator::PPTNumberFormatCreator( PPTExtParaProv* pParaProv ) :
3672 pExtParaProv ( pParaProv )
3673 {
3674 }
3675
~PPTNumberFormatCreator()3676 PPTNumberFormatCreator::~PPTNumberFormatCreator()
3677 {
3678 delete pExtParaProv;
3679 }
3680
ImplGetExtNumberFormat(SdrPowerPointImport & rManager,SvxNumberFormat & rNumberFormat,sal_uInt32 nLevel,sal_uInt32 nInstance,sal_uInt32 nDestinationInstance,boost::optional<sal_Int16> & rStartNumbering,sal_uInt32 nFontHeight,PPTParagraphObj * pPara)3681 sal_Bool PPTNumberFormatCreator::ImplGetExtNumberFormat( SdrPowerPointImport& rManager,
3682 SvxNumberFormat& rNumberFormat, sal_uInt32 nLevel, sal_uInt32 nInstance, sal_uInt32 nDestinationInstance,
3683 boost::optional< sal_Int16 >& rStartNumbering, sal_uInt32 nFontHeight, PPTParagraphObj* pPara )
3684 {
3685 sal_Bool bHardAttribute = ( nDestinationInstance == 0xffffffff );
3686
3687 sal_uInt32 nBuFlags = 0;
3688 sal_uInt16 nHasAnm = 0;
3689 sal_uInt32 nAnmScheme = 0x10003;
3690 sal_uInt16 nBuBlip = 0xffff;
3691
3692 const PPTExtParaProv* pParaProv = pExtParaProv;
3693 if ( !pExtParaProv )
3694 pParaProv = ( pPara ) ? pPara->mrStyleSheet.pExtParaProv
3695 : rManager.pPPTStyleSheet->pExtParaProv;
3696 if ( pPara )
3697 {
3698 nBuFlags = pPara->pParaSet->mnExtParagraphMask;
3699 if ( nBuFlags )
3700 {
3701 if ( nBuFlags & 0x00800000 )
3702 nBuBlip = pPara->pParaSet->mnBuBlip;
3703 if ( nBuFlags & 0x01000000 )
3704 nAnmScheme = pPara->pParaSet->mnAnmScheme;
3705 if ( nBuFlags & 0x02000000 )
3706 nHasAnm = pPara->pParaSet->mnHasAnm;
3707 bHardAttribute = sal_True;
3708 }
3709 }
3710
3711 if ( ( nBuFlags & 0x03800000 ) != 0x03800000 ) // merge style sheet
3712 { // we have to read the master attributes
3713 if ( pParaProv && ( nLevel < 5 ) )
3714 {
3715 if ( pParaProv->bStyles )
3716 {
3717 const PPTExtParaLevel& rLev = pParaProv->aExtParaSheet[ nInstance ].aExtParaLevel[ nLevel ];
3718 if ( rLev.mbSet )
3719 {
3720 sal_uInt32 nMaBuFlags = rLev.mnExtParagraphMask;
3721
3722 if ( (!( nBuFlags & 0x00800000)) && ( nMaBuFlags & 0x00800000 ) )
3723 {
3724 if (!( nBuFlags & 0x02000000)) // if there is a BuStart without BuInstance,
3725 nBuBlip = rLev.mnBuBlip; // then there is no graphical Bullet possible
3726 }
3727 if ( (!( nBuFlags & 0x01000000)) && ( nMaBuFlags & 0x01000000 ) )
3728 nAnmScheme = rLev.mnAnmScheme;
3729 if ( (!( nBuFlags & 0x02000000)) && ( nMaBuFlags & 0x02000000 ) )
3730 nHasAnm = rLev.mnHasAnm;
3731 nBuFlags |= nMaBuFlags;
3732 }
3733 }
3734 }
3735 }
3736 if ( nBuBlip != 0xffff ) // set graphical bullet
3737 {
3738 Graphic aGraphic;
3739 if ( pParaProv->GetGraphic( nBuBlip, aGraphic ) )
3740 {
3741 SvxBrushItem aBrush( aGraphic, GPOS_MM, SID_ATTR_BRUSH );
3742 rNumberFormat.SetGraphicBrush( &aBrush );
3743 sal_uInt32 nHeight = (sal_uInt32)( (double)nFontHeight * 0.2540 * nBulletHeight + 0.5 );
3744 Size aPrefSize( aGraphic.GetPrefSize() );
3745 sal_uInt32 nWidth = ( nHeight * aPrefSize.Width() ) / aPrefSize.Height();
3746 rNumberFormat.SetGraphicSize( Size( nWidth, nHeight ) );
3747 rNumberFormat.SetNumberingType ( SVX_NUM_BITMAP );
3748 }
3749 }
3750 else if ( nHasAnm )
3751 {
3752 switch( static_cast< sal_uInt16 >( nAnmScheme ) )
3753 {
3754 default :
3755 case 0 :
3756 {
3757 rNumberFormat.SetNumberingType( SVX_NUM_CHARS_LOWER_LETTER );
3758 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3759 }
3760 break;
3761 case 1 :
3762 {
3763 rNumberFormat.SetNumberingType( SVX_NUM_CHARS_UPPER_LETTER );
3764 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3765 }
3766 break;
3767 case 2 :
3768 {
3769 rNumberFormat.SetNumberingType( SVX_NUM_ARABIC );
3770 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3771 }
3772 break;
3773 case 3 :
3774 {
3775 rNumberFormat.SetNumberingType( SVX_NUM_ARABIC );
3776 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3777 }
3778 break;
3779 case 4 :
3780 {
3781 rNumberFormat.SetNumberingType( SVX_NUM_ROMAN_LOWER );
3782 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3783 rNumberFormat.SetPrefix( String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) );
3784 }
3785 break;
3786 case 5 :
3787 {
3788 rNumberFormat.SetNumberingType( SVX_NUM_ROMAN_LOWER );
3789 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3790 }
3791 break;
3792 case 6 :
3793 {
3794 rNumberFormat.SetNumberingType( SVX_NUM_ROMAN_LOWER );
3795 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3796 }
3797 break;
3798 case 7 :
3799 {
3800 rNumberFormat.SetNumberingType( SVX_NUM_ROMAN_UPPER );
3801 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3802 }
3803 break;
3804 case 8 :
3805 {
3806 rNumberFormat.SetNumberingType( SVX_NUM_CHARS_LOWER_LETTER );
3807 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3808 rNumberFormat.SetPrefix( String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) );
3809 }
3810 break;
3811 case 9 :
3812 {
3813 rNumberFormat.SetNumberingType( SVX_NUM_CHARS_LOWER_LETTER );
3814 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3815 }
3816 break;
3817 case 10 :
3818 {
3819 rNumberFormat.SetNumberingType( SVX_NUM_CHARS_UPPER_LETTER );
3820 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3821 rNumberFormat.SetPrefix( String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) );
3822 }
3823 break;
3824 case 11 :
3825 {
3826 rNumberFormat.SetNumberingType( SVX_NUM_CHARS_UPPER_LETTER );
3827 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3828 }
3829 break;
3830 case 12 :
3831 {
3832 rNumberFormat.SetNumberingType( SVX_NUM_ARABIC );
3833 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3834 rNumberFormat.SetPrefix( String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) );
3835 }
3836 break;
3837 case 13 :
3838 {
3839 rNumberFormat.SetNumberingType( SVX_NUM_ARABIC );
3840 }
3841 break;
3842 case 14 :
3843 {
3844 rNumberFormat.SetNumberingType( SVX_NUM_ROMAN_UPPER );
3845 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3846 rNumberFormat.SetPrefix( String( RTL_CONSTASCII_USTRINGPARAM( "(" ) ) );
3847 }
3848 break;
3849 case 15 :
3850 {
3851 rNumberFormat.SetNumberingType( SVX_NUM_ROMAN_UPPER );
3852 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( ")" ) ) );
3853 }
3854 break;
3855 case 16: // Simplified Chinese.
3856 {
3857 rNumberFormat.SetNumberingType( SVX_NUM_NUMBER_UPPER_ZH );
3858 }
3859 break;
3860 case 17: // Simplified Chinese with single-byte period.
3861 {
3862 rNumberFormat.SetNumberingType( SVX_NUM_NUMBER_UPPER_ZH );
3863 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3864 }
3865 break;
3866 case 18: // Double byte circle numbers.
3867 case 19: // Wingdings white circle numbers.
3868 case 20: // Wingdings black circle numbers.
3869 {
3870 rNumberFormat.SetNumberingType( SVX_NUM_CIRCLE_NUMBER );
3871 }
3872 break;
3873 case 21: // Traditional Chinese.
3874 {
3875 rNumberFormat.SetNumberingType( SVX_NUM_NUMBER_UPPER_ZH_TW );
3876 }
3877 break;
3878 case 22: // Traditional Chinese with single-byte period.
3879 {
3880 rNumberFormat.SetNumberingType( SVX_NUM_NUMBER_UPPER_ZH_TW );
3881 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3882 }
3883 break;
3884 case 26: // Japanese/Korean.
3885 {
3886 rNumberFormat.SetNumberingType( SVX_NUM_NUMBER_LOWER_ZH );
3887 }
3888 break;
3889 case 27: // Japanese/Korean with single-byte period.
3890 {
3891 rNumberFormat.SetNumberingType( SVX_NUM_NUMBER_LOWER_ZH );
3892 rNumberFormat.SetSuffix( String( RTL_CONSTASCII_USTRINGPARAM( "." ) ) );
3893 }
3894 break;
3895 case 28: // Double-byte Arabic numbers.
3896 {
3897 rNumberFormat.SetNumberingType( SVX_NUM_FULL_WIDTH_ARABIC );
3898 }
3899 break;
3900 case 29: // Double-byte Arabic numbers with double-byte period.
3901 {
3902 rNumberFormat.SetNumberingType( SVX_NUM_FULL_WIDTH_ARABIC );
3903 rNumberFormat.SetSuffix( String( sal_Unicode(0xff0e) ) );
3904 }
3905 break;
3906 case 38: // Japanese with double-byte period.
3907 {
3908 rNumberFormat.SetNumberingType( SVX_NUM_NUMBER_LOWER_ZH ); // No such type. Instead with Lower Chinese Number
3909 rNumberFormat.SetSuffix( String( sal_Unicode(0xff0e) ) );
3910 }
3911 break;
3912 }
3913 rStartNumbering = boost::optional< sal_Int16 >( nAnmScheme >> 16 );
3914 sal_Int16 nBuStart = *rStartNumbering;
3915 //The Seventh bit of nBuFlags that specifies whether fBulletHasAutoNumber exists,
3916 //and fBulletHasAutoNumber that specifies whether this paragraph has an automatic numbering scheme.
3917 if ( ( nBuFlags & 0x02000000 ) && ( nBuStart != 1 ))
3918 {
3919 rNumberFormat.SetStart( static_cast<sal_uInt16>(nBuStart) );
3920 }
3921 }
3922 return bHardAttribute;
3923 }
3924
GetNumberFormat(SdrPowerPointImport & rManager,SvxNumberFormat & rNumberFormat,sal_uInt32 nLevel,const PPTParaLevel & rParaLevel,const PPTCharLevel & rCharLevel,sal_uInt32 nInstance)3925 void PPTNumberFormatCreator::GetNumberFormat( SdrPowerPointImport& rManager, SvxNumberFormat& rNumberFormat, sal_uInt32 nLevel, const PPTParaLevel& rParaLevel, const PPTCharLevel& rCharLevel, sal_uInt32 nInstance )
3926 {
3927 nIsBullet = ( rParaLevel.mnBuFlags & ( 1 << PPT_ParaAttr_BulletOn ) ) != 0 ? 1 : 0;
3928 nBulletChar = rParaLevel.mnBulletChar;
3929
3930 sal_Bool bBuHardFont;
3931 bBuHardFont = ( rParaLevel.mnBuFlags & ( 1 << PPT_ParaAttr_BuHardFont ) ) != 0;
3932 if ( bBuHardFont )
3933 nBulletFont = rParaLevel.mnBulletFont;
3934 else
3935 nBulletFont = rCharLevel.mnFont;
3936 nBulletHeight = rParaLevel.mnBulletHeight;
3937 nBulletColor = rParaLevel.mnBulletColor;
3938 nTextOfs = rParaLevel.mnTextOfs;
3939 nBulletOfs = rParaLevel.mnBulletOfs;
3940
3941 boost::optional< sal_Int16 > oStartNumbering;
3942 ImplGetExtNumberFormat( rManager, rNumberFormat, nLevel, nInstance, 0xffffffff, oStartNumbering, rCharLevel.mnFontHeight, NULL );
3943 if ( ( rNumberFormat.GetNumberingType() != SVX_NUM_BITMAP ) && ( nBulletHeight > 0x7fff ) )
3944 nBulletHeight = rCharLevel.mnFontHeight ? ((-((sal_Int16)nBulletHeight)) * 100 ) / rCharLevel.mnFontHeight : 100;
3945 ImplGetNumberFormat( rManager, rNumberFormat, nLevel );
3946 switch ( rNumberFormat.GetNumberingType() )
3947 {
3948 case SVX_NUM_CHARS_UPPER_LETTER :
3949 case SVX_NUM_CHARS_LOWER_LETTER :
3950 case SVX_NUM_ROMAN_UPPER :
3951 case SVX_NUM_ROMAN_LOWER :
3952 case SVX_NUM_ARABIC :
3953 case SVX_NUM_CHARS_UPPER_LETTER_N :
3954 case SVX_NUM_CHARS_LOWER_LETTER_N :
3955 {
3956 sal_uInt32 nFont = rCharLevel.mnFont;
3957 PptFontEntityAtom* pFontEnityAtom = rManager.GetFontEnityAtom( nFont );
3958 if ( pFontEnityAtom )
3959 {
3960 Font aFont;
3961 aFont.SetCharSet( pFontEnityAtom->eCharSet );
3962 aFont.SetName( pFontEnityAtom->aName );
3963 aFont.SetFamily( pFontEnityAtom->eFamily );
3964 aFont.SetPitch( pFontEnityAtom->ePitch );
3965 rNumberFormat.SetBulletFont( &aFont );
3966 }
3967 }
3968 break;
3969 }
3970 }
3971
GetNumberFormat(SdrPowerPointImport & rManager,SvxNumberFormat & rNumberFormat,PPTParagraphObj * pParaObj,sal_uInt32 nDestinationInstance,boost::optional<sal_Int16> & rStartNumbering)3972 sal_Bool PPTNumberFormatCreator::GetNumberFormat( SdrPowerPointImport& rManager, SvxNumberFormat& rNumberFormat, PPTParagraphObj* pParaObj,
3973 sal_uInt32 nDestinationInstance, boost::optional< sal_Int16 >& rStartNumbering )
3974 {
3975 sal_uInt32 nHardCount = 0;
3976 nHardCount += pParaObj->GetAttrib( PPT_ParaAttr_BulletOn, nIsBullet, nDestinationInstance );
3977 nHardCount += pParaObj->GetAttrib( PPT_ParaAttr_BulletChar, nBulletChar, nDestinationInstance );
3978 nHardCount += pParaObj->GetAttrib( PPT_ParaAttr_BulletFont, nBulletFont, nDestinationInstance );
3979 nHardCount += pParaObj->GetAttrib( PPT_ParaAttr_BulletHeight, nBulletHeight, nDestinationInstance );
3980 nHardCount += pParaObj->GetAttrib( PPT_ParaAttr_BulletColor, nBulletColor, nDestinationInstance );
3981 nHardCount += pParaObj->GetAttrib( PPT_ParaAttr_TextOfs, nTextOfs, nDestinationInstance );
3982 nHardCount += pParaObj->GetAttrib( PPT_ParaAttr_BulletOfs, nBulletOfs, nDestinationInstance );
3983
3984 if ( nIsBullet )
3985 rNumberFormat.SetNumberingType( SVX_NUM_CHAR_SPECIAL );
3986
3987 sal_uInt32 nFontHeight = 24;
3988 PPTPortionObj* pPtr = pParaObj->First();
3989 if ( pPtr )
3990 pPtr->GetAttrib( PPT_CharAttr_FontHeight, nFontHeight, nDestinationInstance );
3991 if ( nIsBullet )
3992 nHardCount += ImplGetExtNumberFormat( rManager, rNumberFormat, pParaObj->pParaSet->mnDepth,
3993 pParaObj->mnInstance, nDestinationInstance, rStartNumbering, nFontHeight, pParaObj );
3994
3995 if ( rNumberFormat.GetNumberingType() != SVX_NUM_BITMAP )
3996 pParaObj->UpdateBulletRelSize( nBulletHeight );
3997 if ( nHardCount )
3998 ImplGetNumberFormat( rManager, rNumberFormat, pParaObj->pParaSet->mnDepth );
3999
4000 if ( nHardCount )
4001 {
4002 switch ( rNumberFormat.GetNumberingType() )
4003 {
4004 case SVX_NUM_CHARS_UPPER_LETTER :
4005 case SVX_NUM_CHARS_LOWER_LETTER :
4006 case SVX_NUM_ROMAN_UPPER :
4007 case SVX_NUM_ROMAN_LOWER :
4008 case SVX_NUM_ARABIC :
4009 case SVX_NUM_CHARS_UPPER_LETTER_N :
4010 case SVX_NUM_CHARS_LOWER_LETTER_N :
4011 {
4012 if ( pPtr )
4013 {
4014 sal_uInt32 nFont;
4015 pPtr->GetAttrib( PPT_CharAttr_Font, nFont, nDestinationInstance );
4016 PptFontEntityAtom* pFontEnityAtom = rManager.GetFontEnityAtom( nFont );
4017 if ( pFontEnityAtom )
4018 {
4019 Font aFont;
4020 aFont.SetCharSet( pFontEnityAtom->eCharSet );
4021 aFont.SetName( pFontEnityAtom->aName );
4022 aFont.SetFamily( pFontEnityAtom->eFamily );
4023 aFont.SetPitch( pFontEnityAtom->ePitch );
4024 rNumberFormat.SetBulletFont( &aFont );
4025 }
4026 }
4027 }
4028 break;
4029 }
4030 }
4031 return ( nHardCount ) ? sal_True : sal_False;
4032 }
4033
ImplGetNumberFormat(SdrPowerPointImport & rManager,SvxNumberFormat & rNumberFormat,sal_uInt32)4034 void PPTNumberFormatCreator::ImplGetNumberFormat( SdrPowerPointImport& rManager, SvxNumberFormat& rNumberFormat, sal_uInt32 /*nLevel*/)
4035 {
4036 Font aFont;
4037 PptFontEntityAtom* pAtom = rManager.GetFontEnityAtom( nBulletFont );
4038 if ( pAtom )
4039 {
4040 CharSet eCharSet( pAtom->eCharSet );
4041 aFont.SetName( pAtom->aName );
4042 aFont.SetCharSet( eCharSet );
4043 aFont.SetFamily( pAtom->eFamily );
4044 aFont.SetPitch( pAtom->ePitch );
4045 }
4046 Color aCol( rManager.MSO_TEXT_CLR_ToColor( nBulletColor ) );
4047 aFont.SetColor( aCol );
4048
4049 sal_uInt16 nBuChar = (sal_uInt16)nBulletChar;
4050 if ( aFont.GetCharSet() == RTL_TEXTENCODING_SYMBOL )
4051 {
4052 nBuChar &= 0x00ff;
4053 nBuChar |= 0xf000;
4054 }
4055 rNumberFormat.SetBulletFont( &aFont );
4056 rNumberFormat.SetBulletChar( nBuChar );
4057 rNumberFormat.SetBulletRelSize( (sal_uInt16)nBulletHeight );
4058 rNumberFormat.SetBulletColor( aCol );
4059 sal_uInt16 nAbsLSpace = (sal_uInt16)( ( (sal_uInt32)nTextOfs * 2540 ) / 576 );
4060 sal_uInt16 nFirstLineOffset = nAbsLSpace - (sal_uInt16)( ( (sal_uInt32)nBulletOfs * 2540 ) / 576 );
4061 rNumberFormat.SetAbsLSpace( nAbsLSpace );
4062 rNumberFormat.SetFirstLineOffset( -nFirstLineOffset );
4063 }
4064
4065 ////////////////////////////////////////////////////////////////////////////////////////////////////
4066
PPTCharSheet(sal_uInt32 nInstance)4067 PPTCharSheet::PPTCharSheet( sal_uInt32 nInstance )
4068 {
4069 sal_uInt32 nColor = PPT_COLSCHEME_TEXT_UND_ZEILEN;
4070 sal_uInt16 nFontHeight(0);
4071 switch ( nInstance )
4072 {
4073 case TSS_TYPE_PAGETITLE :
4074 case TSS_TYPE_TITLE :
4075 {
4076 nColor = PPT_COLSCHEME_TITELTEXT;
4077 nFontHeight = 44;
4078 }
4079 break;
4080 case TSS_TYPE_BODY :
4081 case TSS_TYPE_SUBTITLE :
4082 case TSS_TYPE_HALFBODY :
4083 case TSS_TYPE_QUARTERBODY :
4084 nFontHeight = 32;
4085 break;
4086 case TSS_TYPE_NOTES :
4087 nFontHeight = 12;
4088 break;
4089 case TSS_TYPE_UNUSED :
4090 case TSS_TYPE_TEXT_IN_SHAPE :
4091 nFontHeight = 24;
4092 break;
4093 }
4094 for ( sal_uInt32 nDepth = 0; nDepth < 5; nDepth++ )
4095 {
4096 maCharLevel[ nDepth ].mnFlags = 0;
4097 maCharLevel[ nDepth ].mnFont = 0;
4098 maCharLevel[ nDepth ].mnAsianOrComplexFont = 0xffff;
4099 maCharLevel[ nDepth ].mnFontHeight = nFontHeight;
4100 maCharLevel[ nDepth ].mnFontColor = nColor;
4101 maCharLevel[ nDepth ].mnFontColorInStyleSheet = Color( (sal_uInt8)nColor, (sal_uInt8)( nColor >> 8 ), (sal_uInt8)( nColor >> 16 ) );
4102 maCharLevel[ nDepth ].mnEscapement = 0;
4103 }
4104 }
4105
PPTCharSheet(const PPTCharSheet & rAttr)4106 PPTCharSheet::PPTCharSheet( const PPTCharSheet& rAttr )
4107 {
4108 *this = rAttr;
4109 }
4110
Read(SvStream & rIn,sal_Bool,sal_uInt32 nLevel,sal_Bool)4111 void PPTCharSheet::Read( SvStream& rIn, sal_Bool /*bMasterStyle*/, sal_uInt32 nLevel, sal_Bool /*bFirst*/)
4112 {
4113 // Zeichenattribute
4114 sal_uInt32 nCMask;
4115 sal_uInt16 nVal16;
4116 rIn >> nCMask;
4117
4118 if ( nCMask & 0x0000FFFF )
4119 {
4120 sal_uInt16 nBitAttr;
4121 maCharLevel[ nLevel ].mnFlags &= ~( (sal_uInt16)nCMask );
4122 rIn >> nBitAttr; // Bit-Attribute (Fett, Unterstrichen, ...)
4123 maCharLevel[ nLevel ].mnFlags |= nBitAttr;
4124 }
4125 if ( nCMask & ( 1 << PPT_CharAttr_Font ) ) // 0x00010000
4126 rIn >> maCharLevel[ nLevel ].mnFont;
4127 if ( nCMask & ( 1 << PPT_CharAttr_AsianOrComplexFont ) ) // 0x00200000
4128 rIn >> maCharLevel[ nLevel ].mnAsianOrComplexFont;
4129 if ( nCMask & ( 1 << PPT_CharAttr_ANSITypeface ) ) // 0x00400000
4130 rIn >> nVal16;
4131 if ( nCMask & ( 1 << PPT_CharAttr_Symbol ) ) // 0x00800000
4132 rIn >> nVal16;
4133 if ( nCMask & ( 1 << PPT_CharAttr_FontHeight ) ) // 0x00020000
4134 rIn >> maCharLevel[ nLevel ].mnFontHeight;
4135 if ( nCMask & ( 1 << PPT_CharAttr_FontColor ) ) // 0x00040000
4136 {
4137 rIn >> maCharLevel[ nLevel ].mnFontColor;
4138 if( ! (maCharLevel[ nLevel ].mnFontColor & 0xff000000 ) )
4139 maCharLevel[ nLevel ].mnFontColor = PPT_COLSCHEME_HINTERGRUND;
4140 }
4141 if ( nCMask & ( 1 << PPT_CharAttr_Escapement ) ) // 0x00080000
4142 rIn >> maCharLevel[ nLevel ].mnEscapement;
4143 if ( nCMask & 0x00100000 ) // 0x00100000
4144 rIn >> nVal16;
4145
4146 nCMask >>= 24;
4147 while( nCMask )
4148 {
4149 if ( nCMask & 1 )
4150 {
4151 DBG_ERROR( "PPTCharSheet::Read - unknown attribute, send me this document (SJ)" );
4152 rIn >> nVal16;
4153 }
4154 nCMask >>= 1;
4155 }
4156 }
4157
PPTParaSheet(sal_uInt32 nInstance)4158 PPTParaSheet::PPTParaSheet( sal_uInt32 nInstance )
4159 {
4160 sal_uInt16 nBuFlags = 0;
4161 sal_uInt32 nBulletColor = 0x8000000;
4162 sal_uInt16 nUpperDist = 0;
4163
4164 switch ( nInstance )
4165 {
4166 case TSS_TYPE_PAGETITLE :
4167 case TSS_TYPE_TITLE :
4168 nBulletColor = PPT_COLSCHEME_TITELTEXT;
4169 break;
4170 case TSS_TYPE_BODY :
4171 case TSS_TYPE_SUBTITLE :
4172 case TSS_TYPE_HALFBODY :
4173 case TSS_TYPE_QUARTERBODY :
4174 {
4175 nBuFlags = 1;
4176 nUpperDist = 0x14;
4177 }
4178 break;
4179 case TSS_TYPE_NOTES :
4180 nUpperDist = 0x1e;
4181 break;
4182 /*
4183 default :
4184 case TSS_TYPE_UNUSED :
4185 case TSS_TYPE_TEXT_IN_SHAPE :
4186 break;
4187 */
4188 }
4189 for ( sal_uInt32 i = 0; i < 5; i++ )
4190 {
4191 maParaLevel[ i ].mnBuFlags = nBuFlags;
4192 maParaLevel[ i ].mnBulletChar = 0x2022;
4193 maParaLevel[ i ].mnBulletFont = 0;
4194 maParaLevel[ i ].mnBulletHeight = 100;
4195 maParaLevel[ i ].mnBulletColor = nBulletColor;
4196 maParaLevel[ i ].mnAdjust = 0;
4197 maParaLevel[ i ].mnLineFeed = 100;
4198 maParaLevel[ i ].mnLowerDist = 0;
4199 maParaLevel[ i ].mnUpperDist = nUpperDist;
4200 maParaLevel[ i ].mnTextOfs = 0;
4201 maParaLevel[ i ].mnBulletOfs = 0;
4202 maParaLevel[ i ].mnDefaultTab = 0x240;
4203 maParaLevel[ i ].mnAsianLineBreak = 0;
4204 maParaLevel[ i ].mnBiDi = 0;
4205 }
4206 }
4207
PPTParaSheet(const PPTParaSheet & rSheet)4208 PPTParaSheet::PPTParaSheet( const PPTParaSheet& rSheet )
4209 {
4210 *this = rSheet;
4211 }
4212
Read(SdrPowerPointImport & rManager,SvStream & rIn,sal_Bool,sal_uInt32 nLevel,sal_Bool bFirst)4213 void PPTParaSheet::Read( SdrPowerPointImport&
4214 #ifdef DBG_UTIL
4215 rManager
4216 #endif
4217 , SvStream& rIn, sal_Bool /*bMasterStyle*/,
4218 sal_uInt32 nLevel, sal_Bool bFirst )
4219 {
4220 // Absatzattribute
4221 sal_uInt16 nVal16, i, nMask16;
4222 sal_uInt32 nVal32, nPMask;
4223 rIn >> nPMask;
4224
4225 nMask16 = (sal_uInt16)nPMask & 0xf;
4226 if ( nMask16 )
4227 {
4228 rIn >> nVal16;
4229 maParaLevel[ nLevel ].mnBuFlags &=~ nMask16;
4230 nVal16 &= nMask16;
4231 maParaLevel[ nLevel ].mnBuFlags |= nVal16;
4232 }
4233 if ( nPMask & 0x0080 )
4234 rIn >> maParaLevel[ nLevel ].mnBulletChar;
4235 if ( nPMask & 0x0010 )
4236 rIn >> maParaLevel[ nLevel ].mnBulletFont;
4237 if ( nPMask & 0x0040 )
4238 {
4239 rIn >> nVal16;
4240 maParaLevel[ nLevel ].mnBulletHeight = nVal16;
4241 }
4242 if ( nPMask & 0x0020 )
4243 {
4244 rIn >> nVal32;
4245 maParaLevel[ nLevel ].mnBulletColor = nVal32;
4246 }
4247 if ( bFirst )
4248 {
4249 if ( nPMask & 0xF00 )
4250 { // AbsJust!
4251 rIn >> nVal16;
4252 maParaLevel[ nLevel ].mnAdjust = nVal16 & 3;
4253 }
4254 if ( nPMask & 0x1000 )
4255 rIn >> maParaLevel[ nLevel ].mnLineFeed;
4256 if ( nPMask & 0x2000 )
4257 rIn >> maParaLevel[ nLevel ].mnUpperDist;
4258 if ( nPMask & 0x4000 )
4259 rIn >> maParaLevel[ nLevel ].mnLowerDist;
4260 if ( nPMask & 0x8000 )
4261 rIn >> maParaLevel[ nLevel ].mnTextOfs;
4262 if ( nPMask & 0x10000 )
4263 rIn >> maParaLevel[ nLevel ].mnBulletOfs;
4264 if ( nPMask & 0x20000 )
4265 rIn >> maParaLevel[ nLevel ].mnDefaultTab;
4266 if ( nPMask & 0x200000 )
4267 {
4268 // number of tabulators
4269 rIn >> nVal16;
4270 for ( i = 0; i < nVal16; i++ )
4271 rIn >> nVal32; // reading the tabulators
4272 }
4273 if ( nPMask & 0x40000 )
4274 rIn >> nVal16;
4275 if ( nPMask & 0x80000 )
4276 rIn >> maParaLevel[ nLevel ].mnAsianLineBreak;
4277 if ( nPMask & 0x100000 )
4278 rIn >> maParaLevel[ nLevel ].mnBiDi;
4279 }
4280 else
4281 {
4282 if ( nPMask & 0x800 )
4283 {
4284 rIn >> nVal16;
4285 maParaLevel[ nLevel ].mnAdjust = nVal16 & 3;
4286 }
4287 if ( nPMask & 0x1000 )
4288 rIn >> maParaLevel[ nLevel ].mnLineFeed;
4289 if ( nPMask & 0x2000 )
4290 rIn >> maParaLevel[ nLevel ].mnUpperDist;
4291 if ( nPMask & 0x4000 )
4292 rIn >> maParaLevel[ nLevel ].mnLowerDist;
4293 if ( nPMask & 0x8000 )
4294 rIn >> nVal16;
4295 if ( nPMask & 0x100 )
4296 rIn >> maParaLevel[ nLevel ].mnTextOfs;
4297 if ( nPMask & 0x200 )
4298 rIn >> nVal16;
4299 if ( nPMask & 0x400 )
4300 rIn >> maParaLevel[ nLevel ].mnBulletOfs;
4301 if ( nPMask & 0x10000 )
4302 rIn >> nVal16;
4303 if ( nPMask & 0xe0000 )
4304 {
4305 sal_uInt16 nFlagsToModifyMask = (sal_uInt16)( ( nPMask >> 17 ) & 7 );
4306 rIn >> nVal16;
4307 // bits that are not involved to zero
4308 nVal16 &= nFlagsToModifyMask;
4309 // bits that are to change to zero
4310 maParaLevel[ nLevel ].mnAsianLineBreak &=~nFlagsToModifyMask;
4311 // now set the corresponding bits
4312 maParaLevel[ nLevel ].mnAsianLineBreak |= nVal16;
4313 }
4314 if ( nPMask & 0x100000 )
4315 {
4316 // number of tabulators
4317 rIn >> nVal16;
4318 for ( i = 0; i < nVal16; i++ )
4319 rIn >> nVal32; // reading the tabulators
4320 }
4321 if ( nPMask & 0x200000 )
4322 rIn >> maParaLevel[ nLevel ].mnBiDi; // #88602#
4323 }
4324
4325 nPMask >>= 22;
4326 while( nPMask )
4327 {
4328 if ( nPMask & 1 )
4329 {
4330 #ifdef DBG_UTIL
4331 if (!(rManager.rImportParam.nImportFlags & PPT_IMPORTFLAGS_NO_TEXT_ASSERT))
4332 {
4333 DBG_ERROR( "PPTParaSheet::Read - unknown attribute, send me this document (SJ)" );
4334 }
4335 #endif
4336 rIn >> nVal16;
4337 }
4338 nPMask >>= 1;
4339 }
4340 }
4341
UpdateBulletRelSize(sal_uInt32 nLevel,sal_uInt16 nFontHeight)4342 void PPTParaSheet::UpdateBulletRelSize( sal_uInt32 nLevel, sal_uInt16 nFontHeight )
4343 {
4344 if ( maParaLevel[ nLevel ].mnBulletHeight > 0x7fff ) // a negative value is the absolute bullet height
4345 {
4346 sal_Int16 nBulletRelSize = ( sal_Int16 )maParaLevel[ nLevel ].mnBulletHeight;
4347 nBulletRelSize = nFontHeight ? ((-nBulletRelSize) * 100 ) / nFontHeight : 100;
4348 if ( nBulletRelSize < 0 ) //bullet size over flow
4349 nBulletRelSize = 100;
4350 maParaLevel[ nLevel ].mnBulletHeight = nBulletRelSize;
4351 }
4352 }
4353
PPTStyleSheet(const DffRecordHeader & rSlideHd,SvStream & rIn,SdrPowerPointImport & rManager,const PPTTextCharacterStyleAtomInterpreter &,const PPTTextParagraphStyleAtomInterpreter & rTxPFStyle,const PPTTextSpecInfo & rTextSpecInfo)4354 PPTStyleSheet::PPTStyleSheet( const DffRecordHeader& rSlideHd, SvStream& rIn, SdrPowerPointImport& rManager,
4355 const PPTTextCharacterStyleAtomInterpreter& /*rTxCFStyle*/, const PPTTextParagraphStyleAtomInterpreter& rTxPFStyle,
4356 const PPTTextSpecInfo& rTextSpecInfo ) :
4357
4358 PPTNumberFormatCreator ( new PPTExtParaProv( rManager, rIn, &rSlideHd ) ),
4359 maTxSI ( rTextSpecInfo )
4360 {
4361 sal_uInt32 i;
4362 sal_uInt32 nOldFilePos = rIn.Tell();
4363
4364 // default stylesheets
4365 mpCharSheet[ TSS_TYPE_PAGETITLE ] = new PPTCharSheet( TSS_TYPE_PAGETITLE );
4366 mpCharSheet[ TSS_TYPE_BODY ] = new PPTCharSheet( TSS_TYPE_BODY );
4367 mpCharSheet[ TSS_TYPE_NOTES ] = new PPTCharSheet( TSS_TYPE_NOTES );
4368 mpCharSheet[ TSS_TYPE_UNUSED ] = new PPTCharSheet( TSS_TYPE_UNUSED ); // this entry is not used by ppt
4369 mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ] = new PPTCharSheet( TSS_TYPE_TEXT_IN_SHAPE );
4370 mpParaSheet[ TSS_TYPE_PAGETITLE ] = new PPTParaSheet( TSS_TYPE_PAGETITLE );
4371 mpParaSheet[ TSS_TYPE_BODY ] = new PPTParaSheet( TSS_TYPE_BODY );
4372 mpParaSheet[ TSS_TYPE_NOTES ] = new PPTParaSheet( TSS_TYPE_NOTES );
4373 mpParaSheet[ TSS_TYPE_UNUSED ] = new PPTParaSheet( TSS_TYPE_UNUSED );
4374 mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ] = new PPTParaSheet( TSS_TYPE_TEXT_IN_SHAPE );
4375 mpCharSheet[ TSS_TYPE_QUARTERBODY ] = mpCharSheet[ TSS_TYPE_HALFBODY ] = mpCharSheet[ TSS_TYPE_TITLE ] = mpCharSheet[ TSS_TYPE_SUBTITLE ] = NULL;
4376 mpParaSheet[ TSS_TYPE_QUARTERBODY ] = mpParaSheet[ TSS_TYPE_HALFBODY ] = mpParaSheet[ TSS_TYPE_TITLE ] = mpParaSheet[ TSS_TYPE_SUBTITLE ] = NULL;
4377
4378 /* SJ: try to locate the txMasterStyleAtom in the Environment
4379
4380 it seems that the environment TextStyle is having a higher priority
4381 than the TextStyle that can be found within the master page
4382 */
4383 sal_Bool bFoundTxMasterStyleAtom04 = sal_False;
4384 DffRecordHeader* pEnvHeader = rManager.aDocRecManager.GetRecordHeader( PPT_PST_Environment );
4385 if ( pEnvHeader )
4386 {
4387 pEnvHeader->SeekToContent( rIn );
4388 DffRecordHeader aTxMasterStyleHd;
4389 while ( rIn.Tell() < pEnvHeader->GetRecEndFilePos() )
4390 {
4391 rIn >> aTxMasterStyleHd;
4392 if ( aTxMasterStyleHd.nRecType == PPT_PST_TxMasterStyleAtom )
4393 {
4394 sal_uInt16 nLevelAnz;
4395 rIn >> nLevelAnz;
4396
4397 if (nLevelAnz > 5)
4398 {
4399 throw std::range_error("Bad input file, Too many stylesheet levels");
4400 }
4401
4402 sal_uInt16 nLev = 0;
4403 sal_Bool bFirst = sal_True;
4404 bFoundTxMasterStyleAtom04 = sal_True;
4405 while ( rIn.GetError() == 0 && rIn.Tell() < aTxMasterStyleHd.GetRecEndFilePos() && nLev < nLevelAnz )
4406 {
4407 if ( nLev )
4408 {
4409 mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maParaLevel[ nLev ] = mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maParaLevel[ nLev - 1 ];
4410 mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maCharLevel[ nLev ] = mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maCharLevel[ nLev - 1 ];
4411 }
4412 mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->Read( rManager, rIn, sal_True, nLev, bFirst );
4413 if ( !nLev )
4414 {
4415 // set paragraph defaults for instance 4 (TSS_TYPE_TEXT_IN_SHAPE)
4416 if ( rTxPFStyle.bValid )
4417 {
4418 PPTParaLevel& rParaLevel = mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maParaLevel[ 0 ];
4419 rParaLevel.mnAsianLineBreak = 0;
4420 if ( rTxPFStyle.bForbiddenRules )
4421 rParaLevel.mnAsianLineBreak |= 1;
4422 if ( !rTxPFStyle.bLatinTextWrap )
4423 rParaLevel.mnAsianLineBreak |= 2;
4424 if ( rTxPFStyle.bHangingPunctuation )
4425 rParaLevel.mnAsianLineBreak |= 4;
4426 }
4427 }
4428 mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->Read( rIn, sal_True, nLev, bFirst );
4429 mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->UpdateBulletRelSize( nLev, mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maCharLevel[ nLev ].mnFontHeight );
4430 bFirst = sal_False;
4431 nLev++;
4432 }
4433 break;
4434 }
4435 else
4436 aTxMasterStyleHd.SeekToEndOfRecord( rIn );
4437 }
4438 }
4439
4440 rSlideHd.SeekToContent( rIn );
4441 DffRecordHeader aTxMasterStyleHd;
4442 while ( rIn.Tell() < rSlideHd.GetRecEndFilePos() )
4443 {
4444 rIn >> aTxMasterStyleHd;
4445 if ( aTxMasterStyleHd.nRecType == PPT_PST_TxMasterStyleAtom )
4446 break;
4447 else
4448 aTxMasterStyleHd.SeekToEndOfRecord( rIn );
4449 }
4450 while ( ( aTxMasterStyleHd.nRecType == PPT_PST_TxMasterStyleAtom ) && ( rIn.Tell() < rSlideHd.GetRecEndFilePos() ) ) //TODO: aTxMasterStyleHd may be used without having been properly initialized
4451 {
4452 sal_uInt32 nInstance = aTxMasterStyleHd.nRecInstance;
4453 if ( ( nInstance < PPT_STYLESHEETENTRYS ) &&
4454 ( ( nInstance != TSS_TYPE_TEXT_IN_SHAPE ) || ( bFoundTxMasterStyleAtom04 == sal_False ) ) )
4455 {
4456 if ( nInstance > 4 )
4457 {
4458 delete mpCharSheet[ nInstance ]; // be sure to delete the old one if this instance comes twice
4459 delete mpParaSheet[ nInstance ];
4460
4461 switch ( nInstance )
4462 {
4463 case TSS_TYPE_SUBTITLE :
4464 {
4465 mpCharSheet[ TSS_TYPE_SUBTITLE ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_BODY ] ) );
4466 mpParaSheet[ TSS_TYPE_SUBTITLE ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_BODY ] ) );
4467 }
4468 break;
4469 case TSS_TYPE_TITLE :
4470 {
4471 mpCharSheet[ TSS_TYPE_TITLE ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_PAGETITLE ] ) );
4472 mpParaSheet[ TSS_TYPE_TITLE ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_PAGETITLE ] ) );
4473 }
4474 break;
4475 case TSS_TYPE_HALFBODY :
4476 {
4477 mpCharSheet[ TSS_TYPE_HALFBODY ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_BODY ] ) );
4478 mpParaSheet[ TSS_TYPE_HALFBODY ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_BODY ] ) );
4479 }
4480 break;
4481
4482 case TSS_TYPE_QUARTERBODY :
4483 {
4484 mpCharSheet[ TSS_TYPE_QUARTERBODY ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_BODY ] ) );
4485 mpParaSheet[ TSS_TYPE_QUARTERBODY ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_BODY ] ) );
4486 }
4487 break;
4488 }
4489 }
4490 sal_uInt16 nLevelAnz;
4491 rIn >> nLevelAnz;
4492 if ( nLevelAnz > 5 )
4493 {
4494 DBG_ERROR( "PPTStyleSheet::Ppt-TextStylesheet hat mehr als 5 Ebenen! (SJ)" );
4495 nLevelAnz = 5;
4496 }
4497 sal_uInt16 nLev = 0;
4498 sal_Bool bFirst = sal_True;
4499
4500 while ( rIn.GetError() == 0 && rIn.Tell() < aTxMasterStyleHd.GetRecEndFilePos() && nLev < nLevelAnz )
4501 {
4502 if ( nLev && ( nInstance < 5 ) )
4503 {
4504 mpParaSheet[ nInstance ]->maParaLevel[ nLev ] = mpParaSheet[ nInstance ]->maParaLevel[ nLev - 1 ];
4505 mpCharSheet[ nInstance ]->maCharLevel[ nLev ] = mpCharSheet[ nInstance ]->maCharLevel[ nLev - 1 ];
4506 }
4507
4508 // Ausnahme: Vorlage 5, 6 (MasterTitle Titel und SubTitel)
4509 if ( nInstance >= TSS_TYPE_SUBTITLE )
4510 {
4511 bFirst = sal_False;
4512
4513 sal_uInt16 nDontKnow;
4514 rIn >> nDontKnow;
4515 }
4516 mpParaSheet[ nInstance ]->Read( rManager, rIn, sal_True, nLev, bFirst );
4517 mpCharSheet[ nInstance ]->Read( rIn, sal_True, nLev, bFirst );
4518 mpParaSheet[ nInstance ]->UpdateBulletRelSize( nLev, mpCharSheet[ nInstance ]->maCharLevel[ nLev ].mnFontHeight );
4519 bFirst = sal_False;
4520 nLev++;
4521 }
4522 #ifdef DBG_UTIL
4523 if (!(rManager.rImportParam.nImportFlags & PPT_IMPORTFLAGS_NO_TEXT_ASSERT))
4524 {
4525 if ( rIn.GetError() == 0 )
4526 {
4527 ByteString aMsg;
4528 if ( rIn.Tell() > aTxMasterStyleHd.GetRecEndFilePos() )
4529 {
4530 aMsg += "\n ";
4531 aMsg += "reading too many bytes:";
4532 aMsg += ByteString::CreateFromInt32( rIn.Tell() - aTxMasterStyleHd.GetRecEndFilePos() );
4533 }
4534 if ( rIn.Tell() < aTxMasterStyleHd.GetRecEndFilePos() )
4535 {
4536 aMsg += "\n ";
4537 aMsg += "reading too less bytes:";
4538 aMsg += ByteString::CreateFromInt32( aTxMasterStyleHd.GetRecEndFilePos() - rIn.Tell() );
4539 }
4540 if ( aMsg.Len() != 0 )
4541 {
4542 aMsg.Insert( "]:", 0 );
4543 aMsg.Insert( "PptStyleSheet::operator>>[", 0 );
4544 DBG_ERROR(aMsg.GetBuffer());
4545 }
4546 }
4547 if ( rIn.Tell() != aTxMasterStyleHd.GetRecEndFilePos() )
4548 DBG_ASSERT(0, "SJ: Falsche Anzahl von Bytes gelesen beim Import der PPT-Formatvorlagen");
4549 }
4550 #endif
4551 }
4552 aTxMasterStyleHd.SeekToEndOfRecord( rIn );
4553 rIn >> aTxMasterStyleHd;
4554 }
4555 if ( !mpCharSheet[ TSS_TYPE_SUBTITLE ] )
4556 {
4557 mpCharSheet[ TSS_TYPE_SUBTITLE ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_BODY ] ) );
4558 mpParaSheet[ TSS_TYPE_SUBTITLE ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_BODY ] ) );
4559 }
4560 if ( !mpCharSheet[ TSS_TYPE_TITLE ] )
4561 {
4562 mpCharSheet[ TSS_TYPE_TITLE ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_PAGETITLE ] ) );
4563 mpParaSheet[ TSS_TYPE_TITLE ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_PAGETITLE ] ) );
4564 }
4565 if ( !mpCharSheet[ TSS_TYPE_HALFBODY ] )
4566 {
4567 mpCharSheet[ TSS_TYPE_HALFBODY ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_BODY ] ) );
4568 mpParaSheet[ TSS_TYPE_HALFBODY ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_BODY ] ) );
4569 }
4570 if ( !mpCharSheet[ TSS_TYPE_QUARTERBODY ] )
4571 {
4572 mpCharSheet[ TSS_TYPE_QUARTERBODY ] = new PPTCharSheet( *( mpCharSheet[ TSS_TYPE_BODY ] ) );
4573 mpParaSheet[ TSS_TYPE_QUARTERBODY ] = new PPTParaSheet( *( mpParaSheet[ TSS_TYPE_BODY ] ) );
4574 }
4575 if ( !bFoundTxMasterStyleAtom04 )
4576 { // try to locate the txMasterStyleAtom in the Environment
4577 DffRecordHeader* pEnvHeader2 = rManager.aDocRecManager.GetRecordHeader( PPT_PST_Environment );
4578 if ( pEnvHeader2 )
4579 {
4580 pEnvHeader2->SeekToContent( rIn );
4581 DffRecordHeader aTxMasterStyleHd2;
4582 while ( rIn.Tell() < pEnvHeader2->GetRecEndFilePos() )
4583 {
4584 rIn >> aTxMasterStyleHd2;
4585 if ( aTxMasterStyleHd2.nRecType == PPT_PST_TxMasterStyleAtom )
4586 {
4587 sal_uInt16 nLevelAnz;
4588 rIn >> nLevelAnz;
4589
4590 sal_uInt16 nLev = 0;
4591 sal_Bool bFirst = sal_True;
4592 while ( rIn.GetError() == 0 && rIn.Tell() < aTxMasterStyleHd2.GetRecEndFilePos() && nLev < nLevelAnz )
4593 {
4594 if ( nLev )
4595 {
4596 mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maParaLevel[ nLev ] = mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maParaLevel[ nLev - 1 ];
4597 mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maCharLevel[ nLev ] = mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maCharLevel[ nLev - 1 ];
4598 }
4599 mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->Read( rManager, rIn, sal_True, nLev, bFirst );
4600 if ( !nLev )
4601 {
4602 // set paragraph defaults for instance 4 (TSS_TYPE_TEXT_IN_SHAPE)
4603 if ( rTxPFStyle.bValid )
4604 {
4605 PPTParaLevel& rParaLevel = mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maParaLevel[ 0 ];
4606 rParaLevel.mnAsianLineBreak = 0;
4607 if ( rTxPFStyle.bForbiddenRules )
4608 rParaLevel.mnAsianLineBreak |= 1;
4609 if ( !rTxPFStyle.bLatinTextWrap )
4610 rParaLevel.mnAsianLineBreak |= 2;
4611 if ( rTxPFStyle.bHangingPunctuation )
4612 rParaLevel.mnAsianLineBreak |= 4;
4613 }
4614 }
4615 mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->Read( rIn, sal_True, nLev, bFirst );
4616 mpParaSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->UpdateBulletRelSize( nLev, mpCharSheet[ TSS_TYPE_TEXT_IN_SHAPE ]->maCharLevel[ nLev ].mnFontHeight );
4617 bFirst = sal_False;
4618 nLev++;
4619 }
4620 break;
4621 }
4622 else
4623 aTxMasterStyleHd2.SeekToEndOfRecord( rIn );
4624 }
4625 }
4626 }
4627 rIn.Seek( nOldFilePos );
4628
4629 // will will create the default numbulletitem for each instance
4630 for ( i = 0; i < PPT_STYLESHEETENTRYS; i++ )
4631 {
4632 sal_uInt16 nLevels, nDepth = 0;
4633 SvxNumRuleType eNumRuleType;
4634
4635 switch ( i )
4636 {
4637 case TSS_TYPE_PAGETITLE :
4638 case TSS_TYPE_TITLE :
4639 nLevels = 1;
4640 eNumRuleType = SVX_RULETYPE_NUMBERING;
4641 break;
4642 case TSS_TYPE_SUBTITLE :
4643 nLevels = 10;
4644 eNumRuleType = SVX_RULETYPE_NUMBERING;
4645 break;
4646 case TSS_TYPE_BODY :
4647 case TSS_TYPE_HALFBODY :
4648 case TSS_TYPE_QUARTERBODY :
4649 nLevels = 10;
4650 eNumRuleType = SVX_RULETYPE_PRESENTATION_NUMBERING;
4651 break;
4652 default :
4653 case TSS_TYPE_NOTES :
4654 case TSS_TYPE_UNUSED :
4655 case TSS_TYPE_TEXT_IN_SHAPE :
4656 nLevels = 10;
4657 eNumRuleType = SVX_RULETYPE_NUMBERING;
4658 break;
4659 }
4660 SvxNumRule aRule( NUM_BULLET_REL_SIZE | NUM_BULLET_COLOR |
4661 NUM_CHAR_TEXT_DISTANCE | NUM_SYMBOL_ALIGNMENT,
4662 nLevels, sal_False, eNumRuleType );
4663 for ( sal_uInt16 nCount = 0; nDepth < nLevels; nCount++ )
4664 {
4665 const PPTParaLevel& rParaLevel = mpParaSheet[ i ]->maParaLevel[ nCount ];
4666 const PPTCharLevel& rCharLevel = mpCharSheet[ i ]->maCharLevel[ nCount ];
4667 SvxNumberFormat aNumberFormat( SVX_NUM_CHAR_SPECIAL );
4668 aNumberFormat.SetBulletChar( ' ' );
4669 GetNumberFormat( rManager, aNumberFormat, nCount, rParaLevel, rCharLevel, i );
4670 aRule.SetLevel( nDepth++, aNumberFormat );
4671 if ( nCount >= 4 )
4672 {
4673 for ( ;nDepth < nLevels; nDepth++ )
4674 aRule.SetLevel( nDepth, aNumberFormat );
4675 if ( eNumRuleType == SVX_RULETYPE_PRESENTATION_NUMBERING )
4676 aRule.SetLevel( 0, aNumberFormat );
4677 }
4678 }
4679 mpNumBulletItem[ i ] = new SvxNumBulletItem( aRule, EE_PARA_NUMBULLET );
4680 }
4681 }
4682
~PPTStyleSheet()4683 PPTStyleSheet::~PPTStyleSheet()
4684 {
4685 for ( sal_uInt32 i = 0; i < PPT_STYLESHEETENTRYS; i++ )
4686 {
4687 delete mpCharSheet[ i ];
4688 delete mpParaSheet[ i ];
4689 delete mpNumBulletItem[ i ];
4690 }
4691 }
4692
4693 ////////////////////////////////////////////////////////////////////////////////////////////////////
4694
PPTParaPropSet()4695 PPTParaPropSet::PPTParaPropSet() :
4696 pParaSet( new ImplPPTParaPropSet )
4697 {
4698 pParaSet->mnHasAnm = 1;
4699 }
4700
PPTParaPropSet(PPTParaPropSet & rParaPropSet)4701 PPTParaPropSet::PPTParaPropSet( PPTParaPropSet& rParaPropSet )
4702 {
4703 pParaSet = rParaPropSet.pParaSet;
4704 pParaSet->mnRefCount++;
4705
4706 mnOriginalTextPos = rParaPropSet.mnOriginalTextPos;
4707 }
4708
~PPTParaPropSet()4709 PPTParaPropSet::~PPTParaPropSet()
4710 {
4711 if ( ! ( --pParaSet->mnRefCount ) )
4712 delete pParaSet;
4713 }
4714
operator =(PPTParaPropSet & rParaPropSet)4715 PPTParaPropSet& PPTParaPropSet::operator=( PPTParaPropSet& rParaPropSet )
4716 {
4717 if ( this != &rParaPropSet )
4718 {
4719 if ( ! ( --pParaSet->mnRefCount ) )
4720 delete pParaSet;
4721 pParaSet = rParaPropSet.pParaSet;
4722 pParaSet->mnRefCount++;
4723
4724 mnOriginalTextPos = rParaPropSet.mnOriginalTextPos;
4725 }
4726 return *this;
4727 }
4728
PPTCharPropSet(sal_uInt32 nParagraph)4729 PPTCharPropSet::PPTCharPropSet( sal_uInt32 nParagraph ) :
4730 mnParagraph ( nParagraph ),
4731 mpFieldItem ( NULL ),
4732 pCharSet ( new ImplPPTCharPropSet )
4733 {
4734 mnHylinkOrigColor = 0;
4735 mbIsHyperlink = sal_False;
4736 mbHardHylinkOrigColor = sal_False;
4737 mnLanguage[ 0 ] = mnLanguage[ 1 ] = mnLanguage[ 2 ] = 0;
4738 }
4739
PPTCharPropSet(PPTCharPropSet & rCharPropSet)4740 PPTCharPropSet::PPTCharPropSet( PPTCharPropSet& rCharPropSet )
4741 {
4742 mnHylinkOrigColor = rCharPropSet.mnHylinkOrigColor;
4743 mbIsHyperlink = rCharPropSet.mbIsHyperlink;
4744 mbHardHylinkOrigColor = rCharPropSet.mbHardHylinkOrigColor;
4745 pCharSet = rCharPropSet.pCharSet;
4746 pCharSet->mnRefCount++;
4747
4748 mnParagraph = rCharPropSet.mnParagraph;
4749 mnOriginalTextPos = rCharPropSet.mnOriginalTextPos;
4750 maString = rCharPropSet.maString;
4751 mpFieldItem = ( rCharPropSet.mpFieldItem ) ? new SvxFieldItem( *rCharPropSet.mpFieldItem ) : NULL;
4752 mnLanguage[ 0 ] = rCharPropSet.mnLanguage[ 0 ];
4753 mnLanguage[ 1 ] = rCharPropSet.mnLanguage[ 1 ];
4754 mnLanguage[ 2 ] = rCharPropSet.mnLanguage[ 2 ];
4755 }
4756
PPTCharPropSet(PPTCharPropSet & rCharPropSet,sal_uInt32 nParagraph)4757 PPTCharPropSet::PPTCharPropSet( PPTCharPropSet& rCharPropSet, sal_uInt32 nParagraph )
4758 {
4759 pCharSet = rCharPropSet.pCharSet;
4760 pCharSet->mnRefCount++;
4761
4762 mnHylinkOrigColor = rCharPropSet.mnHylinkOrigColor;
4763 mbIsHyperlink = rCharPropSet.mbIsHyperlink;
4764 mbHardHylinkOrigColor = rCharPropSet.mbHardHylinkOrigColor;
4765
4766 mnParagraph = nParagraph;
4767 mnOriginalTextPos = rCharPropSet.mnOriginalTextPos;
4768 maString = rCharPropSet.maString;
4769 mpFieldItem = ( rCharPropSet.mpFieldItem ) ? new SvxFieldItem( *rCharPropSet.mpFieldItem ) : NULL;
4770 mnLanguage[ 0 ] = mnLanguage[ 1 ] = mnLanguage[ 2 ] = 0;
4771 }
4772
~PPTCharPropSet()4773 PPTCharPropSet::~PPTCharPropSet()
4774 {
4775 if ( ! ( --pCharSet->mnRefCount ) )
4776 delete pCharSet;
4777 delete mpFieldItem;
4778 }
4779
operator =(PPTCharPropSet & rCharPropSet)4780 PPTCharPropSet& PPTCharPropSet::operator=( PPTCharPropSet& rCharPropSet )
4781 {
4782 if ( this != &rCharPropSet )
4783 {
4784 if ( ! ( --pCharSet->mnRefCount ) )
4785 delete pCharSet;
4786 pCharSet = rCharPropSet.pCharSet;
4787 pCharSet->mnRefCount++;
4788
4789 mnOriginalTextPos = rCharPropSet.mnOriginalTextPos;
4790 mnParagraph = rCharPropSet.mnParagraph;
4791 maString = rCharPropSet.maString;
4792 mpFieldItem = ( rCharPropSet.mpFieldItem ) ? new SvxFieldItem( *rCharPropSet.mpFieldItem ) : NULL;
4793 }
4794 return *this;
4795 }
4796
ImplMakeUnique()4797 void PPTCharPropSet::ImplMakeUnique()
4798 {
4799 if ( pCharSet->mnRefCount > 1 )
4800 {
4801 ImplPPTCharPropSet& rOld = *pCharSet;
4802 rOld.mnRefCount--;
4803 pCharSet = new ImplPPTCharPropSet( rOld );
4804 pCharSet->mnRefCount = 1;
4805 }
4806 }
4807
SetFont(sal_uInt16 nFont)4808 void PPTCharPropSet::SetFont( sal_uInt16 nFont )
4809 {
4810 sal_uInt32 nMask = 1 << PPT_CharAttr_Font;
4811 sal_uInt32 bDoNotMake = pCharSet->mnAttrSet & nMask;
4812
4813 if ( bDoNotMake )
4814 bDoNotMake = nFont == pCharSet->mnFont;
4815
4816 if ( !bDoNotMake )
4817 {
4818 ImplMakeUnique();
4819 pCharSet->mnFont = nFont;
4820 pCharSet->mnAttrSet |= nMask;
4821 }
4822 }
4823
SetColor(sal_uInt32 nColor)4824 void PPTCharPropSet::SetColor( sal_uInt32 nColor )
4825 {
4826 ImplMakeUnique();
4827 pCharSet->mnColor = nColor;
4828 pCharSet->mnAttrSet |= 1 << PPT_CharAttr_FontColor;
4829 }
4830
4831 ////////////////////////////////////////////////////////////////////////////////////////////////////
4832
PPTRuler()4833 PPTRuler::PPTRuler() :
4834 nRefCount ( 1 ),
4835 nFlags ( 0 ),
4836 pTab ( NULL ),
4837 nTabCount ( 0 )
4838 {
4839 }
4840
~PPTRuler()4841 PPTRuler::~PPTRuler()
4842 {
4843 delete[] pTab;
4844 };
4845
4846
PPTTextRulerInterpreter()4847 PPTTextRulerInterpreter::PPTTextRulerInterpreter() :
4848 mpImplRuler ( new PPTRuler() )
4849 {
4850 }
4851
PPTTextRulerInterpreter(PPTTextRulerInterpreter & rRuler)4852 PPTTextRulerInterpreter::PPTTextRulerInterpreter( PPTTextRulerInterpreter& rRuler )
4853 {
4854 mpImplRuler = rRuler.mpImplRuler;
4855 mpImplRuler->nRefCount++;
4856 }
4857
PPTTextRulerInterpreter(sal_uInt32 nFileOfs,SdrPowerPointImport & rMan,DffRecordHeader & rHeader,SvStream & rIn)4858 PPTTextRulerInterpreter::PPTTextRulerInterpreter( sal_uInt32 nFileOfs, SdrPowerPointImport& rMan, DffRecordHeader& rHeader, SvStream& rIn ) :
4859 mpImplRuler ( new PPTRuler() )
4860 {
4861 if ( nFileOfs != 0xffffffff )
4862 {
4863 sal_uInt32 nOldPos = rIn.Tell();
4864 DffRecordHeader rHd;
4865 if ( nFileOfs )
4866 {
4867 rIn.Seek( nFileOfs );
4868 rIn >> rHd;
4869 }
4870 else
4871 {
4872 rHeader.SeekToContent( rIn );
4873 if ( rMan.SeekToRec( rIn, PPT_PST_TextRulerAtom, rHeader.GetRecEndFilePos(), &rHd ) )
4874 nFileOfs++;
4875 }
4876 if ( nFileOfs )
4877 {
4878 sal_Int16 nTCount;
4879 sal_Int32 i;
4880 rIn >> mpImplRuler->nFlags;
4881 if ( mpImplRuler->nFlags & 1 )
4882 rIn >> mpImplRuler->nDefaultTab;
4883 if ( mpImplRuler->nFlags & 4 )
4884 {
4885 rIn >> nTCount;
4886 if ( nTCount )
4887 {
4888 mpImplRuler->nTabCount = (sal_uInt16)nTCount;
4889 mpImplRuler->pTab = new PPTTabEntry[ mpImplRuler->nTabCount ];
4890 for ( i = 0; i < nTCount; i++ )
4891 {
4892 rIn >> mpImplRuler->pTab[ i ].nOffset
4893 >> mpImplRuler->pTab[ i ].nStyle;
4894 }
4895 }
4896 }
4897 for ( i = 0; i < 5; i++ )
4898 {
4899 if ( mpImplRuler->nFlags & ( 8 << i ) )
4900 rIn >> mpImplRuler->nTextOfs[ i ];
4901 if ( mpImplRuler->nFlags & ( 256 << i ) )
4902 rIn >> mpImplRuler->nBulletOfs[ i ];
4903 }
4904 }
4905 rIn.Seek( nOldPos );
4906 }
4907 }
4908
GetDefaultTab(sal_uInt32,sal_uInt16 & nValue) const4909 sal_Bool PPTTextRulerInterpreter::GetDefaultTab( sal_uInt32 /*nLevel*/, sal_uInt16& nValue ) const
4910 {
4911 if ( ! ( mpImplRuler->nFlags & 1 ) )
4912 return sal_False;
4913 nValue = mpImplRuler->nDefaultTab;
4914 return sal_True;
4915 }
4916
GetTextOfs(sal_uInt32 nLevel,sal_uInt16 & nValue) const4917 sal_Bool PPTTextRulerInterpreter::GetTextOfs( sal_uInt32 nLevel, sal_uInt16& nValue ) const
4918 {
4919 if ( ! ( ( nLevel < 5 ) && ( mpImplRuler->nFlags & ( 8 << nLevel ) ) ) )
4920 return sal_False;
4921 nValue = mpImplRuler->nTextOfs[ nLevel ];
4922 return sal_True;
4923 }
4924
GetBulletOfs(sal_uInt32 nLevel,sal_uInt16 & nValue) const4925 sal_Bool PPTTextRulerInterpreter::GetBulletOfs( sal_uInt32 nLevel, sal_uInt16& nValue ) const
4926 {
4927 if ( ! ( ( nLevel < 5 ) && ( mpImplRuler->nFlags & ( 256 << nLevel ) ) ) )
4928 return sal_False;
4929 nValue = mpImplRuler->nBulletOfs[ nLevel ];
4930 return sal_True;
4931 }
4932
operator =(PPTTextRulerInterpreter & rRuler)4933 PPTTextRulerInterpreter& PPTTextRulerInterpreter::operator=( PPTTextRulerInterpreter& rRuler )
4934 {
4935 if ( this != &rRuler )
4936 {
4937 if ( ! ( --mpImplRuler->nRefCount ) )
4938 delete mpImplRuler;
4939 mpImplRuler = rRuler.mpImplRuler;
4940 mpImplRuler->nRefCount++;
4941 }
4942 return *this;
4943 }
4944
~PPTTextRulerInterpreter()4945 PPTTextRulerInterpreter::~PPTTextRulerInterpreter()
4946 {
4947 if ( ! ( --mpImplRuler->nRefCount ) )
4948 delete mpImplRuler;
4949 }
4950
4951 ////////////////////////////////////////////////////////////////////////////////////////////////////
4952
PPTTextCharacterStyleAtomInterpreter()4953 PPTTextCharacterStyleAtomInterpreter::PPTTextCharacterStyleAtomInterpreter() :
4954 nFlags1 ( 0 ),
4955 nFlags2 ( 0 ),
4956 nFlags3 ( 0 )
4957 {
4958 }
4959
Read(SvStream & rIn,const DffRecordHeader & rRecHd)4960 sal_Bool PPTTextCharacterStyleAtomInterpreter::Read( SvStream& rIn, const DffRecordHeader& rRecHd )
4961 {
4962 rRecHd.SeekToContent( rIn );
4963
4964 rIn >> nFlags1
4965 >> nFlags2
4966 >> nFlags3
4967 >> n1
4968 >> nFontHeight
4969 >> nFontColor;
4970
4971 return sal_True;
4972 }
4973
~PPTTextCharacterStyleAtomInterpreter()4974 PPTTextCharacterStyleAtomInterpreter::~PPTTextCharacterStyleAtomInterpreter()
4975 {
4976 }
4977
4978 ////////////////////////////////////////////////////////////////////////////////////////////////////
PPTTextParagraphStyleAtomInterpreter()4979 PPTTextParagraphStyleAtomInterpreter::PPTTextParagraphStyleAtomInterpreter() :
4980 bValid ( sal_False ),
4981 bForbiddenRules ( sal_False ),
4982 bHangingPunctuation ( sal_False ),
4983 bLatinTextWrap ( sal_False )
4984 {
4985 }
4986
Read(SvStream & rIn,const DffRecordHeader & rRecHd)4987 sal_Bool PPTTextParagraphStyleAtomInterpreter::Read( SvStream& rIn, const DffRecordHeader& rRecHd )
4988 {
4989 bValid = sal_False;
4990 rRecHd.SeekToContent( rIn );
4991 sal_uInt32 nDummy32, nFlags, nRecEndPos = rRecHd.GetRecEndFilePos();
4992 sal_uInt16 nDummy16;
4993
4994 rIn >> nDummy16
4995 >> nFlags;
4996
4997 if ( nFlags & 0xf && ( rIn.Tell() < nRecEndPos ) )
4998 rIn >> nDummy16; // BuFlags
4999 if ( nFlags & 0x80 && ( rIn.Tell() < nRecEndPos ) )
5000 rIn >> nDummy16; // BuChar
5001 if ( nFlags & 0x10 && ( rIn.Tell() < nRecEndPos ) )
5002 rIn >> nDummy16; // nBuFont;
5003 if ( nFlags & 0x40 && ( rIn.Tell() < nRecEndPos ) )
5004 rIn >> nDummy16; // nBuHeight;
5005 if ( nFlags & 0x0020 && ( rIn.Tell() < nRecEndPos ) )
5006 rIn >> nDummy32; // nBuColor;
5007 if ( nFlags & 0x800 && ( rIn.Tell() < nRecEndPos ) )
5008 rIn >> nDummy16; // AbsJust!
5009 if ( nFlags & 0x400 && ( rIn.Tell() < nRecEndPos ) )
5010 rIn >> nDummy16;
5011 if ( nFlags & 0x200 && ( rIn.Tell() < nRecEndPos ) )
5012 rIn >> nDummy16;
5013 if ( nFlags & 0x100 && ( rIn.Tell() < nRecEndPos ) )
5014 rIn >> nDummy16;
5015 if ( nFlags & 0x1000 && ( rIn.Tell() < nRecEndPos ) )
5016 rIn >> nDummy16; // LineFeed
5017 if ( nFlags & 0x2000 && ( rIn.Tell() < nRecEndPos ) )
5018 rIn >> nDummy16; // nUpperDist
5019 if ( nFlags & 0x4000 && ( rIn.Tell() < nRecEndPos ) )
5020 rIn >> nDummy16; // nLowerDist
5021 if ( nFlags & 0x8000 && ( rIn.Tell() < nRecEndPos ) )
5022 rIn >> nDummy16;
5023 if ( nFlags & 0x10000 && ( rIn.Tell() < nRecEndPos ) )
5024 rIn >> nDummy16;
5025 if ( nFlags & 0xe0000 && ( rIn.Tell() < nRecEndPos ) )
5026 {
5027 rIn >> nDummy16;
5028 if ( nFlags & 0x20000 )
5029 bForbiddenRules = ( nDummy16 & 1 ) == 1;
5030 if ( nFlags & 0x40000 )
5031 bLatinTextWrap = ( nDummy16 & 2 ) == 0;
5032 if ( nFlags & 0x80000 )
5033 bHangingPunctuation = ( nDummy16 & 4 ) == 4;
5034 }
5035 nFlags &=~ 0xfffff;
5036 sal_uInt32 nMask = 0x100000;
5037 while ( nFlags && nMask && ( rIn.Tell() < nRecEndPos ) )
5038 {
5039 if ( nFlags & nMask )
5040 {
5041 rIn >> nDummy16;
5042 nFlags ^= nMask;
5043 }
5044 nMask <<= 1;
5045 }
5046 bValid = rIn.Tell() == nRecEndPos;
5047 return bValid;
5048 }
5049
~PPTTextParagraphStyleAtomInterpreter()5050 PPTTextParagraphStyleAtomInterpreter::~PPTTextParagraphStyleAtomInterpreter()
5051 {
5052
5053 }
5054
5055 ////////////////////////////////////////////////////////////////////////////////////////////////////
5056
PPTTextSpecInfo(sal_uInt32 _nCharIdx)5057 PPTTextSpecInfo::PPTTextSpecInfo( sal_uInt32 _nCharIdx ) :
5058 nCharIdx ( _nCharIdx ),
5059 nDontKnow ( 1 )
5060 {
5061 nLanguage[ 0 ] = 0x400;
5062 nLanguage[ 1 ] = 0;
5063 nLanguage[ 2 ] = 0;
5064 }
5065
~PPTTextSpecInfo()5066 PPTTextSpecInfo::~PPTTextSpecInfo()
5067 {
5068 }
5069
PPTTextSpecInfoAtomInterpreter()5070 PPTTextSpecInfoAtomInterpreter::PPTTextSpecInfoAtomInterpreter() :
5071 bValid ( sal_False )
5072 {
5073 }
5074
Read(SvStream & rIn,const DffRecordHeader & rRecHd,sal_uInt16 nRecordType,const PPTTextSpecInfo * pTextSpecDefault)5075 sal_Bool PPTTextSpecInfoAtomInterpreter::Read( SvStream& rIn, const DffRecordHeader& rRecHd,
5076 sal_uInt16 nRecordType, const PPTTextSpecInfo* pTextSpecDefault )
5077 {
5078 bValid = sal_False;
5079 sal_uInt32 nCharIdx = 0;
5080 rRecHd.SeekToContent( rIn );
5081
5082 while ( rIn.Tell() < rRecHd.GetRecEndFilePos() )
5083 {
5084 sal_uInt32 nCharCount,
5085 nFlags, i;
5086
5087 if ( nRecordType == PPT_PST_TextSpecInfoAtom )
5088 {
5089 rIn >> nCharCount;
5090 nCharIdx += nCharCount;
5091 }
5092 rIn >> nFlags;
5093
5094 PPTTextSpecInfo* pEntry = new PPTTextSpecInfo( nCharIdx );
5095 if ( pTextSpecDefault )
5096 {
5097 pEntry->nDontKnow = pTextSpecDefault->nDontKnow;
5098 pEntry->nLanguage[ 0 ] = pTextSpecDefault->nLanguage[ 0 ];
5099 pEntry->nLanguage[ 1 ] = pTextSpecDefault->nLanguage[ 1 ];
5100 pEntry->nLanguage[ 2 ] = pTextSpecDefault->nLanguage[ 2 ];
5101 }
5102 for ( i = 1; nFlags && i ; i <<= 1 )
5103 {
5104 sal_uInt16 nLang = 0;
5105 switch( nFlags & i )
5106 {
5107 case 0 : break;
5108 case 1 : rIn >> pEntry->nDontKnow; break;
5109 case 2 : rIn >> nLang; break;
5110 case 4 : rIn >> nLang; break;
5111 default :
5112 {
5113 rIn.SeekRel( 2 );
5114 }
5115 }
5116 if ( nLang )
5117 {
5118 // bug119985 2012.06.14
5119 if (i == 2)
5120 {
5121 pEntry->nLanguage[ 0 ] = pEntry->nLanguage[ 1 ] = pEntry->nLanguage[ 2 ] = nLang;
5122 }
5123 }
5124 nFlags &= ~i;
5125 }
5126 aList.Insert( pEntry, LIST_APPEND );
5127 }
5128 bValid = rIn.Tell() == rRecHd.GetRecEndFilePos();
5129 return bValid;
5130 }
5131
~PPTTextSpecInfoAtomInterpreter()5132 PPTTextSpecInfoAtomInterpreter::~PPTTextSpecInfoAtomInterpreter()
5133 {
5134 void *pPtr;
5135 for ( pPtr = aList.First(); pPtr; pPtr = aList.Next() )
5136 delete (PPTTextSpecInfo*)pPtr;
5137 }
5138
5139 ////////////////////////////////////////////////////////////////////////////////////////////////////
5140
Read(SvStream & rIn)5141 void StyleTextProp9::Read( SvStream& rIn )
5142 {
5143 rIn >> mnExtParagraphMask;
5144 if ( mnExtParagraphMask & 0x800000 )
5145 rIn >> mnBuBlip;
5146 if ( mnExtParagraphMask & 0x2000000 )
5147 rIn >> mnHasAnm;
5148 if ( mnExtParagraphMask & 0x1000000 )
5149 rIn >> mnAnmScheme;
5150 if ( mnExtParagraphMask & 0x4000000 )
5151 rIn >> mpfPP10Ext;
5152 rIn >> mnExtCharacterMask;
5153 if ( mnExtCharacterMask & 0x100000 )
5154 rIn >> mncfPP10Ext;
5155 rIn >> mnSpecialInfoMask;
5156 if ( mnSpecialInfoMask & 0x20 )
5157 rIn >> mnPP10Ext;
5158 if ( mnSpecialInfoMask & 0x40 )
5159 rIn >> mfBidi;
5160 }
5161
PPTStyleTextPropReader(SvStream & rIn,SdrPowerPointImport & rMan,const DffRecordHeader & rTextHeader,PPTTextRulerInterpreter & rRuler,const DffRecordHeader & rExtParaHd,sal_uInt32 nInstance)5162 PPTStyleTextPropReader::PPTStyleTextPropReader( SvStream& rIn, SdrPowerPointImport& rMan, const DffRecordHeader& rTextHeader,
5163 PPTTextRulerInterpreter& rRuler, const DffRecordHeader& rExtParaHd, sal_uInt32 nInstance )
5164 {
5165 Init(rIn, rMan, rTextHeader, rRuler, rExtParaHd, nInstance);
5166 }
5167
ReadParaProps(SvStream & rIn,SdrPowerPointImport & rMan,const DffRecordHeader & rTextHeader,const String & aString,PPTTextRulerInterpreter & rRuler,sal_uInt32 & nCharCount,sal_Bool & bTextPropAtom)5168 void PPTStyleTextPropReader::ReadParaProps( SvStream& rIn, SdrPowerPointImport& rMan, const DffRecordHeader& rTextHeader,
5169 const String& aString, PPTTextRulerInterpreter& rRuler,
5170 sal_uInt32& nCharCount, sal_Bool& bTextPropAtom )
5171 {
5172 sal_uInt32 nMask = 0; //TODO: nMask initialized here to suppress warning for now, see corresponding TODO below
5173 sal_uInt32 nCharAnzRead = 0;
5174 sal_uInt16 nDummy16;
5175
5176 sal_uInt16 nStringLen = aString.Len();
5177
5178 DffRecordHeader aTextHd2;
5179 rTextHeader.SeekToContent( rIn );
5180 if ( rMan.SeekToRec( rIn, PPT_PST_StyleTextPropAtom, rTextHeader.GetRecEndFilePos(), &aTextHd2 ) )
5181 bTextPropAtom = sal_True;
5182 while ( nCharAnzRead <= nStringLen )
5183 {
5184 PPTParaPropSet aParaPropSet;
5185 ImplPPTParaPropSet& aSet = *aParaPropSet.pParaSet;
5186 if ( bTextPropAtom )
5187 {
5188 rIn >> nCharCount
5189 >> aParaPropSet.pParaSet->mnDepth; // Einruecktiefe
5190
5191 aParaPropSet.pParaSet->mnDepth = // taking care of about using not more than 9 outliner levels
5192 std::min(sal_uInt16(8),
5193 aParaPropSet.pParaSet->mnDepth);
5194
5195 nCharCount--;
5196
5197 rIn >> nMask;
5198 aSet.mnAttrSet = nMask & 0x207df7;
5199 sal_uInt16 nBulFlg = 0;
5200 if ( nMask & 0xF )
5201 rIn >> nBulFlg; // Bullet-HardAttr-Flags
5202 aSet.mpArry[ PPT_ParaAttr_BulletOn ] = ( nBulFlg & 1 ) ? 1 : 0;
5203 aSet.mpArry[ PPT_ParaAttr_BuHardFont ] = ( nBulFlg & 2 ) ? 1 : 0;
5204 aSet.mpArry[ PPT_ParaAttr_BuHardColor ] = ( nBulFlg & 4 ) ? 1 : 0;
5205
5206 if ( nMask & 0x0080 ) // buChar
5207 rIn >> aSet.mpArry[ PPT_ParaAttr_BulletChar ];
5208 if ( nMask & 0x0010 ) // buTypeface
5209 rIn >> aSet.mpArry[ PPT_ParaAttr_BulletFont ];
5210 if ( nMask & 0x0040 ) // buSize
5211 {
5212 rIn >> aSet.mpArry[ PPT_ParaAttr_BulletHeight ];
5213 if ( ! ( ( nMask & ( 1 << PPT_ParaAttr_BuHardHeight ) )
5214 && ( nBulFlg & ( 1 << PPT_ParaAttr_BuHardHeight ) ) ) )
5215 aSet.mnAttrSet ^= 0x40;
5216 }
5217 if ( nMask & 0x0020 ) // buColor
5218 {
5219 sal_uInt32 nVal32, nHiByte;
5220 rIn >> nVal32;
5221 nHiByte = nVal32 >> 24;
5222 if ( nHiByte <= 8 )
5223 nVal32 = nHiByte | PPT_COLSCHEME;
5224 aSet.mnBulletColor = nVal32;
5225 }
5226 if ( nMask & 0x0800 ) // pfAlignment
5227 {
5228 rIn >> nDummy16;
5229 aSet.mpArry[ PPT_ParaAttr_Adjust ] = nDummy16 & 3;
5230 }
5231 if ( nMask & 0x1000 ) // pfLineSpacing
5232 rIn >> aSet.mpArry[ PPT_ParaAttr_LineFeed ];
5233 if ( nMask & 0x2000 ) // pfSpaceBefore
5234 rIn >> aSet.mpArry[ PPT_ParaAttr_UpperDist ];
5235 if ( nMask & 0x4000 ) // pfSpaceAfter
5236 rIn >> aSet.mpArry[ PPT_ParaAttr_LowerDist ];
5237 if ( nMask & 0x100 ) // pfLeftMargin
5238 {
5239 rIn >> aSet.mpArry[ PPT_ParaAttr_TextOfs ];
5240 aSet.mnAttrSet |= 1 << PPT_ParaAttr_TextOfs;
5241 }
5242 if ( nMask & 0x400 ) // pfIndent
5243 {
5244 rIn >> aSet.mpArry[ PPT_ParaAttr_BulletOfs ];
5245 aSet.mnAttrSet |= 1 << PPT_ParaAttr_BulletOfs;
5246 }
5247 if ( nMask & 0x8000 ) // pfDefaultTabSize
5248 rIn >> nDummy16;
5249 if ( nMask & 0x100000 ) // pfTabStops
5250 {
5251 sal_uInt16 i, nDistance, nAlignment, nNumberOfTabStops = 0;
5252 rIn >> nNumberOfTabStops;
5253 for ( i = 0; i < nNumberOfTabStops; i++ )
5254 {
5255 rIn >> nDistance
5256 >> nAlignment;
5257 }
5258 }
5259 if ( nMask & 0x10000 ) // pfBaseLine
5260 rIn >> nDummy16;
5261 if ( nMask & 0xe0000 ) // pfCharWrap, pfWordWrap, pfOverflow
5262 {
5263 rIn >> nDummy16;
5264 if ( nMask & 0x20000 )
5265 aSet.mpArry[ PPT_ParaAttr_AsianLB_1 ] = nDummy16 & 1;
5266 if ( nMask & 0x40000 )
5267 aSet.mpArry[ PPT_ParaAttr_AsianLB_2 ] = ( nDummy16 >> 1 ) & 1;
5268 if ( nMask & 0x80000 )
5269 aSet.mpArry[ PPT_ParaAttr_AsianLB_3 ] = ( nDummy16 >> 2 ) & 1;
5270 aSet.mnAttrSet |= ( ( nMask >> 17 ) & 7 ) << PPT_ParaAttr_AsianLB_1;
5271 }
5272 if ( nMask & 0x200000 ) // pfTextDirection
5273 rIn >> aSet.mpArry[ PPT_ParaAttr_BiDi ];
5274 }
5275 else
5276 nCharCount = nStringLen;
5277
5278 //if the textofs attr has been read at above, need not to reset.
5279 if ( ( !( aSet.mnAttrSet & 1 << PPT_ParaAttr_TextOfs ) ) && rRuler.GetTextOfs( aParaPropSet.pParaSet->mnDepth, aSet.mpArry[ PPT_ParaAttr_TextOfs ] ) )
5280 aSet.mnAttrSet |= 1 << PPT_ParaAttr_TextOfs;
5281 if ( ( !( aSet.mnAttrSet & 1 << PPT_ParaAttr_BulletOfs ) ) && rRuler.GetBulletOfs( aParaPropSet.pParaSet->mnDepth, aSet.mpArry[ PPT_ParaAttr_BulletOfs ] ) )
5282 aSet.mnAttrSet |= 1 << PPT_ParaAttr_BulletOfs;
5283 if ( rRuler.GetDefaultTab( aParaPropSet.pParaSet->mnDepth, aSet.mpArry[ PPT_ParaAttr_DefaultTab ] ) )
5284 aSet.mnAttrSet |= 1 << PPT_ParaAttr_DefaultTab;
5285
5286 if ( ( nCharCount > nStringLen ) || ( nStringLen < nCharAnzRead + nCharCount ) )
5287 {
5288 bTextPropAtom = sal_False;
5289 nCharCount = nStringLen - nCharAnzRead;
5290 // please fix the right hand side of
5291 // PPTParaPropSet& PPTParaPropSet::operator=(PPTParaPropSet&),
5292 // it should be a const reference
5293 PPTParaPropSet aTmpPPTParaPropSet;
5294 aParaPropSet = aTmpPPTParaPropSet;
5295 DBG_ERROR( "SJ:PPTStyleTextPropReader::could not get this PPT_PST_StyleTextPropAtom by reading the paragraph attributes" );
5296 }
5297 PPTParaPropSet* pPara = new PPTParaPropSet( aParaPropSet );
5298 pPara->mnOriginalTextPos = nCharAnzRead;
5299 aParaPropList.Insert( pPara, LIST_APPEND );
5300 if ( nCharCount )
5301 {
5302 sal_uInt32 nCount;
5303 const sal_Unicode* pDat = aString.GetBuffer() + nCharAnzRead;
5304 for ( nCount = 0; nCount < nCharCount; nCount++ )
5305 {
5306 if ( pDat[ nCount ] == 0xd )
5307 {
5308 pPara = new PPTParaPropSet( aParaPropSet );
5309 pPara->mnOriginalTextPos = nCharAnzRead + nCount + 1;
5310 aParaPropList.Insert( pPara, LIST_APPEND );
5311 }
5312 }
5313 }
5314 nCharAnzRead += nCharCount + 1;
5315 }
5316 }
5317
ReadCharProps(SvStream & rIn,PPTCharPropSet & aCharPropSet,const String & aString,sal_uInt32 & nCharCount,sal_uInt32 nCharAnzRead,sal_Bool & bTextPropAtom,sal_uInt32 nExtParaPos,const std::vector<StyleTextProp9> & aStyleTextProp9,sal_uInt32 & nExtParaFlags,sal_uInt16 & nBuBlip,sal_uInt16 & nHasAnm,sal_uInt32 & nAnmScheme)5318 void PPTStyleTextPropReader::ReadCharProps( SvStream& rIn, PPTCharPropSet& aCharPropSet, const String& aString,
5319 sal_uInt32& nCharCount, sal_uInt32 nCharAnzRead,
5320 sal_Bool& bTextPropAtom, sal_uInt32 nExtParaPos,
5321 const std::vector< StyleTextProp9 >& aStyleTextProp9,
5322 sal_uInt32& nExtParaFlags, sal_uInt16& nBuBlip,
5323 sal_uInt16& nHasAnm, sal_uInt32& nAnmScheme )
5324 {
5325 sal_uInt32 nMask = 0; //TODO: nMask initialized here to suppress warning for now, see corresponding TODO below
5326 sal_uInt16 nDummy16;
5327 sal_Int32 nCharsToRead;
5328 sal_uInt32 nExtParaNibble = 0;
5329
5330 sal_uInt16 nStringLen = aString.Len();
5331
5332 rIn >> nDummy16;
5333 nCharCount = nDummy16;
5334 rIn >> nDummy16;
5335 nCharsToRead = nStringLen - ( nCharAnzRead + nCharCount );
5336 if ( nCharsToRead < 0 )
5337 {
5338 nCharCount = nStringLen - nCharAnzRead;
5339 if ( nCharsToRead < -1 )
5340 {
5341 bTextPropAtom = sal_False;
5342 DBG_ERROR( "SJ:PPTStyleTextPropReader::could not get this PPT_PST_StyleTextPropAtom by reading the character attributes" );
5343 }
5344 }
5345 ImplPPTCharPropSet& aSet = *aCharPropSet.pCharSet;
5346
5347 // character attributes
5348 rIn >> nMask;
5349 if ( (sal_uInt16)nMask )
5350 {
5351 aSet.mnAttrSet |= (sal_uInt16)nMask;
5352 rIn >> aSet.mnFlags;
5353 }
5354 if ( nMask & 0x10000 ) // cfTypeface
5355 {
5356 rIn >> aSet.mnFont;
5357 aSet.mnAttrSet |= 1 << PPT_CharAttr_Font;
5358 }
5359 if ( nMask & 0x200000 ) // cfFEOldTypeface
5360 {
5361 rIn >> aSet.mnAsianOrComplexFont;
5362 aSet.mnAttrSet |= 1 << PPT_CharAttr_AsianOrComplexFont;
5363 }
5364 if ( nMask & 0x400000 ) // cfANSITypeface
5365 {
5366 rIn >> aSet.mnANSITypeface;
5367 aSet.mnAttrSet |= 1 << PPT_CharAttr_ANSITypeface;
5368 }
5369 if ( nMask & 0x800000 ) // cfSymbolTypeface
5370 {
5371 rIn >> aSet.mnSymbolFont;
5372 aSet.mnAttrSet |= 1 << PPT_CharAttr_Symbol;
5373 }
5374 if ( nMask & 0x20000 ) // cfSize
5375 {
5376 rIn >> aSet.mnFontHeight;
5377 aSet.mnAttrSet |= 1 << PPT_CharAttr_FontHeight;
5378 }
5379 if ( nMask & 0x40000 ) // cfColor
5380 {
5381 sal_uInt32 nVal;
5382 rIn >> nVal;
5383 if ( !( nVal & 0xff000000 ) )
5384 nVal = PPT_COLSCHEME_HINTERGRUND;
5385 aSet.mnColor = nVal;
5386 aSet.mnAttrSet |= 1 << PPT_CharAttr_FontColor;
5387 }
5388 if ( nMask & 0x80000 ) // cfPosition
5389 {
5390 rIn >> aSet.mnEscapement;
5391 aSet.mnAttrSet |= 1 << PPT_CharAttr_Escapement;
5392 }
5393 if ( nExtParaPos )
5394 {
5395 sal_uInt32 nExtBuInd = nMask & 0x3c00;
5396 if ( nExtBuInd )
5397 nExtBuInd = ( aSet.mnFlags & 0x3c00 ) >> 10;
5398 if ( nExtBuInd < aStyleTextProp9.size() )
5399 {
5400 if ( nExtParaNibble && ( ( nExtBuInd + nExtParaNibble ) < aStyleTextProp9.size() ) )
5401 nExtBuInd += nExtParaNibble;
5402
5403 nExtParaFlags = aStyleTextProp9[ nExtBuInd ].mnExtParagraphMask;
5404 nBuBlip = aStyleTextProp9[ nExtBuInd ].mnBuBlip;
5405 nHasAnm = aStyleTextProp9[ nExtBuInd ].mnHasAnm;
5406 nAnmScheme = aStyleTextProp9[ nExtBuInd ].mnAnmScheme;
5407 }
5408 if ( ( nExtBuInd & 0xf ) == 0xf )
5409 nExtParaNibble += 16;
5410 }
5411 }
5412
Init(SvStream & rIn,SdrPowerPointImport & rMan,const DffRecordHeader & rTextHeader,PPTTextRulerInterpreter & rRuler,const DffRecordHeader & rExtParaHd,sal_uInt32 nInstance)5413 void PPTStyleTextPropReader::Init( SvStream& rIn, SdrPowerPointImport& rMan, const DffRecordHeader& rTextHeader,
5414 PPTTextRulerInterpreter& rRuler, const DffRecordHeader& rExtParaHd, sal_uInt32 nInstance )
5415 {
5416 sal_uInt32 nMerk = rIn.Tell();
5417 sal_uInt32 nExtParaPos = ( rExtParaHd.nRecType == PPT_PST_ExtendedParagraphAtom ) ? rExtParaHd.nFilePos + 8 : 0;
5418
5419 std::vector< StyleTextProp9 > aStyleTextProp9;
5420 if ( rExtParaHd.nRecType == PPT_PST_ExtendedParagraphAtom )
5421 {
5422 rIn.Seek( rExtParaHd.nFilePos + 8 );
5423 while( ( rIn.GetError() == 0 ) && ( rIn.Tell() < rExtParaHd.GetRecEndFilePos() ) )
5424 {
5425 aStyleTextProp9.resize( aStyleTextProp9.size() + 1 );
5426 aStyleTextProp9.back().Read( rIn );
5427 }
5428 rIn.Seek( nMerk );
5429 }
5430
5431 String aString;
5432 DffRecordHeader aTextHd;
5433 rIn >> aTextHd;
5434 sal_uInt32 nMaxLen = aTextHd.nRecLen;
5435 if ( nMaxLen >= 0xFFFF )
5436 nMaxLen = 0xFFFE;
5437
5438 if( aTextHd.nRecType == PPT_PST_TextCharsAtom )
5439 {
5440 sal_uInt32 i;
5441 sal_Unicode nChar,*pBuf = new sal_Unicode[ ( nMaxLen >> 1 ) + 1 ];
5442 rIn.Read( pBuf, nMaxLen );
5443 nMaxLen >>= 1;
5444 pBuf[ nMaxLen ] = 0;
5445 sal_Unicode* pPtr = pBuf;
5446 #ifdef OSL_BIGENDIAN
5447 sal_Unicode nTemp;
5448 for ( i = 0; i < nMaxLen; i++ )
5449 {
5450 nTemp = *pPtr;
5451 *pPtr++ = ( nTemp << 8 ) | ( nTemp >> 8 );
5452 }
5453 pPtr = pBuf;
5454 #endif
5455
5456 for ( i = 0; i < nMaxLen; pPtr++, i++ )
5457 {
5458 nChar = *pPtr;
5459 if ( !nChar )
5460 break;
5461 if ( ( nChar & 0xff00 ) == 0xf000 ) // in this special case we got a symbol
5462 aSpecMarkerList.Insert( (void*)( i | PPT_SPEC_SYMBOL ), LIST_APPEND );
5463 else if ( nChar == 0xd )
5464 {
5465 if ( nInstance == TSS_TYPE_PAGETITLE )
5466 *pPtr = 0xb;
5467 else
5468 aSpecMarkerList.Insert( (void*)( i | PPT_SPEC_NEWLINE ), LIST_APPEND );
5469 }
5470 }
5471 if ( i )
5472 aString = String( pBuf, (sal_uInt16)i );
5473 delete[] pBuf;
5474 }
5475 else if( aTextHd.nRecType == PPT_PST_TextBytesAtom )
5476 {
5477 sal_Char *pBuf = new sal_Char[ nMaxLen + 1 ];
5478 pBuf[ nMaxLen ] = 0;
5479 rIn.Read( pBuf, nMaxLen );
5480 sal_Char* pPtr = pBuf;
5481 for (;;)
5482 {
5483 sal_Char cLo = *pPtr;
5484 if ( cLo == 0 )
5485 break;
5486 if ( cLo == 0xd )
5487 {
5488 if ( nInstance == TSS_TYPE_PAGETITLE )
5489 *pPtr = 0xb;
5490 else
5491 aSpecMarkerList.Insert( (void*)( (pPtr - pBuf) | PPT_SPEC_NEWLINE ), LIST_APPEND );
5492 }
5493 pPtr++;
5494 }
5495 xub_StrLen nLen = sal::static_int_cast< xub_StrLen >( pPtr - pBuf );
5496 if ( nLen )
5497 aString = String( pBuf, nLen, RTL_TEXTENCODING_MS_1252 );
5498 delete[] pBuf;
5499 }
5500 else
5501 {
5502 // no chars, but potentially char/para props?
5503 sal_uInt32 nCharCount;
5504 sal_Bool bTextPropAtom = sal_False;
5505 ReadParaProps( rIn, rMan, rTextHeader, aString, rRuler, nCharCount, bTextPropAtom );
5506
5507 if ( bTextPropAtom )
5508 {
5509 // yeah, StyleTextProp is there, read it all & push to
5510 // aParaPropList
5511 PPTCharPropSet aCharPropSet(0);
5512 aCharPropSet.mnOriginalTextPos = 0;
5513
5514 sal_uInt32 nCharAnzRead = 0;
5515 sal_uInt32 nExtParaFlags = 0, nAnmScheme = 0;
5516 sal_uInt16 nBuBlip = 0xffff, nHasAnm = 0;
5517 ReadCharProps( rIn, aCharPropSet, aString, nCharCount, nCharAnzRead,
5518 bTextPropAtom, nExtParaPos, aStyleTextProp9, nExtParaFlags,
5519 nBuBlip, nHasAnm, nAnmScheme );
5520
5521 aCharPropList.Insert(
5522 new PPTCharPropSet( aCharPropSet, 0 ), LIST_APPEND );
5523 }
5524 }
5525
5526 if ( aString.Len() )
5527 {
5528 sal_uInt32 nCharCount;
5529 sal_Bool bTextPropAtom = sal_False;
5530
5531 ReadParaProps( rIn, rMan, rTextHeader, aString, rRuler, nCharCount, bTextPropAtom );
5532
5533 sal_Bool bEmptyParaPossible = sal_True;
5534 sal_uInt32 nCharAnzRead = 0;
5535 sal_uInt32 nCurrentPara = 0;
5536 sal_uInt32 nCurrentSpecMarker = (sal_uInt32)(sal_uIntPtr)aSpecMarkerList.First();
5537 sal_uInt16 nStringLen = aString.Len();
5538
5539 while ( nCharAnzRead < nStringLen )
5540 {
5541 sal_uInt32 nExtParaFlags = 0, nLatestParaUpdate = 0xffffffff, nAnmScheme = 0;
5542 sal_uInt16 nBuBlip = 0xffff, nHasAnm = 0;
5543
5544 PPTCharPropSet aCharPropSet( nCurrentPara );
5545 if ( bTextPropAtom )
5546 ReadCharProps( rIn, aCharPropSet, aString, nCharCount, nCharAnzRead,
5547 bTextPropAtom, nExtParaPos, aStyleTextProp9, nExtParaFlags,
5548 nBuBlip, nHasAnm, nAnmScheme );
5549 else
5550 nCharCount = nStringLen;
5551
5552 sal_uInt32 nLen;
5553 while( nCharCount )
5554 {
5555 if ( nExtParaPos && ( nLatestParaUpdate != nCurrentPara ) && ( nCurrentPara < aParaPropList.Count() ) )
5556 {
5557 PPTParaPropSet* pPropSet = (PPTParaPropSet*)aParaPropList.GetObject( nCurrentPara );
5558 pPropSet->pParaSet->mnExtParagraphMask = nExtParaFlags;
5559 if ( nExtParaFlags & 0x800000 )
5560 pPropSet->pParaSet->mnBuBlip = nBuBlip;
5561 if ( nExtParaFlags & 0x01000000 )
5562 pPropSet->pParaSet->mnAnmScheme = nAnmScheme;
5563 if ( nExtParaFlags & 0x02000000 )
5564 pPropSet->pParaSet->mnHasAnm = nHasAnm;
5565 nLatestParaUpdate = nCurrentPara;
5566 }
5567 aCharPropSet.mnOriginalTextPos = nCharAnzRead;
5568 if ( nCurrentSpecMarker && ( ( nCurrentSpecMarker & 0xffff ) < ( nCharAnzRead + nCharCount ) ) )
5569 {
5570 if ( nCurrentSpecMarker & PPT_SPEC_NEWLINE )
5571 {
5572 nLen = ( nCurrentSpecMarker & 0xffff ) - nCharAnzRead;
5573 if ( nLen )
5574 aCharPropSet.maString = String( aString, (sal_uInt16)nCharAnzRead, (sal_uInt16)nLen );
5575 else if ( bEmptyParaPossible )
5576 aCharPropSet.maString = String();
5577 if ( nLen || bEmptyParaPossible )
5578 aCharPropList.Insert( new PPTCharPropSet( aCharPropSet, nCurrentPara ), LIST_APPEND );
5579 nCurrentPara++;
5580 nLen++;
5581 nCharAnzRead += nLen;
5582 nCharCount -= nLen;
5583 bEmptyParaPossible = sal_True;
5584 }
5585 else if ( nCurrentSpecMarker & PPT_SPEC_SYMBOL )
5586 {
5587 if ( ( nCurrentSpecMarker & 0xffff ) != nCharAnzRead )
5588 {
5589 nLen = ( nCurrentSpecMarker & 0xffff ) - nCharAnzRead;
5590 aCharPropSet.maString = String( aString, (sal_uInt16)nCharAnzRead, (sal_uInt16)nLen );
5591 aCharPropList.Insert( new PPTCharPropSet( aCharPropSet, nCurrentPara ), LIST_APPEND );
5592 nCharCount -= nLen;
5593 nCharAnzRead += nLen;
5594 }
5595 PPTCharPropSet* pCPropSet = new PPTCharPropSet( aCharPropSet, nCurrentPara );
5596 pCPropSet->maString = aString.GetChar( (sal_uInt16)nCharAnzRead );
5597 if ( aCharPropSet.pCharSet->mnAttrSet & ( 1 << PPT_CharAttr_Symbol ) )
5598 pCPropSet->SetFont( aCharPropSet.pCharSet->mnSymbolFont );
5599 aCharPropList.Insert( pCPropSet, LIST_APPEND );
5600 nCharCount--;
5601 nCharAnzRead++;
5602 bEmptyParaPossible = sal_False;
5603 }
5604 nCurrentSpecMarker = (sal_uInt32)(sal_uIntPtr)aSpecMarkerList.Next();
5605 }
5606 else
5607 {
5608 aCharPropSet.maString = String( aString, (sal_uInt16)nCharAnzRead, (sal_uInt16)nCharCount );
5609 aCharPropList.Insert( new PPTCharPropSet( aCharPropSet, nCurrentPara ), LIST_APPEND );
5610 nCharAnzRead += nCharCount;
5611 bEmptyParaPossible = sal_False;
5612 break;
5613 }
5614 }
5615 }
5616 if ( aCharPropList.Count() && ( ((PPTCharPropSet*)aCharPropList.Last())->mnParagraph != nCurrentPara ) )
5617 {
5618 PPTCharPropSet* pCharPropSet = new PPTCharPropSet( *(PPTCharPropSet*)aCharPropList.Last(), nCurrentPara );
5619 pCharPropSet->maString = String();
5620 pCharPropSet->mnOriginalTextPos = nStringLen - 1;
5621 aCharPropList.Insert( pCharPropSet, LIST_APPEND );
5622 }
5623 }
5624 rIn.Seek( nMerk );
5625 }
5626
~PPTStyleTextPropReader()5627 PPTStyleTextPropReader::~PPTStyleTextPropReader()
5628 {
5629 void* pTmp;
5630 for ( pTmp = aParaPropList.First(); pTmp; pTmp = aParaPropList.Next() )
5631 delete (PPTParaPropSet*)pTmp;
5632 for ( pTmp = aCharPropList.First(); pTmp; pTmp = aCharPropList.Next() )
5633 delete (PPTCharPropSet*)pTmp;
5634 }
5635
5636 ////////////////////////////////////////////////////////////////////////////////////////////////////
5637
5638 struct FieldEntry
5639 {
5640 sal_uInt32 nFieldType;
5641 sal_uInt32 nFieldStartPos;
5642 sal_uInt32 nFieldEndPos;
5643 String aFieldUrl;
5644
FieldEntryFieldEntry5645 FieldEntry( sal_uInt32 nType, sal_uInt32 nStart, sal_uInt32 nEnd )
5646 {
5647 nFieldType = nType;
5648 nFieldStartPos = nStart;
5649 nFieldEndPos = nEnd;
5650 }
FieldEntryFieldEntry5651 FieldEntry( FieldEntry& rFieldEntry )
5652 {
5653 nFieldType = rFieldEntry.nFieldType;
5654 nFieldStartPos = rFieldEntry.nFieldStartPos;
5655 nFieldEndPos = rFieldEntry.nFieldEndPos;
5656 aFieldUrl = rFieldEntry.aFieldUrl;
5657 }
5658 };
5659
5660
PPTPortionObj(const PPTStyleSheet & rStyleSheet,sal_uInt32 nInstance,sal_uInt32 nDepth)5661 PPTPortionObj::PPTPortionObj( const PPTStyleSheet& rStyleSheet, sal_uInt32 nInstance, sal_uInt32 nDepth ) :
5662 PPTCharPropSet ( 0 ),
5663 mrStyleSheet ( rStyleSheet ),
5664 mnInstance ( nInstance ),
5665 mnDepth ( ( nDepth > 4 ) ? 4 : nDepth )
5666 {
5667 }
5668
PPTPortionObj(PPTCharPropSet & rCharPropSet,const PPTStyleSheet & rStyleSheet,sal_uInt32 nInstance,sal_uInt32 nDepth)5669 PPTPortionObj::PPTPortionObj( PPTCharPropSet& rCharPropSet, const PPTStyleSheet& rStyleSheet, sal_uInt32 nInstance, sal_uInt32 nDepth ) :
5670 PPTCharPropSet ( rCharPropSet ),
5671 mrStyleSheet ( rStyleSheet ),
5672 mnInstance ( nInstance ),
5673 mnDepth ( nDepth )
5674 {
5675 }
5676
PPTPortionObj(PPTPortionObj & rPortionObj)5677 PPTPortionObj::PPTPortionObj( PPTPortionObj& rPortionObj ) :
5678 PPTCharPropSet ( rPortionObj ),
5679 mrStyleSheet ( rPortionObj.mrStyleSheet ),
5680 mnInstance ( rPortionObj.mnInstance ),
5681 mnDepth ( rPortionObj.mnDepth )
5682 {
5683 }
5684
~PPTPortionObj()5685 PPTPortionObj::~PPTPortionObj()
5686 {
5687 }
5688
HasTabulator()5689 sal_Bool PPTPortionObj::HasTabulator()
5690 {
5691 sal_Bool bRetValue = sal_False;
5692 sal_Int32 nCount;
5693 const sal_Unicode* pPtr = maString.GetBuffer();
5694 for ( nCount = 0; nCount < maString.Len(); nCount++ )
5695 {
5696 if ( pPtr[ nCount ] == 0x9 )
5697 {
5698 bRetValue = sal_True;
5699 break;
5700 }
5701
5702 }
5703 return bRetValue;
5704 }
5705
GetAttrib(sal_uInt32 nAttr,sal_uInt32 & nRetValue,sal_uInt32 nDestinationInstance)5706 sal_Bool PPTPortionObj::GetAttrib( sal_uInt32 nAttr, sal_uInt32& nRetValue, sal_uInt32 nDestinationInstance )
5707 {
5708 sal_uInt32 nMask = 1 << nAttr;
5709 nRetValue = 0;
5710
5711 sal_uInt32 bIsHardAttribute = ( ( pCharSet->mnAttrSet & nMask ) != 0 ) ? 1 : 0;
5712
5713 if ( bIsHardAttribute )
5714 {
5715 switch ( nAttr )
5716 {
5717 case PPT_CharAttr_Bold :
5718 case PPT_CharAttr_Italic :
5719 case PPT_CharAttr_Underline :
5720 case PPT_CharAttr_Shadow :
5721 case PPT_CharAttr_Strikeout :
5722 case PPT_CharAttr_Embossed :
5723 nRetValue = ( pCharSet->mnFlags & nMask ) ? 1 : 0;
5724 break;
5725 case PPT_CharAttr_Font :
5726 nRetValue = pCharSet->mnFont;
5727 break;
5728 case PPT_CharAttr_AsianOrComplexFont :
5729 nRetValue = pCharSet->mnAsianOrComplexFont;
5730 break;
5731 case PPT_CharAttr_FontHeight :
5732 nRetValue = pCharSet->mnFontHeight;
5733 break;
5734 case PPT_CharAttr_FontColor :
5735 nRetValue = pCharSet->mnColor;
5736 break;
5737 case PPT_CharAttr_Escapement :
5738 nRetValue = pCharSet->mnEscapement;
5739 break;
5740 default :
5741 DBG_ERROR( "SJ:PPTPortionObj::GetAttrib ( hard attribute does not exist )" );
5742 }
5743 }
5744 else
5745 {
5746 const PPTCharLevel& rCharLevel = mrStyleSheet.mpCharSheet[ mnInstance ]->maCharLevel[ mnDepth ];
5747 PPTCharLevel* pCharLevel = NULL;
5748 if ( ( nDestinationInstance == 0xffffffff )
5749 || ( mnDepth && ( ( mnInstance == TSS_TYPE_SUBTITLE ) || ( mnInstance == TSS_TYPE_TEXT_IN_SHAPE ) ) ) )
5750 bIsHardAttribute = 1;
5751 else if ( nDestinationInstance != mnInstance )
5752 pCharLevel = &mrStyleSheet.mpCharSheet[ nDestinationInstance ]->maCharLevel[ mnDepth ];
5753 switch( nAttr )
5754 {
5755 case PPT_CharAttr_Bold :
5756 case PPT_CharAttr_Italic :
5757 case PPT_CharAttr_Underline :
5758 case PPT_CharAttr_Shadow :
5759 case PPT_CharAttr_Strikeout :
5760 case PPT_CharAttr_Embossed :
5761 {
5762 nRetValue = ( rCharLevel.mnFlags & nMask ) ? 1 : 0;
5763 if ( pCharLevel )
5764 {
5765 sal_uInt32 nTmp = ( pCharLevel->mnFlags & nMask ) ? 1 : 0;
5766 if ( nRetValue != nTmp )
5767 bIsHardAttribute = 1;
5768 }
5769 }
5770 break;
5771 case PPT_CharAttr_Font :
5772 {
5773 nRetValue = rCharLevel.mnFont;
5774 if ( pCharLevel && ( nRetValue != pCharLevel->mnFont ) )
5775 bIsHardAttribute = 1;
5776 }
5777 break;
5778 case PPT_CharAttr_AsianOrComplexFont :
5779 {
5780 nRetValue = rCharLevel.mnAsianOrComplexFont;
5781 if ( pCharLevel && ( nRetValue != pCharLevel->mnAsianOrComplexFont ) )
5782 bIsHardAttribute = 1;
5783 }
5784 break;
5785 case PPT_CharAttr_FontHeight :
5786 {
5787 nRetValue = rCharLevel.mnFontHeight;
5788 if ( pCharLevel && ( nRetValue != pCharLevel->mnFontHeight ) )
5789 bIsHardAttribute = 1;
5790 }
5791 break;
5792 case PPT_CharAttr_FontColor :
5793 {
5794 nRetValue = rCharLevel.mnFontColor;
5795 if ( pCharLevel && ( nRetValue != pCharLevel->mnFontColor ) )
5796 bIsHardAttribute = 1;
5797 }
5798 break;
5799 case PPT_CharAttr_Escapement :
5800 {
5801 nRetValue = rCharLevel.mnEscapement;
5802 if ( pCharLevel && ( nRetValue != pCharLevel->mnEscapement ) )
5803 bIsHardAttribute = 1;
5804 }
5805 break;
5806 default :
5807 DBG_ERROR( "SJ:PPTPortionObj::GetAttrib ( attribute does not exist )" );
5808 }
5809 }
5810 return (sal_Bool)bIsHardAttribute;
5811 }
5812
ApplyTo(SfxItemSet & rSet,SdrPowerPointImport & rManager,sal_uInt32 nDestinationInstance)5813 void PPTPortionObj::ApplyTo( SfxItemSet& rSet, SdrPowerPointImport& rManager, sal_uInt32 nDestinationInstance )
5814 {
5815 ApplyTo( rSet, rManager, nDestinationInstance, NULL );
5816 }
5817
ApplyTo(SfxItemSet & rSet,SdrPowerPointImport & rManager,sal_uInt32 nDestinationInstance,const PPTTextObj * pTextObj)5818 void PPTPortionObj::ApplyTo( SfxItemSet& rSet, SdrPowerPointImport& rManager, sal_uInt32 nDestinationInstance, const PPTTextObj* pTextObj )
5819 {
5820 sal_uInt32 nVal;
5821 if ( GetAttrib( PPT_CharAttr_Bold, nVal, nDestinationInstance ) )
5822 {
5823 rSet.Put( SvxWeightItem( nVal != 0 ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
5824 rSet.Put( SvxWeightItem( nVal != 0 ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK ) );
5825 rSet.Put( SvxWeightItem( nVal != 0 ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL ) );
5826 }
5827 if ( GetAttrib( PPT_CharAttr_Italic, nVal, nDestinationInstance ) )
5828 {
5829 rSet.Put( SvxPostureItem( nVal != 0 ? ITALIC_NORMAL : ITALIC_NONE, EE_CHAR_ITALIC ) );
5830 rSet.Put( SvxPostureItem( nVal != 0 ? ITALIC_NORMAL : ITALIC_NONE, EE_CHAR_ITALIC_CJK ) );
5831 rSet.Put( SvxPostureItem( nVal != 0 ? ITALIC_NORMAL : ITALIC_NONE, EE_CHAR_ITALIC_CTL ) );
5832 }
5833 if ( GetAttrib( PPT_CharAttr_Underline, nVal, nDestinationInstance ) )
5834 rSet.Put( SvxUnderlineItem( nVal != 0 ? UNDERLINE_SINGLE : UNDERLINE_NONE, EE_CHAR_UNDERLINE ) );
5835
5836 if ( GetAttrib( PPT_CharAttr_Shadow, nVal, nDestinationInstance ) )
5837 rSet.Put( SvxShadowedItem( nVal != 0, EE_CHAR_SHADOW ) );
5838
5839 if ( GetAttrib( PPT_CharAttr_Strikeout, nVal, nDestinationInstance ) )
5840 rSet.Put( SvxCrossedOutItem( nVal != 0 ? STRIKEOUT_SINGLE : STRIKEOUT_NONE, EE_CHAR_STRIKEOUT ) );
5841
5842 sal_uInt32 nAsianFontId = 0xffff;
5843 if ( GetAttrib( PPT_CharAttr_AsianOrComplexFont, nAsianFontId, nDestinationInstance ) )
5844 {
5845 if ( nAsianFontId != 0xffff )
5846 {
5847 PptFontEntityAtom* pFontEnityAtom = rManager.GetFontEnityAtom( nAsianFontId );
5848 if ( pFontEnityAtom )
5849 {
5850 rSet.Put( SvxFontItem( pFontEnityAtom->eFamily, pFontEnityAtom->aName,
5851 String(), pFontEnityAtom->ePitch, pFontEnityAtom->eCharSet, EE_CHAR_FONTINFO_CJK ) );
5852 rSet.Put( SvxFontItem( pFontEnityAtom->eFamily, pFontEnityAtom->aName,
5853 String(), pFontEnityAtom->ePitch, pFontEnityAtom->eCharSet, EE_CHAR_FONTINFO_CTL ) );
5854 }
5855 }
5856 }
5857 if ( GetAttrib( PPT_CharAttr_Font, nVal, nDestinationInstance ) )
5858 {
5859 PptFontEntityAtom* pFontEnityAtom = rManager.GetFontEnityAtom( nVal );
5860 if ( pFontEnityAtom )
5861 {
5862 rSet.Put( SvxFontItem( pFontEnityAtom->eFamily, pFontEnityAtom->aName, String(), pFontEnityAtom->ePitch, pFontEnityAtom->eCharSet, EE_CHAR_FONTINFO ) );
5863
5864 // #119475# bullet font info for CJK and CTL
5865 if ( RTL_TEXTENCODING_SYMBOL == pFontEnityAtom->eCharSet )
5866 {
5867 rSet.Put( SvxFontItem( pFontEnityAtom->eFamily, pFontEnityAtom->aName, String(), pFontEnityAtom->ePitch, pFontEnityAtom->eCharSet, EE_CHAR_FONTINFO_CJK ) );
5868 rSet.Put( SvxFontItem( pFontEnityAtom->eFamily, pFontEnityAtom->aName, String(), pFontEnityAtom->ePitch, pFontEnityAtom->eCharSet, EE_CHAR_FONTINFO_CTL ) );
5869 }
5870 }
5871 }
5872 if ( GetAttrib( PPT_CharAttr_FontHeight, nVal, nDestinationInstance ) ) // Schriftgrad in Point
5873 {
5874 sal_uInt32 nHeight = rManager.ScalePoint( nVal );
5875 rSet.Put( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT ) );
5876 rSet.Put( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT_CJK ) );
5877 rSet.Put( SvxFontHeightItem( nHeight, 100, EE_CHAR_FONTHEIGHT_CTL ) );
5878 }
5879
5880 if ( GetAttrib( PPT_CharAttr_Embossed, nVal, nDestinationInstance ) )
5881 rSet.Put( SvxCharReliefItem( nVal != 0 ? RELIEF_EMBOSSED : RELIEF_NONE, EE_CHAR_RELIEF ) );
5882 if ( nVal ) /* if Embossed is set, the font color depends to the fillstyle/color of the object,
5883 if the object has no fillstyle, the font color depends to fillstyle of the background */
5884 {
5885 Color aDefColor( COL_BLACK );
5886 MSO_FillType eFillType = mso_fillSolid;
5887 if ( rManager.GetPropertyValue( DFF_Prop_fNoFillHitTest ) & 0x10 )
5888 eFillType = (MSO_FillType)rManager.GetPropertyValue( DFF_Prop_fillType, mso_fillSolid );
5889 else
5890 eFillType = mso_fillBackground;
5891 switch( eFillType )
5892 {
5893 case mso_fillShade :
5894 case mso_fillShadeCenter :
5895 case mso_fillShadeShape :
5896 case mso_fillShadeScale :
5897 case mso_fillShadeTitle :
5898 case mso_fillSolid :
5899 aDefColor = rManager.MSO_CLR_ToColor( rManager.GetPropertyValue( DFF_Prop_fillColor ) );
5900 break;
5901 case mso_fillPattern :
5902 aDefColor = rManager.MSO_CLR_ToColor( rManager.GetPropertyValue( DFF_Prop_fillBackColor ) );
5903 break;
5904 case mso_fillTexture :
5905 {
5906 Graphic aGraf;
5907 if ( rManager.GetBLIP( rManager.GetPropertyValue( DFF_Prop_fillBlip ), aGraf, NULL ) )
5908 {
5909 Bitmap aBmp( aGraf.GetBitmap() );
5910 Size aSize( aBmp.GetSizePixel() );
5911 if ( aSize.Width() && aSize.Height() )
5912 {
5913 if ( aSize.Width () > 64 )
5914 aSize.Width () = 64;
5915 if ( aSize.Height() > 64 )
5916 aSize.Height() = 64;
5917
5918 sal_uLong nRt = 0, nGn = 0, nBl = 0;
5919 BitmapReadAccess* pAcc = aBmp.AcquireReadAccess();
5920 if( pAcc )
5921 {
5922 const long nWidth = aSize.Width();
5923 const long nHeight = aSize.Height();
5924
5925 if( pAcc->HasPalette() )
5926 {
5927 for( long nY = 0L; nY < nHeight; nY++ )
5928 {
5929 for( long nX = 0L; nX < nWidth; nX++ )
5930 {
5931 const BitmapColor& rCol = pAcc->GetPaletteColor( pAcc->GetPixelIndex( nY, nX ) );
5932 nRt+=rCol.GetRed(); nGn+=rCol.GetGreen(); nBl+=rCol.GetBlue();
5933 }
5934 }
5935 }
5936 else
5937 {
5938 for( long nY = 0L; nY < nHeight; nY++ )
5939 {
5940 for( long nX = 0L; nX < nWidth; nX++ )
5941 {
5942 const BitmapColor aCol( pAcc->GetPixel( nY, nX ) );
5943 nRt+=aCol.GetRed(); nGn+=aCol.GetGreen(); nBl+=aCol.GetBlue();
5944 }
5945 }
5946 }
5947 aBmp.ReleaseAccess( pAcc );
5948 sal_uInt32 nC = ( aSize.Width() * aSize.Height() );
5949 nRt /= nC;
5950 nGn /= nC;
5951 nBl /= nC;
5952 aDefColor = Color(sal_uInt8( nRt ), sal_uInt8( nGn ),sal_uInt8( nBl ) );
5953 }
5954 }
5955 }
5956 }
5957 break;
5958 case mso_fillBackground :
5959 {
5960 if ( pTextObj ) // the textobject is needed
5961 {
5962 const SfxItemSet* pItemSet = pTextObj->GetBackground();
5963 if ( pItemSet )
5964 {
5965 const SfxPoolItem* pFillStyleItem = NULL;
5966 pItemSet->GetItemState( XATTR_FILLSTYLE, sal_False, &pFillStyleItem );
5967 if ( pFillStyleItem )
5968 {
5969 XFillStyle eFillStyle = ((XFillStyleItem*)pFillStyleItem)->GetValue();
5970 switch( eFillStyle )
5971 {
5972 case XFILL_SOLID :
5973 {
5974 const SfxPoolItem* pFillColorItem = NULL;
5975 pItemSet->GetItemState( XATTR_FILLCOLOR, sal_False, &pFillColorItem );
5976 if ( pFillColorItem )
5977 aDefColor = ((XColorItem*)pFillColorItem)->GetColorValue();
5978 }
5979 break;
5980 case XFILL_GRADIENT :
5981 {
5982 const SfxPoolItem* pGradientItem = NULL;
5983 pItemSet->GetItemState( XATTR_FILLGRADIENT, sal_False, &pGradientItem );
5984 if ( pGradientItem )
5985 aDefColor = ((XFillGradientItem*)pGradientItem)->GetGradientValue().GetStartColor();
5986 }
5987 break;
5988 case XFILL_HATCH :
5989 case XFILL_BITMAP :
5990 aDefColor = Color( COL_WHITE );
5991 break;
5992 default: break;
5993 }
5994 }
5995 }
5996 }
5997 }
5998 break;
5999 // case mso_fillPicture :
6000 default: break;
6001 }
6002 rSet.Put( SvxColorItem( aDefColor, EE_CHAR_COLOR ) );
6003 }
6004 else
6005 {
6006 if ( GetAttrib( PPT_CharAttr_FontColor, nVal, nDestinationInstance ) ) // Textfarbe (4Byte-Arg)
6007 {
6008 Color aCol( rManager.MSO_TEXT_CLR_ToColor( nVal ) );
6009 rSet.Put( SvxColorItem( aCol, EE_CHAR_COLOR ) );
6010 if ( nDestinationInstance == 0xffffffff )
6011 mrStyleSheet.mpCharSheet[ mnInstance ]->maCharLevel[ mnDepth ].mnFontColorInStyleSheet = aCol;
6012 }
6013 else if ( nVal & 0x0f000000 ) // this is not a hard attribute, but maybe the page has a different colerscheme,
6014 { // so that in this case we must use a hard color attribute
6015 Color aCol( rManager.MSO_TEXT_CLR_ToColor( nVal ) );
6016 Color& aColorInSheet = mrStyleSheet.mpCharSheet[ mnInstance ]->maCharLevel[ mnDepth ].mnFontColorInStyleSheet;
6017 if ( aColorInSheet != aCol )
6018 rSet.Put( SvxColorItem( aCol, EE_CHAR_COLOR ) );
6019 }
6020 }
6021
6022 if ( GetAttrib( PPT_CharAttr_Escapement, nVal, nDestinationInstance ) ) // Hoch/Tiefstellung in %
6023 {
6024 sal_uInt16 nEsc = 0;
6025 sal_uInt8 nProp = 100;
6026
6027 if ( nVal )
6028 {
6029 nEsc = (sal_Int16)nVal;
6030 nProp = DFLT_ESC_PROP;
6031 }
6032 SvxEscapementItem aItem( nEsc, nProp, EE_CHAR_ESCAPEMENT );
6033 rSet.Put( aItem );
6034 }
6035 if ( mnLanguage[ 0 ] )
6036 rSet.Put( SvxLanguageItem( mnLanguage[ 0 ], EE_CHAR_LANGUAGE ) );
6037 if ( mnLanguage[ 1 ] )
6038 rSet.Put( SvxLanguageItem( mnLanguage[ 1 ], EE_CHAR_LANGUAGE_CJK ) );
6039 if ( mnLanguage[ 2 ] )
6040 rSet.Put( SvxLanguageItem( mnLanguage[ 2 ], EE_CHAR_LANGUAGE_CTL ) );
6041 }
6042
GetTextField()6043 SvxFieldItem* PPTPortionObj::GetTextField()
6044 {
6045 if ( mpFieldItem )
6046 return new SvxFieldItem( *mpFieldItem );
6047 return NULL;
6048 }
6049
6050 // -----------------------------------------------------------------------
6051
PPTParagraphObj(const PPTStyleSheet & rStyleSheet,sal_uInt32 nInstance,sal_uInt16 nDepth)6052 PPTParagraphObj::PPTParagraphObj( const PPTStyleSheet& rStyleSheet, sal_uInt32 nInstance, sal_uInt16 nDepth ) :
6053 PPTNumberFormatCreator ( NULL ),
6054 mrStyleSheet ( rStyleSheet ),
6055 mnInstance ( nInstance ),
6056 mbTab ( sal_True ), // style sheets always have to get the right tabulator setting
6057 mnPortionCount ( 0 ),
6058 mpPortionList ( NULL )
6059 {
6060 if ( nDepth > 4 )
6061 nDepth = 4;
6062 pParaSet->mnDepth = nDepth;
6063 }
6064
PPTParagraphObj(PPTStyleTextPropReader & rPropReader,const PPTStyleSheet & rStyleSheet,sal_uInt32 nInstance,PPTTextRulerInterpreter & rRuler)6065 PPTParagraphObj::PPTParagraphObj( PPTStyleTextPropReader& rPropReader, const PPTStyleSheet& rStyleSheet,
6066 sal_uInt32 nInstance, PPTTextRulerInterpreter& rRuler ) :
6067 PPTParaPropSet ( *( (PPTParaPropSet*)rPropReader.aParaPropList.GetCurObject() ) ),
6068 PPTNumberFormatCreator ( NULL ),
6069 PPTTextRulerInterpreter ( rRuler ),
6070 mrStyleSheet ( rStyleSheet ),
6071 mnInstance ( nInstance ),
6072 mbTab ( sal_False ),
6073 mnCurrentObject ( 0 ),
6074 mnPortionCount ( 0 ),
6075 mpPortionList ( NULL )
6076 {
6077 sal_uInt32 nCurPos = rPropReader.aCharPropList.GetCurPos();
6078 PPTCharPropSet* pCharPropSet = (PPTCharPropSet*)rPropReader.aCharPropList.GetCurObject();
6079 if ( pCharPropSet )
6080 {
6081 sal_uInt32 nCurrentParagraph = pCharPropSet->mnParagraph;
6082 for ( ; pCharPropSet && ( pCharPropSet->mnParagraph == nCurrentParagraph ); pCharPropSet = (PPTCharPropSet*)rPropReader.aCharPropList.Next() )
6083 mnPortionCount++; // counting number of portions that are part of this paragraph
6084 pCharPropSet = (PPTCharPropSet*)rPropReader.aCharPropList.Seek( nCurPos );
6085
6086 mpPortionList = new PPTPortionObj*[ mnPortionCount ];
6087 for ( sal_uInt32 i = 0; i < mnPortionCount; i++ )
6088 {
6089 if ( pCharPropSet )
6090 {
6091 PPTPortionObj* pPPTPortion = new PPTPortionObj( *pCharPropSet, rStyleSheet, nInstance, pParaSet->mnDepth );
6092 mpPortionList[ i ] = pPPTPortion;
6093 if ( !mbTab )
6094 mbTab = mpPortionList[ i ]->HasTabulator();
6095 }
6096 else
6097 {
6098 DBG_ERROR( "SJ:PPTParagraphObj::It seems that there are missing some textportions" );
6099 mpPortionList[ i ] = NULL;
6100 }
6101 pCharPropSet = (PPTCharPropSet*)rPropReader.aCharPropList.Next();
6102 }
6103 }
6104 }
6105
~PPTParagraphObj()6106 PPTParagraphObj::~PPTParagraphObj()
6107 {
6108 ImplClear();
6109 }
6110
AppendPortion(PPTPortionObj & rPPTPortion)6111 void PPTParagraphObj::AppendPortion( PPTPortionObj& rPPTPortion )
6112 {
6113 sal_uInt32 i;
6114 PPTPortionObj** mpOldPortionList = mpPortionList;
6115 mpPortionList = new PPTPortionObj*[ ++mnPortionCount ];
6116 for ( i = 0; i < mnPortionCount - 1; i++ )
6117 mpPortionList[ i ] = mpOldPortionList[ i ];
6118 delete[] mpOldPortionList;
6119 mpPortionList[ mnPortionCount - 1 ] = new PPTPortionObj( rPPTPortion );
6120 if ( !mbTab )
6121 mbTab = mpPortionList[ mnPortionCount - 1 ]->HasTabulator();
6122 }
6123
UpdateBulletRelSize(sal_uInt32 & nBulletRelSize) const6124 void PPTParagraphObj::UpdateBulletRelSize( sal_uInt32& nBulletRelSize ) const
6125 {
6126 if ( nBulletRelSize > 0x7fff ) // a negative value is the absolute bullet height
6127 {
6128 sal_uInt16 nFontHeight = 0;
6129 if ( mpPortionList )
6130 {
6131 PPTPortionObj* pPortion = mpPortionList[ 0 ];
6132 if ( pPortion && ( pPortion->pCharSet->mnAttrSet & ( 1 << PPT_CharAttr_FontHeight ) ) )
6133 nFontHeight = pPortion->pCharSet->mnFontHeight;
6134 }
6135 // if we do not have a hard attributed fontheight, the fontheight is taken from the style
6136 if ( !nFontHeight )
6137 nFontHeight = mrStyleSheet.mpCharSheet[ mnInstance ]->maCharLevel[ pParaSet->mnDepth ].mnFontHeight;
6138 nBulletRelSize = nFontHeight ? ((-((sal_Int16)nBulletRelSize)) * 100 ) / nFontHeight : 100;
6139 }
6140 }
6141
GetAttrib(sal_uInt32 nAttr,sal_uInt32 & nRetValue,sal_uInt32 nDestinationInstance)6142 sal_Bool PPTParagraphObj::GetAttrib( sal_uInt32 nAttr, sal_uInt32& nRetValue, sal_uInt32 nDestinationInstance )
6143 {
6144 sal_uInt32 nMask = 1 << nAttr;
6145 nRetValue = 0;
6146
6147 if ( nAttr > 21 )
6148 {
6149 DBG_ERROR( "SJ:PPTParagraphObj::GetAttrib - attribute does not exist" );
6150 return sal_False;
6151 }
6152
6153 sal_uInt32 bIsHardAttribute = ( ( pParaSet->mnAttrSet & nMask ) != 0 ) ? 1 : 0;
6154
6155 if ( bIsHardAttribute )
6156 {
6157 if ( nAttr == PPT_ParaAttr_BulletColor )
6158 {
6159 sal_Bool bHardBulletColor;
6160 if ( pParaSet->mnAttrSet & ( 1 << PPT_ParaAttr_BuHardColor ) )
6161 bHardBulletColor = pParaSet->mpArry[ PPT_ParaAttr_BuHardColor ] != 0;
6162 else
6163 bHardBulletColor = ( mrStyleSheet.mpParaSheet[ mnInstance ]->maParaLevel[ pParaSet->mnDepth ].mnBuFlags
6164 & ( 1 << PPT_ParaAttr_BuHardColor ) ) != 0;
6165 if ( bHardBulletColor )
6166 nRetValue = pParaSet->mnBulletColor;
6167 else
6168 {
6169 nRetValue = PPT_COLSCHEME_TEXT_UND_ZEILEN;
6170 if ( ( nDestinationInstance != 0xffffffff ) && mnPortionCount )
6171 {
6172 PPTPortionObj* pPortion = mpPortionList[ 0 ];
6173 if ( pPortion )
6174 {
6175 if ( pPortion->pCharSet->mnAttrSet & ( 1 << PPT_CharAttr_FontColor ) )
6176 nRetValue = pPortion->pCharSet->mnColor;
6177 else
6178 nRetValue = mrStyleSheet.mpCharSheet[ nDestinationInstance ]->maCharLevel[ pParaSet->mnDepth ].mnFontColor;
6179 }
6180 }
6181 }
6182 }
6183 else if ( nAttr == PPT_ParaAttr_BulletFont )
6184 {
6185 sal_Bool bHardBuFont;
6186 if ( pParaSet->mnAttrSet & ( 1 << PPT_ParaAttr_BuHardFont ) )
6187 bHardBuFont = pParaSet->mpArry[ PPT_ParaAttr_BuHardFont ] != 0;
6188 else
6189 bHardBuFont = ( mrStyleSheet.mpParaSheet[ mnInstance ]->maParaLevel[ pParaSet->mnDepth ].mnBuFlags
6190 & ( 1 << PPT_ParaAttr_BuHardFont ) ) != 0;
6191 if ( bHardBuFont )
6192 nRetValue = pParaSet->mpArry[ PPT_ParaAttr_BulletFont ];
6193 else
6194 {
6195 // it is the font used which assigned to the first character of the following text
6196 nRetValue = 0;
6197 if ( ( nDestinationInstance != 0xffffffff ) && mnPortionCount )
6198 {
6199 PPTPortionObj* pPortion = mpPortionList[ 0 ];
6200 if ( pPortion )
6201 {
6202 if ( pPortion->pCharSet->mnAttrSet & ( 1 << PPT_CharAttr_Font ) )
6203 nRetValue = pPortion->pCharSet->mnFont;
6204 else
6205 nRetValue = mrStyleSheet.mpCharSheet[ nDestinationInstance ]->maCharLevel[ pParaSet->mnDepth ].mnFont;
6206 }
6207 }
6208 }
6209 }
6210 else
6211 nRetValue = pParaSet->mpArry[ nAttr ];
6212 }
6213 else
6214 {
6215 const PPTParaLevel& rParaLevel = mrStyleSheet.mpParaSheet[ mnInstance ]->maParaLevel[ pParaSet->mnDepth ];
6216
6217 PPTParaLevel* pParaLevel = NULL;
6218 if ( ( nDestinationInstance == 0xffffffff )
6219 || ( pParaSet->mnDepth && ( ( mnInstance == TSS_TYPE_SUBTITLE ) || ( mnInstance == TSS_TYPE_TEXT_IN_SHAPE ) ) ) )
6220 bIsHardAttribute = 1;
6221 else if ( nDestinationInstance != mnInstance )
6222 pParaLevel = &mrStyleSheet.mpParaSheet[ nDestinationInstance ]->maParaLevel[ pParaSet->mnDepth ];
6223 switch ( nAttr )
6224 {
6225 case PPT_ParaAttr_BulletOn :
6226 {
6227 nRetValue = rParaLevel.mnBuFlags & ( 1 << PPT_ParaAttr_BulletOn );
6228 if ( pParaLevel )
6229 {
6230 if ( nRetValue != ( (sal_uInt32)pParaLevel->mnBuFlags & ( 1 << PPT_ParaAttr_BulletOn ) ) )
6231 bIsHardAttribute = 1;
6232 }
6233 }
6234 break;
6235 case PPT_ParaAttr_BuHardFont :
6236 case PPT_ParaAttr_BuHardColor :
6237 case PPT_ParaAttr_BuHardHeight :
6238 DBG_ERROR( "SJ:PPTParagraphObj::GetAttrib - this attribute does not make sense" );
6239 break;
6240 case PPT_ParaAttr_BulletChar :
6241 {
6242 nRetValue = rParaLevel.mnBulletChar;
6243 if ( pParaLevel && ( nRetValue != pParaLevel->mnBulletChar ) )
6244 bIsHardAttribute = 1;
6245 }
6246 break;
6247 case PPT_ParaAttr_BulletFont :
6248 {
6249 sal_Bool bHardBuFont;
6250 if ( pParaSet->mnAttrSet & ( 1 << PPT_ParaAttr_BuHardFont ) )
6251 bHardBuFont = pParaSet->mpArry[ PPT_ParaAttr_BuHardFont ] != 0;
6252 else
6253 bHardBuFont = ( rParaLevel.mnBuFlags & ( 1 << PPT_ParaAttr_BuHardFont ) ) != 0;
6254 if ( bHardBuFont )
6255 {
6256 nRetValue = rParaLevel.mnBulletFont;
6257 if ( pParaLevel && ( nRetValue != pParaLevel->mnBulletFont ) )
6258 bIsHardAttribute = 1;
6259 }
6260 else
6261 {
6262 if ( mnPortionCount )
6263 {
6264 PPTPortionObj* pPortion = mpPortionList[ 0 ];
6265 if ( pPortion )
6266 bIsHardAttribute = pPortion->GetAttrib( PPT_CharAttr_Font, nRetValue, nDestinationInstance );
6267 }
6268 else
6269 {
6270 nRetValue = mrStyleSheet.mpCharSheet[ mnInstance ]->maCharLevel[ pParaSet->mnDepth ].mnFont;
6271 bIsHardAttribute = 1;
6272 }
6273 }
6274 }
6275 break;
6276 case PPT_ParaAttr_BulletHeight :
6277 {
6278 nRetValue = rParaLevel.mnBulletHeight;
6279 if ( pParaLevel && ( nRetValue != pParaLevel->mnBulletHeight ) )
6280 bIsHardAttribute = 1;
6281 }
6282 break;
6283 case PPT_ParaAttr_BulletColor :
6284 {
6285 sal_Bool bHardBulletColor;
6286 if ( pParaSet->mnAttrSet & ( 1 << PPT_ParaAttr_BuHardColor ) )
6287 bHardBulletColor = pParaSet->mpArry[ PPT_ParaAttr_BuHardColor ] != 0;
6288 else
6289 bHardBulletColor = ( rParaLevel.mnBuFlags & ( 1 << PPT_ParaAttr_BuHardColor ) ) != 0;
6290 if ( bHardBulletColor )
6291 {
6292 nRetValue = rParaLevel.mnBulletColor;
6293 if ( pParaLevel && ( nRetValue != pParaLevel->mnBulletColor ) )
6294 bIsHardAttribute = 1;
6295 }
6296 else
6297 {
6298 if ( mnPortionCount )
6299 {
6300 PPTPortionObj* pPortion = mpPortionList[ 0 ];
6301 if ( pPortion )
6302 {
6303 if (pPortion->mbIsHyperlink )
6304 {
6305 if( pPortion->mbHardHylinkOrigColor )
6306 nRetValue = pPortion->mnHylinkOrigColor;
6307 else
6308 nRetValue = mrStyleSheet.mpCharSheet[ mnInstance ]->maCharLevel[ pParaSet->mnDepth ].mnFontColor;
6309 bIsHardAttribute = sal_True;
6310 }
6311 else
6312 {
6313 bIsHardAttribute = pPortion->GetAttrib( PPT_CharAttr_FontColor, nRetValue, nDestinationInstance );
6314 }
6315 }
6316 }
6317 else
6318 {
6319 nRetValue = mrStyleSheet.mpCharSheet[ mnInstance ]->maCharLevel[ pParaSet->mnDepth ].mnFontColor;
6320 bIsHardAttribute = 1;
6321 }
6322 }
6323 }
6324 break;
6325 case PPT_ParaAttr_Adjust :
6326 {
6327 nRetValue = rParaLevel.mnAdjust;
6328 if ( pParaLevel && ( nRetValue != pParaLevel->mnAdjust ) )
6329 bIsHardAttribute = 1;
6330 }
6331 break;
6332 case PPT_ParaAttr_LineFeed :
6333 {
6334 nRetValue = rParaLevel.mnLineFeed;
6335 if ( pParaLevel && ( nRetValue != pParaLevel->mnLineFeed ) )
6336 bIsHardAttribute = 1;
6337 }
6338 break;
6339 case PPT_ParaAttr_UpperDist :
6340 {
6341 nRetValue = rParaLevel.mnUpperDist;
6342 if ( pParaLevel && ( nRetValue != pParaLevel->mnUpperDist ) )
6343 bIsHardAttribute = 1;
6344 }
6345 break;
6346 case PPT_ParaAttr_LowerDist :
6347 {
6348 nRetValue = rParaLevel.mnLowerDist;
6349 if ( pParaLevel && ( nRetValue != pParaLevel->mnLowerDist ) )
6350 bIsHardAttribute = 1;
6351 }
6352 break;
6353 case PPT_ParaAttr_TextOfs :
6354 {
6355 nRetValue = rParaLevel.mnTextOfs;
6356 if ( pParaLevel && ( nRetValue != pParaLevel->mnTextOfs ) )
6357 bIsHardAttribute = 1;
6358 }
6359 break;
6360 case PPT_ParaAttr_BulletOfs :
6361 {
6362 nRetValue = rParaLevel.mnBulletOfs;
6363 if ( pParaLevel && ( nRetValue != pParaLevel->mnBulletOfs ) )
6364 bIsHardAttribute = 1;
6365 }
6366 break;
6367 case PPT_ParaAttr_DefaultTab :
6368 {
6369 nRetValue = rParaLevel.mnDefaultTab;
6370 if ( pParaLevel && ( nRetValue != pParaLevel->mnBulletOfs ) )
6371 bIsHardAttribute = 1;
6372 }
6373 break;
6374 case PPT_ParaAttr_AsianLB_1 :
6375 {
6376 nRetValue = rParaLevel.mnAsianLineBreak & 1;
6377 if ( pParaLevel && ( nRetValue != ( (sal_uInt32)pParaLevel->mnAsianLineBreak & 1 ) ) )
6378 bIsHardAttribute = 1;
6379 }
6380 break;
6381 case PPT_ParaAttr_AsianLB_2 :
6382 {
6383 nRetValue = ( rParaLevel.mnAsianLineBreak >> 1 ) & 1;
6384 if ( pParaLevel && ( nRetValue != ( ( (sal_uInt32)pParaLevel->mnAsianLineBreak >> 1 ) & 1 ) ) )
6385 bIsHardAttribute = 1;
6386 }
6387 break;
6388 case PPT_ParaAttr_AsianLB_3 :
6389 {
6390 nRetValue = ( rParaLevel.mnAsianLineBreak >> 2 ) & 1;
6391 if ( pParaLevel && ( nRetValue != ( ( (sal_uInt32)pParaLevel->mnAsianLineBreak >> 2 ) & 1 ) ) )
6392 bIsHardAttribute = 1;
6393 }
6394 break;
6395 case PPT_ParaAttr_BiDi :
6396 {
6397 nRetValue = rParaLevel.mnBiDi;
6398 if ( pParaLevel && ( nRetValue != pParaLevel->mnBiDi ) )
6399 bIsHardAttribute = 1;
6400 }
6401 break;
6402 }
6403 }
6404 return (sal_Bool)bIsHardAttribute;
6405 }
6406
ApplyTo(SfxItemSet & rSet,boost::optional<sal_Int16> & rStartNumbering,SdrPowerPointImport & rManager,sal_uInt32 nDestinationInstance,const PPTParagraphObj *)6407 void PPTParagraphObj::ApplyTo( SfxItemSet& rSet, boost::optional< sal_Int16 >& rStartNumbering, SdrPowerPointImport& rManager, sal_uInt32 nDestinationInstance, const PPTParagraphObj* /*pPrev*/)
6408 {
6409 sal_Int16 nVal2;
6410 sal_uInt32 nVal, nUpperDist, nLowerDist;
6411 sal_uInt32 nInstance = nDestinationInstance != 0xffffffff ? nDestinationInstance : mnInstance;
6412
6413 if ( ( nDestinationInstance != 0xffffffff ) || ( pParaSet->mnDepth <= 1 ) )
6414 {
6415 SvxNumBulletItem* pNumBulletItem = mrStyleSheet.mpNumBulletItem[ nInstance ];
6416 if ( pNumBulletItem )
6417 {
6418 SvxNumberFormat aNumberFormat( SVX_NUM_NUMBER_NONE );
6419 if ( GetNumberFormat( rManager, aNumberFormat, this, nDestinationInstance, rStartNumbering ) )
6420 {
6421 if ( aNumberFormat.GetNumberingType() == SVX_NUM_NUMBER_NONE )
6422 {
6423 aNumberFormat.SetLSpace( 0 );
6424 aNumberFormat.SetAbsLSpace( 0 );
6425 aNumberFormat.SetFirstLineOffset( 0 );
6426 aNumberFormat.SetCharTextDistance( 0 );
6427 aNumberFormat.SetFirstLineIndent( 0 );
6428 aNumberFormat.SetIndentAt( 0 );
6429 }
6430 SvxNumBulletItem aNewNumBulletItem( *pNumBulletItem );
6431 SvxNumRule* pRule = aNewNumBulletItem.GetNumRule();
6432 if ( pRule )
6433 {
6434 pRule->SetLevel( pParaSet->mnDepth, aNumberFormat );
6435 sal_uInt16 i, n;
6436 for ( i = 0; i < pRule->GetLevelCount(); i++ )
6437 {
6438 if ( i != pParaSet->mnDepth )
6439 {
6440 n = i > 4 ? 4 : i;
6441
6442 SvxNumberFormat aNumberFormat2( pRule->GetLevel( i ) );
6443 const PPTParaLevel& rParaLevel = mrStyleSheet.mpParaSheet[ nInstance ]->maParaLevel[ n ];
6444 const PPTCharLevel& rCharLevel = mrStyleSheet.mpCharSheet[ nInstance ]->maCharLevel[ n ];
6445 sal_uInt32 nColor;
6446 if ( rParaLevel.mnBuFlags & ( 1 << PPT_ParaAttr_BuHardColor ) )
6447 nColor = rParaLevel.mnBulletColor;
6448 else
6449 nColor = rCharLevel.mnFontColor;
6450 aNumberFormat2.SetBulletColor( rManager.MSO_TEXT_CLR_ToColor( nColor ) );
6451 pRule->SetLevel( i, aNumberFormat2 );
6452 }
6453 }
6454 rSet.Put( aNewNumBulletItem );
6455 }
6456 }
6457 }
6458 }
6459
6460 sal_uInt32 nIsBullet2, _nTextOfs, _nBulletOfs, nHardAttribute = 0;
6461 GetAttrib( PPT_ParaAttr_BulletOn, nIsBullet2, nDestinationInstance );
6462 nHardAttribute += GetAttrib( PPT_ParaAttr_TextOfs, _nTextOfs, nDestinationInstance );
6463 nHardAttribute += GetAttrib( PPT_ParaAttr_BulletOfs, _nBulletOfs, nDestinationInstance );
6464 if ( !nIsBullet2 )
6465 {
6466 SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE );
6467 sal_uInt16 nAbsLSpace = (sal_uInt16)( ( (sal_uInt32)_nTextOfs * 2540 ) / 576 );
6468 sal_uInt16 nFirstLineOffset = nAbsLSpace - (sal_uInt16)( ( (sal_uInt32)_nBulletOfs * 2540 ) / 576 );
6469 aLRSpaceItem.SetLeft( nAbsLSpace );
6470 aLRSpaceItem.SetTxtFirstLineOfstValue( -nFirstLineOffset );
6471 rSet.Put( aLRSpaceItem );
6472 }
6473 else
6474 {
6475 SvxLRSpaceItem aLRSpaceItem( EE_PARA_LRSPACE );
6476 aLRSpaceItem.SetLeft( 0 );
6477 aLRSpaceItem.SetTxtFirstLineOfstValue( 0 );
6478 rSet.Put( aLRSpaceItem );
6479 }
6480 if ( GetAttrib( PPT_ParaAttr_Adjust, nVal, nDestinationInstance ) )
6481 {
6482 if ( nVal <= 3 )
6483 { // Absatzausrichtung
6484 static SvxAdjust __READONLY_DATA aAdj[ 4 ] = { SVX_ADJUST_LEFT, SVX_ADJUST_CENTER, SVX_ADJUST_RIGHT, SVX_ADJUST_BLOCK };
6485 rSet.Put( SvxAdjustItem( aAdj[ nVal ], EE_PARA_JUST ) );
6486 }
6487 }
6488
6489 if ( GetAttrib( PPT_ParaAttr_AsianLB_1, nVal, nDestinationInstance ) )
6490 rSet.Put( SfxBoolItem( EE_PARA_FORBIDDENRULES, nVal != 0 ) );
6491 if ( GetAttrib( PPT_ParaAttr_AsianLB_3, nVal, nDestinationInstance ) )
6492 rSet.Put( SfxBoolItem( EE_PARA_HANGINGPUNCTUATION, nVal != 0 ) );
6493
6494 if ( GetAttrib( PPT_ParaAttr_BiDi, nVal, nDestinationInstance ) )
6495 rSet.Put( SvxFrameDirectionItem( nVal == 1 ? FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP, EE_PARA_WRITINGDIR ) );
6496
6497 // LineSpacing
6498 PPTPortionObj* pPortion = First();
6499 sal_Bool bIsHardAttribute = GetAttrib( PPT_ParaAttr_LineFeed, nVal, nDestinationInstance );
6500 nVal2 = (sal_Int16)nVal;
6501 sal_uInt32 nFont = sal_uInt32();
6502 if ( pPortion && pPortion->GetAttrib( PPT_CharAttr_Font, nFont, nDestinationInstance ) )
6503 bIsHardAttribute = sal_True;
6504
6505 if ( bIsHardAttribute )
6506 {
6507 if ( pPortion && ( nVal2 > 200 ) )
6508 {
6509 sal_uInt32 nFontHeight;
6510 pPortion->GetAttrib( PPT_CharAttr_FontHeight, nFontHeight, nDestinationInstance );
6511 nVal2 = -(sal_Int16)( ( nFontHeight * nVal * 8 ) / 100 );
6512 }
6513 rSet.Put( SdrTextFixedCellHeightItem( sal_True ), SDRATTR_TEXT_USEFIXEDCELLHEIGHT );
6514 SvxLineSpacingItem aItem( 200, EE_PARA_SBL );
6515 if ( nVal2 <= 0 )
6516 {
6517 aItem.SetLineHeight( (sal_uInt16)( rManager.ScalePoint( -nVal2 ) / 8 ) );
6518 aItem.GetLineSpaceRule() = SVX_LINE_SPACE_FIX;
6519 }
6520 else
6521 {
6522 sal_uInt8 nPropLineSpace = (sal_uInt8)nVal2;
6523 aItem.SetPropLineSpace( nPropLineSpace );
6524 aItem.GetLineSpaceRule() = SVX_LINE_SPACE_AUTO;
6525 }
6526 rSet.Put( aItem );
6527 }
6528
6529 // Paragraph Spacing
6530 sal_uInt32 nFontHeight = 0;
6531 bIsHardAttribute = ( (sal_uInt32)GetAttrib( PPT_ParaAttr_UpperDist, nUpperDist, nDestinationInstance ) +
6532 (sal_uInt32)GetAttrib( PPT_ParaAttr_LowerDist, nLowerDist, nDestinationInstance ) ) != 0;
6533 if ( ( nUpperDist > 0 ) || ( nLowerDist > 0 ) )
6534 {
6535 if ( mnPortionCount )
6536 {
6537 mpPortionList[ mnPortionCount - 1 ]->GetAttrib( PPT_CharAttr_FontHeight, nFontHeight, nDestinationInstance );
6538 if ( ((sal_Int16)nUpperDist) > 0 )
6539 nUpperDist = - (sal_Int16)( ( nFontHeight * nUpperDist * 100 ) / 1000 );
6540 if ( ((sal_Int16)nLowerDist) > 0 )
6541 nLowerDist = - (sal_Int16)( ( nFontHeight * nLowerDist * 100 ) / 1000 );
6542 }
6543 bIsHardAttribute = sal_True;
6544 }
6545 if ( bIsHardAttribute )
6546 {
6547 SvxULSpaceItem aULSpaceItem( EE_PARA_ULSPACE );
6548 nVal2 = (sal_Int16)nUpperDist;
6549 if ( nVal2 <= 0 )
6550 aULSpaceItem.SetUpper( (sal_uInt16)(((sal_uInt32) - nVal2 * 2540 ) / ( 72 * 8 ) ) );
6551 else
6552 {
6553 aULSpaceItem.SetUpperValue( 0 );
6554 aULSpaceItem.SetPropUpper( (sal_uInt16)nUpperDist == 100 ? 101 : (sal_uInt16)nUpperDist );
6555 }
6556 nVal2 = (sal_Int16)nLowerDist;
6557 if ( nVal2 <= 0 )
6558 aULSpaceItem.SetLower( (sal_uInt16)(((sal_uInt32) - nVal2 * 2540 ) / ( 72 * 8 ) ) );
6559 else
6560 {
6561 aULSpaceItem.SetLowerValue( 0 );
6562 aULSpaceItem.SetPropLower( (sal_uInt16)nLowerDist == 100 ? 101 : (sal_uInt16)nLowerDist );
6563 }
6564 rSet.Put( aULSpaceItem );
6565 }
6566
6567 if ( mbTab ) // makes it sense to apply tabsettings
6568 {
6569 sal_uInt32 i, nDefaultTab, nTab, nTextOfs2 = 0;
6570 sal_uInt32 nLatestManTab = 0;
6571 GetAttrib( PPT_ParaAttr_TextOfs, nTextOfs2, nDestinationInstance );
6572 GetAttrib( PPT_ParaAttr_BulletOfs, nTab, nDestinationInstance );
6573 GetAttrib( PPT_ParaAttr_BulletOn, i, nDestinationInstance );
6574 GetAttrib( PPT_ParaAttr_DefaultTab, nDefaultTab, nDestinationInstance );
6575 SvxTabStopItem aTabItem( 0, 0, SVX_TAB_ADJUST_DEFAULT, EE_PARA_TABS );
6576 if ( GetTabCount() )
6577 {
6578 // paragraph offset = MIN(first_line_offset, hanging_offset)
6579 sal_uInt32 nParaOffset = Min( nTextOfs2, nTab );
6580 for ( i = 0; i < GetTabCount(); i++ )
6581 {
6582 SvxTabAdjust eTabAdjust;
6583 nTab = GetTabOffsetByIndex( (sal_uInt16)i );
6584 switch( GetTabStyleByIndex( (sal_uInt16)i ) )
6585 {
6586 case 1 : eTabAdjust = SVX_TAB_ADJUST_CENTER; break;
6587 case 2 : eTabAdjust = SVX_TAB_ADJUST_RIGHT; break;
6588 case 3 : eTabAdjust = SVX_TAB_ADJUST_DECIMAL; break;
6589 default : eTabAdjust = SVX_TAB_ADJUST_LEFT;
6590 }
6591 if ( nTab > nParaOffset ) // If tab stop greater than paragraph offset
6592 aTabItem.Insert( SvxTabStop( ( ( (long( nTab - nTextOfs2 )) * 2540 ) / 576 ), eTabAdjust ) );
6593 }
6594 nLatestManTab = nTab;
6595 }
6596 if ( nIsBullet2 == 0 )
6597 aTabItem.Insert( SvxTabStop( (sal_uInt16)0 ) );
6598 if ( nDefaultTab )
6599 {
6600 nTab = ( nTextOfs2 > nLatestManTab ) ? nTextOfs2 : nLatestManTab;
6601 nTab /= nDefaultTab;
6602 nTab = nDefaultTab * ( 1 + nTab );
6603 for ( i = 0; ( i < 20 ) && ( nTab < 0x1b00 ); i++ )
6604 {
6605 aTabItem.Insert( SvxTabStop( (sal_uInt16)( ( ( nTab - nTextOfs2 ) * 2540 ) / 576 ) ) );
6606 nTab += nDefaultTab;
6607 }
6608 }
6609 rSet.Put( aTabItem );
6610 }
6611 }
6612
GetTextSize()6613 sal_uInt32 PPTParagraphObj::GetTextSize()
6614 {
6615 sal_uInt32 nCount, nRetValue = 0;
6616 for ( sal_uInt32 i = 0; i < mnPortionCount; i++ )
6617 {
6618 PPTPortionObj* pPortionObj = mpPortionList[ i ];
6619 nCount = pPortionObj->Count();
6620 if ( ( !nCount ) && pPortionObj->mpFieldItem )
6621 nCount++;
6622 nRetValue += nCount;
6623 }
6624 return nRetValue;
6625 }
6626
First()6627 PPTPortionObj* PPTParagraphObj::First()
6628 {
6629 mnCurrentObject = 0;
6630 if ( !mnPortionCount )
6631 return NULL;
6632 return mpPortionList[ 0 ];
6633 }
6634
Next()6635 PPTPortionObj* PPTParagraphObj::Next()
6636 {
6637 sal_uInt32 i = mnCurrentObject + 1;
6638 if ( i >= mnPortionCount )
6639 return NULL;
6640 mnCurrentObject++;
6641 return mpPortionList[ i ];
6642 }
6643
ImplClear()6644 void PPTParagraphObj::ImplClear()
6645 {
6646 for ( void* pPtr = First(); pPtr; pPtr = Next() )
6647 delete (PPTPortionObj*)pPtr;
6648 delete[] mpPortionList;
6649 }
6650
~PPTFieldEntry()6651 PPTFieldEntry::~PPTFieldEntry()
6652 {
6653 delete pField1;
6654 delete pField2;
6655 delete pString;
6656 };
6657
GetDateTime(const sal_uInt32 nVal,SvxDateFormat & eDateFormat,SvxTimeFormat & eTimeFormat)6658 void PPTFieldEntry::GetDateTime( const sal_uInt32 nVal, SvxDateFormat& eDateFormat, SvxTimeFormat& eTimeFormat )
6659 {
6660 eDateFormat = SVXDATEFORMAT_APPDEFAULT;
6661 eTimeFormat = SVXTIMEFORMAT_APPDEFAULT;
6662 // ID auswerten
6663 switch( nVal )
6664 {
6665 case 0:
6666 case 6:
6667 eDateFormat = SVXDATEFORMAT_A;
6668 break;
6669 case 1:
6670 eDateFormat = SVXDATEFORMAT_F;
6671 break;
6672 case 2:
6673 case 3:
6674 eDateFormat = SVXDATEFORMAT_D;
6675 break;
6676 case 4:
6677 case 5:
6678 eDateFormat = SVXDATEFORMAT_C;
6679 break;
6680 case 7:
6681 eDateFormat = SVXDATEFORMAT_A;
6682 case 9:
6683 eTimeFormat = SVXTIMEFORMAT_24_HM;
6684 break;
6685 case 8:
6686 eDateFormat = SVXDATEFORMAT_A;
6687 case 11:
6688 eTimeFormat = SVXTIMEFORMAT_12_HM;
6689 break;
6690 case 10:
6691 eTimeFormat = SVXTIMEFORMAT_24_HMS;
6692 break;
6693 case 12:
6694 eTimeFormat = SVXTIMEFORMAT_12_HMS;
6695 break;
6696 }
6697 }
6698
SetDateTime(sal_uInt32 nVal)6699 void PPTFieldEntry::SetDateTime( sal_uInt32 nVal )
6700 {
6701 SvxDateFormat eDateFormat;
6702 SvxTimeFormat eTimeFormat;
6703 GetDateTime( nVal, eDateFormat, eTimeFormat );
6704 if ( eDateFormat != SVXDATEFORMAT_APPDEFAULT )
6705 pField1 = new SvxFieldItem( SvxDateField( Date(), SVXDATETYPE_VAR, eDateFormat ), EE_FEATURE_FIELD );
6706 if ( eTimeFormat != SVXTIMEFORMAT_APPDEFAULT )
6707 {
6708 SvxFieldItem* pFieldItem = new SvxFieldItem( SvxExtTimeField( Time(), SVXTIMETYPE_VAR, eTimeFormat ), EE_FEATURE_FIELD );
6709 if ( pField1 )
6710 pField2 = pFieldItem;
6711 else
6712 pField1 = pFieldItem;
6713 }
6714 }
6715
6716 // -----------------------------------------------------------------------
6717
PPTTextObj(SvStream & rIn,SdrPowerPointImport & rSdrPowerPointImport,PptSlidePersistEntry & rPersistEntry,DffObjData * pObjData)6718 PPTTextObj::PPTTextObj( SvStream& rIn, SdrPowerPointImport& rSdrPowerPointImport, PptSlidePersistEntry& rPersistEntry, DffObjData* pObjData ) :
6719 mpImplTextObj ( new ImplPPTTextObj( rPersistEntry ) )
6720 {
6721 mpImplTextObj->mnRefCount = 1;
6722 mpImplTextObj->mnShapeId = 0;
6723 mpImplTextObj->mnShapeMaster = 0;
6724 mpImplTextObj->mpPlaceHolderAtom = NULL;
6725 mpImplTextObj->mnDestinationInstance = mpImplTextObj->mnInstance = 4;
6726 mpImplTextObj->mnCurrentObject = 0;
6727 mpImplTextObj->mnParagraphCount = 0;
6728 mpImplTextObj->mpParagraphList = NULL;
6729 mpImplTextObj->mnTextFlags = 0;
6730 mpImplTextObj->meShapeType = ( pObjData && pObjData->bShapeType ) ? pObjData->eShapeType : mso_sptMin;
6731
6732 DffRecordHeader aExtParaHd;
6733 aExtParaHd.nRecType = 0; // set empty
6734
6735 sal_uInt32 bStatus = sal_True;
6736
6737 DffRecordHeader aShapeContainerHd;
6738 rIn >> aShapeContainerHd;
6739
6740 if ( ( pObjData == NULL ) || ( pObjData->bShapeType ) )
6741 {
6742 PPTExtParaProv* pExtParaProv = rSdrPowerPointImport.pPPTStyleSheet->pExtParaProv;
6743 if ( pObjData )
6744 {
6745 mpImplTextObj->mnShapeId = pObjData->nShapeId;
6746 if ( pObjData->nSpFlags & SP_FHAVEMASTER )
6747 mpImplTextObj->mnShapeMaster = rSdrPowerPointImport.GetPropertyValue( DFF_Prop_hspMaster, 0 );
6748 }
6749 ////////////////
6750 // ClientData //
6751 ////////////////
6752 if ( rSdrPowerPointImport.maShapeRecords.SeekToContent( rIn, DFF_msofbtClientData, SEEK_FROM_CURRENT_AND_RESTART ) )
6753 {
6754 sal_uInt32 nOldPos = rIn.Tell();
6755 DffRecordHeader& aClientDataContainerHd = *rSdrPowerPointImport.maShapeRecords.Current();
6756 DffRecordHeader aPlaceHolderAtomHd;
6757 if ( rSdrPowerPointImport.SeekToRec( rIn, PPT_PST_OEPlaceholderAtom, aClientDataContainerHd.GetRecEndFilePos(), &aPlaceHolderAtomHd ) )
6758 {
6759 mpImplTextObj->mpPlaceHolderAtom = new PptOEPlaceholderAtom;
6760 rIn >> *( mpImplTextObj->mpPlaceHolderAtom );
6761 }
6762 rIn.Seek( nOldPos );
6763 DffRecordHeader aProgTagHd;
6764 if ( rSdrPowerPointImport.SeekToContentOfProgTag( 9, rIn, aClientDataContainerHd, aProgTagHd ) )
6765 {
6766 rIn >> aExtParaHd;
6767 }
6768 }
6769
6770 ///////////////////
6771 // ClientTextBox //
6772 ///////////////////
6773 if ( rSdrPowerPointImport.maShapeRecords.SeekToContent( rIn, DFF_msofbtClientTextbox, SEEK_FROM_CURRENT_AND_RESTART ) )
6774 {
6775 DffRecordHeader aClientTextBoxHd( *rSdrPowerPointImport.maShapeRecords.Current() );
6776 sal_uInt32 nTextRulerAtomOfs = 0; // case of zero -> this atom may be found in aClientDataContainerHd;
6777 // case of -1 -> ther is no atom of this kind
6778 // else -> this is the fileofs where we can get it
6779
6780 //////////////////////////////////////
6781 // checkout if this is a referenced //
6782 // textobj, if so the we will patch //
6783 // the ClientTextBoxHd for a //
6784 // equivalent one //
6785 //////////////////////////////////////
6786 DffRecordHeader aTextHd;
6787 if ( rSdrPowerPointImport.SeekToRec( rIn, PPT_PST_OutlineTextRefAtom, aClientTextBoxHd.GetRecEndFilePos(), &aTextHd ) )
6788 {
6789 sal_uInt32 nRefNum;
6790 rIn >> nRefNum;
6791
6792 if ( rSdrPowerPointImport.SeekToRec( rIn, PPT_PST_TextRulerAtom, aClientTextBoxHd.GetRecEndFilePos() ) )
6793 nTextRulerAtomOfs = rIn.Tell();
6794 else
6795 nTextRulerAtomOfs = 0xffffffff;
6796
6797 sal_uInt32 nInstance = 0;
6798 switch( rSdrPowerPointImport.eAktPageKind )
6799 {
6800 case PPT_NOTEPAGE :
6801 nInstance++;
6802 case PPT_MASTERPAGE :
6803 nInstance++;
6804 case PPT_SLIDEPAGE :
6805 break;
6806 default :
6807 bStatus = sal_False;
6808 }
6809 if ( bStatus )
6810 {
6811 sal_uInt32 nSlideId = rSdrPowerPointImport.GetAktPageId();
6812 if ( !nSlideId )
6813 bStatus = sal_False;
6814 else
6815 {
6816 if ( !aExtParaHd.nRecType )
6817 {
6818 sal_uInt32 nOldPos = rIn.Tell();
6819 // try to locate the referenced ExtendedParaHd
6820 DffRecordHeader* pHd = pExtParaProv->
6821 aExtendedPresRules.GetRecordHeader( PPT_PST_ExtendedParagraphHeaderAtom,
6822 SEEK_FROM_CURRENT_AND_RESTART );
6823 DffRecordHeader aPresRuleHd;
6824 DffRecordHeader* pFirst = pHd;
6825
6826 sal_uInt32 nTmpSlideId, nTmpRef;
6827 while ( pHd )
6828 {
6829 pHd->SeekToContent( rIn );
6830 rIn >> nTmpSlideId
6831 >> nTmpRef; // this seems to be the instance
6832
6833 if ( ( nTmpSlideId == nSlideId ) && ( pHd->nRecInstance == nRefNum ) )
6834 {
6835 pHd->SeekToEndOfRecord( rIn );
6836 rIn >> aPresRuleHd;
6837 if ( aPresRuleHd.nRecType == PPT_PST_ExtendedParagraphAtom )
6838 {
6839 aExtParaHd = aPresRuleHd;
6840 break;
6841 }
6842 }
6843 pHd = pExtParaProv->
6844 aExtendedPresRules.GetRecordHeader( PPT_PST_ExtendedParagraphHeaderAtom,
6845 SEEK_FROM_CURRENT_AND_RESTART );
6846 if ( pHd == pFirst )
6847 break;
6848 }
6849 rIn.Seek( nOldPos );
6850 }
6851 // now pHd points to the right SlideListWithText Container
6852 PptSlidePersistList* pPageList = rSdrPowerPointImport.GetPageList( rSdrPowerPointImport.eAktPageKind );
6853 PptSlidePersistEntry* pE = NULL;
6854 if ( pPageList && ( rSdrPowerPointImport.nAktPageNum < pPageList->Count() ) )
6855 pE = (*pPageList)[ rSdrPowerPointImport.nAktPageNum ];
6856 if ( (!pE) || (!pE->nSlidePersistStartOffset) || ( pE->aPersistAtom.nSlideId != nSlideId ) )
6857 bStatus = sal_False;
6858 else
6859 {
6860 rIn.Seek( pE->nSlidePersistStartOffset );
6861 // now we got the right page and are searching for the right
6862 // TextHeaderAtom
6863 while ( rIn.Tell() < pE->nSlidePersistEndOffset )
6864 {
6865 rIn >> aClientTextBoxHd;
6866 if ( aClientTextBoxHd.nRecType == PPT_PST_TextHeaderAtom )
6867 {
6868 if ( aClientTextBoxHd.nRecInstance == nRefNum )
6869 {
6870 aClientTextBoxHd.SeekToEndOfRecord( rIn );
6871 break;
6872 }
6873 }
6874 aClientTextBoxHd.SeekToEndOfRecord( rIn );
6875 }
6876 if ( rIn.Tell() > pE->nSlidePersistEndOffset )
6877 bStatus = sal_False;
6878 else
6879 { // patching the RecordHeader
6880 aClientTextBoxHd.nFilePos -= DFF_COMMON_RECORD_HEADER_SIZE;
6881 aClientTextBoxHd.nRecLen += DFF_COMMON_RECORD_HEADER_SIZE;
6882 aClientTextBoxHd.nRecType = DFF_msofbtClientTextbox;
6883 aClientTextBoxHd.nRecVer = DFF_PSFLAG_CONTAINER;
6884
6885 // we have to calculate the correct record len
6886 DffRecordHeader aTmpHd;
6887 while ( rIn.Tell() < pE->nSlidePersistEndOffset )
6888 {
6889 rIn >> aTmpHd;
6890 if ( ( aTmpHd.nRecType == PPT_PST_SlidePersistAtom ) || ( aTmpHd.nRecType == PPT_PST_TextHeaderAtom ) )
6891 break;
6892 aTmpHd.SeekToEndOfRecord( rIn );
6893 aClientTextBoxHd.nRecLen += aTmpHd.nRecLen + DFF_COMMON_RECORD_HEADER_SIZE;
6894 }
6895 aClientTextBoxHd.SeekToContent( rIn );
6896 }
6897 }
6898 }
6899 }
6900 }
6901
6902 if ( bStatus )
6903 {
6904 if ( rSdrPowerPointImport.SeekToRec( rIn, PPT_PST_TextHeaderAtom, aClientTextBoxHd.GetRecEndFilePos(), &aTextHd ) )
6905 {
6906 // TextHeaderAtom is always the first Atom
6907 sal_uInt16 nInstance;
6908 rIn >> nInstance; // this number tells us the TxMasterStyleAtom Instance
6909 if ( nInstance > 8 )
6910 nInstance = 4;
6911 aTextHd.SeekToEndOfRecord( rIn );
6912 mpImplTextObj->mnInstance = nInstance;
6913
6914 sal_uInt32 nFilePos = rIn.Tell();
6915 if ( rSdrPowerPointImport.SeekToRec2( PPT_PST_TextBytesAtom,
6916 PPT_PST_TextCharsAtom,
6917 aClientTextBoxHd.GetRecEndFilePos() )
6918 || rSdrPowerPointImport.SeekToRec( rIn,
6919 PPT_PST_StyleTextPropAtom,
6920 aClientTextBoxHd.GetRecEndFilePos() ) )
6921 {
6922 PPTTextRulerInterpreter aTextRulerInterpreter( nTextRulerAtomOfs, rSdrPowerPointImport,
6923 aClientTextBoxHd, rIn );
6924
6925 PPTStyleTextPropReader aStyleTextPropReader( rIn, rSdrPowerPointImport, aClientTextBoxHd,
6926 aTextRulerInterpreter, aExtParaHd, nInstance );
6927 sal_uInt32 nParagraphs = mpImplTextObj->mnParagraphCount = aStyleTextPropReader.aParaPropList.Count();
6928 if ( nParagraphs )
6929 {
6930 // the language settings will be merged into the list of PPTCharPropSet
6931 DffRecordHeader aTextSpecInfoHd;
6932 PPTTextSpecInfoAtomInterpreter aTextSpecInfoAtomInterpreter;
6933 if ( rSdrPowerPointImport.SeekToRec( rIn, PPT_PST_TextSpecInfoAtom,
6934 aClientTextBoxHd.GetRecEndFilePos(), &aTextSpecInfoHd ) )
6935 {
6936 if ( aTextSpecInfoAtomInterpreter.Read( rIn, aTextSpecInfoHd, PPT_PST_TextSpecInfoAtom,
6937 &(rSdrPowerPointImport.pPPTStyleSheet->maTxSI) ) )
6938 {
6939 sal_uInt32 nI = 0;
6940 PPTTextSpecInfo* pSpecInfo;
6941 for ( pSpecInfo = (PPTTextSpecInfo*)aTextSpecInfoAtomInterpreter.aList.First();
6942 pSpecInfo; pSpecInfo =(PPTTextSpecInfo*)aTextSpecInfoAtomInterpreter.aList.Next() )
6943 {
6944 sal_uInt32 nCharIdx = pSpecInfo->nCharIdx;
6945
6946 // portions and text have to been split in some cases
6947 for ( ; nI < aStyleTextPropReader.aCharPropList.Count(); )
6948 {
6949 PPTCharPropSet* pSet = (PPTCharPropSet*)aStyleTextPropReader.aCharPropList.GetObject( nI );
6950 if ( pSet->mnOriginalTextPos < nCharIdx )
6951 {
6952 pSet->mnLanguage[ 0 ] = pSpecInfo->nLanguage[ 0 ];
6953 pSet->mnLanguage[ 1 ] = pSpecInfo->nLanguage[ 1 ];
6954 pSet->mnLanguage[ 2 ] = pSpecInfo->nLanguage[ 2 ];
6955 // test if the current portion needs to be split
6956 if ( pSet->maString.Len() > 1 )
6957 {
6958 sal_Int32 nIndexOfNextPortion = pSet->maString.Len() + pSet->mnOriginalTextPos;
6959 sal_Int32 nNewLen = nIndexOfNextPortion - nCharIdx;
6960 sal_Int32 nOldLen = pSet->maString.Len() - nNewLen;
6961
6962 if ( ( nNewLen > 0 ) && ( nOldLen > 0 ) )
6963 {
6964 String aString( pSet->maString );
6965 PPTCharPropSet* pNew = new PPTCharPropSet( *pSet );
6966 pSet->maString = String( aString, 0, (sal_uInt16)nOldLen );
6967 pNew->maString = String( aString, (sal_uInt16)nOldLen, (sal_uInt16)nNewLen );
6968 pNew->mnOriginalTextPos += nOldLen;
6969 aStyleTextPropReader.aCharPropList.Insert( pNew, nI + 1 );
6970 }
6971 }
6972 }
6973 else
6974 break;
6975 nI++;
6976 }
6977 }
6978 }
6979 #ifdef DBG_UTIL
6980 else
6981 {
6982 if (!(rSdrPowerPointImport.rImportParam.nImportFlags & PPT_IMPORTFLAGS_NO_TEXT_ASSERT))
6983 {
6984 DBG_ERROR( "SdrTextSpecInfoAtomInterpreter::Ctor(): parsing error, this document needs to be analysed (SJ)" );
6985 }
6986 }
6987 #endif
6988 }
6989 //
6990 // now will search for possible textextensions such as date/time fields
6991 // or ParaTabStops and append them on this textobj
6992 //
6993 rIn.Seek( nFilePos );
6994 List* pFieldList = NULL;
6995 while ( rIn.Tell() < aClientTextBoxHd.GetRecEndFilePos() )
6996 {
6997 rIn >> aTextHd;
6998 sal_uInt16 nVal = 0;
6999 PPTFieldEntry* pEntry = NULL;
7000 switch ( aTextHd.nRecType )
7001 {
7002 case PPT_PST_DateTimeMCAtom :
7003 {
7004 pEntry = new PPTFieldEntry;
7005 rIn >> pEntry->nPos
7006 >> nVal
7007 >> nVal;
7008 pEntry->SetDateTime( nVal & 0xff );
7009 }
7010 break;
7011
7012 case PPT_PST_FooterMCAtom :
7013 {
7014 pEntry = new PPTFieldEntry;
7015 rIn >> pEntry->nPos;
7016 pEntry->pField1 = new SvxFieldItem( SvxFooterField(), EE_FEATURE_FIELD );
7017 }
7018 break;
7019
7020 case PPT_PST_HeaderMCAtom :
7021 {
7022 pEntry = new PPTFieldEntry;
7023 rIn >> pEntry->nPos;
7024 pEntry->pField1 = new SvxFieldItem( SvxHeaderField(), EE_FEATURE_FIELD );
7025 }
7026 break;
7027
7028 case PPT_PST_GenericDateMCAtom :
7029 {
7030 pEntry = new PPTFieldEntry;
7031 rIn >> pEntry->nPos;
7032 pEntry->pField1 = new SvxFieldItem( SvxDateTimeField(), EE_FEATURE_FIELD );
7033 if ( rPersistEntry.pHeaderFooterEntry ) // sj: #i34111# on master pages it is possible
7034 { // that there is no HeaderFooterEntry available
7035 if ( rPersistEntry.pHeaderFooterEntry->nAtom & 0x20000 ) // auto date time
7036 pEntry->SetDateTime( rPersistEntry.pHeaderFooterEntry->nAtom & 0xff );
7037 else
7038 pEntry->pString = new String( rPersistEntry.pHeaderFooterEntry->pPlaceholder[ nVal ] );
7039 }
7040 }
7041 break;
7042
7043 case PPT_PST_SlideNumberMCAtom :
7044 case PPT_PST_RTFDateTimeMCAtom :
7045 {
7046 pEntry = new PPTFieldEntry;
7047 if ( aTextHd.nRecLen >= 4 )
7048 {
7049 rIn >> pEntry->nPos
7050 >> nVal;
7051
7052 // ID auswerten
7053 //SvxFieldItem* pFieldItem = NULL;
7054 switch( aTextHd.nRecType )
7055 {
7056 case PPT_PST_SlideNumberMCAtom:
7057 pEntry->pField1 = new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD );
7058 break;
7059
7060 case PPT_PST_RTFDateTimeMCAtom:
7061 {
7062 // Rude workaround for one special case reported
7063 // by a customer. (#i75203#)
7064
7065 // Don't even attempt to handle the general use
7066 // case for PPT_PST_RTFDateTimeMCAtom (a generic
7067 // MS style date/time format string). Just handle
7068 // the special case where the format string
7069 // contains only one or several possibly empty
7070 // quoted strings. I.e. something that doesn't
7071 // expand to any date or time at all, but to a
7072 // fixed string. How on earth somebody manages to
7073 // produce such things in PPT slides I have no
7074 // idea.
7075 if (nVal == 0)
7076 {
7077 sal_Unicode n;
7078 xub_StrLen nLen;
7079 String aStr;
7080 bool inquote = sal_False;
7081 for (nLen = 0, n = 0; nLen < 64; nLen++)
7082 {
7083 rIn >> n;
7084
7085 // Collect quoted characters into aStr
7086 if ( n == '\'')
7087 inquote = !inquote;
7088 else if (!n)
7089 {
7090 // End of format string
7091 pEntry->pString = new String( aStr );
7092 break;
7093 }
7094 else if (!inquote)
7095 {
7096 // Non-quoted character, i.e. a real
7097 // format specifier. We don't handle
7098 // those. Sorry.
7099 break;
7100 }
7101 else
7102 {
7103 aStr += n;
7104 }
7105 }
7106 }
7107 if ( pEntry->pString == NULL )
7108 {
7109 // Handle as previously
7110 pEntry->pField1 = new SvxFieldItem( SvxDateField( Date(), SVXDATETYPE_FIX ), EE_FEATURE_FIELD );
7111 }
7112 }
7113 }
7114 }
7115 }
7116 break;
7117
7118 case PPT_PST_InteractiveInfo :
7119 {
7120 DffRecordHeader aHdInteractiveInfoAtom;
7121 if ( rSdrPowerPointImport.SeekToRec( rIn, PPT_PST_InteractiveInfoAtom, aTextHd.GetRecEndFilePos(), &aHdInteractiveInfoAtom ) )
7122 {
7123 PptInteractiveInfoAtom aInteractiveInfoAtom;
7124 rIn >> aInteractiveInfoAtom;
7125 for ( SdHyperlinkEntry* pHyperlink = (SdHyperlinkEntry*)rSdrPowerPointImport.aHyperList.First();
7126 pHyperlink; pHyperlink = (SdHyperlinkEntry*)rSdrPowerPointImport.aHyperList.Next() )
7127 {
7128 if ( pHyperlink->nIndex == aInteractiveInfoAtom.nExHyperlinkId )
7129 {
7130 aTextHd.SeekToEndOfRecord( rIn );
7131 rIn >> aTextHd;
7132 if ( aTextHd.nRecType != PPT_PST_TxInteractiveInfoAtom )
7133 {
7134 aTextHd.SeekToBegOfRecord( rIn );
7135 continue;
7136 }
7137 else
7138 {
7139 sal_uInt32 nStartPos, nEndPos;
7140 rIn >> nStartPos
7141 >> nEndPos;
7142 if ( nEndPos )
7143 {
7144 pEntry = new PPTFieldEntry;
7145 pEntry->nPos = (sal_uInt16)nStartPos;
7146 pEntry->nTextRangeEnd = (sal_uInt16)nEndPos;
7147 String aTarget( pHyperlink->aTarget );
7148 if ( pHyperlink->aConvSubString.Len() )
7149 {
7150 aTarget.Append( (sal_Unicode)'#' );
7151 aTarget.Append( pHyperlink->aConvSubString );
7152 }
7153 pEntry->pField1 = new SvxFieldItem( SvxURLField( aTarget, String(), SVXURLFORMAT_REPR ), EE_FEATURE_FIELD );
7154 }
7155 }
7156 break;
7157 }
7158 }
7159 }
7160 }
7161 break;
7162 }
7163 aTextHd.SeekToEndOfRecord( rIn );
7164 if ( pEntry )
7165 {
7166 if ( !pFieldList )
7167 pFieldList = new List;
7168 sal_uInt32 n;
7169 for ( n = 0; n < pFieldList->Count(); n++ )
7170 { // sorting fields ( hi >> lo )
7171 if ( ( (PPTFieldEntry*)pFieldList->GetObject( n ) )->nPos < pEntry->nPos )
7172 break;
7173 }
7174 pFieldList->Insert( pEntry, (sal_uInt32)n );
7175 }
7176 }
7177 if ( pFieldList )
7178 {
7179 PPTFieldEntry* pFE = (PPTFieldEntry*)pFieldList->First();
7180 List& aCharPropList = aStyleTextPropReader.aCharPropList;
7181
7182 sal_Int32 i = nParagraphs - 1;
7183 sal_Int32 n = aCharPropList.Count() - 1;
7184
7185 // at this point we just have a list of textportions(aCharPropList)
7186 // the next while loop tries to resolve the list of fields(pFieldList)
7187 while( pFE && ( n >= 0 ) && ( i >= 0 ) )
7188 {
7189 PPTCharPropSet* pSet = (PPTCharPropSet*)aCharPropList.GetObject( n );
7190 String aString( pSet->maString );
7191 sal_uInt32 nCount = aString.Len();
7192 sal_uInt32 nPos = pSet->mnOriginalTextPos + nCount;
7193 while ( pFE && nCount-- )
7194 {
7195 nPos--;
7196 while ( pFE && ( pFE->nPos > nPos ) )
7197 pFE = (PPTFieldEntry*)pFieldList->Next();
7198 if ( !pFE )
7199 break;
7200
7201 if ( pFE->nPos == nPos )
7202 {
7203 if ( aString.GetChar( (sal_uInt16)nCount ) == 0x2a )
7204 {
7205 sal_uInt32 nBehind = aString.Len() - ( nCount + 1 );
7206 pSet->maString = String();
7207 if ( nBehind )
7208 {
7209 PPTCharPropSet* pNewCPS = new PPTCharPropSet( *pSet );
7210 pNewCPS->maString = String( aString, (sal_uInt16)nCount + 1, (sal_uInt16)nBehind );
7211 aCharPropList.Insert( pNewCPS, n + 1 );
7212 }
7213 if ( pFE->pField2 )
7214 {
7215 PPTCharPropSet* pNewCPS = new PPTCharPropSet( *pSet );
7216 pNewCPS->mpFieldItem = pFE->pField2, pFE->pField2 = NULL;
7217 aCharPropList.Insert( pNewCPS, n + 1 );
7218
7219 pNewCPS = new PPTCharPropSet( *pSet );
7220 pNewCPS->maString = String( String( RTL_CONSTASCII_USTRINGPARAM( " " ) ) );
7221 aCharPropList.Insert( pNewCPS, n + 1 );
7222 }
7223 if ( nCount )
7224 {
7225 PPTCharPropSet* pNewCPS = new PPTCharPropSet( *pSet );
7226 pNewCPS->maString = String( aString, (sal_uInt16)0, (sal_uInt16)nCount );
7227 aCharPropList.Insert( pNewCPS, n++ );
7228 }
7229 if ( pFE->pField1 )
7230 {
7231 pSet->mpFieldItem = pFE->pField1, pFE->pField1 = NULL;
7232 }
7233 else if ( pFE->pString )
7234 pSet->maString = *pFE->pString;
7235 }
7236 else
7237 {
7238 if ( pFE->nTextRangeEnd ) // text range hyperlink
7239 {
7240 sal_uInt32 nHyperLen = pFE->nTextRangeEnd - nPos;
7241 if ( nHyperLen )
7242 {
7243 PPTCharPropSet* pBefCPS = NULL;
7244 if ( nCount )
7245 {
7246 pBefCPS = new PPTCharPropSet( *pSet );
7247 pSet->maString = String( pSet->maString, (sal_uInt16)nCount, (sal_uInt16)( pSet->maString.Len() - nCount ) );
7248 }
7249 sal_uInt32 nIdx = n;
7250 sal_Int32 nHyperLenLeft = nHyperLen;
7251
7252 while ( ( aCharPropList.Count() > nIdx ) && nHyperLenLeft )
7253 {
7254 // the textrange hyperlink can take more than 1 paragraph
7255 // the solution here is to clone the hyperlink...
7256
7257 PPTCharPropSet* pCurrent = (PPTCharPropSet*)aCharPropList.GetObject( nIdx );
7258 sal_Int32 nNextStringLen = pCurrent->maString.Len();
7259
7260 DBG_ASSERT( pFE->pField1, "missing field!" );
7261 if (!pFE->pField1)
7262 break;
7263
7264 const SvxURLField* pField = (const SvxURLField*)pFE->pField1->GetField();
7265
7266 pCurrent->mbIsHyperlink=sal_True;
7267 pCurrent->mnHylinkOrigColor=pCurrent->pCharSet->mnColor;
7268 pCurrent->mbHardHylinkOrigColor= ( ( pCurrent->pCharSet->mnAttrSet >>PPT_CharAttr_FontColor ) & 1)>0;
7269
7270 if ( pCurrent->mpFieldItem )
7271 {
7272 pCurrent->SetColor( PPT_COLSCHEME_A_UND_HYPERLINK );
7273 if ( pCurrent->mpFieldItem->GetField()->ISA( SvxURLField ) )
7274 break;
7275 nHyperLenLeft--;
7276 }
7277 else if ( nNextStringLen )
7278 {
7279 if ( nNextStringLen <= nHyperLenLeft )
7280 {
7281 pCurrent->mpFieldItem = new SvxFieldItem( SvxURLField( pField->GetURL(), pCurrent->maString, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD );
7282 nHyperLenLeft -= nNextStringLen;
7283
7284 if ( nHyperLenLeft )
7285 {
7286 // if the next portion is in a higher paragraph,
7287 // the textrange is to decrease (because of the LineBreak character)
7288 if ( aCharPropList.Count() > ( nIdx + 1 ) )
7289 {
7290 PPTCharPropSet* pNext = (PPTCharPropSet*)aCharPropList.GetObject( nIdx + 1 );
7291 if ( pNext->mnParagraph > pCurrent->mnParagraph )
7292 nHyperLenLeft--;
7293 }
7294 }
7295 }
7296 else
7297 {
7298 PPTCharPropSet* pNewCPS = new PPTCharPropSet( *pCurrent );
7299 pNewCPS->maString = String( pCurrent->maString, (sal_uInt16)nHyperLenLeft, (sal_uInt16)( nNextStringLen - nHyperLenLeft ) );
7300 aCharPropList.Insert( pNewCPS, nIdx + 1 );
7301 String aRepresentation( pCurrent->maString, 0, (sal_uInt16)nHyperLenLeft );
7302 pCurrent->mpFieldItem = new SvxFieldItem( SvxURLField( pField->GetURL(), aRepresentation, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD );
7303 nHyperLenLeft = 0;
7304 }
7305 pCurrent->maString = String();
7306 pCurrent->SetColor( PPT_COLSCHEME_A_UND_HYPERLINK );
7307 }
7308 nIdx++;
7309 }
7310 delete pFE->pField1, pFE->pField1 = NULL;
7311
7312 if ( pBefCPS )
7313 {
7314 pBefCPS->maString = String( aString, (sal_uInt16)0, (sal_uInt16)nCount );
7315 aCharPropList.Insert( pBefCPS, n++ );
7316
7317 }
7318 }
7319 }
7320 }
7321 break;
7322 }
7323 }
7324 n--;
7325 }
7326 for ( void* pPtr = pFieldList->First(); pPtr; pPtr = pFieldList->Next() )
7327 delete (PPTFieldEntry*)pPtr;
7328 delete pFieldList;
7329 }
7330 mpImplTextObj->mpParagraphList = new PPTParagraphObj*[ nParagraphs ];
7331 aStyleTextPropReader.aCharPropList.First();
7332 sal_uInt32 nCount = 0;
7333 for ( void* pPtr = aStyleTextPropReader.aParaPropList.First();
7334 pPtr;
7335 pPtr = aStyleTextPropReader.aParaPropList.Next() )
7336 {
7337 PPTParagraphObj* pPara = new PPTParagraphObj( aStyleTextPropReader, *rSdrPowerPointImport.pPPTStyleSheet, nInstance, aTextRulerInterpreter );
7338 mpImplTextObj->mpParagraphList[ nCount++ ] = pPara;
7339
7340 sal_uInt32 nParaAdjust, nFlags = 0;
7341 pPara->GetAttrib( PPT_ParaAttr_Adjust, nParaAdjust, GetInstance() );
7342
7343 switch ( nParaAdjust )
7344 {
7345 case 0 : nFlags = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT; break;
7346 case 1 : nFlags = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_CENTER; break;
7347 case 2 : nFlags = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT; break;
7348 case 3 : nFlags = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_BLOCK; break;
7349 }
7350 mpImplTextObj->mnTextFlags |= nFlags;
7351 }
7352 }
7353 }
7354 }
7355 }
7356 }
7357 }
7358 }
7359
PPTTextObj(PPTTextObj & rTextObj)7360 PPTTextObj::PPTTextObj( PPTTextObj& rTextObj )
7361 {
7362 mpImplTextObj = rTextObj.mpImplTextObj;
7363 mpImplTextObj->mnRefCount++;
7364 }
7365
~PPTTextObj()7366 PPTTextObj::~PPTTextObj()
7367 {
7368 ImplClear();
7369 }
7370
First()7371 PPTParagraphObj* PPTTextObj::First()
7372 {
7373 mpImplTextObj->mnCurrentObject = 0;
7374 if ( !mpImplTextObj->mnParagraphCount )
7375 return NULL;
7376 return mpImplTextObj->mpParagraphList[ 0 ];
7377 }
7378
Next()7379 PPTParagraphObj* PPTTextObj::Next()
7380 {
7381 sal_uInt32 i = mpImplTextObj->mnCurrentObject + 1;
7382 if ( i >= mpImplTextObj->mnParagraphCount )
7383 return NULL;
7384 mpImplTextObj->mnCurrentObject++;
7385 return mpImplTextObj->mpParagraphList[ i ];
7386 }
7387
GetBackground() const7388 const SfxItemSet* PPTTextObj::GetBackground() const
7389 {
7390 if ( mpImplTextObj->mrPersistEntry.pBObj )
7391 return &mpImplTextObj->mrPersistEntry.pBObj->GetMergedItemSet();
7392 else
7393 return NULL;
7394 }
7395
ImplClear()7396 void PPTTextObj::ImplClear()
7397 {
7398 if ( ! ( --mpImplTextObj->mnRefCount ) )
7399 {
7400 for ( PPTParagraphObj* pPtr = First(); pPtr; pPtr = Next() )
7401 delete pPtr;
7402 delete[] mpImplTextObj->mpParagraphList;
7403 delete mpImplTextObj->mpPlaceHolderAtom;
7404 delete mpImplTextObj;
7405 }
7406 }
7407
operator =(PPTTextObj & rTextObj)7408 PPTTextObj& PPTTextObj::operator=( PPTTextObj& rTextObj )
7409 {
7410 if ( this != &rTextObj )
7411 {
7412 ImplClear();
7413 mpImplTextObj = rTextObj.mpImplTextObj;
7414 mpImplTextObj->mnRefCount++;
7415 }
7416 return *this;
7417 }
7418
IsLine(const SdrObject * pObj)7419 sal_Bool IsLine( const SdrObject* pObj )
7420 {
7421 return pObj->ISA( SdrPathObj ) && ((SdrPathObj*)pObj)->IsLine() && (((SdrPathObj*)pObj)->GetPointCount() == 2 );
7422 }
7423
GetCellPosition(const SdrObject * pObj,const std::set<sal_Int32> & rRows,const std::set<sal_Int32> & rColumns,sal_Int32 & nTableIndex,sal_Int32 & nRow,sal_Int32 & nRowCount,sal_Int32 & nColumn,sal_Int32 & nColumnCount)7424 sal_Bool GetCellPosition( const SdrObject* pObj, const std::set< sal_Int32 >& rRows, const std::set< sal_Int32 >& rColumns,
7425 sal_Int32& nTableIndex, sal_Int32& nRow, sal_Int32& nRowCount, sal_Int32& nColumn, sal_Int32& nColumnCount )
7426 {
7427 Rectangle aSnapRect( pObj->GetSnapRect() );
7428 sal_Bool bCellObject = ( aSnapRect.GetWidth() > 1 ) && ( aSnapRect.GetHeight() > 1 );
7429 if ( bCellObject )
7430 {
7431 std::set< sal_Int32 >::const_iterator aRowIter( rRows.find( aSnapRect.Top() ) );
7432 std::set< sal_Int32 >::const_iterator aColumnIter( rColumns.find( aSnapRect.Left() ) );
7433 if ( ( aRowIter == rRows.end() ) || ( aColumnIter == rColumns.end() ) )
7434 bCellObject = sal_False;
7435 else
7436 {
7437 nRowCount = 1;
7438 nRow = std::distance( rRows.begin(), aRowIter );
7439 while( ++aRowIter != rRows.end() )
7440 {
7441 if ( *aRowIter >= aSnapRect.Bottom() )
7442 break;
7443 nRowCount++;
7444 }
7445 nColumnCount = 1;
7446 nColumn = std::distance( rColumns.begin(), aColumnIter );
7447 while( ++aColumnIter != rColumns.end() )
7448 {
7449 if ( *aColumnIter >= aSnapRect.Right() )
7450 break;
7451 nColumnCount++;
7452 }
7453 nTableIndex = nRow * rColumns.size() + nColumn;
7454 }
7455 }
7456 return bCellObject;
7457 }
7458
7459 #define LinePositionLeft 0x01000000
7460 #define LinePositionTop 0x02000000
7461 #define LinePositionRight 0x04000000
7462 #define LinePositionBottom 0x08000000
7463 #define LinePositionTLBR 0x10000000
7464 #define LinePositionBLTR 0x20000000
7465
7466
GetRowPositions(const Rectangle & rSnapRect,const std::set<sal_Int32> & rRows,const std::set<sal_Int32> & rColumns,std::vector<sal_Int32> & rPositions,sal_Int32 nColumn,sal_Int32 nFlags)7467 void GetRowPositions( const Rectangle& rSnapRect, const std::set< sal_Int32 >& rRows,
7468 const std::set< sal_Int32 >& rColumns, std::vector< sal_Int32 >& rPositions, sal_Int32 nColumn, sal_Int32 nFlags )
7469 {
7470 std::set< sal_Int32 >::const_iterator aRow( rRows.find( rSnapRect.Top() ) );
7471 if ( aRow != rRows.end() )
7472 {
7473 sal_Int32 nRow = std::distance( rRows.begin(), aRow );
7474 while( ( aRow != rRows.end() ) && ((*aRow) < rSnapRect.Bottom() ) )
7475 {
7476 if ( nFlags & LinePositionLeft )
7477 rPositions.push_back( ( ( nRow * rColumns.size() ) + nColumn ) | LinePositionLeft );
7478 if ( nFlags & LinePositionRight )
7479 rPositions.push_back( ( ( nRow * rColumns.size() ) + ( nColumn - 1 ) ) | LinePositionRight );
7480
7481 nRow++;
7482 aRow++;
7483 }
7484 }
7485 }
7486
7487
GetColumnPositions(const Rectangle & rSnapRect,const std::set<sal_Int32> &,const std::set<sal_Int32> & rColumns,std::vector<sal_Int32> & rPositions,sal_Int32 nRow,sal_Int32 nFlags)7488 void GetColumnPositions( const Rectangle& rSnapRect, const std::set< sal_Int32 >& /* rRows */,
7489 const std::set< sal_Int32 >& rColumns, std::vector< sal_Int32 >& rPositions, sal_Int32 nRow, sal_Int32 nFlags )
7490 {
7491 std::set< sal_Int32 >::const_iterator aColumn( rColumns.find( rSnapRect.Left() ) );
7492 if ( aColumn != rColumns.end() )
7493 {
7494 sal_Int32 nColumn = std::distance( rColumns.begin(), aColumn );
7495 while( ( aColumn != rColumns.end() ) && ((*aColumn) < rSnapRect.Right() ) )
7496 {
7497 if ( nFlags & LinePositionTop )
7498 rPositions.push_back( ( ( nRow * rColumns.size() ) + nColumn ) | LinePositionTop );
7499 if ( nFlags & LinePositionBottom )
7500 rPositions.push_back( ( ( ( nRow - 1 ) * rColumns.size() ) + nColumn ) | LinePositionBottom );
7501
7502 nColumn++;
7503 aColumn++;
7504 }
7505 }
7506 }
7507
GetLinePositions(const SdrObject * pObj,const std::set<sal_Int32> & rRows,const std::set<sal_Int32> & rColumns,std::vector<sal_Int32> & rPositions,const Rectangle & rGroupSnap)7508 void GetLinePositions( const SdrObject* pObj, const std::set< sal_Int32 >& rRows, const std::set< sal_Int32 >& rColumns,
7509 std::vector< sal_Int32 >& rPositions, const Rectangle& rGroupSnap )
7510 {
7511 Rectangle aSnapRect( pObj->GetSnapRect() );
7512 if ( aSnapRect.Left() == aSnapRect.Right() )
7513 {
7514 std::set< sal_Int32 >::const_iterator aColumn( rColumns.find( aSnapRect.Left() ) );
7515 if ( ( aColumn != rColumns.end() ) || ( aSnapRect.Left() == rGroupSnap.Right() ) )
7516 {
7517 sal_Int32 nColumn, nFlags;
7518 if ( aColumn != rColumns.end() )
7519 {
7520 nColumn = std::distance( rColumns.begin(), aColumn );
7521 nFlags = LinePositionLeft;
7522 if ( aColumn != rColumns.begin() )
7523 nFlags |= LinePositionRight;
7524 }
7525 else
7526 {
7527 nColumn = rColumns.size();
7528 nFlags = LinePositionRight;
7529 }
7530 GetRowPositions( aSnapRect, rRows, rColumns, rPositions, nColumn, nFlags );
7531 }
7532 }
7533 else if ( aSnapRect.Top() == aSnapRect.Bottom() )
7534 {
7535 std::set< sal_Int32 >::const_iterator aRow( rRows.find( aSnapRect.Top() ) );
7536 if ( ( aRow != rRows.end() ) || ( aSnapRect.Top() == rGroupSnap.Bottom() ) )
7537 {
7538 sal_Int32 nRow, nFlags;
7539 if ( aRow != rRows.end() )
7540 {
7541 nRow = std::distance( rRows.begin(), aRow );
7542 nFlags = LinePositionTop;
7543 if ( aRow != rRows.begin() )
7544 nFlags |= LinePositionBottom;
7545 }
7546 else
7547 {
7548 nRow = rRows.size();
7549 nFlags = LinePositionBottom;
7550 }
7551 GetColumnPositions( aSnapRect, rRows, rColumns, rPositions, nRow, nFlags );
7552 }
7553 }
7554 else
7555 {
7556 sal_uInt32 nPosition = 0;
7557 Point aPt1( ((SdrPathObj*)pObj)->GetPoint( 0 ) );
7558 Point aPt2( ((SdrPathObj*)pObj)->GetPoint( 1 ) );
7559 if ( aPt1.X() < aPt2.X() )
7560 nPosition |= aPt1.Y() < aPt2.Y() ? LinePositionTLBR : LinePositionBLTR;
7561 else
7562 nPosition |= aPt1.Y() < aPt2.Y() ? LinePositionBLTR : LinePositionTLBR;
7563
7564 std::set< sal_Int32 >::const_iterator aRow( rRows.find( aPt1.Y() < aPt2.Y() ? aPt1.Y() : aPt2.Y() ) );
7565 std::set< sal_Int32 >::const_iterator aColumn( rColumns.find( aPt1.X() < aPt2.X() ? aPt1.X() : aPt2.X() ) );
7566 if ( ( aRow != rRows.end() ) && ( aColumn != rColumns.end() ) )
7567 {
7568 nPosition |= ( std::distance( rRows.begin(), aRow ) * rColumns.size() ) + std::distance( rColumns.begin(), aColumn );
7569 rPositions.push_back( nPosition );
7570 }
7571 }
7572 }
7573
CreateTableRows(Reference<XTableRows> xTableRows,const std::set<sal_Int32> & rRows,sal_Int32 nTableBottom)7574 void CreateTableRows( Reference< XTableRows > xTableRows, const std::set< sal_Int32 >& rRows, sal_Int32 nTableBottom )
7575 {
7576 if ( rRows.size() > 1 )
7577 xTableRows->insertByIndex( 0, rRows.size() - 1 );
7578
7579 std::set< sal_Int32 >::const_iterator aIter( rRows.begin() );
7580 sal_Int32 nLastPosition( *aIter );
7581 Reference< XIndexAccess > xIndexAccess( xTableRows, UNO_QUERY_THROW );
7582 for ( sal_Int32 n = 0; n < xIndexAccess->getCount(); n++ )
7583 {
7584 sal_Int32 nHeight;
7585 if ( ++aIter != rRows.end() )
7586 {
7587 nHeight = *aIter - nLastPosition;
7588 nLastPosition = *aIter;
7589 }
7590 else
7591 nHeight = nTableBottom - nLastPosition;
7592
7593 static const rtl::OUString sWidth( RTL_CONSTASCII_USTRINGPARAM ( "Height" ) );
7594 Reference< XPropertySet > xPropSet( xIndexAccess->getByIndex( n ), UNO_QUERY_THROW );
7595 xPropSet->setPropertyValue( sWidth, Any( nHeight ) );
7596 }
7597 }
7598
CreateTableColumns(Reference<XTableColumns> xTableColumns,const std::set<sal_Int32> & rColumns,sal_Int32 nTableRight)7599 void CreateTableColumns( Reference< XTableColumns > xTableColumns, const std::set< sal_Int32 >& rColumns, sal_Int32 nTableRight )
7600 {
7601 if ( rColumns.size() > 1 )
7602 xTableColumns->insertByIndex( 0, rColumns.size() - 1 );
7603
7604 std::set< sal_Int32 >::const_iterator aIter( rColumns.begin() );
7605 sal_Int32 nLastPosition( *aIter );
7606 Reference< XIndexAccess > xIndexAccess( xTableColumns, UNO_QUERY_THROW );
7607 for ( sal_Int32 n = 0; n < xIndexAccess->getCount(); n++ )
7608 {
7609 sal_Int32 nWidth;
7610 if ( ++aIter != rColumns.end() )
7611 {
7612 nWidth = *aIter - nLastPosition;
7613 nLastPosition = *aIter;
7614 }
7615 else
7616 nWidth = nTableRight - nLastPosition;
7617
7618 static const rtl::OUString sWidth( RTL_CONSTASCII_USTRINGPARAM ( "Width" ) );
7619 Reference< XPropertySet > xPropSet( xIndexAccess->getByIndex( n ), UNO_QUERY_THROW );
7620 xPropSet->setPropertyValue( sWidth, Any( nWidth ) );
7621 }
7622 }
7623
MergeCells(const Reference<XTable> & xTable,sal_Int32 nCol,sal_Int32 nRow,sal_Int32 nColSpan,sal_Int32 nRowSpan)7624 void MergeCells( const Reference< XTable >& xTable, sal_Int32 nCol, sal_Int32 nRow, sal_Int32 nColSpan, sal_Int32 nRowSpan )
7625 {
7626 DBG_ASSERT( (nColSpan > 1) || (nRowSpan > 1), "nonsense parameter!!" );
7627 DBG_ASSERT( (nCol >= 0) && (nCol < xTable->getColumnCount()) && (nRow >= 0) && (nRow < xTable->getRowCount()), "die zelle gibt es nicht!!" );
7628 DBG_ASSERT( (nColSpan >= 1) && ((nCol + nColSpan - 1) < xTable->getColumnCount()), "nColSpan murks!" );
7629 DBG_ASSERT( (nRowSpan >= 1) && ((nRow + nRowSpan - 1) < xTable->getRowCount()), "nRowSpan murks!" );
7630
7631 if( xTable.is() ) try
7632 {
7633 Reference< XMergeableCellRange > xRange( xTable->createCursorByRange( xTable->getCellRangeByPosition( nCol, nRow,nCol + nColSpan - 1, nRow + nRowSpan - 1 ) ), UNO_QUERY_THROW );
7634 if( xRange->isMergeable() )
7635 xRange->merge();
7636 }
7637 catch( Exception& )
7638 {
7639 DBG_ASSERT( false, "exception caught!" );
7640 }
7641 }
7642
ApplyCellAttributes(const SdrObject * pObj,Reference<XCell> & xCell)7643 void ApplyCellAttributes( const SdrObject* pObj, Reference< XCell >& xCell )
7644 {
7645 try
7646 {
7647 Reference< XPropertySet > xPropSet( xCell, UNO_QUERY_THROW );
7648
7649 const sal_Int32 nLeftDist(((const SdrTextLeftDistItem&)pObj->GetMergedItem(SDRATTR_TEXT_LEFTDIST)).GetValue());
7650 const sal_Int32 nRightDist(((const SdrTextRightDistItem&)pObj->GetMergedItem(SDRATTR_TEXT_RIGHTDIST)).GetValue());
7651 const sal_Int32 nUpperDist(((const SdrTextUpperDistItem&)pObj->GetMergedItem(SDRATTR_TEXT_UPPERDIST)).GetValue());
7652 const sal_Int32 nLowerDist(((const SdrTextLowerDistItem&)pObj->GetMergedItem(SDRATTR_TEXT_LOWERDIST)).GetValue());
7653 static const rtl::OUString sTopBorder( RTL_CONSTASCII_USTRINGPARAM( "TextUpperDistance" ) );
7654 static const rtl::OUString sBottomBorder( RTL_CONSTASCII_USTRINGPARAM( "TextLowerDistance" ) );
7655 static const rtl::OUString sLeftBorder( RTL_CONSTASCII_USTRINGPARAM( "TextLeftDistance" ) );
7656 static const rtl::OUString sRightBorder( RTL_CONSTASCII_USTRINGPARAM( "TextRightDistance" ) );
7657 xPropSet->setPropertyValue( sTopBorder, Any( nUpperDist ) );
7658 xPropSet->setPropertyValue( sRightBorder, Any( nRightDist ) );
7659 xPropSet->setPropertyValue( sLeftBorder, Any( nLeftDist ) );
7660 xPropSet->setPropertyValue( sBottomBorder, Any( nLowerDist ) );
7661
7662 static const rtl::OUString sTextVerticalAdjust( RTL_CONSTASCII_USTRINGPARAM( "TextVerticalAdjust" ) );
7663 const SdrTextVertAdjust eTextVertAdjust(((const SdrTextVertAdjustItem&)pObj->GetMergedItem(SDRATTR_TEXT_VERTADJUST)).GetValue());
7664 drawing::TextVerticalAdjust eVA( drawing::TextVerticalAdjust_TOP );
7665 if ( eTextVertAdjust == SDRTEXTVERTADJUST_CENTER )
7666 eVA = drawing::TextVerticalAdjust_CENTER;
7667 else if ( eTextVertAdjust == SDRTEXTVERTADJUST_BOTTOM )
7668 eVA = drawing::TextVerticalAdjust_BOTTOM;
7669 xPropSet->setPropertyValue( sTextVerticalAdjust, Any( eVA ) );
7670
7671 //set textHorizontalAdjust and TextWritingMode attr
7672 const sal_Int32 eHA(((const SdrTextLeftDistItem&)pObj->GetMergedItem(SDRATTR_TEXT_HORZADJUST)).GetValue());
7673 const SvxFrameDirection eDirection = (const SvxFrameDirection)((( const SvxFrameDirectionItem&)pObj->GetMergedItem(EE_PARA_WRITINGDIR)).GetValue());
7674 static const rtl::OUString sHorizontalAdjust( RTL_CONSTASCII_USTRINGPARAM( "TextHorizontalAdjust" ) );
7675 static const rtl::OUString sWritingMode( RTL_CONSTASCII_USTRINGPARAM("TextWritingMode") );
7676 xPropSet->setPropertyValue( sHorizontalAdjust , Any( eHA ) );
7677 if ( eDirection == FRMDIR_VERT_TOP_RIGHT )
7678 {//vertical writing
7679 xPropSet->setPropertyValue( sWritingMode , Any( ::com::sun::star::text::WritingMode_TB_RL ) );
7680 }
7681 SfxItemSet aSet( pObj->GetMergedItemSet() );
7682 XFillStyle eFillStyle(((XFillStyleItem&)pObj->GetMergedItem( XATTR_FILLSTYLE )).GetValue());
7683 ::com::sun::star::drawing::FillStyle eFS( com::sun::star::drawing::FillStyle_NONE );
7684 switch( eFillStyle )
7685 {
7686 case XFILL_SOLID :
7687 {
7688 static const rtl::OUString sFillColor( String( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ) ) );
7689 eFS = com::sun::star::drawing::FillStyle_SOLID;
7690 Color aFillColor( ((XFillColorItem&)pObj->GetMergedItem( XATTR_FILLCOLOR )).GetColorValue() );
7691 sal_Int32 nFillColor( aFillColor.GetColor() );
7692 xPropSet->setPropertyValue( sFillColor, Any( nFillColor ) );
7693 }
7694 break;
7695 case XFILL_GRADIENT :
7696 {
7697 eFS = com::sun::star::drawing::FillStyle_GRADIENT;
7698 XGradient aXGradient(((const XFillGradientItem&)pObj->GetMergedItem(XATTR_FILLGRADIENT)).GetGradientValue());
7699
7700 com::sun::star::awt::Gradient aGradient;
7701 aGradient.Style = (awt::GradientStyle) aXGradient.GetGradientStyle();
7702 aGradient.StartColor = (sal_Int32)aXGradient.GetStartColor().GetColor();
7703 aGradient.EndColor = (sal_Int32)aXGradient.GetEndColor().GetColor();
7704 aGradient.Angle = (short)aXGradient.GetAngle();
7705 aGradient.Border = aXGradient.GetBorder();
7706 aGradient.XOffset = aXGradient.GetXOffset();
7707 aGradient.YOffset = aXGradient.GetYOffset();
7708 aGradient.StartIntensity = aXGradient.GetStartIntens();
7709 aGradient.EndIntensity = aXGradient.GetEndIntens();
7710 aGradient.StepCount = aXGradient.GetSteps();
7711
7712 static const rtl::OUString sFillGradient( String( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ) ) );
7713 xPropSet->setPropertyValue( sFillGradient, Any( aGradient ) );
7714 }
7715 break;
7716 case XFILL_HATCH :
7717 eFS = com::sun::star::drawing::FillStyle_HATCH;
7718 break;
7719 case XFILL_BITMAP :
7720 {
7721 eFS = com::sun::star::drawing::FillStyle_BITMAP;
7722
7723 const XFillBitmapItem aXFillBitmapItem((const XFillBitmapItem&)pObj->GetMergedItem( XATTR_FILLBITMAP ));
7724 rtl::OUString aURL( RTL_CONSTASCII_USTRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX));
7725 aURL += rtl::OUString::createFromAscii(aXFillBitmapItem.GetGraphicObject().GetUniqueID().GetBuffer());
7726
7727 static const rtl::OUString sFillBitmapURL( String( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapURL" ) ) );
7728 xPropSet->setPropertyValue( sFillBitmapURL, Any( aURL ) );
7729
7730 static const rtl::OUString sFillBitmapMode( String( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapMode" ) ) );
7731 const XFillBmpStretchItem aStretchItem(( const XFillBmpStretchItem&)pObj->GetMergedItem( XATTR_FILLBMP_STRETCH ));
7732 const XFillBmpTileItem aTileItem(( const XFillBmpTileItem&)pObj->GetMergedItem( XATTR_FILLBMP_TILE ));
7733 if( aTileItem.GetValue() )
7734 xPropSet->setPropertyValue( sFillBitmapMode, Any( com::sun::star::drawing::BitmapMode_REPEAT ) );
7735 else if( aStretchItem.GetValue() )
7736 xPropSet->setPropertyValue( sFillBitmapMode, Any( com::sun::star::drawing::BitmapMode_STRETCH ) );
7737 else
7738 xPropSet->setPropertyValue( sFillBitmapMode, Any( com::sun::star::drawing::BitmapMode_NO_REPEAT ) );
7739 }
7740 break;
7741 case XFILL_NONE :
7742 eFS = com::sun::star::drawing::FillStyle_NONE;
7743 break;
7744
7745 }
7746 static const rtl::OUString sFillStyle( String( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ) ) );
7747 xPropSet->setPropertyValue( sFillStyle, Any( eFS ) );
7748 if ( eFillStyle != XFILL_NONE )
7749 {
7750 sal_Int16 nFillTransparence( ( (const XFillTransparenceItem&)pObj->GetMergedItem( XATTR_FILLTRANSPARENCE ) ).GetValue() );
7751 static const rtl::OUString sFillTransparence( String( RTL_CONSTASCII_USTRINGPARAM( "FillTransparence" ) ) );
7752 xPropSet->setPropertyValue( sFillTransparence, Any( nFillTransparence ) );
7753 }
7754 }
7755 catch( Exception& )
7756 {
7757 }
7758 }
7759
ApplyCellLineAttributes(const SdrObject * pLine,Reference<XTable> & xTable,const std::vector<sal_Int32> vPositions,sal_Int32 nColumns)7760 void ApplyCellLineAttributes( const SdrObject* pLine, Reference< XTable >& xTable, const std::vector< sal_Int32 > vPositions, sal_Int32 nColumns )
7761 {
7762 try
7763 {
7764 SfxItemSet aSet( pLine->GetMergedItemSet() );
7765 XLineStyle eLineStyle(((XLineStyleItem&)pLine->GetMergedItem( XATTR_LINESTYLE )).GetValue());
7766 com::sun::star::table::BorderLine aBorderLine;
7767 switch( eLineStyle )
7768 {
7769 case XLINE_DASH :
7770 case XLINE_SOLID :
7771 {
7772 Color aLineColor( ((XLineColorItem&)pLine->GetMergedItem( XATTR_LINECOLOR )).GetColorValue() );
7773 aBorderLine.Color = aLineColor.GetColor();
7774 // Avoid width = 0, the min value should be 1.
7775 aBorderLine.OuterLineWidth = std::max( static_cast< sal_Int16 >( 1 ), static_cast< sal_Int16 >( ((const XLineWidthItem&)(pLine->GetMergedItem(XATTR_LINEWIDTH))).GetValue() / 4) );
7776 aBorderLine.InnerLineWidth = std::max( static_cast< sal_Int16 >( 1 ), static_cast< sal_Int16 >( ((const XLineWidthItem&)(pLine->GetMergedItem(XATTR_LINEWIDTH))).GetValue() / 4) );
7777 aBorderLine.LineDistance = 0;
7778 }
7779 break;
7780 case XLINE_NONE :
7781 {
7782 aBorderLine.OuterLineWidth = 0;
7783 aBorderLine.InnerLineWidth = 0;
7784 aBorderLine.LineDistance = 0;
7785 }
7786 break;
7787 }
7788 Reference< XCellRange > xCellRange( xTable, UNO_QUERY_THROW );
7789 std::vector< sal_Int32 >::const_iterator aIter( vPositions.begin() );
7790 while( aIter != vPositions.end() )
7791 {
7792 static const rtl::OUString sTopBorder( String( RTL_CONSTASCII_USTRINGPARAM( "TopBorder" ) ) );
7793 static const rtl::OUString sBottomBorder( String( RTL_CONSTASCII_USTRINGPARAM( "BottomBorder" ) ) );
7794 static const rtl::OUString sLeftBorder( String( RTL_CONSTASCII_USTRINGPARAM( "LeftBorder" ) ) );
7795 static const rtl::OUString sRightBorder( String( RTL_CONSTASCII_USTRINGPARAM( "RightBorder" ) ) );
7796 static const rtl::OUString sDiagonalTLBR( RTL_CONSTASCII_USTRINGPARAM ( "DiagonalTLBR" ) );
7797 static const rtl::OUString sDiagonalBLTR( RTL_CONSTASCII_USTRINGPARAM ( "DiagonalBLTR" ) );
7798
7799 sal_Int32 nPosition = *aIter & 0xffffff;
7800 sal_Int32 nFlags = *aIter &~0xffffff;
7801 sal_Int32 nRow = nPosition / nColumns;
7802 sal_Int32 nColumn = nPosition - ( nRow * nColumns );
7803 Reference< XCell > xCell( xCellRange->getCellByPosition( nColumn, nRow ) );
7804 Reference< XPropertySet > xPropSet( xCell, UNO_QUERY_THROW );
7805
7806 if ( nFlags & LinePositionLeft )
7807 xPropSet->setPropertyValue( sLeftBorder, Any( aBorderLine ) );
7808 if ( nFlags & LinePositionTop )
7809 xPropSet->setPropertyValue( sTopBorder, Any( aBorderLine ) );
7810 if ( nFlags & LinePositionRight )
7811 xPropSet->setPropertyValue( sRightBorder, Any( aBorderLine ) );
7812 if ( nFlags & LinePositionBottom )
7813 xPropSet->setPropertyValue( sBottomBorder, Any( aBorderLine ) );
7814 if ( nFlags & LinePositionTLBR )
7815 xPropSet->setPropertyValue( sDiagonalTLBR, Any( sal_True ) );
7816 if ( nFlags & LinePositionBLTR )
7817 xPropSet->setPropertyValue( sDiagonalBLTR, Any( sal_True ) );
7818 aIter++;
7819 }
7820 }
7821 catch( Exception& )
7822 {
7823 }
7824 }
7825
CreateTable(SdrObject * pGroup,sal_uInt32 * pTableArry,SvxMSDffSolverContainer * pSolverContainer)7826 SdrObject* SdrPowerPointImport::CreateTable( SdrObject* pGroup, sal_uInt32* pTableArry, SvxMSDffSolverContainer* pSolverContainer )
7827 {
7828 SdrObject* pRet = pGroup;
7829 sal_uInt32 nRows = pTableArry[ 1 ];
7830 if ( nRows && pGroup->ISA( SdrObjGroup ) )
7831 {
7832 SdrObjList* pSubList(((SdrObjGroup*)pGroup)->GetSubList());
7833 if ( pSubList )
7834 {
7835 std::set< sal_Int32 > aRows;
7836 std::set< sal_Int32 > aColumns;
7837
7838 SdrObjListIter aGroupIter( *pSubList, IM_DEEPNOGROUPS, sal_False );
7839 while( aGroupIter.IsMore() )
7840 {
7841 const SdrObject* pObj( aGroupIter.Next() );
7842 if ( !IsLine( pObj ) )
7843 {
7844 Rectangle aSnapRect( pObj->GetSnapRect() );
7845 aRows.insert( aSnapRect.Top() );
7846 aColumns.insert( aSnapRect.Left() );
7847 }
7848 }
7849 ::sdr::table::SdrTableObj* pTable = new ::sdr::table::SdrTableObj( pSdrModel );
7850 pTable->uno_lock();
7851 Reference< XTable > xTable( pTable->getTable() );
7852 try
7853 {
7854 Reference< XColumnRowRange > xColumnRowRange( xTable, UNO_QUERY_THROW );
7855
7856 CreateTableRows( xColumnRowRange->getRows(), aRows, pGroup->GetSnapRect().Bottom() );
7857 CreateTableColumns( xColumnRowRange->getColumns(), aColumns, pGroup->GetSnapRect().Right() );
7858
7859 sal_Int32 nCellCount = aRows.size() * aColumns.size();
7860 sal_Int32 *pMergedCellIndexTable = new sal_Int32[ nCellCount ];
7861 for ( sal_Int32 i = 0; i < nCellCount; i++ )
7862 pMergedCellIndexTable[ i ] = i;
7863
7864 aGroupIter.Reset();
7865 while( aGroupIter.IsMore() )
7866 {
7867 SdrObject* pObj( aGroupIter.Next() );
7868 if ( !IsLine( pObj ) )
7869 {
7870 Rectangle aSnapRect( pObj->GetSnapRect() );
7871 sal_Int32 nTableIndex = 0;
7872 sal_Int32 nRow = 0;
7873 sal_Int32 nRowCount = 0;
7874 sal_Int32 nColumn = 0;
7875 sal_Int32 nColumnCount = 0;
7876 if ( GetCellPosition( pObj, aRows, aColumns, nTableIndex, nRow, nRowCount, nColumn, nColumnCount ) )
7877 {
7878 Reference< XCellRange > xCellRange( xTable, UNO_QUERY_THROW );
7879 Reference< XCell > xCell( xCellRange->getCellByPosition( nColumn, nRow ) );
7880
7881 ApplyCellAttributes( pObj, xCell );
7882
7883 if ( ( nRowCount > 1 ) || ( nColumnCount > 1 ) ) // cell merging
7884 {
7885 MergeCells( xTable, nColumn, nRow, nColumnCount, nRowCount );
7886 for ( sal_Int32 nRowIter = 0; nRowIter < nRowCount; nRowIter++ )
7887 {
7888 for ( sal_Int32 nColumnIter = 0; nColumnIter < nColumnCount; nColumnIter++ )
7889 { // now set the correct index for the merged cell
7890 pMergedCellIndexTable[ ( ( nRow + nRowIter ) * aColumns.size() ) + nColumn + nColumnIter ] = nTableIndex;
7891 }
7892 }
7893 }
7894
7895 // applying text
7896 OutlinerParaObject* pParaObject = pObj->GetOutlinerParaObject();
7897 if ( pParaObject )
7898 {
7899 SdrText* pSdrText = pTable->getText( nTableIndex );
7900 if ( pSdrText )
7901 pSdrText->SetOutlinerParaObject(new OutlinerParaObject(*pParaObject) );
7902 }
7903 }
7904 }
7905 }
7906 aGroupIter.Reset();
7907 while( aGroupIter.IsMore() )
7908 {
7909 SdrObject* pObj( aGroupIter.Next() );
7910 if ( IsLine( pObj ) )
7911 {
7912 std::vector< sal_Int32 > vPositions; // containing cell indexes + cell position
7913 GetLinePositions( pObj, aRows, aColumns, vPositions, pGroup->GetSnapRect() );
7914
7915 // correcting merged cell position
7916 std::vector< sal_Int32 >::iterator aIter( vPositions.begin() );
7917 while( aIter != vPositions.end() )
7918 {
7919 sal_Int32 nOldPosition = *aIter & 0xffff;
7920 sal_Int32 nOldFlags = *aIter & 0xffff0000;
7921 sal_Int32 nNewPosition = pMergedCellIndexTable[ nOldPosition ] | nOldFlags;
7922 *aIter++ = nNewPosition;
7923 }
7924 ApplyCellLineAttributes( pObj, xTable, vPositions, aColumns.size() );
7925 }
7926 }
7927 delete[] pMergedCellIndexTable;
7928
7929 // we are replacing the whole group object by a single table object, so
7930 // possibly connections to the group object have to be removed.
7931 if ( pSolverContainer )
7932 {
7933 for ( SvxMSDffConnectorRule* pPtr = (SvxMSDffConnectorRule*)pSolverContainer->aCList.First();
7934 pPtr; pPtr = (SvxMSDffConnectorRule*)pSolverContainer->aCList.Next() )
7935 {
7936 SdrObjListIter aIter( *pGroup, IM_DEEPWITHGROUPS );
7937 while( aIter.IsMore() )
7938 {
7939 SdrObject* pPartObj = aIter.Next();
7940 if ( pPtr->pAObj == pPartObj )
7941 pPtr->pAObj = NULL;
7942 if ( pPtr->pBObj == pPartObj )
7943 pPtr->pBObj = NULL;
7944 }
7945 //I n MS, the one_row_one_col table is made up of five shape,the connector is connected to some part of a table.
7946 // but in AOO, the connector is connected to the whole group table,so the connector obj is a group table when export by AOO.
7947 // should process this situation when import.
7948 if ( pPtr->pAObj == pGroup )
7949 pPtr->pAObj = pTable;
7950 if ( pPtr->pBObj == pGroup )
7951 pPtr->pBObj = pTable;
7952 }
7953 }
7954 pTable->uno_unlock();
7955 pTable->SetSnapRect( pGroup->GetSnapRect() );
7956 pRet = pTable;
7957
7958 // Remove Objects from shape map
7959 SdrObjListIter aIter( *pGroup, IM_DEEPWITHGROUPS );
7960 while( aIter.IsMore() )
7961 {
7962 SdrObject* pPartObj = aIter.Next();
7963 removeShapeId( pPartObj );
7964 }
7965
7966 SdrObject::Free( pGroup );
7967 }
7968 catch( Exception& )
7969 {
7970 pTable->uno_unlock();
7971 SdrObject* pObj = pTable;
7972 SdrObject::Free( pObj );
7973 }
7974 }
7975 }
7976 return pRet;
7977 }
7978
7979
7980 ////////////////////////////////////////////////////////////////////////////////////////////////////
IsVerticalText() const7981 sal_Bool SdrPowerPointImport::IsVerticalText() const
7982 {
7983 sal_Bool bVerticalText = sal_False;
7984 if ( IsProperty( DFF_Prop_txflTextFlow ) )
7985 {
7986 MSO_TextFlow eTextFlow = (MSO_TextFlow)( GetPropertyValue( DFF_Prop_txflTextFlow ) & 0xFFFF );
7987 switch( eTextFlow )
7988 {
7989 case mso_txflTtoBA : // Top to Bottom @-font, above -> below
7990 case mso_txflTtoBN : // Top to Bottom non-@, above -> below
7991 case mso_txflVertN : // Vertical, non-@, above -> below
7992 bVerticalText = !bVerticalText;
7993 break;
7994 default: break;
7995 }
7996 }
7997
7998 return bVerticalText;
7999 }
8000
ApplyTextAnchorAttributes(PPTTextObj & rTextObj,SfxItemSet & rSet) const8001 void SdrPowerPointImport::ApplyTextAnchorAttributes( PPTTextObj& rTextObj, SfxItemSet& rSet ) const
8002 {
8003 SdrTextVertAdjust eTVA;
8004 SdrTextHorzAdjust eTHA;
8005
8006 sal_uInt32 nTextFlags = rTextObj.GetTextFlags();
8007
8008 nTextFlags &= PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT
8009 | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_CENTER | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_BLOCK;
8010
8011 if ( IsVerticalText() )
8012 {
8013 eTVA = SDRTEXTVERTADJUST_BLOCK;
8014 eTHA = SDRTEXTHORZADJUST_CENTER;
8015
8016 // Textverankerung lesen
8017 MSO_Anchor eTextAnchor = (MSO_Anchor)GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
8018
8019 switch( eTextAnchor )
8020 {
8021 case mso_anchorTop:
8022 case mso_anchorTopCentered:
8023 eTHA = SDRTEXTHORZADJUST_RIGHT;
8024 break;
8025
8026 case mso_anchorMiddle :
8027 case mso_anchorMiddleCentered:
8028 eTHA = SDRTEXTHORZADJUST_CENTER;
8029 break;
8030
8031 case mso_anchorBottom:
8032 case mso_anchorBottomCentered:
8033 eTHA = SDRTEXTHORZADJUST_LEFT;
8034 break;
8035
8036 default:
8037 break;
8038 }
8039 // if there is a 100% use of following attributes, the textbox can been aligned also in vertical direction
8040 switch ( eTextAnchor )
8041 {
8042 case mso_anchorTopCentered :
8043 case mso_anchorMiddleCentered :
8044 case mso_anchorBottomCentered :
8045 {
8046 // check if it is sensible to use the centered alignment
8047 sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT;
8048 if ( ( nTextFlags & nMask ) != nMask ) // if the textobject has left or also right aligned paragraphs
8049 eTVA = SDRTEXTVERTADJUST_CENTER; // the text has to be displayed using the full width;
8050 }
8051 break;
8052
8053 default :
8054 {
8055 if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT )
8056 eTVA = SDRTEXTVERTADJUST_TOP;
8057 else if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT )
8058 eTVA = SDRTEXTVERTADJUST_BOTTOM;
8059 }
8060 break;
8061 }
8062 }
8063 else
8064 {
8065 eTVA = SDRTEXTVERTADJUST_CENTER;
8066 eTHA = SDRTEXTHORZADJUST_BLOCK;
8067
8068 // Textverankerung lesen
8069 MSO_Anchor eTextAnchor = (MSO_Anchor)GetPropertyValue( DFF_Prop_anchorText, mso_anchorTop );
8070
8071 switch( eTextAnchor )
8072 {
8073 case mso_anchorTop:
8074 case mso_anchorTopCentered:
8075 eTVA = SDRTEXTVERTADJUST_TOP;
8076 break;
8077
8078 case mso_anchorMiddle :
8079 case mso_anchorMiddleCentered:
8080 eTVA = SDRTEXTVERTADJUST_CENTER;
8081 break;
8082
8083 case mso_anchorBottom:
8084 case mso_anchorBottomCentered:
8085 eTVA = SDRTEXTVERTADJUST_BOTTOM;
8086 break;
8087
8088 default:
8089 break;
8090 }
8091 // if there is a 100% usage of following attributes, the textbox can be aligned also in horizontal direction
8092 switch ( eTextAnchor )
8093 {
8094 case mso_anchorTopCentered :
8095 case mso_anchorMiddleCentered :
8096 case mso_anchorBottomCentered :
8097 {
8098 // check if it is sensible to use the centered alignment
8099 sal_uInt32 nMask = PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT | PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT;
8100 if ( ( nTextFlags & nMask ) != nMask ) // if the textobject has left or also right aligned paragraphs
8101 eTHA = SDRTEXTHORZADJUST_CENTER; // the text has to be displayed using the full width;
8102 }
8103 break;
8104
8105 default :
8106 {
8107 if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_LEFT )
8108 eTHA = SDRTEXTHORZADJUST_LEFT;
8109 else if ( nTextFlags == PPT_TEXTOBJ_FLAGS_PARA_ALIGNMENT_USED_RIGHT )
8110 eTHA = SDRTEXTHORZADJUST_RIGHT;
8111 }
8112 break;
8113 }
8114 }
8115 rSet.Put( SdrTextVertAdjustItem( eTVA ) );
8116 rSet.Put( SdrTextHorzAdjustItem( eTHA ) );
8117 }
8118
8119 /* vim: set noet sw=4 ts=4: */
8120