Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <com/sun/star/text/HoriOrientation.hpp>
22 : #include <com/sun/star/text/VertOrientation.hpp>
23 : #include <com/sun/star/text/RelOrientation.hpp>
24 : #include <comphelper/string.hxx>
25 : #include <svx/svxids.hrc>
26 : #include "hintids.hxx"
27 : #include <tools/string.hxx>
28 : #include <svl/urihelper.hxx>
29 : #include <vcl/svapp.hxx>
30 : #include <vcl/wrkwin.hxx>
31 : #include <svtools/htmlkywd.hxx>
32 : #include <svtools/htmlout.hxx>
33 : #include <svtools/imap.hxx>
34 : #include <svtools/imapobj.hxx>
35 : #include <svtools/htmlcfg.hxx>
36 : #include <svx/xoutbmp.hxx>
37 : #include <editeng/boxitem.hxx>
38 : #include <editeng/lrspitem.hxx>
39 : #include <editeng/ulspitem.hxx>
40 : #include <editeng/brushitem.hxx>
41 :
42 :
43 : #include <fmtanchr.hxx>
44 : #include <fmtornt.hxx>
45 : #include <fmturl.hxx>
46 : #include <fmtfsize.hxx>
47 : #include <fmtclds.hxx>
48 : #include <fmtcntnt.hxx>
49 : #include <fmtsrnd.hxx>
50 : #include <fmtinfmt.hxx>
51 : #include <txtinet.hxx>
52 : #include "frmatr.hxx"
53 : #include <grfatr.hxx>
54 : #include <flypos.hxx>
55 : #include <docary.hxx>
56 : #include <ndgrf.hxx>
57 :
58 : #include "doc.hxx"
59 : #include "ndtxt.hxx"
60 : #include "pam.hxx"
61 : #include "swerror.h"
62 : #include "frmfmt.hxx"
63 : #include "wrthtml.hxx"
64 : #include "css1kywd.hxx"
65 : #include "htmlfly.hxx"
66 :
67 : using namespace ::com::sun::star;
68 :
69 : ////////////////////////////////////////////////////////////
70 :
71 : const sal_uLong HTML_FRMOPTS_IMG_ALL =
72 : HTML_FRMOPT_ALT |
73 : HTML_FRMOPT_SIZE |
74 : HTML_FRMOPT_ANYSIZE |
75 : HTML_FRMOPT_BORDER |
76 : HTML_FRMOPT_NAME;
77 : const sal_uLong HTML_FRMOPTS_IMG_CNTNR =
78 : HTML_FRMOPTS_IMG_ALL |
79 : HTML_FRMOPT_ABSSIZE;
80 : const sal_uLong HTML_FRMOPTS_IMG =
81 : HTML_FRMOPTS_IMG_ALL |
82 : HTML_FRMOPT_ALIGN |
83 : HTML_FRMOPT_SPACE |
84 : HTML_FRMOPT_BRCLEAR;
85 : const sal_uLong HTML_FRMOPTS_IMG_CSS1 =
86 : HTML_FRMOPT_S_ALIGN |
87 : HTML_FRMOPT_S_SPACE;
88 :
89 : const sal_uLong HTML_FRMOPTS_DIV =
90 : HTML_FRMOPT_ID |
91 : HTML_FRMOPT_S_ALIGN |
92 : HTML_FRMOPT_S_SIZE |
93 : HTML_FRMOPT_ANYSIZE |
94 : HTML_FRMOPT_ABSSIZE |
95 : HTML_FRMOPT_S_SPACE |
96 : HTML_FRMOPT_S_BORDER |
97 : HTML_FRMOPT_S_BACKGROUND |
98 : HTML_FRMOPT_BRCLEAR |
99 : HTML_FRMOPT_DIR;
100 :
101 : const sal_uLong HTML_FRMOPTS_MULTICOL =
102 : HTML_FRMOPT_ID |
103 : HTML_FRMOPT_WIDTH |
104 : HTML_FRMOPT_ANYSIZE |
105 : HTML_FRMOPT_ABSSIZE |
106 : HTML_FRMOPT_DIR;
107 : const sal_uLong HTML_FRMOPTS_MULTICOL_CNTNR =
108 : HTML_FRMOPTS_MULTICOL;
109 : const sal_uLong HTML_FRMOPTS_MULTICOL_CSS1 =
110 : HTML_FRMOPT_S_ALIGN |
111 : HTML_FRMOPT_S_SIZE |
112 : HTML_FRMOPT_S_SPACE |
113 : HTML_FRMOPT_S_BORDER|
114 : HTML_FRMOPT_S_BACKGROUND;
115 :
116 : const sal_uLong HTML_FRMOPTS_SPACER =
117 : HTML_FRMOPT_ALIGN |
118 : HTML_FRMOPT_SIZE |
119 : HTML_FRMOPT_ANYSIZE |
120 : HTML_FRMOPT_BRCLEAR |
121 : HTML_FRMOPT_MARGINSIZE |
122 : HTML_FRMOPT_ABSSIZE;
123 :
124 : const sal_uLong HTML_FRMOPTS_CNTNR =
125 : HTML_FRMOPT_S_ALIGN |
126 : HTML_FRMOPT_S_SPACE |
127 : HTML_FRMOPT_S_WIDTH |
128 : HTML_FRMOPT_ANYSIZE |
129 : HTML_FRMOPT_ABSSIZE |
130 : HTML_FRMOPT_S_PIXSIZE;
131 :
132 :
133 : static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt );
134 : static Writer& OutHTML_FrmFmtAsMulticol( Writer& rWrt, const SwFrmFmt& rFmt,
135 : sal_Bool bInCntnr );
136 : static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFmt );
137 : static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
138 : const SwFrmFmt& rFrmFmt, sal_Bool bSpan );
139 : static Writer& OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFmt,
140 : sal_Bool bInCntnr );
141 :
142 : static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFmt,
143 : sal_Bool bInCntnr );
144 :
145 : static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
146 : const SdrObject& rSdrObj );
147 : //-----------------------------------------------------------------------
148 :
149 : extern HTMLOutEvent aAnchorEventTable[];
150 :
151 : static HTMLOutEvent aImageEventTable[] =
152 : {
153 : { OOO_STRING_SVTOOLS_HTML_O_SDonload, OOO_STRING_SVTOOLS_HTML_O_onload, SVX_EVENT_IMAGE_LOAD },
154 : { OOO_STRING_SVTOOLS_HTML_O_SDonabort, OOO_STRING_SVTOOLS_HTML_O_onabort, SVX_EVENT_IMAGE_ABORT },
155 : { OOO_STRING_SVTOOLS_HTML_O_SDonerror, OOO_STRING_SVTOOLS_HTML_O_onerror, SVX_EVENT_IMAGE_ERROR },
156 : { 0, 0, 0 }
157 : };
158 :
159 : static HTMLOutEvent aIMapEventTable[] =
160 : {
161 : { OOO_STRING_SVTOOLS_HTML_O_SDonmouseover, OOO_STRING_SVTOOLS_HTML_O_onmouseover, SFX_EVENT_MOUSEOVER_OBJECT },
162 : { OOO_STRING_SVTOOLS_HTML_O_SDonmouseout, OOO_STRING_SVTOOLS_HTML_O_onmouseout, SFX_EVENT_MOUSEOUT_OBJECT },
163 : { 0, 0, 0 }
164 : };
165 :
166 :
167 :
168 0 : sal_uInt16 SwHTMLWriter::GuessFrmType( const SwFrmFmt& rFrmFmt,
169 : const SdrObject*& rpSdrObj )
170 : {
171 : SwHTMLFrmType eType;
172 :
173 0 : if( RES_DRAWFRMFMT == rFrmFmt.Which() )
174 : {
175 : // Als Default irgendein Zeichen-Objekt
176 0 : eType = HTML_FRMTYPE_DRAW;
177 :
178 : const SdrObject *pObj =
179 0 : SwHTMLWriter::GetMarqueeTextObj( (const SwDrawFrmFmt &)rFrmFmt );
180 0 : if( pObj )
181 : {
182 : // Laufschrift
183 0 : rpSdrObj = pObj;
184 0 : eType = HTML_FRMTYPE_MARQUEE;
185 : }
186 : else
187 : {
188 0 : pObj = GetHTMLControl( (const SwDrawFrmFmt &)rFrmFmt );
189 :
190 0 : if( pObj )
191 : {
192 : // Form-Control
193 0 : rpSdrObj = pObj;
194 0 : eType = HTML_FRMTYPE_CONTROL;
195 : }
196 : }
197 : }
198 : else
199 : {
200 : // Als Default ein Textrahmen
201 0 : eType = HTML_FRMTYPE_TEXT;
202 :
203 0 : const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
204 0 : sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
205 0 : const SwNode* pNd = pDoc->GetNodes()[ nStt ];
206 :
207 0 : if( pNd->IsGrfNode() )
208 : {
209 : // Grafik - Node
210 0 : eType = HTML_FRMTYPE_GRF;
211 : }
212 0 : else if( pNd->IsOLENode() )
213 : {
214 : // Applet, Plugin, Floating-Frame
215 0 : eType = (SwHTMLFrmType)GuessOLENodeFrmType( *pNd );
216 : }
217 : else
218 : {
219 0 : sal_uLong nEnd = pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();
220 :
221 : const SfxPoolItem* pItem;
222 0 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
223 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_COL,
224 0 : sal_True, &pItem ) &&
225 0 : ((const SwFmtCol *)pItem)->GetNumCols() > 1 )
226 : {
227 : // spaltiger Rahmen
228 0 : eType = HTML_FRMTYPE_MULTICOL;
229 : }
230 0 : else if( pNd->IsTableNode() )
231 : {
232 0 : const SwTableNode *pTblNd = pNd->GetTableNode();
233 0 : sal_uLong nTblEnd = pTblNd->EndOfSectionIndex();
234 :
235 0 : if( nTblEnd+1 == nEnd )
236 : {
237 : // Tabelle
238 0 : eType = HTML_FRMTYPE_TABLE;
239 : }
240 0 : else if( nTblEnd+2 == nEnd )
241 : {
242 : // Tabelle mit Unterschrft
243 0 : eType = HTML_FRMTYPE_TABLE_CAP;
244 : }
245 : }
246 0 : else if( pNd->IsTxtNode() )
247 : {
248 0 : const SwTxtNode *pTxtNd = pNd->GetTxtNode();
249 :
250 0 : sal_Bool bEmpty = sal_False;
251 0 : if( nStt==nEnd-1 && !pTxtNd->Len() )
252 : {
253 : // leerer Rahmen? Nur wenn kein Rahmen am
254 : // Text- oder Start-Node verankert ist.
255 0 : bEmpty = sal_True;
256 0 : if( pHTMLPosFlyFrms )
257 : {
258 0 : for( sal_uInt16 i=0; i<pHTMLPosFlyFrms->size(); i++ )
259 : {
260 0 : sal_uLong nIdx = (*pHTMLPosFlyFrms)[i]
261 0 : ->GetNdIndex().GetIndex();
262 0 : bEmpty = (nIdx != nStt) && (nIdx != nStt-1);
263 0 : if( !bEmpty || nIdx > nStt )
264 : break;
265 : }
266 : }
267 : }
268 0 : if( bEmpty )
269 : {
270 0 : const SvxBrushItem& rBrush = rFrmFmt.GetBackground();
271 : /// background is not empty, if it has a background graphic
272 : /// or its background color is not "no fill"/"auto fill".
273 0 : if( GPOS_NONE != rBrush.GetGraphicPos() ||
274 0 : rBrush.GetColor() != COL_TRANSPARENT )
275 0 : bEmpty = sal_False;
276 : }
277 0 : if( bEmpty )
278 : {
279 : // leerer Rahmen
280 0 : eType = HTML_FRMTYPE_EMPTY;
281 : }
282 0 : else if( pDoc->GetNodes()[nStt+1]->IsTableNode() )
283 : {
284 : const SwTableNode *pTblNd =
285 0 : pDoc->GetNodes()[nStt+1]->GetTableNode();
286 0 : if( pTblNd->EndOfSectionIndex()+1 == nEnd )
287 : {
288 : // Tabelle mit Ueberschrift
289 0 : eType = HTML_FRMTYPE_TABLE_CAP;
290 : }
291 : }
292 : }
293 : }
294 : }
295 :
296 0 : return static_cast< sal_uInt16 >(eType);
297 : }
298 :
299 2 : void SwHTMLWriter::CollectFlyFrms()
300 : {
301 : OSL_ENSURE( HTML_CFG_MAX+1 == MAX_BROWSERS,
302 : "number of browser configurations has changed" );
303 :
304 2 : SwPosFlyFrms aFlyPos(pDoc->GetAllFlyFmts(bWriteAll ? 0 : pCurPam, true));
305 :
306 2 : for(SwPosFlyFrms::const_iterator aIter(aFlyPos.begin()); aIter != aFlyPos.end(); ++aIter)
307 : {
308 0 : const SwFrmFmt& rFrmFmt = (*aIter)->GetFmt();
309 0 : const SdrObject *pSdrObj = 0;
310 : const SwPosition *pAPos;
311 : const SwCntntNode *pACNd;
312 0 : SwHTMLFrmType eType = (SwHTMLFrmType)GuessFrmType( rFrmFmt, pSdrObj );
313 :
314 : sal_uInt8 nMode;
315 0 : const SwFmtAnchor& rAnchor = rFrmFmt.GetAnchor();
316 0 : sal_Int16 eHoriRel = rFrmFmt.GetHoriOrient().GetRelationOrient();
317 0 : switch( rAnchor.GetAnchorId() )
318 : {
319 : case FLY_AT_PAGE:
320 : case FLY_AT_FLY:
321 0 : nMode = aHTMLOutFrmPageFlyTable[eType][nExportMode];
322 0 : break;
323 :
324 : case FLY_AT_PARA:
325 : // Absatz-gebundene Rahmen werden nur dann vor den
326 : // Absatz geschrieben, wenn der Absatz einen Abstand
327 : // hat.
328 0 : if( text::RelOrientation::FRAME == eHoriRel &&
329 0 : (pAPos = rAnchor.GetCntntAnchor()) != 0 &&
330 0 : (pACNd = pAPos->nNode.GetNode().GetCntntNode()) != 0 )
331 : {
332 : const SvxLRSpaceItem& rLRItem =
333 0 : (const SvxLRSpaceItem&)pACNd->GetAttr(RES_LR_SPACE);
334 0 : if( rLRItem.GetTxtLeft() || rLRItem.GetRight() )
335 : {
336 0 : nMode = aHTMLOutFrmParaFrameTable[eType][nExportMode];
337 0 : break;
338 : }
339 : }
340 0 : nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
341 0 : break;
342 :
343 : case FLY_AT_CHAR:
344 0 : if( text::RelOrientation::FRAME == eHoriRel || text::RelOrientation::PRINT_AREA == eHoriRel )
345 0 : nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
346 : else
347 0 : nMode = aHTMLOutFrmParaOtherTable[eType][nExportMode];
348 0 : break;
349 :
350 : default:
351 0 : nMode = aHTMLOutFrmParaPrtAreaTable[eType][nExportMode];
352 0 : break;
353 : }
354 :
355 0 : if( !pHTMLPosFlyFrms )
356 0 : pHTMLPosFlyFrms = new SwHTMLPosFlyFrms;
357 :
358 0 : SwHTMLPosFlyFrm *pNew = new SwHTMLPosFlyFrm(**aIter, pSdrObj, nMode);
359 0 : pHTMLPosFlyFrms->insert( pNew );
360 2 : }
361 2 : }
362 :
363 263 : sal_Bool SwHTMLWriter::OutFlyFrm( sal_uLong nNdIdx, xub_StrLen nCntntIdx, sal_uInt8 nPos,
364 : HTMLOutContext *pContext )
365 : {
366 263 : sal_Bool bFlysLeft = sal_False; // Noch Flys an aktueller Node-Position da?
367 :
368 : // OutFlyFrm kan rekursiv aufgerufen werden. Deshalb muss man
369 : // manchmal wieder von vorne anfangen, nachdem ein Fly ausgegeben
370 : // wurde.
371 263 : sal_Bool bRestart = sal_True;
372 526 : while( pHTMLPosFlyFrms && bRestart )
373 : {
374 0 : bFlysLeft = bRestart = sal_False;
375 :
376 : // suche nach dem Anfang der FlyFrames
377 : sal_uInt16 i;
378 :
379 0 : for( i = 0; i < pHTMLPosFlyFrms->size() &&
380 0 : (*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() < nNdIdx; i++ )
381 : ;
382 0 : for( ; !bRestart && i < pHTMLPosFlyFrms->size() &&
383 0 : (*pHTMLPosFlyFrms)[i]->GetNdIndex().GetIndex() == nNdIdx; i++ )
384 : {
385 0 : SwHTMLPosFlyFrm *pPosFly = (*pHTMLPosFlyFrms)[i];
386 0 : if( ( HTML_POS_ANY == nPos ||
387 0 : pPosFly->GetOutPos() == nPos ) &&
388 0 : pPosFly->GetCntntIndex() == nCntntIdx )
389 : {
390 : // Erst entfernen ist wichtig, weil in tieferen
391 : // Rekursionen evtl. weitere Eintraege oder das
392 : // ganze Array geloscht werden koennte.
393 0 : pHTMLPosFlyFrms->erase(i);
394 0 : i--;
395 0 : if( pHTMLPosFlyFrms->empty() )
396 : {
397 0 : delete pHTMLPosFlyFrms;
398 0 : pHTMLPosFlyFrms = 0;
399 0 : bRestart = sal_True; // nicht wirklich, nur raus
400 : // aus der Schleife
401 : }
402 :
403 0 : if( pContext )
404 : {
405 0 : HTMLOutFuncs::FlushToAscii(Strm(), *pContext );
406 0 : pContext = 0; // one time only
407 : }
408 :
409 0 : OutFrmFmt( pPosFly->GetOutMode(), pPosFly->GetFmt(),
410 0 : pPosFly->GetSdrObject() );
411 0 : switch( pPosFly->GetOutFn() )
412 : {
413 : case HTML_OUT_DIV:
414 : case HTML_OUT_SPAN:
415 : case HTML_OUT_MULTICOL:
416 : case HTML_OUT_TBLNODE:
417 0 : bRestart = sal_True; // Hier wird's evtl rekursiv
418 0 : break;
419 : }
420 0 : delete pPosFly;
421 : }
422 : else
423 : {
424 0 : bFlysLeft = sal_True;
425 : }
426 : }
427 : }
428 :
429 263 : return bFlysLeft;
430 : }
431 :
432 0 : void SwHTMLWriter::OutFrmFmt( sal_uInt8 nMode, const SwFrmFmt& rFrmFmt,
433 : const SdrObject *pSdrObject )
434 : {
435 0 : sal_uInt8 nCntnrMode = SwHTMLPosFlyFrm::GetOutCntnr( nMode );
436 0 : sal_uInt8 nOutMode = SwHTMLPosFlyFrm::GetOutFn(nMode);
437 0 : const sal_Char *pCntnrStr = 0;
438 0 : if( HTML_CNTNR_NONE != nCntnrMode )
439 : {
440 :
441 0 : if( bLFPossible && HTML_CNTNR_DIV == nCntnrMode )
442 0 : OutNewLine();
443 :
444 0 : OStringBuffer sOut;
445 : pCntnrStr = (HTML_CNTNR_DIV == nCntnrMode)
446 : ? OOO_STRING_SVTOOLS_HTML_division
447 0 : : OOO_STRING_SVTOOLS_HTML_span;
448 0 : sOut.append('<').append(pCntnrStr).append(' ')
449 0 : .append(OOO_STRING_SVTOOLS_HTML_O_class).append("=\"")
450 0 : .append(sCSS1_class_abs_pos).append('\"');
451 0 : Strm() << sOut.makeStringAndClear().getStr();
452 :
453 : // Fuer Nicht-Zeichenobekte eine Breite ausgeben
454 0 : sal_uLong nFrmFlags = HTML_FRMOPTS_CNTNR;
455 :
456 : // Fuer spaltige Rahmen koennen wir auch noch den Hintergrund ausgeben.
457 0 : if( HTML_OUT_MULTICOL == nOutMode )
458 0 : nFrmFlags |= HTML_FRMOPT_S_BACKGROUND|HTML_FRMOPT_S_BORDER;
459 :
460 0 : if( IsHTMLMode( HTMLMODE_BORDER_NONE ) )
461 0 : nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
462 0 : OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags, pSdrObject );
463 0 : Strm() << '>';
464 :
465 0 : if( HTML_CNTNR_DIV == nCntnrMode )
466 : {
467 0 : IncIndentLevel();
468 0 : bLFPossible = sal_True;
469 0 : }
470 : }
471 :
472 0 : switch( nOutMode )
473 : {
474 : case HTML_OUT_TBLNODE: // OK
475 : OSL_ENSURE( !pCntnrStr, "Table: Container ist hier nicht vorgesehen" );
476 0 : OutHTML_FrmFmtTableNode( *this, rFrmFmt );
477 0 : break;
478 : case HTML_OUT_GRFNODE: // OK
479 0 : OutHTML_FrmFmtGrfNode( *this, rFrmFmt, pCntnrStr != 0 );
480 0 : break;
481 : case HTML_OUT_OLENODE: // OK
482 0 : OutHTML_FrmFmtOLENode( *this, rFrmFmt, pCntnrStr != 0 );
483 0 : break;
484 : case HTML_OUT_OLEGRF: // OK
485 0 : OutHTML_FrmFmtOLENodeGrf( *this, rFrmFmt, pCntnrStr != 0 );
486 0 : break;
487 : case HTML_OUT_DIV:
488 : case HTML_OUT_SPAN:
489 : OSL_ENSURE( !pCntnrStr, "Div: Container ist hier nicht vorgesehen" );
490 0 : OutHTML_FrmFmtAsDivOrSpan( *this, rFrmFmt, HTML_OUT_SPAN==nOutMode );
491 0 : break;
492 : case HTML_OUT_MULTICOL: // OK
493 0 : OutHTML_FrmFmtAsMulticol( *this, rFrmFmt, pCntnrStr != 0 );
494 0 : break;
495 : case HTML_OUT_SPACER: // OK
496 : OSL_ENSURE( !pCntnrStr, "Spacer: Container ist hier nicht vorgesehen" );
497 0 : OutHTML_FrmFmtAsSpacer( *this, rFrmFmt );
498 0 : break;
499 : case HTML_OUT_CONTROL: // OK
500 : OutHTML_DrawFrmFmtAsControl( *this,
501 : (const SwDrawFrmFmt &)rFrmFmt, *pSdrObject,
502 0 : pCntnrStr != 0 );
503 0 : break;
504 : case HTML_OUT_AMARQUEE:
505 0 : OutHTML_FrmFmtAsMarquee( *this, rFrmFmt, *pSdrObject );
506 0 : break;
507 : case HTML_OUT_MARQUEE:
508 : OSL_ENSURE( !pCntnrStr, "Marquee: Container ist hier nicht vorgesehen" );
509 : OutHTML_DrawFrmFmtAsMarquee( *this,
510 0 : (const SwDrawFrmFmt &)rFrmFmt, *pSdrObject );
511 0 : break;
512 : case HTML_OUT_GRFFRM:
513 0 : OutHTML_FrmFmtAsImage( *this, rFrmFmt, pCntnrStr != 0 );
514 0 : break;
515 : }
516 :
517 0 : if( HTML_CNTNR_DIV == nCntnrMode )
518 : {
519 0 : DecIndentLevel();
520 0 : if( bLFPossible )
521 0 : OutNewLine();
522 0 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_division, sal_False );
523 0 : bLFPossible = sal_True;
524 : }
525 0 : else if( HTML_CNTNR_SPAN == nCntnrMode )
526 0 : HTMLOutFuncs::Out_AsciiTag( Strm(), OOO_STRING_SVTOOLS_HTML_span, sal_False );
527 0 : }
528 :
529 :
530 0 : OString SwHTMLWriter::OutFrmFmtOptions( const SwFrmFmt &rFrmFmt,
531 : const String& rAlternateTxt,
532 : sal_uInt32 nFrmOpts,
533 : const OString &rEndTags )
534 : {
535 0 : OString sRetEndTags(rEndTags);
536 0 : OStringBuffer sOut;
537 : const SfxPoolItem* pItem;
538 0 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
539 :
540 : // Name
541 0 : if( (nFrmOpts & (HTML_FRMOPT_ID|HTML_FRMOPT_NAME)) &&
542 0 : rFrmFmt.GetName().Len() )
543 : {
544 : const sal_Char *pStr =
545 0 : (nFrmOpts & HTML_FRMOPT_ID) ? OOO_STRING_SVTOOLS_HTML_O_id : OOO_STRING_SVTOOLS_HTML_O_name;
546 0 : sOut.append(' ').append(pStr).
547 0 : append(RTL_CONSTASCII_STRINGPARAM("=\""));
548 0 : Strm() << sOut.makeStringAndClear().getStr();
549 0 : HTMLOutFuncs::Out_String( Strm(), rFrmFmt.GetName(), eDestEnc, &aNonConvertableCharacters );
550 0 : sOut.append('\"');
551 : }
552 :
553 : // Name
554 0 : if( nFrmOpts & HTML_FRMOPT_DIR )
555 : {
556 0 : sal_uInt16 nDir = GetHTMLDirection( rItemSet );
557 0 : Strm() << sOut.makeStringAndClear().getStr();
558 0 : OutDirection( nDir );
559 : }
560 :
561 :
562 : // ALT
563 0 : if( (nFrmOpts & HTML_FRMOPT_ALT) && rAlternateTxt.Len() )
564 : {
565 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_alt).
566 0 : append(RTL_CONSTASCII_STRINGPARAM("=\""));
567 0 : Strm() << sOut.makeStringAndClear().getStr();
568 0 : HTMLOutFuncs::Out_String( Strm(), rAlternateTxt, eDestEnc, &aNonConvertableCharacters );
569 0 : sOut.append('\"');
570 : }
571 :
572 : // ALIGN
573 0 : const sal_Char *pStr = 0;
574 0 : RndStdIds eAnchorId = rFrmFmt.GetAnchor().GetAnchorId();
575 0 : if( (nFrmOpts & HTML_FRMOPT_ALIGN) &&
576 0 : ((FLY_AT_PARA == eAnchorId) || (FLY_AT_CHAR == eAnchorId)) )
577 : {
578 : // MIB 12.3.98: Ist es nicht schlauer, absatzgebundene
579 : // Rahmen notfalls links auszurichten als sie
580 : // zeichengebunden einzufuegen???
581 0 : const SwFmtHoriOrient& rHoriOri = rFrmFmt.GetHoriOrient();
582 0 : if( !(nFrmOpts & HTML_FRMOPT_S_ALIGN) ||
583 0 : text::RelOrientation::FRAME == rHoriOri.GetRelationOrient() ||
584 0 : text::RelOrientation::PRINT_AREA == rHoriOri.GetRelationOrient() )
585 : {
586 0 : pStr = text::HoriOrientation::RIGHT == rHoriOri.GetHoriOrient()
587 : ? OOO_STRING_SVTOOLS_HTML_AL_right
588 0 : : OOO_STRING_SVTOOLS_HTML_AL_left;
589 : }
590 : }
591 0 : if( (nFrmOpts & HTML_FRMOPT_ALIGN) && !pStr &&
592 0 : ( (nFrmOpts & HTML_FRMOPT_S_ALIGN) == 0 ||
593 0 : (FLY_AS_CHAR == eAnchorId) ) &&
594 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_VERT_ORIENT, sal_True, &pItem ))
595 : {
596 0 : switch( ((SwFmtVertOrient*)pItem)->GetVertOrient() )
597 : {
598 0 : case text::VertOrientation::LINE_TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_top; break;
599 : case text::VertOrientation::CHAR_TOP:
600 0 : case text::VertOrientation::BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_texttop; break; // geht nicht
601 : case text::VertOrientation::LINE_CENTER:
602 0 : case text::VertOrientation::CHAR_CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_absmiddle; break; // geht nicht
603 0 : case text::VertOrientation::CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_middle; break;
604 : case text::VertOrientation::LINE_BOTTOM:
605 0 : case text::VertOrientation::CHAR_BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_absbottom; break; // geht nicht
606 0 : case text::VertOrientation::TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_bottom; break;
607 0 : case text::VertOrientation::NONE: break;
608 : }
609 : }
610 0 : if( pStr )
611 : {
612 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_align).append('=').
613 0 : append(pStr);
614 : }
615 :
616 :
617 : // HSPACE und VSPACE
618 0 : Size aTwipSpc( 0, 0 );
619 0 : if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
620 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_LR_SPACE, sal_True, &pItem ))
621 : {
622 0 : aTwipSpc.Width() =
623 0 : ( ((SvxLRSpaceItem*)pItem)->GetLeft() +
624 0 : ((SvxLRSpaceItem*)pItem)->GetRight() ) / 2;
625 0 : nDfltLeftMargin = nDfltRightMargin = aTwipSpc.Width();
626 : }
627 0 : if( (nFrmOpts & (HTML_FRMOPT_SPACE|HTML_FRMOPT_MARGINSIZE)) &&
628 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_UL_SPACE, sal_True, &pItem ))
629 : {
630 0 : aTwipSpc.Height() =
631 0 : ( ((SvxULSpaceItem*)pItem)->GetUpper() +
632 0 : ((SvxULSpaceItem*)pItem)->GetLower() ) / 2;
633 0 : nDfltTopMargin = nDfltBottomMargin = (sal_uInt16)aTwipSpc.Height();
634 : }
635 :
636 0 : if( (nFrmOpts & HTML_FRMOPT_SPACE) &&
637 0 : (aTwipSpc.Width() || aTwipSpc.Height()) &&
638 0 : Application::GetDefaultDevice() )
639 : {
640 : Size aPixelSpc =
641 : Application::GetDefaultDevice()->LogicToPixel( aTwipSpc,
642 0 : MapMode(MAP_TWIP) );
643 0 : if( !aPixelSpc.Width() && aTwipSpc.Width() )
644 0 : aPixelSpc.Width() = 1;
645 0 : if( !aPixelSpc.Height() && aTwipSpc.Height() )
646 0 : aPixelSpc.Height() = 1;
647 :
648 0 : if( aPixelSpc.Width() )
649 : {
650 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_hspace).
651 0 : append('=').append(static_cast<sal_Int32>(aPixelSpc.Width()));
652 : }
653 :
654 0 : if( aPixelSpc.Height() )
655 : {
656 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_vspace).
657 0 : append('=').append(static_cast<sal_Int32>(aPixelSpc.Height()));
658 : }
659 : }
660 :
661 : // Der Abstand muss bei der Groesse beruecksichtigt, wenn das entsprechende
662 : // Flag gesetzt ist.
663 0 : if( (nFrmOpts & HTML_FRMOPT_MARGINSIZE) )
664 : {
665 0 : aTwipSpc.Width() *= -2;
666 0 : aTwipSpc.Height() *= -2;
667 : }
668 : else
669 : {
670 0 : aTwipSpc.Width() = 0;
671 0 : aTwipSpc.Height() = 0;
672 : }
673 :
674 0 : if( !(nFrmOpts & HTML_FRMOPT_ABSSIZE) &&
675 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, sal_True, &pItem ))
676 : {
677 0 : const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
678 :
679 0 : aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_LEFT );
680 0 : aTwipSpc.Width() += pBoxItem->CalcLineSpace( BOX_LINE_RIGHT );
681 0 : aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_TOP );
682 0 : aTwipSpc.Height() += pBoxItem->CalcLineSpace( BOX_LINE_BOTTOM );
683 : }
684 :
685 : // WIDTH und/oder HEIGHT
686 : // ATT_VAR_SIZE/ATT_MIN_SIZE nur ausgeben, wenn ANYSIZE gesezut ist
687 0 : if( (nFrmOpts & HTML_FRMOPT_SIZE) &&
688 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_FRM_SIZE, sal_True, &pItem ) &&
689 0 : ( (nFrmOpts & HTML_FRMOPT_ANYSIZE) ||
690 0 : ATT_FIX_SIZE == ((const SwFmtFrmSize *)pItem)->GetHeightSizeType()) )
691 : {
692 0 : const SwFmtFrmSize *pFSItem = (const SwFmtFrmSize *)pItem;
693 0 : sal_uInt8 nPrcWidth = pFSItem->GetWidthPercent();
694 0 : sal_uInt8 nPrcHeight = pFSItem->GetHeightPercent();
695 :
696 : // Groesse des Objekts Twips ohne Raender
697 : Size aTwipSz( (nPrcWidth ? 0
698 0 : : pFSItem->GetWidth()-aTwipSpc.Width()),
699 : (nPrcHeight ? 0
700 0 : : pFSItem->GetHeight()-aTwipSpc.Height()) );
701 :
702 : OSL_ENSURE( aTwipSz.Width() >= 0 && aTwipSz.Height() >= 0,
703 : "Rahmengroesse minus Abstand < 0!!!???" );
704 0 : if( aTwipSz.Width() < 0 )
705 0 : aTwipSz.Width() = 0;
706 0 : if( aTwipSz.Height() < 0 )
707 0 : aTwipSz.Height() = 0;
708 :
709 0 : Size aPixelSz( 0, 0 );
710 0 : if( (aTwipSz.Width() || aTwipSz.Height()) &&
711 0 : Application::GetDefaultDevice() )
712 : {
713 : aPixelSz =
714 : Application::GetDefaultDevice()->LogicToPixel( aTwipSz,
715 0 : MapMode(MAP_TWIP) );
716 0 : if( !aPixelSz.Width() && aTwipSz.Width() )
717 0 : aPixelSz.Width() = 1;
718 0 : if( !aPixelSz.Height() && aTwipSz.Height() )
719 0 : aPixelSz.Height() = 1;
720 : }
721 :
722 0 : if( (nFrmOpts & HTML_FRMOPT_WIDTH) &&
723 0 : ((nPrcWidth && nPrcWidth!=255) || aPixelSz.Width()) )
724 : {
725 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_width).
726 0 : append('=');
727 0 : if( nPrcWidth )
728 0 : sOut.append(static_cast<sal_Int32>(nPrcWidth)).append('%');
729 : else
730 0 : sOut.append(static_cast<sal_Int32>(aPixelSz.Width()));
731 : }
732 :
733 0 : if( (nFrmOpts & HTML_FRMOPT_HEIGHT) &&
734 0 : ((nPrcHeight && nPrcHeight!=255) || aPixelSz.Height()) )
735 : {
736 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_height).
737 0 : append('=');
738 0 : if( nPrcHeight )
739 0 : sOut.append(static_cast<sal_Int32>(nPrcHeight)).append('%');
740 : else
741 0 : sOut.append(static_cast<sal_Int32>(aPixelSz.Height()));
742 : }
743 : }
744 :
745 0 : if (!sOut.isEmpty())
746 0 : Strm() << sOut.makeStringAndClear().getStr();
747 :
748 : // Umlauf fuer absatzgeb. Grafiken als <BR CLEAR=...> in den String
749 : // schreiben
750 0 : if( (nFrmOpts & HTML_FRMOPT_BRCLEAR) &&
751 0 : ((FLY_AT_PARA == rFrmFmt.GetAnchor().GetAnchorId()) ||
752 0 : (FLY_AT_CHAR == rFrmFmt.GetAnchor().GetAnchorId())) &&
753 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_SURROUND, sal_True, &pItem ))
754 : {
755 0 : const SwFmtSurround* pSurround = (const SwFmtSurround*)pItem;
756 0 : sal_Int16 eHoriOri = rFrmFmt.GetHoriOrient().GetHoriOrient();
757 0 : pStr = 0;
758 0 : SwSurround eSurround = pSurround->GetSurround();
759 0 : sal_Bool bAnchorOnly = pSurround->IsAnchorOnly();
760 0 : switch( eHoriOri )
761 : {
762 : case text::HoriOrientation::RIGHT:
763 : {
764 0 : switch( eSurround )
765 : {
766 : case SURROUND_NONE:
767 : case SURROUND_RIGHT:
768 0 : pStr = OOO_STRING_SVTOOLS_HTML_AL_right;
769 0 : break;
770 : case SURROUND_LEFT:
771 : case SURROUND_PARALLEL:
772 0 : if( bAnchorOnly )
773 0 : bClearRight = sal_True;
774 0 : break;
775 : default:
776 : ;
777 : }
778 : }
779 0 : break;
780 :
781 : default:
782 : // If a frame is centered, it gets left aligned. This
783 : // should be taken into account here, too.
784 : {
785 0 : switch( eSurround )
786 : {
787 : case SURROUND_NONE:
788 : case SURROUND_LEFT:
789 0 : pStr = OOO_STRING_SVTOOLS_HTML_AL_left;
790 0 : break;
791 : case SURROUND_RIGHT:
792 : case SURROUND_PARALLEL:
793 0 : if( bAnchorOnly )
794 0 : bClearLeft = sal_True;
795 0 : break;
796 : default:
797 : ;
798 : }
799 : }
800 0 : break;
801 :
802 : }
803 :
804 0 : if( pStr )
805 : {
806 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_linebreak).
807 0 : append(' ').append(OOO_STRING_SVTOOLS_HTML_O_clear).
808 0 : append('=').append(pStr).append('>').append(rEndTags);
809 0 : sRetEndTags = sOut.makeStringAndClear();
810 : }
811 : }
812 : assert(sRetEndTags.endsWith(rEndTags)); // fdo#58286
813 0 : return sRetEndTags;
814 : }
815 :
816 :
817 0 : Writer& OutHTML_Image( Writer& rWrt, const SwFrmFmt &rFrmFmt,
818 : const String &rGrfName, const String& rAlternateTxt,
819 : const Size &rRealSize, sal_uInt32 nFrmOpts,
820 : const sal_Char *pMarkType,
821 : const ImageMap *pAltImgMap )
822 : {
823 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
824 :
825 : // ggf. ein noch offenes Attribut voruebergehend beenden
826 0 : if( !rHTMLWrt.aINetFmts.empty() )
827 : {
828 0 : SwFmtINetFmt *pINetFmt = rHTMLWrt.aINetFmts.back();
829 0 : OutHTML_INetFmt( rWrt, *pINetFmt, sal_False );
830 : }
831 :
832 0 : String aGrfNm( rGrfName );
833 0 : if( !HTMLOutFuncs::PrivateURLToInternalImg(aGrfNm) )
834 0 : aGrfNm = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(), aGrfNm);
835 :
836 : const SfxPoolItem* pItem;
837 0 : const SfxItemSet& rItemSet = rFrmFmt.GetAttrSet();
838 :
839 0 : const SwFmtURL *pURLItem = 0;
840 :
841 : // das URL-Attribut nur beruecksichtigen, wenn keine Image-Map
842 : // uebergeben wurde
843 0 : if( !pAltImgMap &&
844 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_URL, sal_True, &pItem ))
845 : {
846 0 : pURLItem = (const SwFmtURL *)pItem;
847 : }
848 :
849 : // Image-Map rausschreiben
850 0 : const ImageMap *pIMap = pAltImgMap;
851 0 : if( !pIMap && pURLItem )
852 : {
853 0 : pIMap = pURLItem->GetMap();
854 : }
855 :
856 0 : String aIMapName;
857 0 : if( pIMap )
858 : {
859 : // den Namen eindeutig machen
860 0 : aIMapName = pIMap->GetName();
861 0 : String aNameBase;
862 0 : if( aIMapName.Len() )
863 0 : aNameBase = aIMapName;
864 : else
865 0 : aNameBase.AssignAscii( OOO_STRING_SVTOOLS_HTML_map );
866 0 : if( !aIMapName.Len() )
867 0 : (aIMapName = aNameBase)
868 0 : += OUString::number( rHTMLWrt.nImgMapCnt );
869 :
870 : sal_Bool bFound;
871 0 : do
872 : {
873 0 : bFound = sal_False;
874 0 : for(size_t i = 0; i < rHTMLWrt.aImgMapNames.size(); ++i)
875 : {
876 : // TODO: Unicode: Comparison is case insensitive for ASCII
877 : // characters only now!
878 0 : if( aIMapName.EqualsIgnoreCaseAscii(rHTMLWrt.aImgMapNames[i]) )
879 : {
880 0 : bFound = sal_True;
881 0 : break;
882 : }
883 : }
884 0 : if( bFound )
885 : {
886 0 : rHTMLWrt.nImgMapCnt++;
887 0 : (aIMapName = aNameBase)
888 0 : += OUString::number( rHTMLWrt.nImgMapCnt );
889 : }
890 :
891 : } while( bFound );
892 :
893 0 : sal_Bool bScale = sal_False;
894 0 : Fraction aScaleX( 1, 1 );
895 0 : Fraction aScaleY( 1, 1 );
896 :
897 0 : const SwFmtFrmSize& rFrmSize = rFrmFmt.GetFrmSize();
898 0 : const SvxBoxItem& rBox = rFrmFmt.GetBox();
899 :
900 0 : if( !rFrmSize.GetWidthPercent() && rRealSize.Width() )
901 : {
902 0 : SwTwips nWidth = rFrmSize.GetWidth();
903 0 : nWidth -= ( rBox.CalcLineSpace(BOX_LINE_LEFT) +
904 0 : rBox.CalcLineSpace(BOX_LINE_RIGHT) );
905 :
906 : OSL_ENSURE( nWidth>0, "Gibt es 0 twip breite Grafiken!?" );
907 0 : if( nWidth<=0 ) // sollte nicht passieren
908 0 : nWidth = 1;
909 :
910 0 : if( rRealSize.Width() != nWidth )
911 : {
912 0 : aScaleX = Fraction( nWidth, rRealSize.Width() );
913 0 : bScale = sal_True;
914 : }
915 : }
916 0 : if( !rFrmSize.GetHeightPercent() && rRealSize.Height() )
917 : {
918 0 : SwTwips nHeight = rFrmSize.GetHeight();
919 0 : nHeight -= ( rBox.CalcLineSpace(BOX_LINE_TOP) +
920 0 : rBox.CalcLineSpace(BOX_LINE_BOTTOM) );
921 :
922 : OSL_ENSURE( nHeight>0, "Gibt es 0 twip hohe Grafiken!?" );
923 0 : if( nHeight<=0 )
924 0 : nHeight = 1;
925 :
926 0 : if( rRealSize.Height() != nHeight )
927 : {
928 0 : aScaleY = Fraction( nHeight, rRealSize.Height() );
929 0 : bScale = sal_True;
930 : }
931 : }
932 :
933 0 : rHTMLWrt.aImgMapNames.push_back(aIMapName);
934 :
935 0 : OString aIndMap, aIndArea;
936 0 : const sal_Char *pLF = 0, *pIndArea = 0, *pIndMap = 0;
937 : #if defined(UNX)
938 0 : sal_Char aLF[2] = "\x00";
939 : #endif
940 :
941 0 : if( rHTMLWrt.bLFPossible )
942 : {
943 0 : rHTMLWrt.OutNewLine( sal_True );
944 0 : aIndMap = rHTMLWrt.GetIndentString();
945 0 : aIndArea = rHTMLWrt.GetIndentString(1);
946 : #if defined(UNX)
947 0 : aLF[0] = SwHTMLWriter::sNewLine;
948 0 : pLF = aLF;
949 : #else
950 : pLF = SwHTMLWriter::sNewLine;
951 : #endif
952 0 : pIndArea = aIndArea.getStr();
953 0 : pIndMap = aIndMap.getStr();
954 : }
955 :
956 0 : if( bScale )
957 : {
958 0 : ImageMap aScaledIMap( *pIMap );
959 0 : aScaledIMap.Scale( aScaleX, aScaleY );
960 0 : HTMLOutFuncs::Out_ImageMap( rWrt.Strm(), rWrt.GetBaseURL(), aScaledIMap, aIMapName,
961 : aIMapEventTable,
962 : rHTMLWrt.bCfgStarBasic,
963 : pLF, pIndArea, pIndMap,
964 : rHTMLWrt.eDestEnc,
965 0 : &rHTMLWrt.aNonConvertableCharacters );
966 : }
967 : else
968 : {
969 0 : HTMLOutFuncs::Out_ImageMap( rWrt.Strm(), rWrt.GetBaseURL(), *pIMap, aIMapName,
970 : aIMapEventTable,
971 : rHTMLWrt.bCfgStarBasic,
972 : pLF, pIndArea, pIndMap,
973 : rHTMLWrt.eDestEnc,
974 0 : &rHTMLWrt.aNonConvertableCharacters );
975 0 : }
976 : }
977 :
978 : // wenn meoglich vor der Grafik einen Zeilen-Umbruch ausgeben
979 0 : if( rHTMLWrt.bLFPossible )
980 0 : rHTMLWrt.OutNewLine( sal_True );
981 :
982 : // Attribute die ausserhelb der Grafik geschreiben werden muessen sammeln
983 0 : OStringBuffer sOut;
984 0 : OString aEndTags;
985 :
986 : // implizite Sprungmarke -> <A NAME=...></A>...<IMG ...>
987 0 : if( pMarkType && rFrmFmt.GetName().Len() )
988 0 : rHTMLWrt.OutImplicitMark( rFrmFmt.GetName(), pMarkType );
989 :
990 : // URL -> <A>...<IMG ... >...</A>
991 0 : const SvxMacroItem *pMacItem = 0;
992 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRMMACRO, sal_True, &pItem ))
993 0 : pMacItem = (const SvxMacroItem *)pItem;
994 :
995 0 : if( pURLItem || pMacItem )
996 : {
997 0 : String aMapURL;
998 0 : String aName;
999 0 : String aTarget;
1000 0 : if( pURLItem )
1001 : {
1002 0 : aMapURL = pURLItem->GetURL();
1003 0 : aName = pURLItem->GetName();
1004 0 : aTarget = pURLItem->GetTargetFrameName();
1005 : }
1006 0 : sal_Bool bEvents = pMacItem && !pMacItem->GetMacroTable().empty();
1007 :
1008 0 : if( aMapURL.Len() || aName.Len() || aTarget.Len() || bEvents )
1009 : {
1010 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_anchor);
1011 :
1012 : // Ein HREF nur Ausgaben, wenn es einen Link oder Makros gibt
1013 0 : if( aMapURL.Len() || bEvents )
1014 : {
1015 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_href).
1016 0 : append("=\"");
1017 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1018 0 : rHTMLWrt.OutHyperlinkHRefValue( aMapURL );
1019 0 : sOut.append('\"');
1020 : }
1021 :
1022 0 : if( aName.Len() )
1023 : {
1024 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_name).
1025 0 : append(RTL_CONSTASCII_STRINGPARAM("=\""));
1026 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1027 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aName,
1028 0 : rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1029 0 : sOut.append('\"');
1030 : }
1031 :
1032 0 : if( aTarget.Len() )
1033 : {
1034 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_target).
1035 0 : append(RTL_CONSTASCII_STRINGPARAM("=\""));
1036 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1037 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aTarget,
1038 0 : rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1039 0 : sOut.append('\"');
1040 : }
1041 :
1042 0 : if (!sOut.isEmpty())
1043 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1044 :
1045 0 : if( pMacItem )
1046 : {
1047 0 : const SvxMacroTableDtor& rMacTable = pMacItem->GetMacroTable();
1048 0 : if( !rMacTable.empty() )
1049 0 : HTMLOutFuncs::Out_Events( rWrt.Strm(), rMacTable,
1050 : aAnchorEventTable,
1051 : rHTMLWrt.bCfgStarBasic,
1052 : rHTMLWrt.eDestEnc,
1053 0 : &rHTMLWrt.aNonConvertableCharacters );
1054 : }
1055 :
1056 0 : rWrt.Strm() << ">";
1057 0 : aEndTags = OStringBuffer().append("</").
1058 0 : append(OOO_STRING_SVTOOLS_HTML_anchor).
1059 0 : append(RTL_CONSTASCII_STRINGPARAM(">")).append(aEndTags).
1060 0 : makeStringAndClear();
1061 0 : }
1062 : }
1063 :
1064 : // Umrandung -> <FONT COLOR = ...>...<IMG ... >...</FONT>
1065 0 : sal_uInt16 nBorderWidth = 0;
1066 0 : if( (nFrmOpts & HTML_FRMOPT_BORDER) &&
1067 0 : SFX_ITEM_SET == rItemSet.GetItemState( RES_BOX, sal_True, &pItem ))
1068 : {
1069 0 : Size aTwipBorder( 0, 0 );
1070 0 : const SvxBoxItem* pBoxItem = (const SvxBoxItem*)pItem;
1071 :
1072 0 : const ::editeng::SvxBorderLine *pColBorderLine = 0;
1073 0 : const ::editeng::SvxBorderLine *pBorderLine = pBoxItem->GetLeft();
1074 0 : if( pBorderLine )
1075 : {
1076 0 : pColBorderLine = pBorderLine;
1077 0 : aTwipBorder.Width() += pBorderLine->GetOutWidth();
1078 : }
1079 :
1080 0 : pBorderLine = pBoxItem->GetRight();
1081 0 : if( pBorderLine )
1082 : {
1083 0 : pColBorderLine = pBorderLine;
1084 0 : aTwipBorder.Width() += pBorderLine->GetOutWidth();
1085 : }
1086 :
1087 0 : pBorderLine = pBoxItem->GetTop();
1088 0 : if( pBorderLine )
1089 : {
1090 0 : pColBorderLine = pBorderLine;
1091 0 : aTwipBorder.Height() += pBorderLine->GetOutWidth();
1092 : }
1093 :
1094 0 : pBorderLine = pBoxItem->GetBottom();
1095 0 : if( pBorderLine )
1096 : {
1097 0 : pColBorderLine = pBorderLine;
1098 0 : aTwipBorder.Height() += pBorderLine->GetOutWidth();
1099 : }
1100 :
1101 0 : aTwipBorder.Width() /= 2;
1102 0 : aTwipBorder.Height() /= 2;
1103 :
1104 0 : if( (aTwipBorder.Width() || aTwipBorder.Height()) &&
1105 0 : Application::GetDefaultDevice() )
1106 : {
1107 : Size aPixelBorder =
1108 : Application::GetDefaultDevice()->LogicToPixel( aTwipBorder,
1109 0 : MapMode(MAP_TWIP) );
1110 0 : if( !aPixelBorder.Width() && aTwipBorder.Width() )
1111 0 : aPixelBorder.Width() = 1;
1112 0 : if( !aPixelBorder.Height() && aTwipBorder.Height() )
1113 0 : aPixelBorder.Height() = 1;
1114 :
1115 0 : if( aPixelBorder.Width() )
1116 0 : aPixelBorder.Height() = 0;
1117 :
1118 : nBorderWidth =
1119 0 : (sal_uInt16)(aPixelBorder.Width() + aPixelBorder.Height());
1120 : }
1121 :
1122 0 : if( pColBorderLine )
1123 : {
1124 0 : sOut.append('<');
1125 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_font).append(' ').
1126 0 : append(OOO_STRING_SVTOOLS_HTML_O_color).append('=');
1127 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1128 0 : HTMLOutFuncs::Out_Color( rWrt.Strm(),
1129 0 : pColBorderLine->GetColor(), rHTMLWrt.eDestEnc ) << '>';
1130 :
1131 0 : aEndTags = OStringBuffer().
1132 0 : append(RTL_CONSTASCII_STRINGPARAM("</")).
1133 0 : append(OOO_STRING_SVTOOLS_HTML_font).
1134 0 : append('>').append(aEndTags).makeStringAndClear();
1135 : }
1136 : }
1137 :
1138 0 : sOut.append('<');
1139 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_image).append(' ').
1140 0 : append(OOO_STRING_SVTOOLS_HTML_O_src).
1141 0 : append(RTL_CONSTASCII_STRINGPARAM("=\""));
1142 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1143 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aGrfNm, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
1144 :
1145 : // Events
1146 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( RES_FRMMACRO, sal_True, &pItem ))
1147 : {
1148 : const SvxMacroTableDtor& rMacTable =
1149 0 : ((const SvxMacroItem *)pItem)->GetMacroTable();
1150 0 : if( !rMacTable.empty() )
1151 0 : HTMLOutFuncs::Out_Events( rWrt.Strm(), rMacTable, aImageEventTable,
1152 : rHTMLWrt.bCfgStarBasic, rHTMLWrt.eDestEnc,
1153 0 : &rHTMLWrt.aNonConvertableCharacters );
1154 : }
1155 :
1156 : // ALT, ALIGN, WIDTH, HEIGHT, HSPACE, VSPACE
1157 0 : aEndTags = rHTMLWrt.OutFrmFmtOptions( rFrmFmt, rAlternateTxt, nFrmOpts, aEndTags );
1158 0 : if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) )
1159 0 : rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmOpts );
1160 :
1161 :
1162 0 : if( nFrmOpts & HTML_FRMOPT_BORDER )
1163 : {
1164 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_border).
1165 0 : append('=').append(static_cast<sal_Int32>(nBorderWidth));
1166 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1167 : }
1168 :
1169 0 : if( pURLItem && pURLItem->IsServerMap() )
1170 : {
1171 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_ismap);
1172 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1173 : }
1174 0 : if( aIMapName.Len() )
1175 : {
1176 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_usemap).
1177 0 : append(RTL_CONSTASCII_STRINGPARAM("=\"#"));
1178 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1179 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), aIMapName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
1180 : }
1181 :
1182 0 : rHTMLWrt.Strm() << '>';
1183 :
1184 0 : if( !aEndTags.isEmpty() )
1185 0 : rWrt.Strm() << aEndTags.getStr();
1186 :
1187 0 : if( !rHTMLWrt.aINetFmts.empty() )
1188 : {
1189 : // es ist noch ein Attribut auf dem Stack, das wieder geoeffnet
1190 : // werden muss
1191 0 : SwFmtINetFmt *pINetFmt = rHTMLWrt.aINetFmts.back();
1192 0 : OutHTML_INetFmt( rWrt, *pINetFmt, sal_True );
1193 : }
1194 :
1195 0 : return rHTMLWrt;
1196 : }
1197 :
1198 0 : Writer& OutHTML_BulletImage( Writer& rWrt,
1199 : const sal_Char *pTag,
1200 : const SvxBrushItem* pBrush,
1201 : String &rGrfName,
1202 : const Size &rSize,
1203 : const SwFmtVertOrient* pVertOrient )
1204 : {
1205 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1206 :
1207 : // Wenn es ein BrushItem gibt, muss die Grafiknoch exportiert werden
1208 0 : const String *pLink = 0;
1209 0 : if( pBrush )
1210 : {
1211 0 : pLink = pBrush->GetGraphicLink();
1212 :
1213 : // embeddete Grafik -> WriteEmbedded schreiben
1214 0 : if( !pLink )
1215 : {
1216 0 : const Graphic* pGrf = pBrush->GetGraphic();
1217 0 : if( pGrf )
1218 : {
1219 : // Grafik als (JPG-)File speichern
1220 0 : if( rHTMLWrt.GetOrigFileName() )
1221 0 : rGrfName = *rHTMLWrt.GetOrigFileName();
1222 : sal_uInt16 nErr = XOutBitmap::WriteGraphic( *pGrf, rGrfName,
1223 : OUString("JPG"),
1224 : (XOUTBMP_USE_GIF_IF_SENSIBLE |
1225 0 : XOUTBMP_USE_NATIVE_IF_POSSIBLE));
1226 0 : if( !nErr )
1227 : {
1228 0 : rGrfName = URIHelper::SmartRel2Abs(
1229 0 : INetURLObject( rWrt.GetBaseURL() ), rGrfName,
1230 0 : URIHelper::GetMaybeFileHdl() );
1231 0 : pLink = &rGrfName;
1232 : }
1233 : else
1234 : {
1235 0 : rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
1236 : }
1237 : }
1238 : }
1239 : else
1240 : {
1241 0 : rGrfName = *pLink;
1242 0 : if( rHTMLWrt.bCfgCpyLinkedGrfs )
1243 : {
1244 0 : rHTMLWrt.CopyLocalFileToINet( rGrfName );
1245 0 : pLink = &rGrfName;
1246 : }
1247 : }
1248 : }
1249 : else
1250 : {
1251 0 : pLink = &rGrfName;
1252 : }
1253 :
1254 0 : OStringBuffer sOut;
1255 0 : if( pTag )
1256 0 : sOut.append('<').append(pTag);
1257 :
1258 0 : if( pLink )
1259 : {
1260 0 : sOut.append(' ');
1261 0 : String s( *pLink );
1262 0 : if( !HTMLOutFuncs::PrivateURLToInternalImg(s) )
1263 0 : s = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(), s);
1264 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_O_src).
1265 0 : append(RTL_CONSTASCII_STRINGPARAM("=\""));
1266 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1267 0 : HTMLOutFuncs::Out_String( rWrt.Strm(), s, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1268 0 : sOut.append('\"');
1269 :
1270 : // Groesse des Objekts Twips ohne Raender
1271 0 : Size aPixelSz( 0, 0 );
1272 0 : if( (rSize.Width() || rSize.Height()) && Application::GetDefaultDevice() )
1273 : {
1274 : aPixelSz =
1275 : Application::GetDefaultDevice()->LogicToPixel( rSize,
1276 0 : MapMode(MAP_TWIP) );
1277 0 : if( !aPixelSz.Width() && rSize.Width() )
1278 0 : aPixelSz.Width() = 1;
1279 0 : if( !aPixelSz.Height() && rSize.Height() )
1280 0 : aPixelSz.Height() = 1;
1281 : }
1282 :
1283 0 : if( aPixelSz.Width() )
1284 : {
1285 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_width).
1286 0 : append('=').append(static_cast<sal_Int32>(aPixelSz.Width()));
1287 : }
1288 :
1289 0 : if( aPixelSz.Height() )
1290 : {
1291 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_height).
1292 0 : append('=').append(static_cast<sal_Int32>(aPixelSz.Height()));
1293 : }
1294 :
1295 0 : if( pVertOrient )
1296 : {
1297 0 : const sal_Char *pStr = 0;
1298 0 : switch( pVertOrient->GetVertOrient() )
1299 : {
1300 0 : case text::VertOrientation::LINE_TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_top; break;
1301 : case text::VertOrientation::CHAR_TOP:
1302 0 : case text::VertOrientation::BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_texttop; break; // geht nicht
1303 : case text::VertOrientation::LINE_CENTER:
1304 0 : case text::VertOrientation::CHAR_CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_absmiddle; break; // geht nicht
1305 0 : case text::VertOrientation::CENTER: pStr = OOO_STRING_SVTOOLS_HTML_VA_middle; break;
1306 : case text::VertOrientation::LINE_BOTTOM:
1307 0 : case text::VertOrientation::CHAR_BOTTOM: pStr = OOO_STRING_SVTOOLS_HTML_VA_absbottom; break; // geht nicht
1308 0 : case text::VertOrientation::TOP: pStr = OOO_STRING_SVTOOLS_HTML_VA_bottom; break;
1309 0 : case text::VertOrientation::NONE: break;
1310 : }
1311 0 : if( pStr )
1312 : {
1313 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_align).
1314 0 : append('=').append(pStr);
1315 : }
1316 0 : }
1317 : }
1318 :
1319 0 : if (pTag)
1320 0 : sOut.append('>');
1321 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1322 :
1323 0 : return rWrt;
1324 : }
1325 :
1326 :
1327 : //-----------------------------------------------------------------------
1328 :
1329 0 : static Writer& OutHTML_FrmFmtTableNode( Writer& rWrt, const SwFrmFmt& rFrmFmt )
1330 : {
1331 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1332 :
1333 0 : const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
1334 0 : sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
1335 0 : sal_uLong nEnd = rHTMLWrt.pDoc->GetNodes()[nStt-1]->EndOfSectionIndex();
1336 :
1337 0 : String aCaption;
1338 0 : sal_Bool bTopCaption = sal_False;
1339 :
1340 : // Nicht const, weil GetTable spater mal nicht const ist
1341 0 : SwNode *pNd = rHTMLWrt.pDoc->GetNodes()[ nStt ];
1342 0 : SwTableNode *pTblNd = pNd->GetTableNode();
1343 0 : const SwTxtNode *pTxtNd = pNd->GetTxtNode();
1344 0 : if( !pTblNd && pTxtNd )
1345 : {
1346 : // Tabelle mit Ueberschrift
1347 0 : bTopCaption = sal_True;
1348 0 : pTblNd = rHTMLWrt.pDoc->GetNodes()[nStt+1]->GetTableNode();
1349 : }
1350 : OSL_ENSURE( pTblNd, "Rahmen enthaelt keine Tabelle" );
1351 0 : if( pTblNd )
1352 : {
1353 0 : sal_uLong nTblEnd = pTblNd->EndOfSectionIndex();
1354 : OSL_ENSURE( nTblEnd == nEnd - 1 ||
1355 : (nTblEnd == nEnd - 2 && !bTopCaption),
1356 : "Ungeuelter Rahmen-Inhalt fuer Tabelle" );
1357 :
1358 0 : if( nTblEnd == nEnd - 2 )
1359 0 : pTxtNd = rHTMLWrt.pDoc->GetNodes()[nTblEnd+1]->GetTxtNode();
1360 : }
1361 0 : if( pTxtNd )
1362 0 : aCaption = pTxtNd->GetTxt();
1363 :
1364 : {
1365 0 : HTMLSaveData aSaveData( rHTMLWrt, pTblNd->GetIndex()+1,
1366 : pTblNd->EndOfSectionIndex(),
1367 0 : sal_True, &rFrmFmt );
1368 0 : rHTMLWrt.bOutFlyFrame = sal_True;
1369 : OutHTML_SwTblNode( rHTMLWrt, *pTblNd, &rFrmFmt, &aCaption,
1370 0 : bTopCaption );
1371 : }
1372 :
1373 0 : return rWrt;
1374 : }
1375 :
1376 0 : static Writer & OutHTML_FrmFmtAsMulticol( Writer& rWrt,
1377 : const SwFrmFmt& rFrmFmt,
1378 : sal_Bool bInCntnr )
1379 : {
1380 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1381 :
1382 0 : rHTMLWrt.ChangeParaToken( 0 );
1383 :
1384 : // Die aktulle <DL> beenden!
1385 0 : rHTMLWrt.OutAndSetDefList( 0 );
1386 :
1387 : // als Multicol ausgeben
1388 0 : if( rHTMLWrt.bLFPossible )
1389 0 : rHTMLWrt.OutNewLine();
1390 :
1391 0 : OStringBuffer sOut;
1392 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_multicol);
1393 :
1394 0 : const SwFmtCol& rFmtCol = rFrmFmt.GetCol();
1395 :
1396 : // die Anzahl der Spalten als COLS ausgeben
1397 0 : sal_uInt16 nCols = rFmtCol.GetNumCols();
1398 0 : if( nCols )
1399 : {
1400 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_cols).
1401 0 : append('=').append(static_cast<sal_Int32>(nCols));
1402 : }
1403 :
1404 : // die Gutter-Breite (Minimalwert) als GUTTER
1405 0 : sal_uInt16 nGutter = rFmtCol.GetGutterWidth( sal_True );
1406 0 : if( nGutter!=USHRT_MAX )
1407 : {
1408 0 : if( nGutter && Application::GetDefaultDevice() )
1409 : {
1410 : nGutter = (sal_uInt16)Application::GetDefaultDevice()
1411 : ->LogicToPixel( Size(nGutter,0),
1412 0 : MapMode(MAP_TWIP) ).Width();
1413 : }
1414 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_gutter).
1415 0 : append('=').append(static_cast<sal_Int32>(nGutter));
1416 : }
1417 :
1418 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1419 :
1420 : // WIDTH
1421 : sal_uLong nFrmFlags = bInCntnr ? HTML_FRMOPTS_MULTICOL_CNTNR
1422 0 : : HTML_FRMOPTS_MULTICOL;
1423 0 : if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
1424 0 : nFrmFlags |= HTML_FRMOPTS_MULTICOL_CSS1;
1425 0 : rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, nFrmFlags );
1426 0 : if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
1427 0 : rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );
1428 :
1429 0 : rWrt.Strm() << '>';
1430 :
1431 0 : rHTMLWrt.bLFPossible = sal_True;
1432 0 : rHTMLWrt.IncIndentLevel(); // den Inhalt von Multicol einruecken;
1433 :
1434 0 : const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
1435 0 : sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
1436 0 : const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
1437 : OSL_ENSURE( pSttNd, "Wo ist der Start-Node" );
1438 :
1439 : {
1440 : // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
1441 : // wieder hergestellt wird.
1442 : HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
1443 : pSttNd->EndOfSectionIndex(),
1444 0 : sal_True, &rFrmFmt );
1445 0 : rHTMLWrt.bOutFlyFrame = sal_True;
1446 0 : rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
1447 : }
1448 :
1449 0 : rHTMLWrt.DecIndentLevel(); // den Inhalt von Multicol einruecken;
1450 0 : if( rHTMLWrt.bLFPossible )
1451 0 : rHTMLWrt.OutNewLine();
1452 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_multicol, sal_False );
1453 0 : rHTMLWrt.bLFPossible = sal_True;
1454 :
1455 0 : return rWrt;
1456 : }
1457 :
1458 0 : static Writer& OutHTML_FrmFmtAsSpacer( Writer& rWrt, const SwFrmFmt& rFrmFmt )
1459 : {
1460 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1461 :
1462 : // wenn meoglich vor der Grafik einen Zeilen-Umbruch ausgeben
1463 0 : if( rHTMLWrt.bLFPossible )
1464 0 : rHTMLWrt.OutNewLine( sal_True );
1465 :
1466 0 : OStringBuffer sOut;
1467 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_spacer).append(' ')
1468 0 : .append(OOO_STRING_SVTOOLS_HTML_O_type).append('=')
1469 0 : .append(OOO_STRING_SVTOOLS_HTML_SPTYPE_block);
1470 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1471 :
1472 : // ALIGN, WIDTH, HEIGHT
1473 0 : OString aEndTags = rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, HTML_FRMOPTS_SPACER );
1474 :
1475 0 : rWrt.Strm() << '>';
1476 0 : if( !aEndTags.isEmpty() )
1477 0 : rWrt.Strm() << aEndTags.getStr();
1478 :
1479 0 : return rWrt;
1480 : }
1481 :
1482 0 : static Writer& OutHTML_FrmFmtAsDivOrSpan( Writer& rWrt,
1483 : const SwFrmFmt& rFrmFmt, sal_Bool bSpan)
1484 : {
1485 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1486 :
1487 0 : const sal_Char *pStr = 0;
1488 0 : if( !bSpan )
1489 : {
1490 0 : rHTMLWrt.ChangeParaToken( 0 );
1491 :
1492 : // Die aktulle <DL> beenden!
1493 0 : rHTMLWrt.OutAndSetDefList( 0 );
1494 0 : pStr = OOO_STRING_SVTOOLS_HTML_division;
1495 : }
1496 : else
1497 0 : pStr = OOO_STRING_SVTOOLS_HTML_span;
1498 :
1499 : // als DIV ausgeben
1500 0 : if( rHTMLWrt.bLFPossible )
1501 0 : rHTMLWrt.OutNewLine();
1502 :
1503 0 : OStringBuffer sOut;
1504 0 : sOut.append('<').append(pStr);
1505 :
1506 0 : rWrt.Strm() << sOut.makeStringAndClear().getStr();
1507 0 : sal_uLong nFrmFlags = HTML_FRMOPTS_DIV;
1508 0 : if( rHTMLWrt.IsHTMLMode( HTMLMODE_BORDER_NONE ) )
1509 0 : nFrmFlags |= HTML_FRMOPT_S_NOBORDER;
1510 0 : OString aEndTags = rHTMLWrt.OutFrmFmtOptions( rFrmFmt, aEmptyStr, nFrmFlags );
1511 0 : rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmFlags );
1512 0 : rWrt.Strm() << '>';
1513 :
1514 0 : rHTMLWrt.IncIndentLevel(); // den Inhalt einruecken
1515 0 : rHTMLWrt.bLFPossible = sal_True;
1516 :
1517 0 : const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
1518 0 : sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
1519 :
1520 : // Am Start-Node verankerte Rahmen-gebundene Rahmen ausgeben
1521 0 : rHTMLWrt.OutFlyFrm( nStt, 0, HTML_POS_ANY );
1522 :
1523 0 : const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
1524 : OSL_ENSURE( pSttNd, "Wo ist der Start-Node" );
1525 :
1526 : {
1527 : // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
1528 : // wieder hergestellt wird.
1529 : HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
1530 : pSttNd->EndOfSectionIndex(),
1531 0 : sal_True, &rFrmFmt );
1532 0 : rHTMLWrt.bOutFlyFrame = sal_True;
1533 0 : rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
1534 : }
1535 :
1536 0 : rHTMLWrt.DecIndentLevel(); // den Inhalt von Multicol einruecken;
1537 0 : if( rHTMLWrt.bLFPossible )
1538 0 : rHTMLWrt.OutNewLine();
1539 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), pStr, sal_False );
1540 :
1541 0 : if( !aEndTags.isEmpty() )
1542 0 : rWrt.Strm() << aEndTags.getStr();
1543 :
1544 0 : return rWrt;
1545 : }
1546 :
1547 0 : static Writer & OutHTML_FrmFmtAsImage( Writer& rWrt, const SwFrmFmt& rFrmFmt,
1548 : sal_Bool /*bInCntnr*/ )
1549 : {
1550 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1551 :
1552 0 : ImageMap aIMap;
1553 0 : Graphic aGrf( ((SwFrmFmt &)rFrmFmt).MakeGraphic( &aIMap ) );
1554 :
1555 0 : String aGrfNm;
1556 0 : if( rHTMLWrt.GetOrigFileName() )
1557 0 : aGrfNm = *rHTMLWrt.GetOrigFileName();
1558 0 : if( aGrf.GetType() == GRAPHIC_NONE ||
1559 : XOutBitmap::WriteGraphic( aGrf, aGrfNm,
1560 : OUString("JPG"),
1561 : (XOUTBMP_USE_GIF_IF_POSSIBLE|
1562 0 : XOUTBMP_USE_NATIVE_IF_POSSIBLE) ) != 0 )
1563 : {
1564 : // leer oder fehlerhaft, da ist nichts auszugeben
1565 0 : rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
1566 0 : return rWrt;
1567 : }
1568 :
1569 0 : aGrfNm = URIHelper::SmartRel2Abs(
1570 0 : INetURLObject(rWrt.GetBaseURL()), aGrfNm,
1571 0 : URIHelper::GetMaybeFileHdl() );
1572 0 : Size aSz( 0, 0 );
1573 0 : OutHTML_Image( rWrt, rFrmFmt, aGrfNm, rFrmFmt.GetName(), aSz,
1574 : HTML_FRMOPTS_GENIMG, pMarkToFrame,
1575 0 : aIMap.GetIMapObjectCount() ? &aIMap : 0 );
1576 0 : return rWrt;
1577 : }
1578 :
1579 :
1580 0 : static Writer& OutHTML_FrmFmtGrfNode( Writer& rWrt, const SwFrmFmt& rFrmFmt,
1581 : sal_Bool bInCntnr )
1582 : {
1583 0 : SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1584 :
1585 0 : const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
1586 0 : sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
1587 0 : SwGrfNode *pGrfNd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetGrfNode();
1588 : OSL_ENSURE( pGrfNd, "Grf-Node erwartet" );
1589 0 : if( !pGrfNd )
1590 0 : return rWrt;
1591 :
1592 0 : const SwMirrorGrf& rMirror = pGrfNd->GetSwAttrSet().GetMirrorGrf();
1593 :
1594 0 : String aGrfNm;
1595 0 : if( !pGrfNd->IsLinkedFile() || RES_MIRROR_GRAPH_DONT != rMirror.GetValue() )
1596 : {
1597 : // Grafik als File-Referenz speichern (als JPEG-Grafik speichern)
1598 0 : if( rHTMLWrt.GetOrigFileName() )
1599 0 : aGrfNm = *rHTMLWrt.GetOrigFileName();
1600 0 : pGrfNd->SwapIn( sal_True );
1601 :
1602 : sal_uLong nFlags = XOUTBMP_USE_GIF_IF_SENSIBLE |
1603 0 : XOUTBMP_USE_NATIVE_IF_POSSIBLE;
1604 0 : switch( rMirror.GetValue() )
1605 : {
1606 0 : case RES_MIRROR_GRAPH_VERT: nFlags = XOUTBMP_MIRROR_HORZ; break;
1607 0 : case RES_MIRROR_GRAPH_HOR: nFlags = XOUTBMP_MIRROR_VERT; break;
1608 : case RES_MIRROR_GRAPH_BOTH:
1609 0 : nFlags = XOUTBMP_MIRROR_VERT | XOUTBMP_MIRROR_HORZ;
1610 0 : break;
1611 : }
1612 :
1613 0 : Size aMM100Size;
1614 0 : const SwFmtFrmSize& rSize = rFrmFmt.GetFrmSize();
1615 0 : aMM100Size = OutputDevice::LogicToLogic( rSize.GetSize(),
1616 0 : MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ));
1617 :
1618 0 : sal_uInt16 nErr = XOutBitmap::WriteGraphic( pGrfNd->GetGrf(), aGrfNm,
1619 0 : OUString("JPG"), nFlags, &aMM100Size );
1620 0 : if( nErr ) // fehlerhaft, da ist nichts auszugeben
1621 : {
1622 0 : rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
1623 0 : return rWrt;
1624 : }
1625 0 : aGrfNm = URIHelper::SmartRel2Abs(
1626 0 : INetURLObject(rWrt.GetBaseURL()), aGrfNm,
1627 0 : URIHelper::GetMaybeFileHdl() );
1628 : }
1629 : else
1630 : {
1631 0 : pGrfNd->GetFileFilterNms( &aGrfNm, 0 );
1632 0 : if( rHTMLWrt.bCfgCpyLinkedGrfs )
1633 0 : rWrt.CopyLocalFileToINet( aGrfNm );
1634 : }
1635 :
1636 0 : sal_uLong nFrmFlags = bInCntnr ? HTML_FRMOPTS_IMG_CNTNR : HTML_FRMOPTS_IMG;
1637 0 : if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bInCntnr )
1638 0 : nFrmFlags |= HTML_FRMOPTS_IMG_CSS1;
1639 : OutHTML_Image( rWrt, rFrmFmt, aGrfNm, pGrfNd->GetTitle(),
1640 0 : pGrfNd->GetTwipSize(), nFrmFlags, pMarkToGraphic );
1641 :
1642 0 : return rWrt;
1643 : }
1644 :
1645 :
1646 0 : static Writer& OutHTML_FrmFmtAsMarquee( Writer& rWrt, const SwFrmFmt& rFrmFmt,
1647 : const SdrObject& rSdrObj )
1648 : {
1649 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1650 :
1651 : // die Edit-Engine-Attribute des Objekts als SW-Attribute holen
1652 : // und als Hints einsortieren
1653 0 : const SfxItemSet& rFmtItemSet = rFrmFmt.GetAttrSet();
1654 0 : SfxItemSet aItemSet( *rFmtItemSet.GetPool(), RES_CHRATR_BEGIN,
1655 0 : RES_CHRATR_END );
1656 0 : SwHTMLWriter::GetEEAttrsFromDrwObj( aItemSet, &rSdrObj, sal_True );
1657 0 : sal_Bool bCfgOutStylesOld = rHTMLWrt.bCfgOutStyles;
1658 0 : rHTMLWrt.bCfgOutStyles = sal_False;
1659 0 : rHTMLWrt.bTxtAttr = sal_True;
1660 0 : rHTMLWrt.bTagOn = sal_True;
1661 0 : Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, sal_False );
1662 0 : rHTMLWrt.bTxtAttr = sal_False;
1663 :
1664 : OutHTML_DrawFrmFmtAsMarquee( rHTMLWrt,
1665 : (const SwDrawFrmFmt &)rFrmFmt,
1666 0 : rSdrObj );
1667 0 : rHTMLWrt.bTxtAttr = sal_True;
1668 0 : rHTMLWrt.bTagOn = sal_False;
1669 0 : Out_SfxItemSet( aHTMLAttrFnTab, rWrt, aItemSet, sal_False );
1670 0 : rHTMLWrt.bTxtAttr = sal_False;
1671 0 : rHTMLWrt.bCfgOutStyles = bCfgOutStylesOld;
1672 :
1673 0 : return rWrt;
1674 : }
1675 :
1676 : //-----------------------------------------------------------------------
1677 :
1678 0 : Writer& OutHTML_HeaderFooter( Writer& rWrt, const SwFrmFmt& rFrmFmt,
1679 : sal_Bool bHeader )
1680 : {
1681 0 : SwHTMLWriter & rHTMLWrt = (SwHTMLWriter&)rWrt;
1682 :
1683 : // als Multicol ausgeben
1684 0 : rHTMLWrt.OutNewLine();
1685 0 : OStringBuffer sOut;
1686 0 : sOut.append(OOO_STRING_SVTOOLS_HTML_division).append(' ')
1687 0 : .append(OOO_STRING_SVTOOLS_HTML_O_type).append('=')
1688 0 : .append(bHeader ? "HEADER" : "FOOTER");
1689 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), sOut.makeStringAndClear().getStr() );
1690 :
1691 0 : rHTMLWrt.IncIndentLevel(); // den Inhalt von Multicol einruecken;
1692 :
1693 : // Einen Spacer fuer den Absatnd zusammenbasteln. Da durch das
1694 : // <DL> bzw. </DL> immer einer Absatz-Abstand entsteht, wird der
1695 : // ggf. abgezogen.
1696 0 : const SvxULSpaceItem& rULSpace = rFrmFmt.GetULSpace();
1697 0 : sal_uInt16 nSize = bHeader ? rULSpace.GetLower() : rULSpace.GetUpper();
1698 0 : rHTMLWrt.nHeaderFooterSpace = nSize;
1699 :
1700 0 : OString aSpacer;
1701 0 : if( rHTMLWrt.IsHTMLMode(HTMLMODE_VERT_SPACER) &&
1702 0 : nSize > HTML_PARSPACE && Application::GetDefaultDevice() )
1703 : {
1704 0 : nSize -= HTML_PARSPACE;
1705 : nSize = (sal_Int16)Application::GetDefaultDevice()
1706 0 : ->LogicToPixel( Size(nSize,0), MapMode(MAP_TWIP) ).Width();
1707 :
1708 0 : aSpacer = OStringBuffer(OOO_STRING_SVTOOLS_HTML_spacer).
1709 0 : append(' ').append(OOO_STRING_SVTOOLS_HTML_O_type).
1710 0 : append('=').append(OOO_STRING_SVTOOLS_HTML_SPTYPE_vertical).
1711 0 : append(' ').append(OOO_STRING_SVTOOLS_HTML_O_size).
1712 0 : append('=').append(static_cast<sal_Int32>(nSize)).
1713 0 : makeStringAndClear();
1714 : }
1715 :
1716 0 : const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
1717 0 : sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex();
1718 0 : const SwStartNode* pSttNd = rWrt.pDoc->GetNodes()[nStt]->GetStartNode();
1719 : OSL_ENSURE( pSttNd, "Wo ist der Start-Node" );
1720 :
1721 0 : if( !bHeader && !aSpacer.isEmpty() )
1722 : {
1723 0 : rHTMLWrt.OutNewLine();
1724 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.getStr() );
1725 : }
1726 :
1727 : {
1728 : // in einem Block damit rechtzeitig vor dem Ende der alte Zustand
1729 : // wieder hergestellt wird. pFlyFmt braucht hier nicht gestzt zu
1730 : // werden, denn PageDesc-Attribute koennen hier nicht vorkommen
1731 : HTMLSaveData aSaveData( rHTMLWrt, nStt+1,
1732 0 : pSttNd->EndOfSectionIndex() );
1733 :
1734 0 : if( bHeader )
1735 0 : rHTMLWrt.bOutHeader = sal_True;
1736 : else
1737 0 : rHTMLWrt.bOutFooter = sal_True;
1738 :
1739 0 : rHTMLWrt.Out_SwDoc( rWrt.pCurPam );
1740 : }
1741 :
1742 0 : if( bHeader && !aSpacer.isEmpty() )
1743 : {
1744 0 : rHTMLWrt.OutNewLine();
1745 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), aSpacer.getStr() );
1746 : }
1747 :
1748 0 : rHTMLWrt.DecIndentLevel(); // den Inhalt von Multicol einruecken;
1749 0 : rHTMLWrt.OutNewLine();
1750 0 : HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_division, sal_False );
1751 :
1752 0 : rHTMLWrt.nHeaderFooterSpace = 0;
1753 :
1754 0 : return rWrt;
1755 : }
1756 :
1757 :
1758 0 : void SwHTMLWriter::AddLinkTarget( const String& rURL )
1759 : {
1760 0 : if( !rURL.Len() || rURL.GetChar(0) != '#' )
1761 0 : return;
1762 :
1763 : // There might be a '|' as delimiter (if the link has been inserted
1764 : // freshly) or a '%7c' or a '%7C' if the document has been saved and
1765 : // loaded already.
1766 0 : xub_StrLen nPos = rURL.Len();
1767 0 : sal_Bool bFound = sal_False, bEncoded = sal_False;
1768 0 : while( !bFound && nPos > 0 )
1769 : {
1770 0 : sal_Unicode c = rURL.GetChar( --nPos );
1771 0 : switch( c )
1772 : {
1773 : case cMarkSeparator:
1774 0 : bFound = sal_True;
1775 0 : break;
1776 : case '%':
1777 0 : bFound = (rURL.Len() - nPos) >=3 &&
1778 0 : rURL.GetChar( nPos+1 ) == '7' &&
1779 0 : ((c =rURL.GetChar( nPos+2 )) == 'C' || c == 'c');
1780 0 : if( bFound )
1781 0 : bEncoded = sal_True;
1782 : }
1783 : }
1784 0 : if( !bFound || nPos < 2 ) // mindetsens "#a|..."
1785 0 : return;
1786 :
1787 0 : String aURL( rURL.Copy( 1 ) );
1788 :
1789 : // nPos-1+1/3 (-1 wg. Erase)
1790 : String sCmp(comphelper::string::remove(aURL.Copy(bEncoded ? nPos+2 : nPos),
1791 0 : ' '));
1792 0 : if( !sCmp.Len() )
1793 0 : return;
1794 :
1795 0 : sCmp.ToLowerAscii();
1796 :
1797 0 : if( sCmp.EqualsAscii( pMarkToRegion ) ||
1798 0 : sCmp.EqualsAscii( pMarkToFrame ) ||
1799 0 : sCmp.EqualsAscii( pMarkToGraphic ) ||
1800 0 : sCmp.EqualsAscii( pMarkToOLE ) ||
1801 0 : sCmp.EqualsAscii( pMarkToTable ) )
1802 : {
1803 : // Einfach nur in einem sortierten Array merken
1804 0 : if( bEncoded )
1805 : {
1806 0 : aURL.Erase( nPos, 2 );
1807 0 : aURL.SetChar( nPos-1, cMarkSeparator );
1808 : }
1809 0 : aImplicitMarks.insert( aURL );
1810 : }
1811 0 : else if( sCmp.EqualsAscii( pMarkToOutline ) )
1812 : {
1813 : // Hier brauchen wir Position und Name. Deshalb sortieren wir
1814 : // ein sal_uInt16 und ein String-Array selbst
1815 0 : String aOutline( aURL.Copy( 0, nPos-1 ) );
1816 0 : SwPosition aPos( *pCurPam->GetPoint() );
1817 0 : if( pDoc->GotoOutline( aPos, aOutline ) )
1818 : {
1819 0 : sal_uInt32 nIdx = aPos.nNode.GetIndex();
1820 :
1821 0 : sal_uInt32 nIns=0;
1822 0 : while( nIns < aOutlineMarkPoss.size() &&
1823 0 : aOutlineMarkPoss[nIns] < nIdx )
1824 0 : nIns++;
1825 :
1826 0 : aOutlineMarkPoss.insert( aOutlineMarkPoss.begin()+nIns, nIdx );
1827 0 : if( bEncoded )
1828 : {
1829 0 : aURL.Erase( nPos, 2 );
1830 0 : aURL.SetChar( nPos-1, cMarkSeparator );
1831 : }
1832 0 : aOutlineMarks.insert( aOutlineMarks.begin()+nIns, new String( aURL ) );
1833 0 : }
1834 : }
1835 0 : else if( sCmp.EqualsAscii( pMarkToText ) )
1836 : {
1837 : //
1838 0 : }
1839 : }
1840 :
1841 2 : void SwHTMLWriter::CollectLinkTargets()
1842 : {
1843 : const SwFmtINetFmt* pINetFmt;
1844 : const SwTxtINetFmt* pTxtAttr;
1845 : const SwTxtNode* pTxtNd;
1846 :
1847 2 : sal_uInt32 n, nMaxItems = pDoc->GetAttrPool().GetItemCount2( RES_TXTATR_INETFMT );
1848 2 : for( n = 0; n < nMaxItems; ++n )
1849 : {
1850 0 : if( 0 != (pINetFmt = (SwFmtINetFmt*)pDoc->GetAttrPool().GetItem2(
1851 0 : RES_TXTATR_INETFMT, n ) ) &&
1852 0 : 0 != ( pTxtAttr = pINetFmt->GetTxtINetFmt()) &&
1853 0 : 0 != ( pTxtNd = pTxtAttr->GetpTxtNode() ) &&
1854 0 : pTxtNd->GetNodes().IsDocNodes() )
1855 : {
1856 0 : AddLinkTarget( pINetFmt->GetValue() );
1857 : }
1858 : }
1859 :
1860 : const SwFmtURL *pURL;
1861 2 : nMaxItems = pDoc->GetAttrPool().GetItemCount2( RES_URL );
1862 2 : for( n = 0; n < nMaxItems; ++n )
1863 : {
1864 0 : if( 0 != (pURL = (SwFmtURL*)pDoc->GetAttrPool().GetItem2(
1865 0 : RES_URL, n ) ) )
1866 : {
1867 0 : AddLinkTarget( pURL->GetURL() );
1868 0 : const ImageMap *pIMap = pURL->GetMap();
1869 0 : if( pIMap )
1870 : {
1871 0 : for( sal_uInt16 i=0; i<pIMap->GetIMapObjectCount(); i++ )
1872 : {
1873 0 : const IMapObject* pObj = pIMap->GetIMapObject( i );
1874 0 : if( pObj )
1875 : {
1876 0 : AddLinkTarget( pObj->GetURL() );
1877 : }
1878 : }
1879 : }
1880 : }
1881 : }
1882 2 : }
1883 :
1884 : //-----------------------------------------------------------------------
1885 :
1886 0 : SwHTMLPosFlyFrm::SwHTMLPosFlyFrm( const SwPosFlyFrm& rPosFly,
1887 : const SdrObject *pSdrObj,
1888 : sal_uInt8 nOutMode ) :
1889 0 : pFrmFmt( &rPosFly.GetFmt() ),
1890 : pSdrObject( pSdrObj ),
1891 0 : pNdIdx( new SwNodeIndex( rPosFly.GetNdIndex() ) ),
1892 0 : nOrdNum( rPosFly.GetOrdNum() ),
1893 : nCntntIdx( 0 ),
1894 0 : nOutputMode( nOutMode )
1895 : {
1896 0 : const SwFmtAnchor& rAnchor = rPosFly.GetFmt().GetAnchor();
1897 0 : if ((FLY_AT_CHAR == rAnchor.GetAnchorId()) &&
1898 0 : HTML_POS_INSIDE == GetOutPos() )
1899 : {
1900 : // Auto-gebundene Rahmen werden ein Zeichen weiter hinten
1901 : // ausgegeben, weil dann die Positionierung mit Netscape
1902 : // uebereinstimmt.
1903 : OSL_ENSURE( rAnchor.GetCntntAnchor(), "Keine Anker-Position?" );
1904 0 : if( rAnchor.GetCntntAnchor() )
1905 : {
1906 0 : nCntntIdx = rAnchor.GetCntntAnchor()->nContent.GetIndex();
1907 0 : sal_Int16 eHoriRel = rPosFly.GetFmt().GetHoriOrient().
1908 0 : GetRelationOrient();
1909 0 : if( text::RelOrientation::FRAME == eHoriRel || text::RelOrientation::PRINT_AREA == eHoriRel )
1910 : {
1911 0 : const SwCntntNode *pCNd = pNdIdx->GetNode().GetCntntNode();
1912 : OSL_ENSURE( pCNd, "Kein Content-Node an PaM-Position" );
1913 0 : if( pCNd && nCntntIdx < pCNd->Len() )
1914 0 : nCntntIdx++;
1915 : }
1916 : }
1917 : }
1918 0 : }
1919 :
1920 0 : bool SwHTMLPosFlyFrm::operator<( const SwHTMLPosFlyFrm& rFrm ) const
1921 : {
1922 0 : if( pNdIdx->GetIndex() == rFrm.pNdIdx->GetIndex() )
1923 : {
1924 0 : if( nCntntIdx == rFrm.nCntntIdx )
1925 : {
1926 0 : if( GetOutPos() == rFrm.GetOutPos() )
1927 0 : return nOrdNum < rFrm.nOrdNum;
1928 : else
1929 0 : return GetOutPos() < rFrm.GetOutPos();
1930 : }
1931 : else
1932 0 : return nCntntIdx < rFrm.nCntntIdx;
1933 : }
1934 : else
1935 0 : return pNdIdx->GetIndex() < rFrm.pNdIdx->GetIndex();
1936 99 : }
1937 :
1938 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|