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 "hintids.hxx"
21 : #include <vcl/svapp.hxx>
22 : #include <vcl/wrkwin.hxx>
23 : #include <svx/svdmodel.hxx>
24 : #include <svx/svdpage.hxx>
25 : #include <svx/svdobj.hxx>
26 : #include <svx/svdotext.hxx>
27 : #include <editeng/eeitem.hxx>
28 : #include <editeng/outliner.hxx>
29 : #include <svx/xfillit.hxx>
30 : #include <editeng/colritem.hxx>
31 : #include <editeng/brushitem.hxx>
32 : #include <editeng/lrspitem.hxx>
33 : #include <editeng/ulspitem.hxx>
34 : #include <svl/itemiter.hxx>
35 : #include <svl/whiter.hxx>
36 : #include <svtools/htmlout.hxx>
37 : #include <svtools/htmltokn.h>
38 : #include <svtools/htmlkywd.hxx>
39 : #include <svx/svdpool.hxx>
40 :
41 : #include "charatr.hxx"
42 : #include <frmfmt.hxx>
43 : #include <fmtanchr.hxx>
44 : #include <fmtsrnd.hxx>
45 : #include "ndtxt.hxx"
46 : #include "doc.hxx"
47 : #include "dcontact.hxx"
48 : #include "poolfmt.hxx"
49 : #include "swcss1.hxx"
50 : #include "swhtml.hxx"
51 : #include <shellio.hxx>
52 : #include <rtl/strbuf.hxx>
53 :
54 : using namespace css;
55 :
56 : static HTMLOptionEnum aHTMLMarqBehaviorTable[] =
57 : {
58 : { OOO_STRING_SVTOOLS_HTML_BEHAV_scroll, SDRTEXTANI_SCROLL },
59 : { OOO_STRING_SVTOOLS_HTML_BEHAV_alternate, SDRTEXTANI_ALTERNATE },
60 : { OOO_STRING_SVTOOLS_HTML_BEHAV_slide, SDRTEXTANI_SLIDE },
61 : { 0, 0 }
62 : };
63 :
64 : static HTMLOptionEnum aHTMLMarqDirectionTable[] =
65 : {
66 : { OOO_STRING_SVTOOLS_HTML_AL_left, SDRTEXTANI_LEFT },
67 : { OOO_STRING_SVTOOLS_HTML_AL_right, SDRTEXTANI_RIGHT },
68 : { 0, 0 }
69 : };
70 :
71 0 : void SwHTMLParser::InsertDrawObject( SdrObject* pNewDrawObj,
72 : const Size& rPixSpace,
73 : sal_Int16 eVertOri,
74 : sal_Int16 eHoriOri,
75 : SfxItemSet& rCSS1ItemSet,
76 : SvxCSS1PropertyInfo& rCSS1PropInfo,
77 : sal_Bool bHidden )
78 : {
79 : // always on top of text.
80 : // but in invisible layer. <ConnectToLayout> will move the object
81 : // to the visible layer.
82 0 : pNewDrawObj->SetLayer( pDoc->GetInvisibleHeavenId() );
83 :
84 0 : SfxItemSet aFrmSet( pDoc->GetAttrPool(),
85 0 : RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
86 0 : if( !IsNewDoc() )
87 0 : Reader::ResetFrmFmtAttrs( aFrmSet );
88 :
89 0 : sal_uInt16 nLeftSpace = 0, nRightSpace = 0, nUpperSpace = 0, nLowerSpace = 0;
90 0 : if( (rPixSpace.Width() || rPixSpace.Height()) && Application::GetDefaultDevice() )
91 : {
92 0 : Size aTwipSpc( rPixSpace.Width(), rPixSpace.Height() );
93 : aTwipSpc =
94 : Application::GetDefaultDevice()->PixelToLogic( aTwipSpc,
95 0 : MapMode(MAP_TWIP) );
96 0 : nLeftSpace = nRightSpace = (sal_uInt16)aTwipSpc.Width();
97 0 : nUpperSpace = nLowerSpace = (sal_uInt16)aTwipSpc.Height();
98 : }
99 :
100 : // linken/rechten Rand setzen
101 : const SfxPoolItem *pItem;
102 0 : if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, true, &pItem ) )
103 : {
104 : // Ggf. den Erstzeilen-Einzug noch plaetten
105 0 : const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
106 0 : SvxLRSpaceItem aLRItem( *pLRItem );
107 0 : aLRItem.SetTxtFirstLineOfst( 0 );
108 0 : if( rCSS1PropInfo.bLeftMargin )
109 : {
110 0 : nLeftSpace = static_cast< sal_uInt16 >(aLRItem.GetLeft());
111 0 : rCSS1PropInfo.bLeftMargin = sal_False;
112 : }
113 0 : if( rCSS1PropInfo.bRightMargin )
114 : {
115 0 : nRightSpace = static_cast< sal_uInt16 >(aLRItem.GetRight());
116 0 : rCSS1PropInfo.bRightMargin = sal_False;
117 : }
118 0 : rCSS1ItemSet.ClearItem( RES_LR_SPACE );
119 : }
120 0 : if( nLeftSpace || nRightSpace )
121 : {
122 0 : SvxLRSpaceItem aLRItem( RES_LR_SPACE );
123 0 : aLRItem.SetLeft( nLeftSpace );
124 0 : aLRItem.SetRight( nRightSpace );
125 0 : aFrmSet.Put( aLRItem );
126 : }
127 :
128 : // oberen/unteren Rand setzen
129 0 : if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, true, &pItem ) )
130 : {
131 : // Ggf. den Erstzeilen-Einzug noch plaetten
132 0 : const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
133 0 : if( rCSS1PropInfo.bTopMargin )
134 : {
135 0 : nUpperSpace = pULItem->GetUpper();
136 0 : rCSS1PropInfo.bTopMargin = sal_False;
137 : }
138 0 : if( rCSS1PropInfo.bBottomMargin )
139 : {
140 0 : nLowerSpace = pULItem->GetLower();
141 0 : rCSS1PropInfo.bBottomMargin = sal_False;
142 : }
143 :
144 0 : rCSS1ItemSet.ClearItem( RES_UL_SPACE );
145 : }
146 0 : if( nUpperSpace || nLowerSpace )
147 : {
148 0 : SvxULSpaceItem aULItem( RES_UL_SPACE );
149 0 : aULItem.SetUpper( nUpperSpace );
150 0 : aULItem.SetLower( nLowerSpace );
151 0 : aFrmSet.Put( aULItem );
152 : }
153 :
154 0 : SwFmtAnchor aAnchor( FLY_AS_CHAR );
155 0 : if( SVX_CSS1_POS_ABSOLUTE == rCSS1PropInfo.ePosition &&
156 0 : SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eLeftType &&
157 0 : SVX_CSS1_LTYPE_TWIP == rCSS1PropInfo.eTopType )
158 : {
159 : const SwStartNode *pFlySttNd =
160 0 : pPam->GetPoint()->nNode.GetNode().FindFlyStartNode();
161 :
162 0 : if( pFlySttNd )
163 : {
164 0 : aAnchor.SetType( FLY_AT_FLY );
165 0 : SwPosition aPos( *pFlySttNd );
166 0 : aAnchor.SetAnchor( &aPos );
167 : }
168 : else
169 : {
170 0 : aAnchor.SetType( FLY_AT_PAGE );
171 : }
172 : // #i26791# - direct positioning for <SwDoc::Insert(..)>
173 : pNewDrawObj->SetRelativePos( Point(rCSS1PropInfo.nLeft + nLeftSpace,
174 0 : rCSS1PropInfo.nTop + nUpperSpace) );
175 0 : aFrmSet.Put( SwFmtSurround(SURROUND_THROUGHT) );
176 : }
177 0 : else if( SVX_ADJUST_LEFT == rCSS1PropInfo.eFloat ||
178 : text::HoriOrientation::LEFT == eHoriOri )
179 : {
180 0 : aAnchor.SetType( FLY_AT_PARA );
181 : aFrmSet.Put( SwFmtSurround(bHidden ? SURROUND_THROUGHT
182 0 : : SURROUND_RIGHT) );
183 : // #i26791# - direct positioning for <SwDoc::Insert(..)>
184 0 : pNewDrawObj->SetRelativePos( Point(nLeftSpace, nUpperSpace) );
185 : }
186 0 : else if( text::VertOrientation::NONE != eVertOri )
187 : {
188 0 : aFrmSet.Put( SwFmtVertOrient( 0, eVertOri ) );
189 : }
190 :
191 0 : if (FLY_AT_PAGE == aAnchor.GetAnchorId())
192 : {
193 0 : aAnchor.SetPageNum( 1 );
194 : }
195 0 : else if( FLY_AT_FLY != aAnchor.GetAnchorId() )
196 : {
197 0 : aAnchor.SetAnchor( pPam->GetPoint() );
198 : }
199 0 : aFrmSet.Put( aAnchor );
200 :
201 0 : pDoc->InsertDrawObj( *pPam, *pNewDrawObj, aFrmSet );
202 0 : }
203 :
204 0 : static void PutEEPoolItem( SfxItemSet &rEEItemSet,
205 : const SfxPoolItem& rSwItem )
206 : {
207 :
208 0 : sal_uInt16 nEEWhich = 0;
209 :
210 0 : switch( rSwItem.Which() )
211 : {
212 0 : case RES_CHRATR_COLOR: nEEWhich = EE_CHAR_COLOR; break;
213 0 : case RES_CHRATR_CROSSEDOUT: nEEWhich = EE_CHAR_STRIKEOUT; break;
214 0 : case RES_CHRATR_ESCAPEMENT: nEEWhich = EE_CHAR_ESCAPEMENT; break;
215 0 : case RES_CHRATR_FONT: nEEWhich = EE_CHAR_FONTINFO; break;
216 0 : case RES_CHRATR_CJK_FONT: nEEWhich = EE_CHAR_FONTINFO_CJK; break;
217 0 : case RES_CHRATR_CTL_FONT: nEEWhich = EE_CHAR_FONTINFO_CTL; break;
218 0 : case RES_CHRATR_FONTSIZE: nEEWhich = EE_CHAR_FONTHEIGHT; break;
219 0 : case RES_CHRATR_CJK_FONTSIZE: nEEWhich = EE_CHAR_FONTHEIGHT_CJK; break;
220 0 : case RES_CHRATR_CTL_FONTSIZE: nEEWhich = EE_CHAR_FONTHEIGHT_CTL; break;
221 0 : case RES_CHRATR_KERNING: nEEWhich = EE_CHAR_KERNING; break;
222 0 : case RES_CHRATR_POSTURE: nEEWhich = EE_CHAR_ITALIC; break;
223 0 : case RES_CHRATR_CJK_POSTURE: nEEWhich = EE_CHAR_ITALIC_CJK; break;
224 0 : case RES_CHRATR_CTL_POSTURE: nEEWhich = EE_CHAR_ITALIC_CTL; break;
225 0 : case RES_CHRATR_UNDERLINE: nEEWhich = EE_CHAR_UNDERLINE; break;
226 0 : case RES_CHRATR_WEIGHT: nEEWhich = EE_CHAR_WEIGHT; break;
227 0 : case RES_CHRATR_CJK_WEIGHT: nEEWhich = EE_CHAR_WEIGHT_CJK; break;
228 0 : case RES_CHRATR_CTL_WEIGHT: nEEWhich = EE_CHAR_WEIGHT_CTL; break;
229 : case RES_BACKGROUND:
230 : case RES_CHRATR_BACKGROUND:
231 : {
232 0 : const SvxBrushItem& rBrushItem = (const SvxBrushItem&)rSwItem;
233 0 : rEEItemSet.Put( XFillStyleItem(XFILL_SOLID) );
234 : rEEItemSet.Put( XFillColorItem(aEmptyOUStr,
235 0 : rBrushItem.GetColor()) );
236 : }
237 0 : break;
238 : }
239 :
240 0 : if( nEEWhich )
241 : {
242 0 : SfxPoolItem *pEEItem = rSwItem.Clone();
243 0 : pEEItem->SetWhich( nEEWhich );
244 0 : rEEItemSet.Put( *pEEItem );
245 0 : delete pEEItem;
246 : }
247 0 : }
248 :
249 0 : void SwHTMLParser::NewMarquee( HTMLTable *pCurTable )
250 : {
251 :
252 : OSL_ENSURE( !pMarquee, "Marquee in Marquee???" );
253 0 : aContents = "";
254 :
255 0 : OUString aId, aStyle, aClass;
256 :
257 0 : long nWidth=0, nHeight=0;
258 0 : sal_Bool bPrcWidth = sal_False, bDirection = sal_False, bBGColor = sal_False;
259 0 : Size aSpace( 0, 0 );
260 0 : sal_Int16 eVertOri = text::VertOrientation::TOP;
261 0 : sal_Int16 eHoriOri = text::HoriOrientation::NONE;
262 0 : SdrTextAniKind eAniKind = SDRTEXTANI_SCROLL;
263 0 : SdrTextAniDirection eAniDir = SDRTEXTANI_LEFT;
264 0 : sal_uInt16 nCount = 0, nDelay = 60;
265 0 : sal_Int16 nAmount = -6;
266 0 : Color aBGColor;
267 :
268 0 : const HTMLOptions& rHTMLOptions = GetOptions();
269 0 : for (size_t i = 0, n = rHTMLOptions.size(); i < n; ++i)
270 : {
271 0 : const HTMLOption& rOption = rHTMLOptions[i];
272 0 : switch( rOption.GetToken() )
273 : {
274 : case HTML_O_ID:
275 0 : aId = rOption.GetString();
276 0 : break;
277 : case HTML_O_STYLE:
278 0 : aStyle = rOption.GetString();
279 0 : break;
280 : case HTML_O_CLASS:
281 0 : aClass = rOption.GetString();
282 0 : break;
283 :
284 : case HTML_O_BEHAVIOR:
285 : eAniKind =
286 : (SdrTextAniKind)rOption.GetEnum( aHTMLMarqBehaviorTable,
287 0 : static_cast< sal_uInt16 >(eAniKind) );
288 0 : break;
289 :
290 : case HTML_O_BGCOLOR:
291 0 : rOption.GetColor( aBGColor );
292 0 : bBGColor = sal_True;
293 0 : break;
294 :
295 : case HTML_O_DIRECTION:
296 : eAniDir =
297 : (SdrTextAniDirection)rOption.GetEnum( aHTMLMarqDirectionTable,
298 0 : static_cast< sal_uInt16 >(eAniDir) );
299 0 : bDirection = sal_True;
300 0 : break;
301 :
302 : case HTML_O_LOOP:
303 0 : if (rOption.GetString().
304 : equalsIgnoreAsciiCase(OOO_STRING_SVTOOLS_HTML_LOOP_infinite))
305 : {
306 0 : nCount = 0;
307 : }
308 : else
309 : {
310 0 : sal_uInt32 nLoop = rOption.GetSNumber();
311 0 : nCount = (sal_uInt16)(nLoop>0 ? nLoop : 0 );
312 : }
313 0 : break;
314 :
315 : case HTML_O_SCROLLAMOUNT:
316 0 : nAmount = -((sal_Int16)rOption.GetNumber());
317 0 : break;
318 :
319 : case HTML_O_SCROLLDELAY:
320 0 : nDelay = (sal_uInt16)rOption.GetNumber();
321 0 : break;
322 :
323 : case HTML_O_WIDTH:
324 : // erstmal nur als Pixelwerte merken!
325 0 : nWidth = rOption.GetNumber();
326 0 : bPrcWidth = rOption.GetString().indexOf('%') != -1;
327 0 : if( bPrcWidth && nWidth>100 )
328 0 : nWidth = 100;
329 0 : break;
330 :
331 : case HTML_O_HEIGHT:
332 : // erstmal nur als Pixelwerte merken!
333 0 : nHeight = rOption.GetNumber();
334 0 : if( rOption.GetString().indexOf('%') != -1 )
335 0 : nHeight = 0;
336 0 : break;
337 :
338 : case HTML_O_HSPACE:
339 : // erstmal nur als Pixelwerte merken!
340 0 : aSpace.Height() = rOption.GetNumber();
341 0 : break;
342 :
343 : case HTML_O_VSPACE:
344 : // erstmal nur als Pixelwerte merken!
345 0 : aSpace.Width() = rOption.GetNumber();
346 0 : break;
347 :
348 : case HTML_O_ALIGN:
349 : eVertOri =
350 : rOption.GetEnum( aHTMLImgVAlignTable,
351 0 : text::VertOrientation::TOP );
352 : eHoriOri =
353 : rOption.GetEnum( aHTMLImgHAlignTable,
354 0 : text::HoriOrientation::NONE );
355 0 : break;
356 : }
357 : }
358 :
359 : // Ein DrawTxtobj anlegen
360 : // #i52858# - method name changed
361 0 : SdrModel* pModel = pDoc->GetOrCreateDrawModel();
362 :
363 0 : SdrPage* pPg = pModel->GetPage( 0 );
364 : pMarquee = SdrObjFactory::MakeNewObject( SdrInventor,
365 0 : OBJ_TEXT, pPg, pModel );
366 0 : if( !pMarquee )
367 0 : return;
368 :
369 0 : pPg->InsertObject( pMarquee );
370 :
371 0 : if( !aId.isEmpty() )
372 0 : InsertBookmark( aId );
373 :
374 : // (Nur) Alternate leueft per Default von links nach rechts
375 0 : if( SDRTEXTANI_ALTERNATE==eAniKind && !bDirection )
376 0 : eAniDir = SDRTEXTANI_RIGHT;
377 :
378 : // die fuer das Scrollen benoetigten Attribute umsetzen
379 : sal_uInt16 aWhichMap[7] = { XATTR_FILL_FIRST, XATTR_FILL_LAST,
380 : SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST,
381 : EE_CHAR_START, EE_CHAR_END,
382 0 : 0 };
383 0 : SfxItemSet aItemSet( pModel->GetItemPool(), aWhichMap );
384 0 : aItemSet.Put( SdrTextAutoGrowWidthItem( false ) );
385 0 : aItemSet.Put( SdrTextAutoGrowHeightItem( true ) );
386 0 : aItemSet.Put( SdrTextAniKindItem( eAniKind ) );
387 0 : aItemSet.Put( SdrTextAniDirectionItem( eAniDir ) );
388 0 : aItemSet.Put( SdrTextAniCountItem( nCount ) );
389 0 : aItemSet.Put( SdrTextAniDelayItem( nDelay ) );
390 0 : aItemSet.Put( SdrTextAniAmountItem( nAmount ) );
391 0 : if( SDRTEXTANI_ALTERNATE==eAniKind )
392 : {
393 : // (Nur) Alternate startet und stoppt per default Inside
394 0 : aItemSet.Put( SdrTextAniStartInsideItem(true) );
395 0 : aItemSet.Put( SdrTextAniStopInsideItem(true) );
396 0 : if( SDRTEXTANI_LEFT==eAniDir )
397 0 : aItemSet.Put( SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT) );
398 : }
399 :
400 : // die Default-Farbe (aus der Standard-Vorlage) setzen, damit ueberhaupt
401 : // eine sinnvolle Farbe gesetzt ist.
402 : const Color& rDfltColor =
403 0 : pCSS1Parser->GetTxtCollFromPool( RES_POOLCOLL_STANDARD )
404 0 : ->GetColor().GetValue();
405 0 : aItemSet.Put( SvxColorItem( rDfltColor, EE_CHAR_COLOR ) );
406 :
407 : // Die Attribute der aktuellen Absatzvorlage setzen
408 : sal_uInt16 nWhichIds[] =
409 : {
410 : RES_CHRATR_COLOR, RES_CHRATR_CROSSEDOUT, RES_CHRATR_ESCAPEMENT,
411 : RES_CHRATR_FONT, RES_CHRATR_FONTSIZE, RES_CHRATR_KERNING,
412 : RES_CHRATR_POSTURE, RES_CHRATR_UNDERLINE, RES_CHRATR_WEIGHT,
413 : RES_CHRATR_BACKGROUND,
414 : RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONTSIZE,
415 : RES_CHRATR_CJK_POSTURE, RES_CHRATR_CJK_WEIGHT,
416 : RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONTSIZE,
417 : RES_CHRATR_CTL_POSTURE, RES_CHRATR_CTL_WEIGHT,
418 : 0
419 0 : };
420 : SwTxtNode const*const pTxtNd =
421 0 : pPam->GetPoint()->nNode.GetNode().GetTxtNode();
422 0 : if( pTxtNd )
423 : {
424 0 : const SfxItemSet& rItemSet = pTxtNd->GetAnyFmtColl().GetAttrSet();
425 : const SfxPoolItem *pItem;
426 0 : for( sal_uInt16 i=0; nWhichIds[i]; i++ )
427 : {
428 0 : if( SFX_ITEM_SET == rItemSet.GetItemState( nWhichIds[i], true, &pItem ) )
429 0 : PutEEPoolItem( aItemSet, *pItem );
430 : }
431 : }
432 :
433 : // die Attribute der Umgebung am Draw-Objekt setzen
434 0 : _HTMLAttr** pTbl = (_HTMLAttr**)&aAttrTab;
435 0 : for( sal_uInt16 nCnt = sizeof( _HTMLAttrTable ) / sizeof( _HTMLAttr* );
436 : nCnt--; ++pTbl )
437 : {
438 0 : _HTMLAttr *pAttr = *pTbl;
439 0 : if( pAttr )
440 0 : PutEEPoolItem( aItemSet, pAttr->GetItem() );
441 : }
442 :
443 0 : if( bBGColor )
444 : {
445 0 : aItemSet.Put( XFillStyleItem(XFILL_SOLID) );
446 0 : aItemSet.Put( XFillColorItem(aEmptyOUStr, aBGColor) );
447 : }
448 :
449 : // Styles parsen (funktioniert hier nur fuer Attribute, die auch
450 : // am Zeichen-Objekt gesetzt werden koennen)
451 0 : SfxItemSet aStyleItemSet( pDoc->GetAttrPool(),
452 0 : pCSS1Parser->GetWhichMap() );
453 0 : SvxCSS1PropertyInfo aPropInfo;
454 0 : if( HasStyleOptions( aStyle, aId, aClass ) &&
455 0 : ParseStyleOptions( aStyle, aId, aClass, aStyleItemSet, aPropInfo ) )
456 : {
457 0 : SfxItemIter aIter( aStyleItemSet );
458 :
459 0 : const SfxPoolItem *pItem = aIter.FirstItem();
460 0 : while( pItem )
461 : {
462 0 : PutEEPoolItem( aItemSet, *pItem );
463 0 : pItem = aIter.NextItem();
464 0 : }
465 : }
466 :
467 : // jetzt noch die Groesse setzen
468 0 : Size aTwipSz( bPrcWidth ? 0 : nWidth, nHeight );
469 0 : if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
470 : {
471 : aTwipSz = Application::GetDefaultDevice()
472 0 : ->PixelToLogic( aTwipSz, MapMode( MAP_TWIP ) );
473 : }
474 :
475 0 : if( SVX_CSS1_LTYPE_TWIP== aPropInfo.eWidthType )
476 : {
477 0 : aTwipSz.Width() = aPropInfo.nWidth;
478 0 : nWidth = 1; // != 0;
479 0 : bPrcWidth = sal_False;
480 : }
481 0 : if( SVX_CSS1_LTYPE_TWIP== aPropInfo.eHeightType )
482 0 : aTwipSz.Height() = aPropInfo.nHeight;
483 :
484 0 : bFixMarqueeWidth = false;
485 0 : if( !nWidth || bPrcWidth )
486 : {
487 0 : if( pTable )
488 : {
489 0 : if( !pCurTable )
490 : {
491 : // Die Laufschrift steht in einer Tabelle, aber nicht
492 : // in einer Zelle. Da jetzt keine vernuenftige Zuordung
493 : // zu einer Zelle moeglich ist, passen wir hir die
494 : // Breite dem Inhalt der Laufschrift an.
495 0 : bFixMarqueeWidth = true;
496 : }
497 0 : else if( !nWidth )
498 : {
499 : // Da wir wissen, in welcher Zelle die Laufschrift ist,
500 : // koennen wir die Breite auch anpassen. Keine Breitenangabe
501 : // wird wie 100% behandelt.
502 0 : nWidth = 100;
503 0 : bPrcWidth = sal_True;
504 : }
505 0 : aTwipSz.Width() = MINLAY;
506 : }
507 : else
508 : {
509 0 : long nBrowseWidth = GetCurrentBrowseWidth();
510 0 : aTwipSz.Width() = !nWidth ? nBrowseWidth
511 0 : : (nWidth*nBrowseWidth) / 100;
512 : }
513 : }
514 :
515 : // Die Hoehe ist nur eine Mindest-Hoehe
516 0 : if( aTwipSz.Height() < MINFLY )
517 0 : aTwipSz.Height() = MINFLY;
518 0 : aItemSet.Put( SdrTextMinFrameHeightItem( aTwipSz.Height() ) );
519 :
520 0 : pMarquee->SetMergedItemSetAndBroadcast(aItemSet);
521 :
522 0 : if( aTwipSz.Width() < MINFLY )
523 0 : aTwipSz.Width() = MINFLY;
524 0 : pMarquee->SetLogicRect( Rectangle( 0, 0, aTwipSz.Width(), aTwipSz.Height() ) );
525 :
526 : // und das Objekt in das Dok einfuegen
527 : InsertDrawObject( pMarquee, aSpace, eVertOri, eHoriOri, aStyleItemSet,
528 0 : aPropInfo );
529 :
530 : // Das Zeichen-Objekt der Tabelle bekanntmachen. Ist ein bisserl
531 : // umstaendlich, weil noch ueber den Parser gegangen wird, obwohl die
532 : // Tabelle bekannt ist, aber anderenfalls muesste man die Tabelle
533 : // oeffentlich machen, und das ist auch nicht schoen. Das globale
534 : // pTable kann uebrigens auch nicht verwendet werden, denn die
535 : // Laufschrift kann sich auch mal in einer Sub-Tabelle befinden.
536 0 : if( pCurTable && bPrcWidth)
537 0 : RegisterDrawObjectToTable( pCurTable, pMarquee, (sal_uInt8)nWidth );
538 : }
539 :
540 0 : void SwHTMLParser::EndMarquee()
541 : {
542 : OSL_ENSURE( pMarquee && OBJ_TEXT==pMarquee->GetObjIdentifier(),
543 : "kein Marquee oder falscher Typ" );
544 :
545 0 : if( bFixMarqueeWidth )
546 : {
547 : // Da es keine fixe Hoehe gibt, das Text-Objekt erstmal breiter
548 : // als den Text machen, damit nicht umgebrochen wird.
549 0 : const Rectangle& rOldRect = pMarquee->GetLogicRect();
550 : pMarquee->SetLogicRect( Rectangle( rOldRect.TopLeft(),
551 0 : Size( USHRT_MAX, 240 ) ) );
552 : }
553 :
554 : // den gesammelten Text einfuegen
555 0 : ((SdrTextObj*)pMarquee)->SetText( aContents );
556 0 : pMarquee->SetMergedItemSetAndBroadcast( pMarquee->GetMergedItemSet() );
557 :
558 0 : if( bFixMarqueeWidth )
559 : {
560 : // die Groesse dem Text anpassen.
561 0 : ((SdrTextObj*)pMarquee)->FitFrameToTextSize();
562 : }
563 :
564 0 : aContents = "";
565 0 : pMarquee = 0;
566 0 : }
567 :
568 0 : void SwHTMLParser::InsertMarqueeText()
569 : {
570 : OSL_ENSURE( pMarquee && OBJ_TEXT==pMarquee->GetObjIdentifier(),
571 : "kein Marquee oder falscher Typ" );
572 :
573 : // das akteulle Textstueck an den Text anhaengen
574 0 : aContents += aToken;
575 0 : }
576 :
577 0 : void SwHTMLParser::ResizeDrawObject( SdrObject* pObj, SwTwips nWidth )
578 : {
579 : OSL_ENSURE( OBJ_TEXT==pObj->GetObjIdentifier(),
580 : "kein Marquee oder falscher Typ" );
581 :
582 0 : if( OBJ_TEXT!=pObj->GetObjIdentifier() )
583 0 : return;
584 :
585 : // die alte Groesse
586 0 : const Rectangle& rOldRect = pObj->GetLogicRect();
587 0 : Size aNewSz( nWidth, rOldRect.GetSize().Height() );
588 0 : pObj->SetLogicRect( Rectangle( rOldRect.TopLeft(), aNewSz ) );
589 : }
590 :
591 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|