You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kpresenter/KPrWebPresentation.cpp

1306 lines
48 KiB

// -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
/* This file is part of the KDE project
Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
Copyright 2001, 2002 Nicolas GOUTTE <goutte@kde.org>
Copyright 2002 Ariya Hidayat <ariya@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "KPrWebPresentation.h"
#include "KPrView.h"
#include "KPrDocument.h"
#include "KPrCanvas.h"
#include "KPrPage.h"
#include <kstandarddirs.h>
#include <unistd.h>
#include <sys/types.h>
#include <ktempfile.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qvbox.h>
#include <qhbox.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qfileinfo.h>
#include <qframe.h>
#include <qfont.h>
#include <qpixmap.h>
#include <qdatetime.h>
#include <qdir.h>
#include <qheader.h>
#include <qwmatrix.h>
#include <qtextcodec.h>
#include <qregexp.h>
#include <qimage.h>
#include <qlayout.h>
#include <qwhatsthis.h>
#include <qcheckbox.h>
#include <kdebug.h>
#include <klocale.h>
#include <kcolorbutton.h>
#include <kfiledialog.h>
#include <kmessagebox.h>
#include <kbuttonbox.h>
#include <ksimpleconfig.h>
#include <kapplication.h>
#include <kprogress.h>
#include <kglobal.h>
#include <kglobalsettings.h>
#include <kcharsets.h>
#include <kurlrequester.h>
#include <klineedit.h>
#include <klistview.h>
#include <knuminput.h>
#include <kcombobox.h>
#include <kurl.h>
#include <kio/netaccess.h>
#include <kdialog.h>
#include "KoDocumentInfo.h"
// Comes from koffice/filters/libexport/KWEFUtils.cc
static QString EscapeSgmlText(const QTextCodec* codec, const QString& strIn,
const bool quot = false , const bool apos = false )
{
QString strReturn;
QChar ch;
for (uint i=0; i<strIn.length(); i++)
{
ch=strIn[i];
switch (ch.unicode())
{
case 38: // &
{
strReturn+="&amp;";
break;
}
case 60: // <
{
strReturn+="&lt;";
break;
}
case 62: // >
{
strReturn+="&gt;";
break;
}
case 34: // "
{
if (quot)
strReturn+="&quot;";
else
strReturn+=ch;
break;
}
case 39: // '
{
// NOTE: HTML does not define &apos; by default (only XML/XHTML does)
if (apos)
strReturn+="&apos;";
else
strReturn+=ch;
break;
}
default:
{
// verify that the character ch can be expressed in the
// encoding in which we will write the HTML file.
if (codec)
{
if (!codec->canEncode(ch))
{
strReturn+=QString("&#%1;").arg(ch.unicode());
break;
}
}
strReturn+=ch;
break;
}
}
}
return strReturn;
}
// Escape only if the encoding do not support the character
// Special SGML characters like < > & are supposed to be already escaped.
static QString EscapeEncodingOnly(const QTextCodec* codec, const QString& strIn)
{
QString strReturn;
QChar ch;
for (uint i=0; i<strIn.length(); i++)
{
ch=strIn[i];
if (codec)
{
if (!codec->canEncode(ch))
{
strReturn+=QString("&#%1;").arg(ch.unicode());
continue;
}
}
strReturn+=ch;
}
return strReturn;
}
KPrWebPresentation::KPrWebPresentation( KPrDocument *_doc, KPrView *_view )
: config( QString::null ), xml( false )
{
doc = _doc;
view = _view;
init();
}
KPrWebPresentation::KPrWebPresentation( const QString &_config, KPrDocument *_doc, KPrView *_view )
: config( _config ), xml( false ), m_bWriteHeader( true ), m_bWriteFooter( true ), m_bLoopSlides( false )
{
doc = _doc;
view = _view;
init();
loadConfig();
}
KPrWebPresentation::KPrWebPresentation( const KPrWebPresentation &webPres )
: config( webPres.config ), author( webPres.author ), title( webPres.title ), email( webPres.email ),
slideInfos( webPres.slideInfos ), backColor( webPres.backColor ), titleColor( webPres.titleColor ),
textColor( webPres.textColor ), path( webPres.path ), xml( webPres.xml),
m_bWriteHeader( webPres.m_bWriteHeader ),
m_bWriteFooter( webPres.m_bWriteFooter ), m_bLoopSlides( webPres.m_bLoopSlides ),
timeBetweenSlides ( webPres.timeBetweenSlides ), zoom( webPres.zoom ), m_encoding( webPres.m_encoding )
{
doc = webPres.doc;
view = webPres.view;
}
void KPrWebPresentation::loadConfig()
{
if ( config.isEmpty() )
return;
KSimpleConfig cfg( config );
cfg.setGroup( "General" );
author = cfg.readEntry( "Author", author );
title = cfg.readEntry( "Title", title );
email = cfg.readEntry( "EMail", email );
unsigned int num = cfg.readNumEntry( "Slides", slideInfos.count() );
//kdDebug(33001) << "KPrWebPresentation::loadConfig num=" << num << endl;
if ( num <= slideInfos.count() ) {
for ( unsigned int i = 0; i < num; i++ )
{
QString key = QString::fromLatin1( "SlideTitle%1" ).arg( i );
if ( cfg.hasKey( key ) )
{
// We'll assume that the selected pages haven't changed... Hmm.
slideInfos[ i ].slideTitle = cfg.readEntry( key );
kdDebug(33001) << "KPrWebPresentation::loadConfig key=" << key << " data=" << slideInfos[i].slideTitle << endl;
} else kdDebug(33001) << " key not found " << key << endl;
}
}
backColor = cfg.readColorEntry( "BackColor", &backColor );
titleColor = cfg.readColorEntry( "TitleColor", &titleColor );
textColor = cfg.readColorEntry( "TextColor", &textColor );
path = cfg.readPathEntry( "Path", path );
xml = cfg.readBoolEntry( "XML", xml );
m_bWriteHeader = cfg.readBoolEntry( "WriteHeader", m_bWriteHeader );
m_bWriteFooter = cfg.readBoolEntry( "WriteFooter", m_bWriteFooter );
m_bLoopSlides = cfg.readBoolEntry( "LoopSlides", m_bLoopSlides );
zoom = cfg.readNumEntry( "Zoom", zoom );
timeBetweenSlides = cfg.readNumEntry("TimeBetweenSlides", timeBetweenSlides );
m_encoding = cfg.readEntry( "Encoding", m_encoding );
}
void KPrWebPresentation::saveConfig()
{
KSimpleConfig cfg( config );
cfg.setGroup( "General" );
cfg.writeEntry( "Author", author );
cfg.writeEntry( "Title", title );
cfg.writeEntry( "EMail", email );
cfg.writeEntry( "Slides", slideInfos.count() );
for ( unsigned int i = 0; i < slideInfos.count(); i++ )
cfg.writeEntry( QString::fromLatin1( "SlideTitle%1" ).arg( i ), slideInfos[ i ].slideTitle );
cfg.writeEntry( "BackColor", backColor );
cfg.writeEntry( "TitleColor", titleColor );
cfg.writeEntry( "TextColor", textColor );
#if KDE_IS_VERSION(3,1,3)
cfg.writePathEntry( "Path", path );
#else
cfg.writeEntry( "Path", path );
#endif
cfg.writeEntry( "XML", xml );
cfg.writeEntry( "WriteHeader", m_bWriteHeader );
cfg.writeEntry( "WriteFooter", m_bWriteFooter );
cfg.writeEntry( "LoopSlides", m_bLoopSlides );
cfg.writeEntry( "Zoom", zoom );
cfg.writeEntry( "TimeBetweenSlides", timeBetweenSlides );
cfg.writeEntry( "Encoding", m_encoding );
}
void KPrWebPresentation::initCreation( KProgress *progressBar )
{
QString cmd;
int p;
KURL str( path + "/html" );
KIO::NetAccess::mkdir( str,( QWidget* )0L );
p = progressBar->progress();
progressBar->setProgress( ++p );
kapp->processEvents();
str = path + "/pics";
KIO::NetAccess::mkdir( str,( QWidget* )0L );
p = progressBar->progress();
progressBar->setProgress( ++p );
kapp->processEvents();
const char *pics[] = { "home", "first", "next", "prev", "last", 0 };
KURL srcurl, desturl;
for ( uint index = 0; pics[ index ]; index ++ )
{
QString filename = pics[ index ];
filename += ".png";
srcurl.setPath( locate( "slideshow", filename, KPrFactory::global() ) );
desturl = path;
desturl.addPath( "/pics/" + filename );
KIO::NetAccess::file_copy( srcurl, desturl, -1, true /*overwrite*/);
p = progressBar->progress();
progressBar->setProgress( ++p );
kapp->processEvents();
}
}
void KPrWebPresentation::createSlidesPictures( KProgress *progressBar )
{
if ( slideInfos.isEmpty() )
return;
QPixmap pix( 10, 10 );
QString filename;
int p;
for ( unsigned int i = 0; i < slideInfos.count(); i++ ) {
int pgNum = slideInfos[i].pageNumber;
view->getCanvas()->drawPageInPix( pix, pgNum, zoom, true /*force real variable value*/ );
filename = QString( "%1/pics/slide_%2.png" ).arg( path ).arg( i + 1 );
KTempFile tmp;
pix.save( tmp.name(), "PNG" );
KIO::NetAccess::file_move( tmp.name(), filename, -1, true /*overwrite*/);
p = progressBar->progress();
progressBar->setProgress( ++p );
kapp->processEvents();
}
}
QString KPrWebPresentation::escapeHtmlText( QTextCodec *codec, const QString& strText ) const
{
// Escape quotes (needed in attributes)
// Do not escape apostrophs (only allowed in XHTML!)
return EscapeSgmlText( codec, strText, true, false );
}
void KPrWebPresentation::writeStartOfHeader(QTextStream& streamOut, QTextCodec *codec, const QString& subtitle, const QString& next)
{
QString mimeName ( codec->mimeName() );
if ( isXML() )
{ //Write out the XML declaration
streamOut << "<?xml version=\"1.0\" encoding=\""
<< mimeName << "\"?>\n";
}
// write <!DOCTYPE
streamOut << "<!DOCTYPE ";
if ( isXML() )
{
streamOut << "html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"";
streamOut << " \"DTD/xhtml1-transitional.dtd\">\n";
}
else
{
streamOut << "HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"";
streamOut << " \"http://www.w3.org/TR/html4/loose.dtd\">\n";
}
streamOut << "<html";
if ( isXML() )
{
// XHTML has an extra attribute defining its namespace (in the <html> opening tag)
streamOut << " xmlns=\"http://www.w3.org/1999/xhtml\"";
}
streamOut << ">\n" << "<head>\n";
// Declare what charset we are using
streamOut << "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=";
streamOut << mimeName << '"' << ( isXML() ?" /":"") << ">\n" ;
// Tell who we are (with the CVS revision number) in case we have a bug in our output!
QString strVersion("$Revision: 508787 $");
// Eliminate the dollar signs
// (We don't want that the version number changes if the HTML file is itself put in a CVS storage.)
streamOut << "<meta name=\"Generator\" content=\"KPresenter's Web Presentation "
<< strVersion.mid(10).replace("$","")
<< "\""<< ( isXML() ?" /":"") // X(HT)ML closes empty elements, HTML not!
<< ">\n";
// Load the next slide after time elapsed
if ( (timeBetweenSlides > 0) && ( ! next.isNull() ) )
{
streamOut << "<meta http-equiv=\"refresh\" content=\""
<< timeBetweenSlides
<< ";url=" << next
<< "\">\n";
}
streamOut << "<title>"<< escapeHtmlText( codec, title ) << " - " << escapeHtmlText( codec, subtitle ) << "</title>\n";
// ### TODO: transform documentinfo.xml into many <META> elements (at least the author!)
}
void KPrWebPresentation::createSlidesHTML( KProgress *progressBar )
{
QTextCodec *codec = KGlobal::charsets()->codecForName( m_encoding );
const QString brtag ( "<br" + QString(isXML()?" /":"") + ">" );
for ( unsigned int i = 0; i < slideInfos.count(); i++ ) {
unsigned int pgNum = i + 1; // pgquiles # elpauer . org - I think this is a bug, seems to be an overflow if we have max_unsigned_int slides
KTempFile tmp;
QString dest= QString( "%1/html/slide_%2.html" ).arg( path ).arg( pgNum );
QString next= QString( "slide_%2.html" ).arg( pgNum<slideInfos.count() ? pgNum+1 : (m_bLoopSlides ? 1 : pgNum ) ); // Ugly, but it works
QFile file( tmp.name() );
file.open( IO_WriteOnly );
QTextStream streamOut( &file );
streamOut.setCodec( codec );
writeStartOfHeader( streamOut, codec, slideInfos[ i ].slideTitle, next );
// ### TODO: transform documentinfo.xml into many <META> elements (at least the author!)
if ( i > 0 ) {
streamOut << "<link rel=\"first\" href=\"slide_1.html\"" << ( isXML() ?" /":"") << ">\n";
streamOut << "<link rel=\"prev\" href=\"slide_" << pgNum - 1 << ".html\"" << ( isXML() ?" /":"") << ">\n";
}
if ( i < slideInfos.count() - 1 ) {
streamOut << "<link rel=\"next\" href=\"slide_" << pgNum + 1 << ".html\"" << ( isXML() ?" /":"") << ">\n";
streamOut << "<link rel=\"last\" href=\"slide_" << slideInfos.count() << ".html\"" << ( isXML() ?" /":"") << ">\n";
}
streamOut << "<link rel=\"contents\" href=\"../index.html\"" << ( isXML() ?" /":"") << ">\n";
streamOut << "</head>\n";
streamOut << "<body bgcolor=\"" << backColor.name() << "\" text=\"" << textColor.name() << "\">\n";
if (m_bWriteHeader) {
streamOut << " <center>\n";
if ( i > 0 )
streamOut << " <a href=\"slide_1.html\">";
streamOut << "<img src=\"../pics/first.png\" border=\"0\" alt=\"" << i18n( "First" )
<< "\" title=\"" << i18n( "First" ) << "\"" << ( isXML() ?" /":"") << ">";
if ( i > 0 )
streamOut << "</a>";
streamOut << "\n";
if ( i > 0 )
streamOut << " <a href=\"slide_" << pgNum - 1 << ".html\">";
streamOut << "<img src=\"../pics/prev.png\" border=\"0\" alt=\"" << i18n( "Previous" )
<< "\" title=\"" << i18n( "Previous" ) << "\"" << ( isXML() ?" /":"") << ">";
if ( i > 0 )
streamOut << "</a>";
streamOut << "\n";
if ( (m_bLoopSlides) || (i < slideInfos.count() - 1 ) )
streamOut << " <a href=\"" << next << "\">";
streamOut << "<img src=\"../pics/next.png\" border=\"0\" alt=\"" << i18n( "Next" )
<< "\" title=\"" << i18n( "Next" ) << "\"" << ( isXML() ?" /":"") << ">";
if ( (m_bLoopSlides) || (i < slideInfos.count() - 1 ) )
streamOut << "</a>";
streamOut << "\n";
if ( i < slideInfos.count() - 1 )
streamOut << " <a href=\"slide_" << slideInfos.count() << ".html\">";
streamOut << "<img src=\"../pics/last.png\" border=\"0\" alt=\"" << i18n( "Last" )
<< "\" title=\"" << i18n( "Last" ) << "\"" << ( isXML() ?" /":"") << ">";
if ( i < slideInfos.count() - 1 )
streamOut << "</a>";
streamOut << "\n" << " &nbsp; &nbsp; &nbsp; &nbsp;\n";
streamOut << " <a href=\"../index.html\">";
streamOut << "<img src=\"../pics/home.png\" border=\"0\" alt=\"" << i18n( "Home" )
<< "\" title=\"" << i18n( "Home" ) << "\"" << ( isXML() ?" /":"") << ">";
streamOut << "</a>\n";
streamOut << " </center>" << brtag << "<hr noshade=\"noshade\"" << ( isXML() ?" /":"") << ">\n"; // ### TODO: is noshade W3C?
streamOut << " <center>\n <font color=\"" << escapeHtmlText( codec, titleColor.name() ) << "\">\n";
streamOut << " <b>" << escapeHtmlText( codec, title ) << "</b> - <i>" << escapeHtmlText( codec, slideInfos[ i ].slideTitle ) << "</i>\n";
streamOut << " </font>\n </center>\n";
streamOut << "<hr noshade=\"noshade\"" << ( isXML() ?" /":"") << ">" << brtag << "\n";
}
streamOut << " <center>\n ";
if ( (m_bLoopSlides) || (i < slideInfos.count() - 1) )
streamOut << "<a href=\"" << next << "\">";
streamOut << "<img src=\"../pics/slide_" << pgNum << ".png\" border=\"0\" alt=\""
<< i18n( "Slide %1" ).arg( pgNum ) << "\"" << ( isXML() ?" /":"") << ">";
if ( i < slideInfos.count() - 1 )
streamOut << "</a>";
streamOut << "\n";
streamOut << " </center>\n";
if (m_bWriteFooter) {
streamOut << brtag << "<hr noshade=\"noshade\"" << ( isXML() ?" /":"") << ">\n";
QPtrList<KPrPage> _tmpList( doc->getPageList() );
QString note ( escapeHtmlText( codec, _tmpList.at(i)->noteText() ) );
if ( !note.isEmpty() ) {
streamOut << " <b>" << escapeHtmlText( codec, i18n( "Note" ) ) << "</b>\n";
streamOut << " <blockquote>\n";
streamOut << note.replace( "\n", brtag );
streamOut << " </blockquote><hr noshade=\"noshade\"" << ( isXML() ?" /":"") << ">\n";
}
streamOut << " <center>\n";
QString htmlAuthor;
if (email.isEmpty())
htmlAuthor=escapeHtmlText( codec, author );
else
htmlAuthor=QString("<a href=\"mailto:%1\">%2</a>").arg( escapeHtmlText( codec, email )).arg( escapeHtmlText( codec, author ));
streamOut << EscapeEncodingOnly ( codec, i18n( "Created on %1 by <i>%2</i> with <a href=\"http://www.koffice.org/kpresenter\">KPresenter</a>" )
.arg( KGlobal::locale()->formatDate ( QDate::currentDate() ) ).arg( htmlAuthor ) );
streamOut << " </center><hr noshade=\"noshade\"" << ( isXML() ?" /":"") << ">\n";
}
streamOut << "</body>\n</html>\n";
file.close();
KIO::NetAccess::file_move( tmp.name(), dest, -1, true /*overwrite*/);
int p = progressBar->progress();
progressBar->setProgress( ++p );
kapp->processEvents();
}
}
void KPrWebPresentation::createMainPage( KProgress *progressBar )
{
QTextCodec *codec = KGlobal::charsets()->codecForName( m_encoding );
KTempFile tmp;
QString dest = QString( "%1/index.html" ).arg( path );
QFile file( tmp.name() );
file.open( IO_WriteOnly );
QTextStream streamOut( &file );
streamOut.setCodec( codec );
writeStartOfHeader( streamOut, codec, i18n("Table of Contents"), QString() );
streamOut << "</head>\n";
streamOut << "<body bgcolor=\"" << backColor.name() << "\" text=\"" << textColor.name() << "\">\n";
streamOut << "<h1 align=\"center\"><font color=\"" << titleColor.name()
<< "\">" << title << "</font></h1>";
streamOut << "<p align=\"center\"><a href=\"html/slide_1.html\">";
streamOut << i18n("Click here to start the Slideshow");
streamOut << "</a></p>\n";
streamOut << "<p><b>" << i18n("Table of Contents") << "</b></p>\n";
// create list of slides (with proper link)
streamOut << "<ol>\n";
for ( unsigned int i = 0; i < slideInfos.count(); i++ )
streamOut << " <li><a href=\"html/slide_" << i+1 << ".html\">" << slideInfos[ i ].slideTitle << "</a></li>\n";
streamOut << "</ol>\n";
// footer: author name, e-mail
QString htmlAuthor = email.isEmpty() ? escapeHtmlText( codec, author ) :
QString("<a href=\"mailto:%1\">%2</a>").arg( escapeHtmlText( codec, email )).arg( escapeHtmlText( codec, author ));
streamOut << EscapeEncodingOnly ( codec, i18n( "Created on %1 by <i>%2</i> with <a href=\"http://www.koffice.org/kpresenter\">KPresenter</a>" )
.arg( KGlobal::locale()->formatDate ( QDate::currentDate() ) ).arg( htmlAuthor ) );
streamOut << "</body>\n</html>\n";
file.close();
KIO::NetAccess::file_move( tmp.name(), dest, -1, true /*overwrite*/);
progressBar->setProgress( progressBar->totalSteps() );
kapp->processEvents();
}
void KPrWebPresentation::init()
{
KoDocumentInfo * info = doc->documentInfo();
KoDocumentInfoAuthor * authorPage = static_cast<KoDocumentInfoAuthor *>(info->page( "author" ));
if ( !authorPage )
kdWarning() << "Author information not found in documentInfo !" << endl;
else
{
author = authorPage->fullName();
email = authorPage->email();
}
title = i18n("Slideshow");
kdDebug(33001) << "KPrWebPresentation::init : " << doc->getPageNums() << " pages." << endl;
for ( unsigned int i = 0; i < doc->getPageNums(); i++ )
{
if ( doc->isSlideSelected( i ) )
{
SlideInfo info;
info.pageNumber = i;
info.slideTitle = doc->pageList().at(i)->pageTitle();
slideInfos.append( info );
}
}
if ( slideInfos.isEmpty() )
kdWarning() << "No slides selected!" << endl;
backColor = Qt::white;
textColor = Qt::black;
titleColor = Qt::red;
path = KGlobalSettings::documentPath() + "www";
zoom = 100;
timeBetweenSlides = 0;
m_encoding = QTextCodec::codecForLocale()->name();
}
KPrWebPresentationWizard::KPrWebPresentationWizard( const QString &_config, KPrDocument *_doc,
KPrView *_view )
: KWizard( 0, "", false ), config( _config ), webPres( config, _doc, _view )
{
doc = _doc;
view = _view;
setupPage1();
setupPage2();
setupPage3();
setupPage4();
setupPage5();
connect( nextButton(), SIGNAL( clicked() ), this, SLOT( pageChanged() ) );
connect( backButton(), SIGNAL( clicked() ), this, SLOT( pageChanged() ) );
connect( finishButton(), SIGNAL( clicked() ), this, SLOT( finish() ) );
}
KPrWebPresentationWizard::~KPrWebPresentationWizard()
{
view->enableWebPres();
}
void KPrWebPresentationWizard::createWebPresentation( const QString &_config, KPrDocument *_doc,
KPrView *_view )
{
KPrWebPresentationWizard *dlg = new KPrWebPresentationWizard( _config, _doc, _view );
dlg->setCaption( i18n( "Create HTML Slideshow Wizard" ) );
dlg->show();
}
void KPrWebPresentationWizard::setupPage1()
{
page1 = new QHBox( this );
QWhatsThis::add( page1, i18n("This page allows you to specify some of the key"
" values for how your presentation will be shown"
" in HTML. Select individual items for more help"
" on what they do.") );
page1->setSpacing( KDialog::spacingHint() );
page1->setMargin( KDialog::marginHint() );
QLabel* sidebar = new QLabel( page1 );
sidebar->setMinimumSize( 106, 318 );
sidebar->setMaximumSize( 106, 318 );
sidebar->setFrameShape( QFrame::Panel );
sidebar->setFrameShadow( QFrame::Sunken );
sidebar->setPixmap(locate("data", "kpresenter/pics/webslideshow-sidebar.png"));
QWidget* canvas = new QWidget( page1 );
QGridLayout *layout = new QGridLayout( canvas, 7, 2,
KDialog::marginHint(), KDialog::spacingHint() );
QLabel *helptext = new QLabel( canvas );
helptext->setAlignment( Qt::WordBreak | Qt::AlignTop| Qt::AlignLeft );
helptext->setText( i18n( "Enter your name, email address and "
"the title of the web presentation. "
"Also enter the output directory where the "
"web presentation should be saved. " ) );
layout->addMultiCellWidget( helptext, 0, 0, 0, 1 );
layout->addMultiCell( new QSpacerItem( 1, 50 ), 1, 1, 0, 1 );
QLabel *label1 = new QLabel( i18n("Author:"), canvas );
label1->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
QWhatsThis::add( label1, i18n("This is where you enter the name of the person or "
"organization that should be named as the author of "
"the presentation.") );
layout->addWidget( label1, 2, 0 );
QLabel *label2 = new QLabel( i18n("Title:"), canvas );
label2->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
QWhatsThis::add( label2, i18n("This is where you enter the title of the overall "
"presentation." ) );
layout->addWidget( label2, 3, 0 );
QLabel *label3 = new QLabel( i18n("Email address:"), canvas );
label3->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
QWhatsThis::add( label3, i18n("This is where you enter the email address of the "
"person or organization that is responsible for "
"the presentation.") );
layout->addWidget( label3, 4, 0 );
QLabel *label4 = new QLabel( i18n("Path:"), canvas );
label4->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
QWhatsThis::add( label4, i18n("The value entered for the path is the directory "
"where the presentation will be saved. If it does "
"not exist, you'll be asked if you want to create "
"the directory or abort the creation.") );
layout->addWidget( label4, 5, 0 );
author = new KLineEdit( webPres.getAuthor(), canvas );
QWhatsThis::add( author, i18n("This is where you enter the name of the person or "
"organization that should be named as the author of "
"the presentation.") );
layout->addWidget( author, 2, 1 );
title = new KLineEdit( webPres.getTitle(), canvas );
QWhatsThis::add( title, i18n("This is where you enter the title of the overall "
"presentation." ) );
layout->addWidget( title, 3, 1 );
email = new KLineEdit( webPres.getEmail(), canvas );
QWhatsThis::add( email, i18n("This is where you enter the email address of the "
"person or organization that is responsible for "
"the presentation.") );
layout->addWidget( email, 4, 1 );
path=new KURLRequester( canvas );
path->setMode( KFile::Directory);
path->lineEdit()->setText(webPres.getPath());
QWhatsThis::add( path, i18n("The value entered for the path is the directory "
"where the presentation will be saved. If it does "
"not exist, you'll be asked if you want to create "
"the directory or abort the creation.") );
layout->addWidget( path, 5, 1 );
QSpacerItem* spacer = new QSpacerItem( 1, 10,
QSizePolicy::Minimum, QSizePolicy::Expanding );
layout->addMultiCell( spacer, 6, 6, 0, 1 );
connect(path, SIGNAL(textChanged(const QString&)),
this,SLOT(slotChoosePath(const QString&)));
connect(path, SIGNAL(urlSelected( const QString& )),
this,SLOT(slotChoosePath(const QString&)));
addPage( page1, i18n( "Step 1: General Information" ) );
setHelpEnabled(page1, false); //doesn't do anything currently
}
void KPrWebPresentationWizard::setupPage2()
{
page2 = new QHBox( this );
QWhatsThis::add( page2, i18n("This page allows you to specify how the HTML "
"for your presentation will be displayed. Select "
"individual items for more help on what they do.") );
page2->setSpacing( KDialog::spacingHint() );
page2->setMargin( KDialog::marginHint() );
QLabel* sidebar = new QLabel( page2 );
sidebar->setMinimumSize( 106, 318 );
sidebar->setMaximumSize( 106, 318 );
sidebar->setFrameShape( QFrame::Panel );
sidebar->setFrameShadow( QFrame::Sunken );
sidebar->setPixmap(locate("data", "kpresenter/pics/webslideshow-sidebar.png"));
QWidget* canvas = new QWidget( page2 );
QGridLayout *layout = new QGridLayout( canvas, 6, 2,
KDialog::marginHint(), KDialog::spacingHint() );
QLabel *helptext = new QLabel( canvas );
helptext->setAlignment( Qt::WordBreak | Qt::AlignVCenter| Qt::AlignLeft );
QString help = i18n("Here you can configure the style of the web pages.");
help += i18n( "You can also specify the zoom for the slides." );
helptext->setText(help);
layout->addMultiCellWidget( helptext, 0, 0, 0, 1 );
layout->addMultiCell( new QSpacerItem( 1, 50 ), 1, 1, 0, 1 );
QLabel *label1 = new QLabel( i18n("Zoom:"), canvas );
label1->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
QWhatsThis::add( label1, i18n( "This selection allows you to specify "
"the size of the slide image." ) );
layout->addWidget( label1, 2, 0 );
QLabel *label2 = new QLabel( i18n( "Encoding:" ), canvas );
label2->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
layout->addWidget( label2, 3, 0 );
QLabel *label3 = new QLabel( i18n( "Document type:" ), canvas );
label3->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
layout->addWidget( label3, 4, 0 );
zoom = new KIntNumInput( webPres.getZoom(), canvas );
QWhatsThis::add( zoom, i18n( "This selection allows you to specify "
"the size of the slide image." ) );
layout->addWidget( zoom, 2, 1 );
zoom->setSuffix( " %" );
zoom->setRange( 25, 1000, 5 );
encoding = new KComboBox( false, canvas );
layout->addWidget( encoding, 3, 1 );
// Fill encoding combo
// Stolen from kdelibs/kate/part/katedialogs.cpp
QStringList encodings(KGlobal::charsets()->descriptiveEncodingNames());
int idx = 0;
for (uint i = 0; i < encodings.count(); i++)
{
bool found = false;
QTextCodec *codecForEnc = KGlobal::charsets()->codecForName(KGlobal::charsets()->encodingForName(encodings[i]), found);
if (found)
{
encoding->insertItem(encodings[i]);
if ( codecForEnc->name() == webPres.getEncoding() )
encoding->setCurrentItem(idx);
idx++;
}
}
doctype = new KComboBox( false, canvas );
layout->addWidget( doctype, 4, 1 );
doctype->insertItem( "HTML 4.01", -1 );
doctype->insertItem( "XHTML 1.0", -1 );
doctype->setCurrentItem( webPres.isXML() ? 1 : 0 );
QSpacerItem* spacer = new QSpacerItem( 1, 10,
QSizePolicy::Minimum, QSizePolicy::Expanding );
layout->addMultiCell( spacer, 5, 5, 0, 1 );
addPage( page2, i18n( "Step 2: Configure HTML" ) );
setHelpEnabled(page2, false); //doesn't do anything currently
}
void KPrWebPresentationWizard::setupPage3()
{
page3 = new QHBox( this );
QWhatsThis::add( page3, i18n("This page allows you to specify the colors for "
"your presentation display. Select individual "
"items for more help on what they do.") );
page3->setSpacing( KDialog::spacingHint() );
page3->setMargin( KDialog::marginHint() );
QLabel* sidebar = new QLabel( page3 );
sidebar->setMinimumSize( 106, 318 );
sidebar->setMaximumSize( 106, 318 );
sidebar->setFrameShape( QFrame::Panel );
sidebar->setFrameShadow( QFrame::Sunken );
sidebar->setPixmap(locate("data", "kpresenter/pics/webslideshow-sidebar.png"));
QWidget* canvas = new QWidget( page3 );
QGridLayout *layout = new QGridLayout( canvas, 6, 2,
KDialog::marginHint(), KDialog::spacingHint() );
QLabel *helptext = new QLabel( canvas );
helptext->setAlignment( Qt::WordBreak | Qt::AlignVCenter| Qt::AlignLeft );
helptext->setText( i18n( "Now you can customize the colors of the web pages." ) );
layout->addMultiCellWidget( helptext, 0, 0, 0, 1 );
layout->addMultiCell( new QSpacerItem( 1, 50 ), 1, 1, 0, 1 );
QLabel *label1 = new QLabel( i18n("Text color:"), canvas );
label1->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
layout->addWidget( label1, 2, 0 );
QLabel *label2 = new QLabel( i18n("Title color:"), canvas );
label2->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
layout->addWidget( label2, 3, 0 );
QLabel *label3 = new QLabel( i18n("Background color:"), canvas );
label3->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
layout->addWidget( label3, 4, 0 );
textColor = new KColorButton( webPres.getTextColor(), canvas );
layout->addWidget( textColor, 2, 1 );
titleColor = new KColorButton( webPres.getTitleColor(), canvas );
layout->addWidget( titleColor, 3, 1 );
backColor = new KColorButton( webPres.getBackColor(), canvas );
layout->addWidget( backColor, 4, 1 );
QSpacerItem* spacer = new QSpacerItem( 1, 10,
QSizePolicy::Minimum, QSizePolicy::Expanding );
layout->addMultiCell( spacer, 5, 5, 0, 1 );
addPage( page3, i18n( "Step 3: Customize Colors" ) );
setHelpEnabled(page3, false); //doesn't do anything currently
}
void KPrWebPresentationWizard::setupPage4()
{
page4 = new QHBox( this );
QWhatsThis::add( page4, i18n("This page allows you to modify the titles of "
"each slide, if required. You normally do not need "
"to do this, but it is available if required.") );
page4->setSpacing( KDialog::spacingHint() );
page4->setMargin( KDialog::marginHint() );
QLabel* sidebar = new QLabel( page4 );
sidebar->setMinimumSize( 106, 318 );
sidebar->setMaximumSize( 106, 318 );
sidebar->setFrameShape( QFrame::Panel );
sidebar->setFrameShadow( QFrame::Sunken );
sidebar->setPixmap(locate("data", "kpresenter/pics/webslideshow-sidebar.png"));
QWidget* canvas = new QWidget( page4 );
QGridLayout *layout = new QGridLayout( canvas, 3, 2,
KDialog::marginHint(), KDialog::spacingHint() );
QLabel *helptext = new QLabel( canvas );
helptext->setAlignment( Qt::WordBreak | Qt::AlignVCenter| Qt::AlignLeft );
helptext->setText( i18n( "Here you can specify titles for "
"each slide. Click on a slide in "
"the list and then enter the title "
"in the textbox below. If you "
"click on a title, KPresenter "
"mainview will display the slide.") );
layout->addMultiCellWidget( helptext, 0, 0, 0, 1 );
QLabel *label = new QLabel( i18n( "Slide title:" ), canvas );
label->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
layout->addWidget( label, 1, 0 );
slideTitle = new KLineEdit( canvas );
layout->addWidget( slideTitle, 1, 1 );
connect( slideTitle, SIGNAL( textChanged( const QString & ) ), this,
SLOT( slideTitleChanged( const QString & ) ) );
slideTitles = new KListView( canvas );
layout->addMultiCellWidget( slideTitles, 2, 2, 0, 1 );
slideTitles->addColumn( i18n( "No." ) );
slideTitles->addColumn( i18n( "Slide Title" ) );
connect( slideTitles, SIGNAL( selectionChanged( QListViewItem * ) ), this,
SLOT( slideTitleChanged( QListViewItem * ) ) );
slideTitles->setSorting( -1 );
slideTitles->setAllColumnsShowFocus( true );
slideTitles->setResizeMode( QListView::LastColumn );
slideTitles->header()->setMovingEnabled( false );
QValueList<KPrWebPresentation::SlideInfo> infos = webPres.getSlideInfos();
for ( int i = infos.count() - 1; i >= 0; --i ) {
KListViewItem *item = new KListViewItem( slideTitles );
item->setText( 0, QString::number( i + 1 ) );
//kdDebug(33001) << "KPrWebPresentationWizard::setupPage3 " << infos[ i ].slideTitle << endl;
item->setText( 1, infos[ i ].slideTitle );
}
slideTitles->setSelected( slideTitles->firstChild(), true );
addPage( page4, i18n( "Step 4: Customize Slide Titles" ) );
setHelpEnabled(page4, false); //doesn't do anything currently
}
void KPrWebPresentationWizard::setupPage5()
{
page5 = new QHBox( this );
QWhatsThis::add( page5, i18n("This page allows you to specify some options for "
"presentations which run unattended, such as time "
"elapsed before advancing to the next slide, looping "
"and the presence of headers. If you do not want "
"an unattended presentation, just leave defaults unchanged.") );
page5->setSpacing( KDialog::spacingHint() );
page5->setMargin( KDialog::marginHint() );
QLabel* sidebar = new QLabel( page5 );
sidebar->setMinimumSize( 106, 318 );
sidebar->setMaximumSize( 106, 318 );
sidebar->setFrameShape( QFrame::Panel );
sidebar->setFrameShadow( QFrame::Sunken );
sidebar->setPixmap(locate("data", "kpresenter/pics/webslideshow-sidebar.png"));
QWidget* canvas = new QWidget( page5 );
QGridLayout *layout = new QGridLayout( canvas, 6, 2,
KDialog::marginHint(), KDialog::spacingHint() );
QLabel *helptext = new QLabel( canvas );
helptext->setAlignment( Qt::WordBreak | Qt::AlignVCenter| Qt::AlignLeft );
QString help = i18n("Here you can configure some options for unattended "
"presentations, such as time elapsed before automatically advance to "
"the next slide, looping and the presence of headers.");
helptext->setText(help);
layout->addMultiCellWidget( helptext, 0, 0, 0, 1 );
layout->addMultiCell( new QSpacerItem( 1, 50 ), 1, 1, 0, 1 );
QLabel *label1 = new QLabel( i18n("Advance after:"), canvas );
label1->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
QWhatsThis::add( label1, i18n( "This selection allows you to specify "
"the time between slides." ) );
layout->addWidget( label1, 2, 0 );
timeBetweenSlides = new KIntNumInput( webPres.getTimeBetweenSlides(), canvas );
timeBetweenSlides->setSpecialValueText(i18n( "Disabled" ));
QWhatsThis::add( timeBetweenSlides, i18n( "This selection allows you to specify "
"the time between slides." ) );
layout->addWidget( timeBetweenSlides, 2, 1 );
timeBetweenSlides->setSuffix( " seconds" );
timeBetweenSlides->setRange( 0, 900, 1 );
layout->addMultiCell( new QSpacerItem( 1, 10 ), 1, 1, 0, 1 );
writeHeader=new QCheckBox( i18n("Write header to the slides"), canvas);
QWhatsThis::add( writeHeader, i18n( "This checkbox allows you to specify if you "
"want to write the navigation buttons on top "
"of the slide." ) );
writeHeader->setChecked( webPres.wantHeader() );
layout->addWidget( writeHeader, 3, 1);
writeFooter=new QCheckBox( i18n("Write footer to the slides"), canvas);
QWhatsThis::add( writeFooter, i18n( "This checkbox allows you to specify if you "
"want to write an imprint consisting on the author "
"and the software used to create these slides." ) );
writeFooter->setChecked( webPres.wantFooter() );
layout->addWidget( writeFooter, 4, 1);
loopSlides=new QCheckBox( i18n("Loop presentation"), canvas);
QWhatsThis::add( loopSlides, i18n( "This checkbox allows you to specify if you "
"want the presentation to start again once "
"the latest slide is reached." ) );
loopSlides->setChecked( webPres.wantLoopSlides() );
layout->addWidget( loopSlides, 5, 1);
QSpacerItem* spacer = new QSpacerItem( 1, 10,
QSizePolicy::Minimum, QSizePolicy::Expanding );
layout->addMultiCell( spacer, 5, 5, 0, 1 );
addPage( page5, i18n( "Step 5: Options for Unattended Presentations" ) );
setHelpEnabled(page5, false); //doesn't do anything currently
setFinish( page5, true );
}
void KPrWebPresentationWizard::finish()
{
webPres.setAuthor( author->text() );
webPres.setEMail( email->text() );
webPres.setTitle( title->text() );
QListViewItemIterator it( slideTitles );
for ( ; it.current(); ++it )
webPres.setSlideTitle( it.current()->text( 0 ).toInt() - 1, it.current()->text( 1 ) );
webPres.setBackColor( backColor->color() );
webPres.setTitleColor( titleColor->color() );
webPres.setTextColor( textColor->color() );
webPres.setPath( path->lineEdit()->text() );
webPres.setZoom( zoom->value() );
webPres.setTimeBetweenSlides( timeBetweenSlides->value() );
webPres.setWriteHeader( writeHeader->isChecked() );
webPres.setWriteFooter( writeFooter->isChecked() );
webPres.setLoopSlides( loopSlides->isChecked() );
webPres.setXML( doctype->currentItem() != 0 );
bool found = false;
QTextCodec *codecForEnc = KGlobal::charsets()->codecForName(KGlobal::charsets()->encodingForName(encoding->currentText()), found);
if ( found )
{
webPres.setEncoding( codecForEnc->name() );
}
close();
KPrWebPresentationCreateDialog::createWebPresentation( doc, view, webPres );
}
void KPrWebPresentationWizard::pageChanged()
{
if ( currentPage() != page5 )
{
QString pathname = path->lineEdit()->text();
// path doesn't exist. ask user if it should be created.
if ( !KIO::NetAccess::exists( pathname, true/*write*/,this ) )
{
QString msg = i18n( "<qt>The directory <b>%1</b> does not exist.<br>"
"Do you want create it?</qt>" );
if( KMessageBox::questionYesNo( this, msg.arg( pathname ),
i18n( "Directory Not Found" ) )
== KMessageBox::Yes)
{
bool ok = KIO::NetAccess::mkdir( pathname, this );
if( !ok )
{
KMessageBox::sorry( this,
i18n( "Cannot create directory." ) );
// go back to first step
showPage( page1 );
path->setFocus();
}
}
else
{
// go back to first step
showPage( page1 );
path->setFocus();
}
}
} else
finishButton()->setEnabled( true );
}
void KPrWebPresentationWizard::slideTitleChanged( const QString &s )
{
if ( slideTitles->currentItem() )
slideTitles->currentItem()->setText( 1, s );
}
void KPrWebPresentationWizard::slideTitleChanged( QListViewItem *i )
{
if ( !i ) return;
slideTitle->setText( i->text( 1 ) );
view->skipToPage( i->text( 0 ).toInt() - 1 );
}
void KPrWebPresentationWizard::closeEvent( QCloseEvent *e )
{
view->enableWebPres();
KWizard::closeEvent( e );
}
void KPrWebPresentationWizard::slotChoosePath(const QString &text)
{
webPres.setPath(text);
}
KPrWebPresentationCreateDialog::KPrWebPresentationCreateDialog( KPrDocument *_doc, KPrView *_view,
const KPrWebPresentation &_webPres )
: QDialog( 0, "", false ), webPres( _webPres )
{
doc = _doc;
view = _view;
setupGUI();
}
KPrWebPresentationCreateDialog::~KPrWebPresentationCreateDialog()
{
view->enableWebPres();
}
void KPrWebPresentationCreateDialog::createWebPresentation( KPrDocument *_doc, KPrView *_view,
const KPrWebPresentation &_webPres )
{
KPrWebPresentationCreateDialog *dlg = new KPrWebPresentationCreateDialog( _doc, _view, _webPres );
dlg->setCaption( i18n( "Create HTML Slideshow" ) );
dlg->resize( 400, 300 );
dlg->show();
dlg->start();
}
void KPrWebPresentationCreateDialog::start()
{
setCursor( waitCursor );
initCreation();
createSlidesPictures();
createSlidesHTML();
createMainPage();
setCursor( arrowCursor );
bDone->setEnabled( true );
bSave->setEnabled( true );
}
void KPrWebPresentationCreateDialog::initCreation()
{
QFont f = step1->font(), f2 = step1->font();
f.setBold( true );
step1->setFont( f );
progressBar->setProgress( 0 );
progressBar->setTotalSteps( webPres.initSteps() );
webPres.initCreation( progressBar );
step1->setFont( f2 );
progressBar->setProgress( progressBar->totalSteps() );
}
void KPrWebPresentationCreateDialog::createSlidesPictures()
{
QFont f = step2->font(), f2 = f;
f.setBold( true );
step2->setFont( f );
progressBar->setProgress( 0 );
if ( webPres.slides1Steps() > 0 )
{
progressBar->setTotalSteps( webPres.slides1Steps() );
webPres.createSlidesPictures( progressBar );
}
step2->setFont( f2 );
progressBar->setProgress( progressBar->totalSteps() );
}
void KPrWebPresentationCreateDialog::createSlidesHTML()
{
QFont f = step3->font(), f2 = step3->font();
f.setBold( true );
step3->setFont( f );
progressBar->setProgress( 0 );
if ( webPres.slides1Steps() > 0 )
{
progressBar->setTotalSteps( webPres.slides1Steps() );
webPres.createSlidesHTML( progressBar );
}
step3->setFont( f2 );
progressBar->setProgress( progressBar->totalSteps() );
}
void KPrWebPresentationCreateDialog::createMainPage()
{
QFont f = step4->font(), f2 = step4->font();
f.setBold( true );
step4->setFont( f );
progressBar->setProgress( 0 );
progressBar->setTotalSteps( webPres.slides1Steps() );
webPres.createMainPage( progressBar );
step4->setFont( f2 );
progressBar->setProgress( progressBar->totalSteps() );
}
void KPrWebPresentationCreateDialog::setupGUI()
{
back = new QVBox( this );
back->setMargin( KDialog::marginHint() );
QFrame *line;
line = new QFrame( back );
line->setFrameStyle( QFrame::HLine | QFrame::Sunken );
line->setMaximumHeight( 20 );
step1 = new QLabel( i18n( "Initialize (create file structure, etc.)" ), back );
step2 = new QLabel( i18n( "Create Pictures of the Slides" ), back );
step3 = new QLabel( i18n( "Create HTML Pages for the Slides" ), back );
step4 = new QLabel( i18n( "Create Main Page (Table of Contents)" ), back );
step5 = new QLabel( i18n( "Options for Unattended Presentations" ), back);
line = new QFrame( back );
line->setFrameStyle( QFrame::HLine | QFrame::Sunken );
line->setMaximumHeight( 20 );
progressBar = new KProgress( back );
line = new QFrame( back );
line->setFrameStyle( QFrame::HLine | QFrame::Sunken );
line->setMaximumHeight( 20 );
KButtonBox *bb = new KButtonBox( back );
bSave = bb->addButton( i18n( "Save Configuration..." ) );
bb->addStretch();
bDone = bb->addButton( i18n( "Done" ) );
bSave->setEnabled( false );
bDone->setEnabled( false );
connect( bDone, SIGNAL( clicked() ), this, SLOT( accept() ) );
connect( bSave, SIGNAL( clicked() ), this, SLOT( saveConfig() ) );
}
void KPrWebPresentationCreateDialog::resizeEvent( QResizeEvent *e )
{
QDialog::resizeEvent( e );
back->resize( size() );
}
void KPrWebPresentationCreateDialog::saveConfig()
{
QString filename = webPres.getConfig();
if ( QFileInfo( filename ).exists() )
filename = QFileInfo( filename ).absFilePath();
else
filename = QString::null;
KFileDialog fd (filename, i18n("*.kpweb|KPresenter Web-Presentation (*.kpweb)"),
0/*parent*/, 0/*name*/, true/*modal*/);
fd.setCaption (i18n ("Save Web Presentation Configuration"));
fd.setOperationMode (KFileDialog::Saving);
fd.setMode (KFile::File | KFile::LocalOnly);
if (fd.exec ())
{
webPres.setConfig( fd.selectedFile () );
webPres.saveConfig();
}
}
#include "KPrGradient.h"
#include "KPrWebPresentation.moc"