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