00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <qdom.h>
00023
00024 #include <kdebug.h>
00025 #include <kurl.h>
00026
00027 #include <koStoreDevice.h>
00028
00029 #include "koPicture.h"
00030 #include "koPictureCollection.h"
00031
00032
00033
00034 KoPicture KoPictureCollection::findPicture(const KoPictureKey& key) const
00035 {
00036 #ifdef DEBUG_PICTURES
00037 kdDebug(30003) << "KoPictureCollection::findPicture " << key.toString() << endl;
00038 #endif
00039 ConstIterator it = find( key );
00040 if ( it == end() )
00041 {
00042 KoPicture picture;
00043 picture.setKey(key);
00044 return picture;
00045 }
00046
00047 return *it;
00048 }
00049
00050 KoPicture KoPictureCollection::insertPicture(const KoPictureKey& key, const KoPicture& picture)
00051 {
00052 #ifdef DEBUG_PICTURES
00053 kdDebug(30003) << "KoPictureCollection::insertPicture " << key.toString() << endl;
00054 #endif
00055 KoPicture c = findPicture(key);
00056 if (c.isNull())
00057 {
00058 #ifdef DEBUG_PICTURES
00059 kdDebug(30003) << "KoPictureCollection::insertPicture not found -> inserting" << endl;
00060 #endif
00061 c=picture;
00062 c.setKey(key);
00063 insert(key, c);
00064 }
00065 return c;
00066 }
00067
00068 KoPicture KoPictureCollection::insertPicture(const KoPicture& picture)
00069 {
00070 return insertPicture(picture.getKey(), picture);
00071 }
00072
00073 KoPicture KoPictureCollection::downloadPicture(const KURL& url)
00074 {
00075 #ifdef DEBUG_PICTURES
00076 kdDebug(30003) << "KoPictureCollection::downloadPicture " << url.prettyURL() << endl;
00077 #endif
00078
00079
00080 if (url.isLocalFile())
00081 return loadPicture(url.path());
00082
00083
00084
00085
00086
00087 KoPicture pic;
00088 #ifdef DEBUG_PICTURES
00089 kdDebug(30003) << "Trying to download picture from file " << url.prettyURL() << endl;
00090 #endif
00091
00092 if (pic.setKeyAndDownloadPicture(url))
00093 insertPicture(pic.getKey(), pic);
00094 else
00095 kdWarning(30003) << "Could not download KoPicture from " << url.prettyURL() << endl;
00096
00097 return pic;
00098 }
00099
00100 KoPicture KoPictureCollection::loadPicture(const QString& fileName)
00101 {
00102 #ifdef DEBUG_PICTURES
00103 kdDebug(30003) << "KoPictureCollection::loadPicture " << fileName << endl;
00104 #endif
00105
00106 KoPictureKey key;
00107 key.setKeyFromFile(fileName);
00108
00109 KoPicture c = findPicture(key);
00110 if (c.isNull())
00111 {
00112 #ifdef DEBUG_PICTURES
00113 kdDebug(30003) << "Trying to load picture from file " << fileName << endl;
00114 #endif
00115 if (c.loadFromFile(fileName))
00116 insertPicture(key, c);
00117 else
00118 kdWarning(30003) << "Could not load KoPicture from " << fileName << endl;
00119 }
00120 return c;
00121 }
00122
00123 QString KoPictureCollection::getFileName(const Type pictureType, KoPicture& picture, int& counter)
00124 {
00125 QString storeURL;
00126
00127 if (pictureType==CollectionClipart)
00128 storeURL="cliparts/clipart";
00129 else
00130 storeURL="pictures/picture";
00131 storeURL+=QString::number(++counter);
00132 storeURL+='.';
00133 storeURL+=picture.getExtension();
00134 return storeURL;
00135 }
00136
00137 QString KoPictureCollection::getFileNameAsKOffice1Dot1(const Type pictureType, KoPicture& picture, int& counter)
00138 {
00139 QString storeURL;
00140 if (pictureType==CollectionClipart)
00141 storeURL="cliparts/clipart";
00142 else
00143 storeURL="pictures/picture";
00144 storeURL+=QString::number(++counter);
00145 storeURL+='.';
00146 storeURL+=picture.getExtensionAsKOffice1Dot1();
00147 return storeURL;
00148 }
00149
00150
00151 bool KoPictureCollection::saveToStoreInternal(const Type pictureType, KoStore *store, QValueList<KoPictureKey>& keys, const bool koffice11)
00152 {
00153 int counter=0;
00154 QValueList<KoPictureKey>::Iterator it = keys.begin();
00155 for ( ; it != keys.end(); ++it )
00156 {
00157 KoPicture c = findPicture( *it );
00158 if (c.isNull())
00159 kdWarning(30003) << "Picture " << (*it).toString() << " not found in collection !" << endl;
00160 else
00161 {
00162 QString storeURL;
00163 if (koffice11)
00164 storeURL=getFileNameAsKOffice1Dot1(pictureType, c, counter);
00165 else
00166 storeURL=getFileName(pictureType, c, counter);
00167
00168 if (store->open(storeURL))
00169 {
00170 KoStoreDevice dev(store);
00171 if (koffice11)
00172 {
00173 if ( !c.saveAsKOffice1Dot1(&dev) )
00174 return false;
00175 }
00176 else
00177 {
00178 if ( ! c.save(&dev) )
00179 return false;
00180 }
00181 if ( !store->close() )
00182 return false;
00183 }
00184 }
00185 }
00186 return true;
00187 }
00188
00189 bool KoPictureCollection::saveToStore(const Type pictureType, KoStore *store, QValueList<KoPictureKey> keys)
00190 {
00191 return saveToStoreInternal(pictureType,store, keys, false);
00192 }
00193
00194 bool KoPictureCollection::saveToStoreAsKOffice1Dot1(const Type pictureType, KoStore *store, QValueList<KoPictureKey> keys)
00195 {
00196 return saveToStoreInternal(pictureType,store, keys, true);
00197 }
00198
00199 QDomElement KoPictureCollection::saveXML(const Type pictureType, QDomDocument &doc, QValueList<KoPictureKey> keys)
00200 {
00201 QString strElementName("PICTURES");
00202 if (pictureType==CollectionImage)
00203 strElementName="PIXMAPS";
00204 else if (pictureType==CollectionClipart)
00205 strElementName="CLIPARTS";
00206 QDomElement cliparts = doc.createElement( strElementName );
00207 int counter=0;
00208 QValueList<KoPictureKey>::Iterator it = keys.begin();
00209 for ( ; it != keys.end(); ++it )
00210 {
00211 KoPicture picture = findPicture( *it );
00212 if ( picture.isNull() )
00213 kdWarning(30003) << "Picture " << (*it).toString() << " not found in collection !" << endl;
00214 else
00215 {
00216 QString pictureName=getFileName(pictureType, picture, counter);
00217 QDomElement keyElem = doc.createElement( "KEY" );
00218 cliparts.appendChild(keyElem);
00219 (*it).saveAttributes(keyElem);
00220 keyElem.setAttribute("name", pictureName);
00221 }
00222 }
00223 return cliparts;
00224 }
00225
00226 void KoPictureCollection::saveXMLAsKOffice1Dot1(QDomDocument &doc, QDomElement& parent, QValueList<KoPictureKey> keys)
00227 {
00228 QDomElement pixmaps = doc.createElement( "PIXMAPS" );
00229 QDomElement cliparts = doc.createElement( "CLIPARTS" );
00230 parent.appendChild(pixmaps);
00231 parent.appendChild(cliparts);
00232 int counter=0;
00233 QValueList<KoPictureKey>::Iterator it = keys.begin();
00234 for ( ; it != keys.end(); ++it )
00235 {
00236 KoPicture picture = findPicture( *it );
00237 if ( picture.isNull() )
00238 kdWarning(30003) << "Picture " << (*it).toString() << " not found in collection !" << endl;
00239 else
00240 {
00241 QString pictureName("error");
00242 QDomElement keyElem = doc.createElement( "KEY" );
00243
00244 if (picture.isClipartAsKOffice1Dot1())
00245 {
00246 pictureName=getFileNameAsKOffice1Dot1(CollectionClipart, picture, counter);
00247 cliparts.appendChild(keyElem);
00248 }
00249 else
00250 {
00251 pictureName=getFileNameAsKOffice1Dot1(CollectionImage, picture, counter);
00252 pixmaps.appendChild(keyElem);
00253 }
00254
00255 (*it).saveAttributes(keyElem);
00256 keyElem.setAttribute("name", pictureName);
00257 }
00258 }
00259 return;
00260 }
00261
00262 void KoPictureCollection::readXML( QDomElement& pixmapsElem, QMap <KoPictureKey, QString>& map )
00263 {
00264 for(
00265 QDomElement keyElement = pixmapsElem.firstChild().toElement();
00266 !keyElement.isNull();
00267 keyElement = keyElement.nextSibling().toElement()
00268 )
00269 {
00270 if (keyElement.tagName()=="KEY")
00271 {
00272 KoPictureKey key;
00273 key.loadAttributes(keyElement);
00274 map.insert(key, keyElement.attribute("name"));
00275 }
00276 }
00277 }
00278
00279
00280 KoPictureCollection::StoreMap KoPictureCollection::readXML( QDomElement& pixmapsElem )
00281 {
00282 StoreMap map;
00283 readXML(pixmapsElem, map);
00284 return map;
00285 }
00286
00287 void KoPictureCollection::readFromStore( KoStore * store, const StoreMap & storeMap )
00288 {
00289 #ifdef DEBUG_PICTURES
00290 kdDebug(30003) << "KoPictureCollection::readFromStore " << store << endl;
00291 #endif
00292 StoreMap::ConstIterator it = storeMap.begin();
00293 for ( ; it != storeMap.end(); ++it )
00294 {
00295 KoPicture c = findPicture(it.key());
00296 if (!c.isNull())
00297 {
00298
00299
00300 continue;
00301 }
00302 QString u(it.data());
00303 if (u.isEmpty())
00304 {
00305
00306 u=it.key().toString();
00307 }
00308
00309 KoPicture picture;
00310
00311 if (!store->open( u ))
00312 {
00313 u.prepend( "file:" );
00314 if (!store->open( u ))
00315 {
00316 kdWarning(30003) << "Could load neither from store nor from file: " << it.data() << endl;
00317 return;
00318 }
00319 }
00320
00321 const int pos=u.findRev('.');
00322 if (pos==-1)
00323 {
00324 kdError(30003) << "File with no extension! Not supported!" << endl;
00325 return;
00326 }
00327 const QString extension(u.mid(pos+1));
00328
00329 KoStoreDevice dev(store);
00330 picture.load(&dev, extension);
00331 store->close();
00332
00333 if (!picture.isNull())
00334 insertPicture(it.key(), picture);
00335 }
00336 }
00337
00338 KoPicture KoPictureCollection::findOrLoad(const QString& fileName, const QDateTime& dateTime)
00339 {
00340
00341 ConstIterator it = find( KoPictureKey ( fileName, dateTime ) );
00342 if ( it == end() )
00343 {
00344 return loadPicture( fileName );
00345 }
00346 return *it;
00347 }