/* ************************************************************************** description -------------------- copyright : (C) 2000-2003 by Andreas Zehender email : zehender@kde.org ************************************************************************** ************************************************************************** * * * 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 "pmobjectdrag.h" #include "pmobject.h" #include "pmpart.h" #include "pmpovrayparser.h" #include "pmxmlparser.h" #include "pmxmlhelper.h" #include "pmdocumentformat.h" #include "pmiomanager.h" #include "pmserializer.h" #include #include const char* const c_kpmDocumentMimeFormat = "application/x-kpovmodeler"; PMObjectDrag::PMObjectDrag( PMPart* part, PMObject* object, TQWidget* dragSource, const char* name ) : TQDragObject( dragSource, name ) { TQByteArray modelerData; TQTextStream s2( modelerData, IO_WriteOnly ); TQDomDocument doc( "KPOVMODELER" ); TQDomElement top = doc.createElement( "objects" ); doc.appendChild( top ); top.setAttribute( "majorFormat", c_majorDocumentFormat ); top.setAttribute( "minorFormat", c_minorDocumentFormat ); if( object->type( ) == "Scene" ) { PMObject* o = object->firstChild( ); for( ; o; o = o->nextSibling( ) ) { TQDomElement e = o->serialize( doc ); top.appendChild( e ); } } else { TQDomElement e = object->serialize( doc ); top.appendChild( e ); } s2 << doc; m_data.push_back( modelerData ); m_mimeTypes.push_back( c_kpmDocumentMimeFormat ); const TQPtrList& formats = part->ioManager( )->formats( ); TQPtrListIterator it( formats ); for( ; it.current( ); ++it ) { if( it.current( )->services( ) & PMIOFormat::Export ) { TQByteArray data; TQBuffer buffer( data ); buffer.open( IO_WriteOnly ); PMSerializer* ser = it.current( )->newSerializer( TQT_TQIODEVICE(&buffer) ); if( ser ) { ser->serialize( object ); ser->close( ); delete ser; buffer.close( ); m_data.push_back( data ); m_mimeTypes.push_back( it.current( )->mimeType( ) ); kdDebug( PMArea ) << "Added mime type " << it.current( )->mimeType( ) << " " << data.size( ) << " bytes" << endl; } else kdError( PMArea ) << "Format claims to support exporting, but doesn't provide a serializer" << endl; buffer.close( ); } } } PMObjectDrag::PMObjectDrag( PMPart* part, const PMObjectList& objList, TQWidget* dragSource, const char* name ) : TQDragObject( dragSource, name ) { TQByteArray modelerData; TQTextStream s2( modelerData, IO_WriteOnly ); TQDomDocument doc( "KPOVMODELER" ); TQDomElement top = doc.createElement( "objects" ); doc.appendChild( top ); top.setAttribute( "majorFormat", c_majorDocumentFormat ); top.setAttribute( "minorFormat", c_minorDocumentFormat ); PMObjectListIterator it( objList ); for( ; it.current( ); ++it ) { if( it.current( )->type( ) == "Scene" ) { PMObject* o = it.current( )->firstChild( ); for( ; o; o = o->nextSibling( ) ) { TQDomElement e = o->serialize( doc ); top.appendChild( e ); } } else { TQDomElement e = it.current( )->serialize( doc ); top.appendChild( e ); } } s2 << doc; m_data.push_back( modelerData ); m_mimeTypes.push_back( c_kpmDocumentMimeFormat ); const TQPtrList& formats = part->ioManager( )->formats( ); TQPtrListIterator fit( formats ); for( ; fit.current( ); ++fit ) { if( fit.current( )->services( ) & PMIOFormat::Export ) { TQByteArray data; TQBuffer buffer( data ); buffer.open( IO_WriteOnly ); PMSerializer* ser = fit.current( )->newSerializer( TQT_TQIODEVICE(&buffer) ); if( ser ) { ser->serializeList( objList ); ser->close( ); delete ser; buffer.close( ); m_data.push_back( data ); m_mimeTypes.push_back( fit.current( )->mimeType( ) ); kdDebug( PMArea ) << "Added mime type " << fit.current( )->mimeType( ) << " " << data.size( ) << " bytes" << endl; } else kdError( PMArea ) << "Format claims to support exporting, but doesn't provide a serializer" << endl; buffer.close( ); } } } PMObjectDrag::~PMObjectDrag( ) { } TQByteArray PMObjectDrag::encodedData( const char* format ) const { TQValueList::ConstIterator dit; TQStringList::ConstIterator sit; for( dit = m_data.begin( ), sit = m_mimeTypes.begin( ); dit != m_data.end( ) && sit != m_mimeTypes.end( ); ++dit, ++sit ) { if( *sit == format ) return *dit; } TQByteArray empty; return empty; } const char* PMObjectDrag::format( int i /*=0*/ ) const { if( i >= 0 && i < ( signed ) m_mimeTypes.size( ) ) return ( *m_mimeTypes.at( i ) ).latin1( ); return 0; } bool PMObjectDrag::canDecode( const TQMimeSource* e, PMPart* part ) { if( e->provides( c_kpmDocumentMimeFormat ) ) return true; const TQPtrList& formats = part->ioManager( )->formats( ); TQPtrListIterator fit( formats ); for( ; fit.current( ); ++fit ) if( fit.current( )->services( ) & PMIOFormat::Import && e->provides( fit.current( )->mimeType( ).latin1( ) ) ) return true; return false; } PMParser* PMObjectDrag::newParser( const TQMimeSource* e, PMPart* part ) { if( e->provides( c_kpmDocumentMimeFormat ) ) return new PMXMLParser( part, e->encodedData( c_kpmDocumentMimeFormat ) ); const TQPtrList& formats = part->ioManager( )->formats( ); TQPtrListIterator fit( formats ); for( ; fit.current( ); ++fit ) { PMIOFormat* f = fit.current( ); TQString str = f->mimeType( ); const char* lat = str.latin1( ); if( f->services( ) & PMIOFormat::Import && e->provides( lat ) ) return f->newParser( part, e->encodedData( lat ) ); } return 0; }