xref: /aoo4110/main/sw/source/filter/ww8/wrtw8nds.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sw.hxx"
26*b1cdbd2cSJim Jagielski /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <vector>
29*b1cdbd2cSJim Jagielski #include <list>
30*b1cdbd2cSJim Jagielski #include <utility>
31*b1cdbd2cSJim Jagielski #include <algorithm>
32*b1cdbd2cSJim Jagielski #include <functional>
33*b1cdbd2cSJim Jagielski #include <iostream>
34*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
35*b1cdbd2cSJim Jagielski #   include <cstdio>
36*b1cdbd2cSJim Jagielski #endif
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <hintids.hxx>
39*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
40*b1cdbd2cSJim Jagielski #include <editeng/boxitem.hxx>
41*b1cdbd2cSJim Jagielski #include <editeng/cmapitem.hxx>
42*b1cdbd2cSJim Jagielski #include <editeng/langitem.hxx>
43*b1cdbd2cSJim Jagielski #include <editeng/svxfont.hxx>
44*b1cdbd2cSJim Jagielski #include <editeng/lrspitem.hxx>
45*b1cdbd2cSJim Jagielski #include <editeng/brshitem.hxx>
46*b1cdbd2cSJim Jagielski #include <editeng/fontitem.hxx>
47*b1cdbd2cSJim Jagielski #include <editeng/keepitem.hxx>
48*b1cdbd2cSJim Jagielski #include <editeng/fhgtitem.hxx>
49*b1cdbd2cSJim Jagielski #include <editeng/ulspitem.hxx>
50*b1cdbd2cSJim Jagielski #include <editeng/brkitem.hxx>
51*b1cdbd2cSJim Jagielski #include <editeng/frmdiritem.hxx>
52*b1cdbd2cSJim Jagielski #include <editeng/tstpitem.hxx>
53*b1cdbd2cSJim Jagielski #include "svl/urihelper.hxx"
54*b1cdbd2cSJim Jagielski #include <svl/whiter.hxx>
55*b1cdbd2cSJim Jagielski #include <fmtpdsc.hxx>
56*b1cdbd2cSJim Jagielski #include <fmtfsize.hxx>
57*b1cdbd2cSJim Jagielski #include <fmtornt.hxx>
58*b1cdbd2cSJim Jagielski #include <fmtlsplt.hxx>
59*b1cdbd2cSJim Jagielski #include <fmtflcnt.hxx>
60*b1cdbd2cSJim Jagielski #include <fmtanchr.hxx>
61*b1cdbd2cSJim Jagielski #include <fmtcntnt.hxx>
62*b1cdbd2cSJim Jagielski #include <frmatr.hxx>
63*b1cdbd2cSJim Jagielski #include <paratr.hxx>
64*b1cdbd2cSJim Jagielski #include <txatbase.hxx>
65*b1cdbd2cSJim Jagielski #include <fmtinfmt.hxx>
66*b1cdbd2cSJim Jagielski #include <fmtrfmrk.hxx>
67*b1cdbd2cSJim Jagielski #include <fchrfmt.hxx>
68*b1cdbd2cSJim Jagielski #include <fmtautofmt.hxx>
69*b1cdbd2cSJim Jagielski #include <charfmt.hxx>
70*b1cdbd2cSJim Jagielski #include <tox.hxx>
71*b1cdbd2cSJim Jagielski #include <ndtxt.hxx>
72*b1cdbd2cSJim Jagielski #include <pam.hxx>
73*b1cdbd2cSJim Jagielski #include <doc.hxx>
74*b1cdbd2cSJim Jagielski #include <docary.hxx>
75*b1cdbd2cSJim Jagielski #include <swtable.hxx>
76*b1cdbd2cSJim Jagielski #include <swtblfmt.hxx>
77*b1cdbd2cSJim Jagielski #include <section.hxx>
78*b1cdbd2cSJim Jagielski #include <pagedesc.hxx>
79*b1cdbd2cSJim Jagielski #include <swrect.hxx>
80*b1cdbd2cSJim Jagielski #include <reffld.hxx>
81*b1cdbd2cSJim Jagielski #include <redline.hxx>
82*b1cdbd2cSJim Jagielski #include <wrtswtbl.hxx>
83*b1cdbd2cSJim Jagielski #include <htmltbl.hxx>
84*b1cdbd2cSJim Jagielski #include <txttxmrk.hxx>
85*b1cdbd2cSJim Jagielski #include <fmtline.hxx>
86*b1cdbd2cSJim Jagielski #include <fmtruby.hxx>
87*b1cdbd2cSJim Jagielski #include <breakit.hxx>
88*b1cdbd2cSJim Jagielski #include <txtatr.hxx>
89*b1cdbd2cSJim Jagielski #include <fmtsrnd.hxx>
90*b1cdbd2cSJim Jagielski #include <fmtrowsplt.hxx>
91*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/ScriptType.hdl>
92*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/WordType.hpp>
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski #include <writerfilter/doctok/sprmids.hxx>
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski #include "writerhelper.hxx"
97*b1cdbd2cSJim Jagielski #include "writerwordglue.hxx"
98*b1cdbd2cSJim Jagielski #include <numrule.hxx>
99*b1cdbd2cSJim Jagielski #include "wrtww8.hxx"
100*b1cdbd2cSJim Jagielski #include "ww8par.hxx"
101*b1cdbd2cSJim Jagielski #include <IMark.hxx>
102*b1cdbd2cSJim Jagielski #include "ww8attributeoutput.hxx"
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski #include <ndgrf.hxx>
105*b1cdbd2cSJim Jagielski #include <ndole.hxx>
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski #include <cstdio>
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
110*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::i18n;
111*b1cdbd2cSJim Jagielski using namespace sw::util;
112*b1cdbd2cSJim Jagielski using namespace sw::types;
113*b1cdbd2cSJim Jagielski using namespace sw::mark;
114*b1cdbd2cSJim Jagielski using namespace nsFieldFlags;
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 
lcl_getFieldCode(const IFieldmark * pFieldmark)117*b1cdbd2cSJim Jagielski static String lcl_getFieldCode( const IFieldmark* pFieldmark ) {
118*b1cdbd2cSJim Jagielski     ASSERT(pFieldmark!=NULL, "where is my fieldmark???");
119*b1cdbd2cSJim Jagielski     if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMTEXT ) ) {
120*b1cdbd2cSJim Jagielski         return String::CreateFromAscii(" FORMTEXT ");
121*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) ) {
122*b1cdbd2cSJim Jagielski         return String::CreateFromAscii(" FORMDROPDOWN ");
123*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX ) ) {
124*b1cdbd2cSJim Jagielski         return String::CreateFromAscii(" FORMCHECKBOX ");
125*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_TOC ) ) {
126*b1cdbd2cSJim Jagielski         return String::CreateFromAscii(" TOC ");
127*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_HYPERLINK ) ) {
128*b1cdbd2cSJim Jagielski         return String::CreateFromAscii(" HYPERLINK ");
129*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_PAGEREF ) ) {
130*b1cdbd2cSJim Jagielski         return String::CreateFromAscii(" PAGEREF ");
131*b1cdbd2cSJim Jagielski     } else {
132*b1cdbd2cSJim Jagielski         return pFieldmark->GetFieldname();
133*b1cdbd2cSJim Jagielski     }
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski 
lcl_getFieldId(const IFieldmark * pFieldmark)136*b1cdbd2cSJim Jagielski ww::eField lcl_getFieldId( const IFieldmark* pFieldmark ) {
137*b1cdbd2cSJim Jagielski     ASSERT(pFieldmark!=NULL, "where is my fieldmark???");
138*b1cdbd2cSJim Jagielski     if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMTEXT ) ) {
139*b1cdbd2cSJim Jagielski         return ww::eFORMTEXT;
140*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) ) {
141*b1cdbd2cSJim Jagielski         return ww::eFORMDROPDOWN;
142*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX ) ) {
143*b1cdbd2cSJim Jagielski         return ww::eFORMCHECKBOX;
144*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_TOC ) ) {
145*b1cdbd2cSJim Jagielski         return ww::eTOC;
146*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_HYPERLINK ) ) {
147*b1cdbd2cSJim Jagielski         return ww::eHYPERLINK;
148*b1cdbd2cSJim Jagielski     } else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_PAGEREF ) ) {
149*b1cdbd2cSJim Jagielski         return ww::ePAGEREF;
150*b1cdbd2cSJim Jagielski     } else {
151*b1cdbd2cSJim Jagielski         return ww::eUNKNOWN;
152*b1cdbd2cSJim Jagielski     }
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski /*  */
156*b1cdbd2cSJim Jagielski 
MSWordAttrIter(MSWordExportBase & rExport)157*b1cdbd2cSJim Jagielski MSWordAttrIter::MSWordAttrIter( MSWordExportBase& rExport )
158*b1cdbd2cSJim Jagielski     : pOld( rExport.pChpIter ), m_rExport( rExport )
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     m_rExport.pChpIter = this;
161*b1cdbd2cSJim Jagielski }
162*b1cdbd2cSJim Jagielski 
~MSWordAttrIter()163*b1cdbd2cSJim Jagielski MSWordAttrIter::~MSWordAttrIter()
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski     m_rExport.pChpIter = pOld;
166*b1cdbd2cSJim Jagielski }
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski // Die Klasse SwAttrIter ist eine Hilfe zum Aufbauen der Fkp.chpx.
169*b1cdbd2cSJim Jagielski // Dabei werden nur Zeichen-Attribute beachtet; Absatz-Attribute brauchen
170*b1cdbd2cSJim Jagielski // diese Behandlung nicht.
171*b1cdbd2cSJim Jagielski // Die Absatz- und Textattribute des Writers kommen rein, und es wird
172*b1cdbd2cSJim Jagielski // mit Where() die naechste Position geliefert, an der sich die Attribute
173*b1cdbd2cSJim Jagielski // aendern. IsTxtAtr() sagt, ob sich an der mit Where() gelieferten Position
174*b1cdbd2cSJim Jagielski // ein Attribut ohne Ende und mit \xff im Text befindet.
175*b1cdbd2cSJim Jagielski // Mit OutAttr() werden die Attribute an der angegebenen SwPos
176*b1cdbd2cSJim Jagielski // ausgegeben.
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski class WW8SwAttrIter : public MSWordAttrIter
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski private:
181*b1cdbd2cSJim Jagielski     const SwTxtNode& rNd;
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski     CharRuns maCharRuns;
184*b1cdbd2cSJim Jagielski     cCharRunIter maCharRunIter;
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski     rtl_TextEncoding meChrSet;
187*b1cdbd2cSJim Jagielski     sal_uInt16 mnScript;
188*b1cdbd2cSJim Jagielski     bool mbCharIsRTL;
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski     const SwRedline* pCurRedline;
191*b1cdbd2cSJim Jagielski     xub_StrLen nAktSwPos;
192*b1cdbd2cSJim Jagielski     sal_uInt16 nCurRedlinePos;
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski     bool mbParaIsRTL;
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski     const SwFmtDrop &mrSwFmtDrop;
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski     sw::Frames maFlyFrms;     // #i2916#
199*b1cdbd2cSJim Jagielski     sw::FrameIter maFlyIter;
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski     xub_StrLen SearchNext( xub_StrLen nStartPos );
202*b1cdbd2cSJim Jagielski     void FieldVanish( const String& rTxt );
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski     void OutSwFmtRefMark(const SwFmtRefMark& rAttr, bool bStart);
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski     void IterToCurrent();
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski     //No copying
209*b1cdbd2cSJim Jagielski     WW8SwAttrIter(const WW8SwAttrIter&);
210*b1cdbd2cSJim Jagielski     WW8SwAttrIter& operator=(const WW8SwAttrIter&);
211*b1cdbd2cSJim Jagielski public:
212*b1cdbd2cSJim Jagielski     WW8SwAttrIter( MSWordExportBase& rWr, const SwTxtNode& rNd );
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski     bool IsTxtAttr( xub_StrLen nSwPos );
215*b1cdbd2cSJim Jagielski     bool IsRedlineAtEnd( xub_StrLen nPos ) const;
216*b1cdbd2cSJim Jagielski     bool IsDropCap( int nSwPos );
217*b1cdbd2cSJim Jagielski     bool RequiresImplicitBookmark();
218*b1cdbd2cSJim Jagielski 
NextPos()219*b1cdbd2cSJim Jagielski     void NextPos() { nAktSwPos = SearchNext( nAktSwPos + 1 ); }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski     void OutAttr( xub_StrLen nSwPos );
222*b1cdbd2cSJim Jagielski     virtual const SfxPoolItem* HasTextItem( sal_uInt16 nWhich ) const;
223*b1cdbd2cSJim Jagielski     virtual const SfxPoolItem& GetItem( sal_uInt16 nWhich ) const;
224*b1cdbd2cSJim Jagielski     int OutAttrWithRange(xub_StrLen nPos);
225*b1cdbd2cSJim Jagielski     const SwRedlineData* GetRedline( xub_StrLen nPos );
226*b1cdbd2cSJim Jagielski     void OutFlys(xub_StrLen nSwPos);
227*b1cdbd2cSJim Jagielski 
WhereNext() const228*b1cdbd2cSJim Jagielski     xub_StrLen WhereNext() const    { return nAktSwPos; }
GetScript() const229*b1cdbd2cSJim Jagielski     sal_uInt16 GetScript() const { return mnScript; }
IsCharRTL() const230*b1cdbd2cSJim Jagielski     bool IsCharRTL() const { return mbCharIsRTL; }
IsParaRTL() const231*b1cdbd2cSJim Jagielski     bool IsParaRTL() const { return mbParaIsRTL; }
GetCharSet() const232*b1cdbd2cSJim Jagielski     rtl_TextEncoding GetCharSet() const { return meChrSet; }
233*b1cdbd2cSJim Jagielski     String GetSnippet(const String &rStr, xub_StrLen nAktPos,
234*b1cdbd2cSJim Jagielski         xub_StrLen nLen) const;
GetSwFmtDrop() const235*b1cdbd2cSJim Jagielski     const SwFmtDrop& GetSwFmtDrop() const { return mrSwFmtDrop; }
236*b1cdbd2cSJim Jagielski };
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski class sortswflys :
239*b1cdbd2cSJim Jagielski     public std::binary_function<const sw::Frame&, const sw::Frame&, bool>
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski public:
operator ()(const sw::Frame & rOne,const sw::Frame & rTwo) const242*b1cdbd2cSJim Jagielski     bool operator()(const sw::Frame &rOne, const sw::Frame &rTwo) const
243*b1cdbd2cSJim Jagielski     {
244*b1cdbd2cSJim Jagielski         return rOne.GetPosition() < rTwo.GetPosition();
245*b1cdbd2cSJim Jagielski     }
246*b1cdbd2cSJim Jagielski };
247*b1cdbd2cSJim Jagielski 
IterToCurrent()248*b1cdbd2cSJim Jagielski void WW8SwAttrIter::IterToCurrent()
249*b1cdbd2cSJim Jagielski {
250*b1cdbd2cSJim Jagielski     ASSERT(maCharRuns.begin() != maCharRuns.end(), "Impossible");
251*b1cdbd2cSJim Jagielski     mnScript = maCharRunIter->mnScript;
252*b1cdbd2cSJim Jagielski     meChrSet = maCharRunIter->meCharSet;
253*b1cdbd2cSJim Jagielski     mbCharIsRTL = maCharRunIter->mbRTL;
254*b1cdbd2cSJim Jagielski }
255*b1cdbd2cSJim Jagielski 
WW8SwAttrIter(MSWordExportBase & rWr,const SwTxtNode & rTxtNd)256*b1cdbd2cSJim Jagielski WW8SwAttrIter::WW8SwAttrIter(MSWordExportBase& rWr, const SwTxtNode& rTxtNd) :
257*b1cdbd2cSJim Jagielski     MSWordAttrIter(rWr),
258*b1cdbd2cSJim Jagielski     rNd(rTxtNd),
259*b1cdbd2cSJim Jagielski     maCharRuns(GetPseudoCharRuns(rTxtNd, 0, !rWr.HackIsWW8OrHigher())),
260*b1cdbd2cSJim Jagielski     pCurRedline(0),
261*b1cdbd2cSJim Jagielski     nAktSwPos(0),
262*b1cdbd2cSJim Jagielski     nCurRedlinePos(USHRT_MAX),
263*b1cdbd2cSJim Jagielski     mrSwFmtDrop(rTxtNd.GetSwAttrSet().GetDrop())
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski     SwPosition aPos(rTxtNd);
267*b1cdbd2cSJim Jagielski     if (FRMDIR_HORI_RIGHT_TOP == rWr.pDoc->GetTextDirection(aPos))
268*b1cdbd2cSJim Jagielski         mbParaIsRTL = true;
269*b1cdbd2cSJim Jagielski     else
270*b1cdbd2cSJim Jagielski         mbParaIsRTL = false;
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski     maCharRunIter = maCharRuns.begin();
273*b1cdbd2cSJim Jagielski     IterToCurrent();
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski     /*
276*b1cdbd2cSJim Jagielski      #i2916#
277*b1cdbd2cSJim Jagielski      Get list of any graphics which may be anchored from this paragraph.
278*b1cdbd2cSJim Jagielski     */
279*b1cdbd2cSJim Jagielski     maFlyFrms = GetFramesInNode(rWr.maFrames, rNd);
280*b1cdbd2cSJim Jagielski     std::sort(maFlyFrms.begin(), maFlyFrms.end(), sortswflys());
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski     /*
283*b1cdbd2cSJim Jagielski      #i18480#
284*b1cdbd2cSJim Jagielski      If we are inside a frame then anything anchored inside this frame can
285*b1cdbd2cSJim Jagielski      only be supported by word anchored inline ("as character"), so force
286*b1cdbd2cSJim Jagielski      this in the supportable case.
287*b1cdbd2cSJim Jagielski     */
288*b1cdbd2cSJim Jagielski     if (rWr.HackIsWW8OrHigher() && rWr.bInWriteEscher)
289*b1cdbd2cSJim Jagielski     {
290*b1cdbd2cSJim Jagielski         std::for_each(maFlyFrms.begin(), maFlyFrms.end(),
291*b1cdbd2cSJim Jagielski             std::mem_fun_ref(&sw::Frame::ForceTreatAsInline));
292*b1cdbd2cSJim Jagielski     }
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski     maFlyIter = maFlyFrms.begin();
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski     if ( m_rExport.pDoc->GetRedlineTbl().Count() )
297*b1cdbd2cSJim Jagielski     {
298*b1cdbd2cSJim Jagielski         SwPosition aPosition( rNd, SwIndex( (SwTxtNode*)&rNd ) );
299*b1cdbd2cSJim Jagielski         pCurRedline = m_rExport.pDoc->GetRedline( aPosition, &nCurRedlinePos );
300*b1cdbd2cSJim Jagielski     }
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski     nAktSwPos = SearchNext(1);
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
lcl_getMinPos(xub_StrLen pos1,xub_StrLen pos2)305*b1cdbd2cSJim Jagielski xub_StrLen lcl_getMinPos( xub_StrLen pos1, xub_StrLen pos2 )
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski     xub_StrLen min = STRING_NOTFOUND;
308*b1cdbd2cSJim Jagielski     if ( pos1 == STRING_NOTFOUND && pos2 != STRING_NOTFOUND )
309*b1cdbd2cSJim Jagielski         min = pos2;
310*b1cdbd2cSJim Jagielski     else if ( pos2 == STRING_NOTFOUND && pos1 != STRING_NOTFOUND )
311*b1cdbd2cSJim Jagielski         min = pos1;
312*b1cdbd2cSJim Jagielski     else if ( pos2 != STRING_NOTFOUND && pos2 != STRING_NOTFOUND )
313*b1cdbd2cSJim Jagielski     {
314*b1cdbd2cSJim Jagielski         if ( pos1 < pos2 )
315*b1cdbd2cSJim Jagielski             min = pos1;
316*b1cdbd2cSJim Jagielski         else
317*b1cdbd2cSJim Jagielski             min = pos2;
318*b1cdbd2cSJim Jagielski     }
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski     return min;
321*b1cdbd2cSJim Jagielski }
322*b1cdbd2cSJim Jagielski 
SearchNext(xub_StrLen nStartPos)323*b1cdbd2cSJim Jagielski xub_StrLen WW8SwAttrIter::SearchNext( xub_StrLen nStartPos )
324*b1cdbd2cSJim Jagielski {
325*b1cdbd2cSJim Jagielski     xub_StrLen nPos;
326*b1cdbd2cSJim Jagielski     xub_StrLen nMinPos = STRING_MAXLEN;
327*b1cdbd2cSJim Jagielski     xub_StrLen i=0;
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 	const String aTxt = rNd.GetTxt();
330*b1cdbd2cSJim Jagielski     xub_StrLen fieldEndPos = aTxt.Search(CH_TXT_ATR_FIELDEND, nStartPos);
331*b1cdbd2cSJim Jagielski     xub_StrLen fieldStartPos = aTxt.Search(CH_TXT_ATR_FIELDSTART, nStartPos);
332*b1cdbd2cSJim Jagielski     xub_StrLen formElementPos = aTxt.Search(CH_TXT_ATR_FORMELEMENT, nStartPos);
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski     xub_StrLen pos = lcl_getMinPos( fieldEndPos, fieldStartPos );
335*b1cdbd2cSJim Jagielski     pos = lcl_getMinPos( pos, formElementPos );
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski 	if (pos!=STRING_NOTFOUND)
338*b1cdbd2cSJim Jagielski         nMinPos=pos;
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski     // first the redline, then the attributes
341*b1cdbd2cSJim Jagielski     if( pCurRedline )
342*b1cdbd2cSJim Jagielski     {
343*b1cdbd2cSJim Jagielski         const SwPosition* pEnd = pCurRedline->End();
344*b1cdbd2cSJim Jagielski         if (pEnd->nNode == rNd && ((i = pEnd->nContent.GetIndex()) >= nStartPos) && i < nMinPos )
345*b1cdbd2cSJim Jagielski 				nMinPos = i;
346*b1cdbd2cSJim Jagielski     }
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     if ( nCurRedlinePos < m_rExport.pDoc->GetRedlineTbl().Count() )
349*b1cdbd2cSJim Jagielski     {
350*b1cdbd2cSJim Jagielski         // nCurRedlinePos point to the next redline
351*b1cdbd2cSJim Jagielski         nPos = nCurRedlinePos;
352*b1cdbd2cSJim Jagielski         if( pCurRedline )
353*b1cdbd2cSJim Jagielski             ++nPos;
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski         for ( ; nPos < m_rExport.pDoc->GetRedlineTbl().Count(); ++nPos )
356*b1cdbd2cSJim Jagielski         {
357*b1cdbd2cSJim Jagielski             const SwRedline* pRedl = m_rExport.pDoc->GetRedlineTbl()[ nPos ];
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski             const SwPosition* pStt = pRedl->Start();
360*b1cdbd2cSJim Jagielski             const SwPosition* pEnd = pStt == pRedl->GetPoint()
361*b1cdbd2cSJim Jagielski                                         ? pRedl->GetMark()
362*b1cdbd2cSJim Jagielski                                         : pRedl->GetPoint();
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski             if( pStt->nNode == rNd )
365*b1cdbd2cSJim Jagielski             {
366*b1cdbd2cSJim Jagielski                 if( ( i = pStt->nContent.GetIndex() ) >= nStartPos &&
367*b1cdbd2cSJim Jagielski                     i < nMinPos )
368*b1cdbd2cSJim Jagielski                     nMinPos = i;
369*b1cdbd2cSJim Jagielski             }
370*b1cdbd2cSJim Jagielski             else
371*b1cdbd2cSJim Jagielski                 break;
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski             if( pEnd->nNode == rNd &&
374*b1cdbd2cSJim Jagielski                 ( i = pEnd->nContent.GetIndex() ) < nMinPos &&
375*b1cdbd2cSJim Jagielski                 i >= nStartPos )
376*b1cdbd2cSJim Jagielski                     nMinPos = i;
377*b1cdbd2cSJim Jagielski         }
378*b1cdbd2cSJim Jagielski     }
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski     if (mrSwFmtDrop.GetWholeWord() && nStartPos <= rNd.GetDropLen(0))
382*b1cdbd2cSJim Jagielski         nMinPos = rNd.GetDropLen(0);
383*b1cdbd2cSJim Jagielski     else if(nStartPos <= mrSwFmtDrop.GetChars())
384*b1cdbd2cSJim Jagielski         nMinPos = mrSwFmtDrop.GetChars();
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski     if(const SwpHints* pTxtAttrs = rNd.GetpSwpHints())
387*b1cdbd2cSJim Jagielski     {
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski // kann noch optimiert werden, wenn ausgenutzt wird, dass die TxtAttrs
390*b1cdbd2cSJim Jagielski // nach der Anfangsposition geordnet sind. Dann muessten
391*b1cdbd2cSJim Jagielski // allerdings noch 2 Indices gemerkt werden
392*b1cdbd2cSJim Jagielski         for( i = 0; i < pTxtAttrs->Count(); i++ )
393*b1cdbd2cSJim Jagielski         {
394*b1cdbd2cSJim Jagielski             const SwTxtAttr* pHt = (*pTxtAttrs)[i];
395*b1cdbd2cSJim Jagielski             nPos = *pHt->GetStart();    // gibt erstes Attr-Zeichen
396*b1cdbd2cSJim Jagielski             if( nPos >= nStartPos && nPos <= nMinPos )
397*b1cdbd2cSJim Jagielski                 nMinPos = nPos;
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski             if( pHt->End() )         // Attr mit Ende
400*b1cdbd2cSJim Jagielski             {
401*b1cdbd2cSJim Jagielski                 nPos = *pHt->End();      // gibt letztes Attr-Zeichen + 1
402*b1cdbd2cSJim Jagielski                 if( nPos >= nStartPos && nPos <= nMinPos )
403*b1cdbd2cSJim Jagielski                     nMinPos = nPos;
404*b1cdbd2cSJim Jagielski             }
405*b1cdbd2cSJim Jagielski             if (pHt->HasDummyChar())
406*b1cdbd2cSJim Jagielski             {
407*b1cdbd2cSJim Jagielski                 // pos + 1 because of CH_TXTATR in Text
408*b1cdbd2cSJim Jagielski                 nPos = *pHt->GetStart() + 1;
409*b1cdbd2cSJim Jagielski                 if( nPos >= nStartPos && nPos <= nMinPos )
410*b1cdbd2cSJim Jagielski                     nMinPos = nPos;
411*b1cdbd2cSJim Jagielski             }
412*b1cdbd2cSJim Jagielski         }
413*b1cdbd2cSJim Jagielski     }
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski     if (maCharRunIter != maCharRuns.end())
416*b1cdbd2cSJim Jagielski     {
417*b1cdbd2cSJim Jagielski         if (maCharRunIter->mnEndPos < nMinPos)
418*b1cdbd2cSJim Jagielski             nMinPos = maCharRunIter->mnEndPos;
419*b1cdbd2cSJim Jagielski         IterToCurrent();
420*b1cdbd2cSJim Jagielski     }
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski     /*
423*b1cdbd2cSJim Jagielski      #i2916#
424*b1cdbd2cSJim Jagielski      Check to see if there are any graphics anchored to characters in this
425*b1cdbd2cSJim Jagielski      paragraph's text.  Set nMinPos to 1 past the placement for anchored to
426*b1cdbd2cSJim Jagielski      character because anchors in Word appear after the character they are
427*b1cdbd2cSJim Jagielski      anchored to.
428*b1cdbd2cSJim Jagielski     */
429*b1cdbd2cSJim Jagielski     if (maFlyIter != maFlyFrms.end())
430*b1cdbd2cSJim Jagielski     {
431*b1cdbd2cSJim Jagielski         const SwPosition &rAnchor = maFlyIter->GetPosition();
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski         nPos = rAnchor.nContent.GetIndex();
434*b1cdbd2cSJim Jagielski         if (nPos >= nStartPos && nPos <= nMinPos)
435*b1cdbd2cSJim Jagielski             nMinPos = nPos;
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski         if (maFlyIter->GetFrmFmt().GetAnchor().GetAnchorId() == FLY_AT_CHAR)
438*b1cdbd2cSJim Jagielski         {
439*b1cdbd2cSJim Jagielski             ++nPos;
440*b1cdbd2cSJim Jagielski             if (nPos >= nStartPos && nPos <= nMinPos)
441*b1cdbd2cSJim Jagielski                 nMinPos = nPos;
442*b1cdbd2cSJim Jagielski         }
443*b1cdbd2cSJim Jagielski     }
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski     //nMinPos found and not going to change at this point
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski     if (maCharRunIter != maCharRuns.end())
448*b1cdbd2cSJim Jagielski     {
449*b1cdbd2cSJim Jagielski         if (maCharRunIter->mnEndPos == nMinPos)
450*b1cdbd2cSJim Jagielski             ++maCharRunIter;
451*b1cdbd2cSJim Jagielski     }
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski     return nMinPos;
454*b1cdbd2cSJim Jagielski }
455*b1cdbd2cSJim Jagielski 
OutAttr(xub_StrLen nSwPos)456*b1cdbd2cSJim Jagielski void WW8SwAttrIter::OutAttr( xub_StrLen nSwPos )
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski     m_rExport.AttrOutput().RTLAndCJKState( IsCharRTL(), GetScript() );
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski     /*
461*b1cdbd2cSJim Jagielski      Depending on whether text is in CTL/CJK or Western, get the id of that
462*b1cdbd2cSJim Jagielski      script, the idea is that the font that is actually in use to render this
463*b1cdbd2cSJim Jagielski      range of text ends up in pFont
464*b1cdbd2cSJim Jagielski     */
465*b1cdbd2cSJim Jagielski     sal_uInt16 nFontId = GetWhichOfScript( RES_CHRATR_FONT, GetScript() );
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski     const SvxFontItem &rParentFont = ItemGet<SvxFontItem>(
468*b1cdbd2cSJim Jagielski         (const SwTxtFmtColl&)rNd.GetAnyFmtColl(), nFontId);
469*b1cdbd2cSJim Jagielski     const SvxFontItem *pFont = &rParentFont;
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski     SfxItemSet aExportSet(*rNd.GetSwAttrSet().GetPool(),
472*b1cdbd2cSJim Jagielski         RES_CHRATR_BEGIN, RES_TXTATR_END - 1);
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski     //The hard formatting properties that affect the entire paragraph
475*b1cdbd2cSJim Jagielski     if (rNd.HasSwAttrSet())
476*b1cdbd2cSJim Jagielski     {
477*b1cdbd2cSJim Jagielski         sal_Bool bDeep = sal_False;
478*b1cdbd2cSJim Jagielski         // only copy hard attributes - bDeep = false
479*b1cdbd2cSJim Jagielski         aExportSet.Set(rNd.GetSwAttrSet(), bDeep);
480*b1cdbd2cSJim Jagielski         // get the current font item. Use rNd.GetSwAttrSet instead of aExportSet:
481*b1cdbd2cSJim Jagielski         const SvxFontItem &rNdFont = ItemGet<SvxFontItem>(rNd.GetSwAttrSet(), nFontId);
482*b1cdbd2cSJim Jagielski         pFont = &rNdFont;
483*b1cdbd2cSJim Jagielski         aExportSet.ClearItem(nFontId);
484*b1cdbd2cSJim Jagielski     }
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski     //The additional hard formatting properties that affect this range in the
487*b1cdbd2cSJim Jagielski     //paragraph
488*b1cdbd2cSJim Jagielski     sw::PoolItems aRangeItems;
489*b1cdbd2cSJim Jagielski     if (const SwpHints* pTxtAttrs = rNd.GetpSwpHints())
490*b1cdbd2cSJim Jagielski     {
491*b1cdbd2cSJim Jagielski         for (xub_StrLen i = 0; i < pTxtAttrs->Count(); ++i)
492*b1cdbd2cSJim Jagielski         {
493*b1cdbd2cSJim Jagielski             const SwTxtAttr* pHt = (*pTxtAttrs)[i];
494*b1cdbd2cSJim Jagielski             const xub_StrLen* pEnd = pHt->End();
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski             if (pEnd ? ( nSwPos >= *pHt->GetStart() && nSwPos < *pEnd)
497*b1cdbd2cSJim Jagielski                         : nSwPos == *pHt->GetStart() )
498*b1cdbd2cSJim Jagielski             {
499*b1cdbd2cSJim Jagielski                 sal_uInt16 nWhich = pHt->GetAttr().Which();
500*b1cdbd2cSJim Jagielski                 if (nWhich == RES_TXTATR_AUTOFMT)
501*b1cdbd2cSJim Jagielski                 {
502*b1cdbd2cSJim Jagielski                     const SwFmtAutoFmt& rAutoFmt = static_cast<const SwFmtAutoFmt&>(pHt->GetAttr());
503*b1cdbd2cSJim Jagielski                     const boost::shared_ptr<SfxItemSet> pSet = rAutoFmt.GetStyleHandle();
504*b1cdbd2cSJim Jagielski                     SfxWhichIter aIter( *pSet );
505*b1cdbd2cSJim Jagielski                     const SfxPoolItem* pItem;
506*b1cdbd2cSJim Jagielski                     sal_uInt16 nWhichId = aIter.FirstWhich();
507*b1cdbd2cSJim Jagielski                     while( nWhichId )
508*b1cdbd2cSJim Jagielski                     {
509*b1cdbd2cSJim Jagielski                         if( SFX_ITEM_SET == pSet->GetItemState( nWhichId, sal_False, &pItem ))
510*b1cdbd2cSJim Jagielski                         {
511*b1cdbd2cSJim Jagielski                             if (nWhichId == nFontId)
512*b1cdbd2cSJim Jagielski                                 pFont = &(item_cast<SvxFontItem>(*pItem));
513*b1cdbd2cSJim Jagielski                             else
514*b1cdbd2cSJim Jagielski                                 aRangeItems[nWhichId] = pItem;
515*b1cdbd2cSJim Jagielski                         }
516*b1cdbd2cSJim Jagielski                         nWhichId = aIter.NextWhich();
517*b1cdbd2cSJim Jagielski                     }
518*b1cdbd2cSJim Jagielski                 }
519*b1cdbd2cSJim Jagielski                 else
520*b1cdbd2cSJim Jagielski                     aRangeItems[nWhich] = (&(pHt->GetAttr()));
521*b1cdbd2cSJim Jagielski             }
522*b1cdbd2cSJim Jagielski             else if (nSwPos < *pHt->GetStart())
523*b1cdbd2cSJim Jagielski                 break;
524*b1cdbd2cSJim Jagielski         }
525*b1cdbd2cSJim Jagielski     }
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski     /*
528*b1cdbd2cSJim Jagielski      For #i24291# we need to explictly remove any properties from the
529*b1cdbd2cSJim Jagielski      aExportSet which a SwCharFmt would override, we can't rely on word doing
530*b1cdbd2cSJim Jagielski      this for us like writer does
531*b1cdbd2cSJim Jagielski     */
532*b1cdbd2cSJim Jagielski     const SwFmtCharFmt *pCharFmtItem =
533*b1cdbd2cSJim Jagielski         HasItem< SwFmtCharFmt >( aRangeItems, RES_TXTATR_CHARFMT );
534*b1cdbd2cSJim Jagielski     if ( pCharFmtItem )
535*b1cdbd2cSJim Jagielski         ClearOverridesFromSet( *pCharFmtItem, aExportSet );
536*b1cdbd2cSJim Jagielski 
537*b1cdbd2cSJim Jagielski     sw::PoolItems aExportItems;
538*b1cdbd2cSJim Jagielski     GetPoolItems( aExportSet, aExportItems, false );
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski     sw::cPoolItemIter aEnd = aRangeItems.end();
541*b1cdbd2cSJim Jagielski     for ( sw::cPoolItemIter aI = aRangeItems.begin(); aI != aEnd; ++aI )
542*b1cdbd2cSJim Jagielski         aExportItems[aI->first] = aI->second;
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski     if ( !aExportItems.empty() )
545*b1cdbd2cSJim Jagielski     {
546*b1cdbd2cSJim Jagielski         const SwModify* pOldMod = m_rExport.pOutFmtNode;
547*b1cdbd2cSJim Jagielski         m_rExport.pOutFmtNode = &rNd;
548*b1cdbd2cSJim Jagielski         m_rExport.m_aCurrentCharPropStarts.push( nSwPos );
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski         m_rExport.ExportPoolItemsToCHP( aExportItems, GetScript() );
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski         // HasTextItem nur in dem obigen Bereich erlaubt
553*b1cdbd2cSJim Jagielski         m_rExport.m_aCurrentCharPropStarts.pop();
554*b1cdbd2cSJim Jagielski         m_rExport.pOutFmtNode = pOldMod;
555*b1cdbd2cSJim Jagielski     }
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski     ASSERT( pFont, "must be *some* font associated with this txtnode" );
558*b1cdbd2cSJim Jagielski     if ( pFont )
559*b1cdbd2cSJim Jagielski     {
560*b1cdbd2cSJim Jagielski         SvxFontItem aFont( *pFont );
561*b1cdbd2cSJim Jagielski 
562*b1cdbd2cSJim Jagielski         /*
563*b1cdbd2cSJim Jagielski          If we are a nonunicode aware format then we set the charset we want to
564*b1cdbd2cSJim Jagielski          use for export of this range. If necessary this will generate a pseudo
565*b1cdbd2cSJim Jagielski          font to use for this range.
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski          So now we are guaranteed to have a font with the correct charset set
568*b1cdbd2cSJim Jagielski          for WW6/95 which will match the script we have exported this range in,
569*b1cdbd2cSJim Jagielski          this makes older nonunicode aware versions of word display the correct
570*b1cdbd2cSJim Jagielski          characters.
571*b1cdbd2cSJim Jagielski         */
572*b1cdbd2cSJim Jagielski         if ( !m_rExport.HackIsWW8OrHigher() )
573*b1cdbd2cSJim Jagielski             aFont.SetCharSet( GetCharSet() );
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski         if ( rParentFont != aFont )
576*b1cdbd2cSJim Jagielski             m_rExport.AttrOutput().OutputItem( aFont );
577*b1cdbd2cSJim Jagielski     }
578*b1cdbd2cSJim Jagielski }
579*b1cdbd2cSJim Jagielski 
OutFlys(xub_StrLen nSwPos)580*b1cdbd2cSJim Jagielski void WW8SwAttrIter::OutFlys(xub_StrLen nSwPos)
581*b1cdbd2cSJim Jagielski {
582*b1cdbd2cSJim Jagielski     /*
583*b1cdbd2cSJim Jagielski      #i2916#
584*b1cdbd2cSJim Jagielski      May have an anchored graphic to be placed, loop through sorted array
585*b1cdbd2cSJim Jagielski      and output all at this position
586*b1cdbd2cSJim Jagielski     */
587*b1cdbd2cSJim Jagielski     while ( maFlyIter != maFlyFrms.end() )
588*b1cdbd2cSJim Jagielski     {
589*b1cdbd2cSJim Jagielski         const SwPosition &rAnchor = maFlyIter->GetPosition();
590*b1cdbd2cSJim Jagielski         xub_StrLen nPos = rAnchor.nContent.GetIndex();
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski         if ( nPos != nSwPos )
593*b1cdbd2cSJim Jagielski             break;
594*b1cdbd2cSJim Jagielski         else
595*b1cdbd2cSJim Jagielski         {
596*b1cdbd2cSJim Jagielski             m_rExport.AttrOutput().OutputFlyFrame( *maFlyIter );
597*b1cdbd2cSJim Jagielski             ++maFlyIter;
598*b1cdbd2cSJim Jagielski         }
599*b1cdbd2cSJim Jagielski     }
600*b1cdbd2cSJim Jagielski }
601*b1cdbd2cSJim Jagielski 
IsTxtAttr(xub_StrLen nSwPos)602*b1cdbd2cSJim Jagielski bool WW8SwAttrIter::IsTxtAttr( xub_StrLen nSwPos )
603*b1cdbd2cSJim Jagielski {
604*b1cdbd2cSJim Jagielski     // search for attrs with dummy character or content
605*b1cdbd2cSJim Jagielski     if (const SwpHints* pTxtAttrs = rNd.GetpSwpHints())
606*b1cdbd2cSJim Jagielski     {
607*b1cdbd2cSJim Jagielski         for (sal_uInt16 i = 0; i < pTxtAttrs->Count(); ++i)
608*b1cdbd2cSJim Jagielski         {
609*b1cdbd2cSJim Jagielski             const SwTxtAttr* pHt = (*pTxtAttrs)[i];
610*b1cdbd2cSJim Jagielski             if ( ( pHt->HasDummyChar() || pHt->HasContent() )
611*b1cdbd2cSJim Jagielski                  && (*pHt->GetStart() == nSwPos) )
612*b1cdbd2cSJim Jagielski             {
613*b1cdbd2cSJim Jagielski                 return true;
614*b1cdbd2cSJim Jagielski             }
615*b1cdbd2cSJim Jagielski         }
616*b1cdbd2cSJim Jagielski     }
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski     return false;
619*b1cdbd2cSJim Jagielski }
620*b1cdbd2cSJim Jagielski 
IsDropCap(int nSwPos)621*b1cdbd2cSJim Jagielski bool WW8SwAttrIter::IsDropCap( int nSwPos )
622*b1cdbd2cSJim Jagielski {
623*b1cdbd2cSJim Jagielski     // see if the current position falls on a DropCap
624*b1cdbd2cSJim Jagielski     int nDropChars = mrSwFmtDrop.GetChars();
625*b1cdbd2cSJim Jagielski     bool bWholeWord = mrSwFmtDrop.GetWholeWord();
626*b1cdbd2cSJim Jagielski     if (bWholeWord)
627*b1cdbd2cSJim Jagielski     {
628*b1cdbd2cSJim Jagielski         short nWordLen = rNd.GetDropLen(0);
629*b1cdbd2cSJim Jagielski         if(nSwPos == nWordLen && nSwPos != 0)
630*b1cdbd2cSJim Jagielski             return true;
631*b1cdbd2cSJim Jagielski     }
632*b1cdbd2cSJim Jagielski     else
633*b1cdbd2cSJim Jagielski     {
634*b1cdbd2cSJim Jagielski         if (nSwPos == nDropChars && nSwPos != 0)
635*b1cdbd2cSJim Jagielski             return true;
636*b1cdbd2cSJim Jagielski     }
637*b1cdbd2cSJim Jagielski     return false;
638*b1cdbd2cSJim Jagielski }
639*b1cdbd2cSJim Jagielski 
RequiresImplicitBookmark()640*b1cdbd2cSJim Jagielski bool WW8SwAttrIter::RequiresImplicitBookmark()
641*b1cdbd2cSJim Jagielski {
642*b1cdbd2cSJim Jagielski     SwImplBookmarksIter bkmkIterEnd = m_rExport.maImplicitBookmarks.end();
643*b1cdbd2cSJim Jagielski     for ( SwImplBookmarksIter aIter = m_rExport.maImplicitBookmarks.begin(); aIter != bkmkIterEnd; ++aIter )
644*b1cdbd2cSJim Jagielski     {
645*b1cdbd2cSJim Jagielski         sal_uLong sample  = aIter->second;
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski         if ( sample == rNd.GetIndex() )
648*b1cdbd2cSJim Jagielski             return true;
649*b1cdbd2cSJim Jagielski     }
650*b1cdbd2cSJim Jagielski     return false;
651*b1cdbd2cSJim Jagielski }
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski // HasItem ist fuer die Zusammenfassung des Doppel-Attributes Underline
654*b1cdbd2cSJim Jagielski // und WordLineMode als TextItems. OutAttr() ruft die Ausgabefunktion,
655*b1cdbd2cSJim Jagielski // die dann ueber HasItem() nach anderen Items an der
656*b1cdbd2cSJim Jagielski // Attribut-Anfangposition fragen kann.
657*b1cdbd2cSJim Jagielski // Es koennen nur Attribute mit Ende abgefragt werden.
658*b1cdbd2cSJim Jagielski // Es wird mit bDeep gesucht
HasTextItem(sal_uInt16 nWhich) const659*b1cdbd2cSJim Jagielski const SfxPoolItem* WW8SwAttrIter::HasTextItem( sal_uInt16 nWhich ) const
660*b1cdbd2cSJim Jagielski {
661*b1cdbd2cSJim Jagielski     const SfxPoolItem* pRet = 0;
662*b1cdbd2cSJim Jagielski     const SwpHints* pTxtAttrs = rNd.GetpSwpHints();
663*b1cdbd2cSJim Jagielski     if (pTxtAttrs)
664*b1cdbd2cSJim Jagielski     {
665*b1cdbd2cSJim Jagielski         xub_StrLen nTmpSwPos = m_rExport.m_aCurrentCharPropStarts.size() ?
666*b1cdbd2cSJim Jagielski             m_rExport.m_aCurrentCharPropStarts.top() : 0;
667*b1cdbd2cSJim Jagielski         for (sal_uInt16 i = 0; i < pTxtAttrs->Count(); ++i)
668*b1cdbd2cSJim Jagielski         {
669*b1cdbd2cSJim Jagielski             const SwTxtAttr* pHt = (*pTxtAttrs)[i];
670*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem = &pHt->GetAttr();
671*b1cdbd2cSJim Jagielski             const xub_StrLen* pAtrEnd = 0;
672*b1cdbd2cSJim Jagielski             if( 0 != ( pAtrEnd = pHt->End() ) &&     // nur Attr mit Ende
673*b1cdbd2cSJim Jagielski                 nWhich == pItem->Which() &&             //
674*b1cdbd2cSJim Jagielski                 nTmpSwPos >= *pHt->GetStart() && nTmpSwPos < *pAtrEnd )
675*b1cdbd2cSJim Jagielski             {
676*b1cdbd2cSJim Jagielski                 pRet = pItem;       // gefunden
677*b1cdbd2cSJim Jagielski                 break;
678*b1cdbd2cSJim Jagielski             }
679*b1cdbd2cSJim Jagielski             else if (nTmpSwPos < *pHt->GetStart())
680*b1cdbd2cSJim Jagielski                 break;              // dann kommt da nichts mehr
681*b1cdbd2cSJim Jagielski         }
682*b1cdbd2cSJim Jagielski     }
683*b1cdbd2cSJim Jagielski     return pRet;
684*b1cdbd2cSJim Jagielski }
685*b1cdbd2cSJim Jagielski 
GetCurrentItems(WW8Bytes & rItems) const686*b1cdbd2cSJim Jagielski void WW8Export::GetCurrentItems(WW8Bytes& rItems) const
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski     sal_uInt16 nEnd = pO ? pO->Count() : 0;
689*b1cdbd2cSJim Jagielski     for (sal_uInt16 nI = 0; nI < nEnd; ++nI)
690*b1cdbd2cSJim Jagielski         rItems.Insert((*pO)[nI], rItems.Count());
691*b1cdbd2cSJim Jagielski }
692*b1cdbd2cSJim Jagielski 
GetItem(sal_uInt16 nWhich) const693*b1cdbd2cSJim Jagielski const SfxPoolItem& WW8SwAttrIter::GetItem(sal_uInt16 nWhich) const
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski     const SfxPoolItem* pRet = HasTextItem(nWhich);
696*b1cdbd2cSJim Jagielski     return pRet ? *pRet : rNd.SwCntntNode::GetAttr(nWhich);
697*b1cdbd2cSJim Jagielski }
698*b1cdbd2cSJim Jagielski 
StartRuby(const SwTxtNode & rNode,const SwFmtRuby & rRuby)699*b1cdbd2cSJim Jagielski void WW8AttributeOutput::StartRuby( const SwTxtNode& rNode, const SwFmtRuby& rRuby )
700*b1cdbd2cSJim Jagielski {
701*b1cdbd2cSJim Jagielski     String aStr( FieldString( ww::eEQ ) );
702*b1cdbd2cSJim Jagielski     aStr.APPEND_CONST_ASC( "\\* jc" );
703*b1cdbd2cSJim Jagielski     sal_Int32 nJC = 0;
704*b1cdbd2cSJim Jagielski     sal_Char cDirective = 0;
705*b1cdbd2cSJim Jagielski     switch ( rRuby.GetAdjustment() )
706*b1cdbd2cSJim Jagielski     {
707*b1cdbd2cSJim Jagielski         case 0:
708*b1cdbd2cSJim Jagielski             nJC = 3;
709*b1cdbd2cSJim Jagielski             cDirective = 'l';
710*b1cdbd2cSJim Jagielski             break;
711*b1cdbd2cSJim Jagielski         case 1:
712*b1cdbd2cSJim Jagielski             //defaults to 0
713*b1cdbd2cSJim Jagielski             break;
714*b1cdbd2cSJim Jagielski         case 2:
715*b1cdbd2cSJim Jagielski             nJC = 4;
716*b1cdbd2cSJim Jagielski             cDirective = 'r';
717*b1cdbd2cSJim Jagielski             break;
718*b1cdbd2cSJim Jagielski         case 3:
719*b1cdbd2cSJim Jagielski             nJC = 1;
720*b1cdbd2cSJim Jagielski             cDirective = 'd';
721*b1cdbd2cSJim Jagielski             break;
722*b1cdbd2cSJim Jagielski         case 4:
723*b1cdbd2cSJim Jagielski             nJC = 2;
724*b1cdbd2cSJim Jagielski             cDirective = 'd';
725*b1cdbd2cSJim Jagielski             break;
726*b1cdbd2cSJim Jagielski         default:
727*b1cdbd2cSJim Jagielski             ASSERT( !this,"Unhandled Ruby justication code" );
728*b1cdbd2cSJim Jagielski             break;
729*b1cdbd2cSJim Jagielski     }
730*b1cdbd2cSJim Jagielski     aStr += String::CreateFromInt32( nJC );
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski     /*
733*b1cdbd2cSJim Jagielski      MS needs to know the name and size of the font used in the ruby item,
734*b1cdbd2cSJim Jagielski      but we coud have written it in a mixture of asian and western
735*b1cdbd2cSJim Jagielski      scripts, and each of these can be a different font and size than the
736*b1cdbd2cSJim Jagielski      other, so we make a guess based upon the first character of the text,
737*b1cdbd2cSJim Jagielski      defaulting to asian.
738*b1cdbd2cSJim Jagielski      */
739*b1cdbd2cSJim Jagielski     sal_uInt16 nRubyScript;
740*b1cdbd2cSJim Jagielski     if( pBreakIt->GetBreakIter().is() )
741*b1cdbd2cSJim Jagielski         nRubyScript = pBreakIt->GetBreakIter()->getScriptType( rRuby.GetText(), 0);
742*b1cdbd2cSJim Jagielski     else
743*b1cdbd2cSJim Jagielski         nRubyScript = i18n::ScriptType::ASIAN;
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski     const SwTxtRuby* pRubyTxt = rRuby.GetTxtRuby();
746*b1cdbd2cSJim Jagielski     const SwCharFmt* pFmt = pRubyTxt ? pRubyTxt->GetCharFmt() : 0;
747*b1cdbd2cSJim Jagielski     String sFamilyName;
748*b1cdbd2cSJim Jagielski     long nHeight;
749*b1cdbd2cSJim Jagielski     if ( pFmt )
750*b1cdbd2cSJim Jagielski     {
751*b1cdbd2cSJim Jagielski         const SvxFontItem &rFont = ItemGet< SvxFontItem >( *pFmt,
752*b1cdbd2cSJim Jagielski                 GetWhichOfScript(RES_CHRATR_FONT,nRubyScript) );
753*b1cdbd2cSJim Jagielski         sFamilyName = rFont.GetFamilyName();
754*b1cdbd2cSJim Jagielski 
755*b1cdbd2cSJim Jagielski         const SvxFontHeightItem &rHeight = ItemGet< SvxFontHeightItem >( *pFmt,
756*b1cdbd2cSJim Jagielski                 GetWhichOfScript( RES_CHRATR_FONTSIZE, nRubyScript ) );
757*b1cdbd2cSJim Jagielski         nHeight = rHeight.GetHeight();
758*b1cdbd2cSJim Jagielski     }
759*b1cdbd2cSJim Jagielski     else
760*b1cdbd2cSJim Jagielski     {
761*b1cdbd2cSJim Jagielski         /*Get defaults if no formatting on ruby text*/
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski         const SfxItemPool *pPool = rNode.GetSwAttrSet().GetPool();
764*b1cdbd2cSJim Jagielski         const SfxItemPool &rPool = pPool ? *pPool : m_rWW8Export.pDoc->GetAttrPool();
765*b1cdbd2cSJim Jagielski 
766*b1cdbd2cSJim Jagielski         const SvxFontItem &rFont  = DefaultItemGet< SvxFontItem >( rPool,
767*b1cdbd2cSJim Jagielski                 GetWhichOfScript( RES_CHRATR_FONT,nRubyScript ) );
768*b1cdbd2cSJim Jagielski         sFamilyName = rFont.GetFamilyName();
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski         const SvxFontHeightItem &rHeight = DefaultItemGet< SvxFontHeightItem >
771*b1cdbd2cSJim Jagielski             ( rPool, GetWhichOfScript( RES_CHRATR_FONTSIZE, nRubyScript ) );
772*b1cdbd2cSJim Jagielski         nHeight = rHeight.GetHeight();
773*b1cdbd2cSJim Jagielski     }
774*b1cdbd2cSJim Jagielski     nHeight = (nHeight + 5)/10;
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski     aStr.APPEND_CONST_ASC( " \\* \"Font:" );
777*b1cdbd2cSJim Jagielski     aStr.Append( sFamilyName );
778*b1cdbd2cSJim Jagielski     aStr.APPEND_CONST_ASC( "\" \\* hps" );
779*b1cdbd2cSJim Jagielski     aStr += String::CreateFromInt32( nHeight );
780*b1cdbd2cSJim Jagielski     aStr.APPEND_CONST_ASC( " \\o" );
781*b1cdbd2cSJim Jagielski     if ( cDirective )
782*b1cdbd2cSJim Jagielski     {
783*b1cdbd2cSJim Jagielski         aStr.APPEND_CONST_ASC( "\\a" );
784*b1cdbd2cSJim Jagielski         aStr.Append( cDirective );
785*b1cdbd2cSJim Jagielski     }
786*b1cdbd2cSJim Jagielski     aStr.APPEND_CONST_ASC( "(\\s\\up " );
787*b1cdbd2cSJim Jagielski 
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski     if ( pBreakIt->GetBreakIter().is() )
790*b1cdbd2cSJim Jagielski         nRubyScript = pBreakIt->GetBreakIter()->getScriptType( rNode.GetTxt(),
791*b1cdbd2cSJim Jagielski                 *( pRubyTxt->GetStart() ) );
792*b1cdbd2cSJim Jagielski     else
793*b1cdbd2cSJim Jagielski         nRubyScript = i18n::ScriptType::ASIAN;
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski     const SwAttrSet& rSet = rNode.GetSwAttrSet();
796*b1cdbd2cSJim Jagielski     const SvxFontHeightItem &rHeightItem  =
797*b1cdbd2cSJim Jagielski         ( const SvxFontHeightItem& )rSet.Get(
798*b1cdbd2cSJim Jagielski                                              GetWhichOfScript( RES_CHRATR_FONTSIZE, nRubyScript ) );
799*b1cdbd2cSJim Jagielski     nHeight = (rHeightItem.GetHeight() + 10)/20-1;
800*b1cdbd2cSJim Jagielski     aStr += String::CreateFromInt32(nHeight);
801*b1cdbd2cSJim Jagielski     aStr += '(';
802*b1cdbd2cSJim Jagielski     aStr += rRuby.GetText();
803*b1cdbd2cSJim Jagielski     aStr.APPEND_CONST_ASC( ");" );
804*b1cdbd2cSJim Jagielski     m_rWW8Export.OutputField( 0, ww::eEQ, aStr,
805*b1cdbd2cSJim Jagielski             WRITEFIELD_START | WRITEFIELD_CMD_START );
806*b1cdbd2cSJim Jagielski }
807*b1cdbd2cSJim Jagielski 
EndRuby()808*b1cdbd2cSJim Jagielski void WW8AttributeOutput::EndRuby()
809*b1cdbd2cSJim Jagielski {
810*b1cdbd2cSJim Jagielski     m_rWW8Export.WriteChar( ')' );
811*b1cdbd2cSJim Jagielski     m_rWW8Export.OutputField( 0, ww::eEQ, aEmptyStr, WRITEFIELD_END | WRITEFIELD_CLOSE );
812*b1cdbd2cSJim Jagielski }
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski /*#i15387# Better ideas welcome*/
TruncateBookmark(String & rRet)815*b1cdbd2cSJim Jagielski String &TruncateBookmark( String &rRet )
816*b1cdbd2cSJim Jagielski {
817*b1cdbd2cSJim Jagielski     if ( rRet.Len() > 40 )
818*b1cdbd2cSJim Jagielski         rRet.Erase( 40 );
819*b1cdbd2cSJim Jagielski     ASSERT( rRet.Len() <= 40, "Word cannot have bookmarks longer than 40 chars" );
820*b1cdbd2cSJim Jagielski     return rRet;
821*b1cdbd2cSJim Jagielski }
822*b1cdbd2cSJim Jagielski 
AnalyzeURL(const String & rUrl,const String &,String * pLinkURL,String * pMark)823*b1cdbd2cSJim Jagielski bool AttributeOutputBase::AnalyzeURL( const String& rUrl, const String& /*rTarget*/, String* pLinkURL, String* pMark )
824*b1cdbd2cSJim Jagielski {
825*b1cdbd2cSJim Jagielski     bool bBookMarkOnly = false;
826*b1cdbd2cSJim Jagielski 
827*b1cdbd2cSJim Jagielski     INetURLObject aURL( rUrl );
828*b1cdbd2cSJim Jagielski     String sMark;
829*b1cdbd2cSJim Jagielski     String sURL;
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski     if ( rUrl.Len() > 1 && rUrl.GetChar(0) == INET_MARK_TOKEN )
832*b1cdbd2cSJim Jagielski     {
833*b1cdbd2cSJim Jagielski         sMark = BookmarkToWriter( rUrl.Copy(1) );
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski         xub_StrLen nPos = sMark.SearchBackward( cMarkSeperator );
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski         String sRefType( sMark.Copy( nPos+1 ) );
838*b1cdbd2cSJim Jagielski         sRefType.EraseAllChars();
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski         // i21465 Only interested in outline references
841*b1cdbd2cSJim Jagielski         if ( sRefType.EqualsAscii( pMarkToOutline ) )
842*b1cdbd2cSJim Jagielski         {
843*b1cdbd2cSJim Jagielski             String sLink = sMark.Copy(0, nPos);
844*b1cdbd2cSJim Jagielski             SwImplBookmarksIter bkmkIterEnd = GetExport().maImplicitBookmarks.end();
845*b1cdbd2cSJim Jagielski             for ( SwImplBookmarksIter aIter = GetExport().maImplicitBookmarks.begin(); aIter != bkmkIterEnd; ++aIter )
846*b1cdbd2cSJim Jagielski             {
847*b1cdbd2cSJim Jagielski                 String bkmkName  = aIter->first;
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski                 if ( bkmkName == sLink )
850*b1cdbd2cSJim Jagielski                 {
851*b1cdbd2cSJim Jagielski                     sMark = String( RTL_CONSTASCII_STRINGPARAM( "_toc" ) );
852*b1cdbd2cSJim Jagielski                     sMark += String::CreateFromInt32( aIter->second );
853*b1cdbd2cSJim Jagielski                 }
854*b1cdbd2cSJim Jagielski             }
855*b1cdbd2cSJim Jagielski         }
856*b1cdbd2cSJim Jagielski     }
857*b1cdbd2cSJim Jagielski     else
858*b1cdbd2cSJim Jagielski     {
859*b1cdbd2cSJim Jagielski         sURL = aURL.GetURLNoMark( INetURLObject::DECODE_UNAMBIGUOUS );
860*b1cdbd2cSJim Jagielski         sMark = aURL.GetMark( INetURLObject::DECODE_UNAMBIGUOUS );
861*b1cdbd2cSJim Jagielski 
862*b1cdbd2cSJim Jagielski     }
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski     if ( sMark.Len() && !sURL.Len() )
865*b1cdbd2cSJim Jagielski         bBookMarkOnly = true;
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski 
869*b1cdbd2cSJim Jagielski     *pMark = sMark;
870*b1cdbd2cSJim Jagielski     *pLinkURL = sURL;
871*b1cdbd2cSJim Jagielski     return bBookMarkOnly;
872*b1cdbd2cSJim Jagielski }
873*b1cdbd2cSJim Jagielski 
AnalyzeURL(const String & rUrl,const String & rTarget,String * pLinkURL,String * pMark)874*b1cdbd2cSJim Jagielski bool WW8AttributeOutput::AnalyzeURL( const String& rUrl, const String& rTarget, String* pLinkURL, String* pMark )
875*b1cdbd2cSJim Jagielski {
876*b1cdbd2cSJim Jagielski     bool bBookMarkOnly = AttributeOutputBase::AnalyzeURL( rUrl, rTarget, pLinkURL, pMark );
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski     String sURL = *pLinkURL;
879*b1cdbd2cSJim Jagielski     String sMark = *pMark;
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski     if ( sURL.Len() )
882*b1cdbd2cSJim Jagielski         sURL = URIHelper::simpleNormalizedMakeRelative( m_rWW8Export.GetWriter().GetBaseURL(), sURL );
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski     if ( bBookMarkOnly )
885*b1cdbd2cSJim Jagielski         sURL = FieldString( ww::eHYPERLINK );
886*b1cdbd2cSJim Jagielski     else
887*b1cdbd2cSJim Jagielski     {
888*b1cdbd2cSJim Jagielski         String sFld( FieldString( ww::eHYPERLINK ) );
889*b1cdbd2cSJim Jagielski         sFld.APPEND_CONST_ASC( "\"" );
890*b1cdbd2cSJim Jagielski         sURL.Insert( sFld, 0 );
891*b1cdbd2cSJim Jagielski         sURL += '\"';
892*b1cdbd2cSJim Jagielski     }
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski     if ( sMark.Len() )
895*b1cdbd2cSJim Jagielski         ( ( sURL.APPEND_CONST_ASC( " \\l \"" ) ) += sMark ) += '\"';
896*b1cdbd2cSJim Jagielski 
897*b1cdbd2cSJim Jagielski     if ( rTarget.Len() )
898*b1cdbd2cSJim Jagielski         ( sURL.APPEND_CONST_ASC( " \\n " ) ) += rTarget;
899*b1cdbd2cSJim Jagielski 
900*b1cdbd2cSJim Jagielski     *pLinkURL = sURL;
901*b1cdbd2cSJim Jagielski     *pMark = sMark;
902*b1cdbd2cSJim Jagielski 
903*b1cdbd2cSJim Jagielski     return bBookMarkOnly;
904*b1cdbd2cSJim Jagielski }
905*b1cdbd2cSJim Jagielski 
StartURL(const String & rUrl,const String & rTarget)906*b1cdbd2cSJim Jagielski bool WW8AttributeOutput::StartURL( const String &rUrl, const String &rTarget )
907*b1cdbd2cSJim Jagielski {
908*b1cdbd2cSJim Jagielski     // hyperlinks only in WW8
909*b1cdbd2cSJim Jagielski     if ( !m_rWW8Export.bWrtWW8 )
910*b1cdbd2cSJim Jagielski         return false;
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski     INetURLObject aURL( rUrl );
913*b1cdbd2cSJim Jagielski     String sURL;
914*b1cdbd2cSJim Jagielski     String sMark;
915*b1cdbd2cSJim Jagielski 
916*b1cdbd2cSJim Jagielski     bool bBookMarkOnly = AnalyzeURL( rUrl, rTarget, &sURL, &sMark );
917*b1cdbd2cSJim Jagielski 
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski     m_rWW8Export.OutputField( 0, ww::eHYPERLINK, sURL, WRITEFIELD_START | WRITEFIELD_CMD_START );
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski     // write the refence to the "picture" structure
922*b1cdbd2cSJim Jagielski     sal_uLong nDataStt = m_rWW8Export.pDataStrm->Tell();
923*b1cdbd2cSJim Jagielski     m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell() );
924*b1cdbd2cSJim Jagielski 
925*b1cdbd2cSJim Jagielski //  WinWord 2000 doesn't write this - so its a temp solution by W97 ?
926*b1cdbd2cSJim Jagielski     m_rWW8Export.WriteChar( 0x01 );
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski     static sal_uInt8 aArr1[] = {
929*b1cdbd2cSJim Jagielski         0x03, 0x6a, 0,0,0,0,    // sprmCPicLocation
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski         0x06, 0x08, 0x01,       // sprmCFData
932*b1cdbd2cSJim Jagielski         0x55, 0x08, 0x01,       // sprmCFSpec
933*b1cdbd2cSJim Jagielski         0x02, 0x08, 0x01        // sprmCFFldVanish
934*b1cdbd2cSJim Jagielski     };
935*b1cdbd2cSJim Jagielski     sal_uInt8* pDataAdr = aArr1 + 2;
936*b1cdbd2cSJim Jagielski     Set_UInt32( pDataAdr, nDataStt );
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski     m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), sizeof( aArr1 ), aArr1 );
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski     m_rWW8Export.OutputField( 0, ww::eHYPERLINK, sURL, WRITEFIELD_CMD_END );
941*b1cdbd2cSJim Jagielski 
942*b1cdbd2cSJim Jagielski     // now write the picture structur
943*b1cdbd2cSJim Jagielski     sURL = aURL.GetURLNoMark();
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski     //all links end up in the data stream as absolute references.
946*b1cdbd2cSJim Jagielski     bool bAbsolute = !bBookMarkOnly;
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski     static sal_uInt8 __READONLY_DATA aURLData1[] = {
949*b1cdbd2cSJim Jagielski         0,0,0,0,        // len of struct
950*b1cdbd2cSJim Jagielski         0x44,0,         // the start of "next" data
951*b1cdbd2cSJim Jagielski         0,0,0,0,0,0,0,0,0,0,                // PIC-Structure!
952*b1cdbd2cSJim Jagielski         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |
953*b1cdbd2cSJim Jagielski         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |
954*b1cdbd2cSJim Jagielski         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |
955*b1cdbd2cSJim Jagielski         0,0,0,0,                            // /
956*b1cdbd2cSJim Jagielski     };
957*b1cdbd2cSJim Jagielski     static sal_uInt8 __READONLY_DATA MAGIC_A[] = {
958*b1cdbd2cSJim Jagielski         // start of "next" data
959*b1cdbd2cSJim Jagielski         0xD0,0xC9,0xEA,0x79,0xF9,0xBA,0xCE,0x11,
960*b1cdbd2cSJim Jagielski         0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B
961*b1cdbd2cSJim Jagielski     };
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski     m_rWW8Export.pDataStrm->Write( aURLData1, sizeof( aURLData1 ) );
964*b1cdbd2cSJim Jagielski     sal_uInt8 nAnchor = 0x00;
965*b1cdbd2cSJim Jagielski     if ( sMark.Len() )
966*b1cdbd2cSJim Jagielski         nAnchor = 0x08;
967*b1cdbd2cSJim Jagielski     m_rWW8Export.pDataStrm->Write( &nAnchor, 1 );
968*b1cdbd2cSJim Jagielski     m_rWW8Export.pDataStrm->Write( MAGIC_A, sizeof(MAGIC_A) );
969*b1cdbd2cSJim Jagielski     SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, 0x00000002);
970*b1cdbd2cSJim Jagielski     sal_uInt32 nFlag = bBookMarkOnly ? 0 : 0x01;
971*b1cdbd2cSJim Jagielski     if ( bAbsolute )
972*b1cdbd2cSJim Jagielski         nFlag |= 0x02;
973*b1cdbd2cSJim Jagielski     if ( sMark.Len() )
974*b1cdbd2cSJim Jagielski         nFlag |= 0x08;
975*b1cdbd2cSJim Jagielski     SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, nFlag );
976*b1cdbd2cSJim Jagielski 
977*b1cdbd2cSJim Jagielski     INetProtocol eProto = aURL.GetProtocol();
978*b1cdbd2cSJim Jagielski     if ( eProto == INET_PROT_FILE )
979*b1cdbd2cSJim Jagielski     {
980*b1cdbd2cSJim Jagielski         // version 1 (for a document)
981*b1cdbd2cSJim Jagielski 
982*b1cdbd2cSJim Jagielski         static sal_uInt8 __READONLY_DATA MAGIC_C[] = {
983*b1cdbd2cSJim Jagielski             0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
984*b1cdbd2cSJim Jagielski             0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46,
985*b1cdbd2cSJim Jagielski             0x00, 0x00
986*b1cdbd2cSJim Jagielski         };
987*b1cdbd2cSJim Jagielski 
988*b1cdbd2cSJim Jagielski         static sal_uInt8 __READONLY_DATA MAGIC_D[] = {
989*b1cdbd2cSJim Jagielski             0xFF, 0xFF, 0xAD, 0xDE, 0x00, 0x00, 0x00, 0x00,
990*b1cdbd2cSJim Jagielski             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
991*b1cdbd2cSJim Jagielski             0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
992*b1cdbd2cSJim Jagielski         };
993*b1cdbd2cSJim Jagielski 
994*b1cdbd2cSJim Jagielski         // save the links to files as relative
995*b1cdbd2cSJim Jagielski         sURL = URIHelper::simpleNormalizedMakeRelative( m_rWW8Export.GetWriter().GetBaseURL(), sURL );
996*b1cdbd2cSJim Jagielski         if ( sURL.EqualsAscii( "/", 0, 1 ) )
997*b1cdbd2cSJim Jagielski             sURL = aURL.PathToFileName();
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski         // special case for the absolute windows names
1000*b1cdbd2cSJim Jagielski         // (convert '/c:/foo/bar.doc' into 'c:\foo\bar.doc')
1001*b1cdbd2cSJim Jagielski         sal_Unicode aDrive = ( sURL.Len() > 1 )? sURL.GetChar( 1 ): 0;
1002*b1cdbd2cSJim Jagielski         if ( sURL.EqualsAscii( "/", 0, 1 ) &&
1003*b1cdbd2cSJim Jagielski              ( ( aDrive >= 'A' && aDrive <= 'Z' ) || ( aDrive >= 'a' && aDrive <= 'z' ) ) &&
1004*b1cdbd2cSJim Jagielski              sURL.EqualsAscii( ":", 2, 1 ) )
1005*b1cdbd2cSJim Jagielski         {
1006*b1cdbd2cSJim Jagielski             sURL.Erase( 0, 1 );
1007*b1cdbd2cSJim Jagielski             sURL.SearchAndReplaceAll( '/', '\\' );
1008*b1cdbd2cSJim Jagielski         }
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski         m_rWW8Export.pDataStrm->Write( MAGIC_C, sizeof(MAGIC_C) );
1011*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, sURL.Len()+1 );
1012*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteString8( *m_rWW8Export.pDataStrm, sURL, true,
1013*b1cdbd2cSJim Jagielski                                     RTL_TEXTENCODING_MS_1252 );
1014*b1cdbd2cSJim Jagielski         m_rWW8Export.pDataStrm->Write( MAGIC_D, sizeof( MAGIC_D ) );
1015*b1cdbd2cSJim Jagielski 
1016*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, 2*sURL.Len() + 6 );
1017*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, 2*sURL.Len() );
1018*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteShort( *m_rWW8Export.pDataStrm, 3 );
1019*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteString16( *m_rWW8Export.pDataStrm, sURL, false );
1020*b1cdbd2cSJim Jagielski     }
1021*b1cdbd2cSJim Jagielski     else if ( eProto != INET_PROT_NOT_VALID )
1022*b1cdbd2cSJim Jagielski     {
1023*b1cdbd2cSJim Jagielski         // version 2 (simple url)
1024*b1cdbd2cSJim Jagielski         // an write some data to the data stream, but dont ask
1025*b1cdbd2cSJim Jagielski         // what the data mean, except for the URL.
1026*b1cdbd2cSJim Jagielski         // The First piece is the WW8_PIC structure.
1027*b1cdbd2cSJim Jagielski         //
1028*b1cdbd2cSJim Jagielski         static sal_uInt8 __READONLY_DATA MAGIC_B[] = {
1029*b1cdbd2cSJim Jagielski             0xE0,0xC9,0xEA,0x79,0xF9,0xBA,0xCE,0x11,
1030*b1cdbd2cSJim Jagielski             0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B
1031*b1cdbd2cSJim Jagielski         };
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski         m_rWW8Export.pDataStrm->Write( MAGIC_B, sizeof(MAGIC_B) );
1034*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, 2 * ( sURL.Len() + 1 ) );
1035*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteString16( *m_rWW8Export.pDataStrm, sURL, true );
1036*b1cdbd2cSJim Jagielski     }
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski     if ( sMark.Len() )
1039*b1cdbd2cSJim Jagielski     {
1040*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, sMark.Len()+1 );
1041*b1cdbd2cSJim Jagielski         SwWW8Writer::WriteString16( *m_rWW8Export.pDataStrm, sMark, true );
1042*b1cdbd2cSJim Jagielski     }
1043*b1cdbd2cSJim Jagielski     SwWW8Writer::WriteLong( *m_rWW8Export.pDataStrm, nDataStt,
1044*b1cdbd2cSJim Jagielski         m_rWW8Export.pDataStrm->Tell() - nDataStt );
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski     return true;
1047*b1cdbd2cSJim Jagielski }
1048*b1cdbd2cSJim Jagielski 
EndURL()1049*b1cdbd2cSJim Jagielski bool WW8AttributeOutput::EndURL()
1050*b1cdbd2cSJim Jagielski {
1051*b1cdbd2cSJim Jagielski     // hyperlinks only in WW8
1052*b1cdbd2cSJim Jagielski     if ( !m_rWW8Export.bWrtWW8 )
1053*b1cdbd2cSJim Jagielski         return false;
1054*b1cdbd2cSJim Jagielski 
1055*b1cdbd2cSJim Jagielski     m_rWW8Export.OutputField( 0, ww::eHYPERLINK, aEmptyStr, WRITEFIELD_CLOSE );
1056*b1cdbd2cSJim Jagielski 
1057*b1cdbd2cSJim Jagielski     return true;
1058*b1cdbd2cSJim Jagielski }
1059*b1cdbd2cSJim Jagielski 
BookmarkToWord(const String & rBookmark)1060*b1cdbd2cSJim Jagielski String BookmarkToWord(const String &rBookmark)
1061*b1cdbd2cSJim Jagielski {
1062*b1cdbd2cSJim Jagielski     String sRet(INetURLObject::encode(rBookmark,
1063*b1cdbd2cSJim Jagielski         INetURLObject::PART_REL_SEGMENT_EXTRA, '%',
1064*b1cdbd2cSJim Jagielski         INetURLObject::ENCODE_ALL, RTL_TEXTENCODING_ASCII_US));
1065*b1cdbd2cSJim Jagielski     return TruncateBookmark(sRet);
1066*b1cdbd2cSJim Jagielski }
1067*b1cdbd2cSJim Jagielski 
BookmarkToWriter(const String & rBookmark)1068*b1cdbd2cSJim Jagielski String BookmarkToWriter(const String &rBookmark)
1069*b1cdbd2cSJim Jagielski {
1070*b1cdbd2cSJim Jagielski     return INetURLObject::decode(rBookmark, '%',
1071*b1cdbd2cSJim Jagielski         INetURLObject::DECODE_UNAMBIGUOUS, RTL_TEXTENCODING_ASCII_US);
1072*b1cdbd2cSJim Jagielski }
1073*b1cdbd2cSJim Jagielski 
OutSwFmtRefMark(const SwFmtRefMark & rAttr,bool)1074*b1cdbd2cSJim Jagielski void WW8SwAttrIter::OutSwFmtRefMark(const SwFmtRefMark& rAttr, bool)
1075*b1cdbd2cSJim Jagielski {
1076*b1cdbd2cSJim Jagielski     if ( m_rExport.HasRefToObject( REF_SETREFATTR, &rAttr.GetRefName(), 0 ) )
1077*b1cdbd2cSJim Jagielski         m_rExport.AppendBookmark( m_rExport.GetBookmarkName( REF_SETREFATTR,
1078*b1cdbd2cSJim Jagielski                                             &rAttr.GetRefName(), 0 ));
1079*b1cdbd2cSJim Jagielski }
1080*b1cdbd2cSJim Jagielski 
FieldVanish(const String & rTxt,ww::eField)1081*b1cdbd2cSJim Jagielski void WW8AttributeOutput::FieldVanish( const String& rTxt, ww::eField /*eType*/ )
1082*b1cdbd2cSJim Jagielski {
1083*b1cdbd2cSJim Jagielski     WW8Bytes aItems;
1084*b1cdbd2cSJim Jagielski     m_rWW8Export.GetCurrentItems( aItems );
1085*b1cdbd2cSJim Jagielski 
1086*b1cdbd2cSJim Jagielski     // sprmCFFldVanish
1087*b1cdbd2cSJim Jagielski     if ( m_rWW8Export.bWrtWW8 )
1088*b1cdbd2cSJim Jagielski         SwWW8Writer::InsUInt16( aItems, NS_sprm::LN_CFFldVanish );
1089*b1cdbd2cSJim Jagielski     else
1090*b1cdbd2cSJim Jagielski         aItems.Insert( 67, aItems.Count() );
1091*b1cdbd2cSJim Jagielski     aItems.Insert( 1, aItems.Count() );
1092*b1cdbd2cSJim Jagielski 
1093*b1cdbd2cSJim Jagielski     sal_uInt16 nStt_sprmCFSpec = aItems.Count();
1094*b1cdbd2cSJim Jagielski 
1095*b1cdbd2cSJim Jagielski     // sprmCFSpec --  fSpec-Attribut true
1096*b1cdbd2cSJim Jagielski     if ( m_rWW8Export.bWrtWW8 )
1097*b1cdbd2cSJim Jagielski         SwWW8Writer::InsUInt16( aItems, 0x855 );
1098*b1cdbd2cSJim Jagielski     else
1099*b1cdbd2cSJim Jagielski         aItems.Insert( 117, aItems.Count() );
1100*b1cdbd2cSJim Jagielski     aItems.Insert( 1, aItems.Count() );
1101*b1cdbd2cSJim Jagielski 
1102*b1cdbd2cSJim Jagielski     m_rWW8Export.WriteChar( '\x13' );
1103*b1cdbd2cSJim Jagielski     m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), aItems.Count(),
1104*b1cdbd2cSJim Jagielski                                     aItems.GetData() );
1105*b1cdbd2cSJim Jagielski     m_rWW8Export.OutSwString( rTxt, 0, rTxt.Len(), m_rWW8Export.IsUnicode(),
1106*b1cdbd2cSJim Jagielski                         RTL_TEXTENCODING_MS_1252 );
1107*b1cdbd2cSJim Jagielski     m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), nStt_sprmCFSpec,
1108*b1cdbd2cSJim Jagielski                                     aItems.GetData() );
1109*b1cdbd2cSJim Jagielski     m_rWW8Export.WriteChar( '\x15' );
1110*b1cdbd2cSJim Jagielski     m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), aItems.Count(),
1111*b1cdbd2cSJim Jagielski                                     aItems.GetData() );
1112*b1cdbd2cSJim Jagielski }
1113*b1cdbd2cSJim Jagielski 
TOXMark(const SwTxtNode & rNode,const SwTOXMark & rAttr)1114*b1cdbd2cSJim Jagielski void AttributeOutputBase::TOXMark( const SwTxtNode& rNode, const SwTOXMark& rAttr )
1115*b1cdbd2cSJim Jagielski {
1116*b1cdbd2cSJim Jagielski     // its a field; so get the Text form the Node and build the field
1117*b1cdbd2cSJim Jagielski     String sTxt;
1118*b1cdbd2cSJim Jagielski     ww::eField eType = ww::eNONE;
1119*b1cdbd2cSJim Jagielski 
1120*b1cdbd2cSJim Jagielski     const SwTxtTOXMark& rTxtTOXMark = *rAttr.GetTxtTOXMark();
1121*b1cdbd2cSJim Jagielski     const xub_StrLen* pTxtEnd = rTxtTOXMark.End();
1122*b1cdbd2cSJim Jagielski     if ( pTxtEnd ) // has range?
1123*b1cdbd2cSJim Jagielski     {
1124*b1cdbd2cSJim Jagielski         sTxt = rNode.GetExpandTxt( *rTxtTOXMark.GetStart(),
1125*b1cdbd2cSJim Jagielski                                    *pTxtEnd - *rTxtTOXMark.GetStart() );
1126*b1cdbd2cSJim Jagielski     }
1127*b1cdbd2cSJim Jagielski     else
1128*b1cdbd2cSJim Jagielski         sTxt = rAttr.GetAlternativeText();
1129*b1cdbd2cSJim Jagielski 
1130*b1cdbd2cSJim Jagielski     switch ( rAttr.GetTOXType()->GetType() )
1131*b1cdbd2cSJim Jagielski     {
1132*b1cdbd2cSJim Jagielski         case TOX_INDEX:
1133*b1cdbd2cSJim Jagielski             eType = ww::eXE;
1134*b1cdbd2cSJim Jagielski             if ( rAttr.GetPrimaryKey().Len() )
1135*b1cdbd2cSJim Jagielski             {
1136*b1cdbd2cSJim Jagielski                 if ( rAttr.GetSecondaryKey().Len() )
1137*b1cdbd2cSJim Jagielski                 {
1138*b1cdbd2cSJim Jagielski                     sTxt.Insert( ':', 0 );
1139*b1cdbd2cSJim Jagielski                     sTxt.Insert( rAttr.GetSecondaryKey(), 0 );
1140*b1cdbd2cSJim Jagielski                 }
1141*b1cdbd2cSJim Jagielski 
1142*b1cdbd2cSJim Jagielski                 sTxt.Insert( ':', 0 );
1143*b1cdbd2cSJim Jagielski                 sTxt.Insert( rAttr.GetPrimaryKey(), 0 );
1144*b1cdbd2cSJim Jagielski             }
1145*b1cdbd2cSJim Jagielski             sTxt.InsertAscii( " XE \"", 0 );
1146*b1cdbd2cSJim Jagielski             sTxt.InsertAscii( "\" " );
1147*b1cdbd2cSJim Jagielski             break;
1148*b1cdbd2cSJim Jagielski 
1149*b1cdbd2cSJim Jagielski         case TOX_USER:
1150*b1cdbd2cSJim Jagielski             ( sTxt.APPEND_CONST_ASC( "\" \\f \"" ) )
1151*b1cdbd2cSJim Jagielski                 += (sal_Char)( 'A' + GetExport( ).GetId( *rAttr.GetTOXType() ) );
1152*b1cdbd2cSJim Jagielski             // fall through - no break;
1153*b1cdbd2cSJim Jagielski         case TOX_CONTENT:
1154*b1cdbd2cSJim Jagielski             {
1155*b1cdbd2cSJim Jagielski                 eType = ww::eTC;
1156*b1cdbd2cSJim Jagielski                 sTxt.InsertAscii( " TC \"", 0 );
1157*b1cdbd2cSJim Jagielski                 sal_uInt16 nLvl = rAttr.GetLevel();
1158*b1cdbd2cSJim Jagielski                 if (nLvl > WW8ListManager::nMaxLevel)
1159*b1cdbd2cSJim Jagielski                     nLvl = WW8ListManager::nMaxLevel;
1160*b1cdbd2cSJim Jagielski 
1161*b1cdbd2cSJim Jagielski                 ((sTxt.APPEND_CONST_ASC( "\" \\l " ))
1162*b1cdbd2cSJim Jagielski                  += String::CreateFromInt32( nLvl )) += ' ';
1163*b1cdbd2cSJim Jagielski             }
1164*b1cdbd2cSJim Jagielski             break;
1165*b1cdbd2cSJim Jagielski         default:
1166*b1cdbd2cSJim Jagielski             ASSERT( !this, "Unhandled option for toc export" );
1167*b1cdbd2cSJim Jagielski             break;
1168*b1cdbd2cSJim Jagielski     }
1169*b1cdbd2cSJim Jagielski 
1170*b1cdbd2cSJim Jagielski     if ( sTxt.Len() )
1171*b1cdbd2cSJim Jagielski         FieldVanish( sTxt, eType );
1172*b1cdbd2cSJim Jagielski }
1173*b1cdbd2cSJim Jagielski 
OutAttrWithRange(xub_StrLen nPos)1174*b1cdbd2cSJim Jagielski int WW8SwAttrIter::OutAttrWithRange(xub_StrLen nPos)
1175*b1cdbd2cSJim Jagielski {
1176*b1cdbd2cSJim Jagielski     int nRet = 0;
1177*b1cdbd2cSJim Jagielski     if ( const SwpHints* pTxtAttrs = rNd.GetpSwpHints() )
1178*b1cdbd2cSJim Jagielski     {
1179*b1cdbd2cSJim Jagielski         m_rExport.m_aCurrentCharPropStarts.push( nPos );
1180*b1cdbd2cSJim Jagielski         const xub_StrLen* pEnd;
1181*b1cdbd2cSJim Jagielski         for ( sal_uInt16 i = 0; i < pTxtAttrs->Count(); ++i )
1182*b1cdbd2cSJim Jagielski         {
1183*b1cdbd2cSJim Jagielski             const SwTxtAttr* pHt = (*pTxtAttrs)[i];
1184*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem = &pHt->GetAttr();
1185*b1cdbd2cSJim Jagielski             switch ( pItem->Which() )
1186*b1cdbd2cSJim Jagielski             {
1187*b1cdbd2cSJim Jagielski                 case RES_TXTATR_INETFMT:
1188*b1cdbd2cSJim Jagielski                     if ( nPos == *pHt->GetStart() )
1189*b1cdbd2cSJim Jagielski                     {
1190*b1cdbd2cSJim Jagielski                         const SwFmtINetFmt *rINet = static_cast< const SwFmtINetFmt* >( pItem );
1191*b1cdbd2cSJim Jagielski                         if ( m_rExport.AttrOutput().StartURL( rINet->GetValue(), rINet->GetTargetFrame() ) )
1192*b1cdbd2cSJim Jagielski                             ++nRet;
1193*b1cdbd2cSJim Jagielski                     }
1194*b1cdbd2cSJim Jagielski                     if ( 0 != ( pEnd = pHt->End() ) && nPos == *pEnd )
1195*b1cdbd2cSJim Jagielski                     {
1196*b1cdbd2cSJim Jagielski                         if ( m_rExport.AttrOutput().EndURL() )
1197*b1cdbd2cSJim Jagielski                             --nRet;
1198*b1cdbd2cSJim Jagielski                     }
1199*b1cdbd2cSJim Jagielski                     break;
1200*b1cdbd2cSJim Jagielski                 case RES_TXTATR_REFMARK:
1201*b1cdbd2cSJim Jagielski                     if ( nPos == *pHt->GetStart() )
1202*b1cdbd2cSJim Jagielski                     {
1203*b1cdbd2cSJim Jagielski                         OutSwFmtRefMark( *static_cast< const SwFmtRefMark* >( pItem ), true );
1204*b1cdbd2cSJim Jagielski                         ++nRet;
1205*b1cdbd2cSJim Jagielski                     }
1206*b1cdbd2cSJim Jagielski                     if ( 0 != ( pEnd = pHt->End() ) && nPos == *pEnd )
1207*b1cdbd2cSJim Jagielski                     {
1208*b1cdbd2cSJim Jagielski                         OutSwFmtRefMark( *static_cast< const SwFmtRefMark* >( pItem ), false );
1209*b1cdbd2cSJim Jagielski                         --nRet;
1210*b1cdbd2cSJim Jagielski                     }
1211*b1cdbd2cSJim Jagielski                     break;
1212*b1cdbd2cSJim Jagielski                 case RES_TXTATR_TOXMARK:
1213*b1cdbd2cSJim Jagielski                     if ( nPos == *pHt->GetStart() )
1214*b1cdbd2cSJim Jagielski                         m_rExport.AttrOutput().TOXMark( rNd, *static_cast< const SwTOXMark* >( pItem ) );
1215*b1cdbd2cSJim Jagielski                     break;
1216*b1cdbd2cSJim Jagielski                 case RES_TXTATR_CJK_RUBY:
1217*b1cdbd2cSJim Jagielski                     if ( nPos == *pHt->GetStart() )
1218*b1cdbd2cSJim Jagielski                     {
1219*b1cdbd2cSJim Jagielski                         m_rExport.AttrOutput().StartRuby( rNd, *static_cast< const SwFmtRuby* >( pItem ) );
1220*b1cdbd2cSJim Jagielski                         ++nRet;
1221*b1cdbd2cSJim Jagielski                     }
1222*b1cdbd2cSJim Jagielski                     if ( 0 != ( pEnd = pHt->End() ) && nPos == *pEnd )
1223*b1cdbd2cSJim Jagielski                     {
1224*b1cdbd2cSJim Jagielski                         m_rExport.AttrOutput().EndRuby();
1225*b1cdbd2cSJim Jagielski                         --nRet;
1226*b1cdbd2cSJim Jagielski                     }
1227*b1cdbd2cSJim Jagielski                     break;
1228*b1cdbd2cSJim Jagielski             }
1229*b1cdbd2cSJim Jagielski         }
1230*b1cdbd2cSJim Jagielski         m_rExport.m_aCurrentCharPropStarts.pop(); // HasTextItem nur in dem obigen Bereich erlaubt
1231*b1cdbd2cSJim Jagielski     }
1232*b1cdbd2cSJim Jagielski     return nRet;
1233*b1cdbd2cSJim Jagielski }
1234*b1cdbd2cSJim Jagielski 
IsRedlineAtEnd(xub_StrLen nEnd) const1235*b1cdbd2cSJim Jagielski bool WW8SwAttrIter::IsRedlineAtEnd( xub_StrLen nEnd ) const
1236*b1cdbd2cSJim Jagielski {
1237*b1cdbd2cSJim Jagielski     bool bRet = false;
1238*b1cdbd2cSJim Jagielski     // search next Redline
1239*b1cdbd2cSJim Jagielski     for( sal_uInt16 nPos = nCurRedlinePos;
1240*b1cdbd2cSJim Jagielski         nPos < m_rExport.pDoc->GetRedlineTbl().Count(); ++nPos )
1241*b1cdbd2cSJim Jagielski     {
1242*b1cdbd2cSJim Jagielski         const SwPosition* pEnd = m_rExport.pDoc->GetRedlineTbl()[ nPos ]->End();
1243*b1cdbd2cSJim Jagielski         if( pEnd->nNode == rNd )
1244*b1cdbd2cSJim Jagielski         {
1245*b1cdbd2cSJim Jagielski             if( pEnd->nContent.GetIndex() == nEnd )
1246*b1cdbd2cSJim Jagielski             {
1247*b1cdbd2cSJim Jagielski                 bRet = true;
1248*b1cdbd2cSJim Jagielski                 break;
1249*b1cdbd2cSJim Jagielski             }
1250*b1cdbd2cSJim Jagielski         }
1251*b1cdbd2cSJim Jagielski         else
1252*b1cdbd2cSJim Jagielski             break;
1253*b1cdbd2cSJim Jagielski     }
1254*b1cdbd2cSJim Jagielski     return bRet;
1255*b1cdbd2cSJim Jagielski }
1256*b1cdbd2cSJim Jagielski 
GetRedline(xub_StrLen nPos)1257*b1cdbd2cSJim Jagielski const SwRedlineData* WW8SwAttrIter::GetRedline( xub_StrLen nPos )
1258*b1cdbd2cSJim Jagielski {
1259*b1cdbd2cSJim Jagielski     if( pCurRedline )
1260*b1cdbd2cSJim Jagielski     {
1261*b1cdbd2cSJim Jagielski         const SwPosition* pEnd = pCurRedline->End();
1262*b1cdbd2cSJim Jagielski         if( pEnd->nNode == rNd &&
1263*b1cdbd2cSJim Jagielski             pEnd->nContent.GetIndex() <= nPos )
1264*b1cdbd2cSJim Jagielski         {
1265*b1cdbd2cSJim Jagielski             pCurRedline = 0;
1266*b1cdbd2cSJim Jagielski             ++nCurRedlinePos;
1267*b1cdbd2cSJim Jagielski         }
1268*b1cdbd2cSJim Jagielski         else
1269*b1cdbd2cSJim Jagielski         {
1270*b1cdbd2cSJim Jagielski             // write data of current redline
1271*b1cdbd2cSJim Jagielski             return &( pCurRedline->GetRedlineData() );
1272*b1cdbd2cSJim Jagielski         }
1273*b1cdbd2cSJim Jagielski     }
1274*b1cdbd2cSJim Jagielski 
1275*b1cdbd2cSJim Jagielski     if( !pCurRedline )
1276*b1cdbd2cSJim Jagielski     {
1277*b1cdbd2cSJim Jagielski         // search next Redline
1278*b1cdbd2cSJim Jagielski         for( ; nCurRedlinePos < m_rExport.pDoc->GetRedlineTbl().Count();
1279*b1cdbd2cSJim Jagielski                 ++nCurRedlinePos )
1280*b1cdbd2cSJim Jagielski         {
1281*b1cdbd2cSJim Jagielski             const SwRedline* pRedl = m_rExport.pDoc->GetRedlineTbl()[ nCurRedlinePos ];
1282*b1cdbd2cSJim Jagielski 
1283*b1cdbd2cSJim Jagielski             const SwPosition* pStt = pRedl->Start();
1284*b1cdbd2cSJim Jagielski             const SwPosition* pEnd = pStt == pRedl->GetPoint()
1285*b1cdbd2cSJim Jagielski                                         ? pRedl->GetMark()
1286*b1cdbd2cSJim Jagielski                                         : pRedl->GetPoint();
1287*b1cdbd2cSJim Jagielski 
1288*b1cdbd2cSJim Jagielski             if( pStt->nNode == rNd )
1289*b1cdbd2cSJim Jagielski             {
1290*b1cdbd2cSJim Jagielski                 if( pStt->nContent.GetIndex() >= nPos )
1291*b1cdbd2cSJim Jagielski                 {
1292*b1cdbd2cSJim Jagielski                     if( pStt->nContent.GetIndex() == nPos )
1293*b1cdbd2cSJim Jagielski                     {
1294*b1cdbd2cSJim Jagielski                         // write data of this redline
1295*b1cdbd2cSJim Jagielski                         pCurRedline = pRedl;
1296*b1cdbd2cSJim Jagielski                         return &( pCurRedline->GetRedlineData() );
1297*b1cdbd2cSJim Jagielski                     }
1298*b1cdbd2cSJim Jagielski                     break;
1299*b1cdbd2cSJim Jagielski                 }
1300*b1cdbd2cSJim Jagielski             }
1301*b1cdbd2cSJim Jagielski             else
1302*b1cdbd2cSJim Jagielski                 break;
1303*b1cdbd2cSJim Jagielski 
1304*b1cdbd2cSJim Jagielski             if( pEnd->nNode == rNd &&
1305*b1cdbd2cSJim Jagielski                 pEnd->nContent.GetIndex() < nPos )
1306*b1cdbd2cSJim Jagielski             {
1307*b1cdbd2cSJim Jagielski                 pCurRedline = pRedl;
1308*b1cdbd2cSJim Jagielski                 break;
1309*b1cdbd2cSJim Jagielski             }
1310*b1cdbd2cSJim Jagielski         }
1311*b1cdbd2cSJim Jagielski     }
1312*b1cdbd2cSJim Jagielski     return NULL;
1313*b1cdbd2cSJim Jagielski }
1314*b1cdbd2cSJim Jagielski 
1315*b1cdbd2cSJim Jagielski /*  */
1316*b1cdbd2cSJim Jagielski 
GetCurrentPageDirection() const1317*b1cdbd2cSJim Jagielski short MSWordExportBase::GetCurrentPageDirection() const
1318*b1cdbd2cSJim Jagielski {
1319*b1cdbd2cSJim Jagielski     const SwFrmFmt &rFmt = pAktPageDesc
1320*b1cdbd2cSJim Jagielski                     ? pAktPageDesc->GetMaster()
1321*b1cdbd2cSJim Jagielski                     : const_cast<const SwDoc *>( pDoc )->GetPageDesc( 0 ).GetMaster();
1322*b1cdbd2cSJim Jagielski     return rFmt.GetFrmDir().GetValue();
1323*b1cdbd2cSJim Jagielski }
1324*b1cdbd2cSJim Jagielski 
GetDefaultFrameDirection() const1325*b1cdbd2cSJim Jagielski short MSWordExportBase::GetDefaultFrameDirection( ) const
1326*b1cdbd2cSJim Jagielski {
1327*b1cdbd2cSJim Jagielski     short nDir = FRMDIR_ENVIRONMENT;
1328*b1cdbd2cSJim Jagielski 
1329*b1cdbd2cSJim Jagielski     if ( bOutPageDescs )
1330*b1cdbd2cSJim Jagielski         nDir = GetCurrentPageDirection(  );
1331*b1cdbd2cSJim Jagielski     else if ( pOutFmtNode )
1332*b1cdbd2cSJim Jagielski     {
1333*b1cdbd2cSJim Jagielski         if ( bOutFlyFrmAttrs ) //frame
1334*b1cdbd2cSJim Jagielski         {
1335*b1cdbd2cSJim Jagielski             nDir = TrueFrameDirection( *( const SwFrmFmt * ) pOutFmtNode );
1336*b1cdbd2cSJim Jagielski         }
1337*b1cdbd2cSJim Jagielski         else if ( pOutFmtNode->ISA( SwCntntNode ) )    //pagagraph
1338*b1cdbd2cSJim Jagielski         {
1339*b1cdbd2cSJim Jagielski             const SwCntntNode *pNd = ( const SwCntntNode * ) pOutFmtNode;
1340*b1cdbd2cSJim Jagielski             SwPosition aPos( *pNd );
1341*b1cdbd2cSJim Jagielski             nDir = pDoc->GetTextDirection( aPos );
1342*b1cdbd2cSJim Jagielski         }
1343*b1cdbd2cSJim Jagielski         else if ( pOutFmtNode->ISA( SwTxtFmtColl ) )
1344*b1cdbd2cSJim Jagielski             nDir = FRMDIR_HORI_LEFT_TOP;    //what else can we do :-(
1345*b1cdbd2cSJim Jagielski     }
1346*b1cdbd2cSJim Jagielski 
1347*b1cdbd2cSJim Jagielski     if ( nDir == FRMDIR_ENVIRONMENT )
1348*b1cdbd2cSJim Jagielski         nDir = FRMDIR_HORI_LEFT_TOP;        //Set something
1349*b1cdbd2cSJim Jagielski 
1350*b1cdbd2cSJim Jagielski     return nDir;
1351*b1cdbd2cSJim Jagielski }
1352*b1cdbd2cSJim Jagielski 
TrueFrameDirection(const SwFrmFmt & rFlyFmt) const1353*b1cdbd2cSJim Jagielski short MSWordExportBase::TrueFrameDirection( const SwFrmFmt &rFlyFmt ) const
1354*b1cdbd2cSJim Jagielski {
1355*b1cdbd2cSJim Jagielski     const SwFrmFmt *pFlyFmt = &rFlyFmt;
1356*b1cdbd2cSJim Jagielski     const SvxFrameDirectionItem* pItem = 0;
1357*b1cdbd2cSJim Jagielski     while ( pFlyFmt )
1358*b1cdbd2cSJim Jagielski     {
1359*b1cdbd2cSJim Jagielski         pItem = &pFlyFmt->GetFrmDir();
1360*b1cdbd2cSJim Jagielski         if ( FRMDIR_ENVIRONMENT == pItem->GetValue() )
1361*b1cdbd2cSJim Jagielski         {
1362*b1cdbd2cSJim Jagielski             pItem = 0;
1363*b1cdbd2cSJim Jagielski             const SwFmtAnchor* pAnchor = &pFlyFmt->GetAnchor();
1364*b1cdbd2cSJim Jagielski             if ((FLY_AT_PAGE != pAnchor->GetAnchorId()) &&
1365*b1cdbd2cSJim Jagielski                 pAnchor->GetCntntAnchor() )
1366*b1cdbd2cSJim Jagielski             {
1367*b1cdbd2cSJim Jagielski                 pFlyFmt = pAnchor->GetCntntAnchor()->nNode.GetNode().GetFlyFmt();
1368*b1cdbd2cSJim Jagielski             }
1369*b1cdbd2cSJim Jagielski             else
1370*b1cdbd2cSJim Jagielski                 pFlyFmt = 0;
1371*b1cdbd2cSJim Jagielski         }
1372*b1cdbd2cSJim Jagielski         else
1373*b1cdbd2cSJim Jagielski             pFlyFmt = 0;
1374*b1cdbd2cSJim Jagielski     }
1375*b1cdbd2cSJim Jagielski 
1376*b1cdbd2cSJim Jagielski     short nRet;
1377*b1cdbd2cSJim Jagielski     if ( pItem )
1378*b1cdbd2cSJim Jagielski         nRet = pItem->GetValue();
1379*b1cdbd2cSJim Jagielski     else
1380*b1cdbd2cSJim Jagielski         nRet = GetCurrentPageDirection();
1381*b1cdbd2cSJim Jagielski 
1382*b1cdbd2cSJim Jagielski     ASSERT( nRet != FRMDIR_ENVIRONMENT, "leaving with environment direction" );
1383*b1cdbd2cSJim Jagielski     return nRet;
1384*b1cdbd2cSJim Jagielski }
1385*b1cdbd2cSJim Jagielski 
GetCurrentPageBgBrush() const1386*b1cdbd2cSJim Jagielski const SvxBrushItem* WW8Export::GetCurrentPageBgBrush() const
1387*b1cdbd2cSJim Jagielski {
1388*b1cdbd2cSJim Jagielski     const SwFrmFmt  &rFmt = pAktPageDesc
1389*b1cdbd2cSJim Jagielski                     ? pAktPageDesc->GetMaster()
1390*b1cdbd2cSJim Jagielski                     : const_cast<const SwDoc *>(pDoc)->GetPageDesc(0).GetMaster();
1391*b1cdbd2cSJim Jagielski 
1392*b1cdbd2cSJim Jagielski     const SfxPoolItem* pItem = 0;
1393*b1cdbd2cSJim Jagielski     //If not set, or "no fill", get real bg
1394*b1cdbd2cSJim Jagielski     SfxItemState eState = rFmt.GetItemState(RES_BACKGROUND, true, &pItem);
1395*b1cdbd2cSJim Jagielski 
1396*b1cdbd2cSJim Jagielski     const SvxBrushItem* pRet = (const SvxBrushItem*)pItem;
1397*b1cdbd2cSJim Jagielski     if (SFX_ITEM_SET != eState || (!pRet->GetGraphic() &&
1398*b1cdbd2cSJim Jagielski         pRet->GetColor() == COL_TRANSPARENT))
1399*b1cdbd2cSJim Jagielski     {
1400*b1cdbd2cSJim Jagielski         pRet = &(DefaultItemGet<SvxBrushItem>(*pDoc,RES_BACKGROUND));
1401*b1cdbd2cSJim Jagielski     }
1402*b1cdbd2cSJim Jagielski     return pRet;
1403*b1cdbd2cSJim Jagielski }
1404*b1cdbd2cSJim Jagielski 
TrueFrameBgBrush(const SwFrmFmt & rFlyFmt) const1405*b1cdbd2cSJim Jagielski SvxBrushItem WW8Export::TrueFrameBgBrush(const SwFrmFmt &rFlyFmt) const
1406*b1cdbd2cSJim Jagielski {
1407*b1cdbd2cSJim Jagielski     const SwFrmFmt *pFlyFmt = &rFlyFmt;
1408*b1cdbd2cSJim Jagielski     const SvxBrushItem* pRet = 0;
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski     while (pFlyFmt)
1411*b1cdbd2cSJim Jagielski     {
1412*b1cdbd2cSJim Jagielski         //If not set, or "no fill", get real bg
1413*b1cdbd2cSJim Jagielski         const SfxPoolItem* pItem = 0;
1414*b1cdbd2cSJim Jagielski         SfxItemState eState =
1415*b1cdbd2cSJim Jagielski             pFlyFmt->GetItemState(RES_BACKGROUND, true, &pItem);
1416*b1cdbd2cSJim Jagielski         pRet = (const SvxBrushItem*)pItem;
1417*b1cdbd2cSJim Jagielski         if (SFX_ITEM_SET != eState || (!pRet->GetGraphic() &&
1418*b1cdbd2cSJim Jagielski             pRet->GetColor() == COL_TRANSPARENT))
1419*b1cdbd2cSJim Jagielski         {
1420*b1cdbd2cSJim Jagielski             pRet = 0;
1421*b1cdbd2cSJim Jagielski             const SwFmtAnchor* pAnchor = &pFlyFmt->GetAnchor();
1422*b1cdbd2cSJim Jagielski             if ((FLY_AT_PAGE != pAnchor->GetAnchorId()) &&
1423*b1cdbd2cSJim Jagielski                 pAnchor->GetCntntAnchor())
1424*b1cdbd2cSJim Jagielski             {
1425*b1cdbd2cSJim Jagielski                 pFlyFmt =
1426*b1cdbd2cSJim Jagielski                     pAnchor->GetCntntAnchor()->nNode.GetNode().GetFlyFmt();
1427*b1cdbd2cSJim Jagielski             }
1428*b1cdbd2cSJim Jagielski             else
1429*b1cdbd2cSJim Jagielski                 pFlyFmt = 0;
1430*b1cdbd2cSJim Jagielski         }
1431*b1cdbd2cSJim Jagielski         else
1432*b1cdbd2cSJim Jagielski             pFlyFmt = 0;
1433*b1cdbd2cSJim Jagielski     }
1434*b1cdbd2cSJim Jagielski 
1435*b1cdbd2cSJim Jagielski     if (!pRet)
1436*b1cdbd2cSJim Jagielski         pRet = GetCurrentPageBgBrush();
1437*b1cdbd2cSJim Jagielski 
1438*b1cdbd2cSJim Jagielski     const Color aTmpColor( COL_WHITE );
1439*b1cdbd2cSJim Jagielski     SvxBrushItem aRet( aTmpColor, RES_BACKGROUND );
1440*b1cdbd2cSJim Jagielski     if (pRet && (pRet->GetGraphic() ||( pRet->GetColor() != COL_TRANSPARENT)))
1441*b1cdbd2cSJim Jagielski         aRet = *pRet;
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski     return aRet;
1444*b1cdbd2cSJim Jagielski }
1445*b1cdbd2cSJim Jagielski 
1446*b1cdbd2cSJim Jagielski 
1447*b1cdbd2cSJim Jagielski /*
1448*b1cdbd2cSJim Jagielski Convert characters that need to be converted, the basic replacements and the
1449*b1cdbd2cSJim Jagielski ridicously complicated title case attribute mapping to hardcoded upper case
1450*b1cdbd2cSJim Jagielski because word doesn't have the feature
1451*b1cdbd2cSJim Jagielski */
GetSnippet(const String & rStr,xub_StrLen nAktPos,xub_StrLen nLen) const1452*b1cdbd2cSJim Jagielski String WW8SwAttrIter::GetSnippet(const String &rStr, xub_StrLen nAktPos,
1453*b1cdbd2cSJim Jagielski     xub_StrLen nLen) const
1454*b1cdbd2cSJim Jagielski {
1455*b1cdbd2cSJim Jagielski     String aSnippet(rStr, nAktPos, nLen);
1456*b1cdbd2cSJim Jagielski     if (!nLen)
1457*b1cdbd2cSJim Jagielski         return aSnippet;
1458*b1cdbd2cSJim Jagielski 
1459*b1cdbd2cSJim Jagielski     // 0x0a     ( Hard Line Break ) -> 0x0b
1460*b1cdbd2cSJim Jagielski     // 0xad     ( soft hyphen )     -> 0x1f
1461*b1cdbd2cSJim Jagielski     // 0x2011   ( hard hyphen )     -> 0x1e
1462*b1cdbd2cSJim Jagielski     aSnippet.SearchAndReplaceAll(0x0A, 0x0B);
1463*b1cdbd2cSJim Jagielski     aSnippet.SearchAndReplaceAll(CHAR_HARDHYPHEN, 0x1e);
1464*b1cdbd2cSJim Jagielski     aSnippet.SearchAndReplaceAll(CHAR_SOFTHYPHEN, 0x1f);
1465*b1cdbd2cSJim Jagielski 
1466*b1cdbd2cSJim Jagielski     m_rExport.m_aCurrentCharPropStarts.push( nAktPos );
1467*b1cdbd2cSJim Jagielski     const SfxPoolItem &rItem = GetItem(RES_CHRATR_CASEMAP);
1468*b1cdbd2cSJim Jagielski 
1469*b1cdbd2cSJim Jagielski     if (SVX_CASEMAP_TITEL == ((const SvxCaseMapItem&)rItem).GetValue())
1470*b1cdbd2cSJim Jagielski     {
1471*b1cdbd2cSJim Jagielski         sal_uInt16 nScriptType = i18n::ScriptType::LATIN;
1472*b1cdbd2cSJim Jagielski         if (pBreakIt->GetBreakIter().is())
1473*b1cdbd2cSJim Jagielski             nScriptType = pBreakIt->GetBreakIter()->getScriptType(aSnippet, 0);
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski         LanguageType nLanguage;
1476*b1cdbd2cSJim Jagielski         switch (nScriptType)
1477*b1cdbd2cSJim Jagielski         {
1478*b1cdbd2cSJim Jagielski         case i18n::ScriptType::ASIAN:
1479*b1cdbd2cSJim Jagielski                 nLanguage = ((const SvxLanguageItem&)GetItem(RES_CHRATR_CJK_LANGUAGE)).GetLanguage();
1480*b1cdbd2cSJim Jagielski                 break;
1481*b1cdbd2cSJim Jagielski         case i18n::ScriptType::COMPLEX:
1482*b1cdbd2cSJim Jagielski                 nLanguage = ((const SvxLanguageItem&)GetItem(RES_CHRATR_CTL_LANGUAGE)).GetLanguage();
1483*b1cdbd2cSJim Jagielski                 break;
1484*b1cdbd2cSJim Jagielski         case i18n::ScriptType::LATIN:
1485*b1cdbd2cSJim Jagielski             default:
1486*b1cdbd2cSJim Jagielski                 nLanguage = ((const SvxLanguageItem&)GetItem(RES_CHRATR_LANGUAGE)).GetLanguage();
1487*b1cdbd2cSJim Jagielski                 break;
1488*b1cdbd2cSJim Jagielski         }
1489*b1cdbd2cSJim Jagielski 
1490*b1cdbd2cSJim Jagielski         SvxFont aFontHelper;
1491*b1cdbd2cSJim Jagielski         aFontHelper.SetCaseMap(SVX_CASEMAP_TITEL);
1492*b1cdbd2cSJim Jagielski         aFontHelper.SetLanguage(nLanguage);
1493*b1cdbd2cSJim Jagielski         aSnippet = aFontHelper.CalcCaseMap(aSnippet);
1494*b1cdbd2cSJim Jagielski 
1495*b1cdbd2cSJim Jagielski         //If we weren't at the begin of a word undo the case change.
1496*b1cdbd2cSJim Jagielski         //not done before doing the casemap because the sequence might start
1497*b1cdbd2cSJim Jagielski         //with whitespace
1498*b1cdbd2cSJim Jagielski         if (pBreakIt->GetBreakIter().is() && !pBreakIt->GetBreakIter()->isBeginWord(
1499*b1cdbd2cSJim Jagielski             rStr, nAktPos, pBreakIt->GetLocale(nLanguage),
1500*b1cdbd2cSJim Jagielski             i18n::WordType::ANYWORD_IGNOREWHITESPACES ) )
1501*b1cdbd2cSJim Jagielski         {
1502*b1cdbd2cSJim Jagielski             aSnippet.SetChar(0, rStr.GetChar(nAktPos));
1503*b1cdbd2cSJim Jagielski         }
1504*b1cdbd2cSJim Jagielski     }
1505*b1cdbd2cSJim Jagielski     m_rExport.m_aCurrentCharPropStarts.pop();
1506*b1cdbd2cSJim Jagielski 
1507*b1cdbd2cSJim Jagielski     return aSnippet;
1508*b1cdbd2cSJim Jagielski }
1509*b1cdbd2cSJim Jagielski 
1510*b1cdbd2cSJim Jagielski /** Delivers the right paragraph style
1511*b1cdbd2cSJim Jagielski 
1512*b1cdbd2cSJim Jagielski     Because of the different style handling for delete operations,
1513*b1cdbd2cSJim Jagielski     the track changes have to be analysed. A deletion, starting in paragraph A
1514*b1cdbd2cSJim Jagielski     with style A, ending in paragraph B with style B, needs a hack.
1515*b1cdbd2cSJim Jagielski */
lcl_getFormatCollection(MSWordExportBase & rExport,const SwTxtNode * pTxtNode)1516*b1cdbd2cSJim Jagielski static SwTxtFmtColl& lcl_getFormatCollection( MSWordExportBase& rExport, const SwTxtNode* pTxtNode )
1517*b1cdbd2cSJim Jagielski {
1518*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = 0;
1519*b1cdbd2cSJim Jagielski     sal_uInt16 nMax = rExport.pDoc->GetRedlineTbl().Count();
1520*b1cdbd2cSJim Jagielski     while( nPos < nMax )
1521*b1cdbd2cSJim Jagielski     {
1522*b1cdbd2cSJim Jagielski         const SwRedline* pRedl = rExport.pDoc->GetRedlineTbl()[ nPos++ ];
1523*b1cdbd2cSJim Jagielski         const SwPosition* pStt = pRedl->Start();
1524*b1cdbd2cSJim Jagielski         const SwPosition* pEnd = pStt == pRedl->GetPoint()
1525*b1cdbd2cSJim Jagielski                                     ? pRedl->GetMark()
1526*b1cdbd2cSJim Jagielski                                     : pRedl->GetPoint();
1527*b1cdbd2cSJim Jagielski         // Looking for deletions, which ends in current pTxtNode
1528*b1cdbd2cSJim Jagielski         if( nsRedlineType_t::REDLINE_DELETE == pRedl->GetRedlineData().GetType() &&
1529*b1cdbd2cSJim Jagielski             pEnd->nNode == *pTxtNode && pStt->nNode != *pTxtNode &&
1530*b1cdbd2cSJim Jagielski             pStt->nNode.GetNode().IsTxtNode() )
1531*b1cdbd2cSJim Jagielski         {
1532*b1cdbd2cSJim Jagielski             pTxtNode = pStt->nNode.GetNode().GetTxtNode();
1533*b1cdbd2cSJim Jagielski             nMax = nPos;
1534*b1cdbd2cSJim Jagielski             nPos = 0;
1535*b1cdbd2cSJim Jagielski         }
1536*b1cdbd2cSJim Jagielski     }
1537*b1cdbd2cSJim Jagielski     return static_cast<SwTxtFmtColl&>( pTxtNode->GetAnyFmtColl() );
1538*b1cdbd2cSJim Jagielski }
1539*b1cdbd2cSJim Jagielski 
FormatDrop(const SwTxtNode & rNode,const SwFmtDrop & rSwFmtDrop,sal_uInt16 nStyle,ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo,ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner)1540*b1cdbd2cSJim Jagielski void WW8AttributeOutput::FormatDrop( const SwTxtNode& rNode, const SwFmtDrop &rSwFmtDrop, sal_uInt16 nStyle,
1541*b1cdbd2cSJim Jagielski         ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo, ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner )
1542*b1cdbd2cSJim Jagielski {
1543*b1cdbd2cSJim Jagielski     short nDropLines = rSwFmtDrop.GetLines();
1544*b1cdbd2cSJim Jagielski     short nDistance = rSwFmtDrop.GetDistance();
1545*b1cdbd2cSJim Jagielski     int rFontHeight, rDropHeight, rDropDescent;
1546*b1cdbd2cSJim Jagielski 
1547*b1cdbd2cSJim Jagielski     SVBT16 nSty;
1548*b1cdbd2cSJim Jagielski     ShortToSVBT16( nStyle, nSty );
1549*b1cdbd2cSJim Jagielski     m_rWW8Export.pO->Insert( (sal_uInt8*)&nSty, 2, m_rWW8Export.pO->Count() );     // Style #
1550*b1cdbd2cSJim Jagielski 
1551*b1cdbd2cSJim Jagielski     if ( m_rWW8Export.bWrtWW8 )
1552*b1cdbd2cSJim Jagielski     {
1553*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( NS_sprm::LN_PPc );            // Alignment (sprmPPc)
1554*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 0x20, m_rWW8Export.pO->Count() );
1555*b1cdbd2cSJim Jagielski 
1556*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( NS_sprm::LN_PWr );            // Wrapping (sprmPWr)
1557*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 0x02, m_rWW8Export.pO->Count() );
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( NS_sprm::LN_PDcs );            // Dropcap (sprmPDcs)
1560*b1cdbd2cSJim Jagielski         int nDCS = ( nDropLines << 3 ) | 0x01;
1561*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( nDCS ) );
1562*b1cdbd2cSJim Jagielski 
1563*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( NS_sprm::LN_PDxaFromText );            // Distance from text (sprmPDxaFromText)
1564*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( nDistance );
1565*b1cdbd2cSJim Jagielski 
1566*b1cdbd2cSJim Jagielski         if ( rNode.GetDropSize( rFontHeight, rDropHeight, rDropDescent ) )
1567*b1cdbd2cSJim Jagielski         {
1568*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( NS_sprm::LN_PDyaLine );            // Line spacing
1569*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( -rDropHeight ) );
1570*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( 0 );
1571*b1cdbd2cSJim Jagielski         }
1572*b1cdbd2cSJim Jagielski     }
1573*b1cdbd2cSJim Jagielski     else
1574*b1cdbd2cSJim Jagielski     {
1575*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 29, m_rWW8Export.pO->Count() );    // Alignment (sprmPPc)
1576*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 0x20, m_rWW8Export.pO->Count() );
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 37, m_rWW8Export.pO->Count() );    // Wrapping (sprmPWr)
1579*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 0x02, m_rWW8Export.pO->Count() );
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 46, m_rWW8Export.pO->Count() );    // Dropcap (sprmPDcs)
1582*b1cdbd2cSJim Jagielski         int nDCS = ( nDropLines << 3 ) | 0x01;
1583*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( nDCS ) );
1584*b1cdbd2cSJim Jagielski 
1585*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 49, m_rWW8Export.pO->Count() );      // Distance from text (sprmPDxaFromText)
1586*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( nDistance );
1587*b1cdbd2cSJim Jagielski 
1588*b1cdbd2cSJim Jagielski         if (rNode.GetDropSize(rFontHeight, rDropHeight, rDropDescent))
1589*b1cdbd2cSJim Jagielski         {
1590*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( 20, m_rWW8Export.pO->Count() );  // Line spacing
1591*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( -rDropHeight ) );
1592*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( 0 );
1593*b1cdbd2cSJim Jagielski         }
1594*b1cdbd2cSJim Jagielski     }
1595*b1cdbd2cSJim Jagielski 
1596*b1cdbd2cSJim Jagielski     m_rWW8Export.WriteCR( pTextNodeInfoInner );
1597*b1cdbd2cSJim Jagielski 
1598*b1cdbd2cSJim Jagielski     if ( pTextNodeInfo.get() != NULL )
1599*b1cdbd2cSJim Jagielski     {
1600*b1cdbd2cSJim Jagielski #ifdef DEBUG
1601*b1cdbd2cSJim Jagielski         ::std::clog << pTextNodeInfo->toString() << ::std::endl;
1602*b1cdbd2cSJim Jagielski #endif
1603*b1cdbd2cSJim Jagielski 
1604*b1cdbd2cSJim Jagielski         TableInfoCell( pTextNodeInfoInner );
1605*b1cdbd2cSJim Jagielski     }
1606*b1cdbd2cSJim Jagielski 
1607*b1cdbd2cSJim Jagielski     m_rWW8Export.pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(), m_rWW8Export.pO->GetData() );
1608*b1cdbd2cSJim Jagielski     m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() );
1609*b1cdbd2cSJim Jagielski 
1610*b1cdbd2cSJim Jagielski     if ( rNode.GetDropSize( rFontHeight, rDropHeight, rDropDescent ) )
1611*b1cdbd2cSJim Jagielski     {
1612*b1cdbd2cSJim Jagielski         if ( m_rWW8Export.bWrtWW8 )
1613*b1cdbd2cSJim Jagielski         {
1614*b1cdbd2cSJim Jagielski             const SwCharFmt *pSwCharFmt = rSwFmtDrop.GetCharFmt();
1615*b1cdbd2cSJim Jagielski             if ( pSwCharFmt )
1616*b1cdbd2cSJim Jagielski             {
1617*b1cdbd2cSJim Jagielski                 m_rWW8Export.InsUInt16( NS_sprm::LN_CIstd );
1618*b1cdbd2cSJim Jagielski                 m_rWW8Export.InsUInt16( m_rWW8Export.GetId( *pSwCharFmt ) );
1619*b1cdbd2cSJim Jagielski             }
1620*b1cdbd2cSJim Jagielski 
1621*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( NS_sprm::LN_CHpsPos );            // Lower the chars
1622*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( -((nDropLines - 1)*rDropDescent) / 10 ) );
1623*b1cdbd2cSJim Jagielski 
1624*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( NS_sprm::LN_CHps );            // Font Size
1625*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( rFontHeight / 10 ) );
1626*b1cdbd2cSJim Jagielski         }
1627*b1cdbd2cSJim Jagielski         else
1628*b1cdbd2cSJim Jagielski         {
1629*b1cdbd2cSJim Jagielski             const SwCharFmt *pSwCharFmt = rSwFmtDrop.GetCharFmt();
1630*b1cdbd2cSJim Jagielski             if ( pSwCharFmt )
1631*b1cdbd2cSJim Jagielski             {
1632*b1cdbd2cSJim Jagielski                 m_rWW8Export.InsUInt16( 80 );
1633*b1cdbd2cSJim Jagielski                 m_rWW8Export.InsUInt16( m_rWW8Export.GetId( *pSwCharFmt ) );
1634*b1cdbd2cSJim Jagielski             }
1635*b1cdbd2cSJim Jagielski 
1636*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( 101, m_rWW8Export.pO->Count() );      // Lower the chars
1637*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( -((nDropLines - 1)*rDropDescent) / 10 ) );
1638*b1cdbd2cSJim Jagielski 
1639*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( 99, m_rWW8Export.pO->Count() );      // Font Size
1640*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( static_cast< sal_uInt16 >( rFontHeight / 10 ) );
1641*b1cdbd2cSJim Jagielski         }
1642*b1cdbd2cSJim Jagielski     }
1643*b1cdbd2cSJim Jagielski 
1644*b1cdbd2cSJim Jagielski     m_rWW8Export.pChpPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(), m_rWW8Export.pO->GetData() );
1645*b1cdbd2cSJim Jagielski     m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() );
1646*b1cdbd2cSJim Jagielski }
1647*b1cdbd2cSJim Jagielski 
GetNextPos(WW8SwAttrIter * aAttrIter,const SwTxtNode & rNode,xub_StrLen nAktPos)1648*b1cdbd2cSJim Jagielski xub_StrLen MSWordExportBase::GetNextPos( WW8SwAttrIter* aAttrIter, const SwTxtNode& rNode, xub_StrLen nAktPos  )
1649*b1cdbd2cSJim Jagielski {
1650*b1cdbd2cSJim Jagielski     // Get the bookmarks for the normal run
1651*b1cdbd2cSJim Jagielski     xub_StrLen nNextPos = aAttrIter->WhereNext();
1652*b1cdbd2cSJim Jagielski     xub_StrLen nNextBookmark = nNextPos;
1653*b1cdbd2cSJim Jagielski 
1654*b1cdbd2cSJim Jagielski     if( nNextBookmark > nAktPos )//no need to search for bookmarks otherwise
1655*b1cdbd2cSJim Jagielski     {
1656*b1cdbd2cSJim Jagielski         GetSortedBookmarks( rNode, nAktPos, nNextBookmark - nAktPos );
1657*b1cdbd2cSJim Jagielski         NearestBookmark( nNextBookmark, nAktPos, false );
1658*b1cdbd2cSJim Jagielski     }
1659*b1cdbd2cSJim Jagielski     return std::min( nNextPos, nNextBookmark );
1660*b1cdbd2cSJim Jagielski }
1661*b1cdbd2cSJim Jagielski 
UpdatePosition(WW8SwAttrIter * aAttrIter,xub_StrLen nAktPos,xub_StrLen)1662*b1cdbd2cSJim Jagielski void MSWordExportBase::UpdatePosition( WW8SwAttrIter* aAttrIter, xub_StrLen nAktPos, xub_StrLen /*nEnd*/ )
1663*b1cdbd2cSJim Jagielski {
1664*b1cdbd2cSJim Jagielski     xub_StrLen nNextPos;
1665*b1cdbd2cSJim Jagielski 
1666*b1cdbd2cSJim Jagielski     // go to next attribute if no bookmark is found and if the next attribute position if at the current position
1667*b1cdbd2cSJim Jagielski     bool bNextBookmark = NearestBookmark( nNextPos, nAktPos, true );
1668*b1cdbd2cSJim Jagielski     if( !bNextBookmark && nAktPos >= aAttrIter->WhereNext() )
1669*b1cdbd2cSJim Jagielski         aAttrIter->NextPos();
1670*b1cdbd2cSJim Jagielski }
1671*b1cdbd2cSJim Jagielski 
GetBookmarks(const SwTxtNode & rNd,const xub_StrLen nStt,const xub_StrLen nEnd,IMarkVector & rArr)1672*b1cdbd2cSJim Jagielski bool MSWordExportBase::GetBookmarks(
1673*b1cdbd2cSJim Jagielski     const SwTxtNode& rNd,
1674*b1cdbd2cSJim Jagielski     const xub_StrLen nStt,
1675*b1cdbd2cSJim Jagielski     const xub_StrLen nEnd,
1676*b1cdbd2cSJim Jagielski     IMarkVector& rArr )
1677*b1cdbd2cSJim Jagielski {
1678*b1cdbd2cSJim Jagielski     IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
1679*b1cdbd2cSJim Jagielski     sal_uLong nNd = rNd.GetIndex( );
1680*b1cdbd2cSJim Jagielski 
1681*b1cdbd2cSJim Jagielski     const sal_Int32 nMarks = pMarkAccess->getAllMarksCount();
1682*b1cdbd2cSJim Jagielski     for ( sal_Int32 i = 0; i < nMarks; i++ )
1683*b1cdbd2cSJim Jagielski     {
1684*b1cdbd2cSJim Jagielski         IMark* pMark = ( pMarkAccess->getAllMarksBegin() + i )->get();
1685*b1cdbd2cSJim Jagielski 
1686*b1cdbd2cSJim Jagielski         if ( IDocumentMarkAccess::GetType( *(pMark) ) == IDocumentMarkAccess::ANNOTATIONMARK )
1687*b1cdbd2cSJim Jagielski         {
1688*b1cdbd2cSJim Jagielski             continue;
1689*b1cdbd2cSJim Jagielski         }
1690*b1cdbd2cSJim Jagielski 
1691*b1cdbd2cSJim Jagielski         // Only keep the bookmarks starting or ending in this node
1692*b1cdbd2cSJim Jagielski         if ( pMark->GetMarkStart().nNode == nNd ||
1693*b1cdbd2cSJim Jagielski              pMark->GetMarkEnd().nNode == nNd )
1694*b1cdbd2cSJim Jagielski         {
1695*b1cdbd2cSJim Jagielski             // Keep only the bookmarks starting or ending in the snippet
1696*b1cdbd2cSJim Jagielski             const xub_StrLen nBStart = pMark->GetMarkStart().nContent.GetIndex();
1697*b1cdbd2cSJim Jagielski             const bool bIsStartOk = ( pMark->GetMarkStart().nNode == nNd ) && ( nBStart >= nStt ) && ( nBStart <= nEnd );
1698*b1cdbd2cSJim Jagielski             const xub_StrLen nBEnd = pMark->GetMarkEnd().nContent.GetIndex();
1699*b1cdbd2cSJim Jagielski             const bool bIsEndOk = ( pMark->GetMarkEnd().nNode == nNd ) && ( nBEnd >= nStt ) && ( nBEnd <= nEnd );
1700*b1cdbd2cSJim Jagielski             if ( bIsStartOk || bIsEndOk )
1701*b1cdbd2cSJim Jagielski             {
1702*b1cdbd2cSJim Jagielski                 rArr.push_back( pMark );
1703*b1cdbd2cSJim Jagielski             }
1704*b1cdbd2cSJim Jagielski         }
1705*b1cdbd2cSJim Jagielski     }
1706*b1cdbd2cSJim Jagielski     return ( rArr.size() > 0 );
1707*b1cdbd2cSJim Jagielski }
1708*b1cdbd2cSJim Jagielski 
1709*b1cdbd2cSJim Jagielski class CompareMarksEnd : public std::binary_function < const IMark *, const IMark *, bool >
1710*b1cdbd2cSJim Jagielski {
1711*b1cdbd2cSJim Jagielski public:
operator ()(const IMark * pOneB,const IMark * pTwoB) const1712*b1cdbd2cSJim Jagielski     inline bool operator() ( const IMark * pOneB, const IMark * pTwoB ) const
1713*b1cdbd2cSJim Jagielski     {
1714*b1cdbd2cSJim Jagielski         xub_StrLen nOEnd = pOneB->GetMarkEnd().nContent.GetIndex();
1715*b1cdbd2cSJim Jagielski         xub_StrLen nTEnd = pTwoB->GetMarkEnd().nContent.GetIndex();
1716*b1cdbd2cSJim Jagielski 
1717*b1cdbd2cSJim Jagielski         return nOEnd < nTEnd;
1718*b1cdbd2cSJim Jagielski     }
1719*b1cdbd2cSJim Jagielski };
1720*b1cdbd2cSJim Jagielski 
NearestBookmark(xub_StrLen & rNearest,const xub_StrLen nAktPos,bool bNextPositionOnly)1721*b1cdbd2cSJim Jagielski bool MSWordExportBase::NearestBookmark( xub_StrLen& rNearest, const xub_StrLen nAktPos, bool bNextPositionOnly )
1722*b1cdbd2cSJim Jagielski {
1723*b1cdbd2cSJim Jagielski     bool bHasBookmark = false;
1724*b1cdbd2cSJim Jagielski 
1725*b1cdbd2cSJim Jagielski     if ( m_rSortedMarksStart.size( ) > 0 )
1726*b1cdbd2cSJim Jagielski     {
1727*b1cdbd2cSJim Jagielski         IMark* pMarkStart = m_rSortedMarksStart.front();
1728*b1cdbd2cSJim Jagielski         xub_StrLen nNext = pMarkStart->GetMarkStart().nContent.GetIndex();
1729*b1cdbd2cSJim Jagielski         if( !bNextPositionOnly || (nNext > nAktPos ))
1730*b1cdbd2cSJim Jagielski         {
1731*b1cdbd2cSJim Jagielski             rNearest = nNext;
1732*b1cdbd2cSJim Jagielski             bHasBookmark = true;
1733*b1cdbd2cSJim Jagielski         }
1734*b1cdbd2cSJim Jagielski     }
1735*b1cdbd2cSJim Jagielski 
1736*b1cdbd2cSJim Jagielski     if ( m_rSortedMarksEnd.size( ) > 0 )
1737*b1cdbd2cSJim Jagielski     {
1738*b1cdbd2cSJim Jagielski         IMark* pMarkEnd = m_rSortedMarksEnd[0];
1739*b1cdbd2cSJim Jagielski         xub_StrLen nNext = pMarkEnd->GetMarkEnd().nContent.GetIndex();
1740*b1cdbd2cSJim Jagielski         if( !bNextPositionOnly || nNext > nAktPos )
1741*b1cdbd2cSJim Jagielski         {
1742*b1cdbd2cSJim Jagielski             if ( !bHasBookmark )
1743*b1cdbd2cSJim Jagielski                 rNearest = nNext;
1744*b1cdbd2cSJim Jagielski             else
1745*b1cdbd2cSJim Jagielski                 rNearest = std::min( rNearest, nNext );
1746*b1cdbd2cSJim Jagielski             bHasBookmark = true;
1747*b1cdbd2cSJim Jagielski         }
1748*b1cdbd2cSJim Jagielski     }
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski     return bHasBookmark;
1751*b1cdbd2cSJim Jagielski }
1752*b1cdbd2cSJim Jagielski 
GetSortedBookmarks(const SwTxtNode & rNode,xub_StrLen nAktPos,xub_StrLen nLen)1753*b1cdbd2cSJim Jagielski void MSWordExportBase::GetSortedBookmarks( const SwTxtNode& rNode, xub_StrLen nAktPos, xub_StrLen nLen )
1754*b1cdbd2cSJim Jagielski {
1755*b1cdbd2cSJim Jagielski     IMarkVector aMarksStart;
1756*b1cdbd2cSJim Jagielski     if ( GetBookmarks( rNode, nAktPos, nAktPos + nLen, aMarksStart ) )
1757*b1cdbd2cSJim Jagielski     {
1758*b1cdbd2cSJim Jagielski         IMarkVector aSortedEnd;
1759*b1cdbd2cSJim Jagielski         IMarkVector aSortedStart;
1760*b1cdbd2cSJim Jagielski         for ( IMarkVector::const_iterator it = aMarksStart.begin(), end = aMarksStart.end();
1761*b1cdbd2cSJim Jagielski               it < end; ++it )
1762*b1cdbd2cSJim Jagielski         {
1763*b1cdbd2cSJim Jagielski             IMark* pMark = (*it);
1764*b1cdbd2cSJim Jagielski 
1765*b1cdbd2cSJim Jagielski             // Remove the positions egals to the current pos
1766*b1cdbd2cSJim Jagielski             xub_StrLen nStart = pMark->GetMarkStart().nContent.GetIndex();
1767*b1cdbd2cSJim Jagielski             xub_StrLen nEnd = pMark->GetMarkEnd().nContent.GetIndex();
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski             if ( nStart > nAktPos && ( pMark->GetMarkStart().nNode == rNode.GetIndex()) )
1770*b1cdbd2cSJim Jagielski                 aSortedStart.push_back( pMark );
1771*b1cdbd2cSJim Jagielski 
1772*b1cdbd2cSJim Jagielski             if ( nEnd > nAktPos && nEnd <= ( nAktPos + nLen ) && (pMark->GetMarkEnd().nNode == rNode.GetIndex()) )
1773*b1cdbd2cSJim Jagielski                 aSortedEnd.push_back( pMark );
1774*b1cdbd2cSJim Jagielski         }
1775*b1cdbd2cSJim Jagielski 
1776*b1cdbd2cSJim Jagielski         // Sort the bookmarks by end position
1777*b1cdbd2cSJim Jagielski         std::sort( aSortedEnd.begin(), aSortedEnd.end(), CompareMarksEnd() );
1778*b1cdbd2cSJim Jagielski 
1779*b1cdbd2cSJim Jagielski         m_rSortedMarksStart.swap( aSortedStart );
1780*b1cdbd2cSJim Jagielski         m_rSortedMarksEnd.swap( aSortedEnd );
1781*b1cdbd2cSJim Jagielski     }
1782*b1cdbd2cSJim Jagielski     else
1783*b1cdbd2cSJim Jagielski     {
1784*b1cdbd2cSJim Jagielski         m_rSortedMarksStart.clear( );
1785*b1cdbd2cSJim Jagielski         m_rSortedMarksEnd.clear( );
1786*b1cdbd2cSJim Jagielski     }
1787*b1cdbd2cSJim Jagielski }
1788*b1cdbd2cSJim Jagielski 
OutputTextNode(const SwTxtNode & rNode)1789*b1cdbd2cSJim Jagielski void MSWordExportBase::OutputTextNode( const SwTxtNode& rNode )
1790*b1cdbd2cSJim Jagielski {
1791*b1cdbd2cSJim Jagielski #ifdef DEBUG
1792*b1cdbd2cSJim Jagielski     ::std::clog << "<OutWW8_SwTxtNode>" << ::std::endl;
1793*b1cdbd2cSJim Jagielski #endif
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski     ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo( mpTableInfo->getTableNodeInfo( &rNode ) );
1796*b1cdbd2cSJim Jagielski 
1797*b1cdbd2cSJim Jagielski 	//For i120928,identify the last node
1798*b1cdbd2cSJim Jagielski 	bool bLastCR = false;
1799*b1cdbd2cSJim Jagielski 	bool bExported = false;
1800*b1cdbd2cSJim Jagielski 	{
1801*b1cdbd2cSJim Jagielski 		SwNodeIndex aNextIdx(rNode,1);
1802*b1cdbd2cSJim Jagielski 		SwNodeIndex aLastIdx(rNode.GetNodes().GetEndOfContent());
1803*b1cdbd2cSJim Jagielski 		if (aNextIdx == aLastIdx)
1804*b1cdbd2cSJim Jagielski 			bLastCR = true;
1805*b1cdbd2cSJim Jagielski 	}
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski     AttrOutput().StartParagraph( pTextNodeInfo );
1808*b1cdbd2cSJim Jagielski 
1809*b1cdbd2cSJim Jagielski     bool bFlyInTable = mpParentFrame && IsInTable();
1810*b1cdbd2cSJim Jagielski 
1811*b1cdbd2cSJim Jagielski     if ( !bFlyInTable )
1812*b1cdbd2cSJim Jagielski         nStyleBeforeFly = GetId( lcl_getFormatCollection( *this, &rNode ) );
1813*b1cdbd2cSJim Jagielski 
1814*b1cdbd2cSJim Jagielski     // nStyleBeforeFly may change when we recurse into another node, so we
1815*b1cdbd2cSJim Jagielski     // have to remember it in nStyle
1816*b1cdbd2cSJim Jagielski     sal_uInt16 nStyle = nStyleBeforeFly;
1817*b1cdbd2cSJim Jagielski 
1818*b1cdbd2cSJim Jagielski     WW8SwAttrIter aAttrIter( *this, rNode );
1819*b1cdbd2cSJim Jagielski     rtl_TextEncoding eChrSet = aAttrIter.GetCharSet();
1820*b1cdbd2cSJim Jagielski 
1821*b1cdbd2cSJim Jagielski     if ( bStartTOX )
1822*b1cdbd2cSJim Jagielski     {
1823*b1cdbd2cSJim Jagielski         // ignore TOX header section
1824*b1cdbd2cSJim Jagielski         const SwSectionNode* pSectNd = rNode.FindSectionNode();
1825*b1cdbd2cSJim Jagielski         if ( pSectNd && TOX_CONTENT_SECTION == pSectNd->GetSection().GetType() )
1826*b1cdbd2cSJim Jagielski         {
1827*b1cdbd2cSJim Jagielski             AttrOutput().StartTOX( pSectNd->GetSection() );
1828*b1cdbd2cSJim Jagielski             m_aCurrentCharPropStarts.push( 0 );
1829*b1cdbd2cSJim Jagielski         }
1830*b1cdbd2cSJim Jagielski     }
1831*b1cdbd2cSJim Jagielski 
1832*b1cdbd2cSJim Jagielski     const SwSection* pTOXSect = 0;
1833*b1cdbd2cSJim Jagielski     if( bInWriteTOX )
1834*b1cdbd2cSJim Jagielski     {
1835*b1cdbd2cSJim Jagielski         // check for end of TOX
1836*b1cdbd2cSJim Jagielski         SwNodeIndex aIdx( rNode, 1 );
1837*b1cdbd2cSJim Jagielski         if( !aIdx.GetNode().IsTxtNode() )
1838*b1cdbd2cSJim Jagielski         {
1839*b1cdbd2cSJim Jagielski             const SwSectionNode* pTOXSectNd = rNode.FindSectionNode();
1840*b1cdbd2cSJim Jagielski             pTOXSect = &pTOXSectNd->GetSection();
1841*b1cdbd2cSJim Jagielski 
1842*b1cdbd2cSJim Jagielski             const SwNode* pNxt = rNode.GetNodes().GoNext( &aIdx );
1843*b1cdbd2cSJim Jagielski             if( pNxt && pNxt->FindSectionNode() == pTOXSectNd )
1844*b1cdbd2cSJim Jagielski                 pTOXSect = 0;
1845*b1cdbd2cSJim Jagielski         }
1846*b1cdbd2cSJim Jagielski     }
1847*b1cdbd2cSJim Jagielski 
1848*b1cdbd2cSJim Jagielski     if ( aAttrIter.RequiresImplicitBookmark() )
1849*b1cdbd2cSJim Jagielski     {
1850*b1cdbd2cSJim Jagielski         String sBkmkName = String( RTL_CONSTASCII_STRINGPARAM( "_toc" ) );
1851*b1cdbd2cSJim Jagielski         sBkmkName += String::CreateFromInt32( rNode.GetIndex() );
1852*b1cdbd2cSJim Jagielski         AppendWordBookmark( sBkmkName );
1853*b1cdbd2cSJim Jagielski     }
1854*b1cdbd2cSJim Jagielski 
1855*b1cdbd2cSJim Jagielski     //Would need to move into WW8Export, probably not worth it
1856*b1cdbd2cSJim Jagielski     //ASSERT( pO->Count(), " pO ist am Zeilenanfang nicht leer" );
1857*b1cdbd2cSJim Jagielski 
1858*b1cdbd2cSJim Jagielski     String aStr( rNode.GetTxt() );
1859*b1cdbd2cSJim Jagielski 
1860*b1cdbd2cSJim Jagielski     xub_StrLen nAktPos = 0;
1861*b1cdbd2cSJim Jagielski     xub_StrLen const nEnd = aStr.Len();
1862*b1cdbd2cSJim Jagielski     bool bRedlineAtEnd = false;
1863*b1cdbd2cSJim Jagielski     int nOpenAttrWithRange = 0;
1864*b1cdbd2cSJim Jagielski 
1865*b1cdbd2cSJim Jagielski     ww8::WW8TableNodeInfoInner::Pointer_t pTextNodeInfoInner;
1866*b1cdbd2cSJim Jagielski     if ( pTextNodeInfo.get() != NULL )
1867*b1cdbd2cSJim Jagielski         pTextNodeInfoInner = pTextNodeInfo->getFirstInner();
1868*b1cdbd2cSJim Jagielski 
1869*b1cdbd2cSJim Jagielski     do {
1870*b1cdbd2cSJim Jagielski         const SwRedlineData* pRedlineData = aAttrIter.GetRedline( nAktPos );
1871*b1cdbd2cSJim Jagielski 
1872*b1cdbd2cSJim Jagielski         AttrOutput().StartRun( pRedlineData );
1873*b1cdbd2cSJim Jagielski 
1874*b1cdbd2cSJim Jagielski         xub_StrLen nNextAttr = GetNextPos( &aAttrIter, rNode, nAktPos );
1875*b1cdbd2cSJim Jagielski 
1876*b1cdbd2cSJim Jagielski         if( nNextAttr > nEnd )
1877*b1cdbd2cSJim Jagielski             nNextAttr = nEnd;
1878*b1cdbd2cSJim Jagielski 
1879*b1cdbd2cSJim Jagielski         aAttrIter.OutFlys( nAktPos );
1880*b1cdbd2cSJim Jagielski         //Append bookmarks in this range after flys, exclusive of final
1881*b1cdbd2cSJim Jagielski         //position of this range
1882*b1cdbd2cSJim Jagielski         AppendBookmarks( rNode, nAktPos, nNextAttr - nAktPos );
1883*b1cdbd2cSJim Jagielski         bool bTxtAtr = aAttrIter.IsTxtAttr( nAktPos );
1884*b1cdbd2cSJim Jagielski         nOpenAttrWithRange += aAttrIter.OutAttrWithRange(nAktPos);
1885*b1cdbd2cSJim Jagielski 
1886*b1cdbd2cSJim Jagielski         xub_StrLen nLen = nNextAttr - nAktPos;
1887*b1cdbd2cSJim Jagielski         if ( !bTxtAtr && nLen )
1888*b1cdbd2cSJim Jagielski         {
1889*b1cdbd2cSJim Jagielski             sal_Unicode ch = aStr.GetChar( nAktPos );
1890*b1cdbd2cSJim Jagielski             int ofs = ( ch == CH_TXT_ATR_FIELDSTART || ch == CH_TXT_ATR_FIELDEND || ch == CH_TXT_ATR_FORMELEMENT? 1: 0 );
1891*b1cdbd2cSJim Jagielski 
1892*b1cdbd2cSJim Jagielski             IDocumentMarkAccess* const pMarkAccess = pDoc->getIDocumentMarkAccess();
1893*b1cdbd2cSJim Jagielski             if ( ch == CH_TXT_ATR_FIELDSTART )
1894*b1cdbd2cSJim Jagielski             {
1895*b1cdbd2cSJim Jagielski                 SwPosition aPosition( rNode, SwIndex( const_cast< SwTxtNode* >( &rNode ), nAktPos + 1 ) );
1896*b1cdbd2cSJim Jagielski                 ::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition );
1897*b1cdbd2cSJim Jagielski                 OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??" );
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski                 if ( pFieldmark->GetFieldname().equalsAscii( ODF_FORMTEXT ) )
1900*b1cdbd2cSJim Jagielski                     AppendBookmark( pFieldmark->GetName(), false );
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski                 const bool bCommentRange = pFieldmark != NULL && pFieldmark->GetFieldname().equalsAscii( ODF_COMMENTRANGE );
1903*b1cdbd2cSJim Jagielski                 if ( bCommentRange )
1904*b1cdbd2cSJim Jagielski                 {
1905*b1cdbd2cSJim Jagielski                     AttrOutput().WritePostitFieldStart(); // Note: empty for WW8 export
1906*b1cdbd2cSJim Jagielski                 }
1907*b1cdbd2cSJim Jagielski                 else
1908*b1cdbd2cSJim Jagielski                 {
1909*b1cdbd2cSJim Jagielski                     OutputField( NULL, lcl_getFieldId( pFieldmark ), lcl_getFieldCode( pFieldmark ), WRITEFIELD_START | WRITEFIELD_CMD_START );
1910*b1cdbd2cSJim Jagielski                 }
1911*b1cdbd2cSJim Jagielski 
1912*b1cdbd2cSJim Jagielski                 if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMTEXT ) )
1913*b1cdbd2cSJim Jagielski                     WriteFormData( *pFieldmark );
1914*b1cdbd2cSJim Jagielski                 else if ( pFieldmark->GetFieldname( ).equalsAscii( ODF_HYPERLINK ) )
1915*b1cdbd2cSJim Jagielski                     WriteHyperlinkData( *pFieldmark );
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski                 if ( !bCommentRange )
1918*b1cdbd2cSJim Jagielski                 {
1919*b1cdbd2cSJim Jagielski                     OutputField( NULL, lcl_getFieldId( pFieldmark ), String(), WRITEFIELD_CMD_END );
1920*b1cdbd2cSJim Jagielski                 }
1921*b1cdbd2cSJim Jagielski             }
1922*b1cdbd2cSJim Jagielski             else if ( ch == CH_TXT_ATR_FIELDEND )
1923*b1cdbd2cSJim Jagielski             {
1924*b1cdbd2cSJim Jagielski                 SwPosition aPosition( rNode, SwIndex( const_cast< SwTxtNode* >( &rNode ), nAktPos ) );
1925*b1cdbd2cSJim Jagielski                 ::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition );
1926*b1cdbd2cSJim Jagielski                 OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??" );
1927*b1cdbd2cSJim Jagielski 
1928*b1cdbd2cSJim Jagielski                 if ( pFieldmark && pFieldmark->GetFieldname().equalsAscii( ODF_COMMENTRANGE ) )
1929*b1cdbd2cSJim Jagielski                 {
1930*b1cdbd2cSJim Jagielski                     AttrOutput().WritePostitFieldEnd(); // Note: empty for WW8 export
1931*b1cdbd2cSJim Jagielski                 }
1932*b1cdbd2cSJim Jagielski                 else
1933*b1cdbd2cSJim Jagielski                 {
1934*b1cdbd2cSJim Jagielski                     OutputField( NULL, lcl_getFieldId( pFieldmark ), String(), WRITEFIELD_CLOSE );
1935*b1cdbd2cSJim Jagielski                 }
1936*b1cdbd2cSJim Jagielski 
1937*b1cdbd2cSJim Jagielski                 if ( pFieldmark->GetFieldname().equalsAscii( ODF_FORMTEXT ) )
1938*b1cdbd2cSJim Jagielski                     AppendBookmark( pFieldmark->GetName(), false );
1939*b1cdbd2cSJim Jagielski             }
1940*b1cdbd2cSJim Jagielski             else if ( ch == CH_TXT_ATR_FORMELEMENT )
1941*b1cdbd2cSJim Jagielski             {
1942*b1cdbd2cSJim Jagielski                 SwPosition aPosition( rNode, SwIndex( const_cast< SwTxtNode* >( &rNode ), nAktPos ) );
1943*b1cdbd2cSJim Jagielski                 ::sw::mark::IFieldmark const * const pFieldmark = pMarkAccess->getFieldmarkFor( aPosition );
1944*b1cdbd2cSJim Jagielski                 OSL_ENSURE( pFieldmark, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??" );
1945*b1cdbd2cSJim Jagielski 
1946*b1cdbd2cSJim Jagielski                 bool isDropdownOrCheckbox = pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMDROPDOWN ) ||
1947*b1cdbd2cSJim Jagielski                     pFieldmark->GetFieldname( ).equalsAscii( ODF_FORMCHECKBOX );
1948*b1cdbd2cSJim Jagielski 
1949*b1cdbd2cSJim Jagielski                 if ( isDropdownOrCheckbox )
1950*b1cdbd2cSJim Jagielski                     AppendBookmark( pFieldmark->GetName(), 0 );
1951*b1cdbd2cSJim Jagielski                 OutputField( NULL, lcl_getFieldId( pFieldmark ),
1952*b1cdbd2cSJim Jagielski                         lcl_getFieldCode( pFieldmark ),
1953*b1cdbd2cSJim Jagielski                         WRITEFIELD_START | WRITEFIELD_CMD_START );
1954*b1cdbd2cSJim Jagielski                 if ( isDropdownOrCheckbox )
1955*b1cdbd2cSJim Jagielski                     WriteFormData( *pFieldmark );
1956*b1cdbd2cSJim Jagielski                 OutputField( NULL, lcl_getFieldId( pFieldmark ), String(), WRITEFIELD_CLOSE );
1957*b1cdbd2cSJim Jagielski                 if ( isDropdownOrCheckbox )
1958*b1cdbd2cSJim Jagielski                     AppendBookmark( pFieldmark->GetName(), false );
1959*b1cdbd2cSJim Jagielski             }
1960*b1cdbd2cSJim Jagielski             nLen -= static_cast< sal_uInt16 >( ofs );
1961*b1cdbd2cSJim Jagielski 
1962*b1cdbd2cSJim Jagielski             String aSnippet( aAttrIter.GetSnippet( aStr, nAktPos + static_cast< sal_uInt16 >( ofs ), nLen ) );
1963*b1cdbd2cSJim Jagielski             if ( ( nTxtTyp == TXT_EDN || nTxtTyp == TXT_FTN ) && nAktPos == 0 && nLen > 0 )
1964*b1cdbd2cSJim Jagielski             {
1965*b1cdbd2cSJim Jagielski                 // Insert tab for aesthetic puposes #i24762#
1966*b1cdbd2cSJim Jagielski                 if ( aSnippet.GetChar( 0 ) != 0x09 )
1967*b1cdbd2cSJim Jagielski                     aSnippet.Insert( 0x09, 0 );
1968*b1cdbd2cSJim Jagielski             }
1969*b1cdbd2cSJim Jagielski             AttrOutput().RunText( aSnippet, eChrSet );
1970*b1cdbd2cSJim Jagielski         }
1971*b1cdbd2cSJim Jagielski 
1972*b1cdbd2cSJim Jagielski         if ( aAttrIter.IsDropCap( nNextAttr ) )
1973*b1cdbd2cSJim Jagielski             AttrOutput().FormatDrop( rNode, aAttrIter.GetSwFmtDrop(), nStyle, pTextNodeInfo, pTextNodeInfoInner );
1974*b1cdbd2cSJim Jagielski 
1975*b1cdbd2cSJim Jagielski         if (0 != nEnd)
1976*b1cdbd2cSJim Jagielski         {
1977*b1cdbd2cSJim Jagielski             // Output the character attributes
1978*b1cdbd2cSJim Jagielski             // #i51277# do this before writing flys at end of paragraph
1979*b1cdbd2cSJim Jagielski             AttrOutput().StartRunProperties();
1980*b1cdbd2cSJim Jagielski             aAttrIter.OutAttr( nAktPos );
1981*b1cdbd2cSJim Jagielski             AttrOutput().EndRunProperties( pRedlineData );
1982*b1cdbd2cSJim Jagielski         }
1983*b1cdbd2cSJim Jagielski 
1984*b1cdbd2cSJim Jagielski         // At the end of line, output the attributes until the CR.
1985*b1cdbd2cSJim Jagielski         // Exception: footnotes at the end of line
1986*b1cdbd2cSJim Jagielski         if ( nNextAttr == nEnd )
1987*b1cdbd2cSJim Jagielski         {
1988*b1cdbd2cSJim Jagielski             ASSERT( nOpenAttrWithRange >= 0, "odd to see this happening, expected >= 0" );
1989*b1cdbd2cSJim Jagielski             if ( !bTxtAtr && nOpenAttrWithRange <= 0 )
1990*b1cdbd2cSJim Jagielski             {
1991*b1cdbd2cSJim Jagielski                 if ( aAttrIter.IsRedlineAtEnd( nEnd ) )
1992*b1cdbd2cSJim Jagielski                     bRedlineAtEnd = true;
1993*b1cdbd2cSJim Jagielski                 else
1994*b1cdbd2cSJim Jagielski                 {
1995*b1cdbd2cSJim Jagielski                     // insert final graphic anchors if any before CR
1996*b1cdbd2cSJim Jagielski                     aAttrIter.OutFlys( nEnd );
1997*b1cdbd2cSJim Jagielski                     // insert final bookmarks if any before CR and after flys
1998*b1cdbd2cSJim Jagielski                     AppendBookmarks( rNode, nEnd, 1 );
1999*b1cdbd2cSJim Jagielski                     if ( pTOXSect )
2000*b1cdbd2cSJim Jagielski                     {
2001*b1cdbd2cSJim Jagielski                         m_aCurrentCharPropStarts.pop();
2002*b1cdbd2cSJim Jagielski                         AttrOutput().EndTOX( *pTOXSect ,false);
2003*b1cdbd2cSJim Jagielski                     }
2004*b1cdbd2cSJim Jagielski 			//For i120928,the position of the bullet's graphic is at end of doc
2005*b1cdbd2cSJim Jagielski 			if (bLastCR && (!bExported))
2006*b1cdbd2cSJim Jagielski 			{
2007*b1cdbd2cSJim Jagielski 				ExportGrfBullet(rNode);
2008*b1cdbd2cSJim Jagielski 				bExported = true;
2009*b1cdbd2cSJim Jagielski 			}
2010*b1cdbd2cSJim Jagielski 
2011*b1cdbd2cSJim Jagielski                     WriteCR( pTextNodeInfoInner );
2012*b1cdbd2cSJim Jagielski                 }
2013*b1cdbd2cSJim Jagielski             }
2014*b1cdbd2cSJim Jagielski         }
2015*b1cdbd2cSJim Jagielski 
2016*b1cdbd2cSJim Jagielski         if (0 == nEnd)
2017*b1cdbd2cSJim Jagielski         {
2018*b1cdbd2cSJim Jagielski             // Output the character attributes
2019*b1cdbd2cSJim Jagielski             // do it after WriteCR for an empty paragraph (otherwise
2020*b1cdbd2cSJim Jagielski             // WW8_WrFkp::Append throws SPRMs away...)
2021*b1cdbd2cSJim Jagielski             AttrOutput().StartRunProperties();
2022*b1cdbd2cSJim Jagielski             aAttrIter.OutAttr( nAktPos );
2023*b1cdbd2cSJim Jagielski             AttrOutput().EndRunProperties( pRedlineData );
2024*b1cdbd2cSJim Jagielski         }
2025*b1cdbd2cSJim Jagielski 
2026*b1cdbd2cSJim Jagielski         // Exception: footnotes at the end of line
2027*b1cdbd2cSJim Jagielski         if ( nNextAttr == nEnd )
2028*b1cdbd2cSJim Jagielski         {
2029*b1cdbd2cSJim Jagielski             ASSERT(nOpenAttrWithRange >= 0,
2030*b1cdbd2cSJim Jagielski                 "odd to see this happening, expected >= 0");
2031*b1cdbd2cSJim Jagielski             bool bAttrWithRange = (nOpenAttrWithRange > 0);
2032*b1cdbd2cSJim Jagielski             if ( nAktPos != nEnd )
2033*b1cdbd2cSJim Jagielski             {
2034*b1cdbd2cSJim Jagielski                 nOpenAttrWithRange += aAttrIter.OutAttrWithRange(nEnd);
2035*b1cdbd2cSJim Jagielski                 ASSERT(nOpenAttrWithRange == 0,
2036*b1cdbd2cSJim Jagielski                     "odd to see this happening, expected 0");
2037*b1cdbd2cSJim Jagielski             }
2038*b1cdbd2cSJim Jagielski 
2039*b1cdbd2cSJim Jagielski             AttrOutput().OutputFKP();
2040*b1cdbd2cSJim Jagielski 
2041*b1cdbd2cSJim Jagielski             if ( bTxtAtr || bAttrWithRange || bRedlineAtEnd )
2042*b1cdbd2cSJim Jagielski             {
2043*b1cdbd2cSJim Jagielski                 // insert final graphic anchors if any before CR
2044*b1cdbd2cSJim Jagielski                 aAttrIter.OutFlys( nEnd );
2045*b1cdbd2cSJim Jagielski                 // insert final bookmarks if any before CR and after flys
2046*b1cdbd2cSJim Jagielski                 AppendBookmarks( rNode, nEnd, 1 );
2047*b1cdbd2cSJim Jagielski                 WriteCR( pTextNodeInfoInner );
2048*b1cdbd2cSJim Jagielski               //For i120928,the position of the bullet's graphic is at end of doc
2049*b1cdbd2cSJim Jagielski 		if (bLastCR && (!bExported))
2050*b1cdbd2cSJim Jagielski 		{
2051*b1cdbd2cSJim Jagielski 			ExportGrfBullet(rNode);
2052*b1cdbd2cSJim Jagielski 			bExported = true;
2053*b1cdbd2cSJim Jagielski 		}
2054*b1cdbd2cSJim Jagielski 
2055*b1cdbd2cSJim Jagielski                 if ( pTOXSect )
2056*b1cdbd2cSJim Jagielski                 {
2057*b1cdbd2cSJim Jagielski                     m_aCurrentCharPropStarts.pop();
2058*b1cdbd2cSJim Jagielski                     AttrOutput().EndTOX( *pTOXSect );
2059*b1cdbd2cSJim Jagielski                 }
2060*b1cdbd2cSJim Jagielski 
2061*b1cdbd2cSJim Jagielski                 if ( bRedlineAtEnd )
2062*b1cdbd2cSJim Jagielski                 {
2063*b1cdbd2cSJim Jagielski                     AttrOutput().Redline( aAttrIter.GetRedline( nEnd ) );
2064*b1cdbd2cSJim Jagielski                     AttrOutput().OutputFKP();
2065*b1cdbd2cSJim Jagielski                 }
2066*b1cdbd2cSJim Jagielski             }
2067*b1cdbd2cSJim Jagielski         }
2068*b1cdbd2cSJim Jagielski 
2069*b1cdbd2cSJim Jagielski         AttrOutput().EndRun();
2070*b1cdbd2cSJim Jagielski 
2071*b1cdbd2cSJim Jagielski         nAktPos = nNextAttr;
2072*b1cdbd2cSJim Jagielski         UpdatePosition( &aAttrIter, nAktPos, nEnd );
2073*b1cdbd2cSJim Jagielski         eChrSet = aAttrIter.GetCharSet();
2074*b1cdbd2cSJim Jagielski     }
2075*b1cdbd2cSJim Jagielski     while ( nAktPos < nEnd );
2076*b1cdbd2cSJim Jagielski 
2077*b1cdbd2cSJim Jagielski     AttrOutput().StartParagraphProperties( rNode );
2078*b1cdbd2cSJim Jagielski 
2079*b1cdbd2cSJim Jagielski     AttrOutput().ParagraphStyle( nStyle );
2080*b1cdbd2cSJim Jagielski 
2081*b1cdbd2cSJim Jagielski     if ( mpParentFrame && IsInTable() )    // Fly-Attrs
2082*b1cdbd2cSJim Jagielski         OutputFormat( mpParentFrame->GetFrmFmt(), false, false, true );
2083*b1cdbd2cSJim Jagielski 
2084*b1cdbd2cSJim Jagielski     if ( pTextNodeInfo.get() != NULL )
2085*b1cdbd2cSJim Jagielski     {
2086*b1cdbd2cSJim Jagielski #ifdef DEBUG
2087*b1cdbd2cSJim Jagielski         ::std::clog << pTextNodeInfo->toString() << ::std::endl;
2088*b1cdbd2cSJim Jagielski #endif
2089*b1cdbd2cSJim Jagielski 
2090*b1cdbd2cSJim Jagielski         AttrOutput().TableInfoCell( pTextNodeInfoInner );
2091*b1cdbd2cSJim Jagielski         if (pTextNodeInfoInner->isFirstInTable())
2092*b1cdbd2cSJim Jagielski         {
2093*b1cdbd2cSJim Jagielski             const SwTable * pTable = pTextNodeInfoInner->getTable();
2094*b1cdbd2cSJim Jagielski 
2095*b1cdbd2cSJim Jagielski             const SwTableFmt * pTabFmt = pTable->GetTableFmt();
2096*b1cdbd2cSJim Jagielski             if (pTabFmt != NULL)
2097*b1cdbd2cSJim Jagielski             {
2098*b1cdbd2cSJim Jagielski                 if (pTabFmt->GetBreak().GetBreak() == SVX_BREAK_PAGE_BEFORE)
2099*b1cdbd2cSJim Jagielski                     AttrOutput().PageBreakBefore(true);
2100*b1cdbd2cSJim Jagielski             }
2101*b1cdbd2cSJim Jagielski         }
2102*b1cdbd2cSJim Jagielski     }
2103*b1cdbd2cSJim Jagielski 
2104*b1cdbd2cSJim Jagielski     if ( !bFlyInTable )
2105*b1cdbd2cSJim Jagielski     {
2106*b1cdbd2cSJim Jagielski         SfxItemSet* pTmpSet = 0;
2107*b1cdbd2cSJim Jagielski         const sal_uInt8 nPrvNxtNd = rNode.HasPrevNextLayNode();
2108*b1cdbd2cSJim Jagielski 
2109*b1cdbd2cSJim Jagielski         if( (ND_HAS_PREV_LAYNODE|ND_HAS_NEXT_LAYNODE ) != nPrvNxtNd )
2110*b1cdbd2cSJim Jagielski         {
2111*b1cdbd2cSJim Jagielski             const SfxPoolItem* pItem;
2112*b1cdbd2cSJim Jagielski             if( SFX_ITEM_SET == rNode.GetSwAttrSet().GetItemState(
2113*b1cdbd2cSJim Jagielski                     RES_UL_SPACE, true, &pItem ) &&
2114*b1cdbd2cSJim Jagielski                 ( ( !( ND_HAS_PREV_LAYNODE & nPrvNxtNd ) &&
2115*b1cdbd2cSJim Jagielski                    ((SvxULSpaceItem*)pItem)->GetUpper()) ||
2116*b1cdbd2cSJim Jagielski                   ( !( ND_HAS_NEXT_LAYNODE & nPrvNxtNd ) &&
2117*b1cdbd2cSJim Jagielski                    ((SvxULSpaceItem*)pItem)->GetLower()) ))
2118*b1cdbd2cSJim Jagielski             {
2119*b1cdbd2cSJim Jagielski                 pTmpSet = new SfxItemSet( rNode.GetSwAttrSet() );
2120*b1cdbd2cSJim Jagielski                 SvxULSpaceItem aUL( *(SvxULSpaceItem*)pItem );
2121*b1cdbd2cSJim Jagielski                 // OD, MMAHER 2004-03-01 #i25901#- consider compatibility option
2122*b1cdbd2cSJim Jagielski                 if (!pDoc->get(IDocumentSettingAccess::PARA_SPACE_MAX_AT_PAGES))
2123*b1cdbd2cSJim Jagielski                 {
2124*b1cdbd2cSJim Jagielski                     if( !(ND_HAS_PREV_LAYNODE & nPrvNxtNd ))
2125*b1cdbd2cSJim Jagielski                         aUL.SetUpper( 0 );
2126*b1cdbd2cSJim Jagielski                 }
2127*b1cdbd2cSJim Jagielski                 // OD, MMAHER 2004-03-01 #i25901# - consider compatibility option
2128*b1cdbd2cSJim Jagielski                 if (!pDoc->get(IDocumentSettingAccess::ADD_PARA_SPACING_TO_TABLE_CELLS))
2129*b1cdbd2cSJim Jagielski                 {
2130*b1cdbd2cSJim Jagielski                     if( !(ND_HAS_NEXT_LAYNODE & nPrvNxtNd ))
2131*b1cdbd2cSJim Jagielski                         aUL.SetLower( 0 );
2132*b1cdbd2cSJim Jagielski                 }
2133*b1cdbd2cSJim Jagielski                 pTmpSet->Put( aUL );
2134*b1cdbd2cSJim Jagielski             }
2135*b1cdbd2cSJim Jagielski         }
2136*b1cdbd2cSJim Jagielski 
2137*b1cdbd2cSJim Jagielski         sal_Bool bParaRTL = sal_False;
2138*b1cdbd2cSJim Jagielski         const SvxFrameDirectionItem* pItem = (const SvxFrameDirectionItem*)
2139*b1cdbd2cSJim Jagielski             rNode.GetSwAttrSet().GetItem(RES_FRAMEDIR);
2140*b1cdbd2cSJim Jagielski         if ( aAttrIter.IsParaRTL())
2141*b1cdbd2cSJim Jagielski             bParaRTL = sal_True;
2142*b1cdbd2cSJim Jagielski 
2143*b1cdbd2cSJim Jagielski         if( rNode.IsNumbered())
2144*b1cdbd2cSJim Jagielski         {
2145*b1cdbd2cSJim Jagielski             const SwNumRule* pRule = rNode.GetNumRule();
2146*b1cdbd2cSJim Jagielski             sal_uInt8 nLvl = static_cast< sal_uInt8 >( rNode.GetActualListLevel() );
2147*b1cdbd2cSJim Jagielski             const SwNumFmt* pFmt = pRule->GetNumFmt( nLvl );
2148*b1cdbd2cSJim Jagielski             if( !pFmt )
2149*b1cdbd2cSJim Jagielski                 pFmt = &pRule->Get( nLvl );
2150*b1cdbd2cSJim Jagielski 
2151*b1cdbd2cSJim Jagielski             if( !pTmpSet )
2152*b1cdbd2cSJim Jagielski                 pTmpSet = new SfxItemSet( rNode.GetSwAttrSet() );
2153*b1cdbd2cSJim Jagielski 
2154*b1cdbd2cSJim Jagielski             SvxLRSpaceItem aLR(ItemGet<SvxLRSpaceItem>(*pTmpSet, RES_LR_SPACE));
2155*b1cdbd2cSJim Jagielski             // --> OD 2008-06-03 #i86652#
2156*b1cdbd2cSJim Jagielski             if ( pFmt->GetPositionAndSpaceMode() ==
2157*b1cdbd2cSJim Jagielski                                     SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2158*b1cdbd2cSJim Jagielski             {
2159*b1cdbd2cSJim Jagielski                 aLR.SetTxtLeft( aLR.GetTxtLeft() + pFmt->GetAbsLSpace() );
2160*b1cdbd2cSJim Jagielski             }
2161*b1cdbd2cSJim Jagielski             // <--
2162*b1cdbd2cSJim Jagielski 
2163*b1cdbd2cSJim Jagielski             if( rNode.IsNumbered() && rNode.IsCountedInList() )
2164*b1cdbd2cSJim Jagielski             {
2165*b1cdbd2cSJim Jagielski                 // --> OD 2008-06-03 #i86652#
2166*b1cdbd2cSJim Jagielski                 if ( pFmt->GetPositionAndSpaceMode() ==
2167*b1cdbd2cSJim Jagielski                                         SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2168*b1cdbd2cSJim Jagielski                 {
2169*b1cdbd2cSJim Jagielski                     if (bParaRTL)
2170*b1cdbd2cSJim Jagielski                         aLR.SetTxtFirstLineOfstValue(pFmt->GetAbsLSpace() - pFmt->GetFirstLineOffset());
2171*b1cdbd2cSJim Jagielski                     else
2172*b1cdbd2cSJim Jagielski                         aLR.SetTxtFirstLineOfst(GetWordFirstLineOffset(*pFmt));
2173*b1cdbd2cSJim Jagielski                 }
2174*b1cdbd2cSJim Jagielski                 // <--
2175*b1cdbd2cSJim Jagielski 
2176*b1cdbd2cSJim Jagielski                 // --> OD 2009-03-09 #100020#
2177*b1cdbd2cSJim Jagielski                 // correct fix for issue i94187
2178*b1cdbd2cSJim Jagielski                 if (SFX_ITEM_SET !=
2179*b1cdbd2cSJim Jagielski                     pTmpSet->GetItemState(RES_PARATR_NUMRULE, false) )
2180*b1cdbd2cSJim Jagielski                 {
2181*b1cdbd2cSJim Jagielski                     // List style set via paragraph style - then put it into the itemset.
2182*b1cdbd2cSJim Jagielski                     // This is needed to get list level and list id exported for
2183*b1cdbd2cSJim Jagielski                     // the paragraph.
2184*b1cdbd2cSJim Jagielski                     pTmpSet->Put( SwNumRuleItem( pRule->GetName() ));
2185*b1cdbd2cSJim Jagielski 
2186*b1cdbd2cSJim Jagielski                     // Put indent values into the itemset in case that the list
2187*b1cdbd2cSJim Jagielski                     // style is applied via paragraph style and the list level
2188*b1cdbd2cSJim Jagielski                     // indent values are not applicable.
2189*b1cdbd2cSJim Jagielski                     if ( pFmt->GetPositionAndSpaceMode() ==
2190*b1cdbd2cSJim Jagielski                                             SvxNumberFormat::LABEL_ALIGNMENT &&
2191*b1cdbd2cSJim Jagielski                          !rNode.AreListLevelIndentsApplicable() )
2192*b1cdbd2cSJim Jagielski                     {
2193*b1cdbd2cSJim Jagielski                         pTmpSet->Put( aLR );
2194*b1cdbd2cSJim Jagielski                     }
2195*b1cdbd2cSJim Jagielski                 }
2196*b1cdbd2cSJim Jagielski             }
2197*b1cdbd2cSJim Jagielski             else
2198*b1cdbd2cSJim Jagielski                 pTmpSet->ClearItem(RES_PARATR_NUMRULE);
2199*b1cdbd2cSJim Jagielski 
2200*b1cdbd2cSJim Jagielski             // --> OD 2008-06-03 #i86652#
2201*b1cdbd2cSJim Jagielski             if ( pFmt->GetPositionAndSpaceMode() ==
2202*b1cdbd2cSJim Jagielski                                     SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2203*b1cdbd2cSJim Jagielski             {
2204*b1cdbd2cSJim Jagielski                 pTmpSet->Put(aLR);
2205*b1cdbd2cSJim Jagielski 
2206*b1cdbd2cSJim Jagielski                 //#i21847#
2207*b1cdbd2cSJim Jagielski                 SvxTabStopItem aItem(
2208*b1cdbd2cSJim Jagielski                     ItemGet<SvxTabStopItem>(*pTmpSet, RES_PARATR_TABSTOP));
2209*b1cdbd2cSJim Jagielski                 SvxTabStop aTabStop(pFmt->GetAbsLSpace());
2210*b1cdbd2cSJim Jagielski                 aItem.Insert(aTabStop);
2211*b1cdbd2cSJim Jagielski                 pTmpSet->Put(aItem);
2212*b1cdbd2cSJim Jagielski 
2213*b1cdbd2cSJim Jagielski                 MSWordExportBase::CorrectTabStopInSet(*pTmpSet, pFmt->GetAbsLSpace());
2214*b1cdbd2cSJim Jagielski             }
2215*b1cdbd2cSJim Jagielski         }
2216*b1cdbd2cSJim Jagielski 
2217*b1cdbd2cSJim Jagielski         /*
2218*b1cdbd2cSJim Jagielski         If a given para is using the FRMDIR_ENVIRONMENT direction we
2219*b1cdbd2cSJim Jagielski         cannot export that, its its ltr then that's ok as thats word's
2220*b1cdbd2cSJim Jagielski         default. Otherwise we must add a RTL attribute to our export list
2221*b1cdbd2cSJim Jagielski         */
2222*b1cdbd2cSJim Jagielski         pItem = (const SvxFrameDirectionItem*)
2223*b1cdbd2cSJim Jagielski             rNode.GetSwAttrSet().GetItem(RES_FRAMEDIR);
2224*b1cdbd2cSJim Jagielski         if (
2225*b1cdbd2cSJim Jagielski             (!pItem || pItem->GetValue() == FRMDIR_ENVIRONMENT) &&
2226*b1cdbd2cSJim Jagielski             aAttrIter.IsParaRTL()
2227*b1cdbd2cSJim Jagielski            )
2228*b1cdbd2cSJim Jagielski         {
2229*b1cdbd2cSJim Jagielski             if ( !pTmpSet )
2230*b1cdbd2cSJim Jagielski                 pTmpSet = new SfxItemSet(rNode.GetSwAttrSet());
2231*b1cdbd2cSJim Jagielski 
2232*b1cdbd2cSJim Jagielski             pTmpSet->Put(SvxFrameDirectionItem(FRMDIR_HORI_RIGHT_TOP, RES_FRAMEDIR));
2233*b1cdbd2cSJim Jagielski         }
2234*b1cdbd2cSJim Jagielski         // --> OD 2005-10-18 #126238# - move code for handling of numbered,
2235*b1cdbd2cSJim Jagielski         // but not counted paragraphs to this place. Otherwise, the paragraph
2236*b1cdbd2cSJim Jagielski         // isn't exported as numbered, but not counted, if no other attribute
2237*b1cdbd2cSJim Jagielski         // is found in <pTmpSet>
2238*b1cdbd2cSJim Jagielski         // #i44815# adjust numbering/indents for numbered paragraphs
2239*b1cdbd2cSJim Jagielski         //          without number (NO_NUMLEVEL)
2240*b1cdbd2cSJim Jagielski         // #i47013# need to check rNode.GetNumRule()!=NULL as well.
2241*b1cdbd2cSJim Jagielski         if ( ! rNode.IsCountedInList() && rNode.GetNumRule()!=NULL )
2242*b1cdbd2cSJim Jagielski         {
2243*b1cdbd2cSJim Jagielski             // WW8 does not know numbered paragraphs without number
2244*b1cdbd2cSJim Jagielski             // (NO_NUMLEVEL). In WW8AttributeOutput::ParaNumRule(), we will export
2245*b1cdbd2cSJim Jagielski             // the RES_PARATR_NUMRULE as list-id 0, which in WW8 means
2246*b1cdbd2cSJim Jagielski             // no numbering. Here, we will adjust the indents to match
2247*b1cdbd2cSJim Jagielski             // visually.
2248*b1cdbd2cSJim Jagielski 
2249*b1cdbd2cSJim Jagielski             if ( !pTmpSet )
2250*b1cdbd2cSJim Jagielski                 pTmpSet = new SfxItemSet(rNode.GetSwAttrSet());
2251*b1cdbd2cSJim Jagielski 
2252*b1cdbd2cSJim Jagielski             // create new LRSpace item, based on the current (if present)
2253*b1cdbd2cSJim Jagielski             const SfxPoolItem* pPoolItem = NULL;
2254*b1cdbd2cSJim Jagielski             pTmpSet->GetItemState(RES_LR_SPACE, sal_True, &pPoolItem);
2255*b1cdbd2cSJim Jagielski             SvxLRSpaceItem aLRSpace(
2256*b1cdbd2cSJim Jagielski                 ( pPoolItem == NULL )
2257*b1cdbd2cSJim Jagielski                     ? SvxLRSpaceItem(0, 0, 0, 0, RES_LR_SPACE)
2258*b1cdbd2cSJim Jagielski                     : *static_cast<const SvxLRSpaceItem*>( pPoolItem ) );
2259*b1cdbd2cSJim Jagielski 
2260*b1cdbd2cSJim Jagielski             // new left margin = old left + label space
2261*b1cdbd2cSJim Jagielski             const SwNumRule* pRule = rNode.GetNumRule();
2262*b1cdbd2cSJim Jagielski             const SwNumFmt& rNumFmt = pRule->Get( static_cast< sal_uInt16 >(rNode.GetActualListLevel()) );
2263*b1cdbd2cSJim Jagielski             // --> OD 2008-06-03 #i86652#
2264*b1cdbd2cSJim Jagielski             if ( rNumFmt.GetPositionAndSpaceMode() ==
2265*b1cdbd2cSJim Jagielski                                     SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2266*b1cdbd2cSJim Jagielski             {
2267*b1cdbd2cSJim Jagielski                 aLRSpace.SetTxtLeft( aLRSpace.GetLeft() + rNumFmt.GetAbsLSpace() );
2268*b1cdbd2cSJim Jagielski 
2269*b1cdbd2cSJim Jagielski                 // new first line indent = 0
2270*b1cdbd2cSJim Jagielski                 // (first line indent is ignored for NO_NUMLEVEL)
2271*b1cdbd2cSJim Jagielski                 if (!bParaRTL)
2272*b1cdbd2cSJim Jagielski                     aLRSpace.SetTxtFirstLineOfst( 0 );
2273*b1cdbd2cSJim Jagielski 
2274*b1cdbd2cSJim Jagielski                 // put back the new item
2275*b1cdbd2cSJim Jagielski                 pTmpSet->Put( aLRSpace );
2276*b1cdbd2cSJim Jagielski             }
2277*b1cdbd2cSJim Jagielski             // <--
2278*b1cdbd2cSJim Jagielski 
2279*b1cdbd2cSJim Jagielski             // assure that numbering rule is in <pTmpSet>
2280*b1cdbd2cSJim Jagielski             if (SFX_ITEM_SET != pTmpSet->GetItemState(RES_PARATR_NUMRULE, false) )
2281*b1cdbd2cSJim Jagielski             {
2282*b1cdbd2cSJim Jagielski                 pTmpSet->Put( SwNumRuleItem( pRule->GetName() ));
2283*b1cdbd2cSJim Jagielski             }
2284*b1cdbd2cSJim Jagielski         }
2285*b1cdbd2cSJim Jagielski 
2286*b1cdbd2cSJim Jagielski         // --> OD 2007-04-24 #i75457#
2287*b1cdbd2cSJim Jagielski         // Export page break after attribute from paragraph style.
2288*b1cdbd2cSJim Jagielski         // If page break attribute at the text node exist, an existing page
2289*b1cdbd2cSJim Jagielski         // break after at the paragraph style hasn't got to be considered.
2290*b1cdbd2cSJim Jagielski         if ( !rNode.GetpSwAttrSet() ||
2291*b1cdbd2cSJim Jagielski              SFX_ITEM_SET != rNode.GetpSwAttrSet()->GetItemState(RES_BREAK, false) )
2292*b1cdbd2cSJim Jagielski         {
2293*b1cdbd2cSJim Jagielski             const SvxFmtBreakItem* pBreakAtParaStyle =
2294*b1cdbd2cSJim Jagielski                 &(ItemGet<SvxFmtBreakItem>(rNode.GetSwAttrSet(), RES_BREAK));
2295*b1cdbd2cSJim Jagielski             if ( pBreakAtParaStyle &&
2296*b1cdbd2cSJim Jagielski                  pBreakAtParaStyle->GetBreak() == SVX_BREAK_PAGE_AFTER )
2297*b1cdbd2cSJim Jagielski             {
2298*b1cdbd2cSJim Jagielski                 if ( !pTmpSet )
2299*b1cdbd2cSJim Jagielski                 {
2300*b1cdbd2cSJim Jagielski                     pTmpSet = new SfxItemSet(rNode.GetSwAttrSet());
2301*b1cdbd2cSJim Jagielski                 }
2302*b1cdbd2cSJim Jagielski                 pTmpSet->Put( *pBreakAtParaStyle );
2303*b1cdbd2cSJim Jagielski             }
2304*b1cdbd2cSJim Jagielski             else if( pTmpSet )
2305*b1cdbd2cSJim Jagielski             {   // Even a pagedesc item is set, the break item can be set 'NONE',
2306*b1cdbd2cSJim Jagielski                 // this has to be overruled.
2307*b1cdbd2cSJim Jagielski                 const SwFmtPageDesc& rPageDescAtParaStyle =
2308*b1cdbd2cSJim Jagielski                     ItemGet<SwFmtPageDesc>( rNode, RES_PAGEDESC );
2309*b1cdbd2cSJim Jagielski                 if( rPageDescAtParaStyle.KnowsPageDesc() )
2310*b1cdbd2cSJim Jagielski                     pTmpSet->ClearItem( RES_BREAK );
2311*b1cdbd2cSJim Jagielski             }
2312*b1cdbd2cSJim Jagielski         }
2313*b1cdbd2cSJim Jagielski 
2314*b1cdbd2cSJim Jagielski         // --> FME 2007-05-30 #i76520# Emulate non-splitting tables
2315*b1cdbd2cSJim Jagielski         if ( bOutTable )
2316*b1cdbd2cSJim Jagielski         {
2317*b1cdbd2cSJim Jagielski             const SwTableNode* pTableNode = rNode.FindTableNode();
2318*b1cdbd2cSJim Jagielski 
2319*b1cdbd2cSJim Jagielski             if ( pTableNode )
2320*b1cdbd2cSJim Jagielski             {
2321*b1cdbd2cSJim Jagielski                 const SwTable& rTable = pTableNode->GetTable();
2322*b1cdbd2cSJim Jagielski                 const SvxFmtKeepItem& rKeep = rTable.GetFrmFmt()->GetKeep();
2323*b1cdbd2cSJim Jagielski                 const bool bKeep = rKeep.GetValue();
2324*b1cdbd2cSJim Jagielski                 const bool bDontSplit = !bKeep ?
2325*b1cdbd2cSJim Jagielski                                         !rTable.GetFrmFmt()->GetLayoutSplit().GetValue() :
2326*b1cdbd2cSJim Jagielski                                         false;
2327*b1cdbd2cSJim Jagielski 
2328*b1cdbd2cSJim Jagielski                 if ( bKeep || bDontSplit )
2329*b1cdbd2cSJim Jagielski                 {
2330*b1cdbd2cSJim Jagielski                     // bKeep: set keep at first paragraphs in all lines
2331*b1cdbd2cSJim Jagielski                     // bDontSplit : set keep at first paragraphs in all lines except from last line
2332*b1cdbd2cSJim Jagielski                     // but only for non-complex tables
2333*b1cdbd2cSJim Jagielski                     const SwTableBox* pBox = rNode.GetTblBox();
2334*b1cdbd2cSJim Jagielski                     const SwTableLine* pLine = pBox ? pBox->GetUpper() : 0;
2335*b1cdbd2cSJim Jagielski 
2336*b1cdbd2cSJim Jagielski                     if ( pLine && !pLine->GetUpper() )
2337*b1cdbd2cSJim Jagielski                     {
2338*b1cdbd2cSJim Jagielski                         // check if box is first in that line:
2339*b1cdbd2cSJim Jagielski                         if ( 0 == pLine->GetTabBoxes().GetPos( pBox ) && pBox->GetSttNd() )
2340*b1cdbd2cSJim Jagielski                         {
2341*b1cdbd2cSJim Jagielski                             // check if paragraph is first in that line:
2342*b1cdbd2cSJim Jagielski                             if ( 1 == ( rNode.GetIndex() - pBox->GetSttNd()->GetIndex() ) )
2343*b1cdbd2cSJim Jagielski                             {
2344*b1cdbd2cSJim Jagielski                                 bool bSetAtPara = false;
2345*b1cdbd2cSJim Jagielski                                 if ( bKeep )
2346*b1cdbd2cSJim Jagielski                                     bSetAtPara = true;
2347*b1cdbd2cSJim Jagielski                                 else if ( bDontSplit )
2348*b1cdbd2cSJim Jagielski                                 {
2349*b1cdbd2cSJim Jagielski                                     // check if pLine isn't last line in table
2350*b1cdbd2cSJim Jagielski                                     if ( rTable.GetTabLines().Count() - rTable.GetTabLines().GetPos( pLine ) != 1 )
2351*b1cdbd2cSJim Jagielski                                         bSetAtPara = true;
2352*b1cdbd2cSJim Jagielski                                 }
2353*b1cdbd2cSJim Jagielski 
2354*b1cdbd2cSJim Jagielski                                 if ( bSetAtPara )
2355*b1cdbd2cSJim Jagielski                                 {
2356*b1cdbd2cSJim Jagielski                                     if ( !pTmpSet )
2357*b1cdbd2cSJim Jagielski                                         pTmpSet = new SfxItemSet(rNode.GetSwAttrSet());
2358*b1cdbd2cSJim Jagielski 
2359*b1cdbd2cSJim Jagielski                                     const SvxFmtKeepItem aKeepItem( sal_True, RES_KEEP );
2360*b1cdbd2cSJim Jagielski                                     pTmpSet->Put( aKeepItem );
2361*b1cdbd2cSJim Jagielski                                 }
2362*b1cdbd2cSJim Jagielski                             }
2363*b1cdbd2cSJim Jagielski                         }
2364*b1cdbd2cSJim Jagielski                     }
2365*b1cdbd2cSJim Jagielski                 }
2366*b1cdbd2cSJim Jagielski             }
2367*b1cdbd2cSJim Jagielski         }
2368*b1cdbd2cSJim Jagielski         // <--
2369*b1cdbd2cSJim Jagielski 
2370*b1cdbd2cSJim Jagielski         const SfxItemSet* pNewSet = pTmpSet ? pTmpSet : rNode.GetpSwAttrSet();
2371*b1cdbd2cSJim Jagielski         if( pNewSet )
2372*b1cdbd2cSJim Jagielski         {                                               // Para-Attrs
2373*b1cdbd2cSJim Jagielski             pStyAttr = &rNode.GetAnyFmtColl().GetAttrSet();
2374*b1cdbd2cSJim Jagielski 
2375*b1cdbd2cSJim Jagielski             const SwModify* pOldMod = pOutFmtNode;
2376*b1cdbd2cSJim Jagielski             pOutFmtNode = &rNode;
2377*b1cdbd2cSJim Jagielski 
2378*b1cdbd2cSJim Jagielski             // Pap-Attrs, so script is not necessary
2379*b1cdbd2cSJim Jagielski             OutputItemSet( *pNewSet, true, false, i18n::ScriptType::LATIN, false);
2380*b1cdbd2cSJim Jagielski 
2381*b1cdbd2cSJim Jagielski             pStyAttr = 0;
2382*b1cdbd2cSJim Jagielski             pOutFmtNode = pOldMod;
2383*b1cdbd2cSJim Jagielski 
2384*b1cdbd2cSJim Jagielski             if( pNewSet != rNode.GetpSwAttrSet() )
2385*b1cdbd2cSJim Jagielski                 delete pNewSet;
2386*b1cdbd2cSJim Jagielski         }
2387*b1cdbd2cSJim Jagielski     }
2388*b1cdbd2cSJim Jagielski 
2389*b1cdbd2cSJim Jagielski     AttrOutput().EndParagraphProperties();
2390*b1cdbd2cSJim Jagielski 
2391*b1cdbd2cSJim Jagielski     AttrOutput().EndParagraph( pTextNodeInfoInner );
2392*b1cdbd2cSJim Jagielski 
2393*b1cdbd2cSJim Jagielski #ifdef DEBUG
2394*b1cdbd2cSJim Jagielski     ::std::clog << "</OutWW8_SwTxtNode>" << ::std::endl;
2395*b1cdbd2cSJim Jagielski #endif
2396*b1cdbd2cSJim Jagielski }
2397*b1cdbd2cSJim Jagielski 
TableNodeInfo(ww8::WW8TableNodeInfo::Pointer_t pNodeInfo)2398*b1cdbd2cSJim Jagielski void WW8AttributeOutput::TableNodeInfo( ww8::WW8TableNodeInfo::Pointer_t pNodeInfo )
2399*b1cdbd2cSJim Jagielski {
2400*b1cdbd2cSJim Jagielski     SVBT16 nSty;
2401*b1cdbd2cSJim Jagielski     ShortToSVBT16( GetExport().nStyleBeforeFly, nSty );
2402*b1cdbd2cSJim Jagielski 
2403*b1cdbd2cSJim Jagielski     ww8::WW8TableNodeInfo::Inners_t::const_iterator aIt( pNodeInfo->getInners().begin() );
2404*b1cdbd2cSJim Jagielski     ww8::WW8TableNodeInfo::Inners_t::const_iterator aItEnd( pNodeInfo->getInners().end() );
2405*b1cdbd2cSJim Jagielski 
2406*b1cdbd2cSJim Jagielski     while (aIt != aItEnd)
2407*b1cdbd2cSJim Jagielski     {
2408*b1cdbd2cSJim Jagielski         ww8::WW8TableNodeInfoInner::Pointer_t pInner = aIt->second;
2409*b1cdbd2cSJim Jagielski         if ( pInner->isEndOfCell() )
2410*b1cdbd2cSJim Jagielski         {
2411*b1cdbd2cSJim Jagielski             TableRowEnd( pInner->getDepth() );
2412*b1cdbd2cSJim Jagielski 
2413*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( (sal_uInt8*)&nSty, 2, m_rWW8Export.pO->Count() );     // Style #
2414*b1cdbd2cSJim Jagielski             TableInfoRow( pInner );
2415*b1cdbd2cSJim Jagielski             m_rWW8Export.pPapPlc->AppendFkpEntry( m_rWW8Export.Strm().Tell(), m_rWW8Export.pO->Count(),
2416*b1cdbd2cSJim Jagielski                                      m_rWW8Export.pO->GetData() );
2417*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Remove( 0, m_rWW8Export.pO->Count() );                       // leeren
2418*b1cdbd2cSJim Jagielski         }
2419*b1cdbd2cSJim Jagielski 
2420*b1cdbd2cSJim Jagielski         if ( pInner->isEndOfLine() )
2421*b1cdbd2cSJim Jagielski         {
2422*b1cdbd2cSJim Jagielski         }
2423*b1cdbd2cSJim Jagielski 
2424*b1cdbd2cSJim Jagielski         aIt++;
2425*b1cdbd2cSJim Jagielski     }
2426*b1cdbd2cSJim Jagielski }
2427*b1cdbd2cSJim Jagielski 
2428*b1cdbd2cSJim Jagielski #if 0
2429*b1cdbd2cSJim Jagielski /*  */
2430*b1cdbd2cSJim Jagielski 
2431*b1cdbd2cSJim Jagielski sal_uInt16 WW8Export::StartTableFromFrmFmt( WW8Bytes &rAt, const SwFrmFmt *pFmt )
2432*b1cdbd2cSJim Jagielski {
2433*b1cdbd2cSJim Jagielski     // Tell the undocumented table hack that everything between here and
2434*b1cdbd2cSJim Jagielski     // the last table position is nontable text
2435*b1cdbd2cSJim Jagielski     if ( WW8_CP nPos = Fc2Cp( Strm().Tell() ) )
2436*b1cdbd2cSJim Jagielski         pMagicTable->Append(nPos,0);
2437*b1cdbd2cSJim Jagielski 
2438*b1cdbd2cSJim Jagielski     // sprmPDxaFromText10
2439*b1cdbd2cSJim Jagielski     if( bWrtWW8 )
2440*b1cdbd2cSJim Jagielski     {
2441*b1cdbd2cSJim Jagielski         static sal_uInt8 __READONLY_DATA  aTabLineAttr[] = {
2442*b1cdbd2cSJim Jagielski                 0, 0,               // Sty # 0
2443*b1cdbd2cSJim Jagielski                 0x16, 0x24, 1,      // sprmPFInTable
2444*b1cdbd2cSJim Jagielski                 0x17, 0x24, 1 };    // sprmPFTtp
2445*b1cdbd2cSJim Jagielski         rAt.Insert( aTabLineAttr, sizeof( aTabLineAttr ), rAt.Count() );
2446*b1cdbd2cSJim Jagielski     }
2447*b1cdbd2cSJim Jagielski     else
2448*b1cdbd2cSJim Jagielski     {
2449*b1cdbd2cSJim Jagielski         static sal_uInt8 __READONLY_DATA  aTabLineAttr[] = {
2450*b1cdbd2cSJim Jagielski                 0, 0,               // Sty # 0
2451*b1cdbd2cSJim Jagielski                 24, 1,              // sprmPFInTable
2452*b1cdbd2cSJim Jagielski                 25, 1 };            // sprmPFTtp
2453*b1cdbd2cSJim Jagielski         rAt.Insert( aTabLineAttr, sizeof( aTabLineAttr ), rAt.Count() );
2454*b1cdbd2cSJim Jagielski     }
2455*b1cdbd2cSJim Jagielski 
2456*b1cdbd2cSJim Jagielski     ASSERT( pFmt, "No pFmt!" );
2457*b1cdbd2cSJim Jagielski     if ( pFmt )
2458*b1cdbd2cSJim Jagielski     {
2459*b1cdbd2cSJim Jagielski         const SwFmtHoriOrient &rHori = pFmt->GetHoriOrient();
2460*b1cdbd2cSJim Jagielski         const SwFmtVertOrient &rVert = pFmt->GetVertOrient();
2461*b1cdbd2cSJim Jagielski         if (
2462*b1cdbd2cSJim Jagielski             (text::RelOrientation::PRINT_AREA == rHori.GetRelationOrient() ||
2463*b1cdbd2cSJim Jagielski              text::RelOrientation::FRAME == rHori.GetRelationOrient())
2464*b1cdbd2cSJim Jagielski             &&
2465*b1cdbd2cSJim Jagielski             (text::RelOrientation::PRINT_AREA == rVert.GetRelationOrient() ||
2466*b1cdbd2cSJim Jagielski              text::RelOrientation::FRAME == rVert.GetRelationOrient())
2467*b1cdbd2cSJim Jagielski            )
2468*b1cdbd2cSJim Jagielski         {
2469*b1cdbd2cSJim Jagielski             sal_Int16 eHOri = rHori.GetHoriOrient();
2470*b1cdbd2cSJim Jagielski             switch (eHOri)
2471*b1cdbd2cSJim Jagielski             {
2472*b1cdbd2cSJim Jagielski                 case text::HoriOrientation::CENTER:
2473*b1cdbd2cSJim Jagielski                 case text::HoriOrientation::RIGHT:
2474*b1cdbd2cSJim Jagielski                     if( bWrtWW8 )
2475*b1cdbd2cSJim Jagielski                         SwWW8Writer::InsUInt16( rAt, NS_sprm::LN_TJc );
2476*b1cdbd2cSJim Jagielski                     else
2477*b1cdbd2cSJim Jagielski                         rAt.Insert( 182, rAt.Count() );
2478*b1cdbd2cSJim Jagielski                     SwWW8Writer::InsUInt16( rAt, (text::HoriOrientation::RIGHT == eHOri ? 2 : 1 ));
2479*b1cdbd2cSJim Jagielski                     break;
2480*b1cdbd2cSJim Jagielski                 default:
2481*b1cdbd2cSJim Jagielski                     break;
2482*b1cdbd2cSJim Jagielski             }
2483*b1cdbd2cSJim Jagielski         }
2484*b1cdbd2cSJim Jagielski     }
2485*b1cdbd2cSJim Jagielski     return rAt.Count();
2486*b1cdbd2cSJim Jagielski }
2487*b1cdbd2cSJim Jagielski 
2488*b1cdbd2cSJim Jagielski //See #i19484# for why we need this
2489*b1cdbd2cSJim Jagielski static bool CellContainsProblematicGraphic( const SwWriteTableCell *pCell,
2490*b1cdbd2cSJim Jagielski     const MSWordExportBase &rExport )
2491*b1cdbd2cSJim Jagielski {
2492*b1cdbd2cSJim Jagielski     const SwNode *pStart = pCell ? pCell->GetBox()->GetSttNd() : 0;
2493*b1cdbd2cSJim Jagielski     const SwNode *pEnd = pStart ? pStart->EndOfSectionNode() : 0;
2494*b1cdbd2cSJim Jagielski     ASSERT( pStart && pEnd, "No start or end?" );
2495*b1cdbd2cSJim Jagielski     if ( !pStart || !pEnd )
2496*b1cdbd2cSJim Jagielski         return false;
2497*b1cdbd2cSJim Jagielski 
2498*b1cdbd2cSJim Jagielski     bool bHasGraphic = false;
2499*b1cdbd2cSJim Jagielski 
2500*b1cdbd2cSJim Jagielski     sw::Frames aFrames( GetFramesBetweenNodes( rExport.maFrames, *pStart, *pEnd ) );
2501*b1cdbd2cSJim Jagielski     sw::FrameIter aEnd = aFrames.end();
2502*b1cdbd2cSJim Jagielski     for ( sw::FrameIter aIter = aFrames.begin(); aIter != aEnd; ++aIter )
2503*b1cdbd2cSJim Jagielski     {
2504*b1cdbd2cSJim Jagielski         const SwFrmFmt &rEntry = aIter->GetFrmFmt();
2505*b1cdbd2cSJim Jagielski         if ( rEntry.GetSurround().GetSurround() == SURROUND_THROUGHT )
2506*b1cdbd2cSJim Jagielski         {
2507*b1cdbd2cSJim Jagielski             bHasGraphic = true;
2508*b1cdbd2cSJim Jagielski             break;
2509*b1cdbd2cSJim Jagielski         }
2510*b1cdbd2cSJim Jagielski     }
2511*b1cdbd2cSJim Jagielski     return bHasGraphic;
2512*b1cdbd2cSJim Jagielski }
2513*b1cdbd2cSJim Jagielski 
2514*b1cdbd2cSJim Jagielski static bool RowContainsProblematicGraphic( const SwWriteTableCellPtr *pRow,
2515*b1cdbd2cSJim Jagielski     sal_uInt16 nCols, const MSWordExportBase &rExport )
2516*b1cdbd2cSJim Jagielski {
2517*b1cdbd2cSJim Jagielski     bool bHasGraphic = false;
2518*b1cdbd2cSJim Jagielski     for ( sal_uInt16 nI = 0; nI < nCols; ++nI )
2519*b1cdbd2cSJim Jagielski     {
2520*b1cdbd2cSJim Jagielski         if ( CellContainsProblematicGraphic( pRow[nI], rExport ) )
2521*b1cdbd2cSJim Jagielski         {
2522*b1cdbd2cSJim Jagielski             bHasGraphic = true;
2523*b1cdbd2cSJim Jagielski             break;
2524*b1cdbd2cSJim Jagielski         }
2525*b1cdbd2cSJim Jagielski     }
2526*b1cdbd2cSJim Jagielski     return bHasGraphic;
2527*b1cdbd2cSJim Jagielski }
2528*b1cdbd2cSJim Jagielski #endif
2529*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------------
2530*b1cdbd2cSJim Jagielski //       Tabellen
2531*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------------
2532*b1cdbd2cSJim Jagielski 
EmptyParagraph()2533*b1cdbd2cSJim Jagielski void WW8AttributeOutput::EmptyParagraph()
2534*b1cdbd2cSJim Jagielski {
2535*b1cdbd2cSJim Jagielski     m_rWW8Export.WriteStringAsPara( aEmptyStr );
2536*b1cdbd2cSJim Jagielski }
2537*b1cdbd2cSJim Jagielski 
NoPageBreakSection(const SfxItemSet * pSet)2538*b1cdbd2cSJim Jagielski bool MSWordExportBase::NoPageBreakSection( const SfxItemSet* pSet )
2539*b1cdbd2cSJim Jagielski {
2540*b1cdbd2cSJim Jagielski     bool bRet = false;
2541*b1cdbd2cSJim Jagielski     const SfxPoolItem* pI;
2542*b1cdbd2cSJim Jagielski     if( pSet)
2543*b1cdbd2cSJim Jagielski     {
2544*b1cdbd2cSJim Jagielski         bool bNoPageBreak = false;
2545*b1cdbd2cSJim Jagielski         if ( SFX_ITEM_ON != pSet->GetItemState(RES_PAGEDESC, true, &pI)
2546*b1cdbd2cSJim Jagielski             || 0 == ((SwFmtPageDesc*)pI)->GetPageDesc() )
2547*b1cdbd2cSJim Jagielski         {
2548*b1cdbd2cSJim Jagielski             bNoPageBreak = true;
2549*b1cdbd2cSJim Jagielski         }
2550*b1cdbd2cSJim Jagielski 
2551*b1cdbd2cSJim Jagielski         if (bNoPageBreak)
2552*b1cdbd2cSJim Jagielski         {
2553*b1cdbd2cSJim Jagielski             if (SFX_ITEM_ON != pSet->GetItemState(RES_BREAK, true, &pI))
2554*b1cdbd2cSJim Jagielski                 bNoPageBreak = true;
2555*b1cdbd2cSJim Jagielski             else
2556*b1cdbd2cSJim Jagielski             {
2557*b1cdbd2cSJim Jagielski                 SvxBreak eBreak = ((const SvxFmtBreakItem*)pI)->GetBreak();
2558*b1cdbd2cSJim Jagielski                 switch (eBreak)
2559*b1cdbd2cSJim Jagielski                 {
2560*b1cdbd2cSJim Jagielski                     case SVX_BREAK_PAGE_BEFORE:
2561*b1cdbd2cSJim Jagielski                     case SVX_BREAK_PAGE_AFTER:
2562*b1cdbd2cSJim Jagielski                         bNoPageBreak = false;
2563*b1cdbd2cSJim Jagielski                         break;
2564*b1cdbd2cSJim Jagielski                     default:
2565*b1cdbd2cSJim Jagielski                         break;
2566*b1cdbd2cSJim Jagielski                 }
2567*b1cdbd2cSJim Jagielski             }
2568*b1cdbd2cSJim Jagielski         }
2569*b1cdbd2cSJim Jagielski         bRet = bNoPageBreak;
2570*b1cdbd2cSJim Jagielski     }
2571*b1cdbd2cSJim Jagielski     return bRet;
2572*b1cdbd2cSJim Jagielski }
2573*b1cdbd2cSJim Jagielski 
2574*b1cdbd2cSJim Jagielski /*  */
2575*b1cdbd2cSJim Jagielski 
OutputSectionNode(const SwSectionNode & rSectionNode)2576*b1cdbd2cSJim Jagielski void MSWordExportBase::OutputSectionNode( const SwSectionNode& rSectionNode )
2577*b1cdbd2cSJim Jagielski {
2578*b1cdbd2cSJim Jagielski     const SwSection& rSection = rSectionNode.GetSection();
2579*b1cdbd2cSJim Jagielski 
2580*b1cdbd2cSJim Jagielski     SwNodeIndex aIdx( rSectionNode, 1 );
2581*b1cdbd2cSJim Jagielski     const SwNode& rNd = aIdx.GetNode();
2582*b1cdbd2cSJim Jagielski     if ( !rNd.IsSectionNode() && !IsInTable()
2583*b1cdbd2cSJim Jagielski 		&& rSection.GetType() != TOX_CONTENT_SECTION && rSection.GetType() != TOX_HEADER_SECTION) //No sections in table
2584*b1cdbd2cSJim Jagielski     {
2585*b1cdbd2cSJim Jagielski         // Bug 74245 - if the first Node inside the section has an own
2586*b1cdbd2cSJim Jagielski         //              PageDesc or PageBreak attribut, then dont write
2587*b1cdbd2cSJim Jagielski         //              here the section break
2588*b1cdbd2cSJim Jagielski         sal_uLong nRstLnNum = 0;
2589*b1cdbd2cSJim Jagielski         const SfxItemSet* pSet;
2590*b1cdbd2cSJim Jagielski         if ( rNd.IsTableNode() )
2591*b1cdbd2cSJim Jagielski             pSet = &rNd.GetTableNode()->GetTable().GetFrmFmt()->GetAttrSet();
2592*b1cdbd2cSJim Jagielski         else if ( rNd.IsCntntNode() )
2593*b1cdbd2cSJim Jagielski         {
2594*b1cdbd2cSJim Jagielski             pSet = &rNd.GetCntntNode()->GetSwAttrSet();
2595*b1cdbd2cSJim Jagielski             nRstLnNum = ((SwFmtLineNumber&)pSet->Get(
2596*b1cdbd2cSJim Jagielski                             RES_LINENUMBER )).GetStartValue();
2597*b1cdbd2cSJim Jagielski         }
2598*b1cdbd2cSJim Jagielski         else
2599*b1cdbd2cSJim Jagielski             pSet = 0;
2600*b1cdbd2cSJim Jagielski 
2601*b1cdbd2cSJim Jagielski         if ( pSet && NoPageBreakSection( pSet ) )
2602*b1cdbd2cSJim Jagielski             pSet = 0;
2603*b1cdbd2cSJim Jagielski 
2604*b1cdbd2cSJim Jagielski         if ( !pSet )
2605*b1cdbd2cSJim Jagielski         {
2606*b1cdbd2cSJim Jagielski             // new Section with no own PageDesc/-Break
2607*b1cdbd2cSJim Jagielski             //  -> write follow section break;
2608*b1cdbd2cSJim Jagielski             const SwSectionFmt& rFmt = *rSection.GetFmt();
2609*b1cdbd2cSJim Jagielski             ReplaceCr( msword::PageBreak ); // Indikator fuer Page/Section-Break
2610*b1cdbd2cSJim Jagielski 
2611*b1cdbd2cSJim Jagielski             //Get the page in use at the top of this section
2612*b1cdbd2cSJim Jagielski             SwNodeIndex aIdxTmp(rSectionNode, 1);
2613*b1cdbd2cSJim Jagielski             const SwPageDesc *pCurrent =
2614*b1cdbd2cSJim Jagielski                 SwPageDesc::GetPageDescOfNode(aIdxTmp.GetNode());
2615*b1cdbd2cSJim Jagielski             if (!pCurrent)
2616*b1cdbd2cSJim Jagielski                 pCurrent = pAktPageDesc;
2617*b1cdbd2cSJim Jagielski 
2618*b1cdbd2cSJim Jagielski             AppendSection( pCurrent, &rFmt, nRstLnNum );
2619*b1cdbd2cSJim Jagielski         }
2620*b1cdbd2cSJim Jagielski     }
2621*b1cdbd2cSJim Jagielski     if ( TOX_CONTENT_SECTION == rSection.GetType() )
2622*b1cdbd2cSJim Jagielski         bStartTOX = true;
2623*b1cdbd2cSJim Jagielski }
2624*b1cdbd2cSJim Jagielski 
2625*b1cdbd2cSJim Jagielski 
AppendSection(const SwPageDesc * pPageDesc,const SwSectionFmt * pFmt,sal_uLong nLnNum)2626*b1cdbd2cSJim Jagielski void WW8Export::AppendSection( const SwPageDesc *pPageDesc, const SwSectionFmt* pFmt, sal_uLong nLnNum )
2627*b1cdbd2cSJim Jagielski {
2628*b1cdbd2cSJim Jagielski     pSepx->AppendSep(Fc2Cp(Strm().Tell()), pPageDesc, pFmt, nLnNum);
2629*b1cdbd2cSJim Jagielski }
2630*b1cdbd2cSJim Jagielski 
2631*b1cdbd2cSJim Jagielski /*  */
2632*b1cdbd2cSJim Jagielski 
2633*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------------
2634*b1cdbd2cSJim Jagielski //       Flys
2635*b1cdbd2cSJim Jagielski //---------------------------------------------------------------------------
2636*b1cdbd2cSJim Jagielski 
OutWW6FlyFrmsInCntnt(const SwTxtNode & rNd)2637*b1cdbd2cSJim Jagielski void WW8Export::OutWW6FlyFrmsInCntnt( const SwTxtNode& rNd )
2638*b1cdbd2cSJim Jagielski {
2639*b1cdbd2cSJim Jagielski     ASSERT(!bWrtWW8, "I shouldn't be needed for Word >=8");
2640*b1cdbd2cSJim Jagielski     if ( bWrtWW8 )
2641*b1cdbd2cSJim Jagielski         return;
2642*b1cdbd2cSJim Jagielski 
2643*b1cdbd2cSJim Jagielski     if (const SwpHints* pTxtAttrs = rNd.GetpSwpHints())
2644*b1cdbd2cSJim Jagielski     {
2645*b1cdbd2cSJim Jagielski         for( sal_uInt16 n=0; n < pTxtAttrs->Count(); ++n )
2646*b1cdbd2cSJim Jagielski         {
2647*b1cdbd2cSJim Jagielski             const SwTxtAttr* pAttr = (*pTxtAttrs)[ n ];
2648*b1cdbd2cSJim Jagielski             if( RES_TXTATR_FLYCNT == pAttr->Which() )
2649*b1cdbd2cSJim Jagielski             {
2650*b1cdbd2cSJim Jagielski                 // zeichengebundenes Attribut
2651*b1cdbd2cSJim Jagielski                 const SwFmtFlyCnt& rFlyCntnt = pAttr->GetFlyCnt();
2652*b1cdbd2cSJim Jagielski                 const SwFlyFrmFmt& rFlyFrmFmt = *(SwFlyFrmFmt*)rFlyCntnt.GetFrmFmt();
2653*b1cdbd2cSJim Jagielski                 const SwNodeIndex* pNodeIndex = rFlyFrmFmt.GetCntnt().GetCntntIdx();
2654*b1cdbd2cSJim Jagielski 
2655*b1cdbd2cSJim Jagielski                 if( pNodeIndex )
2656*b1cdbd2cSJim Jagielski                 {
2657*b1cdbd2cSJim Jagielski                     sal_uLong nStt = pNodeIndex->GetIndex()+1,
2658*b1cdbd2cSJim Jagielski                           nEnd = pNodeIndex->GetNode().EndOfSectionIndex();
2659*b1cdbd2cSJim Jagielski 
2660*b1cdbd2cSJim Jagielski                     if( (nStt < nEnd) && !pDoc->GetNodes()[ nStt ]->IsNoTxtNode() )
2661*b1cdbd2cSJim Jagielski                     {
2662*b1cdbd2cSJim Jagielski                         Point aOffset;
2663*b1cdbd2cSJim Jagielski                         // Rechtecke des Flys und des Absatzes besorgen
2664*b1cdbd2cSJim Jagielski                         SwRect aParentRect(rNd.FindLayoutRect(false, &aOffset)),
2665*b1cdbd2cSJim Jagielski                                aFlyRect(rFlyFrmFmt.FindLayoutRect(false, &aOffset ) );
2666*b1cdbd2cSJim Jagielski 
2667*b1cdbd2cSJim Jagielski                         aOffset = aFlyRect.Pos() - aParentRect.Pos();
2668*b1cdbd2cSJim Jagielski 
2669*b1cdbd2cSJim Jagielski                         // PaM umsetzen: auf Inhalt des Fly-Frameformats
2670*b1cdbd2cSJim Jagielski                         SaveData( nStt, nEnd );
2671*b1cdbd2cSJim Jagielski 
2672*b1cdbd2cSJim Jagielski                         // wird in OutputFormat() ausgewertet
2673*b1cdbd2cSJim Jagielski                         pFlyOffset = &aOffset;
2674*b1cdbd2cSJim Jagielski                         eNewAnchorType = rFlyFrmFmt.GetAnchor().GetAnchorId();
2675*b1cdbd2cSJim Jagielski                         sw::Frame aFrm(rFlyFrmFmt, SwPosition(rNd));
2676*b1cdbd2cSJim Jagielski                         mpParentFrame = &aFrm;
2677*b1cdbd2cSJim Jagielski                         // Ok, rausschreiben:
2678*b1cdbd2cSJim Jagielski                         WriteText();
2679*b1cdbd2cSJim Jagielski 
2680*b1cdbd2cSJim Jagielski                         RestoreData();
2681*b1cdbd2cSJim Jagielski                     }
2682*b1cdbd2cSJim Jagielski                 }
2683*b1cdbd2cSJim Jagielski             }
2684*b1cdbd2cSJim Jagielski         }
2685*b1cdbd2cSJim Jagielski     }
2686*b1cdbd2cSJim Jagielski }
2687*b1cdbd2cSJim Jagielski 
OutputFlyFrame_Impl(const sw::Frame & rFmt,const Point & rNdTopLeft)2688*b1cdbd2cSJim Jagielski void WW8AttributeOutput::OutputFlyFrame_Impl( const sw::Frame& rFmt, const Point& rNdTopLeft )
2689*b1cdbd2cSJim Jagielski {
2690*b1cdbd2cSJim Jagielski     const SwFrmFmt &rFrmFmt = rFmt.GetFrmFmt();
2691*b1cdbd2cSJim Jagielski     const SwFmtAnchor& rAnch = rFrmFmt.GetAnchor();
2692*b1cdbd2cSJim Jagielski 
2693*b1cdbd2cSJim Jagielski     bool bUseEscher = m_rWW8Export.bWrtWW8;
2694*b1cdbd2cSJim Jagielski 
2695*b1cdbd2cSJim Jagielski     if ( m_rWW8Export.bWrtWW8 && rFmt.IsInline() )
2696*b1cdbd2cSJim Jagielski     {
2697*b1cdbd2cSJim Jagielski         sw::Frame::WriterSource eType = rFmt.GetWriterType();
2698*b1cdbd2cSJim Jagielski         if ((eType == sw::Frame::eGraphic) || (eType == sw::Frame::eOle))
2699*b1cdbd2cSJim Jagielski             bUseEscher = false;
2700*b1cdbd2cSJim Jagielski         else
2701*b1cdbd2cSJim Jagielski             bUseEscher = true;
2702*b1cdbd2cSJim Jagielski 
2703*b1cdbd2cSJim Jagielski         /*
2704*b1cdbd2cSJim Jagielski          #110185#
2705*b1cdbd2cSJim Jagielski          A special case for converting some inline form controls to form fields
2706*b1cdbd2cSJim Jagielski          when in winword 8+ mode
2707*b1cdbd2cSJim Jagielski         */
2708*b1cdbd2cSJim Jagielski         if ((bUseEscher == true) && (eType == sw::Frame::eFormControl))
2709*b1cdbd2cSJim Jagielski         {
2710*b1cdbd2cSJim Jagielski             if ( m_rWW8Export.MiserableFormFieldExportHack( rFrmFmt ) )
2711*b1cdbd2cSJim Jagielski                 return ;
2712*b1cdbd2cSJim Jagielski         }
2713*b1cdbd2cSJim Jagielski     }
2714*b1cdbd2cSJim Jagielski 
2715*b1cdbd2cSJim Jagielski     if (bUseEscher)
2716*b1cdbd2cSJim Jagielski     {
2717*b1cdbd2cSJim Jagielski         ASSERT( m_rWW8Export.bWrtWW8, "this has gone horribly wrong" );
2718*b1cdbd2cSJim Jagielski         // write as escher
2719*b1cdbd2cSJim Jagielski         m_rWW8Export.AppendFlyInFlys(rFmt, rNdTopLeft);
2720*b1cdbd2cSJim Jagielski     }
2721*b1cdbd2cSJim Jagielski     else
2722*b1cdbd2cSJim Jagielski     {
2723*b1cdbd2cSJim Jagielski         bool bDone = false;
2724*b1cdbd2cSJim Jagielski 
2725*b1cdbd2cSJim Jagielski         // Hole vom Node und vom letzten Node die Position in der Section
2726*b1cdbd2cSJim Jagielski         const SwNodeIndex* pNodeIndex = rFrmFmt.GetCntnt().GetCntntIdx();
2727*b1cdbd2cSJim Jagielski 
2728*b1cdbd2cSJim Jagielski         sal_uLong nStt = pNodeIndex ? pNodeIndex->GetIndex()+1                  : 0;
2729*b1cdbd2cSJim Jagielski         sal_uLong nEnd = pNodeIndex ? pNodeIndex->GetNode().EndOfSectionIndex() : 0;
2730*b1cdbd2cSJim Jagielski 
2731*b1cdbd2cSJim Jagielski         if( nStt >= nEnd )      // kein Bereich, also kein gueltiger Node
2732*b1cdbd2cSJim Jagielski             return;
2733*b1cdbd2cSJim Jagielski 
2734*b1cdbd2cSJim Jagielski         if ( !m_rWW8Export.IsInTable() && rFmt.IsInline() )
2735*b1cdbd2cSJim Jagielski         {
2736*b1cdbd2cSJim Jagielski             //Test to see if this textbox contains only a single graphic/ole
2737*b1cdbd2cSJim Jagielski             SwTxtNode* pParTxtNode = rAnch.GetCntntAnchor()->nNode.GetNode().GetTxtNode();
2738*b1cdbd2cSJim Jagielski             if ( pParTxtNode && !m_rWW8Export.pDoc->GetNodes()[ nStt ]->IsNoTxtNode() )
2739*b1cdbd2cSJim Jagielski                 bDone = true;
2740*b1cdbd2cSJim Jagielski         }
2741*b1cdbd2cSJim Jagielski         if( !bDone )
2742*b1cdbd2cSJim Jagielski         {
2743*b1cdbd2cSJim Jagielski             // ein NICHT zeichengebundener Rahmen liegt vor
2744*b1cdbd2cSJim Jagielski 
2745*b1cdbd2cSJim Jagielski             // --> OD 2007-04-19 #i43447# - removed
2746*b1cdbd2cSJim Jagielski //            const SwFmtFrmSize& rS = rFrmFmt.GetFrmSize();
2747*b1cdbd2cSJim Jagielski //            nFlyWidth  = rS.GetWidth();  // Fuer Anpassung Graphic-Groesse
2748*b1cdbd2cSJim Jagielski //            nFlyHeight = rS.GetHeight();
2749*b1cdbd2cSJim Jagielski             // <--
2750*b1cdbd2cSJim Jagielski 
2751*b1cdbd2cSJim Jagielski             m_rWW8Export.SaveData( nStt, nEnd );
2752*b1cdbd2cSJim Jagielski 
2753*b1cdbd2cSJim Jagielski             Point aOffset;
2754*b1cdbd2cSJim Jagielski             if ( m_rWW8Export.mpParentFrame )
2755*b1cdbd2cSJim Jagielski             {
2756*b1cdbd2cSJim Jagielski                 /*
2757*b1cdbd2cSJim Jagielski                 #90804#
2758*b1cdbd2cSJim Jagielski                 Munge flys in fly into absolutely positioned elements for
2759*b1cdbd2cSJim Jagielski                 word 6
2760*b1cdbd2cSJim Jagielski                 */
2761*b1cdbd2cSJim Jagielski                 const SwTxtNode* pParTxtNode = rAnch.GetCntntAnchor()->nNode.GetNode().GetTxtNode();
2762*b1cdbd2cSJim Jagielski                 const SwRect aPageRect = pParTxtNode->FindPageFrmRect( sal_False, 0, sal_False );
2763*b1cdbd2cSJim Jagielski 
2764*b1cdbd2cSJim Jagielski                 aOffset = rFrmFmt.FindLayoutRect().Pos();
2765*b1cdbd2cSJim Jagielski                 aOffset -= aPageRect.Pos();
2766*b1cdbd2cSJim Jagielski 
2767*b1cdbd2cSJim Jagielski                 m_rWW8Export.pFlyOffset = &aOffset;
2768*b1cdbd2cSJim Jagielski                 m_rWW8Export.eNewAnchorType = FLY_AT_PAGE;
2769*b1cdbd2cSJim Jagielski             }
2770*b1cdbd2cSJim Jagielski 
2771*b1cdbd2cSJim Jagielski             m_rWW8Export.mpParentFrame = &rFmt;
2772*b1cdbd2cSJim Jagielski             if (
2773*b1cdbd2cSJim Jagielski                 m_rWW8Export.IsInTable() &&
2774*b1cdbd2cSJim Jagielski                  (FLY_AT_PAGE != rAnch.GetAnchorId()) &&
2775*b1cdbd2cSJim Jagielski                  !m_rWW8Export.pDoc->GetNodes()[ nStt ]->IsNoTxtNode()
2776*b1cdbd2cSJim Jagielski                )
2777*b1cdbd2cSJim Jagielski             {
2778*b1cdbd2cSJim Jagielski                 // Beachten: Flag  bOutTable  wieder setzen,
2779*b1cdbd2cSJim Jagielski                 //           denn wir geben ja ganz normalen Content der
2780*b1cdbd2cSJim Jagielski                 //           Tabelenzelle aus und keinen Rahmen
2781*b1cdbd2cSJim Jagielski                 //           (Flag wurde oben in  aSaveData()  geloescht)
2782*b1cdbd2cSJim Jagielski                 m_rWW8Export.bOutTable = true;
2783*b1cdbd2cSJim Jagielski                 const String& rName = rFrmFmt.GetName();
2784*b1cdbd2cSJim Jagielski                 m_rWW8Export.StartCommentOutput(rName);
2785*b1cdbd2cSJim Jagielski                 m_rWW8Export.WriteText();
2786*b1cdbd2cSJim Jagielski                 m_rWW8Export.EndCommentOutput(rName);
2787*b1cdbd2cSJim Jagielski             }
2788*b1cdbd2cSJim Jagielski             else
2789*b1cdbd2cSJim Jagielski                 m_rWW8Export.WriteText();
2790*b1cdbd2cSJim Jagielski 
2791*b1cdbd2cSJim Jagielski             m_rWW8Export.RestoreData();
2792*b1cdbd2cSJim Jagielski         }
2793*b1cdbd2cSJim Jagielski     }
2794*b1cdbd2cSJim Jagielski }
2795*b1cdbd2cSJim Jagielski 
OutputFlyFrame(const sw::Frame & rFmt)2796*b1cdbd2cSJim Jagielski void AttributeOutputBase::OutputFlyFrame( const sw::Frame& rFmt )
2797*b1cdbd2cSJim Jagielski {
2798*b1cdbd2cSJim Jagielski     if ( !rFmt.GetCntntNode() )
2799*b1cdbd2cSJim Jagielski         return;
2800*b1cdbd2cSJim Jagielski 
2801*b1cdbd2cSJim Jagielski     const SwCntntNode &rNode = *rFmt.GetCntntNode();
2802*b1cdbd2cSJim Jagielski     Point aNdPos, aPgPos;
2803*b1cdbd2cSJim Jagielski     Point* pLayPos;
2804*b1cdbd2cSJim Jagielski     bool bValidNdPos = false, bValidPgPos = false;
2805*b1cdbd2cSJim Jagielski 
2806*b1cdbd2cSJim Jagielski     if (FLY_AT_PAGE == rFmt.GetFrmFmt().GetAnchor().GetAnchorId())
2807*b1cdbd2cSJim Jagielski     {
2808*b1cdbd2cSJim Jagielski         // get the Layout Node-Position.
2809*b1cdbd2cSJim Jagielski         if ( !bValidPgPos )
2810*b1cdbd2cSJim Jagielski         {
2811*b1cdbd2cSJim Jagielski             aPgPos = rNode.FindPageFrmRect(false, &aPgPos).Pos();
2812*b1cdbd2cSJim Jagielski             bValidPgPos = true;
2813*b1cdbd2cSJim Jagielski         }
2814*b1cdbd2cSJim Jagielski         pLayPos = &aPgPos;
2815*b1cdbd2cSJim Jagielski     }
2816*b1cdbd2cSJim Jagielski     else
2817*b1cdbd2cSJim Jagielski     {
2818*b1cdbd2cSJim Jagielski         // get the Layout Node-Position.
2819*b1cdbd2cSJim Jagielski         if ( !bValidNdPos )
2820*b1cdbd2cSJim Jagielski         {
2821*b1cdbd2cSJim Jagielski             aNdPos = rNode.FindLayoutRect(false, &aNdPos).Pos();
2822*b1cdbd2cSJim Jagielski             bValidNdPos = true;
2823*b1cdbd2cSJim Jagielski         }
2824*b1cdbd2cSJim Jagielski         pLayPos = &aNdPos;
2825*b1cdbd2cSJim Jagielski     }
2826*b1cdbd2cSJim Jagielski 
2827*b1cdbd2cSJim Jagielski     OutputFlyFrame_Impl( rFmt, *pLayPos );
2828*b1cdbd2cSJim Jagielski }
2829*b1cdbd2cSJim Jagielski 
2830*b1cdbd2cSJim Jagielski // write data of any redline
Redline(const SwRedlineData * pRedline)2831*b1cdbd2cSJim Jagielski void WW8AttributeOutput::Redline( const SwRedlineData* pRedline )
2832*b1cdbd2cSJim Jagielski {
2833*b1cdbd2cSJim Jagielski     if ( !pRedline )
2834*b1cdbd2cSJim Jagielski         return;
2835*b1cdbd2cSJim Jagielski 
2836*b1cdbd2cSJim Jagielski     if ( pRedline->Next() )
2837*b1cdbd2cSJim Jagielski         Redline( pRedline->Next() );
2838*b1cdbd2cSJim Jagielski 
2839*b1cdbd2cSJim Jagielski     static sal_uInt16 __READONLY_DATA aSprmIds[ 2 * 2 * 3 ] =
2840*b1cdbd2cSJim Jagielski     {
2841*b1cdbd2cSJim Jagielski         // Ids for insert
2842*b1cdbd2cSJim Jagielski             NS_sprm::LN_CFRMark, NS_sprm::LN_CIbstRMark, NS_sprm::LN_CDttmRMark,         // for WW8
2843*b1cdbd2cSJim Jagielski             0x0042, 0x0045, 0x0046,         // for WW6
2844*b1cdbd2cSJim Jagielski         // Ids for delete
2845*b1cdbd2cSJim Jagielski             NS_sprm::LN_CFRMarkDel, NS_sprm::LN_CIbstRMarkDel, NS_sprm::LN_CDttmRMarkDel,         // for WW8
2846*b1cdbd2cSJim Jagielski             0x0041, 0x0045, 0x0046          // for WW6
2847*b1cdbd2cSJim Jagielski     };
2848*b1cdbd2cSJim Jagielski 
2849*b1cdbd2cSJim Jagielski     const sal_uInt16* pSprmIds = 0;
2850*b1cdbd2cSJim Jagielski     switch( pRedline->GetType() )
2851*b1cdbd2cSJim Jagielski     {
2852*b1cdbd2cSJim Jagielski     case nsRedlineType_t::REDLINE_INSERT:
2853*b1cdbd2cSJim Jagielski         pSprmIds = aSprmIds;
2854*b1cdbd2cSJim Jagielski         break;
2855*b1cdbd2cSJim Jagielski 
2856*b1cdbd2cSJim Jagielski     case nsRedlineType_t::REDLINE_DELETE:
2857*b1cdbd2cSJim Jagielski         pSprmIds = aSprmIds + (2 * 3);
2858*b1cdbd2cSJim Jagielski         break;
2859*b1cdbd2cSJim Jagielski 
2860*b1cdbd2cSJim Jagielski     case nsRedlineType_t::REDLINE_FORMAT:
2861*b1cdbd2cSJim Jagielski         if( m_rWW8Export.bWrtWW8 )
2862*b1cdbd2cSJim Jagielski         {
2863*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( NS_sprm::LN_CPropRMark );
2864*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( 7, m_rWW8Export.pO->Count() );       // len
2865*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( 1, m_rWW8Export.pO->Count() );
2866*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( m_rWW8Export.AddRedlineAuthor( pRedline->GetAuthor() ) );
2867*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt32( sw::ms::DateTime2DTTM( pRedline->GetTimeStamp() ));
2868*b1cdbd2cSJim Jagielski         }
2869*b1cdbd2cSJim Jagielski         break;
2870*b1cdbd2cSJim Jagielski     default:
2871*b1cdbd2cSJim Jagielski         ASSERT(!this, "Unhandled redline type for export");
2872*b1cdbd2cSJim Jagielski         break;
2873*b1cdbd2cSJim Jagielski     }
2874*b1cdbd2cSJim Jagielski 
2875*b1cdbd2cSJim Jagielski     if ( pSprmIds )
2876*b1cdbd2cSJim Jagielski     {
2877*b1cdbd2cSJim Jagielski         if ( !m_rWW8Export.bWrtWW8 )
2878*b1cdbd2cSJim Jagielski             pSprmIds += 3;
2879*b1cdbd2cSJim Jagielski 
2880*b1cdbd2cSJim Jagielski         if ( m_rWW8Export.bWrtWW8 )
2881*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( pSprmIds[0] );
2882*b1cdbd2cSJim Jagielski         else
2883*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( msword_cast<sal_uInt8>(pSprmIds[0]), m_rWW8Export.pO->Count() );
2884*b1cdbd2cSJim Jagielski         m_rWW8Export.pO->Insert( 1, m_rWW8Export.pO->Count() );
2885*b1cdbd2cSJim Jagielski 
2886*b1cdbd2cSJim Jagielski         if ( m_rWW8Export.bWrtWW8 )
2887*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( pSprmIds[1] );
2888*b1cdbd2cSJim Jagielski         else
2889*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( msword_cast<sal_uInt8>(pSprmIds[1]), m_rWW8Export.pO->Count() );
2890*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt16( m_rWW8Export.AddRedlineAuthor( pRedline->GetAuthor() ) );
2891*b1cdbd2cSJim Jagielski 
2892*b1cdbd2cSJim Jagielski         if ( m_rWW8Export.bWrtWW8 )
2893*b1cdbd2cSJim Jagielski             m_rWW8Export.InsUInt16( pSprmIds[2] );
2894*b1cdbd2cSJim Jagielski         else
2895*b1cdbd2cSJim Jagielski             m_rWW8Export.pO->Insert( msword_cast<sal_uInt8>(pSprmIds[2]), m_rWW8Export.pO->Count() );
2896*b1cdbd2cSJim Jagielski         m_rWW8Export.InsUInt32( sw::ms::DateTime2DTTM( pRedline->GetTimeStamp() ));
2897*b1cdbd2cSJim Jagielski     }
2898*b1cdbd2cSJim Jagielski }
2899*b1cdbd2cSJim Jagielski 
2900*b1cdbd2cSJim Jagielski /*  */
2901*b1cdbd2cSJim Jagielski 
OutputContentNode(const SwCntntNode & rNode)2902*b1cdbd2cSJim Jagielski void MSWordExportBase::OutputContentNode( const SwCntntNode& rNode )
2903*b1cdbd2cSJim Jagielski {
2904*b1cdbd2cSJim Jagielski     switch ( rNode.GetNodeType() )
2905*b1cdbd2cSJim Jagielski     {
2906*b1cdbd2cSJim Jagielski         case ND_TEXTNODE:
2907*b1cdbd2cSJim Jagielski         {
2908*b1cdbd2cSJim Jagielski             const SwTxtNode& rTextNode = *rNode.GetTxtNode();
2909*b1cdbd2cSJim Jagielski             if( !mbOutOutlineOnly || rTextNode.IsOutline() )
2910*b1cdbd2cSJim Jagielski                 OutputTextNode( rTextNode );
2911*b1cdbd2cSJim Jagielski         }
2912*b1cdbd2cSJim Jagielski         break;
2913*b1cdbd2cSJim Jagielski         case ND_GRFNODE:
2914*b1cdbd2cSJim Jagielski             OutputGrfNode( *rNode.GetGrfNode() );
2915*b1cdbd2cSJim Jagielski             break;
2916*b1cdbd2cSJim Jagielski         case ND_OLENODE:
2917*b1cdbd2cSJim Jagielski             OutputOLENode( *rNode.GetOLENode() );
2918*b1cdbd2cSJim Jagielski             break;
2919*b1cdbd2cSJim Jagielski         default:
2920*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0
2921*b1cdbd2cSJim Jagielski             OSL_TRACE("Unhandled node, type == %d\n", rNode.GetNodeType() );
2922*b1cdbd2cSJim Jagielski #endif
2923*b1cdbd2cSJim Jagielski             break;
2924*b1cdbd2cSJim Jagielski     }
2925*b1cdbd2cSJim Jagielski }
2926*b1cdbd2cSJim Jagielski 
2927*b1cdbd2cSJim Jagielski /* vi:set tabstop=4 shiftwidth=4 expandtab: */
2928