]> git.lyx.org Git - lyx.git/blob - src/insets/InsetExternal.h
Fix GRAPHICS_EDIT of InsetGraphics
[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         ~InsetExternal();
114         ///
115         void setBuffer(Buffer & buffer);
116         ///
117         InsetCode lyxCode() const { return EXTERNAL_CODE; }
118         ///
119         EDITABLE editable() const { return IS_EDITABLE; }
120
121         ///
122         void metrics(MetricsInfo &, Dimension &) const;
123         ///
124         void draw(PainterInfo & pi, int x, int y) const;
125         ///
126         void write(std::ostream &) const;
127         ///
128         void read(Lexer & lex);
129
130         /// \returns the number of rows (\n's) of generated code.
131         int latex(odocstream &, OutputParams const &) const;
132         ///
133         int plaintext(odocstream &, OutputParams const &) const;
134         ///
135         int docbook(odocstream &, OutputParams const &) const;
136
137         /// Update needed features for this inset.
138         virtual void validate(LaTeXFeatures & features) const;
139
140         ///
141         InsetExternalParams const & params() const;
142         ///
143         void setParams(InsetExternalParams const &);
144         ///
145         void addPreview(graphics::PreviewLoader &) const;
146         ///
147         void edit(Cursor & cur, bool front, EntryDirection entry_from);
148         ///
149         bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const;
150         /// external file can be embedded
151         void registerEmbeddedFiles(EmbeddedFileList &) const;
152         ///
153         void updateEmbeddedFile(EmbeddedFile const &);
154
155 protected:
156         InsetExternal(InsetExternal const &);
157         ///
158         void doDispatch(Cursor & cur, FuncRequest & cmd);
159 private:
160         ///
161         Inset * clone() const { return new InsetExternal(*this); }
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