|
|
|
/* This file is part of the KDE project
|
|
|
|
Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
|
|
|
|
Copyright (c) 2001, 2004 David Faure <faure@kde.org>
|
|
|
|
Copyright (C) 2002, 2004 Nicolas GOUTTE <goutte@kde.org>
|
|
|
|
|
|
|
|
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 <tqdom.h>
|
|
|
|
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <kurl.h>
|
|
|
|
|
|
|
|
#include <KoStoreDevice.h>
|
|
|
|
#include <KoXmlWriter.h>
|
|
|
|
|
|
|
|
#include "KoPicture.h"
|
|
|
|
#include "KoPictureCollection.h"
|
|
|
|
|
|
|
|
//#define DEBUG_PICTURES
|
|
|
|
|
|
|
|
KoPicture KoPictureCollection::findPicture(const KoPictureKey& key) const
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "KoPictureCollection::findPicture " << key.toString() << endl;
|
|
|
|
#endif
|
|
|
|
ConstIterator it = find( key );
|
|
|
|
if ( it == end() )
|
|
|
|
{
|
|
|
|
KoPicture picture;
|
|
|
|
picture.setKey(key);
|
|
|
|
return picture;
|
|
|
|
}
|
|
|
|
|
|
|
|
return *it;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
KoPicture KoPictureCollection::insertPicture(const KoPictureKey& key, const KoPicture& picture)
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "KoPictureCollection::insertPicture " << key.toString() << endl;
|
|
|
|
#endif
|
|
|
|
KoPicture c = findPicture(key);
|
|
|
|
if (c.isNull())
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "KoPictureCollection::insertPicture not found -> inserting" << endl;
|
|
|
|
#endif
|
|
|
|
c=picture;
|
|
|
|
c.setKey(key); // Be sure that the key is correctly set in the KoPicture!
|
|
|
|
insert(key, c);
|
|
|
|
}
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
KoPicture KoPictureCollection::insertPicture(const KoPicture& picture)
|
|
|
|
{
|
|
|
|
return insertPicture(picture.getKey(), picture);
|
|
|
|
}
|
|
|
|
|
|
|
|
KoPicture KoPictureCollection::downloadPicture(const KURL& url, TQWidget *window)
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "KoPictureCollection::downloadPicture " << url.prettyURL() << endl;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// If it is a local file, we can check the last modification date, so we should better use loadPicture
|
|
|
|
if (url.isLocalFile())
|
|
|
|
return loadPicture(url.path());
|
|
|
|
|
|
|
|
|
|
|
|
// We have really a remote file, so we cannot check the last modification date
|
|
|
|
// Therefore we have to always download the file
|
|
|
|
|
|
|
|
KoPicture pic;
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "Trying to download picture from file " << url.prettyURL() << endl;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (pic.setKeyAndDownloadPicture(url, window))
|
|
|
|
insertPicture(pic.getKey(), pic);
|
|
|
|
else
|
|
|
|
kdWarning(30003) << "Could not download KoPicture from " << url.prettyURL() << endl;
|
|
|
|
|
|
|
|
return pic;
|
|
|
|
}
|
|
|
|
|
|
|
|
KoPicture KoPictureCollection::loadPicture(const TQString& fileName)
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "KoPictureCollection::loadPicture " << fileName << endl;
|
|
|
|
#endif
|
|
|
|
// Check the last modified date of the file, as it is now.
|
|
|
|
KoPictureKey key;
|
|
|
|
key.setKeyFromFile(fileName);
|
|
|
|
|
|
|
|
KoPicture c = findPicture(key);
|
|
|
|
if (c.isNull())
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "Trying to load picture from file " << fileName << endl;
|
|
|
|
#endif
|
|
|
|
if (c.loadFromFile(fileName))
|
|
|
|
insertPicture(key, c);
|
|
|
|
else
|
|
|
|
kdWarning(30003) << "Could not load KoPicture from " << fileName << endl;
|
|
|
|
}
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KoPictureCollection::getFileName(const Type pictureType, KoPicture& picture, int& counter)
|
|
|
|
{
|
|
|
|
TQString storeURL;
|
|
|
|
// ### TODO: remove "cliparts" when KPresenter is ready for it
|
|
|
|
if (pictureType==CollectionClipart)
|
|
|
|
storeURL="cliparts/clipart";
|
|
|
|
else
|
|
|
|
storeURL="pictures/picture";
|
|
|
|
storeURL+=TQString::number(++counter);
|
|
|
|
storeURL+='.';
|
|
|
|
storeURL+=picture.getExtension();
|
|
|
|
return storeURL;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString KoPictureCollection::getOasisFileName(const KoPicture& picture) const
|
|
|
|
{
|
|
|
|
TQString storeURL( "Pictures/");
|
|
|
|
if ( !picture.uniquePictureId().isEmpty() )
|
|
|
|
storeURL+=picture.uniquePictureId();
|
|
|
|
else
|
|
|
|
storeURL+=picture.getKey().toString();
|
|
|
|
storeURL+='.';
|
|
|
|
storeURL+=picture.getExtension();
|
|
|
|
return storeURL;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool KoPictureCollection::saveToStore(const Type pictureType, KoStore *store, const TQValueList<KoPictureKey>& keys)
|
|
|
|
{
|
|
|
|
int counter=0;
|
|
|
|
TQValueList<KoPictureKey>::const_iterator it = keys.begin();
|
|
|
|
for ( ; it != keys.end(); ++it )
|
|
|
|
{
|
|
|
|
KoPicture c = findPicture( *it );
|
|
|
|
if (c.isNull())
|
|
|
|
kdWarning(30003) << "Picture " << (*it).toString() << " not found in collection !" << endl;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
TQString storeURL=getFileName(pictureType, c, counter);
|
|
|
|
|
|
|
|
if (store->open(storeURL))
|
|
|
|
{
|
|
|
|
KoStoreDevice dev(store);
|
|
|
|
if ( ! c.save(&dev) )
|
|
|
|
return false; // e.g. bad image?
|
|
|
|
if ( !store->close() )
|
|
|
|
return false; // e.g. disk full
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool KoPictureCollection::saveOasisToStore( KoStore *store, TQValueList<KoPictureKey> keys, KoXmlWriter* manifestWriter )
|
|
|
|
{
|
|
|
|
TQValueList<KoPictureKey>::Iterator it = keys.begin();
|
|
|
|
for ( ; it != keys.end(); ++it )
|
|
|
|
{
|
|
|
|
KoPicture c = findPicture( *it );
|
|
|
|
if (c.isNull())
|
|
|
|
kdWarning(30003) << "Picture " << (*it).toString() << " not found in collection !" << endl;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
TQString storeURL( getOasisFileName(c) );
|
|
|
|
if (store->open(storeURL))
|
|
|
|
{
|
|
|
|
KoStoreDevice dev(store);
|
|
|
|
if ( ! c.save(&dev) )
|
|
|
|
return false; // e.g. bad image?
|
|
|
|
if ( !store->close() )
|
|
|
|
return false; // e.g. disk full
|
|
|
|
manifestWriter->addManifestEntry( storeURL, c.getMimeType() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQDomElement KoPictureCollection::saveXML(const Type pictureType, TQDomDocument &doc, TQValueList<KoPictureKey> keys)
|
|
|
|
{
|
|
|
|
TQString strElementName("PICTURES");
|
|
|
|
if (pictureType==CollectionImage)
|
|
|
|
strElementName="PIXMAPS";
|
|
|
|
else if (pictureType==CollectionClipart)
|
|
|
|
strElementName="CLIPARTS";
|
|
|
|
TQDomElement cliparts = doc.createElement( strElementName );
|
|
|
|
int counter=0;
|
|
|
|
TQValueList<KoPictureKey>::Iterator it = keys.begin();
|
|
|
|
for ( ; it != keys.end(); ++it )
|
|
|
|
{
|
|
|
|
KoPicture picture = findPicture( *it );
|
|
|
|
if ( picture.isNull() )
|
|
|
|
kdWarning(30003) << "Picture " << (*it).toString() << " not found in collection !" << endl;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
TQString pictureName=getFileName(pictureType, picture, counter);
|
|
|
|
TQDomElement keyElem = doc.createElement( "KEY" );
|
|
|
|
cliparts.appendChild(keyElem);
|
|
|
|
(*it).saveAttributes(keyElem);
|
|
|
|
keyElem.setAttribute("name", pictureName);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return cliparts;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KoPictureCollection::readXML( TQDomElement& pixmapsElem, TQMap <KoPictureKey, TQString>& map )
|
|
|
|
{
|
|
|
|
for( TQDomNode n = pixmapsElem.firstChild();
|
|
|
|
!n.isNull();
|
|
|
|
n = n.nextSibling() )
|
|
|
|
{
|
|
|
|
TQDomElement keyElement = n.toElement();
|
|
|
|
if (keyElement.isNull()) continue;
|
|
|
|
if (keyElement.tagName()=="KEY")
|
|
|
|
{
|
|
|
|
KoPictureKey key;
|
|
|
|
key.loadAttributes(keyElement);
|
|
|
|
map.insert(key, keyElement.attribute("name"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
KoPictureCollection::StoreMap KoPictureCollection::readXML( TQDomElement& pixmapsElem )
|
|
|
|
{
|
|
|
|
StoreMap map;
|
|
|
|
readXML(pixmapsElem, map);
|
|
|
|
return map;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KoPictureCollection::readFromStore( KoStore * store, const StoreMap & storeMap )
|
|
|
|
{
|
|
|
|
#ifdef DEBUG_PICTURES
|
|
|
|
kdDebug(30003) << "KoPictureCollection::readFromStore " << store << endl;
|
|
|
|
#endif
|
|
|
|
StoreMap::ConstIterator it = storeMap.begin();
|
|
|
|
for ( ; it != storeMap.end(); ++it )
|
|
|
|
{
|
|
|
|
KoPicture c = findPicture(it.key());
|
|
|
|
if (!c.isNull())
|
|
|
|
{
|
|
|
|
// Do not load a file that we already have!
|
|
|
|
//kdDebug(30003) << store << endl;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
TQString u(it.data());
|
|
|
|
if (u.isEmpty())
|
|
|
|
{
|
|
|
|
// old naming I suppose ?
|
|
|
|
u=it.key().toString();
|
|
|
|
}
|
|
|
|
|
|
|
|
KoPicture picture;
|
|
|
|
|
|
|
|
if (!store->open( u ))
|
|
|
|
{
|
|
|
|
u.prepend( "file:" );
|
|
|
|
if (!store->open( u ))
|
|
|
|
{
|
|
|
|
kdWarning(30003) << "Could load neither from store nor from file: " << it.data() << endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const int pos=u.findRev('.');
|
|
|
|
if (pos==-1)
|
|
|
|
{
|
|
|
|
kdError(30003) << "File with no extension! Not supported!" << endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const TQString extension(u.mid(pos+1));
|
|
|
|
|
|
|
|
KoStoreDevice dev(store);
|
|
|
|
picture.load(&dev, extension);
|
|
|
|
store->close();
|
|
|
|
|
|
|
|
if (!picture.isNull())
|
|
|
|
insertPicture(it.key(), picture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
KoPicture KoPictureCollection::findOrLoad(const TQString& fileName, const TQDateTime& dateTime)
|
|
|
|
{
|
|
|
|
// As now all KoPictureKey objects have a valid TQDateTime, we must do it without a date/time check.
|
|
|
|
ConstIterator it = find( KoPictureKey ( fileName, dateTime ) );
|
|
|
|
if ( it == end() )
|
|
|
|
{
|
|
|
|
return loadPicture( fileName );
|
|
|
|
}
|
|
|
|
return *it;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KoPictureCollection::assignUniqueIds()
|
|
|
|
{
|
|
|
|
uint idx = 0;
|
|
|
|
Iterator it;
|
|
|
|
for ( it = begin(); it != end(); ++it, ++idx )
|
|
|
|
{
|
|
|
|
it.data().assignPictureId(idx);
|
|
|
|
}
|
|
|
|
}
|