]> git.lyx.org Git - lyx.git/blob - src/graphics/Previews.C
Preview code
[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 <a.leeming@ic.ac.uk>
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
28 namespace grfx {
29
30 bool Previews::activated()
31 {
32         return lyxrc.preview;
33 }
34
35
36 Previews & Previews::get()
37 {
38         static Previews singleton;
39         return singleton;
40 }
41
42
43 struct Previews::Impl {
44         ///
45         typedef boost::shared_ptr<PreviewLoader> PreviewLoaderPtr;
46         ///
47         typedef std::map<Buffer *, PreviewLoaderPtr> CacheType;
48         ///
49         CacheType cache;
50 };
51
52
53 Previews::Previews()
54         : pimpl_(new Impl())
55 {}
56
57
58 Previews::~Previews()
59 {}
60
61
62 PreviewLoader & Previews::loader(Buffer * buffer)
63 {
64         lyx::Assert(buffer);
65
66         Impl::CacheType::iterator it = pimpl_->cache.find(buffer);
67
68         if (it == pimpl_->cache.end()) {
69                 Impl::PreviewLoaderPtr ptr(new PreviewLoader(*buffer));
70                 pimpl_->cache[buffer] = ptr;
71                 return *ptr.get();
72         }
73         
74         return *it->second.get();
75 }
76
77
78 void Previews::removeLoader(Buffer * buffer)
79 {
80         if (!buffer)
81                 return;
82
83         Impl::CacheType::iterator it = pimpl_->cache.find(buffer);
84
85         if (it != pimpl_->cache.end())
86                 pimpl_->cache.erase(it);
87 }
88
89
90 void Previews::generateBufferPreviews(Buffer * buffer)
91 {
92         if (!buffer || !lyxrc.preview)
93                 return;
94
95         PreviewLoader & ploader = loader(buffer);
96
97         Buffer::inset_iterator it  = buffer->inset_const_iterator_begin();
98         Buffer::inset_iterator end = buffer->inset_const_iterator_end();
99
100         for (; it != end; ++it) {
101                 if ((*it)->lyxCode() == Inset::MATH_CODE) {
102                         (*it)->generatePreview(ploader);
103                 }
104         }
105
106         ploader.startLoading();
107 }
108
109 } // namespace grfx