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