xref: /aoo4110/main/sw/source/filter/ww8/wrtw8esh.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
27*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/Aspects.hpp>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <hintids.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #define _SVSTDARR_ULONGSSORT
33*b1cdbd2cSJim Jagielski #define _SVSTDARR_USHORTS
34*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/cvtgrf.hxx>
36*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XShape.hpp>
38*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
39*b1cdbd2cSJim Jagielski #include <sot/storage.hxx>
40*b1cdbd2cSJim Jagielski #include <svtools/filter.hxx>
41*b1cdbd2cSJim Jagielski #include <svl/itemiter.hxx>
42*b1cdbd2cSJim Jagielski #include <svx/svdobj.hxx>
43*b1cdbd2cSJim Jagielski #include <svx/svdotext.hxx>
44*b1cdbd2cSJim Jagielski #include <svx/svdmodel.hxx>
45*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
46*b1cdbd2cSJim Jagielski #include <editeng/outlobj.hxx>
47*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
48*b1cdbd2cSJim Jagielski #include <svx/unoshape.hxx>
49*b1cdbd2cSJim Jagielski #include <editeng/brshitem.hxx>
50*b1cdbd2cSJim Jagielski #include <editeng/boxitem.hxx>
51*b1cdbd2cSJim Jagielski #include <editeng/lrspitem.hxx>
52*b1cdbd2cSJim Jagielski #include <editeng/ulspitem.hxx>
53*b1cdbd2cSJim Jagielski #include <editeng/fontitem.hxx>
54*b1cdbd2cSJim Jagielski #include <editeng/frmdiritem.hxx>
55*b1cdbd2cSJim Jagielski #include <svx/svdoole2.hxx>
56*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
57*b1cdbd2cSJim Jagielski #ifndef _SVX_FLDITEM_HXX
58*b1cdbd2cSJim Jagielski //miserable hack to get around #98519#
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #include <editeng/flditem.hxx>
61*b1cdbd2cSJim Jagielski #endif
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski #include <comphelper/seqstream.hxx>
64*b1cdbd2cSJim Jagielski #include <unotools/ucbstreamhelper.hxx>
65*b1cdbd2cSJim Jagielski #include <svtools/filter.hxx>
66*b1cdbd2cSJim Jagielski #include <svx/fmglob.hxx>
67*b1cdbd2cSJim Jagielski #include <svx/svdouno.hxx>
68*b1cdbd2cSJim Jagielski #include <svx/unoapi.hxx>
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski // #i71538#
71*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
72*b1cdbd2cSJim Jagielski #include <fmtcnct.hxx>
73*b1cdbd2cSJim Jagielski #include <fmtanchr.hxx>
74*b1cdbd2cSJim Jagielski #include <fmtsrnd.hxx>
75*b1cdbd2cSJim Jagielski #include <fmtornt.hxx>
76*b1cdbd2cSJim Jagielski #include <fmtfsize.hxx>
77*b1cdbd2cSJim Jagielski // --> OD 2005-01-06 #i30669#
78*b1cdbd2cSJim Jagielski #include <fmtfollowtextflow.hxx>
79*b1cdbd2cSJim Jagielski // <--
80*b1cdbd2cSJim Jagielski #include <dcontact.hxx>
81*b1cdbd2cSJim Jagielski #include <frmfmt.hxx>
82*b1cdbd2cSJim Jagielski #include <fmtcntnt.hxx>
83*b1cdbd2cSJim Jagielski #include <ndindex.hxx>
84*b1cdbd2cSJim Jagielski #include <doc.hxx>
85*b1cdbd2cSJim Jagielski #include <docary.hxx>
86*b1cdbd2cSJim Jagielski #include <pam.hxx>
87*b1cdbd2cSJim Jagielski #include <swrect.hxx>
88*b1cdbd2cSJim Jagielski #include <ndgrf.hxx>
89*b1cdbd2cSJim Jagielski #include <grfatr.hxx>
90*b1cdbd2cSJim Jagielski #include <ndole.hxx>
91*b1cdbd2cSJim Jagielski #include <unodraw.hxx>
92*b1cdbd2cSJim Jagielski #include <pagedesc.hxx>
93*b1cdbd2cSJim Jagielski #include <ww8par.hxx>
94*b1cdbd2cSJim Jagielski #include <breakit.hxx>
95*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/ScriptType.hdl>
96*b1cdbd2cSJim Jagielski #include "ww8attributeoutput.hxx"
97*b1cdbd2cSJim Jagielski #include "writerhelper.hxx"
98*b1cdbd2cSJim Jagielski #include "writerwordglue.hxx"
99*b1cdbd2cSJim Jagielski #include "wrtww8.hxx"
100*b1cdbd2cSJim Jagielski #include "escher.hxx"
101*b1cdbd2cSJim Jagielski // --> OD 2007-07-24 #148096#
102*b1cdbd2cSJim Jagielski #include <ndtxt.hxx>
103*b1cdbd2cSJim Jagielski // <--
104*b1cdbd2cSJim Jagielski #include "WW8FFData.hxx"
105*b1cdbd2cSJim Jagielski #include <editeng/shaditem.hxx>
106*b1cdbd2cSJim Jagielski #include <svx/unoapi.hxx>
107*b1cdbd2cSJim Jagielski #include <escher.hxx>
108*b1cdbd2cSJim Jagielski #include <fmtinfmt.hxx>
109*b1cdbd2cSJim Jagielski #include <fmturl.hxx>
110*b1cdbd2cSJim Jagielski #include "sfx2/sfxsids.hrc"
111*b1cdbd2cSJim Jagielski #include <svl/urihelper.hxx>
112*b1cdbd2cSJim Jagielski #include <unotools/saveopt.hxx>
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski using namespace com::sun::star;
115*b1cdbd2cSJim Jagielski using namespace sw::util;
116*b1cdbd2cSJim Jagielski using namespace sw::types;
117*b1cdbd2cSJim Jagielski using namespace nsFieldFlags;
118*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference;
119*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::UNO_QUERY;
120*b1cdbd2cSJim Jagielski using ::com::sun::star::beans::XPropertySet;
121*b1cdbd2cSJim Jagielski using ::com::sun::star::drawing::XShape;
122*b1cdbd2cSJim Jagielski 
IsRelUrl()123*b1cdbd2cSJim Jagielski bool SwBasicEscherEx::IsRelUrl()
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski 	SvtSaveOptions aSaveOpt;
126*b1cdbd2cSJim Jagielski 	bool bRelUrl = false;
127*b1cdbd2cSJim Jagielski 	SfxMedium * pMedium = rWrt.GetWriter().GetMedia();
128*b1cdbd2cSJim Jagielski 	if ( pMedium )
129*b1cdbd2cSJim Jagielski 		bRelUrl = pMedium->IsRemote() ? aSaveOpt.IsSaveRelINet() : aSaveOpt.IsSaveRelFSys();
130*b1cdbd2cSJim Jagielski 	return bRelUrl;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
GetBasePath()133*b1cdbd2cSJim Jagielski String SwBasicEscherEx::GetBasePath()
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski 	String sDocUrl;
136*b1cdbd2cSJim Jagielski 	String sBasePath;
137*b1cdbd2cSJim Jagielski 	SfxMedium * pMedium = rWrt.GetWriter().GetMedia();
138*b1cdbd2cSJim Jagielski 	if ( pMedium )
139*b1cdbd2cSJim Jagielski 	{
140*b1cdbd2cSJim Jagielski 		const SfxItemSet* pPItemSet = pMedium->GetItemSet();
141*b1cdbd2cSJim Jagielski 		if( pPItemSet )
142*b1cdbd2cSJim Jagielski 		{
143*b1cdbd2cSJim Jagielski 			const SfxStringItem* pPItem = dynamic_cast< const SfxStringItem* >( pPItemSet->GetItem( SID_FILE_NAME ) );
144*b1cdbd2cSJim Jagielski 			if ( pPItem )
145*b1cdbd2cSJim Jagielski 			      	sDocUrl = pPItem->GetValue();
146*b1cdbd2cSJim Jagielski 		}
147*b1cdbd2cSJim Jagielski 	}
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski     	sBasePath = sDocUrl.Copy( 0, sDocUrl.SearchBackward( '/' ) + 1 );
150*b1cdbd2cSJim Jagielski 	return sBasePath;
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski 
BuildFileName(sal_uInt16 & rnLevel,bool & rbRel,const String & rUrl)154*b1cdbd2cSJim Jagielski String SwBasicEscherEx::BuildFileName(sal_uInt16& rnLevel, bool& rbRel, const String& rUrl )
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski     	String aDosName( INetURLObject( rUrl ).getFSysPath( INetURLObject::FSYS_DOS ) );
157*b1cdbd2cSJim Jagielski     	rnLevel = 0;
158*b1cdbd2cSJim Jagielski 	rbRel = IsRelUrl();
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski     	if( rbRel )
161*b1cdbd2cSJim Jagielski     	{
162*b1cdbd2cSJim Jagielski        	 // try to convert to relative file name
163*b1cdbd2cSJim Jagielski         	String aTmpName( aDosName );
164*b1cdbd2cSJim Jagielski         	aDosName = INetURLObject::GetRelURL( GetBasePath(), rUrl,
165*b1cdbd2cSJim Jagielski             	INetURLObject::WAS_ENCODED, INetURLObject::DECODE_WITH_CHARSET );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski         	if( aDosName.SearchAscii( INET_FILE_SCHEME ) == 0 )
168*b1cdbd2cSJim Jagielski         	{
169*b1cdbd2cSJim Jagielski             		// not converted to rel -> back to old, return absolute flag
170*b1cdbd2cSJim Jagielski             		aDosName = aTmpName;
171*b1cdbd2cSJim Jagielski             		rbRel = false;
172*b1cdbd2cSJim Jagielski         	}
173*b1cdbd2cSJim Jagielski 	       else if( aDosName.SearchAscii( "./" ) == 0 )
174*b1cdbd2cSJim Jagielski 	       {
175*b1cdbd2cSJim Jagielski 	            aDosName.Erase( 0, 2 );
176*b1cdbd2cSJim Jagielski 	       }
177*b1cdbd2cSJim Jagielski 	       else
178*b1cdbd2cSJim Jagielski 	       {
179*b1cdbd2cSJim Jagielski 	            while( aDosName.SearchAndReplaceAscii( "../", String::EmptyString() ) == 0 )
180*b1cdbd2cSJim Jagielski 	                ++rnLevel;
181*b1cdbd2cSJim Jagielski 	       }
182*b1cdbd2cSJim Jagielski 	}
183*b1cdbd2cSJim Jagielski 	return aDosName;
184*b1cdbd2cSJim Jagielski }
185*b1cdbd2cSJim Jagielski 
WriteHyperlinkWithinFly(SvMemoryStream & rStrm,const SwFmtURL * pINetFmtArg)186*b1cdbd2cSJim Jagielski void SwBasicEscherEx::WriteHyperlinkWithinFly( SvMemoryStream& rStrm, const SwFmtURL* pINetFmtArg)
187*b1cdbd2cSJim Jagielski {
188*b1cdbd2cSJim Jagielski 	if ( !pINetFmtArg ) return;
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 	sal_uInt8 maGuidStdLink[ 16 ] ={
191*b1cdbd2cSJim Jagielski 		0xD0, 0xC9, 0xEA, 0x79, 0xF9, 0xBA, 0xCE, 0x11, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B };
192*b1cdbd2cSJim Jagielski 	sal_uInt8 maGuidUrlMoniker[ 16 ] = {
193*b1cdbd2cSJim Jagielski 	    0xE0, 0xC9, 0xEA, 0x79, 0xF9, 0xBA, 0xCE, 0x11, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B };
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	sal_uInt8 maGuidFileMoniker[ 16 ] = {
196*b1cdbd2cSJim Jagielski 		0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };
197*b1cdbd2cSJim Jagielski 	sal_uInt8 maGuidFileTail[] = {
198*b1cdbd2cSJim Jagielski             0xFF, 0xFF, 0xAD, 0xDE, 0x00, 0x00, 0x00, 0x00,
199*b1cdbd2cSJim Jagielski             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200*b1cdbd2cSJim Jagielski             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
201*b1cdbd2cSJim Jagielski         };
202*b1cdbd2cSJim Jagielski 	//const sal_uInt16 WW8_ID_HLINK               = 0x01B8;
203*b1cdbd2cSJim Jagielski 	const sal_uInt32 WW8_HLINK_BODY             = 0x00000001;   /// Contains file link or URL.
204*b1cdbd2cSJim Jagielski 	const sal_uInt32 WW8_HLINK_ABS              = 0x00000002;   /// Absolute path.
205*b1cdbd2cSJim Jagielski 	//const sal_uInt32 WW8_HLINK_DESCR            = 0x00000014;   /// Description.
206*b1cdbd2cSJim Jagielski 	const sal_uInt32 WW8_HLINK_MARK             = 0x00000008;   /// Text mark.
207*b1cdbd2cSJim Jagielski 	const sal_uInt32 WW8_HLINK_FRAME            = 0x00000080;   /// Target frame.
208*b1cdbd2cSJim Jagielski 	//const sal_uInt32 WW8_HLINK_UNC              = 0x00000100;   /// UNC path.
209*b1cdbd2cSJim Jagielski 	SvMemoryStream tmpStrm;
210*b1cdbd2cSJim Jagielski 	String tmpTextMark;
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	String rUrl = pINetFmtArg->GetURL();
213*b1cdbd2cSJim Jagielski 	String rTarFrm = pINetFmtArg->GetTargetFrameName();
214*b1cdbd2cSJim Jagielski 	sal_uInt32          mnFlags = 0;
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski     	INetURLObject aUrlObj( rUrl );
217*b1cdbd2cSJim Jagielski     	const INetProtocol eProtocol = aUrlObj.GetProtocol();
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 	//Target Frame
220*b1cdbd2cSJim Jagielski 	if( rTarFrm.Len() > 0 )
221*b1cdbd2cSJim Jagielski     	{
222*b1cdbd2cSJim Jagielski 		SwWW8Writer::WriteLong( tmpStrm, rTarFrm.Len()+1 );
223*b1cdbd2cSJim Jagielski         	SwWW8Writer::WriteString16( tmpStrm, rTarFrm, false);
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski         	tmpStrm << sal_uInt16( 0 );
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski         	mnFlags |= WW8_HLINK_FRAME;
228*b1cdbd2cSJim Jagielski     	}
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski     	// file link or URL
231*b1cdbd2cSJim Jagielski     	if( eProtocol == INET_PROT_FILE || (eProtocol == INET_PROT_NOT_VALID && rUrl.GetChar( 0 ) != '#') )
232*b1cdbd2cSJim Jagielski     	{
233*b1cdbd2cSJim Jagielski     		sal_uInt16 nLevel;
234*b1cdbd2cSJim Jagielski         	bool bRel;
235*b1cdbd2cSJim Jagielski         	String aFileName( BuildFileName( nLevel, bRel, rUrl ));
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski         	if( !bRel )
238*b1cdbd2cSJim Jagielski             		mnFlags |= WW8_HLINK_ABS;
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski 		mnFlags |= WW8_HLINK_BODY;
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 		tmpStrm.Write( maGuidFileMoniker,sizeof(maGuidFileMoniker) );
243*b1cdbd2cSJim Jagielski 		tmpStrm << nLevel;
244*b1cdbd2cSJim Jagielski 		SwWW8Writer::WriteLong( tmpStrm, aFileName.Len()+1);
245*b1cdbd2cSJim Jagielski 		SwWW8Writer::WriteString8( tmpStrm, aFileName, true, RTL_TEXTENCODING_MS_1252 );
246*b1cdbd2cSJim Jagielski 		tmpStrm.Write( maGuidFileTail,sizeof(maGuidFileTail) );
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 		//For UNICODE
249*b1cdbd2cSJim Jagielski 		SwWW8Writer::WriteLong( tmpStrm, 2*aFileName.Len()+6);
250*b1cdbd2cSJim Jagielski 		SwWW8Writer::WriteLong( tmpStrm, 2*aFileName.Len());
251*b1cdbd2cSJim Jagielski 		tmpStrm << sal_uInt16(0x0003);
252*b1cdbd2cSJim Jagielski 		SwWW8Writer::WriteString16(tmpStrm, aFileName, false);
253*b1cdbd2cSJim Jagielski     	}
254*b1cdbd2cSJim Jagielski    	else if( eProtocol != INET_PROT_NOT_VALID )
255*b1cdbd2cSJim Jagielski     	{
256*b1cdbd2cSJim Jagielski        	tmpStrm.Write( maGuidUrlMoniker,sizeof(maGuidUrlMoniker) );
257*b1cdbd2cSJim Jagielski         	SwWW8Writer::WriteLong( tmpStrm, 2*(rUrl.Len()+1));
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski         	SwWW8Writer::WriteString16(tmpStrm, rUrl, true);
260*b1cdbd2cSJim Jagielski         	mnFlags |= WW8_HLINK_BODY | WW8_HLINK_ABS;
261*b1cdbd2cSJim Jagielski     	}
262*b1cdbd2cSJim Jagielski     	else if( rUrl.GetChar( 0 ) == '#' )
263*b1cdbd2cSJim Jagielski     	{
264*b1cdbd2cSJim Jagielski        	String aTextMark( rUrl.Copy( 1 ) );
265*b1cdbd2cSJim Jagielski         	aTextMark.SearchAndReplace( '.', '!' );
266*b1cdbd2cSJim Jagielski 		//sal_uInt8 tmpLen = aTextMark.Len();
267*b1cdbd2cSJim Jagielski 		tmpTextMark = aTextMark;
268*b1cdbd2cSJim Jagielski     	}
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 	if( tmpTextMark.Len() == 0 && aUrlObj.HasMark() )
271*b1cdbd2cSJim Jagielski 	{
272*b1cdbd2cSJim Jagielski        	tmpTextMark = aUrlObj.GetMark();
273*b1cdbd2cSJim Jagielski 	}
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski    	if( tmpTextMark.Len()>0 )
276*b1cdbd2cSJim Jagielski     	{
277*b1cdbd2cSJim Jagielski 		SwWW8Writer::WriteLong( tmpStrm, tmpTextMark.Len()+1);
278*b1cdbd2cSJim Jagielski         	SwWW8Writer::WriteString16(tmpStrm, tmpTextMark, true);
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski        	mnFlags |= WW8_HLINK_MARK;
281*b1cdbd2cSJim Jagielski     	}
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	rStrm.Write( maGuidStdLink,16 );
284*b1cdbd2cSJim Jagielski        rStrm  << sal_uInt32( 2 )
285*b1cdbd2cSJim Jagielski             << mnFlags;
286*b1cdbd2cSJim Jagielski 	tmpStrm.Seek( STREAM_SEEK_TO_BEGIN );
287*b1cdbd2cSJim Jagielski 	sal_uInt32 nStrmPos = tmpStrm.Tell();
288*b1cdbd2cSJim Jagielski     	tmpStrm.Seek( STREAM_SEEK_TO_END );
289*b1cdbd2cSJim Jagielski     	sal_uInt32 nStrmSize = tmpStrm.Tell();
290*b1cdbd2cSJim Jagielski     	tmpStrm.Seek( nStrmPos );
291*b1cdbd2cSJim Jagielski 	sal_uInt32 nLen;
292*b1cdbd2cSJim Jagielski 	nLen = nStrmSize - nStrmPos;
293*b1cdbd2cSJim Jagielski 	if(nLen >0)
294*b1cdbd2cSJim Jagielski 	{
295*b1cdbd2cSJim Jagielski 		sal_uInt8* pBuffer = new sal_uInt8[ nLen ];
296*b1cdbd2cSJim Jagielski 		tmpStrm.Read(pBuffer, nLen);
297*b1cdbd2cSJim Jagielski 		rStrm.Write( pBuffer, nLen );
298*b1cdbd2cSJim Jagielski 		delete[] pBuffer;
299*b1cdbd2cSJim Jagielski 	}
300*b1cdbd2cSJim Jagielski }
PreWriteHyperlinkWithinFly(const SwFrmFmt & rFmt,EscherPropertyContainer & rPropOpt)301*b1cdbd2cSJim Jagielski void SwBasicEscherEx::PreWriteHyperlinkWithinFly(const SwFrmFmt& rFmt,EscherPropertyContainer& rPropOpt)
302*b1cdbd2cSJim Jagielski {
303*b1cdbd2cSJim Jagielski 	const SfxPoolItem* pItem;
304*b1cdbd2cSJim Jagielski 	const SwAttrSet& rAttrSet = rFmt.GetAttrSet();
305*b1cdbd2cSJim Jagielski 	if (SFX_ITEM_SET == rAttrSet.GetItemState(RES_URL, true, &pItem))
306*b1cdbd2cSJim Jagielski 	{
307*b1cdbd2cSJim Jagielski 		const SwFmtURL *pINetFmt = dynamic_cast<const SwFmtURL*>(pItem);
308*b1cdbd2cSJim Jagielski 		if(pINetFmt && pINetFmt->GetURL().Len()>0)
309*b1cdbd2cSJim Jagielski 		{
310*b1cdbd2cSJim Jagielski 			SvMemoryStream *rStrm = new SvMemoryStream ;
311*b1cdbd2cSJim Jagielski 			String tmpstr=pINetFmt->GetURL();
312*b1cdbd2cSJim Jagielski 			WriteHyperlinkWithinFly( *rStrm, pINetFmt );
313*b1cdbd2cSJim Jagielski 			sal_uInt8* pBuf = (sal_uInt8*) rStrm->GetData();
314*b1cdbd2cSJim Jagielski 			sal_uInt32 nSize = rStrm->Seek( STREAM_SEEK_TO_END );
315*b1cdbd2cSJim Jagielski 			rPropOpt.AddOpt( ESCHER_Prop_pihlShape, sal_True, nSize, pBuf, nSize );
316*b1cdbd2cSJim Jagielski 			sal_uInt32 nValue;
317*b1cdbd2cSJim Jagielski 			String aNamestr = pINetFmt->GetName();
318*b1cdbd2cSJim Jagielski 			if(aNamestr.Len()>0)
319*b1cdbd2cSJim Jagielski 			{
320*b1cdbd2cSJim Jagielski 				rPropOpt.AddOpt(ESCHER_Prop_wzName, aNamestr );
321*b1cdbd2cSJim Jagielski 			}
322*b1cdbd2cSJim Jagielski 			if(rPropOpt.GetOpt( ESCHER_Prop_fPrint, nValue))
323*b1cdbd2cSJim Jagielski 			{
324*b1cdbd2cSJim Jagielski 				nValue|=0x03080008;
325*b1cdbd2cSJim Jagielski 				rPropOpt.AddOpt(ESCHER_Prop_fPrint, nValue );
326*b1cdbd2cSJim Jagielski 			}
327*b1cdbd2cSJim Jagielski 			else
328*b1cdbd2cSJim Jagielski 				rPropOpt.AddOpt(ESCHER_Prop_fPrint, 0x03080008 );
329*b1cdbd2cSJim Jagielski 		}
330*b1cdbd2cSJim Jagielski 	}
331*b1cdbd2cSJim Jagielski }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski //#110185# get a part fix for this type of element
MiserableFormFieldExportHack(const SwFrmFmt & rFrmFmt)334*b1cdbd2cSJim Jagielski bool WW8Export::MiserableFormFieldExportHack(const SwFrmFmt& rFrmFmt)
335*b1cdbd2cSJim Jagielski {
336*b1cdbd2cSJim Jagielski     ASSERT(bWrtWW8, "Not allowed");
337*b1cdbd2cSJim Jagielski     if (!bWrtWW8)
338*b1cdbd2cSJim Jagielski         return false;
339*b1cdbd2cSJim Jagielski     bool bHack = false;
340*b1cdbd2cSJim Jagielski     const SdrObject *pObject = rFrmFmt.FindRealSdrObject();
341*b1cdbd2cSJim Jagielski     if (pObject && pObject->GetObjInventor() == FmFormInventor)
342*b1cdbd2cSJim Jagielski     {
343*b1cdbd2cSJim Jagielski         if (SdrUnoObj *pFormObj = PTR_CAST(SdrUnoObj,pObject))
344*b1cdbd2cSJim Jagielski         {
345*b1cdbd2cSJim Jagielski             uno::Reference< awt::XControlModel > xControlModel =
346*b1cdbd2cSJim Jagielski                 pFormObj->GetUnoControlModel();
347*b1cdbd2cSJim Jagielski             uno::Reference< lang::XServiceInfo > xInfo(xControlModel,
348*b1cdbd2cSJim Jagielski                 uno::UNO_QUERY);
349*b1cdbd2cSJim Jagielski             uno::Reference<beans::XPropertySet> xPropSet(xControlModel, uno::UNO_QUERY);
350*b1cdbd2cSJim Jagielski             if (xInfo->supportsService(C2U("com.sun.star.form.component.ComboBox")))
351*b1cdbd2cSJim Jagielski             {
352*b1cdbd2cSJim Jagielski                 DoComboBox(xPropSet);
353*b1cdbd2cSJim Jagielski                 bHack = true;
354*b1cdbd2cSJim Jagielski             }
355*b1cdbd2cSJim Jagielski             else if (xInfo->supportsService(C2U("com.sun.star.form.component.CheckBox")))
356*b1cdbd2cSJim Jagielski             {
357*b1cdbd2cSJim Jagielski                 DoCheckBox(xPropSet);
358*b1cdbd2cSJim Jagielski                 bHack = true;
359*b1cdbd2cSJim Jagielski             }
360*b1cdbd2cSJim Jagielski         }
361*b1cdbd2cSJim Jagielski     }
362*b1cdbd2cSJim Jagielski     return bHack;
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 
DoComboBox(uno::Reference<beans::XPropertySet> xPropSet)366*b1cdbd2cSJim Jagielski void WW8Export::DoComboBox(uno::Reference<beans::XPropertySet> xPropSet)
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     rtl::OUString sSelected;
369*b1cdbd2cSJim Jagielski     uno::Sequence<rtl::OUString> aListItems;
370*b1cdbd2cSJim Jagielski     xPropSet->getPropertyValue(C2U("StringItemList")) >>= aListItems;
371*b1cdbd2cSJim Jagielski     sal_Int32 nNoStrings = aListItems.getLength();
372*b1cdbd2cSJim Jagielski     if (nNoStrings)
373*b1cdbd2cSJim Jagielski     {
374*b1cdbd2cSJim Jagielski         uno::Any aTmp = xPropSet->getPropertyValue(C2U("DefaultText"));
375*b1cdbd2cSJim Jagielski         const rtl::OUString *pStr = (const rtl::OUString *)aTmp.getValue();
376*b1cdbd2cSJim Jagielski         if (pStr)
377*b1cdbd2cSJim Jagielski             sSelected = *pStr;
378*b1cdbd2cSJim Jagielski     }
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski     rtl::OUString sName;
381*b1cdbd2cSJim Jagielski     {
382*b1cdbd2cSJim Jagielski         uno::Any aTmp = xPropSet->getPropertyValue(C2U("Name"));
383*b1cdbd2cSJim Jagielski         const rtl::OUString *pStr = (const rtl::OUString *)aTmp.getValue();
384*b1cdbd2cSJim Jagielski         if (pStr)
385*b1cdbd2cSJim Jagielski             sName = *pStr;
386*b1cdbd2cSJim Jagielski     }
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski     rtl::OUString sHelp;
390*b1cdbd2cSJim Jagielski     {
391*b1cdbd2cSJim Jagielski         // --> OD 2010-05-14 #160026#
392*b1cdbd2cSJim Jagielski         // property "Help" does not exist and due to the no-existence an exception is thrown.
393*b1cdbd2cSJim Jagielski //        uno::Any aTmp = xPropSet->getPropertyValue(C2U("Help"));
394*b1cdbd2cSJim Jagielski         try
395*b1cdbd2cSJim Jagielski         {
396*b1cdbd2cSJim Jagielski             uno::Any aTmp = xPropSet->getPropertyValue(C2U("HelpText"));
397*b1cdbd2cSJim Jagielski             // <--
398*b1cdbd2cSJim Jagielski             const rtl::OUString *pStr = (const rtl::OUString *)aTmp.getValue();
399*b1cdbd2cSJim Jagielski             if (pStr)
400*b1cdbd2cSJim Jagielski                 sHelp = *pStr;
401*b1cdbd2cSJim Jagielski         }
402*b1cdbd2cSJim Jagielski         catch( uno::Exception& )
403*b1cdbd2cSJim Jagielski         {}
404*b1cdbd2cSJim Jagielski         // <--
405*b1cdbd2cSJim Jagielski     }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     rtl::OUString sToolTip;
408*b1cdbd2cSJim Jagielski     {
409*b1cdbd2cSJim Jagielski         uno::Any aTmp = xPropSet->getPropertyValue(C2U("Name"));
410*b1cdbd2cSJim Jagielski         const rtl::OUString *pStr = (const rtl::OUString *)aTmp.getValue();
411*b1cdbd2cSJim Jagielski         if (pStr)
412*b1cdbd2cSJim Jagielski             sToolTip = *pStr;
413*b1cdbd2cSJim Jagielski     }
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski     DoComboBox(sName, sHelp, sToolTip, sSelected, aListItems);
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski 
DoComboBox(const rtl::OUString & rName,const rtl::OUString & rHelp,const rtl::OUString & rToolTip,const rtl::OUString & rSelected,uno::Sequence<rtl::OUString> & rListItems)418*b1cdbd2cSJim Jagielski void WW8Export::DoComboBox(const rtl::OUString &rName,
419*b1cdbd2cSJim Jagielski                              const rtl::OUString &rHelp,
420*b1cdbd2cSJim Jagielski                              const rtl::OUString &rToolTip,
421*b1cdbd2cSJim Jagielski                              const rtl::OUString &rSelected,
422*b1cdbd2cSJim Jagielski                              uno::Sequence<rtl::OUString> &rListItems)
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski     ASSERT(bWrtWW8, "Not allowed");
425*b1cdbd2cSJim Jagielski     if (!bWrtWW8)
426*b1cdbd2cSJim Jagielski         return;
427*b1cdbd2cSJim Jagielski     OutputField(0, ww::eFORMDROPDOWN, FieldString(ww::eFORMDROPDOWN),
428*b1cdbd2cSJim Jagielski              WRITEFIELD_START | WRITEFIELD_CMD_START);
429*b1cdbd2cSJim Jagielski     // write the refence to the "picture" structure
430*b1cdbd2cSJim Jagielski     sal_uLong nDataStt = pDataStrm->Tell();
431*b1cdbd2cSJim Jagielski     pChpPlc->AppendFkpEntry( Strm().Tell() );
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski     WriteChar( 0x01 );
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski     static sal_uInt8 aArr1[] =
436*b1cdbd2cSJim Jagielski     {
437*b1cdbd2cSJim Jagielski         0x03, 0x6a, 0,0,0,0,    // sprmCPicLocation
438*b1cdbd2cSJim Jagielski         0x06, 0x08, 0x01,       // sprmCFData
439*b1cdbd2cSJim Jagielski         0x55, 0x08, 0x01,       // sprmCFSpec
440*b1cdbd2cSJim Jagielski         0x02, 0x08, 0x01        // sprmCFFldVanish
441*b1cdbd2cSJim Jagielski     };
442*b1cdbd2cSJim Jagielski     sal_uInt8* pDataAdr = aArr1 + 2;
443*b1cdbd2cSJim Jagielski     Set_UInt32( pDataAdr, nDataStt );
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     pChpPlc->AppendFkpEntry(Strm().Tell(), sizeof(aArr1), aArr1);
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski     OutputField(0, ww::eFORMDROPDOWN, FieldString(ww::eFORMDROPDOWN),
448*b1cdbd2cSJim Jagielski              WRITEFIELD_CLOSE);
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski     ::sw::WW8FFData aFFData;
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski     aFFData.setType(2);
453*b1cdbd2cSJim Jagielski     aFFData.setName(rName);
454*b1cdbd2cSJim Jagielski     aFFData.setHelp(rHelp);
455*b1cdbd2cSJim Jagielski     aFFData.setStatus(rToolTip);
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski     sal_uInt32 nListItems = rListItems.getLength();
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski     for (sal_uInt32 i = 0; i < nListItems; i++)
460*b1cdbd2cSJim Jagielski     {
461*b1cdbd2cSJim Jagielski         if (i < 0x20 && rSelected == rListItems[i])
462*b1cdbd2cSJim Jagielski             aFFData.setResult(::sal::static_int_cast<sal_uInt8>(i));
463*b1cdbd2cSJim Jagielski         aFFData.addListboxEntry(rListItems[i]);
464*b1cdbd2cSJim Jagielski     }
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski     aFFData.Write(pDataStrm);
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski 
DoCheckBox(uno::Reference<beans::XPropertySet> xPropSet)469*b1cdbd2cSJim Jagielski void WW8Export::DoCheckBox(uno::Reference<beans::XPropertySet> xPropSet)
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski     uno::Reference<beans::XPropertySetInfo> xPropSetInfo =
472*b1cdbd2cSJim Jagielski         xPropSet->getPropertySetInfo();
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski     OutputField(0, ww::eFORMCHECKBOX, FieldString(ww::eFORMCHECKBOX),
475*b1cdbd2cSJim Jagielski         WRITEFIELD_START | WRITEFIELD_CMD_START);
476*b1cdbd2cSJim Jagielski     // write the refence to the "picture" structure
477*b1cdbd2cSJim Jagielski     sal_uLong nDataStt = pDataStrm->Tell();
478*b1cdbd2cSJim Jagielski     pChpPlc->AppendFkpEntry( Strm().Tell() );
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski     WriteChar( 0x01 );
481*b1cdbd2cSJim Jagielski     static sal_uInt8 aArr1[] = {
482*b1cdbd2cSJim Jagielski         0x03, 0x6a, 0,0,0,0,    // sprmCPicLocation
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski         0x06, 0x08, 0x01,       // sprmCFData
485*b1cdbd2cSJim Jagielski         0x55, 0x08, 0x01,       // sprmCFSpec
486*b1cdbd2cSJim Jagielski         0x02, 0x08, 0x01        // sprmCFFldVanish
487*b1cdbd2cSJim Jagielski     };
488*b1cdbd2cSJim Jagielski     sal_uInt8* pDataAdr = aArr1 + 2;
489*b1cdbd2cSJim Jagielski     Set_UInt32( pDataAdr, nDataStt );
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski     pChpPlc->AppendFkpEntry(Strm().Tell(),
492*b1cdbd2cSJim Jagielski                 sizeof( aArr1 ), aArr1 );
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski     ::sw::WW8FFData aFFData;
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski     aFFData.setType(1);
497*b1cdbd2cSJim Jagielski     aFFData.setCheckboxHeight(0x14);
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski     sal_Int16 nTemp = 0;
500*b1cdbd2cSJim Jagielski     xPropSet->getPropertyValue(C2U("DefaultState")) >>= nTemp;
501*b1cdbd2cSJim Jagielski     aFFData.setDefaultResult(nTemp);
502*b1cdbd2cSJim Jagielski 
503*b1cdbd2cSJim Jagielski     xPropSet->getPropertyValue(C2U("State")) >>= nTemp;
504*b1cdbd2cSJim Jagielski     aFFData.setResult(nTemp);
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski     ::rtl::OUString aStr;
507*b1cdbd2cSJim Jagielski     static ::rtl::OUString sName(C2U("Name"));
508*b1cdbd2cSJim Jagielski     if (xPropSetInfo->hasPropertyByName(sName))
509*b1cdbd2cSJim Jagielski     {
510*b1cdbd2cSJim Jagielski         xPropSet->getPropertyValue(sName) >>= aStr;
511*b1cdbd2cSJim Jagielski         aFFData.setName(aStr);
512*b1cdbd2cSJim Jagielski     }
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski     static ::rtl::OUString sHelpText(C2U("HelpText"));
515*b1cdbd2cSJim Jagielski     if (xPropSetInfo->hasPropertyByName(sHelpText))
516*b1cdbd2cSJim Jagielski     {
517*b1cdbd2cSJim Jagielski         xPropSet->getPropertyValue(sHelpText) >>= aStr;
518*b1cdbd2cSJim Jagielski         aFFData.setHelp(aStr);
519*b1cdbd2cSJim Jagielski     }
520*b1cdbd2cSJim Jagielski     static ::rtl::OUString sHelpF1Text(C2U("HelpF1Text"));
521*b1cdbd2cSJim Jagielski     if (xPropSetInfo->hasPropertyByName(sHelpF1Text))
522*b1cdbd2cSJim Jagielski     {
523*b1cdbd2cSJim Jagielski         xPropSet->getPropertyValue(sHelpF1Text) >>= aStr;
524*b1cdbd2cSJim Jagielski         aFFData.setStatus(aStr);
525*b1cdbd2cSJim Jagielski     }
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski     aFFData.Write(pDataStrm);
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski     OutputField(0, ww::eFORMCHECKBOX, aEmptyStr, WRITEFIELD_CLOSE);
530*b1cdbd2cSJim Jagielski }
531*b1cdbd2cSJim Jagielski 
DoFormText(const SwInputField * pFld)532*b1cdbd2cSJim Jagielski void WW8Export::DoFormText(const SwInputField * pFld)
533*b1cdbd2cSJim Jagielski {
534*b1cdbd2cSJim Jagielski     OutputField(0, ww::eFORMTEXT, FieldString(ww::eFORMTEXT),
535*b1cdbd2cSJim Jagielski         WRITEFIELD_START | WRITEFIELD_CMD_START);
536*b1cdbd2cSJim Jagielski     // write the refence to the "picture" structure
537*b1cdbd2cSJim Jagielski     sal_uLong nDataStt = pDataStrm->Tell();
538*b1cdbd2cSJim Jagielski     pChpPlc->AppendFkpEntry( Strm().Tell() );
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski     WriteChar( 0x01 );
541*b1cdbd2cSJim Jagielski     static sal_uInt8 aArr1[] = {
542*b1cdbd2cSJim Jagielski         0x02, 0x08, 0x81,        // sprmCFFldVanish
543*b1cdbd2cSJim Jagielski         0x03, 0x6a, 0,0,0,0,    // sprmCPicLocation
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski         0x06, 0x08, 0x01,       // sprmCFData
546*b1cdbd2cSJim Jagielski         0x55, 0x08, 0x01       // sprmCFSpec
547*b1cdbd2cSJim Jagielski     };
548*b1cdbd2cSJim Jagielski     sal_uInt8* pDataAdr = aArr1 + 5;
549*b1cdbd2cSJim Jagielski     Set_UInt32( pDataAdr, nDataStt );
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski     pChpPlc->AppendFkpEntry(Strm().Tell(),
552*b1cdbd2cSJim Jagielski                 sizeof( aArr1 ), aArr1 );
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski     ::sw::WW8FFData aFFData;
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski     aFFData.setType(0);
557*b1cdbd2cSJim Jagielski     aFFData.setName(pFld->GetPar2());
558*b1cdbd2cSJim Jagielski     aFFData.setHelp(pFld->GetHelp());
559*b1cdbd2cSJim Jagielski     aFFData.setStatus(pFld->GetToolTip());
560*b1cdbd2cSJim Jagielski     aFFData.Write(pDataStrm);
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski     OutputField(0, ww::eFORMTEXT, aEmptyStr, WRITEFIELD_CMD_END);
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski     const String fieldStr( pFld->ExpandField(true) );
565*b1cdbd2cSJim Jagielski     SwWW8Writer::WriteString16(Strm(), fieldStr, false);
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski     static sal_uInt8 aArr2[] = {
568*b1cdbd2cSJim Jagielski         0x55, 0x08, 0x01,  // sprmCFSpec
569*b1cdbd2cSJim Jagielski         0x75, 0x08, 0x01       // ???
570*b1cdbd2cSJim Jagielski     };
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski     pDataAdr = aArr2 + 2;
573*b1cdbd2cSJim Jagielski     Set_UInt32( pDataAdr, nDataStt );
574*b1cdbd2cSJim Jagielski     pChpPlc->AppendFkpEntry(Strm().Tell(),
575*b1cdbd2cSJim Jagielski                 sizeof( aArr2 ), aArr2 );
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski     OutputField(0, ww::eFORMTEXT, aEmptyStr, WRITEFIELD_CLOSE);
578*b1cdbd2cSJim Jagielski }
579*b1cdbd2cSJim Jagielski 
~PlcDrawObj()580*b1cdbd2cSJim Jagielski PlcDrawObj::~PlcDrawObj()
581*b1cdbd2cSJim Jagielski {
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski //Its irritating to have to change the RTL frames position into LTR ones
585*b1cdbd2cSJim Jagielski //so that word will have to place them in the right place. Doubly so that
586*b1cdbd2cSJim Jagielski //the SO drawings and writer frames have different ideas themselves as to
587*b1cdbd2cSJim Jagielski //how to be positioned when in RTL mode!
RTLGraphicsHack(SwTwips & rLeft,SwTwips nWidth,sal_Int16 eHoriOri,sal_Int16 eHoriRel,SwTwips nPageLeft,SwTwips nPageRight,SwTwips nPageSize)588*b1cdbd2cSJim Jagielski bool RTLGraphicsHack(SwTwips &rLeft, SwTwips nWidth,
589*b1cdbd2cSJim Jagielski sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft,
590*b1cdbd2cSJim Jagielski     SwTwips nPageRight, SwTwips nPageSize)
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski     bool bRet = false;
593*b1cdbd2cSJim Jagielski     if (eHoriOri == text::HoriOrientation::NONE)
594*b1cdbd2cSJim Jagielski     {
595*b1cdbd2cSJim Jagielski         if (eHoriRel == text::RelOrientation::PAGE_FRAME)
596*b1cdbd2cSJim Jagielski         {
597*b1cdbd2cSJim Jagielski             rLeft = nPageSize - rLeft;
598*b1cdbd2cSJim Jagielski             bRet = true;
599*b1cdbd2cSJim Jagielski         }
600*b1cdbd2cSJim Jagielski         else if (
601*b1cdbd2cSJim Jagielski                   (eHoriRel == text::RelOrientation::PAGE_PRINT_AREA) ||
602*b1cdbd2cSJim Jagielski                   (eHoriRel == text::RelOrientation::FRAME) ||
603*b1cdbd2cSJim Jagielski                   (eHoriRel == text::RelOrientation::PRINT_AREA)
604*b1cdbd2cSJim Jagielski                 )
605*b1cdbd2cSJim Jagielski         {
606*b1cdbd2cSJim Jagielski             rLeft = nPageSize - nPageLeft - nPageRight - rLeft;
607*b1cdbd2cSJim Jagielski             bRet = true;
608*b1cdbd2cSJim Jagielski         }
609*b1cdbd2cSJim Jagielski     }
610*b1cdbd2cSJim Jagielski     if (bRet)
611*b1cdbd2cSJim Jagielski         rLeft -= nWidth;
612*b1cdbd2cSJim Jagielski     return bRet;
613*b1cdbd2cSJim Jagielski }
614*b1cdbd2cSJim Jagielski 
RTLDrawingsHack(long & rLeft,long,sal_Int16 eHoriOri,sal_Int16 eHoriRel,SwTwips nPageLeft,SwTwips nPageRight,SwTwips nPageSize)615*b1cdbd2cSJim Jagielski bool RTLDrawingsHack(long &rLeft, long /*nWidth*/,
616*b1cdbd2cSJim Jagielski     sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft,
617*b1cdbd2cSJim Jagielski     SwTwips nPageRight, SwTwips nPageSize)
618*b1cdbd2cSJim Jagielski {
619*b1cdbd2cSJim Jagielski     bool bRet = false;
620*b1cdbd2cSJim Jagielski     if (eHoriOri == text::HoriOrientation::NONE)
621*b1cdbd2cSJim Jagielski     {
622*b1cdbd2cSJim Jagielski         if (eHoriRel == text::RelOrientation::PAGE_FRAME)
623*b1cdbd2cSJim Jagielski         {
624*b1cdbd2cSJim Jagielski             rLeft = nPageSize + rLeft;
625*b1cdbd2cSJim Jagielski             bRet = true;
626*b1cdbd2cSJim Jagielski         }
627*b1cdbd2cSJim Jagielski         else if (
628*b1cdbd2cSJim Jagielski                   (eHoriRel == text::RelOrientation::PAGE_PRINT_AREA) ||
629*b1cdbd2cSJim Jagielski                   (eHoriRel == text::RelOrientation::FRAME) ||
630*b1cdbd2cSJim Jagielski                   (eHoriRel == text::RelOrientation::PRINT_AREA)
631*b1cdbd2cSJim Jagielski                 )
632*b1cdbd2cSJim Jagielski         {
633*b1cdbd2cSJim Jagielski             rLeft = nPageSize - nPageLeft - nPageRight + rLeft;
634*b1cdbd2cSJim Jagielski             bRet = true;
635*b1cdbd2cSJim Jagielski         }
636*b1cdbd2cSJim Jagielski     }
637*b1cdbd2cSJim Jagielski     return bRet;
638*b1cdbd2cSJim Jagielski }
639*b1cdbd2cSJim Jagielski 
MiserableRTLFrmFmtHack(SwTwips & rLeft,SwTwips & rRight,const sw::Frame & rFrmFmt)640*b1cdbd2cSJim Jagielski bool WW8Export::MiserableRTLFrmFmtHack(SwTwips &rLeft, SwTwips &rRight,
641*b1cdbd2cSJim Jagielski     const sw::Frame &rFrmFmt)
642*b1cdbd2cSJim Jagielski {
643*b1cdbd2cSJim Jagielski     //Require nasty bidi swap
644*b1cdbd2cSJim Jagielski     if (FRMDIR_HORI_RIGHT_TOP != pDoc->GetTextDirection(rFrmFmt.GetPosition()))
645*b1cdbd2cSJim Jagielski         return false;
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski     SwTwips nWidth = rRight - rLeft;
648*b1cdbd2cSJim Jagielski     SwTwips nPageLeft, nPageRight;
649*b1cdbd2cSJim Jagielski     SwTwips nPageSize = CurrentPageWidth(nPageLeft, nPageRight);
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski     const SwFmtHoriOrient& rHOr = rFrmFmt.GetFrmFmt().GetHoriOrient();
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski     bool bRet = false;
654*b1cdbd2cSJim Jagielski     sw::Frame::WriterSource eSource = rFrmFmt.GetWriterType();
655*b1cdbd2cSJim Jagielski     if (eSource == sw::Frame::eDrawing || eSource == sw::Frame::eFormControl)
656*b1cdbd2cSJim Jagielski     {
657*b1cdbd2cSJim Jagielski         if (RTLDrawingsHack(rLeft, nWidth, rHOr.GetHoriOrient(),
658*b1cdbd2cSJim Jagielski             rHOr.GetRelationOrient(), nPageLeft, nPageRight, nPageSize))
659*b1cdbd2cSJim Jagielski         {
660*b1cdbd2cSJim Jagielski             bRet = true;
661*b1cdbd2cSJim Jagielski         }
662*b1cdbd2cSJim Jagielski     }
663*b1cdbd2cSJim Jagielski     else
664*b1cdbd2cSJim Jagielski     {
665*b1cdbd2cSJim Jagielski         if (RTLGraphicsHack(rLeft, nWidth, rHOr.GetHoriOrient(),
666*b1cdbd2cSJim Jagielski             rHOr.GetRelationOrient(), nPageLeft, nPageRight, nPageSize))
667*b1cdbd2cSJim Jagielski         {
668*b1cdbd2cSJim Jagielski             bRet = true;
669*b1cdbd2cSJim Jagielski         }
670*b1cdbd2cSJim Jagielski     }
671*b1cdbd2cSJim Jagielski     if (bRet)
672*b1cdbd2cSJim Jagielski         rRight = rLeft + nWidth;
673*b1cdbd2cSJim Jagielski     return bRet;
674*b1cdbd2cSJim Jagielski }
675*b1cdbd2cSJim Jagielski 
WritePlc(WW8Export & rWrt) const676*b1cdbd2cSJim Jagielski void PlcDrawObj::WritePlc( WW8Export& rWrt ) const
677*b1cdbd2cSJim Jagielski {
678*b1cdbd2cSJim Jagielski     if (8 > rWrt.pFib->nVersion)    // Cannot export drawobject in vers 7-
679*b1cdbd2cSJim Jagielski         return;
680*b1cdbd2cSJim Jagielski 
681*b1cdbd2cSJim Jagielski     sal_uInt32 nFcStart = rWrt.pTableStrm->Tell();
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski     if (!maDrawObjs.empty())
684*b1cdbd2cSJim Jagielski     {
685*b1cdbd2cSJim Jagielski         // write CPs
686*b1cdbd2cSJim Jagielski         WW8Fib& rFib = *rWrt.pFib;
687*b1cdbd2cSJim Jagielski         WW8_CP nCpOffs = GetCpOffset(rFib);
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski         cDrawObjIter aEnd = maDrawObjs.end();
690*b1cdbd2cSJim Jagielski         cDrawObjIter aIter;
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski         for (aIter = maDrawObjs.begin(); aIter < aEnd; ++aIter)
693*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteLong(*rWrt.pTableStrm, aIter->mnCp - nCpOffs);
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteLong(*rWrt.pTableStrm, rFib.ccpText + rFib.ccpFtn +
696*b1cdbd2cSJim Jagielski             rFib.ccpHdr + rFib.ccpEdn + rFib.ccpTxbx + rFib.ccpHdrTxbx + 1);
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski         for (aIter = maDrawObjs.begin(); aIter < aEnd; ++aIter)
699*b1cdbd2cSJim Jagielski         {
700*b1cdbd2cSJim Jagielski             // write the fspa-struct
701*b1cdbd2cSJim Jagielski             const sw::Frame &rFrmFmt = aIter->maCntnt;
702*b1cdbd2cSJim Jagielski             const SwFrmFmt &rFmt = rFrmFmt.GetFrmFmt();
703*b1cdbd2cSJim Jagielski             const SdrObject* pObj = rFmt.FindRealSdrObject();
704*b1cdbd2cSJim Jagielski 
705*b1cdbd2cSJim Jagielski             Rectangle aRect;
706*b1cdbd2cSJim Jagielski             SwFmtVertOrient rVOr = rFmt.GetVertOrient();
707*b1cdbd2cSJim Jagielski             SwFmtHoriOrient rHOr = rFmt.GetHoriOrient();
708*b1cdbd2cSJim Jagielski             // --> OD 2005-01-06 #i30669# - convert the positioning attributes.
709*b1cdbd2cSJim Jagielski             // Most positions are converted, if layout information exists.
710*b1cdbd2cSJim Jagielski             const bool bPosConverted =
711*b1cdbd2cSJim Jagielski                 WinwordAnchoring::ConvertPosition( rHOr, rVOr, rFmt );
712*b1cdbd2cSJim Jagielski             // <--
713*b1cdbd2cSJim Jagielski 
714*b1cdbd2cSJim Jagielski             Point aObjPos;
715*b1cdbd2cSJim Jagielski             if (RES_FLYFRMFMT == rFmt.Which())
716*b1cdbd2cSJim Jagielski             {
717*b1cdbd2cSJim Jagielski                 SwRect aLayRect(rFmt.FindLayoutRect(false, &aObjPos));
718*b1cdbd2cSJim Jagielski                 // the Object is not visible - so get the values from
719*b1cdbd2cSJim Jagielski                 // the format. The Position may not be correct.
720*b1cdbd2cSJim Jagielski                 if( aLayRect.IsEmpty() )
721*b1cdbd2cSJim Jagielski                     aRect.SetSize( rFmt.GetFrmSize().GetSize() );
722*b1cdbd2cSJim Jagielski                 else
723*b1cdbd2cSJim Jagielski                 {
724*b1cdbd2cSJim Jagielski                     // --> FME 2007-06-20 #i56090# Do not only consider the first client
725*b1cdbd2cSJim Jagielski                     // Note that we actually would have to find the maximum size of the
726*b1cdbd2cSJim Jagielski                     // frame format clients. However, this already should work in most cases.
727*b1cdbd2cSJim Jagielski                     const SwRect aSizeRect(rFmt.FindLayoutRect());
728*b1cdbd2cSJim Jagielski                     if ( aSizeRect.Width() > aLayRect.Width() )
729*b1cdbd2cSJim Jagielski                         aLayRect.Width( aSizeRect.Width() );
730*b1cdbd2cSJim Jagielski                     // <--
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski                     aRect = aLayRect.SVRect();
733*b1cdbd2cSJim Jagielski                 }
734*b1cdbd2cSJim Jagielski             }
735*b1cdbd2cSJim Jagielski             else
736*b1cdbd2cSJim Jagielski             {
737*b1cdbd2cSJim Jagielski                 ASSERT(pObj, "wo ist das SDR-Object?");
738*b1cdbd2cSJim Jagielski                 if (pObj)
739*b1cdbd2cSJim Jagielski                 {
740*b1cdbd2cSJim Jagielski                     aRect = pObj->GetSnapRect();
741*b1cdbd2cSJim Jagielski                 }
742*b1cdbd2cSJim Jagielski             }
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski             // --> OD 2005-01-06 #i30669# - use converted position, if conversion
745*b1cdbd2cSJim Jagielski             // is performed. Unify position determination of Writer fly frames
746*b1cdbd2cSJim Jagielski             // and drawing objects.
747*b1cdbd2cSJim Jagielski             if ( bPosConverted )
748*b1cdbd2cSJim Jagielski             {
749*b1cdbd2cSJim Jagielski                 aRect.SetPos( Point( rHOr.GetPos(), rVOr.GetPos() ) );
750*b1cdbd2cSJim Jagielski             }
751*b1cdbd2cSJim Jagielski             else
752*b1cdbd2cSJim Jagielski             {
753*b1cdbd2cSJim Jagielski                 aRect -= aIter->maParentPos;
754*b1cdbd2cSJim Jagielski                 aObjPos = aRect.TopLeft();
755*b1cdbd2cSJim Jagielski                 if (text::VertOrientation::NONE == rVOr.GetVertOrient())
756*b1cdbd2cSJim Jagielski                 {
757*b1cdbd2cSJim Jagielski                     // CMC, OD 24.11.2003 #i22673#
758*b1cdbd2cSJim Jagielski                     sal_Int16 eOri = rVOr.GetRelationOrient();
759*b1cdbd2cSJim Jagielski                     if (eOri == text::RelOrientation::CHAR || eOri == text::RelOrientation::TEXT_LINE)
760*b1cdbd2cSJim Jagielski                         aObjPos.Y() = -rVOr.GetPos();
761*b1cdbd2cSJim Jagielski                     else
762*b1cdbd2cSJim Jagielski                         aObjPos.Y() = rVOr.GetPos();
763*b1cdbd2cSJim Jagielski                 }
764*b1cdbd2cSJim Jagielski                 if (text::HoriOrientation::NONE == rHOr.GetHoriOrient())
765*b1cdbd2cSJim Jagielski                     aObjPos.X() = rHOr.GetPos();
766*b1cdbd2cSJim Jagielski                 aRect.SetPos( aObjPos );
767*b1cdbd2cSJim Jagielski             }
768*b1cdbd2cSJim Jagielski             // <--
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski             sal_Int32 nThick = aIter->mnThick;
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski             //If we are being exported as an inline hack, set
773*b1cdbd2cSJim Jagielski             //corner to 0 and forget about border thickness for positioning
774*b1cdbd2cSJim Jagielski             if (rFrmFmt.IsInline())
775*b1cdbd2cSJim Jagielski             {
776*b1cdbd2cSJim Jagielski                 aRect.SetPos(Point(0,0));
777*b1cdbd2cSJim Jagielski                 nThick = 0;
778*b1cdbd2cSJim Jagielski             }
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski             // spid
781*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteLong(*rWrt.pTableStrm, aIter->mnShapeId);
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski             SwTwips nLeft = aRect.Left() + nThick;
784*b1cdbd2cSJim Jagielski             SwTwips nRight = aRect.Right() - nThick;
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski             //Nasty swap for bidi if neccessary
787*b1cdbd2cSJim Jagielski             rWrt.MiserableRTLFrmFmtHack(nLeft, nRight, rFrmFmt);
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski             //xaLeft/yaTop/xaRight/yaBottom - rel. to anchor
790*b1cdbd2cSJim Jagielski             //(most of) the border is outside the graphic is word, so
791*b1cdbd2cSJim Jagielski             //change dimensions to fit
792*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteLong(*rWrt.pTableStrm, nLeft);
793*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteLong(*rWrt.pTableStrm,aRect.Top() + nThick);
794*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteLong(*rWrt.pTableStrm, nRight);
795*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteLong(*rWrt.pTableStrm,aRect.Bottom() - nThick);
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski             //fHdr/bx/by/wr/wrk/fRcaSimple/fBelowText/fAnchorLock
798*b1cdbd2cSJim Jagielski             sal_uInt16 nFlags=0;
799*b1cdbd2cSJim Jagielski             //If nFlags isn't 0x14 its overridden by the escher properties
800*b1cdbd2cSJim Jagielski             if (FLY_AT_PAGE == rFmt.GetAnchor().GetAnchorId())
801*b1cdbd2cSJim Jagielski                 nFlags = 0x0000;
802*b1cdbd2cSJim Jagielski             else
803*b1cdbd2cSJim Jagielski                 nFlags = 0x0014;        // x-rel to text,  y-rel to text
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski             const SwFmtSurround& rSurr = rFmt.GetSurround();
806*b1cdbd2cSJim Jagielski             sal_uInt16 nContour = rSurr.IsContour() ? 0x0080 : 0x0040;
807*b1cdbd2cSJim Jagielski             SwSurround eSurround = rSurr.GetSurround();
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski             /*
810*b1cdbd2cSJim Jagielski              #i3958#
811*b1cdbd2cSJim Jagielski              The inline elements being export as anchored to character inside
812*b1cdbd2cSJim Jagielski              the shape field hack are required to be wrap through so as to flow
813*b1cdbd2cSJim Jagielski              over the following dummy 0x01 graphic
814*b1cdbd2cSJim Jagielski             */
815*b1cdbd2cSJim Jagielski             if (rFrmFmt.IsInline())
816*b1cdbd2cSJim Jagielski                 eSurround = SURROUND_THROUGHT;
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski             switch (eSurround)
819*b1cdbd2cSJim Jagielski             {
820*b1cdbd2cSJim Jagielski                 case SURROUND_NONE:
821*b1cdbd2cSJim Jagielski                     nFlags |= 0x0020;
822*b1cdbd2cSJim Jagielski                     break;
823*b1cdbd2cSJim Jagielski                 case SURROUND_THROUGHT:
824*b1cdbd2cSJim Jagielski                     nFlags |= 0x0060;
825*b1cdbd2cSJim Jagielski                     break;
826*b1cdbd2cSJim Jagielski                 case SURROUND_PARALLEL:
827*b1cdbd2cSJim Jagielski                     nFlags |= 0x0000 | nContour;
828*b1cdbd2cSJim Jagielski                     break;
829*b1cdbd2cSJim Jagielski                 case SURROUND_IDEAL:
830*b1cdbd2cSJim Jagielski                     nFlags |= 0x0600 | nContour;
831*b1cdbd2cSJim Jagielski                     break;
832*b1cdbd2cSJim Jagielski                 case SURROUND_LEFT:
833*b1cdbd2cSJim Jagielski                     nFlags |= 0x0200 | nContour;
834*b1cdbd2cSJim Jagielski                     break;
835*b1cdbd2cSJim Jagielski                 case SURROUND_RIGHT:
836*b1cdbd2cSJim Jagielski                     nFlags |= 0x0400 | nContour;
837*b1cdbd2cSJim Jagielski                     break;
838*b1cdbd2cSJim Jagielski                 default:
839*b1cdbd2cSJim Jagielski                     ASSERT(!this, "Unsupported surround type for export");
840*b1cdbd2cSJim Jagielski                     break;
841*b1cdbd2cSJim Jagielski             }
842*b1cdbd2cSJim Jagielski             if (pObj && (pObj->GetLayer() == rWrt.pDoc->GetHellId() ||
843*b1cdbd2cSJim Jagielski                     pObj->GetLayer() == rWrt.pDoc->GetInvisibleHellId()))
844*b1cdbd2cSJim Jagielski             {
845*b1cdbd2cSJim Jagielski                 nFlags |= 0x4000;
846*b1cdbd2cSJim Jagielski             }
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski             /*
849*b1cdbd2cSJim Jagielski              #i3958# Required to make this inline stuff work in WordXP, not
850*b1cdbd2cSJim Jagielski              needed for 2003 interestingly
851*b1cdbd2cSJim Jagielski              */
852*b1cdbd2cSJim Jagielski             if (rFrmFmt.IsInline())
853*b1cdbd2cSJim Jagielski                 nFlags |= 0x8000;
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteShort(*rWrt.pTableStrm, nFlags);
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski             // cTxbx
858*b1cdbd2cSJim Jagielski             SwWW8Writer::WriteLong(*rWrt.pTableStrm, 0);
859*b1cdbd2cSJim Jagielski         }
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski         RegisterWithFib(rFib, nFcStart, rWrt.pTableStrm->Tell() - nFcStart);
862*b1cdbd2cSJim Jagielski     }
863*b1cdbd2cSJim Jagielski }
864*b1cdbd2cSJim Jagielski 
RegisterWithFib(WW8Fib & rFib,sal_uInt32 nStart,sal_uInt32 nLen) const865*b1cdbd2cSJim Jagielski void MainTxtPlcDrawObj::RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart,
866*b1cdbd2cSJim Jagielski     sal_uInt32 nLen) const
867*b1cdbd2cSJim Jagielski {
868*b1cdbd2cSJim Jagielski     rFib.fcPlcfspaMom = nStart;
869*b1cdbd2cSJim Jagielski     rFib.lcbPlcfspaMom = nLen;
870*b1cdbd2cSJim Jagielski }
871*b1cdbd2cSJim Jagielski 
GetCpOffset(const WW8Fib &) const872*b1cdbd2cSJim Jagielski WW8_CP MainTxtPlcDrawObj::GetCpOffset(const WW8Fib &) const
873*b1cdbd2cSJim Jagielski {
874*b1cdbd2cSJim Jagielski     return 0;
875*b1cdbd2cSJim Jagielski }
876*b1cdbd2cSJim Jagielski 
RegisterWithFib(WW8Fib & rFib,sal_uInt32 nStart,sal_uInt32 nLen) const877*b1cdbd2cSJim Jagielski void HdFtPlcDrawObj::RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart,
878*b1cdbd2cSJim Jagielski     sal_uInt32 nLen) const
879*b1cdbd2cSJim Jagielski {
880*b1cdbd2cSJim Jagielski     rFib.fcPlcfspaHdr = nStart;
881*b1cdbd2cSJim Jagielski     rFib.lcbPlcfspaHdr = nLen;
882*b1cdbd2cSJim Jagielski }
883*b1cdbd2cSJim Jagielski 
GetCpOffset(const WW8Fib & rFib) const884*b1cdbd2cSJim Jagielski WW8_CP HdFtPlcDrawObj::GetCpOffset(const WW8Fib &rFib) const
885*b1cdbd2cSJim Jagielski {
886*b1cdbd2cSJim Jagielski     return rFib.ccpText + rFib.ccpFtn;
887*b1cdbd2cSJim Jagielski }
888*b1cdbd2cSJim Jagielski 
operator =(const DrawObj & rOther)889*b1cdbd2cSJim Jagielski DrawObj& DrawObj::operator=(const DrawObj& rOther)
890*b1cdbd2cSJim Jagielski {
891*b1cdbd2cSJim Jagielski     mnCp = rOther.mnCp;
892*b1cdbd2cSJim Jagielski     mnShapeId = rOther.mnShapeId;
893*b1cdbd2cSJim Jagielski     maCntnt = rOther.maCntnt;
894*b1cdbd2cSJim Jagielski     maParentPos = rOther.maParentPos;
895*b1cdbd2cSJim Jagielski     mnThick = rOther.mnThick;
896*b1cdbd2cSJim Jagielski     mnDirection = rOther.mnDirection;
897*b1cdbd2cSJim Jagielski     mnHdFtIndex = rOther.mnHdFtIndex;
898*b1cdbd2cSJim Jagielski     return *this;
899*b1cdbd2cSJim Jagielski }
900*b1cdbd2cSJim Jagielski 
Append(WW8Export & rWrt,WW8_CP nCp,const sw::Frame & rFmt,const Point & rNdTopLeft)901*b1cdbd2cSJim Jagielski bool PlcDrawObj::Append( WW8Export& rWrt, WW8_CP nCp, const sw::Frame& rFmt,
902*b1cdbd2cSJim Jagielski     const Point& rNdTopLeft )
903*b1cdbd2cSJim Jagielski {
904*b1cdbd2cSJim Jagielski     bool bRet = false;
905*b1cdbd2cSJim Jagielski     const SwFrmFmt &rFormat = rFmt.GetFrmFmt();
906*b1cdbd2cSJim Jagielski     if (TXT_HDFT == rWrt.nTxtTyp || TXT_MAINTEXT == rWrt.nTxtTyp)
907*b1cdbd2cSJim Jagielski     {
908*b1cdbd2cSJim Jagielski         if (RES_FLYFRMFMT == rFormat.Which())
909*b1cdbd2cSJim Jagielski         {
910*b1cdbd2cSJim Jagielski             // check for textflyframe and if it is the first in a Chain
911*b1cdbd2cSJim Jagielski             if (rFormat.GetCntnt().GetCntntIdx())
912*b1cdbd2cSJim Jagielski                 bRet = true;
913*b1cdbd2cSJim Jagielski         }
914*b1cdbd2cSJim Jagielski         else
915*b1cdbd2cSJim Jagielski             bRet = true;
916*b1cdbd2cSJim Jagielski     }
917*b1cdbd2cSJim Jagielski 
918*b1cdbd2cSJim Jagielski     if (bRet)
919*b1cdbd2cSJim Jagielski     {
920*b1cdbd2cSJim Jagielski         DrawObj aObj(rFmt, nCp, rNdTopLeft, rWrt.TrueFrameDirection(rFormat),
921*b1cdbd2cSJim Jagielski             rWrt.GetHdFtIndex());
922*b1cdbd2cSJim Jagielski         maDrawObjs.push_back(aObj);
923*b1cdbd2cSJim Jagielski     }
924*b1cdbd2cSJim Jagielski     return bRet;
925*b1cdbd2cSJim Jagielski }
926*b1cdbd2cSJim Jagielski 
SetShapeDetails(sal_uInt32 nId,sal_Int32 nThick)927*b1cdbd2cSJim Jagielski void DrawObj::SetShapeDetails(sal_uInt32 nId, sal_Int32 nThick)
928*b1cdbd2cSJim Jagielski {
929*b1cdbd2cSJim Jagielski     mnShapeId = nId;
930*b1cdbd2cSJim Jagielski     mnThick = nThick;
931*b1cdbd2cSJim Jagielski }
932*b1cdbd2cSJim Jagielski 
WriteTxt(WW8Export & rWrt)933*b1cdbd2cSJim Jagielski bool WW8_WrPlcTxtBoxes::WriteTxt( WW8Export& rWrt )
934*b1cdbd2cSJim Jagielski {
935*b1cdbd2cSJim Jagielski     bool bRet = false;
936*b1cdbd2cSJim Jagielski     rWrt.bInWriteEscher = true;
937*b1cdbd2cSJim Jagielski     WW8_CP& rccp=TXT_TXTBOX == nTyp ? rWrt.pFib->ccpTxbx : rWrt.pFib->ccpHdrTxbx;
938*b1cdbd2cSJim Jagielski 
939*b1cdbd2cSJim Jagielski     bRet = WriteGenericTxt( rWrt, nTyp, rccp );
940*b1cdbd2cSJim Jagielski 
941*b1cdbd2cSJim Jagielski     WW8_CP nCP = rWrt.Fc2Cp( rWrt.Strm().Tell() );
942*b1cdbd2cSJim Jagielski     WW8Fib& rFib = *rWrt.pFib;
943*b1cdbd2cSJim Jagielski     WW8_CP nMyOffset = rFib.ccpText + rFib.ccpFtn + rFib.ccpHdr + rFib.ccpAtn
944*b1cdbd2cSJim Jagielski                             + rFib.ccpEdn;
945*b1cdbd2cSJim Jagielski     if( TXT_TXTBOX == nTyp )
946*b1cdbd2cSJim Jagielski         rWrt.pFldTxtBxs->Finish( nCP, nMyOffset );
947*b1cdbd2cSJim Jagielski     else
948*b1cdbd2cSJim Jagielski         rWrt.pFldHFTxtBxs->Finish( nCP, nMyOffset + rFib.ccpTxbx );
949*b1cdbd2cSJim Jagielski     rWrt.bInWriteEscher = false;
950*b1cdbd2cSJim Jagielski     return bRet;
951*b1cdbd2cSJim Jagielski }
952*b1cdbd2cSJim Jagielski 
Append(const SdrObject & rObj,sal_uInt32 nShapeId)953*b1cdbd2cSJim Jagielski void WW8_WrPlcTxtBoxes::Append( const SdrObject& rObj, sal_uInt32 nShapeId )
954*b1cdbd2cSJim Jagielski {
955*b1cdbd2cSJim Jagielski     void* p = (void*)&rObj;
956*b1cdbd2cSJim Jagielski     aCntnt.Insert( p, aCntnt.Count() );
957*b1cdbd2cSJim Jagielski     aShapeIds.Insert( nShapeId, aShapeIds.Count() );
958*b1cdbd2cSJim Jagielski 	//save NULL, if we have an actual SdrObject
959*b1cdbd2cSJim Jagielski 	aSpareFmts.Insert( (void*)NULL, aSpareFmts.Count() );
960*b1cdbd2cSJim Jagielski }
961*b1cdbd2cSJim Jagielski 
Append(const SwFrmFmt * pFmt,sal_uInt32 nShapeId)962*b1cdbd2cSJim Jagielski void WW8_WrPlcTxtBoxes::Append( const SwFrmFmt* pFmt, sal_uInt32 nShapeId )
963*b1cdbd2cSJim Jagielski {
964*b1cdbd2cSJim Jagielski 	//no sdr object, we insert a NULL in the aCntnt and save the real fmt in aSpareFmts.
965*b1cdbd2cSJim Jagielski 	aCntnt.Insert( (void*)NULL, aCntnt.Count() );
966*b1cdbd2cSJim Jagielski 	aShapeIds.Insert( nShapeId, aShapeIds.Count() );
967*b1cdbd2cSJim Jagielski 	aSpareFmts.Insert( (void*)pFmt, aSpareFmts.Count() );
968*b1cdbd2cSJim Jagielski }
969*b1cdbd2cSJim Jagielski 
GetShapeIdArr() const970*b1cdbd2cSJim Jagielski const SvULongs* WW8_WrPlcTxtBoxes::GetShapeIdArr() const
971*b1cdbd2cSJim Jagielski {
972*b1cdbd2cSJim Jagielski     return &aShapeIds;
973*b1cdbd2cSJim Jagielski }
974*b1cdbd2cSJim Jagielski 
975*b1cdbd2cSJim Jagielski /*  */
976*b1cdbd2cSJim Jagielski 
GetSdrOrdNum(const SwFrmFmt & rFmt) const977*b1cdbd2cSJim Jagielski sal_uInt32 WW8Export::GetSdrOrdNum( const SwFrmFmt& rFmt ) const
978*b1cdbd2cSJim Jagielski {
979*b1cdbd2cSJim Jagielski     sal_uInt32 nOrdNum;
980*b1cdbd2cSJim Jagielski     const SdrObject* pObj = rFmt.FindRealSdrObject();
981*b1cdbd2cSJim Jagielski     if( pObj )
982*b1cdbd2cSJim Jagielski         nOrdNum = pObj->GetOrdNum();
983*b1cdbd2cSJim Jagielski     else
984*b1cdbd2cSJim Jagielski     {
985*b1cdbd2cSJim Jagielski         // no Layout for this format, then recalc the ordnum
986*b1cdbd2cSJim Jagielski         SwFrmFmt* pFmt = (SwFrmFmt*)&rFmt;
987*b1cdbd2cSJim Jagielski         nOrdNum = pDoc->GetSpzFrmFmts()->GetPos( pFmt );
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski         const SdrModel* pModel = pDoc->GetDrawModel();
990*b1cdbd2cSJim Jagielski         if( pModel )
991*b1cdbd2cSJim Jagielski             nOrdNum += pModel->GetPage( 0 )->GetObjCount();
992*b1cdbd2cSJim Jagielski     }
993*b1cdbd2cSJim Jagielski     return nOrdNum;
994*b1cdbd2cSJim Jagielski }
995*b1cdbd2cSJim Jagielski 
AppendFlyInFlys(const sw::Frame & rFrmFmt,const Point & rNdTopLeft)996*b1cdbd2cSJim Jagielski void WW8Export::AppendFlyInFlys(const sw::Frame& rFrmFmt,
997*b1cdbd2cSJim Jagielski     const Point& rNdTopLeft)
998*b1cdbd2cSJim Jagielski {
999*b1cdbd2cSJim Jagielski     ASSERT(bWrtWW8, "this has gone horribly wrong");
1000*b1cdbd2cSJim Jagielski     ASSERT(!pEscher, "der EscherStream wurde schon geschrieben!");
1001*b1cdbd2cSJim Jagielski     if (pEscher)
1002*b1cdbd2cSJim Jagielski         return ;
1003*b1cdbd2cSJim Jagielski     PlcDrawObj *pDrwO;
1004*b1cdbd2cSJim Jagielski     if (TXT_HDFT == nTxtTyp)
1005*b1cdbd2cSJim Jagielski         pDrwO = pHFSdrObjs;
1006*b1cdbd2cSJim Jagielski     else
1007*b1cdbd2cSJim Jagielski         pDrwO = pSdrObjs;
1008*b1cdbd2cSJim Jagielski 
1009*b1cdbd2cSJim Jagielski     if (rFrmFmt.IsInline())
1010*b1cdbd2cSJim Jagielski     {
1011*b1cdbd2cSJim Jagielski         OutputField(0, ww::eSHAPE, FieldString(ww::eSHAPE),
1012*b1cdbd2cSJim Jagielski             WRITEFIELD_START | WRITEFIELD_CMD_START | WRITEFIELD_CMD_END);
1013*b1cdbd2cSJim Jagielski     }
1014*b1cdbd2cSJim Jagielski 
1015*b1cdbd2cSJim Jagielski     WW8_CP nCP = Fc2Cp(Strm().Tell());
1016*b1cdbd2cSJim Jagielski     bool bSuccess = pDrwO->Append(*this, nCP, rFrmFmt, rNdTopLeft);
1017*b1cdbd2cSJim Jagielski     ASSERT(bSuccess, "Couldn't export a graphical element!");
1018*b1cdbd2cSJim Jagielski 
1019*b1cdbd2cSJim Jagielski     if (bSuccess)
1020*b1cdbd2cSJim Jagielski     {
1021*b1cdbd2cSJim Jagielski         static const sal_uInt8 aSpec8[] =
1022*b1cdbd2cSJim Jagielski         {
1023*b1cdbd2cSJim Jagielski             0x03, 0x6a, 0, 0, 0, 0, // sprmCObjLocation
1024*b1cdbd2cSJim Jagielski             0x55, 0x08, 1           // sprmCFSpec
1025*b1cdbd2cSJim Jagielski         };
1026*b1cdbd2cSJim Jagielski                                                 // fSpec-Attribut true
1027*b1cdbd2cSJim Jagielski                             // Fuer DrawObjets muss ein Spezial-Zeichen
1028*b1cdbd2cSJim Jagielski                             // in den Text und darum ein fSpec-Attribut
1029*b1cdbd2cSJim Jagielski         pChpPlc->AppendFkpEntry( Strm().Tell() );
1030*b1cdbd2cSJim Jagielski         WriteChar( 0x8 );
1031*b1cdbd2cSJim Jagielski         pChpPlc->AppendFkpEntry( Strm().Tell(), sizeof( aSpec8 ), aSpec8 );
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski         //Need dummy picture frame
1034*b1cdbd2cSJim Jagielski         if (rFrmFmt.IsInline())
1035*b1cdbd2cSJim Jagielski             OutGrf(rFrmFmt);
1036*b1cdbd2cSJim Jagielski     }
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski     if (rFrmFmt.IsInline())
1039*b1cdbd2cSJim Jagielski         OutputField(0, ww::eSHAPE, aEmptyStr, WRITEFIELD_CLOSE);
1040*b1cdbd2cSJim Jagielski }
1041*b1cdbd2cSJim Jagielski 
MSWord_SdrAttrIter(MSWordExportBase & rWr,const EditTextObject & rEditObj,sal_uInt8 nTyp)1042*b1cdbd2cSJim Jagielski MSWord_SdrAttrIter::MSWord_SdrAttrIter( MSWordExportBase& rWr,
1043*b1cdbd2cSJim Jagielski     const EditTextObject& rEditObj, sal_uInt8 nTyp )
1044*b1cdbd2cSJim Jagielski     : MSWordAttrIter( rWr ), pEditObj(&rEditObj), pEditPool(0),
1045*b1cdbd2cSJim Jagielski     aTxtAtrArr( 0, 4 ), aChrTxtAtrArr( 0, 4 ), aChrSetArr( 0, 4 ),
1046*b1cdbd2cSJim Jagielski     mnTyp(nTyp)
1047*b1cdbd2cSJim Jagielski {
1048*b1cdbd2cSJim Jagielski     NextPara( 0 );
1049*b1cdbd2cSJim Jagielski }
1050*b1cdbd2cSJim Jagielski 
NextPara(sal_uInt16 nPar)1051*b1cdbd2cSJim Jagielski void MSWord_SdrAttrIter::NextPara( sal_uInt16 nPar )
1052*b1cdbd2cSJim Jagielski {
1053*b1cdbd2cSJim Jagielski     nPara = nPar;
1054*b1cdbd2cSJim Jagielski     // Attributwechsel an Pos 0 wird ignoriert, da davon ausgegangen
1055*b1cdbd2cSJim Jagielski     // wird, dass am Absatzanfang sowieso die Attribute neu ausgegeben
1056*b1cdbd2cSJim Jagielski     // werden.
1057*b1cdbd2cSJim Jagielski     aChrTxtAtrArr.Remove( 0, aChrTxtAtrArr.Count() );
1058*b1cdbd2cSJim Jagielski     aChrSetArr.Remove( 0, aChrSetArr.Count() );
1059*b1cdbd2cSJim Jagielski     nAktSwPos = nTmpSwPos = 0;
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski     SfxItemSet aSet( pEditObj->GetParaAttribs( nPara ));
1062*b1cdbd2cSJim Jagielski     pEditPool = aSet.GetPool();
1063*b1cdbd2cSJim Jagielski     eNdChrSet = ItemGet<SvxFontItem>(aSet,EE_CHAR_FONTINFO).GetCharSet();
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski     if( pBreakIt->GetBreakIter().is() )
1066*b1cdbd2cSJim Jagielski         nScript = pBreakIt->GetBreakIter()->getScriptType( pEditObj->GetText(nPara), 0);
1067*b1cdbd2cSJim Jagielski     else
1068*b1cdbd2cSJim Jagielski         nScript = i18n::ScriptType::LATIN;
1069*b1cdbd2cSJim Jagielski 
1070*b1cdbd2cSJim Jagielski     pEditObj->GetCharAttribs( nPara, aTxtAtrArr );
1071*b1cdbd2cSJim Jagielski     nAktSwPos = SearchNext( 1 );
1072*b1cdbd2cSJim Jagielski }
1073*b1cdbd2cSJim Jagielski 
GetNextCharSet() const1074*b1cdbd2cSJim Jagielski rtl_TextEncoding MSWord_SdrAttrIter::GetNextCharSet() const
1075*b1cdbd2cSJim Jagielski {
1076*b1cdbd2cSJim Jagielski     if( aChrSetArr.Count() )
1077*b1cdbd2cSJim Jagielski         return (rtl_TextEncoding)aChrSetArr[ aChrSetArr.Count() - 1 ];
1078*b1cdbd2cSJim Jagielski     return eNdChrSet;
1079*b1cdbd2cSJim Jagielski }
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski // der erste Parameter in SearchNext() liefert zurueck, ob es ein TxtAtr ist.
SearchNext(xub_StrLen nStartPos)1082*b1cdbd2cSJim Jagielski xub_StrLen MSWord_SdrAttrIter::SearchNext( xub_StrLen nStartPos )
1083*b1cdbd2cSJim Jagielski {
1084*b1cdbd2cSJim Jagielski     xub_StrLen nPos;
1085*b1cdbd2cSJim Jagielski     xub_StrLen nMinPos = STRING_MAXLEN;
1086*b1cdbd2cSJim Jagielski     xub_StrLen i;
1087*b1cdbd2cSJim Jagielski 
1088*b1cdbd2cSJim Jagielski     for( i = 0; i < aTxtAtrArr.Count(); i++ )
1089*b1cdbd2cSJim Jagielski     {
1090*b1cdbd2cSJim Jagielski         const EECharAttrib& rHt = aTxtAtrArr[ i ];
1091*b1cdbd2cSJim Jagielski         nPos = rHt.nStart;  // gibt erstes Attr-Zeichen
1092*b1cdbd2cSJim Jagielski         if( nPos >= nStartPos && nPos <= nMinPos )
1093*b1cdbd2cSJim Jagielski         {
1094*b1cdbd2cSJim Jagielski             nMinPos = nPos;
1095*b1cdbd2cSJim Jagielski             SetCharSet(rHt, true);
1096*b1cdbd2cSJim Jagielski         }
1097*b1cdbd2cSJim Jagielski 
1098*b1cdbd2cSJim Jagielski //??        if( pHt->GetEnd() )         // Attr mit Ende
1099*b1cdbd2cSJim Jagielski         {
1100*b1cdbd2cSJim Jagielski             nPos = rHt.nEnd;        // gibt letztes Attr-Zeichen + 1
1101*b1cdbd2cSJim Jagielski             if( nPos >= nStartPos && nPos < nMinPos )
1102*b1cdbd2cSJim Jagielski             {
1103*b1cdbd2cSJim Jagielski                 nMinPos = nPos;
1104*b1cdbd2cSJim Jagielski                 SetCharSet(rHt, false);
1105*b1cdbd2cSJim Jagielski             }
1106*b1cdbd2cSJim Jagielski         }
1107*b1cdbd2cSJim Jagielski /*      else
1108*b1cdbd2cSJim Jagielski         {                                   // Attr ohne Ende
1109*b1cdbd2cSJim Jagielski             nPos = rHt.nStart + 1;  // Laenge 1 wegen CH_TXTATR im Text
1110*b1cdbd2cSJim Jagielski             if( nPos >= nStartPos && nPos < nMinPos )
1111*b1cdbd2cSJim Jagielski             {
1112*b1cdbd2cSJim Jagielski                 nMinPos = nPos;
1113*b1cdbd2cSJim Jagielski                 SetCharSet(rHt, false);
1114*b1cdbd2cSJim Jagielski             }
1115*b1cdbd2cSJim Jagielski         }
1116*b1cdbd2cSJim Jagielski */
1117*b1cdbd2cSJim Jagielski     }
1118*b1cdbd2cSJim Jagielski     return nMinPos;
1119*b1cdbd2cSJim Jagielski }
1120*b1cdbd2cSJim Jagielski 
SetCharSet(const EECharAttrib & rAttr,bool bStart)1121*b1cdbd2cSJim Jagielski void MSWord_SdrAttrIter::SetCharSet(const EECharAttrib& rAttr, bool bStart)
1122*b1cdbd2cSJim Jagielski {
1123*b1cdbd2cSJim Jagielski     void* p = 0;
1124*b1cdbd2cSJim Jagielski     rtl_TextEncoding eChrSet;
1125*b1cdbd2cSJim Jagielski     const SfxPoolItem& rItem = *rAttr.pAttr;
1126*b1cdbd2cSJim Jagielski     switch( rItem.Which() )
1127*b1cdbd2cSJim Jagielski     {
1128*b1cdbd2cSJim Jagielski     case EE_CHAR_FONTINFO:
1129*b1cdbd2cSJim Jagielski         p = (void*)&rAttr;
1130*b1cdbd2cSJim Jagielski         eChrSet = ((SvxFontItem&)rItem).GetCharSet();
1131*b1cdbd2cSJim Jagielski         break;
1132*b1cdbd2cSJim Jagielski     }
1133*b1cdbd2cSJim Jagielski 
1134*b1cdbd2cSJim Jagielski     if( p )
1135*b1cdbd2cSJim Jagielski     {
1136*b1cdbd2cSJim Jagielski         sal_uInt16 nPos;
1137*b1cdbd2cSJim Jagielski         if( bStart )
1138*b1cdbd2cSJim Jagielski         {
1139*b1cdbd2cSJim Jagielski             nPos = aChrSetArr.Count();
1140*b1cdbd2cSJim Jagielski             aChrSetArr.Insert( eChrSet, nPos );
1141*b1cdbd2cSJim Jagielski             aChrTxtAtrArr.Insert( p, nPos );
1142*b1cdbd2cSJim Jagielski         }
1143*b1cdbd2cSJim Jagielski         else if( USHRT_MAX != ( nPos = aChrTxtAtrArr.GetPos( p )) )
1144*b1cdbd2cSJim Jagielski         {
1145*b1cdbd2cSJim Jagielski             aChrTxtAtrArr.Remove( nPos );
1146*b1cdbd2cSJim Jagielski             aChrSetArr.Remove( nPos );
1147*b1cdbd2cSJim Jagielski         }
1148*b1cdbd2cSJim Jagielski     }
1149*b1cdbd2cSJim Jagielski }
1150*b1cdbd2cSJim Jagielski 
OutEEField(const SfxPoolItem & rHt)1151*b1cdbd2cSJim Jagielski void MSWord_SdrAttrIter::OutEEField(const SfxPoolItem& rHt)
1152*b1cdbd2cSJim Jagielski {
1153*b1cdbd2cSJim Jagielski     const SvxFieldItem &rField = (const SvxFieldItem &)rHt;
1154*b1cdbd2cSJim Jagielski     const SvxFieldData *pFld = rField.GetField();
1155*b1cdbd2cSJim Jagielski     if (pFld && pFld->ISA(SvxURLField))
1156*b1cdbd2cSJim Jagielski     {
1157*b1cdbd2cSJim Jagielski         sal_uInt8 nOldTxtTyp = m_rExport.nTxtTyp;
1158*b1cdbd2cSJim Jagielski         m_rExport.nTxtTyp = mnTyp;
1159*b1cdbd2cSJim Jagielski         const SvxURLField *pURL = (const SvxURLField *)pFld;
1160*b1cdbd2cSJim Jagielski         m_rExport.AttrOutput().StartURL( pURL->GetURL(), pURL->GetTargetFrame() );
1161*b1cdbd2cSJim Jagielski 
1162*b1cdbd2cSJim Jagielski         const String &rStr = pURL->GetRepresentation();
1163*b1cdbd2cSJim Jagielski         m_rExport.AttrOutput().RawText( rStr, true, GetNodeCharSet() ); // FIXME kendy: is the 'true' actually correct here?  It was here before, but... ;-)
1164*b1cdbd2cSJim Jagielski 
1165*b1cdbd2cSJim Jagielski         m_rExport.AttrOutput().EndURL();
1166*b1cdbd2cSJim Jagielski         m_rExport.nTxtTyp = nOldTxtTyp;
1167*b1cdbd2cSJim Jagielski     }
1168*b1cdbd2cSJim Jagielski }
1169*b1cdbd2cSJim Jagielski 
OutAttr(xub_StrLen nSwPos)1170*b1cdbd2cSJim Jagielski void MSWord_SdrAttrIter::OutAttr( xub_StrLen nSwPos )
1171*b1cdbd2cSJim Jagielski {
1172*b1cdbd2cSJim Jagielski     OutParaAttr(true);
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski     if( aTxtAtrArr.Count() )
1175*b1cdbd2cSJim Jagielski     {
1176*b1cdbd2cSJim Jagielski         const SwModify* pOldMod = m_rExport.pOutFmtNode;
1177*b1cdbd2cSJim Jagielski         m_rExport.pOutFmtNode = 0;
1178*b1cdbd2cSJim Jagielski 
1179*b1cdbd2cSJim Jagielski         const SfxItemPool* pSrcPool = pEditPool;
1180*b1cdbd2cSJim Jagielski         const SfxItemPool& rDstPool = m_rExport.pDoc->GetAttrPool();
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski         nTmpSwPos = nSwPos;
1183*b1cdbd2cSJim Jagielski         sal_uInt16 i, nWhich, nSlotId;
1184*b1cdbd2cSJim Jagielski         for( i = 0; i < aTxtAtrArr.Count(); i++ )
1185*b1cdbd2cSJim Jagielski         {
1186*b1cdbd2cSJim Jagielski             const EECharAttrib& rHt = aTxtAtrArr[ i ];
1187*b1cdbd2cSJim Jagielski             if (nSwPos >= rHt.nStart && nSwPos < rHt.nEnd)
1188*b1cdbd2cSJim Jagielski             {
1189*b1cdbd2cSJim Jagielski                 nWhich = rHt.pAttr->Which();
1190*b1cdbd2cSJim Jagielski                 if (nWhich == EE_FEATURE_FIELD)
1191*b1cdbd2cSJim Jagielski                 {
1192*b1cdbd2cSJim Jagielski                     OutEEField(*rHt.pAttr);
1193*b1cdbd2cSJim Jagielski                     continue;
1194*b1cdbd2cSJim Jagielski                 }
1195*b1cdbd2cSJim Jagielski                 else if (nWhich == EE_FEATURE_TAB)
1196*b1cdbd2cSJim Jagielski                 {
1197*b1cdbd2cSJim Jagielski                     m_rExport.WriteChar(0x9);
1198*b1cdbd2cSJim Jagielski                     continue;
1199*b1cdbd2cSJim Jagielski                 }
1200*b1cdbd2cSJim Jagielski                 nSlotId = pSrcPool->GetSlotId(nWhich);
1201*b1cdbd2cSJim Jagielski 
1202*b1cdbd2cSJim Jagielski                 if (nSlotId && nWhich != nSlotId)
1203*b1cdbd2cSJim Jagielski                 {
1204*b1cdbd2cSJim Jagielski                     nWhich = rDstPool.GetWhich(nSlotId);
1205*b1cdbd2cSJim Jagielski                     if (nWhich && nWhich != nSlotId &&
1206*b1cdbd2cSJim Jagielski                         nWhich < RES_UNKNOWNATR_BEGIN &&
1207*b1cdbd2cSJim Jagielski                         m_rExport.CollapseScriptsforWordOk(nScript,nWhich))
1208*b1cdbd2cSJim Jagielski                     {
1209*b1cdbd2cSJim Jagielski                         // use always the SW-Which Id !
1210*b1cdbd2cSJim Jagielski                         SfxPoolItem* pI = rHt.pAttr->Clone();
1211*b1cdbd2cSJim Jagielski                         pI->SetWhich( nWhich );
1212*b1cdbd2cSJim Jagielski                         m_rExport.AttrOutput().OutputItem( *pI );
1213*b1cdbd2cSJim Jagielski                         delete pI;
1214*b1cdbd2cSJim Jagielski                     }
1215*b1cdbd2cSJim Jagielski                 }
1216*b1cdbd2cSJim Jagielski             }
1217*b1cdbd2cSJim Jagielski 
1218*b1cdbd2cSJim Jagielski             if( nSwPos < rHt.nStart )
1219*b1cdbd2cSJim Jagielski                 break;
1220*b1cdbd2cSJim Jagielski         }
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski         nTmpSwPos = 0;      // HasTextItem nur in dem obigen Bereich erlaubt
1223*b1cdbd2cSJim Jagielski         m_rExport.pOutFmtNode = pOldMod;
1224*b1cdbd2cSJim Jagielski     }
1225*b1cdbd2cSJim Jagielski }
1226*b1cdbd2cSJim Jagielski 
IsTxtAttr(xub_StrLen nSwPos)1227*b1cdbd2cSJim Jagielski bool MSWord_SdrAttrIter::IsTxtAttr(xub_StrLen nSwPos)
1228*b1cdbd2cSJim Jagielski {
1229*b1cdbd2cSJim Jagielski     for (sal_uInt16 i = 0; i < aTxtAtrArr.Count(); ++i)
1230*b1cdbd2cSJim Jagielski     {
1231*b1cdbd2cSJim Jagielski         const EECharAttrib& rHt = aTxtAtrArr[ i ];
1232*b1cdbd2cSJim Jagielski         if (nSwPos >= rHt.nStart && nSwPos < rHt.nEnd)
1233*b1cdbd2cSJim Jagielski         {
1234*b1cdbd2cSJim Jagielski             if (
1235*b1cdbd2cSJim Jagielski                  (rHt.pAttr->Which() == EE_FEATURE_FIELD) ||
1236*b1cdbd2cSJim Jagielski                  (rHt.pAttr->Which() == EE_FEATURE_TAB)
1237*b1cdbd2cSJim Jagielski                )
1238*b1cdbd2cSJim Jagielski             {
1239*b1cdbd2cSJim Jagielski                 return true;
1240*b1cdbd2cSJim Jagielski             }
1241*b1cdbd2cSJim Jagielski         }
1242*b1cdbd2cSJim Jagielski     }
1243*b1cdbd2cSJim Jagielski     return false;
1244*b1cdbd2cSJim Jagielski }
1245*b1cdbd2cSJim Jagielski 
1246*b1cdbd2cSJim Jagielski // HasItem ist fuer die Zusammenfassung des Doppel-Attributes Underline
1247*b1cdbd2cSJim Jagielski // und WordLineMode als TextItems. OutAttr() ruft die Ausgabefunktion,
1248*b1cdbd2cSJim Jagielski // die dann ueber HasItem() nach anderen Items an der
1249*b1cdbd2cSJim Jagielski // Attribut-Anfangposition fragen kann.
1250*b1cdbd2cSJim Jagielski // Es koennen nur Attribute mit Ende abgefragt werden.
1251*b1cdbd2cSJim Jagielski // Es wird mit bDeep gesucht
HasTextItem(sal_uInt16 nWhich) const1252*b1cdbd2cSJim Jagielski const SfxPoolItem* MSWord_SdrAttrIter::HasTextItem(sal_uInt16 nWhich) const
1253*b1cdbd2cSJim Jagielski {
1254*b1cdbd2cSJim Jagielski     const SfxPoolItem* pRet = 0;
1255*b1cdbd2cSJim Jagielski     nWhich = sw::hack::TransformWhichBetweenPools(*pEditPool,
1256*b1cdbd2cSJim Jagielski         m_rExport.pDoc->GetAttrPool(), nWhich);
1257*b1cdbd2cSJim Jagielski     if (nWhich)
1258*b1cdbd2cSJim Jagielski     {
1259*b1cdbd2cSJim Jagielski         for (sal_uInt16 i = 0; i < aTxtAtrArr.Count(); ++i)
1260*b1cdbd2cSJim Jagielski         {
1261*b1cdbd2cSJim Jagielski             const EECharAttrib& rHt = aTxtAtrArr[i];
1262*b1cdbd2cSJim Jagielski             if (
1263*b1cdbd2cSJim Jagielski                  nWhich == rHt.pAttr->Which() && nTmpSwPos >= rHt.nStart &&
1264*b1cdbd2cSJim Jagielski                  nTmpSwPos < rHt.nEnd
1265*b1cdbd2cSJim Jagielski                )
1266*b1cdbd2cSJim Jagielski             {
1267*b1cdbd2cSJim Jagielski                 pRet = rHt.pAttr;   // Found
1268*b1cdbd2cSJim Jagielski                 break;
1269*b1cdbd2cSJim Jagielski             }
1270*b1cdbd2cSJim Jagielski             else if (nTmpSwPos < rHt.nStart)
1271*b1cdbd2cSJim Jagielski                 break;              // dann kommt da nichts mehr
1272*b1cdbd2cSJim Jagielski         }
1273*b1cdbd2cSJim Jagielski     }
1274*b1cdbd2cSJim Jagielski     return pRet;
1275*b1cdbd2cSJim Jagielski }
1276*b1cdbd2cSJim Jagielski 
GetItem(sal_uInt16 nWhich) const1277*b1cdbd2cSJim Jagielski const SfxPoolItem& MSWord_SdrAttrIter::GetItem( sal_uInt16 nWhich ) const
1278*b1cdbd2cSJim Jagielski {
1279*b1cdbd2cSJim Jagielski     using sw::hack::GetSetWhichFromSwDocWhich;
1280*b1cdbd2cSJim Jagielski     const SfxPoolItem* pRet = HasTextItem(nWhich);
1281*b1cdbd2cSJim Jagielski     if (!pRet)
1282*b1cdbd2cSJim Jagielski     {
1283*b1cdbd2cSJim Jagielski         SfxItemSet aSet(pEditObj->GetParaAttribs(nPara));
1284*b1cdbd2cSJim Jagielski         nWhich = GetSetWhichFromSwDocWhich(aSet, *m_rExport.pDoc, nWhich);
1285*b1cdbd2cSJim Jagielski         ASSERT(nWhich, "Impossible, catastrophic failure imminent");
1286*b1cdbd2cSJim Jagielski         pRet = &aSet.Get(nWhich);
1287*b1cdbd2cSJim Jagielski     }
1288*b1cdbd2cSJim Jagielski     return *pRet;
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
OutParaAttr(bool bCharAttr)1291*b1cdbd2cSJim Jagielski void MSWord_SdrAttrIter::OutParaAttr(bool bCharAttr)
1292*b1cdbd2cSJim Jagielski {
1293*b1cdbd2cSJim Jagielski     SfxItemSet aSet( pEditObj->GetParaAttribs( nPara ));
1294*b1cdbd2cSJim Jagielski     if( aSet.Count() )
1295*b1cdbd2cSJim Jagielski     {
1296*b1cdbd2cSJim Jagielski         const SfxItemSet* pOldSet = m_rExport.GetCurItemSet();
1297*b1cdbd2cSJim Jagielski         m_rExport.SetCurItemSet( &aSet );
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski         SfxItemIter aIter( aSet );
1300*b1cdbd2cSJim Jagielski         const SfxPoolItem* pItem = aIter.GetCurItem();
1301*b1cdbd2cSJim Jagielski 
1302*b1cdbd2cSJim Jagielski         const SfxItemPool* pSrcPool = pEditPool,
1303*b1cdbd2cSJim Jagielski                          * pDstPool = &m_rExport.pDoc->GetAttrPool();
1304*b1cdbd2cSJim Jagielski 
1305*b1cdbd2cSJim Jagielski         do {
1306*b1cdbd2cSJim Jagielski             sal_uInt16 nWhich = pItem->Which(),
1307*b1cdbd2cSJim Jagielski                    nSlotId = pSrcPool->GetSlotId( nWhich );
1308*b1cdbd2cSJim Jagielski 
1309*b1cdbd2cSJim Jagielski             if ( nSlotId && nWhich != nSlotId &&
1310*b1cdbd2cSJim Jagielski                  0 != ( nWhich = pDstPool->GetWhich( nSlotId ) ) &&
1311*b1cdbd2cSJim Jagielski                  nWhich != nSlotId &&
1312*b1cdbd2cSJim Jagielski                  ( bCharAttr ? ( nWhich >= RES_CHRATR_BEGIN && nWhich < RES_TXTATR_END )
1313*b1cdbd2cSJim Jagielski                              : ( nWhich >= RES_PARATR_BEGIN && nWhich < RES_FRMATR_END ) ) )
1314*b1cdbd2cSJim Jagielski             {
1315*b1cdbd2cSJim Jagielski                 // use always the SW-Which Id !
1316*b1cdbd2cSJim Jagielski                 SfxPoolItem* pI = pItem->Clone();
1317*b1cdbd2cSJim Jagielski                 pI->SetWhich( nWhich );
1318*b1cdbd2cSJim Jagielski                 if (m_rExport.CollapseScriptsforWordOk(nScript,nWhich))
1319*b1cdbd2cSJim Jagielski                     m_rExport.AttrOutput().OutputItem( *pI );
1320*b1cdbd2cSJim Jagielski                 delete pI;
1321*b1cdbd2cSJim Jagielski             }
1322*b1cdbd2cSJim Jagielski         } while( !aIter.IsAtEnd() && 0 != ( pItem = aIter.NextItem() ) );
1323*b1cdbd2cSJim Jagielski         m_rExport.SetCurItemSet( pOldSet );
1324*b1cdbd2cSJim Jagielski     }
1325*b1cdbd2cSJim Jagielski }
1326*b1cdbd2cSJim Jagielski 
WriteSdrTextObj(const SdrObject & rObj,sal_uInt8 nTyp)1327*b1cdbd2cSJim Jagielski void WW8Export::WriteSdrTextObj(const SdrObject& rObj, sal_uInt8 nTyp)
1328*b1cdbd2cSJim Jagielski {
1329*b1cdbd2cSJim Jagielski     const SdrTextObj* pTxtObj = PTR_CAST(SdrTextObj, &rObj);
1330*b1cdbd2cSJim Jagielski     ASSERT(pTxtObj, "That is no SdrTextObj!");
1331*b1cdbd2cSJim Jagielski     if (!pTxtObj)
1332*b1cdbd2cSJim Jagielski         return;
1333*b1cdbd2cSJim Jagielski 
1334*b1cdbd2cSJim Jagielski     const OutlinerParaObject* pParaObj = 0;
1335*b1cdbd2cSJim Jagielski     bool bOwnParaObj = false;
1336*b1cdbd2cSJim Jagielski 
1337*b1cdbd2cSJim Jagielski     /*
1338*b1cdbd2cSJim Jagielski     #i13885#
1339*b1cdbd2cSJim Jagielski     When the object is actively being edited, that text is not set into
1340*b1cdbd2cSJim Jagielski     the objects normal text object, but lives in a seperate object.
1341*b1cdbd2cSJim Jagielski     */
1342*b1cdbd2cSJim Jagielski     if (pTxtObj->IsTextEditActive())
1343*b1cdbd2cSJim Jagielski     {
1344*b1cdbd2cSJim Jagielski         pParaObj = pTxtObj->GetEditOutlinerParaObject();
1345*b1cdbd2cSJim Jagielski         bOwnParaObj = true;
1346*b1cdbd2cSJim Jagielski     }
1347*b1cdbd2cSJim Jagielski     else
1348*b1cdbd2cSJim Jagielski     {
1349*b1cdbd2cSJim Jagielski         pParaObj = pTxtObj->GetOutlinerParaObject();
1350*b1cdbd2cSJim Jagielski     }
1351*b1cdbd2cSJim Jagielski 
1352*b1cdbd2cSJim Jagielski     if( pParaObj )
1353*b1cdbd2cSJim Jagielski     {
1354*b1cdbd2cSJim Jagielski         WriteOutliner(*pParaObj, nTyp);
1355*b1cdbd2cSJim Jagielski         if( bOwnParaObj )
1356*b1cdbd2cSJim Jagielski             delete pParaObj;
1357*b1cdbd2cSJim Jagielski     }
1358*b1cdbd2cSJim Jagielski }
1359*b1cdbd2cSJim Jagielski 
WriteOutliner(const OutlinerParaObject & rParaObj,sal_uInt8 nTyp)1360*b1cdbd2cSJim Jagielski void WW8Export::WriteOutliner(const OutlinerParaObject& rParaObj, sal_uInt8 nTyp)
1361*b1cdbd2cSJim Jagielski {
1362*b1cdbd2cSJim Jagielski     bool bAnyWrite = false;
1363*b1cdbd2cSJim Jagielski     const EditTextObject& rEditObj = rParaObj.GetTextObject();
1364*b1cdbd2cSJim Jagielski     MSWord_SdrAttrIter aAttrIter( *this, rEditObj, nTyp );
1365*b1cdbd2cSJim Jagielski 
1366*b1cdbd2cSJim Jagielski     sal_uInt16 nPara = rEditObj.GetParagraphCount();
1367*b1cdbd2cSJim Jagielski     sal_uInt8 bNul = 0;
1368*b1cdbd2cSJim Jagielski     for( sal_uInt16 n = 0; n < nPara; ++n )
1369*b1cdbd2cSJim Jagielski     {
1370*b1cdbd2cSJim Jagielski         if( n )
1371*b1cdbd2cSJim Jagielski             aAttrIter.NextPara( n );
1372*b1cdbd2cSJim Jagielski 
1373*b1cdbd2cSJim Jagielski         rtl_TextEncoding eChrSet = aAttrIter.GetNodeCharSet();
1374*b1cdbd2cSJim Jagielski 
1375*b1cdbd2cSJim Jagielski         ASSERT( !pO->Count(), " pO ist am Zeilenanfang nicht leer" );
1376*b1cdbd2cSJim Jagielski 
1377*b1cdbd2cSJim Jagielski         String aStr( rEditObj.GetText( n ));
1378*b1cdbd2cSJim Jagielski         xub_StrLen nAktPos = 0;
1379*b1cdbd2cSJim Jagielski         xub_StrLen nEnd = aStr.Len();
1380*b1cdbd2cSJim Jagielski         do {
1381*b1cdbd2cSJim Jagielski             xub_StrLen nNextAttr = aAttrIter.WhereNext();
1382*b1cdbd2cSJim Jagielski             rtl_TextEncoding eNextChrSet = aAttrIter.GetNextCharSet();
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski             if( nNextAttr > nEnd )
1385*b1cdbd2cSJim Jagielski                 nNextAttr = nEnd;
1386*b1cdbd2cSJim Jagielski 
1387*b1cdbd2cSJim Jagielski             bool bTxtAtr = aAttrIter.IsTxtAttr( nAktPos );
1388*b1cdbd2cSJim Jagielski             if( !bTxtAtr )
1389*b1cdbd2cSJim Jagielski                 OutSwString( aStr, nAktPos, nNextAttr - nAktPos,
1390*b1cdbd2cSJim Jagielski                                 true, eChrSet );
1391*b1cdbd2cSJim Jagielski 
1392*b1cdbd2cSJim Jagielski                         // Am Zeilenende werden die Attribute bis ueber das CR
1393*b1cdbd2cSJim Jagielski                         // aufgezogen. Ausnahme: Fussnoten am Zeilenende
1394*b1cdbd2cSJim Jagielski             if( nNextAttr == nEnd && !bTxtAtr )
1395*b1cdbd2cSJim Jagielski                 WriteCR();              // CR danach
1396*b1cdbd2cSJim Jagielski 
1397*b1cdbd2cSJim Jagielski                                             // Ausgabe der Zeichenattribute
1398*b1cdbd2cSJim Jagielski             aAttrIter.OutAttr( nAktPos );   // nAktPos - 1 ??
1399*b1cdbd2cSJim Jagielski             pChpPlc->AppendFkpEntry( Strm().Tell(),
1400*b1cdbd2cSJim Jagielski                                             pO->Count(), pO->GetData() );
1401*b1cdbd2cSJim Jagielski             pO->Remove( 0, pO->Count() );                   // leeren
1402*b1cdbd2cSJim Jagielski 
1403*b1cdbd2cSJim Jagielski                         // Ausnahme: Fussnoten am Zeilenende
1404*b1cdbd2cSJim Jagielski             if( nNextAttr == nEnd && bTxtAtr )
1405*b1cdbd2cSJim Jagielski                 WriteCR();              // CR danach
1406*b1cdbd2cSJim Jagielski             nAktPos = nNextAttr;
1407*b1cdbd2cSJim Jagielski             eChrSet = eNextChrSet;
1408*b1cdbd2cSJim Jagielski             aAttrIter.NextPos();
1409*b1cdbd2cSJim Jagielski         }
1410*b1cdbd2cSJim Jagielski         while( nAktPos < nEnd );
1411*b1cdbd2cSJim Jagielski 
1412*b1cdbd2cSJim Jagielski         ASSERT( !pO->Count(), " pO ist am ZeilenEnde nicht leer" );
1413*b1cdbd2cSJim Jagielski 
1414*b1cdbd2cSJim Jagielski         pO->Insert( bNul, pO->Count() );        // Style # as short
1415*b1cdbd2cSJim Jagielski         pO->Insert( bNul, pO->Count() );
1416*b1cdbd2cSJim Jagielski 
1417*b1cdbd2cSJim Jagielski         aAttrIter.OutParaAttr(false);
1418*b1cdbd2cSJim Jagielski 
1419*b1cdbd2cSJim Jagielski         sal_uLong nPos = Strm().Tell();
1420*b1cdbd2cSJim Jagielski         pPapPlc->AppendFkpEntry( Strm().Tell(),
1421*b1cdbd2cSJim Jagielski                                         pO->Count(), pO->GetData() );
1422*b1cdbd2cSJim Jagielski         pO->Remove( 0, pO->Count() );                       // leeren
1423*b1cdbd2cSJim Jagielski         pChpPlc->AppendFkpEntry( nPos );
1424*b1cdbd2cSJim Jagielski     }
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski     bAnyWrite = 0 != nPara;
1427*b1cdbd2cSJim Jagielski     if( !bAnyWrite )
1428*b1cdbd2cSJim Jagielski         WriteStringAsPara( aEmptyStr );
1429*b1cdbd2cSJim Jagielski }
1430*b1cdbd2cSJim Jagielski 
WriteData(EscherEx & rEx) const1431*b1cdbd2cSJim Jagielski void WinwordAnchoring::WriteData( EscherEx& rEx ) const
1432*b1cdbd2cSJim Jagielski {
1433*b1cdbd2cSJim Jagielski     //Toplevel groups get their winword extra data attached, and sub elements
1434*b1cdbd2cSJim Jagielski     //use the defaults
1435*b1cdbd2cSJim Jagielski     if (rEx.GetGroupLevel() <= 1)
1436*b1cdbd2cSJim Jagielski     {
1437*b1cdbd2cSJim Jagielski         SvStream& rSt = rEx.GetStream();
1438*b1cdbd2cSJim Jagielski         //The last argument denotes the number of sub properties in this atom
1439*b1cdbd2cSJim Jagielski         if (mbInline)
1440*b1cdbd2cSJim Jagielski         {
1441*b1cdbd2cSJim Jagielski             rEx.AddAtom(18, DFF_msofbtUDefProp, 3, 3); //Prop id is 0xF122
1442*b1cdbd2cSJim Jagielski             rSt << (sal_uInt16)0x0390 << sal_uInt32(3);
1443*b1cdbd2cSJim Jagielski             rSt << (sal_uInt16)0x0392 << sal_uInt32(3);
1444*b1cdbd2cSJim Jagielski             //This sub property is required to be in the dummy inline frame as
1445*b1cdbd2cSJim Jagielski             //well
1446*b1cdbd2cSJim Jagielski             rSt << (sal_uInt16)0x053F << nInlineHack;
1447*b1cdbd2cSJim Jagielski         }
1448*b1cdbd2cSJim Jagielski         else
1449*b1cdbd2cSJim Jagielski         {
1450*b1cdbd2cSJim Jagielski             rEx.AddAtom(24, DFF_msofbtUDefProp, 3, 4 ); //Prop id is 0xF122
1451*b1cdbd2cSJim Jagielski             rSt << (sal_uInt16)0x038F << mnXAlign;
1452*b1cdbd2cSJim Jagielski             rSt << (sal_uInt16)0x0390 << mnXRelTo;
1453*b1cdbd2cSJim Jagielski             rSt << (sal_uInt16)0x0391 << mnYAlign;
1454*b1cdbd2cSJim Jagielski             rSt << (sal_uInt16)0x0392 << mnYRelTo;
1455*b1cdbd2cSJim Jagielski         }
1456*b1cdbd2cSJim Jagielski     }
1457*b1cdbd2cSJim Jagielski }
1458*b1cdbd2cSJim Jagielski 
1459*b1cdbd2cSJim Jagielski /*  */
1460*b1cdbd2cSJim Jagielski 
CreateEscher()1461*b1cdbd2cSJim Jagielski void WW8Export::CreateEscher()
1462*b1cdbd2cSJim Jagielski {
1463*b1cdbd2cSJim Jagielski     SfxItemState eBackSet =
1464*b1cdbd2cSJim Jagielski         (const_cast<const SwDoc*>(pDoc))->GetPageDesc(0).GetMaster().
1465*b1cdbd2cSJim Jagielski         GetItemState(RES_BACKGROUND);
1466*b1cdbd2cSJim Jagielski     if (pHFSdrObjs->size() || pSdrObjs->size() || SFX_ITEM_SET == eBackSet)
1467*b1cdbd2cSJim Jagielski     {
1468*b1cdbd2cSJim Jagielski         ASSERT( !pEscher, "wer hat den Pointer nicht geloescht?" );
1469*b1cdbd2cSJim Jagielski         SvMemoryStream* pEscherStrm = new SvMemoryStream;
1470*b1cdbd2cSJim Jagielski         pEscherStrm->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN);
1471*b1cdbd2cSJim Jagielski         pEscher = new SwEscherEx(pEscherStrm, *this);
1472*b1cdbd2cSJim Jagielski     }
1473*b1cdbd2cSJim Jagielski }
1474*b1cdbd2cSJim Jagielski 
WriteEscher()1475*b1cdbd2cSJim Jagielski void WW8Export::WriteEscher()
1476*b1cdbd2cSJim Jagielski {
1477*b1cdbd2cSJim Jagielski     if (pEscher)
1478*b1cdbd2cSJim Jagielski     {
1479*b1cdbd2cSJim Jagielski         sal_uLong nStart = pTableStrm->Tell();
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski         pEscher->WritePictures();
1482*b1cdbd2cSJim Jagielski         pEscher->FinishEscher();
1483*b1cdbd2cSJim Jagielski 
1484*b1cdbd2cSJim Jagielski         pFib->fcDggInfo = nStart;
1485*b1cdbd2cSJim Jagielski         pFib->lcbDggInfo = pTableStrm->Tell() - nStart;
1486*b1cdbd2cSJim Jagielski         delete pEscher, pEscher = 0;
1487*b1cdbd2cSJim Jagielski     }
1488*b1cdbd2cSJim Jagielski }
1489*b1cdbd2cSJim Jagielski 
WritePictures()1490*b1cdbd2cSJim Jagielski void SwEscherEx::WritePictures()
1491*b1cdbd2cSJim Jagielski {
1492*b1cdbd2cSJim Jagielski     if( SvStream* pPicStrm = static_cast< SwEscherExGlobal& >( *mxGlobal ).GetPictureStream() )
1493*b1cdbd2cSJim Jagielski     {
1494*b1cdbd2cSJim Jagielski         // set the blip - entries to the correct stream pos
1495*b1cdbd2cSJim Jagielski         sal_Int32 nEndPos = rWrt.Strm().Tell();
1496*b1cdbd2cSJim Jagielski         mxGlobal->SetNewBlipStreamOffset( nEndPos );
1497*b1cdbd2cSJim Jagielski 
1498*b1cdbd2cSJim Jagielski         pPicStrm->Seek( 0 );
1499*b1cdbd2cSJim Jagielski         rWrt.Strm() << *pPicStrm;
1500*b1cdbd2cSJim Jagielski     }
1501*b1cdbd2cSJim Jagielski     Flush();
1502*b1cdbd2cSJim Jagielski }
1503*b1cdbd2cSJim Jagielski 
1504*b1cdbd2cSJim Jagielski /*  */
1505*b1cdbd2cSJim Jagielski 
1506*b1cdbd2cSJim Jagielski // Output- Routines for Escher Export
1507*b1cdbd2cSJim Jagielski 
SwEscherExGlobal()1508*b1cdbd2cSJim Jagielski SwEscherExGlobal::SwEscherExGlobal()
1509*b1cdbd2cSJim Jagielski {
1510*b1cdbd2cSJim Jagielski }
1511*b1cdbd2cSJim Jagielski 
~SwEscherExGlobal()1512*b1cdbd2cSJim Jagielski SwEscherExGlobal::~SwEscherExGlobal()
1513*b1cdbd2cSJim Jagielski {
1514*b1cdbd2cSJim Jagielski }
1515*b1cdbd2cSJim Jagielski 
ImplQueryPictureStream()1516*b1cdbd2cSJim Jagielski SvStream* SwEscherExGlobal::ImplQueryPictureStream()
1517*b1cdbd2cSJim Jagielski {
1518*b1cdbd2cSJim Jagielski     // this function will be called exactly once
1519*b1cdbd2cSJim Jagielski     mxPicStrm.reset( new SvMemoryStream );
1520*b1cdbd2cSJim Jagielski     mxPicStrm->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN);
1521*b1cdbd2cSJim Jagielski     return mxPicStrm.get();
1522*b1cdbd2cSJim Jagielski }
1523*b1cdbd2cSJim Jagielski 
SwBasicEscherEx(SvStream * pStrm,WW8Export & rWW8Wrt)1524*b1cdbd2cSJim Jagielski SwBasicEscherEx::SwBasicEscherEx(SvStream* pStrm, WW8Export& rWW8Wrt)
1525*b1cdbd2cSJim Jagielski     : EscherEx( EscherExGlobalRef( new SwEscherExGlobal ), *pStrm), rWrt(rWW8Wrt), pEscherStrm(pStrm)
1526*b1cdbd2cSJim Jagielski {
1527*b1cdbd2cSJim Jagielski     Init();
1528*b1cdbd2cSJim Jagielski }
1529*b1cdbd2cSJim Jagielski 
~SwBasicEscherEx()1530*b1cdbd2cSJim Jagielski SwBasicEscherEx::~SwBasicEscherEx()
1531*b1cdbd2cSJim Jagielski {
1532*b1cdbd2cSJim Jagielski }
1533*b1cdbd2cSJim Jagielski 
WriteFrmExtraData(const SwFrmFmt &)1534*b1cdbd2cSJim Jagielski void SwBasicEscherEx::WriteFrmExtraData(const SwFrmFmt&)
1535*b1cdbd2cSJim Jagielski {
1536*b1cdbd2cSJim Jagielski     AddAtom(4, ESCHER_ClientAnchor);
1537*b1cdbd2cSJim Jagielski     GetStream() << (sal_uInt32)0x80000000;
1538*b1cdbd2cSJim Jagielski }
1539*b1cdbd2cSJim Jagielski 
WriteEmptyFlyFrame(const SwFrmFmt & rFmt,sal_uInt32 nShapeId)1540*b1cdbd2cSJim Jagielski void SwBasicEscherEx::WriteEmptyFlyFrame(const SwFrmFmt& rFmt, sal_uInt32 nShapeId)
1541*b1cdbd2cSJim Jagielski {
1542*b1cdbd2cSJim Jagielski     OpenContainer(ESCHER_SpContainer);
1543*b1cdbd2cSJim Jagielski     AddShape(ESCHER_ShpInst_PictureFrame, 0xa00, nShapeId);
1544*b1cdbd2cSJim Jagielski     // store anchor attribute
1545*b1cdbd2cSJim Jagielski     WriteFrmExtraData(rFmt);
1546*b1cdbd2cSJim Jagielski 
1547*b1cdbd2cSJim Jagielski     AddAtom(6, DFF_msofbtUDefProp, 3, 1); //Prop id is 0xF122
1548*b1cdbd2cSJim Jagielski     GetStream() << (sal_uInt16)0x053F << nInlineHack;
1549*b1cdbd2cSJim Jagielski 
1550*b1cdbd2cSJim Jagielski     CloseContainer();   // ESCHER_SpContainer
1551*b1cdbd2cSJim Jagielski }
1552*b1cdbd2cSJim Jagielski 
AddMirrorFlags(sal_uInt32 nFlags,const SwMirrorGrf & rMirror)1553*b1cdbd2cSJim Jagielski sal_uInt32 AddMirrorFlags(sal_uInt32 nFlags, const SwMirrorGrf &rMirror)
1554*b1cdbd2cSJim Jagielski {
1555*b1cdbd2cSJim Jagielski     switch (rMirror.GetValue())
1556*b1cdbd2cSJim Jagielski     {
1557*b1cdbd2cSJim Jagielski         default:
1558*b1cdbd2cSJim Jagielski         case RES_MIRROR_GRAPH_DONT:
1559*b1cdbd2cSJim Jagielski             break;
1560*b1cdbd2cSJim Jagielski         case RES_MIRROR_GRAPH_VERT:
1561*b1cdbd2cSJim Jagielski             nFlags |= SHAPEFLAG_FLIPH;
1562*b1cdbd2cSJim Jagielski             break;
1563*b1cdbd2cSJim Jagielski         case RES_MIRROR_GRAPH_HOR:
1564*b1cdbd2cSJim Jagielski             nFlags |= SHAPEFLAG_FLIPV;
1565*b1cdbd2cSJim Jagielski             break;
1566*b1cdbd2cSJim Jagielski         case RES_MIRROR_GRAPH_BOTH:
1567*b1cdbd2cSJim Jagielski             nFlags |= SHAPEFLAG_FLIPH;
1568*b1cdbd2cSJim Jagielski             nFlags |= SHAPEFLAG_FLIPV;
1569*b1cdbd2cSJim Jagielski             break;
1570*b1cdbd2cSJim Jagielski 
1571*b1cdbd2cSJim Jagielski     }
1572*b1cdbd2cSJim Jagielski     return nFlags;
1573*b1cdbd2cSJim Jagielski }
1574*b1cdbd2cSJim Jagielski //For i120928,this function is added to export graphic of bullet
WriteGrfBullet(const Graphic & rGrf)1575*b1cdbd2cSJim Jagielski sal_Int32 SwBasicEscherEx::WriteGrfBullet(const Graphic& rGrf)
1576*b1cdbd2cSJim Jagielski {
1577*b1cdbd2cSJim Jagielski 	OpenContainer( ESCHER_SpContainer );
1578*b1cdbd2cSJim Jagielski 	AddShape(ESCHER_ShpInst_PictureFrame, 0xa00,0x401);
1579*b1cdbd2cSJim Jagielski 	EscherPropertyContainer aPropOpt;
1580*b1cdbd2cSJim Jagielski 	GraphicObject   aGraphicObject( rGrf );
1581*b1cdbd2cSJim Jagielski 	ByteString      aUniqueId = aGraphicObject.GetUniqueID();
1582*b1cdbd2cSJim Jagielski 	if ( aUniqueId.Len() )
1583*b1cdbd2cSJim Jagielski 	{
1584*b1cdbd2cSJim Jagielski 		const MapMode aMap100mm( MAP_100TH_MM );
1585*b1cdbd2cSJim Jagielski 		Size    aSize( rGrf.GetPrefSize() );
1586*b1cdbd2cSJim Jagielski 		if ( MAP_PIXEL == rGrf.GetPrefMapMode().GetMapUnit() )
1587*b1cdbd2cSJim Jagielski 		{
1588*b1cdbd2cSJim Jagielski 			aSize = Application::GetDefaultDevice()->PixelToLogic(aSize, aMap100mm );
1589*b1cdbd2cSJim Jagielski 		}
1590*b1cdbd2cSJim Jagielski 		else
1591*b1cdbd2cSJim Jagielski 		{
1592*b1cdbd2cSJim Jagielski 			aSize = OutputDevice::LogicToLogic( aSize,rGrf.GetPrefMapMode(), aMap100mm );
1593*b1cdbd2cSJim Jagielski 		}
1594*b1cdbd2cSJim Jagielski 		Point aEmptyPoint = Point();
1595*b1cdbd2cSJim Jagielski 		Rectangle aRect( aEmptyPoint, aSize );
1596*b1cdbd2cSJim Jagielski 		sal_uInt32 nBlibId = mxGlobal->GetBlibID( *(mxGlobal->QueryPictureStream()), aUniqueId,aRect, NULL, 0 );
1597*b1cdbd2cSJim Jagielski 		if (nBlibId)
1598*b1cdbd2cSJim Jagielski 			aPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, sal_True);
1599*b1cdbd2cSJim Jagielski 	}
1600*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_pibFlags, ESCHER_BlipFlagDefault );
1601*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dyTextTop, DrawModelToEmu(0));
1602*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dyTextBottom, DrawModelToEmu(0));
1603*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dxTextLeft, DrawModelToEmu(0));
1604*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dxTextRight, DrawModelToEmu(0));
1605*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
1606*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dyTextTop, 0 );
1607*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dyTextBottom, 0 );
1608*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dxTextLeft, 0 );
1609*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_dxTextRight, 0 );
1610*b1cdbd2cSJim Jagielski 	const Color aTmpColor( COL_WHITE );
1611*b1cdbd2cSJim Jagielski 	SvxBrushItem aBrush( aTmpColor, RES_BACKGROUND );
1612*b1cdbd2cSJim Jagielski 	const SvxBrushItem *pRet = rWrt.GetCurrentPageBgBrush();
1613*b1cdbd2cSJim Jagielski 	if (pRet && (pRet->GetGraphic() ||( pRet->GetColor() != COL_TRANSPARENT)))
1614*b1cdbd2cSJim Jagielski 		aBrush = *pRet;
1615*b1cdbd2cSJim Jagielski 	WriteBrushAttr(aBrush, aPropOpt);
1616*b1cdbd2cSJim Jagielski 
1617*b1cdbd2cSJim Jagielski 	aPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0 );
1618*b1cdbd2cSJim Jagielski 	aPropOpt.Commit( GetStream() );
1619*b1cdbd2cSJim Jagielski 	AddAtom(4, ESCHER_ClientAnchor);
1620*b1cdbd2cSJim Jagielski 	GetStream() << (sal_uInt32)0x80000000;
1621*b1cdbd2cSJim Jagielski 	CloseContainer();
1622*b1cdbd2cSJim Jagielski 
1623*b1cdbd2cSJim Jagielski 	return 0;
1624*b1cdbd2cSJim Jagielski }
1625*b1cdbd2cSJim Jagielski 
WriteGrfFlyFrame(const SwFrmFmt & rFmt,sal_uInt32 nShapeId)1626*b1cdbd2cSJim Jagielski sal_Int32 SwBasicEscherEx::WriteGrfFlyFrame(const SwFrmFmt& rFmt, sal_uInt32 nShapeId)
1627*b1cdbd2cSJim Jagielski {
1628*b1cdbd2cSJim Jagielski     sal_Int32 nBorderThick=0;
1629*b1cdbd2cSJim Jagielski     SwNoTxtNode *pNd = GetNoTxtNodeFromSwFrmFmt(rFmt);
1630*b1cdbd2cSJim Jagielski     SwGrfNode *pGrfNd = pNd ? pNd->GetGrfNode() : 0;
1631*b1cdbd2cSJim Jagielski     ASSERT(pGrfNd, "No SwGrfNode ?, suspicious");
1632*b1cdbd2cSJim Jagielski     if (!pGrfNd)
1633*b1cdbd2cSJim Jagielski         return nBorderThick;
1634*b1cdbd2cSJim Jagielski 
1635*b1cdbd2cSJim Jagielski     OpenContainer( ESCHER_SpContainer );
1636*b1cdbd2cSJim Jagielski 
1637*b1cdbd2cSJim Jagielski     const SwMirrorGrf &rMirror = pGrfNd->GetSwAttrSet().GetMirrorGrf();
1638*b1cdbd2cSJim Jagielski     AddShape(ESCHER_ShpInst_PictureFrame, AddMirrorFlags(0xa00, rMirror),
1639*b1cdbd2cSJim Jagielski         nShapeId);
1640*b1cdbd2cSJim Jagielski 
1641*b1cdbd2cSJim Jagielski     EscherPropertyContainer aPropOpt;
1642*b1cdbd2cSJim Jagielski 
1643*b1cdbd2cSJim Jagielski     sal_uInt32 nFlags = ESCHER_BlipFlagDefault;
1644*b1cdbd2cSJim Jagielski 
1645*b1cdbd2cSJim Jagielski     if (pGrfNd->IsLinkedFile())
1646*b1cdbd2cSJim Jagielski     {
1647*b1cdbd2cSJim Jagielski         String sURL;
1648*b1cdbd2cSJim Jagielski         pGrfNd->GetFileFilterNms( &sURL, 0 );
1649*b1cdbd2cSJim Jagielski 
1650*b1cdbd2cSJim Jagielski         WW8Bytes aBuf;
1651*b1cdbd2cSJim Jagielski         SwWW8Writer::InsAsString16( aBuf, sURL );
1652*b1cdbd2cSJim Jagielski         SwWW8Writer::InsUInt16( aBuf, 0 );
1653*b1cdbd2cSJim Jagielski 
1654*b1cdbd2cSJim Jagielski         sal_uInt16 nArrLen = aBuf.Count();
1655*b1cdbd2cSJim Jagielski         sal_uInt8* pArr = new sal_uInt8[ nArrLen ];
1656*b1cdbd2cSJim Jagielski         memcpy( pArr, aBuf.GetData(), nArrLen );
1657*b1cdbd2cSJim Jagielski 
1658*b1cdbd2cSJim Jagielski         aPropOpt.AddOpt(ESCHER_Prop_pibName, true, nArrLen, pArr, nArrLen);
1659*b1cdbd2cSJim Jagielski         nFlags = ESCHER_BlipFlagLinkToFile | ESCHER_BlipFlagURL |
1660*b1cdbd2cSJim Jagielski                     ESCHER_BlipFlagDoNotSave;
1661*b1cdbd2cSJim Jagielski     }
1662*b1cdbd2cSJim Jagielski     else
1663*b1cdbd2cSJim Jagielski     {
1664*b1cdbd2cSJim Jagielski         pGrfNd->SwapIn(true);
1665*b1cdbd2cSJim Jagielski 
1666*b1cdbd2cSJim Jagielski         Graphic         aGraphic(pGrfNd->GetGrf());
1667*b1cdbd2cSJim Jagielski         GraphicObject   aGraphicObject( aGraphic );
1668*b1cdbd2cSJim Jagielski         ByteString      aUniqueId = aGraphicObject.GetUniqueID();
1669*b1cdbd2cSJim Jagielski 
1670*b1cdbd2cSJim Jagielski         if ( aUniqueId.Len() )
1671*b1cdbd2cSJim Jagielski         {
1672*b1cdbd2cSJim Jagielski             const   MapMode aMap100mm( MAP_100TH_MM );
1673*b1cdbd2cSJim Jagielski             Size    aSize( aGraphic.GetPrefSize() );
1674*b1cdbd2cSJim Jagielski 
1675*b1cdbd2cSJim Jagielski             if ( MAP_PIXEL == aGraphic.GetPrefMapMode().GetMapUnit() )
1676*b1cdbd2cSJim Jagielski             {
1677*b1cdbd2cSJim Jagielski                 aSize = Application::GetDefaultDevice()->PixelToLogic(
1678*b1cdbd2cSJim Jagielski                     aSize, aMap100mm );
1679*b1cdbd2cSJim Jagielski             }
1680*b1cdbd2cSJim Jagielski             else
1681*b1cdbd2cSJim Jagielski             {
1682*b1cdbd2cSJim Jagielski                 aSize = OutputDevice::LogicToLogic( aSize,
1683*b1cdbd2cSJim Jagielski                     aGraphic.GetPrefMapMode(), aMap100mm );
1684*b1cdbd2cSJim Jagielski             }
1685*b1cdbd2cSJim Jagielski 
1686*b1cdbd2cSJim Jagielski             Point aEmptyPoint = Point();
1687*b1cdbd2cSJim Jagielski             Rectangle aRect( aEmptyPoint, aSize );
1688*b1cdbd2cSJim Jagielski 
1689*b1cdbd2cSJim Jagielski             sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(),
1690*b1cdbd2cSJim Jagielski                 aUniqueId, aRect, NULL, 0 );
1691*b1cdbd2cSJim Jagielski             if (nBlibId)
1692*b1cdbd2cSJim Jagielski                 aPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, sal_True);
1693*b1cdbd2cSJim Jagielski         }
1694*b1cdbd2cSJim Jagielski     }
1695*b1cdbd2cSJim Jagielski 
1696*b1cdbd2cSJim Jagielski     aPropOpt.AddOpt( ESCHER_Prop_pibFlags, nFlags );
1697*b1cdbd2cSJim Jagielski     nBorderThick = WriteFlyFrameAttr(rFmt,mso_sptPictureFrame,aPropOpt);
1698*b1cdbd2cSJim Jagielski     WriteGrfAttr(*pGrfNd, aPropOpt);
1699*b1cdbd2cSJim Jagielski 
1700*b1cdbd2cSJim Jagielski     aPropOpt.Commit( GetStream() );
1701*b1cdbd2cSJim Jagielski 
1702*b1cdbd2cSJim Jagielski     // store anchor attribute
1703*b1cdbd2cSJim Jagielski     WriteFrmExtraData( rFmt );
1704*b1cdbd2cSJim Jagielski 
1705*b1cdbd2cSJim Jagielski     CloseContainer();   // ESCHER_SpContainer
1706*b1cdbd2cSJim Jagielski     return nBorderThick;
1707*b1cdbd2cSJim Jagielski }
1708*b1cdbd2cSJim Jagielski 
WriteGrfAttr(const SwNoTxtNode & rNd,EscherPropertyContainer & rPropOpt)1709*b1cdbd2cSJim Jagielski void SwBasicEscherEx::WriteGrfAttr(const SwNoTxtNode& rNd,
1710*b1cdbd2cSJim Jagielski     EscherPropertyContainer& rPropOpt)
1711*b1cdbd2cSJim Jagielski {
1712*b1cdbd2cSJim Jagielski     const SfxPoolItem* pItem;
1713*b1cdbd2cSJim Jagielski     sal_uInt32 nMode = GRAPHICDRAWMODE_STANDARD;
1714*b1cdbd2cSJim Jagielski     sal_Int32 nContrast = 0;
1715*b1cdbd2cSJim Jagielski     sal_Int16 nBrightness = 0;
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_CONTRAST,
1718*b1cdbd2cSJim Jagielski         true, &pItem))
1719*b1cdbd2cSJim Jagielski     {
1720*b1cdbd2cSJim Jagielski         nContrast = ((SfxInt16Item*)pItem)->GetValue();
1721*b1cdbd2cSJim Jagielski     }
1722*b1cdbd2cSJim Jagielski 
1723*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_LUMINANCE,
1724*b1cdbd2cSJim Jagielski         true, &pItem))
1725*b1cdbd2cSJim Jagielski     {
1726*b1cdbd2cSJim Jagielski         nBrightness = ((SfxInt16Item*)pItem)->GetValue();
1727*b1cdbd2cSJim Jagielski     }
1728*b1cdbd2cSJim Jagielski 
1729*b1cdbd2cSJim Jagielski 
1730*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_DRAWMODE,
1731*b1cdbd2cSJim Jagielski         true, &pItem))
1732*b1cdbd2cSJim Jagielski     {
1733*b1cdbd2cSJim Jagielski         nMode = ((SfxEnumItem*)pItem)->GetValue();
1734*b1cdbd2cSJim Jagielski         if (nMode == GRAPHICDRAWMODE_WATERMARK)
1735*b1cdbd2cSJim Jagielski         {
1736*b1cdbd2cSJim Jagielski             /*
1737*b1cdbd2cSJim Jagielski             There is no real watermark mode in word, we must use standard
1738*b1cdbd2cSJim Jagielski             mode and modify our ones by 70% extra brightness and 70% less
1739*b1cdbd2cSJim Jagielski             contrast. This means that unmodified default OOo watermark
1740*b1cdbd2cSJim Jagielski             will turn back into watermark, and modified OOo watermark will
1741*b1cdbd2cSJim Jagielski             change into a close visual representation in standardmode
1742*b1cdbd2cSJim Jagielski             */
1743*b1cdbd2cSJim Jagielski             nBrightness += 70;
1744*b1cdbd2cSJim Jagielski             if (nBrightness > 100)
1745*b1cdbd2cSJim Jagielski                 nBrightness = 100;
1746*b1cdbd2cSJim Jagielski             nContrast -= 70;
1747*b1cdbd2cSJim Jagielski             if (nContrast < -100)
1748*b1cdbd2cSJim Jagielski                 nContrast = -100;
1749*b1cdbd2cSJim Jagielski             nMode = GRAPHICDRAWMODE_STANDARD;
1750*b1cdbd2cSJim Jagielski         }
1751*b1cdbd2cSJim Jagielski     }
1752*b1cdbd2cSJim Jagielski 
1753*b1cdbd2cSJim Jagielski     if (nMode == GRAPHICDRAWMODE_GREYS)
1754*b1cdbd2cSJim Jagielski         nMode = 0x40004;
1755*b1cdbd2cSJim Jagielski     else if (nMode == GRAPHICDRAWMODE_MONO)
1756*b1cdbd2cSJim Jagielski         nMode = 0x60006;
1757*b1cdbd2cSJim Jagielski     else
1758*b1cdbd2cSJim Jagielski         nMode = 0;
1759*b1cdbd2cSJim Jagielski     rPropOpt.AddOpt( ESCHER_Prop_pictureActive, nMode );
1760*b1cdbd2cSJim Jagielski 
1761*b1cdbd2cSJim Jagielski     if (nContrast != 0)
1762*b1cdbd2cSJim Jagielski     {
1763*b1cdbd2cSJim Jagielski         nContrast+=100;
1764*b1cdbd2cSJim Jagielski         if (nContrast == 100)
1765*b1cdbd2cSJim Jagielski             nContrast = 0x10000;
1766*b1cdbd2cSJim Jagielski         else if (nContrast < 100)
1767*b1cdbd2cSJim Jagielski         {
1768*b1cdbd2cSJim Jagielski             nContrast *= 0x10000;
1769*b1cdbd2cSJim Jagielski             nContrast /= 100;
1770*b1cdbd2cSJim Jagielski         }
1771*b1cdbd2cSJim Jagielski         else if (nContrast < 200)
1772*b1cdbd2cSJim Jagielski             nContrast = (100 * 0x10000) / (200-nContrast);
1773*b1cdbd2cSJim Jagielski         else
1774*b1cdbd2cSJim Jagielski             nContrast = 0x7fffffff;
1775*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_pictureContrast, nContrast);
1776*b1cdbd2cSJim Jagielski     }
1777*b1cdbd2cSJim Jagielski 
1778*b1cdbd2cSJim Jagielski     if (nBrightness != 0)
1779*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_pictureBrightness, nBrightness * 327 );
1780*b1cdbd2cSJim Jagielski 
1781*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_CROPGRF,
1782*b1cdbd2cSJim Jagielski         true, &pItem))
1783*b1cdbd2cSJim Jagielski     {
1784*b1cdbd2cSJim Jagielski         const Size aSz( rNd.GetTwipSize() );
1785*b1cdbd2cSJim Jagielski         sal_Int32 nVal;
1786*b1cdbd2cSJim Jagielski         if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetLeft() ) )
1787*b1cdbd2cSJim Jagielski             rPropOpt.AddOpt( ESCHER_Prop_cropFromLeft, ToFract16( nVal, aSz.Width()) );
1788*b1cdbd2cSJim Jagielski         if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetRight() ) )
1789*b1cdbd2cSJim Jagielski             rPropOpt.AddOpt( ESCHER_Prop_cropFromRight, ToFract16( nVal, aSz.Width()));
1790*b1cdbd2cSJim Jagielski         if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetTop() ) )
1791*b1cdbd2cSJim Jagielski             rPropOpt.AddOpt( ESCHER_Prop_cropFromTop, ToFract16( nVal, aSz.Height()));
1792*b1cdbd2cSJim Jagielski         if( 0 != ( nVal = ((SwCropGrf*)pItem )->GetBottom() ) )
1793*b1cdbd2cSJim Jagielski             rPropOpt.AddOpt( ESCHER_Prop_cropFromBottom, ToFract16( nVal, aSz.Height()));
1794*b1cdbd2cSJim Jagielski     }
1795*b1cdbd2cSJim Jagielski }
1796*b1cdbd2cSJim Jagielski 
SetPicId(const SdrObject &,sal_uInt32,EscherPropertyContainer &)1797*b1cdbd2cSJim Jagielski void SwBasicEscherEx::SetPicId(const SdrObject &, sal_uInt32,
1798*b1cdbd2cSJim Jagielski     EscherPropertyContainer &)
1799*b1cdbd2cSJim Jagielski {
1800*b1cdbd2cSJim Jagielski }
1801*b1cdbd2cSJim Jagielski 
SetPicId(const SdrObject & rSdrObj,sal_uInt32 nShapeId,EscherPropertyContainer & rPropOpt)1802*b1cdbd2cSJim Jagielski void SwEscherEx::SetPicId(const SdrObject &rSdrObj, sal_uInt32 nShapeId,
1803*b1cdbd2cSJim Jagielski     EscherPropertyContainer &rPropOpt)
1804*b1cdbd2cSJim Jagielski {
1805*b1cdbd2cSJim Jagielski     pTxtBxs->Append(rSdrObj, nShapeId);
1806*b1cdbd2cSJim Jagielski     sal_uInt32 nPicId = pTxtBxs->Count();
1807*b1cdbd2cSJim Jagielski     nPicId *= 0x10000;
1808*b1cdbd2cSJim Jagielski     rPropOpt.AddOpt( ESCHER_Prop_pictureId, nPicId );
1809*b1cdbd2cSJim Jagielski }
1810*b1cdbd2cSJim Jagielski 
WriteOLEFlyFrame(const SwFrmFmt & rFmt,sal_uInt32 nShapeId)1811*b1cdbd2cSJim Jagielski sal_Int32 SwBasicEscherEx::WriteOLEFlyFrame(const SwFrmFmt& rFmt, sal_uInt32 nShapeId)
1812*b1cdbd2cSJim Jagielski {
1813*b1cdbd2cSJim Jagielski     sal_Int32 nBorderThick = 0;
1814*b1cdbd2cSJim Jagielski     if (const SdrObject* pSdrObj = rFmt.FindRealSdrObject())
1815*b1cdbd2cSJim Jagielski     {
1816*b1cdbd2cSJim Jagielski         SwNodeIndex aIdx(*rFmt.GetCntnt().GetCntntIdx(), 1);
1817*b1cdbd2cSJim Jagielski         SwOLENode& rOLENd = *aIdx.GetNode().GetOLENode();
1818*b1cdbd2cSJim Jagielski 		sal_Int64 nAspect = rOLENd.GetAspect();
1819*b1cdbd2cSJim Jagielski 
1820*b1cdbd2cSJim Jagielski         uno::Reference < embed::XEmbeddedObject > xObj(rOLENd.GetOLEObj().GetOleRef());
1821*b1cdbd2cSJim Jagielski 
1822*b1cdbd2cSJim Jagielski         // the rectangle is used to transport the size of the object
1823*b1cdbd2cSJim Jagielski         // the left, top corner is set to ( 0, 0 ) by default constructor,
1824*b1cdbd2cSJim Jagielski         // if the width and height are set correctly bRectIsSet should be set to true
1825*b1cdbd2cSJim Jagielski         awt::Rectangle aRect;
1826*b1cdbd2cSJim Jagielski         sal_Bool bRectIsSet = sal_False;
1827*b1cdbd2cSJim Jagielski 
1828*b1cdbd2cSJim Jagielski 
1829*b1cdbd2cSJim Jagielski         // TODO/LATER: should the icon size be stored in case of iconified object?
1830*b1cdbd2cSJim Jagielski 		if ( xObj.is() && nAspect != embed::Aspects::MSOLE_ICON )
1831*b1cdbd2cSJim Jagielski         {
1832*b1cdbd2cSJim Jagielski             try
1833*b1cdbd2cSJim Jagielski             {
1834*b1cdbd2cSJim Jagielski                 awt::Size aSize = xObj->getVisualAreaSize( nAspect );
1835*b1cdbd2cSJim Jagielski                 aRect.Width = aSize.Width;
1836*b1cdbd2cSJim Jagielski                 aRect.Height = aSize.Height;
1837*b1cdbd2cSJim Jagielski                 bRectIsSet = sal_True;
1838*b1cdbd2cSJim Jagielski             }
1839*b1cdbd2cSJim Jagielski             catch( uno::Exception& )
1840*b1cdbd2cSJim Jagielski             {}
1841*b1cdbd2cSJim Jagielski         }
1842*b1cdbd2cSJim Jagielski 
1843*b1cdbd2cSJim Jagielski         /*
1844*b1cdbd2cSJim Jagielski         #i5970#
1845*b1cdbd2cSJim Jagielski         Export floating ole2 .doc ver 8+ wmf ole2 previews as emf previews
1846*b1cdbd2cSJim Jagielski         instead ==> allows unicode text to be preserved
1847*b1cdbd2cSJim Jagielski         */
1848*b1cdbd2cSJim Jagielski #ifdef OLE_PREVIEW_AS_EMF
1849*b1cdbd2cSJim Jagielski         //Graphic aGraphic = wwUtility::MakeSafeGDIMetaFile(xObj);
1850*b1cdbd2cSJim Jagielski         Graphic* pGraphic = rOLENd.GetGraphic();
1851*b1cdbd2cSJim Jagielski #endif
1852*b1cdbd2cSJim Jagielski         OpenContainer(ESCHER_SpContainer);
1853*b1cdbd2cSJim Jagielski 
1854*b1cdbd2cSJim Jagielski         EscherPropertyContainer aPropOpt;
1855*b1cdbd2cSJim Jagielski         const SwMirrorGrf &rMirror = rOLENd.GetSwAttrSet().GetMirrorGrf();
1856*b1cdbd2cSJim Jagielski         WriteOLEPicture(aPropOpt, AddMirrorFlags(0xa00 | SHAPEFLAG_OLESHAPE,
1857*b1cdbd2cSJim Jagielski             rMirror), pGraphic ? *pGraphic : Graphic(), *pSdrObj, nShapeId, bRectIsSet ? &aRect : NULL );
1858*b1cdbd2cSJim Jagielski 
1859*b1cdbd2cSJim Jagielski         nBorderThick = WriteFlyFrameAttr(rFmt, mso_sptPictureFrame, aPropOpt);
1860*b1cdbd2cSJim Jagielski         WriteGrfAttr(rOLENd, aPropOpt);
1861*b1cdbd2cSJim Jagielski         aPropOpt.Commit(GetStream());
1862*b1cdbd2cSJim Jagielski 
1863*b1cdbd2cSJim Jagielski         // store anchor attribute
1864*b1cdbd2cSJim Jagielski         WriteFrmExtraData( rFmt );
1865*b1cdbd2cSJim Jagielski 
1866*b1cdbd2cSJim Jagielski         CloseContainer();   // ESCHER_SpContainer
1867*b1cdbd2cSJim Jagielski     }
1868*b1cdbd2cSJim Jagielski     return nBorderThick;
1869*b1cdbd2cSJim Jagielski }
1870*b1cdbd2cSJim Jagielski 
WriteBrushAttr(const SvxBrushItem & rBrush,EscherPropertyContainer & rPropOpt)1871*b1cdbd2cSJim Jagielski void SwBasicEscherEx::WriteBrushAttr(const SvxBrushItem &rBrush,
1872*b1cdbd2cSJim Jagielski     EscherPropertyContainer& rPropOpt)
1873*b1cdbd2cSJim Jagielski {
1874*b1cdbd2cSJim Jagielski     bool bSetOpacity = false;
1875*b1cdbd2cSJim Jagielski     sal_uInt32 nOpaque = 0;
1876*b1cdbd2cSJim Jagielski     if (const GraphicObject *pGraphicObject = rBrush.GetGraphicObject())
1877*b1cdbd2cSJim Jagielski     {
1878*b1cdbd2cSJim Jagielski         ByteString aUniqueId = pGraphicObject->GetUniqueID();
1879*b1cdbd2cSJim Jagielski         if (aUniqueId.Len())
1880*b1cdbd2cSJim Jagielski         {
1881*b1cdbd2cSJim Jagielski             const Graphic &rGraphic = pGraphicObject->GetGraphic();
1882*b1cdbd2cSJim Jagielski             Size aSize(rGraphic.GetPrefSize());
1883*b1cdbd2cSJim Jagielski             const MapMode aMap100mm(MAP_100TH_MM);
1884*b1cdbd2cSJim Jagielski             if (MAP_PIXEL == rGraphic.GetPrefMapMode().GetMapUnit())
1885*b1cdbd2cSJim Jagielski             {
1886*b1cdbd2cSJim Jagielski                 aSize = Application::GetDefaultDevice()->PixelToLogic(
1887*b1cdbd2cSJim Jagielski                     aSize, aMap100mm);
1888*b1cdbd2cSJim Jagielski             }
1889*b1cdbd2cSJim Jagielski             else
1890*b1cdbd2cSJim Jagielski             {
1891*b1cdbd2cSJim Jagielski                 aSize = OutputDevice::LogicToLogic(aSize,
1892*b1cdbd2cSJim Jagielski                     rGraphic.GetPrefMapMode(), aMap100mm);
1893*b1cdbd2cSJim Jagielski             }
1894*b1cdbd2cSJim Jagielski 
1895*b1cdbd2cSJim Jagielski             Point aEmptyPoint = Point();
1896*b1cdbd2cSJim Jagielski             Rectangle aRect(aEmptyPoint, aSize);
1897*b1cdbd2cSJim Jagielski 
1898*b1cdbd2cSJim Jagielski             sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(),
1899*b1cdbd2cSJim Jagielski                 aUniqueId, aRect, NULL, 0);
1900*b1cdbd2cSJim Jagielski             if (nBlibId)
1901*b1cdbd2cSJim Jagielski                 rPropOpt.AddOpt(ESCHER_Prop_fillBlip,nBlibId,sal_True);
1902*b1cdbd2cSJim Jagielski         }
1903*b1cdbd2cSJim Jagielski 
1904*b1cdbd2cSJim Jagielski         if (0 != (nOpaque = pGraphicObject->GetAttr().GetTransparency()))
1905*b1cdbd2cSJim Jagielski             bSetOpacity = true;
1906*b1cdbd2cSJim Jagielski 
1907*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fillType, ESCHER_FillPicture );
1908*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 );
1909*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0 );
1910*b1cdbd2cSJim Jagielski     }
1911*b1cdbd2cSJim Jagielski     else
1912*b1cdbd2cSJim Jagielski     {
1913*b1cdbd2cSJim Jagielski         sal_uInt32 nFillColor = GetColor(rBrush.GetColor(), false);
1914*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fillColor, nFillColor );
1915*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fillBackColor, nFillColor ^ 0xffffff );
1916*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100010 );
1917*b1cdbd2cSJim Jagielski 
1918*b1cdbd2cSJim Jagielski         if (0 != (nOpaque = rBrush.GetColor().GetTransparency()))
1919*b1cdbd2cSJim Jagielski             bSetOpacity = true;
1920*b1cdbd2cSJim Jagielski     }
1921*b1cdbd2cSJim Jagielski 
1922*b1cdbd2cSJim Jagielski     if (bSetOpacity)
1923*b1cdbd2cSJim Jagielski     {
1924*b1cdbd2cSJim Jagielski         nOpaque = (nOpaque * 100) / 0xFE;
1925*b1cdbd2cSJim Jagielski         nOpaque = ((100 - nOpaque) << 16) / 100;
1926*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt(ESCHER_Prop_fillOpacity, nOpaque);
1927*b1cdbd2cSJim Jagielski     }
1928*b1cdbd2cSJim Jagielski }
1929*b1cdbd2cSJim Jagielski 
WriteFlyFrameAttr(const SwFrmFmt & rFmt,MSO_SPT eShapeType,EscherPropertyContainer & rPropOpt)1930*b1cdbd2cSJim Jagielski sal_Int32 SwBasicEscherEx::WriteFlyFrameAttr(const SwFrmFmt& rFmt,
1931*b1cdbd2cSJim Jagielski     MSO_SPT eShapeType, EscherPropertyContainer& rPropOpt)
1932*b1cdbd2cSJim Jagielski {
1933*b1cdbd2cSJim Jagielski     sal_Int32 nLineWidth=0;
1934*b1cdbd2cSJim Jagielski     const SfxPoolItem* pItem;
1935*b1cdbd2cSJim Jagielski     bool bFirstLine = true;
1936*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET == rFmt.GetItemState(RES_BOX, true, &pItem))
1937*b1cdbd2cSJim Jagielski     {
1938*b1cdbd2cSJim Jagielski         static const sal_uInt16 aExhperProp[4] =
1939*b1cdbd2cSJim Jagielski         {
1940*b1cdbd2cSJim Jagielski             ESCHER_Prop_dyTextTop,  ESCHER_Prop_dyTextBottom,
1941*b1cdbd2cSJim Jagielski             ESCHER_Prop_dxTextLeft, ESCHER_Prop_dxTextRight
1942*b1cdbd2cSJim Jagielski         };
1943*b1cdbd2cSJim Jagielski         const SvxBorderLine* pLine;
1944*b1cdbd2cSJim Jagielski 
1945*b1cdbd2cSJim Jagielski         for( sal_uInt16 n = 0; n < 4; ++n )
1946*b1cdbd2cSJim Jagielski             if( 0 != ( pLine = ((SvxBoxItem*)pItem)->GetLine( n )) )
1947*b1cdbd2cSJim Jagielski             {
1948*b1cdbd2cSJim Jagielski                 if( bFirstLine )
1949*b1cdbd2cSJim Jagielski                 {
1950*b1cdbd2cSJim Jagielski                     sal_uInt32 nLineColor = GetColor(pLine->GetColor(), false);
1951*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( ESCHER_Prop_lineColor, nLineColor );
1952*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( ESCHER_Prop_lineBackColor,
1953*b1cdbd2cSJim Jagielski                         nLineColor ^ 0xffffff );
1954*b1cdbd2cSJim Jagielski 
1955*b1cdbd2cSJim Jagielski                     MSO_LineStyle eStyle;
1956*b1cdbd2cSJim Jagielski                     if( pLine->GetInWidth() )
1957*b1cdbd2cSJim Jagielski                     {
1958*b1cdbd2cSJim Jagielski                         // double line
1959*b1cdbd2cSJim Jagielski                         nLineWidth = pLine->GetInWidth() + pLine->GetOutWidth()
1960*b1cdbd2cSJim Jagielski                             + pLine->GetDistance();
1961*b1cdbd2cSJim Jagielski                         if( pLine->GetInWidth() == pLine->GetOutWidth() )
1962*b1cdbd2cSJim Jagielski                             eStyle = mso_lineDouble;
1963*b1cdbd2cSJim Jagielski                         else if( pLine->GetInWidth() < pLine->GetOutWidth() )
1964*b1cdbd2cSJim Jagielski                             eStyle = mso_lineThickThin;
1965*b1cdbd2cSJim Jagielski                         else
1966*b1cdbd2cSJim Jagielski                             eStyle = mso_lineThinThick;
1967*b1cdbd2cSJim Jagielski                     }
1968*b1cdbd2cSJim Jagielski                     else
1969*b1cdbd2cSJim Jagielski                     {
1970*b1cdbd2cSJim Jagielski                         // simple line
1971*b1cdbd2cSJim Jagielski                         eStyle = mso_lineSimple;
1972*b1cdbd2cSJim Jagielski                         nLineWidth = pLine->GetOutWidth();
1973*b1cdbd2cSJim Jagielski                     }
1974*b1cdbd2cSJim Jagielski 
1975*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( ESCHER_Prop_lineStyle, eStyle );
1976*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( ESCHER_Prop_lineWidth,
1977*b1cdbd2cSJim Jagielski                         DrawModelToEmu( nLineWidth ));
1978*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x8000E );
1979*b1cdbd2cSJim Jagielski 
1980*b1cdbd2cSJim Jagielski                     //Use import logic to determine how much of border will go
1981*b1cdbd2cSJim Jagielski                     //outside graphic
1982*b1cdbd2cSJim Jagielski                     nLineWidth = SwMSDffManager::GetEscherLineMatch(
1983*b1cdbd2cSJim Jagielski                         eStyle,eShapeType,nLineWidth);
1984*b1cdbd2cSJim Jagielski                     bFirstLine = false;
1985*b1cdbd2cSJim Jagielski                 }
1986*b1cdbd2cSJim Jagielski                 rPropOpt.AddOpt( aExhperProp[ n ], DrawModelToEmu(
1987*b1cdbd2cSJim Jagielski                     ((SvxBoxItem*)pItem)->GetDistance( n ) ));
1988*b1cdbd2cSJim Jagielski             }
1989*b1cdbd2cSJim Jagielski             else
1990*b1cdbd2cSJim Jagielski                 // MM If there is no line the distance should be set to 0
1991*b1cdbd2cSJim Jagielski                 rPropOpt.AddOpt( aExhperProp[ n ], DrawModelToEmu(0));
1992*b1cdbd2cSJim Jagielski     }
1993*b1cdbd2cSJim Jagielski     if( bFirstLine )                // no valid line found
1994*b1cdbd2cSJim Jagielski     {
1995*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
1996*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, 0 );
1997*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dyTextBottom, 0 );
1998*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dxTextLeft, 0 );
1999*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dxTextRight, 0 );
2000*b1cdbd2cSJim Jagielski     }
2001*b1cdbd2cSJim Jagielski     const SwAttrSet& rAttrSet = rFmt.GetAttrSet();
2002*b1cdbd2cSJim Jagielski     if (SFX_ITEM_ON == rAttrSet.GetItemState(RES_BOX, false, &pItem))
2003*b1cdbd2cSJim Jagielski     {
2004*b1cdbd2cSJim Jagielski         const SvxBoxItem* pBox = (const SvxBoxItem*)pItem;
2005*b1cdbd2cSJim Jagielski         if( pBox )
2006*b1cdbd2cSJim Jagielski         {
2007*b1cdbd2cSJim Jagielski             const SfxPoolItem* pShadItem;
2008*b1cdbd2cSJim Jagielski             if (SFX_ITEM_ON
2009*b1cdbd2cSJim Jagielski                 == rAttrSet.GetItemState(RES_SHADOW, true, &pShadItem))
2010*b1cdbd2cSJim Jagielski             {
2011*b1cdbd2cSJim Jagielski                 const SvxShadowItem* pSI = (const SvxShadowItem*)pShadItem;
2012*b1cdbd2cSJim Jagielski 
2013*b1cdbd2cSJim Jagielski                 const sal_uInt16 nCstScale = 635;        // unit scale between AOO and MS Word
2014*b1cdbd2cSJim Jagielski                 const sal_uInt32 nShadowType = 131074;    // shadow type of ms word. need to set the default value.
2015*b1cdbd2cSJim Jagielski 
2016*b1cdbd2cSJim Jagielski                 sal_uInt32  nColor = (sal_uInt32)(pSI->GetColor().GetColor()) ;
2017*b1cdbd2cSJim Jagielski                 sal_uInt32  nOffX = pSI->GetWidth() * nCstScale;
2018*b1cdbd2cSJim Jagielski                 sal_uInt32  nOffY = pSI->GetWidth() * nCstScale;
2019*b1cdbd2cSJim Jagielski                 sal_uInt32  nShadow = nShadowType;
2020*b1cdbd2cSJim Jagielski 
2021*b1cdbd2cSJim Jagielski                 SvxShadowLocation eLocation = pSI->GetLocation();
2022*b1cdbd2cSJim Jagielski                 if( (eLocation!=SVX_SHADOW_NONE) && (pSI->GetWidth()!=0) )
2023*b1cdbd2cSJim Jagielski                 {
2024*b1cdbd2cSJim Jagielski                     switch( eLocation )
2025*b1cdbd2cSJim Jagielski                     {
2026*b1cdbd2cSJim Jagielski                     case SVX_SHADOW_TOPLEFT:
2027*b1cdbd2cSJim Jagielski                         {
2028*b1cdbd2cSJim Jagielski                             nOffX = -nOffX;
2029*b1cdbd2cSJim Jagielski                             nOffY = -nOffY;
2030*b1cdbd2cSJim Jagielski                         }
2031*b1cdbd2cSJim Jagielski                         break;
2032*b1cdbd2cSJim Jagielski                     case SVX_SHADOW_TOPRIGHT:
2033*b1cdbd2cSJim Jagielski                         {
2034*b1cdbd2cSJim Jagielski                             nOffY = -nOffY;
2035*b1cdbd2cSJim Jagielski                         }
2036*b1cdbd2cSJim Jagielski                         break;
2037*b1cdbd2cSJim Jagielski                     case SVX_SHADOW_BOTTOMLEFT:
2038*b1cdbd2cSJim Jagielski                         {
2039*b1cdbd2cSJim Jagielski                             nOffX = -nOffX;
2040*b1cdbd2cSJim Jagielski                         }
2041*b1cdbd2cSJim Jagielski                         break;
2042*b1cdbd2cSJim Jagielski                     case SVX_SHADOW_BOTTOMRIGHT:
2043*b1cdbd2cSJim Jagielski                         break;
2044*b1cdbd2cSJim Jagielski                     default:
2045*b1cdbd2cSJim Jagielski                         break;
2046*b1cdbd2cSJim Jagielski                     }
2047*b1cdbd2cSJim Jagielski 
2048*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( DFF_Prop_shadowColor,    wwUtility::RGBToBGR((nColor)));
2049*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( DFF_Prop_shadowOffsetX,    nOffX );
2050*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( DFF_Prop_shadowOffsetY,    nOffY );
2051*b1cdbd2cSJim Jagielski                     rPropOpt.AddOpt( DFF_Prop_fshadowObscured,  nShadow );
2052*b1cdbd2cSJim Jagielski                 }
2053*b1cdbd2cSJim Jagielski             }
2054*b1cdbd2cSJim Jagielski     	}
2055*b1cdbd2cSJim Jagielski     }
2056*b1cdbd2cSJim Jagielski     SvxBrushItem aBrush(rWrt.TrueFrameBgBrush(rFmt));
2057*b1cdbd2cSJim Jagielski     WriteBrushAttr(aBrush, rPropOpt);
2058*b1cdbd2cSJim Jagielski 
2059*b1cdbd2cSJim Jagielski     const SdrObject* pObj = rFmt.FindRealSdrObject();
2060*b1cdbd2cSJim Jagielski     if( pObj && (pObj->GetLayer() == GetHellLayerId() ||
2061*b1cdbd2cSJim Jagielski         pObj->GetLayer() == GetInvisibleHellId() ))
2062*b1cdbd2cSJim Jagielski     {
2063*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_fPrint, 0x200020 );
2064*b1cdbd2cSJim Jagielski     }
2065*b1cdbd2cSJim Jagielski 
2066*b1cdbd2cSJim Jagielski 	PreWriteHyperlinkWithinFly(rFmt,rPropOpt);
2067*b1cdbd2cSJim Jagielski 
2068*b1cdbd2cSJim Jagielski     return nLineWidth;
2069*b1cdbd2cSJim Jagielski }
2070*b1cdbd2cSJim Jagielski 
WriteFlyFrameAttr(const SwFrmFmt & rFmt,MSO_SPT eShapeType,EscherPropertyContainer & rPropOpt)2071*b1cdbd2cSJim Jagielski sal_Int32 SwEscherEx::WriteFlyFrameAttr(const SwFrmFmt& rFmt, MSO_SPT eShapeType,
2072*b1cdbd2cSJim Jagielski     EscherPropertyContainer& rPropOpt)
2073*b1cdbd2cSJim Jagielski {
2074*b1cdbd2cSJim Jagielski     sal_Int32 nLineWidth = SwBasicEscherEx::WriteFlyFrameAttr(rFmt, eShapeType,
2075*b1cdbd2cSJim Jagielski         rPropOpt);
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski     /*
2078*b1cdbd2cSJim Jagielski      These are not in SwBasicEscherEx::WriteFlyFrameAttr because inline objs
2079*b1cdbd2cSJim Jagielski      can't do it in word and it hacks it in by stretching the graphic that
2080*b1cdbd2cSJim Jagielski      way, perhaps we should actually draw in this space into the graphic we
2081*b1cdbd2cSJim Jagielski      are exporting!
2082*b1cdbd2cSJim Jagielski      */
2083*b1cdbd2cSJim Jagielski     const SfxPoolItem* pItem;
2084*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET == rFmt.GetItemState(RES_LR_SPACE, true, &pItem))
2085*b1cdbd2cSJim Jagielski     {
2086*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dxWrapDistLeft,
2087*b1cdbd2cSJim Jagielski                 DrawModelToEmu( ((SvxLRSpaceItem*)pItem)->GetLeft() ) );
2088*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dxWrapDistRight,
2089*b1cdbd2cSJim Jagielski                 DrawModelToEmu( ((SvxLRSpaceItem*)pItem)->GetRight() ) );
2090*b1cdbd2cSJim Jagielski     }
2091*b1cdbd2cSJim Jagielski     else
2092*b1cdbd2cSJim Jagielski     {
2093*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dxWrapDistLeft, 0 );
2094*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dxWrapDistRight, 0 );
2095*b1cdbd2cSJim Jagielski     }
2096*b1cdbd2cSJim Jagielski 
2097*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET == rFmt.GetItemState(RES_UL_SPACE, true, &pItem))
2098*b1cdbd2cSJim Jagielski     {
2099*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dyWrapDistTop,
2100*b1cdbd2cSJim Jagielski                 DrawModelToEmu( ((SvxULSpaceItem*)pItem)->GetUpper() ) );
2101*b1cdbd2cSJim Jagielski         rPropOpt.AddOpt( ESCHER_Prop_dyWrapDistBottom,
2102*b1cdbd2cSJim Jagielski                 DrawModelToEmu( ((SvxULSpaceItem*)pItem)->GetLower() ) );
2103*b1cdbd2cSJim Jagielski     }
2104*b1cdbd2cSJim Jagielski 
2105*b1cdbd2cSJim Jagielski     if (rFmt.GetSurround().IsContour())
2106*b1cdbd2cSJim Jagielski     {
2107*b1cdbd2cSJim Jagielski         if (const SwNoTxtNode *pNd = GetNoTxtNodeFromSwFrmFmt(rFmt))
2108*b1cdbd2cSJim Jagielski         {
2109*b1cdbd2cSJim Jagielski             const PolyPolygon *pPolyPoly = pNd->HasContour();
2110*b1cdbd2cSJim Jagielski             if (pPolyPoly && pPolyPoly->Count())
2111*b1cdbd2cSJim Jagielski             {
2112*b1cdbd2cSJim Jagielski                 Polygon aPoly(PolygonFromPolyPolygon(*pPolyPoly));
2113*b1cdbd2cSJim Jagielski                 const Size &rOrigSize = pNd->GetGraphic().GetPrefSize();
2114*b1cdbd2cSJim Jagielski                 Fraction aMapPolyX(ww::nWrap100Percent, rOrigSize.Width());
2115*b1cdbd2cSJim Jagielski                 Fraction aMapPolyY(ww::nWrap100Percent, rOrigSize.Height());
2116*b1cdbd2cSJim Jagielski                 aPoly.Scale(aMapPolyX, aMapPolyY);
2117*b1cdbd2cSJim Jagielski 
2118*b1cdbd2cSJim Jagielski                 /*
2119*b1cdbd2cSJim Jagielski                  a) stretch right bound by 15twips
2120*b1cdbd2cSJim Jagielski                  b) shrink bottom bound to where it would have been in word
2121*b1cdbd2cSJim Jagielski                  c) Move it to the left by 15twips
2122*b1cdbd2cSJim Jagielski 
2123*b1cdbd2cSJim Jagielski                  See the import for details
2124*b1cdbd2cSJim Jagielski                 */
2125*b1cdbd2cSJim Jagielski                 const Size &rSize = pNd->GetTwipSize();
2126*b1cdbd2cSJim Jagielski                 Fraction aMoveHack(ww::nWrap100Percent, rSize.Width());
2127*b1cdbd2cSJim Jagielski                 aMoveHack *= Fraction(15, 1);
2128*b1cdbd2cSJim Jagielski                 long nMove(aMoveHack);
2129*b1cdbd2cSJim Jagielski 
2130*b1cdbd2cSJim Jagielski                 Fraction aHackX(ww::nWrap100Percent + nMove,
2131*b1cdbd2cSJim Jagielski                         ww::nWrap100Percent);
2132*b1cdbd2cSJim Jagielski                 Fraction aHackY(ww::nWrap100Percent - nMove,
2133*b1cdbd2cSJim Jagielski                         ww::nWrap100Percent);
2134*b1cdbd2cSJim Jagielski                 aPoly.Scale(aHackX, aHackY);
2135*b1cdbd2cSJim Jagielski 
2136*b1cdbd2cSJim Jagielski                 aPoly.Move(-nMove, 0);
2137*b1cdbd2cSJim Jagielski 
2138*b1cdbd2cSJim Jagielski                 SvMemoryStream aPolyDump;
2139*b1cdbd2cSJim Jagielski                 aPolyDump.SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN);
2140*b1cdbd2cSJim Jagielski 
2141*b1cdbd2cSJim Jagielski                 sal_uInt16 nLen = aPoly.GetSize();
2142*b1cdbd2cSJim Jagielski                 aPolyDump << nLen;
2143*b1cdbd2cSJim Jagielski                 aPolyDump << nLen;
2144*b1cdbd2cSJim Jagielski                 aPolyDump << sal_uInt16(8);
2145*b1cdbd2cSJim Jagielski                 for (sal_uInt16 nI = 0; nI < nLen; ++nI)
2146*b1cdbd2cSJim Jagielski                 {
2147*b1cdbd2cSJim Jagielski                     aPolyDump << sal_uInt32(aPoly[nI].X());
2148*b1cdbd2cSJim Jagielski                     aPolyDump << sal_uInt32(aPoly[nI].Y());
2149*b1cdbd2cSJim Jagielski                 }
2150*b1cdbd2cSJim Jagielski 
2151*b1cdbd2cSJim Jagielski                 sal_uInt16 nArrLen = msword_cast<sal_uInt16>(aPolyDump.Tell());
2152*b1cdbd2cSJim Jagielski                 void *pArr = const_cast<void *>(aPolyDump.GetData());
2153*b1cdbd2cSJim Jagielski                 //PropOpt wants to own the buffer
2154*b1cdbd2cSJim Jagielski                 aPolyDump.ObjectOwnsMemory(false);
2155*b1cdbd2cSJim Jagielski                 rPropOpt.AddOpt(DFF_Prop_pWrapPolygonVertices, false,
2156*b1cdbd2cSJim Jagielski                     nArrLen, static_cast<sal_uInt8 *>(pArr), nArrLen);
2157*b1cdbd2cSJim Jagielski             }
2158*b1cdbd2cSJim Jagielski         }
2159*b1cdbd2cSJim Jagielski     }
2160*b1cdbd2cSJim Jagielski 
2161*b1cdbd2cSJim Jagielski 	PreWriteHyperlinkWithinFly(rFmt,rPropOpt);
2162*b1cdbd2cSJim Jagielski 
2163*b1cdbd2cSJim Jagielski     return nLineWidth;
2164*b1cdbd2cSJim Jagielski }
2165*b1cdbd2cSJim Jagielski 
Init()2166*b1cdbd2cSJim Jagielski void SwBasicEscherEx::Init()
2167*b1cdbd2cSJim Jagielski {
2168*b1cdbd2cSJim Jagielski     MapUnit eMap = MAP_TWIP;
2169*b1cdbd2cSJim Jagielski     if (SdrModel *pModel = rWrt.pDoc->GetDrawModel())
2170*b1cdbd2cSJim Jagielski     {
2171*b1cdbd2cSJim Jagielski         // PPT arbeitet nur mit Einheiten zu 576DPI
2172*b1cdbd2cSJim Jagielski         // WW hingegen verwendet twips, dh. 1440DPI.
2173*b1cdbd2cSJim Jagielski         eMap = pModel->GetScaleUnit();
2174*b1cdbd2cSJim Jagielski     }
2175*b1cdbd2cSJim Jagielski 
2176*b1cdbd2cSJim Jagielski     // MS-DFF-Properties sind grossteils in EMU (English Metric Units) angegeben
2177*b1cdbd2cSJim Jagielski     // 1mm=36000emu, 1twip=635emu
2178*b1cdbd2cSJim Jagielski     Fraction aFact(360, 1);
2179*b1cdbd2cSJim Jagielski     aFact /= GetMapFactor(MAP_100TH_MM, eMap).X();
2180*b1cdbd2cSJim Jagielski     // create little values
2181*b1cdbd2cSJim Jagielski     aFact = Fraction(aFact.GetNumerator(), aFact.GetDenominator());
2182*b1cdbd2cSJim Jagielski     mnEmuMul = aFact.GetNumerator();
2183*b1cdbd2cSJim Jagielski     mnEmuDiv = aFact.GetDenominator();
2184*b1cdbd2cSJim Jagielski 
2185*b1cdbd2cSJim Jagielski     SetHellLayerId(rWrt.pDoc->GetHellId());
2186*b1cdbd2cSJim Jagielski }
2187*b1cdbd2cSJim Jagielski 
ToFract16(sal_Int32 nVal,sal_uInt32 nMax) const2188*b1cdbd2cSJim Jagielski sal_Int32 SwBasicEscherEx::ToFract16(sal_Int32 nVal, sal_uInt32 nMax) const
2189*b1cdbd2cSJim Jagielski {
2190*b1cdbd2cSJim Jagielski     if (nMax)
2191*b1cdbd2cSJim Jagielski     {
2192*b1cdbd2cSJim Jagielski         sal_Int32 nMSVal = (nVal / 65536) * nMax;
2193*b1cdbd2cSJim Jagielski         nMSVal += (nVal * 65536 ) / nMax;
2194*b1cdbd2cSJim Jagielski         return nMSVal;
2195*b1cdbd2cSJim Jagielski     }
2196*b1cdbd2cSJim Jagielski     return 0;
2197*b1cdbd2cSJim Jagielski }
2198*b1cdbd2cSJim Jagielski 
GetInvisibleHellId() const2199*b1cdbd2cSJim Jagielski SdrLayerID SwBasicEscherEx::GetInvisibleHellId() const
2200*b1cdbd2cSJim Jagielski {
2201*b1cdbd2cSJim Jagielski     return rWrt.pDoc->GetInvisibleHellId();
2202*b1cdbd2cSJim Jagielski }
2203*b1cdbd2cSJim Jagielski 
WritePictures()2204*b1cdbd2cSJim Jagielski void SwBasicEscherEx::WritePictures()
2205*b1cdbd2cSJim Jagielski {
2206*b1cdbd2cSJim Jagielski     if( SvStream* pPicStrm = static_cast< SwEscherExGlobal& >( *mxGlobal ).GetPictureStream() )
2207*b1cdbd2cSJim Jagielski     {
2208*b1cdbd2cSJim Jagielski         // set the blip - entries to the correct stream pos
2209*b1cdbd2cSJim Jagielski         sal_Int32 nEndPos = pPicStrm->Tell();
2210*b1cdbd2cSJim Jagielski         mxGlobal->WriteBlibStoreEntry(*pEscherStrm, 1, sal_True, nEndPos);
2211*b1cdbd2cSJim Jagielski 
2212*b1cdbd2cSJim Jagielski         pPicStrm->Seek(0);
2213*b1cdbd2cSJim Jagielski         *pEscherStrm << *pPicStrm;
2214*b1cdbd2cSJim Jagielski     }
2215*b1cdbd2cSJim Jagielski }
2216*b1cdbd2cSJim Jagielski 
SwEscherEx(SvStream * pStrm,WW8Export & rWW8Wrt)2217*b1cdbd2cSJim Jagielski SwEscherEx::SwEscherEx(SvStream* pStrm, WW8Export& rWW8Wrt)
2218*b1cdbd2cSJim Jagielski     : SwBasicEscherEx(pStrm, rWW8Wrt),
2219*b1cdbd2cSJim Jagielski     pTxtBxs(0)
2220*b1cdbd2cSJim Jagielski {
2221*b1cdbd2cSJim Jagielski     aHostData.SetClientData(&aWinwordAnchoring);
2222*b1cdbd2cSJim Jagielski     OpenContainer( ESCHER_DggContainer );
2223*b1cdbd2cSJim Jagielski 
2224*b1cdbd2cSJim Jagielski     sal_uInt16 nColorCount = 4;
2225*b1cdbd2cSJim Jagielski     *pStrm  << (sal_uInt16)( nColorCount << 4 )     // instance
2226*b1cdbd2cSJim Jagielski             << (sal_uInt16)ESCHER_SplitMenuColors   // record type
2227*b1cdbd2cSJim Jagielski             << (sal_uInt32)( nColorCount * 4 )      // size
2228*b1cdbd2cSJim Jagielski             << (sal_uInt32)0x08000004
2229*b1cdbd2cSJim Jagielski             << (sal_uInt32)0x08000001
2230*b1cdbd2cSJim Jagielski             << (sal_uInt32)0x08000002
2231*b1cdbd2cSJim Jagielski             << (sal_uInt32)0x100000f7;
2232*b1cdbd2cSJim Jagielski 
2233*b1cdbd2cSJim Jagielski     CloseContainer();   // ESCHER_DggContainer
2234*b1cdbd2cSJim Jagielski 
2235*b1cdbd2cSJim Jagielski     sal_uInt8 i = 2;     // for header/footer and the other
2236*b1cdbd2cSJim Jagielski     PlcDrawObj *pSdrObjs = rWrt.pHFSdrObjs;
2237*b1cdbd2cSJim Jagielski     pTxtBxs = rWrt.pHFTxtBxs;
2238*b1cdbd2cSJim Jagielski 
2239*b1cdbd2cSJim Jagielski     // if no header/footer -> skip over
2240*b1cdbd2cSJim Jagielski     if (!pSdrObjs->size())
2241*b1cdbd2cSJim Jagielski     {
2242*b1cdbd2cSJim Jagielski         --i;
2243*b1cdbd2cSJim Jagielski         pSdrObjs = rWrt.pSdrObjs;
2244*b1cdbd2cSJim Jagielski         pTxtBxs = rWrt.pTxtBxs;
2245*b1cdbd2cSJim Jagielski     }
2246*b1cdbd2cSJim Jagielski 
2247*b1cdbd2cSJim Jagielski     for( ; i--; pSdrObjs = rWrt.pSdrObjs, pTxtBxs = rWrt.pTxtBxs )
2248*b1cdbd2cSJim Jagielski     {
2249*b1cdbd2cSJim Jagielski         // "dummy char" (or any Count ?) - why? This knows only M$
2250*b1cdbd2cSJim Jagielski         GetStream() << (sal_Char)i;
2251*b1cdbd2cSJim Jagielski 
2252*b1cdbd2cSJim Jagielski         OpenContainer( ESCHER_DgContainer );
2253*b1cdbd2cSJim Jagielski 
2254*b1cdbd2cSJim Jagielski         EnterGroup( 0 );
2255*b1cdbd2cSJim Jagielski 
2256*b1cdbd2cSJim Jagielski         sal_uLong nSecondShapeId = pSdrObjs == rWrt.pSdrObjs ? GenerateShapeId() : 0;
2257*b1cdbd2cSJim Jagielski 
2258*b1cdbd2cSJim Jagielski         // write now all Writer-/DrawObjects
2259*b1cdbd2cSJim Jagielski         DrawObjPointerVector aSorted;
2260*b1cdbd2cSJim Jagielski         MakeZOrderArrAndFollowIds(pSdrObjs->GetObjArr(), aSorted);
2261*b1cdbd2cSJim Jagielski 
2262*b1cdbd2cSJim Jagielski         sal_uInt32 nShapeId=0;
2263*b1cdbd2cSJim Jagielski         DrawObjPointerIter aEnd = aSorted.end();
2264*b1cdbd2cSJim Jagielski         for (DrawObjPointerIter aIter = aSorted.begin(); aIter != aEnd; ++aIter)
2265*b1cdbd2cSJim Jagielski         {
2266*b1cdbd2cSJim Jagielski             sal_Int32 nBorderThick=0;
2267*b1cdbd2cSJim Jagielski             DrawObj *pObj = (*aIter);
2268*b1cdbd2cSJim Jagielski             ASSERT(pObj, "impossible");
2269*b1cdbd2cSJim Jagielski             if (!pObj)
2270*b1cdbd2cSJim Jagielski                 continue;
2271*b1cdbd2cSJim Jagielski             const sw::Frame &rFrame = pObj->maCntnt;
2272*b1cdbd2cSJim Jagielski             const SwFrmFmt& rFmt = rFrame.GetFrmFmt();
2273*b1cdbd2cSJim Jagielski 
2274*b1cdbd2cSJim Jagielski             switch (rFrame.GetWriterType())
2275*b1cdbd2cSJim Jagielski             {
2276*b1cdbd2cSJim Jagielski                 case sw::Frame::eTxtBox:
2277*b1cdbd2cSJim Jagielski                 case sw::Frame::eOle:
2278*b1cdbd2cSJim Jagielski                 case sw::Frame::eGraphic:
2279*b1cdbd2cSJim Jagielski                     nBorderThick = WriteFlyFrm(*pObj, nShapeId, aSorted);
2280*b1cdbd2cSJim Jagielski                     break;
2281*b1cdbd2cSJim Jagielski                 case sw::Frame::eFormControl:
2282*b1cdbd2cSJim Jagielski                     WriteOCXControl(rFmt, nShapeId = GenerateShapeId());
2283*b1cdbd2cSJim Jagielski                     break;
2284*b1cdbd2cSJim Jagielski                 case sw::Frame::eDrawing: {
2285*b1cdbd2cSJim Jagielski                         aWinwordAnchoring.SetAnchoring(rFmt);
2286*b1cdbd2cSJim Jagielski                         const SdrObject* pSdrObj = rFmt.FindRealSdrObject();
2287*b1cdbd2cSJim Jagielski                         if (pSdrObj)
2288*b1cdbd2cSJim Jagielski                         {
2289*b1cdbd2cSJim Jagielski                             bool bSwapInPage = false;
2290*b1cdbd2cSJim Jagielski                             if (!pSdrObj->GetPage())
2291*b1cdbd2cSJim Jagielski                             {
2292*b1cdbd2cSJim Jagielski                                 if (SdrModel* pModel = rWrt.pDoc->GetDrawModel())
2293*b1cdbd2cSJim Jagielski                                 {
2294*b1cdbd2cSJim Jagielski                                     if (SdrPage *pPage = pModel->GetPage(0))
2295*b1cdbd2cSJim Jagielski                                     {
2296*b1cdbd2cSJim Jagielski                                         bSwapInPage = true;
2297*b1cdbd2cSJim Jagielski                                         (const_cast<SdrObject*>(pSdrObj))->SetPage(pPage);
2298*b1cdbd2cSJim Jagielski                                     }
2299*b1cdbd2cSJim Jagielski                                 }
2300*b1cdbd2cSJim Jagielski                             }
2301*b1cdbd2cSJim Jagielski 
2302*b1cdbd2cSJim Jagielski                             nShapeId = AddSdrObject(*pSdrObj);
2303*b1cdbd2cSJim Jagielski 
2304*b1cdbd2cSJim Jagielski                             if (bSwapInPage)
2305*b1cdbd2cSJim Jagielski                                 (const_cast<SdrObject*>(pSdrObj))->SetPage(0);
2306*b1cdbd2cSJim Jagielski                         }
2307*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
2308*b1cdbd2cSJim Jagielski                         else
2309*b1cdbd2cSJim Jagielski                             ASSERT( !this, "Where is the SDR-Object?" );
2310*b1cdbd2cSJim Jagielski #endif
2311*b1cdbd2cSJim Jagielski                     }
2312*b1cdbd2cSJim Jagielski                     break;
2313*b1cdbd2cSJim Jagielski                 default:
2314*b1cdbd2cSJim Jagielski                     break;
2315*b1cdbd2cSJim Jagielski             }
2316*b1cdbd2cSJim Jagielski 
2317*b1cdbd2cSJim Jagielski             if( !nShapeId )
2318*b1cdbd2cSJim Jagielski             {
2319*b1cdbd2cSJim Jagielski                 nShapeId = AddDummyShape();
2320*b1cdbd2cSJim Jagielski             }
2321*b1cdbd2cSJim Jagielski 
2322*b1cdbd2cSJim Jagielski             pObj->SetShapeDetails(nShapeId, nBorderThick);
2323*b1cdbd2cSJim Jagielski         }
2324*b1cdbd2cSJim Jagielski 
2325*b1cdbd2cSJim Jagielski         EndSdrObjectPage();         // ???? Bugfix for 74724
2326*b1cdbd2cSJim Jagielski 
2327*b1cdbd2cSJim Jagielski         if( nSecondShapeId )
2328*b1cdbd2cSJim Jagielski         {
2329*b1cdbd2cSJim Jagielski             OpenContainer( ESCHER_SpContainer );
2330*b1cdbd2cSJim Jagielski 
2331*b1cdbd2cSJim Jagielski             AddShape( ESCHER_ShpInst_Rectangle, 0xe00, nSecondShapeId );
2332*b1cdbd2cSJim Jagielski 
2333*b1cdbd2cSJim Jagielski             EscherPropertyContainer aPropOpt;
2334*b1cdbd2cSJim Jagielski             const SwFrmFmt &rFmt = const_cast<const SwDoc *>(rWrt.pDoc)->GetPageDesc(0).GetMaster();
2335*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem = 0;
2336*b1cdbd2cSJim Jagielski             SfxItemState eState = rFmt.GetItemState(RES_BACKGROUND, true,
2337*b1cdbd2cSJim Jagielski                 &pItem);
2338*b1cdbd2cSJim Jagielski             if (SFX_ITEM_SET == eState && pItem)
2339*b1cdbd2cSJim Jagielski             {
2340*b1cdbd2cSJim Jagielski                 const SvxBrushItem* pBrush = (const SvxBrushItem*)pItem;
2341*b1cdbd2cSJim Jagielski                 WriteBrushAttr(*pBrush, aPropOpt);
2342*b1cdbd2cSJim Jagielski 
2343*b1cdbd2cSJim Jagielski                 SvxGraphicPosition ePos = pBrush->GetGraphicPos();
2344*b1cdbd2cSJim Jagielski 				if( ePos != GPOS_NONE && ePos != GPOS_AREA )
2345*b1cdbd2cSJim Jagielski 				{
2346*b1cdbd2cSJim Jagielski 					/* #i56806# 0x033F parameter specifies a 32-bit field of shape boolean properties.
2347*b1cdbd2cSJim Jagielski 					0x10001 means fBackground and fUsefBackground flag are true thus background
2348*b1cdbd2cSJim Jagielski 					picture will be shown as "tiled" fill.*/
2349*b1cdbd2cSJim Jagielski 					aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 );
2350*b1cdbd2cSJim Jagielski 				}
2351*b1cdbd2cSJim Jagielski 			}
2352*b1cdbd2cSJim Jagielski             aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
2353*b1cdbd2cSJim Jagielski             aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x00080008 );
2354*b1cdbd2cSJim Jagielski             aPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
2355*b1cdbd2cSJim Jagielski             aPropOpt.AddOpt( ESCHER_Prop_lineWidth, 0 );
2356*b1cdbd2cSJim Jagielski 
2357*b1cdbd2cSJim Jagielski // winword defaults!
2358*b1cdbd2cSJim Jagielski //          aPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100000 );
2359*b1cdbd2cSJim Jagielski //          aPropOpt.AddOpt( ESCHER_Prop_lineWidth, 0 );
2360*b1cdbd2cSJim Jagielski //          aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
2361*b1cdbd2cSJim Jagielski //          aPropOpt.AddOpt( ESCHER_Prop_bWMode, 0x9 );
2362*b1cdbd2cSJim Jagielski //          aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 );
2363*b1cdbd2cSJim Jagielski 
2364*b1cdbd2cSJim Jagielski             aPropOpt.Commit( *pStrm );
2365*b1cdbd2cSJim Jagielski 
2366*b1cdbd2cSJim Jagielski             AddAtom( 4, ESCHER_ClientData );
2367*b1cdbd2cSJim Jagielski             GetStream() << 1L;
2368*b1cdbd2cSJim Jagielski 
2369*b1cdbd2cSJim Jagielski             CloseContainer();   // ESCHER_SpContainer
2370*b1cdbd2cSJim Jagielski         }
2371*b1cdbd2cSJim Jagielski     CloseContainer();   // ESCHER_DgContainer
2372*b1cdbd2cSJim Jagielski     }
2373*b1cdbd2cSJim Jagielski }
2374*b1cdbd2cSJim Jagielski 
~SwEscherEx()2375*b1cdbd2cSJim Jagielski SwEscherEx::~SwEscherEx()
2376*b1cdbd2cSJim Jagielski {
2377*b1cdbd2cSJim Jagielski }
2378*b1cdbd2cSJim Jagielski 
FinishEscher()2379*b1cdbd2cSJim Jagielski void SwEscherEx::FinishEscher()
2380*b1cdbd2cSJim Jagielski {
2381*b1cdbd2cSJim Jagielski     pEscherStrm->Seek(0);
2382*b1cdbd2cSJim Jagielski     *rWrt.pTableStrm << *pEscherStrm;
2383*b1cdbd2cSJim Jagielski     delete pEscherStrm, pEscherStrm = 0;
2384*b1cdbd2cSJim Jagielski }
2385*b1cdbd2cSJim Jagielski 
2386*b1cdbd2cSJim Jagielski /** method to perform conversion of positioning attributes with the help
2387*b1cdbd2cSJim Jagielski     of corresponding layout information
2388*b1cdbd2cSJim Jagielski 
2389*b1cdbd2cSJim Jagielski     OD 2005-01-06 #i30669#
2390*b1cdbd2cSJim Jagielski     Because most of the Writer object positions doesn't correspond to the
2391*b1cdbd2cSJim Jagielski     object positions in WW8, this method converts the positioning
2392*b1cdbd2cSJim Jagielski     attributes. For this conversion the corresponding layout information
2393*b1cdbd2cSJim Jagielski     is needed. If no layout information exists - e.g. no layout exists - no
2394*b1cdbd2cSJim Jagielski     conversion is performed.
2395*b1cdbd2cSJim Jagielski     No conversion is performed for as-character anchored objects. Whose
2396*b1cdbd2cSJim Jagielski     object positions are already treated special in method <WriteData(..)>.
2397*b1cdbd2cSJim Jagielski 
2398*b1cdbd2cSJim Jagielski     @author OD
2399*b1cdbd2cSJim Jagielski 
2400*b1cdbd2cSJim Jagielski     @param _iorHoriOri
2401*b1cdbd2cSJim Jagielski     input/output parameter - containing the current horizontal position
2402*b1cdbd2cSJim Jagielski     attributes, which are converted by this method.
2403*b1cdbd2cSJim Jagielski 
2404*b1cdbd2cSJim Jagielski     @param _iorVertOri
2405*b1cdbd2cSJim Jagielski     input/output parameter - containing the current vertical position
2406*b1cdbd2cSJim Jagielski     attributes, which are converted by this method.
2407*b1cdbd2cSJim Jagielski 
2408*b1cdbd2cSJim Jagielski     @param _rFrmFmt
2409*b1cdbd2cSJim Jagielski     input parameter - frame format of the anchored object
2410*b1cdbd2cSJim Jagielski 
2411*b1cdbd2cSJim Jagielski     @return boolean, indicating, if a conversion has been performed.
2412*b1cdbd2cSJim Jagielski */
ConvertPosition(SwFmtHoriOrient & _iorHoriOri,SwFmtVertOrient & _iorVertOri,const SwFrmFmt & _rFrmFmt)2413*b1cdbd2cSJim Jagielski bool WinwordAnchoring::ConvertPosition( SwFmtHoriOrient& _iorHoriOri,
2414*b1cdbd2cSJim Jagielski                                          SwFmtVertOrient& _iorVertOri,
2415*b1cdbd2cSJim Jagielski                                          const SwFrmFmt& _rFrmFmt )
2416*b1cdbd2cSJim Jagielski {
2417*b1cdbd2cSJim Jagielski     const RndStdIds eAnchor = _rFrmFmt.GetAnchor().GetAnchorId();
2418*b1cdbd2cSJim Jagielski 
2419*b1cdbd2cSJim Jagielski     if ( (FLY_AS_CHAR == eAnchor) || (FLY_AT_FLY == eAnchor) )
2420*b1cdbd2cSJim Jagielski     {
2421*b1cdbd2cSJim Jagielski         // no conversion for as-character or at frame anchored objects
2422*b1cdbd2cSJim Jagielski         return false;
2423*b1cdbd2cSJim Jagielski     }
2424*b1cdbd2cSJim Jagielski 
2425*b1cdbd2cSJim Jagielski     // determine anchored object
2426*b1cdbd2cSJim Jagielski     SwAnchoredObject* pAnchoredObj( 0L );
2427*b1cdbd2cSJim Jagielski     {
2428*b1cdbd2cSJim Jagielski         const SwContact* pContact = _rFrmFmt.FindContactObj();
2429*b1cdbd2cSJim Jagielski         if ( pContact )
2430*b1cdbd2cSJim Jagielski         {
2431*b1cdbd2cSJim Jagielski             std::list<SwAnchoredObject*> aAnchoredObjs;
2432*b1cdbd2cSJim Jagielski             pContact->GetAnchoredObjs( aAnchoredObjs );
2433*b1cdbd2cSJim Jagielski             if ( !aAnchoredObjs.empty() )
2434*b1cdbd2cSJim Jagielski             {
2435*b1cdbd2cSJim Jagielski                 pAnchoredObj = aAnchoredObjs.front();
2436*b1cdbd2cSJim Jagielski             }
2437*b1cdbd2cSJim Jagielski         }
2438*b1cdbd2cSJim Jagielski     }
2439*b1cdbd2cSJim Jagielski     if ( !pAnchoredObj )
2440*b1cdbd2cSJim Jagielski     {
2441*b1cdbd2cSJim Jagielski         // no anchored object found. Thus, the needed layout information can't
2442*b1cdbd2cSJim Jagielski         // be determined. --> no conversion
2443*b1cdbd2cSJim Jagielski         return false;
2444*b1cdbd2cSJim Jagielski     }
2445*b1cdbd2cSJim Jagielski     // --> OD 2006-09-26 #141404#
2446*b1cdbd2cSJim Jagielski     // no conversion for anchored drawing object, which aren't attached to an
2447*b1cdbd2cSJim Jagielski     // anchor frame.
2448*b1cdbd2cSJim Jagielski     // This is the case for drawing objects, which are anchored inside a page
2449*b1cdbd2cSJim Jagielski     // header/footer of an *unused* page style.
2450*b1cdbd2cSJim Jagielski     if ( dynamic_cast<SwAnchoredDrawObject*>(pAnchoredObj) &&
2451*b1cdbd2cSJim Jagielski          !pAnchoredObj->GetAnchorFrm() )
2452*b1cdbd2cSJim Jagielski     {
2453*b1cdbd2cSJim Jagielski         return false;
2454*b1cdbd2cSJim Jagielski     }
2455*b1cdbd2cSJim Jagielski     // <--
2456*b1cdbd2cSJim Jagielski 
2457*b1cdbd2cSJim Jagielski     bool bConverted( false );
2458*b1cdbd2cSJim Jagielski 
2459*b1cdbd2cSJim Jagielski     // determine value of attribute 'Follow text flow', because positions aligned
2460*b1cdbd2cSJim Jagielski     // at page areas have to be converted, if it's set.
2461*b1cdbd2cSJim Jagielski     const bool bFollowTextFlow = _rFrmFmt.GetFollowTextFlow().GetValue();
2462*b1cdbd2cSJim Jagielski 
2463*b1cdbd2cSJim Jagielski     // --> OD 2007-07-24 #148096#
2464*b1cdbd2cSJim Jagielski     // check, if horizontal and vertical position have to be converted due to
2465*b1cdbd2cSJim Jagielski     // the fact, that the object is anchored at a paragraph, which has a "column
2466*b1cdbd2cSJim Jagielski     // break before" attribute
2467*b1cdbd2cSJim Jagielski     bool bConvDueToAnchoredAtColBreakPara( false );
2468*b1cdbd2cSJim Jagielski     if ( ( (eAnchor == FLY_AT_PARA) || (eAnchor == FLY_AT_CHAR) ) &&
2469*b1cdbd2cSJim Jagielski          _rFrmFmt.GetAnchor().GetCntntAnchor() &&
2470*b1cdbd2cSJim Jagielski          _rFrmFmt.GetAnchor().GetCntntAnchor()->nNode.GetNode().IsTxtNode() )
2471*b1cdbd2cSJim Jagielski     {
2472*b1cdbd2cSJim Jagielski         SwTxtNode& rAnchorTxtNode =
2473*b1cdbd2cSJim Jagielski             dynamic_cast<SwTxtNode&>(_rFrmFmt.GetAnchor().GetCntntAnchor()->nNode.GetNode());
2474*b1cdbd2cSJim Jagielski         const SvxFmtBreakItem* pBreak = &(ItemGet<SvxFmtBreakItem>(rAnchorTxtNode, RES_BREAK));
2475*b1cdbd2cSJim Jagielski         if ( pBreak &&
2476*b1cdbd2cSJim Jagielski              pBreak->GetBreak() == SVX_BREAK_COLUMN_BEFORE )
2477*b1cdbd2cSJim Jagielski         {
2478*b1cdbd2cSJim Jagielski             bConvDueToAnchoredAtColBreakPara = true;
2479*b1cdbd2cSJim Jagielski         }
2480*b1cdbd2cSJim Jagielski     }
2481*b1cdbd2cSJim Jagielski     // <--
2482*b1cdbd2cSJim Jagielski 
2483*b1cdbd2cSJim Jagielski     // convert horizontal position, if needed
2484*b1cdbd2cSJim Jagielski     {
2485*b1cdbd2cSJim Jagielski         enum HoriConv { NO_CONV, CONV2PG, CONV2COL, CONV2CHAR };
2486*b1cdbd2cSJim Jagielski         HoriConv eHoriConv( NO_CONV );
2487*b1cdbd2cSJim Jagielski 
2488*b1cdbd2cSJim Jagielski         // determine, if conversion has to be performed due to the position orientation
2489*b1cdbd2cSJim Jagielski         bool bConvDueToOrientation( false );
2490*b1cdbd2cSJim Jagielski         {
2491*b1cdbd2cSJim Jagielski             const sal_Int16 eHOri = _iorHoriOri.GetHoriOrient();
2492*b1cdbd2cSJim Jagielski             bConvDueToOrientation = eHOri == text::HoriOrientation::LEFT || eHOri == text::HoriOrientation::RIGHT ||
2493*b1cdbd2cSJim Jagielski                                     eHOri == text::HoriOrientation::INSIDE || eHOri == text::HoriOrientation::OUTSIDE ||
2494*b1cdbd2cSJim Jagielski                                     ( eHOri != text::HoriOrientation::CENTER && _iorHoriOri.IsPosToggle() );
2495*b1cdbd2cSJim Jagielski         }
2496*b1cdbd2cSJim Jagielski 
2497*b1cdbd2cSJim Jagielski         // determine conversion type due to the position relation
2498*b1cdbd2cSJim Jagielski         // --> OD 2007-07-24 #148096#
2499*b1cdbd2cSJim Jagielski         if ( bConvDueToAnchoredAtColBreakPara )
2500*b1cdbd2cSJim Jagielski         {
2501*b1cdbd2cSJim Jagielski             eHoriConv = CONV2PG;
2502*b1cdbd2cSJim Jagielski         }
2503*b1cdbd2cSJim Jagielski 		else if ( _iorHoriOri.IsPosToggle()
2504*b1cdbd2cSJim Jagielski 				&& _iorHoriOri.GetHoriOrient() == text::HoriOrientation::RIGHT )
2505*b1cdbd2cSJim Jagielski 		{
2506*b1cdbd2cSJim Jagielski 			eHoriConv = NO_CONV;
2507*b1cdbd2cSJim Jagielski 			_iorHoriOri.SetHoriOrient( text::HoriOrientation::OUTSIDE );
2508*b1cdbd2cSJim Jagielski 		}
2509*b1cdbd2cSJim Jagielski         else
2510*b1cdbd2cSJim Jagielski         {
2511*b1cdbd2cSJim Jagielski             switch ( _iorHoriOri.GetRelationOrient() )
2512*b1cdbd2cSJim Jagielski             {
2513*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_FRAME:
2514*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_PRINT_AREA:
2515*b1cdbd2cSJim Jagielski                 {
2516*b1cdbd2cSJim Jagielski                     if ( bConvDueToOrientation || bFollowTextFlow )
2517*b1cdbd2cSJim Jagielski                         eHoriConv = CONV2PG;
2518*b1cdbd2cSJim Jagielski                 }
2519*b1cdbd2cSJim Jagielski                 break;
2520*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_LEFT:
2521*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_RIGHT:
2522*b1cdbd2cSJim Jagielski                 {
2523*b1cdbd2cSJim Jagielski                     // relation not supported by WW8. Thus, conversion always needed.
2524*b1cdbd2cSJim Jagielski                     eHoriConv = CONV2PG;
2525*b1cdbd2cSJim Jagielski                 }
2526*b1cdbd2cSJim Jagielski                 break;
2527*b1cdbd2cSJim Jagielski                 case text::RelOrientation::FRAME:
2528*b1cdbd2cSJim Jagielski                 {
2529*b1cdbd2cSJim Jagielski                     if ( bConvDueToOrientation )
2530*b1cdbd2cSJim Jagielski                         eHoriConv = CONV2COL;
2531*b1cdbd2cSJim Jagielski                 }
2532*b1cdbd2cSJim Jagielski                 break;
2533*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PRINT_AREA:
2534*b1cdbd2cSJim Jagielski                 case text::RelOrientation::FRAME_LEFT:
2535*b1cdbd2cSJim Jagielski                 case text::RelOrientation::FRAME_RIGHT:
2536*b1cdbd2cSJim Jagielski                 {
2537*b1cdbd2cSJim Jagielski                     // relation not supported by WW8. Thus, conversion always needed.
2538*b1cdbd2cSJim Jagielski                     eHoriConv = CONV2COL;
2539*b1cdbd2cSJim Jagielski                 }
2540*b1cdbd2cSJim Jagielski                 break;
2541*b1cdbd2cSJim Jagielski                 case text::RelOrientation::CHAR:
2542*b1cdbd2cSJim Jagielski                 {
2543*b1cdbd2cSJim Jagielski                     if ( bConvDueToOrientation )
2544*b1cdbd2cSJim Jagielski                         eHoriConv = CONV2CHAR;
2545*b1cdbd2cSJim Jagielski                 }
2546*b1cdbd2cSJim Jagielski                 break;
2547*b1cdbd2cSJim Jagielski                 default:
2548*b1cdbd2cSJim Jagielski                     ASSERT( false,
2549*b1cdbd2cSJim Jagielski                             "<WinwordAnchoring::ConvertPosition(..)> - unknown horizontal relation" );
2550*b1cdbd2cSJim Jagielski             }
2551*b1cdbd2cSJim Jagielski         }
2552*b1cdbd2cSJim Jagielski         // <--
2553*b1cdbd2cSJim Jagielski         if ( eHoriConv != NO_CONV )
2554*b1cdbd2cSJim Jagielski         {
2555*b1cdbd2cSJim Jagielski             _iorHoriOri.SetHoriOrient( text::HoriOrientation::NONE );
2556*b1cdbd2cSJim Jagielski             SwTwips nPosX( 0L );
2557*b1cdbd2cSJim Jagielski             {
2558*b1cdbd2cSJim Jagielski                 Point aPos;
2559*b1cdbd2cSJim Jagielski                 if ( eHoriConv == CONV2PG )
2560*b1cdbd2cSJim Jagielski                 {
2561*b1cdbd2cSJim Jagielski                     _iorHoriOri.SetRelationOrient( text::RelOrientation::PAGE_FRAME );
2562*b1cdbd2cSJim Jagielski                     // --> OD 2005-01-27 #i33818#
2563*b1cdbd2cSJim Jagielski                     bool bRelToTableCell( false );
2564*b1cdbd2cSJim Jagielski                     aPos = pAnchoredObj->GetRelPosToPageFrm( bFollowTextFlow,
2565*b1cdbd2cSJim Jagielski                                                              bRelToTableCell );
2566*b1cdbd2cSJim Jagielski                     if ( bRelToTableCell )
2567*b1cdbd2cSJim Jagielski                     {
2568*b1cdbd2cSJim Jagielski                         _iorHoriOri.SetRelationOrient( text::RelOrientation::PAGE_PRINT_AREA );
2569*b1cdbd2cSJim Jagielski                     }
2570*b1cdbd2cSJim Jagielski                     // <--
2571*b1cdbd2cSJim Jagielski                 }
2572*b1cdbd2cSJim Jagielski                 else if ( eHoriConv == CONV2COL )
2573*b1cdbd2cSJim Jagielski                 {
2574*b1cdbd2cSJim Jagielski                     _iorHoriOri.SetRelationOrient( text::RelOrientation::FRAME );
2575*b1cdbd2cSJim Jagielski                     aPos = pAnchoredObj->GetRelPosToAnchorFrm();
2576*b1cdbd2cSJim Jagielski                 }
2577*b1cdbd2cSJim Jagielski                 else if ( eHoriConv == CONV2CHAR )
2578*b1cdbd2cSJim Jagielski                 {
2579*b1cdbd2cSJim Jagielski                     _iorHoriOri.SetRelationOrient( text::RelOrientation::CHAR );
2580*b1cdbd2cSJim Jagielski                     aPos = pAnchoredObj->GetRelPosToChar();
2581*b1cdbd2cSJim Jagielski                 }
2582*b1cdbd2cSJim Jagielski                 // No distinction between layout directions, because of missing
2583*b1cdbd2cSJim Jagielski                 // information about WW8 in vertical layout.
2584*b1cdbd2cSJim Jagielski                 nPosX = aPos.X();
2585*b1cdbd2cSJim Jagielski             }
2586*b1cdbd2cSJim Jagielski             _iorHoriOri.SetPos( nPosX );
2587*b1cdbd2cSJim Jagielski             bConverted = true;
2588*b1cdbd2cSJim Jagielski         }
2589*b1cdbd2cSJim Jagielski     }
2590*b1cdbd2cSJim Jagielski 
2591*b1cdbd2cSJim Jagielski     // convert vertical position, if needed
2592*b1cdbd2cSJim Jagielski     {
2593*b1cdbd2cSJim Jagielski         enum VertConv { NO_CONV, CONV2PG, CONV2PARA, CONV2LINE };
2594*b1cdbd2cSJim Jagielski         VertConv eVertConv( NO_CONV );
2595*b1cdbd2cSJim Jagielski 
2596*b1cdbd2cSJim Jagielski         // determine, if conversion has to be performed due to the position orientation
2597*b1cdbd2cSJim Jagielski         bool bConvDueToOrientation( false );
2598*b1cdbd2cSJim Jagielski         {
2599*b1cdbd2cSJim Jagielski             const sal_Int16 eVOri = _iorVertOri.GetVertOrient();
2600*b1cdbd2cSJim Jagielski             bConvDueToOrientation = ( eVOri == text::VertOrientation::TOP ||
2601*b1cdbd2cSJim Jagielski                                       eVOri == text::VertOrientation::BOTTOM ||
2602*b1cdbd2cSJim Jagielski                                       eVOri == text::VertOrientation::CHAR_TOP ||
2603*b1cdbd2cSJim Jagielski                                       eVOri == text::VertOrientation::CHAR_BOTTOM ||
2604*b1cdbd2cSJim Jagielski                                       eVOri == text::VertOrientation::CHAR_CENTER ||
2605*b1cdbd2cSJim Jagielski                                       eVOri == text::VertOrientation::LINE_TOP ||
2606*b1cdbd2cSJim Jagielski                                       eVOri == text::VertOrientation::LINE_BOTTOM ||
2607*b1cdbd2cSJim Jagielski                                       eVOri == text::VertOrientation::LINE_CENTER );
2608*b1cdbd2cSJim Jagielski         }
2609*b1cdbd2cSJim Jagielski 
2610*b1cdbd2cSJim Jagielski         // determine conversion type due to the position relation
2611*b1cdbd2cSJim Jagielski         // --> OD 2007-07-24 #148096#
2612*b1cdbd2cSJim Jagielski         if ( bConvDueToAnchoredAtColBreakPara )
2613*b1cdbd2cSJim Jagielski         {
2614*b1cdbd2cSJim Jagielski             eVertConv = CONV2PG;
2615*b1cdbd2cSJim Jagielski         }
2616*b1cdbd2cSJim Jagielski         else
2617*b1cdbd2cSJim Jagielski         {
2618*b1cdbd2cSJim Jagielski             switch ( _iorVertOri.GetRelationOrient() )
2619*b1cdbd2cSJim Jagielski             {
2620*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_FRAME:
2621*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_PRINT_AREA:
2622*b1cdbd2cSJim Jagielski                 {
2623*b1cdbd2cSJim Jagielski                     if ( bConvDueToOrientation || bFollowTextFlow )
2624*b1cdbd2cSJim Jagielski                         eVertConv = CONV2PG;
2625*b1cdbd2cSJim Jagielski                 }
2626*b1cdbd2cSJim Jagielski                 break;
2627*b1cdbd2cSJim Jagielski                 case text::RelOrientation::FRAME:
2628*b1cdbd2cSJim Jagielski                 {
2629*b1cdbd2cSJim Jagielski                     if ( bConvDueToOrientation ||
2630*b1cdbd2cSJim Jagielski                          _iorVertOri.GetVertOrient() == text::VertOrientation::CENTER )
2631*b1cdbd2cSJim Jagielski                     {
2632*b1cdbd2cSJim Jagielski                         eVertConv = CONV2PARA;
2633*b1cdbd2cSJim Jagielski                     }
2634*b1cdbd2cSJim Jagielski                 }
2635*b1cdbd2cSJim Jagielski                 break;
2636*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PRINT_AREA:
2637*b1cdbd2cSJim Jagielski                 {
2638*b1cdbd2cSJim Jagielski                     // relation not supported by WW8. Thus, conversion always needed.
2639*b1cdbd2cSJim Jagielski                     eVertConv = CONV2PARA;
2640*b1cdbd2cSJim Jagielski                 }
2641*b1cdbd2cSJim Jagielski                 break;
2642*b1cdbd2cSJim Jagielski                 case text::RelOrientation::CHAR:
2643*b1cdbd2cSJim Jagielski                 {
2644*b1cdbd2cSJim Jagielski                     // relation not supported by WW8. Thus, conversion always needed.
2645*b1cdbd2cSJim Jagielski                     eVertConv = CONV2PARA;
2646*b1cdbd2cSJim Jagielski                 }
2647*b1cdbd2cSJim Jagielski                 break;
2648*b1cdbd2cSJim Jagielski                 case text::RelOrientation::TEXT_LINE:
2649*b1cdbd2cSJim Jagielski                 {
2650*b1cdbd2cSJim Jagielski                     if ( bConvDueToOrientation ||
2651*b1cdbd2cSJim Jagielski                          _iorVertOri.GetVertOrient() == text::VertOrientation::NONE )
2652*b1cdbd2cSJim Jagielski                     {
2653*b1cdbd2cSJim Jagielski                         eVertConv = CONV2LINE;
2654*b1cdbd2cSJim Jagielski                     }
2655*b1cdbd2cSJim Jagielski                 }
2656*b1cdbd2cSJim Jagielski                 break;
2657*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_LEFT:
2658*b1cdbd2cSJim Jagielski                 case text::RelOrientation::PAGE_RIGHT:
2659*b1cdbd2cSJim Jagielski                 case text::RelOrientation::FRAME_LEFT:
2660*b1cdbd2cSJim Jagielski                 case text::RelOrientation::FRAME_RIGHT:
2661*b1cdbd2cSJim Jagielski                 default:
2662*b1cdbd2cSJim Jagielski                     ASSERT( false,
2663*b1cdbd2cSJim Jagielski                             "<WinwordAnchoring::ConvertPosition(..)> - unknown vertical relation" );
2664*b1cdbd2cSJim Jagielski             }
2665*b1cdbd2cSJim Jagielski         }
2666*b1cdbd2cSJim Jagielski         // <--
2667*b1cdbd2cSJim Jagielski         if ( eVertConv != NO_CONV )
2668*b1cdbd2cSJim Jagielski         {
2669*b1cdbd2cSJim Jagielski             _iorVertOri.SetVertOrient( text::VertOrientation::NONE );
2670*b1cdbd2cSJim Jagielski             SwTwips nPosY( 0L );
2671*b1cdbd2cSJim Jagielski             {
2672*b1cdbd2cSJim Jagielski                 Point aPos;
2673*b1cdbd2cSJim Jagielski                 if ( eVertConv == CONV2PG )
2674*b1cdbd2cSJim Jagielski                 {
2675*b1cdbd2cSJim Jagielski                     _iorVertOri.SetRelationOrient( text::RelOrientation::PAGE_FRAME );
2676*b1cdbd2cSJim Jagielski                     // --> OD 2005-01-27 #i33818#
2677*b1cdbd2cSJim Jagielski                     bool bRelToTableCell( false );
2678*b1cdbd2cSJim Jagielski                     aPos = pAnchoredObj->GetRelPosToPageFrm( bFollowTextFlow,
2679*b1cdbd2cSJim Jagielski                                                              bRelToTableCell );
2680*b1cdbd2cSJim Jagielski                     if ( bRelToTableCell )
2681*b1cdbd2cSJim Jagielski                     {
2682*b1cdbd2cSJim Jagielski                         _iorVertOri.SetRelationOrient( text::RelOrientation::PAGE_PRINT_AREA );
2683*b1cdbd2cSJim Jagielski                     }
2684*b1cdbd2cSJim Jagielski                     // <--
2685*b1cdbd2cSJim Jagielski                 }
2686*b1cdbd2cSJim Jagielski                 else if ( eVertConv == CONV2PARA )
2687*b1cdbd2cSJim Jagielski                 {
2688*b1cdbd2cSJim Jagielski                     _iorVertOri.SetRelationOrient( text::RelOrientation::FRAME );
2689*b1cdbd2cSJim Jagielski                     aPos = pAnchoredObj->GetRelPosToAnchorFrm();
2690*b1cdbd2cSJim Jagielski                 }
2691*b1cdbd2cSJim Jagielski                 else if ( eVertConv == CONV2LINE )
2692*b1cdbd2cSJim Jagielski                 {
2693*b1cdbd2cSJim Jagielski                     _iorVertOri.SetRelationOrient( text::RelOrientation::TEXT_LINE );
2694*b1cdbd2cSJim Jagielski                     aPos = pAnchoredObj->GetRelPosToLine();
2695*b1cdbd2cSJim Jagielski                 }
2696*b1cdbd2cSJim Jagielski                 // No distinction between layout directions, because of missing
2697*b1cdbd2cSJim Jagielski                 // information about WW8 in vertical layout.
2698*b1cdbd2cSJim Jagielski                 nPosY = aPos.Y();
2699*b1cdbd2cSJim Jagielski             }
2700*b1cdbd2cSJim Jagielski             _iorVertOri.SetPos( nPosY );
2701*b1cdbd2cSJim Jagielski             bConverted = true;
2702*b1cdbd2cSJim Jagielski         }
2703*b1cdbd2cSJim Jagielski     }
2704*b1cdbd2cSJim Jagielski 
2705*b1cdbd2cSJim Jagielski     return bConverted;
2706*b1cdbd2cSJim Jagielski }
2707*b1cdbd2cSJim Jagielski 
SetAnchoring(const SwFrmFmt & rFmt)2708*b1cdbd2cSJim Jagielski void WinwordAnchoring::SetAnchoring(const SwFrmFmt& rFmt)
2709*b1cdbd2cSJim Jagielski {
2710*b1cdbd2cSJim Jagielski     const RndStdIds eAnchor = rFmt.GetAnchor().GetAnchorId();
2711*b1cdbd2cSJim Jagielski     mbInline = (eAnchor == FLY_AS_CHAR);
2712*b1cdbd2cSJim Jagielski 
2713*b1cdbd2cSJim Jagielski     SwFmtHoriOrient rHoriOri = rFmt.GetHoriOrient();
2714*b1cdbd2cSJim Jagielski     SwFmtVertOrient rVertOri = rFmt.GetVertOrient();
2715*b1cdbd2cSJim Jagielski 
2716*b1cdbd2cSJim Jagielski     // --> OD 2005-01-06 #i30669# - convert the positioning attributes.
2717*b1cdbd2cSJim Jagielski     // Most positions are converted, if layout information exists.
2718*b1cdbd2cSJim Jagielski     const bool bPosConverted = ConvertPosition( rHoriOri, rVertOri, rFmt );
2719*b1cdbd2cSJim Jagielski     // <--
2720*b1cdbd2cSJim Jagielski 
2721*b1cdbd2cSJim Jagielski     const sal_Int16 eHOri = rHoriOri.GetHoriOrient();
2722*b1cdbd2cSJim Jagielski     // CMC, OD 24.11.2003 #i22673#
2723*b1cdbd2cSJim Jagielski     const sal_Int16 eVOri = rVertOri.GetVertOrient();
2724*b1cdbd2cSJim Jagielski 
2725*b1cdbd2cSJim Jagielski     const sal_Int16 eHRel = rHoriOri.GetRelationOrient();
2726*b1cdbd2cSJim Jagielski     const sal_Int16 eVRel = rVertOri.GetRelationOrient();
2727*b1cdbd2cSJim Jagielski 
2728*b1cdbd2cSJim Jagielski     // horizontal Adjustment
2729*b1cdbd2cSJim Jagielski     switch (eHOri)
2730*b1cdbd2cSJim Jagielski     {
2731*b1cdbd2cSJim Jagielski         default:
2732*b1cdbd2cSJim Jagielski         case text::HoriOrientation::NONE:
2733*b1cdbd2cSJim Jagielski             mnXAlign = 0;
2734*b1cdbd2cSJim Jagielski             break;
2735*b1cdbd2cSJim Jagielski         case text::HoriOrientation::LEFT:
2736*b1cdbd2cSJim Jagielski             mnXAlign = 1;
2737*b1cdbd2cSJim Jagielski             break;
2738*b1cdbd2cSJim Jagielski         case text::HoriOrientation::CENTER:
2739*b1cdbd2cSJim Jagielski             mnXAlign = 2;
2740*b1cdbd2cSJim Jagielski             break;
2741*b1cdbd2cSJim Jagielski         case text::HoriOrientation::RIGHT:
2742*b1cdbd2cSJim Jagielski             mnXAlign = 3;
2743*b1cdbd2cSJim Jagielski             break;
2744*b1cdbd2cSJim Jagielski         case text::HoriOrientation::INSIDE:
2745*b1cdbd2cSJim Jagielski             mnXAlign = 4;
2746*b1cdbd2cSJim Jagielski             break;
2747*b1cdbd2cSJim Jagielski         case text::HoriOrientation::OUTSIDE:
2748*b1cdbd2cSJim Jagielski             mnXAlign = 5;
2749*b1cdbd2cSJim Jagielski             break;
2750*b1cdbd2cSJim Jagielski     }
2751*b1cdbd2cSJim Jagielski 
2752*b1cdbd2cSJim Jagielski     // vertical Adjustment
2753*b1cdbd2cSJim Jagielski     // CMC, OD 24.11.2003 #i22673#
2754*b1cdbd2cSJim Jagielski     // When adjustment is vertically relative to line or to char
2755*b1cdbd2cSJim Jagielski     // bottom becomes top and vice versa
2756*b1cdbd2cSJim Jagielski     const bool bVertSwap = !bPosConverted &&
2757*b1cdbd2cSJim Jagielski                            ( (eVRel == text::RelOrientation::CHAR) ||
2758*b1cdbd2cSJim Jagielski                              (eVRel == text::RelOrientation::TEXT_LINE) );
2759*b1cdbd2cSJim Jagielski     switch (eVOri)
2760*b1cdbd2cSJim Jagielski     {
2761*b1cdbd2cSJim Jagielski         default:
2762*b1cdbd2cSJim Jagielski         case text::VertOrientation::NONE:
2763*b1cdbd2cSJim Jagielski             mnYAlign = 0;
2764*b1cdbd2cSJim Jagielski             break;
2765*b1cdbd2cSJim Jagielski         case text::VertOrientation::TOP:
2766*b1cdbd2cSJim Jagielski         case text::VertOrientation::LINE_TOP:
2767*b1cdbd2cSJim Jagielski         case text::VertOrientation::CHAR_TOP:
2768*b1cdbd2cSJim Jagielski             mnYAlign = bVertSwap ? 3 : 1;
2769*b1cdbd2cSJim Jagielski             break;
2770*b1cdbd2cSJim Jagielski         case text::VertOrientation::CENTER:
2771*b1cdbd2cSJim Jagielski         case text::VertOrientation::LINE_CENTER:
2772*b1cdbd2cSJim Jagielski             mnYAlign = 2;
2773*b1cdbd2cSJim Jagielski             break;
2774*b1cdbd2cSJim Jagielski         case text::VertOrientation::BOTTOM:
2775*b1cdbd2cSJim Jagielski         case text::VertOrientation::LINE_BOTTOM:
2776*b1cdbd2cSJim Jagielski         case text::VertOrientation::CHAR_BOTTOM:
2777*b1cdbd2cSJim Jagielski             mnYAlign = bVertSwap ? 1 : 3;
2778*b1cdbd2cSJim Jagielski             break;
2779*b1cdbd2cSJim Jagielski     }
2780*b1cdbd2cSJim Jagielski 
2781*b1cdbd2cSJim Jagielski     // Adjustment is horizontally relative to...
2782*b1cdbd2cSJim Jagielski     switch (eHRel)
2783*b1cdbd2cSJim Jagielski     {
2784*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_PRINT_AREA:
2785*b1cdbd2cSJim Jagielski             mnXRelTo = 0;
2786*b1cdbd2cSJim Jagielski             break;
2787*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_FRAME:
2788*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_LEFT:  //:-(
2789*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_RIGHT: //:-(
2790*b1cdbd2cSJim Jagielski             mnXRelTo = 1;
2791*b1cdbd2cSJim Jagielski             break;
2792*b1cdbd2cSJim Jagielski         case text::RelOrientation::FRAME:
2793*b1cdbd2cSJim Jagielski         case text::RelOrientation::FRAME_LEFT: //:-(
2794*b1cdbd2cSJim Jagielski         case text::RelOrientation::FRAME_RIGHT: //:-(
2795*b1cdbd2cSJim Jagielski             if (eAnchor == FLY_AT_PAGE)
2796*b1cdbd2cSJim Jagielski                 mnXRelTo = 1;
2797*b1cdbd2cSJim Jagielski             else
2798*b1cdbd2cSJim Jagielski                 mnXRelTo = 2;
2799*b1cdbd2cSJim Jagielski             break;
2800*b1cdbd2cSJim Jagielski         case text::RelOrientation::PRINT_AREA:
2801*b1cdbd2cSJim Jagielski             if (eAnchor == FLY_AT_PAGE)
2802*b1cdbd2cSJim Jagielski                 mnXRelTo = 0;
2803*b1cdbd2cSJim Jagielski             else
2804*b1cdbd2cSJim Jagielski                 mnXRelTo = 2;
2805*b1cdbd2cSJim Jagielski             break;
2806*b1cdbd2cSJim Jagielski         case text::RelOrientation::CHAR:
2807*b1cdbd2cSJim Jagielski             mnXRelTo = 3;
2808*b1cdbd2cSJim Jagielski             break;
2809*b1cdbd2cSJim Jagielski         case text::RelOrientation::TEXT_LINE:
2810*b1cdbd2cSJim Jagielski             break;
2811*b1cdbd2cSJim Jagielski     }
2812*b1cdbd2cSJim Jagielski 
2813*b1cdbd2cSJim Jagielski         // Adjustment is vertically relative to...
2814*b1cdbd2cSJim Jagielski     switch (eVRel)
2815*b1cdbd2cSJim Jagielski     {
2816*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_PRINT_AREA:
2817*b1cdbd2cSJim Jagielski             mnYRelTo = 0;
2818*b1cdbd2cSJim Jagielski             break;
2819*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_FRAME:
2820*b1cdbd2cSJim Jagielski             mnYRelTo = 1;
2821*b1cdbd2cSJim Jagielski             break;
2822*b1cdbd2cSJim Jagielski         case text::RelOrientation::PRINT_AREA:
2823*b1cdbd2cSJim Jagielski             if (eAnchor == FLY_AT_PAGE)
2824*b1cdbd2cSJim Jagielski                 mnYRelTo = 0;
2825*b1cdbd2cSJim Jagielski             else
2826*b1cdbd2cSJim Jagielski                 mnYRelTo = 2;
2827*b1cdbd2cSJim Jagielski             break;
2828*b1cdbd2cSJim Jagielski         case text::RelOrientation::FRAME:
2829*b1cdbd2cSJim Jagielski             if (eAnchor == FLY_AT_PAGE)
2830*b1cdbd2cSJim Jagielski                 mnYRelTo = 1;
2831*b1cdbd2cSJim Jagielski             else
2832*b1cdbd2cSJim Jagielski                 mnYRelTo = 2;
2833*b1cdbd2cSJim Jagielski             break;
2834*b1cdbd2cSJim Jagielski         case text::RelOrientation::CHAR:
2835*b1cdbd2cSJim Jagielski         case text::RelOrientation::TEXT_LINE: // CMC, OD 24.11.2003 #i22673# - vertical alignment at top of line
2836*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_LEFT:   //nonsense
2837*b1cdbd2cSJim Jagielski         case text::RelOrientation::PAGE_RIGHT:  //nonsense
2838*b1cdbd2cSJim Jagielski         case text::RelOrientation::FRAME_LEFT:  //nonsense
2839*b1cdbd2cSJim Jagielski         case text::RelOrientation::FRAME_RIGHT: //nonsense
2840*b1cdbd2cSJim Jagielski             mnYRelTo = 3;
2841*b1cdbd2cSJim Jagielski             break;
2842*b1cdbd2cSJim Jagielski     }
2843*b1cdbd2cSJim Jagielski }
2844*b1cdbd2cSJim Jagielski 
WriteFrmExtraData(const SwFrmFmt & rFmt)2845*b1cdbd2cSJim Jagielski void SwEscherEx::WriteFrmExtraData( const SwFrmFmt& rFmt )
2846*b1cdbd2cSJim Jagielski {
2847*b1cdbd2cSJim Jagielski     aWinwordAnchoring.SetAnchoring(rFmt);
2848*b1cdbd2cSJim Jagielski     aWinwordAnchoring.WriteData(*this);
2849*b1cdbd2cSJim Jagielski 
2850*b1cdbd2cSJim Jagielski     AddAtom(4, ESCHER_ClientAnchor);
2851*b1cdbd2cSJim Jagielski     GetStream() << 0L;
2852*b1cdbd2cSJim Jagielski 
2853*b1cdbd2cSJim Jagielski     AddAtom(4, ESCHER_ClientData);
2854*b1cdbd2cSJim Jagielski     GetStream() << 1L;
2855*b1cdbd2cSJim Jagielski }
2856*b1cdbd2cSJim Jagielski 
WriteFlyFrm(const DrawObj & rObj,sal_uInt32 & rShapeId,DrawObjPointerVector & rPVec)2857*b1cdbd2cSJim Jagielski sal_Int32 SwEscherEx::WriteFlyFrm(const DrawObj &rObj, sal_uInt32 &rShapeId,
2858*b1cdbd2cSJim Jagielski     DrawObjPointerVector &rPVec)
2859*b1cdbd2cSJim Jagielski {
2860*b1cdbd2cSJim Jagielski     const SwFrmFmt &rFmt = rObj.maCntnt.GetFrmFmt();
2861*b1cdbd2cSJim Jagielski 
2862*b1cdbd2cSJim Jagielski     // check for textflyframe and if it is the first in a Chain
2863*b1cdbd2cSJim Jagielski     sal_Int32 nBorderThick = 0;
2864*b1cdbd2cSJim Jagielski     const SwNodeIndex* pNdIdx = rFmt.GetCntnt().GetCntntIdx();
2865*b1cdbd2cSJim Jagielski     if( pNdIdx )
2866*b1cdbd2cSJim Jagielski     {
2867*b1cdbd2cSJim Jagielski         SwNodeIndex aIdx( *pNdIdx, 1 );
2868*b1cdbd2cSJim Jagielski         switch( aIdx.GetNode().GetNodeType() )
2869*b1cdbd2cSJim Jagielski         {
2870*b1cdbd2cSJim Jagielski         case ND_GRFNODE:
2871*b1cdbd2cSJim Jagielski             nBorderThick = WriteGrfFlyFrame( rFmt, rShapeId = GenerateShapeId() );
2872*b1cdbd2cSJim Jagielski             break;
2873*b1cdbd2cSJim Jagielski         case ND_OLENODE:
2874*b1cdbd2cSJim Jagielski             nBorderThick = WriteOLEFlyFrame( rFmt, rShapeId = GenerateShapeId() );
2875*b1cdbd2cSJim Jagielski             break;
2876*b1cdbd2cSJim Jagielski         default:
2877*b1cdbd2cSJim Jagielski             if (const SdrObject* pObj = rFmt.FindRealSdrObject())
2878*b1cdbd2cSJim Jagielski             {
2879*b1cdbd2cSJim Jagielski                 // check for the first in a Chain
2880*b1cdbd2cSJim Jagielski                 sal_uInt32 nTxtId;
2881*b1cdbd2cSJim Jagielski                 sal_uInt16 nOff = 0;
2882*b1cdbd2cSJim Jagielski                 const SwFrmFmt* pFmt = &rFmt, *pPrev;
2883*b1cdbd2cSJim Jagielski                 while( 0 != ( pPrev = pFmt->GetChain().GetPrev() ))
2884*b1cdbd2cSJim Jagielski                 {
2885*b1cdbd2cSJim Jagielski                     ++nOff;
2886*b1cdbd2cSJim Jagielski                     pFmt = pPrev;
2887*b1cdbd2cSJim Jagielski                 }
2888*b1cdbd2cSJim Jagielski 
2889*b1cdbd2cSJim Jagielski                 rShapeId = GetFlyShapeId(rFmt, rObj.mnHdFtIndex, rPVec);
2890*b1cdbd2cSJim Jagielski                 if( !nOff )
2891*b1cdbd2cSJim Jagielski                 {
2892*b1cdbd2cSJim Jagielski                     void* p = (void*)pObj;
2893*b1cdbd2cSJim Jagielski                     nTxtId = pTxtBxs->GetPos( p );
2894*b1cdbd2cSJim Jagielski                     if( USHRT_MAX == nTxtId )
2895*b1cdbd2cSJim Jagielski                     {
2896*b1cdbd2cSJim Jagielski                         pTxtBxs->Append( *pObj, rShapeId );
2897*b1cdbd2cSJim Jagielski                         nTxtId = pTxtBxs->Count();
2898*b1cdbd2cSJim Jagielski                     }
2899*b1cdbd2cSJim Jagielski                     else
2900*b1cdbd2cSJim Jagielski                         ++nTxtId;
2901*b1cdbd2cSJim Jagielski                 }
2902*b1cdbd2cSJim Jagielski                 else
2903*b1cdbd2cSJim Jagielski                 {
2904*b1cdbd2cSJim Jagielski                     const SdrObject* pPrevObj = pFmt->FindRealSdrObject();
2905*b1cdbd2cSJim Jagielski                     void* p = (void*)pPrevObj;
2906*b1cdbd2cSJim Jagielski                     nTxtId = pTxtBxs->GetPos( p );
2907*b1cdbd2cSJim Jagielski                     if( USHRT_MAX == nTxtId )
2908*b1cdbd2cSJim Jagielski                     {
2909*b1cdbd2cSJim Jagielski                         sal_uInt32 nPrevShapeId =
2910*b1cdbd2cSJim Jagielski                             GetFlyShapeId(*pFmt, rObj.mnHdFtIndex, rPVec);
2911*b1cdbd2cSJim Jagielski                         pTxtBxs->Append( *pPrevObj, nPrevShapeId );
2912*b1cdbd2cSJim Jagielski                         nTxtId = pTxtBxs->Count();
2913*b1cdbd2cSJim Jagielski                     }
2914*b1cdbd2cSJim Jagielski                     else
2915*b1cdbd2cSJim Jagielski                         ++nTxtId;
2916*b1cdbd2cSJim Jagielski                 }
2917*b1cdbd2cSJim Jagielski                 nTxtId *= 0x10000;
2918*b1cdbd2cSJim Jagielski                 nTxtId += nOff;
2919*b1cdbd2cSJim Jagielski 
2920*b1cdbd2cSJim Jagielski                 nBorderThick = WriteTxtFlyFrame(rObj, rShapeId, nTxtId, rPVec);
2921*b1cdbd2cSJim Jagielski             }
2922*b1cdbd2cSJim Jagielski 
2923*b1cdbd2cSJim Jagielski 			//In browse mode the sdr object doesn't always exist. For example, the
2924*b1cdbd2cSJim Jagielski 			//object is in the hidden header/footer. We save the fmt directly
2925*b1cdbd2cSJim Jagielski 			//in such cases; we copy most of the logic from the block above
2926*b1cdbd2cSJim Jagielski 			const bool bBrowseMode = (rFmt.getIDocumentSettingAccess())->get(IDocumentSettingAccess::BROWSE_MODE);
2927*b1cdbd2cSJim Jagielski 			if( bBrowseMode && rFmt.GetDoc())
2928*b1cdbd2cSJim Jagielski 			{
2929*b1cdbd2cSJim Jagielski 				if( !rFmt.GetChain().GetPrev() )//obj in header/footer?
2930*b1cdbd2cSJim Jagielski 				{
2931*b1cdbd2cSJim Jagielski 					rShapeId = GetFlyShapeId(rFmt, rObj.mnHdFtIndex, rPVec);
2932*b1cdbd2cSJim Jagielski 					pTxtBxs->Append( &rFmt, rShapeId );
2933*b1cdbd2cSJim Jagielski 					sal_uInt32 nTxtId = pTxtBxs->Count();
2934*b1cdbd2cSJim Jagielski 
2935*b1cdbd2cSJim Jagielski 					nTxtId *= 0x10000;
2936*b1cdbd2cSJim Jagielski 					nBorderThick = WriteTxtFlyFrame(rObj, rShapeId, nTxtId, rPVec);
2937*b1cdbd2cSJim Jagielski 				}
2938*b1cdbd2cSJim Jagielski 			}
2939*b1cdbd2cSJim Jagielski 
2940*b1cdbd2cSJim Jagielski         }
2941*b1cdbd2cSJim Jagielski     }
2942*b1cdbd2cSJim Jagielski     return nBorderThick;
2943*b1cdbd2cSJim Jagielski }
2944*b1cdbd2cSJim Jagielski 
FindPos(const SwFrmFmt & rFmt,unsigned int nHdFtIndex,DrawObjPointerVector & rPVec)2945*b1cdbd2cSJim Jagielski sal_uInt16 FindPos(const SwFrmFmt &rFmt, unsigned int nHdFtIndex,
2946*b1cdbd2cSJim Jagielski     DrawObjPointerVector &rPVec)
2947*b1cdbd2cSJim Jagielski {
2948*b1cdbd2cSJim Jagielski     DrawObjPointerIter aEnd = rPVec.end();
2949*b1cdbd2cSJim Jagielski     for (DrawObjPointerIter aIter = rPVec.begin(); aIter != aEnd; ++aIter)
2950*b1cdbd2cSJim Jagielski     {
2951*b1cdbd2cSJim Jagielski         const DrawObj *pObj = (*aIter);
2952*b1cdbd2cSJim Jagielski         ASSERT(pObj, "Impossible");
2953*b1cdbd2cSJim Jagielski         if (!pObj)
2954*b1cdbd2cSJim Jagielski             continue;
2955*b1cdbd2cSJim Jagielski         if (
2956*b1cdbd2cSJim Jagielski              nHdFtIndex == pObj->mnHdFtIndex &&
2957*b1cdbd2cSJim Jagielski              &rFmt == (&pObj->maCntnt.GetFrmFmt())
2958*b1cdbd2cSJim Jagielski            )
2959*b1cdbd2cSJim Jagielski         {
2960*b1cdbd2cSJim Jagielski             return static_cast< sal_uInt16 >(aIter - rPVec.begin());
2961*b1cdbd2cSJim Jagielski         }
2962*b1cdbd2cSJim Jagielski     }
2963*b1cdbd2cSJim Jagielski     return USHRT_MAX;
2964*b1cdbd2cSJim Jagielski }
2965*b1cdbd2cSJim Jagielski 
WriteTxtFlyFrame(const DrawObj & rObj,sal_uInt32 nShapeId,sal_uInt32 nTxtBox,DrawObjPointerVector & rPVec)2966*b1cdbd2cSJim Jagielski sal_Int32 SwEscherEx::WriteTxtFlyFrame(const DrawObj &rObj, sal_uInt32 nShapeId,
2967*b1cdbd2cSJim Jagielski     sal_uInt32 nTxtBox, DrawObjPointerVector &rPVec)
2968*b1cdbd2cSJim Jagielski {
2969*b1cdbd2cSJim Jagielski     const SwFrmFmt &rFmt = rObj.maCntnt.GetFrmFmt();
2970*b1cdbd2cSJim Jagielski     short nDirection = rObj.mnDirection;
2971*b1cdbd2cSJim Jagielski 
2972*b1cdbd2cSJim Jagielski     sal_Int32 nBorderThick=0;
2973*b1cdbd2cSJim Jagielski     OpenContainer( ESCHER_SpContainer );
2974*b1cdbd2cSJim Jagielski 
2975*b1cdbd2cSJim Jagielski     AddShape( ESCHER_ShpInst_TextBox, 0xa00, nShapeId );
2976*b1cdbd2cSJim Jagielski     EscherPropertyContainer aPropOpt;
2977*b1cdbd2cSJim Jagielski     aPropOpt.AddOpt(ESCHER_Prop_lTxid, nTxtBox);
2978*b1cdbd2cSJim Jagielski     if (const SwFrmFmt *pNext = rFmt.GetChain().GetNext())
2979*b1cdbd2cSJim Jagielski     {
2980*b1cdbd2cSJim Jagielski         sal_uInt16 nPos = FindPos(*pNext, rObj.mnHdFtIndex, rPVec);
2981*b1cdbd2cSJim Jagielski         if (USHRT_MAX != nPos && aFollowShpIds[nPos])
2982*b1cdbd2cSJim Jagielski             aPropOpt.AddOpt(ESCHER_Prop_hspNext, aFollowShpIds[nPos]);
2983*b1cdbd2cSJim Jagielski     }
2984*b1cdbd2cSJim Jagielski     nBorderThick = WriteFlyFrameAttr( rFmt, mso_sptTextBox, aPropOpt );
2985*b1cdbd2cSJim Jagielski 
2986*b1cdbd2cSJim Jagielski     MSO_TextFlow nFlow;
2987*b1cdbd2cSJim Jagielski 
2988*b1cdbd2cSJim Jagielski     switch (nDirection)
2989*b1cdbd2cSJim Jagielski     {
2990*b1cdbd2cSJim Jagielski         default:
2991*b1cdbd2cSJim Jagielski             ASSERT(!this, "unknown direction type");
2992*b1cdbd2cSJim Jagielski         case FRMDIR_HORI_LEFT_TOP:
2993*b1cdbd2cSJim Jagielski             nFlow=mso_txflHorzN;
2994*b1cdbd2cSJim Jagielski         break;
2995*b1cdbd2cSJim Jagielski         case FRMDIR_HORI_RIGHT_TOP:
2996*b1cdbd2cSJim Jagielski             nFlow=mso_txflHorzN;
2997*b1cdbd2cSJim Jagielski         break;
2998*b1cdbd2cSJim Jagielski         case FRMDIR_VERT_TOP_LEFT: //not really possible in word
2999*b1cdbd2cSJim Jagielski         case FRMDIR_VERT_TOP_RIGHT:
3000*b1cdbd2cSJim Jagielski             nFlow=mso_txflTtoBA;
3001*b1cdbd2cSJim Jagielski         break;
3002*b1cdbd2cSJim Jagielski     }
3003*b1cdbd2cSJim Jagielski     aPropOpt.AddOpt( ESCHER_Prop_txflTextFlow, nFlow );
3004*b1cdbd2cSJim Jagielski 
3005*b1cdbd2cSJim Jagielski     aPropOpt.Commit( GetStream() );
3006*b1cdbd2cSJim Jagielski 
3007*b1cdbd2cSJim Jagielski     // store anchor attribute
3008*b1cdbd2cSJim Jagielski     WriteFrmExtraData( rFmt );
3009*b1cdbd2cSJim Jagielski 
3010*b1cdbd2cSJim Jagielski     AddAtom( 4, ESCHER_ClientTextbox ); GetStream() << nTxtBox;
3011*b1cdbd2cSJim Jagielski 
3012*b1cdbd2cSJim Jagielski     CloseContainer();   // ESCHER_SpContainer
3013*b1cdbd2cSJim Jagielski     return nBorderThick;
3014*b1cdbd2cSJim Jagielski }
3015*b1cdbd2cSJim Jagielski 
WriteOLEPicture(EscherPropertyContainer & rPropOpt,sal_uInt32 nShapeFlags,const Graphic & rGraphic,const SdrObject & rObj,sal_uInt32 nShapeId,const awt::Rectangle * pVisArea)3016*b1cdbd2cSJim Jagielski void SwBasicEscherEx::WriteOLEPicture(EscherPropertyContainer &rPropOpt,
3017*b1cdbd2cSJim Jagielski     sal_uInt32 nShapeFlags, const Graphic &rGraphic, const SdrObject &rObj,
3018*b1cdbd2cSJim Jagielski     sal_uInt32 nShapeId, const awt::Rectangle* pVisArea )
3019*b1cdbd2cSJim Jagielski {
3020*b1cdbd2cSJim Jagielski     //nShapeFlags == 0xA00 + flips and ole active
3021*b1cdbd2cSJim Jagielski     AddShape(ESCHER_ShpInst_PictureFrame, nShapeFlags, nShapeId);
3022*b1cdbd2cSJim Jagielski 
3023*b1cdbd2cSJim Jagielski     GraphicObject aGraphicObject(rGraphic);
3024*b1cdbd2cSJim Jagielski     ByteString aId = aGraphicObject.GetUniqueID();
3025*b1cdbd2cSJim Jagielski     if (aId.Len())
3026*b1cdbd2cSJim Jagielski     {
3027*b1cdbd2cSJim Jagielski         Rectangle aRect = rObj.GetLogicRect();
3028*b1cdbd2cSJim Jagielski         aRect.SetPos(Point(0,0));
3029*b1cdbd2cSJim Jagielski         aRect.Right() = DrawModelToEmu(aRect.Right());
3030*b1cdbd2cSJim Jagielski         aRect.Bottom() = DrawModelToEmu(aRect.Bottom());
3031*b1cdbd2cSJim Jagielski         sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(),
3032*b1cdbd2cSJim Jagielski             aId, aRect, pVisArea, 0);    // SJ: the fourth parameter (VisArea) should be set..
3033*b1cdbd2cSJim Jagielski         if (nBlibId)
3034*b1cdbd2cSJim Jagielski             rPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, sal_True);
3035*b1cdbd2cSJim Jagielski     }
3036*b1cdbd2cSJim Jagielski 
3037*b1cdbd2cSJim Jagielski     SetPicId(rObj, nShapeId, rPropOpt);
3038*b1cdbd2cSJim Jagielski     rPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0x10000 );
3039*b1cdbd2cSJim Jagielski }
3040*b1cdbd2cSJim Jagielski 
WriteOCXControl(const SwFrmFmt & rFmt,sal_uInt32 nShapeId)3041*b1cdbd2cSJim Jagielski void SwEscherEx::WriteOCXControl( const SwFrmFmt& rFmt, sal_uInt32 nShapeId )
3042*b1cdbd2cSJim Jagielski {
3043*b1cdbd2cSJim Jagielski     if (const SdrObject* pSdrObj = rFmt.FindRealSdrObject())
3044*b1cdbd2cSJim Jagielski     {
3045*b1cdbd2cSJim Jagielski         OpenContainer( ESCHER_SpContainer );
3046*b1cdbd2cSJim Jagielski 
3047*b1cdbd2cSJim Jagielski         SdrModel *pModel = rWrt.pDoc->GetDrawModel();
3048*b1cdbd2cSJim Jagielski         OutputDevice *pDevice = Application::GetDefaultDevice();
3049*b1cdbd2cSJim Jagielski         ASSERT(pModel && pDevice, "no model or device");
3050*b1cdbd2cSJim Jagielski 
3051*b1cdbd2cSJim Jagielski 		// #i71538# use complete SdrViews
3052*b1cdbd2cSJim Jagielski         // SdrExchangeView aExchange(pModel, pDevice);
3053*b1cdbd2cSJim Jagielski         SdrView aExchange(pModel, pDevice);
3054*b1cdbd2cSJim Jagielski 
3055*b1cdbd2cSJim Jagielski 		Graphic aGraphic(aExchange.GetObjGraphic(pModel, pSdrObj));
3056*b1cdbd2cSJim Jagielski 
3057*b1cdbd2cSJim Jagielski         EscherPropertyContainer aPropOpt;
3058*b1cdbd2cSJim Jagielski         WriteOLEPicture(aPropOpt, 0xa00 | SHAPEFLAG_OLESHAPE, aGraphic,
3059*b1cdbd2cSJim Jagielski             *pSdrObj, nShapeId, NULL );
3060*b1cdbd2cSJim Jagielski 
3061*b1cdbd2cSJim Jagielski         WriteFlyFrameAttr( rFmt, mso_sptPictureFrame , aPropOpt );
3062*b1cdbd2cSJim Jagielski         aPropOpt.Commit( GetStream() );
3063*b1cdbd2cSJim Jagielski 
3064*b1cdbd2cSJim Jagielski         // store anchor attribute
3065*b1cdbd2cSJim Jagielski         WriteFrmExtraData( rFmt );
3066*b1cdbd2cSJim Jagielski 
3067*b1cdbd2cSJim Jagielski         CloseContainer();   // ESCHER_SpContainer
3068*b1cdbd2cSJim Jagielski     }
3069*b1cdbd2cSJim Jagielski }
3070*b1cdbd2cSJim Jagielski 
MakeZOrderArrAndFollowIds(std::vector<DrawObj> & rSrcArr,std::vector<DrawObj * > & rDstArr)3071*b1cdbd2cSJim Jagielski void SwEscherEx::MakeZOrderArrAndFollowIds(
3072*b1cdbd2cSJim Jagielski     std::vector<DrawObj>& rSrcArr, std::vector<DrawObj*>&rDstArr)
3073*b1cdbd2cSJim Jagielski {
3074*b1cdbd2cSJim Jagielski     sal_uInt16 n, nCnt = static_cast< sal_uInt16 >(rSrcArr.size());
3075*b1cdbd2cSJim Jagielski     SvULongsSort aSort( 255 < nCnt ? 255 : nCnt, 255 );
3076*b1cdbd2cSJim Jagielski     rDstArr.clear();
3077*b1cdbd2cSJim Jagielski     rDstArr.reserve(nCnt);
3078*b1cdbd2cSJim Jagielski     for (n = 0; n < nCnt; ++n)
3079*b1cdbd2cSJim Jagielski     {
3080*b1cdbd2cSJim Jagielski         const SwFrmFmt &rFmt = rSrcArr[n].maCntnt.GetFrmFmt();
3081*b1cdbd2cSJim Jagielski         sal_uLong nOrdNum = rWrt.GetSdrOrdNum(rFmt);
3082*b1cdbd2cSJim Jagielski         sal_uInt16 nPos;
3083*b1cdbd2cSJim Jagielski         //returns what will be the index in rDstArr of p as nPos
3084*b1cdbd2cSJim Jagielski         aSort.Insert(nOrdNum, nPos);
3085*b1cdbd2cSJim Jagielski         DrawObj &rObj = rSrcArr[n];
3086*b1cdbd2cSJim Jagielski         rDstArr.insert(rDstArr.begin() + nPos, &rObj);
3087*b1cdbd2cSJim Jagielski     }
3088*b1cdbd2cSJim Jagielski 
3089*b1cdbd2cSJim Jagielski     if (aFollowShpIds.Count())
3090*b1cdbd2cSJim Jagielski         aFollowShpIds.Remove(0, aFollowShpIds.Count());
3091*b1cdbd2cSJim Jagielski 
3092*b1cdbd2cSJim Jagielski     for (n = 0; n < nCnt; ++n)
3093*b1cdbd2cSJim Jagielski     {
3094*b1cdbd2cSJim Jagielski         const SwFrmFmt &rFmt = rDstArr[n]->maCntnt.GetFrmFmt();
3095*b1cdbd2cSJim Jagielski         bool bNeedsShapeId = false;
3096*b1cdbd2cSJim Jagielski 
3097*b1cdbd2cSJim Jagielski         if (RES_FLYFRMFMT == rFmt.Which())
3098*b1cdbd2cSJim Jagielski         {
3099*b1cdbd2cSJim Jagielski             const SwFmtChain &rChain = rFmt.GetChain();
3100*b1cdbd2cSJim Jagielski             if (rChain.GetPrev() || rChain.GetNext())
3101*b1cdbd2cSJim Jagielski                 bNeedsShapeId = true;
3102*b1cdbd2cSJim Jagielski         }
3103*b1cdbd2cSJim Jagielski 
3104*b1cdbd2cSJim Jagielski         sal_uLong nShapeId = bNeedsShapeId ? GenerateShapeId() : 0;
3105*b1cdbd2cSJim Jagielski 
3106*b1cdbd2cSJim Jagielski         aFollowShpIds.Insert(nShapeId, n);
3107*b1cdbd2cSJim Jagielski     }
3108*b1cdbd2cSJim Jagielski }
3109*b1cdbd2cSJim Jagielski 
GetFlyShapeId(const SwFrmFmt & rFmt,unsigned int nHdFtIndex,DrawObjPointerVector & rpVec)3110*b1cdbd2cSJim Jagielski sal_uInt32 SwEscherEx::GetFlyShapeId(const SwFrmFmt& rFmt,
3111*b1cdbd2cSJim Jagielski     unsigned int nHdFtIndex, DrawObjPointerVector &rpVec)
3112*b1cdbd2cSJim Jagielski {
3113*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = FindPos(rFmt, nHdFtIndex, rpVec);
3114*b1cdbd2cSJim Jagielski     sal_uInt32 nShapeId;
3115*b1cdbd2cSJim Jagielski     if (USHRT_MAX != nPos)
3116*b1cdbd2cSJim Jagielski     {
3117*b1cdbd2cSJim Jagielski         if (0 == (nShapeId = aFollowShpIds[nPos]))
3118*b1cdbd2cSJim Jagielski         {
3119*b1cdbd2cSJim Jagielski             nShapeId = GenerateShapeId();
3120*b1cdbd2cSJim Jagielski             aFollowShpIds[ nPos ] = nShapeId;
3121*b1cdbd2cSJim Jagielski         }
3122*b1cdbd2cSJim Jagielski     }
3123*b1cdbd2cSJim Jagielski     else
3124*b1cdbd2cSJim Jagielski         nShapeId = GenerateShapeId();
3125*b1cdbd2cSJim Jagielski     return nShapeId;
3126*b1cdbd2cSJim Jagielski }
3127*b1cdbd2cSJim Jagielski 
QueryTextID(const uno::Reference<drawing::XShape> & xXShapeRef,sal_uInt32 nShapeId)3128*b1cdbd2cSJim Jagielski sal_uInt32 SwEscherEx::QueryTextID(
3129*b1cdbd2cSJim Jagielski     const uno::Reference< drawing::XShape>& xXShapeRef, sal_uInt32 nShapeId )
3130*b1cdbd2cSJim Jagielski {
3131*b1cdbd2cSJim Jagielski     sal_uInt32 nId = 0;
3132*b1cdbd2cSJim Jagielski     if (SdrObject* pObj = GetSdrObjectFromXShape(xXShapeRef))
3133*b1cdbd2cSJim Jagielski     {
3134*b1cdbd2cSJim Jagielski         pTxtBxs->Append( *pObj, nShapeId );
3135*b1cdbd2cSJim Jagielski         nId = pTxtBxs->Count();
3136*b1cdbd2cSJim Jagielski         nId *= 0x10000;
3137*b1cdbd2cSJim Jagielski     }
3138*b1cdbd2cSJim Jagielski     return nId;
3139*b1cdbd2cSJim Jagielski }
3140*b1cdbd2cSJim Jagielski 
ExportControl(WW8Export & rWW8Wrt,const SdrObject * pObj)3141*b1cdbd2cSJim Jagielski bool SwMSConvertControls::ExportControl(WW8Export &rWW8Wrt, const SdrObject *pObj)
3142*b1cdbd2cSJim Jagielski {
3143*b1cdbd2cSJim Jagielski     if (!rWW8Wrt.bWrtWW8)
3144*b1cdbd2cSJim Jagielski         return false;
3145*b1cdbd2cSJim Jagielski 
3146*b1cdbd2cSJim Jagielski     SdrUnoObj *pFormObj = PTR_CAST(SdrUnoObj,pObj);
3147*b1cdbd2cSJim Jagielski     uno::Reference< awt::XControlModel > xControlModel =
3148*b1cdbd2cSJim Jagielski     pFormObj->GetUnoControlModel();
3149*b1cdbd2cSJim Jagielski 
3150*b1cdbd2cSJim Jagielski     //Why oh lord do we use so many different units ?
3151*b1cdbd2cSJim Jagielski     //I think I painted myself into a little bit of a
3152*b1cdbd2cSJim Jagielski     //corner by trying to use the uno interface for
3153*b1cdbd2cSJim Jagielski     //controls export
3154*b1cdbd2cSJim Jagielski     Rectangle aRect = pFormObj->GetLogicRect();
3155*b1cdbd2cSJim Jagielski     aRect.SetPos(Point(0,0));
3156*b1cdbd2cSJim Jagielski     awt::Size aSize;
3157*b1cdbd2cSJim Jagielski     aSize.Width = TWIPS_TO_MM(aRect.Right());
3158*b1cdbd2cSJim Jagielski     aSize.Height = TWIPS_TO_MM(aRect.Bottom());
3159*b1cdbd2cSJim Jagielski 
3160*b1cdbd2cSJim Jagielski     //Open the ObjectPool
3161*b1cdbd2cSJim Jagielski     SvStorageRef xObjPool = rWW8Wrt.GetWriter().GetStorage().OpenSotStorage(
3162*b1cdbd2cSJim Jagielski         CREATE_CONST_ASC(SL::aObjectPool), STREAM_READWRITE |
3163*b1cdbd2cSJim Jagielski         STREAM_SHARE_DENYALL);
3164*b1cdbd2cSJim Jagielski 
3165*b1cdbd2cSJim Jagielski     //Create a destination storage for the microsoft control
3166*b1cdbd2cSJim Jagielski     String sStorageName('_');
3167*b1cdbd2cSJim Jagielski     sStorageName += String::CreateFromInt32((sal_uInt32)(sal_uIntPtr)pObj);
3168*b1cdbd2cSJim Jagielski     SvStorageRef xOleStg = xObjPool->OpenSotStorage(sStorageName,
3169*b1cdbd2cSJim Jagielski                  STREAM_READWRITE|STREAM_SHARE_DENYALL);
3170*b1cdbd2cSJim Jagielski 
3171*b1cdbd2cSJim Jagielski     if (!xOleStg.Is())
3172*b1cdbd2cSJim Jagielski         return false;
3173*b1cdbd2cSJim Jagielski 
3174*b1cdbd2cSJim Jagielski     String sName;
3175*b1cdbd2cSJim Jagielski     if (!WriteOCXStream(xOleStg,xControlModel,aSize,sName))
3176*b1cdbd2cSJim Jagielski         return false;
3177*b1cdbd2cSJim Jagielski 
3178*b1cdbd2cSJim Jagielski     sal_uInt8 aSpecOLE[] =
3179*b1cdbd2cSJim Jagielski     {
3180*b1cdbd2cSJim Jagielski         0x03, 0x6a, 0xFF, 0xFF, 0xFF, 0xFF, // sprmCPicLocation
3181*b1cdbd2cSJim Jagielski         0x0a, 0x08, 1,                  // sprmCFOLE2
3182*b1cdbd2cSJim Jagielski         0x55, 0x08, 1,                  // sprmCFSpec
3183*b1cdbd2cSJim Jagielski         0x56, 0x08, 1                   // sprmCFObj
3184*b1cdbd2cSJim Jagielski     };
3185*b1cdbd2cSJim Jagielski     //Set the obj id into the sprmCPicLocation
3186*b1cdbd2cSJim Jagielski     sal_uInt8 *pData = aSpecOLE+2;
3187*b1cdbd2cSJim Jagielski     Set_UInt32(pData,(sal_uInt32)(sal_uIntPtr)pObj);
3188*b1cdbd2cSJim Jagielski 
3189*b1cdbd2cSJim Jagielski     String sFld(FieldString(ww::eCONTROL));
3190*b1cdbd2cSJim Jagielski     sFld.APPEND_CONST_ASC("Forms.");
3191*b1cdbd2cSJim Jagielski     sFld += sName;
3192*b1cdbd2cSJim Jagielski     sFld.APPEND_CONST_ASC(".1 \\s ");
3193*b1cdbd2cSJim Jagielski 
3194*b1cdbd2cSJim Jagielski     rWW8Wrt.OutputField(0, ww::eCONTROL, sFld,
3195*b1cdbd2cSJim Jagielski         WRITEFIELD_START|WRITEFIELD_CMD_START|WRITEFIELD_CMD_END);
3196*b1cdbd2cSJim Jagielski 
3197*b1cdbd2cSJim Jagielski     rWW8Wrt.pChpPlc->AppendFkpEntry(rWW8Wrt.Strm().Tell(),sizeof(aSpecOLE),
3198*b1cdbd2cSJim Jagielski         aSpecOLE);
3199*b1cdbd2cSJim Jagielski     rWW8Wrt.WriteChar( 0x1 );
3200*b1cdbd2cSJim Jagielski     rWW8Wrt.OutputField(0, ww::eCONTROL, aEmptyStr, WRITEFIELD_END | WRITEFIELD_CLOSE);
3201*b1cdbd2cSJim Jagielski     return true;
3202*b1cdbd2cSJim Jagielski }
3203*b1cdbd2cSJim Jagielski 
3204*b1cdbd2cSJim Jagielski /* vi:set tabstop=4 shiftwidth=4 expandtab: */
3205