diff options
Diffstat (limited to 'filters/kspread/kexi/kspread_kexiimport.cpp')
-rw-r--r-- | filters/kspread/kexi/kspread_kexiimport.cpp | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/filters/kspread/kexi/kspread_kexiimport.cpp b/filters/kspread/kexi/kspread_kexiimport.cpp new file mode 100644 index 000000000..6100dabe3 --- /dev/null +++ b/filters/kspread/kexi/kspread_kexiimport.cpp @@ -0,0 +1,249 @@ +/*************************************************************************** + * Copyright (C) 2006 by Adam Pigg * + * adam@piggz.co.uk * + * * + * Based on insert calendar code: * + * Copyright (C) 2005 by Raphael Langerhorst * + * raphael-langerhorst@gmx.at * + * * + * Permission is hereby granted, free of charge, to any person obtaining * + * a copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, sublicense, and/or sell copies of the Software, and to * + * permit persons to whom the Software is furnished to do so, subject to * + * the following conditions: * + * * + * The above copyright notice and this permission notice shall be * + * included in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.* + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * + * OTHER DEALINGS IN THE SOFTWARE. * + ***************************************************************************/ + +#include "kspread_kexiimport.h" + +#include "kspread_kexiimportdialog.h" + +//KSpread Includes +#include <kspread_view.h> +#include <kspread_doc.h> +//#include <selection.h> +#include <kspread_sheet.h> +#include <kspread_map.h> +#include <kspread_style.h> + +//Koffice Includes +#include <KoFilterChain.h> +#include <KoFilterManager.h> +#include <kofficeversion.h> + +//Kexi Includes +#include <kexidb/cursor.h> +#include <kexidb/connection.h> +#include <kexidb/parser/parser.h> + +//KDE Includes +#include <kgenericfactory.h> +#include <tdelocale.h> +#include <tdemessagebox.h> +#include <tdelistview.h> +#include <tqcolor.h> + +typedef KGenericFactory<KSpreadKexiImport, KoFilter> KSpreadKexiImportFactory; +K_EXPORT_COMPONENT_FACTORY( libkspreadkexiimport, KSpreadKexiImportFactory( "kofficefilters" ) ) + + +//============================================================================= + +KSpreadKexiImport::KSpreadKexiImport(KoFilter *parent, const char *name, const TQStringList&) +{ +} + +//============================================================================= + +KSpreadKexiImport::~KSpreadKexiImport() +{ + delete m_dialog; +} + +//============================================================================= + +KoFilter::ConversionStatus KSpreadKexiImport::convert( const TQCString& from, const TQCString& to ) +{ + TQPtrList<TQListViewItem> objects; + TQString file( m_chain->inputFile() ); + + //Create dialog + m_dialog = new KSpreadKexiImportDialog(); + + m_dialog->openDatabase( file, 0); + if (!m_dialog->exec()) + { + return KoFilter::UserCancelled; + } + + objects = m_dialog->selectedItems(); + + kdDebug() << "Getting Documents..." << endl; + + KoDocument* document = m_chain->outputDocument(); + + if ( !document ) + return KoFilter::StupidError; + + kdDebug() << "here we go... " << document->className() << endl; + + if ( !::tqqt_cast<const KSpread::Doc *>( document ) ) + { + kdWarning() << "document isn't a KSpread::Doc but a " << document->className() << endl; + return KoFilter::NotImplemented; + } + if(from!="application/x-kexiproject-sqlite3" || to!="application/x-kspread") + { + kdWarning() << "Invalid mimetypes " << from << " " << to << endl; + return KoFilter::NotImplemented; + } + + ksdoc = static_cast<KSpread::Doc *>( document ); // type checked above + + if(ksdoc->mimeType()!="application/x-kspread") + { + kdWarning() << "Invalid document mimetype " << ksdoc->mimeType() << endl; + return KoFilter::NotImplemented; + } + + document->emitBeginOperation(); + + TQListViewItem *itm; + for(itm = objects.first(); itm ; itm = objects.next()) + { + if (!insertObject(itm->text(1), itm->text(0))) + { + return KoFilter::StupidError; + } + } + if (m_dialog->customQuery()) + { + if (!insertObject(m_dialog->customQueryString(), "Custom")) + { + return KoFilter::StupidError; + } + } + + document->emitEndOperation(); + kdDebug() << "inserting kexi data completed" << endl; + return KoFilter::OK; +} + +bool KSpreadKexiImport::insertObject(const TQString& object, const TQString& type) +{ + TQStringList fieldNames; + KSpread::Sheet *sheet; + KexiDB::Parser *parser; + KexiDB::QuerySchema *query; + + sheet = ksdoc->map()->addNewSheet(); + if (!sheet) + { + KMessageBox::error(NULL, i18n("Cant find sheet"), i18n("Error")); + return false; + } + + if (type == "Custom") + { + sheet->setSheetName("Custom"); + } + else + { + sheet->setSheetName(object); + } + + //Get the field names + if (type == "Table") + { + fieldNames = m_dialog->connection()->tableSchema(object)->names(); + } + else if (type == "Query") + { + //Note....for queries such as select * from....field names are not available + fieldNames = m_dialog->connection()->querySchema(object)->names(); + } + else if (type == "Custom") //Custom Query + { + parser = new KexiDB::Parser(m_dialog->connection()); + parser->parse( object ); + + if (parser->operation() != KexiDB::Parser::OP_Select) + { + KMessageBox::error(NULL, i18n("Your query was invalid or not a SELECT query"), i18n("Error")); + return false; + } + query = parser->query(); + fieldNames = query->names(); + } + + //Insert the field headings + TQStringList::iterator it; + int i = 1; + for (it = fieldNames.begin(); it != fieldNames.end(); ++it, ++i) + { + KSpread::Cell *c = sheet->nonDefaultCell(i ,1); + c->setCellText(*it, true); + c->format()->setBgColor(TQColor(200,200,200)); + c->format()->setTextFontBold(true); + } + + //Insert the data + KexiDB::Cursor *cur; + if (type == "Table") //Table + { + cur = m_dialog->connection()->executeQuery( *(m_dialog->connection()->tableSchema(object))); + } + else if (type == "Query") //Query + { + cur = m_dialog->connection()->executeQuery( *(m_dialog->connection()->querySchema(object))); + } + else if (type == "Custom") //Custom Query + { + cur = m_dialog->connection()->executeQuery( *query ); + } + else + { + cur = 0; + } + + if (!cur) + { + KMessageBox::error(NULL, i18n("Error executing query"), i18n("Error")); + return false; + } + + cur->moveFirst(); + int j = cur->fieldCount(); + + unsigned int k = 2; //start on row 2 + bool asText = false; + + if(m_dialog->conversion() == 2) + asText = true; + + while (!cur->eof()) + { + for (i = 0; i < j; ++i) + { + sheet->nonDefaultCell(i+1 ,k)->setCellText(cur->value(i).toString(), asText); + } + + kdDebug() << k << endl; + cur->moveNext(); + ++k; + } + return true; +} +#include "kspread_kexiimport.moc" |