]> git.lyx.org Git - lyx.git/blob - src/graphics/Previews.C
Small tidy up of preview code, part II.
[lyx.git] / src / graphics / Previews.C
1 /*
2  *  \file Previews.C
3  *  Copyright 2002 the LyX Team
4  *  Read the file COPYING
5  *
6  * \author Angus Leeming <leeming@lyx.org>
7  */
8
9 #include <config.h>
10
11 #ifdef __GNUG__
12 #pragma implementation
13 #endif
14
15 #include "Previews.h"
16 #include "PreviewLoader.h"
17
18 #include "buffer.h"
19 #include "lyxrc.h"
20
21 #include "insets/inset.h"
22
23 #include "support/LAssert.h"
24
25 #include <map>
26
27 namespace grfx {
28
29 bool Previews::activated()
30 {
31         return lyxrc.preview;
32 }
33
34
35 Previews & Previews::get()
36 {
37         static Previews singleton;
38         return singleton;
39 }
40
41
42 struct Previews::Impl {
43         ///
44         typedef boost::shared_ptr<PreviewLoader> PreviewLoaderPtr;
45         ///
46         typedef std::map<Buffer const *, PreviewLoaderPtr> CacheType;
47         ///
48         CacheType cache;
49 };
50
51
52 Previews::Previews()
53         : pimpl_(new Impl())
54 {}
55
56
57 Previews::~Previews()
58 {}
59
60
61 PreviewLoader & Previews::loader(Buffer const * buffer)
62 {
63         lyx::Assert(buffer);
64
65         Impl::CacheType::iterator it = pimpl_->cache.find(buffer);
66
67         if (it == pimpl_->cache.end()) {
68                 Impl::PreviewLoaderPtr ptr(new PreviewLoader(*buffer));
69                 pimpl_->cache[buffer] = ptr;
70                 return *ptr.get();
71         }
72
73         return *it->second.get();
74 }
75
76
77 void Previews::removeLoader(Buffer const * buffer)
78 {
79         if (!buffer)
80                 return;
81
82         Impl::CacheType::iterator it = pimpl_->cache.find(buffer);
83
84         if (it != pimpl_->cache.end())
85                 pimpl_->cache.erase(it);
86 }
87
88
89 void Previews::generateBufferPreviews(Buffer const & buffer)
90 {
91         PreviewLoader & ploader = loader(&buffer);
92
93         Buffer::inset_iterator it  = buffer.inset_const_iterator_begin();
94         Buffer::inset_iterator end = buffer.inset_const_iterator_end();
95
96         for (; it != end; ++it) {
97                 if ((*it)->lyxCode() == Inset::MATH_CODE) {
98                         (*it)->generatePreview(ploader);
99                 }
100         }
101
102         ploader.startLoading();
103 }
104
105 } // namespace grfx