3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Angus Leeming
7 * \author Martin Vermeer
8 * \author Jürgen Spitzmüller
10 * Full author contact details are available in file CREDITS.
15 #include "insetnote.h"
17 #include "BufferView.h"
19 #include "dispatchresult.h"
20 #include "funcrequest.h"
22 #include "LaTeXFeatures.h"
25 #include "metricsinfo.h"
26 #include "paragraph.h"
28 #include "support/lyxalgo.h"
29 #include "support/std_sstream.h"
30 #include "support/translator.h"
35 using std::istringstream;
37 using std::ostringstream;
42 typedef Translator<std::string, InsetNoteParams::Type> NoteTranslator;
44 NoteTranslator const init_notetranslator() {
45 NoteTranslator translator("Note", InsetNoteParams::Note);
46 translator.addPair("Comment", InsetNoteParams::Comment);
47 translator.addPair("Greyedout", InsetNoteParams::Greyedout);
52 NoteTranslator const init_notetranslator_loc() {
53 NoteTranslator translator(_("Note"), InsetNoteParams::Note);
54 translator.addPair(_("Comment"), InsetNoteParams::Comment);
55 translator.addPair(_("Greyed out"), InsetNoteParams::Greyedout);
60 NoteTranslator const & notetranslator() {
61 static NoteTranslator translator = init_notetranslator();
66 NoteTranslator const & notetranslator_loc() {
67 static NoteTranslator translator = init_notetranslator_loc();
76 InsetNoteParams::InsetNoteParams()
81 void InsetNoteParams::write(ostream & os) const
83 string const label = notetranslator().find(type);
84 os << "Note " << label << "\n";
88 void InsetNoteParams::read(LyXLex & lex)
93 type = notetranslator().find(label);
97 void InsetNote::init()
104 InsetNote::InsetNote(BufferParams const & bp, string const & label)
105 : InsetCollapsable(bp)
107 params_.type = notetranslator().find(label);
112 InsetNote::InsetNote(InsetNote const & in)
113 : InsetCollapsable(in), params_(in.params_)
119 InsetNote::~InsetNote()
121 InsetNoteMailer(*this).hideDialog();
125 auto_ptr<InsetBase> InsetNote::clone() const
127 return auto_ptr<InsetBase>(new InsetNote(*this));
131 string const InsetNote::editMessage() const
133 return _("Opened Note Inset");
137 void InsetNote::write(Buffer const & buf, ostream & os) const
140 InsetCollapsable::write(buf, os);
144 void InsetNote::read(Buffer const & buf, LyXLex & lex)
147 InsetCollapsable::read(buf, lex);
152 void InsetNote::setButtonLabel()
154 string const label = notetranslator_loc().find(params_.type);
157 LyXFont font(LyXFont::ALL_SANE);
161 switch (params_.type) {
162 case InsetNoteParams::Note:
163 font.setColor(LColor::note);
164 setBackgroundColor(LColor::notebg);
166 case InsetNoteParams::Comment:
167 font.setColor(LColor::comment);
168 setBackgroundColor(LColor::commentbg);
170 case InsetNoteParams::Greyedout:
171 font.setColor(LColor::greyedout);
172 setBackgroundColor(LColor::greyedoutbg);
179 bool InsetNote::showInsetDialog(BufferView * bv) const
181 InsetNoteMailer(const_cast<InsetNote &>(*this)).showDialog(bv);
187 InsetNote::priv_dispatch(FuncRequest const & cmd,
188 idx_type & idx, pos_type & pos)
190 BufferView * bv = cmd.view();
192 switch (cmd.action) {
194 case LFUN_INSET_MODIFY: {
195 InsetNoteMailer::string2params(cmd.argument, params_);
198 return DispatchResult(true, true);
201 case LFUN_INSET_DIALOG_UPDATE:
202 InsetNoteMailer(*this).updateDialog(bv);
203 return DispatchResult(true, true);
205 case LFUN_MOUSE_RELEASE:
206 if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
207 InsetNoteMailer(*this).showDialog(bv);
208 return DispatchResult(true, true);
213 return InsetCollapsable::priv_dispatch(cmd, idx, pos);
218 int InsetNote::latex(Buffer const & buf, ostream & os,
219 OutputParams const & runparams) const
221 if (params_.type == InsetNoteParams::Note)
225 if (params_.type == InsetNoteParams::Comment)
227 else if (params_.type == InsetNoteParams::Greyedout)
228 type = "lyxgreyedout";
231 ss << "%\n\\begin{" << type << "}\n";
232 inset.latex(buf, ss, runparams);
233 ss << "%\n\\end{" << type << "}\n";
235 string const str = ss.str();
237 // Return how many newlines we issued.
238 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
242 int InsetNote::linuxdoc(Buffer const & buf, std::ostream & os,
243 OutputParams const & runparams) const
245 if (params_.type == InsetNoteParams::Note)
249 if (params_.type == InsetNoteParams::Comment)
252 inset.linuxdoc(buf, ss, runparams);
254 if (params_.type == InsetNoteParams::Comment)
255 ss << "\n</comment>\n";
257 string const str = ss.str();
259 // Return how many newlines we issued.
260 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
264 int InsetNote::docbook(Buffer const & buf, std::ostream & os,
265 OutputParams const & runparams) const
267 if (params_.type == InsetNoteParams::Note)
271 if (params_.type == InsetNoteParams::Comment)
274 inset.docbook(buf, ss, runparams);
276 if (params_.type == InsetNoteParams::Comment)
277 ss << "\n</remark>\n";
279 string const str = ss.str();
281 // Return how many newlines we issued.
282 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
286 int InsetNote::plaintext(Buffer const & buf, std::ostream & os,
287 OutputParams const & runparams) const
289 if (params_.type == InsetNoteParams::Note)
294 inset.plaintext(buf, ss, runparams);
297 string const str = ss.str();
299 // Return how many newlines we issued.
300 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
304 void InsetNote::validate(LaTeXFeatures & features) const
306 if (params_.type == InsetNoteParams::Comment)
307 features.require("verbatim");
308 if (params_.type == InsetNoteParams::Greyedout) {
309 features.require("color");
310 features.require("lyxgreyedout");
312 inset.validate(features);
317 string const InsetNoteMailer:: name_("note");
319 InsetNoteMailer::InsetNoteMailer(InsetNote & inset)
324 string const InsetNoteMailer::inset2string(Buffer const &) const
326 return params2string(inset_.params());
330 string const InsetNoteMailer::params2string(InsetNoteParams const & params)
333 data << name_ << ' ';
339 void InsetNoteMailer::string2params(string const & in,
340 InsetNoteParams & params)
342 params = InsetNoteParams();
347 istringstream data(in);
353 if (!lex || name != name_)
354 return print_mailer_error("InsetNoteMailer", in, 1, name_);
356 // This is part of the inset proper that is usually swallowed
357 // by LyXText::readInset
360 if (!lex || id != "Note")
361 return print_mailer_error("InsetBoxMailer", in, 2, "Note");