/*************************************************************************** ksobjectfactory.cpp ------------------- begin : Tue Oct 16 2001 copyright : (C) 2001 by kamil email : kamil@localhost.localdomain ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "ksobjectfactory.h" #include #include #include #include #include #include #include "widgets/qsaxis.h" #include "widgets/qsclegend.h" #include "widgets/qsaxes2d.h" #include "widgets/qsaxes3d.h" #include "widgets/qscurve.h" #include "widgets/qscontour.h" #include "widgets/qsimage.h" #include "widgets/qssurface.h" #include "widgets/qsfigure.h" #include "qscobjects.h" #include "ksworkbook.h" #include "ksmatrix.h" #include "ksglobalmatrixlist.h" //-------------------------------------------------------------// KSObjectFactory::KSObjectFactory( KSWorkbook *workbook ) : QSObjectFactory() { m_workbook = workbook; } //-------------------------------------------------------------// KSObjectFactory::~KSObjectFactory() { } //-------------------------------------------------------------// QSSerializable *KSObjectFactory::loadObjectFromStream( QDataStream& stream, QObject *parent ) { QCString class_name; stream >> class_name; QSSerializable *result = createObject( class_name, parent ); if ( result ) result->loadStateFromStream( stream, this ); return result; } //-------------------------------------------------------------// void KSObjectFactory::saveObjectToStream( QSSerializable *object, QDataStream& stream ) { QSSerializable *new_object = transform_object( object, m_flags ); stream << className( new_object ); if ( new_object ) new_object->saveStateToStream( stream, this ); if ( new_object != object ) delete new_object; } //-------------------------------------------------------------// QCString KSObjectFactory::className( QSSerializable *object ) { QSCObject *cobject = dynamic_cast(object); if ( dynamic_cast(object) ) { return "KSMatrixFormula"; } if ( dynamic_cast< KSMatrixImpl* >(object) ) { return "KSMatrixImpl"; } else if ( dynamic_cast< KSMatrixImpl* >(object) ) { return "KSMatrixImpl"; } else if ( dynamic_cast< KSMatrixImpl* >(object) ) { return "KSMatrixImpl"; } else if ( dynamic_cast< KSMatrixImpl* >(object) ) { return "KSMatrixImpl"; } else if ( dynamic_cast< KSMatrixImpl* >(object) ) { return "KSMatrixImpl"; } else if ( dynamic_cast< KSMatrixImpl* >(object) ) { return "KSMatrixImpl"; } // inherits QSCGroup also else if ( cobject && cobject->isAxesShadow() && dynamic_cast(cobject->parentAxes()) ) { return "QSCAxes2DShadow"; } // inherits QSCGroup also else if ( cobject && cobject->isAxesShadow() && dynamic_cast(cobject->parentAxes()) ) { return "QSCAxes3DShadow"; } else if ( dynamic_cast(object) && dynamic_cast(object)->type() == QSAxis::XAxisType ) { return "QSAxis-X"; } else if ( dynamic_cast(object) && dynamic_cast(object)->type() == QSAxis::YAxisType ) { return "QSAxis-Y"; } else if ( dynamic_cast(object) && dynamic_cast(object)->type() == QSAxis::ZAxisType ) { return "QSAxis-Z"; } else if ( dynamic_cast(object) && dynamic_cast(object)->type() == QSAxis::VAxisType ) { return "QSAxis-V"; } else if ( dynamic_cast(object) ) { return "QSAxis-Unknown"; } else if ( dynamic_cast(object) ) { return "QSCObjectCollection"; } else if ( dynamic_cast(object) ) { return dynamic_cast(object)->metaObject()->className(); } else { return "NULL"; } } //-------------------------------------------------------------// QSSerializable *KSObjectFactory::createObject( const QCString& class_name, QObject *parent ) { if ( class_name == "QSCObjectCollection" ) { // no auto delete return new QSCObjectCollection(parent,false); } if ( class_name == "QSCGroup" ) { return new QSCGroup(); } else if ( class_name == "QSCLegend" ) { return new QSCLegend(dynamic_cast(parent)); } else if ( class_name == "QSCLabel" ) { return new QSCLabel(); } else if ( class_name == "QSCArrow" ) { return new QSCArrow(); } else if ( class_name == "QSCRect" ) { return new QSCRect(); } else if ( class_name == "QSAxes2D" ) { return new QSAxes2D(); } else if ( class_name == "QSAxes3D" ) { return new QSAxes3D(); } else if ( class_name == "QSCAxes2DShadow" ) { QSAxes2D *result = new QSAxes2D(); return result->shadowObject(); } else if ( class_name == "QSCAxes3DShadow" ) { QSAxes3D *result = new QSAxes3D(); return result->shadowObject(); } else if ( class_name == "QSAxis-X" ) { return new QSAxis(QSAxis::XAxisType,dynamic_cast(parent)); } else if ( class_name == "QSAxis-Y" ) { return new QSAxis(QSAxis::YAxisType,dynamic_cast(parent)); } else if ( class_name == "QSAxis-Z" ) { return new QSAxis(QSAxis::ZAxisType,dynamic_cast(parent)); } else if ( class_name == "QSAxis-V" ) { return new QSAxis(QSAxis::VAxisType,dynamic_cast(parent)); } else if ( class_name == "QSAxis-Unknown" ) { return new QSAxis(QSAxis::UnknownAxisType,dynamic_cast(parent)); } else if ( class_name == "QSCurve" ) { return new QSCurve(dynamic_cast(parent)); } else if ( class_name == "QSGriddedContour" ) { return new QSGriddedContour(dynamic_cast(parent)); } else if ( class_name == "QSNonGriddedContour" ) { return new QSNonGriddedContour(dynamic_cast(parent)); } else if ( class_name == "QSImage" ) { return new QSImage(dynamic_cast(parent)); } else if ( class_name == "QSSurface" ) { return new QSSurface(dynamic_cast(parent)); } else if ( class_name == "QSFigure" ) { return new QSFigure(dynamic_cast(parent)); } else if ( class_name == "KSMatrixString" ) { return new KSMatrixString(); } else if ( class_name == "KSMatrixFormula" ) { return new KSMatrixFormula(); } else if ( class_name == "KSMatrixWorksheetCellRange" ) { return new KSMatrixWorksheetCellRange( m_workbook ); } else if ( class_name == "KSMatrixImpl" ) { return KSMatrix::create( EDouble ); } else if ( class_name == "KSMatrixImpl" ) { return KSMatrix::create( EFloat ); } else if ( class_name == "KSMatrixImpl" ) { return KSMatrix::create( ELong ); } else if ( class_name == "KSMatrixImpl" ) { return KSMatrix::create( EUShort ); } else if ( class_name == "KSMatrixImpl" ) { return KSMatrix::create( EShort ); } else if ( class_name == "KSMatrixImpl" ) { return KSMatrix::create( EUChar ); } else if ( class_name == "KSSheet" ) { return new KSSheet( dynamic_cast(parent) ); } return NULL; } //-------------------------------------------------------------// void KSObjectFactory::copyToClipboard( QSSerializable *object, const QCString& format ) { if ( object ) { QBuffer buffer; buffer.open( IO_WriteOnly ); QDataStream data_stream( &buffer ); saveObjectToStream( object, data_stream ); QStoredDrag *drag = new QStoredDrag( format ); drag->setEncodedData( buffer.buffer() ); QApplication::clipboard()->setData(drag); } } //-------------------------------------------------------------// QSSerializable *KSObjectFactory::pasteFromClipboard( const QCString& format, QObject *parent ) { QMimeSource *src = QApplication::clipboard()->data(); QBuffer buffer( src->encodedData(format) ); buffer.open( IO_ReadOnly ); QDataStream data_stream( &buffer ); return loadObjectFromStream( data_stream, parent ); } //-------------------------------------------------------------// void KSObjectFactory::copyQSCObjectToClipboard( QSCObject *object ) { copyToClipboard( object, "application/x-kmatplot-qscobject" ); } //-------------------------------------------------------------// QSCObject *KSObjectFactory::pasteQSCObjectFromClipboard() { QSSerializable *result = pasteFromClipboard( "application/x-kmatplot-qscobject" ); assert( !result || dynamic_cast(result) ); return (QSCObject *)result; } //-------------------------------------------------------------// void KSObjectFactory::copyQSCObjectCollectionToClipboard( QSCObjectCollection *objects ) { copyToClipboard( objects, "application/x-kmatplot-qscobjectcollection" ); } //-------------------------------------------------------------// QSCObjectCollection *KSObjectFactory::pasteQSCObjectCollectionFromClipboard() { QSSerializable *result = pasteFromClipboard( "application/x-kmatplot-qscobjectcollection" ); assert( !result || dynamic_cast(result) ); return (QSCObjectCollection *)result; } //-------------------------------------------------------------// void KSObjectFactory::copyQSPlotToClipboard( QSPlot *dataset ) { copyToClipboard( dataset, "application/x-kmatplot-qsplot" ); } //-------------------------------------------------------------// QSPlot *KSObjectFactory::pasteQSPlotFromClipboard( QSAxes *parentAxes ) { QSSerializable *result = pasteFromClipboard( "application/x-kmatplot-qsplot", parentAxes); assert( !result || dynamic_cast(result) ); return (QSPlot *)result; } //-------------------------------------------------------------// void KSObjectFactory::copyQSAxisToClipboard( QSAxis *axis ) { copyToClipboard( axis, "application/x-kmatplot-qsaxis" ); } //-------------------------------------------------------------// QSAxis *KSObjectFactory::pasteQSAxisFromClipboard( QSAxes *parentAxes ) { QSSerializable *result = pasteFromClipboard( "application/x-kmatplot-qsaxis", parentAxes); assert( !result || dynamic_cast(result) ); return (QSAxis *)result; } //-------------------------------------------------------------// void KSObjectFactory::copyQSMatrixToClipboard( QSMatrix *matrix ) { copyToClipboard( matrix, "application/x-kmatplot-qsmatrix" ); } //-------------------------------------------------------------// QSMatrix *KSObjectFactory::pasteQSMatrixFromClipboard() { QSSerializable *result = pasteFromClipboard( "application/x-kmatplot-qsmatrix" ); assert( !result || dynamic_cast(result) ); return (QSMatrix *)result; } //-------------------------------------------------------------// void KSObjectFactory::copyKSSheetToClipboard( KSSheet *sheet ) { copyToClipboard( sheet, "application/x-kmatplot-kssheet" ); } //-------------------------------------------------------------// KSSheet *KSObjectFactory::pasteKSSheetFromClipboard( KSSheetList *parent ) { QSSerializable *result = pasteFromClipboard( "application/x-kmatplot-kssheet",parent ); assert( !result || dynamic_cast(result) ); return (KSSheet *)result; } //-------------------------------------------------------------// QSMatrix *KSObjectFactory::cloneMatrix( QSMatrix *matrix, bool copy ) { if ( matrix->isString() ) { KSMatrixString *result = new KSMatrixString(); if ( copy ) result->setMatrix( matrix ); return result; } else if ( dynamic_cast(matrix) ) { KSMatrix *result = KSMatrix::create( dynamic_cast(matrix)->type() ); if ( copy ) result->setMatrix( matrix ); return result; } else { KSMatrix *result = KSMatrix::create( EDouble ); if ( copy ) result->setMatrix( matrix ); return result; } return NULL; } //-------------------------------------------------------------// QSSerializable *KSObjectFactory::transform_object( QSSerializable *object, int flags ) { // little hack if ( flags & CopyAllData && dynamic_cast(object) ) return cloneMatrix( (KSMatrixWorksheetCellRange*)object, true ); return object; }