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