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"
18 #include "BufferParams.h"
19 #include "BufferView.h"
20 #include "BufferParams.h"
24 #include "DispatchResult.h"
26 #include "FuncRequest.h"
27 #include "FuncStatus.h"
29 #include "LaTeXFeatures.h"
31 #include "MetricsInfo.h"
32 #include "OutputParams.h"
34 #include "support/Translator.h"
44 using std::istringstream;
46 using std::ostringstream;
51 typedef Translator<std::string, InsetNoteParams::Type> NoteTranslator;
52 typedef Translator<docstring, InsetNoteParams::Type> NoteTranslatorLoc;
54 NoteTranslator const init_notetranslator()
56 NoteTranslator translator("Note", InsetNoteParams::Note);
57 translator.addPair("Comment", InsetNoteParams::Comment);
58 translator.addPair("Greyedout", InsetNoteParams::Greyedout);
59 translator.addPair("Framed", InsetNoteParams::Framed);
60 translator.addPair("Shaded", InsetNoteParams::Shaded);
65 NoteTranslatorLoc const init_notetranslator_loc()
67 NoteTranslatorLoc translator(_("Note"), InsetNoteParams::Note);
68 translator.addPair(_("Comment"), InsetNoteParams::Comment);
69 translator.addPair(_("Greyed out"), InsetNoteParams::Greyedout);
70 translator.addPair(_("Framed"), InsetNoteParams::Framed);
71 translator.addPair(_("Shaded"), InsetNoteParams::Shaded);
76 NoteTranslator const & notetranslator()
78 static NoteTranslator translator = init_notetranslator();
83 NoteTranslatorLoc const & notetranslator_loc()
85 static NoteTranslatorLoc translator = init_notetranslator_loc();
94 InsetNoteParams::InsetNoteParams()
99 void InsetNoteParams::write(ostream & os) const
101 string const label = notetranslator().find(type);
102 os << "Note " << label << "\n";
106 void InsetNoteParams::read(Lexer & lex)
111 type = notetranslator().find(label);
115 InsetNote::InsetNote(BufferParams const & bp, string const & label)
116 : InsetCollapsable(bp)
118 params_.type = notetranslator().find(label);
124 InsetNote::InsetNote(InsetNote const & in)
125 : InsetCollapsable(in), params_(in.params_)
131 InsetNote::~InsetNote()
133 InsetNoteMailer(*this).hideDialog();
137 auto_ptr<Inset> InsetNote::doClone() const
139 return auto_ptr<Inset>(new InsetNote(*this));
143 docstring const InsetNote::editMessage() const
145 return _("Opened Note Inset");
149 docstring InsetNote::name() const
151 return from_ascii(string("Note") + string(":") + string(notetranslator().find(params_.type)));
155 Inset::DisplayType InsetNote::display() const
157 switch (params_.type) {
158 case InsetNoteParams::Framed:
159 case InsetNoteParams::Shaded:
167 void InsetNote::write(Buffer const & buf, ostream & os) const
170 InsetCollapsable::write(buf, os);
174 void InsetNote::read(Buffer const & buf, Lexer & lex)
177 InsetCollapsable::read(buf, lex);
178 setLayout(buf.params());
183 void InsetNote::setButtonLabel()
185 docstring const label = notetranslator_loc().find(params_.type);
190 Color_color InsetNote::backgroundColor() const
193 switch (params_.type) {
194 case InsetNoteParams::Note:
197 case InsetNoteParams::Comment:
198 c = Color::commentbg;
200 case InsetNoteParams::Greyedout:
201 c = Color::greyedoutbg;
203 case InsetNoteParams::Framed:
204 c = Color::greyedoutbg;
206 case InsetNoteParams::Shaded:
214 bool InsetNote::showInsetDialog(BufferView * bv) const
216 InsetNoteMailer(const_cast<InsetNote &>(*this)).showDialog(bv);
221 void InsetNote::doDispatch(Cursor & cur, FuncRequest & cmd)
223 switch (cmd.action) {
225 case LFUN_INSET_MODIFY:
226 InsetNoteMailer::string2params(to_utf8(cmd.argument()), params_);
227 // get a bp from cur:
228 setLayout(cur.buffer().params());
232 case LFUN_INSET_DIALOG_UPDATE:
233 InsetNoteMailer(*this).updateDialog(&cur.bv());
236 case LFUN_MOUSE_RELEASE:
237 if (cmd.button() == mouse_button::button3 && hitButton(cmd))
238 InsetNoteMailer(*this).showDialog(&cur.bv());
240 InsetCollapsable::doDispatch(cur, cmd);
244 InsetCollapsable::doDispatch(cur, cmd);
250 bool InsetNote::getStatus(Cursor & cur, FuncRequest const & cmd,
251 FuncStatus & flag) const
253 switch (cmd.action) {
255 case LFUN_INSET_MODIFY:
256 case LFUN_INSET_DIALOG_UPDATE:
261 return InsetCollapsable::getStatus(cur, cmd, flag);
265 void InsetNote::updateLabels(Buffer const & buf, ParIterator const & it)
267 TextClass const & tclass = buf.params().getTextClass();
268 Counters savecnt = tclass.counters();
269 InsetCollapsable::updateLabels(buf, it);
270 tclass.counters() = savecnt;
274 int InsetNote::latex(Buffer const & buf, odocstream & os,
275 OutputParams const & runparams_in) const
277 if (params_.type == InsetNoteParams::Note)
280 OutputParams runparams(runparams_in);
281 if (params_.type == InsetNoteParams::Comment) {
282 runparams.inComment = true;
283 // Ignore files that are exported inside a comment
284 runparams.exportdata.reset(new ExportData);
288 //ss << "%\n\\begin{" << from_ascii(type) << "}\n";
289 ss << "%\n\\begin{" << from_ascii(layout_.latexname) << "}\n";
290 InsetText::latex(buf, ss, runparams);
291 ss << "\n\\end{" << from_ascii(layout_.latexname) << "}\n";
292 // the space after the comment in 'a[comment] b' will be eaten by the
293 // comment environment since the space before b is ignored with the
294 // following latex output:
302 // Adding {} before ' b' fixes this.
303 if (params_.type == InsetNoteParams::Comment)
306 docstring const str = ss.str();
308 runparams_in.encoding = runparams.encoding;
309 // Return how many newlines we issued.
310 return int(std::count(str.begin(), str.end(), '\n'));
314 int InsetNote::plaintext(Buffer const & buf, odocstream & os,
315 OutputParams const & runparams_in) const
317 if (params_.type == InsetNoteParams::Note)
320 OutputParams runparams(runparams_in);
321 if (params_.type == InsetNoteParams::Comment) {
322 runparams.inComment = true;
323 // Ignore files that are exported inside a comment
324 runparams.exportdata.reset(new ExportData);
326 os << '[' << buf.B_("note") << ":\n";
327 InsetText::plaintext(buf, os, runparams);
330 return PLAINTEXT_NEWLINE + 1; // one char on a separate line
334 int InsetNote::docbook(Buffer const & buf, odocstream & os,
335 OutputParams const & runparams_in) const
337 if (params_.type == InsetNoteParams::Note)
340 OutputParams runparams(runparams_in);
341 if (params_.type == InsetNoteParams::Comment) {
343 runparams.inComment = true;
344 // Ignore files that are exported inside a comment
345 runparams.exportdata.reset(new ExportData);
348 int const n = InsetText::docbook(buf, os, runparams);
350 if (params_.type == InsetNoteParams::Comment)
351 os << "\n</remark>\n";
353 // Return how many newlines we issued.
354 //return int(count(str.begin(), str.end(), '\n'));
359 void InsetNote::validate(LaTeXFeatures & features) const
361 if (params_.type == InsetNoteParams::Comment)
362 features.require("verbatim");
363 if (params_.type == InsetNoteParams::Greyedout) {
364 features.require("color");
365 features.require("lyxgreyedout");
367 if (params_.type == InsetNoteParams::Shaded) {
368 features.require("color");
369 features.require("framed");
371 if (params_.type == InsetNoteParams::Framed)
372 features.require("framed");
373 InsetText::validate(features);
378 string const InsetNoteMailer::name_("note");
380 InsetNoteMailer::InsetNoteMailer(InsetNote & inset)
385 string const InsetNoteMailer::inset2string(Buffer const &) const
387 return params2string(inset_.params());
391 string const InsetNoteMailer::params2string(InsetNoteParams const & params)
394 data << name_ << ' ';
400 void InsetNoteMailer::string2params(string const & in,
401 InsetNoteParams & params)
403 params = InsetNoteParams();
408 istringstream data(in);
414 if (!lex || name != name_)
415 return print_mailer_error("InsetNoteMailer", in, 1, name_);
417 // This is part of the inset proper that is usually swallowed
418 // by Text::readInset
421 if (!lex || id != "Note")
422 return print_mailer_error("InsetBoxMailer", in, 2, "Note");