// -*- C++ -*-
/**
- * \file GraphicsCache.h
- * Copyright 2002 the LyX Team
- * Read the file COPYING
+ * \file GraphicsCache.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * \author Baruch Even <baruch.even@writeme.com>
- * \author Angus Leeming <a.leeming@ic.ac.uk>
+ * \author Baruch Even
+ * \author Angus Leeming
*
- * grfx::GCache is the manager of the image cache.
- * It is responsible for creating the grfx::GCacheItem's and maintaining them.
+ * Full author contact details are available in file CREDITS.
*
- * grfx::GCache is a singleton class. It is possible to have only one
- * instance of it at any moment.
+ * lyx::graphics::Cache is the manager of the image cache.
+ * It is responsible for creating the lyx::graphics::CacheItem's
+ * and maintaining them.
+ *
+ * lyx::graphics::Cache is a singleton class. It is possible to have only one
+ * instance of it at any moment.
*/
#ifndef GRAPHICSCACHE_H
#define GRAPHICSCACHE_H
-#ifdef __GNUG__
-#pragma interface
-#endif
+#include <memory>
+#include <string>
+#include <vector>
+
-#include "GraphicsTypes.h"
-#include <map>
-#include "LString.h"
-#include <boost/utility.hpp>
+namespace lyx {
-class InsetGraphics;
+namespace support { class FileName; }
-namespace grfx {
+namespace graphics {
-class GCacheItem;
+class CacheItem;
-class GCache : boost::noncopyable {
+class Cache {
public:
/// This is a singleton class. Get the instance.
- static GCache & get();
-
- ///
- ~GCache();
-
- /// Add a file to the cache (or modify an existing image).
- void update(InsetGraphics const &, string const & filepath);
+ static Cache & get();
- /** Remove the data associated with this inset.
- * Called from the InsetGraphics d-tor.
+ /** Which graphics formats can be loaded directly by the image loader.
+ * Other formats can be loaded if a converter to a loadable format
+ * can be defined.
*/
- void remove(InsetGraphics const &);
-
- /** No processing of the image will take place until this call is
- * received.
- */
- void startLoading(InsetGraphics const &);
-
- /** If (changed_background == true), then the background color of the
- * graphics inset has changed. Update all images.
- * Else, the preferred display type has changed.
- * Update the view of all insets whose display type is DEFAULT.
+ std::vector<std::string> const & loadableFormats() const;
+
+ /// Add a graphics file to the cache.
+ void add(support::FileName const & file, support::FileName const & doc_file) const;
+
+ /// Remove a file from the cache.
+ void remove(support::FileName const & file) const;
+
+ /// Returns \c true if the file is in the cache.
+ bool inCache(support::FileName const & file) const;
+
+ /** Get the cache item associated with file.
+ * Returns an empty container if there is no such item.
+ *
+ * IMPORTANT: whatever uses an image must make a local copy of this
+ * ItemPtr. The shared_ptr<>::use_count() function is
+ * used to ascertain whether or not to remove the item from the cache
+ * when remove(file) is called.
+ *
+ * You have been warned!
*/
- void changeDisplay(bool changed_background = false);
-
- /// Get the image referenced by a particular inset.
- ImagePtr const image(InsetGraphics const &) const;
-
- /// How far have we got in loading the image?
- ImageStatus status(InsetGraphics const &) const;
-
- // Used to ascertain the Bounding Box of non (e)ps files.
- unsigned int raw_width(string const & filename) const;
+ typedef std::shared_ptr<CacheItem> ItemPtr;
///
- unsigned int raw_height(string const & filename) const;
-
-private:
- /** Make the c-tor private so we can control how many objects
- * are instantiated.
- */
- GCache();
+ ItemPtr const item(support::FileName const & file) const;
- /// The cache contains data of this type.
- typedef boost::shared_ptr<GCacheItem> CacheItemType;
+private:
+ /// noncopyable
+ Cache(Cache const &);
+ void operator=(Cache const &);
- /** The cache contains one item per file, so use a map to find the
- * cache item quickly by filename.
- * Note that each cache item can have multiple views, potentially one
- * per inset that references the original file.
+ /** Make the c-tor, d-tor private so we can control how many objects
+ * are instantiated.
*/
- typedef std::map<string, CacheItemType> CacheType;
-
- /// Search the cache by inset.
- CacheType::const_iterator find(InsetGraphics const &) const;
+ Cache();
///
- CacheType::iterator find(InsetGraphics const &);
+ ~Cache();
- /** Store a pointer to the cache so that we can forward declare
- * GCacheItem.
- */
- CacheType * cache;
+ /// Use the Pimpl idiom to hide the internals.
+ class Impl;
+ /// The pointer never changes although *pimpl_'s contents may.
+ Impl * const pimpl_;
};
-} // namespace grfx
-
+} // namespace graphics
+} // namespace lyx
#endif // GRAPHICSCACHE_H