1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #include <com/sun/star/embed/EmbedStates.hpp>
27 #include <com/sun/star/beans/XPropertySet.hpp>
28
29 #include "hintids.hxx"
30 #include <svl/urihelper.hxx>
31 #define _SVSTDARR_ULONGS
32 #include <svl/svstdarr.hxx>
33 #include <vcl/svapp.hxx>
34 #include <sfx2/frmhtml.hxx>
35 #include <sfx2/frmhtmlw.hxx>
36 #include <vcl/wrkwin.hxx>
37 #include <sot/storage.hxx>
38 #include <svx/xoutbmp.hxx>
39 #include <editeng/ulspitem.hxx>
40 #include <editeng/lrspitem.hxx>
41 #include <svtools/htmlkywd.hxx>
42 #include <svtools/htmltokn.h>
43 #include <SwAppletImpl.hxx>
44 #include <fmtornt.hxx>
45 #include <fmtfsize.hxx>
46 #include <fmtsrnd.hxx>
47 #include <fmtanchr.hxx>
48 #include <fmtcntnt.hxx>
49 #include <frmfmt.hxx>
50
51 #include <svl/ownlist.hxx>
52 #include "pam.hxx"
53 #include "doc.hxx"
54 #include "ndtxt.hxx"
55 #include "swerror.h"
56 #include "ndole.hxx"
57 #include "swtable.hxx"
58 #include "swhtml.hxx"
59 #include "wrthtml.hxx"
60 #include "htmlfly.hxx"
61 #include "swcss1.hxx"
62 #include <com/sun/star/embed/XClassifiedObject.hpp>
63 #include <com/sun/star/embed/EmbedStates.hpp>
64 #include <comphelper/embeddedobjectcontainer.hxx>
65 #include <sot/clsids.hxx>
66
67 using namespace com::sun::star;
68
69 #define HTML_DFLT_EMBED_WIDTH ((MM50*5)/2)
70 #define HTML_DFLT_EMBED_HEIGHT ((MM50*5)/2)
71
72 #define HTML_DFLT_APPLET_WIDTH ((MM50*5)/2)
73 #define HTML_DFLT_APPLET_HEIGHT ((MM50*5)/2)
74
75 namespace {
76
77 static char const sHTML_O_Hidden_False[] = "sal_False";
78
79 }
80
81 const sal_uLong HTML_FRMOPTS_EMBED_ALL =
82 HTML_FRMOPT_ALT |
83 HTML_FRMOPT_SIZE |
84 HTML_FRMOPT_NAME;
85 const sal_uLong HTML_FRMOPTS_EMBED_CNTNR =
86 HTML_FRMOPTS_EMBED_ALL |
87 HTML_FRMOPT_ABSSIZE;
88 const sal_uLong HTML_FRMOPTS_EMBED =
89 HTML_FRMOPTS_EMBED_ALL |
90 HTML_FRMOPT_ALIGN |
91 HTML_FRMOPT_SPACE |
92 HTML_FRMOPT_BRCLEAR |
93 HTML_FRMOPT_NAME;
94 const sal_uLong HTML_FRMOPTS_HIDDEN_EMBED =
95 HTML_FRMOPT_ALT |
96 HTML_FRMOPT_NAME;
97
98 const sal_uLong HTML_FRMOPTS_APPLET_ALL =
99 HTML_FRMOPT_ALT |
100 HTML_FRMOPT_SIZE;
101 const sal_uLong HTML_FRMOPTS_APPLET_CNTNR =
102 HTML_FRMOPTS_APPLET_ALL |
103 HTML_FRMOPT_ABSSIZE;
104 const sal_uLong HTML_FRMOPTS_APPLET =
105 HTML_FRMOPTS_APPLET_ALL |
106 HTML_FRMOPT_ALIGN |
107 HTML_FRMOPT_SPACE |
108 HTML_FRMOPT_BRCLEAR;
109
110 const sal_uLong HTML_FRMOPTS_IFRAME_ALL =
111 HTML_FRMOPT_ALT |
112 HTML_FRMOPT_SIZE;
113 const sal_uLong HTML_FRMOPTS_IFRAME_CNTNR =
114 HTML_FRMOPTS_IFRAME_ALL |
115 HTML_FRMOPT_ABSSIZE;
116 const sal_uLong HTML_FRMOPTS_IFRAME =
117 HTML_FRMOPTS_IFRAME_ALL |
118 HTML_FRMOPT_ALIGN |
119 HTML_FRMOPT_SPACE |
120 HTML_FRMOPT_BORDER |
121 HTML_FRMOPT_BRCLEAR;
122
123 const sal_uLong HTML_FRMOPTS_OLE_CSS1 =
124 HTML_FRMOPT_S_ALIGN |
125 HTML_FRMOPT_S_SPACE;
126
127 /* */
128
SetFixSize(const Size & rPixSize,const Size & rTwipDfltSize,sal_Bool bPrcWidth,sal_Bool bPrcHeight,SfxItemSet &,SvxCSS1PropertyInfo & rCSS1PropInfo,SfxItemSet & rFlyItemSet)129 void SwHTMLParser::SetFixSize( const Size& rPixSize,
130 const Size& rTwipDfltSize,
131 sal_Bool bPrcWidth, sal_Bool bPrcHeight,
132 SfxItemSet& /*rCSS1ItemSet*/,
133 SvxCSS1PropertyInfo& rCSS1PropInfo,
134 SfxItemSet& rFlyItemSet )
135 {
136 // absolulte Groessenangaben in Twip umrechnen
137 sal_uInt8 nPrcWidth = 0, nPrcHeight = 0;
138 Size aTwipSz( bPrcWidth || USHRT_MAX==rPixSize.Width() ? 0 : rPixSize.Width(),
139 bPrcHeight || USHRT_MAX==rPixSize.Height() ? 0 : rPixSize.Height() );
140 if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
141 {
142 aTwipSz =
143 Application::GetDefaultDevice()->PixelToLogic( aTwipSz,
144 MapMode(MAP_TWIP) );
145 }
146
147 // die Breite bearbeiten
148 if( SVX_CSS1_LTYPE_PERCENTAGE == rCSS1PropInfo.eWidthType )
149 {
150 nPrcWidth = (sal_uInt8)rCSS1PropInfo.nWidth;
151 aTwipSz.Width() = rTwipDfltSize.Width();
152 }
153 else if( SVX_CSS1_LTYPE_TWIP== rCSS1PropInfo.eWidthType )
154 {
155 aTwipSz.Width() = rCSS1PropInfo.nWidth;
156 }
157 else if( bPrcWidth && rPixSize.Width() )
158 {
159 nPrcWidth = (sal_uInt8)rPixSize.Width();
160 if( nPrcWidth > 100 )
161 nPrcWidth = 100;
162
163 aTwipSz.Width() = rTwipDfltSize.Width();
164 }
165 else if( USHRT_MAX==rPixSize.Width() )
166 {
167 aTwipSz.Width() = rTwipDfltSize.Width();
168 }
169 if( aTwipSz.Width() < MINFLY )
170 {
171 aTwipSz.Width() = MINFLY;
172 }
173
174 // Hoehe bearbeiten
175 if( SVX_CSS1_LTYPE_PERCENTAGE == rCSS1PropInfo.eHeightType )
176 {
177 nPrcHeight = (sal_uInt8)rCSS1PropInfo.nHeight;
178 aTwipSz.Height() = rTwipDfltSize.Height();
179 }
180 else if( SVX_CSS1_LTYPE_TWIP== rCSS1PropInfo.eHeightType )
181 {
182 aTwipSz.Height() = rCSS1PropInfo.nHeight;
183 }
184 else if( bPrcHeight && rPixSize.Height() )
185 {
186 nPrcHeight = (sal_uInt8)rPixSize.Height();
187 if( nPrcHeight > 100 )
188 nPrcHeight = 100;
189
190 aTwipSz.Height() = rTwipDfltSize.Height();
191 }
192 else if( USHRT_MAX==rPixSize.Height() )
193 {
194 aTwipSz.Height() = rTwipDfltSize.Height();
195 }
196 if( aTwipSz.Height() < MINFLY )
197 {
198 aTwipSz.Height() = MINFLY;
199 }
200
201 // Size setzen
202 SwFmtFrmSize aFrmSize( ATT_FIX_SIZE, aTwipSz.Width(), aTwipSz.Height() );
203 aFrmSize.SetWidthPercent( nPrcWidth );
204 aFrmSize.SetHeightPercent( nPrcHeight );
205 rFlyItemSet.Put( aFrmSize );
206 }
207
SetSpace(const Size & rPixSpace,SfxItemSet & rCSS1ItemSet,SvxCSS1PropertyInfo & rCSS1PropInfo,SfxItemSet & rFlyItemSet)208 void SwHTMLParser::SetSpace( const Size& rPixSpace,
209 SfxItemSet& rCSS1ItemSet,
210 SvxCSS1PropertyInfo& rCSS1PropInfo,
211 SfxItemSet& rFlyItemSet )
212 {
213 sal_Int32 nLeftSpace = 0, nRightSpace = 0;
214 sal_uInt16 nUpperSpace = 0, nLowerSpace = 0;
215 if( (rPixSpace.Width() || rPixSpace.Height()) && Application::GetDefaultDevice() )
216 {
217 Size aTwipSpc( rPixSpace.Width(), rPixSpace.Height() );
218 aTwipSpc =
219 Application::GetDefaultDevice()->PixelToLogic( aTwipSpc,
220 MapMode(MAP_TWIP) );
221 nLeftSpace = nRightSpace = aTwipSpc.Width();
222 nUpperSpace = nLowerSpace = (sal_uInt16)aTwipSpc.Height();
223 }
224
225 // linken/rechten Rand setzen
226 const SfxPoolItem *pItem;
227 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, sal_True, &pItem ) )
228 {
229 // Ggf. den Erstzeilen-Einzug noch plaetten
230 const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
231 SvxLRSpaceItem aLRItem( *pLRItem );
232 aLRItem.SetTxtFirstLineOfst( 0 );
233 if( rCSS1PropInfo.bLeftMargin )
234 {
235 nLeftSpace = aLRItem.GetLeft();
236 rCSS1PropInfo.bLeftMargin = sal_False;
237 }
238 if( rCSS1PropInfo.bRightMargin )
239 {
240 nRightSpace = aLRItem.GetRight();
241 rCSS1PropInfo.bRightMargin = sal_False;
242 }
243 rCSS1ItemSet.ClearItem( RES_LR_SPACE );
244 }
245 if( nLeftSpace > 0 || nRightSpace > 0 )
246 {
247 SvxLRSpaceItem aLRItem( RES_LR_SPACE );
248 aLRItem.SetLeft( nLeftSpace > 0 ? nLeftSpace : 0 );
249 aLRItem.SetRight( nRightSpace > 0 ? nRightSpace : 0 );
250 rFlyItemSet.Put( aLRItem );
251 if( nLeftSpace )
252 {
253 const SwFmtHoriOrient& rHoriOri =
254 (const SwFmtHoriOrient&)rFlyItemSet.Get( RES_HORI_ORIENT );
255 if( text::HoriOrientation::NONE == rHoriOri.GetHoriOrient() )
256 {
257 SwFmtHoriOrient aHoriOri( rHoriOri );
258 aHoriOri.SetPos( aHoriOri.GetPos() + nLeftSpace );
259 rFlyItemSet.Put( aHoriOri );
260 }
261 }
262 }
263
264 // oberen/unteren Rand setzen
265 if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, sal_True, &pItem ) )
266 {
267 // Ggf. den Erstzeilen-Einzug noch plaetten
268 const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
269 if( rCSS1PropInfo.bTopMargin )
270 {
271 nUpperSpace = pULItem->GetUpper();
272 rCSS1PropInfo.bTopMargin = sal_False;
273 }
274 if( rCSS1PropInfo.bBottomMargin )
275 {
276 nLowerSpace = pULItem->GetLower();
277 rCSS1PropInfo.bBottomMargin = sal_False;
278 }
279 rCSS1ItemSet.ClearItem( RES_UL_SPACE );
280 }
281 if( nUpperSpace || nLowerSpace )
282 {
283 SvxULSpaceItem aULItem( RES_UL_SPACE );
284 aULItem.SetUpper( nUpperSpace );
285 aULItem.SetLower( nLowerSpace );
286 rFlyItemSet.Put( aULItem );
287 if( nUpperSpace )
288 {
289 const SwFmtVertOrient& rVertOri =
290 (const SwFmtVertOrient&)rFlyItemSet.Get( RES_VERT_ORIENT );
291 if( text::VertOrientation::NONE == rVertOri.GetVertOrient() )
292 {
293 SwFmtVertOrient aVertOri( rVertOri );
294 aVertOri.SetPos( aVertOri.GetPos() + nUpperSpace );
295 rFlyItemSet.Put( aVertOri );
296 }
297 }
298 }
299 }
300
301 /* */
302
InsertEmbed()303 void SwHTMLParser::InsertEmbed()
304 {
305 String aURL, aType, aName, aAlt, aId, aStyle, aClass;
306 Size aSize( USHRT_MAX, USHRT_MAX );
307 Size aSpace( USHRT_MAX, USHRT_MAX );
308 sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False, bHidden = sal_False;
309 sal_Int16 eVertOri = text::VertOrientation::NONE;
310 sal_Int16 eHoriOri = text::HoriOrientation::NONE;
311 SvCommandList aCmdLst;
312 const HTMLOptions *pHTMLOptions = GetOptions();
313
314 // Die Optionen werden vorwaerts gelesen, weil die Plugins sie in
315 // dieser Reihenfolge erwarten. Trotzdem darf immer nur der erste
316 // Wert einer Option beruecksichtigt werden.
317 sal_uInt16 nArrLen = pHTMLOptions->Count();
318 for( sal_uInt16 i=0; i<nArrLen; i++ )
319 {
320 const HTMLOption *pOption = (*pHTMLOptions)[i];
321 switch( pOption->GetToken() )
322 {
323 case HTML_O_ID:
324 aId = pOption->GetString();
325 break;
326 case HTML_O_STYLE:
327 aStyle = pOption->GetString();
328 break;
329 case HTML_O_CLASS:
330 aClass = pOption->GetString();
331 break;
332 case HTML_O_NAME:
333 aName = pOption->GetString();
334 break;
335 case HTML_O_SRC:
336 if( !aURL.Len() )
337 aURL = pOption->GetString();
338 break;
339 case HTML_O_ALT:
340 aAlt = pOption->GetString();
341 break;
342 case HTML_O_TYPE:
343 if( !aType.Len() )
344 aType = pOption->GetString();
345 break;
346 case HTML_O_ALIGN:
347 if( eVertOri==text::VertOrientation::NONE && eHoriOri==text::HoriOrientation::NONE )
348 {
349 eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
350 eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
351 }
352 break;
353 case HTML_O_WIDTH:
354 if( USHRT_MAX==aSize.Width() )
355 {
356 bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
357 aSize.Width() = (long)pOption->GetNumber();
358 }
359 break;
360 case HTML_O_HEIGHT:
361 if( USHRT_MAX==aSize.Height() )
362 {
363 bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
364 aSize.Height() = (long)pOption->GetNumber();
365 }
366 break;
367 case HTML_O_HSPACE:
368 if( USHRT_MAX==aSpace.Width() )
369 aSpace.Width() = (long)pOption->GetNumber();
370 break;
371 case HTML_O_VSPACE:
372 if( USHRT_MAX==aSpace.Height() )
373 aSpace.Height() = (long)pOption->GetNumber();
374 break;
375 case HTML_O_UNKNOWN:
376 if( pOption->GetTokenString().EqualsIgnoreCaseAscii( OOO_STRING_SW_HTML_O_Hidden ) )
377 bHidden =
378 !pOption->GetString().EqualsIgnoreCaseAscii( sHTML_O_Hidden_False );
379 break;
380 }
381
382 // Es werden alle Parameter an das Plugin weitergereicht
383 aCmdLst.Append( pOption->GetTokenString(), pOption->GetString() );
384 }
385
386 SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
387 SvxCSS1PropertyInfo aPropInfo;
388 if( HasStyleOptions( aStyle, aId, aClass ) )
389 ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
390
391 // Die Default-Werte umsetzen (ausser Hoehe/Breite, das macht schon
392 // SetFrmSize() fuer uns)
393 if( eVertOri==text::VertOrientation::NONE && eHoriOri==text::HoriOrientation::NONE )
394 eVertOri = text::VertOrientation::TOP;
395 if( USHRT_MAX==aSpace.Width() )
396 aSpace.Width() = 0;
397 if( USHRT_MAX==aSpace.Height() )
398 aSpace.Height() = 0;
399 if( bHidden )
400 {
401 // Size (0,0) wird in SetFrmSize auf (MINFLY, MINFLY) umgebogen
402 aSize.Width() = 0; aSize.Height() = 0;
403 aSpace.Width() = 0; aSpace.Height() = 0;
404 bPrcWidth = bPrcHeight = sal_False;
405 }
406
407 // die URL aufbereiten
408 INetURLObject aURLObj;
409 bool bHasURL = aURL.Len() &&
410 aURLObj.SetURL(
411 URIHelper::SmartRel2Abs(
412 INetURLObject(sBaseURL), aURL,
413 URIHelper::GetMaybeFileHdl()) );
414
415 // #109761# do not insert plugin if it has neither URL nor type
416 bool bHasType = aType.Len() != 0;
417 if( !bHasURL && !bHasType )
418 return;
419
420 // das Plugin anlegen
421 comphelper::EmbeddedObjectContainer aCnt;
422 ::rtl::OUString aObjName;
423 uno::Reference < embed::XEmbeddedObject > xObj = aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), aObjName );
424 if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
425 {
426 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
427 if ( xSet.is() )
428 {
429 if( bHasURL )
430 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginURL"),
431 uno::makeAny( ::rtl::OUString( aURL ) ) );
432 if( bHasType )
433 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginMimeType"),
434 uno::makeAny( ::rtl::OUString( aType ) ) );
435
436 uno::Sequence < beans::PropertyValue > aProps;
437 aCmdLst.FillSequence( aProps );
438 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginCommands"), uno::makeAny( aProps ) );
439
440 // TODO/LATER: EnableSetModified?!
441 //pPlugin->EnableSetModified( sal_True );
442 }
443 }
444
445 SfxItemSet aFrmSet( pDoc->GetAttrPool(),
446 RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
447 if( !IsNewDoc() )
448 Reader::ResetFrmFmtAttrs( aFrmSet );
449
450 // den Anker setzen
451 if( !bHidden )
452 {
453 SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, aFrmSet );
454 }
455 else
456 {
457 SwFmtAnchor aAnchor( FLY_AT_PARA );
458 aAnchor.SetAnchor( pPam->GetPoint() );
459 aFrmSet.Put( aAnchor );
460 aFrmSet.Put( SwFmtHoriOrient( 0, text::HoriOrientation::LEFT, text::RelOrientation::FRAME) );
461 aFrmSet.Put( SwFmtSurround( SURROUND_THROUGHT ) );
462 aFrmSet.Put( SwFmtVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::PRINT_AREA ) );
463 }
464
465 // und noch die Groesse des Rahmens
466 Size aDfltSz( HTML_DFLT_EMBED_WIDTH, HTML_DFLT_EMBED_HEIGHT );
467 SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
468 aFrmSet );
469 SetSpace( aSpace, aItemSet, aPropInfo, aFrmSet );
470
471 // und in das Dok einfuegen
472 SwFrmFmt* pFlyFmt =
473 pDoc->Insert( *pPam, ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ), &aFrmSet, NULL, NULL );
474
475 // Namen am FrmFmt setzen
476 if( aName.Len() )
477 pFlyFmt->SetName( aName );
478
479 // den alternativen Text setzen
480 SwNoTxtNode *pNoTxtNd =
481 pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
482 ->GetIndex()+1 ]->GetNoTxtNode();
483 pNoTxtNd->SetTitle( aAlt );
484
485 // Ggf Frames anlegen und auto-geb. Rahmen registrieren
486 if( !bHidden )
487 {
488 // HIDDEN-Plugins sollen absatzgebunden bleiben. Da RegisterFlyFrm
489 // absatzgebundene Rahmen mit DUrchlauf in am Zeichen gebundene
490 // Rahmen umwandelt, muessen die Frames hier von Hand angelegt werden.
491 RegisterFlyFrm( pFlyFmt );
492 }
493 }
494
495 /* */
496
497 #ifdef SOLAR_JAVA
NewObject()498 void SwHTMLParser::NewObject()
499 {
500 String aClassID, aName, aStandBy, aId, aStyle, aClass;
501 Size aSize( USHRT_MAX, USHRT_MAX );
502 Size aSpace( 0, 0 );
503 sal_Int16 eVertOri = text::VertOrientation::TOP;
504 sal_Int16 eHoriOri = text::HoriOrientation::NONE;
505
506 sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False,
507 bDeclare = sal_False;
508 // Eine neue Command-List anlegen
509 if( pAppletImpl )
510 delete pAppletImpl;
511 pAppletImpl = new SwApplet_Impl( pDoc->GetAttrPool(),
512 RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
513
514 const HTMLOptions *pHTMLOptions = GetOptions();
515 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
516 {
517 const HTMLOption *pOption = (*pHTMLOptions)[--i];
518 switch( pOption->GetToken() )
519 {
520 case HTML_O_ID:
521 aId = pOption->GetString();
522 break;
523 case HTML_O_STYLE:
524 aStyle = pOption->GetString();
525 break;
526 case HTML_O_CLASS:
527 aClass = pOption->GetString();
528 break;
529 case HTML_O_DECLARE:
530 bDeclare = sal_True;
531 break;
532 case HTML_O_CLASSID:
533 aClassID = pOption->GetString();
534 break;
535 case HTML_O_CODEBASE:
536 break;
537 case HTML_O_DATA:
538 break;
539 case HTML_O_TYPE:
540 break;
541 case HTML_O_CODETYPE:
542 break;
543 case HTML_O_ARCHIVE:
544 case HTML_O_UNKNOWN:
545 break;
546 case HTML_O_STANDBY:
547 aStandBy = pOption->GetString();
548 break;
549 case HTML_O_WIDTH:
550 bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
551 aSize.Width() = (long)pOption->GetNumber();
552 break;
553 case HTML_O_HEIGHT:
554 bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
555 aSize.Height() = (long)pOption->GetNumber();
556 break;
557 case HTML_O_ALIGN:
558 eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
559 eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
560 break;
561 case HTML_O_USEMAP:
562 break;
563 case HTML_O_NAME:
564 aName = pOption->GetString();
565 break;
566 case HTML_O_HSPACE:
567 aSpace.Width() = (long)pOption->GetNumber();
568 break;
569 case HTML_O_VSPACE:
570 aSpace.Height() = (long)pOption->GetNumber();
571 break;
572 case HTML_O_BORDER:
573 break;
574
575 case HTML_O_SDONCLICK:
576 case HTML_O_ONCLICK:
577 case HTML_O_SDONMOUSEOVER:
578 case HTML_O_ONMOUSEOVER:
579 case HTML_O_SDONMOUSEOUT:
580 case HTML_O_ONMOUSEOUT:
581 break;
582 }
583 // Es werden alle Parameter auch an das Applet weitergereicht
584 pAppletImpl->AppendParam( pOption->GetTokenString(),
585 pOption->GetString() );
586
587 }
588
589 // Objects that are declared only are not evaluated. Moreover, only
590 // Java applets are supported.
591 sal_Bool bIsApplet = sal_False;;
592
593 if( !bDeclare && aClassID.Len() == 42 &&
594 aClassID.EqualsAscii( "clsid:", 0, 6 ) )
595 {
596 aClassID.Erase( 0, 6 );
597 SvGlobalName aCID;
598 if( aCID.MakeId( aClassID ) )
599 {
600 SvGlobalName aJavaCID( 0x8AD9C840UL, 0x044EU, 0x11D1U, 0xB3U, 0xE9U,
601 0x00U, 0x80U, 0x5FU, 0x49U, 0x9DU, 0x93U );
602
603 bIsApplet = aJavaCID == aCID;
604 }
605 }
606
607 if( !bIsApplet )
608 {
609 delete pAppletImpl;
610 pAppletImpl = 0;
611 return;
612 }
613
614 pAppletImpl->SetAltText( aStandBy );
615
616 SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
617 SvxCSS1PropertyInfo aPropInfo;
618 if( HasStyleOptions( aStyle, aId, aClass ) )
619 ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
620
621 SfxItemSet& rFrmSet = pAppletImpl->GetItemSet();
622 if( !IsNewDoc() )
623 Reader::ResetFrmFmtAttrs( rFrmSet );
624
625 // den Anker und die Ausrichtung setzen
626 SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, rFrmSet );
627
628 // und noch die Groesse des Rahmens
629 Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
630 SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
631 rFrmSet );
632 SetSpace( aSpace, aItemSet, aPropInfo, rFrmSet );
633 }
634 #endif
635
EndObject()636 void SwHTMLParser::EndObject()
637 {
638 #ifdef SOLAR_JAVA
639 if( !pAppletImpl )
640 return;
641 if( pAppletImpl->CreateApplet( sBaseURL ) )
642 {
643 pAppletImpl->FinishApplet();
644
645 // und in das Dok einfuegen
646 SwFrmFmt* pFlyFmt =
647 pDoc->Insert( *pPam,
648 ::svt::EmbeddedObjectRef( pAppletImpl->GetApplet(), embed::Aspects::MSOLE_CONTENT ),
649 &pAppletImpl->GetItemSet(),
650 NULL,
651 NULL );
652
653 // den alternativen Namen setzen
654 SwNoTxtNode *pNoTxtNd =
655 pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
656 ->GetIndex()+1 ]->GetNoTxtNode();
657 pNoTxtNd->SetTitle( pAppletImpl->GetAltText() );
658
659 // Ggf Frames anlegen und auto-geb. Rahmen registrieren
660 RegisterFlyFrm( pFlyFmt );
661
662 delete pAppletImpl;
663 pAppletImpl = 0;
664 }
665 #endif
666 }
667
668 #ifdef SOLAR_JAVA
InsertApplet()669 void SwHTMLParser::InsertApplet()
670 {
671 String aCodeBase, aCode, aName, aAlt, aId, aStyle, aClass;
672 Size aSize( USHRT_MAX, USHRT_MAX );
673 Size aSpace( 0, 0 );
674 sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False, bMayScript = sal_False;
675 sal_Int16 eVertOri = text::VertOrientation::TOP;
676 sal_Int16 eHoriOri = text::HoriOrientation::NONE;
677
678 // Eine neue Command-List anlegen
679 if( pAppletImpl )
680 delete pAppletImpl;
681 pAppletImpl = new SwApplet_Impl( pDoc->GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
682
683 const HTMLOptions *pHTMLOptions = GetOptions();
684 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
685 {
686 const HTMLOption *pOption = (*pHTMLOptions)[--i];
687 switch( pOption->GetToken() )
688 {
689 case HTML_O_ID:
690 aId = pOption->GetString();
691 break;
692 case HTML_O_STYLE:
693 aStyle = pOption->GetString();
694 break;
695 case HTML_O_CLASS:
696 aClass = pOption->GetString();
697 break;
698 case HTML_O_CODEBASE:
699 aCodeBase = pOption->GetString();
700 break;
701 case HTML_O_CODE:
702 aCode = pOption->GetString();
703 break;
704 case HTML_O_NAME:
705 aName = pOption->GetString();
706 break;
707 case HTML_O_ALT:
708 aAlt = pOption->GetString();
709 break;
710 case HTML_O_ALIGN:
711 eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
712 eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
713 break;
714 case HTML_O_WIDTH:
715 bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
716 aSize.Width() = (long)pOption->GetNumber();
717 break;
718 case HTML_O_HEIGHT:
719 bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
720 aSize.Height() = (long)pOption->GetNumber();
721 break;
722 case HTML_O_HSPACE:
723 aSpace.Width() = (long)pOption->GetNumber();
724 break;
725 case HTML_O_VSPACE:
726 aSpace.Height() = (long)pOption->GetNumber();
727 break;
728 case HTML_O_MAYSCRIPT:
729 bMayScript = sal_True;
730 break;
731 }
732
733 // Es werden alle Parameter auch an das Applet weitergereicht
734 pAppletImpl->AppendParam( pOption->GetTokenString(),
735 pOption->GetString() );
736 }
737
738 if( !aCode.Len() )
739 {
740 delete pAppletImpl;
741 pAppletImpl = 0;
742 return;
743 }
744
745 if ( aCodeBase.Len() )
746 aCodeBase = INetURLObject::GetAbsURL( sBaseURL, aCodeBase );
747 pAppletImpl->CreateApplet( aCode, aName, bMayScript, aCodeBase, sBaseURL );//, aAlt );
748 pAppletImpl->SetAltText( aAlt );
749
750 SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
751 SvxCSS1PropertyInfo aPropInfo;
752 if( HasStyleOptions( aStyle, aId, aClass ) )
753 ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
754
755 SfxItemSet& rFrmSet = pAppletImpl->GetItemSet();
756 if( !IsNewDoc() )
757 Reader::ResetFrmFmtAttrs( rFrmSet );
758
759 // den Anker und die Ausrichtung setzen
760 SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, rFrmSet );
761
762 // und noch die Groesse des Rahmens
763 Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
764 SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
765 rFrmSet );
766 SetSpace( aSpace, aItemSet, aPropInfo, rFrmSet );
767 }
768 #endif
769
EndApplet()770 void SwHTMLParser::EndApplet()
771 {
772 #ifdef SOLAR_JAVA
773 if( !pAppletImpl )
774 return;
775
776 pAppletImpl->FinishApplet();
777
778 // und in das Dok einfuegen
779 SwFrmFmt* pFlyFmt =
780 pDoc->Insert( *pPam,
781 ::svt::EmbeddedObjectRef( pAppletImpl->GetApplet(), embed::Aspects::MSOLE_CONTENT ),
782 &pAppletImpl->GetItemSet(),
783 NULL,
784 NULL );
785
786 // den alternativen Namen setzen
787 SwNoTxtNode *pNoTxtNd =
788 pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
789 ->GetIndex()+1 ]->GetNoTxtNode();
790 pNoTxtNd->SetTitle( pAppletImpl->GetAltText() );
791
792 // Ggf Frames anlegen und auto-geb. Rahmen registrieren
793 RegisterFlyFrm( pFlyFmt );
794
795 delete pAppletImpl;
796 pAppletImpl = 0;
797 #endif
798 }
799
InsertParam()800 void SwHTMLParser::InsertParam()
801 {
802 #ifdef SOLAR_JAVA
803 if( !pAppletImpl )
804 return;
805
806 String aName, aValue;
807
808 const HTMLOptions *pHTMLOptions = GetOptions();
809 for( sal_uInt16 i = pHTMLOptions->Count(); i; )
810 {
811 const HTMLOption *pOption = (*pHTMLOptions)[--i];
812 switch( pOption->GetToken() )
813 {
814 case HTML_O_NAME:
815 aName = pOption->GetString();
816 break;
817 case HTML_O_VALUE:
818 aValue = pOption->GetString();
819 break;
820 }
821 }
822
823 if( !aName.Len() )
824 return;
825
826 pAppletImpl->AppendParam( aName, aValue );
827 #endif
828 }
829
830
831 /* */
832
InsertFloatingFrame()833 void SwHTMLParser::InsertFloatingFrame()
834 {
835 String aAlt, aId, aStyle, aClass;
836 Size aSize( USHRT_MAX, USHRT_MAX );
837 Size aSpace( 0, 0 );
838 sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False;
839 sal_Int16 eVertOri = text::VertOrientation::TOP;
840 sal_Int16 eHoriOri = text::HoriOrientation::NONE;
841
842 const HTMLOptions *pHTMLOptions = GetOptions();
843
844 // Erstmal die Optionen f?r das Writer-Frame-Format holen
845 sal_uInt16 nArrLen = pHTMLOptions->Count();
846 for ( sal_uInt16 i=0; i<nArrLen; i++ )
847 {
848 const HTMLOption *pOption = (*pHTMLOptions)[i];
849 switch( pOption->GetToken() )
850 {
851 case HTML_O_ID:
852 aId = pOption->GetString();
853 break;
854 case HTML_O_STYLE:
855 aStyle = pOption->GetString();
856 break;
857 case HTML_O_CLASS:
858 aClass = pOption->GetString();
859 break;
860 case HTML_O_ALT:
861 aAlt = pOption->GetString();
862 break;
863 case HTML_O_ALIGN:
864 eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
865 eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
866 break;
867 case HTML_O_WIDTH:
868 bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
869 aSize.Width() = (long)pOption->GetNumber();
870 break;
871 case HTML_O_HEIGHT:
872 bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
873 aSize.Height() = (long)pOption->GetNumber();
874 break;
875 case HTML_O_HSPACE:
876 aSpace.Width() = (long)pOption->GetNumber();
877 break;
878 case HTML_O_VSPACE:
879 aSpace.Height() = (long)pOption->GetNumber();
880 break;
881 }
882 }
883
884 // und jetzt die fuer den SfxFrame
885 SfxFrameDescriptor aFrameDesc;
886
887 SfxFrameHTMLParser::ParseFrameOptions( &aFrameDesc, pHTMLOptions, sBaseURL );
888
889 // den Floating-Frame anlegen
890 comphelper::EmbeddedObjectContainer aCnt;
891 ::rtl::OUString aObjName;
892 uno::Reference < embed::XEmbeddedObject > xObj = aCnt.CreateEmbeddedObject( SvGlobalName( SO3_IFRAME_CLASSID ).GetByteSequence(), aObjName );
893
894 //pFrame->EnableSetModified( sal_False );
895 try
896 {
897 // TODO/MBA: testing
898 if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
899 {
900 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
901 if ( xSet.is() )
902 {
903 ::rtl::OUString aName = aFrameDesc.GetName();
904 ScrollingMode eScroll = aFrameDesc.GetScrollingMode();
905 sal_Bool bHasBorder = aFrameDesc.HasFrameBorder();
906 Size aMargin = aFrameDesc.GetMargin();
907
908 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameURL"), uno::makeAny( ::rtl::OUString( aFrameDesc.GetURL().GetMainURL( INetURLObject::NO_DECODE ) ) ) );
909 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameName"), uno::makeAny( aName ) );
910
911 if ( eScroll == ScrollingAuto )
912 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoScroll"),
913 uno::makeAny( sal_True ) );
914 else
915 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsScrollingMode"),
916 uno::makeAny( (sal_Bool) ( eScroll == ScrollingYes) ) );
917
918 //if ( aFrmDescr.IsFrameBorderSet() )
919 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsBorder"),
920 uno::makeAny( bHasBorder ) );
921 /*else
922 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoBorder"),
923 uno::makeAny( sal_True ) );*/
924
925 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginWidth"),
926 uno::makeAny( sal_Int32( aMargin.Width() ) ) );
927
928 xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginHeight"),
929 uno::makeAny( sal_Int32( aMargin.Height() ) ) );
930 }
931 }
932 }
933 catch ( uno::Exception& )
934 {
935 }
936
937 //pFrame->EnableSetModified( sal_True );
938
939 SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
940 SvxCSS1PropertyInfo aPropInfo;
941 if( HasStyleOptions( aStyle, aId, aClass ) )
942 ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
943
944 // den Itemset holen
945 SfxItemSet aFrmSet( pDoc->GetAttrPool(),
946 RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
947 if( !IsNewDoc() )
948 Reader::ResetFrmFmtAttrs( aFrmSet );
949
950 // den Anker und die Ausrichtung setzen
951 SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, aFrmSet );
952
953 // und noch die Groesse des Rahmens
954 Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
955 SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
956 aFrmSet );
957 SetSpace( aSpace, aItemSet, aPropInfo, aFrmSet );
958
959 // und in das Dok einfuegen
960 SwFrmFmt* pFlyFmt =
961 pDoc->Insert( *pPam, ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ), &aFrmSet, NULL, NULL );
962
963 // den alternativen Namen setzen
964 SwNoTxtNode *pNoTxtNd =
965 pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
966 ->GetIndex()+1 ]->GetNoTxtNode();
967 pNoTxtNd->SetTitle( aAlt );
968
969 // Ggf Frames anlegen und auto-geb. Rahmen registrieren
970 RegisterFlyFrm( pFlyFmt );
971
972 bInFloatingFrame = sal_True;
973 }
974
975 /* */
976
977 /*
978 #define SWHTML_OPTTYPE_IGNORE 0
979 #define SWHTML_OPTTYPE_TAG 1
980 #define SWHTML_OPTTYPE_PARAM 2
981
982
983 static sal_uInt16 GetOptionType( const String& rName, sal_Bool bApplet )
984 {
985 sal_uInt16 nType = bApplet ? SWHTML_OPTTYPE_PARAM : SWHTML_OPTTYPE_TAG;
986
987 switch( rName.GetChar(0) )
988 {
989 case 'A':
990 case 'a':
991 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_align ) ||
992 rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_alt ) )
993 nType = SWHTML_OPTTYPE_IGNORE;
994 else if( bApplet &&
995 (rName.EqualsIgnoreCaseAscii( sHTML_O_archive ) ||
996 rName.EqualsIgnoreCaseAscii( sHTML_O_Archives )) )
997 nType = SWHTML_OPTTYPE_TAG;
998 break;
999 case 'C':
1000 case 'c':
1001 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_class ) ||
1002 (bApplet && (rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_code ) ||
1003 rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_codebase ))) )
1004 nType = SWHTML_OPTTYPE_IGNORE;
1005 break;
1006 case 'H':
1007 case 'h':
1008 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_height ) ||
1009 rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_hspace ) ||
1010 (!bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SW_HTML_O_Hidden )) )
1011 nType = SWHTML_OPTTYPE_IGNORE;
1012 break;
1013 case 'I':
1014 case 'i':
1015 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_id ) )
1016 nType = SWHTML_OPTTYPE_IGNORE;
1017 break;
1018 case 'M':
1019 case 'm':
1020 if( bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_mayscript ) )
1021 nType = SWHTML_OPTTYPE_IGNORE;
1022 break;
1023 case 'N':
1024 case 'n':
1025 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_name ) )
1026 nType = SWHTML_OPTTYPE_IGNORE;
1027 break;
1028 case 'O':
1029 case 'o':
1030 if( bApplet && rName.EqualsIgnoreCaseAscii( sHTML_O_Object ) )
1031 nType = SWHTML_OPTTYPE_TAG;
1032 break;
1033 case 'S':
1034 case 's':
1035 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_style ) ||
1036 (!bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_src )) )
1037 nType = SWHTML_OPTTYPE_IGNORE;
1038 break;
1039 case 'T':
1040 case 't':
1041 if( !bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_type ) )
1042 nType = SWHTML_OPTTYPE_IGNORE;
1043 break;
1044 case 'V':
1045 case 'v':
1046 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_vspace ) )
1047 nType = SWHTML_OPTTYPE_IGNORE;
1048 break;
1049 case 'W':
1050 case 'w':
1051 if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_width ) )
1052 nType = SWHTML_OPTTYPE_IGNORE;
1053 break;
1054 }
1055
1056 return nType;
1057 }
1058 */
1059
GuessOLENodeFrmType(const SwNode & rNode)1060 sal_uInt16 SwHTMLWriter::GuessOLENodeFrmType( const SwNode& rNode )
1061 {
1062 SwOLEObj& rObj = ((SwOLENode*)rNode.GetOLENode())->GetOLEObj();
1063
1064 SwHTMLFrmType eType = HTML_FRMTYPE_OLE;
1065
1066 uno::Reference < embed::XClassifiedObject > xClass ( rObj.GetOleRef(), uno::UNO_QUERY );
1067 SvGlobalName aClass( xClass->getClassID() );
1068 if( aClass == SvGlobalName( SO3_PLUGIN_CLASSID ) )
1069 {
1070 eType = HTML_FRMTYPE_PLUGIN;
1071 }
1072 else if( aClass == SvGlobalName( SO3_IFRAME_CLASSID ) )
1073 {
1074 eType = HTML_FRMTYPE_IFRAME;
1075 }
1076 #ifdef SOLAR_JAVA
1077 else if( aClass == SvGlobalName( SO3_APPLET_CLASSID ) )
1078 {
1079 eType = HTML_FRMTYPE_APPLET;
1080 }
1081 #endif
1082
1083 return static_cast< sal_uInt16 >(eType);
1084 }
1085
OutHTML_FrmFmtOLENode(Writer & rWrt,const SwFrmFmt & rFrmFmt,sal_Bool bInCntnr)1086 Writer& OutHTML_FrmFmtOLENode( Writer& rWrt, const SwFrmFmt& rFrmFmt,
1087 sal_Bool bInCntnr )
1088 {
1089 SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1090
1091 const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
1092 sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
1093 SwOLENode *pOLENd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetOLENode();
1094
1095 ASSERT( pOLENd, "OLE-Node erwartet" );
1096 if( !pOLENd )
1097 return rWrt;
1098
1099 SwOLEObj &rObj = pOLENd->GetOLEObj();
1100
1101 uno::Reference < embed::XEmbeddedObject > xObj( rObj.GetOleRef() );
1102 if ( !svt::EmbeddedObjectRef::TryRunningState( xObj ) )
1103 return rWrt;
1104
1105 uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
1106 sal_Bool bHiddenEmbed = sal_False;
1107
1108 if( !xSet.is() )
1109 {
1110 DBG_ERROR("Unknown Object" );
1111 return rWrt;
1112 }
1113
1114 ByteString aEndTags;
1115 sal_uLong nFrmOpts;
1116
1117 // wenn meoglich vor dem "Objekt" einen Zeilen-Umbruch ausgeben
1118 if( rHTMLWrt.bLFPossible )
1119 rHTMLWrt.OutNewLine( sal_True );
1120
1121 if( rFrmFmt.GetName().Len() )
1122 rHTMLWrt.OutImplicitMark( rFrmFmt.GetName(),
1123 pMarkToOLE );
1124 uno::Any aAny;
1125 SvGlobalName aGlobName( xObj->getClassID() );
1126 ByteString sOut('<');
1127 if( aGlobName == SvGlobalName( SO3_PLUGIN_CLASSID ) )
1128 {
1129 // erstmal das Plug-spezifische
1130 sOut += OOO_STRING_SVTOOLS_HTML_embed;
1131
1132 ::rtl::OUString aStr;
1133 String aURL;
1134 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginURL" ) );
1135 if( (aAny >>= aStr) && aStr.getLength() )
1136 {
1137 aURL = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(),
1138 aStr);
1139 }
1140
1141 if( aURL.Len() )
1142 {
1143 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_src) += "=\"";
1144 rWrt.Strm() << sOut.GetBuffer();
1145 HTMLOutFuncs::Out_String( rWrt.Strm(), aURL, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1146 sOut = '\"';
1147 }
1148
1149 ::rtl::OUString aType;
1150 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginMimeType" ) );
1151 if( (aAny >>= aType) && aType.getLength() )
1152 {
1153 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_type) += "=\"";
1154 rWrt.Strm() << sOut.GetBuffer();
1155 HTMLOutFuncs::Out_String( rWrt.Strm(), aType, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1156 sOut = '\"';
1157 }
1158
1159 if ((FLY_AT_PARA == rFrmFmt.GetAnchor().GetAnchorId()) &&
1160 SURROUND_THROUGHT == rFrmFmt.GetSurround().GetSurround() )
1161 {
1162 // Das Plugin ist HIDDEN
1163 (sOut += ' ') += OOO_STRING_SW_HTML_O_Hidden;
1164 nFrmOpts = HTML_FRMOPTS_HIDDEN_EMBED;
1165 bHiddenEmbed = sal_True;
1166 }
1167 else
1168 {
1169 nFrmOpts = bInCntnr ? HTML_FRMOPTS_EMBED_CNTNR
1170 : HTML_FRMOPTS_EMBED;
1171 }
1172 }
1173 else if( aGlobName == SvGlobalName( SO3_APPLET_CLASSID ) )
1174 {
1175 // oder das Applet-Spezifische
1176
1177 sOut += OOO_STRING_SVTOOLS_HTML_applet;
1178
1179 // CODEBASE
1180 ::rtl::OUString aCd;
1181 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCodeBase" ) );
1182 if( (aAny >>= aCd) && aCd.getLength() )
1183 {
1184 String sCodeBase( URIHelper::simpleNormalizedMakeRelative(rWrt.GetBaseURL(), aCd) );
1185 if( sCodeBase.Len() )
1186 {
1187 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_codebase) += "=\"";
1188 rWrt.Strm() << sOut.GetBuffer();
1189 HTMLOutFuncs::Out_String( rWrt.Strm(), sCodeBase, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1190 sOut = '\"';
1191 }
1192 }
1193
1194 // CODE
1195 ::rtl::OUString aClass;
1196 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCode" ) );
1197 aAny >>= aClass;
1198 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_code) += "=\"";
1199 rWrt.Strm() << sOut.GetBuffer();
1200 HTMLOutFuncs::Out_String( rWrt.Strm(), aClass, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1201 sOut = '\"';
1202
1203 // NAME
1204 ::rtl::OUString aAppletName;
1205 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletName" ) );
1206 aAny >>= aAppletName;
1207 if( aAppletName.getLength() )
1208 {
1209 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"";
1210 rWrt.Strm() << sOut.GetBuffer();
1211 HTMLOutFuncs::Out_String( rWrt.Strm(), aAppletName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1212 sOut = '\"';
1213 }
1214
1215 sal_Bool bScript = sal_False;
1216 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletIsScript" ) );
1217 aAny >>= bScript;
1218 if( bScript )
1219 (sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_mayscript;
1220
1221 nFrmOpts = bInCntnr ? HTML_FRMOPTS_APPLET_CNTNR
1222 : HTML_FRMOPTS_APPLET;
1223 }
1224 else
1225 {
1226 // oder das Flating-Frame spezifische
1227
1228 sOut += OOO_STRING_SVTOOLS_HTML_iframe;
1229 rWrt.Strm() << sOut.GetBuffer();
1230
1231 SfxFrameHTMLWriter::Out_FrameDescriptor( rWrt.Strm(), rWrt.GetBaseURL(),
1232 xSet,
1233 rHTMLWrt.eDestEnc,
1234 &rHTMLWrt.aNonConvertableCharacters );
1235 sOut.Erase();
1236
1237 nFrmOpts = bInCntnr ? HTML_FRMOPTS_IFRAME_CNTNR
1238 : HTML_FRMOPTS_IFRAME;
1239 }
1240
1241 rWrt.Strm() << sOut.GetBuffer();
1242
1243 // ALT, WIDTH, HEIGHT, HSPACE, VSPACE, ALIGN
1244 if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bHiddenEmbed )
1245 nFrmOpts |= HTML_FRMOPTS_OLE_CSS1;
1246 rHTMLWrt.OutFrmFmtOptions( rFrmFmt, pOLENd->GetTitle(),
1247 aEndTags, nFrmOpts );
1248 if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bHiddenEmbed )
1249 rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmOpts );
1250
1251 if( aGlobName == SvGlobalName( SO3_APPLET_CLASSID ) )
1252 {
1253 // fuer Applets die Parameter als eigene Tags ausgeben
1254 // und ein </APPLET> schreiben
1255
1256 uno::Sequence < beans::PropertyValue > aProps;
1257 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCommands" ) );
1258 aAny >>= aProps;
1259
1260 SvCommandList aCommands;
1261 aCommands.FillFromSequence( aProps );
1262 SvULongs aParams;
1263 sal_uLong i = aCommands.Count();
1264 while( i > 0 )
1265 {
1266 const SvCommand& rCommand = aCommands[ --i ];
1267 const String& rName = rCommand.GetCommand();
1268 sal_uInt16 nType = SwApplet_Impl::GetOptionType( rName, sal_True );
1269 if( SWHTML_OPTTYPE_TAG == nType )
1270 {
1271 const String& rValue = rCommand.GetArgument();
1272 rWrt.Strm() << ' ';
1273 HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1274 rWrt.Strm() << "=\"";
1275 HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
1276 }
1277 else if( SWHTML_OPTTYPE_PARAM == nType )
1278 {
1279 aParams.Insert( i, aParams.Count() );
1280 }
1281 }
1282
1283 rHTMLWrt.Strm() << '>';
1284
1285 rHTMLWrt.IncIndentLevel(); // Inhalt von Applet einruecken
1286
1287 sal_uInt16 ii = aParams.Count();
1288 while( ii > 0 )
1289 {
1290 const SvCommand& rCommand = aCommands[ aParams[--ii] ];
1291 const String& rName = rCommand.GetCommand();
1292 const String& rValue = rCommand.GetArgument();
1293 rHTMLWrt.OutNewLine();
1294 ((((sOut = '<') += OOO_STRING_SVTOOLS_HTML_param) += ' ') += OOO_STRING_SVTOOLS_HTML_O_name)
1295 += "=\"";
1296 rWrt.Strm() << sOut.GetBuffer();
1297 HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1298 ((sOut = "\" ") += OOO_STRING_SVTOOLS_HTML_O_value) += "=\"";
1299 rWrt.Strm() << sOut.GetBuffer();
1300 HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << "\">";
1301 }
1302
1303 rHTMLWrt.DecIndentLevel(); // Inhalt von Applet einruecken
1304 if( aCommands.Count() )
1305 rHTMLWrt.OutNewLine();
1306 HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_applet, sal_False );
1307 }
1308 else
1309 if( aGlobName == SvGlobalName( SO3_PLUGIN_CLASSID ) )
1310 {
1311 // fuer Plugins die Paramater als Optionen schreiben
1312
1313 uno::Sequence < beans::PropertyValue > aProps;
1314 aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginCommands" ) );
1315 aAny >>= aProps;
1316
1317 SvCommandList aCommands;
1318 aCommands.FillFromSequence( aProps );
1319 for( sal_uLong i=0; i<aCommands.Count(); i++ )
1320 {
1321 const SvCommand& rCommand = aCommands[ i ];
1322 const String& rName = rCommand.GetCommand();
1323
1324 if( SwApplet_Impl::GetOptionType( rName, sal_False ) == SWHTML_OPTTYPE_TAG )
1325 {
1326 const String& rValue = rCommand.GetArgument();
1327 rWrt.Strm() << ' ';
1328 HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
1329 rWrt.Strm() << "=\"";
1330 HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
1331 }
1332 }
1333 rHTMLWrt.Strm() << '>';
1334 }
1335 else
1336 {
1337 // und fuer Floating-Frames einfach noch ein </IFRAME>
1338 // ausgeben
1339
1340 rHTMLWrt.Strm() << '>';
1341 HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_iframe, sal_False );
1342 }
1343
1344 if( aEndTags.Len() )
1345 rWrt.Strm() << aEndTags.GetBuffer();
1346
1347 return rWrt;
1348 }
1349
OutHTML_FrmFmtOLENodeGrf(Writer & rWrt,const SwFrmFmt & rFrmFmt,sal_Bool bInCntnr)1350 Writer& OutHTML_FrmFmtOLENodeGrf( Writer& rWrt, const SwFrmFmt& rFrmFmt,
1351 sal_Bool bInCntnr )
1352 {
1353 SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
1354
1355 const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
1356 sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
1357 SwOLENode *pOLENd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetOLENode();
1358
1359 ASSERT( pOLENd, "OLE-Node erwartet" );
1360 if( !pOLENd )
1361 return rWrt;
1362
1363 // Inhalt des Nodes als Grafik speichern
1364 //uno::Reference < embed::XEmbeddedObject > xObj = pOLENd->GetOLEObj().GetOleRef();
1365 //GDIMetaFile aPic;
1366 //if( xObj.is() && xRef->GetGDIMetaFile( aPic ).GetActionCount() )
1367 {
1368 //Graphic aGrf( aPic );
1369 Graphic aGrf( *pOLENd->GetGraphic() );
1370 String aGrfNm;
1371 const String* pTempFileName = rHTMLWrt.GetOrigFileName();
1372 if(pTempFileName)
1373 aGrfNm = *pTempFileName;
1374
1375 sal_uInt16 nErr = XOutBitmap::WriteGraphic( aGrf, aGrfNm,
1376 String::CreateFromAscii("JPG"),
1377 (XOUTBMP_USE_GIF_IF_POSSIBLE |
1378 XOUTBMP_USE_NATIVE_IF_POSSIBLE) );
1379 if( nErr ) // fehlerhaft, da ist nichts auszugeben
1380 {
1381 rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
1382 return rWrt;
1383 }
1384 aGrfNm = URIHelper::SmartRel2Abs(
1385 INetURLObject(rWrt.GetBaseURL()), aGrfNm,
1386 URIHelper::GetMaybeFileHdl() );
1387 sal_uLong nFlags = bInCntnr ? HTML_FRMOPTS_GENIMG_CNTNR
1388 : HTML_FRMOPTS_GENIMG;
1389 OutHTML_Image( rWrt, rFrmFmt, aGrfNm,
1390 pOLENd->GetTitle(), pOLENd->GetTwipSize(),
1391 nFlags, pMarkToOLE );
1392 }
1393
1394 return rWrt;
1395 }
1396
1397
1398