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(BufferView & bv, FuncRequest const & cmd)
189 switch (cmd.action) {
191 case LFUN_INSET_MODIFY: {
192 InsetNoteMailer::string2params(cmd.argument, params_);
195 return DispatchResult(true, true);
198 case LFUN_INSET_DIALOG_UPDATE:
199 InsetNoteMailer(*this).updateDialog(&bv);
200 return DispatchResult(true, true);
202 case LFUN_MOUSE_RELEASE:
203 if (cmd.button() == mouse_button::button3 && hitButton(cmd)) {
204 InsetNoteMailer(*this).showDialog(&bv);
205 return DispatchResult(true, true);
207 return InsetCollapsable::priv_dispatch(bv, cmd);
210 return InsetCollapsable::priv_dispatch(bv, cmd);
215 int InsetNote::latex(Buffer const & buf, ostream & os,
216 OutputParams const & runparams) const
218 if (params_.type == InsetNoteParams::Note)
222 if (params_.type == InsetNoteParams::Comment)
224 else if (params_.type == InsetNoteParams::Greyedout)
225 type = "lyxgreyedout";
228 ss << "%\n\\begin{" << type << "}\n";
229 inset.latex(buf, ss, runparams);
230 ss << "%\n\\end{" << type << "}\n";
232 string const str = ss.str();
234 // Return how many newlines we issued.
235 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
239 int InsetNote::linuxdoc(Buffer const & buf, std::ostream & os,
240 OutputParams const & runparams) const
242 if (params_.type == InsetNoteParams::Note)
246 if (params_.type == InsetNoteParams::Comment)
249 inset.linuxdoc(buf, ss, runparams);
251 if (params_.type == InsetNoteParams::Comment)
252 ss << "\n</comment>\n";
254 string const str = ss.str();
256 // Return how many newlines we issued.
257 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
261 int InsetNote::docbook(Buffer const & buf, std::ostream & os,
262 OutputParams const & runparams) const
264 if (params_.type == InsetNoteParams::Note)
268 if (params_.type == InsetNoteParams::Comment)
271 inset.docbook(buf, ss, runparams);
273 if (params_.type == InsetNoteParams::Comment)
274 ss << "\n</remark>\n";
276 string const str = ss.str();
278 // Return how many newlines we issued.
279 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
283 int InsetNote::plaintext(Buffer const & buf, std::ostream & os,
284 OutputParams const & runparams) const
286 if (params_.type == InsetNoteParams::Note)
291 inset.plaintext(buf, ss, runparams);
294 string const str = ss.str();
296 // Return how many newlines we issued.
297 return int(lyx::count(str.begin(), str.end(),'\n') + 1);
301 void InsetNote::validate(LaTeXFeatures & features) const
303 if (params_.type == InsetNoteParams::Comment)
304 features.require("verbatim");
305 if (params_.type == InsetNoteParams::Greyedout) {
306 features.require("color");
307 features.require("lyxgreyedout");
309 inset.validate(features);
314 string const InsetNoteMailer:: name_("note");
316 InsetNoteMailer::InsetNoteMailer(InsetNote & inset)
321 string const InsetNoteMailer::inset2string(Buffer const &) const
323 return params2string(inset_.params());
327 string const InsetNoteMailer::params2string(InsetNoteParams const & params)
330 data << name_ << ' ';
336 void InsetNoteMailer::string2params(string const & in,
337 InsetNoteParams & params)
339 params = InsetNoteParams();
344 istringstream data(in);
350 if (!lex || name != name_)
351 return print_mailer_error("InsetNoteMailer", in, 1, name_);
353 // This is part of the inset proper that is usually swallowed
354 // by LyXText::readInset
357 if (!lex || id != "Note")
358 return print_mailer_error("InsetBoxMailer", in, 2, "Note");