| /************************************************************** |
| * |
| * 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_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(); |
| |
| sal_uLong createStream( const String& rUrl, SvStream*& rpStr ); |
| sal_uLong createFileName( const String& rUrl, String& rFileName ); |
| sal_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, sal_uInt16 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 ( sal_uInt16 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 = (sal_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 = (sal_uInt16)(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 ); |
| // sal_uInt16 nHiddenSlides = 0; |
| for( sal_uInt16 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 |
| sal_uInt16 nSepPos = maDocFileName.Search( sal_Unicode('.') ); |
| |
| if(nSepPos != STRING_NOTFOUND) |
| maDocFileName.Erase(nSepPos); |
| |
| maDocFileName.AppendAscii( ".odp" ); |
| } |
| |
| ////// |
| |
| sal_uInt16 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,sal_True) == SFX_ITEM_ON) |
| maTextColor = ((SvxColorItem*)rSet.GetItem(EE_CHAR_COLOR,sal_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( sal_uInt16 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( sal_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 (sal_uInt16 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) |
| { |
| sal_uLong nObjectCount = pPage->GetObjCount(); |
| SdrObject* pObject = NULL; |
| SdrTextObj* pResult = NULL; |
| |
| for (sal_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(sal_uInt16 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 ) |
| { |
| sal_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 ); |
| |
| sal_uLong nCount = pOutliner->GetParagraphCount(); |
| |
| Paragraph* pPara = NULL; |
| sal_Int16 nActDepth = -1; |
| |
| String aParaText; |
| for (sal_uLong nPara = 0; nPara < nCount; nPara++) |
| { |
| pPara = pOutliner->GetParagraph(nPara); |
| if(pPara == 0) |
| continue; |
| |
| const sal_Int16 nDepth = (sal_uInt16) pOutliner->GetDepth( (sal_uInt16) 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 ); |
| |
| sal_uLong nCount = pOutliner->GetParagraphCount(); |
| for (sal_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, sal_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(sal_True); |
| |
| Paragraph* pPara = pOutliner->GetParagraph(nPara); |
| if(NULL == pPara) |
| return aStr; |
| |
| HtmlState aState( (mbUserAttr || mbDocColors) ? maTextColor : Color(COL_BLACK) ); |
| SvUShorts aPortionList; |
| rEditEngine.GetPortions( (sal_uInt16) nPara, aPortionList ); |
| sal_uInt16 nPortionCount = aPortionList.Count(); |
| |
| sal_uInt16 nPos1 = 0; |
| for( sal_uInt16 nPortion = 0; nPortion < nPortionCount; nPortion++ ) |
| { |
| sal_uInt16 nPos2 = aPortionList.GetObject(nPortion); |
| |
| ESelection aSelection( (sal_uInt16) nPara, nPos1, (sal_uInt16) 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(sal_uInt16 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) |
| { |
| // sal_True = rueckwaerts |
| SdrObjListIter aIter(*pPage, IM_DEEPWITHGROUPS, sal_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; |
| } |
| sal_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 ) |
| { |
| sal_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 (sal_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(); |
| |
| sal_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(); |
| sal_uInt16 nAreaCount = rIMap.GetIMapObjectCount(); |
| for (sal_uInt16 nArea = 0; nArea < nAreaCount; nArea++) |
| { |
| IMapObject* pArea = rIMap.GetIMapObject(nArea); |
| sal_uInt16 nType = pArea->GetType(); |
| String aURL( pArea->GetURL() ); |
| |
| // ggfs. Seiten- oder Objektnamen umwandeln in den |
| // Namen der entsprechenden HTML-Datei |
| sal_Bool bIsMasterPage; |
| sal_uInt16 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); |
| |
| sal_uLong nCircleRadius = (((IMapCircleObject*)pArea)-> |
| GetRadius(false)); |
| nCircleRadius = (sal_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: |
| { |
| sal_Bool bIsMasterPage; |
| sal_uInt16 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: |
| { |
| sal_uLong nPage = nSdPage; |
| if (nSdPage == 0) |
| nPage = 0; |
| else |
| nPage = nSdPage - 1; |
| |
| aHRef = CreatePageURL( (sal_uInt16) nPage); |
| } |
| break; |
| |
| case presentation::ClickAction_NEXTPAGE: |
| { |
| sal_uLong nPage = nSdPage; |
| if (nSdPage == mnSdPageCount - 1) |
| nPage = mnSdPageCount - 1; |
| else |
| nPage = nSdPage + 1; |
| |
| aHRef = CreatePageURL( (sal_uInt16) 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(sal_uInt16 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( sal_uInt16 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(sal_uInt16 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 (sal_uInt16 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( sal_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( (sal_uInt16)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( sal_uInt16 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, |
| sal_Int16 nWidth, |
| sal_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( sal_uLong nRadius, |
| sal_uLong nCenterX, |
| sal_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( sal_uInt16 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 ); |
| |
| sal_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( sal_uInt16 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( sal_uInt16 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( sal_uInt16 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; |
| sal_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(); |
| } |
| |
| // ===================================================================== |
| sal_uLong EasyFile::createStream( const String& rUrl, SvStream* &rpStr ) |
| { |
| sal_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; |
| } |
| |
| // ===================================================================== |
| sal_uLong EasyFile::createFileName( const String& rURL, String& rFileName ) |
| { |
| sal_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; |
| } |
| |
| // ===================================================================== |
| sal_uLong EasyFile::close() |
| { |
| sal_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; |
| } |
| |
| // ===================================================================== |
| |
| sal_Bool HtmlErrorContext::GetString( sal_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( sal_uInt16 nResId, const String& rURL ) |
| { |
| mnResId = nResId; |
| maURL1 = rURL; |
| maURL2.Erase(); |
| } |
| |
| // ===================================================================== |
| |
| void HtmlErrorContext::SetContext( sal_uInt16 nResId, const String& rURL1, const String& rURL2 ) |
| { |
| mnResId = nResId; |
| maURL1 = rURL1; |
| maURL2 = rURL2; |
| } |
| |
| // ===================================================================== |
| |
| |