Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <sal/config.h>
21 :
22 : #include <cstdlib>
23 :
24 : #include <osl/endian.h>
25 : #include <eppt.hxx>
26 : #include "text.hxx"
27 : #include "epptdef.hxx"
28 : #include "escherex.hxx"
29 : #include <tools/poly.hxx>
30 : #include <vcl/bmpacc.hxx>
31 : #include <vcl/gradient.hxx>
32 : #include <vcl/gfxlink.hxx>
33 : #include <tools/stream.hxx>
34 : #include <sot/storage.hxx>
35 : #include <vcl/outdev.hxx>
36 : #include <vcl/virdev.hxx>
37 : #include <sfx2/app.hxx>
38 : #include <svl/languageoptions.hxx>
39 : #include <editeng/svxenum.hxx>
40 : #include <svx/unoapi.hxx>
41 : #include <svx/svdoashp.hxx>
42 : #include <com/sun/star/style/VerticalAlignment.hpp>
43 : #include <com/sun/star/container/XIndexReplace.hpp>
44 : #include <com/sun/star/presentation/XPresentationPage.hpp>
45 : #include <com/sun/star/awt/XFont.hpp>
46 : #include <com/sun/star/awt/FontWeight.hpp>
47 : #include <com/sun/star/awt/FontUnderline.hpp>
48 : #include <com/sun/star/style/ParagraphAdjust.hpp>
49 : #include <com/sun/star/style/LineSpacing.hpp>
50 : #include <com/sun/star/style/LineSpacingMode.hpp>
51 : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
52 : #include <com/sun/star/style/XStyle.hpp>
53 : #include <com/sun/star/drawing/PointSequence.hpp>
54 : #include <com/sun/star/drawing/FlagSequence.hpp>
55 : #include <com/sun/star/drawing/PolygonFlags.hpp>
56 : #include <com/sun/star/beans/PropertyValue.hpp>
57 : #include <com/sun/star/drawing/XControlShape.hpp>
58 : #include <comphelper/processfactory.hxx>
59 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
60 : #include <com/sun/star/i18n/XBreakIterator.hpp>
61 : #include <com/sun/star/i18n/XScriptTypeDetector.hpp>
62 : #include <com/sun/star/i18n/ScriptType.hpp>
63 : #include <com/sun/star/i18n/ScriptDirection.hpp>
64 : #include <com/sun/star/embed/Aspects.hpp>
65 : #include <vcl/cvtgrf.hxx>
66 : #include <tools/urlobj.hxx>
67 : #include <comphelper/extract.hxx>
68 : #include <cppuhelper/proptypehlp.hxx>
69 : #include <toolkit/helper/vclunohelper.hxx>
70 : #include <rtl/crc.h>
71 : #include <comphelper/classids.hxx>
72 : #include <unotools/ucbstreamhelper.hxx>
73 : #include <com/sun/star/text/FontRelief.hpp>
74 : #include <editeng/frmdiritem.hxx>
75 : #include <vcl/fltcall.hxx>
76 : #include <com/sun/star/table/XTable.hpp>
77 : #include <com/sun/star/table/XMergeableCell.hpp>
78 : #include <com/sun/star/table/BorderLine.hpp>
79 : #include <set>
80 : #include <oox/ole/olehelper.hxx>
81 : #include "i18nlangtag/languagetag.hxx"
82 :
83 : using namespace ::com::sun::star;
84 :
85 : #define ANSI_CHARSET 0
86 : #define SYMBOL_CHARSET 2
87 :
88 : /* Font Families */
89 : #define FF_ROMAN 0x10
90 : #define FF_SWISS 0x20
91 : #define FF_MODERN 0x30
92 : #define FF_SCRIPT 0x40
93 : #define FF_DECORATIVE 0x50
94 :
95 : #define DEFAULT_PITCH 0x00
96 : #define FIXED_PITCH 0x01
97 :
98 3 : PPTExBulletProvider::PPTExBulletProvider()
99 : {
100 3 : pGraphicProv = new EscherGraphicProvider( _E_GRAPH_PROV_USE_INSTANCES | _E_GRAPH_PROV_DO_NOT_ROTATE_METAFILES );
101 3 : }
102 :
103 6 : PPTExBulletProvider::~PPTExBulletProvider()
104 : {
105 3 : delete pGraphicProv;
106 3 : }
107 :
108 0 : sal_uInt16 PPTExBulletProvider::GetId( const OString& rUniqueId, Size& rGraphicSize )
109 : {
110 0 : sal_uInt16 nRetValue = 0xffff;
111 :
112 0 : if ( !rUniqueId.isEmpty() )
113 : {
114 0 : Rectangle aRect;
115 0 : GraphicObject aGraphicObject( rUniqueId );
116 0 : Graphic aMappedGraphic, aGraphic( aGraphicObject.GetGraphic() );
117 0 : Size aPrefSize( aGraphic.GetPrefSize() );
118 0 : BitmapEx aBmpEx( aGraphic.GetBitmapEx() );
119 :
120 0 : if ( rGraphicSize.Width() && rGraphicSize.Height() )
121 : {
122 0 : double fQ1 = ( (double)aPrefSize.Width() / (double)aPrefSize.Height() );
123 0 : double fQ2 = ( (double)rGraphicSize.Width() / (double)rGraphicSize.Height() );
124 0 : double fXScale = 1;
125 0 : double fYScale = 1;
126 :
127 0 : if ( fQ1 > fQ2 )
128 0 : fYScale = fQ1 / fQ2;
129 0 : else if ( fQ1 < fQ2 )
130 0 : fXScale = fQ2 / fQ1;
131 :
132 0 : if ( ( fXScale != 1.0 ) || ( fYScale != 1.0 ) )
133 : {
134 0 : aBmpEx.Scale( fXScale, fYScale );
135 0 : Size aNewSize( (sal_Int32)((double)rGraphicSize.Width() / fXScale + 0.5 ),
136 0 : (sal_Int32)((double)rGraphicSize.Height() / fYScale + 0.5 ) );
137 :
138 0 : rGraphicSize = aNewSize;
139 :
140 0 : aMappedGraphic = Graphic( aBmpEx );
141 0 : aGraphicObject = GraphicObject( aMappedGraphic );
142 : }
143 : }
144 0 : sal_uInt32 nId = pGraphicProv->GetBlibID( aBuExPictureStream, aGraphicObject.GetUniqueID(), aRect, NULL, NULL );
145 :
146 0 : if ( nId && ( nId < 0x10000 ) )
147 0 : nRetValue = (sal_uInt16)nId - 1;
148 : }
149 0 : return nRetValue;
150 : }
151 :
152 6 : sal_uInt32 PPTWriter::ImplVBAInfoContainer( SvStream* pStrm )
153 : {
154 6 : sal_uInt32 nSize = 28;
155 6 : if ( pStrm )
156 : {
157 3 : pStrm->WriteUInt32( 0x1f | ( EPP_VBAInfo << 16 ) )
158 6 : .WriteUInt32( nSize - 8 )
159 3 : .WriteUInt32( 2 | ( EPP_VBAInfoAtom << 16 ) )
160 3 : .WriteUInt32( 12 );
161 3 : mpPptEscherEx->InsertPersistOffset( EPP_Persist_VBAInfoAtom, pStrm->Tell() );
162 3 : pStrm->WriteUInt32( 0 )
163 3 : .WriteUInt32( 0 )
164 3 : .WriteUInt32( 1 );
165 : }
166 6 : return nSize;
167 : }
168 :
169 12 : sal_uInt32 PPTWriter::ImplSlideViewInfoContainer( sal_uInt32 nInstance, SvStream* pStrm )
170 : {
171 12 : sal_uInt32 nSize = 111;
172 12 : if ( pStrm )
173 : {
174 6 : sal_uInt8 bShowGuides = 0;
175 6 : sal_uInt8 bSnapToGrid = 1;
176 6 : sal_uInt8 bSnapToShape = 0;
177 :
178 6 : sal_Int32 nScaling = 85;
179 6 : sal_Int32 nMasterCoordinate = 0xdda;
180 6 : sal_Int32 nXOrigin = -780;
181 6 : sal_Int32 nYOrigin = -84;
182 :
183 6 : sal_Int32 nPosition1 = 0x870;
184 6 : sal_Int32 nPosition2 = 0xb40;
185 :
186 6 : if ( nInstance )
187 : {
188 3 : bShowGuides = 1;
189 3 : nScaling = 0x3b;
190 3 : nMasterCoordinate = 0xf0c;
191 3 : nXOrigin = -1752;
192 3 : nYOrigin = -72;
193 3 : nPosition1 = 0xb40;
194 3 : nPosition2 = 0x870;
195 : }
196 6 : pStrm->WriteUInt32( 0xf | ( EPP_SlideViewInfo << 16 ) | ( nInstance << 4 ) )
197 12 : .WriteUInt32( nSize - 8 )
198 6 : .WriteUInt32( EPP_SlideViewInfoAtom << 16 ).WriteUInt32( 3 )
199 12 : .WriteUChar( bShowGuides ).WriteUChar( bSnapToGrid ).WriteUChar( bSnapToShape )
200 6 : .WriteUInt32( EPP_ViewInfoAtom << 16 ).WriteUInt32( 52 )
201 6 : .WriteInt32( nScaling ).WriteInt32( 100 ).WriteInt32( nScaling ).WriteInt32( 100 ) // scaling atom - Keeps the current scale
202 6 : .WriteInt32( nScaling ).WriteInt32( 100 ).WriteInt32( nScaling ).WriteInt32( 100 ) // scaling atom - Keeps the previous scale
203 6 : .WriteInt32( 0x17ac ).WriteInt32( nMasterCoordinate )// Origin - Keeps the origin in master coordinates
204 6 : .WriteInt32( nXOrigin ).WriteInt32( nYOrigin ) // Origin
205 6 : .WriteUChar( 1 ) // Bool1 varScale - Set if zoom to fit is set
206 6 : .WriteUChar( 0 ) // bool1 draftMode - Not used
207 6 : .WriteUInt16( 0 ) // padword
208 6 : .WriteUInt32( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ).WriteUInt32( 8 )
209 6 : .WriteUInt32( 0 ) // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
210 6 : .WriteInt32( nPosition1 ) // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
211 6 : .WriteUInt32( ( 7 << 4 ) | ( EPP_GuideAtom << 16 ) ).WriteUInt32( 8 )
212 6 : .WriteInt32( 1 ) // Type of the guide. If the guide is horizontal this value is zero. If it's vertical, it's one.
213 6 : .WriteInt32( nPosition2 ); // Position of the guide in master coordinates. X coordinate if it's vertical, and Y coordinate if it's horizontal.
214 : }
215 12 : return nSize;
216 : }
217 :
218 6 : sal_uInt32 PPTWriter::ImplOutlineViewInfoContainer( SvStream* pStrm )
219 : {
220 6 : sal_uInt32 nSize = 68;
221 6 : if ( pStrm )
222 : {
223 3 : pStrm->WriteUInt32( 0xf | ( EPP_OutlineViewInfo << 16 ) ).WriteUInt32( nSize - 8 )
224 3 : .WriteUInt32( EPP_ViewInfoAtom << 16 ).WriteUInt32( 52 )
225 3 : .WriteInt32( 170 ).WriteInt32( 200 ).WriteInt32( 170 ).WriteInt32( 200 ) // scaling atom - Keeps the current scale
226 3 : .WriteInt32( 170 ).WriteInt32( 200 ).WriteInt32( 170 ).WriteInt32( 200 ) // scaling atom - Keeps the previous scale
227 3 : .WriteInt32( 0x17ac ).WriteInt32( 0xdda ) // Origin - Keeps the origin in master coordinates
228 3 : .WriteInt32( -780 ).WriteInt32( -84 ) // Origin
229 3 : .WriteUChar( 1 ) // bool1 varScale - Set if zoom to fit is set
230 3 : .WriteUChar( 0 ) // bool1 draftMode - Not used
231 3 : .WriteUInt16( 0 ); // padword
232 : }
233 6 : return nSize;
234 : }
235 :
236 0 : sal_uInt32 PPTWriter::ImplProgBinaryTag( SvStream* pStrm )
237 : {
238 0 : sal_uInt32 nPictureStreamSize, nOutlineStreamSize, nSize = 8;
239 :
240 0 : nPictureStreamSize = aBuExPictureStream.Tell();
241 0 : if ( nPictureStreamSize )
242 0 : nSize += nPictureStreamSize + 8;
243 :
244 0 : nOutlineStreamSize = aBuExOutlineStream.Tell();
245 0 : if ( nOutlineStreamSize )
246 0 : nSize += nOutlineStreamSize + 8;
247 :
248 0 : if ( pStrm )
249 : {
250 0 : pStrm->WriteUInt32( EPP_BinaryTagData << 16 ).WriteUInt32( nSize - 8 );
251 0 : if ( nPictureStreamSize )
252 : {
253 0 : pStrm->WriteUInt32( 0xf | ( EPP_PST_ExtendedBuGraContainer << 16 ) ).WriteUInt32( nPictureStreamSize );
254 0 : pStrm->Write( aBuExPictureStream.GetData(), nPictureStreamSize );
255 : }
256 0 : if ( nOutlineStreamSize )
257 : {
258 0 : pStrm->WriteUInt32( 0xf | ( EPP_PST_ExtendedPresRuleContainer << 16 ) ).WriteUInt32( nOutlineStreamSize );
259 0 : pStrm->Write( aBuExOutlineStream.GetData(), nOutlineStreamSize );
260 : }
261 : }
262 0 : return nSize;
263 : }
264 :
265 0 : sal_uInt32 PPTWriter::ImplProgBinaryTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
266 : {
267 0 : sal_uInt32 nSize = 8 + 8 + 14;
268 0 : if ( pStrm )
269 : {
270 0 : pStrm->WriteUInt32( 0xf | ( EPP_ProgBinaryTag << 16 ) ).WriteUInt32( 0 )
271 0 : .WriteUInt32( EPP_CString << 16 ).WriteUInt32( 14 )
272 0 : .WriteUInt32( 0x5f005f ).WriteUInt32( 0x50005f )
273 0 : .WriteUInt32( 0x540050 ).WriteUInt16( 0x39 );
274 : }
275 0 : if ( pStrm && pBinTagStrm )
276 : {
277 0 : sal_uInt32 nLen = pBinTagStrm->Tell();
278 0 : nSize += nLen + 8;
279 0 : pStrm->WriteUInt32( EPP_BinaryTagData << 16 ).WriteUInt32( nLen );
280 0 : pStrm->Write( pBinTagStrm->GetData(), nLen );
281 : }
282 : else
283 0 : nSize += ImplProgBinaryTag( pStrm );
284 :
285 0 : if ( pStrm )
286 : {
287 0 : pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
288 0 : pStrm->WriteUInt32( nSize - 8 );
289 0 : pStrm->SeekRel( nSize - 8 );
290 : }
291 0 : return nSize;
292 : }
293 :
294 6 : sal_uInt32 PPTWriter::ImplProgTagContainer( SvStream* pStrm, SvMemoryStream* pBinTagStrm )
295 : {
296 6 : sal_uInt32 nSize = 0;
297 6 : if ( aBuExPictureStream.Tell() || aBuExOutlineStream.Tell() || pBinTagStrm )
298 : {
299 0 : nSize = 8;
300 0 : if ( pStrm )
301 : {
302 0 : pStrm->WriteUInt32( 0xf | ( EPP_ProgTags << 16 ) ).WriteUInt32( 0 );
303 : }
304 0 : nSize += ImplProgBinaryTagContainer( pStrm, pBinTagStrm );
305 0 : if ( pStrm )
306 : {
307 0 : pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
308 0 : pStrm->WriteUInt32( nSize - 8 );
309 0 : pStrm->SeekRel( nSize - 8 );
310 : }
311 : }
312 6 : return nSize;
313 : }
314 :
315 6 : sal_uInt32 PPTWriter::ImplDocumentListContainer( SvStream* pStrm )
316 : {
317 6 : sal_uInt32 nSize = 8;
318 6 : if ( pStrm )
319 : {
320 3 : pStrm->WriteUInt32( ( EPP_List << 16 ) | 0xf ).WriteUInt32( 0 );
321 : }
322 :
323 6 : nSize += ImplVBAInfoContainer( pStrm );
324 6 : nSize += ImplSlideViewInfoContainer( 0, pStrm );
325 6 : nSize += ImplOutlineViewInfoContainer( pStrm );
326 6 : nSize += ImplSlideViewInfoContainer( 1, pStrm );
327 6 : nSize += ImplProgTagContainer( pStrm );
328 :
329 6 : if ( pStrm )
330 : {
331 3 : pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
332 3 : pStrm->WriteUInt32( nSize - 8 );
333 3 : pStrm->SeekRel( nSize - 8 );
334 : }
335 6 : return nSize;
336 : }
337 :
338 6 : sal_uInt32 PPTWriter::ImplMasterSlideListContainer( SvStream* pStrm )
339 : {
340 6 : sal_uInt32 i, nSize = 28 * mnMasterPages + 8;
341 6 : if ( pStrm )
342 : {
343 3 : pStrm->WriteUInt32( 0x1f | ( EPP_SlideListWithText << 16 ) ).WriteUInt32( nSize - 8 );
344 :
345 6 : for ( i = 0; i < mnMasterPages; i++ )
346 : {
347 3 : pStrm->WriteUInt32( EPP_SlidePersistAtom << 16 ).WriteUInt32( 20 );
348 3 : mpPptEscherEx->InsertPersistOffset( EPP_MAINMASTER_PERSIST_KEY | i, pStrm->Tell() );
349 3 : pStrm->WriteUInt32( 0 ) // psrReference - logical reference to the slide persist object ( EPP_MAINMASTER_PERSIST_KEY )
350 3 : .WriteUInt32( 0 ) // flags - only bit 3 used, if set then slide contains shapes other than placeholders
351 3 : .WriteInt32( 0 ) // numberTexts - number of placeholder texts stored with the persist object. Allows to display outline view without loading the slide persist objects
352 6 : .WriteInt32( 0x80000000 | i ) // slideId - Unique slide identifier, used for OLE link monikers for example
353 3 : .WriteUInt32( 0 ); // reserved, usually 0
354 : }
355 : }
356 6 : return nSize;
357 : }
358 :
359 0 : sal_uInt32 PPTWriter::ImplInsertBookmarkURL( const OUString& rBookmarkURL, const sal_uInt32 nType,
360 : const OUString& rStringVer0, const OUString& rStringVer1, const OUString& rStringVer2, const OUString& rStringVer3 )
361 : {
362 0 : sal_uInt32 nHyperId = ++mnExEmbed;
363 :
364 0 : OUString sBookmarkURL( rBookmarkURL );
365 0 : INetURLObject aBaseURI( maBaseURI );
366 0 : INetURLObject aBookmarkURI( rBookmarkURL );
367 0 : if( aBaseURI.GetProtocol() == aBookmarkURI.GetProtocol() )
368 : {
369 : OUString aRelUrl( INetURLObject::GetRelURL( maBaseURI, rBookmarkURL,
370 0 : INetURLObject::WAS_ENCODED, INetURLObject::DECODE_TO_IURI, RTL_TEXTENCODING_UTF8, INetURLObject::FSYS_DETECT ) );
371 0 : if ( !aRelUrl.isEmpty() )
372 0 : sBookmarkURL = aRelUrl;
373 : }
374 0 : maHyperlink.push_back( EPPTHyperlink( sBookmarkURL, nType ) );
375 :
376 0 : mpExEmbed->WriteUInt16( 0xf )
377 0 : .WriteUInt16( EPP_ExHyperlink )
378 0 : .WriteUInt32( 0 );
379 0 : sal_uInt32 nHyperSize, nHyperStart = mpExEmbed->Tell();
380 0 : mpExEmbed->WriteUInt16( 0 )
381 0 : .WriteUInt16( EPP_ExHyperlinkAtom )
382 0 : .WriteUInt32( 4 )
383 0 : .WriteUInt32( nHyperId );
384 :
385 0 : PPTWriter::WriteCString( *mpExEmbed, rStringVer0, 0 );
386 0 : PPTWriter::WriteCString( *mpExEmbed, rStringVer1, 1 );
387 0 : PPTWriter::WriteCString( *mpExEmbed, rStringVer2, 2 );
388 0 : PPTWriter::WriteCString( *mpExEmbed, rStringVer3, 3 );
389 :
390 0 : nHyperSize = mpExEmbed->Tell() - nHyperStart;
391 0 : mpExEmbed->SeekRel( - ( (sal_Int32)nHyperSize + 4 ) );
392 0 : mpExEmbed->WriteUInt32( nHyperSize );
393 0 : mpExEmbed->SeekRel( nHyperSize );
394 0 : return nHyperId;
395 : }
396 :
397 3 : bool PPTWriter::ImplCloseDocument()
398 : {
399 3 : sal_uInt32 nOfs = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_Document );
400 3 : if ( nOfs )
401 : {
402 3 : mpPptEscherEx->PtReplaceOrInsert( EPP_Persist_CurrentPos, mpStrm->Tell() );
403 3 : mpStrm->Seek( nOfs );
404 :
405 : // creating the TxMasterStyleAtom
406 3 : SvMemoryStream aTxMasterStyleAtomStrm( 0x200, 0x200 );
407 : {
408 3 : EscherExAtom aTxMasterStyleAtom( aTxMasterStyleAtomStrm, EPP_TxMasterStyleAtom, EPP_TEXTTYPE_Other );
409 3 : aTxMasterStyleAtomStrm.WriteUInt16( 5 ); // paragraph count
410 : sal_uInt16 nLev;
411 3 : bool bFirst = true;
412 18 : for ( nLev = 0; nLev < 5; nLev++ )
413 : {
414 15 : mpStyleSheet->mpParaSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, mpPptEscherEx, nLev, bFirst, false, mXPagePropSet );
415 15 : mpStyleSheet->mpCharSheet[ EPP_TEXTTYPE_Other ]->Write( aTxMasterStyleAtomStrm, mpPptEscherEx, nLev, bFirst, false, mXPagePropSet );
416 15 : bFirst = false;
417 3 : }
418 : }
419 :
420 3 : mpExEmbed->Seek( STREAM_SEEK_TO_END );
421 3 : sal_uInt32 nExEmbedSize = mpExEmbed->Tell();
422 :
423 : // nEnvironment : whole size of the environment container
424 3 : sal_uInt32 nEnvironment = maFontCollection.GetCount() * 76 // 68 bytes per Fontenityatom and 8 Bytes per header
425 : + 8 // 1 FontCollection container
426 : + 20 // SrKinsoku container
427 : + 18 // 1 TxSiStyleAtom
428 3 : + aTxMasterStyleAtomStrm.Tell() // 1 TxMasterStyleAtom;
429 3 : + PPTExStyleSheet::SizeOfTxCFStyleAtom();
430 :
431 3 : sal_uInt32 nBytesToInsert = nEnvironment + 8;
432 :
433 3 : if ( nExEmbedSize )
434 0 : nBytesToInsert += nExEmbedSize + 8 + 12;
435 :
436 3 : nBytesToInsert += maSoundCollection.GetSize();
437 3 : nBytesToInsert += mpPptEscherEx->DrawingGroupContainerSize();
438 3 : nBytesToInsert += ImplMasterSlideListContainer( NULL );
439 3 : nBytesToInsert += ImplDocumentListContainer( NULL );
440 :
441 : // insert nBytes into stream and adjust depending container
442 3 : mpPptEscherEx->InsertAtCurrentPos( nBytesToInsert, false );
443 :
444 : // CREATE HYPERLINK CONTAINER
445 3 : if ( nExEmbedSize )
446 : {
447 0 : mpStrm->WriteUInt16( 0xf )
448 0 : .WriteUInt16( EPP_ExObjList )
449 0 : .WriteUInt32( nExEmbedSize + 12 )
450 0 : .WriteUInt16( 0 )
451 0 : .WriteUInt16( EPP_ExObjListAtom )
452 0 : .WriteUInt32( 4 )
453 0 : .WriteUInt32( mnExEmbed );
454 0 : mpPptEscherEx->InsertPersistOffset( EPP_Persist_ExObj, mpStrm->Tell() );
455 0 : mpStrm->Write( mpExEmbed->GetData(), nExEmbedSize );
456 : }
457 :
458 : // CREATE ENVIRONMENT
459 3 : mpStrm->WriteUInt16( 0xf ).WriteUInt16( EPP_Environment ).WriteUInt32( nEnvironment );
460 :
461 : // Open Container ( EPP_SrKinsoku )
462 3 : mpStrm->WriteUInt16( 0x2f ).WriteUInt16( EPP_SrKinsoku ).WriteUInt32( 12 );
463 3 : mpPptEscherEx->AddAtom( 4, EPP_SrKinsokuAtom, 0, 3 );
464 3 : mpStrm->WriteInt32( 0 ); // SrKinsoku Level 0
465 :
466 : // Open Container ( EPP_FontCollection )
467 3 : mpStrm->WriteUInt16( 0xf ).WriteUInt16( EPP_FontCollection ).WriteUInt32( maFontCollection.GetCount() * 76 );
468 :
469 14 : for ( sal_uInt32 i = 0; i < maFontCollection.GetCount(); i++ )
470 : {
471 11 : mpPptEscherEx->AddAtom( 68, EPP_FontEnityAtom, 0, i );
472 11 : const FontCollectionEntry* pDesc = maFontCollection.GetById( i );
473 11 : sal_Int32 nFontLen = pDesc->Name.getLength();
474 11 : if ( nFontLen > 31 )
475 0 : nFontLen = 31;
476 363 : for ( sal_Int32 n = 0; n < 32; n++ )
477 : {
478 352 : sal_Unicode nUniCode = 0;
479 352 : if ( n < nFontLen )
480 131 : nUniCode = pDesc->Name[n];
481 352 : mpStrm->WriteUInt16( nUniCode );
482 : }
483 11 : sal_uInt8 lfCharSet = ANSI_CHARSET;
484 11 : sal_uInt8 lfClipPrecision = 0;
485 11 : sal_uInt8 lfQuality = 6;
486 11 : sal_uInt8 lfPitchAndFamily = 0;
487 :
488 11 : if ( pDesc->CharSet == RTL_TEXTENCODING_SYMBOL )
489 0 : lfCharSet = SYMBOL_CHARSET;
490 :
491 11 : switch( pDesc->Family )
492 : {
493 : case ::com::sun::star::awt::FontFamily::ROMAN :
494 6 : lfPitchAndFamily |= FF_ROMAN;
495 6 : break;
496 :
497 : case ::com::sun::star::awt::FontFamily::SWISS :
498 0 : lfPitchAndFamily |= FF_SWISS;
499 0 : break;
500 :
501 : case ::com::sun::star::awt::FontFamily::MODERN :
502 0 : lfPitchAndFamily |= FF_MODERN;
503 0 : break;
504 :
505 : case ::com::sun::star::awt::FontFamily::SCRIPT:
506 0 : lfPitchAndFamily |= FF_SCRIPT;
507 0 : break;
508 :
509 : case ::com::sun::star::awt::FontFamily::DECORATIVE:
510 0 : lfPitchAndFamily |= FF_DECORATIVE;
511 0 : break;
512 :
513 : default:
514 5 : lfPitchAndFamily |= FAMILY_DONTKNOW;
515 5 : break;
516 : }
517 11 : switch( pDesc->Pitch )
518 : {
519 : case ::com::sun::star::awt::FontPitch::FIXED:
520 0 : lfPitchAndFamily |= FIXED_PITCH;
521 0 : break;
522 :
523 : default:
524 11 : lfPitchAndFamily |= DEFAULT_PITCH;
525 11 : break;
526 : }
527 11 : mpStrm->WriteUChar( lfCharSet )
528 22 : .WriteUChar( lfClipPrecision )
529 22 : .WriteUChar( lfQuality )
530 22 : .WriteUChar( lfPitchAndFamily );
531 : }
532 3 : mpStyleSheet->WriteTxCFStyleAtom( *mpStrm ); // create style that is used for new standard objects
533 3 : mpPptEscherEx->AddAtom( 10, EPP_TxSIStyleAtom );
534 3 : mpStrm->WriteUInt32( 7 ) // ?
535 3 : .WriteInt16( 2 ) // ?
536 3 : .WriteUChar( 9 ) // ?
537 3 : .WriteUChar( 8 ) // ?
538 3 : .WriteInt16( 0 ); // ?
539 :
540 3 : mpStrm->Write( aTxMasterStyleAtomStrm.GetData(), aTxMasterStyleAtomStrm.Tell() );
541 3 : maSoundCollection.Write( *mpStrm );
542 3 : mpPptEscherEx->WriteDrawingGroupContainer( *mpStrm );
543 3 : ImplMasterSlideListContainer( mpStrm );
544 3 : ImplDocumentListContainer( mpStrm );
545 :
546 3 : sal_uInt32 nOldPos = mpPptEscherEx->PtGetOffsetByID( EPP_Persist_CurrentPos );
547 3 : if ( nOldPos )
548 : {
549 3 : mpStrm->Seek( nOldPos );
550 3 : return true;
551 0 : }
552 : }
553 0 : return false;
554 : }
555 :
556 12452 : bool PropValue::GetPropertyValue(
557 : ::com::sun::star::uno::Any& rAny,
558 : const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
559 : const OUString& rString,
560 : bool bTestPropertyAvailability )
561 : {
562 12452 : bool bRetValue = true;
563 12452 : if ( bTestPropertyAvailability )
564 : {
565 2882 : bRetValue = false;
566 : try
567 : {
568 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
569 2882 : aXPropSetInfo( rXPropSet->getPropertySetInfo() );
570 2882 : if ( aXPropSetInfo.is() )
571 2882 : bRetValue = aXPropSetInfo->hasPropertyByName( rString );
572 : }
573 0 : catch( ::com::sun::star::uno::Exception& )
574 : {
575 0 : bRetValue = false;
576 : }
577 : }
578 12452 : if ( bRetValue )
579 : {
580 : try
581 : {
582 11532 : rAny = rXPropSet->getPropertyValue( rString );
583 11530 : if ( !rAny.hasValue() )
584 164 : bRetValue = false;
585 : }
586 4 : catch( ::com::sun::star::uno::Exception& )
587 : {
588 2 : bRetValue = false;
589 : }
590 : }
591 12452 : return bRetValue;
592 : }
593 :
594 2355 : ::com::sun::star::beans::PropertyState PropValue::GetPropertyState(
595 : const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
596 : const OUString& rPropertyName )
597 : {
598 2355 : ::com::sun::star::beans::PropertyState eRetValue = ::com::sun::star::beans::PropertyState_AMBIGUOUS_VALUE;
599 : try
600 : {
601 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState > aXPropState
602 2355 : ( rXPropSet, ::com::sun::star::uno::UNO_QUERY );
603 2355 : if ( aXPropState.is() )
604 2355 : eRetValue = aXPropState->getPropertyState( rPropertyName );
605 : }
606 0 : catch( ::com::sun::star::uno::Exception& )
607 : {
608 :
609 : }
610 2355 : return eRetValue;
611 : }
612 :
613 2449 : bool PropValue::ImplGetPropertyValue( const OUString& rString )
614 : {
615 2449 : return GetPropertyValue( mAny, mXPropSet, rString );
616 : }
617 :
618 446 : bool PropValue::ImplGetPropertyValue( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & aXPropSet, const OUString& rString )
619 : {
620 446 : return GetPropertyValue( mAny, aXPropSet, rString );
621 : }
622 :
623 11191 : bool PropStateValue::ImplGetPropertyValue( const OUString& rString, bool bGetPropertyState )
624 : {
625 11191 : ePropState = ::com::sun::star::beans::PropertyState_AMBIGUOUS_VALUE;
626 11191 : bool bRetValue = true;
627 : #ifdef UNX
628 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo >
629 11191 : aXPropSetInfo( mXPropSet->getPropertySetInfo() );
630 11191 : if ( !aXPropSetInfo.is() )
631 0 : return false;
632 : #endif
633 : try
634 : {
635 11191 : mAny = mXPropSet->getPropertyValue( rString );
636 11191 : if ( !mAny.hasValue() )
637 0 : bRetValue = false;
638 11191 : else if ( bGetPropertyState )
639 763 : ePropState = mXPropState->getPropertyState( rString );
640 : else
641 10428 : ePropState = ::com::sun::star::beans::PropertyState_DIRECT_VALUE;
642 : }
643 0 : catch( ::com::sun::star::uno::Exception& )
644 : {
645 0 : bRetValue = false;
646 : }
647 11191 : return bRetValue;
648 : }
649 :
650 21 : void PPTWriter::ImplWriteParagraphs( SvStream& rOut, TextObj& rTextObj )
651 : {
652 21 : bool bFirstParagraph = true;
653 : sal_uInt32 nCharCount;
654 21 : sal_uInt32 nPropertyFlags = 0;
655 21 : sal_uInt16 nDepth = 0;
656 : sal_Int16 nLineSpacing;
657 21 : int nInstance = rTextObj.GetInstance();
658 :
659 42 : for ( sal_uInt32 i = 0; i < rTextObj.ParagraphCount(); ++i, bFirstParagraph = false )
660 : {
661 21 : ParagraphObj* pPara = rTextObj.GetParagraph(i);
662 21 : const PortionObj& rPortion = pPara->front();
663 21 : nCharCount = pPara->CharacterCount();
664 :
665 21 : nDepth = pPara->nDepth;
666 21 : if ( nDepth > 4)
667 0 : nDepth = 4;
668 :
669 42 : if ( ( pPara->meTextAdjust == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
670 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_Adjust, pPara->mnTextAdjust ) ) )
671 12 : nPropertyFlags |= 0x00000800;
672 21 : nLineSpacing = pPara->mnLineSpacing;
673 :
674 21 : const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
675 21 : sal_Int16 nNormalSpacing = 100;
676 21 : if ( !mbFontIndependentLineSpacing && pDesc )
677 : {
678 21 : double fN = 100.0;
679 21 : fN *= pDesc->Scaling;
680 21 : nNormalSpacing = (sal_Int16)( fN + 0.5 );
681 : }
682 21 : if ( !mbFontIndependentLineSpacing && bFirstParagraph && ( nLineSpacing > nNormalSpacing ) ) // sj: i28747, no replacement for fixed linespacing
683 : {
684 21 : nLineSpacing = nNormalSpacing;
685 21 : nPropertyFlags |= 0x00001000;
686 : }
687 : else
688 : {
689 0 : if ( nLineSpacing > 0 )
690 : {
691 0 : if ( !mbFontIndependentLineSpacing && pDesc )
692 0 : nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );
693 : }
694 : else
695 : {
696 0 : if ( !pPara->mbFixedLineSpacing && rPortion.mnCharHeight > (sal_uInt16)( ((double)-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
697 0 : nLineSpacing = nNormalSpacing;
698 : else
699 0 : nLineSpacing = (sal_Int16)( (double)nLineSpacing / 4.40972 );
700 : }
701 0 : if ( ( pPara->meLineSpacing == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
702 0 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LineFeed, nLineSpacing ) ) )
703 0 : nPropertyFlags |= 0x00001000;
704 : }
705 42 : if ( ( pPara->meLineSpacingTop == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
706 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mnLineSpacingTop ) ) )
707 0 : nPropertyFlags |= 0x00002000;
708 42 : if ( ( pPara->meLineSpacingBottom == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
709 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_LowerDist, pPara->mnLineSpacingBottom ) ) )
710 0 : nPropertyFlags |= 0x00004000;
711 42 : if ( ( pPara->meForbiddenRules == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
712 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbForbiddenRules ? 1 : 0 ) ) )
713 21 : nPropertyFlags |= 0x00020000;
714 42 : if ( ( pPara->meParagraphPunctation == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
715 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, ParaAttr_UpperDist, pPara->mbParagraphPunctation ? 1 : 0 ) ) )
716 0 : nPropertyFlags |= 0x00080000;
717 42 : if ( ( pPara->meBiDi == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
718 21 : ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_BiDi, pPara->mnBiDi ) ) )
719 0 : nPropertyFlags |= 0x00200000;
720 :
721 21 : sal_Int32 nBuRealSize = pPara->nBulletRealSize;
722 21 : sal_Int16 nBulletFlags = pPara->nBulletFlags;
723 :
724 21 : if ( pPara->bExtendedParameters )
725 0 : nPropertyFlags |= pPara->nParaFlags;
726 : else
727 : {
728 21 : nPropertyFlags |= 1; // turn off bullet explicit
729 21 : nBulletFlags = 0;
730 : }
731 :
732 : // Write nTextOfs and nBullets
733 21 : if ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_TextOfs, pPara->nTextOfs ) )
734 0 : nPropertyFlags |= 0x100;
735 21 : if ( mpStyleSheet->IsHardAttribute( nInstance, nDepth, ParaAttr_BulletOfs, pPara->nBulletOfs ))
736 0 : nPropertyFlags |= 0x400;
737 :
738 21 : FontCollectionEntry aFontDescEntry( pPara->aFontDesc.Name, pPara->aFontDesc.Family, pPara->aFontDesc.Pitch, pPara->aFontDesc.CharSet );
739 21 : sal_uInt16 nFontId = (sal_uInt16)maFontCollection.GetId( aFontDescEntry );
740 :
741 21 : rOut.WriteUInt32( nCharCount )
742 42 : .WriteUInt16( nDepth ) // Level
743 21 : .WriteUInt32( nPropertyFlags ); // Paragraph Attribut Set
744 :
745 21 : if ( nPropertyFlags & 0xf )
746 21 : rOut.WriteInt16( nBulletFlags );
747 21 : if ( nPropertyFlags & 0x80 )
748 0 : rOut.WriteUInt16( ( pPara->cBulletId ) );
749 21 : if ( nPropertyFlags & 0x10 )
750 0 : rOut.WriteUInt16( nFontId );
751 21 : if ( nPropertyFlags & 0x40 )
752 0 : rOut.WriteInt16( nBuRealSize );
753 21 : if ( nPropertyFlags & 0x20 )
754 : {
755 0 : sal_uInt32 nBulletColor = pPara->nBulletColor;
756 0 : if ( nBulletColor == COL_AUTO )
757 : {
758 0 : bool bIsDark = false;
759 0 : ::com::sun::star::uno::Any aAny;
760 0 : if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, OUString( "IsBackgroundDark" ), true ) )
761 0 : aAny >>= bIsDark;
762 0 : nBulletColor = bIsDark ? 0xffffff : 0x000000;
763 : }
764 0 : nBulletColor &= 0xffffff;
765 0 : nBulletColor |= 0xfe000000;
766 0 : rOut.WriteUInt32( nBulletColor );
767 : }
768 21 : if ( nPropertyFlags & 0x00000800 )
769 12 : rOut.WriteUInt16( ( pPara->mnTextAdjust ) );
770 21 : if ( nPropertyFlags & 0x00001000 )
771 21 : rOut.WriteUInt16( ( nLineSpacing ) );
772 21 : if ( nPropertyFlags & 0x00002000 )
773 0 : rOut.WriteUInt16( ( pPara->mnLineSpacingTop ) );
774 21 : if ( nPropertyFlags & 0x00004000 )
775 0 : rOut.WriteUInt16( ( pPara->mnLineSpacingBottom ) );
776 21 : if ( nPropertyFlags & 0x100 )
777 0 : rOut.WriteUInt16( (pPara->nTextOfs) );
778 21 : if ( nPropertyFlags & 0x400 )
779 0 : rOut.WriteUInt16( (pPara->nBulletOfs) );
780 21 : if ( nPropertyFlags & 0x000e0000 )
781 : {
782 21 : sal_uInt16 nAsianSettings = 0;
783 21 : if ( pPara->mbForbiddenRules )
784 21 : nAsianSettings |= 1;
785 21 : if ( pPara->mbParagraphPunctation )
786 0 : nAsianSettings |= 4;
787 21 : rOut.WriteUInt16( nAsianSettings );
788 : }
789 21 : if ( nPropertyFlags & 0x200000 )
790 0 : rOut.WriteUInt16( pPara->mnBiDi );
791 21 : }
792 21 : }
793 :
794 21 : void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
795 : {
796 : sal_uInt32 nPropertyFlags;
797 21 : int nInstance = rTextObj.GetInstance();
798 :
799 42 : for ( sal_uInt32 i = 0; i < rTextObj.ParagraphCount(); ++i )
800 : {
801 21 : ParagraphObj* pPara = rTextObj.GetParagraph(i);
802 42 : for ( boost::ptr_vector<PortionObj>::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
803 : {
804 21 : const PortionObj& rPortion = *it;
805 21 : nPropertyFlags = 0;
806 21 : sal_uInt32 nCharAttr = rPortion.mnCharAttr;
807 21 : sal_uInt32 nCharColor = rPortion.mnCharColor;
808 :
809 21 : if ( nCharColor == COL_AUTO ) // nCharColor depends to the background color
810 : {
811 21 : bool bIsDark = false;
812 21 : ::com::sun::star::uno::Any aAny;
813 21 : if ( PropValue::GetPropertyValue( aAny, mXPagePropSet, OUString( "IsBackgroundDark" ), true ) )
814 21 : aAny >>= bIsDark;
815 21 : nCharColor = bIsDark ? 0xffffff : 0x000000;
816 : }
817 :
818 21 : nCharColor &= 0xffffff;
819 :
820 : /* the portion is using the embossed or engraved attribute, which we want to map to the relief feature of PPT.
821 : Because the relief feature of PPT is dependent to the background color, such a mapping can not always be used. */
822 21 : if ( nCharAttr & 0x200 )
823 : {
824 0 : sal_uInt32 nBackgroundColor = 0xffffff;
825 :
826 0 : if ( !nCharColor ) // special threatment for
827 0 : nCharColor = 0xffffff; // black fontcolor
828 :
829 0 : ::com::sun::star::uno::Any aAny;
830 0 : ::com::sun::star::drawing::FillStyle aFS( ::com::sun::star::drawing::FillStyle_NONE );
831 0 : if ( PropValue::GetPropertyValue( aAny, mXPropSet, OUString( "FillStyle" ) ) )
832 0 : aAny >>= aFS;
833 0 : switch( aFS )
834 : {
835 : case ::com::sun::star::drawing::FillStyle_GRADIENT :
836 : {
837 0 : Point aEmptyPoint = Point();
838 0 : Rectangle aRect( aEmptyPoint, Size( 28000, 21000 ) );
839 0 : EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect );
840 0 : aPropOpt.CreateGradientProperties( mXPropSet );
841 0 : aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
842 : }
843 0 : break;
844 : case ::com::sun::star::drawing::FillStyle_SOLID :
845 : {
846 0 : if ( PropValue::GetPropertyValue( aAny, mXPropSet, OUString( "FillColor" ) ) )
847 0 : nBackgroundColor = EscherEx::GetColor( *static_cast<sal_uInt32 const *>(aAny.getValue()) );
848 : }
849 0 : break;
850 : case ::com::sun::star::drawing::FillStyle_NONE :
851 : {
852 0 : ::com::sun::star::uno::Any aBackAny;
853 0 : ::com::sun::star::drawing::FillStyle aBackFS( ::com::sun::star::drawing::FillStyle_NONE );
854 0 : if ( PropValue::GetPropertyValue( aBackAny, mXBackgroundPropSet, OUString( "FillStyle" ) ) )
855 0 : aBackAny >>= aBackFS;
856 0 : switch( aBackFS )
857 : {
858 : case ::com::sun::star::drawing::FillStyle_GRADIENT :
859 : {
860 0 : Point aEmptyPoint = Point();
861 0 : Rectangle aRect( aEmptyPoint, Size( 28000, 21000 ) );
862 0 : EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect );
863 0 : aPropOpt.CreateGradientProperties( mXBackgroundPropSet );
864 0 : aPropOpt.GetOpt( ESCHER_Prop_fillColor, nBackgroundColor );
865 : }
866 0 : break;
867 : case ::com::sun::star::drawing::FillStyle_SOLID :
868 : {
869 0 : if ( PropValue::GetPropertyValue( aAny, mXBackgroundPropSet, OUString( "FillColor" ) ) )
870 0 : nBackgroundColor = EscherEx::GetColor( *static_cast<sal_uInt32 const *>(aAny.getValue()) );
871 : }
872 0 : break;
873 : default:
874 0 : break;
875 0 : }
876 : }
877 0 : break;
878 : default:
879 0 : break;
880 : }
881 :
882 0 : sal_Int32 nB = nBackgroundColor & 0xff;
883 0 : nB += (sal_uInt8)( nBackgroundColor >> 8 );
884 0 : nB += (sal_uInt8)( nBackgroundColor >> 16 );
885 : // if the background color is nearly black, relief can't been used, because the text would not be visible
886 0 : if ( nB < 0x60 || ( nBackgroundColor != nCharColor ) )
887 : {
888 0 : nCharAttr &=~ 0x200;
889 :
890 : // now check if the text is part of a group, and if the previous object has the same color than the fontcolor
891 : // ( and if fillcolor is not available the background color ), it is sometimes
892 : // not possible to export the 'embossed' flag
893 0 : if ( ( GetCurrentGroupLevel() > 0 ) && ( GetCurrentGroupIndex() >= 1 ) )
894 : {
895 0 : ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape > aGroupedShape( GetCurrentGroupAccess()->getByIndex( GetCurrentGroupIndex() - 1 ), uno::UNO_QUERY );
896 0 : if( aGroupedShape.is() )
897 : {
898 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > aPropSetOfNextShape
899 0 : ( aGroupedShape, ::com::sun::star::uno::UNO_QUERY );
900 0 : if ( aPropSetOfNextShape.is() )
901 : {
902 0 : if ( PropValue::GetPropertyValue( aAny, aPropSetOfNextShape,
903 0 : OUString( "FillColor" ), true ) )
904 : {
905 0 : if ( nCharColor == EscherEx::GetColor( *static_cast<sal_uInt32 const *>(aAny.getValue()) ) )
906 : {
907 0 : nCharAttr |= 0x200;
908 : }
909 : }
910 0 : }
911 0 : }
912 : }
913 0 : }
914 : }
915 21 : nCharColor |= 0xfe000000;
916 21 : if ( nInstance == 4 ) // special handling for normal textobjects:
917 21 : nPropertyFlags |= nCharAttr & 0x217; // not all attributes ar inherited
918 : else
919 : {
920 0 : if ( /* ( rPortion.mnCharAttrHard & 1 ) || */
921 0 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Bold, nCharAttr ) ) )
922 0 : nPropertyFlags |= 1;
923 0 : if ( /* ( rPortion.mnCharAttrHard & 2 ) || */
924 0 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Italic, nCharAttr ) ) )
925 0 : nPropertyFlags |= 2;
926 0 : if ( /* ( rPortion.mnCharAttrHard & 4 ) || */
927 0 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Underline, nCharAttr ) ) )
928 0 : nPropertyFlags |= 4;
929 0 : if ( /* ( rPortion.mnCharAttrHard & 0x10 ) || */
930 0 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Shadow, nCharAttr ) ) )
931 0 : nPropertyFlags |= 0x10;
932 0 : if ( /* ( rPortion.mnCharAttrHard & 0x200 ) || */
933 0 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Embossed, nCharAttr ) ) )
934 0 : nPropertyFlags |= 512;
935 : }
936 21 : if ( rTextObj.HasExtendedBullets() )
937 : {
938 0 : nPropertyFlags |= ( i & 0x3f ) << 10 ;
939 0 : nCharAttr |= ( i & 0x3f ) << 10;
940 : }
941 42 : if ( ( rPortion.meFontName == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
942 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Font, rPortion.mnFont ) ) )
943 21 : nPropertyFlags |= 0x00010000;
944 42 : if ( ( rPortion.meAsianOrComplexFont == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
945 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_AsianOrComplexFont, rPortion.mnAsianOrComplexFont ) ) )
946 21 : nPropertyFlags |= 0x00200000;
947 21 : if ( ( rPortion.meCharHeight == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
948 0 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontHeight, rPortion.mnCharHeight ) ) )
949 21 : nPropertyFlags |= 0x00020000;
950 42 : if ( ( rPortion.meCharColor == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
951 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontColor, nCharColor & 0xffffff ) ) )
952 21 : nPropertyFlags |= 0x00040000;
953 42 : if ( ( rPortion.meCharEscapement == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
954 21 : ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Escapement, rPortion.mnCharEscapement ) ) )
955 0 : nPropertyFlags |= 0x00080000;
956 :
957 21 : sal_uInt32 nCharCount = rPortion.Count();
958 :
959 21 : rOut.WriteUInt32( nCharCount )
960 21 : .WriteUInt32( nPropertyFlags ); //PropertyFlags
961 :
962 21 : if ( nPropertyFlags & 0xffff )
963 0 : rOut.WriteUInt16( ( nCharAttr ) );
964 21 : if ( nPropertyFlags & 0x00010000 )
965 21 : rOut.WriteUInt16( rPortion.mnFont );
966 21 : if ( nPropertyFlags & 0x00200000 )
967 21 : rOut.WriteUInt16( rPortion.mnAsianOrComplexFont );
968 21 : if ( nPropertyFlags & 0x00020000 )
969 21 : rOut.WriteUInt16( ( rPortion.mnCharHeight ) );
970 21 : if ( nPropertyFlags & 0x00040000 )
971 21 : rOut.WriteUInt32( nCharColor );
972 21 : if ( nPropertyFlags & 0x00080000 )
973 0 : rOut.WriteInt16( rPortion.mnCharEscapement );
974 : }
975 : }
976 21 : }
977 :
978 : /**
979 : * Loads and converts text from shape, value is stored in mnTextSize.
980 : */
981 61 : bool PPTWriter::ImplGetText()
982 : {
983 61 : mnTextSize = 0;
984 61 : mbFontIndependentLineSpacing = false;
985 122 : mXText = ::com::sun::star::uno::Reference<
986 : ::com::sun::star::text::XSimpleText >
987 61 : ( mXShape, ::com::sun::star::uno::UNO_QUERY );
988 :
989 61 : if ( mXText.is() )
990 : {
991 51 : mnTextSize = mXText->getString().getLength();
992 51 : ::com::sun::star::uno::Any aAny;
993 51 : if ( GetPropertyValue( aAny, mXPropSet, OUString( "FontIndependentLineSpacing" ), true ) )
994 51 : aAny >>= mbFontIndependentLineSpacing;
995 : }
996 61 : return ( mnTextSize != 0 );
997 : }
998 :
999 0 : void PPTWriter::ImplFlipBoundingBox( EscherPropertyContainer& rPropOpt )
1000 : {
1001 0 : if ( mnAngle < 0 )
1002 0 : mnAngle = ( 36000 + mnAngle ) % 36000;
1003 : else
1004 0 : mnAngle = ( 36000 - ( mnAngle % 36000 ) );
1005 :
1006 0 : double fCos = cos( (double)mnAngle * F_PI18000 );
1007 0 : double fSin = sin( (double)mnAngle * F_PI18000 );
1008 :
1009 0 : double fWidthHalf = maRect.GetWidth() / 2.0;
1010 0 : double fHeightHalf = maRect.GetHeight() / 2.0;
1011 :
1012 0 : double fXDiff = fCos * fWidthHalf + fSin * (-fHeightHalf);
1013 0 : double fYDiff = - ( fSin * fWidthHalf - fCos * ( -fHeightHalf ) );
1014 :
1015 0 : maRect.Move( (sal_Int32)( -( fWidthHalf - fXDiff ) ), (sal_Int32)( - ( fHeightHalf + fYDiff ) ) );
1016 0 : mnAngle *= 655;
1017 0 : mnAngle += 0x8000;
1018 0 : mnAngle &=~0xffff; // round nAngle to full grads
1019 0 : rPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );
1020 :
1021 0 : if ( ( mnAngle >= ( 45 << 16 ) && mnAngle < ( 135 << 16 ) ) ||
1022 0 : ( mnAngle >= ( 225 << 16 ) && mnAngle < ( 315 << 16 ) ) )
1023 : {
1024 : // Maddeningly, in those two areas of PPT is the BoundingBox already
1025 : // vertical. Therefore, we need to put down it BEFORE THE ROTATION.
1026 : ::com::sun::star::awt::Point
1027 0 : aTopLeft( (sal_Int32)( maRect.Left() + fWidthHalf - fHeightHalf ), (sal_Int32)( maRect.Top() + fHeightHalf - fWidthHalf ) );
1028 0 : const long nRotatedWidth(maRect.GetHeight());
1029 0 : const long nRotatedHeight(maRect.GetWidth());
1030 0 : const Size aNewSize(nRotatedWidth, nRotatedHeight);
1031 0 : maRect = Rectangle( Point( aTopLeft.X, aTopLeft.Y ), aNewSize );
1032 : }
1033 0 : }
1034 :
1035 35 : void PPTWriter::ImplAdjustFirstLineLineSpacing( TextObj& rTextObj, EscherPropertyContainer& rPropOpt )
1036 : {
1037 35 : if ( !mbFontIndependentLineSpacing )
1038 : {
1039 35 : if ( rTextObj.ParagraphCount() )
1040 : {
1041 35 : ParagraphObj* pPara = rTextObj.GetParagraph(0);
1042 35 : if ( !pPara->empty() )
1043 : {
1044 35 : const PortionObj& rPortion = pPara->front();
1045 35 : sal_Int16 nLineSpacing = pPara->mnLineSpacing;
1046 35 : const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
1047 35 : if ( pDesc )
1048 35 : nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );
1049 :
1050 35 : if ( ( nLineSpacing > 0 ) && ( nLineSpacing < 100 ) )
1051 : {
1052 35 : double fCharHeight = rPortion.mnCharHeight;
1053 35 : fCharHeight *= 2540 / 72.0;
1054 35 : fCharHeight *= 100 - nLineSpacing;
1055 35 : fCharHeight /= 100;
1056 :
1057 35 : sal_uInt32 nUpperDistance = 0;
1058 35 : rPropOpt.GetOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
1059 35 : nUpperDistance += static_cast< sal_uInt32 >( fCharHeight * 360.0 );
1060 35 : rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, nUpperDistance );
1061 : }
1062 : }
1063 : }
1064 : }
1065 35 : }
1066 :
1067 32 : void PPTWriter::ImplWriteTextStyleAtom( SvStream& rOut, int nTextInstance, sal_uInt32 nAtomInstance,
1068 : TextRuleEntry* pTextRule, SvStream& rExtBuStr, EscherPropertyContainer* pPropOpt )
1069 : {
1070 32 : PPTExParaSheet& rParaSheet = mpStyleSheet->GetParaSheet( nTextInstance );
1071 :
1072 32 : rOut.WriteUInt32( ( EPP_TextHeaderAtom << 16 ) | ( nAtomInstance << 4 ) ).WriteUInt32( 4 )
1073 32 : .WriteInt32( nTextInstance );
1074 :
1075 32 : if ( mbEmptyPresObj )
1076 11 : mnTextSize = 0;
1077 32 : if ( !mbEmptyPresObj )
1078 : {
1079 : ParagraphObj* pPara;
1080 21 : TextObjBinary aTextObj( mXText, nTextInstance, maFontCollection, (PPTExBulletProvider&)*this );
1081 :
1082 : // leaving out EPP_TextCharsAtom w/o text - still write out
1083 : // attribute info though
1084 21 : if ( mnTextSize )
1085 21 : aTextObj.Write( &rOut );
1086 :
1087 21 : if ( pPropOpt )
1088 21 : ImplAdjustFirstLineLineSpacing( aTextObj, *pPropOpt );
1089 :
1090 21 : sal_uInt32 nSize, nPos = rOut.Tell();
1091 :
1092 21 : rOut.WriteUInt32( EPP_StyleTextPropAtom << 16 ).WriteUInt32( 0 );
1093 21 : ImplWriteParagraphs( rOut, aTextObj );
1094 21 : ImplWritePortions( rOut, aTextObj );
1095 21 : nSize = rOut.Tell() - nPos;
1096 21 : rOut.SeekRel( - ( (sal_Int32)nSize - 4 ) );
1097 21 : rOut.WriteUInt32( nSize - 8 );
1098 21 : rOut.SeekRel( nSize - 8 );
1099 :
1100 42 : for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
1101 : {
1102 21 : pPara = aTextObj.GetParagraph(i);
1103 42 : for ( boost::ptr_vector<PortionObj>::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
1104 : {
1105 21 : const PortionObj& rPortion = *it;
1106 21 : if ( rPortion.mpFieldEntry )
1107 : {
1108 21 : const FieldEntry* pFieldEntry = rPortion.mpFieldEntry;
1109 :
1110 21 : switch ( pFieldEntry->nFieldType >> 28 )
1111 : {
1112 : case 1 :
1113 : case 2 :
1114 : {
1115 0 : rOut.WriteUInt32( EPP_DateTimeMCAtom << 16 ).WriteUInt32( 8 )
1116 0 : .WriteUInt32( pFieldEntry->nFieldStartPos ) // TxtOffset to TxtField;
1117 0 : .WriteUChar( ( pFieldEntry->nFieldType & 0xff ) ) // Type
1118 0 : .WriteUChar( 0 ).WriteUInt16( 0 ); // PadBytes
1119 : }
1120 0 : break;
1121 : case 3 :
1122 : {
1123 6 : rOut.WriteUInt32( EPP_SlideNumberMCAtom << 16 ).WriteUInt32( 4 )
1124 12 : .WriteUInt32( pFieldEntry->nFieldStartPos );
1125 : }
1126 6 : break;
1127 : case 4 :
1128 : {
1129 0 : sal_uInt32 nPageIndex = 0;
1130 0 : OUString aPageUrl;
1131 0 : OUString aFile( pFieldEntry->aFieldUrl );
1132 0 : OUString aTarget( pFieldEntry->aFieldUrl );
1133 0 : INetURLObject aUrl( pFieldEntry->aFieldUrl );
1134 0 : if ( INetProtocol::File == aUrl.GetProtocol() )
1135 0 : aFile = aUrl.PathToFileName();
1136 0 : else if ( INetProtocol::Smb == aUrl.GetProtocol() )
1137 : {
1138 : // Convert smb notation to '\\' and skip the 'smb:' part
1139 0 : aFile = aUrl.GetMainURL(INetURLObject::NO_DECODE).copy(4);
1140 0 : aFile = aFile.replaceAll( "/", "\\" );
1141 0 : aTarget = aFile;
1142 : }
1143 0 : else if ( pFieldEntry->aFieldUrl.startsWith("#") )
1144 : {
1145 0 : OUString aPage( INetURLObject::decode( pFieldEntry->aFieldUrl, INetURLObject::DECODE_WITH_CHARSET ) );
1146 0 : aPage = aPage.copy( 1 );
1147 :
1148 : std::vector<OUString>::const_iterator pIter = std::find(
1149 0 : maSlideNameList.begin(),maSlideNameList.end(),aPage);
1150 :
1151 0 : if ( pIter != maSlideNameList.end() )
1152 : {
1153 0 : nPageIndex = pIter - maSlideNameList.begin();
1154 0 : aPageUrl = OUString::number(256 + nPageIndex);
1155 0 : aPageUrl += ",";
1156 0 : aPageUrl += OUString::number(nPageIndex + 1);
1157 0 : aPageUrl += ",Slide ";
1158 0 : aPageUrl += OUString::number(nPageIndex + 1);
1159 0 : }
1160 : }
1161 0 : sal_uInt32 nHyperId(0);
1162 0 : if ( !aPageUrl.isEmpty() )
1163 0 : nHyperId = ImplInsertBookmarkURL( aPageUrl, 1 | ( nPageIndex << 8 ) | ( 1U << 31 ), pFieldEntry->aRepresentation, "", "", aPageUrl );
1164 : else
1165 0 : nHyperId = ImplInsertBookmarkURL( pFieldEntry->aFieldUrl, 2 | ( nHyperId << 8 ), aFile, aTarget, "", "" );
1166 :
1167 0 : rOut.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( 24 )
1168 0 : .WriteUInt32( EPP_InteractiveInfoAtom << 16 ).WriteUInt32( 16 )
1169 0 : .WriteUInt32( 0 ) // soundref
1170 0 : .WriteUInt32( nHyperId ) // hyperlink id
1171 0 : .WriteUChar( 4 ) // hyperlink action
1172 0 : .WriteUChar( 0 ) // ole verb
1173 0 : .WriteUChar( 0 ) // jump
1174 0 : .WriteUChar( 0 ) // flags
1175 0 : .WriteUChar( 8 ) // hyperlink type ?
1176 0 : .WriteUChar( 0 ).WriteUChar( 0 ).WriteUChar( 0 )
1177 0 : .WriteUInt32( EPP_TxInteractiveInfoAtom << 16 ).WriteUInt32( 8 )
1178 0 : .WriteUInt32( pFieldEntry->nFieldStartPos )
1179 0 : .WriteUInt32( pFieldEntry->nFieldEndPos );
1180 : }
1181 0 : break;
1182 : case 5 :
1183 : {
1184 6 : rOut.WriteUInt32( EPP_GenericDateMCAtom << 16 ).WriteUInt32( 4 )
1185 12 : .WriteUInt32( pFieldEntry->nFieldStartPos );
1186 : }
1187 6 : break;
1188 : case 6 :
1189 : {
1190 3 : rOut.WriteUInt32( EPP_HeaderMCAtom << 16 ).WriteUInt32( 4 )
1191 6 : .WriteUInt32( pFieldEntry->nFieldStartPos );
1192 : }
1193 3 : break;
1194 : case 7 :
1195 : {
1196 6 : rOut.WriteUInt32( EPP_FooterMCAtom << 16 ).WriteUInt32( 4 )
1197 12 : .WriteUInt32( pFieldEntry->nFieldStartPos );
1198 : }
1199 6 : break;
1200 : default:
1201 0 : break;
1202 : }
1203 : }
1204 : }
1205 : }
1206 :
1207 21 : aTextObj.WriteTextSpecInfo( &rOut );
1208 :
1209 : // write Star Office Default TabSizes (if necessary)
1210 21 : if ( aTextObj.ParagraphCount() )
1211 : {
1212 21 : pPara = aTextObj.GetParagraph(0);
1213 21 : sal_uInt32 nParaFlags = 0x1f;
1214 : sal_Int16 nDepth, nMask, nNumberingRule[ 10 ];
1215 21 : sal_uInt32 nTextOfs = pPara->nTextOfs;
1216 21 : sal_uInt32 nTabs = pPara->maTabStop.getLength();
1217 21 : const ::com::sun::star::style::TabStop* pTabStop = pPara->maTabStop.getConstArray();
1218 :
1219 42 : for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
1220 : {
1221 21 : pPara = aTextObj.GetParagraph(i);
1222 21 : if ( pPara->bExtendedParameters )
1223 : {
1224 0 : nDepth = pPara->nDepth;
1225 0 : if ( nDepth < 5 )
1226 : {
1227 0 : nMask = 1 << nDepth;
1228 0 : if ( nParaFlags & nMask )
1229 : {
1230 0 : nParaFlags &=~ nMask;
1231 0 : if ( ( rParaSheet.maParaLevel[ nDepth ].mnTextOfs != pPara->nTextOfs ) ||
1232 0 : ( rParaSheet.maParaLevel[ nDepth ].mnBulletOfs != pPara->nBulletOfs ) )
1233 : {
1234 0 : nParaFlags |= nMask << 16;
1235 0 : nNumberingRule[ nDepth << 1 ] = pPara->nTextOfs;
1236 0 : nNumberingRule[ ( nDepth << 1 ) + 1 ] = (sal_Int16)pPara->nBulletOfs;
1237 : }
1238 : }
1239 : }
1240 : }
1241 : }
1242 21 : nParaFlags >>= 16;
1243 :
1244 21 : sal_Int32 nDefaultTabSizeSrc = 2011; // I've no idea where this number came from, honestly
1245 21 : const uno::Reference< beans::XPropertySet > xPropSet( mXModel, uno::UNO_QUERY );
1246 21 : if ( xPropSet.is() )
1247 : {
1248 21 : if(ImplGetPropertyValue( xPropSet, OUString( "TabStop" ) ))
1249 : {
1250 21 : sal_Int32 nTabStop( 0 );
1251 21 : if ( mAny >>= nTabStop )
1252 21 : nDefaultTabSizeSrc = nTabStop;
1253 : }
1254 : }
1255 21 : const sal_uInt32 nDefaultTabSize = MapSize( awt::Size( nDefaultTabSizeSrc, 1 ) ).Width;
1256 21 : sal_uInt32 nDefaultTabs = std::abs( maRect.GetWidth() ) / nDefaultTabSize;
1257 21 : if ( nTabs )
1258 0 : nDefaultTabs -= (sal_Int32)( ( ( pTabStop[ nTabs - 1 ].Position / 4.40972 ) + nTextOfs ) / nDefaultTabSize );
1259 21 : if ( (sal_Int32)nDefaultTabs < 0 )
1260 0 : nDefaultTabs = 0;
1261 :
1262 21 : sal_uInt32 nTabCount = nTabs + nDefaultTabs;
1263 21 : sal_uInt32 i, nTextRulerAtomFlags = 0;
1264 :
1265 21 : if ( nTabCount )
1266 21 : nTextRulerAtomFlags |= 4;
1267 21 : if ( nParaFlags )
1268 0 : nTextRulerAtomFlags |= ( ( nParaFlags << 3 ) | ( nParaFlags << 8 ) );
1269 :
1270 21 : if ( nTextRulerAtomFlags )
1271 : {
1272 21 : SvStream* pRuleOut = &rOut;
1273 21 : if ( pTextRule )
1274 0 : pRuleOut = pTextRule->pOut = new SvMemoryStream( 0x100, 0x100 );
1275 :
1276 21 : sal_uInt32 nRulePos = pRuleOut->Tell();
1277 21 : pRuleOut->WriteUInt32( EPP_TextRulerAtom << 16 ).WriteUInt32( 0 );
1278 21 : pRuleOut->WriteUInt32( nTextRulerAtomFlags );
1279 21 : if ( nTextRulerAtomFlags & 4 )
1280 : {
1281 21 : pRuleOut->WriteUInt16( nTabCount );
1282 21 : for ( i = 0; i < nTabs; i++ )
1283 : {
1284 0 : sal_uInt16 nPosition = (sal_uInt16)( ( pTabStop[ i ].Position / 4.40972 ) + nTextOfs );
1285 : sal_uInt16 nType;
1286 0 : switch ( pTabStop[ i ].Alignment )
1287 : {
1288 0 : case ::com::sun::star::style::TabAlign_DECIMAL : nType = 3; break;
1289 0 : case ::com::sun::star::style::TabAlign_RIGHT : nType = 2; break;
1290 0 : case ::com::sun::star::style::TabAlign_CENTER : nType = 1; break;
1291 :
1292 : case ::com::sun::star::style::TabAlign_LEFT :
1293 0 : default: nType = 0;
1294 : };
1295 0 : pRuleOut->WriteUInt16( nPosition )
1296 0 : .WriteUInt16( nType );
1297 : }
1298 :
1299 21 : sal_uInt32 nWidth = 1;
1300 21 : if ( nTabs )
1301 0 : nWidth += (sal_Int32)( ( ( pTabStop[ nTabs - 1 ].Position / 4.40972 + nTextOfs ) / nDefaultTabSize ) );
1302 21 : nWidth *= nDefaultTabSize;
1303 153 : for ( i = 0; i < nDefaultTabs; i++, nWidth += nDefaultTabSize )
1304 132 : pRuleOut->WriteUInt32( nWidth );
1305 : }
1306 126 : for ( i = 0; i < 5; i++ )
1307 : {
1308 105 : if ( nTextRulerAtomFlags & ( 8 << i ) )
1309 0 : pRuleOut->WriteInt16( nNumberingRule[ i << 1 ] );
1310 105 : if ( nTextRulerAtomFlags & ( 256 << i ) )
1311 0 : pRuleOut->WriteInt16( nNumberingRule[ ( i << 1 ) + 1 ] );
1312 : }
1313 21 : sal_uInt32 nBufSize = pRuleOut->Tell() - nRulePos;
1314 21 : pRuleOut->SeekRel( - ( (sal_Int32)nBufSize - 4 ) );
1315 21 : pRuleOut->WriteUInt32( nBufSize - 8 );
1316 21 : pRuleOut->SeekRel( nBufSize - 8 );
1317 21 : }
1318 : }
1319 21 : if ( aTextObj.HasExtendedBullets() )
1320 : {
1321 0 : if ( aTextObj.ParagraphCount() )
1322 : {
1323 0 : sal_uInt32 nNumberingType = 0, nPos2 = rExtBuStr.Tell();
1324 :
1325 0 : rExtBuStr.WriteUInt32( EPP_PST_ExtendedParagraphAtom << 16 ).WriteUInt32( 0 );
1326 :
1327 0 : for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
1328 : {
1329 0 : ParagraphObj* pBulletPara = aTextObj.GetParagraph(i);
1330 0 : sal_uInt32 nBulletFlags = 0;
1331 0 : sal_uInt16 nBulletId = pBulletPara->nBulletId;
1332 :
1333 0 : if ( pBulletPara->bExtendedBulletsUsed )
1334 : {
1335 0 : nBulletFlags = 0x800000;
1336 0 : if ( pBulletPara->nNumberingType != SVX_NUM_BITMAP )
1337 0 : nBulletFlags = 0x3000000;
1338 : }
1339 0 : rExtBuStr.WriteUInt32( nBulletFlags );
1340 :
1341 0 : if ( nBulletFlags & 0x800000 )
1342 0 : rExtBuStr.WriteUInt16( nBulletId );
1343 0 : if ( nBulletFlags & 0x1000000 )
1344 : {
1345 0 : switch( pBulletPara->nNumberingType )
1346 : {
1347 : case SVX_NUM_NUMBER_NONE :
1348 : case SVX_NUM_CHAR_SPECIAL :
1349 0 : nNumberingType = 0;
1350 0 : break;
1351 : case SVX_NUM_CHARS_UPPER_LETTER :
1352 : case SVX_NUM_CHARS_UPPER_LETTER_N :
1353 : case SVX_NUM_CHARS_LOWER_LETTER :
1354 : case SVX_NUM_CHARS_LOWER_LETTER_N :
1355 : case SVX_NUM_ROMAN_UPPER :
1356 : case SVX_NUM_ROMAN_LOWER :
1357 : case SVX_NUM_ARABIC :
1358 : case SVX_NUM_NUMBER_UPPER_ZH:
1359 : case SVX_NUM_CIRCLE_NUMBER:
1360 : case SVX_NUM_NUMBER_UPPER_ZH_TW:
1361 : case SVX_NUM_NUMBER_LOWER_ZH:
1362 : case SVX_NUM_FULL_WIDTH_ARABIC:
1363 0 : nNumberingType = pBulletPara->nMappedNumType;
1364 0 : break;
1365 :
1366 : case SVX_NUM_BITMAP :
1367 0 : nNumberingType = 0;
1368 0 : break;
1369 :
1370 : }
1371 0 : rExtBuStr.WriteUInt32( nNumberingType );
1372 : }
1373 0 : if ( nBulletFlags & 0x2000000 )
1374 0 : rExtBuStr.WriteUInt16( pBulletPara->nStartWith );
1375 0 : rExtBuStr.WriteUInt32( 0 ).WriteUInt32( 0 );
1376 : }
1377 0 : sal_uInt32 nBulletSize = ( rExtBuStr.Tell() - nPos2 ) - 8;
1378 0 : rExtBuStr.SeekRel( - ( (sal_Int32)nBulletSize + 4 ) );
1379 0 : rExtBuStr.WriteUInt32( nBulletSize );
1380 0 : rExtBuStr.SeekRel( nBulletSize );
1381 : }
1382 21 : }
1383 : }
1384 32 : }
1385 :
1386 0 : void PPTWriter::ImplWriteObjectEffect( SvStream& rSt,
1387 : ::com::sun::star::presentation::AnimationEffect eAe,
1388 : ::com::sun::star::presentation::AnimationEffect eTe,
1389 : sal_uInt16 nOrder )
1390 : {
1391 0 : EscherExContainer aAnimationInfo( rSt, EPP_AnimationInfo );
1392 0 : EscherExAtom aAnimationInfoAtom( rSt, EPP_AnimationInfoAtom, 0, 1 );
1393 0 : sal_uInt32 nDimColor = 0x7000000; // color to use for dimming
1394 0 : sal_uInt32 nFlags = 0x4400; // set of flags that determine type of build
1395 0 : sal_uInt32 nSoundRef = 0; // 0 if storage is from clipboard. Otherwise index(ID) in SoundCollection list.
1396 0 : sal_uInt32 nDelayTime = 0; // delay before playing object
1397 0 : sal_uInt16 nSlideCount = 1; // number of slides to play object
1398 0 : sal_uInt8 nBuildType = 1; // type of build
1399 0 : sal_uInt8 nFlyMethod = 0; // animation effect( fly, zoom, appear, etc )
1400 0 : sal_uInt8 nFlyDirection = 0; // Animation direction( left, right, up, down, etc )
1401 0 : sal_uInt8 nAfterEffect = 0; // what to do after build
1402 0 : sal_uInt8 nSubEffect = 0; // build by word or letter
1403 0 : sal_uInt8 nOleVerb = 0; // Determines object's class (sound, video, other)
1404 :
1405 0 : if ( eAe == ::com::sun::star::presentation::AnimationEffect_NONE )
1406 : {
1407 0 : nBuildType = 0;
1408 0 : eAe = eTe;
1409 : }
1410 0 : switch ( eAe )
1411 : {
1412 : case ::com::sun::star::presentation::AnimationEffect_NONE :
1413 0 : break;
1414 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LEFT :
1415 : {
1416 0 : nFlyDirection = 2;
1417 0 : nFlyMethod = 10;
1418 : }
1419 0 : break;
1420 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_TOP :
1421 : {
1422 0 : nFlyDirection = 3;
1423 0 : nFlyMethod = 10;
1424 : }
1425 0 : break;
1426 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_RIGHT :
1427 : {
1428 0 : nFlyDirection = 0;
1429 0 : nFlyMethod = 10;
1430 : }
1431 0 : break;
1432 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_BOTTOM :
1433 : {
1434 0 : nFlyDirection = 1;
1435 0 : nFlyMethod = 10;
1436 : }
1437 0 : break;
1438 : case ::com::sun::star::presentation::AnimationEffect_FADE_TO_CENTER :
1439 : {
1440 0 : nFlyDirection = 1;
1441 0 : nFlyMethod = 11;
1442 : }
1443 0 : break;
1444 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_CENTER :
1445 : {
1446 0 : nFlyDirection = 0;
1447 0 : nFlyMethod = 11;
1448 : }
1449 0 : break;
1450 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LEFT :
1451 : {
1452 0 : nFlyDirection = 0;
1453 0 : nFlyMethod = 12;
1454 : }
1455 0 : break;
1456 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_TOP :
1457 : {
1458 0 : nFlyDirection = 1;
1459 0 : nFlyMethod = 12;
1460 : }
1461 0 : break;
1462 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_RIGHT :
1463 : {
1464 0 : nFlyDirection = 2;
1465 0 : nFlyMethod = 12;
1466 : }
1467 0 : break;
1468 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_BOTTOM :
1469 : {
1470 0 : nFlyDirection = 3;
1471 0 : nFlyMethod = 12;
1472 : }
1473 0 : break;
1474 : case ::com::sun::star::presentation::AnimationEffect_VERTICAL_STRIPES :
1475 : {
1476 0 : nFlyDirection = 0;
1477 0 : nFlyMethod = 2;
1478 : }
1479 0 : break;
1480 : case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_STRIPES :
1481 : {
1482 0 : nFlyDirection = 1;
1483 0 : nFlyMethod = 2;
1484 : }
1485 0 : break;
1486 : case ::com::sun::star::presentation::AnimationEffect_CLOCKWISE :
1487 : {
1488 0 : nFlyDirection = 1;
1489 0 : nFlyMethod = 3;
1490 : }
1491 0 : break;
1492 : case ::com::sun::star::presentation::AnimationEffect_COUNTERCLOCKWISE :
1493 : {
1494 0 : nFlyDirection = 0;
1495 0 : nFlyMethod = 3;
1496 : }
1497 0 : break;
1498 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_UPPERLEFT :
1499 : {
1500 0 : nFlyDirection = 7;
1501 0 : nFlyMethod = 9;
1502 : }
1503 0 : break;
1504 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_UPPERRIGHT :
1505 : {
1506 0 : nFlyDirection = 6;
1507 0 : nFlyMethod = 9;
1508 : }
1509 0 : break;
1510 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LOWERLEFT :
1511 : {
1512 0 : nFlyDirection = 5;
1513 0 : nFlyMethod = 9;
1514 : }
1515 0 : break;
1516 : case ::com::sun::star::presentation::AnimationEffect_FADE_FROM_LOWERRIGHT :
1517 : {
1518 0 : nFlyDirection = 4;
1519 0 : nFlyMethod = 9;
1520 : }
1521 0 : break;
1522 : case ::com::sun::star::presentation::AnimationEffect_CLOSE_VERTICAL :
1523 : {
1524 0 : nFlyDirection = 1;
1525 0 : nFlyMethod = 13;
1526 : }
1527 0 : break;
1528 : case ::com::sun::star::presentation::AnimationEffect_CLOSE_HORIZONTAL :
1529 : {
1530 0 : nFlyDirection = 3;
1531 0 : nFlyMethod = 13;
1532 : }
1533 0 : break;
1534 : case ::com::sun::star::presentation::AnimationEffect_OPEN_VERTICAL :
1535 : {
1536 0 : nFlyDirection = 0;
1537 0 : nFlyMethod = 13;
1538 : }
1539 0 : break;
1540 : case ::com::sun::star::presentation::AnimationEffect_OPEN_HORIZONTAL :
1541 : {
1542 0 : nFlyDirection = 2;
1543 0 : nFlyMethod = 13;
1544 : }
1545 0 : break;
1546 : case ::com::sun::star::presentation::AnimationEffect_PATH :
1547 : {
1548 0 : nFlyDirection = 28;
1549 0 : nFlyMethod = 12;
1550 : }
1551 0 : break;
1552 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LEFT :
1553 : {
1554 0 : nFlyDirection = 0;
1555 0 : nFlyMethod = 1;
1556 : }
1557 0 : break;
1558 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_TOP :
1559 : {
1560 0 : nFlyDirection = 0;
1561 0 : nFlyMethod = 1;
1562 : }
1563 0 : break;
1564 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_RIGHT :
1565 : {
1566 0 : nFlyDirection = 0;
1567 0 : nFlyMethod = 1;
1568 : }
1569 0 : break;
1570 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_BOTTOM :
1571 : {
1572 0 : nFlyDirection = 0;
1573 0 : nFlyMethod = 1;
1574 : }
1575 0 : break;
1576 : case ::com::sun::star::presentation::AnimationEffect_SPIRALIN_LEFT :
1577 : case ::com::sun::star::presentation::AnimationEffect_SPIRALIN_RIGHT :
1578 : case ::com::sun::star::presentation::AnimationEffect_SPIRALOUT_LEFT :
1579 : case ::com::sun::star::presentation::AnimationEffect_SPIRALOUT_RIGHT :
1580 : {
1581 0 : nFlyDirection = 0x1c;
1582 0 : nFlyMethod = 0xc;
1583 : }
1584 0 : break;
1585 : case ::com::sun::star::presentation::AnimationEffect_DISSOLVE :
1586 : {
1587 0 : nFlyDirection = 0;
1588 0 : nFlyMethod = 5;
1589 : }
1590 0 : break;
1591 : case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_LEFT :
1592 : {
1593 0 : nFlyDirection = 2;
1594 0 : nFlyMethod = 10;
1595 : }
1596 0 : break;
1597 : case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_TOP :
1598 : {
1599 0 : nFlyDirection = 3;
1600 0 : nFlyMethod = 10;
1601 : }
1602 0 : break;
1603 : case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_RIGHT :
1604 : {
1605 0 : nFlyDirection = 0;
1606 0 : nFlyMethod = 10;
1607 : }
1608 0 : break;
1609 : case ::com::sun::star::presentation::AnimationEffect_WAVYLINE_FROM_BOTTOM :
1610 : {
1611 0 : nFlyDirection = 1;
1612 0 : nFlyMethod = 10;
1613 : }
1614 0 : break;
1615 : case ::com::sun::star::presentation::AnimationEffect_RANDOM :
1616 : {
1617 0 : nFlyDirection = 0;
1618 0 : nFlyMethod = 1;
1619 : }
1620 0 : break;
1621 : case ::com::sun::star::presentation::AnimationEffect_VERTICAL_LINES :
1622 : {
1623 0 : nFlyDirection = 1;
1624 0 : nFlyMethod = 8;
1625 : }
1626 0 : break;
1627 : case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_LINES :
1628 : {
1629 0 : nFlyDirection = 0;
1630 0 : nFlyMethod = 8;
1631 : }
1632 0 : break;
1633 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LEFT :
1634 : {
1635 0 : nFlyDirection = 2;
1636 0 : nFlyMethod = 10;
1637 : }
1638 0 : break;
1639 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_TOP :
1640 : {
1641 0 : nFlyDirection = 3;
1642 0 : nFlyMethod = 10;
1643 : }
1644 0 : break;
1645 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_RIGHT :
1646 : {
1647 0 : nFlyDirection = 0;
1648 0 : nFlyMethod = 10;
1649 : }
1650 0 : break;
1651 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_BOTTOM :
1652 : {
1653 0 : nFlyDirection = 1;
1654 0 : nFlyMethod = 10;
1655 : }
1656 0 : break;
1657 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_UPPERLEFT :
1658 : {
1659 0 : nFlyDirection = 7;
1660 0 : nFlyMethod = 9;
1661 : }
1662 0 : break;
1663 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_UPPERRIGHT :
1664 : {
1665 0 : nFlyDirection = 6;
1666 0 : nFlyMethod = 9;
1667 : }
1668 0 : break;
1669 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LOWERLEFT :
1670 : {
1671 0 : nFlyDirection = 5;
1672 0 : nFlyMethod = 9;
1673 : }
1674 0 : break;
1675 : case ::com::sun::star::presentation::AnimationEffect_LASER_FROM_LOWERRIGHT :
1676 : {
1677 0 : nFlyDirection = 4;
1678 0 : nFlyMethod = 9;
1679 : }
1680 0 : break;
1681 : case ::com::sun::star::presentation::AnimationEffect_APPEAR :
1682 0 : break;
1683 : case ::com::sun::star::presentation::AnimationEffect_HIDE :
1684 : {
1685 0 : nFlyDirection = 0;
1686 0 : nFlyMethod = 1;
1687 : }
1688 0 : break;
1689 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_UPPERLEFT :
1690 : {
1691 0 : nFlyDirection = 4;
1692 0 : nFlyMethod = 12;
1693 : }
1694 0 : break;
1695 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_UPPERRIGHT :
1696 : {
1697 0 : nFlyDirection = 5;
1698 0 : nFlyMethod = 12;
1699 : }
1700 0 : break;
1701 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LOWERRIGHT :
1702 : {
1703 0 : nFlyDirection = 7;
1704 0 : nFlyMethod = 12;
1705 : }
1706 0 : break;
1707 : case ::com::sun::star::presentation::AnimationEffect_MOVE_FROM_LOWERLEFT :
1708 : {
1709 0 : nFlyDirection = 6;
1710 0 : nFlyMethod = 12;
1711 : }
1712 0 : break;
1713 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_UPPERLEFT :
1714 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_UPPERRIGHT :
1715 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LOWERRIGHT :
1716 : case ::com::sun::star::presentation::AnimationEffect_MOVE_TO_LOWERLEFT :
1717 0 : nAfterEffect |= 2;
1718 0 : break;
1719 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LEFT :
1720 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_UPPERLEFT :
1721 : {
1722 0 : nFlyDirection = 8;
1723 0 : nFlyMethod = 12;
1724 : }
1725 0 : break;
1726 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_TOP :
1727 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_UPPERRIGHT :
1728 : {
1729 0 : nFlyDirection = 11;
1730 0 : nFlyMethod = 12;
1731 : }
1732 0 : break;
1733 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_RIGHT :
1734 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LOWERRIGHT :
1735 : {
1736 0 : nFlyDirection = 10;
1737 0 : nFlyMethod = 12;
1738 : }
1739 0 : break;
1740 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_BOTTOM :
1741 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_FROM_LOWERLEFT :
1742 : {
1743 0 : nFlyDirection = 9;
1744 0 : nFlyMethod = 12;
1745 : }
1746 0 : break;
1747 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LEFT :
1748 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_UPPERLEFT :
1749 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_TOP :
1750 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_UPPERRIGHT :
1751 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_RIGHT :
1752 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LOWERRIGHT :
1753 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_BOTTOM :
1754 : case ::com::sun::star::presentation::AnimationEffect_MOVE_SHORT_TO_LOWERLEFT :
1755 0 : nAfterEffect |= 2;
1756 0 : break;
1757 : case ::com::sun::star::presentation::AnimationEffect_VERTICAL_CHECKERBOARD :
1758 : {
1759 0 : nFlyDirection = 1;
1760 0 : nFlyMethod = 3;
1761 : }
1762 0 : break;
1763 : case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_CHECKERBOARD :
1764 : {
1765 0 : nFlyDirection = 0;
1766 0 : nFlyMethod = 3;
1767 : }
1768 0 : break;
1769 : case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_ROTATE :
1770 : case ::com::sun::star::presentation::AnimationEffect_VERTICAL_ROTATE :
1771 : {
1772 0 : nFlyDirection = 27;
1773 0 : nFlyMethod = 12;
1774 : }
1775 0 : break;
1776 : case ::com::sun::star::presentation::AnimationEffect_HORIZONTAL_STRETCH :
1777 : case ::com::sun::star::presentation::AnimationEffect_VERTICAL_STRETCH :
1778 : {
1779 0 : nFlyDirection = 22;
1780 0 : nFlyMethod = 12;
1781 : }
1782 0 : break;
1783 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LEFT :
1784 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_UPPERLEFT :
1785 : {
1786 0 : nFlyDirection = 23;
1787 0 : nFlyMethod = 12;
1788 : }
1789 0 : break;
1790 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_TOP :
1791 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_UPPERRIGHT :
1792 : {
1793 0 : nFlyDirection = 24;
1794 0 : nFlyMethod = 12;
1795 : }
1796 0 : break;
1797 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_RIGHT :
1798 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LOWERRIGHT :
1799 : {
1800 0 : nFlyDirection = 25;
1801 0 : nFlyMethod = 12;
1802 : }
1803 0 : break;
1804 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_BOTTOM :
1805 : case ::com::sun::star::presentation::AnimationEffect_STRETCH_FROM_LOWERLEFT :
1806 : {
1807 0 : nFlyDirection = 26;
1808 0 : nFlyMethod = 12;
1809 : }
1810 0 : break;
1811 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN :
1812 : {
1813 0 : nFlyDirection = 16;
1814 0 : nFlyMethod = 12;
1815 : }
1816 0 : break;
1817 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_SMALL :
1818 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_SPIRAL :
1819 : {
1820 0 : nFlyDirection = 17;
1821 0 : nFlyMethod = 12;
1822 : }
1823 0 : break;
1824 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT :
1825 : {
1826 0 : nFlyDirection = 18;
1827 0 : nFlyMethod = 12;
1828 : }
1829 0 : break;
1830 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_SMALL :
1831 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_SPIRAL :
1832 : {
1833 0 : nFlyDirection = 19;
1834 0 : nFlyMethod = 12;
1835 : }
1836 0 : break;
1837 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LEFT :
1838 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_UPPERLEFT :
1839 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_TOP :
1840 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_UPPERRIGHT :
1841 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_RIGHT :
1842 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LOWERRIGHT :
1843 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_BOTTOM :
1844 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_LOWERLEFT :
1845 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_IN_FROM_CENTER :
1846 : {
1847 0 : nFlyDirection = 16;
1848 0 : nFlyMethod = 12;
1849 : }
1850 0 : break;
1851 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LEFT :
1852 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_UPPERLEFT :
1853 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_TOP :
1854 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_UPPERRIGHT :
1855 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_RIGHT :
1856 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LOWERRIGHT :
1857 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_BOTTOM :
1858 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_LOWERLEFT :
1859 : case ::com::sun::star::presentation::AnimationEffect_ZOOM_OUT_FROM_CENTER :
1860 0 : nAfterEffect |= 2;
1861 0 : break;
1862 : default:
1863 0 : break;
1864 : }
1865 0 : if ( mnDiaMode >= 1 )
1866 0 : nFlags |= 4;
1867 0 : if ( eTe != ::com::sun::star::presentation::AnimationEffect_NONE )
1868 0 : nBuildType = 2;
1869 0 : if ( ImplGetPropertyValue( OUString( "SoundOn" ) ) )
1870 : {
1871 0 : bool bBool(false);
1872 0 : mAny >>= bBool;
1873 0 : if ( bBool )
1874 : {
1875 0 : if ( ImplGetPropertyValue( OUString( "Sound" ) ) )
1876 : {
1877 0 : nSoundRef = maSoundCollection.GetId( *static_cast<OUString const *>(mAny.getValue()) );
1878 0 : if ( nSoundRef )
1879 0 : nFlags |= 0x10;
1880 : }
1881 : }
1882 : }
1883 0 : bool bDimHide = false;
1884 0 : bool bDimPrevious = false;
1885 0 : if ( ImplGetPropertyValue( OUString( "DimHide" ) ) )
1886 0 : mAny >>= bDimHide;
1887 0 : if ( ImplGetPropertyValue( OUString( "DimPrevious" ) ) )
1888 0 : mAny >>= bDimPrevious;
1889 0 : if ( bDimPrevious )
1890 0 : nAfterEffect |= 1;
1891 0 : if ( bDimHide )
1892 0 : nAfterEffect |= 2;
1893 0 : if ( ImplGetPropertyValue( OUString( "DimColor" ) ) )
1894 0 : nDimColor = EscherEx::GetColor( *static_cast<sal_uInt32 const *>(mAny.getValue()) ) | 0xfe000000;
1895 :
1896 0 : rSt.WriteUInt32( nDimColor ).WriteUInt32( nFlags ).WriteUInt32( nSoundRef ).WriteUInt32( nDelayTime )
1897 0 : .WriteUInt16( nOrder ) // order of build ( 1.. )
1898 0 : .WriteUInt16( nSlideCount ).WriteUChar( nBuildType ).WriteUChar( nFlyMethod ).WriteUChar( nFlyDirection )
1899 0 : .WriteUChar( nAfterEffect ).WriteUChar( nSubEffect ).WriteUChar( nOleVerb )
1900 0 : .WriteUInt16( 0 ); // PadWord
1901 0 : }
1902 :
1903 0 : void PPTWriter::ImplWriteClickAction( SvStream& rSt, ::com::sun::star::presentation::ClickAction eCa, bool bMediaClickAction )
1904 : {
1905 0 : sal_uInt32 nSoundRef = 0; // a reference to a sound in the sound collection, or NULL.
1906 0 : sal_uInt32 nHyperLinkID = 0;// a persistent unique identifier to an external hyperlink object (only valid when action == HyperlinkAction).
1907 0 : sal_uInt8 nAction = 0; // Action See Action Table
1908 0 : sal_uInt8 nOleVerb = 0; // OleVerb Only valid when action == OLEAction. OLE verb to use, 0 = first verb, 1 = second verb, etc.
1909 0 : sal_uInt8 nJump = 0; // Jump See Jump Table
1910 0 : sal_uInt8 nFlags = 0; // Bit 1: Animated. If 1, then button is animated
1911 : // Bit 2: Stop sound. If 1, then stop current sound when button is pressed.
1912 : // Bit 3: CustomShowReturn. If 1, and this is a jump to custom show, then return to this slide after custom show.
1913 0 : sal_uInt8 nHyperLinkType = 0;// HyperlinkType a value from the LinkTo enum, such as LT_URL (only valid when action == HyperlinkAction).
1914 :
1915 0 : OUString aFile;
1916 :
1917 : /*
1918 : Action Table: Action Value
1919 : NoAction 0
1920 : MacroAction 1
1921 : RunProgramAction 2
1922 : JumpAction 3
1923 : HyperlinkAction 4
1924 : OLEAction 5
1925 : MediaAction 6
1926 : CustomShowAction 7
1927 :
1928 : Jump Table: Jump Value
1929 : NoJump 0
1930 : NextSlide, 1
1931 : PreviousSlide, 2
1932 : FirstSlide, 3
1933 : LastSlide, 4
1934 : LastSlideViewed 5
1935 : EndShow 6
1936 : */
1937 :
1938 0 : if ( bMediaClickAction )
1939 0 : nAction = 6;
1940 0 : else switch( eCa )
1941 : {
1942 : case ::com::sun::star::presentation::ClickAction_STOPPRESENTATION :
1943 0 : nJump += 2;
1944 : //fall-through
1945 : case ::com::sun::star::presentation::ClickAction_LASTPAGE :
1946 0 : nJump++;
1947 : //fall-through
1948 : case ::com::sun::star::presentation::ClickAction_FIRSTPAGE :
1949 0 : nJump++;
1950 : //fall-through
1951 : case ::com::sun::star::presentation::ClickAction_PREVPAGE :
1952 0 : nJump++;
1953 : //fall-through
1954 : case ::com::sun::star::presentation::ClickAction_NEXTPAGE :
1955 : {
1956 0 : nJump++;
1957 0 : nAction = 3;
1958 : }
1959 0 : break;
1960 : case ::com::sun::star::presentation::ClickAction_SOUND :
1961 : {
1962 0 : if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
1963 0 : nSoundRef = maSoundCollection.GetId( *static_cast<OUString const *>(mAny.getValue()) );
1964 : }
1965 0 : break;
1966 : case ::com::sun::star::presentation::ClickAction_PROGRAM :
1967 : {
1968 0 : if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
1969 : {
1970 0 : INetURLObject aUrl( *static_cast<OUString const *>(mAny.getValue()) );
1971 0 : if ( INetProtocol::File == aUrl.GetProtocol() )
1972 : {
1973 0 : aFile = aUrl.PathToFileName();
1974 0 : nAction = 2;
1975 0 : }
1976 : }
1977 : }
1978 0 : break;
1979 :
1980 : case ::com::sun::star::presentation::ClickAction_BOOKMARK :
1981 : {
1982 0 : if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
1983 : {
1984 0 : OUString aBookmark( *static_cast<OUString const *>(mAny.getValue()) );
1985 0 : sal_uInt32 nIndex = 0;
1986 0 : std::vector<OUString>::const_iterator pIter;
1987 0 : for ( pIter = maSlideNameList.begin(); pIter != maSlideNameList.end(); ++pIter, nIndex++ )
1988 : {
1989 0 : if ( *pIter == aBookmark )
1990 : {
1991 : // Bookmark is a link to a document page
1992 0 : nAction = 4;
1993 0 : nHyperLinkType = 7;
1994 :
1995 0 : OUString aHyperString = OUString::number(256 + nIndex);
1996 0 : aHyperString += ",";
1997 0 : aHyperString += OUString::number(nIndex + 1);
1998 0 : aHyperString += ",Slide ";
1999 0 : aHyperString += OUString::number(nIndex + 1);
2000 0 : nHyperLinkID = ImplInsertBookmarkURL( aHyperString, 1 | ( nIndex << 8 ) | ( 1U << 31 ), aBookmark, "", "", aHyperString );
2001 : }
2002 0 : }
2003 : }
2004 : }
2005 0 : break;
2006 :
2007 : case ::com::sun::star::presentation::ClickAction_DOCUMENT :
2008 : {
2009 0 : if ( ImplGetPropertyValue( OUString( "Bookmark" ) ) )
2010 : {
2011 0 : OUString aBookmark( *static_cast<OUString const *>(mAny.getValue()) );
2012 0 : if ( !aBookmark.isEmpty() )
2013 : {
2014 0 : nAction = 4;
2015 0 : nHyperLinkType = 8;
2016 :
2017 0 : OUString aBookmarkFile( aBookmark );
2018 0 : INetURLObject aUrl( aBookmark );
2019 0 : if ( INetProtocol::File == aUrl.GetProtocol() )
2020 0 : aBookmarkFile = aUrl.PathToFileName();
2021 0 : nHyperLinkID = ImplInsertBookmarkURL( aBookmark, (sal_uInt32)(2 | ( 1U << 31 )), aBookmarkFile, aBookmark, "", "" );
2022 0 : }
2023 : }
2024 : }
2025 0 : break;
2026 :
2027 : case ::com::sun::star::presentation::ClickAction_INVISIBLE :
2028 : case ::com::sun::star::presentation::ClickAction_VERB :
2029 : case ::com::sun::star::presentation::ClickAction_VANISH :
2030 : case ::com::sun::star::presentation::ClickAction_MACRO :
2031 : default :
2032 0 : break;
2033 : }
2034 :
2035 0 : sal_uInt32 nContainerSize = 24;
2036 0 : if ( nAction == 2 )
2037 0 : nContainerSize += ( aFile.getLength() * 2 ) + 8;
2038 0 : rSt.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( nContainerSize )
2039 0 : .WriteUInt32( EPP_InteractiveInfoAtom << 16 ).WriteUInt32( 16 )
2040 0 : .WriteUInt32( nSoundRef )
2041 0 : .WriteUInt32( nHyperLinkID )
2042 0 : .WriteUChar( nAction )
2043 0 : .WriteUChar( nOleVerb )
2044 0 : .WriteUChar( nJump )
2045 0 : .WriteUChar( nFlags )
2046 0 : .WriteUInt32( nHyperLinkType );
2047 :
2048 0 : if ( nAction == 2 ) // run program Action
2049 : {
2050 0 : sal_Int32 nLen = aFile.getLength();
2051 0 : rSt.WriteUInt32( ( EPP_CString << 16 ) | 0x20 ).WriteUInt32( nLen * 2 );
2052 0 : for ( sal_Int32 i = 0; i < nLen; i++ )
2053 0 : rSt.WriteUInt16( aFile[i] );
2054 : }
2055 :
2056 0 : rSt.WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0x1f ).WriteUInt32( 24 ) // Mouse Over Action
2057 0 : .WriteUInt32( EPP_InteractiveInfo << 16 ).WriteUInt32( 16 );
2058 0 : for ( int i = 0; i < 4; i++, rSt.WriteUInt32( 0 ) ) ;
2059 0 : }
2060 :
2061 56 : bool PPTWriter::ImplGetEffect( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rPropSet,
2062 : ::com::sun::star::presentation::AnimationEffect& eEffect,
2063 : ::com::sun::star::presentation::AnimationEffect& eTextEffect,
2064 : bool& bIsSound )
2065 : {
2066 56 : ::com::sun::star::uno::Any aAny;
2067 56 : if ( GetPropertyValue( aAny, rPropSet, OUString( "Effect" ) ) )
2068 56 : aAny >>= eEffect;
2069 : else
2070 0 : eEffect = ::com::sun::star::presentation::AnimationEffect_NONE;
2071 :
2072 56 : if ( GetPropertyValue( aAny, rPropSet, OUString( "TextEffect" ) ) )
2073 56 : aAny >>= eTextEffect;
2074 : else
2075 0 : eTextEffect = ::com::sun::star::presentation::AnimationEffect_NONE;
2076 56 : if ( GetPropertyValue( aAny, rPropSet, OUString( "SoundOn" ) ) )
2077 56 : aAny >>= bIsSound;
2078 : else
2079 0 : bIsSound = false;
2080 :
2081 56 : bool bHasEffect = ( ( eEffect != ::com::sun::star::presentation::AnimationEffect_NONE )
2082 56 : || ( eTextEffect != ::com::sun::star::presentation::AnimationEffect_NONE )
2083 112 : || bIsSound );
2084 56 : return bHasEffect;
2085 : };
2086 :
2087 37 : bool PPTWriter::ImplCreatePresentationPlaceholder( const bool bMasterPage, const PageType /* ePageType */,
2088 : const sal_uInt32 nStyleInstance, const sal_uInt8 nPlaceHolderId )
2089 : {
2090 37 : bool bRet = ImplGetText();
2091 37 : if ( bRet && bMasterPage )
2092 : {
2093 27 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2094 27 : sal_uInt32 nPresShapeID = mpPptEscherEx->GenerateShapeId();
2095 27 : mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, nPresShapeID );// Flags: HaveAnchor | HasSpt
2096 27 : EscherPropertyContainer aPropOpt;
2097 27 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
2098 27 : aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
2099 27 : aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
2100 27 : aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
2101 27 : aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
2102 27 : aPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
2103 27 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2104 27 : sal_uInt32 nLineFlags = 0x90001;
2105 27 : if ( aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
2106 27 : nLineFlags |= 0x10001; // draw dashed line if no line
2107 27 : aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
2108 :
2109 54 : SvMemoryStream aExtBu( 0x200, 0x200 );
2110 54 : SvMemoryStream aClientTextBox( 0x200, 0x200 );
2111 27 : ImplWriteTextStyleAtom( aClientTextBox, nStyleInstance, 0, NULL, aExtBu, &aPropOpt );
2112 :
2113 27 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
2114 27 : aPropOpt.CreateShapeProperties( mXShape );
2115 27 : aPropOpt.Commit( *mpStrm );
2116 27 : mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
2117 27 : mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() ); // oben, links, rechts, unten ????
2118 27 : mpPptEscherEx->OpenContainer( ESCHER_ClientData );
2119 27 : mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
2120 27 : mpStrm->WriteUInt32( 0 ) // PlacementID
2121 54 : .WriteUChar( nPlaceHolderId ) // PlaceHolderID
2122 27 : .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
2123 27 : .WriteUInt16( 0 ); // padword
2124 27 : mpPptEscherEx->CloseContainer(); // ESCHER_ClientData
2125 :
2126 27 : if ( aClientTextBox.Tell() )
2127 : {
2128 27 : mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
2129 54 : .WriteUInt32( aClientTextBox.Tell() );
2130 :
2131 27 : mpStrm->Write( aClientTextBox.GetData(), aClientTextBox.Tell() );
2132 : }
2133 54 : mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
2134 : }
2135 : else
2136 10 : bRet = false;
2137 37 : return bRet;
2138 : }
2139 :
2140 23 : void PPTWriter::ImplCreateShape( sal_uInt32 nType, sal_uInt32 nFlags, EscherSolverContainer& rSolver )
2141 : {
2142 23 : sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
2143 23 : mpPptEscherEx->AddShape( nType, nFlags, nId );
2144 23 : rSolver.AddShape( mXShape, nId );
2145 23 : }
2146 :
2147 10 : void PPTWriter::ImplCreateTextShape( EscherPropertyContainer& rPropOpt, EscherSolverContainer& rSolver, bool bFill )
2148 : {
2149 10 : mnTextStyle = EPP_TEXTSTYLE_TEXT;
2150 10 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2151 10 : ImplCreateShape( ESCHER_ShpInst_TextBox, 0xa00, rSolver );
2152 10 : if ( bFill )
2153 10 : rPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2154 10 : if ( ImplGetText() )
2155 0 : rPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
2156 10 : }
2157 :
2158 16 : void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& aSolverContainer, PageType ePageType, bool bMasterPage, int nPageNumber )
2159 : {
2160 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
2161 : // sal_uInt32 nGroupLevel = 0;
2162 :
2163 : sal_uInt32 nInstance, nGroups, nShapes, nShapeCount, nPer, nLastPer, nIndices, nOlePictureId;
2164 : sal_uInt16 nEffectCount;
2165 16 : ::com::sun::star::awt::Point aTextRefPoint;
2166 :
2167 16 : ResetGroupTable( nShapes = mXShapes->getCount() );
2168 :
2169 16 : nIndices = nInstance = nLastPer = nShapeCount = nEffectCount = 0;
2170 :
2171 16 : bool bIsTitlePossible = true; // powerpoint is not able to handle more than one title
2172 :
2173 16 : sal_uInt32 nOutlinerCount = 0; // the outline objects have to conform to the layout,
2174 16 : sal_uInt32 nPrevTextStyle = 0; // there are no more than two allowed
2175 :
2176 16 : nOlePictureId = 0;
2177 :
2178 16 : bool bAdditionalText = false;
2179 :
2180 16 : bool bSecOutl = false;
2181 16 : sal_uInt32 nPObjects = 0;
2182 :
2183 16 : SvMemoryStream* pClientTextBox = NULL;
2184 16 : SvMemoryStream* pClientData = NULL;
2185 :
2186 88 : while( GetNextGroupEntry() )
2187 : {
2188 56 : nShapeCount++;
2189 :
2190 56 : nPer = ( 5 * nShapeCount ) / nShapes;
2191 56 : if ( nPer != nLastPer )
2192 : {
2193 53 : nLastPer = nPer;
2194 53 : sal_uInt32 nValue = mnPagesWritten * 5 + nPer;
2195 53 : if ( nValue > mnStatMaxValue )
2196 53 : nValue = mnStatMaxValue;
2197 53 : if ( mbStatusIndicator && ( nValue > mnLatestStatValue ) )
2198 : {
2199 0 : mXStatusIndicator->setValue( nValue );
2200 0 : mnLatestStatValue = nValue;
2201 : }
2202 : }
2203 56 : nGroups = GetGroupsClosed();
2204 56 : for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;
2205 :
2206 56 : if ( GetShapeByIndex( GetCurrentGroupIndex(), true ) )
2207 : {
2208 : bool bIsSound;
2209 56 : bool bMediaClickAction = false;
2210 : ::com::sun::star::presentation::AnimationEffect eAe;
2211 : ::com::sun::star::presentation::AnimationEffect eTe;
2212 :
2213 56 : if ( ImplGetPropertyValue( OUString( "PresentationOrder" ) ) )
2214 56 : nEffectCount = *static_cast<sal_uInt16 const *>(mAny.getValue());
2215 :
2216 56 : bool bEffect = ImplGetEffect( mXPropSet, eAe, eTe, bIsSound );
2217 56 : ::com::sun::star::presentation::ClickAction eCa = ::com::sun::star::presentation::ClickAction_NONE;
2218 56 : if ( ImplGetPropertyValue( OUString( "OnClick" ) ) )
2219 56 : mAny >>= eCa;
2220 :
2221 56 : bool bGroup = mType == "drawing.Group";
2222 56 : bool bOpenBezier = mType == "drawing.OpenBezier";
2223 56 : bool bClosedBezier = mType == "drawing.ClosedBezier";
2224 56 : bool bPolyPolygon = mType == "drawing.PolyPolygon";
2225 56 : bool bPolyLine = mType == "drawing.PolyLine";
2226 :
2227 56 : const ::com::sun::star::awt::Size aSize100thmm( mXShape->getSize() );
2228 56 : const ::com::sun::star::awt::Point aPoint100thmm( mXShape->getPosition() );
2229 56 : Rectangle aRect100thmm( Point( aPoint100thmm.X, aPoint100thmm.Y ), Size( aSize100thmm.Width, aSize100thmm.Height ) );
2230 56 : EscherPropertyContainer aPropOpt( mpPptEscherEx->GetGraphicProvider(), mpPicStrm, aRect100thmm );
2231 :
2232 56 : if ( bGroup )
2233 : {
2234 : ::com::sun::star::uno::Reference< ::com::sun::star::container::XIndexAccess >
2235 0 : aXIndexAccess( mXShape, ::com::sun::star::uno::UNO_QUERY );
2236 0 : if ( EnterGroup( aXIndexAccess ) )
2237 : {
2238 0 : SvMemoryStream* pTmp = NULL;
2239 :
2240 0 : if ( bEffect && !mbUseNewAnimations )
2241 : {
2242 0 : pTmp = new SvMemoryStream( 0x200, 0x200 );
2243 0 : ImplWriteObjectEffect( *pTmp, eAe, eTe, ++nEffectCount );
2244 : }
2245 0 : if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
2246 : {
2247 0 : if ( !pTmp )
2248 0 : pTmp = new SvMemoryStream( 0x200, 0x200 );
2249 0 : ImplWriteClickAction( *pTmp, eCa, bMediaClickAction );
2250 : }
2251 0 : sal_uInt32 nShapeId = mpPptEscherEx->EnterGroup( &maRect, pTmp );
2252 0 : aSolverContainer.AddShape( mXShape, nShapeId );
2253 0 : delete pTmp;
2254 0 : }
2255 : }
2256 : else
2257 : {
2258 56 : bool bIsFontwork = false;
2259 56 : bool bIsHatching = false;
2260 56 : ::com::sun::star::uno::Any aAny;
2261 : ::com::sun::star::drawing::FillStyle eFS;
2262 56 : if ( GetPropertyValue( aAny, mXPropSet, OUString( "IsFontwork" ), true ) )
2263 51 : aAny >>= bIsFontwork;
2264 56 : if ( GetPropertyValue( aAny, mXPropSet, OUString( "FillStyle" ), true ) )
2265 : {
2266 51 : aAny >>= eFS;
2267 51 : bIsHatching = eFS == ::com::sun::star::drawing::FillStyle_HATCH;
2268 : }
2269 56 : if ( bIsHatching || bIsFontwork || ( mType == "drawing.Measure" ) || ( mType == "drawing.Caption" ) )
2270 : {
2271 0 : if ( ImplGetPropertyValue( OUString( "BoundRect" ) ) )
2272 : {
2273 0 : ::com::sun::star::awt::Rectangle aRect( *static_cast<css::awt::Rectangle const *>(mAny.getValue()) );
2274 0 : maPosition = MapPoint( ::com::sun::star::awt::Point( aRect.X, aRect.Y ) );
2275 0 : maSize = MapSize( ::com::sun::star::awt::Size( aRect.Width, aRect.Height ) );
2276 0 : maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
2277 : }
2278 0 : mType = "drawing.dontknow";
2279 56 : }
2280 : }
2281 56 : sal_uInt8 nPlaceHolderAtom = EPP_PLACEHOLDER_NONE;
2282 :
2283 56 : mnTextSize = 0;
2284 56 : mnTextStyle = EPP_TEXTSTYLE_NORMAL;
2285 :
2286 56 : if ( mType == "drawing.Custom" )
2287 : {
2288 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2289 : sal_uInt32 nMirrorFlags;
2290 0 : OUString sCustomShapeType;
2291 0 : MSO_SPT eShapeType = EscherPropertyContainer::GetCustomShapeType( mXShape, nMirrorFlags, sCustomShapeType );
2292 0 : if ( sCustomShapeType == "col-502ad400" || sCustomShapeType == "col-60da8460" )
2293 : { // sj: creating metafile for customshapes that can't be saved to ms format properly
2294 0 : ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
2295 0 : if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "MetaFile" ), false ) )
2296 : {
2297 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
2298 0 : SdrObject* pObj = GetSdrObjectFromXShape( mXShape );
2299 0 : if ( pObj )
2300 : {
2301 0 : Rectangle aBound = pObj->GetCurrentBoundRect();
2302 0 : maPosition = MapPoint( ::com::sun::star::awt::Point( aBound.Left(), aBound.Top() ) );
2303 0 : maSize = MapSize( ::com::sun::star::awt::Size ( aBound.GetWidth(), aBound.GetHeight() ) );
2304 0 : maRect = Rectangle( Point( maPosition.X, maPosition.Y ), Size( maSize.Width, maSize.Height ) );
2305 0 : mnAngle = 0;
2306 : }
2307 : }
2308 : }
2309 : else
2310 : {
2311 0 : ImplCreateShape( eShapeType, nMirrorFlags | 0xa00, aSolverContainer );
2312 0 : aPropOpt.CreateCustomShapeProperties( eShapeType, mXShape );
2313 0 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape);
2314 0 : if ( ImplGetText() )
2315 : {
2316 0 : if ( !aPropOpt.IsFontWork() )
2317 0 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, true, true );
2318 : }
2319 0 : }
2320 : }
2321 56 : else if ( mType == "drawing.Rectangle" )
2322 : {
2323 0 : sal_Int32 nRadius = 0;
2324 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2325 0 : if ( ImplGetPropertyValue( OUString( "CornerRadius" ) ) )
2326 : {
2327 0 : mAny >>= nRadius;
2328 0 : nRadius = MapSize( ::com::sun::star::awt::Size( nRadius, 0 ) ).Width;
2329 : }
2330 0 : if ( nRadius )
2331 : {
2332 0 : ImplCreateShape( ESCHER_ShpInst_RoundRectangle, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2333 0 : sal_Int32 nLength = maRect.GetWidth();
2334 0 : if ( nLength > maRect.GetHeight() )
2335 0 : nLength = maRect.GetHeight();
2336 0 : nLength >>= 1;
2337 0 : if ( nRadius >= nLength )
2338 0 : nRadius = 0x2a30; // 0x2a30 ist PPTs maximum radius
2339 : else
2340 0 : nRadius = ( 0x2a30 * nRadius ) / nLength;
2341 0 : aPropOpt.AddOpt( ESCHER_Prop_adjustValue, nRadius );
2342 : }
2343 : else
2344 : {
2345 0 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2346 : }
2347 0 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2348 0 : if ( ImplGetText() )
2349 0 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
2350 : }
2351 56 : else if ( mType == "drawing.Ellipse" )
2352 : {
2353 0 : ::com::sun::star::drawing::CircleKind eCircleKind( ::com::sun::star::drawing::CircleKind_FULL );
2354 0 : PolyStyle ePolyKind = POLY_CHORD;
2355 0 : if ( ImplGetPropertyValue( OUString( "CircleKind" ) ) )
2356 : {
2357 0 : mAny >>= eCircleKind;
2358 0 : switch ( eCircleKind )
2359 : {
2360 : case ::com::sun::star::drawing::CircleKind_SECTION :
2361 : {
2362 0 : ePolyKind = POLY_PIE;
2363 : }
2364 0 : break;
2365 : case ::com::sun::star::drawing::CircleKind_ARC :
2366 : {
2367 0 : ePolyKind = POLY_ARC;
2368 : }
2369 0 : break;
2370 :
2371 : case ::com::sun::star::drawing::CircleKind_CUT :
2372 : {
2373 0 : ePolyKind = POLY_CHORD;
2374 : }
2375 0 : break;
2376 :
2377 : default:
2378 0 : eCircleKind = ::com::sun::star::drawing::CircleKind_FULL;
2379 : }
2380 : }
2381 0 : if ( eCircleKind == ::com::sun::star::drawing::CircleKind_FULL )
2382 : {
2383 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2384 0 : ImplCreateShape( ESCHER_ShpInst_Ellipse, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2385 0 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2386 0 : if ( ImplGetText() )
2387 0 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
2388 : }
2389 : else
2390 : {
2391 : sal_Int32 nStartAngle, nEndAngle;
2392 0 : if ( !ImplGetPropertyValue( OUString( "CircleStartAngle" ) ) )
2393 0 : continue;
2394 0 : nStartAngle = *static_cast<sal_Int32 const *>(mAny.getValue());
2395 0 : if( !ImplGetPropertyValue( OUString( "CircleEndAngle" ) ) )
2396 0 : continue;
2397 0 : nEndAngle = *static_cast<sal_Int32 const *>(mAny.getValue());
2398 0 : ::com::sun::star::awt::Point aPoint( mXShape->getPosition() );
2399 0 : ::com::sun::star::awt::Size aSize( mXShape->getSize() );
2400 0 : ::com::sun::star::awt::Point aStart, aEnd, aCenter;
2401 0 : Rectangle aRect( Point( aPoint.X, aPoint.Y ), Size( aSize.Width, aSize.Height ) );
2402 0 : aStart.X = (sal_Int32)( ( cos( (double)( nStartAngle * F_PI18000 ) ) * 100.0 ) );
2403 0 : aStart.Y = - (sal_Int32)( ( sin( (double)( nStartAngle * F_PI18000 ) ) * 100.0 ) );
2404 0 : aEnd.X = (sal_Int32)( ( cos( (double)( nEndAngle * F_PI18000 ) ) * 100.0 ) );
2405 0 : aEnd.Y = - (sal_Int32)( ( sin( (double)( nEndAngle * F_PI18000 ) ) * 100.0 ) );
2406 0 : aCenter.X = aPoint.X + ( aSize.Width / 2 );
2407 0 : aCenter.Y = aPoint.Y + ( aSize.Height / 2 );
2408 0 : aStart.X += aCenter.X;
2409 0 : aStart.Y += aCenter.Y;
2410 0 : aEnd.X += aCenter.X;
2411 0 : aEnd.Y += aCenter.Y;
2412 0 : Polygon aPolygon( aRect, Point( aStart.X, aStart.Y ), Point( aEnd.X, aEnd.Y ), ePolyKind );
2413 0 : bool bNeedText = true;
2414 0 : if ( mnAngle )
2415 : {
2416 0 : aPolygon.Rotate( aRect.TopLeft(), (sal_uInt16)( mnAngle / 10 ) );
2417 0 : if ( ImplGetText() )
2418 : {
2419 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
2420 : // mpPptEscherEx->EnterGroup( 0,0 );
2421 : // nGroupLevel = mpPptEscherEx->GetGroupLevel();
2422 0 : bNeedText = false;
2423 0 : bAdditionalText = true;
2424 0 : mnTextSize = 0;
2425 : }
2426 0 : mnAngle = 0;
2427 : }
2428 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2429 0 : ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2430 0 : ::com::sun::star::awt::Rectangle aNewRect;
2431 0 : switch ( ePolyKind )
2432 : {
2433 : case POLY_PIE :
2434 : case POLY_CHORD :
2435 : {
2436 0 : if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, false, aNewRect, &aPolygon ) )
2437 0 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2438 : }
2439 0 : break;
2440 :
2441 : case POLY_ARC :
2442 : {
2443 0 : if ( aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, false, aNewRect, &aPolygon ) )
2444 0 : aPropOpt.CreateLineProperties( mXPropSet, false );
2445 : }
2446 0 : break;
2447 : }
2448 0 : maRect = MapRectangle( aNewRect );
2449 0 : maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2450 0 : maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
2451 0 : if ( bNeedText && ImplGetText() )
2452 0 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
2453 : }
2454 : }
2455 56 : else if ( mType == "drawing.Control" )
2456 : {
2457 : ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XControlShape >
2458 0 : aXControlShape( mXShape, ::com::sun::star::uno::UNO_QUERY );
2459 0 : if ( !aXControlShape.is() )
2460 0 : continue;
2461 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >
2462 0 : aXControlModel( aXControlShape->getControl() );
2463 0 : if ( !aXControlModel.is() )
2464 0 : continue;
2465 :
2466 0 : sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
2467 : try
2468 : {
2469 : // try to get the aspect when available
2470 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
2471 0 : xShapeProps( mXShape, ::com::sun::star::uno::UNO_QUERY_THROW );
2472 0 : xShapeProps->getPropertyValue("Aspect") >>= nAspect;
2473 : }
2474 0 : catch( ::com::sun::star::uno::Exception& )
2475 : {}
2476 :
2477 0 : mpExEmbed->WriteUInt32( 0xf | ( EPP_ExControl << 16 ) )
2478 0 : .WriteUInt32( 0 ); // Size of this container
2479 :
2480 0 : sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();
2481 :
2482 0 : sal_uInt32 nPageId = nPageNumber;
2483 0 : if ( ePageType == MASTER )
2484 0 : nPageId |= 0x80000000;
2485 : else
2486 0 : nPageId += 0x100;
2487 0 : mpExEmbed->WriteUInt32( EPP_ExControlAtom << 16 )
2488 0 : .WriteUInt32( 4 )
2489 0 : .WriteUInt32( nPageId );
2490 0 : PPTExOleObjEntry* pEntry = new PPTExOleObjEntry( OCX_CONTROL, mpExEmbed->Tell() );
2491 0 : pEntry->xControlModel = aXControlModel;
2492 0 : pEntry->xShape = mXShape;
2493 0 : maExOleObj.push_back( pEntry );
2494 :
2495 0 : mnExEmbed++;
2496 :
2497 0 : mpExEmbed->WriteUInt32( 1 | ( EPP_ExOleObjAtom << 16 ) )
2498 0 : .WriteUInt32( 24 )
2499 0 : .WriteUInt32( nAspect )
2500 0 : .WriteUInt32( 2 )
2501 0 : .WriteUInt32( mnExEmbed )
2502 0 : .WriteUInt32( 0 )
2503 0 : .WriteUInt32( 4 ) // index to the persist table
2504 0 : .WriteUInt32( 0x0012de00 );
2505 :
2506 0 : ::com::sun::star::awt::Size aSize;
2507 0 : OUString aControlName;
2508 0 : tools::SvRef<SotStorage> xTemp( new SotStorage( new SvMemoryStream(), true ) );
2509 0 : if ( oox::ole::MSConvertOCXControls::WriteOCXStream( mXModel, xTemp, aXControlModel, aSize, aControlName ) )
2510 : {
2511 0 : OUString aUserName( xTemp->GetUserName() );
2512 0 : OUString aOleIdentifier;
2513 0 : if ( !aUserName.isEmpty() )
2514 : {
2515 : tools::SvRef<SotStorageStream> xCompObj = xTemp->OpenSotStream(
2516 : OUString( "\1CompObj" ),
2517 0 : StreamMode::READ | StreamMode::NOCREATE | StreamMode::SHARE_DENYALL );
2518 0 : sal_uInt32 const nStreamLen = xCompObj->remainingSize();
2519 : sal_Int16 nVersion, nByteOrder;
2520 : sal_Int32 nWinVersion, nVal, nStringLen;
2521 0 : xCompObj->ReadInt16( nVersion )
2522 0 : .ReadInt16( nByteOrder )
2523 0 : .ReadInt32( nWinVersion )
2524 0 : .ReadInt32( nVal );
2525 0 : xCompObj->SeekRel( 16 ); // skipping clsid
2526 0 : xCompObj->ReadInt32( nStringLen );
2527 0 : if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
2528 : {
2529 0 : xCompObj->SeekRel( nStringLen ); // now skipping the UserName;
2530 0 : xCompObj->ReadInt32( nStringLen );
2531 0 : if ( ( xCompObj->Tell() + nStringLen ) < nStreamLen )
2532 : {
2533 0 : xCompObj->SeekRel( nStringLen ); // now skipping the clipboard formatname
2534 0 : xCompObj->ReadInt32( nStringLen );
2535 0 : if ( ( nStringLen > 1 ) && ( ( xCompObj->Tell() + nStringLen ) < nStreamLen ) )
2536 : { // i think that the OleIdentifier will follow
2537 0 : OString aTemp = read_uInt8s_ToOString(*xCompObj, nStringLen - 1);
2538 0 : aOleIdentifier = OStringToOUString(aTemp, RTL_TEXTENCODING_MS_1252);
2539 : }
2540 : }
2541 0 : }
2542 : }
2543 :
2544 0 : PPTWriter::WriteCString( *mpExEmbed, aControlName, 1 );
2545 0 : PPTWriter::WriteCString( *mpExEmbed, aOleIdentifier, 2 );
2546 0 : PPTWriter::WriteCString( *mpExEmbed, aUserName, 3 );
2547 : }
2548 0 : nSize = mpExEmbed->Tell() - nOldPos;
2549 0 : mpExEmbed->Seek( nOldPos - 4 );
2550 0 : mpExEmbed->WriteUInt32( nSize );
2551 0 : mpExEmbed->Seek( STREAM_SEEK_TO_END );
2552 0 : nOlePictureId = mnExEmbed;
2553 :
2554 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2555 0 : sal_uInt32 nSpFlags = SHAPEFLAG_HAVESPT | SHAPEFLAG_HAVEANCHOR | SHAPEFLAG_OLESHAPE;
2556 0 : ImplCreateShape( ESCHER_ShpInst_HostControl, nSpFlags, aSolverContainer );
2557 0 : if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "MetaFile" ), false ) )
2558 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
2559 : //export form control graphic
2560 0 : else if ( aPropOpt.CreateBlipPropertiesforOLEControl(mXPropSet,mXShape))
2561 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
2562 0 : aPropOpt.AddOpt( ESCHER_Prop_pictureId, mnExEmbed );
2563 0 : aPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0x10000 );
2564 :
2565 0 : if ( !aControlName.isEmpty() )
2566 : {
2567 : sal_uInt16 i, nBufSize;
2568 0 : nBufSize = ( aControlName.getLength() + 1 ) << 1;
2569 0 : sal_uInt8* pBuf = new sal_uInt8[ nBufSize ];
2570 0 : sal_uInt8* pTmp = pBuf;
2571 0 : for ( i = 0; i < aControlName.getLength(); i++ )
2572 : {
2573 0 : sal_Unicode nUnicode = *(aControlName.getStr() + i);
2574 0 : *pTmp++ = (sal_uInt8)nUnicode;
2575 0 : *pTmp++ = (sal_uInt8)( nUnicode >> 8 );
2576 : }
2577 0 : *pTmp++ = 0;
2578 0 : *pTmp = 0;
2579 0 : aPropOpt.AddOpt( ESCHER_Prop_wzName, true, nBufSize, pBuf, nBufSize );
2580 0 : }
2581 : }
2582 56 : else if ( mType == "drawing.Connector" )
2583 : {
2584 : sal_uInt16 nSpType, nSpFlags;
2585 0 : ::com::sun::star::awt::Rectangle aNewRect;
2586 0 : if ( !aPropOpt.CreateConnectorProperties( mXShape, aSolverContainer, aNewRect, nSpType, nSpFlags ) )
2587 0 : continue;
2588 :
2589 0 : maRect = MapRectangle( aNewRect );
2590 0 : maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2591 0 : maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
2592 :
2593 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2594 0 : ImplCreateShape( nSpType, nSpFlags, aSolverContainer );
2595 :
2596 : // #119459# for connector shape, the start point and end point is fixed, and should not be rotated.
2597 0 : mnAngle = 0;
2598 : }
2599 56 : else if ( mType == "drawing.Measure" )
2600 : {
2601 0 : continue;
2602 : }
2603 56 : else if ( mType == "drawing.Line" )
2604 : {
2605 0 : ::com::sun::star::awt::Rectangle aNewRect;
2606 0 : aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_LINE, false, aNewRect, NULL );
2607 0 : maRect = MapRectangle( aNewRect );
2608 0 : maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2609 0 : maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
2610 0 : if ( ImplGetText() )
2611 : {
2612 0 : aTextRefPoint = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2613 0 : mnTextSize = 0;
2614 0 : bAdditionalText = true;
2615 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
2616 : // mpPptEscherEx->EnterGroup( &maRect,0 );
2617 : }
2618 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2619 0 : sal_uInt32 nFlags = 0xa00; // Flags: Connector | HasSpt
2620 0 : if ( maRect.Top() > maRect.Bottom() )
2621 0 : nFlags |= 0x80; // Flags: VertMirror
2622 0 : if ( maRect.Left() > maRect.Right() )
2623 0 : nFlags |= 0x40; // Flags: HorzMirror
2624 :
2625 0 : ImplCreateShape( ESCHER_ShpInst_Line, nFlags, aSolverContainer );
2626 0 : aPropOpt.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
2627 0 : aPropOpt.CreateLineProperties( mXPropSet, false );
2628 0 : mnAngle = 0;
2629 : }
2630 56 : else if ( bPolyPolygon )
2631 : {
2632 0 : if ( ImplGetText() )
2633 : {
2634 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
2635 : // mpPptEscherEx->EnterGroup( 0,0 );
2636 : // nGroupLevel = mpPptEscherEx->GetGroupLevel();
2637 0 : bAdditionalText = true;
2638 0 : mnTextSize = 0;
2639 : }
2640 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2641 0 : ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2642 0 : ::com::sun::star::awt::Rectangle aNewRect;
2643 0 : aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, false, aNewRect, NULL );
2644 0 : maRect = MapRectangle( aNewRect );
2645 0 : maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2646 0 : maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
2647 0 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2648 0 : mnAngle = 0;
2649 : }
2650 56 : else if ( bPolyLine )
2651 : {
2652 0 : if ( ImplGetText() )
2653 : {
2654 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
2655 : // mpPptEscherEx->EnterGroup( 0,0 );
2656 : // nGroupLevel = mpPptEscherEx->GetGroupLevel();
2657 0 : bAdditionalText = true;
2658 0 : mnTextSize = 0;
2659 : }
2660 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2661 0 : ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2662 0 : ::com::sun::star::awt::Rectangle aNewRect;
2663 0 : aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, false, aNewRect, NULL );
2664 0 : maRect = MapRectangle( aNewRect );
2665 0 : maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2666 0 : maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
2667 0 : aPropOpt.CreateLineProperties( mXPropSet, false );
2668 0 : mnAngle = 0;
2669 : }
2670 56 : else if ( bOpenBezier )
2671 : {
2672 0 : if ( ImplGetText() )
2673 : {
2674 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
2675 : // mpPptEscherEx->EnterGroup( 0,0 );
2676 : // nGroupLevel = mpPptEscherEx->GetGroupLevel();
2677 0 : bAdditionalText = true;
2678 0 : mnTextSize = 0;
2679 : }
2680 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2681 0 : ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2682 0 : ::com::sun::star::awt::Rectangle aNewRect;
2683 0 : aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYLINE, true, aNewRect, NULL );
2684 0 : maRect = MapRectangle( aNewRect );
2685 0 : maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2686 0 : maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
2687 0 : aPropOpt.CreateLineProperties( mXPropSet, false );
2688 0 : mnAngle = 0;
2689 : }
2690 56 : else if ( bClosedBezier )
2691 : {
2692 0 : if ( ImplGetText() )
2693 : {
2694 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
2695 : // mpPptEscherEx->EnterGroup( 0,0 );
2696 : // nGroupLevel = mpPptEscherEx->GetGroupLevel();
2697 0 : bAdditionalText = true;
2698 0 : mnTextSize = 0;
2699 : }
2700 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2701 0 : ImplCreateShape( ESCHER_ShpInst_NotPrimitive, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2702 0 : ::com::sun::star::awt::Rectangle aNewRect;
2703 0 : aPropOpt.CreatePolygonProperties( mXPropSet, ESCHER_CREATEPOLYGON_POLYPOLYGON, true, aNewRect, NULL );
2704 0 : maRect = MapRectangle( aNewRect );
2705 0 : maPosition = ::com::sun::star::awt::Point( maRect.Left(), maRect.Top() );
2706 0 : maSize = ::com::sun::star::awt::Size( maRect.GetWidth(), maRect.GetHeight() );
2707 0 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2708 0 : mnAngle = 0;
2709 : }
2710 56 : else if ( ( mType == "drawing.GraphicObject" ) || ( mType == "presentation.GraphicObject" ) )
2711 : {
2712 5 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2713 :
2714 : // a GraphicObject can also be a ClickMe element
2715 5 : if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
2716 : {
2717 0 : nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
2718 0 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer ); // Flags: HaveAnchor | HaveMaster
2719 0 : aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
2720 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
2721 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
2722 0 : aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
2723 : }
2724 : else
2725 : {
2726 10 : mXText = ::com::sun::star::uno::Reference<
2727 : ::com::sun::star::text::XSimpleText >
2728 5 : ( mXShape, ::com::sun::star::uno::UNO_QUERY );
2729 :
2730 5 : if ( mXText.is() )
2731 5 : mnTextSize = mXText->getString().getLength();
2732 :
2733 5 : if ( mnTextSize ) // graphic object or area fill
2734 : {
2735 : /* SJ #i34951#: because M. documents are not allowing GraphicObjects containing text, we
2736 : have to create a simple Rectangle with fill bitmap instead (while not allowing BitmapMode_Repeat).
2737 : */
2738 0 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa00, aSolverContainer ); // Flags: Connector | HasSpt
2739 0 : if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "GraphicURL" ), true, true, false ) )
2740 : {
2741 0 : aPropOpt.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapNone );
2742 0 : aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
2743 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 );
2744 0 : aPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0x8000000 );
2745 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
2746 0 : if ( ImplGetText() )
2747 0 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, false );
2748 : }
2749 : }
2750 : else
2751 : {
2752 5 : ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
2753 :
2754 5 : if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "GraphicURL" ), false, true ) )
2755 : {
2756 4 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
2757 : }
2758 : }
2759 : }
2760 : }
2761 51 : else if ( ( mType == "drawing.Text" ) || ( mType == "presentation.Notes" ) )
2762 : {
2763 8 : if ( ( ePageType == NOTICE ) && mbPresObj )
2764 : {
2765 8 : if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE ) )
2766 3 : continue;
2767 : else
2768 5 : nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESBODY;
2769 : }
2770 5 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
2771 : }
2772 43 : else if ( mType == "presentation.TitleText" )
2773 : {
2774 8 : if ( mbPresObj )
2775 : {
2776 8 : if ( ( ePageType == NOTICE ) && mbEmptyPresObj )
2777 : {
2778 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2779 0 : nPlaceHolderAtom = EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE;
2780 0 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x200, aSolverContainer );
2781 0 : aPropOpt.CreateLineProperties( mXPropSet, false );
2782 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
2783 : }
2784 8 : else if ( rLayout.bTitlePossible && bIsTitlePossible )
2785 : {
2786 8 : bIsTitlePossible = false;
2787 :
2788 8 : ImplGetText();
2789 8 : TextObjBinary aTextObj( mXText, EPP_TEXTTYPE_Title, maFontCollection, (PPTExBulletProvider&)*this );
2790 8 : if ( ePageType == MASTER )
2791 : {
2792 3 : if ( mnTextSize )
2793 : {
2794 3 : OUString aUString( mXText->getString() );
2795 : sal_uInt16 nChar;
2796 :
2797 3 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2798 3 : mnShapeMasterTitle = mpPptEscherEx->GenerateShapeId();
2799 3 : mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, mnShapeMasterTitle );// Flags: HaveAnchor | HasSpt
2800 6 : EscherPropertyContainer aPropertyOptions;
2801 3 : aPropertyOptions.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
2802 3 : aPropertyOptions.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
2803 3 : aPropertyOptions.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
2804 3 : aPropertyOptions.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
2805 3 : aPropertyOptions.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
2806 3 : aPropertyOptions.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
2807 3 : aPropertyOptions.CreateFillProperties( mXPropSet, true, mXShape );
2808 3 : sal_uInt32 nLineFlags = 0x90001;
2809 3 : if ( aPropertyOptions.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
2810 3 : nLineFlags |= 0x10001; // draw dashed line if no line
2811 3 : aPropertyOptions.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
2812 3 : aPropertyOptions.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
2813 3 : ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
2814 3 : aPropertyOptions.Commit( *mpStrm );
2815 3 : mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
2816 3 : mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() ); // top, left, right, bottom ????
2817 3 : mpPptEscherEx->OpenContainer( ESCHER_ClientData );
2818 3 : mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
2819 3 : mpStrm->WriteUInt32( 0 ) // PlacementID
2820 3 : .WriteUChar( EPP_PLACEHOLDER_MASTERTITLE ) // PlaceHolderID
2821 3 : .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
2822 3 : .WriteUInt16( 0 ); // padword
2823 3 : mpPptEscherEx->CloseContainer(); // ESCHER_ClientData
2824 3 : mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox );
2825 3 : mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
2826 3 : mpStrm->WriteUInt32( EPP_TEXTTYPE_Title );
2827 3 : mpPptEscherEx->AddAtom( mnTextSize << 1, EPP_TextCharsAtom );
2828 3 : const sal_Unicode* pString = aUString.getStr();
2829 108 : for ( sal_uInt32 i = 0; i < mnTextSize; i++ )
2830 : {
2831 105 : nChar = pString[ i ]; // 0xa -> 0xb soft newline
2832 105 : if ( nChar == 0xa )
2833 0 : nChar++; // 0xd -> 0xd hard newline
2834 105 : mpStrm->WriteUInt16( nChar );
2835 : }
2836 3 : mpPptEscherEx->AddAtom( 6, EPP_BaseTextPropAtom );
2837 3 : mpStrm->WriteUInt32( mnTextSize + 1 ).WriteUInt16( 0 );
2838 3 : mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
2839 3 : mpStrm->WriteUInt32( mnTextSize + 1 ).WriteUInt32( 1 ).WriteUInt16( 0 );
2840 3 : mpPptEscherEx->CloseContainer(); // ESCHER_ClientTextBox
2841 6 : mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
2842 : }
2843 3 : continue;
2844 : }
2845 : else
2846 : {
2847 5 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2848 5 : mnTextStyle = EPP_TEXTSTYLE_TITLE;
2849 5 : nPlaceHolderAtom = rLayout.nTypeOfTitle;
2850 5 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer ); // Flags: HaveAnchor | HaveMaster
2851 5 : aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterTitle );
2852 5 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2853 5 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
2854 5 : ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
2855 5 : if ( mbEmptyPresObj )
2856 : {
2857 5 : sal_uInt32 nNoLineDrawDash = 0;
2858 5 : aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
2859 5 : nNoLineDrawDash |= 0x10001;
2860 5 : aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
2861 : }
2862 5 : }
2863 : }
2864 : else
2865 0 : mbPresObj = false;
2866 : }
2867 5 : if ( !mbPresObj )
2868 : {
2869 0 : mType = "drawing.Text";
2870 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
2871 : }
2872 : }
2873 35 : else if ( ( mType == "presentation.Outliner" ) || ( mType == "presentation.Subtitle" ) )
2874 : {
2875 6 : if ( mbPresObj )
2876 : {
2877 6 : nOutlinerCount++;
2878 6 : if ( (rLayout.bOutlinerPossible && ( nOutlinerCount == 1 )) ||
2879 0 : (( rLayout.bSecOutlinerPossible && ( nOutlinerCount == 2 ) ) && ( nPrevTextStyle == EPP_TEXTSTYLE_BODY ))
2880 : )
2881 : {
2882 6 : ImplGetText();
2883 6 : TextObjBinary aTextObj( mXText, EPP_TEXTTYPE_Body, maFontCollection, (PPTExBulletProvider&)*this );
2884 6 : if ( ePageType == MASTER )
2885 : {
2886 3 : nPrevTextStyle = EPP_TEXTSTYLE_TITLE;
2887 3 : if ( mnTextSize )
2888 : {
2889 3 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2890 3 : mnShapeMasterBody = mpPptEscherEx->GenerateShapeId();
2891 3 : mpPptEscherEx->AddShape( ESCHER_ShpInst_Rectangle, 0xa00, mnShapeMasterBody ); // Flags: HaveAnchor | HasSpt
2892 3 : EscherPropertyContainer aPropOpt2;
2893 3 : aPropOpt2.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x50001 );
2894 3 : aPropOpt2.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
2895 3 : aPropOpt2.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x110001 );
2896 3 : aPropOpt2.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
2897 3 : aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90001 );
2898 3 : aPropOpt2.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
2899 3 : aPropOpt2.CreateFillProperties( mXPropSet, true, mXShape );
2900 3 : sal_uInt32 nLineFlags = 0x90001;
2901 3 : if ( aPropOpt2.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags ) )
2902 3 : nLineFlags |= 0x10001; // draw dashed line if no line
2903 3 : aPropOpt2.AddOpt( ESCHER_Prop_fNoLineDrawDash, nLineFlags );
2904 3 : aPropOpt2.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
2905 3 : ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt2 );
2906 3 : aPropOpt2.Commit( *mpStrm );
2907 3 : mpPptEscherEx->AddAtom( 8, ESCHER_ClientAnchor );
2908 3 : mpStrm->WriteInt16( maRect.Top() ).WriteInt16( maRect.Left() ).WriteInt16( maRect.Right() ).WriteInt16( maRect.Bottom() ); // top, left, right, bottom ????
2909 3 : mpPptEscherEx->OpenContainer( ESCHER_ClientData );
2910 3 : mpPptEscherEx->AddAtom( 8, EPP_OEPlaceholderAtom );
2911 3 : sal_uInt8 PlaceHolderID = ( mType == "presentation.Subtitle") ? EPP_PLACEHOLDER_MASTERSUBTITLE:EPP_PLACEHOLDER_MASTERBODY;
2912 3 : mpStrm->WriteUInt32( 1 ) // PlacementID
2913 6 : .WriteUChar( PlaceHolderID )/*(sal_uInt8)EPP_PLACEHOLDER_MASTERBODY */ // PlaceHolderID
2914 3 : .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
2915 3 : .WriteUInt16( 0 ); // padword
2916 3 : mpPptEscherEx->CloseContainer(); // ESCHER_ClientData
2917 3 : mpPptEscherEx->OpenContainer( ESCHER_ClientTextbox ); // printf
2918 3 : mpPptEscherEx->AddAtom( 4, EPP_TextHeaderAtom );
2919 3 : if ( mType == "presentation.Subtitle")
2920 0 : mpStrm->WriteUInt32( EPP_TEXTTYPE_CenterBody );
2921 : else
2922 3 : mpStrm->WriteUInt32( EPP_TEXTTYPE_Body );
2923 3 : mnTextSize = aTextObj.Count();
2924 3 : aTextObj.Write( mpStrm );
2925 3 : mpPptEscherEx->BeginAtom();
2926 24 : for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount() ; ++i )
2927 : {
2928 21 : ParagraphObj* pPara = aTextObj.GetParagraph(i);
2929 21 : sal_uInt32 nCharCount = pPara->CharacterCount();
2930 21 : sal_uInt16 nDepth = pPara->nDepth;
2931 21 : if ( nDepth > 4)
2932 0 : nDepth = 4;
2933 :
2934 21 : mpStrm->WriteUInt32( nCharCount )
2935 42 : .WriteUInt16( nDepth );
2936 : }
2937 3 : mpPptEscherEx->EndAtom( EPP_BaseTextPropAtom );
2938 3 : mpPptEscherEx->AddAtom( 10, EPP_TextSpecInfoAtom );
2939 3 : mpStrm->WriteUInt32( mnTextSize ).WriteUInt32( 1 ).WriteUInt16( 0 );
2940 :
2941 3 : mpPptEscherEx->CloseContainer(); // ESCHER_ClientTextBox
2942 3 : mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
2943 : }
2944 3 : continue;
2945 : }
2946 : else
2947 : {
2948 3 : mnTextStyle = EPP_TEXTSTYLE_BODY;
2949 3 : nPlaceHolderAtom = rLayout.nTypeOfOutliner;
2950 3 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
2951 3 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer ); // Flags: HaveAnchor | HaveMaster
2952 3 : aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
2953 3 : aPropOpt.CreateFillProperties( mXPropSet, true, mXShape );
2954 3 : aPropOpt.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
2955 3 : ImplAdjustFirstLineLineSpacing( aTextObj, aPropOpt );
2956 3 : if ( mbEmptyPresObj )
2957 : {
2958 3 : sal_uInt32 nNoLineDrawDash = 0;
2959 3 : aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
2960 3 : nNoLineDrawDash |= 0x10001;
2961 3 : aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, nNoLineDrawDash );
2962 : }
2963 3 : }
2964 : }
2965 : else
2966 0 : mbPresObj = false;
2967 : }
2968 3 : if ( !mbPresObj )
2969 : {
2970 0 : if (ePageType == MASTER )
2971 : {
2972 0 : SdrObject* pObj = GetSdrObjectFromXShape( mXShape );
2973 0 : if (pObj && pObj->IsNotVisibleAsMaster())
2974 0 : continue;
2975 : }
2976 :
2977 0 : mType = "drawing.Text";
2978 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
2979 : }
2980 : }
2981 29 : else if ( ( mType == "drawing.Page" ) || ( mType == "presentation.Page" ) )
2982 : {
2983 8 : if ( ( ePageType == NOTICE ) && mbPresObj )
2984 : {
2985 8 : if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Notes, EPP_PLACEHOLDER_MASTERNOTESSLIDEIMAGE ) )
2986 3 : continue;
2987 : else
2988 5 : nPlaceHolderAtom = EPP_PLACEHOLDER_NOTESSLIDEIMAGE;
2989 : }
2990 5 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
2991 : }
2992 21 : else if ( mType == "drawing.Frame" )
2993 : {
2994 0 : continue;
2995 : }
2996 63 : else if ( ( mType == "drawing.OLE2" ) || ( mType == "presentation.OLE2" )
2997 21 : || ( mType == "presentation.Chart" ) || ( mType == "presentation.Calc" )
2998 42 : || ( mType == "presentation.OrgChart" ) )
2999 : {
3000 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
3001 0 : if ( mbEmptyPresObj && ( ePageType == NORMAL ) )
3002 : {
3003 0 : nPlaceHolderAtom = rLayout.nUsedObjectPlaceHolder;
3004 0 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0x220, aSolverContainer ); // Flags: HaveAnchor | HaveMaster
3005 0 : aPropOpt.AddOpt( ESCHER_Prop_lTxid, mnTxId += 0x60 );
3006 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x10001 );
3007 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x10001 );
3008 0 : aPropOpt.AddOpt( ESCHER_Prop_hspMaster, mnShapeMasterBody );
3009 : }
3010 : else
3011 : {
3012 0 : mpExEmbed->WriteUInt32( 0xf | ( EPP_ExEmbed << 16 ) )
3013 0 : .WriteUInt32( 0 ); // Size of this container
3014 :
3015 0 : sal_uInt32 nSize, nOldPos = mpExEmbed->Tell();
3016 :
3017 0 : mpExEmbed->WriteUInt32( EPP_ExEmbedAtom << 16 )
3018 0 : .WriteUInt32( 8 )
3019 0 : .WriteUInt32( 0 ) // follow colorscheme : 0->do not follow
3020 : // 1->follow collorscheme
3021 : // 2->follow text and background scheme
3022 0 : .WriteUChar( 1 ) // (bool)set if embedded server can not be locked
3023 0 : .WriteUChar( 0 ) // (bool)do not need to send dimension
3024 0 : .WriteUChar( 0 ) // (bool)is object a world table
3025 0 : .WriteUChar( 0 ); // pad byte
3026 :
3027 0 : PPTExOleObjEntry* pE = new PPTExOleObjEntry( NORMAL_OLE_OBJECT, mpExEmbed->Tell() );
3028 0 : pE->xShape = mXShape;
3029 0 : maExOleObj.push_back( pE );
3030 :
3031 0 : mnExEmbed++;
3032 :
3033 0 : sal_Int64 nAspect = ::com::sun::star::embed::Aspects::MSOLE_CONTENT;
3034 : try
3035 : {
3036 : // try to get the aspect when available
3037 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >
3038 0 : xShapeProps( mXShape, ::com::sun::star::uno::UNO_QUERY_THROW );
3039 0 : xShapeProps->getPropertyValue("Aspect") >>= nAspect;
3040 : }
3041 0 : catch( ::com::sun::star::uno::Exception& )
3042 : {}
3043 :
3044 0 : mpExEmbed->WriteUInt32( 1 | ( EPP_ExOleObjAtom << 16 ) )
3045 0 : .WriteUInt32( 24 )
3046 0 : .WriteUInt32( nAspect ) // Aspect
3047 0 : .WriteUInt32( 0 )
3048 0 : .WriteUInt32( mnExEmbed ) // index to the persist table
3049 0 : .WriteUInt32( 0 ) // subtype
3050 0 : .WriteUInt32( 0 )
3051 0 : .WriteUInt32( 0x0012b600 );
3052 :
3053 0 : nSize = mpExEmbed->Tell() - nOldPos;
3054 0 : mpExEmbed->Seek( nOldPos - 4 );
3055 0 : mpExEmbed->WriteUInt32( nSize );
3056 0 : mpExEmbed->Seek( STREAM_SEEK_TO_END );
3057 0 : nOlePictureId = mnExEmbed;
3058 :
3059 0 : sal_uInt32 nSpFlags = 0xa00;
3060 0 : if ( nOlePictureId )
3061 0 : nSpFlags |= 0x10;
3062 0 : ImplCreateShape( ESCHER_ShpInst_PictureFrame, nSpFlags, aSolverContainer );
3063 0 : if ( aPropOpt.CreateOLEGraphicProperties( mXShape ) )
3064 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
3065 0 : if ( nOlePictureId )
3066 0 : aPropOpt.AddOpt( ESCHER_Prop_pictureId, nOlePictureId );
3067 : }
3068 : }
3069 21 : else if ( mType == "presentation.Header" )
3070 : {
3071 3 : if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERHEADER ) )
3072 3 : continue;
3073 : else
3074 : {
3075 0 : mbPresObj = false;
3076 0 : mType = "drawing.Text";
3077 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
3078 : }
3079 : }
3080 18 : else if ( mType == "presentation.Footer" )
3081 : {
3082 6 : if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERFOOTER ) )
3083 6 : continue;
3084 : else
3085 : {
3086 0 : mbPresObj = false;
3087 0 : mType = "drawing.Text";
3088 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
3089 : }
3090 : }
3091 12 : else if ( mType == "presentation.DateTime" )
3092 : {
3093 6 : if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERDATE ) )
3094 6 : continue;
3095 : else
3096 : {
3097 0 : mbPresObj = false;
3098 0 : mType = "drawing.Text";
3099 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
3100 : }
3101 : }
3102 6 : else if ( mType == "presentation.SlideNumber" )
3103 : {
3104 6 : if ( ImplCreatePresentationPlaceholder( bMasterPage, ePageType, EPP_TEXTTYPE_Other, EPP_PLACEHOLDER_MASTERSLIDENUMBER ) )
3105 6 : continue;
3106 : else
3107 : {
3108 0 : mbPresObj = false;
3109 0 : mType = "drawing.Text";
3110 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, true );
3111 : }
3112 : }
3113 0 : else if ( (mType.getLength() > 9) && (mType[8] == '3') && (mType[9] == 'D') ) // drawing.3D
3114 : {
3115 : // SceneObject, CubeObject, SphereObject, LatheObject, ExtrudeObject, PolygonObject
3116 0 : if ( !ImplGetPropertyValue( OUString( "Bitmap" ) ) )
3117 0 : continue;
3118 :
3119 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
3120 0 : ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
3121 :
3122 0 : if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "Bitmap" ), false ) )
3123 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
3124 : }
3125 0 : else if ( mType == "drawing.Media" )
3126 : {
3127 0 : mnAngle = 0;
3128 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
3129 0 : ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
3130 0 : if ( aPropOpt.CreateMediaGraphicProperties( mXShape ) )
3131 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
3132 0 : ::com::sun::star::uno::Any aAny;
3133 0 : if ( PropValue::GetPropertyValue( aAny, mXPropSet, OUString( "MediaURL" ), true ) )
3134 : {
3135 0 : OUString aMediaURL;
3136 0 : if ( (aAny >>= aMediaURL ) && !aMediaURL.isEmpty() )
3137 : {
3138 : // SJ: creating the Media RefObj
3139 0 : sal_uInt32 nRefId = ++mnExEmbed;
3140 :
3141 0 : mpExEmbed->WriteUInt16( 0xf )
3142 0 : .WriteUInt16( EPP_ExMCIMovie ) // PPT_PST_ExAviMovie
3143 0 : .WriteUInt32( 0 );
3144 0 : sal_uInt32 nSize, nStart = mpExEmbed->Tell();
3145 0 : mpExEmbed->WriteUInt16( 0 )
3146 0 : .WriteUInt16( EPP_ExObjRefAtom )
3147 0 : .WriteUInt32( 4 )
3148 0 : .WriteUInt32( nRefId );
3149 0 : mpExEmbed->WriteUInt16( 0xf )
3150 0 : .WriteUInt16( EPP_ExVideo )
3151 0 : .WriteUInt32( 0 );
3152 :
3153 0 : mpExEmbed->WriteUInt16( 0 )
3154 0 : .WriteUInt16( EPP_ExMediaAtom )
3155 0 : .WriteUInt32( 8 )
3156 0 : .WriteUInt32( nRefId )
3157 0 : .WriteUInt16( 0 )
3158 0 : .WriteUInt16( 0x435 );
3159 :
3160 0 : sal_uInt16 i, nStringLen = (sal_uInt16)aMediaURL.getLength();
3161 0 : mpExEmbed->WriteUInt32( EPP_CString << 16 ).WriteUInt32( nStringLen * 2 );
3162 0 : for ( i = 0; i < nStringLen; i++ )
3163 : {
3164 0 : sal_Unicode nChar = aMediaURL[ i ];
3165 0 : mpExEmbed->WriteUInt16( nChar );
3166 : }
3167 0 : nSize = mpExEmbed->Tell() - nStart;
3168 0 : mpExEmbed->SeekRel( - ( (sal_Int32)nSize + 4 ) );
3169 0 : mpExEmbed->WriteUInt32( nSize ); // size of PPT_PST_ExMCIMovie
3170 0 : mpExEmbed->SeekRel( 0x10 );
3171 0 : nSize -= 20;
3172 0 : mpExEmbed->WriteUInt32( nSize ); // PPT_PST_ExMediaAtom
3173 0 : mpExEmbed->SeekRel( nSize );
3174 :
3175 0 : if ( !pClientData )
3176 0 : pClientData = new SvMemoryStream( 0x200, 0x200 );
3177 0 : pClientData->WriteUInt16( 0 )
3178 0 : .WriteUInt16( EPP_ExObjRefAtom )
3179 0 : .WriteUInt32( 4 )
3180 0 : .WriteUInt32( nRefId );
3181 : // write EPP_InteractiveInfo container for no_action
3182 0 : pClientData->WriteUInt32( ( EPP_InteractiveInfo << 16 ) | 0xf ).WriteUInt32( 24 );
3183 0 : pClientData->WriteUInt16( 0 )
3184 0 : .WriteUInt16( EPP_InteractiveInfoAtom )
3185 0 : .WriteUInt32( 16 )
3186 0 : .WriteUInt32( 0 )
3187 0 : .WriteUInt32( 0 )
3188 0 : .WriteUChar( 6 )
3189 0 : .WriteUChar( 0 )
3190 0 : .WriteUChar( 0 )
3191 0 : .WriteUChar( 0 )
3192 0 : .WriteUInt32( 0 );
3193 0 : }
3194 0 : }
3195 : }
3196 0 : else if ( (mType == "drawing.Table") || (mType == "presentation.Table") )
3197 : {
3198 0 : SvMemoryStream* pTmp = NULL;
3199 0 : if ( bEffect && !mbUseNewAnimations )
3200 : {
3201 0 : pTmp = new SvMemoryStream( 0x200, 0x200 );
3202 0 : ImplWriteObjectEffect( *pTmp, eAe, eTe, ++nEffectCount );
3203 : }
3204 0 : if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
3205 : {
3206 0 : if ( !pTmp )
3207 0 : pTmp = new SvMemoryStream( 0x200, 0x200 );
3208 0 : ImplWriteClickAction( *pTmp, eCa, bMediaClickAction );
3209 : }
3210 0 : ImplCreateTable( mXShape, aSolverContainer, aPropOpt );
3211 0 : continue;
3212 : }
3213 0 : else if ( mType == "drawing.dontknow" )
3214 : {
3215 0 : mnAngle = 0;
3216 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
3217 0 : ImplCreateShape( ESCHER_ShpInst_PictureFrame, 0xa00, aSolverContainer );
3218 0 : if ( aPropOpt.CreateGraphicProperties( mXPropSet, OUString( "MetaFile" ), false ) )
3219 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
3220 : }
3221 : else
3222 : {
3223 0 : continue;
3224 : }
3225 :
3226 23 : bool bClientData = ( bEffect || ( eCa != ::com::sun::star::presentation::ClickAction_NONE ) ||
3227 28 : nPlaceHolderAtom || nOlePictureId );
3228 23 : if ( bClientData )
3229 : {
3230 18 : if ( nPlaceHolderAtom )
3231 : {
3232 18 : sal_Int32 nPlacementID = -1;
3233 18 : if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
3234 8 : nPlacementID = nIndices++;
3235 : else
3236 : {
3237 10 : switch ( nPlaceHolderAtom )
3238 : {
3239 : default :
3240 : {
3241 0 : if ( nPlaceHolderAtom < 19 )
3242 0 : break;
3243 : }
3244 : case EPP_PLACEHOLDER_NOTESBODY :
3245 : case EPP_PLACEHOLDER_MASTERDATE :
3246 : case EPP_PLACEHOLDER_NOTESSLIDEIMAGE :
3247 : case EPP_PLACEHOLDER_MASTERNOTESBODYIMAGE :
3248 10 : nPlacementID = nIndices++;
3249 : }
3250 : }
3251 18 : if ( !pClientData )
3252 18 : pClientData = new SvMemoryStream( 0x200, 0x200 );
3253 :
3254 18 : pClientData->WriteUInt32( EPP_OEPlaceholderAtom << 16 ).WriteUInt32( 8 )
3255 18 : .WriteInt32( nPlacementID ) // PlacementID
3256 36 : .WriteUChar( nPlaceHolderAtom ) // PlaceHolderID
3257 18 : .WriteUChar( 0 ) // Size of PlaceHolder ( 0 = FULL, 1 = HALF, 2 = QUARTER )
3258 18 : .WriteUInt16( 0 ); // padword
3259 : }
3260 18 : if ( nOlePictureId )
3261 : {
3262 0 : if ( !pClientData )
3263 0 : pClientData = new SvMemoryStream( 0x200, 0x200 );
3264 :
3265 0 : pClientData->WriteUInt32( EPP_ExObjRefAtom << 16 ).WriteUInt32( 4 )
3266 0 : .WriteUInt32( nOlePictureId );
3267 0 : nOlePictureId = 0;
3268 : }
3269 18 : if ( bEffect )
3270 : {
3271 0 : if ( !pClientData )
3272 0 : pClientData = new SvMemoryStream( 0x200, 0x200 );
3273 :
3274 : // check if it is sensible to replace the object effect with text effect,
3275 : // because in Impress there is the possibility to use a compound effect,
3276 : // e.g. the object effect is an AnimationEffect_FADE_FROM_LEFT and the
3277 : // text effect is a AnimationEffect_FADE_FROM_TOP, in PowerPoint there
3278 : // can be used only one effect
3279 0 : if ( mnTextSize && ( eTe != ::com::sun::star::presentation::AnimationEffect_NONE )
3280 0 : && ( eAe != ::com::sun::star::presentation::AnimationEffect_NONE )
3281 0 : && ( eTe != eAe ) )
3282 : {
3283 : sal_uInt32 nFillStyleFlags, nLineStyleFlags;
3284 0 : if ( aPropOpt.GetOpt( ESCHER_Prop_fNoFillHitTest, nFillStyleFlags )
3285 0 : && aPropOpt.GetOpt( ESCHER_Prop_fNoLineDrawDash, nLineStyleFlags ) )
3286 : {
3287 : // there is no fillstyle and also no linestyle
3288 0 : if ( ! ( ( nFillStyleFlags & 0x10 ) + ( nLineStyleFlags & 9 ) ) )
3289 0 : eAe = eTe;
3290 : }
3291 : }
3292 0 : if ( !mbUseNewAnimations )
3293 0 : ImplWriteObjectEffect( *pClientData, eAe, eTe, ++nEffectCount );
3294 : }
3295 :
3296 18 : if ( eCa != ::com::sun::star::presentation::ClickAction_NONE )
3297 : {
3298 0 : if ( !pClientData )
3299 0 : pClientData = new SvMemoryStream( 0x200, 0x200 );
3300 0 : ImplWriteClickAction( *pClientData, eCa, bMediaClickAction );
3301 : }
3302 : }
3303 23 : if ( ( mnTextStyle == EPP_TEXTSTYLE_TITLE ) || ( mnTextStyle == EPP_TEXTSTYLE_BODY ) )
3304 : {
3305 8 : if ( !pClientTextBox )
3306 8 : pClientTextBox = new SvMemoryStream( 0x200, 0x200 );
3307 :
3308 8 : if ( !mbEmptyPresObj )
3309 : {
3310 0 : if ( ( ePageType == NORMAL ) && !bMasterPage )
3311 : {
3312 0 : sal_uInt32 nTextType = EPP_TEXTTYPE_Body;
3313 0 : if ( mnTextStyle == EPP_TEXTSTYLE_BODY )
3314 : {
3315 0 : if ( bSecOutl )
3316 0 : nTextType = EPP_TEXTTYPE_HalfBody;
3317 0 : else if ( mType == "presentation.Subtitle" )
3318 0 : nTextType = EPP_TEXTTYPE_CenterBody;
3319 0 : bSecOutl = true;
3320 : }
3321 : else
3322 0 : nTextType = EPP_TEXTTYPE_Title;
3323 :
3324 0 : TextRuleEntry aTextRule( nPageNumber );
3325 0 : SvMemoryStream aExtBu( 0x200, 0x200 );
3326 0 : ImplGetText();
3327 0 : ImplWriteTextStyleAtom( *pClientTextBox, nTextType, nPObjects, &aTextRule, aExtBu, NULL );
3328 0 : ImplWriteExtParaHeader( aExtBu, nPObjects++, nTextType, nPageNumber + 0x100 );
3329 0 : SvMemoryStream* pOut = aTextRule.pOut;
3330 0 : if ( pOut )
3331 : {
3332 0 : pClientTextBox->Write( pOut->GetData(), pOut->Tell() );
3333 0 : delete pOut, aTextRule.pOut = NULL;
3334 : }
3335 0 : if ( aExtBu.Tell() )
3336 : {
3337 0 : if ( !pClientData )
3338 0 : pClientData = new SvMemoryStream( 0x200, 0x200 );
3339 0 : ImplProgTagContainer( pClientData, &aExtBu );
3340 0 : }
3341 : }
3342 8 : }
3343 : }
3344 : else
3345 : {
3346 15 : if ( !aPropOpt.IsFontWork() )
3347 : {
3348 15 : if ( mnTextSize || ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
3349 : {
3350 : int nInstance2;
3351 5 : if ( ( nPlaceHolderAtom == EPP_PLACEHOLDER_MASTERDATE ) || ( nPlaceHolderAtom == EPP_PLACEHOLDER_NOTESBODY ) )
3352 5 : nInstance2 = 2;
3353 : else
3354 0 : nInstance2 = EPP_TEXTTYPE_Other; // Text in a Shape
3355 :
3356 5 : if ( !pClientTextBox )
3357 5 : pClientTextBox = new SvMemoryStream( 0x200, 0x200 );
3358 :
3359 5 : SvMemoryStream aExtBu( 0x200, 0x200 );
3360 5 : ImplWriteTextStyleAtom( *pClientTextBox, nInstance2, 0, NULL, aExtBu, &aPropOpt );
3361 5 : if ( aExtBu.Tell() )
3362 : {
3363 0 : if ( !pClientData )
3364 0 : pClientData = new SvMemoryStream( 0x200, 0x200 );
3365 0 : ImplProgTagContainer( pClientData, &aExtBu );
3366 5 : }
3367 : }
3368 10 : else if ( nPlaceHolderAtom >= 19 )
3369 : {
3370 0 : if ( !pClientTextBox )
3371 0 : pClientTextBox = new SvMemoryStream( 12 );
3372 :
3373 0 : pClientTextBox->WriteUInt32( EPP_TextHeaderAtom << 16 ).WriteUInt32( 4 )
3374 0 : .WriteUInt32( 7 );
3375 : }
3376 : }
3377 : }
3378 :
3379 23 : aPropOpt.CreateShadowProperties( mXPropSet );
3380 23 : maRect.Justify();
3381 23 : if ( mnAngle )
3382 0 : ImplFlipBoundingBox( aPropOpt );
3383 23 : aPropOpt.CreateShapeProperties( mXShape );
3384 23 : aPropOpt.Commit( *mpStrm );
3385 23 : if ( GetCurrentGroupLevel() > 0 )
3386 0 : mpPptEscherEx->AddChildAnchor( maRect );
3387 : else
3388 23 : mpPptEscherEx->AddClientAnchor( maRect );
3389 :
3390 23 : if ( pClientData )
3391 : {
3392 18 : mpStrm->WriteUInt32( ( ESCHER_ClientData << 16 ) | 0xf )
3393 36 : .WriteUInt32( pClientData->Tell() );
3394 :
3395 18 : mpStrm->Write( pClientData->GetData(), pClientData->Tell() );
3396 18 : delete pClientData, pClientData = NULL;
3397 : }
3398 23 : if ( pClientTextBox )
3399 : {
3400 13 : mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
3401 26 : .WriteUInt32( pClientTextBox->Tell() );
3402 :
3403 13 : mpStrm->Write( pClientTextBox->GetData(), pClientTextBox->Tell() );
3404 13 : delete pClientTextBox, pClientTextBox = NULL;
3405 : }
3406 23 : mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
3407 : }
3408 23 : nPrevTextStyle = mnTextStyle;
3409 :
3410 23 : if ( bAdditionalText )
3411 : {
3412 0 : bAdditionalText = false;
3413 :
3414 0 : ::com::sun::star::uno::Any aAny;
3415 0 : EscherPropertyContainer aPropOpt;
3416 : mnAngle = ( PropValue::GetPropertyValue( aAny,
3417 0 : mXPropSet, OUString( "RotateAngle" ), true ) )
3418 0 : ? *static_cast<sal_Int32 const *>(aAny.getValue())
3419 0 : : 0;
3420 :
3421 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
3422 0 : aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 );
3423 0 : if ( mType == "drawing.Line" )
3424 : {
3425 0 : double fDist = hypot( maRect.GetWidth(), maRect.GetHeight() );
3426 : maRect = Rectangle( Point( aTextRefPoint.X, aTextRefPoint.Y ),
3427 0 : Point( (sal_Int32)( aTextRefPoint.X + fDist ), aTextRefPoint.Y - 1 ) );
3428 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, false );
3429 0 : aPropOpt.AddOpt( ESCHER_Prop_FitTextToShape, 0x60006 ); // Size Shape To Fit Text
3430 0 : if ( mnAngle < 0 )
3431 0 : mnAngle = ( 36000 + mnAngle ) % 36000;
3432 0 : if ( mnAngle )
3433 0 : ImplFlipBoundingBox( aPropOpt );
3434 : }
3435 : else
3436 : {
3437 0 : ImplCreateTextShape( aPropOpt, aSolverContainer, false );
3438 0 : if ( mnAngle < 0 )
3439 0 : mnAngle = ( 36000 + mnAngle ) % 36000;
3440 : else
3441 0 : mnAngle = ( 36000 - ( mnAngle % 36000 ) );
3442 :
3443 0 : mnAngle *= 655;
3444 0 : mnAngle += 0x8000;
3445 0 : mnAngle &=~0xffff; // round nAngle to full grad
3446 0 : aPropOpt.AddOpt( ESCHER_Prop_Rotation, mnAngle );
3447 :
3448 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
3449 : // mpPptEscherEx->SetGroupSnapRect( nGroupLevel, maRect );
3450 : // mpPptEscherEx->SetGroupLogicRect( nGroupLevel, maRect );
3451 : }
3452 0 : if ( !pClientTextBox )
3453 0 : pClientTextBox = new SvMemoryStream( 0x200, 0x200 );
3454 :
3455 0 : SvMemoryStream aExtBu( 0x200, 0x200 );
3456 0 : ImplWriteTextStyleAtom( *pClientTextBox, EPP_TEXTTYPE_Other, 0, NULL, aExtBu, &aPropOpt );
3457 :
3458 0 : aPropOpt.CreateShapeProperties( mXShape );
3459 0 : aPropOpt.Commit( *mpStrm );
3460 0 : if ( GetCurrentGroupLevel() > 0 )
3461 0 : mpPptEscherEx->AddChildAnchor( maRect );
3462 : else
3463 0 : mpPptEscherEx->AddClientAnchor( maRect );
3464 :
3465 0 : mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
3466 0 : .WriteUInt32( pClientTextBox->Tell() );
3467 :
3468 0 : mpStrm->Write( pClientTextBox->GetData(), pClientTextBox->Tell() );
3469 0 : delete pClientTextBox, pClientTextBox = NULL;
3470 :
3471 0 : mpPptEscherEx->CloseContainer(); // ESCHER_SpContainer
3472 :
3473 : // #i119551# PPT does not support groups of polygons and text (MS patch KB2289187)
3474 : // mpPptEscherEx->LeaveGroup();
3475 : }
3476 : }
3477 16 : ClearGroupTable(); // storing groups if any are still open, which should not be the case
3478 16 : nGroups = GetGroupsClosed();
3479 16 : for ( sal_uInt32 i = 0; i < nGroups; i++, mpPptEscherEx->LeaveGroup() ) ;
3480 16 : mnPagesWritten++;
3481 16 : }
3482 :
3483 : struct CellBorder
3484 : {
3485 : sal_Int32 mnPos; // specifies the distance to the top/left position of the table
3486 : sal_Int32 mnLength;
3487 : table::BorderLine maCellBorder;
3488 :
3489 0 : CellBorder() : mnPos ( 0 ), mnLength( 0 ){};
3490 : };
3491 :
3492 0 : bool PPTWriter::ImplCreateCellBorder( const CellBorder* pCellBorder, sal_Int32 nX1, sal_Int32 nY1, sal_Int32 nX2, sal_Int32 nY2)
3493 : {
3494 0 : sal_Int32 nLineWidth = pCellBorder->maCellBorder.OuterLineWidth + pCellBorder->maCellBorder.InnerLineWidth;
3495 0 : if ( nLineWidth )
3496 : {
3497 0 : nLineWidth *= 2;
3498 0 : mnAngle = 0;
3499 0 : mpPptEscherEx->OpenContainer( ESCHER_SpContainer );
3500 0 : EscherPropertyContainer aPropOptSp;
3501 :
3502 0 : sal_uInt32 nId = mpPptEscherEx->GenerateShapeId();
3503 0 : mpPptEscherEx->AddShape( ESCHER_ShpInst_Line, 0xa02, nId );
3504 0 : aPropOptSp.AddOpt( ESCHER_Prop_shapePath, ESCHER_ShapeComplex );
3505 0 : aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0xa0008 );
3506 0 : aPropOptSp.AddOpt( ESCHER_Prop_fshadowObscured, 0x20000 );
3507 :
3508 0 : sal_uInt32 nBorderColor = pCellBorder->maCellBorder.Color & 0xff00; // green
3509 0 : nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color ) << 16; // red
3510 0 : nBorderColor |= static_cast< sal_uInt8 >( pCellBorder->maCellBorder.Color >> 16 ); // blue
3511 0 : aPropOptSp.AddOpt( ESCHER_Prop_lineColor, nBorderColor );
3512 :
3513 0 : aPropOptSp.AddOpt( ESCHER_Prop_lineWidth, nLineWidth * 360 );
3514 0 : aPropOptSp.AddOpt( ESCHER_Prop_fc3DLightFace, 0x80000 );
3515 0 : aPropOptSp.Commit( *mpStrm );
3516 0 : mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
3517 0 : mpStrm ->WriteInt32( nX1 )
3518 0 : .WriteInt32( nY1 )
3519 0 : .WriteInt32( nX2 )
3520 0 : .WriteInt32( nY2 );
3521 0 : mpPptEscherEx->CloseContainer();
3522 0 : return true;
3523 : }
3524 0 : return false;
3525 : }
3526 :
3527 : //get merged cell's width
3528 0 : sal_Int32 GetCellRight( sal_Int32 nColumn,
3529 : Rectangle& rect,
3530 : std::vector< std::pair< sal_Int32, sal_Int32 > >& aColumns,
3531 : uno::Reference< table::XMergeableCell >& xCell )
3532 : {
3533 0 : sal_Int32 nRight = aColumns[ nColumn ].first + aColumns[ nColumn ].second;
3534 0 : for ( sal_Int32 nColumnSpan = 1; nColumnSpan < xCell->getColumnSpan(); nColumnSpan++ )
3535 : {
3536 0 : sal_uInt32 nC = nColumnSpan + nColumn;
3537 0 : if ( nC < aColumns.size() )
3538 0 : nRight += aColumns[ nC ].second;
3539 : else
3540 0 : nRight = rect.Right();
3541 : }
3542 0 : return nRight;
3543 : }
3544 : //get merged cell's height
3545 0 : sal_Int32 GetCellBottom( sal_Int32 nRow,
3546 : Rectangle& rect,
3547 : std::vector< std::pair< sal_Int32, sal_Int32 > >& aRows,
3548 : uno::Reference< table::XMergeableCell >& xCell )
3549 : {
3550 0 : sal_Int32 nBottom = aRows[nRow].first + aRows[nRow].second;
3551 0 : for ( sal_Int32 nRowSpan = 1; nRowSpan < xCell->getRowSpan(); nRowSpan++ )
3552 : {
3553 0 : sal_uInt32 nR = nRowSpan + nRow;
3554 0 : if ( nR < aRows.size() )
3555 0 : nBottom += aRows[ nR ].second;
3556 : else
3557 0 : nBottom = rect.Bottom();
3558 : }
3559 0 : return nBottom;
3560 : }
3561 :
3562 34 : void PPTWriter::WriteCString( SvStream& rSt, const OUString& rString, sal_uInt32 nInstance )
3563 : {
3564 34 : sal_Int32 nLen = rString.getLength();
3565 34 : if ( nLen )
3566 : {
3567 0 : rSt.WriteUInt32( ( nInstance << 4 ) | ( EPP_CString << 16 ) )
3568 0 : .WriteUInt32( nLen << 1 );
3569 0 : for ( sal_Int32 i = 0; i < nLen; i++ )
3570 0 : rSt.WriteUInt16( rString[i] );
3571 : }
3572 34 : }
3573 :
3574 : class ContainerGuard
3575 : {
3576 : private:
3577 : PptEscherEx* m_pPptEscherEx;
3578 : public:
3579 0 : ContainerGuard(PptEscherEx* pPptEscherEx, sal_uInt16 nRecord)
3580 0 : : m_pPptEscherEx(pPptEscherEx)
3581 : {
3582 0 : m_pPptEscherEx->OpenContainer(nRecord);
3583 0 : }
3584 0 : ~ContainerGuard()
3585 : {
3586 0 : m_pPptEscherEx->CloseContainer();
3587 0 : }
3588 : };
3589 :
3590 0 : void PPTWriter::ImplCreateTable( uno::Reference< drawing::XShape >& rXShape, EscherSolverContainer& aSolverContainer,
3591 : EscherPropertyContainer& aPropOpt )
3592 : {
3593 : try
3594 : {
3595 : static const char sModel[] = "Model";
3596 : static const char sWidth[] = "Width";
3597 : static const char sHeight[] = "Height";
3598 :
3599 0 : uno::Reference< table::XTable > xTable;
3600 0 : if ( mXPropSet->getPropertyValue( sModel ) >>= xTable )
3601 : {
3602 0 : uno::Reference< table::XColumnRowRange > xColumnRowRange( xTable, uno::UNO_QUERY_THROW );
3603 0 : uno::Reference< container::XIndexAccess > xColumns( xColumnRowRange->getColumns(), uno::UNO_QUERY_THROW );
3604 0 : uno::Reference< container::XIndexAccess > xRows( xColumnRowRange->getRows(), uno::UNO_QUERY_THROW );
3605 0 : sal_uInt16 nRowCount = static_cast< sal_uInt16 >( xRows->getCount() );
3606 0 : sal_uInt16 nColumnCount = static_cast< sal_uInt16 >( xColumns->getCount() );
3607 :
3608 0 : std::vector< std::pair< sal_Int32, sal_Int32 > > aColumns;
3609 0 : std::vector< std::pair< sal_Int32, sal_Int32 > > aRows;
3610 :
3611 0 : awt::Point aPosition( MapPoint( rXShape->getPosition() ) );
3612 0 : sal_Int32 nPosition = aPosition.X;
3613 0 : for ( sal_Int32 x = 0; x < nColumnCount; x++ )
3614 : {
3615 0 : uno::Reference< beans::XPropertySet > xPropSet( xColumns->getByIndex( x ), uno::UNO_QUERY_THROW );
3616 0 : awt::Size aS( 0, 0 );
3617 0 : xPropSet->getPropertyValue( sWidth ) >>= aS.Width;
3618 0 : awt::Size aM( MapSize( aS ) );
3619 0 : aColumns.push_back( std::pair< sal_Int32, sal_Int32 >( nPosition, aM.Width ) );
3620 0 : nPosition += aM.Width;
3621 0 : if ( x == nColumnCount - 1 && nPosition != maRect.Right() )
3622 0 : maRect.Right() = nPosition;
3623 0 : }
3624 :
3625 0 : nPosition = aPosition.Y;
3626 0 : for ( sal_Int32 y = 0; y < nRowCount; y++ )
3627 : {
3628 0 : uno::Reference< beans::XPropertySet > xPropSet( xRows->getByIndex( y ), uno::UNO_QUERY_THROW );
3629 0 : awt::Size aS( 0, 0 );
3630 0 : xPropSet->getPropertyValue( sHeight ) >>= aS.Height;
3631 0 : awt::Size aM( MapSize( aS ) );
3632 0 : aRows.push_back( std::pair< sal_Int32, sal_Int32 >( nPosition, aM.Height ) );
3633 0 : nPosition += aM.Height;
3634 0 : if ( y == nRowCount - 1 && nPosition != maRect.Bottom())
3635 0 : maRect.Bottom() = nPosition;
3636 0 : }
3637 0 : std::unique_ptr<ContainerGuard> xSpgrContainer(new ContainerGuard(mpPptEscherEx, ESCHER_SpgrContainer));
3638 0 : std::unique_ptr<ContainerGuard> xSpContainer(new ContainerGuard(mpPptEscherEx, ESCHER_SpContainer));
3639 0 : mpPptEscherEx->AddAtom( 16, ESCHER_Spgr, 1 );
3640 0 : mpStrm ->WriteInt32( maRect.Left() ) // Bounding box for the grouped shapes to which they are attached
3641 0 : .WriteInt32( maRect.Top() )
3642 0 : .WriteInt32( maRect.Right() )
3643 0 : .WriteInt32( maRect.Bottom() );
3644 :
3645 0 : sal_uInt32 nShapeId = mpPptEscherEx->GenerateShapeId();
3646 0 : mpPptEscherEx->AddShape( ESCHER_ShpInst_Min, 0x201, nShapeId ); // Flags: Group | Patriarch
3647 0 : aSolverContainer.AddShape( rXShape, nShapeId );
3648 0 : EscherPropertyContainer aPropOpt2;
3649 :
3650 0 : SvMemoryStream aMemStrm;
3651 0 : aMemStrm.ObjectOwnsMemory( false );
3652 0 : aMemStrm.WriteUInt16( nRowCount )
3653 0 : .WriteUInt16( nRowCount )
3654 0 : .WriteUInt16( 4 );
3655 :
3656 0 : std::vector< std::pair< sal_Int32, sal_Int32 > >::const_iterator aIter( aRows.begin() );
3657 0 : while( aIter != aRows.end() )
3658 0 : aMemStrm.WriteInt32( (*aIter++).second );
3659 :
3660 0 : aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x1000100 );
3661 0 : aPropOpt2.AddOpt( ESCHER_Prop_tableProperties, 1 );
3662 0 : aPropOpt2.AddOpt( ESCHER_Prop_tableRowProperties, true, aMemStrm.Tell(), static_cast< sal_uInt8* >( const_cast< void* >( aMemStrm.GetData() ) ), aMemStrm.Tell() );
3663 0 : aPropOpt.CreateShapeProperties( rXShape );
3664 0 : aPropOpt.Commit( *mpStrm );
3665 0 : aPropOpt2.Commit( *mpStrm, 3, ESCHER_UDefProp );
3666 0 : if ( GetCurrentGroupLevel() > 0 )
3667 0 : mpPptEscherEx->AddChildAnchor( maRect );
3668 : else
3669 0 : mpPptEscherEx->AddClientAnchor( maRect );
3670 0 : xSpContainer.reset(); //ESCHER_SpContainer
3671 :
3672 0 : uno::Reference< table::XCellRange > xCellRange( xTable, uno::UNO_QUERY_THROW );
3673 0 : for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
3674 : {
3675 0 : for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
3676 : {
3677 0 : uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow ), uno::UNO_QUERY_THROW );
3678 0 : if ( !xCell->isMerged() )
3679 : {
3680 0 : sal_Int32 nLeft = aColumns[ nColumn ].first;
3681 0 : sal_Int32 nTop = aRows[ nRow ].first;
3682 0 : sal_Int32 nRight = GetCellRight( nColumn, maRect,aColumns,xCell );
3683 0 : sal_Int32 nBottom = GetCellBottom( nRow, maRect,aRows,xCell );
3684 :
3685 0 : mbFontIndependentLineSpacing = false;
3686 0 : mXPropSet = uno::Reference< beans::XPropertySet >( xCell, uno::UNO_QUERY_THROW );
3687 0 : mXText = uno::Reference< text::XSimpleText >( xCell, uno::UNO_QUERY_THROW );
3688 0 : mnTextSize = mXText->getString().getLength();
3689 :
3690 0 : ::com::sun::star::uno::Any aAny;
3691 0 : if ( GetPropertyValue( aAny, mXPropSet, OUString( "FontIndependentLineSpacing" ), true ) )
3692 0 : aAny >>= mbFontIndependentLineSpacing;
3693 :
3694 0 : EscherPropertyContainer aPropOptSp;
3695 0 : std::unique_ptr<ContainerGuard> xCellContainer(new ContainerGuard(mpPptEscherEx, ESCHER_SpContainer));
3696 0 : ImplCreateShape( ESCHER_ShpInst_Rectangle, 0xa02, aSolverContainer ); // Flags: Connector | HasSpt | Child
3697 0 : aPropOptSp.CreateFillProperties( mXPropSet, true );
3698 0 : aPropOptSp.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x90000 );
3699 0 : aPropOptSp.CreateTextProperties( mXPropSet, mnTxId += 0x60, false, true );
3700 0 : aPropOptSp.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapSquare );
3701 :
3702 0 : SvMemoryStream aClientTextBox( 0x200, 0x200 );
3703 0 : SvMemoryStream aExtBu( 0x200, 0x200 );
3704 :
3705 0 : ImplWriteTextStyleAtom( aClientTextBox, EPP_TEXTTYPE_Other, 0, NULL, aExtBu, &aPropOptSp );
3706 :
3707 : // need write client data for extend bullet
3708 0 : if ( aExtBu.Tell() )
3709 : {
3710 0 : SvMemoryStream* pClientData = new SvMemoryStream( 0x200, 0x200 );
3711 0 : ImplProgTagContainer( pClientData, &aExtBu );
3712 0 : mpStrm->WriteUInt32( ( ESCHER_ClientData << 16 ) | 0xf )
3713 0 : .WriteUInt32( pClientData->Tell() );
3714 :
3715 0 : mpStrm->Write( pClientData->GetData(), pClientData->Tell() );
3716 0 : delete pClientData, pClientData = NULL;
3717 : }
3718 :
3719 0 : aPropOptSp.Commit( *mpStrm );
3720 0 : mpPptEscherEx->AddAtom( 16, ESCHER_ChildAnchor );
3721 0 : mpStrm ->WriteInt32( nLeft )
3722 0 : .WriteInt32( nTop )
3723 0 : .WriteInt32( nRight )
3724 0 : .WriteInt32( nBottom );
3725 :
3726 0 : mpStrm->WriteUInt32( ( ESCHER_ClientTextbox << 16 ) | 0xf )
3727 0 : .WriteUInt32( aClientTextBox.Tell() );
3728 :
3729 0 : mpStrm->Write( aClientTextBox.GetData(), aClientTextBox.Tell() );
3730 0 : xCellContainer.reset();
3731 : }
3732 0 : }
3733 : }
3734 :
3735 : static const char sTopBorder[] = "TopBorder";
3736 : static const char sBottomBorder[] = "BottomBorder";
3737 : static const char sLeftBorder[] = "LeftBorder";
3738 : static const char sRightBorder[] = "RightBorder";
3739 :
3740 : // creating horz lines
3741 0 : for( sal_Int32 nLine = 0; nLine < ( xRows->getCount() + 1 ); nLine++ )
3742 : {
3743 0 : for( sal_Int32 nColumn = 0; nColumn < xColumns->getCount(); nColumn++ )
3744 : {
3745 0 : CellBorder aCellBorder;
3746 0 : aCellBorder.mnPos = aColumns[ nColumn ].first;
3747 0 : aCellBorder.mnLength = aColumns[ nColumn ].second;
3748 0 : bool bTop = false;
3749 : //write nLine*nColumn cell's top border
3750 0 : if ( nLine < xRows->getCount() )
3751 : { // top border
3752 0 : uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nLine ), uno::UNO_QUERY_THROW );
3753 0 : if ( !xCell->isMerged() )
3754 : {
3755 0 : uno::Reference< beans::XPropertySet > xPropSet2( xCell, uno::UNO_QUERY_THROW );
3756 0 : table::BorderLine aBorderLine;
3757 0 : if ( xPropSet2->getPropertyValue( sTopBorder ) >>= aBorderLine )
3758 0 : aCellBorder.maCellBorder = aBorderLine;
3759 0 : sal_Int32 nRight = GetCellRight( nColumn, maRect,aColumns,xCell );
3760 : bTop = ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
3761 0 : aRows[ nLine ].first, nRight, aRows[ nLine ].first );
3762 0 : }
3763 : }
3764 :
3765 : //if nLine*nColumn cell's top border is empty, check (nLine-1)*nColumn cell's bottom border
3766 : //and write the last row's bottom border
3767 0 : if (( nLine && !bTop ) || (nLine == xRows->getCount()))
3768 : { // bottom border
3769 0 : sal_Int32 nRow = nLine;
3770 :
3771 0 : while( nRow )
3772 : { //find last no merged cell
3773 0 : uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
3774 0 : if ( !xCell->isMerged() )
3775 : {
3776 0 : sal_Int32 nRight = GetCellRight( nColumn, maRect,aColumns,xCell );
3777 0 : sal_Int32 nBottom = GetCellBottom( nRow - 1, maRect,aRows,xCell );
3778 0 : if ( nBottom == ( aRows[ nLine-1 ].first + aRows[ nLine-1 ].second ) )
3779 : {
3780 0 : uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn, nRow - 1 ), uno::UNO_QUERY_THROW );
3781 0 : uno::Reference< beans::XPropertySet > xPropSet2( xCellOwn, uno::UNO_QUERY_THROW );
3782 0 : table::BorderLine aBorderLine;
3783 0 : if ( xPropSet2->getPropertyValue( sBottomBorder ) >>= aBorderLine )
3784 0 : aCellBorder.maCellBorder = aBorderLine;
3785 : ImplCreateCellBorder( &aCellBorder, aCellBorder.mnPos,
3786 0 : nBottom, nRight, nBottom);
3787 : }
3788 0 : nRow=0;
3789 : }
3790 : else
3791 0 : nRow--;
3792 0 : }
3793 : }
3794 : }
3795 : }
3796 :
3797 : // creating vertical lines
3798 0 : for( sal_Int32 nLine = 0; nLine < ( xColumns->getCount() + 1 ); nLine++ )
3799 : {
3800 0 : for( sal_Int32 nRow = 0; nRow < xRows->getCount(); nRow++ )
3801 : {
3802 :
3803 0 : CellBorder aCellBorder;
3804 0 : aCellBorder.mnPos = aRows[ nRow].first;
3805 0 : aCellBorder.mnLength = aRows[ nRow].second;
3806 0 : bool bLeft = false;
3807 0 : if ( nLine < xColumns->getCount() )
3808 : { // left border
3809 0 : uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nLine, nRow ), uno::UNO_QUERY_THROW );
3810 0 : if (!xCell->isMerged() )
3811 : {
3812 0 : uno::Reference< beans::XPropertySet > xCellSet( xCell, uno::UNO_QUERY_THROW );
3813 0 : table::BorderLine aBorderLine;
3814 0 : if ( xCellSet->getPropertyValue( sLeftBorder ) >>= aBorderLine )
3815 0 : aCellBorder.maCellBorder = aBorderLine;
3816 0 : sal_Int32 nBottom = GetCellBottom( nRow, maRect, aRows,xCell );
3817 0 : bLeft = ImplCreateCellBorder( &aCellBorder, aColumns[nLine].first, aCellBorder.mnPos,
3818 0 : aColumns[nLine].first, nBottom );
3819 0 : }
3820 : }
3821 0 : if ( ( nLine && !bLeft )||(nLine == xColumns->getCount()))
3822 : { // right border
3823 0 : sal_Int32 nColumn = nLine;
3824 0 : while ( nColumn )
3825 : {
3826 0 : uno::Reference< table::XMergeableCell > xCell( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
3827 0 : if (!xCell->isMerged() )
3828 : {
3829 0 : sal_Int32 nRight = GetCellRight( nColumn-1, maRect, aColumns,xCell );
3830 0 : sal_Int32 nBottom = GetCellBottom( nRow, maRect, aRows, xCell );
3831 0 : if ( nRight == (aColumns[nLine-1].first + aColumns[nLine-1].second) )
3832 : {
3833 0 : uno::Reference< table::XMergeableCell > xCellOwn( xCellRange->getCellByPosition( nColumn - 1, nRow ), uno::UNO_QUERY_THROW );
3834 0 : uno::Reference< beans::XPropertySet > xCellSet( xCellOwn, uno::UNO_QUERY_THROW );
3835 0 : table::BorderLine aBorderLine;
3836 0 : if ( xCellSet->getPropertyValue( sRightBorder ) >>= aBorderLine )
3837 0 : aCellBorder.maCellBorder = aBorderLine;
3838 : ImplCreateCellBorder( &aCellBorder, nRight, aCellBorder.mnPos,
3839 0 : nRight, nBottom );
3840 : }
3841 0 : nColumn = 0;
3842 : }
3843 : else
3844 0 : nColumn --;
3845 0 : }
3846 : }
3847 : }
3848 : }
3849 :
3850 0 : xSpgrContainer.reset(); //ESCHER_SpgrContainer
3851 0 : }
3852 : }
3853 0 : catch( uno::Exception& )
3854 : {
3855 : }
3856 0 : }
3857 :
3858 24 : void TextObjBinary::Write( SvStream* pStrm )
3859 : {
3860 24 : sal_uInt32 nSize, nPos = pStrm->Tell();
3861 24 : pStrm->WriteUInt32( EPP_TextCharsAtom << 16 ).WriteUInt32( 0 );
3862 66 : for ( sal_uInt32 i = 0; i < ParagraphCount(); ++i )
3863 42 : GetParagraph(i)->Write( pStrm );
3864 24 : nSize = pStrm->Tell() - nPos;
3865 24 : pStrm->SeekRel( - ( (sal_Int32)nSize - 4 ) );
3866 24 : pStrm->WriteUInt32( nSize - 8 );
3867 24 : pStrm->SeekRel( nSize - 8 );
3868 24 : }
3869 :
3870 21 : void TextObjBinary::WriteTextSpecInfo( SvStream* pStrm )
3871 : {
3872 21 : sal_uInt32 nCharactersLeft( Count() );
3873 21 : if ( nCharactersLeft >= 1 )
3874 : {
3875 21 : EscherExAtom aAnimationInfoAtom( *pStrm, EPP_TextSpecInfoAtom, 0, 0 );
3876 42 : for ( sal_uInt32 i = 0; nCharactersLeft && i < ParagraphCount(); ++i )
3877 : {
3878 21 : ParagraphObj* pPtr = GetParagraph(i);
3879 42 : for ( boost::ptr_vector<PortionObj>::const_iterator it = pPtr->begin(); nCharactersLeft && it != pPtr->end(); ++it )
3880 : {
3881 21 : const PortionObj& rPortion = *it;
3882 21 : sal_Int32 nPortionSize = rPortion.mnTextSize >= nCharactersLeft ? nCharactersLeft : rPortion.mnTextSize;
3883 21 : sal_Int32 nFlags = 7;
3884 21 : nCharactersLeft -= nPortionSize;
3885 21 : pStrm ->WriteUInt32( nPortionSize )
3886 21 : .WriteInt32( nFlags )
3887 21 : .WriteInt16( 1 ) // spellinfo -> needs rechecking
3888 63 : .WriteInt16( LanguageTag( rPortion.meCharLocale ).makeFallback().getLanguageType() )
3889 21 : .WriteInt16( 0 ); // alt language
3890 : }
3891 : }
3892 21 : if ( nCharactersLeft )
3893 0 : pStrm->WriteUInt32( nCharactersLeft ).WriteInt32( 1 ).WriteInt16( 1 );
3894 :
3895 : }
3896 33 : }
3897 :
3898 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|