xref: /AOO41X/main/sw/source/filter/html/htmlplug.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
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