LibreOffice Module sw (master)  1
rtfexport.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 "rtfexport.hxx"
21 
22 #include "rtfexportfilter.hxx"
23 #include "rtfsdrexport.hxx"
24 #include "rtfattributeoutput.hxx"
25 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
26 #include <com/sun/star/i18n/ScriptType.hpp>
27 #include <com/sun/star/beans/XPropertySet.hpp>
28 #include <com/sun/star/beans/XPropertySetInfo.hpp>
29 #include <docsh.hxx>
30 #include <viewsh.hxx>
31 #include <viewopt.hxx>
32 #include <fmtpdsc.hxx>
33 #include <ftninfo.hxx>
34 #include <fmthdft.hxx>
35 #include <editeng/colritem.hxx>
36 #include <editeng/udlnitem.hxx>
37 #include <editeng/fontitem.hxx>
38 #include <editeng/paperinf.hxx>
39 #include <editeng/brushitem.hxx>
40 #include <editeng/protitem.hxx>
41 #include <editeng/lrspitem.hxx>
42 #include <editeng/ulspitem.hxx>
43 #include <editeng/boxitem.hxx>
44 #include <editeng/shaditem.hxx>
45 #include <lineinfo.hxx>
46 #include <swmodule.hxx>
49 #include <comphelper/string.hxx>
50 #include <svtools/rtfkeywd.hxx>
53 #include <rtl/tencinfo.h>
54 #include <sal/log.hxx>
55 #if OSL_DEBUG_LEVEL > 1
56 #include <iostream>
57 #endif
58 #include <svx/xflclit.hxx>
60 #include <fmtmeta.hxx>
62 #include <fmtfsize.hxx>
63 #include <ndtxt.hxx>
64 #include <numrule.hxx>
65 #include <frmatr.hxx>
66 #include <swtable.hxx>
67 #include <IMark.hxx>
68 
69 using namespace ::com::sun::star;
70 
71 // the default text encoding for the export, if it doesn't fit unicode will
72 // be used
73 #define DEF_ENCODING RTL_TEXTENCODING_ASCII_US
74 
76 
78 
80 
81 bool RtfExport::CollapseScriptsforWordOk(sal_uInt16 nScript, sal_uInt16 nWhich)
82 {
83  // FIXME is this actually true for rtf? - this is copied from DOCX
84  if (nScript == i18n::ScriptType::ASIAN)
85  {
86  // for asian in ww8, there is only one fontsize
87  // and one fontstyle (posture/weight)
88  switch (nWhich)
89  {
91  case RES_CHRATR_POSTURE:
92  case RES_CHRATR_WEIGHT:
93  return false;
94  default:
95  break;
96  }
97  }
98  else if (nScript != i18n::ScriptType::COMPLEX)
99  {
100  // for western in ww8, there is only one fontsize
101  // and one fontstyle (posture/weight)
102  switch (nWhich)
103  {
107  return false;
108  default:
109  break;
110  }
111  }
112  return true;
113 }
114 
115 void RtfExport::AppendBookmarks(const SwTextNode& rNode, sal_Int32 nCurrentPos, sal_Int32 nLen)
116 {
117  std::vector<OUString> aStarts;
118  std::vector<OUString> aEnds;
119 
120  IMarkVector aMarks;
121  if (GetBookmarks(rNode, nCurrentPos, nCurrentPos + nLen, aMarks))
122  {
123  for (const auto& pMark : aMarks)
124  {
125  const sal_Int32 nStart = pMark->GetMarkStart().nContent.GetIndex();
126  const sal_Int32 nEnd = pMark->GetMarkEnd().nContent.GetIndex();
127 
128  if (nStart == nCurrentPos)
129  aStarts.push_back(pMark->GetName());
130 
131  if (nEnd == nCurrentPos)
132  aEnds.push_back(pMark->GetName());
133  }
134  }
135 
136  m_pAttrOutput->WriteBookmarks_Impl(aStarts, aEnds);
137 }
138 
139 void RtfExport::AppendBookmark(const OUString& rName)
140 {
141  std::vector<OUString> aStarts;
142  std::vector<OUString> aEnds;
143 
144  aStarts.push_back(rName);
145  aEnds.push_back(rName);
146 
147  m_pAttrOutput->WriteBookmarks_Impl(aStarts, aEnds);
148 }
149 
150 void RtfExport::AppendAnnotationMarks(const SwTextNode& rNode, sal_Int32 nCurrentPos,
151  sal_Int32 nLen)
152 {
153  std::vector<OUString> aStarts;
154  std::vector<OUString> aEnds;
155 
156  IMarkVector aMarks;
157  if (GetAnnotationMarks(rNode, nCurrentPos, nCurrentPos + nLen, aMarks))
158  {
159  for (const auto& pMark : aMarks)
160  {
161  const sal_Int32 nStart = pMark->GetMarkStart().nContent.GetIndex();
162  const sal_Int32 nEnd = pMark->GetMarkEnd().nContent.GetIndex();
163 
164  if (nStart == nCurrentPos)
165  aStarts.push_back(pMark->GetName());
166 
167  if (nEnd == nCurrentPos)
168  aEnds.push_back(pMark->GetName());
169  }
170  }
171 
172  m_pAttrOutput->WriteAnnotationMarks_Impl(aStarts, aEnds);
173 }
174 
175 //For i120928,to export graphic of bullet for RTF filter
177 {
178  // Noop, would be too late, see WriteNumbering() instead.
179 }
180 
181 void RtfExport::WriteChar(sal_Unicode /*c*/) { /* WriteChar() has nothing to do for rtf. */}
182 
183 static bool IsExportNumRule(const SwNumRule& rRule)
184 {
185  sal_uInt8 nEnd = MAXLEVEL;
186  while (nEnd-- && !rRule.GetNumFormat(nEnd))
187  ;
188  ++nEnd;
189 
190  sal_uInt8 nLvl;
191 
192  for (nLvl = 0; nLvl < nEnd; ++nLvl)
193  {
194  const SwNumFormat* pNFormat = &rRule.Get(nLvl);
195  if (SVX_NUM_NUMBER_NONE != pNFormat->GetNumberingType() || !pNFormat->GetPrefix().isEmpty()
196  || (!pNFormat->GetSuffix().isEmpty() && pNFormat->GetSuffix() != "."))
197  break;
198  }
199 
200  return nLvl != nEnd;
201 }
202 
204 {
205  const SwNumRuleTable& rListTable = m_pDoc->GetNumRuleTable();
206 
207  SwNumRule* pOutlineRule = m_pDoc->GetOutlineNumRule();
208  if (IsExportNumRule(*pOutlineRule))
209  GetId(*pOutlineRule);
210 
211  for (auto n = rListTable.size(); n;)
212  {
213  SwNumRule* pRule = rListTable[--n];
214  if (!SwDoc::IsUsed(*pRule))
215  continue;
216 
217  if (IsExportNumRule(*pRule))
218  GetId(*pRule);
219  }
220 }
221 
223 {
224  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " start");
225 
226  if (!m_pUsedNumTable)
227  return; // no numbering is used
228 
229  Strm()
230  .WriteChar('{')
233 
235  if (!m_vecBulletPic.empty())
236  Strm()
237  .WriteChar('{')
241  if (!m_vecBulletPic.empty())
242  Strm().WriteChar('}');
243 
245  Strm().WriteChar('}');
246 
249  Strm().WriteChar('}');
250 
251  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " end");
252 }
253 
255 {
256  int nRevAuthors = m_pDoc->getIDocumentRedlineAccess().GetRedlineTable().size();
257 
258  if (nRevAuthors < 1)
259  return;
260 
261  // RTF always seems to use Unknown as the default first entry
262  GetRedline("Unknown");
263 
265  {
266  GetRedline(SW_MOD()->GetRedlineAuthor(pRedl->GetAuthor()));
267  }
268 
269  // Now write the table
270  Strm()
271  .WriteChar('{')
274  .WriteChar(' ');
275  for (std::size_t i = 0; i < m_aRedlineTable.size(); ++i)
276  {
277  const OUString* pAuthor = GetRedline(i);
278  Strm().WriteChar('{');
279  if (pAuthor)
280  Strm().WriteCharPtr(
282  Strm().WriteCharPtr(";}");
283  }
285 }
286 
287 void RtfExport::WriteHeadersFooters(sal_uInt8 nHeadFootFlags, const SwFrameFormat& rFormat,
288  const SwFrameFormat& rLeftFormat,
289  const SwFrameFormat& rFirstPageFormat, sal_uInt8 /*nBreakCode*/)
290 {
291  // headers
292  if (nHeadFootFlags & nsHdFtFlags::WW8_HEADER_EVEN)
294 
295  if (nHeadFootFlags & nsHdFtFlags::WW8_HEADER_ODD)
297 
298  if (nHeadFootFlags & nsHdFtFlags::WW8_HEADER_FIRST)
299  WriteHeaderFooter(rFirstPageFormat, true, OOO_STRING_SVTOOLS_RTF_HEADERF, true);
300 
301  // footers
302  if (nHeadFootFlags & nsHdFtFlags::WW8_FOOTER_EVEN)
304 
305  if (nHeadFootFlags & nsHdFtFlags::WW8_FOOTER_ODD)
307 
308  if (nHeadFootFlags & nsHdFtFlags::WW8_FOOTER_FIRST)
309  WriteHeaderFooter(rFirstPageFormat, false, OOO_STRING_SVTOOLS_RTF_FOOTERF, true);
310 }
311 
312 void RtfExport::OutputField(const SwField* pField, ww::eField eFieldType, const OUString& rFieldCmd,
313  FieldFlags nMode)
314 {
315  m_pAttrOutput->WriteField_Impl(pField, eFieldType, rFieldCmd, nMode);
316 }
317 
318 void RtfExport::WriteFormData(const ::sw::mark::IFieldmark& /*rFieldmark*/)
319 {
320  SAL_INFO("sw.rtf", "TODO: " << OSL_THIS_FUNC);
321 }
322 
323 void RtfExport::WriteHyperlinkData(const ::sw::mark::IFieldmark& /*rFieldmark*/)
324 {
325  SAL_INFO("sw.rtf", "TODO: " << OSL_THIS_FUNC);
326 }
327 
328 void RtfExport::DoComboBox(const OUString& /*rName*/, const OUString& /*rHelp*/,
329  const OUString& /*rToolTip*/, const OUString& /*rSelected*/,
330  uno::Sequence<OUString>& /*rListItems*/)
331 {
332  // this is handled in RtfAttributeOutput::OutputFlyFrame_Impl
333 }
334 
336 {
337  OUString sResult = pField->ExpandField(true, nullptr);
338  const OUString& rHelp = pField->GetHelp();
339  OUString sName = pField->GetPar2();
340  const OUString& rStatus = pField->GetToolTip();
341  m_pAttrOutput->RunText().append("{" OOO_STRING_SVTOOLS_RTF_FIELD
343  "{ FORMTEXT }");
344  m_pAttrOutput->RunText().append(
347  if (!rHelp.isEmpty())
349  if (!rStatus.isEmpty())
351  m_pAttrOutput->RunText().append(OOO_STRING_SVTOOLS_RTF_FFTYPETXT "0");
352 
353  if (!sName.isEmpty())
354  m_pAttrOutput->RunText()
357  .append("}");
358  if (!rHelp.isEmpty())
359  m_pAttrOutput->RunText()
362  .append("}");
363  m_pAttrOutput->RunText()
366  .append("}");
367  if (!rStatus.isEmpty())
368  m_pAttrOutput->RunText()
371  .append("}");
372  m_pAttrOutput->RunText().append("}}}{" OOO_STRING_SVTOOLS_RTF_FLDRSLT " ");
373  m_pAttrOutput->RunText()
375  .append("}}");
376 }
377 
379 {
380  // Completely unused for Rtf export... only here for code sharing
381  // purpose with binary export
382 
383  return 0;
384 }
385 
387 {
388  Strm()
390  .WriteChar('{')
393  Strm().WriteChar('}');
394 }
395 
397 {
398  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " start");
399  m_pStyles->OutputStylesTable();
400  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " end");
401 }
402 
404 {
405  const SwPageFootnoteInfo& rFootnoteInfo = m_pDoc->GetPageDesc(0).GetFootnoteInfo();
406  // Request a separator only in case the width is larger than zero.
407  bool bSeparator = double(rFootnoteInfo.GetWidth()) > 0;
408 
409  Strm()
410  .WriteChar('{')
413  if (bSeparator)
415  Strm().WriteChar('}');
416 }
417 
419 {
420  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " start");
421 
422  if (std::shared_ptr<SvxBrushItem> oBrush = getBackground(); oBrush)
423  {
428 
429  std::vector<std::pair<OString, OString>> aProperties;
430  aProperties.push_back(std::make_pair<OString, OString>("shapeType", "1"));
431  aProperties.push_back(std::make_pair<OString, OString>(
432  "fillColor", OString::number(wwUtility::RGBToBGR(oBrush->GetColor()))));
433  for (std::pair<OString, OString>& rPair : aProperties)
434  {
437  Strm().WriteCharPtr(rPair.first.getStr());
439  Strm().WriteCharPtr(rPair.second.getStr());
440  Strm().WriteCharPtr("}}");
441  }
442  Strm().WriteChar('}'); // shpinst
443  Strm().WriteChar('}'); // shp
444  Strm().WriteChar('}'); // background
445  }
446 
447  SwTableNode* pTableNode = m_pCurPam->GetNode().FindTableNode();
448  if (m_pWriter && m_pWriter->m_bWriteOnlyFirstTable && pTableNode != nullptr)
449  {
450  m_pCurPam->GetPoint()->nNode = *pTableNode;
451  m_pCurPam->GetMark()->nNode = *(pTableNode->EndOfSectionNode());
452  }
453  else
454  {
457  }
458 
459  WriteText();
460 
461  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " end");
462 }
463 
465 {
466  OString aGenerator
467  = OUStringToOString(utl::DocInfoHelper::GetGeneratorString(), RTL_TEXTENCODING_UTF8);
468  Strm()
470  .WriteCharPtr(aGenerator.getStr())
471  .WriteChar('}');
473 
474  SwDocShell* pDocShell(m_pDoc->GetDocShell());
475  uno::Reference<document::XDocumentProperties> xDocProps;
476  if (pDocShell)
477  {
478  uno::Reference<document::XDocumentPropertiesSupplier> xDPS(pDocShell->GetModel(),
479  uno::UNO_QUERY);
480  xDocProps.set(xDPS->getDocumentProperties());
481  }
482 
483  if (xDocProps.is())
484  {
485  // Handle user-defined properties.
486  uno::Reference<beans::XPropertyContainer> xUserDefinedProperties
487  = xDocProps->getUserDefinedProperties();
488  if (xUserDefinedProperties.is())
489  {
490  uno::Reference<beans::XPropertySet> xPropertySet(xUserDefinedProperties,
491  uno::UNO_QUERY);
492  uno::Reference<beans::XPropertySetInfo> xPropertySetInfo
493  = xPropertySet->getPropertySetInfo();
494  // Do we have explicit markup in RTF for this property name?
495  if (xPropertySetInfo->hasPropertyByName("Company"))
496  {
497  OUString aValue;
498  xPropertySet->getPropertyValue("Company") >>= aValue;
500  }
501  }
502 
503  OutUnicode(OOO_STRING_SVTOOLS_RTF_TITLE, xDocProps->getTitle(), true);
504  OutUnicode(OOO_STRING_SVTOOLS_RTF_SUBJECT, xDocProps->getSubject());
505 
507  ::comphelper::string::convertCommaSeparated(xDocProps->getKeywords()));
508  OutUnicode(OOO_STRING_SVTOOLS_RTF_DOCCOMM, xDocProps->getDescription());
509 
510  OutUnicode(OOO_STRING_SVTOOLS_RTF_AUTHOR, xDocProps->getAuthor());
511  OutDateTime(OOO_STRING_SVTOOLS_RTF_CREATIM, xDocProps->getCreationDate());
512 
513  OutUnicode(OOO_STRING_SVTOOLS_RTF_AUTHOR, xDocProps->getModifiedBy());
514  OutDateTime(OOO_STRING_SVTOOLS_RTF_REVTIM, xDocProps->getModificationDate());
515 
516  OutDateTime(OOO_STRING_SVTOOLS_RTF_PRINTIM, xDocProps->getPrintDate());
517  }
518 
519  Strm().WriteChar('}');
520 }
521 
523 {
525  OutULong(nType);
526 }
527 
528 void RtfExport::WriteUserPropValue(const OUString& rValue)
529 {
532  Strm().WriteChar('}');
533 }
534 
536 {
537  Strm().WriteChar('{').WriteCharPtr(
539 
540  SwDocShell* pDocShell(m_pDoc->GetDocShell());
541  uno::Reference<document::XDocumentProperties> xDocProps;
542  if (pDocShell)
543  {
544  uno::Reference<document::XDocumentPropertiesSupplier> xDPS(pDocShell->GetModel(),
545  uno::UNO_QUERY);
546  xDocProps.set(xDPS->getDocumentProperties());
547  }
548  else
549  {
550  // Clipboard document, read metadata from the meta field manager.
552  xDocProps.set(rManager.getDocumentProperties());
553  }
554 
555  if (xDocProps.is())
556  {
557  // Handle user-defined properties.
558  uno::Reference<beans::XPropertyContainer> xUserDefinedProperties
559  = xDocProps->getUserDefinedProperties();
560  if (xUserDefinedProperties.is())
561  {
562  uno::Reference<beans::XPropertySet> xPropertySet(xUserDefinedProperties,
563  uno::UNO_QUERY);
564  uno::Sequence<beans::Property> aProperties
565  = xPropertySet->getPropertySetInfo()->getProperties();
566 
567  for (const beans::Property& rProperty : aProperties)
568  {
569  if (rProperty.Name.startsWith("Company"))
570  // We have explicit markup in RTF for this property.
571  continue;
572 
573  // Property name.
575  Strm().WriteCharPtr(
576  msfilter::rtfutil::OutString(rProperty.Name, m_eDefaultEncoding).getStr());
577  Strm().WriteChar('}');
578 
579  // Property value.
580  OUString aValue;
581  double fValue;
582  bool bValue;
583  util::DateTime aDate;
584  uno::Any aAny = xPropertySet->getPropertyValue(rProperty.Name);
585  if (aAny >>= bValue)
586  {
587  WriteUserPropType(11);
588  WriteUserPropValue(OUString::number(static_cast<int>(bValue)));
589  }
590  else if (aAny >>= aValue)
591  {
592  WriteUserPropType(30);
593  WriteUserPropValue(aValue);
594  }
595  else if (aAny >>= fValue)
596  {
597  aValue = OUString::number(fValue);
598  if (aValue.indexOf('.') == -1)
599  {
600  // Integer.
602  WriteUserPropValue(aValue);
603  }
604  else
605  {
606  // Real number.
608  WriteUserPropValue(aValue);
609  }
610  }
611  else if (aAny >>= aDate)
612  {
613  WriteUserPropType(64);
614  // Format is 'YYYY. MM. DD.'.
615  aValue += OUString::number(aDate.Year);
616  aValue += ". ";
617  if (aDate.Month < 10)
618  aValue += "0";
619  aValue += OUString::number(aDate.Month);
620  aValue += ". ";
621  if (aDate.Day < 10)
622  aValue += "0";
623  aValue += OUString::number(aDate.Day);
624  aValue += ".";
625  WriteUserPropValue(aValue);
626  }
627  }
628  }
629  }
630 
631  Strm().WriteChar('}');
632 }
633 
635 {
636  // Write page descriptions (page styles)
637  std::size_t nSize = m_pDoc->GetPageDescCnt();
638  if (!nSize)
639  return;
640 
642  m_bOutPageDescs = true;
643  Strm()
644  .WriteChar('{')
647  for (std::size_t n = 0; n < nSize; ++n)
648  {
649  const SwPageDesc& rPageDesc = m_pDoc->GetPageDesc(n);
650 
651  Strm()
653  .WriteChar('{')
656  OutULong(static_cast<sal_uLong>(rPageDesc.ReadUseOn()));
657 
658  OutPageDescription(rPageDesc, false);
659 
660  // search for the next page description
661  std::size_t i = nSize;
662  while (i)
663  if (rPageDesc.GetFollow() == &m_pDoc->GetPageDesc(--i))
664  break;
666  OutULong(i).WriteChar(' ');
667  Strm()
668  .WriteCharPtr(
670  .WriteCharPtr(";}");
671  }
673  m_bOutPageDescs = false;
674 
675  // reset table infos, otherwise the depth of the cells will be incorrect,
676  // in case the page style (header or footer) had tables
677  m_pTableInfo = std::make_shared<ww8::WW8TableInfo>();
678 }
679 
681 {
682  // Make the header
683  Strm()
684  .WriteChar('{')
686  .WriteChar('1')
690  // If this not exist, MS don't understand our ansi characters (0x80-0xff).
691  Strm().WriteCharPtr("\\adeflang1025");
692 
693  // Font table
694  WriteFonts();
695 
696  m_pStyles = std::make_unique<MSWordStyles>(*this);
697  // Color and stylesheet table
698  WriteStyles();
699 
700  // List table
701  BuildNumbering();
702  WriteNumbering();
703 
704  WriteRevTab();
705 
706  WriteInfo();
707  WriteUserProps();
708  // Default TabSize
709  Strm()
710  .WriteCharPtr(m_pAttrOutput->GetTabStop().makeStringAndClear().getStr())
711  .WriteCharPtr(SAL_NEWLINE_STRING);
712 
713  // Automatic hyphenation: it's a global setting in Word, it's a paragraph setting in Writer.
714  // Use the setting from the default style.
716  RES_POOLCOLL_STANDARD, /*bRegardLanguage=*/false);
717  const SfxPoolItem* pItem;
718  if (pTextFormatColl
719  && pTextFormatColl->GetItemState(RES_PARATR_HYPHENZONE, false, &pItem) == SfxItemState::SET)
720  {
722  OutULong(int(static_cast<const SvxHyphenZoneItem*>(pItem)->IsHyphen()));
723  }
724 
725  // Zoom
727  if (pViewShell && pViewShell->GetViewOptions()->GetZoomType() == SvxZoomType::PERCENT)
728  {
730  OutULong(pViewShell->GetViewOptions()->GetZoom());
731  }
732  // Record changes?
735  // Mirror margins?
738  // Init sections
739  m_pSections = new MSWordSections(*this);
740 
741  // Page description
743 
744  // Enable form protection by default if needed, as there is no switch to
745  // enable it on a per-section basis. OTOH don't always enable it as it
746  // breaks moving of drawings - so write it only in case there is really a
747  // protected section in the document.
748  {
749  const SfxItemPool& rPool = m_pDoc->GetAttrPool();
750  for (const SfxPoolItem* pItem2 : rPool.GetItemSurrogates(RES_PROTECT))
751  {
752  auto pProtect = dynamic_cast<const SvxProtectItem*>(pItem2);
753  if (pProtect && pProtect->IsContentProtected())
754  {
756  break;
757  }
758  }
759  }
760 
761  // enable form field shading
763 
764  // size and empty margins of the page
765  if (m_pDoc->GetPageDescCnt())
766  {
767  // Seeking the first SwFormatPageDesc. If no set, the default is valid
768  const SwFormatPageDesc* pSttPgDsc = nullptr;
769  {
770  const SwNode& rSttNd
772  const SfxItemSet* pSet = nullptr;
773 
774  if (rSttNd.IsContentNode())
775  pSet = &rSttNd.GetContentNode()->GetSwAttrSet();
776  else if (rSttNd.IsTableNode())
777  pSet = &rSttNd.GetTableNode()->GetTable().GetFrameFormat()->GetAttrSet();
778 
779  else if (rSttNd.IsSectionNode())
780  pSet = &rSttNd.GetSectionNode()->GetSection().GetFormat()->GetAttrSet();
781 
782  if (pSet)
783  {
784  std::size_t nPosInDoc;
785  pSttPgDsc = &pSet->Get(RES_PAGEDESC);
786  if (!pSttPgDsc->GetPageDesc())
787  pSttPgDsc = nullptr;
788  else if (m_pDoc->FindPageDesc(pSttPgDsc->GetPageDesc()->GetName(), &nPosInDoc))
789  {
790  Strm()
791  .WriteChar('{')
794  OutULong(nPosInDoc).WriteChar('}');
795  }
796  }
797  }
798  const SwPageDesc& rPageDesc
799  = pSttPgDsc ? *pSttPgDsc->GetPageDesc() : m_pDoc->GetPageDesc(0);
800  const SwFrameFormat& rFormatPage = rPageDesc.GetMaster();
801 
802  {
803  if (rPageDesc.GetLandscape())
805 
806  const SwFormatFrameSize& rSz = rFormatPage.GetFrameSize();
807  // Clipboard document is always created without a printer, then
808  // the size will be always LONG_MAX! Solution then is to use A4
809  if (LONG_MAX == rSz.GetHeight() || LONG_MAX == rSz.GetWidth())
810  {
813  OutULong(a4.Height()).WriteCharPtr(OOO_STRING_SVTOOLS_RTF_PAPERW);
814  OutULong(a4.Width());
815  }
816  else
817  {
819  OutULong(rSz.GetHeight()).WriteCharPtr(OOO_STRING_SVTOOLS_RTF_PAPERW);
820  OutULong(rSz.GetWidth());
821  }
822  }
823 
824  {
825  const SvxLRSpaceItem& rLR = rFormatPage.GetLRSpace();
827  OutLong(rLR.GetLeft()).WriteCharPtr(OOO_STRING_SVTOOLS_RTF_MARGR);
828  OutLong(rLR.GetRight());
829  }
830 
831  {
832  const SvxULSpaceItem& rUL = rFormatPage.GetULSpace();
834  OutLong(rUL.GetUpper()).WriteCharPtr(OOO_STRING_SVTOOLS_RTF_MARGB);
835  OutLong(rUL.GetLower());
836  }
837 
838  Strm()
841  // All sections are unlocked by default
843  OutLong(1);
844  OutPageDescription(rPageDesc, true); // Changed bCheckForFirstPage to true so headers
845  // following title page are correctly added - i13107
846  if (pSttPgDsc)
847  {
848  m_pCurrentPageDesc = &rPageDesc;
849  }
850  }
851 
852  // line numbering
853  const SwLineNumberInfo& rLnNumInfo = m_pDoc->GetLineNumberInfo();
854  if (rLnNumInfo.IsPaintLineNumbers())
855  {
856  sal_uLong nLnNumRestartNo = 0;
857  if (const WW8_SepInfo* pSectionInfo = m_pSections->CurrentSectionInfo())
858  nLnNumRestartNo = pSectionInfo->nLnNumRestartNo;
859 
860  AttrOutput().SectionLineNumbering(nLnNumRestartNo, rLnNumInfo);
861  }
862 
863  {
864  // write the footnotes and endnotes-out Info
865  const SwFootnoteInfo& rFootnoteInfo = m_pDoc->GetFootnoteInfo();
866 
867  const char* pOut = FTNPOS_CHAPTER == rFootnoteInfo.ePos ? OOO_STRING_SVTOOLS_RTF_ENDDOC
870  OutLong(rFootnoteInfo.nFootnoteOffset + 1);
871 
872  switch (rFootnoteInfo.eNum)
873  {
874  case FTNNUM_PAGE:
876  break;
877  case FTNNUM_DOC:
879  break;
880  default:
882  break;
883  }
884  Strm().WriteCharPtr(pOut);
885 
886  switch (rFootnoteInfo.aFormat.GetNumberingType())
887  {
891  break;
895  break;
896  case SVX_NUM_ROMAN_LOWER:
898  break;
899  case SVX_NUM_ROMAN_UPPER:
901  break;
904  break;
905  default:
907  break;
908  }
909  Strm().WriteCharPtr(pOut);
910 
911  const SwEndNoteInfo& rEndNoteInfo = m_pDoc->GetEndNoteInfo();
912 
913  Strm()
917  OutLong(rEndNoteInfo.nFootnoteOffset + 1);
918 
919  switch (rEndNoteInfo.aFormat.GetNumberingType())
920  {
924  break;
928  break;
929  case SVX_NUM_ROMAN_LOWER:
931  break;
932  case SVX_NUM_ROMAN_UPPER:
934  break;
937  break;
938  default:
940  break;
941  }
942  Strm().WriteCharPtr(pOut);
943  }
944 
946  // RTF default is true, so write compat flag if this should be false.
948 
950 
952 
953  WriteMainText();
954 
955  Strm().WriteChar('}');
956 
957  return ERRCODE_NONE;
958 }
959 
960 void RtfExport::PrepareNewPageDesc(const SfxItemSet* pSet, const SwNode& rNd,
961  const SwFormatPageDesc* pNewPgDescFormat,
962  const SwPageDesc* pNewPgDesc)
963 {
964  const SwSectionFormat* pFormat = GetSectionFormat(rNd);
965  const sal_uLong nLnNm = GetSectionLineNo(pSet, rNd);
966 
967  OSL_ENSURE(pNewPgDescFormat || pNewPgDesc, "Neither page desc format nor page desc provided.");
968 
969  if (pNewPgDescFormat)
970  m_pSections->AppendSection(*pNewPgDescFormat, rNd, pFormat, nLnNm);
971  else if (pNewPgDesc)
972  m_pSections->AppendSection(pNewPgDesc, rNd, pFormat, nLnNm);
973 
974  // Don't insert a page break, when we're changing page style just because the next page has to be a different one.
975  if (!m_pAttrOutput->GetPrevPageDesc()
976  || m_pAttrOutput->GetPrevPageDesc()->GetFollow() != pNewPgDesc)
978 }
979 
981 {
982  bool bRet(false);
983 
984  if (SfxItemState::SET != rFormat.GetItemState(RES_PARATR_NUMRULE, false))
985  {
986  if (const SwFormat* pParent = rFormat.DerivedFrom())
987  {
988  if (static_cast<const SwTextFormatColl*>(pParent)
989  ->IsAssignedToListLevelOfOutlineStyle())
990  {
991  // Level 9 disables the outline
993 
994  bRet = true;
995  }
996  }
997  }
998 
999  return bRet;
1000 }
1001 
1003 {
1004  if (TXT_MAINTEXT == m_nTextTyp && rEndNode.StartOfSectionNode()->IsTableNode())
1005  // End node of a table: see if a section break should be written after the table.
1006  AttrOutput().SectionBreaks(rEndNode);
1007 }
1008 
1009 void RtfExport::OutputGrfNode(const SwGrfNode& /*rGrfNode*/)
1010 {
1011  /* noop, see RtfAttributeOutput::FlyFrameGraphic */
1012 }
1013 
1014 void RtfExport::OutputOLENode(const SwOLENode& /*rOLENode*/)
1015 {
1016  /* noop, see RtfAttributeOutput::FlyFrameOLE */
1017 }
1018 
1019 void RtfExport::OutputLinkedOLE(const OUString& /*rLinked*/) {}
1020 
1022 {
1023  m_nCurrentNodeIndex = rNode.GetIndex();
1024  if (!m_bOutOutlineOnly || rNode.IsOutline())
1026  m_nCurrentNodeIndex = 0;
1027 }
1028 
1029 void RtfExport::AppendSection(const SwPageDesc* pPageDesc, const SwSectionFormat* pFormat,
1030  sal_uLong nLnNum)
1031 {
1032  m_pSections->AppendSection(pPageDesc, pFormat, nLnNum);
1034 }
1035 
1036 RtfExport::RtfExport(RtfExportFilter* pFilter, SwDoc* pDocument, SwPaM* pCurrentPam,
1037  SwPaM* pOriginalPam, Writer* pWriter, bool bOutOutlineOnly)
1038  : MSWordExportBase(pDocument, pCurrentPam, pOriginalPam)
1039  , m_pFilter(pFilter)
1040  , m_pWriter(pWriter)
1041  , m_pSections(nullptr)
1042  , m_bOutOutlineOnly(bOutOutlineOnly)
1043  , m_eDefaultEncoding(
1044  rtl_getTextEncodingFromWindowsCharset(sw::ms::rtl_TextEncodingToWinCharset(DEF_ENCODING)))
1045  , m_eCurrentEncoding(m_eDefaultEncoding)
1046  , m_bRTFFlySyntax(false)
1047  , m_nCurrentNodeIndex(0)
1048 {
1049  m_bExportModeRTF = true;
1050  // the attribute output for the document
1051  m_pAttrOutput = std::make_unique<RtfAttributeOutput>(*this);
1052  // that just causes problems for RTF
1053  m_bSubstituteBullets = false;
1054  // needed to have a complete font table
1056  // the related SdrExport
1057  m_pSdrExport = std::make_unique<RtfSdrExport>(*this);
1058 
1059  if (!m_pWriter)
1061 }
1062 
1063 RtfExport::~RtfExport() = default;
1064 
1066 {
1067  if (m_pStream)
1068  return *m_pStream;
1069 
1070  return m_pWriter->Strm();
1071 }
1072 
1073 void RtfExport::setStream() { m_pStream = std::make_unique<SvMemoryStream>(); }
1074 
1076 {
1077  OString aRet;
1078 
1079  if (m_pStream)
1080  aRet = OString(static_cast<const sal_Char*>(m_pStream->GetData()), m_pStream->Tell());
1081 
1082  return aRet;
1083 }
1084 
1086 
1088 
1089 SvStream& RtfExport::OutLong(long nVal) { return Writer::OutLong(Strm(), nVal); }
1090 
1091 void RtfExport::OutUnicode(const sal_Char* pToken, const OUString& rContent, bool bUpr)
1092 {
1093  if (!rContent.isEmpty())
1094  {
1095  if (!bUpr)
1096  {
1097  Strm().WriteChar('{').WriteCharPtr(pToken).WriteChar(' ');
1098  Strm().WriteCharPtr(
1099  msfilter::rtfutil::OutString(rContent, m_eCurrentEncoding).getStr());
1100  Strm().WriteChar('}');
1101  }
1102  else
1103  Strm().WriteCharPtr(
1104  msfilter::rtfutil::OutStringUpr(pToken, rContent, m_eCurrentEncoding).getStr());
1105  }
1106 }
1107 
1108 void RtfExport::OutDateTime(const sal_Char* pStr, const util::DateTime& rDT)
1109 {
1115  OutULong(rDT.Minutes).WriteChar('}');
1116 }
1117 
1118 sal_uInt16 RtfExport::GetColor(const Color& rColor) const
1119 {
1120  for (const auto& rEntry : m_aColTable)
1121  if (rEntry.second == rColor)
1122  {
1123  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " returning " << rEntry.first << " ("
1124  << rColor.GetRed() << "," << rColor.GetGreen() << ","
1125  << rColor.GetBlue() << ")");
1126  return rEntry.first;
1127  }
1128  OSL_FAIL("No such Color in m_aColTable!");
1129  return 0;
1130 }
1131 
1132 void RtfExport::InsColor(const Color& rCol)
1133 {
1134  sal_uInt16 n;
1135  bool bAutoColorInTable = false;
1136  for (const auto& rEntry : m_aColTable)
1137  {
1138  if (rEntry.second == rCol)
1139  return; // Already in the table
1140  if (rEntry.second == COL_AUTO)
1141  bAutoColorInTable = true;
1142  }
1143  if (rCol == COL_AUTO)
1144  // COL_AUTO gets value 0
1145  n = 0;
1146  else
1147  {
1148  // other colors get values >0
1149  n = m_aColTable.size();
1150  if (!bAutoColorInTable)
1151  // reserve value "0" for COL_AUTO (if COL_AUTO wasn't inserted until now)
1152  n++;
1153  }
1154  m_aColTable.insert(std::pair<sal_uInt16, Color>(n, rCol));
1155 }
1156 
1158 {
1159  const editeng::SvxBorderLine* pLine = nullptr;
1160 
1161  if (rBox.GetTop())
1162  {
1163  pLine = rBox.GetTop();
1164  InsColor(pLine->GetColor());
1165  }
1166  if (rBox.GetBottom() && pLine != rBox.GetBottom())
1167  {
1168  pLine = rBox.GetBottom();
1169  InsColor(pLine->GetColor());
1170  }
1171  if (rBox.GetLeft() && pLine != rBox.GetLeft())
1172  {
1173  pLine = rBox.GetLeft();
1174  InsColor(pLine->GetColor());
1175  }
1176  if (rBox.GetRight() && pLine != rBox.GetRight())
1177  InsColor(rBox.GetRight()->GetColor());
1178 }
1179 
1181 {
1182  // Build the table from rPool since the colors provided to
1183  // RtfAttributeOutput callbacks are too late.
1184  const SfxItemPool& rPool = m_pDoc->GetAttrPool();
1185 
1186  // MSO Word uses a default color table with 16 colors (which is used e.g. for highlighting)
1195  InsColor(COL_BLUE);
1196  InsColor(COL_CYAN);
1199  InsColor(COL_RED);
1201  InsColor(COL_GRAY);
1203 
1204  // char color
1205  {
1206  auto pCol = GetDfltAttr(RES_CHRATR_COLOR);
1207  InsColor(pCol->GetValue());
1208  if ((pCol = rPool.GetPoolDefaultItem(RES_CHRATR_COLOR)))
1209  InsColor(pCol->GetValue());
1210  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(RES_CHRATR_COLOR))
1211  {
1212  if ((pCol = dynamic_cast<const SvxColorItem*>(pItem)))
1213  InsColor(pCol->GetValue());
1214  }
1215 
1216  auto pUnder = GetDfltAttr(RES_CHRATR_UNDERLINE);
1217  InsColor(pUnder->GetColor());
1218  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(RES_CHRATR_UNDERLINE))
1219  {
1220  if ((pUnder = dynamic_cast<const SvxUnderlineItem*>(pItem)))
1221  InsColor(pUnder->GetColor());
1222  }
1223 
1224  auto pOver = GetDfltAttr(RES_CHRATR_OVERLINE);
1225  InsColor(pOver->GetColor());
1226  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(RES_CHRATR_OVERLINE))
1227  {
1228  if ((pOver = dynamic_cast<const SvxOverlineItem*>(pItem)))
1229  InsColor(pOver->GetColor());
1230  }
1231  }
1232 
1233  // background color
1234  static const sal_uInt16 aBrushIds[] = { RES_BACKGROUND, RES_CHRATR_BACKGROUND, 0 };
1235 
1236  for (const sal_uInt16* pIds = aBrushIds; *pIds; ++pIds)
1237  {
1238  auto pBackground = static_cast<const SvxBrushItem*>(GetDfltAttr(*pIds));
1239  InsColor(pBackground->GetColor());
1240  if ((pBackground = static_cast<const SvxBrushItem*>(rPool.GetPoolDefaultItem(*pIds))))
1241  {
1242  InsColor(pBackground->GetColor());
1243  }
1244  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(*pIds))
1245  {
1246  if ((pBackground = static_cast<const SvxBrushItem*>(pItem)))
1247  {
1248  InsColor(pBackground->GetColor());
1249  }
1250  }
1251  }
1252 
1253  // shadow color
1254  {
1255  auto pShadow = GetDfltAttr(RES_SHADOW);
1256  InsColor(pShadow->GetColor());
1257  if (nullptr != (pShadow = rPool.GetPoolDefaultItem(RES_SHADOW)))
1258  {
1259  InsColor(pShadow->GetColor());
1260  }
1261  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(RES_SHADOW))
1262  {
1263  if ((pShadow = dynamic_cast<const SvxShadowItem*>(pItem)))
1264  {
1265  InsColor(pShadow->GetColor());
1266  }
1267  }
1268  }
1269 
1270  // frame border color
1271  {
1272  const SvxBoxItem* pBox;
1273  if (nullptr != (pBox = rPool.GetPoolDefaultItem(RES_BOX)))
1274  InsColorLine(*pBox);
1275  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(RES_BOX))
1276  {
1277  if ((pBox = dynamic_cast<const SvxBoxItem*>(pItem)))
1278  InsColorLine(*pBox);
1279  }
1280  }
1281 
1282  {
1283  const SvxBoxItem* pCharBox;
1284  if ((pCharBox = rPool.GetPoolDefaultItem(RES_CHRATR_BOX)))
1285  InsColorLine(*pCharBox);
1286  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(RES_CHRATR_BOX))
1287  {
1288  if ((pCharBox = dynamic_cast<const SvxBoxItem*>(pItem)))
1289  InsColorLine(*pCharBox);
1290  }
1291  }
1292 
1293  // TextFrame or paragraph background solid fill.
1294  for (const SfxPoolItem* pItem : rPool.GetItemSurrogates(XATTR_FILLCOLOR))
1295  {
1296  if (auto pColorItem = dynamic_cast<const XFillColorItem*>(pItem))
1297  InsColor(pColorItem->GetColorValue());
1298  }
1299 
1300  for (std::size_t n = 0; n < m_aColTable.size(); ++n)
1301  {
1302  const Color& rCol = m_aColTable[n];
1303  if (n || COL_AUTO != rCol)
1304  {
1306  OutULong(rCol.GetRed()).WriteCharPtr(OOO_STRING_SVTOOLS_RTF_GREEN);
1307  OutULong(rCol.GetGreen()).WriteCharPtr(OOO_STRING_SVTOOLS_RTF_BLUE);
1308  OutULong(rCol.GetBlue());
1309  }
1310  Strm().WriteChar(';');
1311  }
1312 }
1313 
1314 void RtfExport::InsStyle(sal_uInt16 nId, const OString& rStyle)
1315 {
1316  m_aStyTable.insert(std::pair<sal_uInt16, OString>(nId, rStyle));
1317 }
1318 
1319 OString* RtfExport::GetStyle(sal_uInt16 nId)
1320 {
1321  auto it = m_aStyTable.find(nId);
1322  if (it != m_aStyTable.end())
1323  return &it->second;
1324  return nullptr;
1325 }
1326 
1327 sal_uInt16 RtfExport::GetRedline(const OUString& rAuthor)
1328 {
1329  auto it = m_aRedlineTable.find(rAuthor);
1330  if (it != m_aRedlineTable.end())
1331  return it->second;
1332 
1333  const sal_uInt16 nId = m_aRedlineTable.size();
1334  m_aRedlineTable.insert(std::pair<OUString, sal_uInt16>(rAuthor, nId));
1335  return nId;
1336 }
1337 
1338 const OUString* RtfExport::GetRedline(sal_uInt16 nId)
1339 {
1340  for (const auto& rEntry : m_aRedlineTable)
1341  if (rEntry.second == nId)
1342  return &rEntry.first;
1343  return nullptr;
1344 }
1345 
1346 void RtfExport::OutPageDescription(const SwPageDesc& rPgDsc, bool bCheckForFirstPage)
1347 {
1348  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " start");
1349  const SwPageDesc* pSave = m_pCurrentPageDesc;
1350 
1351  m_pCurrentPageDesc = &rPgDsc;
1352  if (bCheckForFirstPage && m_pCurrentPageDesc->GetFollow()
1355 
1358 
1359  const SwFormat* pFormat = &m_pCurrentPageDesc->GetMaster(); //GetLeft();
1360  m_bOutPageDescs = true;
1361  if (m_pCurrentPageDesc != &rPgDsc)
1363  OutputFormat(*pFormat, true, false);
1364  m_pFirstPageItemSet = nullptr;
1365  m_bOutPageDescs = false;
1366 
1367  // normal header / footer (without a style)
1368  const SfxPoolItem* pItem;
1370  == SfxItemState::SET)
1371  WriteHeaderFooter(*pItem, true);
1373  == SfxItemState::SET)
1374  WriteHeaderFooter(*pItem, false);
1375 
1376  // title page
1377  if (m_pCurrentPageDesc != &rPgDsc)
1378  {
1380  m_pCurrentPageDesc = &rPgDsc;
1382  == SfxItemState::SET)
1383  WriteHeaderFooter(*pItem, true);
1385  == SfxItemState::SET)
1386  WriteHeaderFooter(*pItem, false);
1387  }
1388 
1389  // numbering type
1391  boost::none);
1392 
1393  m_pCurrentPageDesc = pSave;
1394  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " end");
1395 }
1396 
1397 void RtfExport::WriteHeaderFooter(const SfxPoolItem& rItem, bool bHeader)
1398 {
1399  if (bHeader)
1400  {
1401  const auto& rHeader = static_cast<const SwFormatHeader&>(rItem);
1402  if (!rHeader.IsActive())
1403  return;
1404  }
1405  else
1406  {
1407  const auto& rFooter = static_cast<const SwFormatFooter&>(rItem);
1408  if (!rFooter.IsActive())
1409  return;
1410  }
1411 
1412  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " start");
1413 
1414  const sal_Char* pStr
1416  /* is this a title page? */
1418  {
1421  }
1422  Strm().WriteChar('{').WriteCharPtr(pStr);
1424  Strm().WriteChar('}');
1425 
1426  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " end");
1427 }
1428 
1429 void RtfExport::WriteHeaderFooter(const SwFrameFormat& rFormat, bool bHeader, const sal_Char* pStr,
1430  bool bTitlepg)
1431 {
1432  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " start");
1433 
1434  m_pAttrOutput->WriteHeaderFooter_Impl(rFormat, bHeader, pStr, bTitlepg);
1435 
1436  SAL_INFO("sw.rtf", OSL_THIS_FUNC << " end");
1437 }
1438 
1440 class SwRTFWriter : public Writer
1441 {
1442 private:
1444 
1445 public:
1446  SwRTFWriter(const OUString& rFilterName, const OUString& rBaseURL);
1447 
1448  ErrCode WriteStream() override;
1449 };
1450 
1451 SwRTFWriter::SwRTFWriter(const OUString& rFilterName, const OUString& rBaseURL)
1452 {
1453  SetBaseURL(rBaseURL);
1454  // export outline nodes, only (send outline to clipboard/presentation)
1455  m_bOutOutlineOnly = rFilterName.startsWith("O");
1456 }
1457 
1459 {
1460  SwPaM aPam(*m_pCurrentPam->End(), *m_pCurrentPam->Start());
1461  RtfExport aExport(nullptr, m_pDoc, &aPam, m_pCurrentPam, this, m_bOutOutlineOnly);
1462  aExport.ExportDocument(true);
1463  return ERRCODE_NONE;
1464 }
1465 
1466 extern "C" SAL_DLLPUBLIC_EXPORT void ExportRTF(const OUString& rFltName, const OUString& rBaseURL,
1467  WriterRef& xRet)
1468 {
1469  xRet = new SwRTFWriter(rFltName, rBaseURL);
1470 }
1471 
1472 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const css::uno::Reference< css::document::XDocumentProperties > & getDocumentProperties()
Definition: fmtatr2.cxx:838
long GetLeft() const
bool IsHyphen(sal_Unicode cChar)
SvxNumType GetNumberingType() const
long Width() const
const SwEndNode * EndOfSectionNode() const
Definition: node.hxx:682
std::unique_ptr< SvMemoryStream > m_pStream
If set, then Strm() returns this tream, instead of m_pWriter's stream.
Definition: rtfexport.hxx:229
SvStream & OutULong(sal_uLong nVal)
Definition: rtfexport.cxx:1087
#define OOO_STRING_SVTOOLS_RTF_FOOTERL
RedlineFlags m_nOrigRedlineFlags
Remember the original redline mode.
Definition: wrtww8.hxx:482
#define RES_CHRATR_WEIGHT
Definition: hintids.hxx:83
SVX_NUM_CHARS_UPPER_LETTER_N
sal_uLong GetIndex() const
Definition: node.hxx:282
SwNode & GetNode(bool bPoint=true) const
Definition: pam.hxx:223
std::unique_ptr< RtfAttributeOutput > m_pAttrOutput
Attribute output for document.
Definition: rtfexport.hxx:43
#define OOO_STRING_SVTOOLS_RTF_FTNNAUC
const HdFtFlags WW8_FOOTER_FIRST
Definition: ww8scan.hxx:1601
Class to collect and output the sections/headers/footers.
Definition: wrtww8.hxx:199
constexpr::Color COL_BROWN(0x80, 0x80, 0x00)
Represents the style of a paragraph.
Definition: fmtcol.hxx:55
void WriteMainText()
Definition: rtfexport.cxx:418
#define LO_STRING_SVTOOLS_RTF_LISTPICTURE
constexpr::Color COL_BLACK(0x00, 0x00, 0x00)
OString * GetStyle(sal_uInt16 nId)
Definition: rtfexport.cxx:1319
sal_uInt8 GetRed() const
bool IsSectionNode() const
Definition: node.hxx:644
void WriteHeaderFooter(const SfxPoolItem &rItem, bool bHeader)
Definition: rtfexport.cxx:1397
virtual void SectionBreaks(const SwNode &rNode)=0
Called in order to output section breaks.
void OutputEndNode(const SwEndNode &rEndNode) override
Output SwEndNode.
Definition: rtfexport.cxx:1002
#define OOO_STRING_SVTOOLS_RTF_SN
rtl_TextEncoding m_eCurrentEncoding
Definition: rtfexport.hxx:164
#define RES_HEADER
Definition: hintids.hxx:201
Pagedescriptor Client of SwPageDesc that is "described" by the attribute.
Definition: fmtpdsc.hxx:35
SwFrameFormat & GetLeft()
Definition: pagedesc.hxx:217
sal_uInt16 GetLower() const
MSWordSections * m_pSections
Sections/headers/footers.
Definition: rtfexport.hxx:46
#define OOO_STRING_SVTOOLS_RTF_STATICVAL
#define RES_CHRATR_FONTSIZE
Definition: hintids.hxx:76
SwPageDesc * GetPageDesc()
Definition: fmtpdsc.hxx:62
const SwLineNumberInfo & GetLineNumberInfo() const
Definition: lineinfo.cxx:50
#define OOO_STRING_SVTOOLS_RTF_PAPERW
#define OOO_STRING_SVTOOLS_RTF_COMPANY
bool m_bSubstituteBullets
Definition: wrtww8.hxx:558
bool IsOutline() const
Returns if this text node is an outline.
Definition: ndtxt.cxx:4002
static SvStream & OutLong(SvStream &rStrm, long nVal)
Definition: writer.cxx:232
SvStream & WriteInt32(sal_Int32 nInt32)
SwDocShell * GetDocShell()
Definition: doc.hxx:1340
SwPaM * m_pCurrentPam
Definition: shellio.hxx:406
constexpr::Color COL_LIGHTGREEN(0x00, 0xFF, 0x00)
long Height() const
#define OOO_STRING_SVTOOLS_RTF_AFTNNALC
const SwNumFormat * GetNumFormat(sal_uInt16 i) const
Definition: number.cxx:93
SwNodeIndex nNode
Definition: pam.hxx:37
const SfxPoolItem * GetPoolDefaultItem(sal_uInt16 nWhich) const
#define RES_CHRATR_CJK_POSTURE
Definition: hintids.hxx:93
RtfColorTable m_aColTable
Definition: rtfexport.hxx:225
constexpr::Color COL_RED(0x80, 0x00, 0x00)
long GetWidth() const
static sal_uLong GetSectionLineNo(const SfxItemSet *pSet, const SwNode &rNd)
Line number of the section start.
Definition: ww8atr.cxx:618
void OutputGrfNode(const SwGrfNode &rGrfNode) override
Output SwGrfNode.
Definition: rtfexport.cxx:1009
#define RES_SHADOW
Definition: hintids.hxx:212
#define OOO_STRING_SVTOOLS_RTF_FFTYPE
#define OOO_STRING_SVTOOLS_RTF_MARGR
SVX_NUM_NUMBER_NONE
#define OOO_STRING_SVTOOLS_RTF_FFOWNSTAT
AttributeOutputBase & AttrOutput() const override
Access to the attribute output class.
Definition: rtfexport.cxx:75
sal_uIntPtr sal_uLong
void WriteFontTable(SvStream *pTableStream, WW8Fib &pFib)
Definition: wrtw8sty.cxx:896
const SwPosition * GetMark() const
Definition: pam.hxx:209
Base class of all fields.
Definition: fldbas.hxx:279
void WriteNumbering() override
Write the numbering table.
Definition: rtfexport.cxx:222
#define OOO_STRING_SVTOOLS_RTF_PGDSCNXT
SVX_NUM_CHARS_UPPER_LETTER
knows all meta-fields in the document.
Definition: fmtmeta.hxx:198
#define OOO_STRING_SVTOOLS_RTF_FORMFIELD
Glue class to call RtfExport as an internal filter, needed by copy&paste support. ...
Definition: rtfexport.cxx:1440
SvStream & Strm()
Definition: rtfexport.cxx:1065
bool m_bOutPageDescs
PageDescs (section properties) are being written.
Definition: wrtww8.hxx:546
Definition: doc.hxx:185
void DoFormText(const SwInputField *pField) override
Definition: rtfexport.cxx:335
#define OOO_STRING_SVTOOLS_RTF_FFNAME
#define OOO_STRING_SVTOOLS_RTF_FTNNALC
sal_Int16 nId
#define RES_CHRATR_CJK_WEIGHT
Definition: hintids.hxx:94
#define RES_CHRATR_FONT
Definition: hintids.hxx:75
#define OOO_STRING_SVTOOLS_RTF_ANSI
constexpr::Color COL_GRAY(0x80, 0x80, 0x80)
virtual void SectionBreak(sal_uInt8 nC, const WW8_SepInfo *pSectionInfo=nullptr)=0
Write a section break msword::ColumnBreak or msword::PageBreak.
#define OOO_STRING_SVTOOLS_RTF_FIELD
constexpr::Color COL_LIGHTRED(0xFF, 0x00, 0x00)
SwSectionFormat * GetFormat()
Definition: section.hxx:337
Dialog to specify the properties of drop-down form field.
Definition: accframe.hxx:34
#define OOO_STRING_SVTOOLS_RTF_FLDRSLT
constexpr::Color COL_LIGHTGRAY(0xC0, 0xC0, 0xC0)
#define RES_CHRATR_CJK_FONTSIZE
Definition: hintids.hxx:91
#define OOO_STRING_SVTOOLS_RTF_PGDSCNO
const editeng::SvxBorderLine * GetRight() const
#define OOO_STRING_SVTOOLS_RTF_SBKNONE
constexpr::Color COL_YELLOW(0xFF, 0xFF, 0x00)
#define OOO_STRING_SVTOOLS_RTF_FFDEFTEXT
#define OOO_STRING_SVTOOLS_RTF_FONTTBL
#define RES_PROTECT
Definition: hintids.hxx:205
rtl_TextEncoding m_eDefaultEncoding
Definition: rtfexport.hxx:163
#define OOO_STRING_SVTOOLS_RTF_REVTIM
SvStream & WriteCharPtr(const char *pBuf)
#define OOO_STRING_SVTOOLS_RTF_MARGT
SwTableFormat * GetFrameFormat()
Definition: swtable.hxx:201
const OUString & GetHelp() const
Definition: expfld.cxx:1416
#define OOO_STRING_SVTOOLS_RTF_AUTHOR
#define XATTR_FILLCOLOR
const OUString & GetName() const
Definition: pagedesc.hxx:186
sal_uInt16 GetRedline(const OUString &rAuthor)
Definition: rtfexport.cxx:1327
bool m_bOutOutlineOnly
Definition: rtfexport.cxx:1443
size_type size() const
Definition: docary.hxx:370
#define OOO_STRING_SVTOOLS_RTF_AFTNSTART
constexpr::Color COL_MAGENTA(0x80, 0x00, 0x80)
const SwSection & GetSection() const
Definition: node.hxx:541
Writer * m_pWriter
Definition: rtfexport.hxx:40
void OutputField(const SwField *pField, ww::eField eFieldType, const OUString &rFieldCmd, FieldFlags nMode=FieldFlags::All) override
Write the field.
Definition: rtfexport.cxx:312
#define OOO_STRING_SVTOOLS_RTF_AFTNNAR
constexpr::Color COL_AUTO(0xFF, 0xFF, 0xFF, 0xFF)
const SwPageFootnoteInfo & GetFootnoteInfo() const
Definition: pagedesc.hxx:195
void WriteText()
Iterate through the nodes and call the appropriate OutputNode() on them.
Definition: wrtww8.cxx:2710
sal_uInt16 sal_Unicode
void AppendBookmarks(const SwTextNode &rNode, sal_Int32 nCurrentPos, sal_Int32 nLen) override
Definition: rtfexport.cxx:115
FieldFlags
Definition: wrtww8.hxx:147
SwTableNode * GetTableNode()
Definition: node.hxx:599
bool m_bWriteOnlyFirstTable
Definition: shellio.hxx:410
#define OOO_STRING_SVTOOLS_RTF_FTNNAR
void InsStyle(sal_uInt16 nId, const OString &rStyle)
Definition: rtfexport.cxx:1314
The class that does all the actual RTF export-related work.
Definition: rtfexport.hxx:36
bool m_bExportModeRTF
Definition: wrtww8.hxx:562
void InsColorLine(const SvxBoxItem &rBox)
Definition: rtfexport.cxx:1157
#define OOO_STRING_SVTOOLS_RTF_HEADERF
constexpr::Color COL_LIGHTCYAN(0x00, 0xFF, 0xFF)
#define OOO_STRING_SVTOOLS_RTF_TITLEPG
#define OOO_STRING_SVTOOLS_RTF_REVTBL
void WriteUserPropType(int nType)
Writes a single user property type.
Definition: rtfexport.cxx:522
void OutputFormat(const SwFormat &rFormat, bool bPapFormat, bool bChpFormat, bool bFlyFormat=false)
Output attributes.
Definition: ww8atr.cxx:753
IDocumentStylePoolAccess const & getIDocumentStylePoolAccess() const
Definition: doc.cxx:458
#define OOO_STRING_SVTOOLS_RTF_FTNNRLC
constexpr::Color COL_CYAN(0x00, 0x80, 0x80)
char sal_Char
void OutputTextNode(SwTextNode &rNode) override
Output SwTextNode is depending on outline export mode.
Definition: rtfexport.cxx:1021
Footer, for pageformats Client of FrameFormat describing the footer.
Definition: fmthdft.hxx:64
#define DEF_ENCODING
Definition: rtfexport.cxx:73
#define OOO_STRING_SVTOOLS_RTF_PRINTIM
const SfxItemSet * m_pFirstPageItemSet
Item set of the first page during export of a follow page format.
Definition: rtfexport.hxx:231
void OutputLinkedOLE(const OUString &rLink) override
Definition: rtfexport.cxx:1019
PAPER_A4
eField
Definition: fields.hxx:26
const sal_uInt8 MAXLEVEL
Definition: swtypes.hxx:95
SvxNumberType aFormat
Definition: ftninfo.hxx:46
bool GetAnnotationMarks(const SwTextNode &rNd, sal_Int32 nStt, sal_Int32 nEnd, IMarkVector &rArr)
Definition: wrtw8nds.cxx:1892
SVX_NUM_ROMAN_UPPER
sal_uInt32 RGBToBGR(::Color nColour)
Definition: ww8struc.hxx:1082
bool DisallowInheritingOutlineNumbering(const SwFormat &rFormat) override
Return value indicates if an inherited outline numbering is suppressed.
Definition: rtfexport.cxx:980
const SwTable & GetTable() const
Definition: node.hxx:497
const HdFtFlags WW8_FOOTER_EVEN
Definition: ww8scan.hxx:1598
SVX_NUM_ROMAN_LOWER
static OUString GetGeneratorString()
const SfxPoolItem * GetDfltAttr(sal_uInt16 nWhich)
Get the default attribute from corresponding default attribute table.
Definition: hints.cxx:153
#define RES_PARATR_NUMRULE
Definition: hintids.hxx:170
#define OOO_STRING_SVTOOLS_RTF_FTNNRUC
const OUString & GetPrefix() const
RedlineFlags on.
bool CollapseScriptsforWordOk(sal_uInt16 nScript, sal_uInt16 nWhich) override
Guess the script (asian/western).
Definition: rtfexport.cxx:81
ww8::WW8TableInfo::Pointer_t m_pTableInfo
Definition: wrtww8.hxx:472
#define OOO_STRING_SVTOOLS_RTF_PAPERH
SAL_DLLPUBLIC_EXPORT void ExportRTF(const OUString &rFltName, const OUString &rBaseURL, WriterRef &xRet)
Definition: rtfexport.cxx:1466
const OUString & GetSuffix() const
#define OOO_STRING_SVTOOLS_RTF_YR
sal_uInt8 GetBlue() const
#define OOO_STRING_SVTOOLS_RTF_SP
RtfExportFilter * m_pFilter
Pointer to the filter that owns us.
Definition: rtfexport.hxx:39
#define OOO_STRING_SVTOOLS_RTF_FFOWNHELP
const HdFtFlags WW8_HEADER_ODD
Definition: ww8scan.hxx:1597
SwPageDesc * FindPageDesc(const OUString &rName, size_t *pPos=nullptr) const
Definition: docdesc.cxx:829
void SetBaseURL(const OUString &rURL)
Definition: shellio.hxx:395
Base class for various Writer styles.
Definition: format.hxx:43
SwNode & GetEndOfContent() const
Regular ContentSection (i.e. the BodyText).
Definition: ndarr.hxx:164
#define OOO_STRING_SVTOOLS_RTF_FFTYPETXT
#define OOO_STRING_SVTOOLS_RTF_MARGB
#define RES_BACKGROUND
Definition: hintids.hxx:210
#define OOO_STRING_SVTOOLS_RTF_MIN
#define OOO_STRING_SVTOOLS_RTF_FTNSEP
int CollectGrfsOfBullets()
Populates m_vecBulletPic with all the bullet graphics used by numberings.
Definition: wrtww8.cxx:1542
SVX_NUM_CHAR_SPECIAL
void InsColor(const Color &rCol)
Definition: rtfexport.cxx:1132
#define RES_CHRATR_COLOR
Definition: hintids.hxx:71
bool IsContentNode() const
Definition: node.hxx:628
PaM is Point and Mark: a selection of the document model.
Definition: pam.hxx:136
std::map< sal_uInt16, OString > m_aStyTable
Definition: rtfexport.hxx:226
#define LO_STRING_SVTOOLS_RTF_GENERATOR
const editeng::SvxBorderLine * GetTop() const
void WriteFormData(const ::sw::mark::IFieldmark &rFieldmark) override
Write the data of the form field.
Definition: rtfexport.cxx:318
#define OOO_STRING_SVTOOLS_RTF_FTNRSTCONT
Style of a layout element.
Definition: frmfmt.hxx:57
#define OOO_STRING_SVTOOLS_RTF_HEADERL
void AppendAnnotationMarks(const SwTextNode &rNode, sal_Int32 nCurrentPos, sal_Int32 nLen) override
Definition: rtfexport.cxx:150
#define RES_CHRATR_OVERLINE
Definition: hintids.hxx:106
void WriteHeadersFooters(sal_uInt8 nHeadFootFlags, const SwFrameFormat &rFormat, const SwFrameFormat &rLeftFormat, const SwFrameFormat &rFirstPageFormat, sal_uInt8 nBreakCode) override
Output the actual headers and footers.
Definition: rtfexport.cxx:287
SVX_NUM_CHARS_LOWER_LETTER
#define SW_MOD()
Definition: swmodule.hxx:255
#define OOO_STRING_SVTOOLS_RTF_BLUE
#define RES_CHRATR_BACKGROUND
Definition: hintids.hxx:89
#define OOO_STRING_SVTOOLS_RTF_PROPTYPE
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
const editeng::SvxBorderLine * GetLeft() const
#define OOO_STRING_SVTOOLS_RTF_DOCCOMM
#define OOO_STRING_SVTOOLS_RTF_SECTUNLOCKED
const SwStartNode * StartOfSectionNode() const
Definition: node.hxx:131
const SwPosition * GetPoint() const
Definition: pam.hxx:207
#define RES_CHRATR_BOX
Definition: hintids.hxx:108
void WriteUserProps()
Writes the userprops group: user defined document properties.
Definition: rtfexport.cxx:535
#define OOO_STRING_SVTOOLS_RTF_AENDDOC
const SwPageDesc & GetPageDesc(const size_t i) const
Definition: doc.hxx:875
sal_uInt16 GetId(const SwNumRule &rNumRule)
Return the numeric id of the numbering rule.
Definition: wrtw8num.cxx:73
void setStream()
From now on, let Strm() return a memory stream, not a real one.
Definition: rtfexport.cxx:1073
#define OOO_STRING_SVTOOLS_RTF_LANDSCAPE
const Color & GetColor() const
bool GetLandscape() const
Definition: pagedesc.hxx:189
#define OOO_STRING_SVTOOLS_RTF_MARGL
#define OOO_STRING_SVTOOLS_RTF_BACKGROUND
void AppendBookmark(const OUString &rName) override
Definition: rtfexport.cxx:139
virtual void OutputTextNode(SwTextNode &)
Output SwTextNode.
Definition: wrtw8nds.cxx:2093
OUString sName
void DoComboBox(const OUString &rName, const OUString &rHelp, const OUString &ToolTip, const OUString &rSelected, css::uno::Sequence< OUString > &rListItems) override
Definition: rtfexport.cxx:328
int i
SwContentNode * GetContentNode()
Definition: node.hxx:615
#define OOO_STRING_SVTOOLS_RTF_PGDSC
#define RES_PARATR_HYPHENZONE
Definition: hintids.hxx:167
UseOnPage ReadUseOn() const
Definition: pagedesc.hxx:214
const WW8_SepInfo * CurrentSectionInfo()
The most recent WW8_SepInfo.
Definition: wrtw8sty.cxx:1068
size_t GetPageDescCnt() const
Definition: doc.hxx:874
size_t size() const
Definition: docary.hxx:90
void WriteRevTab()
Write the revision table.
Definition: rtfexport.cxx:254
#define OOO_STRING_SVTOOLS_RTF_SECTD
#define RES_CHRATR_UNDERLINE
Definition: hintids.hxx:82
#define OOO_STRING_SVTOOLS_RTF_PGDSCTBL
SfxItemState GetItemState(sal_uInt16 nWhich, bool bSrchInParent=true, const SfxPoolItem **ppItem=nullptr) const
Definition: format.cxx:398
RtfExport(RtfExportFilter *pFilter, SwDoc *pDocument, SwPaM *pCurrentPam, SwPaM *pOriginalPam, Writer *pWriter, bool bOutOutlineOnly=false)
Pass the pDocument, pCurrentPam and pOriginalPam to the base class.
Definition: rtfexport.cxx:1036
Writer & GetWriter()
#define OOO_STRING_SVTOOLS_RTF_SHP
void WriteStyles()
Definition: rtfexport.cxx:396
void OutUnicode(const sal_Char *pToken, const OUString &rContent, bool bUpr=false)
Definition: rtfexport.cxx:1091
#define OOO_STRING_SVTOOLS_RTF_RED
constexpr::Color COL_LIGHTMAGENTA(0xFF, 0x00, 0xFF)
static Size GetPaperSize(Paper ePaper, MapUnit eUnit=MapUnit::MapTwip)
#define OOO_STRING_SVTOOLS_RTF_CHFTNSEP
#define OOO_STRING_SVTOOLS_RTF_REVISIONS
void OutPageDescription(const SwPageDesc &rPgDsc, bool bCheckForFirstPage)
Definition: rtfexport.cxx:1346
#define OOO_STRING_SVTOOLS_RTF_HYPHAUTO
const SfxPoolItem & GetDefaultItem(sal_uInt16 nWhich) const
void WriteChar(sal_Unicode c) override
Definition: rtfexport.cxx:181
SVX_NUM_CHARS_LOWER_LETTER_N
MSWordSections & Sections() const override
Access to the sections/headers/footres.
Definition: rtfexport.cxx:77
IDocumentLayoutAccess const & getIDocumentLayoutAccess() const
Definition: doc.cxx:437
Handles export of drawings using RTF markup.
#define OOO_STRING_SVTOOLS_RTF_USERPROPS
const long LONG_MAX
const SwPosition * Start() const
Definition: pam.hxx:212
SwRTFWriter(const OUString &rFilterName, const OUString &rBaseURL)
Definition: rtfexport.cxx:1451
#define OOO_STRING_SVTOOLS_RTF_SHPINST
< purpose of derivation from SwClient: character style for displaying the numbers.
Definition: lineinfo.hxx:37
virtual void SectionPageNumbering(sal_uInt16 nNumType, const ::boost::optional< sal_uInt16 > &oPageRestartNumber)=0
The style of the page numbers.
std::shared_ptr< SvxBrushItem > getBackground()
Get background color of the document, if there is one.
Definition: wrtww8.cxx:1525
SwPaM * m_pCurPam
Definition: wrtww8.hxx:569
#define OOO_STRING_SVTOOLS_RTF_MO
SvStream & OutLong(long nVal)
Definition: rtfexport.cxx:1089
const SwPageDesc * GetFollow() const
Definition: pagedesc.hxx:245
#define OOO_STRING_SVTOOLS_RTF_FFSTATTEXT
void AppendSection(const SwPageDesc *pPageDesc, const SwSectionFormat *pFormat, sal_uLong nLnNum) override
Definition: rtfexport.cxx:1029
#define RES_FOOTER
Definition: hintids.hxx:202
void WriteHeaderFooterText(const SwFormat &rFormat, bool bHeader)
Write header/footer text.
Definition: wrtw8sty.cxx:1872
OString OUStringToOString(const OUString &str, ConnectionSettings const *settings)
sal_uInt8 GetGreen() const
void AppendSection(const SwPageDesc *pPd, const SwSectionFormat *pSectionFormat, sal_uLong nLnNumRestartNo, bool bIsFirstParagraph=false)
Definition: wrtw8sty.cxx:1076
const SwNumFormat & Get(sal_uInt16 i) const
Definition: number.cxx:83
void WriteFonts()
Definition: rtfexport.cxx:386
#define OOO_STRING_SVTOOLS_RTF_FTNRESTART
void WriteFootnoteSettings()
Definition: rtfexport.cxx:403
void OutDateTime(const sal_Char *pStr, const css::util::DateTime &rDT)
Definition: rtfexport.cxx:1108
SwFormat * DerivedFrom() const
Definition: format.hxx:108
SwFrameFormat & GetMaster()
Definition: pagedesc.hxx:216
#define OOO_STRING_SVTOOLS_RTF_LISTOVERRIDETABLE
SwTextNode is a paragraph in the document model.
Definition: ndtxt.hxx:79
OString OutStringUpr(const sal_Char *pToken, const OUString &rStr, rtl_TextEncoding eDestEnc)
const SvxULSpaceItem & GetULSpace(bool=true) const
Definition: frmatr.hxx:76
#define OOO_STRING_SVTOOLS_RTF_FFHELPTEXT
#define OOO_STRING_SVTOOLS_RTF_IGNORE
OString getStream()
Get the contents of the memory stream as a string.
Definition: rtfexport.cxx:1075
OUString ExpandField(bool bCached, SwRootFrame const *pLayout) const
expand the field.
Definition: fldbas.cxx:412
OString OutString(const OUString &rStr, rtl_TextEncoding eDestEnc, bool bUnicode=true)
void resetStream()
Return back to the real stream.
Definition: rtfexport.cxx:1085
Footnote information.
Definition: pagedesc.hxx:47
IDocumentRedlineAccess const & getIDocumentRedlineAccess() const
Definition: doc.cxx:367
#define OOO_STRING_SVTOOLS_RTF_HEADER
#define OOO_STRING_SVTOOLS_RTF_KEYWORDS
const SwPageDesc * m_pCurrentPageDesc
Definition: wrtww8.hxx:488
const Fraction & GetWidth() const
Definition: pagedesc.hxx:64
#define OOO_STRING_SVTOOLS_RTF_FTNBJ
std::unique_ptr< SwNumRuleTable > m_pUsedNumTable
Definition: wrtww8.hxx:462
const SfxPoolItem & Get(sal_uInt16 nWhich, bool bSrchInParent=true) const
#define OOO_STRING_SVTOOLS_RTF_TITLE
std::unique_ptr< RtfSdrExport > m_pSdrExport
Definition: rtfexport.hxx:48
#define ERRCODE_NONE
bool IsPaintLineNumbers() const
Definition: lineinfo.hxx:81
#define OOO_STRING_SVTOOLS_RTF_LNDSCPSXN
virtual const SwViewShell * GetCurrentViewShell() const =0
Returns the layout set at the document.
unsigned char sal_uInt8
#define RES_CHRATR_POSTURE
Definition: hintids.hxx:79
constexpr::Color COL_GREEN(0x00, 0x80, 0x00)
void BuildNumbering()
This is necessary to have the numbering table ready before the main text is being processed...
Definition: rtfexport.cxx:203
#define OOO_STRING_SVTOOLS_RTF_CREATIM
void OutputOLENode(const SwOLENode &rOLENode) override
Output SwOLENode.
Definition: rtfexport.cxx:1014
sal_uInt8 rtl_TextEncodingToWinCharset(rtl_TextEncoding eTextEncoding)
MSOffice appears to set the charset of unicode fonts to MS 932.
const SwNumRuleTable & GetNumRuleTable() const
Definition: doc.hxx:1055
#define OOO_STRING_SVTOOLS_RTF_AFTNNRUC
bool bLoadAllFonts
If true, all fonts are loaded before processing the document.
Definition: wrtww8.hxx:342
#define OOO_STRING_SVTOOLS_RTF_FLDINST
#define SAL_INFO(area, stream)
#define OOO_STRING_SVTOOLS_RTF_PGDSCUSE
const HdFtFlags WW8_HEADER_FIRST
Definition: ww8scan.hxx:1600
bool IsUsed(const SwModify &) const
Definition: poolfmt.cxx:122
static SvStream & OutULong(SvStream &rStrm, sal_uLong nVal)
Definition: writer.cxx:241
SwFootnoteNum eNum
Definition: ftninfo.hxx:97
void OutColorTable()
Definition: rtfexport.cxx:1180
IDocumentSettingAccess const & getIDocumentSettingAccess() const
Definition: doc.cxx:208
SwNodes & GetNodes()
Definition: doc.hxx:403
#define OOO_STRING_SVTOOLS_RTF_FOOTERF
virtual SwTextFormatColl * GetTextCollFromPool(sal_uInt16 nId, bool bRegardLanguage=true)=0
Return "Auto-Collection with ID.
#define OOO_STRING_SVTOOLS_RTF_AFTNNCHI
sal_uInt16 nFootnoteOffset
Definition: ftninfo.hxx:47
const sal_uInt8 PageBreak
#define OOO_STRING_SVTOOLS_RTF_RTF
Item2Range GetItemSurrogates(sal_uInt16 nWhich) const
#define OOO_STRING_SVTOOLS_RTF_DY
const SwPosition * End() const
Definition: pam.hxx:217
~RtfExport() override
Destructor.
sal_uInt8 m_nTextTyp
Definition: wrtww8.hxx:540
void NumberingDefinitions()
Write static data of SwNumRule - LSTF.
Definition: wrtw8num.cxx:172
::sw::MetaFieldManager & GetMetaFieldManager()
Definition: doc.cxx:160
#define LO_STRING_SVTOOLS_RTF_VIEWBKSP
sal_uInt16 GetId(const SvxFontItem &rFont)
Definition: wrtw8sty.cxx:879
ErrCode ExportDocument_Impl() override
Format-dependent part of the actual export.
Definition: rtfexport.cxx:680
void ExportGrfBullet(const SwTextNode &rNd) override
Definition: rtfexport.cxx:176
#define OOO_STRING_SVTOOLS_RTF_LEVEL
constexpr::Color COL_WHITE(0xFF, 0xFF, 0xFF)
bool GetBookmarks(const SwTextNode &rNd, sal_Int32 nStt, sal_Int32 nEnd, IMarkVector &rArr)
Definition: wrtw8nds.cxx:1856
#define OOO_STRING_SVTOOLS_RTF_AFTNRSTCONT
SvStream & WriteChar(char nChar)
virtual bool get(DocumentSettingId id) const =0
Return the specified document setting.
sal_uLong ReplaceCr(sal_uInt8 nChar) override
Definition: rtfexport.cxx:378
Header, for PageFormats Client of FrameFormat describing the header.
Definition: fmthdft.hxx:33
#define OOO_STRING_SVTOOLS_RTF_SUBJECT
const SwFormatFrameSize & GetFrameSize(bool=true) const
Definition: fmtfsize.hxx:104
#define OOO_STRING_SVTOOLS_RTF_GREEN
const SwAttrSet & GetSwAttrSet() const
Does node has already its own auto-attributes? Access to SwAttrSet.
Definition: node.hxx:723
long GetRight() const
SwTableNode * FindTableNode()
Search table node, in which it is.
Definition: node.cxx:351
#define OOO_STRING_SVTOOLS_RTF_PROPNAME
constexpr::Color COL_LIGHTBLUE(0x00, 0x00, 0xFF)
#define OOO_STRING_SVTOOLS_RTF_LISTTABLE
#define OOO_STRING_SVTOOLS_RTF_INFO
#define OOO_STRING_SVTOOLS_RTF_FTNNCHI
void WriteHyperlinkData(const ::sw::mark::IFieldmark &rFieldmark) override
Definition: rtfexport.cxx:323
#define OOO_STRING_SVTOOLS_RTF_ENDDOC
const OUString & GetToolTip() const
Definition: expfld.cxx:1426
SvStream & Strm()
Definition: writer.cxx:221
RtfSdrExport & SdrExporter() const
Access to the Rtf Sdr exporter.
Definition: rtfexport.cxx:79
#define RES_BOX
Definition: hintids.hxx:211
virtual void SectionLineNumbering(sal_uLong nRestartNo, const SwLineNumberInfo &rLnNumInfo)=0
Numbering of the lines in the document.
#define OOO_STRING_SVTOOLS_RTF_AFTNNAUC
void BulletDefinitions()
Write the numbering picture bullets.
Definition: wrtww8.cxx:1586
SwFootnotePos ePos
Definition: ftninfo.hxx:96
#define OOO_STRING_SVTOOLS_RTF_SV
Base class for WW8Export and DocxExport.
Definition: wrtww8.hxx:453
sal_uInt16 GetColor(const Color &rColor) const
Definition: rtfexport.cxx:1118
#define OOO_STRING_SVTOOLS_RTF_FTNSTART
bool IsTableNode() const
Definition: node.hxx:640
constexpr::Color COL_BLUE(0x00, 0x00, 0x80)
#define OOO_STRING_SVTOOLS_RTF_DEFF
SwSectionNode * GetSectionNode()
Definition: node.hxx:607
Ends a section of nodes in the document model.
Definition: node.hxx:333
#define LO_STRING_SVTOOLS_RTF_HTMAUTSP
const SwAttrSet & GetAttrSet() const
For querying the attribute array.
Definition: format.hxx:116
bool const m_bOutOutlineOnly
Definition: rtfexport.hxx:49
#define OOO_STRING_SVTOOLS_RTF_FORMSHADE
virtual const SwRedlineTable & GetRedlineTable() const =0
std::vector< ::sw::mark::IMark * > IMarkVector
Used to split the runs according to the bookmarks start and ends.
Definition: wrtww8.hxx:575
void PrepareNewPageDesc(const SfxItemSet *pSet, const SwNode &rNd, const SwFormatPageDesc *pNewPgDescFormat, const SwPageDesc *pNewPgDesc) override
Get ready for a new section.
Definition: rtfexport.cxx:960
#define RES_PAGEDESC
Definition: hintids.hxx:198
SwNode & GetEndOfExtras() const
This is the last EndNode of a special section.
Definition: ndarr.hxx:162
long GetHeight() const
#define OOO_STRING_SVTOOLS_RTF_MARGMIRROR
#define OOO_STRING_SVTOOLS_RTF_FORMPROT
void WritePageDescTable()
Writes the writer-specific group.
Definition: rtfexport.cxx:634
std::map< OUString, sal_uInt16 > m_aRedlineTable
Definition: rtfexport.hxx:227
#define OOO_STRING_SVTOOLS_RTF_FTNRSTPG
ErrCode WriteStream() override
Definition: rtfexport.cxx:1458
const editeng::SvxBorderLine * GetBottom() const
sal_uLong m_nCurrentNodeIndex
Index of the current SwTextNode, if any.
Definition: rtfexport.hxx:168
virtual OUString GetPar2() const override
aPromptText
Definition: expfld.cxx:1406
const SwFootnoteInfo & GetFootnoteInfo() const
Definition: doc.hxx:624
OUString convertCommaSeparated(uno::Sequence< OUString > const &i_rSeq)
wwFontHelper m_aFontHelper
Definition: wrtww8.hxx:456
#define OOO_STRING_SVTOOLS_RTF_HR
SwDoc * m_pDoc
Definition: wrtww8.hxx:567
const SwEndNoteInfo & GetEndNoteInfo() const
Definition: doc.hxx:626
#define SAL_NEWLINE_STRING
The physical access to the RTF document (for writing).
SwDoc * m_pDoc
Definition: shellio.hxx:404
const HdFtFlags WW8_FOOTER_ODD
Definition: ww8scan.hxx:1599
std::vector< const Graphic * > m_vecBulletPic
Vector to record all the graphics of bullets.
Definition: wrtww8.hxx:890
const SwAttrPool & GetAttrPool() const
Definition: doc.hxx:1307
static const SwSectionFormat * GetSectionFormat(const SwNode &rNd)
Format of the section.
Definition: ww8atr.cxx:605
#define OOO_STRING_SVTOOLS_RTF_VIEWSCALE
void AbstractNumberingDefinitions()
Write all Levels for all SwNumRules - LVLF.
Definition: wrtw8num.cxx:348
void WriteInfo()
Definition: rtfexport.cxx:464
SwNumRule * GetOutlineNumRule() const
Definition: doc.hxx:1013
void WriteUserPropValue(const OUString &rValue)
Writes a single user property value.
Definition: rtfexport.cxx:528
sal_uInt16 GetUpper() const
std::unique_ptr< MSWordStyles > m_pStyles
Definition: wrtww8.hxx:494
const HdFtFlags WW8_HEADER_EVEN
Definition: ww8scan.hxx:1596
#define OOO_STRING_SVTOOLS_RTF_FOOTER
const SvxLRSpaceItem & GetLRSpace(bool=true) const
Definition: frmatr.hxx:74
Base class of the Writer document model elements.
Definition: node.hxx:79
static bool IsExportNumRule(const SwNumRule &rRule)
Definition: rtfexport.cxx:183
#define OOO_STRING_SVTOOLS_RTF_AFTNNRLC
const SvxNumberType & GetNumType() const
Definition: pagedesc.hxx:192