diff options
Diffstat (limited to 'kugar/part/kugar_part.cpp')
-rw-r--r-- | kugar/part/kugar_part.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/kugar/part/kugar_part.cpp b/kugar/part/kugar_part.cpp new file mode 100644 index 00000000..158f26db --- /dev/null +++ b/kugar/part/kugar_part.cpp @@ -0,0 +1,259 @@ +// Copyright (c) 2000 Phil Thompson <phil@river-bank.demon.co.uk> +// +// This file contains the implementation of the Kugar KPart. + + +#include <kapplication.h> +#include <klocale.h> +#include <kstandarddirs.h> +#include <kinstance.h> +#include <kaboutdata.h> +#include <kaction.h> +#include <kstdaction.h> +#include <kmessagebox.h> +#include <kio/netaccess.h> +#include <qfile.h> +#include <kglobal.h> +#include <kiconloader.h> +#include <qwidget.h> +#include <kfiledialog.h> +#include <kdebug.h> +#include <KoStore.h> + +#if defined(HAVE_CONFIG_H) +#include "config.h" +#endif + +#include "kugar_part.h" +#include "kugar_view.h" +#include "kugar_factory.h" + +#include <KoFilterManager.h> + +KugarPart::KugarPart( QWidget *parentWidget, const char *widgetName, + QObject* parent, const char* name, bool singleViewMode ) + : KoDocument( parentWidget, widgetName, parent, name, singleViewMode ), + m_templateOk( false ) +{ + setInstance( KugarFactory::global(), false ); + m_reportEngine = new Kugar::MReportEngine(); + connect( m_reportEngine, SIGNAL( preferedTemplate( const QString & ) ), + SLOT( slotPreferredTemplate( const QString & ) ) ); +} + +KugarPart::~KugarPart() +{ + m_reportEngine->removeRef(); + // closeURL(); +} + +bool KugarPart::loadOasis( const QDomDocument&, KoOasisStyles&, + const QDomDocument&, KoStore* ) +{ + return false; +} + +bool KugarPart::saveOasis( KoStore*, KoXmlWriter* ) +{ + return false; +} + +bool KugarPart::loadXML( QIODevice *file, const QDomDocument & /*doc*/ ) +{ + m_docURL = url(); + bool ok = true; + if ( file ) + { + file->reset(); + m_reportData=QString(file->readAll()); + + if ( m_reportData.length() != 0 ) + { + ok = m_reportEngine->setReportData( m_reportData ); + + if ( m_templateOk ) + { + m_reportEngine->renderReport(); + if ( ok ) + { + QPtrList<KoView> vs = views(); + if ( vs.count() ) + { + for ( KoView * v = vs.first();v;v = vs.next() ) + { + ok = static_cast<KugarView*>( v->qt_cast( "KugarView" ) ) ->renderReport(); + if ( !ok ) + break; + } + } + } + } + if ( !ok ) + KMessageBox::sorry( 0, i18n( "Invalid data file %1" ).arg( m_file ) ); + } + else + { + ok = false; + KMessageBox::sorry( 0, i18n( "The zero sized data file %1 can't be rendered" ).arg( m_file ) ); + } + + } + else + { + ok = false; + KMessageBox::sorry( 0, i18n( "Unable to open data file: %1" ).arg( m_file ) ); + } + + return ok; +} + +bool KugarPart::initDoc( InitDocFlags /*flags*/, QWidget* /*parentWidget*/ ) +{ + QString filename; + bool ok = false; + + KFileDialog *dialog = + new KFileDialog( QString::null, QString::null, 0L, "file dialog", true ); + dialog->setMimeFilter( KoFilterManager::mimeFilter( KoDocument::readNativeFormatMimeType(), + KoFilterManager::Import ) ); + if ( dialog->exec() != QDialog::Accepted ) + { + delete dialog; + return false; + } + + KURL url( dialog->selectedURL() ); + delete dialog; + + if ( url.isEmpty() ) + return false; + + if ( url.isValid() ) + { + ok = openURL( url ); + } + return ok; + + // If nothing is loaded, do initialize here + return TRUE; +} + +KoView* KugarPart::createViewInstance( QWidget* parent, const char* name ) +{ + KugarView * v = new KugarView( this, parent, name ); + if ( m_templateOk ) + v->renderReport(); + return v; +} + + +void KugarPart::slotPreferredTemplate( const QString &tpl ) +{ + KURL url( tpl ); + QString localtpl; + bool isTemp = false; + + if ( !url.isValid() ) + { +/* kdDebug() << "mailformed url" << endl;*/ + if ( tpl.find( '/' ) >= 0 ) + { + if ( tpl.startsWith( "." ) ) + { + KURL tmpURL( m_docURL ); + tmpURL.setFileName( "" ); + tmpURL.addPath( tpl ); + if ( KIO::NetAccess::download( tmpURL, localtpl ) ) + isTemp = true; + else + KMessageBox::sorry( 0, i18n( "Unable to download template file: %1" ).arg( url.prettyURL() ) ); + } + else + localtpl = tpl; + } + else + { + QString former_localtpl = localtpl; + localtpl = kapp -> dirs() -> findResource( "data", "kugar/templates/" + tpl ); + if ( localtpl.isEmpty() ) + { + KURL tmpURL( m_docURL ); + tmpURL.setFileName( "" ); + tmpURL.addPath( tpl ); + if ( KIO::NetAccess::download( tmpURL, localtpl ) ) + isTemp = true; + else + KMessageBox::sorry( 0, i18n( "Unable to download template file: %1" ).arg( url.prettyURL() ) ); + } + } + } + else + { + if ( KIO::NetAccess::download( url, localtpl ) ) + isTemp = true; + else + KMessageBox::sorry( 0, i18n( "Unable to download template file: %1" ).arg( url.prettyURL() ) ); + } + +/* kdDebug() << "localtpl: " << localtpl.latin1() << endl;*/ + if ( !localtpl.isEmpty() ) + { + QFile f( localtpl ); + + if ( f.open( IO_ReadOnly ) ) + { +/* kdDebug() << "localtpl opened" << endl;*/ + // Try to find out whether it is a mime multi part file + char buf[ 5 ]; + if ( f.readBlock( buf, 4 ) == 4 ) + { + bool isRawXML = ( strncasecmp( buf, "<?xm", 4 ) == 0 ); + f.close(); + + if ( isRawXML ) + { +/* kdDebug() << "RawXML" << endl;*/ + f.open( IO_ReadOnly ); + if ( !m_reportEngine -> setReportTemplate( &f ) ) + KMessageBox::sorry( 0, i18n( "Invalid template file: %1" ).arg( localtpl ) ); + else + { + m_templateOk = true; +/* kdDebug() << "Setting m_templateOk" << endl;*/ + } + f.close(); + } + else + { + KoStore *tmpStore = KoStore::createStore( localtpl, KoStore::Read ); + if ( tmpStore->open( "maindoc.xml" ) ) + { + if ( !m_reportEngine -> setReportTemplate( tmpStore->device() ) ) + KMessageBox::sorry( 0, i18n( "%1 is not a valid Kugar Designer template file." ).arg( localtpl ) ); + else + m_templateOk = true; + tmpStore->close(); + } + else + KMessageBox::sorry( 0, i18n( "%1 is not a valid Kugar Designer template file." ).arg( localtpl ) ); + + delete tmpStore; + } + + } + else + { + f.close(); + KMessageBox::sorry( 0, i18n( "Couldn't read the beginning of the template file: %1" ).arg( localtpl ) ); + } + + } + else + KMessageBox::sorry( 0, i18n( "Unable to open template file: %1" ).arg( localtpl ) ); + + if ( isTemp ) + KIO::NetAccess::removeTempFile( localtpl ); + } +} + +#include "kugar_part.moc" |