blob: 0c569346c99af2b89045383c60062a8b0fff6813 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <com/sun/star/embed/EmbedStates.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include "hintids.hxx"
#include <svl/urihelper.hxx>
#define _SVSTDARR_ULONGS
#include <svl/svstdarr.hxx>
#include <vcl/svapp.hxx>
#include <sfx2/frmhtml.hxx>
#include <sfx2/frmhtmlw.hxx>
#include <vcl/wrkwin.hxx>
#include <sot/storage.hxx>
#include <svx/xoutbmp.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/lrspitem.hxx>
#include <svtools/htmlkywd.hxx>
#include <svtools/htmltokn.h>
#include <SwAppletImpl.hxx>
#include <fmtornt.hxx>
#include <fmtfsize.hxx>
#include <fmtsrnd.hxx>
#include <fmtanchr.hxx>
#include <fmtcntnt.hxx>
#include <frmfmt.hxx>
#include <svl/ownlist.hxx>
#include "pam.hxx"
#include "doc.hxx"
#include "ndtxt.hxx"
#include "swerror.h"
#include "ndole.hxx"
#include "swtable.hxx"
#include "swhtml.hxx"
#include "wrthtml.hxx"
#include "htmlfly.hxx"
#include "swcss1.hxx"
#include <com/sun/star/embed/XClassifiedObject.hpp>
#include <com/sun/star/embed/EmbedStates.hpp>
#include <comphelper/embeddedobjectcontainer.hxx>
#include <sot/clsids.hxx>
using namespace com::sun::star;
#define HTML_DFLT_EMBED_WIDTH ((MM50*5)/2)
#define HTML_DFLT_EMBED_HEIGHT ((MM50*5)/2)
#define HTML_DFLT_APPLET_WIDTH ((MM50*5)/2)
#define HTML_DFLT_APPLET_HEIGHT ((MM50*5)/2)
namespace {
static char const sHTML_O_Hidden_False[] = "sal_False";
}
const sal_uLong HTML_FRMOPTS_EMBED_ALL =
HTML_FRMOPT_ALT |
HTML_FRMOPT_SIZE |
HTML_FRMOPT_NAME;
const sal_uLong HTML_FRMOPTS_EMBED_CNTNR =
HTML_FRMOPTS_EMBED_ALL |
HTML_FRMOPT_ABSSIZE;
const sal_uLong HTML_FRMOPTS_EMBED =
HTML_FRMOPTS_EMBED_ALL |
HTML_FRMOPT_ALIGN |
HTML_FRMOPT_SPACE |
HTML_FRMOPT_BRCLEAR |
HTML_FRMOPT_NAME;
const sal_uLong HTML_FRMOPTS_HIDDEN_EMBED =
HTML_FRMOPT_ALT |
HTML_FRMOPT_NAME;
const sal_uLong HTML_FRMOPTS_APPLET_ALL =
HTML_FRMOPT_ALT |
HTML_FRMOPT_SIZE;
const sal_uLong HTML_FRMOPTS_APPLET_CNTNR =
HTML_FRMOPTS_APPLET_ALL |
HTML_FRMOPT_ABSSIZE;
const sal_uLong HTML_FRMOPTS_APPLET =
HTML_FRMOPTS_APPLET_ALL |
HTML_FRMOPT_ALIGN |
HTML_FRMOPT_SPACE |
HTML_FRMOPT_BRCLEAR;
const sal_uLong HTML_FRMOPTS_IFRAME_ALL =
HTML_FRMOPT_ALT |
HTML_FRMOPT_SIZE;
const sal_uLong HTML_FRMOPTS_IFRAME_CNTNR =
HTML_FRMOPTS_IFRAME_ALL |
HTML_FRMOPT_ABSSIZE;
const sal_uLong HTML_FRMOPTS_IFRAME =
HTML_FRMOPTS_IFRAME_ALL |
HTML_FRMOPT_ALIGN |
HTML_FRMOPT_SPACE |
HTML_FRMOPT_BORDER |
HTML_FRMOPT_BRCLEAR;
const sal_uLong HTML_FRMOPTS_OLE_CSS1 =
HTML_FRMOPT_S_ALIGN |
HTML_FRMOPT_S_SPACE;
/* */
void SwHTMLParser::SetFixSize( const Size& rPixSize,
const Size& rTwipDfltSize,
sal_Bool bPrcWidth, sal_Bool bPrcHeight,
SfxItemSet& /*rCSS1ItemSet*/,
SvxCSS1PropertyInfo& rCSS1PropInfo,
SfxItemSet& rFlyItemSet )
{
// absolulte Groessenangaben in Twip umrechnen
sal_uInt8 nPrcWidth = 0, nPrcHeight = 0;
Size aTwipSz( bPrcWidth || USHRT_MAX==rPixSize.Width() ? 0 : rPixSize.Width(),
bPrcHeight || USHRT_MAX==rPixSize.Height() ? 0 : rPixSize.Height() );
if( (aTwipSz.Width() || aTwipSz.Height()) && Application::GetDefaultDevice() )
{
aTwipSz =
Application::GetDefaultDevice()->PixelToLogic( aTwipSz,
MapMode(MAP_TWIP) );
}
// die Breite bearbeiten
if( SVX_CSS1_LTYPE_PERCENTAGE == rCSS1PropInfo.eWidthType )
{
nPrcWidth = (sal_uInt8)rCSS1PropInfo.nWidth;
aTwipSz.Width() = rTwipDfltSize.Width();
}
else if( SVX_CSS1_LTYPE_TWIP== rCSS1PropInfo.eWidthType )
{
aTwipSz.Width() = rCSS1PropInfo.nWidth;
}
else if( bPrcWidth && rPixSize.Width() )
{
nPrcWidth = (sal_uInt8)rPixSize.Width();
if( nPrcWidth > 100 )
nPrcWidth = 100;
aTwipSz.Width() = rTwipDfltSize.Width();
}
else if( USHRT_MAX==rPixSize.Width() )
{
aTwipSz.Width() = rTwipDfltSize.Width();
}
if( aTwipSz.Width() < MINFLY )
{
aTwipSz.Width() = MINFLY;
}
// Hoehe bearbeiten
if( SVX_CSS1_LTYPE_PERCENTAGE == rCSS1PropInfo.eHeightType )
{
nPrcHeight = (sal_uInt8)rCSS1PropInfo.nHeight;
aTwipSz.Height() = rTwipDfltSize.Height();
}
else if( SVX_CSS1_LTYPE_TWIP== rCSS1PropInfo.eHeightType )
{
aTwipSz.Height() = rCSS1PropInfo.nHeight;
}
else if( bPrcHeight && rPixSize.Height() )
{
nPrcHeight = (sal_uInt8)rPixSize.Height();
if( nPrcHeight > 100 )
nPrcHeight = 100;
aTwipSz.Height() = rTwipDfltSize.Height();
}
else if( USHRT_MAX==rPixSize.Height() )
{
aTwipSz.Height() = rTwipDfltSize.Height();
}
if( aTwipSz.Height() < MINFLY )
{
aTwipSz.Height() = MINFLY;
}
// Size setzen
SwFmtFrmSize aFrmSize( ATT_FIX_SIZE, aTwipSz.Width(), aTwipSz.Height() );
aFrmSize.SetWidthPercent( nPrcWidth );
aFrmSize.SetHeightPercent( nPrcHeight );
rFlyItemSet.Put( aFrmSize );
}
void SwHTMLParser::SetSpace( const Size& rPixSpace,
SfxItemSet& rCSS1ItemSet,
SvxCSS1PropertyInfo& rCSS1PropInfo,
SfxItemSet& rFlyItemSet )
{
sal_Int32 nLeftSpace = 0, nRightSpace = 0;
sal_uInt16 nUpperSpace = 0, nLowerSpace = 0;
if( (rPixSpace.Width() || rPixSpace.Height()) && Application::GetDefaultDevice() )
{
Size aTwipSpc( rPixSpace.Width(), rPixSpace.Height() );
aTwipSpc =
Application::GetDefaultDevice()->PixelToLogic( aTwipSpc,
MapMode(MAP_TWIP) );
nLeftSpace = nRightSpace = aTwipSpc.Width();
nUpperSpace = nLowerSpace = (sal_uInt16)aTwipSpc.Height();
}
// linken/rechten Rand setzen
const SfxPoolItem *pItem;
if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_LR_SPACE, sal_True, &pItem ) )
{
// Ggf. den Erstzeilen-Einzug noch plaetten
const SvxLRSpaceItem *pLRItem = (const SvxLRSpaceItem *)pItem;
SvxLRSpaceItem aLRItem( *pLRItem );
aLRItem.SetTxtFirstLineOfst( 0 );
if( rCSS1PropInfo.bLeftMargin )
{
nLeftSpace = aLRItem.GetLeft();
rCSS1PropInfo.bLeftMargin = sal_False;
}
if( rCSS1PropInfo.bRightMargin )
{
nRightSpace = aLRItem.GetRight();
rCSS1PropInfo.bRightMargin = sal_False;
}
rCSS1ItemSet.ClearItem( RES_LR_SPACE );
}
if( nLeftSpace > 0 || nRightSpace > 0 )
{
SvxLRSpaceItem aLRItem( RES_LR_SPACE );
aLRItem.SetLeft( nLeftSpace > 0 ? nLeftSpace : 0 );
aLRItem.SetRight( nRightSpace > 0 ? nRightSpace : 0 );
rFlyItemSet.Put( aLRItem );
if( nLeftSpace )
{
const SwFmtHoriOrient& rHoriOri =
(const SwFmtHoriOrient&)rFlyItemSet.Get( RES_HORI_ORIENT );
if( text::HoriOrientation::NONE == rHoriOri.GetHoriOrient() )
{
SwFmtHoriOrient aHoriOri( rHoriOri );
aHoriOri.SetPos( aHoriOri.GetPos() + nLeftSpace );
rFlyItemSet.Put( aHoriOri );
}
}
}
// oberen/unteren Rand setzen
if( SFX_ITEM_SET==rCSS1ItemSet.GetItemState( RES_UL_SPACE, sal_True, &pItem ) )
{
// Ggf. den Erstzeilen-Einzug noch plaetten
const SvxULSpaceItem *pULItem = (const SvxULSpaceItem *)pItem;
if( rCSS1PropInfo.bTopMargin )
{
nUpperSpace = pULItem->GetUpper();
rCSS1PropInfo.bTopMargin = sal_False;
}
if( rCSS1PropInfo.bBottomMargin )
{
nLowerSpace = pULItem->GetLower();
rCSS1PropInfo.bBottomMargin = sal_False;
}
rCSS1ItemSet.ClearItem( RES_UL_SPACE );
}
if( nUpperSpace || nLowerSpace )
{
SvxULSpaceItem aULItem( RES_UL_SPACE );
aULItem.SetUpper( nUpperSpace );
aULItem.SetLower( nLowerSpace );
rFlyItemSet.Put( aULItem );
if( nUpperSpace )
{
const SwFmtVertOrient& rVertOri =
(const SwFmtVertOrient&)rFlyItemSet.Get( RES_VERT_ORIENT );
if( text::VertOrientation::NONE == rVertOri.GetVertOrient() )
{
SwFmtVertOrient aVertOri( rVertOri );
aVertOri.SetPos( aVertOri.GetPos() + nUpperSpace );
rFlyItemSet.Put( aVertOri );
}
}
}
}
/* */
void SwHTMLParser::InsertEmbed()
{
String aURL, aType, aName, aAlt, aId, aStyle, aClass;
Size aSize( USHRT_MAX, USHRT_MAX );
Size aSpace( USHRT_MAX, USHRT_MAX );
sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False, bHidden = sal_False;
sal_Int16 eVertOri = text::VertOrientation::NONE;
sal_Int16 eHoriOri = text::HoriOrientation::NONE;
SvCommandList aCmdLst;
const HTMLOptions *pHTMLOptions = GetOptions();
// Die Optionen werden vorwaerts gelesen, weil die Plugins sie in
// dieser Reihenfolge erwarten. Trotzdem darf immer nur der erste
// Wert einer Option beruecksichtigt werden.
sal_uInt16 nArrLen = pHTMLOptions->Count();
for( sal_uInt16 i=0; i<nArrLen; i++ )
{
const HTMLOption *pOption = (*pHTMLOptions)[i];
switch( pOption->GetToken() )
{
case HTML_O_ID:
aId = pOption->GetString();
break;
case HTML_O_STYLE:
aStyle = pOption->GetString();
break;
case HTML_O_CLASS:
aClass = pOption->GetString();
break;
case HTML_O_NAME:
aName = pOption->GetString();
break;
case HTML_O_SRC:
if( !aURL.Len() )
aURL = pOption->GetString();
break;
case HTML_O_ALT:
aAlt = pOption->GetString();
break;
case HTML_O_TYPE:
if( !aType.Len() )
aType = pOption->GetString();
break;
case HTML_O_ALIGN:
if( eVertOri==text::VertOrientation::NONE && eHoriOri==text::HoriOrientation::NONE )
{
eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
}
break;
case HTML_O_WIDTH:
if( USHRT_MAX==aSize.Width() )
{
bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Width() = (long)pOption->GetNumber();
}
break;
case HTML_O_HEIGHT:
if( USHRT_MAX==aSize.Height() )
{
bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Height() = (long)pOption->GetNumber();
}
break;
case HTML_O_HSPACE:
if( USHRT_MAX==aSpace.Width() )
aSpace.Width() = (long)pOption->GetNumber();
break;
case HTML_O_VSPACE:
if( USHRT_MAX==aSpace.Height() )
aSpace.Height() = (long)pOption->GetNumber();
break;
case HTML_O_UNKNOWN:
if( pOption->GetTokenString().EqualsIgnoreCaseAscii( OOO_STRING_SW_HTML_O_Hidden ) )
bHidden =
!pOption->GetString().EqualsIgnoreCaseAscii( sHTML_O_Hidden_False );
break;
}
// Es werden alle Parameter an das Plugin weitergereicht
aCmdLst.Append( pOption->GetTokenString(), pOption->GetString() );
}
SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
SvxCSS1PropertyInfo aPropInfo;
if( HasStyleOptions( aStyle, aId, aClass ) )
ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
// Die Default-Werte umsetzen (ausser Hoehe/Breite, das macht schon
// SetFrmSize() fuer uns)
if( eVertOri==text::VertOrientation::NONE && eHoriOri==text::HoriOrientation::NONE )
eVertOri = text::VertOrientation::TOP;
if( USHRT_MAX==aSpace.Width() )
aSpace.Width() = 0;
if( USHRT_MAX==aSpace.Height() )
aSpace.Height() = 0;
if( bHidden )
{
// Size (0,0) wird in SetFrmSize auf (MINFLY, MINFLY) umgebogen
aSize.Width() = 0; aSize.Height() = 0;
aSpace.Width() = 0; aSpace.Height() = 0;
bPrcWidth = bPrcHeight = sal_False;
}
// die URL aufbereiten
INetURLObject aURLObj;
bool bHasURL = aURL.Len() &&
aURLObj.SetURL(
URIHelper::SmartRel2Abs(
INetURLObject(sBaseURL), aURL,
URIHelper::GetMaybeFileHdl()) );
// #109761# do not insert plugin if it has neither URL nor type
bool bHasType = aType.Len() != 0;
if( !bHasURL && !bHasType )
return;
// das Plugin anlegen
comphelper::EmbeddedObjectContainer aCnt;
::rtl::OUString aObjName;
uno::Reference < embed::XEmbeddedObject > xObj = aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), aObjName );
if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
{
uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
if ( xSet.is() )
{
if( bHasURL )
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginURL"),
uno::makeAny( ::rtl::OUString( aURL ) ) );
if( bHasType )
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginMimeType"),
uno::makeAny( ::rtl::OUString( aType ) ) );
uno::Sequence < beans::PropertyValue > aProps;
aCmdLst.FillSequence( aProps );
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("PluginCommands"), uno::makeAny( aProps ) );
// TODO/LATER: EnableSetModified?!
//pPlugin->EnableSetModified( sal_True );
}
}
SfxItemSet aFrmSet( pDoc->GetAttrPool(),
RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
if( !IsNewDoc() )
Reader::ResetFrmFmtAttrs( aFrmSet );
// den Anker setzen
if( !bHidden )
{
SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, aFrmSet );
}
else
{
SwFmtAnchor aAnchor( FLY_AT_PARA );
aAnchor.SetAnchor( pPam->GetPoint() );
aFrmSet.Put( aAnchor );
aFrmSet.Put( SwFmtHoriOrient( 0, text::HoriOrientation::LEFT, text::RelOrientation::FRAME) );
aFrmSet.Put( SwFmtSurround( SURROUND_THROUGHT ) );
aFrmSet.Put( SwFmtVertOrient( 0, text::VertOrientation::TOP, text::RelOrientation::PRINT_AREA ) );
}
// und noch die Groesse des Rahmens
Size aDfltSz( HTML_DFLT_EMBED_WIDTH, HTML_DFLT_EMBED_HEIGHT );
SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
aFrmSet );
SetSpace( aSpace, aItemSet, aPropInfo, aFrmSet );
// und in das Dok einfuegen
SwFrmFmt* pFlyFmt =
pDoc->Insert( *pPam, ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ), &aFrmSet, NULL, NULL );
// Namen am FrmFmt setzen
if( aName.Len() )
pFlyFmt->SetName( aName );
// den alternativen Text setzen
SwNoTxtNode *pNoTxtNd =
pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
->GetIndex()+1 ]->GetNoTxtNode();
pNoTxtNd->SetTitle( aAlt );
// Ggf Frames anlegen und auto-geb. Rahmen registrieren
if( !bHidden )
{
// HIDDEN-Plugins sollen absatzgebunden bleiben. Da RegisterFlyFrm
// absatzgebundene Rahmen mit DUrchlauf in am Zeichen gebundene
// Rahmen umwandelt, muessen die Frames hier von Hand angelegt werden.
RegisterFlyFrm( pFlyFmt );
}
}
/* */
#ifdef SOLAR_JAVA
void SwHTMLParser::NewObject()
{
String aClassID, aName, aStandBy, aId, aStyle, aClass;
Size aSize( USHRT_MAX, USHRT_MAX );
Size aSpace( 0, 0 );
sal_Int16 eVertOri = text::VertOrientation::TOP;
sal_Int16 eHoriOri = text::HoriOrientation::NONE;
sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False,
bDeclare = sal_False;
// Eine neue Command-List anlegen
if( pAppletImpl )
delete pAppletImpl;
pAppletImpl = new SwApplet_Impl( pDoc->GetAttrPool(),
RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
const HTMLOptions *pHTMLOptions = GetOptions();
for( sal_uInt16 i = pHTMLOptions->Count(); i; )
{
const HTMLOption *pOption = (*pHTMLOptions)[--i];
switch( pOption->GetToken() )
{
case HTML_O_ID:
aId = pOption->GetString();
break;
case HTML_O_STYLE:
aStyle = pOption->GetString();
break;
case HTML_O_CLASS:
aClass = pOption->GetString();
break;
case HTML_O_DECLARE:
bDeclare = sal_True;
break;
case HTML_O_CLASSID:
aClassID = pOption->GetString();
break;
case HTML_O_CODEBASE:
break;
case HTML_O_DATA:
break;
case HTML_O_TYPE:
break;
case HTML_O_CODETYPE:
break;
case HTML_O_ARCHIVE:
case HTML_O_UNKNOWN:
break;
case HTML_O_STANDBY:
aStandBy = pOption->GetString();
break;
case HTML_O_WIDTH:
bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Width() = (long)pOption->GetNumber();
break;
case HTML_O_HEIGHT:
bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Height() = (long)pOption->GetNumber();
break;
case HTML_O_ALIGN:
eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
break;
case HTML_O_USEMAP:
break;
case HTML_O_NAME:
aName = pOption->GetString();
break;
case HTML_O_HSPACE:
aSpace.Width() = (long)pOption->GetNumber();
break;
case HTML_O_VSPACE:
aSpace.Height() = (long)pOption->GetNumber();
break;
case HTML_O_BORDER:
break;
case HTML_O_SDONCLICK:
case HTML_O_ONCLICK:
case HTML_O_SDONMOUSEOVER:
case HTML_O_ONMOUSEOVER:
case HTML_O_SDONMOUSEOUT:
case HTML_O_ONMOUSEOUT:
break;
}
// Es werden alle Parameter auch an das Applet weitergereicht
pAppletImpl->AppendParam( pOption->GetTokenString(),
pOption->GetString() );
}
// Objects that are declared only are not evaluated. Moreover, only
// Java applets are supported.
sal_Bool bIsApplet = sal_False;;
if( !bDeclare && aClassID.Len() == 42 &&
aClassID.EqualsAscii( "clsid:", 0, 6 ) )
{
aClassID.Erase( 0, 6 );
SvGlobalName aCID;
if( aCID.MakeId( aClassID ) )
{
SvGlobalName aJavaCID( 0x8AD9C840UL, 0x044EU, 0x11D1U, 0xB3U, 0xE9U,
0x00U, 0x80U, 0x5FU, 0x49U, 0x9DU, 0x93U );
bIsApplet = aJavaCID == aCID;
}
}
if( !bIsApplet )
{
delete pAppletImpl;
pAppletImpl = 0;
return;
}
pAppletImpl->SetAltText( aStandBy );
SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
SvxCSS1PropertyInfo aPropInfo;
if( HasStyleOptions( aStyle, aId, aClass ) )
ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
SfxItemSet& rFrmSet = pAppletImpl->GetItemSet();
if( !IsNewDoc() )
Reader::ResetFrmFmtAttrs( rFrmSet );
// den Anker und die Ausrichtung setzen
SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, rFrmSet );
// und noch die Groesse des Rahmens
Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
rFrmSet );
SetSpace( aSpace, aItemSet, aPropInfo, rFrmSet );
}
#endif
void SwHTMLParser::EndObject()
{
#ifdef SOLAR_JAVA
if( !pAppletImpl )
return;
if( pAppletImpl->CreateApplet( sBaseURL ) )
{
pAppletImpl->FinishApplet();
// und in das Dok einfuegen
SwFrmFmt* pFlyFmt =
pDoc->Insert( *pPam,
::svt::EmbeddedObjectRef( pAppletImpl->GetApplet(), embed::Aspects::MSOLE_CONTENT ),
&pAppletImpl->GetItemSet(),
NULL,
NULL );
// den alternativen Namen setzen
SwNoTxtNode *pNoTxtNd =
pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
->GetIndex()+1 ]->GetNoTxtNode();
pNoTxtNd->SetTitle( pAppletImpl->GetAltText() );
// Ggf Frames anlegen und auto-geb. Rahmen registrieren
RegisterFlyFrm( pFlyFmt );
delete pAppletImpl;
pAppletImpl = 0;
}
#endif
}
#ifdef SOLAR_JAVA
void SwHTMLParser::InsertApplet()
{
String aCodeBase, aCode, aName, aAlt, aId, aStyle, aClass;
Size aSize( USHRT_MAX, USHRT_MAX );
Size aSpace( 0, 0 );
sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False, bMayScript = sal_False;
sal_Int16 eVertOri = text::VertOrientation::TOP;
sal_Int16 eHoriOri = text::HoriOrientation::NONE;
// Eine neue Command-List anlegen
if( pAppletImpl )
delete pAppletImpl;
pAppletImpl = new SwApplet_Impl( pDoc->GetAttrPool(), RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
const HTMLOptions *pHTMLOptions = GetOptions();
for( sal_uInt16 i = pHTMLOptions->Count(); i; )
{
const HTMLOption *pOption = (*pHTMLOptions)[--i];
switch( pOption->GetToken() )
{
case HTML_O_ID:
aId = pOption->GetString();
break;
case HTML_O_STYLE:
aStyle = pOption->GetString();
break;
case HTML_O_CLASS:
aClass = pOption->GetString();
break;
case HTML_O_CODEBASE:
aCodeBase = pOption->GetString();
break;
case HTML_O_CODE:
aCode = pOption->GetString();
break;
case HTML_O_NAME:
aName = pOption->GetString();
break;
case HTML_O_ALT:
aAlt = pOption->GetString();
break;
case HTML_O_ALIGN:
eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
break;
case HTML_O_WIDTH:
bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Width() = (long)pOption->GetNumber();
break;
case HTML_O_HEIGHT:
bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Height() = (long)pOption->GetNumber();
break;
case HTML_O_HSPACE:
aSpace.Width() = (long)pOption->GetNumber();
break;
case HTML_O_VSPACE:
aSpace.Height() = (long)pOption->GetNumber();
break;
case HTML_O_MAYSCRIPT:
bMayScript = sal_True;
break;
}
// Es werden alle Parameter auch an das Applet weitergereicht
pAppletImpl->AppendParam( pOption->GetTokenString(),
pOption->GetString() );
}
if( !aCode.Len() )
{
delete pAppletImpl;
pAppletImpl = 0;
return;
}
if ( aCodeBase.Len() )
aCodeBase = INetURLObject::GetAbsURL( sBaseURL, aCodeBase );
pAppletImpl->CreateApplet( aCode, aName, bMayScript, aCodeBase, sBaseURL );//, aAlt );
pAppletImpl->SetAltText( aAlt );
SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
SvxCSS1PropertyInfo aPropInfo;
if( HasStyleOptions( aStyle, aId, aClass ) )
ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
SfxItemSet& rFrmSet = pAppletImpl->GetItemSet();
if( !IsNewDoc() )
Reader::ResetFrmFmtAttrs( rFrmSet );
// den Anker und die Ausrichtung setzen
SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, rFrmSet );
// und noch die Groesse des Rahmens
Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
rFrmSet );
SetSpace( aSpace, aItemSet, aPropInfo, rFrmSet );
}
#endif
void SwHTMLParser::EndApplet()
{
#ifdef SOLAR_JAVA
if( !pAppletImpl )
return;
pAppletImpl->FinishApplet();
// und in das Dok einfuegen
SwFrmFmt* pFlyFmt =
pDoc->Insert( *pPam,
::svt::EmbeddedObjectRef( pAppletImpl->GetApplet(), embed::Aspects::MSOLE_CONTENT ),
&pAppletImpl->GetItemSet(),
NULL,
NULL );
// den alternativen Namen setzen
SwNoTxtNode *pNoTxtNd =
pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
->GetIndex()+1 ]->GetNoTxtNode();
pNoTxtNd->SetTitle( pAppletImpl->GetAltText() );
// Ggf Frames anlegen und auto-geb. Rahmen registrieren
RegisterFlyFrm( pFlyFmt );
delete pAppletImpl;
pAppletImpl = 0;
#endif
}
void SwHTMLParser::InsertParam()
{
#ifdef SOLAR_JAVA
if( !pAppletImpl )
return;
String aName, aValue;
const HTMLOptions *pHTMLOptions = GetOptions();
for( sal_uInt16 i = pHTMLOptions->Count(); i; )
{
const HTMLOption *pOption = (*pHTMLOptions)[--i];
switch( pOption->GetToken() )
{
case HTML_O_NAME:
aName = pOption->GetString();
break;
case HTML_O_VALUE:
aValue = pOption->GetString();
break;
}
}
if( !aName.Len() )
return;
pAppletImpl->AppendParam( aName, aValue );
#endif
}
/* */
void SwHTMLParser::InsertFloatingFrame()
{
String aAlt, aId, aStyle, aClass;
Size aSize( USHRT_MAX, USHRT_MAX );
Size aSpace( 0, 0 );
sal_Bool bPrcWidth = sal_False, bPrcHeight = sal_False;
sal_Int16 eVertOri = text::VertOrientation::TOP;
sal_Int16 eHoriOri = text::HoriOrientation::NONE;
const HTMLOptions *pHTMLOptions = GetOptions();
// Erstmal die Optionen f?r das Writer-Frame-Format holen
sal_uInt16 nArrLen = pHTMLOptions->Count();
for ( sal_uInt16 i=0; i<nArrLen; i++ )
{
const HTMLOption *pOption = (*pHTMLOptions)[i];
switch( pOption->GetToken() )
{
case HTML_O_ID:
aId = pOption->GetString();
break;
case HTML_O_STYLE:
aStyle = pOption->GetString();
break;
case HTML_O_CLASS:
aClass = pOption->GetString();
break;
case HTML_O_ALT:
aAlt = pOption->GetString();
break;
case HTML_O_ALIGN:
eVertOri = pOption->GetEnum( aHTMLImgVAlignTable, eVertOri );
eHoriOri = pOption->GetEnum( aHTMLImgHAlignTable, eHoriOri );
break;
case HTML_O_WIDTH:
bPrcWidth = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Width() = (long)pOption->GetNumber();
break;
case HTML_O_HEIGHT:
bPrcHeight = (pOption->GetString().Search('%') != STRING_NOTFOUND);
aSize.Height() = (long)pOption->GetNumber();
break;
case HTML_O_HSPACE:
aSpace.Width() = (long)pOption->GetNumber();
break;
case HTML_O_VSPACE:
aSpace.Height() = (long)pOption->GetNumber();
break;
}
}
// und jetzt die fuer den SfxFrame
SfxFrameDescriptor aFrameDesc;
SfxFrameHTMLParser::ParseFrameOptions( &aFrameDesc, pHTMLOptions, sBaseURL );
// den Floating-Frame anlegen
comphelper::EmbeddedObjectContainer aCnt;
::rtl::OUString aObjName;
uno::Reference < embed::XEmbeddedObject > xObj = aCnt.CreateEmbeddedObject( SvGlobalName( SO3_IFRAME_CLASSID ).GetByteSequence(), aObjName );
//pFrame->EnableSetModified( sal_False );
try
{
// TODO/MBA: testing
if ( svt::EmbeddedObjectRef::TryRunningState( xObj ) )
{
uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
if ( xSet.is() )
{
::rtl::OUString aName = aFrameDesc.GetName();
ScrollingMode eScroll = aFrameDesc.GetScrollingMode();
sal_Bool bHasBorder = aFrameDesc.HasFrameBorder();
Size aMargin = aFrameDesc.GetMargin();
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameURL"), uno::makeAny( ::rtl::OUString( aFrameDesc.GetURL().GetMainURL( INetURLObject::NO_DECODE ) ) ) );
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameName"), uno::makeAny( aName ) );
if ( eScroll == ScrollingAuto )
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoScroll"),
uno::makeAny( sal_True ) );
else
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsScrollingMode"),
uno::makeAny( (sal_Bool) ( eScroll == ScrollingYes) ) );
//if ( aFrmDescr.IsFrameBorderSet() )
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsBorder"),
uno::makeAny( bHasBorder ) );
/*else
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoBorder"),
uno::makeAny( sal_True ) );*/
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginWidth"),
uno::makeAny( sal_Int32( aMargin.Width() ) ) );
xSet->setPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginHeight"),
uno::makeAny( sal_Int32( aMargin.Height() ) ) );
}
}
}
catch ( uno::Exception& )
{
}
//pFrame->EnableSetModified( sal_True );
SfxItemSet aItemSet( pDoc->GetAttrPool(), pCSS1Parser->GetWhichMap() );
SvxCSS1PropertyInfo aPropInfo;
if( HasStyleOptions( aStyle, aId, aClass ) )
ParseStyleOptions( aStyle, aId, aClass, aItemSet, aPropInfo );
// den Itemset holen
SfxItemSet aFrmSet( pDoc->GetAttrPool(),
RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
if( !IsNewDoc() )
Reader::ResetFrmFmtAttrs( aFrmSet );
// den Anker und die Ausrichtung setzen
SetAnchorAndAdjustment( eVertOri, eHoriOri, aItemSet, aPropInfo, aFrmSet );
// und noch die Groesse des Rahmens
Size aDfltSz( HTML_DFLT_APPLET_WIDTH, HTML_DFLT_APPLET_HEIGHT );
SetFixSize( aSize, aDfltSz, bPrcWidth, bPrcHeight, aItemSet, aPropInfo,
aFrmSet );
SetSpace( aSpace, aItemSet, aPropInfo, aFrmSet );
// und in das Dok einfuegen
SwFrmFmt* pFlyFmt =
pDoc->Insert( *pPam, ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ), &aFrmSet, NULL, NULL );
// den alternativen Namen setzen
SwNoTxtNode *pNoTxtNd =
pDoc->GetNodes()[ pFlyFmt->GetCntnt().GetCntntIdx()
->GetIndex()+1 ]->GetNoTxtNode();
pNoTxtNd->SetTitle( aAlt );
// Ggf Frames anlegen und auto-geb. Rahmen registrieren
RegisterFlyFrm( pFlyFmt );
bInFloatingFrame = sal_True;
}
/* */
/*
#define SWHTML_OPTTYPE_IGNORE 0
#define SWHTML_OPTTYPE_TAG 1
#define SWHTML_OPTTYPE_PARAM 2
static sal_uInt16 GetOptionType( const String& rName, sal_Bool bApplet )
{
sal_uInt16 nType = bApplet ? SWHTML_OPTTYPE_PARAM : SWHTML_OPTTYPE_TAG;
switch( rName.GetChar(0) )
{
case 'A':
case 'a':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_align ) ||
rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_alt ) )
nType = SWHTML_OPTTYPE_IGNORE;
else if( bApplet &&
(rName.EqualsIgnoreCaseAscii( sHTML_O_archive ) ||
rName.EqualsIgnoreCaseAscii( sHTML_O_Archives )) )
nType = SWHTML_OPTTYPE_TAG;
break;
case 'C':
case 'c':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_class ) ||
(bApplet && (rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_code ) ||
rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_codebase ))) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'H':
case 'h':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_height ) ||
rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_hspace ) ||
(!bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SW_HTML_O_Hidden )) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'I':
case 'i':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_id ) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'M':
case 'm':
if( bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_mayscript ) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'N':
case 'n':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_name ) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'O':
case 'o':
if( bApplet && rName.EqualsIgnoreCaseAscii( sHTML_O_Object ) )
nType = SWHTML_OPTTYPE_TAG;
break;
case 'S':
case 's':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_style ) ||
(!bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_src )) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'T':
case 't':
if( !bApplet && rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_type ) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'V':
case 'v':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_vspace ) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
case 'W':
case 'w':
if( rName.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_O_width ) )
nType = SWHTML_OPTTYPE_IGNORE;
break;
}
return nType;
}
*/
sal_uInt16 SwHTMLWriter::GuessOLENodeFrmType( const SwNode& rNode )
{
SwOLEObj& rObj = ((SwOLENode*)rNode.GetOLENode())->GetOLEObj();
SwHTMLFrmType eType = HTML_FRMTYPE_OLE;
uno::Reference < embed::XClassifiedObject > xClass ( rObj.GetOleRef(), uno::UNO_QUERY );
SvGlobalName aClass( xClass->getClassID() );
if( aClass == SvGlobalName( SO3_PLUGIN_CLASSID ) )
{
eType = HTML_FRMTYPE_PLUGIN;
}
else if( aClass == SvGlobalName( SO3_IFRAME_CLASSID ) )
{
eType = HTML_FRMTYPE_IFRAME;
}
#ifdef SOLAR_JAVA
else if( aClass == SvGlobalName( SO3_APPLET_CLASSID ) )
{
eType = HTML_FRMTYPE_APPLET;
}
#endif
return static_cast< sal_uInt16 >(eType);
}
Writer& OutHTML_FrmFmtOLENode( Writer& rWrt, const SwFrmFmt& rFrmFmt,
sal_Bool bInCntnr )
{
SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
SwOLENode *pOLENd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetOLENode();
ASSERT( pOLENd, "OLE-Node erwartet" );
if( !pOLENd )
return rWrt;
SwOLEObj &rObj = pOLENd->GetOLEObj();
uno::Reference < embed::XEmbeddedObject > xObj( rObj.GetOleRef() );
if ( !svt::EmbeddedObjectRef::TryRunningState( xObj ) )
return rWrt;
uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
sal_Bool bHiddenEmbed = sal_False;
if( !xSet.is() )
{
DBG_ERROR("Unknown Object" );
return rWrt;
}
ByteString aEndTags;
sal_uLong nFrmOpts;
// wenn meoglich vor dem "Objekt" einen Zeilen-Umbruch ausgeben
if( rHTMLWrt.bLFPossible )
rHTMLWrt.OutNewLine( sal_True );
if( rFrmFmt.GetName().Len() )
rHTMLWrt.OutImplicitMark( rFrmFmt.GetName(),
pMarkToOLE );
uno::Any aAny;
SvGlobalName aGlobName( xObj->getClassID() );
ByteString sOut('<');
if( aGlobName == SvGlobalName( SO3_PLUGIN_CLASSID ) )
{
// erstmal das Plug-spezifische
sOut += OOO_STRING_SVTOOLS_HTML_embed;
::rtl::OUString aStr;
String aURL;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginURL" ) );
if( (aAny >>= aStr) && aStr.getLength() )
{
aURL = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(),
aStr);
}
if( aURL.Len() )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_src) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), aURL, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
sOut = '\"';
}
::rtl::OUString aType;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginMimeType" ) );
if( (aAny >>= aType) && aType.getLength() )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_type) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), aType, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
sOut = '\"';
}
if ((FLY_AT_PARA == rFrmFmt.GetAnchor().GetAnchorId()) &&
SURROUND_THROUGHT == rFrmFmt.GetSurround().GetSurround() )
{
// Das Plugin ist HIDDEN
(sOut += ' ') += OOO_STRING_SW_HTML_O_Hidden;
nFrmOpts = HTML_FRMOPTS_HIDDEN_EMBED;
bHiddenEmbed = sal_True;
}
else
{
nFrmOpts = bInCntnr ? HTML_FRMOPTS_EMBED_CNTNR
: HTML_FRMOPTS_EMBED;
}
}
else if( aGlobName == SvGlobalName( SO3_APPLET_CLASSID ) )
{
// oder das Applet-Spezifische
sOut += OOO_STRING_SVTOOLS_HTML_applet;
// CODEBASE
::rtl::OUString aCd;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCodeBase" ) );
if( (aAny >>= aCd) && aCd.getLength() )
{
String sCodeBase( URIHelper::simpleNormalizedMakeRelative(rWrt.GetBaseURL(), aCd) );
if( sCodeBase.Len() )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_codebase) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), sCodeBase, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
sOut = '\"';
}
}
// CODE
::rtl::OUString aClass;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCode" ) );
aAny >>= aClass;
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_code) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), aClass, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
sOut = '\"';
// NAME
::rtl::OUString aAppletName;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletName" ) );
aAny >>= aAppletName;
if( aAppletName.getLength() )
{
((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), aAppletName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
sOut = '\"';
}
sal_Bool bScript = sal_False;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletIsScript" ) );
aAny >>= bScript;
if( bScript )
(sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_mayscript;
nFrmOpts = bInCntnr ? HTML_FRMOPTS_APPLET_CNTNR
: HTML_FRMOPTS_APPLET;
}
else
{
// oder das Flating-Frame spezifische
sOut += OOO_STRING_SVTOOLS_HTML_iframe;
rWrt.Strm() << sOut.GetBuffer();
SfxFrameHTMLWriter::Out_FrameDescriptor( rWrt.Strm(), rWrt.GetBaseURL(),
xSet,
rHTMLWrt.eDestEnc,
&rHTMLWrt.aNonConvertableCharacters );
sOut.Erase();
nFrmOpts = bInCntnr ? HTML_FRMOPTS_IFRAME_CNTNR
: HTML_FRMOPTS_IFRAME;
}
rWrt.Strm() << sOut.GetBuffer();
// ALT, WIDTH, HEIGHT, HSPACE, VSPACE, ALIGN
if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bHiddenEmbed )
nFrmOpts |= HTML_FRMOPTS_OLE_CSS1;
rHTMLWrt.OutFrmFmtOptions( rFrmFmt, pOLENd->GetTitle(),
aEndTags, nFrmOpts );
if( rHTMLWrt.IsHTMLMode( HTMLMODE_ABS_POS_FLY ) && !bHiddenEmbed )
rHTMLWrt.OutCSS1_FrmFmtOptions( rFrmFmt, nFrmOpts );
if( aGlobName == SvGlobalName( SO3_APPLET_CLASSID ) )
{
// fuer Applets die Parameter als eigene Tags ausgeben
// und ein </APPLET> schreiben
uno::Sequence < beans::PropertyValue > aProps;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("AppletCommands" ) );
aAny >>= aProps;
SvCommandList aCommands;
aCommands.FillFromSequence( aProps );
SvULongs aParams;
sal_uLong i = aCommands.Count();
while( i > 0 )
{
const SvCommand& rCommand = aCommands[ --i ];
const String& rName = rCommand.GetCommand();
sal_uInt16 nType = SwApplet_Impl::GetOptionType( rName, sal_True );
if( SWHTML_OPTTYPE_TAG == nType )
{
const String& rValue = rCommand.GetArgument();
rWrt.Strm() << ' ';
HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
rWrt.Strm() << "=\"";
HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
}
else if( SWHTML_OPTTYPE_PARAM == nType )
{
aParams.Insert( i, aParams.Count() );
}
}
rHTMLWrt.Strm() << '>';
rHTMLWrt.IncIndentLevel(); // Inhalt von Applet einruecken
sal_uInt16 ii = aParams.Count();
while( ii > 0 )
{
const SvCommand& rCommand = aCommands[ aParams[--ii] ];
const String& rName = rCommand.GetCommand();
const String& rValue = rCommand.GetArgument();
rHTMLWrt.OutNewLine();
((((sOut = '<') += OOO_STRING_SVTOOLS_HTML_param) += ' ') += OOO_STRING_SVTOOLS_HTML_O_name)
+= "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
((sOut = "\" ") += OOO_STRING_SVTOOLS_HTML_O_value) += "=\"";
rWrt.Strm() << sOut.GetBuffer();
HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << "\">";
}
rHTMLWrt.DecIndentLevel(); // Inhalt von Applet einruecken
if( aCommands.Count() )
rHTMLWrt.OutNewLine();
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_applet, sal_False );
}
else
if( aGlobName == SvGlobalName( SO3_PLUGIN_CLASSID ) )
{
// fuer Plugins die Paramater als Optionen schreiben
uno::Sequence < beans::PropertyValue > aProps;
aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("PluginCommands" ) );
aAny >>= aProps;
SvCommandList aCommands;
aCommands.FillFromSequence( aProps );
for( sal_uLong i=0; i<aCommands.Count(); i++ )
{
const SvCommand& rCommand = aCommands[ i ];
const String& rName = rCommand.GetCommand();
if( SwApplet_Impl::GetOptionType( rName, sal_False ) == SWHTML_OPTTYPE_TAG )
{
const String& rValue = rCommand.GetArgument();
rWrt.Strm() << ' ';
HTMLOutFuncs::Out_String( rWrt.Strm(), rName, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters );
rWrt.Strm() << "=\"";
HTMLOutFuncs::Out_String( rWrt.Strm(), rValue, rHTMLWrt.eDestEnc, &rHTMLWrt.aNonConvertableCharacters ) << '\"';
}
}
rHTMLWrt.Strm() << '>';
}
else
{
// und fuer Floating-Frames einfach noch ein </IFRAME>
// ausgeben
rHTMLWrt.Strm() << '>';
HTMLOutFuncs::Out_AsciiTag( rWrt.Strm(), OOO_STRING_SVTOOLS_HTML_iframe, sal_False );
}
if( aEndTags.Len() )
rWrt.Strm() << aEndTags.GetBuffer();
return rWrt;
}
Writer& OutHTML_FrmFmtOLENodeGrf( Writer& rWrt, const SwFrmFmt& rFrmFmt,
sal_Bool bInCntnr )
{
SwHTMLWriter& rHTMLWrt = (SwHTMLWriter&)rWrt;
const SwFmtCntnt& rFlyCntnt = rFrmFmt.GetCntnt();
sal_uLong nStt = rFlyCntnt.GetCntntIdx()->GetIndex()+1;
SwOLENode *pOLENd = rHTMLWrt.pDoc->GetNodes()[ nStt ]->GetOLENode();
ASSERT( pOLENd, "OLE-Node erwartet" );
if( !pOLENd )
return rWrt;
// Inhalt des Nodes als Grafik speichern
//uno::Reference < embed::XEmbeddedObject > xObj = pOLENd->GetOLEObj().GetOleRef();
//GDIMetaFile aPic;
//if( xObj.is() && xRef->GetGDIMetaFile( aPic ).GetActionCount() )
{
//Graphic aGrf( aPic );
Graphic aGrf( *pOLENd->GetGraphic() );
String aGrfNm;
const String* pTempFileName = rHTMLWrt.GetOrigFileName();
if(pTempFileName)
aGrfNm = *pTempFileName;
sal_uInt16 nErr = XOutBitmap::WriteGraphic( aGrf, aGrfNm,
String::CreateFromAscii("JPG"),
(XOUTBMP_USE_GIF_IF_POSSIBLE |
XOUTBMP_USE_NATIVE_IF_POSSIBLE) );
if( nErr ) // fehlerhaft, da ist nichts auszugeben
{
rHTMLWrt.nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE;
return rWrt;
}
aGrfNm = URIHelper::SmartRel2Abs(
INetURLObject(rWrt.GetBaseURL()), aGrfNm,
URIHelper::GetMaybeFileHdl() );
sal_uLong nFlags = bInCntnr ? HTML_FRMOPTS_GENIMG_CNTNR
: HTML_FRMOPTS_GENIMG;
OutHTML_Image( rWrt, rFrmFmt, aGrfNm,
pOLENd->GetTitle(), pOLENd->GetTwipSize(),
nFlags, pMarkToOLE );
}
return rWrt;
}