LibreOffice Module sw (master)  1
wrtw8esh.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <memory>
21 #include <com/sun/star/embed/Aspects.hpp>
22 
23 #include <hintids.hxx>
24 
25 #include <o3tl/any.hxx>
26 #include <com/sun/star/drawing/XShape.hpp>
27 #include <vcl/svapp.hxx>
28 #include <sot/storage.hxx>
29 #include <svl/itemiter.hxx>
30 #include <svl/stritem.hxx>
31 #include <svl/whiter.hxx>
32 #include <svx/svdobj.hxx>
33 #include <svx/svdotext.hxx>
34 #include <svx/svdpage.hxx>
35 #include <editeng/outlobj.hxx>
36 #include <editeng/editobj.hxx>
37 #include <editeng/brushitem.hxx>
38 #include <editeng/boxitem.hxx>
39 #include <editeng/lrspitem.hxx>
40 #include <editeng/ulspitem.hxx>
41 #include <editeng/fontitem.hxx>
42 #include <editeng/frmdiritem.hxx>
43 #include <editeng/flditem.hxx>
44 #include <editeng/shaditem.hxx>
45 #include <editeng/eeitem.hxx>
47 #include <svx/svdouno.hxx>
48 #include <svx/unoapi.hxx>
49 #include <svx/svdview.hxx>
50 #include <svx/unopage.hxx>
51 #include <fmtcnct.hxx>
52 #include <fmtanchr.hxx>
53 #include <fmtsrnd.hxx>
54 #include <fmtornt.hxx>
55 #include <fmtfsize.hxx>
56 #include <fmtfollowtextflow.hxx>
57 #include <frmfmt.hxx>
58 #include <fmtcntnt.hxx>
59 #include <ndindex.hxx>
60 #include <doc.hxx>
61 #include <drawdoc.hxx>
64 #include <docary.hxx>
65 #include <pam.hxx>
66 #include <swrect.hxx>
67 #include <ndgrf.hxx>
68 #include <grfatr.hxx>
69 #include <ndole.hxx>
70 #include <pagedesc.hxx>
71 #include <poolfmt.hxx>
72 #include "ww8par.hxx"
73 #include <breakit.hxx>
74 #include <com/sun/star/i18n/XBreakIterator.hpp>
75 #include <com/sun/star/lang/XServiceInfo.hpp>
76 #include "attributeoutputbase.hxx"
77 #include "writerhelper.hxx"
78 #include "writerwordglue.hxx"
79 #include "wrtww8.hxx"
80 #include "escher.hxx"
81 #include <ndtxt.hxx>
82 #include "WW8FFData.hxx"
83 #include <com/sun/star/beans/XPropertySet.hpp>
84 #include <com/sun/star/form/XFormComponent.hpp>
86 #include <oox/ole/olehelper.hxx>
87 #include <fmturl.hxx>
88 #include <frameformats.hxx>
89 #include <sfx2/sfxsids.hrc>
90 #include <unotools/saveopt.hxx>
91 #include <o3tl/enumrange.hxx>
92 #include <o3tl/enumarray.hxx>
93 #include <sfx2/docfile.hxx>
94 
95 #include <algorithm>
96 
97 using ::editeng::SvxBorderLine;
98 using namespace com::sun::star;
99 using namespace sw::util;
100 using namespace sw::types;
101 using ::com::sun::star::beans::XPropertySet;
102 using ::com::sun::star::drawing::XShape;
103 
105 {
106  SvtSaveOptions aSaveOpt;
107  bool bRelUrl = false;
108  SfxMedium * pMedium = rWrt.GetWriter().GetMedia();
109  if ( pMedium )
110  bRelUrl = pMedium->IsRemote() ? aSaveOpt.IsSaveRelINet() : aSaveOpt.IsSaveRelFSys();
111  return bRelUrl;
112 }
113 
115 {
116  OUString sDocUrl;
117  SfxMedium * pMedium = rWrt.GetWriter().GetMedia();
118  if (pMedium)
119  {
120  const SfxItemSet* pPItemSet = pMedium->GetItemSet();
121  if( pPItemSet )
122  {
123  const SfxStringItem* pPItem = dynamic_cast< const SfxStringItem* >( pPItemSet->GetItem( SID_FILE_NAME ) );
124  if ( pPItem )
125  sDocUrl = pPItem->GetValue();
126  }
127  }
128 
129  return sDocUrl.copy(0, sDocUrl.lastIndexOf('/') + 1);
130 }
131 
132 OUString SwBasicEscherEx::BuildFileName(sal_uInt16& rnLevel, bool& rbRel, const OUString& rUrl)
133 {
134  OUString aDosName( INetURLObject( rUrl ).getFSysPath( FSysStyle::Dos ) );
135  rnLevel = 0;
136  rbRel = IsRelUrl();
137 
138  if (rbRel)
139  {
140  // try to convert to relative file name
141  OUString aTmpName( aDosName );
142  aDosName = INetURLObject::GetRelURL( GetBasePath(), rUrl,
144 
145  if (aDosName.startsWith(INET_FILE_SCHEME))
146  {
147  // not converted to rel -> back to old, return absolute flag
148  aDosName = aTmpName;
149  rbRel = false;
150  }
151  else if (aDosName.startsWith("./"))
152  {
153  aDosName = aDosName.copy(2);
154  }
155  else
156  {
157  while (aDosName.startsWith("../"))
158  {
159  ++rnLevel;
160  aDosName = aDosName.copy(3);
161  }
162  }
163  }
164  return aDosName;
165 }
166 
168 {
169  if ( !pINetFormatArg ) return;
170 
171  const sal_uInt8 aGuidStdLink[ 16 ] ={
172  0xD0, 0xC9, 0xEA, 0x79, 0xF9, 0xBA, 0xCE, 0x11, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B };
173  const sal_uInt8 aGuidUrlMoniker[ 16 ] = {
174  0xE0, 0xC9, 0xEA, 0x79, 0xF9, 0xBA, 0xCE, 0x11, 0x8C, 0x82, 0x00, 0xAA, 0x00, 0x4B, 0xA9, 0x0B };
175 
176  const sal_uInt8 aGuidFileMoniker[ 16 ] = {
177  0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 };
178  const sal_uInt8 aGuidFileTail[] = {
179  0xFF, 0xFF, 0xAD, 0xDE, 0x00, 0x00, 0x00, 0x00,
180  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
182  };
183  //const sal_uInt18 WW8_ID_HLINK = 0x01B8;
184  const sal_uInt32 WW8_HLINK_BODY = 0x00000001;
185  const sal_uInt32 WW8_HLINK_ABS = 0x00000002;
186  //const sal_uInt32 WW8_HLINK_DESCR = 0x00000014; /// Description.
187  const sal_uInt32 WW8_HLINK_MARK = 0x00000008;
188  const sal_uInt32 WW8_HLINK_FRAME = 0x00000080;
189  //const sal_uInt32 WW8_HLINK_UNC = 0x00000100; /// UNC path.
190  SvMemoryStream tmpStrm;
191  OUString tmpTextMark;
192 
193  OUString rUrl = pINetFormatArg->GetURL();
194  OUString rTarFrame = pINetFormatArg->GetTargetFrameName();
195  sal_uInt32 nFlags = 0;
196 
197  INetURLObject aUrlObj( rUrl );
198  const INetProtocol eProtocol = aUrlObj.GetProtocol();
199 
200  //Target Frame
201  if (!rTarFrame.isEmpty())
202  {
203  SwWW8Writer::WriteLong(tmpStrm, rTarFrame.getLength()+1);
204  SwWW8Writer::WriteString16(tmpStrm, rTarFrame, false);
205 
206  tmpStrm.WriteUInt16( 0 );
207 
208  nFlags |= WW8_HLINK_FRAME;
209  }
210 
211  // file link or URL
212  if (eProtocol == INetProtocol::File || (eProtocol == INetProtocol::NotValid && rUrl[0] != '#'))
213  {
214  sal_uInt16 nLevel;
215  bool bRel;
216  OUString aFileName( BuildFileName( nLevel, bRel, rUrl ));
217 
218  if( !bRel )
219  nFlags |= WW8_HLINK_ABS;
220 
221  nFlags |= WW8_HLINK_BODY;
222 
223  tmpStrm.WriteBytes(aGuidFileMoniker, sizeof(aGuidFileMoniker));
224  tmpStrm.WriteUInt16( nLevel );
225  SwWW8Writer::WriteLong(tmpStrm, aFileName.getLength()+1);
226  SwWW8Writer::WriteString8( tmpStrm, aFileName, true, RTL_TEXTENCODING_MS_1252 );
227  tmpStrm.WriteBytes(aGuidFileTail, sizeof(aGuidFileTail));
228 
229  //For UNICODE
230  SwWW8Writer::WriteLong(tmpStrm, 2*aFileName.getLength()+6);
231  SwWW8Writer::WriteLong(tmpStrm, 2*aFileName.getLength());
232  tmpStrm.WriteUInt16( 0x0003 );
233  SwWW8Writer::WriteString16(tmpStrm, aFileName, false);
234  }
235  else if( eProtocol != INetProtocol::NotValid )
236  {
237  tmpStrm.WriteBytes(aGuidUrlMoniker, sizeof(aGuidUrlMoniker));
238  SwWW8Writer::WriteLong(tmpStrm, 2*(rUrl.getLength()+1));
239 
240  SwWW8Writer::WriteString16(tmpStrm, rUrl, true);
241  nFlags |= WW8_HLINK_BODY | WW8_HLINK_ABS;
242  }
243  else if (rUrl[0] == '#' )
244  {
245  OUString aTextMark(rUrl.copy( 1 ));
246  aTextMark = aTextMark.replaceFirst(".", "!");
247  tmpTextMark = aTextMark;
248  }
249 
250  if (tmpTextMark.isEmpty() && aUrlObj.HasMark())
251  {
252  tmpTextMark = aUrlObj.GetMark();
253  }
254 
255  if (!tmpTextMark.isEmpty())
256  {
257  SwWW8Writer::WriteLong(tmpStrm, tmpTextMark.getLength()+1);
258  SwWW8Writer::WriteString16(tmpStrm, tmpTextMark, true);
259 
260  nFlags |= WW8_HLINK_MARK;
261  }
262 
263  rStrm.WriteBytes(aGuidStdLink, 16);
264  rStrm .WriteUInt32( 2 )
265  .WriteUInt32( nFlags );
266  tmpStrm.Seek( STREAM_SEEK_TO_BEGIN );
267  sal_uInt32 const nLen = tmpStrm.remainingSize();
268  if(nLen >0)
269  {
270  std::unique_ptr<sal_uInt8[]> pBuffer( new sal_uInt8[ nLen ] );
271  tmpStrm.ReadBytes(pBuffer.get(), nLen);
272  rStrm.WriteBytes(pBuffer.get(), nLen);
273  }
274 }
276 {
277  const SfxPoolItem* pItem;
278  const SwAttrSet& rAttrSet = rFormat.GetAttrSet();
279  if (SfxItemState::SET != rAttrSet.GetItemState(RES_URL, true, &pItem))
280  return;
281 
282  const SwFormatURL *pINetFormat = dynamic_cast<const SwFormatURL*>(pItem);
283  if (!(pINetFormat && !pINetFormat->GetURL().isEmpty()))
284  return;
285 
286  SvMemoryStream aStrm;
287  WriteHyperlinkWithinFly( aStrm, pINetFormat );
288  rPropOpt.AddOpt(ESCHER_Prop_pihlShape, true, 0, aStrm);
289  sal_uInt32 nValue;
290  OUString aNamestr = pINetFormat->GetName();
291  if (!aNamestr.isEmpty())
292  {
293  rPropOpt.AddOpt(ESCHER_Prop_wzName, aNamestr );
294  }
295  if(rPropOpt.GetOpt( ESCHER_Prop_fPrint, nValue))
296  {
297  nValue|=0x03080008;
298  rPropOpt.AddOpt(ESCHER_Prop_fPrint, nValue );
299  }
300  else
301  rPropOpt.AddOpt(ESCHER_Prop_fPrint, 0x03080008 );
302 }
303 
304 namespace
305 {
310  sal_uLong lcl_getSdrOrderNumber(const WW8Export& rWrt, DrawObj const *pObj)
311  {
312  return rWrt.GetSdrOrdNum(pObj->maContent.GetFrameFormat());
313  };
314 
317  class CompareDrawObjs
318  {
319  private:
320  const WW8Export& wrt;
321 
322  public:
323  explicit CompareDrawObjs(const WW8Export& rWrt) : wrt(rWrt) {};
324  bool operator()(DrawObj const *a, DrawObj const *b) const
325  {
326  sal_uLong aSort = lcl_getSdrOrderNumber(wrt, a);
327  sal_uLong bSort = lcl_getSdrOrderNumber(wrt, b);
328  return aSort < bSort;
329  }
330  };
331 
336  void lcl_makeZOrderArray(const WW8Export& rWrt,
337  std::vector<DrawObj> &rSrcArr,
338  std::vector<DrawObj*> &rDstArr)
339  {
340  rDstArr.clear();
341  rDstArr.reserve(rSrcArr.size());
342  for(DrawObj & i : rSrcArr)
343  {
344  rDstArr.push_back( &i );
345  }
346  std::sort(rDstArr.begin(), rDstArr.end(), CompareDrawObjs(rWrt));
347  }
348 
349 }
350 
351 // get a part fix for this type of element
353 {
354  const SdrObject *pObject = rFrameFormat.FindRealSdrObject();
355  if (!pObject || pObject->GetObjInventor() != SdrInventor::FmForm)
356  return false;
357 
358  const SdrUnoObj *pFormObj = dynamic_cast< const SdrUnoObj* >(pObject);
359  if (!pFormObj)
360  return false;
361 
362  uno::Reference< awt::XControlModel > xControlModel =
363  pFormObj->GetUnoControlModel();
364  uno::Reference< lang::XServiceInfo > xInfo(xControlModel,
365  uno::UNO_QUERY);
366  uno::Reference<beans::XPropertySet> xPropSet(xControlModel, uno::UNO_QUERY);
367  if (!xInfo.is())
368  return false;
369 
370  if (xInfo->supportsService("com.sun.star.form.component.ComboBox"))
371  {
372  DoComboBox(xPropSet);
373  return true;
374  }
375 
376  return false;
377 }
378 
379 void WW8Export::DoComboBox(uno::Reference<beans::XPropertySet> const & xPropSet)
380 {
381  OUString sSelected;
382  uno::Sequence<OUString> aListItems;
383  xPropSet->getPropertyValue("StringItemList") >>= aListItems;
384  if (aListItems.hasElements())
385  {
386  uno::Any aTmp = xPropSet->getPropertyValue("DefaultText");
387  auto pStr = o3tl::tryAccess<OUString>(aTmp);
388  if (pStr)
389  sSelected = *pStr;
390  }
391 
392  OUString sName;
393  {
394  uno::Any aTmp = xPropSet->getPropertyValue("Name");
395  auto pStr = o3tl::tryAccess<OUString>(aTmp);
396  if (pStr)
397  sName = *pStr;
398  }
399 
400  OUString sHelp;
401  {
402  // property "Help" does not exist and due to the no-existence an exception is thrown.
403  try
404  {
405  uno::Any aTmp = xPropSet->getPropertyValue("HelpText");
406  auto pStr = o3tl::tryAccess<OUString>(aTmp);
407  if (pStr)
408  sHelp = *pStr;
409  }
410  catch( const uno::Exception& )
411  {}
412  }
413 
414  OUString sToolTip;
415  {
416  uno::Any aTmp = xPropSet->getPropertyValue("Name");
417  auto pStr = o3tl::tryAccess<OUString>(aTmp);
418  if (pStr)
419  sToolTip = *pStr;
420  }
421 
422  DoComboBox(sName, sHelp, sToolTip, sSelected, aListItems);
423 }
424 
425 void WW8Export::DoComboBox(const OUString &rName,
426  const OUString &rHelp,
427  const OUString &rToolTip,
428  const OUString &rSelected,
429  const uno::Sequence<OUString> &rListItems)
430 {
431  OutputField(nullptr, ww::eFORMDROPDOWN, FieldString(ww::eFORMDROPDOWN),
433  // write the reference to the "picture" structure
434  sal_uLong nDataStt = pDataStrm->Tell();
435  m_pChpPlc->AppendFkpEntry( Strm().Tell() );
436 
437  WriteChar( 0x01 );
438 
439  static sal_uInt8 aArr1[] =
440  {
441  0x03, 0x6a, 0,0,0,0, // sprmCPicLocation
442  0x06, 0x08, 0x01, // sprmCFData
443  0x55, 0x08, 0x01, // sprmCFSpec
444  0x02, 0x08, 0x01 // sprmCFFieldVanish
445  };
446  sal_uInt8* pDataAdr = aArr1 + 2;
447  Set_UInt32( pDataAdr, nDataStt );
448 
449  m_pChpPlc->AppendFkpEntry(Strm().Tell(), sizeof(aArr1), aArr1);
450 
451  OutputField(nullptr, ww::eFORMDROPDOWN, FieldString(ww::eFORMDROPDOWN),
453 
454  ::sw::WW8FFData aFFData;
455 
456  aFFData.setType(2);
457  aFFData.setName(rName);
458  aFFData.setHelp(rHelp);
459  aFFData.setStatus(rToolTip);
460 
461  sal_uInt32 nListItems = rListItems.getLength();
462 
463  for (sal_uInt32 i = 0; i < nListItems; i++)
464  {
465  if (i < 0x20 && rSelected == rListItems[i])
466  aFFData.setResult(::sal::static_int_cast<sal_uInt8>(i));
467  aFFData.addListboxEntry(rListItems[i]);
468  }
469 
470  aFFData.Write(pDataStrm);
471 }
472 
474 {
475  OutputField(nullptr, ww::eFORMTEXT, FieldString(ww::eFORMTEXT),
477  // write the reference to the "picture" structure
478  sal_uLong nDataStt = pDataStrm->Tell();
479  m_pChpPlc->AppendFkpEntry( Strm().Tell() );
480 
481  WriteChar( 0x01 );
482  static sal_uInt8 aArr1[] = {
483  0x02, 0x08, 0x81, // sprmCFFieldVanish
484  0x03, 0x6a, 0,0,0,0, // sprmCPicLocation
485 
486  0x06, 0x08, 0x01, // sprmCFData
487  0x55, 0x08, 0x01 // sprmCFSpec
488  };
489  sal_uInt8* pDataAdr = aArr1 + 5;
490  Set_UInt32( pDataAdr, nDataStt );
491 
492  m_pChpPlc->AppendFkpEntry(Strm().Tell(),
493  sizeof( aArr1 ), aArr1 );
494 
495  ::sw::WW8FFData aFFData;
496 
497  aFFData.setType(0);
498  aFFData.setName(pField->GetPar2());
499  aFFData.setHelp(pField->GetHelp());
500  aFFData.setStatus(pField->GetToolTip());
501  aFFData.Write(pDataStrm);
502 
503  OutputField(nullptr, ww::eFORMTEXT, OUString(), FieldFlags::CmdEnd);
504 
505  const OUString fieldStr( pField->ExpandField(true, nullptr) );
506  SwWW8Writer::WriteString16(Strm(), fieldStr, false);
507 
508  static sal_uInt8 aArr2[] = {
509  0x55, 0x08, 0x01, // sprmCFSpec
510  0x75, 0x08, 0x01 // ???
511  };
512 
513  pDataAdr = aArr2 + 2;
514  Set_UInt32( pDataAdr, nDataStt );
515  m_pChpPlc->AppendFkpEntry(Strm().Tell(),
516  sizeof( aArr2 ), aArr2 );
517 
518  OutputField(nullptr, ww::eFORMTEXT, OUString(), FieldFlags::Close);
519 }
520 
522 {
523 }
524 
525 //It's irritating to have to change the RTL frames position into LTR ones
526 //so that word will have to place them in the right place. Doubly so that
527 //the SO drawings and writer frames have different ideas themselves as to
528 //how to be positioned when in RTL mode!
529 bool RTLGraphicsHack(SwTwips &rLeft, SwTwips nWidth,
530 sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft,
531  SwTwips nPageRight, SwTwips nPageSize)
532 {
533  bool bRet = false;
534  if (eHoriOri == text::HoriOrientation::NONE)
535  {
536  if (eHoriRel == text::RelOrientation::PAGE_FRAME)
537  {
538  rLeft = nPageSize - rLeft;
539  bRet = true;
540  }
541  else if (
542  (eHoriRel == text::RelOrientation::PAGE_PRINT_AREA) ||
543  (eHoriRel == text::RelOrientation::FRAME) ||
544  (eHoriRel == text::RelOrientation::PRINT_AREA)
545  )
546  {
547  rLeft = nPageSize - nPageLeft - nPageRight - rLeft;
548  bRet = true;
549  }
550  }
551  if (bRet)
552  rLeft -= nWidth;
553  return bRet;
554 }
555 
556 static bool RTLDrawingsHack(long &rLeft,
557  sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft,
558  SwTwips nPageRight, SwTwips nPageSize)
559 {
560  bool bRet = false;
561  if (eHoriOri == text::HoriOrientation::NONE)
562  {
563  if (eHoriRel == text::RelOrientation::PAGE_FRAME)
564  {
565  rLeft = nPageSize + rLeft;
566  bRet = true;
567  }
568  else if (
569  (eHoriRel == text::RelOrientation::PAGE_PRINT_AREA) ||
570  (eHoriRel == text::RelOrientation::FRAME) ||
571  (eHoriRel == text::RelOrientation::PRINT_AREA)
572  )
573  {
574  rLeft = nPageSize - nPageLeft - nPageRight + rLeft;
575  bRet = true;
576  }
577  }
578  return bRet;
579 }
580 
582  const ww8::Frame &rFrameFormat)
583 {
584  //Require nasty bidi swap
585  if (SvxFrameDirection::Horizontal_RL_TB != m_pDoc->GetTextDirection(rFrameFormat.GetPosition()))
586  return;
587 
588  SwTwips nWidth = rRight - rLeft;
589  SwTwips nPageLeft, nPageRight;
590  SwTwips nPageSize = CurrentPageWidth(nPageLeft, nPageRight);
591 
592  const SwFormatHoriOrient& rHOr = rFrameFormat.GetFrameFormat().GetHoriOrient();
593 
594  bool bRet = false;
595  ww8::Frame::WriterSource eSource = rFrameFormat.GetWriterType();
596  if (eSource == ww8::Frame::eDrawing || eSource == ww8::Frame::eFormControl)
597  {
598  if (RTLDrawingsHack(rLeft, rHOr.GetHoriOrient(),
599  rHOr.GetRelationOrient(), nPageLeft, nPageRight, nPageSize))
600  {
601  bRet = true;
602  }
603  }
604  else
605  {
606  if (RTLGraphicsHack(rLeft, nWidth, rHOr.GetHoriOrient(),
607  rHOr.GetRelationOrient(), nPageLeft, nPageRight, nPageSize))
608  {
609  bRet = true;
610  }
611  }
612  if (bRet)
613  rRight = rLeft + nWidth;
614 }
615 
616 void PlcDrawObj::WritePlc( WW8Export& rWrt ) const
617 {
618  if (8 > rWrt.pFib->m_nVersion) // Cannot export drawobject in vers 7-
619  return;
620 
621  sal_uInt32 nFcStart = rWrt.pTableStrm->Tell();
622 
623  if (maDrawObjs.empty())
624  return;
625 
626  // write CPs
627  WW8Fib& rFib = *rWrt.pFib;
628  WW8_CP nCpOffs = GetCpOffset(rFib);
629 
630  for (const auto& rDrawObj : maDrawObjs)
631  SwWW8Writer::WriteLong(*rWrt.pTableStrm, rDrawObj.mnCp - nCpOffs);
632 
634  rFib.m_ccpHdr + rFib.m_ccpEdn + rFib.m_ccpTxbx + rFib.m_ccpHdrTxbx + 1);
635 
636  for (const auto& rDrawObj : maDrawObjs)
637  {
638  // write the fspa-struct
639  const ww8::Frame &rFrameFormat = rDrawObj.maContent;
640  const SwFrameFormat &rFormat = rFrameFormat.GetFrameFormat();
641  const SdrObject* pObj = rFormat.FindRealSdrObject();
642 
643  tools::Rectangle aRect;
644  SwFormatVertOrient rVOr = rFormat.GetVertOrient();
645  SwFormatHoriOrient rHOr = rFormat.GetHoriOrient();
646  // #i30669# - convert the positioning attributes.
647  // Most positions are converted, if layout information exists.
648  const bool bPosConverted =
649  WinwordAnchoring::ConvertPosition( rHOr, rVOr, rFormat );
650 
651  Point aObjPos;
652  bool bHasHeightWidthSwapped(false);
653  if (RES_FLYFRMFMT == rFormat.Which())
654  {
655  SwRect aLayRect(rFormat.FindLayoutRect(false, &aObjPos));
656  // the Object is not visible - so get the values from
657  // the format. The Position may not be correct.
658  if( aLayRect.IsEmpty() )
659  aRect.SetSize( rFormat.GetFrameSize().GetSize() );
660  else
661  {
662  // #i56090# Do not only consider the first client
663  // Note that we actually would have to find the maximum size of the
664  // frame format clients. However, this already should work in most cases.
665  const SwRect aSizeRect(rFormat.FindLayoutRect());
666  if ( aSizeRect.Width() > aLayRect.Width() )
667  aLayRect.Width( aSizeRect.Width() );
668 
669  aRect = aLayRect.SVRect();
670  }
671  }
672  else
673  {
674  OSL_ENSURE(pObj, "Where is the SDR-Object?");
675  if (pObj)
676  {
677  aRect = pObj->GetLogicRect();
678 
679  // rotating to vertical means swapping height and width as seen in SvxMSDffManager::ImportShape
680  const long nAngle = NormAngle36000( pObj->GetRotateAngle() );
681  const bool bAllowSwap = pObj->GetObjIdentifier() != OBJ_LINE && pObj->GetObjIdentifier() != OBJ_GRUP;
682  if ( bAllowSwap && (( nAngle > 4500 && nAngle <= 13500 ) || ( nAngle > 22500 && nAngle <= 31500 )) )
683  {
684  const long nWidth = aRect.getWidth();
685  const long nHeight = aRect.getHeight();
686  aRect.setWidth( nHeight );
687  aRect.setHeight( nWidth );
688  bHasHeightWidthSwapped = true;
689  }
690  }
691  }
692 
693  // #i30669# - use converted position, if conversion is performed.
694  // Unify position determination of Writer fly frames
695  // and drawing objects.
696  if ( bPosConverted )
697  {
698  aRect.SetPos( Point( rHOr.GetPos(), rVOr.GetPos() ) );
699  }
700  else
701  {
702  aRect -= rDrawObj.maParentPos;
703  aObjPos = aRect.TopLeft();
705  {
706  // #i22673#
707  sal_Int16 eOri = rVOr.GetRelationOrient();
708  if (eOri == text::RelOrientation::CHAR || eOri == text::RelOrientation::TEXT_LINE)
709  aObjPos.setY( -rVOr.GetPos() );
710  else
711  aObjPos.setY( rVOr.GetPos() );
712  }
714  aObjPos.setX( rHOr.GetPos() );
715  aRect.SetPos( aObjPos );
716  }
717 
718  sal_Int32 nThick = rDrawObj.mnThick;
719 
720  //If we are being exported as an inline hack, set
721  //corner to 0 and forget about border thickness for positioning
722  if (rFrameFormat.IsInline())
723  {
724  aRect.SetPos(Point(0,0));
725  nThick = 0;
726  }
727 
728  // spid
729  SwWW8Writer::WriteLong(*rWrt.pTableStrm, rDrawObj.mnShapeId);
730 
731  SwTwips nLeft = aRect.Left() + nThick;
732  SwTwips nRight = aRect.Right() - nThick;
733  SwTwips nTop = aRect.Top() + nThick;
734  SwTwips nBottom = aRect.Bottom() - nThick;
735 
736  // tdf#93675, 0 below line/paragraph and/or top line/paragraph with
737  // wrap top+bottom or other wraps is affecting the line directly
738  // above the anchor line, which seems odd, but a tiny adjustment
739  // here to bring the top down convinces msoffice to wrap like us
740  if (nTop == 0 && !rFrameFormat.IsInline() &&
742  rVOr.GetRelationOrient() == text::RelOrientation::FRAME)
743  {
744  nTop = 8;
745  }
746 
747  //Nasty swap for bidi if necessary
748  rWrt.MiserableRTLFrameFormatHack(nLeft, nRight, rFrameFormat);
749 
750  // tdf#70838. Word relates the position to the unrotated rectangle,
751  // Writer to the rotated one. Because the rotation is around center,
752  // the difference counts half.
753  if(pObj && pObj->GetRotateAngle())
754  {
755  SwTwips nXOff;
756  SwTwips nYOff;
757  SwTwips nSnapWidth = pObj->GetSnapRect().getWidth();
758  SwTwips nSnapHeight = pObj->GetSnapRect().getHeight();
759  SwTwips nLogicWidth = pObj->GetLogicRect().getWidth();
760  SwTwips nLogicHeight = pObj->GetLogicRect().getHeight();
761  // +1 for to compensate integer arithmetic rounding errors
762  if(bHasHeightWidthSwapped)
763  {
764  nXOff = (nSnapWidth - nLogicHeight + 1) / 2;
765  nYOff = (nSnapHeight - nLogicWidth + 1) / 2;
766  }
767  else
768  {
769  nXOff = (nSnapWidth - nLogicWidth + 1) / 2;
770  nYOff = (nSnapHeight - nLogicHeight + 1) / 2;
771  }
772  nLeft += nXOff;
773  nRight += nXOff;
774  nTop += nYOff;
775  nBottom += nYOff;
776  }
777 
778  //xaLeft/yaTop/xaRight/yaBottom - rel. to anchor
779  //(most of) the border is outside the graphic is word, so
780  //change dimensions to fit
781  SwWW8Writer::WriteLong(*rWrt.pTableStrm, nLeft);
782  SwWW8Writer::WriteLong(*rWrt.pTableStrm, nTop);
783  SwWW8Writer::WriteLong(*rWrt.pTableStrm, nRight);
784  SwWW8Writer::WriteLong(*rWrt.pTableStrm, nBottom);
785 
786  //fHdr/bx/by/wr/wrk/fRcaSimple/fBelowText/fAnchorLock
787  sal_uInt16 nFlags=0;
788  //If nFlags isn't 0x14 its overridden by the escher properties
789  if (RndStdIds::FLY_AT_PAGE == rFormat.GetAnchor().GetAnchorId())
790  nFlags = 0x0000;
791  else
792  nFlags = 0x0014; // x-rel to text, y-rel to text
793 
794  const SwFormatSurround& rSurr = rFormat.GetSurround();
795  sal_uInt16 nContour = rSurr.IsContour() ? 0x0080 : 0x0040;
796  css::text::WrapTextMode eSurround = rSurr.GetSurround();
797 
798  /*
799  #i3958#
800  The inline elements being export as anchored to character inside
801  the shape field hack are required to be wrap through so as to flow
802  over the following dummy 0x01 graphic
803  */
804  if (rFrameFormat.IsInline())
805  eSurround = css::text::WrapTextMode_THROUGH;
806 
807  switch (eSurround)
808  {
809  case css::text::WrapTextMode_NONE:
810  nFlags |= 0x0020;
811  break;
812  case css::text::WrapTextMode_THROUGH:
813  nFlags |= 0x0060;
814  break;
815  case css::text::WrapTextMode_PARALLEL:
816  nFlags |= 0x0000 | nContour;
817  break;
818  case css::text::WrapTextMode_DYNAMIC:
819  nFlags |= 0x0600 | nContour;
820  break;
821  case css::text::WrapTextMode_LEFT:
822  nFlags |= 0x0200 | nContour;
823  break;
824  case css::text::WrapTextMode_RIGHT:
825  nFlags |= 0x0400 | nContour;
826  break;
827  default:
828  OSL_ENSURE(false, "Unsupported surround type for export");
829  break;
830  }
831  if (pObj && (pObj->GetLayer() == rWrt.m_pDoc->getIDocumentDrawModelAccess().GetHellId() ||
833  {
834  nFlags |= 0x4000;
835  }
836 
837  /*
838  #i3958# Required to make this inline stuff work in WordXP, not
839  needed for 2003 interestingly
840  */
841  if (rFrameFormat.IsInline())
842  nFlags |= 0x8000;
843 
844  SwWW8Writer::WriteShort(*rWrt.pTableStrm, nFlags);
845 
846  // cTxbx
848  }
849 
850  RegisterWithFib(rFib, nFcStart, rWrt.pTableStrm->Tell() - nFcStart);
851 }
852 
853 void MainTextPlcDrawObj::RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart,
854  sal_uInt32 nLen) const
855 {
856  rFib.m_fcPlcfspaMom = nStart;
857  rFib.m_lcbPlcfspaMom = nLen;
858 }
859 
861 {
862  return 0;
863 }
864 
865 void HdFtPlcDrawObj::RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart,
866  sal_uInt32 nLen) const
867 {
868  rFib.m_fcPlcfspaHdr = nStart;
869  rFib.m_lcbPlcfspaHdr = nLen;
870 }
871 
873 {
874  return rFib.m_ccpText + rFib.m_ccpFootnote;
875 }
876 
877 bool PlcDrawObj::Append( WW8Export const & rWrt, WW8_CP nCp, const ww8::Frame& rFormat,
878  const Point& rNdTopLeft )
879 {
880  bool bRet = false;
881  const SwFrameFormat &rFrameFormat = rFormat.GetFrameFormat();
882  if (TXT_HDFT == rWrt.m_nTextTyp || TXT_MAINTEXT == rWrt.m_nTextTyp)
883  {
884  if (RES_FLYFRMFMT == rFrameFormat.Which())
885  {
886  // check for textflyframe and if it is the first in a Chain
887  if (rFrameFormat.GetContent().GetContentIdx())
888  bRet = true;
889  }
890  else
891  bRet = true;
892  }
893 
894  if (bRet)
895  {
896  DrawObj aObj(rFormat, nCp, rNdTopLeft, rWrt.TrueFrameDirection(rFrameFormat),
897  rWrt.GetHdFtIndex());
898  maDrawObjs.push_back(aObj);
899  }
900  return bRet;
901 }
902 
903 void DrawObj::SetShapeDetails(sal_uInt32 nId, sal_Int32 nThick)
904 {
905  mnShapeId = nId;
906  mnThick = nThick;
907 }
908 
910 {
911  rWrt.m_bInWriteEscher = true;
912  WW8_CP& rccp=TXT_TXTBOX == nTyp ? rWrt.pFib->m_ccpTxbx : rWrt.pFib->m_ccpHdrTxbx;
913 
914  bool bRet = WriteGenericText( rWrt, nTyp, rccp );
915 
916  WW8_CP nCP = rWrt.Fc2Cp( rWrt.Strm().Tell() );
917  WW8Fib& rFib = *rWrt.pFib;
918  WW8_CP nMyOffset = rFib.m_ccpText + rFib.m_ccpFootnote + rFib.m_ccpHdr + rFib.m_ccpAtn
919  + rFib.m_ccpEdn;
920  if( TXT_TXTBOX == nTyp )
921  rWrt.m_pFieldTextBxs->Finish( nCP, nMyOffset );
922  else
923  rWrt.m_pFieldHFTextBxs->Finish( nCP, nMyOffset + rFib.m_ccpTxbx );
924  rWrt.m_bInWriteEscher = false;
925  return bRet;
926 }
927 
928 void WW8_WrPlcTextBoxes::Append( const SdrObject& rObj, sal_uInt32 nShapeId )
929 {
930  aContent.push_back( &rObj );
931  aShapeIds.push_back( nShapeId );
932  //save NULL, if we have an actual SdrObject
933  aSpareFormats.push_back(nullptr);
934 }
935 
936 void WW8_WrPlcTextBoxes::Append( const SwFrameFormat* pFormat, sal_uInt32 nShapeId )
937 {
938  //no sdr object, we insert a NULL in the aContent and save the real fmt in aSpareFormats.
939  aContent.push_back( nullptr );
940  aShapeIds.push_back( nShapeId );
941  aSpareFormats.push_back(pFormat);
942 }
943 
944 const std::vector<sal_uInt32>* WW8_WrPlcTextBoxes::GetShapeIdArr() const
945 {
946  return &aShapeIds;
947 }
948 
949 sal_uInt32 WW8Export::GetSdrOrdNum( const SwFrameFormat& rFormat ) const
950 {
951  sal_uInt32 nOrdNum;
952  const SdrObject* pObj = rFormat.FindRealSdrObject();
953  if( pObj )
954  nOrdNum = pObj->GetOrdNum();
955  else
956  {
957  // no Layout for this format, then recalc the ordnum
958  SwFrameFormat* pFormat = const_cast<SwFrameFormat*>(&rFormat);
959  nOrdNum = std::distance(m_pDoc->GetSpzFrameFormats()->begin(),
960  m_pDoc->GetSpzFrameFormats()->find( pFormat ) );
961 
963  if( pModel )
964  nOrdNum += pModel->GetPage( 0 )->GetObjCount();
965  }
966  return nOrdNum;
967 }
968 
969 void WW8Export::AppendFlyInFlys(const ww8::Frame& rFrameFormat,
970  const Point& rNdTopLeft)
971 {
972  OSL_ENSURE(!m_pEscher, "the EscherStream was already written!");
973  if (m_pEscher)
974  return ;
975  PlcDrawObj *pDrwO;
976  if (TXT_HDFT == m_nTextTyp)
977  pDrwO = m_pHFSdrObjs;
978  else
979  pDrwO = m_pSdrObjs;
980 
981  if (rFrameFormat.IsInline())
982  {
983  OutputField(nullptr, ww::eSHAPE, FieldString(ww::eSHAPE),
985  }
986 
987  WW8_CP nCP = Fc2Cp(Strm().Tell());
988  bool bSuccess = pDrwO->Append(*this, nCP, rFrameFormat, rNdTopLeft);
989  OSL_ENSURE(bSuccess, "Couldn't export a graphical element!");
990 
991  if (bSuccess)
992  {
993  static const sal_uInt8 aSpec8[] =
994  {
995  0x03, 0x6a, 0, 0, 0, 0, // sprmCObjLocation
996  0x55, 0x08, 1 // sprmCFSpec
997  };
998  // fSpec-Attribute true
999 
1000  // A special character is required in the text for DrawObjects,
1001  // therefore a fSpec-Attribute
1002  m_pChpPlc->AppendFkpEntry( Strm().Tell() );
1003  WriteChar( 0x8 );
1004  m_pChpPlc->AppendFkpEntry( Strm().Tell(), sizeof( aSpec8 ), aSpec8 );
1005 
1006  //Need dummy picture frame
1007  if (rFrameFormat.IsInline())
1008  OutGrf(rFrameFormat);
1009  }
1010 
1011  if (rFrameFormat.IsInline())
1012  OutputField(nullptr, ww::eSHAPE, OUString(), FieldFlags::Close);
1013 }
1014 
1016  const EditTextObject& rEditObj, sal_uInt8 nTyp )
1017  : MSWordAttrIter( rWr ), pEditObj(&rEditObj), pEditPool(nullptr), mnTyp(nTyp)
1018 {
1019  NextPara( 0 );
1020 }
1021 
1022 void MSWord_SdrAttrIter::NextPara( sal_Int32 nPar )
1023 {
1024  nPara = nPar;
1025  // Ignore change of attribute at position 0, because we expect that
1026  // the attributes are outputted at start of a paragraph anyway.
1027  aChrTextAtrArr.clear();
1028  aChrSetArr.clear();
1029  nCurrentSwPos = nTmpSwPos = 0;
1030 
1032  pEditPool = aSet.GetPool();
1033  eNdChrSet = ItemGet<SvxFontItem>(aSet,EE_CHAR_FONTINFO).GetCharSet();
1034 
1036  nScript = g_pBreakIt->GetBreakIter()->getScriptType( pEditObj->GetText(nPara), 0);
1037 
1039  nCurrentSwPos = SearchNext( 1 );
1040 }
1041 
1042 rtl_TextEncoding MSWord_SdrAttrIter::GetNextCharSet() const
1043 {
1044  if( !aChrSetArr.empty() )
1045  return aChrSetArr.back();
1046  return eNdChrSet;
1047 }
1048 
1049 // the first parameter in SearchNext() returns if it's a TextAtr
1050 sal_Int32 MSWord_SdrAttrIter::SearchNext( sal_Int32 nStartPos )
1051 {
1052  sal_Int32 nMinPos = SAL_MAX_INT32;
1053  for(const auto& rTextAtr : aTextAtrArr)
1054  {
1055  sal_Int32 nPos = rTextAtr.nStart; // first character attribute
1056  if( nPos >= nStartPos && nPos <= nMinPos )
1057  {
1058  nMinPos = nPos;
1059  SetCharSet(rTextAtr, true);
1060  }
1061 
1062  nPos = rTextAtr.nEnd; // last character attribute + 1
1063  if( nPos >= nStartPos && nPos < nMinPos )
1064  {
1065  nMinPos = nPos;
1066  SetCharSet(rTextAtr, false);
1067  }
1068  }
1069  return nMinPos;
1070 }
1071 
1072 void MSWord_SdrAttrIter::SetCharSet(const EECharAttrib& rAttr, bool bStart)
1073 {
1074  const SfxPoolItem& rItem = *rAttr.pAttr;
1075  if( rItem.Which() != EE_CHAR_FONTINFO )
1076  {
1077  return;
1078  }
1079 
1080  if( bStart )
1081  {
1082  rtl_TextEncoding eChrSet = static_cast<const SvxFontItem&>(rItem).GetCharSet();
1083  aChrSetArr.push_back( eChrSet );
1084  aChrTextAtrArr.push_back( &rAttr );
1085  }
1086  else
1087  {
1088  std::vector<const EECharAttrib*>::iterator it =
1089  std::find( aChrTextAtrArr.begin(), aChrTextAtrArr.end(), &rAttr );
1090  if ( it != aChrTextAtrArr.end() )
1091  {
1092  aChrSetArr.erase( aChrSetArr.begin() + (it - aChrTextAtrArr.begin()) );
1093  aChrTextAtrArr.erase( it );
1094  }
1095  }
1096 }
1097 
1099 {
1100  const SvxFieldItem &rField = static_cast<const SvxFieldItem &>(rHt);
1101  const SvxFieldData *pField = rField.GetField();
1102  if (auto pURL = dynamic_cast< const SvxURLField *>( pField ))
1103  {
1104  sal_uInt8 nOldTextTyp = m_rExport.m_nTextTyp;
1106  m_rExport.AttrOutput().StartURL( pURL->GetURL(), pURL->GetTargetFrame() );
1107 
1108  const OUString &rStr = pURL->GetRepresentation();
1110 
1111  m_rExport.AttrOutput().EndURL(false);
1112  m_rExport.m_nTextTyp = nOldTextTyp;
1113  }
1114 }
1115 
1116 void MSWord_SdrAttrIter::OutAttr( sal_Int32 nSwPos )
1117 {
1118  //Collect the which ids belong to the run that we will export after
1119  //outputting the underlying paragraph attributes. We will exclude
1120  //writing these from the underlying paragraph attributes to avoid
1121  //duplicate attributes in docx export. Doesn't matter in doc
1122  //export as later props just override earlier ones.
1123  std::set<sal_uInt16> aUsedRunWhichs;
1124  for(const auto& rTextAtr : aTextAtrArr)
1125  {
1126  if (nSwPos >= rTextAtr.nStart && nSwPos < rTextAtr.nEnd)
1127  {
1128  sal_uInt16 nWhich = rTextAtr.pAttr->Which();
1129  aUsedRunWhichs.insert(nWhich);
1130  }
1131 
1132  if( nSwPos < rTextAtr.nStart )
1133  break;
1134  }
1135 
1136  OutParaAttr(true, &aUsedRunWhichs);
1137 
1138  if (aTextAtrArr.empty())
1139  return;
1140 
1141  const SwModify* pOldMod = m_rExport.m_pOutFormatNode;
1142  m_rExport.m_pOutFormatNode = nullptr;
1143 
1144  const SfxItemPool* pSrcPool = pEditPool;
1145  const SfxItemPool& rDstPool = m_rExport.m_pDoc->GetAttrPool();
1146 
1147  nTmpSwPos = nSwPos;
1148  // Did we already produce a <w:sz> element?
1149  m_rExport.m_bFontSizeWritten = false;
1150  for(const auto& rTextAtr : aTextAtrArr)
1151  {
1152  if (nSwPos >= rTextAtr.nStart && nSwPos < rTextAtr.nEnd)
1153  {
1154  sal_uInt16 nWhich = rTextAtr.pAttr->Which();
1155  if (nWhich == EE_FEATURE_FIELD)
1156  {
1157  OutEEField(*(rTextAtr.pAttr));
1158  continue;
1159  }
1160  if (nWhich == EE_FEATURE_TAB)
1161  {
1162  m_rExport.WriteChar(0x9);
1163  continue;
1164  }
1165 
1166  const sal_uInt16 nSlotId = pSrcPool->GetSlotId(nWhich);
1167  if (nSlotId && nWhich != nSlotId)
1168  {
1169  nWhich = rDstPool.GetWhich(nSlotId);
1170  if (nWhich && nWhich != nSlotId &&
1171  nWhich < RES_UNKNOWNATR_BEGIN &&
1173  {
1174  // use always the SW-Which Id !
1175  std::unique_ptr<SfxPoolItem> pI(rTextAtr.pAttr->Clone());
1176  pI->SetWhich( nWhich );
1177  // Will this item produce a <w:sz> element?
1178  bool bFontSizeItem = nWhich == RES_CHRATR_FONTSIZE || nWhich == RES_CHRATR_CJK_FONTSIZE;
1179  if (!m_rExport.m_bFontSizeWritten || !bFontSizeItem)
1180  m_rExport.AttrOutput().OutputItem( *pI );
1181  if (bFontSizeItem)
1183  }
1184  }
1185  }
1186 
1187  if( nSwPos < rTextAtr.nStart )
1188  break;
1189  }
1190  m_rExport.m_bFontSizeWritten = false;
1191 
1192  nTmpSwPos = 0; // HasTextItem only allowed in the above area
1193  m_rExport.m_pOutFormatNode = pOldMod;
1194 }
1195 
1196 bool MSWord_SdrAttrIter::IsTextAttr(sal_Int32 nSwPos)
1197 {
1198  return std::any_of(aTextAtrArr.begin(), aTextAtrArr.end(),
1199  [nSwPos](const EECharAttrib& rTextAtr) {
1200  return (nSwPos >= rTextAtr.nStart && nSwPos < rTextAtr.nEnd) &&
1201  (rTextAtr.pAttr->Which() == EE_FEATURE_FIELD ||
1202  rTextAtr.pAttr->Which() == EE_FEATURE_TAB);
1203  }
1204  );
1205 }
1206 
1207 // HasItem is used for the consolidation of the double attribute Underline and
1208 // WordLineMode as a TextItem. OutAttr() calls the output function, which can
1209 // query for other items at the start position of attribute via HasItem().
1210 // Only attributes with an end can be queried.
1211 // The search is done with bDeep.
1212 const SfxPoolItem* MSWord_SdrAttrIter::HasTextItem(sal_uInt16 nWhich) const
1213 {
1215  m_rExport.m_pDoc->GetAttrPool(), nWhich);
1216  if (nWhich)
1217  {
1218  for (const auto& rTextAtr : aTextAtrArr)
1219  {
1220  if (nWhich == rTextAtr.pAttr->Which() && nTmpSwPos >= rTextAtr.nStart && nTmpSwPos < rTextAtr.nEnd)
1221  return rTextAtr.pAttr; // Found
1222  if (nTmpSwPos < rTextAtr.nStart)
1223  return nullptr;
1224  }
1225  }
1226  return nullptr;
1227 }
1228 
1229 const SfxPoolItem& MSWord_SdrAttrIter::GetItem( sal_uInt16 nWhich ) const
1230 {
1232  const SfxPoolItem* pRet = HasTextItem(nWhich);
1233  if (!pRet)
1234  {
1236  nWhich = GetSetWhichFromSwDocWhich(aSet, *m_rExport.m_pDoc, nWhich);
1237  OSL_ENSURE(nWhich, "Impossible, catastrophic failure imminent");
1238  pRet = &aSet.Get(nWhich);
1239  }
1240  return *pRet;
1241 }
1242 
1243 //Drawing shapes properties inherit from a different pool that the document
1244 //styles. On export to .doc[x] they will default to style "Normal". Here explicitly
1245 //set any items which are not already set, but differ from "Normal".
1247 {
1249  (RES_POOLCOLL_STANDARD, false);
1250 
1251  SfxWhichIter aWhichIter(rSet);
1252  for (sal_uInt16 nEEWhich = aWhichIter.FirstWhich(); nEEWhich; nEEWhich = aWhichIter.NextWhich())
1253  {
1254  if (SfxItemState::SET != rSet.GetItemState(nEEWhich, false))
1255  {
1257  *pEditPool, nEEWhich);
1258  if (!nSwWhich)
1259  continue;
1260  bool bWanted = ( bCharAttr ? ( nSwWhich >= RES_CHRATR_BEGIN && nSwWhich < RES_TXTATR_END )
1261  : ( nSwWhich >= RES_PARATR_BEGIN && nSwWhich < RES_FRMATR_END ) );
1262  if (!bWanted)
1263  continue;
1264 
1265  const SfxPoolItem& rDrawItem = rSet.Get(nEEWhich);
1266  const SfxPoolItem& rStandardItem = pC->GetFormatAttr(nSwWhich);
1267  if (rDrawItem != rStandardItem)
1268  rSet.Put(rDrawItem);
1269  }
1270  }
1271 }
1272 
1273 void MSWord_SdrAttrIter::OutParaAttr(bool bCharAttr, const std::set<sal_uInt16>* pWhichsToIgnore)
1274 {
1276 
1277  SetItemsThatDifferFromStandard(bCharAttr, aSet);
1278 
1279  if (!aSet.Count())
1280  return;
1281 
1282  const SfxItemSet* pOldSet = m_rExport.GetCurItemSet();
1283  m_rExport.SetCurItemSet( &aSet );
1284 
1285  SfxItemIter aIter( aSet );
1286  const SfxPoolItem* pItem = aIter.GetCurItem();
1287 
1288  const SfxItemPool* pSrcPool = pEditPool,
1289  * pDstPool = &m_rExport.m_pDoc->GetAttrPool();
1290 
1291  do
1292  {
1293  sal_uInt16 nWhich = pItem->Which();
1294  if (pWhichsToIgnore && pWhichsToIgnore->find(nWhich) != pWhichsToIgnore->end())
1295  continue;
1296 
1297  sal_uInt16 nSlotId = pSrcPool->GetSlotId(nWhich);
1298 
1299  if ( nSlotId && nWhich != nSlotId &&
1300  0 != ( nWhich = pDstPool->GetWhich( nSlotId ) ) &&
1301  nWhich != nSlotId &&
1302  ( bCharAttr ? ( nWhich >= RES_CHRATR_BEGIN && nWhich < RES_TXTATR_END )
1303  : ( nWhich >= RES_PARATR_BEGIN && nWhich < RES_FRMATR_END ) ) )
1304  {
1305  // use always the SW-Which Id !
1306  std::unique_ptr<SfxPoolItem> pI(pItem->Clone());
1307  pI->SetWhich( nWhich );
1310  }
1311  } while ((pItem = aIter.NextItem()));
1312  m_rExport.SetCurItemSet( pOldSet );
1313 }
1314 
1316 {
1317  const OutlinerParaObject* pParaObj = nullptr;
1318  bool bOwnParaObj = false;
1319 
1320  /*
1321  #i13885#
1322  When the object is actively being edited, that text is not set into
1323  the objects normal text object, but lives in a separate object.
1324  */
1325  if (rTextObj.IsTextEditActive())
1326  {
1327  pParaObj = rTextObj.CreateEditOutlinerParaObject().release();
1328  bOwnParaObj = true;
1329  }
1330  else
1331  {
1332  pParaObj = rTextObj.GetOutlinerParaObject();
1333  }
1334 
1335  if( pParaObj )
1336  {
1337  WriteOutliner(*pParaObj, nTyp);
1338  if( bOwnParaObj )
1339  delete pParaObj;
1340  }
1341 }
1342 
1344 {
1345  bool bAnyWrite = false;
1346  const EditTextObject& rEditObj = rParaObj.GetTextObject();
1347  MSWord_SdrAttrIter aAttrIter( *this, rEditObj, nTyp );
1348 
1349  sal_Int32 nPara = rEditObj.GetParagraphCount();
1350  sal_uInt8 bNul = 0;
1351  for( sal_Int32 n = 0; n < nPara; ++n )
1352  {
1353  if( n )
1354  aAttrIter.NextPara( n );
1355 
1356  OSL_ENSURE( pO->empty(), " pO is not empty at start of line" );
1357 
1358  OUString aStr( rEditObj.GetText( n ));
1359  sal_Int32 nCurrentPos = 0;
1360  const sal_Int32 nEnd = aStr.getLength();
1361 
1362  const SfxItemSet& aSet(rEditObj.GetParaAttribs(n));
1363  bool bIsRTLPara = false;
1364  const SfxPoolItem *pItem;
1365  if(SfxItemState::SET == aSet.GetItemState(EE_PARA_WRITINGDIR, true, &pItem))
1366  {
1367  SvxFrameDirection nDir = static_cast<const SvxFrameDirectionItem*>(pItem)->GetValue();
1368  bIsRTLPara = SvxFrameDirection::Horizontal_RL_TB == nDir;
1369  }
1370 
1371  do {
1372  const sal_Int32 nNextAttr = std::min(aAttrIter.WhereNext(), nEnd);
1373 
1374  bool bTextAtr = aAttrIter.IsTextAttr( nCurrentPos );
1375  if( !bTextAtr )
1376  OutSwString(aStr, nCurrentPos, nNextAttr - nCurrentPos);
1377 
1378  // At the end of the line the attributes are extended over the CR.
1379  // exception: foot note at line end
1380  if( nNextAttr == nEnd && !bTextAtr )
1381  WriteCR(); // CR after it
1382 
1383  // output of character attributes
1384  aAttrIter.OutAttr( nCurrentPos ); // nCurrentPos - 1 ??
1385 
1386  if (bIsRTLPara)
1387  {
1388  // This is necessary to make word order correct in MS Word.
1389  // In theory we should do this for complex-script runs only,
1390  // but Outliner does not split runs like Writer core did.
1391  // Fortunately, both MS Word and Writer seems to tolerate
1392  // that we turn it on for non complex-script runs.
1394  }
1395 
1396  m_pChpPlc->AppendFkpEntry( Strm().Tell(),
1397  pO->size(), pO->data() );
1398  pO->clear();
1399 
1400  // exception: foot note at line end
1401  if( nNextAttr == nEnd && bTextAtr )
1402  WriteCR(); // CR after it
1403  nCurrentPos = nNextAttr;
1404  aAttrIter.NextPos();
1405  }
1406  while( nCurrentPos < nEnd );
1407 
1408  OSL_ENSURE( pO->empty(), " pO is not empty at start of line" );
1409 
1410  pO->push_back( bNul ); // Style # as short
1411  pO->push_back( bNul );
1412 
1413  aAttrIter.OutParaAttr(false);
1414 
1415  sal_uLong nPos = Strm().Tell();
1416  m_pPapPlc->AppendFkpEntry( Strm().Tell(),
1417  pO->size(), pO->data() );
1418  pO->clear();
1419  m_pChpPlc->AppendFkpEntry( nPos );
1420  }
1421 
1422  bAnyWrite = 0 != nPara;
1423  if( !bAnyWrite )
1424  WriteStringAsPara( OUString() );
1425 }
1426 
1428 {
1429  //Toplevel groups get their winword extra data attached, and sub elements
1430  //use the defaults
1431  if (rEx.GetGroupLevel() > 1)
1432  return;
1433 
1434  SvStream& rSt = rEx.GetStream();
1435  //The last argument denotes the number of sub properties in this atom
1436  if (mbInline)
1437  {
1438  rEx.AddAtom(18, DFF_msofbtUDefProp, 3, 3); //Prop id is 0xF122
1439  rSt.WriteUInt16( 0x0390 ).WriteUInt32( 3 );
1440  rSt.WriteUInt16( 0x0392 ).WriteUInt32( 3 );
1441  //This sub property is required to be in the dummy inline frame as
1442  //well
1443  rSt.WriteUInt16( 0x053F ).WriteUInt32( nInlineHack );
1444  }
1445  else
1446  {
1447  rEx.AddAtom(24, DFF_msofbtUDefProp, 3, 4 ); //Prop id is 0xF122
1448  rSt.WriteUInt16( 0x038F ).WriteUInt32( mnXAlign );
1449  rSt.WriteUInt16( 0x0390 ).WriteUInt32( mnXRelTo );
1450  rSt.WriteUInt16( 0x0391 ).WriteUInt32( mnYAlign );
1451  rSt.WriteUInt16( 0x0392 ).WriteUInt32( mnYRelTo );
1452  }
1453 }
1454 
1456 {
1457  SfxItemState eBackSet = m_pDoc->GetPageDesc(0).GetMaster().
1458  GetItemState(RES_BACKGROUND);
1459  if (m_pHFSdrObjs->size() || m_pSdrObjs->size() || SfxItemState::SET == eBackSet)
1460  {
1461  OSL_ENSURE( !m_pEscher, "Who did not deleted the pointer?" );
1462  SvMemoryStream* pEscherStrm = new SvMemoryStream;
1463  pEscherStrm->SetEndian(SvStreamEndian::LITTLE);
1464  m_pEscher = new SwEscherEx(pEscherStrm, *this);
1465  }
1466 }
1467 
1469 {
1470  if (m_pEscher)
1471  {
1472  sal_uLong nStart = pTableStrm->Tell();
1473 
1476 
1477  pFib->m_fcDggInfo = nStart;
1478  pFib->m_lcbDggInfo = pTableStrm->Tell() - nStart;
1479  delete m_pEscher;
1480  m_pEscher = nullptr;
1481  }
1482 }
1483 
1485 {
1486  if( SvStream* pPicStrm = static_cast< SwEscherExGlobal& >( *mxGlobal ).GetPictureStream() )
1487  {
1488  // set the blip - entries to the correct stream pos
1489  sal_Int32 nEndPos = rWrt.Strm().Tell();
1490  mxGlobal->SetNewBlipStreamOffset( nEndPos );
1491 
1492  pPicStrm->Seek( 0 );
1493  rWrt.Strm().WriteStream( *pPicStrm );
1494  }
1495  Flush();
1496 }
1497 
1498 // Output- Routines for Escher Export
1499 
1501 {
1502 }
1503 
1505 {
1506 }
1507 
1509 {
1510  // this function will be called exactly once
1511  mxPicStrm = std::make_shared<SvMemoryStream>();
1512  mxPicStrm->SetEndian(SvStreamEndian::LITTLE);
1513  return mxPicStrm.get();
1514 }
1515 
1517  : EscherEx( std::make_shared<SwEscherExGlobal>(), pStrm), rWrt(rWW8Wrt), pEscherStrm(pStrm)
1518 {
1519  Init();
1520 }
1521 
1523 {
1524 }
1525 
1527 {
1529  GetStream().WriteUInt32( 0x80000000 );
1530 }
1531 
1532 void SwBasicEscherEx::WriteEmptyFlyFrame(const SwFrameFormat& rFormat, sal_uInt32 nShapeId)
1533 {
1535  AddShape(ESCHER_ShpInst_PictureFrame, ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty, nShapeId);
1536  // store anchor attribute
1537  WriteFrameExtraData(rFormat);
1538 
1539  AddAtom(6, DFF_msofbtUDefProp, 3, 1); //Prop id is 0xF122
1541 
1542  CloseContainer(); // ESCHER_SpContainer
1543 }
1544 
1545 static ShapeFlag AddMirrorFlags(ShapeFlag nFlags, const SwMirrorGrf &rMirror)
1546 {
1547  switch (rMirror.GetValue())
1548  {
1549  default:
1550  case MirrorGraph::Dont:
1551  break;
1552  case MirrorGraph::Vertical:
1553  nFlags |= ShapeFlag::FlipH;
1554  break;
1556  nFlags |= ShapeFlag::FlipV;
1557  break;
1558  case MirrorGraph::Both:
1559  nFlags |= ShapeFlag::FlipH | ShapeFlag::FlipV;
1560  break;
1561 
1562  }
1563  return nFlags;
1564 }
1565 //For i120928,this function is added to export graphic of bullet
1567 {
1569  AddShape(ESCHER_ShpInst_PictureFrame, ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty, 0x401);
1570  EscherPropertyContainer aPropOpt;
1571  GraphicObject aGraphicObject( rGrf );
1572  OString aUniqueId = aGraphicObject.GetUniqueID();
1573  if ( !aUniqueId.isEmpty() )
1574  {
1575  sal_uInt32 nBlibId = mxGlobal->GetBlibID( *(mxGlobal->QueryPictureStream()), aGraphicObject );
1576  if (nBlibId)
1577  aPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, true);
1578  }
1584  aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
1585  aPropOpt.AddOpt( ESCHER_Prop_dyTextTop, 0 );
1586  aPropOpt.AddOpt( ESCHER_Prop_dyTextBottom, 0 );
1587  aPropOpt.AddOpt( ESCHER_Prop_dxTextLeft, 0 );
1588  aPropOpt.AddOpt( ESCHER_Prop_dxTextRight, 0 );
1589  const Color aTmpColor( COL_WHITE );
1590  std::shared_ptr<SvxBrushItem> aBrush(std::make_shared<SvxBrushItem>(aTmpColor, RES_BACKGROUND));
1591  const SvxBrushItem* pRet = rWrt.GetCurrentPageBgBrush();
1592  if (pRet && (pRet->GetGraphic() ||( pRet->GetColor() != COL_TRANSPARENT)))
1593  aBrush.reset(pRet->Clone());
1594  WriteBrushAttr(*aBrush, aPropOpt);
1595 
1596  aPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0 );
1597  aPropOpt.Commit( GetStream() );
1599  GetStream().WriteUInt32( 0x80000000 );
1600  CloseContainer();
1601 }
1602 
1603 sal_Int32 SwBasicEscherEx::WriteGrfFlyFrame(const SwFrameFormat& rFormat, sal_uInt32 nShapeId)
1604 {
1605  sal_Int32 nBorderThick=0;
1607  SwGrfNode *pGrfNd = pNd ? pNd->GetGrfNode() : nullptr;
1608  OSL_ENSURE(pGrfNd, "No SwGrfNode ?, suspicious");
1609  if (!pGrfNd)
1610  return nBorderThick;
1611 
1613 
1614  const SwMirrorGrf &rMirror = pGrfNd->GetSwAttrSet().GetMirrorGrf();
1616  AddMirrorFlags(ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty, rMirror),
1617  nShapeId);
1618 
1619  EscherPropertyContainer aPropOpt;
1620 
1621  sal_uInt32 nFlags = ESCHER_BlipFlagDefault;
1622 
1623  if (pGrfNd->IsLinkedFile())
1624  {
1625  OUString sURL;
1626  pGrfNd->GetFileFilterNms( &sURL, nullptr );
1627 
1628  ww::bytes aBuf;
1629  SwWW8Writer::InsAsString16( aBuf, sURL );
1630  SwWW8Writer::InsUInt16( aBuf, 0 );
1631 
1632  aPropOpt.AddOpt(ESCHER_Prop_pibName, true, aBuf.size(), aBuf);
1635  }
1636  else
1637  {
1638  const Graphic& aGraphic(pGrfNd->GetGrf());
1639  GraphicObject aGraphicObject( aGraphic );
1640  OString aUniqueId = aGraphicObject.GetUniqueID();
1641 
1642  if (!aUniqueId.isEmpty())
1643  {
1644  sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(), aGraphicObject);
1645  if (nBlibId)
1646  aPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, true);
1647  }
1648  }
1649 
1650  aPropOpt.AddOpt( ESCHER_Prop_pibFlags, nFlags );
1651  nBorderThick = WriteFlyFrameAttr(rFormat,mso_sptPictureFrame,aPropOpt);
1652  WriteGrfAttr(*pGrfNd, rFormat, aPropOpt);
1653 
1654  aPropOpt.Commit( GetStream() );
1655 
1656  // store anchor attribute
1657  WriteFrameExtraData( rFormat );
1658 
1659  CloseContainer(); // ESCHER_SpContainer
1660  return nBorderThick;
1661 }
1662 
1664  EscherPropertyContainer& rPropOpt)
1665 {
1666  const SfxPoolItem* pItem;
1667  GraphicDrawMode nMode = GraphicDrawMode::Standard;
1668  sal_Int32 nContrast = 0;
1669  sal_Int16 nBrightness = 0;
1670 
1671  if (SfxItemState::SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_CONTRAST,
1672  true, &pItem))
1673  {
1674  nContrast = static_cast<const SfxInt16Item*>(pItem)->GetValue();
1675  }
1676 
1677  if (SfxItemState::SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_LUMINANCE,
1678  true, &pItem))
1679  {
1680  nBrightness = static_cast<const SfxInt16Item*>(pItem)->GetValue();
1681  }
1682 
1683  if (SfxItemState::SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_DRAWMODE,
1684  true, &pItem))
1685  {
1686  nMode = static_cast<GraphicDrawMode>(static_cast<const SfxEnumItemInterface*>(pItem)->GetEnumValue());
1687  if (nMode == GraphicDrawMode::Watermark)
1688  {
1689  /*
1690  There is no real watermark mode in word, we must use standard
1691  mode and modify our ones by 70% extra brightness and 70% less
1692  contrast. This means that unmodified default OOo watermark
1693  will turn back into watermark, and modified OOo watermark will
1694  change into a close visual representation in standardmode
1695  */
1696  nBrightness += 70;
1697  if (nBrightness > 100)
1698  nBrightness = 100;
1699  nContrast -= 70;
1700  if (nContrast < -100)
1701  nContrast = -100;
1702  nMode = GraphicDrawMode::Standard;
1703  }
1704  }
1705 
1706  sal_uInt32 nPictureMode;
1707  if (nMode == GraphicDrawMode::Greys)
1708  nPictureMode = 0x40004;
1709  else if (nMode == GraphicDrawMode::Mono)
1710  nPictureMode = 0x60006;
1711  else
1712  nPictureMode = 0;
1713  rPropOpt.AddOpt( ESCHER_Prop_pictureActive, nPictureMode );
1714 
1715  if (nContrast != 0)
1716  {
1717  nContrast+=100;
1718  if (nContrast == 100)
1719  nContrast = 0x10000;
1720  else if (nContrast < 100)
1721  {
1722  nContrast *= 0x10000;
1723  nContrast /= 100;
1724  }
1725  else if (nContrast < 200)
1726  nContrast = (100 * 0x10000) / (200-nContrast);
1727  else
1728  nContrast = 0x7fffffff;
1729  rPropOpt.AddOpt( ESCHER_Prop_pictureContrast, nContrast);
1730  }
1731 
1732  if (nBrightness != 0)
1733  rPropOpt.AddOpt( ESCHER_Prop_pictureBrightness, nBrightness * 327 );
1734 
1735  sal_Int32 nCropL = 0;
1736  sal_Int32 nCropR = 0;
1737  sal_Int32 nCropT = 0;
1738  sal_Int32 nCropB = 0;
1739  if (SfxItemState::SET == rNd.GetSwAttrSet().GetItemState(RES_GRFATR_CROPGRF,
1740  true, &pItem))
1741  {
1742  const SwCropGrf& rCrop = *static_cast<const SwCropGrf*>(pItem);
1743  nCropL += rCrop.GetLeft();
1744  nCropR += rCrop.GetRight();
1745  nCropT += rCrop.GetTop();
1746  nCropB += rCrop.GetBottom();
1747  }
1748 
1749  // simulate border padding as a negative crop.
1750  if (SfxItemState::SET == rFormat.GetItemState(RES_BOX, false, &pItem))
1751  {
1752  const SvxBoxItem& rBox = *static_cast<const SvxBoxItem*>(pItem);
1753  nCropL -= rBox.GetDistance( SvxBoxItemLine::LEFT );
1754  nCropR -= rBox.GetDistance( SvxBoxItemLine::RIGHT );
1755  nCropT -= rBox.GetDistance( SvxBoxItemLine::TOP );
1756  nCropB -= rBox.GetDistance( SvxBoxItemLine::BOTTOM );
1757  }
1758 
1759  const Size aSz( rNd.GetTwipSize() );
1760  if( 0 != nCropL )
1761  rPropOpt.AddOpt( ESCHER_Prop_cropFromLeft, ToFract16( nCropL, aSz.Width()) );
1762  if( 0 != nCropR )
1763  rPropOpt.AddOpt( ESCHER_Prop_cropFromRight, ToFract16( nCropR, aSz.Width()));
1764  if( 0 != nCropT )
1765  rPropOpt.AddOpt( ESCHER_Prop_cropFromTop, ToFract16( nCropT, aSz.Height()));
1766  if( 0 != nCropB )
1767  rPropOpt.AddOpt( ESCHER_Prop_cropFromBottom, ToFract16( nCropB, aSz.Height()));
1768 }
1769 
1770 void SwBasicEscherEx::SetPicId(const SdrObject &, sal_uInt32,
1772 {
1773 }
1774 
1775 void SwEscherEx::SetPicId(const SdrObject &rSdrObj, sal_uInt32 nShapeId,
1776  EscherPropertyContainer &rPropOpt)
1777 {
1778  pTextBxs->Append(rSdrObj, nShapeId);
1779  sal_uInt32 nPicId = pTextBxs->Count();
1780  nPicId *= 0x10000;
1781  rPropOpt.AddOpt( ESCHER_Prop_pictureId, nPicId );
1782 }
1783 
1784 sal_Int32 SwBasicEscherEx::WriteOLEFlyFrame(const SwFrameFormat& rFormat, sal_uInt32 nShapeId)
1785 {
1786  sal_Int32 nBorderThick = 0;
1787  if (const SdrObject* pSdrObj = rFormat.FindRealSdrObject())
1788  {
1789  SwNodeIndex aIdx(*rFormat.GetContent().GetContentIdx(), 1);
1790  SwOLENode& rOLENd = *aIdx.GetNode().GetOLENode();
1791  sal_Int64 nAspect = rOLENd.GetAspect();
1792 
1793  uno::Reference < embed::XEmbeddedObject > xObj(rOLENd.GetOLEObj().GetOleRef());
1794 
1795  // the rectangle is used to transport the size of the object
1796  // the left, top corner is set to ( 0, 0 ) by default constructor,
1797  // if the width and height are set correctly bRectIsSet should be set to true
1798  awt::Rectangle aRect;
1799  bool bRectIsSet = false;
1800 
1801  // TODO/LATER: should the icon size be stored in case of iconified object?
1802  if ( xObj.is() && nAspect != embed::Aspects::MSOLE_ICON )
1803  {
1804  try
1805  {
1806  awt::Size aSize = xObj->getVisualAreaSize( nAspect );
1807  aRect.Width = aSize.Width;
1808  aRect.Height = aSize.Height;
1809  bRectIsSet = true;
1810  }
1811  catch( const uno::Exception& )
1812  {}
1813  }
1814 
1815  /*
1816  #i5970#
1817  Export floating ole2 .doc ver 8+ wmf ole2 previews as emf previews
1818  instead ==> allows unicode text to be preserved
1819  */
1820 #ifdef OLE_PREVIEW_AS_EMF
1821  const Graphic* pGraphic = rOLENd.GetGraphic();
1822 #endif
1824 
1825  EscherPropertyContainer aPropOpt;
1826  const SwMirrorGrf &rMirror = rOLENd.GetSwAttrSet().GetMirrorGrf();
1827  WriteOLEPicture(aPropOpt,
1828  AddMirrorFlags(ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty | ShapeFlag::OLEShape, rMirror),
1829  pGraphic ? *pGraphic : Graphic(), *pSdrObj, nShapeId, bRectIsSet ? &aRect : nullptr );
1830 
1831  nBorderThick = WriteFlyFrameAttr(rFormat, mso_sptPictureFrame, aPropOpt);
1832  WriteGrfAttr(rOLENd, rFormat, aPropOpt);
1833  aPropOpt.Commit(GetStream());
1834 
1835  // store anchor attribute
1836  WriteFrameExtraData( rFormat );
1837 
1838  CloseContainer(); // ESCHER_SpContainer
1839  }
1840  return nBorderThick;
1841 }
1842 
1844  EscherPropertyContainer& rPropOpt)
1845 {
1846  bool bSetOpacity = false;
1847  sal_uInt32 nOpaque = 0;
1848  if (const GraphicObject *pGraphicObject = rBrush.GetGraphicObject())
1849  {
1850  OString aUniqueId = pGraphicObject->GetUniqueID();
1851  if (!aUniqueId.isEmpty())
1852  {
1853  sal_uInt32 nBlibId = mxGlobal->GetBlibID(*QueryPictureStream(), *pGraphicObject);
1854  if (nBlibId)
1855  rPropOpt.AddOpt(ESCHER_Prop_fillBlip,nBlibId,true);
1856  }
1857 
1858  nOpaque = pGraphicObject->GetAttr().GetTransparency();
1859  if (0 != nOpaque)
1860  bSetOpacity = true;
1861 
1863  rPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x140014 );
1864  rPropOpt.AddOpt( ESCHER_Prop_fillBackColor, 0 );
1865  }
1866  else
1867  {
1868  sal_uInt32 nFillColor = GetColor(rBrush.GetColor());
1869  rPropOpt.AddOpt( ESCHER_Prop_fillColor, nFillColor );
1870  rPropOpt.AddOpt( ESCHER_Prop_fillBackColor, nFillColor ^ 0xffffff );
1871  rPropOpt.AddOpt( ESCHER_Prop_fNoFillHitTest, 0x100010 );
1872 
1873  nOpaque = rBrush.GetColor().GetTransparency();
1874  if (0 != nOpaque)
1875  bSetOpacity = true;
1876  }
1877 
1878  if (bSetOpacity)
1879  {
1880  nOpaque = (nOpaque * 100) / 0xFE;
1881  nOpaque = ((100 - nOpaque) << 16) / 100;
1882  rPropOpt.AddOpt(ESCHER_Prop_fillOpacity, nOpaque);
1883  }
1884 }
1885 
1887  MSO_SPT eShapeType, EscherPropertyContainer& rPropOpt)
1888 {
1889  sal_Int32 nLineWidth=0;
1890  const SfxPoolItem* pItem;
1891  bool bFirstLine = true;
1892  if (SfxItemState::SET == rFormat.GetItemState(RES_BOX, true, &pItem))
1893  {
1894  static const o3tl::enumarray<SvxBoxItemLine, sal_uInt16> aExhperProp =
1895  {
1898  };
1899  const SvxBorderLine* pLine;
1900 
1902  {
1903  pLine = static_cast<const SvxBoxItem*>(pItem)->GetLine( n );
1904  if( nullptr != pLine )
1905  {
1906  if( bFirstLine )
1907  {
1908  sal_uInt32 nLineColor = GetColor(pLine->GetColor());
1909  rPropOpt.AddOpt( ESCHER_Prop_lineColor, nLineColor );
1911  nLineColor ^ 0xffffff );
1912 
1913  MSO_LineStyle eStyle;
1914  if( pLine->isDouble() )
1915  {
1916  // double line
1917  nLineWidth = pLine->GetWidth();
1918  if( pLine->GetInWidth() == pLine->GetOutWidth() )
1919  eStyle = mso_lineDouble;
1920  else if( pLine->GetInWidth() < pLine->GetOutWidth() )
1921  eStyle = mso_lineThickThin;
1922  else
1923  eStyle = mso_lineThinThick;
1924  }
1925  else
1926  {
1927  // simple line
1928  eStyle = mso_lineSimple;
1929  nLineWidth = pLine->GetWidth();
1930  }
1931 
1932  rPropOpt.AddOpt( ESCHER_Prop_lineStyle, eStyle );
1933  rPropOpt.AddOpt( ESCHER_Prop_lineWidth,
1934  DrawModelToEmu( nLineWidth ));
1935 
1936  MSO_LineDashing eDashing = mso_lineSolid;
1937  switch (pLine->GetBorderLineStyle())
1938  {
1939  case SvxBorderLineStyle::DASHED:
1940  eDashing = mso_lineDashGEL;
1941  break;
1942  case SvxBorderLineStyle::DOTTED:
1943  eDashing = mso_lineDotGEL;
1944  break;
1945  case SvxBorderLineStyle::SOLID:
1946  default:
1947  break;
1948  }
1949  rPropOpt.AddOpt( ESCHER_Prop_lineDashing, eDashing );
1950  rPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x8000E );
1951 
1952  //Use import logic to determine how much of border will go
1953  //outside graphic
1955  eStyle,eShapeType,nLineWidth);
1956  bFirstLine = false;
1957  }
1958  rPropOpt.AddOpt( aExhperProp[ n ], DrawModelToEmu(
1959  static_cast<const SvxBoxItem*>(pItem)->GetDistance( n ) ));
1960  }
1961  else
1962  rPropOpt.AddOpt( aExhperProp[ n ], DrawModelToEmu(static_cast<const SvxBoxItem*>(pItem)->GetDistance( n )) );
1963  }
1964  }
1965  else
1966  {
1967  rPropOpt.AddOpt( ESCHER_Prop_dyTextTop, 0 );
1968  rPropOpt.AddOpt( ESCHER_Prop_dyTextBottom, 0 );
1969  rPropOpt.AddOpt( ESCHER_Prop_dxTextLeft, 0 );
1970  rPropOpt.AddOpt( ESCHER_Prop_dxTextRight, 0 );
1971  }
1972 
1973  if( bFirstLine ) // no valid line found
1974  {
1975  rPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x80000 );
1976  }
1977  const SwAttrSet& rAttrSet = rFormat.GetAttrSet();
1978  if (SfxItemState::SET == rAttrSet.GetItemState(RES_BOX, false, &pItem))
1979  {
1980  const SvxBoxItem* pBox = static_cast<const SvxBoxItem*>(pItem);
1981  if( pBox )
1982  {
1983  const SfxPoolItem* pShadItem;
1984  if (SfxItemState::SET
1985  == rAttrSet.GetItemState(RES_SHADOW, true, &pShadItem))
1986  {
1987  const SvxShadowItem* pSI = static_cast<const SvxShadowItem*>(pShadItem);
1988 
1989  const sal_uInt16 nCstScale = 635; // unit scale between AOO and MS Word
1990  const sal_uInt32 nShadowType = 131074; // shadow type of ms word. need to set the default value.
1991 
1992  Color nColor = pSI->GetColor();
1993  sal_Int32 nOffX = pSI->GetWidth() * nCstScale;
1994  sal_Int32 nOffY = pSI->GetWidth() * nCstScale;
1995 
1996  SvxShadowLocation eLocation = pSI->GetLocation();
1997  if( (eLocation!=SvxShadowLocation::NONE) && (pSI->GetWidth()!=0) )
1998  {
1999  switch( eLocation )
2000  {
2001  case SvxShadowLocation::TopLeft:
2002  {
2003  nOffX = -nOffX;
2004  nOffY = -nOffY;
2005  }
2006  break;
2007  case SvxShadowLocation::TopRight:
2008  {
2009  nOffY = -nOffY;
2010  }
2011  break;
2012  case SvxShadowLocation::BottomLeft:
2013  {
2014  nOffX = -nOffX;
2015  }
2016  break;
2017  case SvxShadowLocation::BottomRight:
2018  break;
2019  default:
2020  break;
2021  }
2022 
2023  rPropOpt.AddOpt( DFF_Prop_shadowColor, wwUtility::RGBToBGR(nColor));
2024  rPropOpt.AddOpt( DFF_Prop_shadowOffsetX, nOffX );
2025  rPropOpt.AddOpt( DFF_Prop_shadowOffsetY, nOffY );
2026  rPropOpt.AddOpt( DFF_Prop_fshadowObscured, nShadowType );
2027  }
2028  }
2029  }
2030  }
2031 
2032  // SwWW8ImplReader::Read_GrafLayer() imports these as opaque
2033  // unconditionally, so if both are true, don't export the property.
2034  const bool bIsInHeader = sw::IsFlyFrameFormatInHeader(rFormat);
2035  const bool bIsThrough = rFormat.GetSurround().GetValue() == css::text::WrapTextMode_THROUGH;
2036 
2037  // Anything (like a transparent image) that allows text to wrap through should not force a non-transparent background,
2038  // and neither should the commonly seen backgrounds anchored in headers.
2039  if (bIsInHeader || bIsThrough)
2040  {
2041  std::unique_ptr<SvxBrushItem> aBrush(rFormat.makeBackgroundBrushItem());
2042 
2043  if(aBrush)
2044  {
2045  WriteBrushAttr(*aBrush, rPropOpt);
2046  }
2047  }
2048  else
2049  {
2050  // for unknown reasons, force exporting a non-transparent background on fly frames.
2051  std::shared_ptr<SvxBrushItem> aBrush(rWrt.TrueFrameBgBrush(rFormat));
2052 
2053  if(aBrush)
2054  {
2055  WriteBrushAttr(*aBrush, rPropOpt);
2056  }
2057  }
2058 
2059  const SdrObject* pObj = rFormat.FindRealSdrObject();
2060 
2061  if( pObj && (pObj->GetLayer() == GetHellLayerId() ||
2062  pObj->GetLayer() == GetInvisibleHellId() ) && !(bIsInHeader && bIsThrough))
2063  {
2064  rPropOpt.AddOpt( ESCHER_Prop_fPrint, 0x200020 );
2065  }
2066 
2067  PreWriteHyperlinkWithinFly(rFormat,rPropOpt);
2068 
2069  return nLineWidth;
2070 }
2071 
2072 sal_Int32 SwEscherEx::WriteFlyFrameAttr(const SwFrameFormat& rFormat, MSO_SPT eShapeType,
2073  EscherPropertyContainer& rPropOpt)
2074 {
2075  sal_Int32 nLineWidth = SwBasicEscherEx::WriteFlyFrameAttr(rFormat, eShapeType,
2076  rPropOpt);
2077 
2078  /*
2079  These are not in SwBasicEscherEx::WriteFlyFrameAttr because inline objs
2080  can't do it in word and it hacks it in by stretching the graphic that
2081  way, perhaps we should actually draw in this space into the graphic we
2082  are exporting!
2083  */
2084  const SfxPoolItem* pItem;
2085  if (SfxItemState::SET == rFormat.GetItemState(RES_LR_SPACE, true, &pItem))
2086  {
2088  DrawModelToEmu( static_cast<const SvxLRSpaceItem*>(pItem)->GetLeft() ) );
2090  DrawModelToEmu( static_cast<const SvxLRSpaceItem*>(pItem)->GetRight() ) );
2091  }
2092  else
2093  {
2094  rPropOpt.AddOpt( ESCHER_Prop_dxWrapDistLeft, 0 );
2095  rPropOpt.AddOpt( ESCHER_Prop_dxWrapDistRight, 0 );
2096  }
2097 
2098  if (SfxItemState::SET == rFormat.GetItemState(RES_UL_SPACE, true, &pItem))
2099  {
2101  DrawModelToEmu( static_cast<const SvxULSpaceItem*>(pItem)->GetUpper() ) );
2103  DrawModelToEmu( static_cast<const SvxULSpaceItem*>(pItem)->GetLower() ) );
2104  }
2105 
2106  if (rFormat.GetSurround().IsContour())
2107  {
2108  if (const SwNoTextNode *pNd = GetNoTextNodeFromSwFrameFormat(rFormat))
2109  {
2110  const tools::PolyPolygon *pPolyPoly = pNd->HasContour();
2111  if (pPolyPoly && pPolyPoly->Count())
2112  {
2113  tools::Polygon aPoly = CorrectWordWrapPolygonForExport(*pPolyPoly, pNd, /*bCorrectCrop=*/false);
2114  SvMemoryStream aPolyDump;
2115  aPolyDump.SetEndian(SvStreamEndian::LITTLE);
2116 
2117  sal_uInt16 nLen = aPoly.GetSize();
2118  aPolyDump.WriteUInt16( nLen );
2119  aPolyDump.WriteUInt16( nLen );
2120  aPolyDump.WriteUInt16( 8 );
2121  for (sal_uInt16 nI = 0; nI < nLen; ++nI)
2122  {
2123  aPolyDump.WriteUInt32( aPoly[nI].X() );
2124  aPolyDump.WriteUInt32( aPoly[nI].Y() );
2125  }
2126 
2127  rPropOpt.AddOpt(DFF_Prop_pWrapPolygonVertices, false, 0, aPolyDump);
2128  }
2129  }
2130  }
2131 
2132  PreWriteHyperlinkWithinFly(rFormat,rPropOpt);
2133 
2134  return nLineWidth;
2135 }
2136 
2138 {
2139  MapUnit eMap = MapUnit::MapTwip;
2141  {
2142  // PPT works only with units of 576DPI
2143  // WW however is using twips, i.e 1440DPI.
2144  eMap = pModel->GetScaleUnit();
2145  }
2146 
2147  // MS-DFF-Properties mostly are in EMU (English Metric Units)
2148  // 1mm=36000emu, 1twip=635emu
2149  Fraction aFact(360, 1);
2150  aFact /= GetMapFactor(MapUnit::Map100thMM, eMap).X();
2151  // create little values
2152  aFact = Fraction(aFact.GetNumerator(), aFact.GetDenominator());
2153  mnEmuMul = aFact.GetNumerator();
2154  mnEmuDiv = aFact.GetDenominator();
2155 
2157 }
2158 
2159 sal_Int32 SwBasicEscherEx::ToFract16(sal_Int32 nVal, sal_uInt32 nMax)
2160 {
2161  if (nMax)
2162  {
2163  if (nVal >= 0)
2164  {
2165  sal_Int32 nMSVal = (nVal / 65536) * nMax;
2166  nMSVal += (nVal * 65536) / nMax;
2167  return nMSVal;
2168  } else {
2169  // negative fraction does not have "-0", fractional part is always
2170  // positive: -0.4 represented as -1 + 0.6
2171  sal_Int32 const nDiv = (nVal / sal_Int32(nMax)) - 1;
2172  sal_uInt32 nMSVal = (sal_uInt32(nDiv) << 16) & 0xffff0000;
2173  nMSVal += (nVal * 65536) / sal_Int32(nMax) + (-nDiv * 65536);
2174  return nMSVal;
2175  }
2176  }
2177  return 0;
2178 }
2179 
2181 {
2183 }
2184 
2186 {
2187  if( SvStream* pPicStrm = static_cast< SwEscherExGlobal& >( *mxGlobal ).GetPictureStream() )
2188  {
2189  // set the blip - entries to the correct stream pos
2190  sal_Int32 nEndPos = pPicStrm->Tell();
2191  mxGlobal->WriteBlibStoreEntry(*pEscherStrm, 1, nEndPos);
2192 
2193  pPicStrm->Seek(0);
2194  pEscherStrm->WriteStream( *pPicStrm );
2195  }
2196 }
2197 
2199  : SwBasicEscherEx(pStrm, rWW8Wrt),
2200  pTextBxs(nullptr)
2201 {
2204 
2205  sal_uInt16 nColorCount = 4;
2206  pStrm ->WriteUInt16( nColorCount << 4 ) // instance
2207  .WriteUInt16( ESCHER_SplitMenuColors ) // record type
2208  .WriteUInt32( nColorCount * 4 ) // size
2209  .WriteUInt32( 0x08000004 )
2210  .WriteUInt32( 0x08000001 )
2211  .WriteUInt32( 0x08000002 )
2212  .WriteUInt32( 0x100000f7 );
2213 
2214  CloseContainer(); // ESCHER_DggContainer
2215 
2216  sal_uInt8 i = 2; // for header/footer and the other
2217  PlcDrawObj *pSdrObjs = rWrt.m_pHFSdrObjs;
2218  pTextBxs = rWrt.m_pHFTextBxs;
2219 
2220  // if no header/footer -> skip over
2221  if (!pSdrObjs->size())
2222  {
2223  --i;
2224  pSdrObjs = rWrt.m_pSdrObjs;
2225  pTextBxs = rWrt.m_pTextBxs;
2226  }
2227 
2228  for( ; i--; pSdrObjs = rWrt.m_pSdrObjs, pTextBxs = rWrt.m_pTextBxs )
2229  {
2230  // "dummy char" (or any Count ?) - why? Only Microsoft knows it.
2231  GetStream().WriteChar( i );
2232 
2234 
2235  EnterGroup();
2236 
2237  sal_uLong nSecondShapeId = pSdrObjs == rWrt.m_pSdrObjs ? GenerateShapeId() : 0;
2238 
2239  // write now all Writer-/DrawObjects
2240  DrawObjPointerVector aSorted;
2241  MakeZOrderArrAndFollowIds(pSdrObjs->GetObjArr(), aSorted);
2242 
2243  sal_uInt32 nShapeId=0;
2244  for (auto& pObj : aSorted)
2245  {
2246  sal_Int32 nBorderThick=0;
2247  OSL_ENSURE(pObj, "impossible");
2248  if (!pObj)
2249  continue;
2250  const ww8::Frame &rFrame = pObj->maContent;
2251  const SwFrameFormat& rFormat = rFrame.GetFrameFormat();
2252 
2253  switch (rFrame.GetWriterType())
2254  {
2255  case ww8::Frame::eTextBox:
2256  case ww8::Frame::eOle:
2257  case ww8::Frame::eGraphic:
2258  nBorderThick = WriteFlyFrame(*pObj, nShapeId, aSorted);
2259  break;
2261  nShapeId = GenerateShapeId();
2262  WriteOCXControl(rFormat, nShapeId);
2263  break;
2264  case ww8::Frame::eDrawing:
2265  {
2267  const SdrObject* pSdrObj = rFormat.FindRealSdrObject();
2268  if (pSdrObj)
2269  {
2270  nShapeId = AddSdrObject(*pSdrObj);
2271  }
2272 #if OSL_DEBUG_LEVEL > 0
2273  else
2274  OSL_ENSURE( false, "Where is the SDR-Object?" );
2275 #endif
2276  }
2277  break;
2278  default:
2279  break;
2280  }
2281 
2282  if( !nShapeId )
2283  {
2284  nShapeId = AddDummyShape();
2285  }
2286 
2287  pObj->SetShapeDetails(nShapeId, nBorderThick);
2288  }
2289 
2290  EndSdrObjectPage(); // ???? Bugfix for 74724
2291 
2292  if( nSecondShapeId )
2293  {
2295 
2297  ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty | ShapeFlag::Background,
2298  nSecondShapeId );
2299 
2300  EscherPropertyContainer aPropOpt;
2301  const SwFrameFormat &rFormat = rWrt.m_pDoc->GetPageDesc(0).GetMaster();
2302  const SfxPoolItem* pItem = nullptr;
2303  SfxItemState eState = rFormat.GetItemState(RES_BACKGROUND, true,
2304  &pItem);
2305  if (SfxItemState::SET == eState && pItem)
2306  {
2307  const SvxBrushItem* pBrush = static_cast<const SvxBrushItem*>(pItem);
2308  WriteBrushAttr(*pBrush, aPropOpt);
2309 
2311  if( ePos != GPOS_NONE && ePos != GPOS_AREA )
2312  {
2313  /* #i56806# 0x033F parameter specifies a 32-bit field of shape boolean properties.
2314  0x10001 means fBackground and fUsefBackground flag are true thus background
2315  picture will be shown as "tiled" fill.*/
2316  aPropOpt.AddOpt( ESCHER_Prop_fBackground, 0x10001 );
2317  }
2318  }
2319  aPropOpt.AddOpt( ESCHER_Prop_lineColor, 0x8000001 );
2320  aPropOpt.AddOpt( ESCHER_Prop_fNoLineDrawDash, 0x00080008 );
2321  aPropOpt.AddOpt( ESCHER_Prop_shadowColor, 0x8000002 );
2322  aPropOpt.AddOpt( ESCHER_Prop_lineWidth, 0 );
2323 
2324  aPropOpt.Commit( *pStrm );
2325 
2326  AddAtom( 4, ESCHER_ClientData );
2327  GetStream().WriteInt32( 1 );
2328 
2329  CloseContainer(); // ESCHER_SpContainer
2330  }
2331  CloseContainer(); // ESCHER_DgContainer
2332  }
2333 }
2334 
2336 {
2337 }
2338 
2340 {
2341  pEscherStrm->Seek(0);
2343  delete pEscherStrm;
2344  pEscherStrm = nullptr;
2345 }
2346 
2347 
2348 namespace
2349 {
2350  template<typename OrientType>
2351  void lcl_SetRelationOrient(OrientType& rOrient, const sw::WW8AnchorConv eConv, const std::function<void()>& fDefault)
2352  {
2353  switch(eConv)
2354  {
2356  // #i33818#
2357  rOrient.SetRelationOrient(text::RelOrientation::PAGE_PRINT_AREA);
2358  break;
2360  rOrient.SetRelationOrient(text::RelOrientation::PAGE_FRAME);
2361  break;
2363  rOrient.SetRelationOrient(text::RelOrientation::FRAME);
2364  break;
2366  rOrient.SetRelationOrient(text::RelOrientation::CHAR);
2367  break;
2369  rOrient.SetRelationOrient(text::RelOrientation::TEXT_LINE);
2370  break;
2371  default:
2372  fDefault();
2373  }
2374  }
2375 }
2402  SwFormatVertOrient& _iorVertOri,
2403  const SwFrameFormat& _rFrameFormat )
2404 {
2405  const RndStdIds eAnchor = _rFrameFormat.GetAnchor().GetAnchorId();
2406 
2407  if ( (RndStdIds::FLY_AS_CHAR == eAnchor) || (RndStdIds::FLY_AT_FLY == eAnchor) )
2408  {
2409  // no conversion for as-character or at frame anchored objects
2410  return false;
2411  }
2412 
2413  // determine value of attribute 'Follow text flow', because positions aligned
2414  // at page areas have to be converted, if it's set.
2415  const bool bFollowTextFlow = _rFrameFormat.GetFollowTextFlow().GetValue();
2416 
2417  // check, if horizontal and vertical position have to be converted due to
2418  // the fact, that the object is anchored at a paragraph, which has a "column
2419  // break before" attribute
2420  bool bConvDueToAnchoredAtColBreakPara( false );
2421  if ( ( (eAnchor == RndStdIds::FLY_AT_PARA) || (eAnchor == RndStdIds::FLY_AT_CHAR) ) &&
2422  _rFrameFormat.GetAnchor().GetContentAnchor() &&
2423  _rFrameFormat.GetAnchor().GetContentAnchor()->nNode.GetNode().IsTextNode() )
2424  {
2425  SwTextNode& rAnchorTextNode =
2426  dynamic_cast<SwTextNode&>(_rFrameFormat.GetAnchor().GetContentAnchor()->nNode.GetNode());
2427  const SvxFormatBreakItem& rBreak = ItemGet<SvxFormatBreakItem>(rAnchorTextNode, RES_BREAK);
2428  if (rBreak.GetBreak() == SvxBreak::ColumnBefore)
2429  {
2430  bConvDueToAnchoredAtColBreakPara = true;
2431  }
2432  }
2433 
2436  // convert horizontal position, if needed
2437  {
2438 
2439  // determine, if conversion has to be performed due to the position orientation
2440  bool bConvDueToOrientation( false );
2441  {
2442  const sal_Int16 eHOri = _iorHoriOri.GetHoriOrient();
2443  bConvDueToOrientation = eHOri == text::HoriOrientation::LEFT || eHOri == text::HoriOrientation::RIGHT ||
2444  eHOri == text::HoriOrientation::INSIDE || eHOri == text::HoriOrientation::OUTSIDE ||
2445  ( eHOri != text::HoriOrientation::CENTER && _iorHoriOri.IsPosToggle() );
2446  }
2447 
2448  // determine conversion type due to the position relation
2449  if ( bConvDueToAnchoredAtColBreakPara )
2450  {
2451  eHoriConv = sw::WW8AnchorConv::CONV2PG;
2452  }
2453  else if ( _iorHoriOri.IsPosToggle()
2454  && _iorHoriOri.GetHoriOrient() == text::HoriOrientation::RIGHT )
2455  {
2456  eHoriConv = sw::WW8AnchorConv::NO_CONV;
2457  _iorHoriOri.SetHoriOrient( text::HoriOrientation::OUTSIDE );
2458  }
2459  else
2460  {
2461  switch ( _iorHoriOri.GetRelationOrient() )
2462  {
2463  case text::RelOrientation::PAGE_FRAME:
2464  case text::RelOrientation::PAGE_PRINT_AREA:
2465  {
2466  if ( bConvDueToOrientation || bFollowTextFlow )
2467  eHoriConv = sw::WW8AnchorConv::CONV2PG;
2468  }
2469  break;
2470  case text::RelOrientation::PAGE_LEFT:
2471  case text::RelOrientation::PAGE_RIGHT:
2472  {
2473  // relation not supported by WW8. Thus, conversion always needed.
2474  eHoriConv = sw::WW8AnchorConv::CONV2PG;
2475  }
2476  break;
2477  case text::RelOrientation::FRAME:
2478  {
2479  if ( bConvDueToOrientation )
2481  }
2482  break;
2483  case text::RelOrientation::PRINT_AREA:
2484  case text::RelOrientation::FRAME_LEFT:
2485  case text::RelOrientation::FRAME_RIGHT:
2486  {
2487  // relation not supported by WW8. Thus, conversion always needed.
2489  }
2490  break;
2491  case text::RelOrientation::CHAR:
2492  {
2493  if ( bConvDueToOrientation )
2494  eHoriConv = sw::WW8AnchorConv::CONV2CHAR;
2495  }
2496  break;
2497  default:
2498  OSL_FAIL( "<WinwordAnchoring::ConvertPosition(..)> - unknown horizontal relation" );
2499  }
2500  }
2501  }
2502 
2503  // convert vertical position, if needed
2504  {
2505 
2506  // determine, if conversion has to be performed due to the position orientation
2507  bool bConvDueToOrientation( false );
2508  {
2509  const sal_Int16 eVOri = _iorVertOri.GetVertOrient();
2510  bConvDueToOrientation = ( eVOri == text::VertOrientation::TOP ||
2511  eVOri == text::VertOrientation::BOTTOM ||
2512  eVOri == text::VertOrientation::CHAR_TOP ||
2513  eVOri == text::VertOrientation::CHAR_BOTTOM ||
2514  eVOri == text::VertOrientation::CHAR_CENTER ||
2515  eVOri == text::VertOrientation::LINE_TOP ||
2516  eVOri == text::VertOrientation::LINE_BOTTOM ||
2517  eVOri == text::VertOrientation::LINE_CENTER );
2518  }
2519 
2520  // determine conversion type due to the position relation
2521  if ( bConvDueToAnchoredAtColBreakPara )
2522  {
2523  eVertConv = sw::WW8AnchorConv::CONV2PG;
2524  }
2525  else
2526  {
2527  switch ( _iorVertOri.GetRelationOrient() )
2528  {
2529  case text::RelOrientation::PAGE_FRAME:
2530  case text::RelOrientation::PAGE_PRINT_AREA:
2531  {
2532  if ( bConvDueToOrientation || bFollowTextFlow )
2533  eVertConv = sw::WW8AnchorConv::CONV2PG;
2534  }
2535  break;
2536  case text::RelOrientation::FRAME:
2537  {
2538  if ( bConvDueToOrientation ||
2539  _iorVertOri.GetVertOrient() == text::VertOrientation::CENTER )
2540  {
2542  }
2543  }
2544  break;
2545  case text::RelOrientation::PRINT_AREA:
2546  {
2547  // relation not supported by WW8. Thus, conversion always needed.
2549  }
2550  break;
2551  case text::RelOrientation::CHAR:
2552  {
2553  // relation not supported by WW8. Thus, conversion always needed.
2555  }
2556  break;
2557  case text::RelOrientation::TEXT_LINE:
2558  {
2559  if ( bConvDueToOrientation ||
2560  _iorVertOri.GetVertOrient() == text::VertOrientation::NONE )
2561  {
2562  eVertConv = sw::WW8AnchorConv::CONV2LINE;
2563  }
2564  }
2565  break;
2566  case text::RelOrientation::PAGE_LEFT:
2567  case text::RelOrientation::PAGE_RIGHT:
2568  case text::RelOrientation::FRAME_LEFT:
2569  case text::RelOrientation::FRAME_RIGHT:
2570  default:
2571  OSL_FAIL( "<WinwordAnchoring::ConvertPosition(..)> - unknown vertical relation" );
2572  }
2573  }
2574 
2575  }
2576  if (eVertConv != sw::WW8AnchorConv::NO_CONV || eHoriConv != sw::WW8AnchorConv::NO_CONV)
2577  {
2578  sw::WW8AnchorConvResult aResult(eHoriConv, eVertConv);
2579  _rFrameFormat.CallSwClientNotify(sw::WW8AnchorConvHint(aResult));
2580  if(!aResult.m_bConverted)
2581  return false;
2582  if (eHoriConv != sw::WW8AnchorConv::NO_CONV)
2583  {
2584  lcl_SetRelationOrient(_iorHoriOri, eHoriConv, [&_iorHoriOri]() {_iorHoriOri.SetHoriOrient(text::HoriOrientation::NONE);} );
2585  _iorHoriOri.SetPos(aResult.m_aPos.X());
2586  }
2587  if (eVertConv != sw::WW8AnchorConv::NO_CONV)
2588  {
2589  lcl_SetRelationOrient(_iorVertOri, eVertConv, [&_iorVertOri]() {_iorVertOri.SetVertOrient(text::VertOrientation::NONE);} );
2590  _iorVertOri.SetPos(aResult.m_aPos.Y());
2591  }
2592  return true;
2593  }
2594  return false;
2595 }
2596 
2598 {
2599  const RndStdIds eAnchor = rFormat.GetAnchor().GetAnchorId();
2600  mbInline = (eAnchor == RndStdIds::FLY_AS_CHAR);
2601 
2602  SwFormatHoriOrient rHoriOri = rFormat.GetHoriOrient();
2603  SwFormatVertOrient rVertOri = rFormat.GetVertOrient();
2604 
2605  // #i30669# - convert the positioning attributes.
2606  // Most positions are converted, if layout information exists.
2607  const bool bPosConverted = ConvertPosition( rHoriOri, rVertOri, rFormat );
2608 
2609  const sal_Int16 eHOri = rHoriOri.GetHoriOrient();
2610  const sal_Int16 eVOri = rVertOri.GetVertOrient(); // #i22673#
2611 
2612  const sal_Int16 eHRel = rHoriOri.GetRelationOrient();
2613  const sal_Int16 eVRel = rVertOri.GetRelationOrient();
2614 
2615  // horizontal Adjustment
2616  switch (eHOri)
2617  {
2618  default:
2620  mnXAlign = 0;
2621  break;
2622  case text::HoriOrientation::LEFT:
2623  mnXAlign = 1;
2624  break;
2625  case text::HoriOrientation::CENTER:
2626  mnXAlign = 2;
2627  break;
2628  case text::HoriOrientation::RIGHT:
2629  mnXAlign = 3;
2630  break;
2631  case text::HoriOrientation::INSIDE:
2632  mnXAlign = 4;
2633  break;
2634  case text::HoriOrientation::OUTSIDE:
2635  mnXAlign = 5;
2636  break;
2637  }
2638 
2639  // vertical Adjustment
2640  // #i22673#
2641  // When adjustment is vertically relative to line or to char
2642  // bottom becomes top and vice versa
2643  const bool bVertSwap = !bPosConverted &&
2644  ( (eVRel == text::RelOrientation::CHAR) ||
2645  (eVRel == text::RelOrientation::TEXT_LINE) );
2646  switch (eVOri)
2647  {
2648  default:
2650  mnYAlign = 0;
2651  break;
2652  case text::VertOrientation::TOP:
2653  case text::VertOrientation::LINE_TOP:
2654  case text::VertOrientation::CHAR_TOP:
2655  mnYAlign = bVertSwap ? 3 : 1;
2656  break;
2657  case text::VertOrientation::CENTER:
2658  case text::VertOrientation::LINE_CENTER:
2659  mnYAlign = 2;
2660  break;
2661  case text::VertOrientation::BOTTOM:
2662  case text::VertOrientation::LINE_BOTTOM:
2663  case text::VertOrientation::CHAR_BOTTOM:
2664  mnYAlign = bVertSwap ? 1 : 3;
2665  break;
2666  }
2667 
2668  // Adjustment is horizontally relative to...
2669  switch (eHRel)
2670  {
2671  case text::RelOrientation::PAGE_PRINT_AREA:
2672  mnXRelTo = 0;
2673  break;
2674  case text::RelOrientation::PAGE_FRAME:
2675  case text::RelOrientation::PAGE_LEFT: //:-(
2676  case text::RelOrientation::PAGE_RIGHT: //:-(
2677  mnXRelTo = 1;
2678  break;
2679  case text::RelOrientation::FRAME:
2680  case text::RelOrientation::FRAME_LEFT: //:-(
2681  case text::RelOrientation::FRAME_RIGHT: //:-(
2682  if (eAnchor == RndStdIds::FLY_AT_PAGE)
2683  mnXRelTo = 1;
2684  else
2685  mnXRelTo = 2;
2686  break;
2687  case text::RelOrientation::PRINT_AREA:
2688  if (eAnchor == RndStdIds::FLY_AT_PAGE)
2689  mnXRelTo = 0;
2690  else
2691  mnXRelTo = 2;
2692  break;
2693  case text::RelOrientation::CHAR:
2694  mnXRelTo = 3;
2695  break;
2696  case text::RelOrientation::TEXT_LINE:
2697  break;
2698  }
2699 
2700  // Adjustment is vertically relative to...
2701  switch (eVRel)
2702  {
2703  case text::RelOrientation::PAGE_PRINT_AREA:
2704  mnYRelTo = 0;
2705  break;
2706  case text::RelOrientation::PAGE_FRAME:
2707  mnYRelTo = 1;
2708  break;
2709  case text::RelOrientation::PRINT_AREA:
2710  if (eAnchor == RndStdIds::FLY_AT_PAGE)
2711  mnYRelTo = 0;
2712  else
2713  mnYRelTo = 2;
2714  break;
2715  case text::RelOrientation::FRAME:
2716  if (eAnchor == RndStdIds::FLY_AT_PAGE)
2717  mnYRelTo = 1;
2718  else
2719  mnYRelTo = 2;
2720  break;
2721  case text::RelOrientation::CHAR:
2722  case text::RelOrientation::TEXT_LINE: // #i22673# - vertical alignment at top of line
2723  case text::RelOrientation::PAGE_LEFT: //nonsense
2724  case text::RelOrientation::PAGE_RIGHT: //nonsense
2725  case text::RelOrientation::FRAME_LEFT: //nonsense
2726  case text::RelOrientation::FRAME_RIGHT: //nonsense
2727  mnYRelTo = 3;
2728  break;
2729  }
2730 }
2731 
2733 {
2736 
2738  GetStream().WriteInt32( 0 );
2739 
2741  GetStream().WriteInt32( 1 );
2742 }
2743 
2744 sal_Int32 SwEscherEx::WriteFlyFrame(const DrawObj &rObj, sal_uInt32 &rShapeId,
2745  DrawObjPointerVector &rPVec)
2746 {
2747  const SwFrameFormat &rFormat = rObj.maContent.GetFrameFormat();
2748 
2749  // check for textflyframe and if it is the first in a Chain
2750  sal_Int32 nBorderThick = 0;
2751  const SwNodeIndex* pNdIdx = rFormat.GetContent().GetContentIdx();
2752  if( pNdIdx )
2753  {
2754  SwNodeIndex aIdx( *pNdIdx, 1 );
2755  switch( aIdx.GetNode().GetNodeType() )
2756  {
2757  case SwNodeType::Grf:
2758  rShapeId = GenerateShapeId();
2759  nBorderThick = WriteGrfFlyFrame( rFormat, rShapeId );
2760  break;
2761  case SwNodeType::Ole:
2762  rShapeId = GenerateShapeId();
2763  nBorderThick = WriteOLEFlyFrame( rFormat, rShapeId );
2764  break;
2765  default:
2766  if (const SdrObject* pObj = rFormat.FindRealSdrObject())
2767  {
2768  // check for the first in a Chain
2769  sal_uInt32 nTextId;
2770  sal_uInt16 nOff = 0;
2771  const SwFrameFormat* pFormat = &rFormat, *pPrev;
2772  while( nullptr != ( pPrev = pFormat->GetChain().GetPrev() ))
2773  {
2774  ++nOff;
2775  pFormat = pPrev;
2776  }
2777 
2778  rShapeId = GetFlyShapeId(rFormat, rObj.mnHdFtIndex, rPVec);
2779  if( !nOff )
2780  {
2781  nTextId = pTextBxs->GetPos( pObj );
2782  if( USHRT_MAX == nTextId )
2783  {
2784  pTextBxs->Append( *pObj, rShapeId );
2785  nTextId = pTextBxs->Count();
2786  }
2787  else
2788  ++nTextId;
2789  }
2790  else
2791  {
2792  const SdrObject* pPrevObj = pFormat->FindRealSdrObject();
2793  nTextId = pTextBxs->GetPos( pPrevObj );
2794  if( USHRT_MAX == nTextId )
2795  {
2796  sal_uInt32 nPrevShapeId =
2797  GetFlyShapeId(*pFormat, rObj.mnHdFtIndex, rPVec);
2798  pTextBxs->Append( *pPrevObj, nPrevShapeId );
2799  nTextId = pTextBxs->Count();
2800  }
2801  else
2802  ++nTextId;
2803  }
2804  nTextId *= 0x10000;
2805  nTextId += nOff;
2806 
2807  nBorderThick = WriteTextFlyFrame(rObj, rShapeId, nTextId, rPVec);
2808  }
2809 
2810  //In browse mode the sdr object doesn't always exist. For example, the
2811  //object is in the hidden header/footer. We save the fmt directly
2812  //in such cases; we copy most of the logic from the block above
2813  const bool bBrowseMode = rFormat.getIDocumentSettingAccess().get(DocumentSettingId::BROWSE_MODE);
2814  if( bBrowseMode && rFormat.GetDoc())
2815  {
2816  if( !rFormat.GetChain().GetPrev() )//obj in header/footer?
2817  {
2818  rShapeId = GetFlyShapeId(rFormat, rObj.mnHdFtIndex, rPVec);
2819  pTextBxs->Append( &rFormat, rShapeId );
2820  sal_uInt32 nTextId = pTextBxs->Count();
2821 
2822  nTextId *= 0x10000;
2823  nBorderThick = WriteTextFlyFrame(rObj, rShapeId, nTextId, rPVec);
2824  }
2825  }
2826 
2827  }
2828  }
2829  return nBorderThick;
2830 }
2831 
2832 static sal_uInt16 FindPos(const SwFrameFormat &rFormat, unsigned int nHdFtIndex,
2833  DrawObjPointerVector &rPVec)
2834 {
2835  auto aIter = std::find_if(rPVec.begin(), rPVec.end(),
2836  [&rFormat, nHdFtIndex](const DrawObj* pObj) {
2837  OSL_ENSURE(pObj, "Impossible");
2838  return pObj &&
2839  nHdFtIndex == pObj->mnHdFtIndex &&
2840  &rFormat == (&pObj->maContent.GetFrameFormat());
2841  });
2842  if (aIter != rPVec.end())
2843  return static_cast< sal_uInt16 >(aIter - rPVec.begin());
2844  return USHRT_MAX;
2845 }
2846 
2847 sal_Int32 SwEscherEx::WriteTextFlyFrame(const DrawObj &rObj, sal_uInt32 nShapeId,
2848  sal_uInt32 nTextBox, DrawObjPointerVector &rPVec)
2849 {
2850  const SwFrameFormat &rFormat = rObj.maContent.GetFrameFormat();
2851  SvxFrameDirection nDirection = rObj.mnDirection;
2852 
2853  sal_Int32 nBorderThick=0;
2855 
2856  AddShape( ESCHER_ShpInst_TextBox, ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty, nShapeId );
2857  EscherPropertyContainer aPropOpt;
2858  aPropOpt.AddOpt(ESCHER_Prop_lTxid, nTextBox);
2859  if (const SwFrameFormat *pNext = rFormat.GetChain().GetNext())
2860  {
2861  sal_uInt16 nPos = FindPos(*pNext, rObj.mnHdFtIndex, rPVec);
2862  if (USHRT_MAX != nPos && aFollowShpIds[nPos])
2863  aPropOpt.AddOpt(ESCHER_Prop_hspNext, aFollowShpIds[nPos]);
2864  }
2865  nBorderThick = WriteFlyFrameAttr( rFormat, mso_sptTextBox, aPropOpt );
2866 
2867  MSO_TextFlow nFlow;
2868 
2869  switch (nDirection)
2870  {
2871  default:
2872  OSL_ENSURE(false, "unknown direction type");
2873  [[fallthrough]];
2874  case SvxFrameDirection::Horizontal_LR_TB:
2875  nFlow=mso_txflHorzN;
2876  break;
2877  case SvxFrameDirection::Horizontal_RL_TB:
2878  nFlow=mso_txflHorzN;
2879  break;
2880  case SvxFrameDirection::Vertical_LR_TB: //not really possible in word
2881  case SvxFrameDirection::Vertical_RL_TB:
2882  nFlow=mso_txflTtoBA;
2883  break;
2884  case SvxFrameDirection::Vertical_LR_BT:
2885  nFlow = mso_txflBtoT;
2886  break;
2887  }
2888  aPropOpt.AddOpt( ESCHER_Prop_txflTextFlow, nFlow );
2889 
2890  aPropOpt.Commit( GetStream() );
2891 
2892  // store anchor attribute
2893  WriteFrameExtraData( rFormat );
2894 
2895  AddAtom( 4, ESCHER_ClientTextbox ); GetStream().WriteUInt32( nTextBox );
2896 
2897  CloseContainer(); // ESCHER_SpContainer
2898  return nBorderThick;
2899 }
2900 
2902  ShapeFlag nShapeFlags, const Graphic &rGraphic, const SdrObject &rObj,
2903  sal_uInt32 nShapeId, const awt::Rectangle* pVisArea )
2904 {
2905  //nShapeFlags == 0xA00 + flips and ole active
2906  AddShape(ESCHER_ShpInst_PictureFrame, nShapeFlags, nShapeId);
2907 
2908  GraphicObject aGraphicObject(rGraphic);
2909  OString aId = aGraphicObject.GetUniqueID();
2910  if (!aId.isEmpty())
2911  {
2912  // SJ: the third parameter (pVisArea) should be set...
2913  sal_uInt32 nBlibId = mxGlobal->GetBlibID( *QueryPictureStream(), aGraphicObject, pVisArea);
2914  if (nBlibId)
2915  rPropOpt.AddOpt(ESCHER_Prop_pib, nBlibId, true);
2916  }
2917 
2918  SetPicId(rObj, nShapeId, rPropOpt);
2919  rPropOpt.AddOpt( ESCHER_Prop_pictureActive, 0x10000 );
2920 }
2921 
2922 void SwEscherEx::WriteOCXControl( const SwFrameFormat& rFormat, sal_uInt32 nShapeId )
2923 {
2924  const SdrObject* pSdrObj = rFormat.FindRealSdrObject();
2925  if (!pSdrObj)
2926  return;
2927 
2929 
2932  OSL_ENSURE(pModel && pDevice, "no model or device");
2933 
2934  // #i71538# use complete SdrViews
2935  // SdrExchangeView aExchange(pModel, pDevice);
2936  SdrView aExchange(*pModel, pDevice);
2937  const Graphic aGraphic(SdrExchangeView::GetObjGraphic(*pSdrObj));
2938  EscherPropertyContainer aPropOpt;
2939  WriteOLEPicture(aPropOpt,
2940  ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty | ShapeFlag::OLEShape, aGraphic,
2941  *pSdrObj, nShapeId, nullptr );
2942 
2943  WriteFlyFrameAttr( rFormat, mso_sptPictureFrame , aPropOpt );
2944  aPropOpt.Commit( GetStream() );
2945 
2946  // store anchor attribute
2947  WriteFrameExtraData( rFormat );
2948 
2949  CloseContainer(); // ESCHER_SpContainer
2950 
2951 }
2952 
2954  std::vector<DrawObj>& rSrcArr, DrawObjPointerVector&rDstArr)
2955 {
2956  ::lcl_makeZOrderArray(rWrt, rSrcArr, rDstArr);
2957 
2958  //Now set up the follow IDs
2959  aFollowShpIds.clear();
2960 
2961  for (DrawObj* p : rDstArr)
2962  {
2963  const SwFrameFormat &rFormat = p->maContent.GetFrameFormat();
2964  bool bNeedsShapeId = false;
2965 
2966  if (RES_FLYFRMFMT == rFormat.Which())
2967  {
2968  const SwFormatChain &rChain = rFormat.GetChain();
2969  if (rChain.GetPrev() || rChain.GetNext())
2970  bNeedsShapeId = true;
2971  }
2972 
2973  sal_uLong nShapeId = bNeedsShapeId ? GenerateShapeId() : 0;
2974 
2975  aFollowShpIds.push_back(nShapeId);
2976  }
2977 }
2978 
2979 sal_uInt32 SwEscherEx::GetFlyShapeId(const SwFrameFormat& rFormat,
2980  unsigned int nHdFtIndex, DrawObjPointerVector &rpVec)
2981 {
2982  sal_uInt16 nPos = FindPos(rFormat, nHdFtIndex, rpVec);
2983  sal_uInt32 nShapeId;
2984  if (USHRT_MAX != nPos)
2985  {
2986  nShapeId = aFollowShpIds[nPos];
2987  if (0 == nShapeId)
2988  {
2989  nShapeId = GenerateShapeId();
2990  aFollowShpIds[ nPos ] = nShapeId;
2991  }
2992  }
2993  else
2994  nShapeId = GenerateShapeId();
2995  return nShapeId;
2996 }
2997 
2999  const uno::Reference< drawing::XShape>& xXShapeRef, sal_uInt32 nShapeId )
3000 {
3001  sal_uInt32 nId = 0;
3002  if (SdrObject* pObj = GetSdrObjectFromXShape(xXShapeRef))
3003  {
3004  pTextBxs->Append( *pObj, nShapeId );
3005  nId = pTextBxs->Count();
3006  nId *= 0x10000;
3007  }
3008  return nId;
3009 }
3010 
3012 ::ole::MSConvertOCXControls( pDSh ? pDSh->GetModel() : nullptr ), pPaM( pP ), mnObjectId(0)
3013 {
3014 }
3015 
3016 
3017 // in transitioning away old filter for ole/ocx controls, ReadOCXStream has been made pure virtual in
3018 // filter/source/msocximex.cxx, so... we need an implementation here
3020  css::uno::Reference< css::drawing::XShape > *pShapeRef,
3021  bool bFloatingCtrl )
3022 {
3023  uno::Reference< form::XFormComponent > xFComp;
3024  bool bRes = oox::ole::MSConvertOCXControls::ReadOCXStorage( rSrc1, xFComp );
3025  if ( bRes && xFComp.is() )
3026  {
3027  css::awt::Size aSz; // not used in import
3028  bRes = InsertControl( xFComp, aSz,pShapeRef,bFloatingCtrl);
3029  }
3030  return bRes;
3031 }
3032 
3034 {
3035  const uno::Reference< awt::XControlModel >& xControlModel =
3036  rFormObj.GetUnoControlModel();
3037 
3038  //Why oh lord do we use so many different units ?
3039  //I think I painted myself into a little bit of a
3040  //corner by trying to use the uno interface for
3041  //controls export
3042  tools::Rectangle aRect = rFormObj.GetLogicRect();
3043  aRect.SetPos(Point(0,0));
3044  awt::Size aSize;
3045  aSize.Width = TWIPS_TO_MM(aRect.Right());
3046  aSize.Height = TWIPS_TO_MM(aRect.Bottom());
3047 
3048  //Open the ObjectPool
3050 
3051  //Create a destination storage for the microsoft control
3052  sal_uInt32 nObjId = ++mnObjectId;
3053  OUString sStorageName = "_" + OUString::number( static_cast<sal_Int64>( nObjId ));
3054  tools::SvRef<SotStorage> xOleStg = xObjPool->OpenSotStorage(sStorageName);
3055 
3056  if (!xOleStg.is())
3057  return;
3058 
3059  OUString sUName;
3060  if (!WriteOCXStream( mxModel, xOleStg,xControlModel,aSize,sUName))
3061  return;
3062 
3063  sal_uInt8 aSpecOLE[] =
3064  {
3065  0x03, 0x6a, 0xFF, 0xFF, 0xFF, 0xFF, // sprmCPicLocation
3066  0x0a, 0x08, 1, // sprmCFOLE2
3067  0x55, 0x08, 1, // sprmCFSpec
3068  0x56, 0x08, 1 // sprmCFObj
3069  };
3070  //Set the obj id into the sprmCPicLocation
3071  sal_uInt8 *pData = aSpecOLE+2;
3072  Set_UInt32(pData,nObjId );
3073 
3074  OUString sField = FieldString(ww::eCONTROL) + "Forms." + sUName + ".1 \\s ";
3075 
3076  rWW8Wrt.OutputField(nullptr, ww::eCONTROL, sField,
3078 
3079  rWW8Wrt.m_pChpPlc->AppendFkpEntry(rWW8Wrt.Strm().Tell(),sizeof(aSpecOLE),
3080  aSpecOLE);
3081  rWW8Wrt.WriteChar( 0x1 );
3082  rWW8Wrt.OutputField(nullptr, ww::eCONTROL, OUString(), FieldFlags::End | FieldFlags::Close);
3083 }
3084 
3085 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
mso_lineSolid
sal_uInt16 Count() const
Point TopLeft() const
constexpr TypedWhichId< SwCropGrf > RES_GRFATR_CROPGRF(132)
constexpr TypedWhichId< SwDrawModeGrf > RES_GRFATR_DRAWMODE(142)
bool GetValue() const
sal_Int32 nCurrentSwPos
Definition: wrtww8.hxx:1460
long getHeight() const
bool is() const
#define ESCHER_DgContainer
virtual void RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart, sal_uInt32 nLen) const override
Definition: wrtw8esh.cxx:853
void SetPos(const Point &rPoint)
bool IsContour() const
Definition: fmtsrnd.hxx:53
SvStream * pEscherStrm
Definition: escher.hxx:98
eFORMDROPDOWN
Exporter of the binary Word file formats.
Definition: wrtww8.hxx:986
sal_uInt32 mnObjectId
Definition: ww8par.hxx:752
void OutAttr(sal_Int32 nSwPos)
Definition: wrtw8esh.cxx:1116
virtual AttributeOutputBase & AttrOutput() const =0
Access to the attribute output class.
constexpr TypedWhichId< SfxInt16Item > RES_CHRATR_BIDIRTL(44)
sal_Int32 WhereNext() const
Definition: wrtww8.hxx:1487
SwNoTextNode * GetNoTextNodeFromSwFrameFormat(const SwFrameFormat &rFormat)
Get the SwNoTextNode associated with a SwFrameFormat if here is one.
sal_Int64 GetAspect() const
Definition: ndole.hxx:136
WW8AnchorConv
Definition: frmfmt.hxx:294
static ShapeFlag AddMirrorFlags(ShapeFlag nFlags, const SwMirrorGrf &rMirror)
Definition: wrtw8esh.cxx:1545
void setHeight(long n)
std::unique_ptr< ww::bytes > pO
Buffer.
Definition: wrtww8.hxx:989
SvStream * pTableStrm
Definition: wrtww8.hxx:991
Represents the style of a paragraph.
Definition: fmtcol.hxx:55
unsigned int GetHdFtIndex() const
Definition: wrtww8.hxx:1131
bool IsSaveRelFSys() const
void OutSwString(const OUString &, sal_Int32 nStt, sal_Int32 nLen)
Definition: wrtww8.cxx:1855
bool RTLGraphicsHack(SwTwips &rLeft, SwTwips nWidth, sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft, SwTwips nPageRight, SwTwips nPageSize)
Definition: wrtw8esh.cxx:529
sal_Int32 GetLeft() const
void OutEEField(const SfxPoolItem &rHt)
Definition: wrtw8esh.cxx:1098
std::unique_ptr< WW8_WrPlcField > m_pFieldHFTextBxs
Definition: wrtww8.hxx:527
std::unique_ptr< WW8Fib > pFib
File Information Block.
Definition: wrtww8.hxx:993
virtual AttributeOutputBase & AttrOutput() const override
memory leak #i120098#, to hold the reference to unnamed SotStorage obj
Definition: wrtww8.cxx:3939
sal_uInt32 GetSdrOrdNum(const SwFrameFormat &rFormat) const
Definition: wrtw8esh.cxx:949
#define ESCHER_Prop_dyWrapDistBottom
constexpr sal_uInt16 EE_FEATURE_TAB(EE_FEATURE_START+0)
mso_lineDouble
static bool RTLDrawingsHack(long &rLeft, sal_Int16 eHoriOri, sal_Int16 eHoriRel, SwTwips nPageLeft, SwTwips nPageRight, SwTwips nPageSize)
Definition: wrtw8esh.cxx:556
SvStream & WriteUInt16(sal_uInt16 nUInt16)
SwOLENode * GetOLENode()
Inline methods from Node.hxx.
Definition: ndole.hxx:161
void WriteStringAsPara(const OUString &rText)
Definition: wrtww8.cxx:1799
#define ESCHER_Prop_pictureId
rtl_TextEncoding GetNodeCharSet() const
Definition: wrtww8.hxx:1489
#define ESCHER_Prop_pictureActive
#define ESCHER_Prop_dyTextTop
SvStream & WriteInt32(sal_Int32 nInt32)
#define ESCHER_Prop_cropFromBottom
std::vector< sal_uLong > aFollowShpIds
Definition: escher.hxx:143
WW8_WrPlcTextBoxes * pTextBxs
Definition: escher.hxx:146
std::unique_ptr< ContentProperties > pData
std::string GetValue
const SfxItemPool * pEditPool
Definition: wrtww8.hxx:1455
virtual SfxPoolItem * Clone(SfxItemPool *pPool=nullptr) const =0
void OutParaAttr(bool bCharAttr, const std::set< sal_uInt16 > *pWhichsToIgnore=nullptr)
Definition: wrtw8esh.cxx:1273
const_iterator find(const value_type &x) const
Definition: docfmt.cxx:2061
#define ESCHER_Prop_pictureBrightness
const SwFormatVertOrient & GetVertOrient(bool=true) const
Definition: fmtornt.hxx:106
SwNodeIndex nNode
Definition: pam.hxx:37
std::shared_ptr< SvStream > mxPicStrm
Definition: escher.hxx:89
GPOS_NONE
const_iterator begin() const
#define ESCHER_Prop_lineWidth
void WriteOCXControl(const SwFrameFormat &rFormat, sal_uInt32 nShapeId)
Definition: wrtw8esh.cxx:2922
long getWidth() const
SvxBreak GetBreak() const
static sal_uInt16 FindPos(const SwFrameFormat &rFormat, unsigned int nHdFtIndex, DrawObjPointerVector &rPVec)
Definition: wrtw8esh.cxx:2832
void SetShapeDetails(sal_uInt32 nId, sal_Int32 nThick)
Definition: wrtw8esh.cxx:903
std::vector< sal_uInt8 > bytes
Definition: types.hxx:29
virtual Size GetTwipSize() const =0
sal_uInt8 GetTransparency() const
SwTwips GetPos() const
Definition: fmtornt.hxx:92
sal_uIntPtr sal_uLong
static void WriteString8(SvStream &rStrm, const OUString &rStr, bool bAddZero, rtl_TextEncoding eCodeSet)
Definition: wrtww8.cxx:1786
SwRect FindLayoutRect(const bool bPrtArea=false, const Point *pPoint=nullptr) const
Definition: atrfrm.cxx:2686
constexpr TypedWhichId< SvxFontHeightItem > RES_CHRATR_FONTSIZE(8)
void SetCharSet(const EECharAttrib &rTextAttr, bool bStart)
Definition: wrtw8esh.cxx:1072
void Commit(SvStream &rSt, sal_uInt16 nVersion=3, sal_uInt16 nRecType=ESCHER_OPT)
#define ESCHER_Prop_pib
bool MiserableFormFieldExportHack(const SwFrameFormat &rFrameFormat)
Definition: wrtw8esh.cxx:352
sal_Int64 n
static sal_Int32 GetEscherLineMatch(MSO_LineStyle eStyle, MSO_SPT eShapeType, sal_Int32 &rThick)
Definition: ww8graf.cxx:1502
sal_uInt32 AddSdrObject(const SdrObject &rObj, bool ooxmlExport=false)
size_t GetObjCount() const
sal_Int32 nPara
Definition: wrtww8.hxx:1459
const GraphicObject * GetGraphicObject(OUString const &referer=OUString()) const
const EditTextObject * pEditObj
Definition: wrtww8.hxx:1454
virtual ~PlcDrawObj()
Definition: wrtw8esh.cxx:521
aBuf
#define ESCHER_ClientAnchor
#define ESCHER_Prop_lineStyle
virtual sal_Int32 WriteFlyFrameAttr(const SwFrameFormat &rFormat, MSO_SPT eShapeType, EscherPropertyContainer &rPropOpt) override
Definition: wrtw8esh.cxx:2072
#define ESCHER_Prop_cropFromLeft
const SfxPoolItem * pAttr
sal_Int16 nId
sal_uInt16 GetDistance(SvxBoxItemLine nLine) const
virtual bool CollapseScriptsforWordOk(sal_uInt16 nScript, sal_uInt16 nWhich)=0
Guess the script (asian/western).
sal_uInt16 FirstWhich()
bool IsLinkedFile() const
Definition: ndgrf.hxx:163
css::uno::Reference< css::frame::XModel2 > mxModel
sal_uInt64 Seek(sal_uInt64 nPos)
virtual WW8_CP GetCpOffset(const WW8Fib &rFib) const override
Definition: wrtw8esh.cxx:872
constexpr TypedWhichId< SvxFormatBreakItem > RES_BREAK(94)
SwNode & GetNode() const
Definition: ndindex.hxx:119
OUString aId
long SwTwips
Definition: swtypes.hxx:49
#define ESCHER_Prop_txflTextFlow
void setResult(sal_uInt8 nResult)
Definition: WW8FFData.hxx:73
SvxFrameDirection
static OUString GetRelURL(OUString const &rTheBaseURIRef, OUString const &rTheAbsURIRef, EncodeMechanism eEncodeMechanism=EncodeMechanism::WasEncoded, DecodeMechanism eDecodeMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, FSysStyle eStyle=FSysStyle::Detect)
SvxFrameDirection GetTextDirection(const SwPosition &rPos, const Point *pPt=nullptr) const
Definition: doclay.cxx:1611
sal_Int32 WriteOLEFlyFrame(const SwFrameFormat &rFormat, sal_uInt32 nShapeId)
Definition: wrtw8esh.cxx:1784
void addListboxEntry(const OUString &rEntry)
Definition: WW8FFData.cxx:63
void SetAnchoring(const SwFrameFormat &rFormat)
Definition: wrtw8esh.cxx:2597
WW8_CP Fc2Cp(sal_uLong nFc) const
Definition: wrtww8.hxx:1100
virtual void AddShape(sal_uInt32 nShpInstance, ShapeFlag nFlagIds, sal_uInt32 nShapeID=0)
eCONTROL
Of course Writer needs its own rectangles.
Definition: swrect.hxx:35
std::unique_ptr< WW8_WrPlcField > m_pFieldTextBxs
Definition: wrtww8.hxx:526
void Set_UInt32(sal_uInt8 *&p, sal_uInt32 n)
Definition: ww8struc.hxx:53
std::shared_ptr< T > make_shared(Args &&...args)
void AppendFlyInFlys(const ww8::Frame &rFrameFormat, const Point &rNdTopLeft)
Definition: wrtw8esh.cxx:969
DrawObjVector & GetObjArr()
Definition: wrtww8.hxx:372
virtual SvxBrushItem * Clone(SfxItemPool *pPool=nullptr) const override
Used to export formatted text associated to drawings.
Definition: wrtww8.hxx:1451
const sal_uInt32 nInlineHack
Definition: escher.hxx:27
bool IsTextEditActive() const
sal_Int16 GetRelationOrient() const
Definition: fmtornt.hxx:55
virtual void WriteFrameExtraData(const SwFrameFormat &rFormat) override
Definition: wrtw8esh.cxx:2732
EmbeddedObjectRef * pObject
std::shared_ptr< EscherExGlobal > mxGlobal
const SfxItemSet * GetCurItemSet() const
Getter for pISet.
Definition: wrtww8.hxx:728
#define ESCHER_ClientTextbox
css::chart::ChartAxisLabelPosition ePos
OUString FieldString(ww::eField eIndex)
Definition: ww8atr.cxx:2576
long NormAngle36000(long a)
std::shared_ptr< SvxBrushItem > TrueFrameBgBrush(const SwFrameFormat &rFlyFormat) const
Definition: wrtw8nds.cxx:1678
bool ReadOCXStorage(tools::SvRef< SotStorage > const &rSrc1, css::uno::Reference< css::form::XFormComponent > &rxFormComp)
const SwFrameFormats * GetSpzFrameFormats() const
Definition: doc.hxx:739
static bool WriteOCXStream(const css::uno::Reference< css::frame::XModel > &rxModel, tools::SvRef< SotStorage > const &rSrc1, const css::uno::Reference< css::awt::XControlModel > &rControlModel, const css::awt::Size &rSize, OUString &rName)
const OUString & GetHelp() const
Definition: expfld.cxx:1407
constexpr TypedWhichId< SvxFrameDirectionItem > EE_PARA_WRITINGDIR(EE_PARA_START+0)
virtual WW8_CP GetCpOffset(const WW8Fib &) const override
Definition: wrtw8esh.cxx:860
constexpr TypedWhichId< SwLuminanceGrf > RES_GRFATR_LUMINANCE(134)
sal_uInt16 NextWhich()
virtual void SetPicId(const SdrObject &rSdrObj, sal_uInt32 nShapeId, EscherPropertyContainer &rPropOpt) override
Definition: wrtw8esh.cxx:1775
virtual void SetPicId(const SdrObject &, sal_uInt32, EscherPropertyContainer &)
Definition: wrtw8esh.cxx:1770
IDocumentDrawModelAccess const & getIDocumentDrawModelAccess() const
Definition: doc.cxx:154
virtual sal_uInt32 GenerateShapeId()
virtual const tools::Rectangle & GetSnapRect() const
static OutputDevice * GetDefaultDevice()
static bool ConvertPosition(SwFormatHoriOrient &_iorHoriOri, SwFormatVertOrient &_iorVertOri, const SwFrameFormat &_rFrameFormat)
method to perform conversion of positioning attributes with the help of corresponding layout informat...
Definition: wrtw8esh.cxx:2401
SwDoc * m_pDoc
Definition: docbm.cxx:1190
mso_lineThickThin
mso_sptPictureFrame
#define ESCHER_Prop_dxWrapDistLeft
SvStream & GetStream() const
SwEscherEx * m_pEscher
Definition: wrtww8.hxx:540
constexpr::Color COL_TRANSPARENT(0xFF, 0xFF, 0xFF, 0xFF)
virtual sal_uInt32 QueryTextID(const css::uno::Reference< css::drawing::XShape > &, sal_uInt32) override
Definition: wrtw8esh.cxx:2998
const SfxPoolItem * NextItem()
std::unique_ptr< SvxBrushItem > makeBackgroundBrushItem(bool=true) const
Definition: format.cxx:782
SvxGraphicPosition GetGraphicPos() const
long Right() const
void WritePlc(WW8Export &rWrt) const
Definition: wrtw8esh.cxx:616
#define ESCHER_Prop_wzName
virtual sal_Int32 WriteFlyFrameAttr(const SwFrameFormat &rFormat, MSO_SPT eShapeType, EscherPropertyContainer &rPropOpt)
Definition: wrtw8esh.cxx:1886
MSO_LineDashing
SvxShadowLocation GetLocation() const
SotStorage * OpenSotStorage(const OUString &rEleName, StreamMode=StreamMode::STD_READWRITE, bool transacted=true)
virtual void OutputField(const SwField *pField, ww::eField eFieldType, const OUString &rFieldCmd, FieldFlags nMode=FieldFlags::All) override
Write the field.
Definition: ww8atr.cxx:1722
constexpr sal_uInt16 RES_PARATR_BEGIN(RES_TXTATR_END)
void SetHoriOrient(sal_Int16 eNew)
Definition: fmtornt.hxx:89
SwNodeType GetNodeType() const
Definition: node.hxx:144
MSWordExportBase & m_rExport
Definition: wrtww8.hxx:1441
MSO_SPT
void Flush(SvStream *pPicStreamMergeBSE=nullptr)
static Graphic GetObjGraphic(const SdrObject &rSdrObject)
OString GetUniqueID() const
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
#define INET_FILE_SCHEME
#define X
IDocumentStylePoolAccess const & getIDocumentStylePoolAccess() const
Definition: doc.cxx:425
void WriteHyperlinkWithinFly(SvMemoryStream &rStrm, const SwFormatURL *pINetFormatArg)
Definition: wrtw8esh.cxx:167
SwBasicEscherEx(SvStream *pStrm, WW8Export &rWrt)
Definition: wrtw8esh.cxx:1516
SwMSConvertControls(SfxObjectShell const *pDSh, SwPaM *pP)
Definition: wrtw8esh.cxx:3011
SwBreakIt * g_pBreakIt
Definition: breakit.cxx:33
#define DFF_msofbtUDefProp
const SvxBrushItem * GetCurrentPageBgBrush() const
Definition: wrtw8nds.cxx:1659
sal_Int32 SearchNext(sal_Int32 nStartPos)
Definition: wrtw8esh.cxx:1050
bool m_bInWriteEscher
Definition: wrtww8.hxx:555
void SetClientData(EscherExClientRecord_Base *p)
bool Append(WW8Export const &, WW8_CP nCp, const ww8::Frame &rFormat, const Point &rNdTopLeft)
Definition: wrtw8esh.cxx:877
sal_uInt32 RGBToBGR(::Color nColour)
Definition: ww8struc.hxx:1078
SvStream & WriteUInt32(sal_uInt32 nUInt32)
const SfxItemSet & GetParaAttribs(sal_Int32 nPara) const
sal_uInt32 mnXAlign
Definition: escher.hxx:71
const SwFormatSurround & GetSurround(bool=true) const
Definition: fmtsrnd.hxx:66
const Graphic * GetGraphic(OUString const &referer=OUString()) const
long Top() const
mso_txflHorzN
virtual void RawText(const OUString &rText, rtl_TextEncoding eCharSet)=0
Output text (without markup).
MainTextPlcDrawObj * m_pSdrObjs
Definition: wrtww8.hxx:537
void WriteChar(sal_Unicode c) override
Definition: wrtww8.cxx:1892
INetProtocol
bool GetFileFilterNms(OUString *pFileNm, OUString *pFilterNm) const
Definition: ndgrf.cxx:484
sal_uInt64 remainingSize()
void WriteBrushAttr(const SvxBrushItem &rBrush, EscherPropertyContainer &rPropOpt)
Definition: wrtw8esh.cxx:1843
WW8_WrPlcTextBoxes * m_pTextBxs
Definition: wrtww8.hxx:501
SdrLayerID GetInvisibleHellId() const
Definition: wrtw8esh.cxx:2180
static sal_Int32 ToFract16(sal_Int32 nVal, sal_uInt32 nMax)
Definition: wrtw8esh.cxx:2159
#define ESCHER_Prop_fillOpacity
void OutputItem(const SfxPoolItem &rHt)
Call the right virtual function according to the type of the item.
Definition: ww8atr.cxx:5174
OUString BuildFileName(sal_uInt16 &rnLevel, bool &rbRel, const OUString &rUrl)
Definition: wrtw8esh.cxx:132
void WriteGrfBullet(const Graphic &)
Definition: wrtw8esh.cxx:1566
OUString GetBasePath() const
Definition: wrtw8esh.cxx:114
const char * sName
sal_uInt32 AddDummyShape()
void setWidth(long n)
SvStream * QueryPictureStream()
OUString GetText(sal_Int32 nPara) const
sal_Int32 m_lcbPlcfspaMom
Definition: ww8scan.hxx:1383
const OUString & GetName() const
Definition: fmturl.hxx:71
const SwFrameFormat & GetFrameFormat() const
Get the writer SwFrameFormat that this object describes.
#define ESCHER_Prop_dyTextBottom
#define ESCHER_Prop_cropFromTop
SvxFrameDirection mnDirection
Definition: wrtww8.hxx:344
int size()
Definition: wrtww8.hxx:371
GraphicDrawMode
virtual SdrLayerID GetInvisibleHellId() const =0
#define ESCHER_Prop_fNoLineDrawDash
void ExportControl(WW8Export &rWrt, const SdrUnoObj &rFormObj)
Definition: wrtw8esh.cxx:3033
static void WriteString16(SvStream &rStrm, const OUString &rStr, bool bAddZero)
Definition: wrtww8.cxx:1763
#define ESCHER_Prop_lineDashing
const Color & GetColor() const
std::unique_ptr< OutlinerParaObject > CreateEditOutlinerParaObject() const
#define DFF_Prop_shadowOffsetX
sal_Int32 nTmpSwPos
Definition: wrtww8.hxx:1461
const char aObjectPool[]
Definition: ww8scan.hxx:44
ShapeFlag
PaM is Point and Mark: a selection of the document model.
Definition: pam.hxx:136
const Color & GetColor() const
#define ESCHER_Prop_lineBackColor
#define ESCHER_ShpInst_TextBox
std::unique_ptr< WW8_WrPlcPn > m_pPapPlc
Definition: wrtww8.hxx:495
const SwFormatFollowTextFlow & GetFollowTextFlow(bool=true) const
const EditTextObject & GetTextObject() const
tools::Polygon CorrectWordWrapPolygonForExport(const tools::PolyPolygon &rPolyPoly, const SwNoTextNode *pNd, bool bCorrectCrop)
Undo all scaling / move tricks of the wrap polygon done during import.
OBJ_LINE
Style of a layout element.
Definition: frmfmt.hxx:57
void setName(const OUString &rName)
Definition: WW8FFData.hxx:75
#define ESCHER_Prop_pictureContrast
#define SAL_MAX_INT32
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
void SetCurItemSet(const SfxItemSet *pS)
Setter for pISet.
Definition: wrtww8.hxx:731
EscherExHostAppData aHostData
Definition: escher.hxx:144
const SwFormatAnchor & GetAnchor(bool=true) const
Definition: fmtanchr.hxx:81
int i
#define DFF_Prop_shadowOffsetY
SVXCORE_DLLPUBLIC SdrObject * GetSdrObjectFromXShape(const css::uno::Reference< css::drawing::XShape > &xShape)
ESCHER_BlipFlagDoNotSave
WW8_CP m_ccpHdrTxbx
Definition: ww8scan.hxx:1211
void SetVertOrient(sal_Int16 eNew)
Definition: fmtornt.hxx:56
virtual const SfxPoolItem * HasTextItem(sal_uInt16 nWhich) const override
Definition: wrtw8esh.cxx:1212
mso_lineDashGEL
OBJ_GRUP
virtual sal_uInt16 GetObjIdentifier() const
RndStdIds GetAnchorId() const
Definition: fmtanchr.hxx:65
const SwPageDesc & GetPageDesc(const size_t i) const
Definition: doc.hxx:878
#define STREAM_SEEK_TO_BEGIN
#define ESCHER_Prop_dxWrapDistRight
const SwFormatHoriOrient & GetHoriOrient(bool=true) const
Definition: fmtornt.hxx:108
const SwPosition * GetContentAnchor() const
Definition: fmtanchr.hxx:67
virtual void WritePictures() override
Definition: wrtw8esh.cxx:1484
sal_uInt32 mnXRelTo
Definition: escher.hxx:73
const SwModify * m_pOutFormatNode
Definition: wrtww8.hxx:534
constexpr TypedWhichId< SwFormatURL > RES_URL(111)
ESCHER_BlipFlagLinkToFile
bool IsRelUrl() const
Definition: wrtw8esh.cxx:104
void SetSize(const Size &rSize)
sal_uInt16 GetPos(const void *p) const
Definition: wrtww8.hxx:1301
std::vector< rtl_TextEncoding > aChrSetArr
Definition: wrtww8.hxx:1458
void SetPos(SwTwips nNew)
Definition: fmtornt.hxx:60
virtual void RegisterWithFib(WW8Fib &rFib, sal_uInt32 nStart, sal_uInt32 nLen) const override
Definition: wrtw8esh.cxx:865
#define DFF_Prop_shadowColor
const OUString & GetValue() const
static void WriteShort(SvStream &rStrm, sal_Int16 nVal)
Definition: wrtww8.hxx:959
const Fraction & X() const
const SdrPage * GetPage(sal_uInt16 nPgNum) const
void FinishEscher()
Definition: wrtw8esh.cxx:2339
virtual const SwDrawModel * GetDrawModel() const =0
Draw Model and id accessors.
rtl_TextEncoding eNdChrSet
Definition: wrtww8.hxx:1462
std::size_t WriteBytes(const void *pData, std::size_t nSize)
sal_Int32 DrawModelToEmu(sal_Int32 nVal) const
Definition: escher.hxx:110
SvxGraphicPosition
virtual bool InsertControl(const css::uno::Reference< css::form::XFormComponent > &rFComp, const css::awt::Size &rSize, css::uno::Reference< css::drawing::XShape > *pShape, bool bFloatingCtrl) override
Definition: ww8par3.cxx:2484
long Bottom() const
void MiserableRTLFrameFormatHack(SwTwips &rLeft, SwTwips &rRight, const ww8::Frame &rFrameFormat)
Nasty swap for bidi if necessary.
Definition: wrtw8esh.cxx:581
sal_Int16 GetHoriOrient() const
Definition: fmtornt.hxx:87
void WriteData(EscherEx &rEx) const override
Definition: wrtw8esh.cxx:1427
void DoComboBox(css::uno::Reference< css::beans::XPropertySet > const &xPropSet)
sal_uInt32 GetOrdNum() const
mso_txflBtoT
css::text::WrapTextMode GetSurround() const
Definition: fmtsrnd.hxx:51
mso_lineThinThick
SfxItemSet * GetItemSet() const
virtual void WriteCR(ww8::WW8TableNodeInfoInner::Pointer_t pTableTextNodeInfoInner=ww8::WW8TableNodeInfoInner::Pointer_t()) override
Definition: wrtww8.cxx:1882
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
Definition: format.cxx:396
void setType(sal_uInt8 nType)
Definition: WW8FFData.hxx:71
Connection (text flow) between two FlyFrames.
Definition: fmtcnct.hxx:31
#define DFF_Prop_pWrapPolygonVertices
sal_uInt16 GetSize() const
ESCHER_FillPicture
Marks a node in the document model.
Definition: ndindex.hxx:31
sal_uInt32 GetFlyShapeId(const SwFrameFormat &rFormat, unsigned int nHdFtIndex, DrawObjPointerVector &rPVec)
Definition: wrtw8esh.cxx:2979
constexpr TypedWhichId< SwContrastGrf > RES_GRFATR_CONTRAST(135)
SwWW8Writer & GetWriter() const
Definition: wrtww8.hxx:1179
sal_uInt16 GetSlotId(sal_uInt16 nWhich) const
sal_Int32 WriteFlyFrame(const DrawObj &rObj, sal_uInt32 &rShapeId, DrawObjPointerVector &rPVec)
Definition: wrtw8esh.cxx:2744
bool WriteText(WW8Export &rWrt)
Definition: wrtw8esh.cxx:909
const SwDoc * GetDoc() const
The document is set in SwAttrPool now, therefore you always can access it.
Definition: format.hxx:119
const IDocumentSettingAccess & getIDocumentSettingAccess() const
Provides access to the document settings interface.
Definition: format.cxx:757
WW8_CP m_ccpTxbx
Definition: ww8scan.hxx:1210
void Write(SvStream *pDataStrm)
Definition: WW8FFData.cxx:77
void GetCharAttribs(sal_Int32 nPara, std::vector< EECharAttrib > &rLst) const
#define ESCHER_Prop_dyWrapDistTop
GPOS_AREA
SvStream & WriteStream(SvStream &rStream)
bool IsSaveRelINet() const
void EndSdrObjectPage()
sal_uInt16 TransformWhichBetweenPools(const SfxItemPool &rDestPool, const SfxItemPool &rSrcPool, sal_uInt16 nWhich)
Map an ID valid in one SfxItemPool to its equivalent in another.
#define ESCHER_Prop_cropFromRight
HdFtPlcDrawObj * m_pHFSdrObjs
Definition: wrtww8.hxx:538
ESCHER_BlipFlagDefault
sal_Int32 nLineWidth
sal_Int32 m_lcbPlcfspaHdr
Definition: ww8scan.hxx:1388
#define ESCHER_Prop_pibName
#define Y
SwFlyFrameFormat * GetNext() const
Definition: fmtcnct.hxx:54
#define ESCHER_Prop_fillBlip
virtual SdrInventor GetObjInventor() const
#define ESCHER_Prop_shadowColor
sal_uInt32 GetGroupLevel() const
sal_Int32 WW8_CP
Definition: ww8struc.hxx:153
void setStatus(const OUString &rStatus)
Definition: WW8FFData.cxx:57
virtual SdrLayerID GetHellId() const =0
#define ESCHER_Prop_fillBackColor
#define ESCHER_Prop_hspNext
virtual SdrLayerID GetLayer() const
void setHelp(const OUString &rHelp)
Definition: WW8FFData.cxx:51
sal_uInt32 mnYAlign
Definition: escher.hxx:72
eFORMTEXT
const SwNodeIndex * GetContentIdx() const
Definition: fmtcntnt.hxx:46
virtual ~SwEscherEx() override
Definition: wrtw8esh.cxx:2335
std::size_t ReadBytes(void *pData, std::size_t nSize)
#define ESCHER_Prop_dxTextLeft
WW8_WrPlcTextBoxes * m_pHFTextBxs
Definition: wrtww8.hxx:501
constexpr sal_uInt16 RES_UNKNOWNATR_BEGIN(RES_BOXATR_END)
css::uno::Reference< css::i18n::XBreakIterator > const & GetBreakIter() const
Definition: breakit.hxx:62
sal_Int32 GetBottom() const
#define ESCHER_Prop_fillColor
const SwMirrorGrf & GetMirrorGrf(bool=true) const
Definition: grfatr.hxx:280
sal_uInt16 Which() const
for Querying of Writer-functions.
Definition: format.hxx:78
WW8_CP m_ccpEdn
Definition: ww8scan.hxx:1209
WW8_FC m_fcPlcfspaHdr
Definition: ww8scan.hxx:1385
sal_Int32 GetParagraphCount() const
#define ESCHER_DggContainer
constexpr sal_uInt16 RES_FRMATR_END(131)
virtual const std::vector< sal_uInt32 > * GetShapeIdArr() const override
Definition: wrtw8esh.cxx:944
sal_Int32 GetTop() const
SwFrameFormat & GetMaster()
Definition: pagedesc.hxx:217
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
SwTextNode is a paragraph in the document model.
Definition: ndtxt.hxx:80
bool IsFlyFrameFormatInHeader(const SwFrameFormat &rFormat)
Definition: atrfrm.cxx:3574
#define ESCHER_SpContainer
#define ESCHER_Prop_fBackground
unsigned int mnHdFtIndex
Definition: wrtww8.hxx:345
OUString ExpandField(bool bCached, SwRootFrame const *pLayout) const
expand the field.
Definition: fldbas.cxx:443
bool IsPosToggle() const
Definition: fmtornt.hxx:95
static void WriteGrfAttr(const SwNoTextNode &rNd, const SwFrameFormat &rFormat, EscherPropertyContainer &rPropOpt)
Definition: wrtw8esh.cxx:1663
SotStorage & GetStorage() const
Definition: shellio.hxx:494
void Append(const SdrObject &rObj, sal_uInt32 nShapeId)
Definition: wrtw8esh.cxx:928
FrPair GetMapFactor(MapUnit eS, MapUnit eD)
mso_sptTextBox
constexpr sal_uInt16 RES_TXTATR_END(RES_TXTATR_NOEND_END)
virtual void CloseContainer()
SfxItemState
#define ESCHER_ShpInst_PictureFrame
constexpr sal_uInt16 RES_CHRATR_BEGIN(HINT_BEGIN)
constexpr TypedWhichId< SvxBrushItem > RES_BACKGROUND(105)
const SwFormatChain & GetChain(bool=true) const
Definition: fmtcnct.hxx:70
void MakeZOrderArrAndFollowIds(std::vector< DrawObj > &rSrcArr, DrawObjPointerVector &rDstArr)
Definition: wrtw8esh.cxx:2953
sal_Int32 GetDenominator() const
SvStream & Strm() const
Definition: wrtww8.hxx:1180
sal_Int16 GetRelationOrient() const
Definition: fmtornt.hxx:88
void AddAtom(sal_uInt32 nAtomSitze, sal_uInt16 nRecType, int nRecVersion=0, int nRecInstance=0)
sal_uInt8 mnTyp
Definition: wrtww8.hxx:1464
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
sal_uInt16 GetWhich(sal_uInt16 nSlot, bool bDeep=true) const
#define ESCHER_ShpInst_Rectangle
unsigned char sal_uInt8
virtual OutlinerParaObject * GetOutlinerParaObject() const override
Make exporting a Writer Frame easy.
virtual void WriteFrameExtraData(const SwFrameFormat &)
Definition: wrtw8esh.cxx:1526
#define ESCHER_Prop_lineColor
bool IsRemote() const
void Width(long nNew)
Definition: swrect.hxx:187
SwTwips GetPos() const
Definition: fmtornt.hxx:59
#define ESCHER_Prop_fNoFillHitTest
const o3tl::enumarray< SvxAdjust, unsigned short > aSvxToUnoAdjust USHRT_MAX
Definition: unosett.cxx:254
const OUString & GetTargetFrameName() const
Definition: fmturl.hxx:65
sal_uInt16 nScript
Definition: wrtww8.hxx:1463
bool IsTextAttr(sal_Int32 nSwPos)
Definition: wrtw8esh.cxx:1196
virtual void OpenContainer(sal_uInt16 nEscherContainer, int nRecInstance=0)
std::vector< EECharAttrib > aTextAtrArr
Definition: wrtww8.hxx:1456
virtual void WritePictures()
Definition: wrtw8esh.cxx:2185
void SetEndian(SvStreamEndian SvStreamEndian)
MSO_TextFlow
bool HasMark() const
INetProtocol GetProtocol() const
MSWord_SdrAttrIter(const MSWord_SdrAttrIter &)=delete
#define ESCHER_Prop_fillType
SvxBoxItemLine
virtual SwTextFormatColl * GetTextCollFromPool(sal_uInt16 nId, bool bRegardLanguage=true)=0
Return "Auto-Collection with ID.
virtual sal_uInt32 EnterGroup(const OUString &rShapeName, const tools::Rectangle *pBoundRect)
MSO_LineStyle
mso_txflTtoBA
#define TWIPS_TO_MM(val)
sal_uInt8 m_nTextTyp
Definition: wrtww8.hxx:544
void WriteSdrTextObj(const SdrTextObj &rObj, sal_uInt8 nTyp)
Definition: wrtw8esh.cxx:1315
#define DFF_Prop_fshadowObscured
virtual bool EndURL(bool isAtEndOfParagraph)=0
Output URL end.
sal_uInt64 Tell() const
void * p
void AddOpt(sal_uInt16 nPropID, bool bBlib, sal_uInt32 nSizeReduction, SvMemoryStream &rStream)
FIB - the File Information Block.
Definition: ww8scan.hxx:1099
void WriteEmptyFlyFrame(const SwFrameFormat &rFormat, sal_uInt32 nShapeId)
Definition: wrtw8esh.cxx:1532
virtual long GetRotateAngle() const
sal_Int32 GetNumerator() const
const SfxPoolItem & GetFormatAttr(sal_uInt16 nWhich, bool bInParents=true) const
If bInParents is FALSE, search only in this format for attribute.
Definition: format.cxx:377
constexpr TypedWhichId< SvxLRSpaceItem > RES_LR_SPACE(91)
WW8_CP m_ccpText
Definition: ww8scan.hxx:1204
constexpr TypedWhichId< SvxFontItem > EE_CHAR_FONTINFO(EE_CHAR_START+1)
constexpr::Color COL_WHITE(0xFF, 0xFF, 0xFF)
sal_uInt16 Count() const
Definition: wrtww8.hxx:1300
sal_Int16 GetVertOrient() const
Definition: fmtornt.hxx:54
long Left() const
WW8_CP m_ccpFootnote
Definition: ww8scan.hxx:1205
WW8_CP m_ccpAtn
Definition: ww8scan.hxx:1208
SvStream & WriteChar(char nChar)
virtual bool get(DocumentSettingId id) const =0
Return the specified document setting.
static void InsUInt16(ww::bytes &rO, sal_uInt16 n)
Definition: wrtww8.cxx:1728
virtual ~SwEscherExGlobal() override
Definition: wrtw8esh.cxx:1504
constexpr TypedWhichId< SvxBoxItem > RES_BOX(106)
void PreWriteHyperlinkWithinFly(const SwFrameFormat &rFormat, EscherPropertyContainer &rPropOpt)
Definition: wrtw8esh.cxx:275
const SwFormatFrameSize & GetFrameSize(bool=true) const
Definition: fmtfsize.hxx:104
constexpr TypedWhichId< SwFlyFrameFormat > RES_FLYFRMFMT(154)
const SwAttrSet & GetSwAttrSet() const
Does node has already its own auto-attributes? Access to SwAttrSet.
Definition: node.hxx:723
const SwFormatContent & GetContent(bool=true) const
Definition: fmtcntnt.hxx:55
virtual void CallSwClientNotify(const SfxHint &rHint) const override
Definition: calbck.cxx:376
void SetPos(SwTwips nNew)
Definition: fmtornt.hxx:93
virtual bool StartURL(const OUString &rUrl, const OUString &rTarget)=0
Output URL start.
sal_Int32 GetRight() const
const css::uno::Reference< css::awt::XControlModel > & GetUnoControlModel() const
virtual SvStream * ImplQueryPictureStream() override
Override to create a new memory stream for picture data.
Definition: wrtw8esh.cxx:1508
#define ESCHER_SplitMenuColors
const OUString & GetToolTip() const
Definition: expfld.cxx:1417
std::vector< const EECharAttrib * > aChrTextAtrArr
Definition: wrtww8.hxx:1457
bool m_bFontSizeWritten
Is font size written already as part of the current character properties?
Definition: wrtww8.hxx:568
SwEscherEx(SvStream *pStrm, WW8Export &rWW8Wrt)
Definition: wrtw8esh.cxx:2198
sal_Int32 WriteGrfFlyFrame(const SwFrameFormat &rFormat, sal_uInt32 nShapeId)
Definition: wrtw8esh.cxx:1603
SdrLayerID GetHellLayerId() const
ESCHER_BlipFlagURL
MapUnit
void CreateEscher()
Definition: wrtw8esh.cxx:1455
Base class for WW8Export and DocxExport.
Definition: wrtww8.hxx:445
OUString GetMark(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
RndStdIds
WW8_FC m_fcPlcfspaMom
Definition: ww8scan.hxx:1380
constexpr sal_uInt16 EE_FEATURE_FIELD(EE_FEATURE_NOTCONV+1)
virtual const tools::Rectangle & GetLogicRect() const
if(!pCandidateA->getEnd().equal(pCandidateB->getStart()))
WinwordAnchoring aWinwordAnchoring
Definition: escher.hxx:145
bool IsInline() const
Is this frame inline (as character)
bool ReadOCXStream(tools::SvRef< SotStorage > const &rSrc1, css::uno::Reference< css::drawing::XShape > *pShapeRef, bool bFloatingCtrl=false)
Definition: wrtw8esh.cxx:3019
void WriteOutliner(const OutlinerParaObject &rOutliner, sal_uInt8 nTyp)
Definition: wrtw8esh.cxx:1343
WriterSource GetWriterType() const
Get the type of frame that this wraps.
virtual const SfxPoolItem & GetItem(sal_uInt16 nWhich) const override
Definition: wrtw8esh.cxx:1229
rtl_TextEncoding GetNextCharSet() const
Definition: wrtw8esh.cxx:1042
void SetItemsThatDifferFromStandard(bool bCharAttr, SfxItemSet &rSet)
Definition: wrtw8esh.cxx:1246
SwGrfNode * GetGrfNode()
Definition: ndgrf.hxx:153
std::vector< DrawObj * > DrawObjPointerVector
Definition: wrtww8.hxx:356
const SwAttrSet & GetAttrSet() const
For querying the attribute array.
Definition: format.hxx:116
sal_uInt16 GetSetWhichFromSwDocWhich(const SfxItemSet &rSet, const SwDoc &rDoc, sal_uInt16 nWhich)
Map a SwDoc WhichId to the equivalent Id for a given SfxItemSet.
#define ESCHER_Prop_fPrint
virtual ~SwBasicEscherEx() override
Definition: wrtw8esh.cxx:1522
virtual void DoFormText(const SwInputField *pField) override
Definition: wrtw8esh.cxx:473
static sal_uInt32 GetColor(const sal_uInt32 nColor)
bool GetOpt(sal_uInt16 nPropertyID, sal_uInt32 &rPropValue) const
void WriteOLEPicture(EscherPropertyContainer &rPropOpt, ShapeFlag nShapeFlags, const Graphic &rGraphic, const SdrObject &rObj, sal_uInt32 nShapeId, const css::awt::Rectangle *pVisArea)
Definition: wrtw8esh.cxx:2901
void SetHellLayerId(SdrLayerID nId)
SwFlyFrameFormat * GetPrev() const
Definition: fmtcnct.hxx:53
const SfxPoolItem * GetItem(sal_uInt16 nWhich, bool bSearchInParent=true) const
mso_lineSimple
bool IsTextNode() const
Definition: node.hxx:636
#define ESCHER_Prop_pibFlags
The class MSWordAttrIter is a helper class to build the Fkp.chpx.
Definition: wrtww8.hxx:1434
static void WriteLong(SvStream &rStrm, sal_Int32 nVal)
Definition: wrtww8.hxx:962
constexpr TypedWhichId< SvxFontHeightItem > RES_CHRATR_CJK_FONTSIZE(23)
ww8::Frame maContent
Definition: wrtww8.hxx:341
const SwPosition & GetPosition() const
Get the position this frame is anchored at.
virtual void WriteChar(sal_Unicode c)=0
aStr
WW8_CP m_ccpHdr
Definition: ww8scan.hxx:1206
void NextPara(sal_Int32 nPar)
Definition: wrtw8esh.cxx:1022
sal_uInt32 mnYRelTo
Definition: escher.hxx:74
constexpr TypedWhichId< SvxULSpaceItem > RES_UL_SPACE(92)
virtual OUString GetPar2() const override
aPromptText
Definition: expfld.cxx:1397
std::unique_ptr< WW8_WrPlcPn > m_pChpPlc
Definition: wrtww8.hxx:496
sal_uInt16 Which() const
SvxFrameDirection TrueFrameDirection(const SwFrameFormat &rFlyFormat) const
Right to left?
Definition: wrtw8nds.cxx:1626
SdrObject * FindRealSdrObject()
Definition: atrfrm.cxx:2739
const Graphic & GetGrf(bool bWait=false) const
Definition: ndgrf.cxx:363
static void InsAsString16(ww::bytes &rO, const OUString &rStr)
Definition: wrtww8.cxx:1746
constexpr TypedWhichId< SvxShadowItem > RES_SHADOW(107)
sal_Int32 WriteTextFlyFrame(const DrawObj &rObj, sal_uInt32 nShapeId, sal_uInt32 nTextBox, DrawObjPointerVector &rPVec)
Definition: wrtw8esh.cxx:2847
SwDoc * m_pDoc
Definition: wrtww8.hxx:571
const Size & GetSize() const
sal_uInt16 nPos
mso_lineDotGEL
void WriteEscher()
Definition: wrtw8esh.cxx:1468
const SfxPoolItem * GetCurItem() const
#define ESCHER_Prop_lTxid
const SwAttrPool & GetAttrPool() const
Definition: doc.hxx:1315
sal_Int16 nValue
#define ESCHER_ClientData
#define ESCHER_Prop_pihlShape
const SvxFieldData * GetField() const
virtual const tools::Rectangle & GetLogicRect() const override
sal_uInt16 GetWidth() const
const OUString & GetURL() const
Definition: fmturl.hxx:66
SvxShadowLocation
#define ESCHER_Prop_dxTextRight
EnumT GetValue() const