]> git.lyx.org Git - lyx.git/blobdiff - src/graphics/GraphicsCache.C
fix typo that put too many include paths for most people
[lyx.git] / src / graphics / GraphicsCache.C
index 1721b0c6f38835ca056c95da816d4b7daf9d77be..9e37111ec99d72084ceb80357c8c3985693dc8b7 100644 (file)
@@ -1,13 +1,11 @@
-// -*- C++ -*-
-/* This file is part of
- * =================================================
- * 
- *          LyX, The Document Processor
- *          Copyright 1995 Matthias Ettrich.
- *          Copyright 1995-2000 The LyX Team.
+/*
+ * \file GraphicsCache.C
+ * Copyright 2002 the LyX Team
+ * Read the file COPYING
  *
- *          This file Copyright 2000 Baruch Even
- * ================================================= */
+ * \author Baruch Even <baruch.even@writeme.com>
+ * \author Angus Leeming <a.leeming@ic.ac.uk>
+ */
 
 #include <config.h>
 
 #endif
 
 #include "GraphicsCache.h"
+#include "GraphicsCacheItem.h"
+#include "GraphicsImage.h"
+#include "GraphicsParams.h"
+#include "insets/insetgraphics.h"
+#include "frontends/GUIRunTime.h"
 
 
-GraphicsCache * GraphicsCache::singleton = 0;
+namespace grfx {
+
+GCache & GCache::get()
+{
+       static bool start = true;
+       if (start) {
+               start = false;
+               GUIRunTime::initialiseGraphics();
+       }
+
+       // Now return the cache
+       static GCache singleton;
+       return singleton;
+}
+
+
+GCache::GCache()
+{
+       cache = new CacheType;
+}
+
+
+// all elements are destroyed by the shared_ptr's in the map.
+GCache::~GCache()
+{
+       delete cache;
+}
 
 
-GraphicsCache * 
-GraphicsCache::getInstance()
+void GCache::update(InsetGraphics const & inset, string const & filepath)
 {
-    if (! singleton) {
-        singleton = new GraphicsCache;
-    }
+       // A subset only of InsetGraphicsParams is needed for display purposes.
+       // The GraphicsParams c-tor also interrogates lyxrc to ascertain whether
+       // to display or not.
+       GParams params(inset.params(), filepath);
+
+       // Each inset can reference only one file, so check the cache for any
+       // graphics files referenced by inset. If the name of this file is
+       // different from that in params, then remove the reference.
+       CacheType::iterator it = find(inset);
+
+       if (it != cache->end()) {
+               CacheItemType item = it->second;
+               if (item->filename() != params.filename) {
+                       item->remove(inset);
+                       if (item->empty())
+                               cache->erase(it);
+               }
+       }
+
+       // Are we adding a new file or modifying the display of an existing one?
+       it = cache->find(params.filename);
 
-    return singleton;
+       if (it != cache->end()) {
+               it->second->modify(inset, params);
+               return;
+       }
+
+       CacheItemType item(new GCacheItem(inset, params));
+       if (item.get() != 0)
+               (*cache)[params.filename] = item;
 }
 
 
-GraphicsCache::~GraphicsCache()
+void GCache::remove(InsetGraphics const & inset)
 {
-        delete singleton;
+       CacheType::iterator it = find(inset);
+       if (it == cache->end())
+               return;
+
+       CacheItemType item = it->second;
+       item->remove(inset);
+       if (item->empty()) {
+               cache->erase(it);
+       }
 }
 
 
-GraphicsCacheItem * 
-GraphicsCache::addFile(string const & filename)
+void GCache::startLoading(InsetGraphics const & inset)
 {
-    CacheType::const_iterator it = cache.find(filename);
-    
-    if (it != cache.end()) {
-        return (*it).second;
-    }
-    // INCOMPLETE!
-    return 0;
+       CacheType::iterator it = find(inset);
+       if (it == cache->end())
+               return;
+
+       it->second->startLoading(inset);
 }
 
 
-void
-GraphicsCache::removeFile(string const & filename)
+ImagePtr const GCache::image(InsetGraphics const & inset) const
 {
-    CacheType::const_iterator it = cache.find(filename);
-    
-    if (it != cache.end()) {
-        // INCOMPLETE!
-//        cache.erase(it);
-    }
+       CacheType::const_iterator it = find(inset);
+       if (it == cache->end())
+               return ImagePtr();
+
+       return it->second->image(inset);
 }
+
+
+ImageStatus GCache::status(InsetGraphics const & inset) const
+{
+       CacheType::const_iterator it = find(inset);
+       if (it == cache->end())
+               return ErrorUnknown;
+
+       return it->second->status(inset);
+}
+
+
+void GCache::changeDisplay(bool changed_background)
+{
+       CacheType::iterator it = cache->begin();
+       CacheType::iterator end = cache->end();
+       for(; it != end; ++it)
+               it->second->changeDisplay(changed_background);
+}
+
+
+GCache::CacheType::iterator
+GCache::find(InsetGraphics const & inset)
+{
+       CacheType::iterator it  = cache->begin();
+       CacheType::iterator end = cache->end();
+       for (; it != end; ++it) {
+               if (it->second->referencedBy(inset))
+                       return it;
+       }
+
+       return cache->end();
+}
+
+
+GCache::CacheType::const_iterator
+GCache::find(InsetGraphics const & inset) const
+{
+       CacheType::const_iterator it  = cache->begin();
+       CacheType::const_iterator end = cache->end();
+       for (; it != end; ++it) {
+               if (it->second->referencedBy(inset))
+                       return it;
+       }
+
+       return cache->end();
+}
+
+} // namespace grfx