xref: /aoo41x/main/sd/source/filter/html/htmlex.cxx (revision 79aad27f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 #include "htmlex.hxx"
28 #include <com/sun/star/document/XExporter.hpp>
29 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
30 #include <com/sun/star/document/XFilter.hpp>
31 
32 #include <rtl/uri.hxx>
33 #include <comphelper/processfactory.hxx>
34 #include <osl/file.hxx>
35 #include <tools/fsys.hxx>
36 #include <unotools/pathoptions.hxx>
37 #include <svtools/FilterConfigItem.hxx>
38 #ifndef _UNOTOOLS_UCBSTREAMHELPER_HXX
39 #include <unotools/ucbstreamhelper.hxx>
40 #endif
41 #include <unotools/localfilehelper.hxx>
42 #include <com/sun/star/frame/XStorable.hpp>
43 #include <sfx2/progress.hxx>
44 #include <sfx2/progress.hxx>
45 #include <vcl/wrkwin.hxx>
46 #include <svl/aeitem.hxx>
47 #include <svx/svditer.hxx>
48 #include <svtools/imaprect.hxx>
49 #include <svtools/imapcirc.hxx>
50 #include <svtools/imappoly.hxx>
51 #include <vcl/msgbox.hxx>
52 #include <sfx2/app.hxx>
53 #include <editeng/outlobj.hxx>
54 #include <editeng/editobj.hxx>
55 #include <svx/svdopath.hxx>
56 #include <svx/xoutbmp.hxx>
57 #include <svtools/htmlout.hxx>
58 #include <sfx2/docfile.hxx>
59 #include <vcl/cvtgrf.hxx>
60 #include <svtools/colorcfg.hxx>
61 #include <svtools/filter.hxx>
62 #include <editeng/colritem.hxx>
63 #include <editeng/editeng.hxx>
64 #include <editeng/wghtitem.hxx>
65 #include <editeng/udlnitem.hxx>
66 #include <editeng/postitem.hxx>
67 #include <editeng/crsditem.hxx>
68 #include <editeng/flditem.hxx>
69 #include <sfx2/dispatch.hxx>
70 #include <sfx2/fcontnr.hxx>
71 #include <svl/style.hxx>
72 #define _SVSTDARR_USHORTS
73 #include <svl/svstdarr.hxx>
74 #include <editeng/frmdiritem.hxx>
75 #include <svx/svdoutl.hxx>
76 #include <tools/urlobj.hxx>               // INetURLObject
77 #include <vcl/bmpacc.hxx>
78 #include <svtools/sfxecode.hxx>
79 #include <com/sun/star/beans/PropertyState.hpp>
80 #include <tools/resmgr.hxx>
81 #include "comphelper/anytostring.hxx"
82 #include "cppuhelper/exc_hlp.hxx"
83 
84 #include "drawdoc.hxx"
85 #include "Outliner.hxx"
86 #include "sdpage.hxx"
87 #include "sdattr.hxx"
88 #include "glob.hrc"
89 #include "anminfo.hxx"
90 #include "imapinfo.hxx"
91 #include "sdresid.hxx"
92 #include "buttonset.hxx"
93 #include <basegfx/polygon/b2dpolygon.hxx>
94 
95 using ::rtl::OUString;
96 using ::rtl::OString;
97 using namespace ::com::sun::star;
98 using namespace ::com::sun::star::uno;
99 using namespace ::com::sun::star::beans;
100 using namespace ::com::sun::star::frame;
101 using namespace ::com::sun::star::lang;
102 using namespace ::com::sun::star::document;
103 
104 #define KEY_QUALITY		"JPG-EXPORT-QUALITY"
105 
106 // Parameter aus Itemset abfragen
107 
108 #define RESTOHTML( res ) StringToHTMLString(String(SdResId(res)))
109 #define S2H( str ) StringToHTMLString( str )
110 
111 // bei Aenderungen auch NUM_BUTTONS in pubdlg.hxx aendern!!
112 const char *pButtonNames[NUM_BUTTONS] =
113 {
114 	"first-inactive.png",
115 	"first.png",
116 	"left-inactive.png",
117 	"left.png",
118 	"right-inactive.png",
119 	"right.png",
120 	"last-inactive.png",
121 	"last.png",
122 	"home.png",
123 	"text.png",
124 	"expand.png",
125 	"collapse.png",
126 };
127 
128 #define BTN_FIRST_0	0
129 #define BTN_FIRST_1	1
130 #define BTN_PREV_0	2
131 #define BTN_PREV_1	3
132 #define BTN_NEXT_0	4
133 #define BTN_NEXT_1	5
134 #define BTN_LAST_0	6
135 #define BTN_LAST_1	7
136 #define BTN_INDEX	8
137 #define BTN_TEXT	9
138 #define BTN_MORE	10
139 #define BTN_LESS	11
140 
141 // Fuer Detectfilter
142 #define CALC_OPTIONS		"9,34,SYSTEM"
143 
144 // *********************************************************************
145 // Hilfsklasse fuer das simple erzeugen von Dateien lokal/remote
146 // *********************************************************************
147 class EasyFile
148 {
149 private:
150 	SvStream*	pOStm;
151 	SfxMedium*	pMedium;
152 	bool		bOpen;
153 
154 public:
155 
156 	EasyFile();
157 	~EasyFile();
158 
159 	sal_uLong createStream( const String& rUrl, SvStream*& rpStr );
160 	sal_uLong createFileName(  const String& rUrl, String& rFileName );
161 	sal_uLong close();
162 };
163 
164 // *********************************************************************
165 // Hilfsklasse fuer das einbinden von Textattributen in die Html-Ausgabe
166 // *********************************************************************
167 class HtmlState
168 {
169 private:
170 	bool mbColor;
171 	bool mbWeight;
172 	bool mbItalic;
173 	bool mbUnderline;
174 	bool mbStrike;
175 	bool mbLink;
176 	Color maColor;
177 	Color maDefColor;
178 	String maLink;
179 	String maTarget;
180 
181 public:
182 	HtmlState( Color aDefColor );
183 
184 	String SetWeight( bool bWeight );
185 	String SetItalic( bool bItalic );
186 	String SetUnderline( bool bUnderline );
187 	String SetColor( Color aColor );
188 	String SetStrikeout( bool bStrike );
189 	String SetLink( const String& aLink, const String& aTarget );
190 	String Flush();
191 };
192 
193 // =====================================================================
194 // alle noch offennen Tags schliessen
195 // =====================================================================
Flush()196 String HtmlState::Flush()
197 {
198 	String aStr, aEmpty;
199 
200 	aStr += SetWeight(false);
201 	aStr += SetItalic(false);
202 	aStr += SetUnderline(false);
203 	aStr += SetStrikeout(false);
204 	aStr += SetColor(maDefColor);
205 	aStr += SetLink(aEmpty,aEmpty);
206 
207 	return aStr;
208 }
209 
210 // =====================================================================
211 // c'tor mit Defaultfarbe fuer die Seite
212 // =====================================================================
HtmlState(Color aDefColor)213 HtmlState::HtmlState( Color aDefColor )
214 {
215 	mbColor = false;
216 	mbWeight = false;
217 	mbItalic = false;
218 	mbUnderline = false;
219 	mbLink = false;
220 	mbStrike = false;
221 	maDefColor = aDefColor;
222 }
223 
224 // =====================================================================
225 // aktiviert/deaktiviert Fettdruck
226 // =====================================================================
SetWeight(bool bWeight)227 String HtmlState::SetWeight( bool bWeight )
228 {
229 	String aStr;
230 
231 	if(bWeight && !mbWeight)
232 		aStr.AppendAscii( "<b>" );
233 	else if(!bWeight && mbWeight)
234 		aStr.AppendAscii( "</b>" );
235 
236 	mbWeight = bWeight;
237 	return aStr;
238 }
239 
240 // =====================================================================
241 // aktiviert/deaktiviert Italic
242 // =====================================================================
SetItalic(bool bItalic)243 String HtmlState::SetItalic( bool bItalic )
244 {
245 	String aStr;
246 
247 	if(bItalic && !mbItalic)
248 		aStr.AppendAscii( "<i>" );
249 	else if(!bItalic && mbItalic)
250 		aStr.AppendAscii( "</i>" );
251 
252 	mbItalic = bItalic;
253 	return aStr;
254 }
255 
256 // =====================================================================
257 // aktiviert/deaktiviert Unterstrichen
258 // =====================================================================
SetUnderline(bool bUnderline)259 String HtmlState::SetUnderline( bool bUnderline )
260 {
261 	String aStr;
262 
263 	if(bUnderline && !mbUnderline)
264 		aStr.AppendAscii( "<u>" );
265 	else if(!bUnderline && mbUnderline)
266 		aStr.AppendAscii( "</u>" );
267 
268 	mbUnderline = bUnderline;
269 	return aStr;
270 }
271 
272 // =====================================================================
273 // aktiviert/deaktiviert Durchstreichen
274 // =====================================================================
SetStrikeout(bool bStrike)275 String HtmlState::SetStrikeout( bool bStrike )
276 {
277 	String aStr;
278 
279 	if(bStrike && !mbStrike)
280 		aStr.AppendAscii( "<strike>" );
281 	else if(!bStrike && mbStrike)
282 		aStr.AppendAscii( "</strike>" );
283 
284 	mbStrike = bStrike;
285 	return aStr;
286 }
287 
288 // =====================================================================
289 // Setzt die angegebenne Textfarbe
290 // =====================================================================
SetColor(Color aColor)291 String HtmlState::SetColor( Color aColor )
292 {
293 	String aStr;
294 
295 	if(mbColor && aColor == maColor)
296 		return aStr;
297 
298 	if(mbColor)
299 	{
300 		aStr.AppendAscii( "</font>" );
301 		mbColor = false;
302 	}
303 
304 	if(aColor != maDefColor)
305 	{
306 		maColor = aColor;
307 
308 		aStr.AppendAscii( "<font color=\"" );
309 		aStr += HtmlExport::ColorToHTMLString(aColor);
310 		aStr.AppendAscii( "\">" );
311 
312 		mbColor = true;
313 	}
314 
315 	return aStr;
316 }
317 
318 // =====================================================================
319 // aktiviert/deaktiviert einen Hyperlink
320 // =====================================================================
SetLink(const String & aLink,const String & aTarget)321 String HtmlState::SetLink( const String& aLink, const String& aTarget )
322 {
323 	String aStr;
324 
325 	if(mbLink&&maLink == aLink&&maTarget==aTarget)
326 		return aStr;
327 
328 	if(mbLink)
329 	{
330 		aStr.AppendAscii( "</a>" );
331 		mbLink = false;
332 	}
333 
334 	if(aLink.Len())
335 	{
336 		aStr.AppendAscii( "<a href=\"" );
337 		aStr += HtmlExport::StringToURL(aLink);
338 		if(aTarget.Len())
339 		{
340 			aStr.AppendAscii( "\" target=\"" );
341 			aStr += aTarget;
342 		}
343 		aStr.AppendAscii( "\">" );
344 		mbLink = true;
345 		maLink = aLink;
346 		maTarget = aTarget;
347 	}
348 
349 	return aStr;
350 }
351 
352 // *********************************************************************
353 // class HtmlExport Methoden
354 // *********************************************************************
355 
getParagraphStyle(SdrOutliner * pOutliner,sal_uInt16 nPara)356 static String getParagraphStyle( SdrOutliner* pOutliner, sal_uInt16 nPara )
357 {
358     SfxItemSet aParaSet( pOutliner->GetParaAttribs( nPara ) );
359 
360     String sStyle( RTL_CONSTASCII_USTRINGPARAM("direction:") );
361     if( static_cast<const SvxFrameDirectionItem*>(aParaSet.GetItem( EE_PARA_WRITINGDIR ))->GetValue() == FRMDIR_HORI_RIGHT_TOP )
362     {
363         sStyle += String( RTL_CONSTASCII_USTRINGPARAM("rtl;") );
364     }
365     else
366     {
367          sStyle += String( RTL_CONSTASCII_USTRINGPARAM("ltr;") );
368     }
369     return sStyle;
370 }
371 
372 // =====================================================================
373 // Konstruktor fuer die Html Export Hilfsklasse
374 // =====================================================================
HtmlExport(OUString aPath,const Sequence<PropertyValue> & rParams,SdDrawDocument * pExpDoc,::sd::DrawDocShell * pDocShell)375 HtmlExport::HtmlExport(
376     OUString aPath,
377     const Sequence< PropertyValue >& rParams,
378     SdDrawDocument* pExpDoc,
379     ::sd::DrawDocShell* pDocShell )
380 	:	maPath( aPath ),
381     	mpDoc(pExpDoc),
382         mpDocSh( pDocShell ),
383         meEC(NULL),
384         meMode( PUBLISH_HTML ),
385         mbContentsPage(false),
386         mnButtonThema(-1),
387         mnWidthPixel( PUB_LOWRES_WIDTH ),
388         meFormat( FORMAT_JPG ),
389         mbNotes(false),
390         mnCompression( -1 ),
391         mbDownload( false ),
392 		mbSlideSound(true),
393         mbHiddenSlides(true),
394         mbUserAttr(false),
395         mbDocColors(false),
396         maHTMLExtension(SdResId(STR_HTMLEXP_DEFAULT_EXTENSION)),
397         mpHTMLFiles(NULL),
398         mpImageFiles(NULL),
399         mpPageNames(NULL),
400         mpTextFiles(NULL),
401 		maIndexUrl(RTL_CONSTASCII_USTRINGPARAM("index")),
402         meScript( SCRIPT_ASP ),
403 		maHTMLHeader( RTL_CONSTASCII_USTRINGPARAM(
404 			"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\r\n"
405 			"     \"http://www.w3.org/TR/html4/transitional.dtd\">\r\n"
406 			"<html>\r\n<head>\r\n" ) ),
407 		mpButtonSet( new ButtonSet() )
408 {
409 	bool bChange = mpDoc->IsChanged();
410 
411 	maIndexUrl += maHTMLExtension;
412 
413 	InitExportParameters( rParams );
414 
415 	switch( meMode )
416 	{
417 	case PUBLISH_HTML:
418 	case PUBLISH_FRAMES:
419 		ExportHtml();
420 		break;
421 	case PUBLISH_WEBCAST:
422 		ExportWebCast();
423 		break;
424 	case PUBLISH_KIOSK:
425 		ExportKiosk();
426 		break;
427 	}
428 
429 	mpDoc->SetChanged(bChange);
430 }
431 
~HtmlExport()432 HtmlExport::~HtmlExport()
433 {
434 	// ------------------------------------------------------------------
435 	// Listen loeschen
436 	// ------------------------------------------------------------------
437 	if(mpImageFiles && mpHTMLFiles && mpPageNames && mpTextFiles)
438 	{
439 		for ( sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
440 		{
441 			delete mpImageFiles[nSdPage];
442 			delete mpHTMLFiles[nSdPage];
443 			delete mpPageNames[nSdPage];
444 			delete mpTextFiles[nSdPage];
445 		}
446 	}
447 
448 	delete[] mpImageFiles;
449 	delete[] mpHTMLFiles;
450 	delete[] mpPageNames;
451 	delete[] mpTextFiles;
452 }
453 
454 /** get common export parameters from item set */
InitExportParameters(const Sequence<PropertyValue> & rParams)455 void HtmlExport::InitExportParameters( const Sequence< PropertyValue >& rParams )
456 {
457 	mbImpress = mpDoc && mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS;
458 
459 	sal_Int32 nArgs = rParams.getLength();
460 	const PropertyValue* pParams = rParams.getConstArray();
461 	OUString aStr;
462 	while( nArgs-- )
463 	{
464 		if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PublishMode" ) ) )
465 		{
466 			sal_Int32 temp = 0;
467 			pParams->Value >>= temp;
468 			meMode = (HtmlPublishMode)temp;
469 		}
470 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IndexURL" ) ) )
471 		{
472 			pParams->Value >>= aStr;
473 			maIndexUrl = aStr;
474 		}
475 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Format" ) ) )
476 		{
477 			sal_Int32 temp = 0;
478 			pParams->Value >>= temp;
479 			meFormat = (PublishingFormat)temp;
480 		}
481 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Compression" ) ) )
482 		{
483 			pParams->Value >>= aStr;
484 			String aTmp( aStr );
485 			if(aTmp.Len())
486 			{
487 				xub_StrLen nPos = aTmp.Search( '%' );
488 				if(nPos != STRING_NOTFOUND)
489 					aTmp.Erase(nPos,1);
490 				mnCompression = (sal_Int16)aTmp.ToInt32();
491 			}
492 		}
493 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Width" ) ) )
494 		{
495 			sal_Int32 temp = 0;
496 			pParams->Value >>= temp;
497 			mnWidthPixel = (sal_uInt16)temp;
498 		}
499 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "UseButtonSet" ) ) )
500 		{
501 			sal_Int32 temp = 0;
502 			pParams->Value >>= temp;
503 			mnButtonThema = (sal_Int16)temp;
504 		}
505 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsExportNotes" ) ) )
506 		{
507 			if( mbImpress )
508 			{
509 				sal_Bool temp = sal_False;
510 				pParams->Value >>= temp;
511 				mbNotes = temp;
512 			}
513 		}
514 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsExportContentsPage" ) ) )
515 		{
516 			sal_Bool temp = sal_False;
517 			pParams->Value >>= temp;
518 			mbContentsPage = temp;
519 		}
520 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Author" ) ) )
521 		{
522 			pParams->Value >>= aStr;
523 			maAuthor = aStr;
524 		}
525 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "EMail" ) ) )
526 		{
527 			pParams->Value >>= aStr;
528 			maEMail = aStr;
529 		}
530 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HomepageURL" ) ) )
531 		{
532 			pParams->Value >>= aStr;
533 			maHomePage = aStr;
534 		}
535 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "UserText" ) ) )
536 		{
537 			pParams->Value >>= aStr;
538 			maInfo = aStr;
539 		}
540 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "EnableDownload" ) ) )
541 		{
542 			sal_Bool temp = sal_False;
543 			pParams->Value >>= temp;
544 			mbDownload = temp;
545 		}
546 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "SlideSound" ) ) )
547 		{
548 			sal_Bool temp = sal_True;
549 			pParams->Value >>= temp;
550 			mbSlideSound = temp;
551 		}
552 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HiddenSlides" ) ) )
553 		{
554 			sal_Bool temp = sal_True;
555 			pParams->Value >>= temp;
556 			mbHiddenSlides = temp;
557 		}
558 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BackColor" ) ) )
559 		{
560 			sal_Int32 temp = 0;
561 			pParams->Value >>= temp;
562 			maBackColor = temp;
563 			mbUserAttr = true;
564 		}
565 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "TextColor" ) ) )
566 		{
567 			sal_Int32 temp = 0;
568 			pParams->Value >>= temp;
569 			maTextColor = temp;
570 			mbUserAttr = true;
571 		}
572 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LinkColor" ) ) )
573 		{
574 			sal_Int32 temp = 0;
575 			pParams->Value >>= temp;
576 			maLinkColor = temp;
577 			mbUserAttr = true;
578 		}
579 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "VLinkColor" ) ) )
580 		{
581 			sal_Int32 temp = 0;
582 			pParams->Value >>= temp;
583 			maVLinkColor = temp;
584 			mbUserAttr = true;
585 		}
586 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ALinkColor" ) ) )
587 		{
588 			sal_Int32 temp = 0;
589 			pParams->Value >>= temp;
590 			maALinkColor = temp;
591 			mbUserAttr = true;
592 		}
593 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsUseDocumentColors" ) ) )
594 		{
595 			sal_Bool temp = sal_False;
596 			pParams->Value >>= temp;
597 			mbDocColors = temp;
598 		}
599 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "KioskSlideDuration" ) ) )
600 		{
601 			sal_Int32 temp = sal_False;
602 			pParams->Value >>= temp;
603 			mnSlideDuration = temp;
604 			mbAutoSlide = true;
605 		}
606 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "KioskEndless" ) ) )
607 		{
608 			sal_Bool temp = sal_False;
609 			pParams->Value >>= temp;
610 			mbEndless = temp;
611 		}
612 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "WebCastCGIURL" ) ) )
613 		{
614 			pParams->Value >>= aStr;
615 			maCGIPath = aStr;
616 		}
617 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "WebCastTargetURL" ) ) )
618 		{
619 			pParams->Value >>= aStr;
620 			maURLPath = aStr;
621 		}
622 		else if( pParams->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "WebCastScriptLanguage" ) ) )
623 		{
624 			pParams->Value >>= aStr;
625 			if( aStr.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM( "asp" ) ) )
626 			{
627 				meScript = SCRIPT_ASP;
628 			}
629 			else
630 			{
631 				meScript = SCRIPT_PERL;
632 			}
633 		}
634 		else
635 		{
636 			DBG_ERROR("Unknown property for html export detected!");
637 		}
638 
639 		pParams++;
640 	}
641 
642 	if( meMode == PUBLISH_KIOSK )
643 	{
644 		mbContentsPage = false;
645 		mbNotes = false;
646 
647 	}
648 
649 	// calculate image sizes
650 	SdPage* pPage = mpDoc->GetSdPage(0, PK_STANDARD);
651 	Size aTmpSize( pPage->GetSize() );
652 	double dRatio=((double)aTmpSize.Width())/aTmpSize.Height();
653 
654 /*
655 	switch( mnWidthPixel )
656 	{
657 		case 800:
658 			mnWidthPixel = 640;
659 			break;
660 		case 1024:
661 			mnWidthPixel = 800;
662 			break;
663 		case 640:
664 		default:
665 			mnWidthPixel = 512;
666 			break;
667 	}
668 */
669 	mnHeightPixel = (sal_uInt16)(mnWidthPixel/dRatio);
670 
671 	//------------------------------------------------------------------
672 	// Ziel ausklamuestern...
673 
674 	INetURLObject aINetURLObj( maPath );
675 	DBG_ASSERT( aINetURLObj.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
676 
677 	maExportPath = aINetURLObj.GetPartBeforeLastName();	// with trailing '/'
678 	maIndex = aINetURLObj.GetLastName();
679 
680 	mnSdPageCount = mpDoc->GetSdPageCount( PK_STANDARD );
681 //    sal_uInt16 nHiddenSlides = 0;
682     for( sal_uInt16 nPage = 0; nPage < mnSdPageCount; nPage++ )
683     {
684         pPage = mpDoc->GetSdPage( nPage, PK_STANDARD );
685 
686         if( mbHiddenSlides || !pPage->IsExcluded() )
687         {
688             maPages.push_back( pPage );
689             maNotesPages.push_back( mpDoc->GetSdPage( nPage, PK_NOTES ) );
690         }
691     }
692     mnSdPageCount = maPages.size();
693 
694 	mbFrames = meMode == PUBLISH_FRAMES;
695 
696 	maDocFileName = maIndex;
697 }
698 
699 ///////////////////////////////////////////////////////////////////////
700 // Exportiert das im Konstruktor angegebenne Impress Dokument nach HTML
701 ///////////////////////////////////////////////////////////////////////
ExportHtml()702 void HtmlExport::ExportHtml()
703 {
704 	if(mbUserAttr)
705 	{
706 		if( maTextColor == COL_AUTO )
707 		{
708 			if( !maBackColor.IsDark() )
709 				maTextColor = COL_BLACK;
710 		}
711 	}
712 	else if( mbDocColors )
713 	{
714 		// Standard Farben fuer das Farbschema 'Aus Dokument'
715 		SetDocColors();
716 		maFirstPageColor = maBackColor;
717 	}
718 
719 	// get name for downloadable presentation if needed
720 	if( mbDownload )
721 	{
722 		// Separator such und Extension ausblenden
723 		sal_uInt16 nSepPos = maDocFileName.Search( sal_Unicode('.') );
724 
725 		if(nSepPos != STRING_NOTFOUND)
726 			maDocFileName.Erase(nSepPos);
727 
728 		maDocFileName.AppendAscii( ".odp" );
729 	}
730 
731 	//////
732 
733 	sal_uInt16 nProgrCount = mnSdPageCount;
734 	nProgrCount += mbImpress?mnSdPageCount:0;
735 	nProgrCount += mbContentsPage?1:0;
736 	nProgrCount += (mbFrames && mbNotes)?mnSdPageCount:0;
737 	nProgrCount += (mbFrames)?8:0;
738 	InitProgress( nProgrCount );
739 
740 	mpDocSh->SetWaitCursor( true );
741 
742 	//------------------------------------------------------------------
743 	// Exceptions sind doch was schoennes...
744 
745 	CreateFileNames();
746 
747 	// this is not a true while
748 	while( 1 )
749 	{
750 		if( checkForExistingFiles() )
751 			break;
752 
753 		if( !CreateImagesForPresPages() )
754 			break;
755 
756 		if( !CreateHtmlForPresPages() )
757 			break;
758 
759 		if( mbImpress )
760 			if( !CreateHtmlTextForPresPages() )
761 				break;
762 
763 		if( mbFrames )
764 		{
765 			if( !CreateFrames() )
766 				break;
767 
768 			if( !CreateOutlinePages() )
769 				break;
770 
771 			if( !CreateNavBarFrames() )
772 				break;
773 
774 			if( mbNotes && mbImpress )
775 				if( !CreateNotesPages() )
776 					break;
777 
778 		}
779 
780 		if( mbContentsPage )
781 			if( !CreateContentPage() )
782 				break;
783 
784 		if( !CreateBitmaps() )
785 			break;
786 
787 		mpDocSh->SetWaitCursor( false );
788 		ResetProgress();
789 
790 		if( mbDownload )
791 			SavePresentation();
792 
793 		return;
794 	}
795 
796 	// if we get to this point the export was
797 	// canceled by the user after an error
798 	mpDocSh->SetWaitCursor( false );
799 	ResetProgress();
800 }
801 
802 ///////////////////////////////////////////////////////////////////////
803 
SetDocColors(SdPage * pPage)804 void HtmlExport::SetDocColors( SdPage* pPage )
805 {
806 	if( pPage == NULL )
807 		pPage = mpDoc->GetSdPage(0, PK_STANDARD);
808 
809     svtools::ColorConfig aConfig;
810     maVLinkColor = Color(aConfig.GetColorValue(svtools::LINKSVISITED).nColor);
811     maALinkColor = Color(aConfig.GetColorValue(svtools::LINKS).nColor);
812     maLinkColor  = Color(aConfig.GetColorValue(svtools::LINKS).nColor);
813 	maTextColor  = Color(COL_BLACK);
814 
815 	SfxStyleSheet* pSheet = NULL;
816 
817 	if( mpDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS )
818 	{
819 		// Standard Textfarbe aus Outline-Vorlage der ersten Seite
820 		pSheet = pPage->GetStyleSheetForPresObj(PRESOBJ_OUTLINE);
821 		if(pSheet == NULL)
822 			pSheet = pPage->GetStyleSheetForPresObj(PRESOBJ_TEXT);
823 		if(pSheet == NULL)
824 			pSheet = pPage->GetStyleSheetForPresObj(PRESOBJ_TITLE);
825 	}
826 
827 	if(pSheet == NULL)
828 		pSheet = mpDoc->GetDefaultStyleSheet();
829 
830 	if(pSheet)
831 	{
832 		SfxItemSet& rSet = pSheet->GetItemSet();
833         if(rSet.GetItemState(EE_CHAR_COLOR,sal_True) == SFX_ITEM_ON)
834             maTextColor = ((SvxColorItem*)rSet.GetItem(EE_CHAR_COLOR,sal_True))->GetValue();
835 	}
836 
837 	// Standard Hintergrundfarbe aus Background der MasterPage der ersten Seite
838 	maBackColor = pPage->GetPageBackgroundColor();
839 
840 	if( maTextColor == COL_AUTO )
841 	{
842 		if( !maBackColor.IsDark() )
843 			maTextColor = COL_BLACK;
844 	}
845 }
846 
847 ///////////////////////////////////////////////////////////////////////
848 
InitProgress(sal_uInt16 nProgrCount)849 void HtmlExport::InitProgress( sal_uInt16 nProgrCount )
850 {
851 	String aStr(SdResId(STR_CREATE_PAGES));
852 	mpProgress = new SfxProgress( mpDocSh, aStr, nProgrCount );
853 }
854 
855 ///////////////////////////////////////////////////////////////////////
856 
ResetProgress()857 void HtmlExport::ResetProgress()
858 {
859 	delete mpProgress;
860 	mpProgress = NULL;
861 }
862 
863 ///////////////////////////////////////////////////////////////////////
864 
ExportKiosk()865 void HtmlExport::ExportKiosk()
866 {
867 	mnPagesWritten = 0;
868 	InitProgress( 2*mnSdPageCount );
869 
870 	CreateFileNames();
871 	if( !checkForExistingFiles() )
872 	{
873 		if( CreateImagesForPresPages() )
874 			CreateHtmlForPresPages();
875 	}
876 
877 	ResetProgress();
878 }
879 
880 ///////////////////////////////////////////////////////////////////////
881 // Export Document with WebCast (TM) Technology
882 ///////////////////////////////////////////////////////////////////////
ExportWebCast()883 void HtmlExport::ExportWebCast()
884 {
885 	mnPagesWritten = 0;
886 	InitProgress( mnSdPageCount + 9 );
887 
888 	mpDocSh->SetWaitCursor( sal_True );
889 
890 	CreateFileNames();
891 
892 	String aEmpty;
893 	if(maCGIPath.Len() == 0)
894 		maCGIPath.Assign( sal_Unicode('.') );
895 
896 	if( maCGIPath.GetChar( maCGIPath.Len() - 1 ) != sal_Unicode('/') )
897 		maCGIPath.Append( sal_Unicode('/') );
898 
899 	if( meScript == SCRIPT_ASP )
900 	{
901 		maURLPath.AssignAscii( "./" );
902 	}
903 	else
904 	{
905    		String aEmpty2;
906 		if(maURLPath.Len() == 0)
907 			maURLPath.Assign( sal_Unicode('.') );
908 
909 		if( maURLPath.GetChar( maURLPath.Len() - 1 ) != sal_Unicode('/') )
910 			maURLPath.Append( sal_Unicode('/') );
911 	}
912 
913 	// this is not a true while
914 	while(1)
915 	{
916 		if( checkForExistingFiles() )
917 			break;
918 
919 		if(!CreateImagesForPresPages())
920 			break;
921 
922 		if( meScript == SCRIPT_ASP )
923 		{
924 			if(!CreateASPScripts())
925 				break;
926 		}
927 		else
928 		{
929 			if(!CreatePERLScripts())
930 				break;
931 		}
932 
933 		if(!CreateImageFileList())
934 			break;
935 
936 		if(!CreateImageNumberFile())
937 			break;
938 
939 		break;
940 	}
941 
942 	mpDocSh->SetWaitCursor( false );
943 	ResetProgress();
944 }
945 
946 ///////////////////////////////////////////////////////////////////////
947 // Save the presentation as a downloadable file in the dest directory
948 ///////////////////////////////////////////////////////////////////////
949 
SavePresentation()950 bool HtmlExport::SavePresentation()
951 {
952 	meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, maDocFileName );
953 
954 	OUString aURL( maExportPath );
955 	aURL += maDocFileName;
956 
957 
958 	mpDocSh->EnableSetModified( true );
959 
960 	try
961 	{
962 		uno::Reference< frame::XStorable > xStorable( mpDoc->getUnoModel(), uno::UNO_QUERY );
963 		if( xStorable.is() )
964 		{
965 			uno::Sequence< beans::PropertyValue > aProperties( 2 );
966 			aProperties[ 0 ].Name = OUString(RTL_CONSTASCII_USTRINGPARAM("Overwrite"));
967 			aProperties[ 0 ].Value <<= (sal_Bool)sal_True;
968 			aProperties[ 1 ].Name = OUString(RTL_CONSTASCII_USTRINGPARAM("FilterName"));
969 			aProperties[ 1 ].Value <<= OUString(RTL_CONSTASCII_USTRINGPARAM("impress8"));
970 			xStorable->storeToURL( aURL, aProperties );
971 
972 			mpDocSh->EnableSetModified( false );
973 
974 			return true;
975 		}
976 	}
977 	catch( Exception& )
978 	{
979 	}
980 
981 	mpDocSh->EnableSetModified( false );
982 
983 	return false;
984 }
985 
986 // =====================================================================
987 // Image-Dateien anlegen
988 // =====================================================================
CreateImagesForPresPages()989 bool HtmlExport::CreateImagesForPresPages()
990 {
991 	try
992 	{
993 		Reference < XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() );
994 		if( !xMSF.is() )
995 			return false;
996 
997 		Reference< XExporter > xGraphicExporter( xMSF->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.GraphicExportFilter") ) ), UNO_QUERY );
998 		Reference< XFilter > xFilter( xGraphicExporter, UNO_QUERY );
999 
1000 		DBG_ASSERT( xFilter.is(), "no com.sun.star.drawing.GraphicExportFilter?" );
1001 		if( !xFilter.is() )
1002 			return false;
1003 
1004 		Sequence< PropertyValue > aFilterData(((meFormat==FORMAT_JPG)&&(mnCompression != -1))? 3 : 2);
1005 		aFilterData[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("PixelWidth") );
1006 		aFilterData[0].Value <<= (sal_Int32)mnWidthPixel;
1007 		aFilterData[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("PixelHeight") );
1008 		aFilterData[1].Value <<= (sal_Int32)mnHeightPixel;
1009 		if((meFormat==FORMAT_JPG)&&(mnCompression != -1))
1010 		{
1011 			aFilterData[2].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("Quality") );
1012 			aFilterData[2].Value <<= (sal_Int32)mnCompression;
1013 		}
1014 
1015 		Sequence< PropertyValue > aDescriptor( 3 );
1016 		aDescriptor[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("URL") );
1017 		aDescriptor[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("FilterName") );
1018 		OUString sFormat;
1019 		if( meFormat == FORMAT_PNG )
1020 			sFormat = OUString( RTL_CONSTASCII_USTRINGPARAM("PNG") );
1021 		else if( meFormat == FORMAT_GIF )
1022 			sFormat = OUString( RTL_CONSTASCII_USTRINGPARAM("GIF") );
1023 		else
1024 			sFormat = OUString( RTL_CONSTASCII_USTRINGPARAM("JPG") );
1025 
1026 		aDescriptor[1].Value <<= sFormat;
1027 		aDescriptor[2].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("FilterData") );
1028 		aDescriptor[2].Value <<= aFilterData;
1029 
1030 		for (sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
1031 		{
1032 			SdPage* pPage = maPages[ nSdPage ];
1033 
1034 			OUString aFull(maExportPath);
1035 			aFull += *mpImageFiles[nSdPage];
1036 
1037 			aDescriptor[0].Value <<= aFull;
1038 
1039 			Reference< XComponent > xPage( pPage->getUnoPage(), UNO_QUERY );
1040 			xGraphicExporter->setSourceDocument( xPage );
1041 			xFilter->filter( aDescriptor );
1042 
1043 			if (mpProgress)
1044 				mpProgress->SetState(++mnPagesWritten);
1045 		}
1046 	}
1047 	catch( Exception& )
1048 	{
1049 		return false;
1050 	}
1051 
1052 	return true;
1053 }
1054 
1055 // =====================================================================
1056 // Ermittelt das SdrTextObject mit dem Layout Text dieser Seite
1057 // =====================================================================
GetLayoutTextObject(SdrPage * pPage)1058 SdrTextObj* HtmlExport::GetLayoutTextObject(SdrPage* pPage)
1059 {
1060 	sal_uLong			nObjectCount = pPage->GetObjCount();
1061 	SdrObject*		pObject 	 = NULL;
1062 	SdrTextObj* 	pResult 	 = NULL;
1063 
1064 	for (sal_uLong nObject = 0; nObject < nObjectCount; nObject++)
1065 	{
1066 		pObject = pPage->GetObj(nObject);
1067 		if (pObject->GetObjInventor() == SdrInventor &&
1068 			pObject->GetObjIdentifier() == OBJ_OUTLINETEXT)
1069 		{
1070 			pResult = (SdrTextObj*)pObject;
1071 			break;
1072 		}
1073 	}
1074 	return pResult;
1075 }
1076 
1077 // =====================================================================
1078 // HTML-Text Versionen fuer Impress Seiten erzeugen
1079 // =====================================================================
1080 
WriteMetaCharset() const1081 String HtmlExport::WriteMetaCharset() const
1082 {
1083 	String aStr;
1084 	const sal_Char *pCharSet = rtl_getBestMimeCharsetFromTextEncoding( RTL_TEXTENCODING_UTF8 );
1085 	if ( pCharSet )
1086 	{
1087 		aStr.AppendAscii( "  <meta HTTP-EQUIV=CONTENT-TYPE CONTENT=\"text/html; charset=" );
1088 		aStr.AppendAscii( pCharSet );
1089 		aStr.AppendAscii( "\">\r\n" );
1090 	}
1091 	return aStr;
1092 }
1093 
CreateHtmlTextForPresPages()1094 bool HtmlExport::CreateHtmlTextForPresPages()
1095 {
1096 	bool bOk = true;
1097 
1098 	SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
1099 
1100 	for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount && bOk; nSdPage++)
1101 	{
1102 		SdPage* pPage = maPages[ nSdPage ];
1103 
1104 		if( mbDocColors )
1105 		{
1106 			SetDocColors( pPage );
1107 //			maBackColor = pPage->GetPageBackgroundColor();
1108 		}
1109 
1110 // HTML Kopf
1111 		String aStr(maHTMLHeader);
1112 		aStr += WriteMetaCharset();
1113 		aStr.AppendAscii( "  <title>" );
1114 		aStr += StringToHTMLString( *mpPageNames[nSdPage] );
1115 		aStr.AppendAscii( "</title>\r\n" );
1116 		aStr.AppendAscii( "</head>\r\n" );
1117 		aStr += CreateBodyTag();
1118 
1119 // Navigationsleiste
1120 		aStr += CreateNavBar(nSdPage, true);
1121 
1122 // Seitentitel
1123         String sTitleText( CreateTextForTitle(pOutliner,pPage, pPage->GetPageBackgroundColor()) );
1124 		aStr.AppendAscii( "<h1 style=\"");
1125         aStr.Append( getParagraphStyle( pOutliner, 0 ) );
1126         aStr.AppendAscii( "\">" );
1127 		aStr += sTitleText;
1128 		aStr.AppendAscii( "</h1>\r\n" );
1129 
1130 // Gliederungstext schreiben
1131 		aStr += CreateTextForPage( pOutliner, pPage, true, pPage->GetPageBackgroundColor() );
1132 
1133 // Notizen
1134 		if(mbNotes)
1135 		{
1136 			SdPage* pNotesPage = maNotesPages[ nSdPage ];
1137 			String aNotesStr( CreateTextForNotesPage( pOutliner, pNotesPage, true, maBackColor) );
1138 
1139 			if( aNotesStr.Len() )
1140 			{
1141 				aStr.AppendAscii( "<br>\r\n<h3>" );
1142 				aStr += RESTOHTML(STR_HTMLEXP_NOTES);
1143 				aStr.AppendAscii( ":</h3>\r\n" );
1144 
1145 				aStr += aNotesStr;
1146 			}
1147 		}
1148 
1149 // Seite beenden
1150 		aStr.AppendAscii( "</body>\r\n</html>" );
1151 
1152 		bOk = WriteHtml( *mpTextFiles[nSdPage], false, aStr );
1153 
1154 		if (mpProgress)
1155 			mpProgress->SetState(++mnPagesWritten);
1156 
1157 	}
1158 
1159 	pOutliner->Clear();
1160 
1161 	return bOk;
1162 }
1163 
1164 /** exports the given html data into a non unicode file in the current export path with
1165 	the given filename */
WriteHtml(const String & rFileName,bool bAddExtension,const String & rHtmlData)1166 bool HtmlExport::WriteHtml( const String& rFileName, bool bAddExtension, const String& rHtmlData )
1167 {
1168 	sal_uLong nErr = 0;
1169 
1170 	String aFileName( rFileName );
1171 	if( bAddExtension )
1172 		aFileName += maHTMLExtension;
1173 
1174 	meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, rFileName );
1175 	EasyFile aFile;
1176 	SvStream* pStr;
1177 	String aFull( maExportPath );
1178 	aFull += aFileName;
1179 	nErr = aFile.createStream(aFull , pStr);
1180 	if(nErr == 0)
1181 	{
1182 		ByteString aStr( rHtmlData , RTL_TEXTENCODING_UTF8 ) ;
1183 		*pStr << aStr.GetBuffer();
1184 		nErr = aFile.close();
1185 	}
1186 
1187 	if( nErr != 0 )
1188 		ErrorHandler::HandleError(nErr);
1189 
1190 	return nErr == 0;
1191 }
1192 
1193 // =====================================================================
1194 
1195 /** Erzeugt den Outliner Text fuer das Titelobjekt einer Seite
1196  */
CreateTextForTitle(SdrOutliner * pOutliner,SdPage * pPage,const Color & rBackgroundColor)1197 String HtmlExport::CreateTextForTitle( SdrOutliner* pOutliner, SdPage* pPage, const Color& rBackgroundColor )
1198 {
1199 	SdrTextObj* pTO = (SdrTextObj*)pPage->GetPresObj(PRESOBJ_TITLE);
1200 	if(!pTO)
1201 		pTO = GetLayoutTextObject(pPage);
1202 
1203 	if (pTO && !pTO->IsEmptyPresObj())
1204 	{
1205 		OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
1206 		if(pOPO && pOutliner->GetParagraphCount() != 0)
1207 		{
1208 			pOutliner->Clear();
1209 			pOutliner->SetText(*pOPO);
1210 			return ParagraphToHTMLString(pOutliner,0, rBackgroundColor);
1211 		}
1212 	}
1213 
1214 	return String();
1215 }
1216 
1217 // =====================================================================
1218 // Erzeugt den Outliner Text fuer eine Seite
1219 // =====================================================================
CreateTextForPage(SdrOutliner * pOutliner,SdPage * pPage,bool bHeadLine,const Color & rBackgroundColor)1220 String HtmlExport::CreateTextForPage( SdrOutliner* pOutliner,
1221 									  SdPage* pPage,
1222 									  bool bHeadLine, const Color& rBackgroundColor )
1223 {
1224 	String aStr;
1225 
1226 	SdrTextObj* pTO = (SdrTextObj*)pPage->GetPresObj(PRESOBJ_TEXT);
1227 	if(!pTO)
1228 		pTO = GetLayoutTextObject(pPage);
1229 
1230 	if (pTO && !pTO->IsEmptyPresObj())
1231 	{
1232 		OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
1233 		if (pOPO)
1234 		{
1235 			pOutliner->Clear();
1236 			pOutliner->SetText( *pOPO );
1237 
1238 			sal_uLong nCount = pOutliner->GetParagraphCount();
1239 
1240 			Paragraph* pPara = NULL;
1241 			sal_Int16 nActDepth = -1;
1242 
1243 			String aParaText;
1244 			for (sal_uLong nPara = 0; nPara < nCount; nPara++)
1245 			{
1246 				pPara = pOutliner->GetParagraph(nPara);
1247 				if(pPara == 0)
1248 					continue;
1249 
1250 				const sal_Int16 nDepth = (sal_uInt16) pOutliner->GetDepth( (sal_uInt16) nPara );
1251 				aParaText = ParagraphToHTMLString(pOutliner,nPara,rBackgroundColor);
1252 
1253 				if(aParaText.Len() == 0)
1254 					continue;
1255 
1256 				if(nDepth < nActDepth )
1257 				{
1258 					do
1259 					{
1260 						aStr.AppendAscii( "</ul>" );
1261 						nActDepth--;
1262 					}
1263 					while(nDepth < nActDepth);
1264 				}
1265 				else if(nDepth > nActDepth )
1266 				{
1267 					do
1268 					{
1269 						aStr.AppendAscii( "<ul>" );
1270 						nActDepth++;
1271 					}
1272 					while( nDepth > nActDepth );
1273 				}
1274 
1275                 String sStyle( getParagraphStyle( pOutliner, nPara ) );
1276 				if(nActDepth >= 0 )
1277                 {
1278 					aStr.AppendAscii( "<li style=\"");
1279                     aStr.Append( sStyle );
1280                     aStr.AppendAscii( "\">" );
1281                 }
1282 
1283                 if(nActDepth <= 0 && bHeadLine)
1284                 {
1285                     if( nActDepth == 0 )
1286                     {
1287 					    aStr.AppendAscii( "<h2>" );
1288                     }
1289                     else
1290                     {
1291 					    aStr.AppendAscii( "<h2 style=\"");
1292                         aStr.Append( sStyle );
1293                         aStr.AppendAscii( "\">" );
1294                     }
1295                 }
1296 				aStr += aParaText;
1297 				if(nActDepth == 0 && bHeadLine)
1298 					aStr.AppendAscii( "</h2>" );
1299 				if(nActDepth >= 0 )
1300 					aStr.AppendAscii( "</li>" );
1301 				aStr.AppendAscii( "\r\n" );
1302 			}
1303 
1304 			while( nActDepth >= 0 )
1305 			{
1306 				aStr.AppendAscii( "</ul>" );
1307 				nActDepth--;
1308 			};
1309 		}
1310 	}
1311 
1312 	return aStr;
1313 }
1314 
1315 // =====================================================================
1316 // Erzeugt den Outliner Text fuer eine Notizseite
1317 // =====================================================================
CreateTextForNotesPage(SdrOutliner * pOutliner,SdPage * pPage,bool,const Color & rBackgroundColor)1318 String HtmlExport::CreateTextForNotesPage( SdrOutliner* pOutliner,
1319 										   SdPage* pPage,
1320 										   bool,
1321 										   const Color& rBackgroundColor )
1322 {
1323 	String aStr;
1324 
1325 	SdrTextObj* pTO = (SdrTextObj*)pPage->GetPresObj(PRESOBJ_NOTES);
1326 
1327 	if (pTO && !pTO->IsEmptyPresObj())
1328 	{
1329 		OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
1330 		if (pOPO)
1331 		{
1332 			pOutliner->Clear();
1333 			pOutliner->SetText( *pOPO );
1334 
1335 			sal_uLong nCount = pOutliner->GetParagraphCount();
1336 			for (sal_uLong nPara = 0; nPara < nCount; nPara++)
1337 			{
1338                 aStr.AppendAscii("<p style=\"");
1339                 aStr.Append( getParagraphStyle( pOutliner, nPara ) );
1340                 aStr.AppendAscii("\">");
1341 				aStr += ParagraphToHTMLString( pOutliner, nPara,rBackgroundColor );
1342 				aStr.AppendAscii( "</p>\r\n" );
1343 			}
1344 		}
1345 	}
1346 
1347 	return aStr;
1348 }
1349 
1350 // =====================================================================
1351 // Wandelt einen Paragraphen des Outliners in Html
1352 // =====================================================================
ParagraphToHTMLString(SdrOutliner * pOutliner,sal_uLong nPara,const Color & rBackgroundColor)1353 String HtmlExport::ParagraphToHTMLString( SdrOutliner* pOutliner, sal_uLong nPara, const Color& rBackgroundColor )
1354 {
1355 	String aStr;
1356 
1357 	if(NULL == pOutliner)
1358 		return aStr;
1359 
1360 	// TODO: MALTE!!!
1361 	EditEngine& rEditEngine = *(EditEngine*)&pOutliner->GetEditEngine();
1362 	bool bOldUpdateMode = rEditEngine.GetUpdateMode();
1363 	rEditEngine.SetUpdateMode(sal_True);
1364 
1365 	Paragraph* pPara = pOutliner->GetParagraph(nPara);
1366 	if(NULL == pPara)
1367 		return aStr;
1368 
1369 	HtmlState aState( (mbUserAttr || mbDocColors)  ? maTextColor : Color(COL_BLACK) );
1370 	SvUShorts aPortionList;
1371 	rEditEngine.GetPortions( (sal_uInt16) nPara, aPortionList );
1372 	sal_uInt16 nPortionCount = aPortionList.Count();
1373 
1374 	sal_uInt16 nPos1 = 0;
1375 	for( sal_uInt16 nPortion = 0; nPortion < nPortionCount; nPortion++ )
1376 	{
1377 		sal_uInt16 nPos2 = aPortionList.GetObject(nPortion);
1378 
1379 		ESelection aSelection( (sal_uInt16) nPara, nPos1, (sal_uInt16) nPara, nPos2);
1380 
1381 		SfxItemSet aSet( rEditEngine.GetAttribs( aSelection ) );
1382 
1383 		String aPortion(StringToHTMLString(rEditEngine.GetText( aSelection )));
1384 
1385 		aStr += TextAttribToHTMLString( &aSet, &aState, rBackgroundColor );
1386 		aStr += aPortion;
1387 
1388 		nPos1 = nPos2;
1389 	}
1390 	aStr += aState.Flush();
1391 	rEditEngine.SetUpdateMode(bOldUpdateMode);
1392 
1393 	return aStr;
1394 }
1395 
1396 // =====================================================================
1397 // Erzeugt anhand der Attribute im angegebennen Set und dem gegebennen
1398 // HtmlState die noetigen Html-Tags um die Attribute zu uebernehmen
1399 // =====================================================================
TextAttribToHTMLString(SfxItemSet * pSet,HtmlState * pState,const Color & rBackgroundColor)1400 String HtmlExport::TextAttribToHTMLString( SfxItemSet* pSet, HtmlState* pState, const Color& rBackgroundColor )
1401 {
1402 	String aStr;
1403 
1404 	if(NULL == pSet)
1405 		return aStr;
1406 
1407 	String aLink, aTarget;
1408 	if ( pSet->GetItemState( EE_FEATURE_FIELD ) == SFX_ITEM_ON )
1409 	{
1410 		SvxFieldItem* pItem = (SvxFieldItem*)pSet->GetItem( EE_FEATURE_FIELD );
1411 		if(pItem)
1412 		{
1413 			SvxURLField* pURL = PTR_CAST(SvxURLField, pItem->GetField());
1414 			if(pURL)
1415 			{
1416 				aLink = pURL->GetURL();
1417 				aTarget = pURL->GetTargetFrame();
1418 			}
1419 		}
1420 	}
1421 
1422 	bool bTemp;
1423 	String aTemp;
1424 
1425 	if ( pSet->GetItemState( EE_CHAR_WEIGHT ) == SFX_ITEM_ON )
1426 	{
1427 		bTemp = ((const SvxWeightItem&)pSet->Get( EE_CHAR_WEIGHT )).GetWeight() == WEIGHT_BOLD;
1428 		aTemp = pState->SetWeight( bTemp );
1429 		if( bTemp )
1430 			aStr.Insert( aTemp, 0 );
1431 		else
1432 			aStr += aTemp;
1433 	}
1434 
1435 	if ( pSet->GetItemState( EE_CHAR_UNDERLINE ) == SFX_ITEM_ON )
1436 	{
1437 		bTemp = ((const SvxUnderlineItem&)pSet->Get( EE_CHAR_UNDERLINE )).GetLineStyle() != UNDERLINE_NONE;
1438 		aTemp = pState->SetUnderline( bTemp );
1439 		if( bTemp )
1440 			aStr.Insert( aTemp, 0 );
1441 		else
1442 			aStr += aTemp;
1443 	}
1444 
1445 	if ( pSet->GetItemState( EE_CHAR_STRIKEOUT ) == SFX_ITEM_ON )
1446 	{
1447 		bTemp = ((const SvxCrossedOutItem&)pSet->Get( EE_CHAR_STRIKEOUT )).GetStrikeout() != STRIKEOUT_NONE;
1448 		aTemp = pState->SetStrikeout( bTemp );
1449 		if( bTemp )
1450 			aStr.Insert( aTemp, 0 );
1451 		else
1452 			aStr += aTemp;
1453 	}
1454 
1455 	if ( pSet->GetItemState( EE_CHAR_ITALIC ) == SFX_ITEM_ON )
1456 	{
1457 		bTemp = ((const SvxPostureItem&)pSet->Get( EE_CHAR_ITALIC )).GetPosture() != ITALIC_NONE;
1458 		aTemp = pState->SetItalic( bTemp );
1459 		if( bTemp )
1460 			aStr.Insert( aTemp, 0 );
1461 		else
1462 			aStr += aTemp;
1463 	}
1464 
1465 	if(mbDocColors)
1466 	{
1467 		if ( pSet->GetItemState( EE_CHAR_COLOR ) == SFX_ITEM_ON )
1468 		{
1469 			Color aTextColor = ((const SvxColorItem&) pSet->Get( EE_CHAR_COLOR )).GetValue();
1470 			if( aTextColor == COL_AUTO )
1471 			{
1472 				if( !rBackgroundColor.IsDark() )
1473 					aTextColor = COL_BLACK;
1474 			}
1475 			aStr += pState->SetColor( aTextColor );
1476 		}
1477 	}
1478 
1479 	if( aLink.Len() )
1480 		aStr.Insert( pState->SetLink(aLink, aTarget), 0 );
1481 	else
1482 		aStr += pState->SetLink(aLink, aTarget);
1483 
1484 	return aStr;
1485 }
1486 
1487 // =====================================================================
1488 // HTML-Wrapper fuer Bild-Dateien erzeugen
1489 // =====================================================================
CreateHtmlForPresPages()1490 bool HtmlExport::CreateHtmlForPresPages()
1491 {
1492 	bool bOk = true;
1493 
1494 	List aClickableObjects;
1495 
1496 	for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount && bOk; nSdPage++)
1497 	{
1498 		// Klickbare Objekte finden (auch auf der Masterpage) und
1499 		// in Liste stellen. In umgekehrter Zeichenreihenfolge in
1500 		// die Liste stellen, da in HTML bei Ueberlappungen die
1501 		// _erstgenannte_ Area wirkt.
1502 
1503 		SdPage* pPage = maPages[ nSdPage ];
1504 
1505 		if( mbDocColors )
1506 		{
1507 			SetDocColors( pPage );
1508 		}
1509 
1510 		bool    bMasterDone = false;
1511 
1512 		while (!bMasterDone)
1513 		{
1514 			// sal_True = rueckwaerts
1515 			SdrObjListIter aIter(*pPage, IM_DEEPWITHGROUPS, sal_True);
1516 
1517 			SdrObject* pObject = aIter.Next();
1518 			while (pObject)
1519 			{
1520 				SdAnimationInfo* pInfo     = mpDoc->GetAnimationInfo(pObject);
1521 				SdIMapInfo*      pIMapInfo = mpDoc->GetIMapInfo(pObject);
1522 
1523 				if ((pInfo &&
1524 					 (pInfo->meClickAction == presentation::ClickAction_BOOKMARK  ||
1525 					  pInfo->meClickAction == presentation::ClickAction_DOCUMENT  ||
1526 					  pInfo->meClickAction == presentation::ClickAction_PREVPAGE  ||
1527 					  pInfo->meClickAction == presentation::ClickAction_NEXTPAGE  ||
1528 					  pInfo->meClickAction == presentation::ClickAction_FIRSTPAGE ||
1529 					  pInfo->meClickAction == presentation::ClickAction_LASTPAGE)) ||
1530 					 pIMapInfo)
1531 				{
1532 					aClickableObjects.Insert(pObject, LIST_APPEND);
1533 				}
1534 
1535 				pObject = aIter.Next();
1536 			}
1537 			// jetzt zur Masterpage oder beenden
1538 			if (!pPage->IsMasterPage())
1539 				pPage = (SdPage*)(&(pPage->TRG_GetMasterPage()));
1540 			else
1541 				bMasterDone = true;
1542 		}
1543 		sal_uLong nClickableObjectCount = aClickableObjects.Count();
1544 
1545 // HTML Head
1546 		String aStr(maHTMLHeader);
1547 		aStr += WriteMetaCharset();
1548 		aStr.AppendAscii( "  <title>" );
1549 		aStr += StringToHTMLString(*mpPageNames[nSdPage]);
1550 		aStr.AppendAscii( "</title>\r\n" );
1551 
1552 // insert timing information
1553 		pPage = maPages[ nSdPage ];
1554 		if( meMode == PUBLISH_KIOSK )
1555 		{
1556 			sal_uLong nSecs = 0;
1557 			bool bEndless = false;
1558 			if( !mbAutoSlide )
1559 			{
1560 				if( pPage->GetPresChange() != PRESCHANGE_MANUAL )
1561 				{
1562 					nSecs = pPage->GetTime();
1563 					bEndless = mpDoc->getPresentationSettings().mbEndless;
1564 				}
1565 			}
1566 			else
1567 			{
1568 				nSecs = mnSlideDuration;
1569 				bEndless = mbEndless;
1570 			}
1571 
1572 			if( nSecs != 0 )
1573 			{
1574 				if( nSdPage < (mnSdPageCount-1) || bEndless )
1575 				{
1576 					aStr.AppendAscii( "<meta http-equiv=\"refresh\" content=\"" );
1577 					aStr += String::CreateFromInt32(nSecs);
1578 					aStr.AppendAscii( "; URL=" );
1579 
1580 					int nPage = nSdPage + 1;
1581 					if( nPage == mnSdPageCount )
1582 						nPage = 0;
1583 
1584 					aStr += StringToURL(*mpHTMLFiles[nPage]);
1585 
1586 					aStr.AppendAscii( "\">\r\n" );
1587 				}
1588 			}
1589 		}
1590 
1591 		aStr.AppendAscii( "</head>\r\n" );
1592 
1593 // HTML Body
1594 		aStr += CreateBodyTag();
1595 
1596 		if( mbSlideSound && pPage->IsSoundOn() )
1597 			aStr += InsertSound( pPage->GetSoundFile() );
1598 
1599 // Navigationsleiste
1600 		if(!mbFrames )
1601 			aStr += CreateNavBar( nSdPage, false );
1602 // Image
1603 		aStr.AppendAscii( "<center>" );
1604 		aStr.AppendAscii( "<img src=\"" );
1605 		aStr += StringToURL( *mpImageFiles[nSdPage] );
1606 		aStr.AppendAscii( "\" alt=\"\"" );
1607 
1608 		if (nClickableObjectCount > 0)
1609 			aStr.AppendAscii( " USEMAP=\"#map0\"" );
1610 
1611 		aStr.AppendAscii( "></center>\r\n" );
1612 
1613 // Notizen
1614 		if(mbNotes && !mbFrames)
1615 		{
1616 			SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
1617 			SdPage* pNotesPage = maNotesPages[ nSdPage ];
1618 			String aNotesStr( CreateTextForNotesPage( pOutliner, pNotesPage, true, maBackColor) );
1619 			pOutliner->Clear();
1620 
1621 			if( aNotesStr.Len() )
1622 			{
1623 				aStr.AppendAscii( "<h3>" );
1624 				aStr += RESTOHTML(STR_HTMLEXP_NOTES);
1625 				aStr.AppendAscii( ":</h3><br>\r\n\r\n<p>" );
1626 
1627 				aStr += aNotesStr;
1628 				aStr.AppendAscii( "\r\n</p>\r\n" );
1629 			}
1630 		}
1631 
1632 // ggfs. Imagemap erzeugen
1633 		if (nClickableObjectCount > 0)
1634 		{
1635 			aStr.AppendAscii( "<map name=\"map0\">\r\n" );
1636 
1637 			for (sal_uLong nObject = 0; nObject < nClickableObjectCount; nObject++)
1638 			{
1639 				SdrObject* pObject = (SdrObject*)aClickableObjects.GetObject(nObject);
1640 				SdAnimationInfo* pInfo	   = mpDoc->GetAnimationInfo(pObject);
1641 				SdIMapInfo* 	 pIMapInfo = mpDoc->GetIMapInfo(pObject);
1642 
1643 				Rectangle aRect(pObject->GetCurrentBoundRect());
1644 				Point	  aLogPos(aRect.TopLeft());
1645 				bool	  bIsSquare = aRect.GetWidth() == aRect.GetHeight();
1646 
1647 				sal_uLong nPageWidth = pPage->GetSize().Width() - pPage->GetLftBorder() -
1648 								   pPage->GetRgtBorder();
1649 
1650 				// das BoundRect bezieht sich auf den physikalischen
1651 				// Seitenursprung, nicht auf den Koordinatenursprung
1652 				aRect.Move(-pPage->GetLftBorder(), -pPage->GetUppBorder());
1653 
1654 				double fLogicToPixel = ((double)mnWidthPixel) / nPageWidth;
1655 				aRect.Left()   = (long)(aRect.Left() * fLogicToPixel);
1656 				aRect.Top()    = (long)(aRect.Top() * fLogicToPixel);
1657 				aRect.Right()  = (long)(aRect.Right() * fLogicToPixel);
1658 				aRect.Bottom() = (long)(aRect.Bottom() * fLogicToPixel);
1659 				long nRadius = aRect.GetWidth() / 2;
1660 
1661 
1662 				/*************************************************************
1663 				|* wenn das Objekt eine eigene Imagemap enthaelt, werden ihre
1664 				|* Areas in diese Imagemap eingefuegt
1665 				\************************************************************/
1666 				if (pIMapInfo)
1667 				{
1668 					const ImageMap& rIMap = pIMapInfo->GetImageMap();
1669 					sal_uInt16 nAreaCount = rIMap.GetIMapObjectCount();
1670 					for (sal_uInt16 nArea = 0; nArea < nAreaCount; nArea++)
1671 					{
1672 						IMapObject* pArea = rIMap.GetIMapObject(nArea);
1673 						sal_uInt16 nType = pArea->GetType();
1674 						String aURL( pArea->GetURL() );
1675 
1676 						// ggfs. Seiten- oder Objektnamen umwandeln in den
1677 						// Namen der entsprechenden HTML-Datei
1678                         sal_Bool        bIsMasterPage;
1679 						sal_uInt16      nPgNum = mpDoc->GetPageByName( aURL, bIsMasterPage );
1680 						SdrObject*  pObj = NULL;
1681 
1682                         if (nPgNum == SDRPAGE_NOTFOUND)
1683 						{
1684 							// Ist das Bookmark ein Objekt?
1685 							pObj = mpDoc->GetObj( aURL );
1686 							if (pObj)
1687 								nPgNum = pObj->GetPage()->GetPageNum();
1688 						}
1689 						if (nPgNum != SDRPAGE_NOTFOUND)
1690 						{
1691 							nPgNum = (nPgNum - 1) / 2;	// SdrPageNum --> SdPageNum
1692 							aURL = CreatePageURL(nPgNum);
1693 						}
1694 
1695 						switch(nType)
1696 						{
1697 							case IMAP_OBJ_RECTANGLE:
1698 							{
1699 								Rectangle aArea(((IMapRectangleObject*)pArea)->
1700 												 GetRectangle(false));
1701 
1702 								// Umrechnung in Pixelkoordinaten
1703 								aArea.Move(aLogPos.X() - pPage->GetLftBorder(),
1704 										   aLogPos.Y() - pPage->GetUppBorder());
1705 								aArea.Left()   = (long)(aArea.Left() * fLogicToPixel);
1706 								aArea.Top()    = (long)(aArea.Top() * fLogicToPixel);
1707 								aArea.Right()  = (long)(aArea.Right() * fLogicToPixel);
1708 								aArea.Bottom() = (long)(aArea.Bottom() * fLogicToPixel);
1709 
1710 								aStr += CreateHTMLRectArea(aArea, aURL);
1711 							}
1712 							break;
1713 
1714 							case IMAP_OBJ_CIRCLE:
1715 							{
1716 								Point aCenter(((IMapCircleObject*)pArea)->
1717 												 GetCenter(false));
1718 								aCenter += Point(aLogPos.X() - pPage->GetLftBorder(),
1719 												 aLogPos.Y() - pPage->GetUppBorder());
1720 								aCenter.X() = (long)(aCenter.X() * fLogicToPixel);
1721 								aCenter.Y() = (long)(aCenter.Y() * fLogicToPixel);
1722 
1723 								sal_uLong nCircleRadius = (((IMapCircleObject*)pArea)->
1724 												 GetRadius(false));
1725 								nCircleRadius = (sal_uLong)(nCircleRadius * fLogicToPixel);
1726 								aStr += CreateHTMLCircleArea(nCircleRadius,
1727 															aCenter.X(), aCenter.Y(),
1728 															aURL);
1729 							}
1730 							break;
1731 
1732 							case IMAP_OBJ_POLYGON:
1733 							{
1734 								Polygon aArea(((IMapPolygonObject*)pArea)->GetPolygon(false));
1735 								aStr += CreateHTMLPolygonArea(::basegfx::B2DPolyPolygon(aArea.getB2DPolygon()), Size(aLogPos.X() - pPage->GetLftBorder(), aLogPos.Y() - pPage->GetUppBorder()), fLogicToPixel, aURL);
1736 							}
1737 							break;
1738 
1739 							default:
1740 							{
1741 								DBG_WARNING("unbekannter IMAP_OBJ_Typ");
1742 							}
1743 							break;
1744 						}
1745 					}
1746 				}
1747 
1748 
1749 
1750 				/*************************************************************
1751 				|* wenn es eine presentation::ClickAction gibt, Bookmark bestimmen und eine
1752 				|* Area fuer das ganze Objekt erzeugen
1753 				\************************************************************/
1754 				if( pInfo )
1755 				{
1756 					String		aHRef;
1757 					presentation::ClickAction eClickAction = pInfo->meClickAction;
1758 
1759 					switch( eClickAction )
1760 					{
1761 						case presentation::ClickAction_BOOKMARK:
1762 						{
1763 							sal_Bool		bIsMasterPage;
1764                             sal_uInt16      nPgNum = mpDoc->GetPageByName( pInfo->GetBookmark(), bIsMasterPage );
1765 							SdrObject*  pObj = NULL;
1766 
1767 							if( nPgNum == SDRPAGE_NOTFOUND )
1768 							{
1769 								// Ist das Bookmark ein Objekt?
1770 								pObj = mpDoc->GetObj(pInfo->GetBookmark());
1771 								if (pObj)
1772 									nPgNum = pObj->GetPage()->GetPageNum();
1773 							}
1774 
1775 							if( SDRPAGE_NOTFOUND != nPgNum )
1776 								aHRef = CreatePageURL(( nPgNum - 1 ) / 2 );
1777 						}
1778 						break;
1779 
1780 						case presentation::ClickAction_DOCUMENT:
1781 							aHRef = pInfo->GetBookmark();
1782 						break;
1783 
1784 						case presentation::ClickAction_PREVPAGE:
1785 						{
1786 							sal_uLong nPage = nSdPage;
1787 							if (nSdPage == 0)
1788 								nPage = 0;
1789 							else
1790 								nPage = nSdPage - 1;
1791 
1792 							aHRef = CreatePageURL( (sal_uInt16) nPage);
1793 						}
1794 						break;
1795 
1796 						case presentation::ClickAction_NEXTPAGE:
1797 						{
1798 							sal_uLong nPage = nSdPage;
1799 							if (nSdPage == mnSdPageCount - 1)
1800 								nPage = mnSdPageCount - 1;
1801 							else
1802 								nPage = nSdPage + 1;
1803 
1804 							aHRef = CreatePageURL( (sal_uInt16) nPage);
1805 						}
1806 						break;
1807 
1808 						case presentation::ClickAction_FIRSTPAGE:
1809 							aHRef = CreatePageURL(0);
1810 						break;
1811 
1812 						case presentation::ClickAction_LASTPAGE:
1813 							aHRef = CreatePageURL(mnSdPageCount - 1);
1814 						break;
1815 
1816 						default:
1817 							break;
1818 					}
1819 
1820 					// jetzt die Areas
1821 					if( aHRef.Len() )
1822 					{
1823 						// ein Kreis?
1824 						if (pObject->GetObjInventor() == SdrInventor &&
1825 							pObject->GetObjIdentifier() == OBJ_CIRC  &&
1826 							bIsSquare )
1827 						{
1828 							aStr += CreateHTMLCircleArea(aRect.GetWidth() / 2,
1829 													aRect.Left() + nRadius,
1830 													aRect.Top() + nRadius,
1831 													aHRef);
1832 						}
1833 						// ein Polygon?
1834 						else if (pObject->GetObjInventor() == SdrInventor &&
1835 								 (pObject->GetObjIdentifier() == OBJ_PATHLINE ||
1836 								  pObject->GetObjIdentifier() == OBJ_PLIN ||
1837 								  pObject->GetObjIdentifier() == OBJ_POLY))
1838 						{
1839 							aStr += CreateHTMLPolygonArea(((SdrPathObj*)pObject)->GetPathPoly(), Size(-pPage->GetLftBorder(), -pPage->GetUppBorder()), fLogicToPixel, aHRef);
1840 						}
1841 						// was anderes: das BoundRect nehmen
1842 						else
1843 						{
1844 							aStr += CreateHTMLRectArea(aRect, aHRef);
1845 						}
1846 
1847 					}
1848 				}
1849 			}
1850 
1851 			aStr.AppendAscii( "</map>\r\n" );
1852 		}
1853 		aClickableObjects.Clear();
1854 
1855 		aStr.AppendAscii( "</body>\r\n</html>" );
1856 
1857 		bOk = WriteHtml( *mpHTMLFiles[nSdPage], false, aStr );
1858 
1859 		if (mpProgress)
1860 			mpProgress->SetState(++mnPagesWritten);
1861 	}
1862 
1863 	return bOk;
1864 }
1865 
1866 // =====================================================================
1867 // Uebersichtsseite erzeugen
1868 // =====================================================================
CreateContentPage()1869 bool HtmlExport::CreateContentPage()
1870 {
1871 	// Parameter
1872 	String aEmpty;
1873 
1874 	if( mbDocColors )
1875 		SetDocColors();
1876 
1877 	// Html Kopf
1878 	String aStr(maHTMLHeader);
1879 	aStr += WriteMetaCharset();
1880 	aStr.AppendAscii( "  <title>" );
1881 	aStr += StringToHTMLString(*mpPageNames[0]);
1882 	aStr.AppendAscii( "</title>\r\n</head>\r\n" );
1883 	aStr += CreateBodyTag();
1884 
1885 	// Seitenkopf
1886 	aStr.AppendAscii( "<center>\r\n" );
1887 
1888 	if(mbHeader)
1889 	{
1890 		aStr.AppendAscii( "<h1>" );
1891 		aStr += getDocumentTitle();
1892 		aStr.AppendAscii( "</h1><br>\r\n" );
1893 	}
1894 
1895 	aStr.AppendAscii( "<h2>" );
1896 
1897     // #92564# Solaris compiler bug workaround
1898     if( mbFrames )
1899         aStr += CreateLink( maFramePage,
1900                             RESTOHTML(STR_HTMLEXP_CLICKSTART) );
1901     else
1902         aStr += CreateLink( StringToHTMLString(*mpHTMLFiles[0]),
1903                             RESTOHTML(STR_HTMLEXP_CLICKSTART) );
1904 
1905 	aStr.AppendAscii( "</h2>\r\n</center>\r\n" );
1906 
1907 	aStr.AppendAscii( "<center><table width=\"90%\"><tr>\r\n" );
1908 
1909 	// Inhaltsverzeichnis
1910 	aStr.AppendAscii( "<td valign=\"top\" align=\"left\" width=\"50%\">\r\n" );
1911 	aStr.AppendAscii( "<h3>" );
1912 	aStr += RESTOHTML(STR_HTMLEXP_CONTENTS);
1913 	aStr.AppendAscii( "</h3>" );
1914 
1915 	for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
1916 	{
1917 		String aPageName = *mpPageNames[nSdPage];
1918 		aStr.AppendAscii( "<div align=\"left\">" );
1919 		if(mbFrames)
1920 			aStr += StringToHTMLString(aPageName);
1921 		else
1922 			aStr += CreateLink(*mpHTMLFiles[nSdPage], aPageName);
1923 		aStr.AppendAscii( "</div>\r\n" );
1924 	}
1925 	aStr.AppendAscii( "</td>\r\n" );
1926 
1927 	// Dokument Infos
1928 	aStr.AppendAscii( "<td valign=\"top\" width=\"50%\">\r\n" );
1929 
1930 	if(maAuthor.Len())
1931 	{
1932 		aStr.AppendAscii( "<p><strong>" );
1933 		aStr += RESTOHTML(STR_HTMLEXP_AUTHOR);
1934 		aStr.AppendAscii( ":</strong> " );
1935 		aStr += StringToHTMLString(maAuthor);
1936 		aStr.AppendAscii( "</p>\r\n" );
1937 	}
1938 
1939 	if(maEMail.Len())
1940 	{
1941 		aStr.AppendAscii( "<p><strong>" );
1942 		aStr += RESTOHTML(STR_HTMLEXP_EMAIL);
1943 		aStr.AppendAscii( ":</strong> <a href=\"mailto:" );
1944 		aStr += StringToURL(maEMail);
1945 		aStr.AppendAscii( "\">" );
1946 		aStr += StringToHTMLString(maEMail);
1947 		aStr.AppendAscii( "</a></p>\r\n" );
1948 	}
1949 
1950 	if(maHomePage.Len())
1951 	{
1952 		aStr.AppendAscii( "<p><strong>" );
1953 		aStr += RESTOHTML(STR_HTMLEXP_HOMEPAGE);
1954 		aStr.AppendAscii( ":</strong> <a href=\"" );
1955 		aStr += StringToURL(maHomePage);
1956 		aStr.AppendAscii( "\">" );
1957 		aStr += StringToHTMLString(maHomePage);
1958 		aStr.AppendAscii( "</a> </p>\r\n" );
1959 	}
1960 
1961 	if(maInfo.Len())
1962 	{
1963 		aStr.AppendAscii( "<p><strong>" );
1964 		aStr += RESTOHTML(STR_HTMLEXP_INFO);
1965 		aStr.AppendAscii( ":</strong><br>\r\n" );
1966 		aStr += StringToHTMLString(maInfo);
1967 		aStr.AppendAscii( "</p>\r\n" );
1968 	}
1969 
1970 	if(mbDownload)
1971 	{
1972 		aStr.AppendAscii( "<p><a href=\"" );
1973 		aStr += StringToURL(maDocFileName);
1974 		aStr.AppendAscii( "\">" );
1975 		aStr += RESTOHTML(STR_HTMLEXP_DOWNLOAD);
1976 		aStr.AppendAscii( "</a></p>\r\n" );
1977 	}
1978 
1979 	aStr.AppendAscii( "</td></tr></table></center>\r\n" );
1980 
1981 	aStr.AppendAscii( "</body>\r\n</html>" );
1982 
1983 	bool bOk = WriteHtml( maIndex, false, aStr );
1984 
1985 	if (mpProgress)
1986 		mpProgress->SetState(++mnPagesWritten);
1987 
1988 	return bOk;
1989 }
1990 
1991 // =====================================================================
1992 // Notiz Seiten erzeugen (fuer Frames)
1993 // =====================================================================
CreateNotesPages()1994 bool HtmlExport::CreateNotesPages()
1995 {
1996 	bool bOk = true;
1997 
1998 	SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
1999 	for( sal_uInt16 nSdPage = 0; bOk && nSdPage < mnSdPageCount; nSdPage++ )
2000 	{
2001 		SdPage* pPage = maNotesPages[nSdPage];
2002 		if( mbDocColors )
2003 			SetDocColors( pPage );
2004 
2005 		// Html Kopf
2006 		String aStr(maHTMLHeader);
2007 		aStr += WriteMetaCharset();
2008 		aStr.AppendAscii( "  <title>" );
2009 		aStr += StringToHTMLString(*mpPageNames[0]);
2010 		aStr.AppendAscii( "</title>\r\n</head>\r\n" );
2011 		aStr += CreateBodyTag();
2012 
2013 		if(pPage)
2014 			aStr += CreateTextForNotesPage( pOutliner, pPage, true, maBackColor );
2015 
2016 		aStr.AppendAscii( "</body>\r\n</html>" );
2017 
2018 		String aFileName( RTL_CONSTASCII_USTRINGPARAM("note") );
2019 		aFileName += String::CreateFromInt32(nSdPage);
2020 		bOk = WriteHtml( aFileName, true, aStr );
2021 
2022 		if (mpProgress)
2023 			mpProgress->SetState(++mnPagesWritten);
2024 	}
2025 
2026 	pOutliner->Clear();
2027 
2028 	return bOk;
2029 }
2030 
2031 // =====================================================================
2032 // Outline Seiten erzeugen (fuer Frames)
2033 // =====================================================================
CreateOutlinePages()2034 bool HtmlExport::CreateOutlinePages()
2035 {
2036 	bool bOk = true;
2037 
2038 	if( mbDocColors )
2039 	{
2040 		SetDocColors();
2041 	}
2042 
2043 	// Seite 0 wird der zugeklappte Outline, Seite 1 der aufgeklappte
2044 	for( int nPage = 0; nPage < (mbImpress?2:1) && bOk; nPage++ )
2045 	{
2046 		// Html Kopf
2047 		String aStr(maHTMLHeader);
2048 		aStr += WriteMetaCharset();
2049 		aStr.AppendAscii( "  <title>" );
2050 		aStr += StringToHTMLString(*mpPageNames[0]);
2051 		aStr.AppendAscii( "</title>\r\n</head>\r\n" );
2052 		aStr += CreateBodyTag();
2053 
2054 		SdrOutliner* pOutliner = mpDoc->GetInternalOutliner();
2055 		for(sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
2056 		{
2057 			SdPage* pPage = maPages[ nSdPage ];
2058 
2059 			aStr.AppendAscii( "<div align=\"left\">" );
2060 			String aLink( RTL_CONSTASCII_USTRINGPARAM( "JavaScript:parent.NavigateAbs(" ) );
2061 			aLink += String::CreateFromInt32(nSdPage);
2062 			aLink.Append( sal_Unicode(')') );
2063 
2064 			String aTitle = CreateTextForTitle(pOutliner,pPage, maBackColor);
2065 			if(aTitle.Len() == 0)
2066 				aTitle = *mpPageNames[nSdPage];
2067 
2068             aStr.AppendAscii("<p style=\"");
2069             aStr.Append( getParagraphStyle( pOutliner, 0 ) );
2070             aStr.AppendAscii("\">");
2071 			aStr += CreateLink(aLink, aTitle);
2072             aStr.AppendAscii("</p>");
2073 
2074 			if(nPage==1)
2075 			{
2076 				aStr += CreateTextForPage( pOutliner, pPage, false, maBackColor );
2077 			}
2078 			aStr.AppendAscii( "</div>\r\n" );
2079 		}
2080 		pOutliner->Clear();
2081 
2082 		aStr.AppendAscii( "</body>\r\n</html>" );
2083 
2084 		String aFileName( RTL_CONSTASCII_USTRINGPARAM("outline") );
2085 		aFileName += String::CreateFromInt32(nPage);
2086 		bOk = WriteHtml( aFileName, true, aStr );
2087 
2088 		if (mpProgress)
2089 			mpProgress->SetState(++mnPagesWritten);
2090 	}
2091 
2092 	return bOk;
2093 }
2094 
2095 // =====================================================================
2096 // Dateinamen festlegen
2097 // =====================================================================
CreateFileNames()2098 void HtmlExport::CreateFileNames()
2099 {
2100 	// Listen mit neuen Dateinamen anlegen
2101 	mpHTMLFiles = new String*[mnSdPageCount];
2102 	mpImageFiles = new String*[mnSdPageCount];
2103 	mpPageNames = new String*[mnSdPageCount];
2104 	mpTextFiles = new String*[mnSdPageCount];
2105 
2106 	mbHeader = false;	// Ueberschrift auf Uebersichtsseite?
2107 
2108 	for (sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
2109 	{
2110 		String* pName;
2111 		if(nSdPage == 0 && !mbContentsPage && !mbFrames )
2112 			pName = new String(maIndex);
2113 		else
2114 		{
2115 			pName = new String( RTL_CONSTASCII_USTRINGPARAM("img") );
2116 			*pName += String::CreateFromInt32(nSdPage);
2117 			*pName += maHTMLExtension;
2118 		}
2119 
2120 		mpHTMLFiles[nSdPage] = pName;
2121 
2122 		pName = new String( RTL_CONSTASCII_USTRINGPARAM("img") );
2123 		*pName += String::CreateFromInt32(nSdPage);
2124 		if( meFormat==FORMAT_GIF )
2125             pName->AppendAscii( ".gif" );
2126 		else if( meFormat==FORMAT_JPG )
2127 			pName->AppendAscii( ".jpg" );
2128 		else
2129             pName->AppendAscii( ".png" );
2130 
2131 		mpImageFiles[nSdPage] = pName;
2132 
2133 		pName = new String( RTL_CONSTASCII_USTRINGPARAM("text"));
2134 		*pName += String::CreateFromInt32(nSdPage);
2135 		*pName += maHTMLExtension;
2136 		mpTextFiles[nSdPage] = pName;
2137 
2138 		SdPage* pSdPage = maPages[ nSdPage ];
2139 
2140 		// get slide title from page name
2141 		String* pPageTitle = new String();
2142 		*pPageTitle = pSdPage->GetName();
2143 		mpPageNames[nSdPage] = pPageTitle;
2144 	}
2145 
2146 	if(!mbContentsPage && mbFrames)
2147 		maFramePage = maIndex;
2148 	else
2149 	{
2150 		maFramePage.AssignAscii( "siframes" );
2151 		maFramePage += maHTMLExtension;
2152 	}
2153 }
2154 
getDocumentTitle()2155 String HtmlExport::getDocumentTitle()
2156 {
2157 	// check for a title object in this page, if its the first
2158 	// title it becomes this documents title for the content
2159 	// page
2160 	if( !mbHeader )
2161 	{
2162 		if(mbImpress)
2163 		{
2164 			// falls es ein nicht-leeres Titelobjekt gibt, dessen ersten Absatz
2165 			// als Seitentitel benutzen
2166 			SdPage* pSdPage = mpDoc->GetSdPage(0, PK_STANDARD);
2167 			SdrObject* pTitleObj = pSdPage->GetPresObj(PRESOBJ_TITLE);
2168 			if (pTitleObj && !pTitleObj->IsEmptyPresObj())
2169 			{
2170 				OutlinerParaObject* pParaObject = pTitleObj->GetOutlinerParaObject();
2171 				if (pParaObject)
2172 				{
2173 					const EditTextObject& rEditTextObject =
2174 						pParaObject->GetTextObject();
2175 					if (&rEditTextObject)
2176 					{
2177 						String aTest(rEditTextObject.GetText(0));
2178 						if (aTest.Len() > 0)
2179 							mDocTitle = aTest;
2180 					}
2181 				}
2182 			}
2183 
2184 			for( sal_uInt16 i = 0; i < mDocTitle.Len(); i++ )
2185 				if( mDocTitle.GetChar(i) == (sal_Unicode)0xff)
2186 					mDocTitle.SetChar(i, sal_Unicode(' ') );
2187 		}
2188 
2189 		if( !mDocTitle.Len() )
2190 		{
2191 			mDocTitle = maDocFileName;
2192 			int nDot = mDocTitle.Search( '.' );
2193 			if( nDot > 0 )
2194 				mDocTitle.Erase( (sal_uInt16)nDot );
2195 		}
2196 		mbHeader = true;
2197 	}
2198 
2199 	return mDocTitle;
2200 }
2201 
2202 /*
2203 var nCurrentPage = 0;
2204 var nPageCount = JSCRIPT2;
2205 
2206 function NavigateAbs( nPage )
2207 {
2208 	frames[\"show\"].location.href = \"img\" + nPage + \".htm\";
2209 	frames[\"notes\"].location.href = \"note\" + nPage + \".htm\";
2210 	nCurrentPage = nPage;
2211 	if(nCurrentPage==0)
2212 	{
2213 		frames[\"navbar1\"].location.href = \"navbar0.htm\";
2214 	}
2215 	else if(nCurrentPage==nPageCount-1)
2216 	{
2217 		frames[\"navbar1\"].location.href = \"navbar2.htm\";
2218 	}
2219 	else
2220 		frames[\"navbar1\"].location.href = \"navbar1.htm\";
2221 	}
2222 }
2223 
2224 function NavigateRel( nDelta )
2225 {
2226 	var nPage = parseInt(nCurrentPage) + parseInt(nDelta);
2227 	if( (nPage >= 0) && (nPage < nPageCount) )
2228 	{
2229 		NavigateAbs( nPage );
2230 	}
2231 }
2232 
2233 function ExpandOutline()
2234 {
2235 	frames[\"navbar2\"].location.href = \"navbar4.htm\";
2236 	frames[\"outline\"].location.href = \"outline1.htm\";
2237 }
2238 
2239 function CollapseOutline()
2240 {
2241 	frames[\"navbar2\"].location.href = \"navbar3.htm\";
2242 	frames[\"outline\"].location.href = \"outline0.htm\";
2243 }
2244 */
2245 
2246 static const char* JS_NavigateAbs =
2247 	"function NavigateAbs( nPage )\r\n"
2248 	"{\r\n"
2249 	"  frames[\"show\"].location.href = \"img\" + nPage + \".$EXT\";\r\n"
2250 	"  //frames[\"notes\"].location.href = \"note\" + nPage + \".$EXT\";\r\n"
2251 	"  nCurrentPage = nPage;\r\n"
2252 	"  if(nCurrentPage==0)\r\n"
2253 	"  {\r\n"
2254 	"    frames[\"navbar1\"].location.href = \"navbar0.$EXT\";\r\n"
2255 	"  }\r\n"
2256 	"  else if(nCurrentPage==nPageCount-1)\r\n"
2257 	"  {\r\n"
2258 	"    frames[\"navbar1\"].location.href = \"navbar2.$EXT\";\r\n"
2259 	"  }\r\n"
2260 	"  else\r\n"
2261 	"  {\r\n"
2262 	"    frames[\"navbar1\"].location.href = \"navbar1.$EXT\";\r\n"
2263 	"  }\r\n"
2264 	"}\r\n\r\n";
2265 
2266 static const char* JS_NavigateRel =
2267 	"function NavigateRel( nDelta )\r\n"
2268 	"{\r\n"
2269 	"  var nPage = parseInt(nCurrentPage) + parseInt(nDelta);\r\n"
2270 	"  if( (nPage >= 0) && (nPage < nPageCount) )\r\n"
2271 	"  {\r\n"
2272 	"    NavigateAbs( nPage );\r\n"
2273 	"  }\r\n"
2274 	"}\r\n\r\n";
2275 
2276 static const char* JS_ExpandOutline =
2277 	"function ExpandOutline()\r\n"
2278 	"{\r\n"
2279 	"  frames[\"navbar2\"].location.href = \"navbar4.$EXT\";\r\n"
2280 	"  frames[\"outline\"].location.href = \"outline1.$EXT\";\r\n"
2281 	"}\r\n\r\n";
2282 
2283 static const char * JS_CollapseOutline =
2284 	"function CollapseOutline()\r\n"
2285 	"{\r\n"
2286 	"  frames[\"navbar2\"].location.href = \"navbar3.$EXT\";\r\n"
2287 	"  frames[\"outline\"].location.href = \"outline0.$EXT\";\r\n"
2288 	"}\r\n\r\n";
2289 
2290 // ====================================================================
2291 // Seite mit den Frames erzeugen
2292 // ====================================================================
CreateFrames()2293 bool HtmlExport::CreateFrames()
2294 {
2295 	String aTmp;
2296 	String aStr( RTL_CONSTASCII_USTRINGPARAM(
2297 					"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"\r\n"
2298 					"    \"http://www.w3.org/TR/html4/frameset.dtd\">\r\n"
2299 			"<html>\r\n<head>\r\n" ) );
2300 
2301 	aStr += WriteMetaCharset();
2302 	aStr.AppendAscii( "  <title>" );
2303 	aStr += StringToHTMLString(*mpPageNames[0]);
2304 	aStr.AppendAscii( "</title>\r\n" );
2305 
2306 	aStr.AppendAscii( "<script type=\"text/javascript\">\r\n<!--\r\n" );
2307 
2308 	aStr.AppendAscii( "var nCurrentPage = 0;\r\nvar nPageCount = " );
2309 	aStr += String::CreateFromInt32(mnSdPageCount);
2310 	aStr.AppendAscii( ";\r\n\r\n" );
2311 
2312 	String aFunction;
2313 	aFunction.AssignAscii(JS_NavigateAbs);
2314 
2315 	if(mbNotes)
2316 	{
2317 		String aEmpty;
2318 		String aSlash( RTL_CONSTASCII_USTRINGPARAM( "//" ) );
2319 		aFunction.SearchAndReplaceAll( aSlash, aEmpty);
2320 	}
2321 
2322 	// substitute HTML file extension
2323 	String aPlaceHolder(RTL_CONSTASCII_USTRINGPARAM(".$EXT"));
2324 	aFunction.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
2325 	aStr += aFunction;
2326 
2327 	aTmp.AssignAscii( JS_NavigateRel );
2328 	aTmp.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
2329 	aStr += aTmp;
2330 
2331 	if(mbImpress)
2332 	{
2333 		aTmp.AssignAscii( JS_ExpandOutline );
2334 		aTmp.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
2335 		aStr += aTmp;
2336 
2337 		aTmp.AssignAscii( JS_CollapseOutline );
2338 		aTmp.SearchAndReplaceAll(aPlaceHolder, maHTMLExtension);
2339 		aStr += aTmp;
2340 	}
2341 	aStr.AppendAscii( "// -->\r\n</script>\r\n" );
2342 
2343 	aStr.AppendAscii( "</head>\r\n" );
2344 
2345 	aStr.AppendAscii( "<frameset cols=\"*," );
2346 	aStr += String::CreateFromInt32((mnWidthPixel + 16));
2347 	aStr.AppendAscii( "\">\r\n" );
2348 	if(mbImpress)
2349 	{
2350 		aStr.AppendAscii( "  <frameset rows=\"42,*\">\r\n" );
2351 		aStr.AppendAscii( "    <frame src=\"navbar3" );
2352 		aStr += StringToURL(maHTMLExtension);
2353 		aStr.AppendAscii( "\" name=\"navbar2\" marginwidth=\"4\" marginheight=\"4\" scrolling=\"no\">\r\n" );
2354 	}
2355 	aStr.AppendAscii( "    <frame src=\"outline0" );
2356 	aStr += StringToURL(maHTMLExtension);
2357 	aStr.AppendAscii( "\" name=\"outline\">\r\n" );
2358 	if(mbImpress)
2359 		aStr.AppendAscii( "  </frameset>\r\n" );
2360 
2361 	if(mbNotes)
2362 	{
2363 		aStr.AppendAscii( "  <frameset rows=\"42," );
2364 		aStr += String::CreateFromInt32((int)((double)mnWidthPixel * 0.75) + 16);
2365 		aStr.AppendAscii( ",*\">\r\n" );
2366 	}
2367 	else
2368 		aStr.AppendAscii( "  <frameset rows=\"42,*\">\r\n" );
2369 
2370 	aStr.AppendAscii( "    <frame src=\"navbar0" );
2371 	aStr += StringToURL(maHTMLExtension);
2372 	aStr.AppendAscii( "\" name=\"navbar1\" marginwidth=\"4\" marginheight=\"4\" scrolling=\"no\">\r\n" );
2373 
2374 	aStr.AppendAscii( "    <frame src=\"" );
2375 	aStr += StringToURL(*mpHTMLFiles[0]);
2376 	aStr.AppendAscii( "\" name=\"show\" marginwidth=\"4\" marginheight=\"4\">\r\n" );
2377 
2378 	if(mbNotes)
2379 	{
2380 		aStr.AppendAscii( "    <frame src=\"note0" );
2381 		aStr += StringToURL(maHTMLExtension);
2382 		aStr.AppendAscii( "\" name=\"notes\">\r\n" );
2383 	}
2384 	aStr.AppendAscii( "  </frameset>\r\n" );
2385 
2386 	aStr.AppendAscii( "<noframes>\r\n" );
2387 	aStr += CreateBodyTag();
2388 	aStr += RESTOHTML(STR_HTMLEXP_NOFRAMES);
2389 	aStr.AppendAscii( "\r\n</noframes>\r\n</frameset>\r\n</html>" );
2390 
2391 	bool bOk = WriteHtml( maFramePage, false, aStr );
2392 
2393 	if (mpProgress)
2394 		mpProgress->SetState(++mnPagesWritten);
2395 
2396 	return bOk;
2397 }
2398 
2399 // ====================================================================
2400 // Buttonleiste fuer Standard ausgeben
2401 // Es werden 4 html files erstellt
2402 // navbar0.htm Navigationsleiste Grafik fuer erste Seite
2403 // navbar1.htm Navigationsleiste Grafik fuer zweite bis vorletzte Seite
2404 // navbar2.htm Navigationsleiste Grafik fuer letzte Seite
2405 // navbar3.htm Navigationsleiste Outline zugeklappt
2406 // navbar4.htm Navigationsleiste Outline aufgeklappt
2407 // ====================================================================
CreateNavBarFrames()2408 bool HtmlExport::CreateNavBarFrames()
2409 {
2410 	bool bOk = true;
2411 	String aButton;
2412 
2413 	if( mbDocColors )
2414 	{
2415 		SetDocColors();
2416 		maBackColor = maFirstPageColor;
2417 	}
2418 
2419 	for( int nFile = 0; nFile < 3 && bOk; nFile++ )
2420 	{
2421 		String aStr(maHTMLHeader);
2422 		aStr += WriteMetaCharset();
2423 		aStr.AppendAscii( "  <title>" );
2424 		aStr += StringToHTMLString(*mpPageNames[0]);
2425 		aStr.AppendAscii( "</title>\r\n</head>\r\n" );
2426 		aStr += CreateBodyTag();
2427 		aStr.AppendAscii( "<center>\r\n" );
2428 
2429 	// erste Seite
2430 		aButton = String(SdResId(STR_HTMLEXP_FIRSTPAGE));
2431 		if(mnButtonThema != -1)
2432 			aButton = CreateImage(GetButtonName((nFile == 0 || mnSdPageCount == 1?
2433 								  BTN_FIRST_0:BTN_FIRST_1)), aButton);
2434 
2435 		if(nFile != 0 && mnSdPageCount > 1)
2436 			aButton = CreateLink( String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateAbs(0)")), aButton);
2437 
2438 		aStr += aButton;
2439 		aStr.AppendAscii( "\r\n" );
2440 
2441 	// zur vorherigen Seite
2442 		aButton = String(SdResId(STR_PUBLISH_BACK));
2443 		if(mnButtonThema != -1)
2444 			aButton = CreateImage(GetButtonName((nFile == 0 || mnSdPageCount == 1?
2445 									BTN_PREV_0:BTN_PREV_1)), aButton);
2446 
2447 		if(nFile != 0 && mnSdPageCount > 1)
2448 			aButton = CreateLink( String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateRel(-1)")), aButton);
2449 
2450 		aStr += aButton;
2451 		aStr.AppendAscii( "\r\n" );
2452 
2453 	// zur naechsten Seite
2454 		aButton = String(SdResId(STR_PUBLISH_NEXT));
2455 		if(mnButtonThema != -1)
2456 			aButton = CreateImage(GetButtonName((nFile ==2 || mnSdPageCount == 1?
2457 									BTN_NEXT_0:BTN_NEXT_1)), aButton);
2458 
2459 		if(nFile != 2 && mnSdPageCount > 1)
2460 			aButton = CreateLink(String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateRel(1)")), aButton);
2461 
2462 		aStr += aButton;
2463 		aStr.AppendAscii( "\r\n" );
2464 
2465 	// zur letzten Seite
2466 		aButton = String(SdResId(STR_HTMLEXP_LASTPAGE));
2467 		if(mnButtonThema != -1)
2468 			aButton = CreateImage(GetButtonName((nFile ==2 || mnSdPageCount == 1?
2469 								  BTN_LAST_0:BTN_LAST_1)), aButton);
2470 
2471 		if(nFile != 2 && mnSdPageCount > 1)
2472 		{
2473 			String aLink(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateAbs("));
2474 			aLink += String::CreateFromInt32(mnSdPageCount-1);
2475 			aLink.AppendAscii( ")" );
2476 			aButton = CreateLink( aLink, aButton);
2477 		}
2478 
2479 		aStr += aButton;
2480 		aStr.AppendAscii( "\r\n" );
2481 
2482 	// Inhalt
2483 		if (mbContentsPage)
2484 		{
2485 			aButton = String(SdResId(STR_PUBLISH_OUTLINE));
2486 			if(mnButtonThema != -1)
2487 				aButton = CreateImage(GetButtonName(BTN_INDEX), aButton);
2488 
2489 			// zur Uebersicht
2490 			aStr += CreateLink(maIndex, aButton, String(RTL_CONSTASCII_USTRINGPARAM("_top")));
2491 			aStr.AppendAscii( "\r\n" );
2492 		}
2493 
2494 	// Textmodus
2495 		if(mbImpress)
2496 		{
2497 			aButton = String(SdResId(STR_HTMLEXP_SETTEXT));
2498 			if(mnButtonThema != -1)
2499 				aButton = CreateImage(GetButtonName(BTN_TEXT), aButton);
2500 
2501 			String	aText0( RTL_CONSTASCII_USTRINGPARAM("text0"));
2502 			aText0 += maHTMLExtension;
2503 			aStr += CreateLink( aText0, aButton, String(RTL_CONSTASCII_USTRINGPARAM("_top")));
2504 			aStr.AppendAscii( "\r\n" );
2505 		}
2506 
2507 	// Und fertich...
2508 		aStr.AppendAscii( "</center>\r\n" );
2509 		aStr.AppendAscii( "</body>\r\n</html>" );
2510 
2511 		String aFileName( RTL_CONSTASCII_USTRINGPARAM("navbar") );
2512 		aFileName += String::CreateFromInt32(nFile);
2513 
2514 		bOk = WriteHtml( aFileName, true, aStr );
2515 
2516 		if (mpProgress)
2517 			mpProgress->SetState(++mnPagesWritten);
2518 	}
2519 
2520 	// Jetzt kommt die Navigatonsleiste Outliner zugeklappt...
2521 	if(bOk)
2522 	{
2523 		String aStr(maHTMLHeader);
2524 		aStr += WriteMetaCharset();
2525 		aStr.AppendAscii( "  <title>" );
2526 		aStr += StringToHTMLString(*mpPageNames[0]);
2527 		aStr.AppendAscii( "</title>\r\n</head>\r\n" );
2528 		aStr += CreateBodyTag();
2529 
2530 		aButton = String(SdResId(STR_HTMLEXP_OUTLINE));
2531 		if(mnButtonThema != -1)
2532 			aButton = CreateImage(GetButtonName(BTN_MORE), aButton);
2533 
2534 		aStr += CreateLink(String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.ExpandOutline()")), aButton);
2535 		aStr.AppendAscii( "</body>\r\n</html>" );
2536 
2537 		String aFileName( RTL_CONSTASCII_USTRINGPARAM("navbar3") );
2538 
2539 		bOk = WriteHtml( aFileName, true, aStr );
2540 
2541 		if (mpProgress)
2542 			mpProgress->SetState(++mnPagesWritten);
2543 	}
2544 
2545 	// ... und jetzt Outliner aufgeklappt
2546 	if( bOk )
2547 	{
2548 		String aStr(maHTMLHeader);
2549 		aStr += WriteMetaCharset();
2550 		aStr.AppendAscii( "  <title>" );
2551 		aStr += StringToHTMLString(*mpPageNames[0]);
2552 		aStr.AppendAscii( "</title>\r\n</head>\r\n" );
2553 		aStr += CreateBodyTag();
2554 
2555 		aButton = String(SdResId(STR_HTMLEXP_NOOUTLINE));
2556 		if(mnButtonThema != -1)
2557 			aButton = CreateImage(GetButtonName(BTN_LESS), aButton);
2558 
2559 		aStr += CreateLink(String(RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.CollapseOutline()")), aButton);
2560 		aStr.AppendAscii( "</body>\r\n</html>" );
2561 
2562 		String aFileName( RTL_CONSTASCII_USTRINGPARAM("navbar4") );
2563 		bOk = WriteHtml( aFileName, true, aStr );
2564 
2565 		if (mpProgress)
2566 			mpProgress->SetState(++mnPagesWritten);
2567 
2568 	}
2569 
2570 	return bOk;
2571 }
2572 
2573 // ====================================================================
2574 // Buttonleiste fuer Standard ausgeben
2575 // ====================================================================
CreateNavBar(sal_uInt16 nSdPage,bool bIsText) const2576 String HtmlExport::CreateNavBar( sal_uInt16 nSdPage, bool bIsText ) const
2577 {
2578 	// Navigationsleiste vorbereiten
2579 	String aStrNavFirst( SdResId(STR_HTMLEXP_FIRSTPAGE) );
2580 	String aStrNavPrev( SdResId(STR_PUBLISH_BACK) );
2581 	String aStrNavNext( SdResId(STR_PUBLISH_NEXT) );
2582 	String aStrNavLast( SdResId(STR_HTMLEXP_LASTPAGE) );
2583 	String aStrNavContent( SdResId(STR_PUBLISH_OUTLINE) );
2584 	String aStrNavText;
2585 	if( bIsText )
2586 	{
2587 		aStrNavText = String( SdResId(STR_HTMLEXP_SETGRAPHIC) );
2588 	}
2589 	else
2590 	{
2591 		aStrNavText = String( SdResId(STR_HTMLEXP_SETTEXT) );
2592 	}
2593 
2594 	if(!bIsText && mnButtonThema != -1)
2595 	{
2596 		if(nSdPage<1 || mnSdPageCount == 1)
2597 		{
2598 			aStrNavFirst = CreateImage(GetButtonName(BTN_FIRST_0), aStrNavFirst);
2599 			aStrNavPrev  = CreateImage(GetButtonName(BTN_PREV_0), aStrNavPrev);
2600 		}
2601 		else
2602 		{
2603 			aStrNavFirst = CreateImage(GetButtonName(BTN_FIRST_1), aStrNavFirst);
2604 			aStrNavPrev  = CreateImage(GetButtonName(BTN_PREV_1), aStrNavPrev);
2605 		}
2606 
2607 		if(nSdPage == mnSdPageCount-1 || mnSdPageCount == 1)
2608 		{
2609 			aStrNavNext    = CreateImage(GetButtonName(BTN_NEXT_0), aStrNavNext);
2610 			aStrNavLast    = CreateImage(GetButtonName(BTN_LAST_0), aStrNavLast);
2611 		}
2612 		else
2613 		{
2614 			aStrNavNext    = CreateImage(GetButtonName(BTN_NEXT_1), aStrNavNext);
2615 			aStrNavLast    = CreateImage(GetButtonName(BTN_LAST_1), aStrNavLast);
2616 		}
2617 
2618 		aStrNavContent = CreateImage(GetButtonName(BTN_INDEX), aStrNavContent);
2619 		aStrNavText    = CreateImage(GetButtonName(BTN_TEXT), aStrNavText);
2620 	}
2621 
2622 	String aStr( RTL_CONSTASCII_USTRINGPARAM("<center>\r\n")); //<table><tr>\r\n");
2623 
2624 	// erste Seite
2625 	if(nSdPage > 0)
2626 		aStr += CreateLink(bIsText?*mpTextFiles[0]:*mpHTMLFiles[0],aStrNavFirst);
2627 	else
2628 		aStr += aStrNavFirst;
2629 	aStr.Append(sal_Unicode(' '));
2630 
2631 	// to Previous page
2632 	if(nSdPage > 0)
2633 		aStr += CreateLink( bIsText?*mpTextFiles[nSdPage-1]:
2634 									*mpHTMLFiles[nSdPage-1],	aStrNavPrev);
2635 	else
2636 		aStr += aStrNavPrev;
2637 	aStr.Append(sal_Unicode(' '));
2638 
2639 	// to Next page
2640 	if(nSdPage < mnSdPageCount-1)
2641 		aStr += CreateLink( bIsText?*mpTextFiles[nSdPage+1]:
2642 									*mpHTMLFiles[nSdPage+1], aStrNavNext);
2643 	else
2644 		aStr += aStrNavNext;
2645 	aStr.Append(sal_Unicode(' '));
2646 
2647 	// to Last page
2648 	if(nSdPage < mnSdPageCount-1)
2649 		aStr += CreateLink( bIsText?*mpTextFiles[mnSdPageCount-1]:
2650 									*mpHTMLFiles[mnSdPageCount-1],
2651 									aStrNavLast );
2652 	else
2653 		aStr += aStrNavLast;
2654 	aStr.Append(sal_Unicode(' '));
2655 
2656 	// to Index page
2657 	if (mbContentsPage)
2658 	{
2659 		aStr += CreateLink(maIndex, aStrNavContent);
2660 		aStr.Append(sal_Unicode(' '));
2661 	}
2662 
2663 	// Text/Graphics
2664 	if(mbImpress)
2665 	{
2666 		aStr += CreateLink( bIsText?(mbFrames?maFramePage:*mpHTMLFiles[nSdPage]):
2667 									*mpTextFiles[nSdPage], aStrNavText);
2668 
2669 	}
2670 
2671 	aStr.AppendAscii( "</center><br>\r\n" );
2672 
2673 	return aStr;
2674 }
2675 
2676 /** export navigation graphics from button set */
CreateBitmaps()2677 bool HtmlExport::CreateBitmaps()
2678 {
2679     if(mnButtonThema != -1 && mpButtonSet.get() )
2680     {
2681 		for( int nButton = 0; nButton < NUM_BUTTONS; nButton++ )
2682 		{
2683 			if(!mbFrames && (nButton == BTN_MORE || nButton == BTN_LESS))
2684 				continue;
2685 
2686 			if(!mbImpress && (nButton == BTN_TEXT || nButton == BTN_MORE || nButton == BTN_LESS ))
2687 				continue;
2688 
2689 			OUString aFull(maExportPath);
2690 			aFull += GetButtonName(nButton);
2691 			mpButtonSet->exportButton( mnButtonThema, aFull, GetButtonName(nButton) );
2692 		}
2693     }
2694 	return true;
2695 }
2696 
2697 // =====================================================================
2698 // Erzeugt den <body> Tag, inkl. der eingestellten Farbattribute
2699 // =====================================================================
CreateBodyTag() const2700 String HtmlExport::CreateBodyTag() const
2701 {
2702 	String aStr( RTL_CONSTASCII_USTRINGPARAM("<body") );
2703 
2704 	if( mbUserAttr || mbDocColors )
2705 	{
2706 		Color aTextColor( maTextColor );
2707 		if( (aTextColor == COL_AUTO) && (!maBackColor.IsDark()) )
2708 			aTextColor = COL_BLACK;
2709 
2710 		aStr.AppendAscii( " text=\"" );
2711 		aStr += ColorToHTMLString( aTextColor );
2712 		aStr.AppendAscii( "\" bgcolor=\"" );
2713 		aStr += ColorToHTMLString( maBackColor );
2714 		aStr.AppendAscii( "\" link=\"" );
2715 		aStr += ColorToHTMLString( maLinkColor );
2716 		aStr.AppendAscii( "\" vlink=\"" );
2717 		aStr += ColorToHTMLString( maVLinkColor );
2718 		aStr.AppendAscii( "\" alink=\"" );
2719 		aStr += ColorToHTMLString( maALinkColor );
2720 		aStr.AppendAscii( "\"" );
2721 	}
2722 
2723 	aStr.AppendAscii( ">\r\n" );
2724 
2725 	return aStr;
2726 }
2727 
2728 // =====================================================================
2729 // Erzeugt einen Hyperlink
2730 // =====================================================================
CreateLink(const String & aLink,const String & aText,const String & aTarget) const2731 String HtmlExport::CreateLink( const String& aLink,
2732 							   const String& aText,
2733 							   const String& aTarget ) const
2734 {
2735 	String aStr( RTL_CONSTASCII_USTRINGPARAM("<a href=\""));
2736 	aStr += StringToURL(aLink);
2737 	if(aTarget.Len())
2738 	{
2739 		aStr.AppendAscii( "\" target=\"" );
2740 		aStr += aTarget;
2741 	}
2742 	aStr.AppendAscii( "\">" );
2743 	aStr += aText;
2744 	aStr.AppendAscii( "</a>" );
2745 
2746 	return aStr;
2747 }
2748 
2749 // =====================================================================
2750 // Erzeugt ein Image-tag
2751 // =====================================================================
CreateImage(const String & aImage,const String & aAltText,sal_Int16 nWidth,sal_Int16 nHeight) const2752 String HtmlExport::CreateImage( const String& aImage, const String& aAltText,
2753 								sal_Int16 nWidth,
2754 								sal_Int16 nHeight ) const
2755 {
2756 	String aStr( RTL_CONSTASCII_USTRINGPARAM("<img src=\""));
2757 	aStr += StringToURL(aImage);
2758 	aStr.AppendAscii( "\" border=0" );
2759 
2760 	if( aAltText.Len())
2761 	{
2762 		aStr.AppendAscii( " alt=\"" );
2763 		aStr += aAltText;
2764 		aStr.Append(sal_Unicode('"'));
2765 	}
2766 	else
2767 	{
2768 		// Agerskov: HTML 4.01 has to have an alt attribut even if it is an empty string
2769 		aStr.AppendAscii( " alt=\"\"" );
2770  	}
2771 
2772 	if(nWidth > -1)
2773 	{
2774 		aStr.AppendAscii( " width=" );
2775 		aStr += String::CreateFromInt32(nWidth);
2776 	}
2777 
2778 	if(nHeight > -1)
2779 	{
2780 		aStr.AppendAscii( " height=" );
2781 		aStr += String::CreateFromInt32(nHeight);
2782 	}
2783 
2784 	aStr.Append(sal_Unicode('>'));
2785 
2786 	return aStr;
2787 }
2788 
2789 // =====================================================================
2790 // Area fuer Kreis erzeugen; es werden Pixelkoordinaten erwartet
2791 // =====================================================================
ColorToHTMLString(Color aColor)2792 String HtmlExport::ColorToHTMLString( Color aColor )
2793 {
2794 	static char hex[] = "0123456789ABCDEF";
2795 	String aStr( RTL_CONSTASCII_USTRINGPARAM("#xxxxxx"));
2796 	aStr.SetChar(1, hex[(aColor.GetRed() >> 4) & 0xf] );
2797 	aStr.SetChar(2, hex[aColor.GetRed()   & 0xf] );
2798 	aStr.SetChar(3, hex[(aColor.GetGreen() >> 4) & 0xf] );
2799 	aStr.SetChar(4, hex[aColor.GetGreen() & 0xf] );
2800 	aStr.SetChar(5, hex[(aColor.GetBlue() >> 4) & 0xf] );
2801 	aStr.SetChar(6, hex[aColor.GetBlue()  & 0xf] );
2802 
2803 	return aStr;
2804 }
2805 
2806 // =====================================================================
2807 // Area fuer Kreis erzeugen; es werden Pixelkoordinaten erwartet
2808 // =====================================================================
CreateHTMLCircleArea(sal_uLong nRadius,sal_uLong nCenterX,sal_uLong nCenterY,const String & rHRef) const2809 String HtmlExport::CreateHTMLCircleArea( sal_uLong nRadius,
2810 										 sal_uLong nCenterX,
2811 										 sal_uLong nCenterY,
2812 										 const String& rHRef ) const
2813 {
2814 	String aStr( RTL_CONSTASCII_USTRINGPARAM("<area shape=\"circle\" alt=\"\" coords=\"" ));
2815 
2816 	aStr += String::CreateFromInt32(nCenterX);
2817 	aStr.Append(sal_Unicode(','));
2818 	aStr += String::CreateFromInt32(nCenterY);
2819 	aStr.Append(sal_Unicode(','));
2820 	aStr += String::CreateFromInt32(nRadius);
2821 	aStr.AppendAscii( "\" href=\"" );
2822 	aStr += StringToURL(rHRef);
2823 	aStr.AppendAscii( "\">\n" );
2824 
2825 	return aStr;
2826 }
2827 
2828 
2829 // =====================================================================
2830 // Area fuer Polygon erzeugen; es werden Pixelkoordinaten erwartet
2831 // =====================================================================
CreateHTMLPolygonArea(const::basegfx::B2DPolyPolygon & rPolyPolygon,Size aShift,double fFactor,const String & rHRef) const2832 String HtmlExport::CreateHTMLPolygonArea( const ::basegfx::B2DPolyPolygon& rPolyPolygon,
2833 	Size aShift, double fFactor, const String& rHRef ) const
2834 {
2835 	String			aStr;
2836 	const sal_uInt32 nNoOfPolygons(rPolyPolygon.count());
2837 
2838 	for ( sal_uInt32 nXPoly = 0L; nXPoly < nNoOfPolygons; nXPoly++ )
2839 	{
2840 		const ::basegfx::B2DPolygon& aPolygon = rPolyPolygon.getB2DPolygon(nXPoly);
2841 		const sal_uInt32 nNoOfPoints(aPolygon.count());
2842 
2843 		aStr.AppendAscii( "<area shape=\"polygon\" alt=\"\" coords=\"" );
2844 
2845 		for ( sal_uInt32 nPoint = 0L; nPoint < nNoOfPoints; nPoint++ )
2846 		{
2847 			const ::basegfx::B2DPoint aB2DPoint(aPolygon.getB2DPoint(nPoint));
2848 			Point aPnt(FRound(aB2DPoint.getX()), FRound(aB2DPoint.getY()));
2849 			// das Koordinaten beziehen sich auf den
2850 			// physikalischen Seitenursprung, nicht auf den
2851 			// Koordinatenursprung
2852 			aPnt.Move(aShift.Width(), aShift.Height());
2853 
2854 			aPnt.X() = (long)(aPnt.X() * fFactor);
2855 			aPnt.Y() = (long)(aPnt.Y() * fFactor);
2856 			aStr += String::CreateFromInt32(aPnt.X());
2857 			aStr.Append(sal_Unicode(','));
2858 			aStr += String::CreateFromInt32(aPnt.Y());
2859 
2860 			if (nPoint < nNoOfPoints - 1)
2861 				aStr.Append( sal_Unicode(',') );
2862 		}
2863 		aStr.AppendAscii( "\" href=\"" );
2864 		aStr += StringToURL(rHRef);
2865 		aStr.AppendAscii( "\">\n" );
2866 	}
2867 
2868 	return aStr;
2869 }
2870 
2871 // =====================================================================
2872 // Area fuer Rechteck erzeugen; es werden Pixelkoordinaten erwartet
2873 // =====================================================================
CreateHTMLRectArea(const Rectangle & rRect,const String & rHRef) const2874 String HtmlExport::CreateHTMLRectArea( const Rectangle& rRect,
2875 									   const String& rHRef ) const
2876 {
2877 	String aStr( RTL_CONSTASCII_USTRINGPARAM("<area shape=\"rect\" alt=\"\" coords=\"") );
2878 
2879 	aStr += String::CreateFromInt32(rRect.Left());
2880 	aStr.Append(sal_Unicode(','));
2881 	aStr += String::CreateFromInt32(rRect.Top());
2882 	aStr.Append(sal_Unicode(','));
2883 	aStr += String::CreateFromInt32(rRect.Right());
2884 	aStr.Append(sal_Unicode(','));
2885 	aStr += String::CreateFromInt32(rRect.Bottom());
2886 	aStr.AppendAscii( "\" href=\"" );
2887 	aStr += StringToURL(rHRef);
2888 	aStr.AppendAscii( "\">\n" );
2889 
2890 	return aStr;
2891 }
2892 
2893 // =====================================================================
2894 // StringToHTMLString, konvertiert einen String in
2895 // seine HTML-Repraesentation (Umlaute etc.)
2896 // =====================================================================
StringToHTMLString(const String & rString)2897 String HtmlExport::StringToHTMLString( const String& rString )
2898 {
2899 	SvMemoryStream aMemStm;
2900 	HTMLOutFuncs::Out_String( aMemStm, rString, RTL_TEXTENCODING_UTF8 );
2901 	aMemStm << (char) 0;
2902 	return String( (char*)aMemStm.GetData(), RTL_TEXTENCODING_UTF8 );
2903 }
2904 
2905 // =====================================================================
2906 // Erzeugt die URL einer bestimmten Seite
2907 // =====================================================================
CreatePageURL(sal_uInt16 nPgNum)2908 String HtmlExport::CreatePageURL( sal_uInt16 nPgNum )
2909 {
2910 	if(mbFrames)
2911 	{
2912 		String aUrl( RTL_CONSTASCII_USTRINGPARAM("JavaScript:parent.NavigateAbs("));
2913 		aUrl += String::CreateFromInt32(nPgNum);
2914 		aUrl.Append(sal_Unicode(')'));
2915 		return aUrl;
2916 	}
2917 	else
2918 		return *mpHTMLFiles[nPgNum];
2919 }
2920 
CopyScript(const String & rPath,const String & rSource,const String & rDest,bool bUnix)2921 bool HtmlExport::CopyScript( const String& rPath, const String& rSource, const String& rDest, bool bUnix /* = false */ )
2922 {
2923 	INetURLObject	aURL( SvtPathOptions().GetConfigPath() );
2924 	String		aScript;
2925 
2926 	aURL.Append( String( RTL_CONSTASCII_USTRINGPARAM("webcast") ) );
2927 	aURL.Append( rSource );
2928 
2929 	meEC.SetContext( STR_HTMLEXP_ERROR_OPEN_FILE, rSource );
2930 
2931 	sal_uLong		nErr = 0;
2932 	SvStream*	pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
2933 
2934 	if( pIStm )
2935 	{
2936 		ByteString aLine;
2937 
2938 		while( pIStm->ReadLine( aLine ) )
2939 		{
2940 			aScript.AppendAscii( aLine.GetBuffer() );
2941 			if( bUnix )
2942 			{
2943 				aScript.AppendAscii( "\n" );
2944 			}
2945 			else
2946 			{
2947 				aScript.AppendAscii( "\r\n" );
2948 			}
2949 		}
2950 
2951 		nErr = pIStm->GetError();
2952 		delete pIStm;
2953 	}
2954 
2955 	if( nErr != 0 )
2956 	{
2957 		ErrorHandler::HandleError( nErr );
2958 		return (bool) nErr;
2959 	}
2960 
2961 
2962 	aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$1")), getDocumentTitle() );
2963 
2964 	const String aSaveStr( RESTOHTML( STR_WEBVIEW_SAVE ));
2965 	aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$2")), aSaveStr );
2966 
2967 	aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$3")), maCGIPath );
2968 
2969 	aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$4")), String::CreateFromInt32(mnWidthPixel) );
2970 	aScript.SearchAndReplaceAll( String(RTL_CONSTASCII_USTRINGPARAM("$$5")), String::CreateFromInt32(mnHeightPixel) );
2971 
2972 
2973 	String aDest( rPath );
2974 	aDest += rDest;
2975 
2976 	meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, rDest );
2977 	// write script file
2978 	{
2979 		EasyFile aFile;
2980 		SvStream* pStr;
2981 		nErr = aFile.createStream(aDest, pStr);
2982 		if(nErr == 0)
2983 		{
2984 			ByteString aStr( aScript, RTL_TEXTENCODING_UTF8 );
2985 			*pStr << aStr.GetBuffer();
2986 
2987 			nErr = aFile.close();
2988 		}
2989 	}
2990 
2991 	if (mpProgress)
2992 		mpProgress->SetState(++mnPagesWritten);
2993 
2994 	if( nErr != 0 )
2995 		ErrorHandler::HandleError( nErr );
2996 
2997 	return nErr == 0;
2998 }
2999 
3000 static const char * ASP_Scripts[] = { "common.inc", "webcast.asp", "show.asp", "savepic.asp", "poll.asp", "editpic.asp" };
3001 
3002 /** erzeugt und speichert die f�r WebShow ben�tigte ASP Scripte */
CreateASPScripts()3003 bool HtmlExport::CreateASPScripts()
3004 {
3005 	for( sal_uInt16 n = 0; n < (sizeof( ASP_Scripts ) / sizeof(char *)); n++ )
3006 	{
3007 		String aScript;
3008 
3009 		aScript.AssignAscii( ASP_Scripts[n] );
3010 		if(!CopyScript(maExportPath, aScript, aScript))
3011 			return false;
3012 	}
3013 
3014 	if(!CopyScript(maExportPath, String(RTL_CONSTASCII_USTRINGPARAM("edit.asp")), maIndex ))
3015 		return false;
3016 
3017 	return true;
3018 }
3019 
3020 
3021 static const char *PERL_Scripts[] = { "webcast.pl", "common.pl", "editpic.pl", "poll.pl", "savepic.pl", "show.pl" };
3022 
3023 /** erzeugt und speichert die f�r WebShow ben�tigte PERL Scripte */
CreatePERLScripts()3024 bool HtmlExport::CreatePERLScripts()
3025 {
3026 	for( sal_uInt16 n = 0; n < (sizeof( PERL_Scripts ) / sizeof(char *)); n++ )
3027 	{
3028 		String aScript;
3029 		aScript.AssignAscii( PERL_Scripts[n] );
3030 		if(!CopyScript(maExportPath, aScript, aScript, true))
3031 			return false;
3032 	}
3033 
3034 	if(!CopyScript(maExportPath, String( RTL_CONSTASCII_USTRINGPARAM("edit.pl")), maIndex, true ))
3035 		return false;
3036 
3037 	if(!CopyScript(maExportPath, String( RTL_CONSTASCII_USTRINGPARAM("index.pl")), maIndexUrl, true ))
3038 		return false;
3039 
3040 	return true;
3041 }
3042 
3043 /** Erzeugt eine Liste mit den Namen der gespeicherten Images */
CreateImageFileList()3044 bool HtmlExport::CreateImageFileList()
3045 {
3046 	String aStr;
3047 	for( sal_uInt16 nSdPage = 0; nSdPage < mnSdPageCount; nSdPage++)
3048 	{
3049 		aStr += String::CreateFromInt32( nSdPage + 1 );
3050 		aStr.Append(sal_Unicode(';'));
3051 		aStr += maURLPath;
3052 		aStr += *mpImageFiles[nSdPage];
3053 		aStr.AppendAscii( "\r\n" );
3054 	}
3055 
3056 	String aFileName( RTL_CONSTASCII_USTRINGPARAM("picture.txt") );
3057 	bool bOk = WriteHtml( aFileName, false, aStr );
3058 
3059 	if (mpProgress)
3060 		mpProgress->SetState(++mnPagesWritten);
3061 
3062 	return bOk;
3063 }
3064 
3065 /** Erzeugt das File mit der aktuellen Seitennumer */
CreateImageNumberFile()3066 bool HtmlExport::CreateImageNumberFile()
3067 {
3068 	String aFull( maExportPath );
3069 	String aFileName( RTL_CONSTASCII_USTRINGPARAM("currpic.txt") );
3070 	aFull += aFileName;
3071 
3072 	meEC.SetContext( STR_HTMLEXP_ERROR_CREATE_FILE, aFileName );
3073 	EasyFile aFile;
3074 	SvStream* pStr;
3075 	sal_uLong nErr = aFile.createStream(aFull, pStr);
3076 	if(nErr == 0)
3077 	{
3078 		*pStr << (const char *)"1";
3079 		nErr = aFile.close();
3080 	}
3081 
3082 	if (mpProgress)
3083 		mpProgress->SetState(++mnPagesWritten);
3084 
3085 	if( nErr != 0 )
3086 		ErrorHandler::HandleError( nErr );
3087 
3088 	return nErr == 0;
3089 }
3090 
3091 // =====================================================================
3092 
InsertSound(const String & rSoundFile)3093 String HtmlExport::InsertSound( const String& rSoundFile )
3094 {
3095 	if( rSoundFile.Len() == 0 )
3096 		return rSoundFile;
3097 
3098 	String		aStr( RTL_CONSTASCII_USTRINGPARAM("<embed src=\"") );
3099 	INetURLObject	aURL( rSoundFile );
3100 
3101 	DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
3102 
3103 	aStr += String(aURL.getName());
3104 	aStr.AppendAscii( "\" hidden=\"true\" autostart=\"true\">" );
3105 
3106 	CopyFile( rSoundFile, maExportPath );
3107 
3108 	return aStr;
3109 }
3110 
3111 // =====================================================================
3112 
CopyFile(const String & rSourceFile,const String & rDestPath)3113 bool HtmlExport::CopyFile( const String& rSourceFile, const String& rDestPath )
3114 {
3115 	DirEntry aSourceEntry( rSourceFile );
3116 	DirEntry aDestEntry( rDestPath );
3117 
3118 	meEC.SetContext( STR_HTMLEXP_ERROR_COPY_FILE, aSourceEntry.GetName(), rDestPath );
3119 	FSysError nError = aSourceEntry.CopyTo( aDestEntry, FSYS_ACTION_COPYFILE );
3120 
3121 	if( nError != FSYS_ERR_OK )
3122 	{
3123 		ErrorHandler::HandleError(nError);
3124 		return false;
3125 	}
3126 	else
3127 	{
3128 		return true;
3129 	}
3130 }
3131 
3132 // =====================================================================
3133 
checkFileExists(Reference<::com::sun::star::ucb::XSimpleFileAccess> & xFileAccess,String const & aFileName)3134 bool HtmlExport::checkFileExists( Reference< ::com::sun::star::ucb::XSimpleFileAccess >& xFileAccess, String const & aFileName )
3135 {
3136 	try
3137 	{
3138 		OUString url( maExportPath );
3139 		url += aFileName;
3140 		return xFileAccess->exists( url );
3141 	}
3142 	catch( com::sun::star::uno::Exception& e )
3143 	{
3144 		(void)e;
3145 		DBG_ERROR((OString("sd::HtmlExport::checkFileExists(), exception caught: ") +
3146              rtl::OUStringToOString( comphelper::anyToString( cppu::getCaughtException() ), RTL_TEXTENCODING_UTF8 )).getStr() );
3147 	}
3148 
3149 	return false;
3150 }
3151 
3152 // ---------------------------------------------------------------------
3153 
checkForExistingFiles()3154 bool HtmlExport::checkForExistingFiles()
3155 {
3156 	bool bFound = false;
3157 
3158 	try
3159 	{
3160 		Reference< XMultiServiceFactory > xMsf( ::comphelper::getProcessServiceFactory() );
3161 		Reference< ::com::sun::star::ucb::XSimpleFileAccess > xFA( xMsf->createInstance(
3162 			OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.ucb.SimpleFileAccess"))), UNO_QUERY_THROW );
3163 
3164 		sal_uInt16 nSdPage;
3165 		for( nSdPage = 0; !bFound && (nSdPage < mnSdPageCount); nSdPage++)
3166 		{
3167 			if( (mpImageFiles[nSdPage] && checkFileExists( xFA, *mpImageFiles[nSdPage] )) ||
3168 				(mpHTMLFiles[nSdPage] && checkFileExists( xFA, *mpHTMLFiles[nSdPage] )) ||
3169 				(mpPageNames[nSdPage] && checkFileExists( xFA, *mpPageNames[nSdPage] )) ||
3170 				(mpTextFiles[nSdPage] && checkFileExists( xFA, *mpTextFiles[nSdPage] )) )
3171 			{
3172 				bFound = true;
3173 			}
3174 		}
3175 
3176 		if( !bFound && mbDownload )
3177 			bFound = checkFileExists( xFA, maDocFileName );
3178 
3179 		if( !bFound && mbFrames )
3180 			bFound = checkFileExists( xFA, maFramePage );
3181 
3182 		if( bFound )
3183 		{
3184 			ResMgr *pResMgr = CREATERESMGR( dbw );
3185 			if( pResMgr )
3186 			{
3187 				ResId aResId( 4077, *pResMgr );
3188 				String aMsg( aResId );
3189 
3190 				OUString aSystemPath;
3191 				osl::FileBase::getSystemPathFromFileURL( maExportPath, aSystemPath );
3192 				aMsg.SearchAndReplaceAscii( "%FILENAME", aSystemPath );
3193 				WarningBox aWarning( 0, WB_YES_NO | WB_DEF_YES, aMsg );
3194 				aWarning.SetImage( WarningBox::GetStandardImage() );
3195 				bFound = ( RET_NO == aWarning.Execute() );
3196 
3197 				delete pResMgr;
3198 			}
3199 			else
3200 			{
3201 				bFound = false;
3202 			}
3203 		}
3204 	}
3205 	catch( Exception& e )
3206 	{
3207 		(void)e;
3208 		DBG_ERROR((OString("sd::HtmlExport::checkForExistingFiles(), exception caught: ") +
3209              rtl::OUStringToOString( comphelper::anyToString( cppu::getCaughtException() ), RTL_TEXTENCODING_UTF8 )).getStr() );
3210 		bFound = false;
3211 	}
3212 
3213 	return bFound;
3214 }
3215 
3216 // ---------------------------------------------------------------------
3217 
StringToURL(const String & rURL)3218 String HtmlExport::StringToURL( const String& rURL )
3219 {
3220 	return rURL;
3221 /*
3222 	return StringToHTMLString(rURL);
3223 	OUString aURL( StringToHTMLString(rURL) );
3224 
3225     aURL = Uri::encode( aURL, rtl_UriCharClassUric, rtl_UriEncodeCheckEscapes, RTL_TEXTENCODING_UTF8);
3226 	return String( aURL );
3227 */
3228 }
3229 
GetButtonName(int nButton) const3230 String HtmlExport::GetButtonName( int nButton ) const
3231 {
3232 	String aName;
3233 	aName.AssignAscii( pButtonNames[nButton] );
3234 	return aName;
3235 }
3236 
3237 // =====================================================================
EasyFile()3238 EasyFile::EasyFile()
3239 {
3240 	pMedium = NULL;
3241 	pOStm = NULL;
3242 	bOpen = false;
3243 }
3244 
3245 // =====================================================================
~EasyFile()3246 EasyFile::~EasyFile()
3247 {
3248 	if( bOpen )
3249 		close();
3250 }
3251 
3252 // =====================================================================
createStream(const String & rUrl,SvStream * & rpStr)3253 sal_uLong EasyFile::createStream(  const String& rUrl, SvStream* &rpStr )
3254 {
3255 	sal_uLong nErr = 0;
3256 
3257 	if(bOpen)
3258 		nErr = close();
3259 
3260 	String aFileName;
3261 
3262 	if( nErr == 0 )
3263 		nErr = createFileName( rUrl, aFileName );
3264 
3265 	if( nErr == 0 )
3266 	{
3267 		pOStm = ::utl::UcbStreamHelper::CreateStream( aFileName, STREAM_WRITE | STREAM_TRUNC );
3268 		if( pOStm )
3269 		{
3270 			bOpen = true;
3271 			nErr = pOStm->GetError();
3272 		}
3273 		else
3274 		{
3275 			nErr = ERRCODE_SFX_CANTCREATECONTENT;
3276 		}
3277 	}
3278 
3279 	if( nErr != 0 )
3280 	{
3281 		bOpen = false;
3282 		delete pMedium;
3283 		delete pOStm;
3284 		pOStm = NULL;
3285 	}
3286 
3287 	rpStr = pOStm;
3288 
3289 	return nErr;
3290 }
3291 
3292 // =====================================================================
createFileName(const String & rURL,String & rFileName)3293 sal_uLong EasyFile::createFileName(  const String& rURL, String& rFileName )
3294 {
3295 	sal_uLong nErr = 0;
3296 
3297 	if( bOpen )
3298 		nErr = close();
3299 
3300 	if( nErr == 0 )
3301 	{
3302 		INetURLObject aURL( rURL );
3303 
3304 		if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
3305 		{
3306 			String aURLStr;
3307 			::utl::LocalFileHelper::ConvertPhysicalNameToURL( rURL, aURLStr );
3308 			aURL = INetURLObject( aURLStr );
3309 		}
3310 		DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
3311 		rFileName = aURL.GetMainURL( INetURLObject::NO_DECODE );
3312 	}
3313 
3314 	return nErr;
3315 }
3316 
3317 // =====================================================================
close()3318 sal_uLong EasyFile::close()
3319 {
3320 	sal_uLong nErr = 0;
3321 
3322 	delete pOStm;
3323 	pOStm = NULL;
3324 
3325 	bOpen = false;
3326 
3327 	if( pMedium )
3328 	{
3329 		// uebertragen
3330 		pMedium->Close();
3331 		pMedium->Commit();
3332 
3333 		nErr = pMedium->GetError();
3334 
3335 		delete pMedium;
3336 		pMedium = NULL;
3337 	}
3338 
3339 	return nErr;
3340 }
3341 
3342 // =====================================================================
3343 // This class helps reporting errors during file i/o
3344 // =====================================================================
3345 
HtmlErrorContext(Window * _pWin)3346 HtmlErrorContext::HtmlErrorContext(Window *_pWin)
3347 : ErrorContext(_pWin)
3348 {
3349 	mnResId = 0;
3350 }
3351 
3352 // =====================================================================
3353 
GetString(sal_uLong,String & rCtxStr)3354 sal_Bool HtmlErrorContext::GetString( sal_uLong, String& rCtxStr )
3355 {
3356 	DBG_ASSERT( mnResId != 0, "No error context set" );
3357 	if( mnResId == 0 )
3358 		return false;
3359 
3360 	rCtxStr = String( SdResId( mnResId ) );
3361 
3362 	rCtxStr.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("$(URL1)")), maURL1 );
3363 	rCtxStr.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM("$(URL2)")), maURL2 );
3364 
3365 	return true;
3366 }
3367 
3368 // =====================================================================
3369 
SetContext(sal_uInt16 nResId,const String & rURL)3370 void HtmlErrorContext::SetContext( sal_uInt16 nResId, const String& rURL )
3371 {
3372 	mnResId = nResId;
3373 	maURL1 = rURL;
3374 	maURL2.Erase();
3375 }
3376 
3377 // =====================================================================
3378 
SetContext(sal_uInt16 nResId,const String & rURL1,const String & rURL2)3379 void HtmlErrorContext::SetContext( sal_uInt16 nResId, const String& rURL1, const String& rURL2 )
3380 {
3381 	mnResId = nResId;
3382 	maURL1 = rURL1;
3383 	maURL2 = rURL2;
3384 }
3385 
3386 // =====================================================================
3387 
3388 
3389