summaryrefslogtreecommitdiff
path: root/sd/source/filter/html/htmlex.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/filter/html/htmlex.cxx')
-rwxr-xr-xsd/source/filter/html/htmlex.cxx3392
1 files changed, 3392 insertions, 0 deletions
diff --git a/sd/source/filter/html/htmlex.cxx b/sd/source/filter/html/htmlex.cxx
new file mode 100755
index 000000000000..9de46771e14c
--- /dev/null
+++ b/sd/source/filter/html/htmlex.cxx
@@ -0,0 +1,3392 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+
+#include "htmlex.hxx"
+#include <com/sun/star/document/XExporter.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/document/XFilter.hpp>
+
+#include <rtl/uri.hxx>
+#include <comphelper/processfactory.hxx>
+#include <osl/file.hxx>
+#include <tools/fsys.hxx>
+#include <unotools/pathoptions.hxx>
+#include <svtools/FilterConfigItem.hxx>
+#ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX
+#include <unotools/ucbstreamhelper.hxx>
+#endif
+#include <unotools/localfilehelper.hxx>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <sfx2/progress.hxx>
+#include <sfx2/progress.hxx>
+#include <vcl/wrkwin.hxx>
+#include <svl/aeitem.hxx>
+#include <svx/svditer.hxx>
+#include <svtools/imaprect.hxx>
+#include <svtools/imapcirc.hxx>
+#include <svtools/imappoly.hxx>
+#include <vcl/msgbox.hxx>
+#include <sfx2/app.hxx>
+#include <editeng/outlobj.hxx>
+#include <editeng/editobj.hxx>
+#include <svx/svdopath.hxx>
+#include <svx/xoutbmp.hxx>
+#include <svtools/htmlout.hxx>
+#include <sfx2/docfile.hxx>
+#include <vcl/cvtgrf.hxx>
+#include <svtools/colorcfg.hxx>
+#include <svtools/filter.hxx>
+#include <editeng/colritem.hxx>
+#include <editeng/editeng.hxx>
+#include <editeng/wghtitem.hxx>
+#include <editeng/udlnitem.hxx>
+#include <editeng/postitem.hxx>
+#include <editeng/crsditem.hxx>
+#include <editeng/flditem.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <svl/style.hxx>
+#define _SVSTDARR_USHORTS
+#include <svl/svstdarr.hxx>
+#include <editeng/frmdiritem.hxx>
+#include <svx/svdoutl.hxx>
+#include <tools/urlobj.hxx> // INetURLObject
+#include <vcl/bmpacc.hxx>
+#include <svtools/sfxecode.hxx>
+#include <com/sun/star/beans/PropertyState.hpp>
+#include <tools/resmgr.hxx>
+#include "comphelper/anytostring.hxx"
+#include "cppuhelper/exc_hlp.hxx"
+
+#include "drawdoc.hxx"
+#include "Outliner.hxx"
+#include "sdpage.hxx"
+#include "sdattr.hxx"
+#include "glob.hrc"
+#include "anminfo.hxx"
+#include "imapinfo.hxx"
+#include "sdresid.hxx"
+#include "buttonset.hxx"
+#include <basegfx/polygon/b2dpolygon.hxx>
+
+using ::rtl::OUString;
+using ::rtl::OString;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::beans;
+using namespace ::com::sun::star::frame;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::document;
+
+#define KEY_QUALITY "JPG-EXPORT-QUALITY"
+
+// Parameter aus Itemset abfragen
+
+#define RESTOHTML( res ) StringToHTMLString(String(SdResId(res)))
+#define S2H( str ) StringToHTMLString( str )
+
+// bei Aenderungen auch NUM_BUTTONS in pubdlg.hxx aendern!!
+const char *pButtonNames[NUM_BUTTONS] =
+{
+ "first-inactive.png",
+ "first.png",
+ "left-inactive.png",
+ "left.png",
+ "right-inactive.png",
+ "right.png",
+ "last-inactive.png",
+ "last.png",
+ "home.png",
+ "text.png",
+ "expand.png",
+ "collapse.png",
+};
+
+#define BTN_FIRST_0 0
+#define BTN_FIRST_1 1
+#define BTN_PREV_0 2
+#define BTN_PREV_1 3
+#define BTN_NEXT_0 4
+#define BTN_NEXT_1 5
+#define BTN_LAST_0 6
+#define BTN_LAST_1 7
+#define BTN_INDEX 8
+#define BTN_TEXT 9
+#define BTN_MORE 10
+#define BTN_LESS 11
+
+// Fuer Detectfilter
+#define CALC_OPTIONS "9,34,SYSTEM"
+
+// *********************************************************************
+// Hilfsklasse fuer das simple erzeugen von Dateien lokal/remote
+// *********************************************************************
+class EasyFile
+{
+private:
+ SvStream* pOStm;
+ SfxMedium* pMedium;
+ bool bOpen;
+
+public:
+
+ EasyFile();
+ ~EasyFile();
+
+ ULONG createStream( const String& rUrl, SvStream*& rpStr );
+ ULONG createFileName( const String& rUrl, String& rFileName );
+ ULONG close();
+};
+
+// *********************************************************************
+// Hilfsklasse fuer das einbinden von Textattributen in die Html-Ausgabe
+// *********************************************************************
+class HtmlState
+{
+private:
+ bool mbColor;
+ bool mbWeight;
+ bool mbItalic;
+ bool mbUnderline;
+ bool mbStrike;
+ bool mbLink;
+ Color maColor;
+ Color maDefColor;
+ String maLink;
+ String maTarget;
+
+public:
+ HtmlState( Color aDefColor );
+
+ String SetWeight( bool bWeight );
+ String SetItalic( bool bItalic );
+ String SetUnderline( bool bUnderline );
+ String SetColor( Color aColor );
+ String SetStrikeout( bool bStrike );
+ String SetLink( const String& aLink, const String& aTarget );
+ String Flush();
+};
+
+// =====================================================================
+// alle noch offennen Tags schliessen
+// =====================================================================
+String HtmlState::Flush()
+{
+ String aStr, aEmpty;
+
+ aStr += SetWeight(false);
+ aStr += SetItalic(false);
+ aStr += SetUnderline(false);
+ aStr += SetStrikeout(false);
+ aStr += SetColor(maDefColor);
+ aStr += SetLink(aEmpty,aEmpty);
+
+ return aStr;
+}
+
+// =====================================================================
+// c'tor mit Defaultfarbe fuer die Seite
+// =====================================================================
+HtmlState::HtmlState( Color aDefColor )
+{
+ mbColor = false;
+ mbWeight = false;
+ mbItalic = false;
+ mbUnderline = false;
+ mbLink = false;
+ mbStrike = false;
+ maDefColor = aDefColor;
+}
+
+// =====================================================================
+// aktiviert/deaktiviert Fettdruck
+// =====================================================================
+String HtmlState::SetWeight( bool bWeight )
+{
+ String aStr;
+
+ if(bWeight && !mbWeight)
+ aStr.AppendAscii( "<b>" );
+ else if(!bWeight && mbWeight)
+ aStr.AppendAscii( "</b>" );
+
+ mbWeight = bWeight;
+ return aStr;
+}
+
+// =====================================================================
+// aktiviert/deaktiviert Italic
+// =====================================================================
+String HtmlState::SetItalic( bool bItalic )
+{
+ String aStr;
+
+ if(bItalic && !mbItalic)
+ aStr.AppendAscii( "<i>" );
+ else if(!bItalic && mbItalic)
+ aStr.AppendAscii( "</i>" );
+
+ mbItalic = bItalic;
+ return aStr;
+}
+
+// =====================================================================
+// aktiviert/deaktiviert Unterstrichen
+// =====================================================================
+String HtmlState::SetUnderline( bool bUnderline )
+{
+ String aStr;
+
+ if(bUnderline && !mbUnderline)
+ aStr.AppendAscii( "<u>" );
+ else if(!bUnderline && mbUnderline)
+ aStr.AppendAscii( "</u>" );
+
+ mbUnderline = bUnderline;
+ return aStr;
+}
+
+// =====================================================================
+// aktiviert/deaktiviert Durchstreichen
+// =====================================================================
+String HtmlState::SetStrikeout( bool bStrike )
+{
+ String aStr;
+
+ if(bStrike && !mbStrike)
+ aStr.AppendAscii( "<strike>" );
+ else if(!bStrike && mbStrike)
+ aStr.AppendAscii( "</strike>" );
+
+ mbStrike = bStrike;
+ return aStr;
+}
+
+// =====================================================================
+// Setzt die angegebenne Textfarbe
+// =====================================================================
+String HtmlState::SetColor( Color aColor )
+{
+ String aStr;
+
+ if(mbColor && aColor == maColor)
+ return aStr;
+
+ if(mbColor)
+ {
+ aStr.AppendAscii( "</font>" );
+ mbColor = false;
+ }
+
+ if(aColor != maDefColor)
+ {
+ maColor = aColor;
+
+ aStr.AppendAscii( "<font color=\"" );
+ aStr += HtmlExport::ColorToHTMLString(aColor);
+ aStr.AppendAscii( "\">" );
+
+ mbColor = true;
+ }
+
+ return aStr;
+}
+
+// =====================================================================
+// aktiviert/deaktiviert einen Hyperlink
+// =====================================================================
+String HtmlState::SetLink( const String& aLink, const String& aTarget )
+{
+ String aStr;
+
+ if(mbLink&&maLink == aLink&&maTarget==aTarget)
+ return aStr;
+
+ if(mbLink)
+ {
+ aStr.AppendAscii( "</a>" );
+ mbLink = false;
+ }
+
+ if(aLink.Len())
+ {
+ aStr.AppendAscii( "<a href=\"" );
+ aStr += HtmlExport::StringToURL(aLink);
+ if(aTarget.Len())
+ {
+ aStr.AppendAscii( "\" target=\"" );
+ aStr += aTarget;
+ }
+ aStr.AppendAscii( "\">" );
+ mbLink = true;
+ maLink = aLink;
+ maTarget = aTarget;
+ }
+
+ return aStr;
+}
+
+// *********************************************************************
+// class HtmlExport Methoden
+// *********************************************************************
+
+static String getParagraphStyle( SdrOutliner* pOutliner, USHORT nPara )
+{
+ SfxItemSet aParaSet( pOutliner->GetParaAttribs( nPara ) );
+
+ String sStyle( RTL_CONSTASCII_USTRINGPARAM("direction:") );
+ if( static_cast<const SvxFrameDirectionItem*>(aParaSet.GetItem( EE_PARA_WRITINGDIR ))->GetValue() == FRMDIR_HORI_RIGHT_TOP )
+ {
+ sStyle += String( RTL_CONSTASCII_USTRINGPARAM("rtl;") );
+ }
+ else
+ {
+ sStyle += String( RTL_CONSTASCII_USTRINGPARAM("ltr;") );
+ }
+ return sStyle;
+}
+
+// =====================================================================
+// Konstruktor fuer die Html Export Hilfsklasse
+// =====================================================================
+HtmlExport::HtmlExport(
+ OUString aPath,
+ const Sequence< PropertyValue >& rParams,
+ SdDrawDocument* pExpDoc,
+ ::sd::DrawDocShell* pDocShell )
+ : maPath( aPath ),
+ mpDoc(pExpDoc),
+ mpDocSh( pDocShell ),
+ meEC(NULL),
+ meMode( PUBLISH_HTML ),
+ mbContentsPage(false),
+ mnButtonThema(-1),
+ mnWidthPixel( PUB_LOWRES_WIDTH ),
+ meFormat( FORMAT_JPG ),
+ mbNotes(false),
+ mnCompression( -1 ),
+ mbDownload( false ),
+ mbSlideSound(true),
+ mbHiddenSlides(true),
+ mbUserAttr(false),
+ mbDocColors(false),
+ maHTMLExtension(SdResId(STR_HTMLEXP_DEFAULT_EXTENSION)),
+ mpHTMLFiles(NULL),
+ mpImageFiles(NULL),
+ mpPageNames(NULL),
+ mpTextFiles(NULL),
+ maIndexUrl(RTL_CONSTASCII_USTRINGPARAM("index")),
+ meScript( SCRIPT_ASP ),
+ maHTMLHeader( RTL_CONSTASCII_USTRINGPARAM(
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\r\n"
+ " \"http://www.w3.org/TR/html4/transitional.dtd\">\r\n"
+ "<html>\r\n<head>\r\n" ) ),
+ mpButtonSet( new ButtonSet() )
+{
+ bool bChange = mpDoc->IsChanged();
+
+ maIndexUrl += maHTMLExtension;
+
+ InitExportParameters( rParams );
+
+ switch( meMode )
+ {
+ case PUBLISH_HTML:
+ case PUBLISH_FRAMES:
+ ExportHtml();
+ break;
+ case PUBLISH_WEBCAST:
+ ExportWebCast();
+ break;
+ case PUBLISH_KIOSK:
+ ExportKiosk();
+ break;
+ }
+
+ mpDoc->SetChanged(bChange);
+}
+
+HtmlExport::~HtmlExport()
+{
+ // ------------------------------------------------------------------
+ // Listen loeschen
+ // ------------------------------------------------------------------
+ if(mpImageFiles && mpHTMLFiles && mpPageNames && mpTextFiles)
+ {
+ for ( USHORT nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ delete mpImageFiles[nSdPage];
+ delete mpHTMLFiles[nSdPage];
+ delete mpPageNames[nSdPage];
+ delete mpTextFiles[nSdPage];
+ }
+ }
+
+ delete[] mpImageFiles;
+ delete[] mpHTMLFiles;
+ delete[] mpPageNames;
+ delete[] mpTextFiles;
+}
+
+/** get common export parameters from item set */
+void HtmlExport::InitExportParameters( const Sequence< PropertyValue >& rParams )
+{
+ mbImpress = mpDoc && mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS;
+
+ sal_Int32 nArgs = rParams.getLength();
+ const PropertyValue* pParams = rParams.getConstArray();
+ OUString aStr;
+ while( nArgs-- )
+ {
+ if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PublishMode" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ meMode = (HtmlPublishMode)temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IndexURL" ) ) )
+ {
+ pParams->Value >>= aStr;
+ maIndexUrl = aStr;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Format" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ meFormat = (PublishingFormat)temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Compression" ) ) )
+ {
+ pParams->Value >>= aStr;
+ String aTmp( aStr );
+ if(aTmp.Len())
+ {
+ xub_StrLen nPos = aTmp.Search( '%' );
+ if(nPos != STRING_NOTFOUND)
+ aTmp.Erase(nPos,1);
+ mnCompression = (INT16)aTmp.ToInt32();
+ }
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Width" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ mnWidthPixel = (sal_uInt16)temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "UseButtonSet" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ mnButtonThema = (sal_Int16)temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsExportNotes" ) ) )
+ {
+ if( mbImpress )
+ {
+ sal_Bool temp = sal_False;
+ pParams->Value >>= temp;
+ mbNotes = temp;
+ }
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsExportContentsPage" ) ) )
+ {
+ sal_Bool temp = sal_False;
+ pParams->Value >>= temp;
+ mbContentsPage = temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Author" ) ) )
+ {
+ pParams->Value >>= aStr;
+ maAuthor = aStr;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "EMail" ) ) )
+ {
+ pParams->Value >>= aStr;
+ maEMail = aStr;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HomepageURL" ) ) )
+ {
+ pParams->Value >>= aStr;
+ maHomePage = aStr;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "UserText" ) ) )
+ {
+ pParams->Value >>= aStr;
+ maInfo = aStr;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "EnableDownload" ) ) )
+ {
+ sal_Bool temp = sal_False;
+ pParams->Value >>= temp;
+ mbDownload = temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "SlideSound" ) ) )
+ {
+ sal_Bool temp = sal_True;
+ pParams->Value >>= temp;
+ mbSlideSound = temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HiddenSlides" ) ) )
+ {
+ sal_Bool temp = sal_True;
+ pParams->Value >>= temp;
+ mbHiddenSlides = temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BackColor" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ maBackColor = temp;
+ mbUserAttr = true;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "TextColor" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ maTextColor = temp;
+ mbUserAttr = true;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LinkColor" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ maLinkColor = temp;
+ mbUserAttr = true;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "VLinkColor" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ maVLinkColor = temp;
+ mbUserAttr = true;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ALinkColor" ) ) )
+ {
+ sal_Int32 temp = 0;
+ pParams->Value >>= temp;
+ maALinkColor = temp;
+ mbUserAttr = true;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsUseDocumentColors" ) ) )
+ {
+ sal_Bool temp = sal_False;
+ pParams->Value >>= temp;
+ mbDocColors = temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "KioskSlideDuration" ) ) )
+ {
+ sal_Int32 temp = sal_False;
+ pParams->Value >>= temp;
+ mnSlideDuration = temp;
+ mbAutoSlide = true;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "KioskEndless" ) ) )
+ {
+ sal_Bool temp = sal_False;
+ pParams->Value >>= temp;
+ mbEndless = temp;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "WebCastCGIURL" ) ) )
+ {
+ pParams->Value >>= aStr;
+ maCGIPath = aStr;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "WebCastTargetURL" ) ) )
+ {
+ pParams->Value >>= aStr;
+ maURLPath = aStr;
+ }
+ else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "WebCastScriptLanguage" ) ) )
+ {
+ pParams->Value >>= aStr;
+ if( aStr.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( "asp" ) ) )
+ {
+ meScript = SCRIPT_ASP;
+ }
+ else
+ {
+ meScript = SCRIPT_PERL;
+ }
+ }
+ else
+ {
+ DBG_ERROR("Unknown property for html export detected!");
+ }
+
+ pParams++;
+ }
+
+ if( meMode == PUBLISH_KIOSK )
+ {
+ mbContentsPage = false;
+ mbNotes = false;
+
+ }
+
+ // calculate image sizes
+ SdPage* pPage = mpDoc->GetSdPage(0, PK_STANDARD);
+ Size aTmpSize( pPage->GetSize() );
+ double dRatio=((double)aTmpSize.Width())/aTmpSize.Height();
+
+/*
+ switch( mnWidthPixel )
+ {
+ case 800:
+ mnWidthPixel = 640;
+ break;
+ case 1024:
+ mnWidthPixel = 800;
+ break;
+ case 640:
+ default:
+ mnWidthPixel = 512;
+ break;
+ }
+*/
+ mnHeightPixel = (USHORT)(mnWidthPixel/dRatio);
+
+ //------------------------------------------------------------------
+ // Ziel ausklamuestern...
+
+ INetURLObject aINetURLObj( maPath );
+ DBG_ASSERT( aINetURLObj.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
+
+ maExportPath = aINetURLObj.GetPartBeforeLastName(); // with trailing '/'
+ maIndex = aINetURLObj.GetLastName();
+
+ mnSdPageCount = mpDoc->GetSdPageCount( PK_STANDARD );
+// USHORT nHiddenSlides = 0;
+ for( USHORT nPage = 0; nPage < mnSdPageCount; nPage++ )
+ {
+ pPage = mpDoc->GetSdPage( nPage, PK_STANDARD );
+
+ if( mbHiddenSlides || !pPage->IsExcluded() )
+ {
+ maPages.push_back( pPage );
+ maNotesPages.push_back( mpDoc->GetSdPage( nPage, PK_NOTES ) );
+ }
+ }
+ mnSdPageCount = maPages.size();
+
+ mbFrames = meMode == PUBLISH_FRAMES;
+
+ maDocFileName = maIndex;
+}
+
+///////////////////////////////////////////////////////////////////////
+// Exportiert das im Konstruktor angegebenne Impress Dokument nach HTML
+///////////////////////////////////////////////////////////////////////
+void HtmlExport::ExportHtml()
+{
+ if(mbUserAttr)
+ {
+ if( maTextColor == COL_AUTO )
+ {
+ if( !maBackColor.IsDark() )
+ maTextColor = COL_BLACK;
+ }
+ }
+ else if( mbDocColors )
+ {
+ // Standard Farben fuer das Farbschema 'Aus Dokument'
+ SetDocColors();
+ maFirstPageColor = maBackColor;
+ }
+
+ // get name for downloadable presentation if needed
+ if( mbDownload )
+ {
+ // Separator such und Extension ausblenden
+ USHORT nSepPos = maDocFileName.Search( sal_Unicode('.') );
+
+ if(nSepPos != STRING_NOTFOUND)
+ maDocFileName.Erase(nSepPos);
+
+ maDocFileName.AppendAscii( ".odp" );
+ }
+
+ //////
+
+ USHORT nProgrCount = mnSdPageCount;
+ nProgrCount += mbImpress?mnSdPageCount:0;
+ nProgrCount += mbContentsPage?1:0;
+ nProgrCount += (mbFrames && mbNotes)?mnSdPageCount:0;
+ nProgrCount += (mbFrames)?8:0;
+ InitProgress( nProgrCount );
+
+ mpDocSh->SetWaitCursor( true );
+
+ //------------------------------------------------------------------
+ // Exceptions sind doch was schoennes...
+
+ CreateFileNames();
+
+ // this is not a true while
+ while( 1 )
+ {
+ if( checkForExistingFiles() )
+ break;
+
+ if( !CreateImagesForPresPages() )
+ break;
+
+ if( !CreateHtmlForPresPages() )
+ break;
+
+ if( mbImpress )
+ if( !CreateHtmlTextForPresPages() )
+ break;
+
+ if( mbFrames )
+ {
+ if( !CreateFrames() )
+ break;
+
+ if( !CreateOutlinePages() )
+ break;
+
+ if( !CreateNavBarFrames() )
+ break;
+
+ if( mbNotes && mbImpress )
+ if( !CreateNotesPages() )
+ break;
+
+ }
+
+ if( mbContentsPage )
+ if( !CreateContentPage() )
+ break;
+
+ if( !CreateBitmaps() )
+ break;
+
+ mpDocSh->SetWaitCursor( false );
+ ResetProgress();
+
+ if( mbDownload )
+ SavePresentation();
+
+ return;
+ }
+
+ // if we get to this point the export was
+ // canceled by the user after an error
+ mpDocSh->SetWaitCursor( false );
+ ResetProgress();
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void HtmlExport::SetDocColors( SdPage* pPage )
+{
+ if( pPage == NULL )
+ pPage = mpDoc->GetSdPage(0, PK_STANDARD);
+
+ svtools::ColorConfig aConfig;
+ maVLinkColor = Color(aConfig.GetColorValue(svtools::LINKSVISITED).nColor);
+ maALinkColor = Color(aConfig.GetColorValue(svtools::LINKS).nColor);
+ maLinkColor = Color(aConfig.GetColorValue(svtools::LINKS).nColor);
+ maTextColor = Color(COL_BLACK);
+
+ SfxStyleSheet* pSheet = NULL;
+
+ if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
+ {
+ // Standard Textfarbe aus Outline-Vorlage der ersten Seite
+ pSheet = pPage->GetStyleSheetForPresObj(PRESOBJ_OUTLINE);
+ if(pSheet == NULL)
+ pSheet = pPage->GetStyleSheetForPresObj(PRESOBJ_TEXT);
+ if(pSheet == NULL)
+ pSheet = pPage->GetStyleSheetForPresObj(PRESOBJ_TITLE);
+ }
+
+ if(pSheet == NULL)
+ pSheet = mpDoc->GetDefaultStyleSheet();
+
+ if(pSheet)
+ {
+ SfxItemSet& rSet = pSheet->GetItemSet();
+ if(rSet.GetItemState(EE_CHAR_COLOR,TRUE) == SFX_ITEM_ON)
+ maTextColor = ((SvxColorItem*)rSet.GetItem(EE_CHAR_COLOR,TRUE))->GetValue();
+ }
+
+ // Standard Hintergrundfarbe aus Background der MasterPage der ersten Seite
+ maBackColor = pPage->GetPageBackgroundColor();
+
+ if( maTextColor == COL_AUTO )
+ {
+ if( !maBackColor.IsDark() )
+ maTextColor = COL_BLACK;
+ }
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void HtmlExport::InitProgress( USHORT nProgrCount )
+{
+ String aStr(SdResId(STR_CREATE_PAGES));
+ mpProgress = new SfxProgress( mpDocSh, aStr, nProgrCount );
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void HtmlExport::ResetProgress()
+{
+ delete mpProgress;
+ mpProgress = NULL;
+}
+
+///////////////////////////////////////////////////////////////////////
+
+void HtmlExport::ExportKiosk()
+{
+ mnPagesWritten = 0;
+ InitProgress( 2*mnSdPageCount );
+
+ CreateFileNames();
+ if( !checkForExistingFiles() )
+ {
+ if( CreateImagesForPresPages() )
+ CreateHtmlForPresPages();
+ }
+
+ ResetProgress();
+}
+
+///////////////////////////////////////////////////////////////////////
+// Export Document with WebCast (TM) Technology
+///////////////////////////////////////////////////////////////////////
+void HtmlExport::ExportWebCast()
+{
+ mnPagesWritten = 0;
+ InitProgress( mnSdPageCount + 9 );
+
+ mpDocSh->SetWaitCursor( TRUE );
+
+ CreateFileNames();
+
+ String aEmpty;
+ if(maCGIPath.Len() == 0)
+ maCGIPath.Assign( sal_Unicode('.') );
+
+ if( maCGIPath.GetChar( maCGIPath.Len() - 1 ) != sal_Unicode('/') )
+ maCGIPath.Append( sal_Unicode('/') );
+
+ if( meScript == SCRIPT_ASP )
+ {
+ maURLPath.AssignAscii( "./" );
+ }
+ else
+ {
+ String aEmpty2;
+ if(maURLPath.Len() == 0)
+ maURLPath.Assign( sal_Unicode('.') );
+
+ if( maURLPath.GetChar( maURLPath.Len() - 1 ) != sal_Unicode('/') )
+ maURLPath.Append( sal_Unicode('/') );
+ }
+
+ // this is not a true while
+ while(1)
+ {
+ if( checkForExistingFiles() )
+ break;
+
+ if(!CreateImagesForPresPages())
+ break;
+
+ if( meScript == SCRIPT_ASP )
+ {
+ if(!CreateASPScripts())
+ break;
+ }
+ else
+ {
+ if(!CreatePERLScripts())
+ break;
+ }
+
+ if(!CreateImageFileList())
+ break;
+
+ if(!CreateImageNumberFile())
+ break;
+
+ break;
+ }
+
+ mpDocSh->SetWaitCursor( false );
+ ResetProgress();
+}
+
+///////////////////////////////////////////////////////////////////////
+// Save the presentation as a downloadable file in the dest directory
+///////////////////////////////////////////////////////////////////////
+
+bool HtmlExport::SavePresentation()
+{
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, maDocFileName );
+
+ OUString aURL( maExportPath );
+ aURL += maDocFileName;
+
+
+ mpDocSh->EnableSetModified( true );
+
+ try
+ {
+ uno::Reference< frame::XStorable > xStorable( mpDoc->getUnoModel(), uno::UNO_QUERY );
+ if( xStorable.is() )
+ {
+ uno::Sequence< beans::PropertyValue > aProperties( 2 );
+ aProperties[ 0 ].Name = OUString(RTL_CONSTASCII_USTRINGPARAM("Overwrite"));
+ aProperties[ 0 ].Value <<= (sal_Bool)sal_True;
+ aProperties[ 1 ].Name = OUString(RTL_CONSTASCII_USTRINGPARAM("FilterName"));
+ aProperties[ 1 ].Value <<= OUString(RTL_CONSTASCII_USTRINGPARAM("impress8"));
+ xStorable->storeToURL( aURL, aProperties );
+
+ mpDocSh->EnableSetModified( false );
+
+ return true;
+ }
+ }
+ catch( Exception& )
+ {
+ }
+
+ mpDocSh->EnableSetModified( false );
+
+ return false;
+}
+
+// =====================================================================
+// Image-Dateien anlegen
+// =====================================================================
+bool HtmlExport::CreateImagesForPresPages()
+{
+ try
+ {
+ Reference < XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() );
+ if( !xMSF.is() )
+ return false;
+
+ Reference< XExporter > xGraphicExporter( xMSF->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.GraphicExportFilter") ) ), UNO_QUERY );
+ Reference< XFilter > xFilter( xGraphicExporter, UNO_QUERY );
+
+ DBG_ASSERT( xFilter.is(), "no com.sun.star.drawing.GraphicExportFilter?" );
+ if( !xFilter.is() )
+ return false;
+
+ Sequence< PropertyValue > aFilterData(((meFormat==FORMAT_JPG)&&(mnCompression != -1))? 3 : 2);
+ aFilterData[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("PixelWidth") );
+ aFilterData[0].Value <<= (sal_Int32)mnWidthPixel;
+ aFilterData[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("PixelHeight") );
+ aFilterData[1].Value <<= (sal_Int32)mnHeightPixel;
+ if((meFormat==FORMAT_JPG)&&(mnCompression != -1))
+ {
+ aFilterData[2].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("Quality") );
+ aFilterData[2].Value <<= (sal_Int32)mnCompression;
+ }
+
+ Sequence< PropertyValue > aDescriptor( 3 );
+ aDescriptor[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("URL") );
+ aDescriptor[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("FilterName") );
+ OUString sFormat;
+ if( meFormat == FORMAT_PNG )
+ sFormat = OUString( RTL_CONSTASCII_USTRINGPARAM("PNG") );
+ else if( meFormat == FORMAT_GIF )
+ sFormat = OUString( RTL_CONSTASCII_USTRINGPARAM("GIF") );
+ else
+ sFormat = OUString( RTL_CONSTASCII_USTRINGPARAM("JPG") );
+
+ aDescriptor[1].Value <<= sFormat;
+ aDescriptor[2].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("FilterData") );
+ aDescriptor[2].Value <<= aFilterData;
+
+ for (USHORT nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ SdPage* pPage = maPages[ nSdPage ];
+
+ OUString aFull(maExportPath);
+ aFull += *mpImageFiles[nSdPage];
+
+ aDescriptor[0].Value <<= aFull;
+
+ Reference< XComponent > xPage( pPage->getUnoPage(), UNO_QUERY );
+ xGraphicExporter->setSourceDocument( xPage );
+ xFilter->filter( aDescriptor );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+ }
+ catch( Exception& )
+ {
+ return false;
+ }
+
+ return true;
+}
+
+// =====================================================================
+// Ermittelt das SdrTextObject mit dem Layout Text dieser Seite
+// =====================================================================
+SdrTextObj* HtmlExport::GetLayoutTextObject(SdrPage* pPage)
+{
+ ULONG nObjectCount = pPage->GetObjCount();
+ SdrObject* pObject = NULL;
+ SdrTextObj* pResult = NULL;
+
+ for (ULONG nObject = 0; nObject < nObjectCount; nObject++)
+ {
+ pObject = pPage->GetObj(nObject);
+ if (pObject->GetObjInventor() == SdrInventor &&
+ pObject->GetObjIdentifier() == OBJ_OUTLINETEXT)
+ {
+ pResult = (SdrTextObj*)pObject;
+ break;
+ }
+ }
+ return pResult;
+}
+
+// =====================================================================
+// HTML-Text Versionen fuer Impress Seiten erzeugen
+// =====================================================================
+
+String HtmlExport::WriteMetaCharset() const
+{
+ String aStr;
+ const sal_Char *pCharSet = rtl_getBestMimeCharsetFromTextEncoding( RTL_TEXTENCODING_UTF8 );
+ if ( pCharSet )
+ {
+ aStr.AppendAscii( " <meta HTTP-EQUIV=CONTENT-TYPE CONTENT=\"text/html; charset=" );
+ aStr.AppendAscii( pCharSet );
+ aStr.AppendAscii( "\">\r\n" );
+ }
+ return aStr;
+}
+
+bool HtmlExport::CreateHtmlTextForPresPages()
+{
+ bool bOk = true;
+
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+
+ for(USHORT nSdPage = 0; nSdPage < mnSdPageCount && bOk; nSdPage++)
+ {
+ SdPage* pPage = maPages[ nSdPage ];
+
+ if( mbDocColors )
+ {
+ SetDocColors( pPage );
+// maBackColor = pPage->GetPageBackgroundColor();
+ }
+
+// HTML Kopf
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString( *mpPageNames[nSdPage] );
+ aStr.AppendAscii( "</title>\r\n" );
+ aStr.AppendAscii( "</head>\r\n" );
+ aStr += CreateBodyTag();
+
+// Navigationsleiste
+ aStr += CreateNavBar(nSdPage, true);
+
+// Seitentitel
+ String sTitleText( CreateTextForTitle(pOutliner,pPage, pPage->GetPageBackgroundColor()) );
+ aStr.AppendAscii( "<h1 style=\"");
+ aStr.Append( getParagraphStyle( pOutliner, 0 ) );
+ aStr.AppendAscii( "\">" );
+ aStr += sTitleText;
+ aStr.AppendAscii( "</h1>\r\n" );
+
+// Gliederungstext schreiben
+ aStr += CreateTextForPage( pOutliner, pPage, true, pPage->GetPageBackgroundColor() );
+
+// Notizen
+ if(mbNotes)
+ {
+ SdPage* pNotesPage = maNotesPages[ nSdPage ];
+ String aNotesStr( CreateTextForNotesPage( pOutliner, pNotesPage, true, maBackColor) );
+
+ if( aNotesStr.Len() )
+ {
+ aStr.AppendAscii( "<br>\r\n<h3>" );
+ aStr += RESTOHTML(STR_HTMLEXP_NOTES);
+ aStr.AppendAscii( ":</h3>\r\n" );
+
+ aStr += aNotesStr;
+ }
+ }
+
+// Seite beenden
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ bOk = WriteHtml( *mpTextFiles[nSdPage], false, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ }
+
+ pOutliner->Clear();
+
+ return bOk;
+}
+
+/** exports the given html data into a non unicode file in the current export path with
+ the given filename */
+bool HtmlExport::WriteHtml( const String& rFileName, bool bAddExtension, const String& rHtmlData )
+{
+ ULONG nErr = 0;
+
+ String aFileName( rFileName );
+ if( bAddExtension )
+ aFileName += maHTMLExtension;
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, rFileName );
+ EasyFile aFile;
+ SvStream* pStr;
+ String aFull( maExportPath );
+ aFull += aFileName;
+ nErr = aFile.createStream(aFull , pStr);
+ if(nErr == 0)
+ {
+ ByteString aStr( rHtmlData , RTL_TEXTENCODING_UTF8 ) ;
+ *pStr << aStr.GetBuffer();
+ nErr = aFile.close();
+ }
+
+ if( nErr != 0 )
+ ErrorHandler::HandleError(nErr);
+
+ return nErr == 0;
+}
+
+// =====================================================================
+
+/** Erzeugt den Outliner Text fuer das Titelobjekt einer Seite
+ */
+String HtmlExport::CreateTextForTitle( SdrOutliner* pOutliner, SdPage* pPage, const Color& rBackgroundColor )
+{
+ SdrTextObj* pTO = (SdrTextObj*)pPage->GetPresObj(PRESOBJ_TITLE);
+ if(!pTO)
+ pTO = GetLayoutTextObject(pPage);
+
+ if (pTO && !pTO->IsEmptyPresObj())
+ {
+ OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+ if(pOPO && pOutliner->GetParagraphCount() != 0)
+ {
+ pOutliner->Clear();
+ pOutliner->SetText(*pOPO);
+ return ParagraphToHTMLString(pOutliner,0, rBackgroundColor);
+ }
+ }
+
+ return String();
+}
+
+// =====================================================================
+// Erzeugt den Outliner Text fuer eine Seite
+// =====================================================================
+String HtmlExport::CreateTextForPage( SdrOutliner* pOutliner,
+ SdPage* pPage,
+ bool bHeadLine, const Color& rBackgroundColor )
+{
+ String aStr;
+
+ SdrTextObj* pTO = (SdrTextObj*)pPage->GetPresObj(PRESOBJ_TEXT);
+ if(!pTO)
+ pTO = GetLayoutTextObject(pPage);
+
+ if (pTO && !pTO->IsEmptyPresObj())
+ {
+ OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+ if (pOPO)
+ {
+ pOutliner->Clear();
+ pOutliner->SetText( *pOPO );
+
+ ULONG nCount = pOutliner->GetParagraphCount();
+
+ Paragraph* pPara = NULL;
+ sal_Int16 nActDepth = -1;
+
+ String aParaText;
+ for (ULONG nPara = 0; nPara < nCount; nPara++)
+ {
+ pPara = pOutliner->GetParagraph(nPara);
+ if(pPara == 0)
+ continue;
+
+ const sal_Int16 nDepth = (USHORT) pOutliner->GetDepth( (USHORT) nPara );
+ aParaText = ParagraphToHTMLString(pOutliner,nPara,rBackgroundColor);
+
+ if(aParaText.Len() == 0)
+ continue;
+
+ if(nDepth < nActDepth )
+ {
+ do
+ {
+ aStr.AppendAscii( "</ul>" );
+ nActDepth--;
+ }
+ while(nDepth < nActDepth);
+ }
+ else if(nDepth > nActDepth )
+ {
+ do
+ {
+ aStr.AppendAscii( "<ul>" );
+ nActDepth++;
+ }
+ while( nDepth > nActDepth );
+ }
+
+ String sStyle( getParagraphStyle( pOutliner, nPara ) );
+ if(nActDepth >= 0 )
+ {
+ aStr.AppendAscii( "<li style=\"");
+ aStr.Append( sStyle );
+ aStr.AppendAscii( "\">" );
+ }
+
+ if(nActDepth <= 0 && bHeadLine)
+ {
+ if( nActDepth == 0 )
+ {
+ aStr.AppendAscii( "<h2>" );
+ }
+ else
+ {
+ aStr.AppendAscii( "<h2 style=\"");
+ aStr.Append( sStyle );
+ aStr.AppendAscii( "\">" );
+ }
+ }
+ aStr += aParaText;
+ if(nActDepth == 0 && bHeadLine)
+ aStr.AppendAscii( "</h2>" );
+ if(nActDepth >= 0 )
+ aStr.AppendAscii( "</li>" );
+ aStr.AppendAscii( "\r\n" );
+ }
+
+ while( nActDepth >= 0 )
+ {
+ aStr.AppendAscii( "</ul>" );
+ nActDepth--;
+ };
+ }
+ }
+
+ return aStr;
+}
+
+// =====================================================================
+// Erzeugt den Outliner Text fuer eine Notizseite
+// =====================================================================
+String HtmlExport::CreateTextForNotesPage( SdrOutliner* pOutliner,
+ SdPage* pPage,
+ bool,
+ const Color& rBackgroundColor )
+{
+ String aStr;
+
+ SdrTextObj* pTO = (SdrTextObj*)pPage->GetPresObj(PRESOBJ_NOTES);
+
+ if (pTO && !pTO->IsEmptyPresObj())
+ {
+ OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
+ if (pOPO)
+ {
+ pOutliner->Clear();
+ pOutliner->SetText( *pOPO );
+
+ ULONG nCount = pOutliner->GetParagraphCount();
+ for (ULONG nPara = 0; nPara < nCount; nPara++)
+ {
+ aStr.AppendAscii("<p style=\"");
+ aStr.Append( getParagraphStyle( pOutliner, nPara ) );
+ aStr.AppendAscii("\">");
+ aStr += ParagraphToHTMLString( pOutliner, nPara,rBackgroundColor );
+ aStr.AppendAscii( "</p>\r\n" );
+ }
+ }
+ }
+
+ return aStr;
+}
+
+// =====================================================================
+// Wandelt einen Paragraphen des Outliners in Html
+// =====================================================================
+String HtmlExport::ParagraphToHTMLString( SdrOutliner* pOutliner, ULONG nPara, const Color& rBackgroundColor )
+{
+ String aStr;
+
+ if(NULL == pOutliner)
+ return aStr;
+
+ // TODO: MALTE!!!
+ EditEngine& rEditEngine = *(EditEngine*)&pOutliner->GetEditEngine();
+ bool bOldUpdateMode = rEditEngine.GetUpdateMode();
+ rEditEngine.SetUpdateMode(TRUE);
+
+ Paragraph* pPara = pOutliner->GetParagraph(nPara);
+ if(NULL == pPara)
+ return aStr;
+
+ HtmlState aState( (mbUserAttr || mbDocColors) ? maTextColor : Color(COL_BLACK) );
+ SvUShorts aPortionList;
+ rEditEngine.GetPortions( (USHORT) nPara, aPortionList );
+ USHORT nPortionCount = aPortionList.Count();
+
+ USHORT nPos1 = 0;
+ for( USHORT nPortion = 0; nPortion < nPortionCount; nPortion++ )
+ {
+ USHORT nPos2 = aPortionList.GetObject(nPortion);
+
+ ESelection aSelection( (USHORT) nPara, nPos1, (USHORT) nPara, nPos2);
+
+ SfxItemSet aSet( rEditEngine.GetAttribs( aSelection ) );
+
+ String aPortion(StringToHTMLString(rEditEngine.GetText( aSelection )));
+
+ aStr += TextAttribToHTMLString( &aSet, &aState, rBackgroundColor );
+ aStr += aPortion;
+
+ nPos1 = nPos2;
+ }
+ aStr += aState.Flush();
+ rEditEngine.SetUpdateMode(bOldUpdateMode);
+
+ return aStr;
+}
+
+// =====================================================================
+// Erzeugt anhand der Attribute im angegebennen Set und dem gegebennen
+// HtmlState die noetigen Html-Tags um die Attribute zu uebernehmen
+// =====================================================================
+String HtmlExport::TextAttribToHTMLString( SfxItemSet* pSet, HtmlState* pState, const Color& rBackgroundColor )
+{
+ String aStr;
+
+ if(NULL == pSet)
+ return aStr;
+
+ String aLink, aTarget;
+ if ( pSet->GetItemState( EE_FEATURE_FIELD ) == SFX_ITEM_ON )
+ {
+ SvxFieldItem* pItem = (SvxFieldItem*)pSet->GetItem( EE_FEATURE_FIELD );
+ if(pItem)
+ {
+ SvxURLField* pURL = PTR_CAST(SvxURLField, pItem->GetField());
+ if(pURL)
+ {
+ aLink = pURL->GetURL();
+ aTarget = pURL->GetTargetFrame();
+ }
+ }
+ }
+
+ bool bTemp;
+ String aTemp;
+
+ if ( pSet->GetItemState( EE_CHAR_WEIGHT ) == SFX_ITEM_ON )
+ {
+ bTemp = ((const SvxWeightItem&)pSet->Get( EE_CHAR_WEIGHT )).GetWeight() == WEIGHT_BOLD;
+ aTemp = pState->SetWeight( bTemp );
+ if( bTemp )
+ aStr.Insert( aTemp, 0 );
+ else
+ aStr += aTemp;
+ }
+
+ if ( pSet->GetItemState( EE_CHAR_UNDERLINE ) == SFX_ITEM_ON )
+ {
+ bTemp = ((const SvxUnderlineItem&)pSet->Get( EE_CHAR_UNDERLINE )).GetLineStyle() != UNDERLINE_NONE;
+ aTemp = pState->SetUnderline( bTemp );
+ if( bTemp )
+ aStr.Insert( aTemp, 0 );
+ else
+ aStr += aTemp;
+ }
+
+ if ( pSet->GetItemState( EE_CHAR_STRIKEOUT ) == SFX_ITEM_ON )
+ {
+ bTemp = ((const SvxCrossedOutItem&)pSet->Get( EE_CHAR_STRIKEOUT )).GetStrikeout() != STRIKEOUT_NONE;
+ aTemp = pState->SetStrikeout( bTemp );
+ if( bTemp )
+ aStr.Insert( aTemp, 0 );
+ else
+ aStr += aTemp;
+ }
+
+ if ( pSet->GetItemState( EE_CHAR_ITALIC ) == SFX_ITEM_ON )
+ {
+ bTemp = ((const SvxPostureItem&)pSet->Get( EE_CHAR_ITALIC )).GetPosture() != ITALIC_NONE;
+ aTemp = pState->SetItalic( bTemp );
+ if( bTemp )
+ aStr.Insert( aTemp, 0 );
+ else
+ aStr += aTemp;
+ }
+
+ if(mbDocColors)
+ {
+ if ( pSet->GetItemState( EE_CHAR_COLOR ) == SFX_ITEM_ON )
+ {
+ Color aTextColor = ((const SvxColorItem&) pSet->Get( EE_CHAR_COLOR )).GetValue();
+ if( aTextColor == COL_AUTO )
+ {
+ if( !rBackgroundColor.IsDark() )
+ aTextColor = COL_BLACK;
+ }
+ aStr += pState->SetColor( aTextColor );
+ }
+ }
+
+ if( aLink.Len() )
+ aStr.Insert( pState->SetLink(aLink, aTarget), 0 );
+ else
+ aStr += pState->SetLink(aLink, aTarget);
+
+ return aStr;
+}
+
+// =====================================================================
+// HTML-Wrapper fuer Bild-Dateien erzeugen
+// =====================================================================
+bool HtmlExport::CreateHtmlForPresPages()
+{
+ bool bOk = true;
+
+ List aClickableObjects;
+
+ for(USHORT nSdPage = 0; nSdPage < mnSdPageCount && bOk; nSdPage++)
+ {
+ // Klickbare Objekte finden (auch auf der Masterpage) und
+ // in Liste stellen. In umgekehrter Zeichenreihenfolge in
+ // die Liste stellen, da in HTML bei Ueberlappungen die
+ // _erstgenannte_ Area wirkt.
+
+ SdPage* pPage = maPages[ nSdPage ];
+
+ if( mbDocColors )
+ {
+ SetDocColors( pPage );
+ }
+
+ bool bMasterDone = false;
+
+ while (!bMasterDone)
+ {
+ // TRUE = rueckwaerts
+ SdrObjListIter aIter(*pPage, IM_DEEPWITHGROUPS, TRUE);
+
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ SdAnimationInfo* pInfo = mpDoc->GetAnimationInfo(pObject);
+ SdIMapInfo* pIMapInfo = mpDoc->GetIMapInfo(pObject);
+
+ if ((pInfo &&
+ (pInfo->meClickAction == presentation::ClickAction_BOOKMARK ||
+ pInfo->meClickAction == presentation::ClickAction_DOCUMENT ||
+ pInfo->meClickAction == presentation::ClickAction_PREVPAGE ||
+ pInfo->meClickAction == presentation::ClickAction_NEXTPAGE ||
+ pInfo->meClickAction == presentation::ClickAction_FIRSTPAGE ||
+ pInfo->meClickAction == presentation::ClickAction_LASTPAGE)) ||
+ pIMapInfo)
+ {
+ aClickableObjects.Insert(pObject, LIST_APPEND);
+ }
+
+ pObject = aIter.Next();
+ }
+ // jetzt zur Masterpage oder beenden
+ if (!pPage->IsMasterPage())
+ pPage = (SdPage*)(&(pPage->TRG_GetMasterPage()));
+ else
+ bMasterDone = true;
+ }
+ ULONG nClickableObjectCount = aClickableObjects.Count();
+
+// HTML Head
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[nSdPage]);
+ aStr.AppendAscii( "</title>\r\n" );
+
+// insert timing information
+ pPage = maPages[ nSdPage ];
+ if( meMode == PUBLISH_KIOSK )
+ {
+ ULONG nSecs = 0;
+ bool bEndless = false;
+ if( !mbAutoSlide )
+ {
+ if( pPage->GetPresChange() != PRESCHANGE_MANUAL )
+ {
+ nSecs = pPage->GetTime();
+ bEndless = mpDoc->getPresentationSettings().mbEndless;
+ }
+ }
+ else
+ {
+ nSecs = mnSlideDuration;
+ bEndless = mbEndless;
+ }
+
+ if( nSecs != 0 )
+ {
+ if( nSdPage < (mnSdPageCount-1) || bEndless )
+ {
+ aStr.AppendAscii( "<meta http-equiv=\"refresh\" content=\"" );
+ aStr += String::CreateFromInt32(nSecs);
+ aStr.AppendAscii( "; URL=" );
+
+ int nPage = nSdPage + 1;
+ if( nPage == mnSdPageCount )
+ nPage = 0;
+
+ aStr += StringToURL(*mpHTMLFiles[nPage]);
+
+ aStr.AppendAscii( "\">\r\n" );
+ }
+ }
+ }
+
+ aStr.AppendAscii( "</head>\r\n" );
+
+// HTML Body
+ aStr += CreateBodyTag();
+
+ if( mbSlideSound && pPage->IsSoundOn() )
+ aStr += InsertSound( pPage->GetSoundFile() );
+
+// Navigationsleiste
+ if(!mbFrames )
+ aStr += CreateNavBar( nSdPage, false );
+// Image
+ aStr.AppendAscii( "<center>" );
+ aStr.AppendAscii( "<img src=\"" );
+ aStr += StringToURL( *mpImageFiles[nSdPage] );
+ aStr.AppendAscii( "\" alt=\"\"" );
+
+ if (nClickableObjectCount > 0)
+ aStr.AppendAscii( " USEMAP=\"#map0\"" );
+
+ aStr.AppendAscii( "></center>\r\n" );
+
+// Notizen
+ if(mbNotes && !mbFrames)
+ {
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+ SdPage* pNotesPage = maNotesPages[ nSdPage ];
+ String aNotesStr( CreateTextForNotesPage( pOutliner, pNotesPage, true, maBackColor) );
+ pOutliner->Clear();
+
+ if( aNotesStr.Len() )
+ {
+ aStr.AppendAscii( "<h3>" );
+ aStr += RESTOHTML(STR_HTMLEXP_NOTES);
+ aStr.AppendAscii( ":</h3><br>\r\n\r\n<p>" );
+
+ aStr += aNotesStr;
+ aStr.AppendAscii( "\r\n</p>\r\n" );
+ }
+ }
+
+// ggfs. Imagemap erzeugen
+ if (nClickableObjectCount > 0)
+ {
+ aStr.AppendAscii( "<map name=\"map0\">\r\n" );
+
+ for (ULONG nObject = 0; nObject < nClickableObjectCount; nObject++)
+ {
+ SdrObject* pObject = (SdrObject*)aClickableObjects.GetObject(nObject);
+ SdAnimationInfo* pInfo = mpDoc->GetAnimationInfo(pObject);
+ SdIMapInfo* pIMapInfo = mpDoc->GetIMapInfo(pObject);
+
+ Rectangle aRect(pObject->GetCurrentBoundRect());
+ Point aLogPos(aRect.TopLeft());
+ bool bIsSquare = aRect.GetWidth() == aRect.GetHeight();
+
+ ULONG nPageWidth = pPage->GetSize().Width() - pPage->GetLftBorder() -
+ pPage->GetRgtBorder();
+
+ // das BoundRect bezieht sich auf den physikalischen
+ // Seitenursprung, nicht auf den Koordinatenursprung
+ aRect.Move(-pPage->GetLftBorder(), -pPage->GetUppBorder());
+
+ double fLogicToPixel = ((double)mnWidthPixel) / nPageWidth;
+ aRect.Left() = (long)(aRect.Left() * fLogicToPixel);
+ aRect.Top() = (long)(aRect.Top() * fLogicToPixel);
+ aRect.Right() = (long)(aRect.Right() * fLogicToPixel);
+ aRect.Bottom() = (long)(aRect.Bottom() * fLogicToPixel);
+ long nRadius = aRect.GetWidth() / 2;
+
+
+ /*************************************************************
+ |* wenn das Objekt eine eigene Imagemap enthaelt, werden ihre
+ |* Areas in diese Imagemap eingefuegt
+ \************************************************************/
+ if (pIMapInfo)
+ {
+ const ImageMap& rIMap = pIMapInfo->GetImageMap();
+ UINT16 nAreaCount = rIMap.GetIMapObjectCount();
+ for (UINT16 nArea = 0; nArea < nAreaCount; nArea++)
+ {
+ IMapObject* pArea = rIMap.GetIMapObject(nArea);
+ UINT16 nType = pArea->GetType();
+ String aURL( pArea->GetURL() );
+
+ // ggfs. Seiten- oder Objektnamen umwandeln in den
+ // Namen der entsprechenden HTML-Datei
+ BOOL bIsMasterPage;
+ USHORT nPgNum = mpDoc->GetPageByName( aURL, bIsMasterPage );
+ SdrObject* pObj = NULL;
+
+ if (nPgNum == SDRPAGE_NOTFOUND)
+ {
+ // Ist das Bookmark ein Objekt?
+ pObj = mpDoc->GetObj( aURL );
+ if (pObj)
+ nPgNum = pObj->GetPage()->GetPageNum();
+ }
+ if (nPgNum != SDRPAGE_NOTFOUND)
+ {
+ nPgNum = (nPgNum - 1) / 2; // SdrPageNum --> SdPageNum
+ aURL = CreatePageURL(nPgNum);
+ }
+
+ switch(nType)
+ {
+ case IMAP_OBJ_RECTANGLE:
+ {
+ Rectangle aArea(((IMapRectangleObject*)pArea)->
+ GetRectangle(false));
+
+ // Umrechnung in Pixelkoordinaten
+ aArea.Move(aLogPos.X() - pPage->GetLftBorder(),
+ aLogPos.Y() - pPage->GetUppBorder());
+ aArea.Left() = (long)(aArea.Left() * fLogicToPixel);
+ aArea.Top() = (long)(aArea.Top() * fLogicToPixel);
+ aArea.Right() = (long)(aArea.Right() * fLogicToPixel);
+ aArea.Bottom() = (long)(aArea.Bottom() * fLogicToPixel);
+
+ aStr += CreateHTMLRectArea(aArea, aURL);
+ }
+ break;
+
+ case IMAP_OBJ_CIRCLE:
+ {
+ Point aCenter(((IMapCircleObject*)pArea)->
+ GetCenter(false));
+ aCenter += Point(aLogPos.X() - pPage->GetLftBorder(),
+ aLogPos.Y() - pPage->GetUppBorder());
+ aCenter.X() = (long)(aCenter.X() * fLogicToPixel);
+ aCenter.Y() = (long)(aCenter.Y() * fLogicToPixel);
+
+ ULONG nCircleRadius = (((IMapCircleObject*)pArea)->
+ GetRadius(false));
+ nCircleRadius = (ULONG)(nCircleRadius * fLogicToPixel);
+ aStr += CreateHTMLCircleArea(nCircleRadius,
+ aCenter.X(), aCenter.Y(),
+ aURL);
+ }
+ break;
+
+ case IMAP_OBJ_POLYGON:
+ {
+ Polygon aArea(((IMapPolygonObject*)pArea)->GetPolygon(false));
+ aStr += CreateHTMLPolygonArea(::basegfx::B2DPolyPolygon(aArea.getB2DPolygon()), Size(aLogPos.X() - pPage->GetLftBorder(), aLogPos.Y() - pPage->GetUppBorder()), fLogicToPixel, aURL);
+ }
+ break;
+
+ default:
+ {
+ DBG_WARNING("unbekannter IMAP_OBJ_Typ");
+ }
+ break;
+ }
+ }
+ }
+
+
+
+ /*************************************************************
+ |* wenn es eine presentation::ClickAction gibt, Bookmark bestimmen und eine
+ |* Area fuer das ganze Objekt erzeugen
+ \************************************************************/
+ if( pInfo )
+ {
+ String aHRef;
+ presentation::ClickAction eClickAction = pInfo->meClickAction;
+
+ switch( eClickAction )
+ {
+ case presentation::ClickAction_BOOKMARK:
+ {
+ BOOL bIsMasterPage;
+ USHORT nPgNum = mpDoc->GetPageByName( pInfo->GetBookmark(), bIsMasterPage );
+ SdrObject* pObj = NULL;
+
+ if( nPgNum == SDRPAGE_NOTFOUND )
+ {
+ // Ist das Bookmark ein Objekt?
+ pObj = mpDoc->GetObj(pInfo->GetBookmark());
+ if (pObj)
+ nPgNum = pObj->GetPage()->GetPageNum();
+ }
+
+ if( SDRPAGE_NOTFOUND != nPgNum )
+ aHRef = CreatePageURL(( nPgNum - 1 ) / 2 );
+ }
+ break;
+
+ case presentation::ClickAction_DOCUMENT:
+ aHRef = pInfo->GetBookmark();
+ break;
+
+ case presentation::ClickAction_PREVPAGE:
+ {
+ ULONG nPage = nSdPage;
+ if (nSdPage == 0)
+ nPage = 0;
+ else
+ nPage = nSdPage - 1;
+
+ aHRef = CreatePageURL( (USHORT) nPage);
+ }
+ break;
+
+ case presentation::ClickAction_NEXTPAGE:
+ {
+ ULONG nPage = nSdPage;
+ if (nSdPage == mnSdPageCount - 1)
+ nPage = mnSdPageCount - 1;
+ else
+ nPage = nSdPage + 1;
+
+ aHRef = CreatePageURL( (USHORT) nPage);
+ }
+ break;
+
+ case presentation::ClickAction_FIRSTPAGE:
+ aHRef = CreatePageURL(0);
+ break;
+
+ case presentation::ClickAction_LASTPAGE:
+ aHRef = CreatePageURL(mnSdPageCount - 1);
+ break;
+
+ default:
+ break;
+ }
+
+ // jetzt die Areas
+ if( aHRef.Len() )
+ {
+ // ein Kreis?
+ if (pObject->GetObjInventor() == SdrInventor &&
+ pObject->GetObjIdentifier() == OBJ_CIRC &&
+ bIsSquare )
+ {
+ aStr += CreateHTMLCircleArea(aRect.GetWidth() / 2,
+ aRect.Left() + nRadius,
+ aRect.Top() + nRadius,
+ aHRef);
+ }
+ // ein Polygon?
+ else if (pObject->GetObjInventor() == SdrInventor &&
+ (pObject->GetObjIdentifier() == OBJ_PATHLINE ||
+ pObject->GetObjIdentifier() == OBJ_PLIN ||
+ pObject->GetObjIdentifier() == OBJ_POLY))
+ {
+ aStr += CreateHTMLPolygonArea(((SdrPathObj*)pObject)->GetPathPoly(), Size(-pPage->GetLftBorder(), -pPage->GetUppBorder()), fLogicToPixel, aHRef);
+ }
+ // was anderes: das BoundRect nehmen
+ else
+ {
+ aStr += CreateHTMLRectArea(aRect, aHRef);
+ }
+
+ }
+ }
+ }
+
+ aStr.AppendAscii( "</map>\r\n" );
+ }
+ aClickableObjects.Clear();
+
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ bOk = WriteHtml( *mpHTMLFiles[nSdPage], false, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ return bOk;
+}
+
+// =====================================================================
+// Uebersichtsseite erzeugen
+// =====================================================================
+bool HtmlExport::CreateContentPage()
+{
+ // Parameter
+ String aEmpty;
+
+ if( mbDocColors )
+ SetDocColors();
+
+ // Html Kopf
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[0]);
+ aStr.AppendAscii( "</title>\r\n</head>\r\n" );
+ aStr += CreateBodyTag();
+
+ // Seitenkopf
+ aStr.AppendAscii( "<center>\r\n" );
+
+ if(mbHeader)
+ {
+ aStr.AppendAscii( "<h1>" );
+ aStr += getDocumentTitle();
+ aStr.AppendAscii( "</h1><br>\r\n" );
+ }
+
+ aStr.AppendAscii( "<h2>" );
+
+ // #92564# Solaris compiler bug workaround
+ if( mbFrames )
+ aStr += CreateLink( maFramePage,
+ RESTOHTML(STR_HTMLEXP_CLICKSTART) );
+ else
+ aStr += CreateLink( StringToHTMLString(*mpHTMLFiles[0]),
+ RESTOHTML(STR_HTMLEXP_CLICKSTART) );
+
+ aStr.AppendAscii( "</h2>\r\n</center>\r\n" );
+
+ aStr.AppendAscii( "<center><table width=\"90%\"><tr>\r\n" );
+
+ // Inhaltsverzeichnis
+ aStr.AppendAscii( "<td valign=\"top\" align=\"left\" width=\"50%\">\r\n" );
+ aStr.AppendAscii( "<h3>" );
+ aStr += RESTOHTML(STR_HTMLEXP_CONTENTS);
+ aStr.AppendAscii( "</h3>" );
+
+ for(USHORT nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ String aPageName = *mpPageNames[nSdPage];
+ aStr.AppendAscii( "<div align=\"left\">" );
+ if(mbFrames)
+ aStr += StringToHTMLString(aPageName);
+ else
+ aStr += CreateLink(*mpHTMLFiles[nSdPage], aPageName);
+ aStr.AppendAscii( "</div>\r\n" );
+ }
+ aStr.AppendAscii( "</td>\r\n" );
+
+ // Dokument Infos
+ aStr.AppendAscii( "<td valign=\"top\" width=\"50%\">\r\n" );
+
+ if(maAuthor.Len())
+ {
+ aStr.AppendAscii( "<p><strong>" );
+ aStr += RESTOHTML(STR_HTMLEXP_AUTHOR);
+ aStr.AppendAscii( ":</strong> " );
+ aStr += StringToHTMLString(maAuthor);
+ aStr.AppendAscii( "</p>\r\n" );
+ }
+
+ if(maEMail.Len())
+ {
+ aStr.AppendAscii( "<p><strong>" );
+ aStr += RESTOHTML(STR_HTMLEXP_EMAIL);
+ aStr.AppendAscii( ":</strong> <a href=\"mailto:" );
+ aStr += StringToURL(maEMail);
+ aStr.AppendAscii( "\">" );
+ aStr += StringToHTMLString(maEMail);
+ aStr.AppendAscii( "</a></p>\r\n" );
+ }
+
+ if(maHomePage.Len())
+ {
+ aStr.AppendAscii( "<p><strong>" );
+ aStr += RESTOHTML(STR_HTMLEXP_HOMEPAGE);
+ aStr.AppendAscii( ":</strong> <a href=\"" );
+ aStr += StringToURL(maHomePage);
+ aStr.AppendAscii( "\">" );
+ aStr += StringToHTMLString(maHomePage);
+ aStr.AppendAscii( "</a> </p>\r\n" );
+ }
+
+ if(maInfo.Len())
+ {
+ aStr.AppendAscii( "<p><strong>" );
+ aStr += RESTOHTML(STR_HTMLEXP_INFO);
+ aStr.AppendAscii( ":</strong><br>\r\n" );
+ aStr += StringToHTMLString(maInfo);
+ aStr.AppendAscii( "</p>\r\n" );
+ }
+
+ if(mbDownload)
+ {
+ aStr.AppendAscii( "<p><a href=\"" );
+ aStr += StringToURL(maDocFileName);
+ aStr.AppendAscii( "\">" );
+ aStr += RESTOHTML(STR_HTMLEXP_DOWNLOAD);
+ aStr.AppendAscii( "</a></p>\r\n" );
+ }
+
+ aStr.AppendAscii( "</td></tr></table></center>\r\n" );
+
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ bool bOk = WriteHtml( maIndex, false, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ return bOk;
+}
+
+// =====================================================================
+// Notiz Seiten erzeugen (fuer Frames)
+// =====================================================================
+bool HtmlExport::CreateNotesPages()
+{
+ bool bOk = true;
+
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+ for( USHORT nSdPage = 0; bOk && nSdPage < mnSdPageCount; nSdPage++ )
+ {
+ SdPage* pPage = maNotesPages[nSdPage];
+ if( mbDocColors )
+ SetDocColors( pPage );
+
+ // Html Kopf
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[0]);
+ aStr.AppendAscii( "</title>\r\n</head>\r\n" );
+ aStr += CreateBodyTag();
+
+ if(pPage)
+ aStr += CreateTextForNotesPage( pOutliner, pPage, true, maBackColor );
+
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ String aFileName( RTL_CONSTASCII_USTRINGPARAM("note") );
+ aFileName += String::CreateFromInt32(nSdPage);
+ bOk = WriteHtml( aFileName, true, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ pOutliner->Clear();
+
+ return bOk;
+}
+
+// =====================================================================
+// Outline Seiten erzeugen (fuer Frames)
+// =====================================================================
+bool HtmlExport::CreateOutlinePages()
+{
+ bool bOk = true;
+
+ if( mbDocColors )
+ {
+ SetDocColors();
+ }
+
+ // Seite 0 wird der zugeklappte Outline, Seite 1 der aufgeklappte
+ for( int nPage = 0; nPage < (mbImpress?2:1) && bOk; nPage++ )
+ {
+ // Html Kopf
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[0]);
+ aStr.AppendAscii( "</title>\r\n</head>\r\n" );
+ aStr += CreateBodyTag();
+
+ SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
+ for(USHORT nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ SdPage* pPage = maPages[ nSdPage ];
+
+ aStr.AppendAscii( "<div align=\"left\">" );
+ String aLink( RTL_CONSTASCII_USTRINGPARAM( "JavaScript:parent.NavigateAbs(" ) );
+ aLink += String::CreateFromInt32(nSdPage);
+ aLink.Append( sal_Unicode(')') );
+
+ String aTitle = CreateTextForTitle(pOutliner,pPage, maBackColor);
+ if(aTitle.Len() == 0)
+ aTitle = *mpPageNames[nSdPage];
+
+ aStr.AppendAscii("<p style=\"");
+ aStr.Append( getParagraphStyle( pOutliner, 0 ) );
+ aStr.AppendAscii("\">");
+ aStr += CreateLink(aLink, aTitle);
+ aStr.AppendAscii("</p>");
+
+ if(nPage==1)
+ {
+ aStr += CreateTextForPage( pOutliner, pPage, false, maBackColor );
+ }
+ aStr.AppendAscii( "</div>\r\n" );
+ }
+ pOutliner->Clear();
+
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ String aFileName( RTL_CONSTASCII_USTRINGPARAM("outline") );
+ aFileName += String::CreateFromInt32(nPage);
+ bOk = WriteHtml( aFileName, true, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ return bOk;
+}
+
+// =====================================================================
+// Dateinamen festlegen
+// =====================================================================
+void HtmlExport::CreateFileNames()
+{
+ // Listen mit neuen Dateinamen anlegen
+ mpHTMLFiles = new String*[mnSdPageCount];
+ mpImageFiles = new String*[mnSdPageCount];
+ mpPageNames = new String*[mnSdPageCount];
+ mpTextFiles = new String*[mnSdPageCount];
+
+ mbHeader = false; // Ueberschrift auf Uebersichtsseite?
+
+ for (USHORT nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ String* pName;
+ if(nSdPage == 0 && !mbContentsPage && !mbFrames )
+ pName = new String(maIndex);
+ else
+ {
+ pName = new String( RTL_CONSTASCII_USTRINGPARAM("img") );
+ *pName += String::CreateFromInt32(nSdPage);
+ *pName += maHTMLExtension;
+ }
+
+ mpHTMLFiles[nSdPage] = pName;
+
+ pName = new String( RTL_CONSTASCII_USTRINGPARAM("img") );
+ *pName += String::CreateFromInt32(nSdPage);
+ if( meFormat==FORMAT_GIF )
+ pName->AppendAscii( ".gif" );
+ else if( meFormat==FORMAT_JPG )
+ pName->AppendAscii( ".jpg" );
+ else
+ pName->AppendAscii( ".png" );
+
+ mpImageFiles[nSdPage] = pName;
+
+ pName = new String( RTL_CONSTASCII_USTRINGPARAM("text"));
+ *pName += String::CreateFromInt32(nSdPage);
+ *pName += maHTMLExtension;
+ mpTextFiles[nSdPage] = pName;
+
+ SdPage* pSdPage = maPages[ nSdPage ];
+
+ // get slide title from page name
+ String* pPageTitle = new String();
+ *pPageTitle = pSdPage->GetName();
+ mpPageNames[nSdPage] = pPageTitle;
+ }
+
+ if(!mbContentsPage && mbFrames)
+ maFramePage = maIndex;
+ else
+ {
+ maFramePage.AssignAscii( "siframes" );
+ maFramePage += maHTMLExtension;
+ }
+}
+
+String HtmlExport::getDocumentTitle()
+{
+ // check for a title object in this page, if its the first
+ // title it becomes this documents title for the content
+ // page
+ if( !mbHeader )
+ {
+ if(mbImpress)
+ {
+ // falls es ein nicht-leeres Titelobjekt gibt, dessen ersten Absatz
+ // als Seitentitel benutzen
+ SdPage* pSdPage = mpDoc->GetSdPage(0, PK_STANDARD);
+ SdrObject* pTitleObj = pSdPage->GetPresObj(PRESOBJ_TITLE);
+ if (pTitleObj && !pTitleObj->IsEmptyPresObj())
+ {
+ OutlinerParaObject* pParaObject = pTitleObj->GetOutlinerParaObject();
+ if (pParaObject)
+ {
+ const EditTextObject& rEditTextObject =
+ pParaObject->GetTextObject();
+ if (&rEditTextObject)
+ {
+ String aTest(rEditTextObject.GetText(0));
+ if (aTest.Len() > 0)
+ mDocTitle = aTest;
+ }
+ }
+ }
+
+ for( UINT16 i = 0; i < mDocTitle.Len(); i++ )
+ if( mDocTitle.GetChar(i) == (sal_Unicode)0xff)
+ mDocTitle.SetChar(i, sal_Unicode(' ') );
+ }
+
+ if( !mDocTitle.Len() )
+ {
+ mDocTitle = maDocFileName;
+ int nDot = mDocTitle.Search( '.' );
+ if( nDot > 0 )
+ mDocTitle.Erase( (USHORT)nDot );
+ }
+ mbHeader = true;
+ }
+
+ return mDocTitle;
+}
+
+/*
+var nCurrentPage = 0;
+var nPageCount = JSCRIPT2;
+
+function NavigateAbs( nPage )
+{
+ frames[\"show\"].location.href = \"img\" + nPage + \".htm\";
+ frames[\"notes\"].location.href = \"note\" + nPage + \".htm\";
+ nCurrentPage = nPage;
+ if(nCurrentPage==0)
+ {
+ frames[\"navbar1\"].location.href = \"navbar0.htm\";
+ }
+ else if(nCurrentPage==nPageCount-1)
+ {
+ frames[\"navbar1\"].location.href = \"navbar2.htm\";
+ }
+ else
+ frames[\"navbar1\"].location.href = \"navbar1.htm\";
+ }
+}
+
+function NavigateRel( nDelta )
+{
+ var nPage = parseInt(nCurrentPage) + parseInt(nDelta);
+ if( (nPage >= 0) && (nPage < nPageCount) )
+ {
+ NavigateAbs( nPage );
+ }
+}
+
+function ExpandOutline()
+{
+ frames[\"navbar2\"].location.href = \"navbar4.htm\";
+ frames[\"outline\"].location.href = \"outline1.htm\";
+}
+
+function CollapseOutline()
+{
+ frames[\"navbar2\"].location.href = \"navbar3.htm\";
+ frames[\"outline\"].location.href = \"outline0.htm\";
+}
+*/
+
+static const char* JS_NavigateAbs =
+ "function NavigateAbs( nPage )\r\n"
+ "{\r\n"
+ " frames[\"show\"].location.href = \"img\" + nPage + \".$EXT\";\r\n"
+ " //frames[\"notes\"].location.href = \"note\" + nPage + \".$EXT\";\r\n"
+ " nCurrentPage = nPage;\r\n"
+ " if(nCurrentPage==0)\r\n"
+ " {\r\n"
+ " frames[\"navbar1\"].location.href = \"navbar0.$EXT\";\r\n"
+ " }\r\n"
+ " else if(nCurrentPage==nPageCount-1)\r\n"
+ " {\r\n"
+ " frames[\"navbar1\"].location.href = \"navbar2.$EXT\";\r\n"
+ " }\r\n"
+ " else\r\n"
+ " {\r\n"
+ " frames[\"navbar1\"].location.href = \"navbar1.$EXT\";\r\n"
+ " }\r\n"
+ "}\r\n\r\n";
+
+static const char* JS_NavigateRel =
+ "function NavigateRel( nDelta )\r\n"
+ "{\r\n"
+ " var nPage = parseInt(nCurrentPage) + parseInt(nDelta);\r\n"
+ " if( (nPage >= 0) && (nPage < nPageCount) )\r\n"
+ " {\r\n"
+ " NavigateAbs( nPage );\r\n"
+ " }\r\n"
+ "}\r\n\r\n";
+
+static const char* JS_ExpandOutline =
+ "function ExpandOutline()\r\n"
+ "{\r\n"
+ " frames[\"navbar2\"].location.href = \"navbar4.$EXT\";\r\n"
+ " frames[\"outline\"].location.href = \"outline1.$EXT\";\r\n"
+ "}\r\n\r\n";
+
+static const char * JS_CollapseOutline =
+ "function CollapseOutline()\r\n"
+ "{\r\n"
+ " frames[\"navbar2\"].location.href = \"navbar3.$EXT\";\r\n"
+ " frames[\"outline\"].location.href = \"outline0.$EXT\";\r\n"
+ "}\r\n\r\n";
+
+// ====================================================================
+// Seite mit den Frames erzeugen
+// ====================================================================
+bool HtmlExport::CreateFrames()
+{
+ String aTmp;
+ String aStr( RTL_CONSTASCII_USTRINGPARAM(
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"\r\n"
+ " \"http://www.w3.org/TR/html4/frameset.dtd\">\r\n"
+ "<html>\r\n<head>\r\n" ) );
+
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[0]);
+ aStr.AppendAscii( "</title>\r\n" );
+
+ aStr.AppendAscii( "<script type=\"text/javascript\">\r\n<!--\r\n" );
+
+ aStr.AppendAscii( "var nCurrentPage = 0;\r\nvar nPageCount = " );
+ aStr += String::CreateFromInt32(mnSdPageCount);
+ aStr.AppendAscii( ";\r\n\r\n" );
+
+ String aFunction;
+ aFunction.AssignAscii(JS_NavigateAbs);
+
+ if(mbNotes)
+ {
+ String aEmpty;
+ String aSlash( RTL_CONSTASCII_USTRINGPARAM( "//" ) );
+ aFunction.SearchAndReplaceAll( aSlash, aEmpty);
+ }
+
+ // substitute HTML file extension
+ String aPlaceHolder(RTL_CONSTASCII_USTRINGPARAM(".$EXT"));
+ aFunction.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
+ aStr += aFunction;
+
+ aTmp.AssignAscii( JS_NavigateRel );
+ aTmp.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
+ aStr += aTmp;
+
+ if(mbImpress)
+ {
+ aTmp.AssignAscii( JS_ExpandOutline );
+ aTmp.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
+ aStr += aTmp;
+
+ aTmp.AssignAscii( JS_CollapseOutline );
+ aTmp.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
+ aStr += aTmp;
+ }
+ aStr.AppendAscii( "// -->\r\n</script>\r\n" );
+
+ aStr.AppendAscii( "</head>\r\n" );
+
+ aStr.AppendAscii( "<frameset cols=\"*," );
+ aStr += String::CreateFromInt32((mnWidthPixel + 16));
+ aStr.AppendAscii( "\">\r\n" );
+ if(mbImpress)
+ {
+ aStr.AppendAscii( " <frameset rows=\"42,*\">\r\n" );
+ aStr.AppendAscii( " <frame src=\"navbar3" );
+ aStr += StringToURL(maHTMLExtension);
+ aStr.AppendAscii( "\" name=\"navbar2\" marginwidth=\"4\" marginheight=\"4\" scrolling=\"no\">\r\n" );
+ }
+ aStr.AppendAscii( " <frame src=\"outline0" );
+ aStr += StringToURL(maHTMLExtension);
+ aStr.AppendAscii( "\" name=\"outline\">\r\n" );
+ if(mbImpress)
+ aStr.AppendAscii( " </frameset>\r\n" );
+
+ if(mbNotes)
+ {
+ aStr.AppendAscii( " <frameset rows=\"42," );
+ aStr += String::CreateFromInt32((int)((double)mnWidthPixel * 0.75) + 16);
+ aStr.AppendAscii( ",*\">\r\n" );
+ }
+ else
+ aStr.AppendAscii( " <frameset rows=\"42,*\">\r\n" );
+
+ aStr.AppendAscii( " <frame src=\"navbar0" );
+ aStr += StringToURL(maHTMLExtension);
+ aStr.AppendAscii( "\" name=\"navbar1\" marginwidth=\"4\" marginheight=\"4\" scrolling=\"no\">\r\n" );
+
+ aStr.AppendAscii( " <frame src=\"" );
+ aStr += StringToURL(*mpHTMLFiles[0]);
+ aStr.AppendAscii( "\" name=\"show\" marginwidth=\"4\" marginheight=\"4\">\r\n" );
+
+ if(mbNotes)
+ {
+ aStr.AppendAscii( " <frame src=\"note0" );
+ aStr += StringToURL(maHTMLExtension);
+ aStr.AppendAscii( "\" name=\"notes\">\r\n" );
+ }
+ aStr.AppendAscii( " </frameset>\r\n" );
+
+ aStr.AppendAscii( "<noframes>\r\n" );
+ aStr += CreateBodyTag();
+ aStr += RESTOHTML(STR_HTMLEXP_NOFRAMES);
+ aStr.AppendAscii( "\r\n</noframes>\r\n</frameset>\r\n</html>" );
+
+ bool bOk = WriteHtml( maFramePage, false, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ return bOk;
+}
+
+// ====================================================================
+// Buttonleiste fuer Standard ausgeben
+// Es werden 4 html files erstellt
+// navbar0.htm Navigationsleiste Grafik fuer erste Seite
+// navbar1.htm Navigationsleiste Grafik fuer zweite bis vorletzte Seite
+// navbar2.htm Navigationsleiste Grafik fuer letzte Seite
+// navbar3.htm Navigationsleiste Outline zugeklappt
+// navbar4.htm Navigationsleiste Outline aufgeklappt
+// ====================================================================
+bool HtmlExport::CreateNavBarFrames()
+{
+ bool bOk = true;
+ String aButton;
+
+ if( mbDocColors )
+ {
+ SetDocColors();
+ maBackColor = maFirstPageColor;
+ }
+
+ for( int nFile = 0; nFile < 3 && bOk; nFile++ )
+ {
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[0]);
+ aStr.AppendAscii( "</title>\r\n</head>\r\n" );
+ aStr += CreateBodyTag();
+ aStr.AppendAscii( "<center>\r\n" );
+
+ // erste Seite
+ aButton = String(SdResId(STR_HTMLEXP_FIRSTPAGE));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName((nFile == 0 || mnSdPageCount == 1?
+ BTN_FIRST_0:BTN_FIRST_1)), aButton);
+
+ if(nFile != 0 && mnSdPageCount > 1)
+ aButton = CreateLink( String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateAbs(0)")), aButton);
+
+ aStr += aButton;
+ aStr.AppendAscii( "\r\n" );
+
+ // zur vorherigen Seite
+ aButton = String(SdResId(STR_PUBLISH_BACK));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName((nFile == 0 || mnSdPageCount == 1?
+ BTN_PREV_0:BTN_PREV_1)), aButton);
+
+ if(nFile != 0 && mnSdPageCount > 1)
+ aButton = CreateLink( String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateRel(-1)")), aButton);
+
+ aStr += aButton;
+ aStr.AppendAscii( "\r\n" );
+
+ // zur naechsten Seite
+ aButton = String(SdResId(STR_PUBLISH_NEXT));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName((nFile ==2 || mnSdPageCount == 1?
+ BTN_NEXT_0:BTN_NEXT_1)), aButton);
+
+ if(nFile != 2 && mnSdPageCount > 1)
+ aButton = CreateLink(String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateRel(1)")), aButton);
+
+ aStr += aButton;
+ aStr.AppendAscii( "\r\n" );
+
+ // zur letzten Seite
+ aButton = String(SdResId(STR_HTMLEXP_LASTPAGE));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName((nFile ==2 || mnSdPageCount == 1?
+ BTN_LAST_0:BTN_LAST_1)), aButton);
+
+ if(nFile != 2 && mnSdPageCount > 1)
+ {
+ String aLink(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateAbs("));
+ aLink += String::CreateFromInt32(mnSdPageCount-1);
+ aLink.AppendAscii( ")" );
+ aButton = CreateLink( aLink, aButton);
+ }
+
+ aStr += aButton;
+ aStr.AppendAscii( "\r\n" );
+
+ // Inhalt
+ if (mbContentsPage)
+ {
+ aButton = String(SdResId(STR_PUBLISH_OUTLINE));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_INDEX), aButton);
+
+ // zur Uebersicht
+ aStr += CreateLink(maIndex, aButton, String(RTL_CONSTASCII_USTRINGPARAM("_top")));
+ aStr.AppendAscii( "\r\n" );
+ }
+
+ // Textmodus
+ if(mbImpress)
+ {
+ aButton = String(SdResId(STR_HTMLEXP_SETTEXT));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_TEXT), aButton);
+
+ String aText0( RTL_CONSTASCII_USTRINGPARAM("text0"));
+ aText0 += maHTMLExtension;
+ aStr += CreateLink( aText0, aButton, String(RTL_CONSTASCII_USTRINGPARAM("_top")));
+ aStr.AppendAscii( "\r\n" );
+ }
+
+ // Und fertich...
+ aStr.AppendAscii( "</center>\r\n" );
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ String aFileName( RTL_CONSTASCII_USTRINGPARAM("navbar") );
+ aFileName += String::CreateFromInt32(nFile);
+
+ bOk = WriteHtml( aFileName, true, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ // Jetzt kommt die Navigatonsleiste Outliner zugeklappt...
+ if(bOk)
+ {
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[0]);
+ aStr.AppendAscii( "</title>\r\n</head>\r\n" );
+ aStr += CreateBodyTag();
+
+ aButton = String(SdResId(STR_HTMLEXP_OUTLINE));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_MORE), aButton);
+
+ aStr += CreateLink(String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.ExpandOutline()")), aButton);
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ String aFileName( RTL_CONSTASCII_USTRINGPARAM("navbar3") );
+
+ bOk = WriteHtml( aFileName, true, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+ }
+
+ // ... und jetzt Outliner aufgeklappt
+ if( bOk )
+ {
+ String aStr(maHTMLHeader);
+ aStr += WriteMetaCharset();
+ aStr.AppendAscii( " <title>" );
+ aStr += StringToHTMLString(*mpPageNames[0]);
+ aStr.AppendAscii( "</title>\r\n</head>\r\n" );
+ aStr += CreateBodyTag();
+
+ aButton = String(SdResId(STR_HTMLEXP_NOOUTLINE));
+ if(mnButtonThema != -1)
+ aButton = CreateImage(GetButtonName(BTN_LESS), aButton);
+
+ aStr += CreateLink(String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.CollapseOutline()")), aButton);
+ aStr.AppendAscii( "</body>\r\n</html>" );
+
+ String aFileName( RTL_CONSTASCII_USTRINGPARAM("navbar4") );
+ bOk = WriteHtml( aFileName, true, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ }
+
+ return bOk;
+}
+
+// ====================================================================
+// Buttonleiste fuer Standard ausgeben
+// ====================================================================
+String HtmlExport::CreateNavBar( USHORT nSdPage, bool bIsText ) const
+{
+ // Navigationsleiste vorbereiten
+ String aStrNavFirst( SdResId(STR_HTMLEXP_FIRSTPAGE) );
+ String aStrNavPrev( SdResId(STR_PUBLISH_BACK) );
+ String aStrNavNext( SdResId(STR_PUBLISH_NEXT) );
+ String aStrNavLast( SdResId(STR_HTMLEXP_LASTPAGE) );
+ String aStrNavContent( SdResId(STR_PUBLISH_OUTLINE) );
+ String aStrNavText;
+ if( bIsText )
+ {
+ aStrNavText = String( SdResId(STR_HTMLEXP_SETGRAPHIC) );
+ }
+ else
+ {
+ aStrNavText = String( SdResId(STR_HTMLEXP_SETTEXT) );
+ }
+
+ if(!bIsText && mnButtonThema != -1)
+ {
+ if(nSdPage<1 || mnSdPageCount == 1)
+ {
+ aStrNavFirst = CreateImage(GetButtonName(BTN_FIRST_0), aStrNavFirst);
+ aStrNavPrev = CreateImage(GetButtonName(BTN_PREV_0), aStrNavPrev);
+ }
+ else
+ {
+ aStrNavFirst = CreateImage(GetButtonName(BTN_FIRST_1), aStrNavFirst);
+ aStrNavPrev = CreateImage(GetButtonName(BTN_PREV_1), aStrNavPrev);
+ }
+
+ if(nSdPage == mnSdPageCount-1 || mnSdPageCount == 1)
+ {
+ aStrNavNext = CreateImage(GetButtonName(BTN_NEXT_0), aStrNavNext);
+ aStrNavLast = CreateImage(GetButtonName(BTN_LAST_0), aStrNavLast);
+ }
+ else
+ {
+ aStrNavNext = CreateImage(GetButtonName(BTN_NEXT_1), aStrNavNext);
+ aStrNavLast = CreateImage(GetButtonName(BTN_LAST_1), aStrNavLast);
+ }
+
+ aStrNavContent = CreateImage(GetButtonName(BTN_INDEX), aStrNavContent);
+ aStrNavText = CreateImage(GetButtonName(BTN_TEXT), aStrNavText);
+ }
+
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("<center>\r\n")); //<table><tr>\r\n");
+
+ // erste Seite
+ if(nSdPage > 0)
+ aStr += CreateLink(bIsText?*mpTextFiles[0]:*mpHTMLFiles[0],aStrNavFirst);
+ else
+ aStr += aStrNavFirst;
+ aStr.Append(sal_Unicode(' '));
+
+ // to Previous page
+ if(nSdPage > 0)
+ aStr += CreateLink( bIsText?*mpTextFiles[nSdPage-1]:
+ *mpHTMLFiles[nSdPage-1], aStrNavPrev);
+ else
+ aStr += aStrNavPrev;
+ aStr.Append(sal_Unicode(' '));
+
+ // to Next page
+ if(nSdPage < mnSdPageCount-1)
+ aStr += CreateLink( bIsText?*mpTextFiles[nSdPage+1]:
+ *mpHTMLFiles[nSdPage+1], aStrNavNext);
+ else
+ aStr += aStrNavNext;
+ aStr.Append(sal_Unicode(' '));
+
+ // to Last page
+ if(nSdPage < mnSdPageCount-1)
+ aStr += CreateLink( bIsText?*mpTextFiles[mnSdPageCount-1]:
+ *mpHTMLFiles[mnSdPageCount-1],
+ aStrNavLast );
+ else
+ aStr += aStrNavLast;
+ aStr.Append(sal_Unicode(' '));
+
+ // to Index page
+ if (mbContentsPage)
+ {
+ aStr += CreateLink(maIndex, aStrNavContent);
+ aStr.Append(sal_Unicode(' '));
+ }
+
+ // Text/Graphics
+ if(mbImpress)
+ {
+ aStr += CreateLink( bIsText?(mbFrames?maFramePage:*mpHTMLFiles[nSdPage]):
+ *mpTextFiles[nSdPage], aStrNavText);
+
+ }
+
+ aStr.AppendAscii( "</center><br>\r\n" );
+
+ return aStr;
+}
+
+/** export navigation graphics from button set */
+bool HtmlExport::CreateBitmaps()
+{
+ if(mnButtonThema != -1 && mpButtonSet.get() )
+ {
+ for( int nButton = 0; nButton < NUM_BUTTONS; nButton++ )
+ {
+ if(!mbFrames && (nButton == BTN_MORE || nButton == BTN_LESS))
+ continue;
+
+ if(!mbImpress && (nButton == BTN_TEXT || nButton == BTN_MORE || nButton == BTN_LESS ))
+ continue;
+
+ OUString aFull(maExportPath);
+ aFull += GetButtonName(nButton);
+ mpButtonSet->exportButton( mnButtonThema, aFull, GetButtonName(nButton) );
+ }
+ }
+ return true;
+}
+
+// =====================================================================
+// Erzeugt den <body> Tag, inkl. der eingestellten Farbattribute
+// =====================================================================
+String HtmlExport::CreateBodyTag() const
+{
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("<body") );
+
+ if( mbUserAttr || mbDocColors )
+ {
+ Color aTextColor( maTextColor );
+ if( (aTextColor == COL_AUTO) && (!maBackColor.IsDark()) )
+ aTextColor = COL_BLACK;
+
+ aStr.AppendAscii( " text=\"" );
+ aStr += ColorToHTMLString( aTextColor );
+ aStr.AppendAscii( "\" bgcolor=\"" );
+ aStr += ColorToHTMLString( maBackColor );
+ aStr.AppendAscii( "\" link=\"" );
+ aStr += ColorToHTMLString( maLinkColor );
+ aStr.AppendAscii( "\" vlink=\"" );
+ aStr += ColorToHTMLString( maVLinkColor );
+ aStr.AppendAscii( "\" alink=\"" );
+ aStr += ColorToHTMLString( maALinkColor );
+ aStr.AppendAscii( "\"" );
+ }
+
+ aStr.AppendAscii( ">\r\n" );
+
+ return aStr;
+}
+
+// =====================================================================
+// Erzeugt einen Hyperlink
+// =====================================================================
+String HtmlExport::CreateLink( const String& aLink,
+ const String& aText,
+ const String& aTarget ) const
+{
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("<a href=\""));
+ aStr += StringToURL(aLink);
+ if(aTarget.Len())
+ {
+ aStr.AppendAscii( "\" target=\"" );
+ aStr += aTarget;
+ }
+ aStr.AppendAscii( "\">" );
+ aStr += aText;
+ aStr.AppendAscii( "</a>" );
+
+ return aStr;
+}
+
+// =====================================================================
+// Erzeugt ein Image-tag
+// =====================================================================
+String HtmlExport::CreateImage( const String& aImage, const String& aAltText,
+ INT16 nWidth,
+ INT16 nHeight ) const
+{
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("<img src=\""));
+ aStr += StringToURL(aImage);
+ aStr.AppendAscii( "\" border=0" );
+
+ if( aAltText.Len())
+ {
+ aStr.AppendAscii( " alt=\"" );
+ aStr += aAltText;
+ aStr.Append(sal_Unicode('"'));
+ }
+ else
+ {
+ // Agerskov: HTML 4.01 has to have an alt attribut even if it is an empty string
+ aStr.AppendAscii( " alt=\"\"" );
+ }
+
+ if(nWidth > -1)
+ {
+ aStr.AppendAscii( " width=" );
+ aStr += String::CreateFromInt32(nWidth);
+ }
+
+ if(nHeight > -1)
+ {
+ aStr.AppendAscii( " height=" );
+ aStr += String::CreateFromInt32(nHeight);
+ }
+
+ aStr.Append(sal_Unicode('>'));
+
+ return aStr;
+}
+
+// =====================================================================
+// Area fuer Kreis erzeugen; es werden Pixelkoordinaten erwartet
+// =====================================================================
+String HtmlExport::ColorToHTMLString( Color aColor )
+{
+ static char hex[] = "0123456789ABCDEF";
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("#xxxxxx"));
+ aStr.SetChar(1, hex[(aColor.GetRed() >> 4) & 0xf] );
+ aStr.SetChar(2, hex[aColor.GetRed() & 0xf] );
+ aStr.SetChar(3, hex[(aColor.GetGreen() >> 4) & 0xf] );
+ aStr.SetChar(4, hex[aColor.GetGreen() & 0xf] );
+ aStr.SetChar(5, hex[(aColor.GetBlue() >> 4) & 0xf] );
+ aStr.SetChar(6, hex[aColor.GetBlue() & 0xf] );
+
+ return aStr;
+}
+
+// =====================================================================
+// Area fuer Kreis erzeugen; es werden Pixelkoordinaten erwartet
+// =====================================================================
+String HtmlExport::CreateHTMLCircleArea( ULONG nRadius,
+ ULONG nCenterX,
+ ULONG nCenterY,
+ const String& rHRef ) const
+{
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("<area shape=\"circle\" alt=\"\" coords=\"" ));
+
+ aStr += String::CreateFromInt32(nCenterX);
+ aStr.Append(sal_Unicode(','));
+ aStr += String::CreateFromInt32(nCenterY);
+ aStr.Append(sal_Unicode(','));
+ aStr += String::CreateFromInt32(nRadius);
+ aStr.AppendAscii( "\" href=\"" );
+ aStr += StringToURL(rHRef);
+ aStr.AppendAscii( "\">\n" );
+
+ return aStr;
+}
+
+
+// =====================================================================
+// Area fuer Polygon erzeugen; es werden Pixelkoordinaten erwartet
+// =====================================================================
+String HtmlExport::CreateHTMLPolygonArea( const ::basegfx::B2DPolyPolygon& rPolyPolygon,
+ Size aShift, double fFactor, const String& rHRef ) const
+{
+ String aStr;
+ const sal_uInt32 nNoOfPolygons(rPolyPolygon.count());
+
+ for ( sal_uInt32 nXPoly = 0L; nXPoly < nNoOfPolygons; nXPoly++ )
+ {
+ const ::basegfx::B2DPolygon& aPolygon = rPolyPolygon.getB2DPolygon(nXPoly);
+ const sal_uInt32 nNoOfPoints(aPolygon.count());
+
+ aStr.AppendAscii( "<area shape=\"polygon\" alt=\"\" coords=\"" );
+
+ for ( sal_uInt32 nPoint = 0L; nPoint < nNoOfPoints; nPoint++ )
+ {
+ const ::basegfx::B2DPoint aB2DPoint(aPolygon.getB2DPoint(nPoint));
+ Point aPnt(FRound(aB2DPoint.getX()), FRound(aB2DPoint.getY()));
+ // das Koordinaten beziehen sich auf den
+ // physikalischen Seitenursprung, nicht auf den
+ // Koordinatenursprung
+ aPnt.Move(aShift.Width(), aShift.Height());
+
+ aPnt.X() = (long)(aPnt.X() * fFactor);
+ aPnt.Y() = (long)(aPnt.Y() * fFactor);
+ aStr += String::CreateFromInt32(aPnt.X());
+ aStr.Append(sal_Unicode(','));
+ aStr += String::CreateFromInt32(aPnt.Y());
+
+ if (nPoint < nNoOfPoints - 1)
+ aStr.Append( sal_Unicode(',') );
+ }
+ aStr.AppendAscii( "\" href=\"" );
+ aStr += StringToURL(rHRef);
+ aStr.AppendAscii( "\">\n" );
+ }
+
+ return aStr;
+}
+
+// =====================================================================
+// Area fuer Rechteck erzeugen; es werden Pixelkoordinaten erwartet
+// =====================================================================
+String HtmlExport::CreateHTMLRectArea( const Rectangle& rRect,
+ const String& rHRef ) const
+{
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("<area shape=\"rect\" alt=\"\" coords=\"") );
+
+ aStr += String::CreateFromInt32(rRect.Left());
+ aStr.Append(sal_Unicode(','));
+ aStr += String::CreateFromInt32(rRect.Top());
+ aStr.Append(sal_Unicode(','));
+ aStr += String::CreateFromInt32(rRect.Right());
+ aStr.Append(sal_Unicode(','));
+ aStr += String::CreateFromInt32(rRect.Bottom());
+ aStr.AppendAscii( "\" href=\"" );
+ aStr += StringToURL(rHRef);
+ aStr.AppendAscii( "\">\n" );
+
+ return aStr;
+}
+
+// =====================================================================
+// StringToHTMLString, konvertiert einen String in
+// seine HTML-Repraesentation (Umlaute etc.)
+// =====================================================================
+String HtmlExport::StringToHTMLString( const String& rString )
+{
+ SvMemoryStream aMemStm;
+ HTMLOutFuncs::Out_String( aMemStm, rString, RTL_TEXTENCODING_UTF8 );
+ aMemStm << (char) 0;
+ return String( (char*)aMemStm.GetData(), RTL_TEXTENCODING_UTF8 );
+}
+
+// =====================================================================
+// Erzeugt die URL einer bestimmten Seite
+// =====================================================================
+String HtmlExport::CreatePageURL( USHORT nPgNum )
+{
+ if(mbFrames)
+ {
+ String aUrl( RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateAbs("));
+ aUrl += String::CreateFromInt32(nPgNum);
+ aUrl.Append(sal_Unicode(')'));
+ return aUrl;
+ }
+ else
+ return *mpHTMLFiles[nPgNum];
+}
+
+bool HtmlExport::CopyScript( const String& rPath, const String& rSource, const String& rDest, bool bUnix /* = false */ )
+{
+ INetURLObject aURL( SvtPathOptions().GetConfigPath() );
+ String aScript;
+
+ aURL.Append( String( RTL_CONSTASCII_USTRINGPARAM("webcast") ) );
+ aURL.Append( rSource );
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_OPEN_FILE, rSource );
+
+ ULONG nErr = 0;
+ SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
+
+ if( pIStm )
+ {
+ ByteString aLine;
+
+ while( pIStm->ReadLine( aLine ) )
+ {
+ aScript.AppendAscii( aLine.GetBuffer() );
+ if( bUnix )
+ {
+ aScript.AppendAscii( "\n" );
+ }
+ else
+ {
+ aScript.AppendAscii( "\r\n" );
+ }
+ }
+
+ nErr = pIStm->GetError();
+ delete pIStm;
+ }
+
+ if( nErr != 0 )
+ {
+ ErrorHandler::HandleError( nErr );
+ return (bool) nErr;
+ }
+
+
+ aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$1")), getDocumentTitle() );
+
+ const String aSaveStr( RESTOHTML( STR_WEBVIEW_SAVE ));
+ aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$2")), aSaveStr );
+
+ aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$3")), maCGIPath );
+
+ aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$4")), String::CreateFromInt32(mnWidthPixel) );
+ aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$5")), String::CreateFromInt32(mnHeightPixel) );
+
+
+ String aDest( rPath );
+ aDest += rDest;
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, rDest );
+ // write script file
+ {
+ EasyFile aFile;
+ SvStream* pStr;
+ nErr = aFile.createStream(aDest, pStr);
+ if(nErr == 0)
+ {
+ ByteString aStr( aScript, RTL_TEXTENCODING_UTF8 );
+ *pStr << aStr.GetBuffer();
+
+ nErr = aFile.close();
+ }
+ }
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ if( nErr != 0 )
+ ErrorHandler::HandleError( nErr );
+
+ return nErr == 0;
+}
+
+static const char * ASP_Scripts[] = { "common.inc", "webcast.asp", "show.asp", "savepic.asp", "poll.asp", "editpic.asp" };
+
+/** erzeugt und speichert die f�r WebShow ben�tigte ASP Scripte */
+bool HtmlExport::CreateASPScripts()
+{
+ for( USHORT n = 0; n < (sizeof( ASP_Scripts ) / sizeof(char *)); n++ )
+ {
+ String aScript;
+
+ aScript.AssignAscii( ASP_Scripts[n] );
+ if(!CopyScript(maExportPath, aScript, aScript))
+ return false;
+ }
+
+ if(!CopyScript(maExportPath, String(RTL_CONSTASCII_USTRINGPARAM("edit.asp")), maIndex ))
+ return false;
+
+ return true;
+}
+
+
+static const char *PERL_Scripts[] = { "webcast.pl", "common.pl", "editpic.pl", "poll.pl", "savepic.pl", "show.pl" };
+
+/** erzeugt und speichert die f�r WebShow ben�tigte PERL Scripte */
+bool HtmlExport::CreatePERLScripts()
+{
+ for( USHORT n = 0; n < (sizeof( PERL_Scripts ) / sizeof(char *)); n++ )
+ {
+ String aScript;
+ aScript.AssignAscii( PERL_Scripts[n] );
+ if(!CopyScript(maExportPath, aScript, aScript, true))
+ return false;
+ }
+
+ if(!CopyScript(maExportPath, String( RTL_CONSTASCII_USTRINGPARAM("edit.pl")), maIndex, true ))
+ return false;
+
+ if(!CopyScript(maExportPath, String( RTL_CONSTASCII_USTRINGPARAM("index.pl")), maIndexUrl, true ))
+ return false;
+
+ return true;
+}
+
+/** Erzeugt eine Liste mit den Namen der gespeicherten Images */
+bool HtmlExport::CreateImageFileList()
+{
+ String aStr;
+ for( USHORT nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
+ {
+ aStr += String::CreateFromInt32( nSdPage + 1 );
+ aStr.Append(sal_Unicode(';'));
+ aStr += maURLPath;
+ aStr += *mpImageFiles[nSdPage];
+ aStr.AppendAscii( "\r\n" );
+ }
+
+ String aFileName( RTL_CONSTASCII_USTRINGPARAM("picture.txt") );
+ bool bOk = WriteHtml( aFileName, false, aStr );
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ return bOk;
+}
+
+/** Erzeugt das File mit der aktuellen Seitennumer */
+bool HtmlExport::CreateImageNumberFile()
+{
+ String aFull( maExportPath );
+ String aFileName( RTL_CONSTASCII_USTRINGPARAM("currpic.txt") );
+ aFull += aFileName;
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, aFileName );
+ EasyFile aFile;
+ SvStream* pStr;
+ ULONG nErr = aFile.createStream(aFull, pStr);
+ if(nErr == 0)
+ {
+ *pStr << (const char *)"1";
+ nErr = aFile.close();
+ }
+
+ if (mpProgress)
+ mpProgress->SetState(++mnPagesWritten);
+
+ if( nErr != 0 )
+ ErrorHandler::HandleError( nErr );
+
+ return nErr == 0;
+}
+
+// =====================================================================
+
+String HtmlExport::InsertSound( const String& rSoundFile )
+{
+ if( rSoundFile.Len() == 0 )
+ return rSoundFile;
+
+ String aStr( RTL_CONSTASCII_USTRINGPARAM("<embed src=\"") );
+ INetURLObject aURL( rSoundFile );
+
+ DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
+
+ aStr += String(aURL.getName());
+ aStr.AppendAscii( "\" hidden=\"true\" autostart=\"true\">" );
+
+ CopyFile( rSoundFile, maExportPath );
+
+ return aStr;
+}
+
+// =====================================================================
+
+bool HtmlExport::CopyFile( const String& rSourceFile, const String& rDestPath )
+{
+ DirEntry aSourceEntry( rSourceFile );
+ DirEntry aDestEntry( rDestPath );
+
+ meEC.SetContext( STR_HTMLEXP_ERROR_COPY_FILE, aSourceEntry.GetName(), rDestPath );
+ FSysError nError = aSourceEntry.CopyTo( aDestEntry, FSYS_ACTION_COPYFILE );
+
+ if( nError != FSYS_ERR_OK )
+ {
+ ErrorHandler::HandleError(nError);
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+// =====================================================================
+
+bool HtmlExport::checkFileExists( Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess, String const & aFileName )
+{
+ try
+ {
+ OUString url( maExportPath );
+ url += aFileName;
+ return xFileAccess->exists( url );
+ }
+ catch( com::sun::star::uno::Exception& e )
+ {
+ (void)e;
+ DBG_ERROR((OString("sd::HtmlExport::checkFileExists(), exception caught: ") +
+ rtl::OUStringToOString( comphelper::anyToString( cppu::getCaughtException() ), RTL_TEXTENCODING_UTF8 )).getStr() );
+ }
+
+ return false;
+}
+
+// ---------------------------------------------------------------------
+
+bool HtmlExport::checkForExistingFiles()
+{
+ bool bFound = false;
+
+ try
+ {
+ Reference< XMultiServiceFactory > xMsf( ::comphelper::getProcessServiceFactory() );
+ Reference< ::com::sun::star::ucb::XSimpleFileAccess > xFA( xMsf->createInstance(
+ OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ucb.SimpleFileAccess"))), UNO_QUERY_THROW );
+
+ sal_uInt16 nSdPage;
+ for( nSdPage = 0; !bFound && (nSdPage < mnSdPageCount); nSdPage++)
+ {
+ if( (mpImageFiles[nSdPage] && checkFileExists( xFA, *mpImageFiles[nSdPage] )) ||
+ (mpHTMLFiles[nSdPage] && checkFileExists( xFA, *mpHTMLFiles[nSdPage] )) ||
+ (mpPageNames[nSdPage] && checkFileExists( xFA, *mpPageNames[nSdPage] )) ||
+ (mpTextFiles[nSdPage] && checkFileExists( xFA, *mpTextFiles[nSdPage] )) )
+ {
+ bFound = true;
+ }
+ }
+
+ if( !bFound && mbDownload )
+ bFound = checkFileExists( xFA, maDocFileName );
+
+ if( !bFound && mbFrames )
+ bFound = checkFileExists( xFA, maFramePage );
+
+ if( bFound )
+ {
+ ResMgr *pResMgr = CREATERESMGR( dbw );
+ if( pResMgr )
+ {
+ ResId aResId( 4077, *pResMgr );
+ String aMsg( aResId );
+
+ OUString aSystemPath;
+ osl::FileBase::getSystemPathFromFileURL( maExportPath, aSystemPath );
+ aMsg.SearchAndReplaceAscii( "%FILENAME", aSystemPath );
+ WarningBox aWarning( 0, WB_YES_NO | WB_DEF_YES, aMsg );
+ aWarning.SetImage( WarningBox::GetStandardImage() );
+ bFound = ( RET_NO == aWarning.Execute() );
+
+ delete pResMgr;
+ }
+ else
+ {
+ bFound = false;
+ }
+ }
+ }
+ catch( Exception& e )
+ {
+ (void)e;
+ DBG_ERROR((OString("sd::HtmlExport::checkForExistingFiles(), exception caught: ") +
+ rtl::OUStringToOString( comphelper::anyToString( cppu::getCaughtException() ), RTL_TEXTENCODING_UTF8 )).getStr() );
+ bFound = false;
+ }
+
+ return bFound;
+}
+
+// ---------------------------------------------------------------------
+
+String HtmlExport::StringToURL( const String& rURL )
+{
+ return rURL;
+/*
+ return StringToHTMLString(rURL);
+ OUString aURL( StringToHTMLString(rURL) );
+
+ aURL = Uri::encode( aURL, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes, RTL_TEXTENCODING_UTF8);
+ return String( aURL );
+*/
+}
+
+String HtmlExport::GetButtonName( int nButton ) const
+{
+ String aName;
+ aName.AssignAscii( pButtonNames[nButton] );
+ return aName;
+}
+
+// =====================================================================
+EasyFile::EasyFile()
+{
+ pMedium = NULL;
+ pOStm = NULL;
+ bOpen = false;
+}
+
+// =====================================================================
+EasyFile::~EasyFile()
+{
+ if( bOpen )
+ close();
+}
+
+// =====================================================================
+ULONG EasyFile::createStream( const String& rUrl, SvStream* &rpStr )
+{
+ ULONG nErr = 0;
+
+ if(bOpen)
+ nErr = close();
+
+ String aFileName;
+
+ if( nErr == 0 )
+ nErr = createFileName( rUrl, aFileName );
+
+ if( nErr == 0 )
+ {
+ pOStm = ::utl::UcbStreamHelper::CreateStream( aFileName, STREAM_WRITE | STREAM_TRUNC );
+ if( pOStm )
+ {
+ bOpen = true;
+ nErr = pOStm->GetError();
+ }
+ else
+ {
+ nErr = ERRCODE_SFX_CANTCREATECONTENT;
+ }
+ }
+
+ if( nErr != 0 )
+ {
+ bOpen = false;
+ delete pMedium;
+ delete pOStm;
+ pOStm = NULL;
+ }
+
+ rpStr = pOStm;
+
+ return nErr;
+}
+
+// =====================================================================
+ULONG EasyFile::createFileName( const String& rURL, String& rFileName )
+{
+ ULONG nErr = 0;
+
+ if( bOpen )
+ nErr = close();
+
+ if( nErr == 0 )
+ {
+ INetURLObject aURL( rURL );
+
+ if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
+ {
+ String aURLStr;
+ ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rURL, aURLStr );
+ aURL = INetURLObject( aURLStr );
+ }
+ DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
+ rFileName = aURL.GetMainURL( INetURLObject::NO_DECODE );
+ }
+
+ return nErr;
+}
+
+// =====================================================================
+ULONG EasyFile::close()
+{
+ ULONG nErr = 0;
+
+ delete pOStm;
+ pOStm = NULL;
+
+ bOpen = false;
+
+ if( pMedium )
+ {
+ // uebertragen
+ pMedium->Close();
+ pMedium->Commit();
+
+ nErr = pMedium->GetError();
+
+ delete pMedium;
+ pMedium = NULL;
+ }
+
+ return nErr;
+}
+
+// =====================================================================
+// This class helps reporting errors during file i/o
+// =====================================================================
+
+HtmlErrorContext::HtmlErrorContext(Window *_pWin)
+: ErrorContext(_pWin)
+{
+ mnResId = 0;
+}
+
+// =====================================================================
+
+BOOL HtmlErrorContext::GetString( ULONG, String& rCtxStr )
+{
+ DBG_ASSERT( mnResId != 0, "No error context set" );
+ if( mnResId == 0 )
+ return false;
+
+ rCtxStr = String( SdResId( mnResId ) );
+
+ rCtxStr.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("$(URL1)")), maURL1 );
+ rCtxStr.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("$(URL2)")), maURL2 );
+
+ return true;
+}
+
+// =====================================================================
+
+void HtmlErrorContext::SetContext( USHORT nResId, const String& rURL )
+{
+ mnResId = nResId;
+ maURL1 = rURL;
+ maURL2.Erase();
+}
+
+// =====================================================================
+
+void HtmlErrorContext::SetContext( USHORT nResId, const String& rURL1, const String& rURL2 )
+{
+ mnResId = nResId;
+ maURL1 = rURL1;
+ maURL2 = rURL2;
+}
+
+// =====================================================================
+
+