]> git.lyx.org Git - lyx.git/blob - src/insets/InsetExternal.h
This should be the last of the commits refactoring the InsetLayout code.
[lyx.git] / src / insets / InsetExternal.h
1 // -*- C++ -*-
2 /**
3  * \file InsetExternal.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Asger Alstrup Nielsen
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #ifndef INSET_EXTERNAL_H
13 #define INSET_EXTERNAL_H
14
15 #include "Inset.h"
16 #include "ExternalTransforms.h"
17 #include "EmbeddedFiles.h"
18
19 #include "support/FileName.h"
20 #include "support/Translator.h"
21
22 #include <boost/scoped_ptr.hpp>
23 #include <boost/signals/trackable.hpp>
24
25 #include "MailInset.h"
26
27
28 /** No two InsetExternalParams variables can have the same temporary file.
29  *  This class has copy-semantics but the copy constructor
30  *  and assignment operator simply call the default constructor.
31  *  Use of this class enables us to use the compiler-generated
32  *  copy constructor and assignment operator for the
33  *  InsetExternalParams class.
34  */
35 namespace lyx {
36
37 namespace external {
38
39 class TempName {
40 public:
41         TempName();
42         TempName(TempName const &);
43         ~TempName();
44         TempName & operator=(TempName const &);
45         support::FileName const & operator()() const { return tempname_; }
46 private:
47         support::FileName tempname_;
48 };
49
50 /// How is the image to be displayed on the LyX screen?
51 enum DisplayType {
52         DefaultDisplay,
53         MonochromeDisplay,
54         GrayscaleDisplay,
55         ColorDisplay,
56         PreviewDisplay,
57         NoDisplay
58 };
59
60
61 /// The translator between the Display enum and corresponding lyx string.
62 Translator<DisplayType, std::string> const & displayTranslator();
63
64 } // namespace external
65
66
67 /// hold parameters settable from the GUI
68 class InsetExternalParams {
69 public:
70         InsetExternalParams();
71
72         void write(Buffer const &, std::ostream &) const;
73         bool read(Buffer const &, Lexer &);
74
75         /// The name of the tempfile used for manipulations.
76         support::FileName const & tempname() const { return tempname_(); }
77
78         /// The template currently in use.
79         void settemplate(std::string const &);
80         std::string const & templatename() const { return templatename_; }
81
82         /// The external file.
83         EmbeddedFile filename;
84         /// How the inset is to be displayed by LyX.
85         external::DisplayType display;
86         /// The scale of the displayed graphic (if shown).
87         unsigned int lyxscale;
88
89         external::ClipData     clipdata;
90         external::ExtraData    extradata;
91         external::ResizeData   resizedata;
92         external::RotationData rotationdata;
93
94         /** if \c true, simply output the filename, maybe wrapped in a
95          *  box, rather than generate and display the image etc.
96          */
97         bool draft;
98
99 private:
100         external::TempName tempname_;
101         std::string templatename_;
102 };
103
104
105 class RenderBase;
106
107 ///
108 class InsetExternal : public Inset, public boost::signals::trackable
109 {
110 public:
111         InsetExternal();
112         ///
113         virtual ~InsetExternal();
114         ///
115         virtual InsetCode lyxCode() const { return EXTERNAL_CODE; }
116         ///
117         virtual EDITABLE editable() const { return IS_EDITABLE; }
118
119         ///
120         void metrics(MetricsInfo &, Dimension &) const;
121         ///
122         void draw(PainterInfo & pi, int x, int y) const;
123         ///
124         virtual void write(Buffer const &, std::ostream &) const;
125         ///
126         virtual void read(Buffer const &, Lexer & lex);
127
128         /// \returns the number of rows (\n's) of generated code.
129         int latex(Buffer const &, odocstream &,
130                   OutputParams const &) const;
131         ///
132         int plaintext(Buffer const &, odocstream &,
133                       OutputParams const &) const;
134         ///
135         int docbook(Buffer const &, odocstream &,
136                     OutputParams const &) const;
137
138         /// Update needed features for this inset.
139         virtual void validate(LaTeXFeatures & features) const;
140
141         ///
142         InsetExternalParams const & params() const;
143         ///
144         void setParams(InsetExternalParams const &, Buffer const &);
145         ///
146         void addPreview(graphics::PreviewLoader &) const;
147         ///
148         void edit(Cursor & cur, bool front, EntryDirection entry_from);
149         ///
150         bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const;
151         /// external file can be embedded
152         void registerEmbeddedFiles(Buffer const &, EmbeddedFileList &) const;
153         ///
154         void updateEmbeddedFile(Buffer const &, EmbeddedFile const &);
155
156 protected:
157         InsetExternal(InsetExternal const &);
158         ///
159         virtual void doDispatch(Cursor & cur, FuncRequest & cmd);
160 private:
161         virtual Inset * clone() const;
162
163         /** This method is connected to the graphics loader, so we are
164          *  informed when the image has been loaded.
165          */
166         void statusChanged() const;
167
168         /** Slot receiving a signal that the external file has changed
169          *  and the preview should be regenerated.
170          */
171         void fileChanged() const;
172
173         /// The current params
174         InsetExternalParams params_;
175         /// The thing that actually draws the image on LyX's screen.
176         boost::scoped_ptr<RenderBase> renderer_;
177 };
178
179
180 class InsetExternalMailer : public MailInset {
181 public:
182         ///
183         InsetExternalMailer(InsetExternal & inset);
184         ///
185         virtual Inset & inset() const { return inset_; }
186         ///
187         virtual std::string const & name() const { return name_; }
188         ///
189         virtual std::string const inset2string(Buffer const &) const;
190         ///
191         static void string2params(std::string const &, Buffer const &,
192                                   InsetExternalParams &);
193         ///
194         static std::string const params2string(InsetExternalParams const &,
195                                                Buffer const &);
196 private:
197         ///
198         static std::string const name_;
199         ///
200         InsetExternal & inset_;
201 };
202
203 } // namespace lyx
204
205 #endif