akonadi
pastehelper.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "pastehelper.h"
00021
00022 #include "collectioncopyjob.h"
00023 #include "collectionmodifyjob.h"
00024 #include "item.h"
00025 #include "itemcreatejob.h"
00026 #include "itemcopyjob.h"
00027 #include "itemmodifyjob.h"
00028 #include "itemmovejob.h"
00029 #include "transactionsequence.h"
00030
00031 #include <KDebug>
00032 #include <KUrl>
00033
00034 #include <QtCore/QByteArray>
00035 #include <QtCore/QMimeData>
00036 #include <QtCore/QStringList>
00037
00038 using namespace Akonadi;
00039
00040 bool PasteHelper::canPaste(const QMimeData * mimeData, const Collection & collection)
00041 {
00042 if ( !mimeData || !collection.isValid() )
00043 return false;
00044
00045
00046 if ( (collection.rights() & (Collection::CanCreateItem | Collection::CanCreateCollection) ) == 0 )
00047 return false;
00048
00049 if ( KUrl::List::canDecode( mimeData ) )
00050 return true;
00051
00052 foreach ( const QString &format, mimeData->formats() )
00053 if ( collection.contentMimeTypes().contains( format ) )
00054 return true;
00055
00056 return false;
00057 }
00058
00059 KJob* PasteHelper::paste(const QMimeData * mimeData, const Collection & collection, bool copy)
00060 {
00061 if ( !canPaste( mimeData, collection ) )
00062 return 0;
00063
00064
00065
00066 foreach ( const QString &type, mimeData->formats() ) {
00067 if ( !collection.contentMimeTypes().contains( type ) )
00068 continue;
00069
00070 QByteArray item = mimeData->data( type );
00071
00072 if ( !item.isEmpty() && item.at( item.size() - 1 ) == 0 )
00073 item.resize( item.size() - 1 );
00074
00075 Item it;
00076 it.setMimeType( type );
00077 it.setPayloadFromData( item );
00078
00079 ItemCreateJob *job = new ItemCreateJob( it, collection );
00080 return job;
00081 }
00082
00083 if ( !KUrl::List::canDecode( mimeData ) )
00084 return 0;
00085
00086
00087 TransactionSequence *transaction = new TransactionSequence();
00088 KUrl::List urls = KUrl::List::fromMimeData( mimeData );
00089 foreach ( const KUrl &url, urls ) {
00090 if ( Collection::fromUrl( url ).isValid() ) {
00091 Collection col = Collection::fromUrl( url );
00092 if ( !copy ) {
00093 col.setParent( collection );
00094 CollectionModifyJob *job = new CollectionModifyJob( col, transaction );
00095 } else {
00096 new CollectionCopyJob( col, collection, transaction );
00097 }
00098 } else if ( Item::fromUrl( url ).isValid() ) {
00099
00100 const Item item = Item::fromUrl( url );
00101 if ( !copy ) {
00102 new ItemMoveJob( item, collection, transaction );
00103 } else {
00104 new ItemCopyJob( item, collection, transaction );
00105 }
00106 } else {
00107
00108
00109 kDebug() << "Implement me!";
00110 }
00111 }
00112 return transaction;
00113 }
00114