summaryrefslogtreecommitdiffstats
path: root/filters/kspread/qpro/qproimport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'filters/kspread/qpro/qproimport.cpp')
-rw-r--r--filters/kspread/qpro/qproimport.cpp263
1 files changed, 263 insertions, 0 deletions
diff --git a/filters/kspread/qpro/qproimport.cpp b/filters/kspread/qpro/qproimport.cpp
new file mode 100644
index 000000000..e282a7698
--- /dev/null
+++ b/filters/kspread/qpro/qproimport.cpp
@@ -0,0 +1,263 @@
+
+/* This file is part of the KDE project
+ Copyright (C) 2001 Graham Short <grahshrt@netscape.net>
+
+ 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 <kdebug.h>
+#include <tdemessagebox.h>
+#include <kgenericfactory.h>
+#include <KoFilterChain.h>
+
+#include <kspread_doc.h>
+#include <kspread_sheet.h>
+#include <kspread_cell.h>
+#include <kspread_map.h>
+
+#include <qproimport.h>
+
+#include <qproformula.h>
+#include <qpro/stream.h>
+#include <qpro/record_factory.h>
+#include <tqfile.h>
+
+using namespace KSpread;
+
+typedef KGenericFactory<QpImport, KoFilter> TQPROImportFactory;
+K_EXPORT_COMPONENT_FACTORY( libqproimport, TQPROImportFactory( "kofficefilters" ) )
+
+// ---------------------------------------------------------------
+
+QpTableList::QpTableList()
+{
+ for( int lIdx=0; lIdx<cNameCnt; ++lIdx )
+ {
+ cTable[lIdx] = 0;
+ }
+}
+
+QpTableList::~QpTableList()
+{
+ // don't delete the list of tables
+}
+
+
+void
+QpTableList::table(unsigned pIdx, Sheet* pTable)
+{
+ if(pIdx < cNameCnt)
+ {
+ cTable[pIdx] = pTable;
+ }
+}
+
+Sheet*
+QpTableList::table(unsigned pIdx)
+{
+ return (pIdx < cNameCnt ? cTable[pIdx] : 0);
+}
+
+
+// ---------------------------------------------------------------
+
+QpImport::QpImport( KoFilter*, const char*, const TQStringList& )
+ : KoFilter()
+{
+//cout << "Hooray - in QpImport::QpImport" << endl; // ???
+}
+
+void
+QpImport::InitTableName(int pIdx, TQString& pResult)
+{
+ if( pIdx < 26 )
+ {
+ pResult = (char)('A' + pIdx);
+ }
+ else
+ {
+ pResult = (char)('A' -1 + pIdx / 26);
+ pResult += (char)('A' + pIdx % 26);
+ }
+}
+
+KoFilter::ConversionStatus QpImport::convert( const TQCString& from, const TQCString& to )
+{
+ bool bSuccess=true;
+
+ KoDocument* document = m_chain->outputDocument();
+ if ( !document )
+ return KoFilter::StupidError;
+
+ kdDebug(30523) << "here we go... " << document->className() << endl;
+
+ if( !::tqqt_cast<const KSpread::Doc *>( document ) ) // it's safer that way :)
+ {
+ kdWarning(30501) << "document isn't a KSpread::Doc but a " << document->className() << endl;
+ return KoFilter::NotImplemented;
+ }
+ if(from!="application/x-quattropro" || to!="application/x-kspread")
+ {
+ kdWarning(30501) << "Invalid mimetypes " << from << " " << to << endl;
+ return KoFilter::NotImplemented;
+ }
+
+ kdDebug(30523) << "...still here..." << endl;
+
+ // No need for a dynamic cast here, since we use TQt's moc magic
+ Doc *ksdoc=(Doc*)document;
+
+ if(ksdoc->mimeType()!="application/x-kspread")
+ {
+ kdWarning(30501) << "Invalid document mimetype " << ksdoc->mimeType() << endl;
+ return KoFilter::NotImplemented;
+ }
+
+ QpIStream lIn( TQFile::encodeName(m_chain->inputFile()) );
+
+ if( !lIn )
+ {
+ KMessageBox::sorry( 0L, i18n("QPRO filter cannot open input file - please report.") );
+ return KoFilter::FileNotFound;
+ }
+
+ Sheet *table=0;
+
+ TQString field;
+ int value=0;
+ emit sigProgress(value);
+
+ QpRecFactory lFactory(lIn);
+ QpTableList lTableNames;
+ TQP_UINT8 lPageIdx = 0;
+
+ QpRec* lRec = 0;
+ QpRecBop* lRecBop = 0;
+ QpRecIntegerCell* lRecInt = 0;
+ QpRecFloatingPointCell* lRecFloat = 0;
+ QpRecFormulaCell* lRecFormula = 0;
+ QpRecLabelCell* lRecLabel = 0;
+ QpRecPageName* lRecPageName = 0;
+
+ do
+ {
+ field = "";
+ lRec = lFactory.nextRecord();
+
+ switch( lRec->type() )
+ {
+ case QpBop:
+ lRecBop = (QpRecBop*)lRec;
+ lPageIdx = lRecBop->pageIndex();
+
+ // find out if we know about this table already, if not create it
+ table=lTableNames.table(lPageIdx);
+
+ if( table == 0 )
+ {
+ table=ksdoc->map()->addNewSheet();
+ // set up a default name for the table
+ table->setSheetName( lTableNames.name(lPageIdx)
+ , TRUE
+ );
+ lTableNames.table(lPageIdx, table);
+ }
+ break;
+
+ case QpIntegerCell:
+ lRecInt = (QpRecIntegerCell*)lRec;
+ field.setNum( lRecInt->integer() );
+//cout << "Setting R " << lRecInt->row()+1 << ", C " << ((unsigned)lRecInt->column()) << endl;
+ table->setText( lRecInt->row()+1, ((unsigned)lRecInt->column())+1, field, false );
+ break;
+
+ case QpFormulaCell:
+ lRecFormula = (QpRecFormulaCell*)lRec;
+ {
+ Formula lAnswer(*lRecFormula, lTableNames);
+
+ char* lFormula = lAnswer.formula();
+
+ field = lFormula;
+
+ delete [] lFormula;
+ }
+
+ // check for referenced tables that haven't been created yet
+ for(unsigned lIdx=0; lIdx<lTableNames.cNameCnt; ++lIdx)
+ {
+ if(lTableNames.allocated(lIdx) && (lTableNames.table(lIdx) == 0) )
+ {
+ // we're about to reference a table that hasn't been created yet.
+ // setText gets upset about this, so create a blank table
+
+ Sheet* lNewTable=ksdoc->map()->addNewSheet();
+
+ // set up a default name for the table
+ lNewTable->setSheetName( lTableNames.name(lIdx)
+ , TRUE
+ );
+ lTableNames.table(lIdx, lNewTable);
+ }
+ }
+
+ table->setText( lRecFormula->row()+1, lRecFormula->column()+1, field, false );
+ break;
+
+ case QpFloatingPointCell:
+ lRecFloat = (QpRecFloatingPointCell*)lRec;
+ field.setNum( lRecFloat->value() );
+ table->setText( lRecFloat->row()+1, lRecFloat->column()+1, field, false );
+ break;
+
+ case QpLabelCell:
+ lRecLabel = (QpRecLabelCell*)lRec;
+ field = "'";
+ field += lRecLabel->label();
+ table->setText( lRecLabel->row()+1, lRecLabel->column()+1, field, false );
+ break;
+
+ case QpPageName:
+ lRecPageName = (QpRecPageName*)lRec;
+
+ if( lTableNames.allocated(lPageIdx) && lTableNames.table(lPageIdx) )
+ {
+ lTableNames.table(lPageIdx)->setSheetName( lRecPageName->pageName()
+// , TRUE
+ );
+ lTableNames.name(lPageIdx, lRecPageName->pageName());
+ }
+ break;
+
+ case QpPassword:
+ KMessageBox::sorry( 0L, i18n("Unable to open password protected files.\n"
+ "The password algorithm has not been published")
+ );
+ return KoFilter::NotImplemented;
+ }
+
+ delete lRec;
+ lRec = 0;
+ } while( lIn );
+
+ emit sigProgress(100);
+ if ( bSuccess )
+ return KoFilter::OK;
+ else
+ return KoFilter::StupidError;
+}
+
+#include <qproimport.moc>