X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetERT.cpp;h=d120a58114d783aad6dacf6ce94048d0cf7dee9d;hb=1cdd5fcb6f76ef8066707c521eef0c01cead00dd;hp=06102b98cec00f87d48f4d30132a88a1f1eb7ba0;hpb=3a7509a901df7d97ec818c94e91345dc213a9d75;p=lyx.git diff --git a/src/insets/InsetERT.cpp b/src/insets/InsetERT.cpp index 06102b98ce..d120a58114 100644 --- a/src/insets/InsetERT.cpp +++ b/src/insets/InsetERT.cpp @@ -3,8 +3,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Jürgen Vigna - * \author Lars Gullik Bjønnes + * \author Jürgen Vigna + * \author Lars Gullik Bjønnes * * Full author contact details are available in file CREDITS. */ @@ -17,147 +17,73 @@ #include "BufferParams.h" #include "BufferView.h" #include "Cursor.h" -#include "debug.h" #include "DispatchResult.h" #include "FuncRequest.h" #include "FuncStatus.h" -#include "gettext.h" #include "Language.h" #include "Layout.h" -#include "LyXAction.h" #include "Lexer.h" -#include "TextClass.h" -#include "MetricsInfo.h" +#include "LyXAction.h" +#include "OutputParams.h" #include "ParagraphParameters.h" #include "Paragraph.h" +#include "TextClass.h" -#include "frontends/alert.h" +#include "support/gettext.h" +#include "support/lstrings.h" #include +using namespace std; +using namespace lyx::support; namespace lyx { -using support::token; - -using std::endl; -using std::min; - -using std::istringstream; -using std::ostream; -using std::ostringstream; -using std::string; - - -void InsetERT::init() -{ - setButtonLabel(); - setLabelFont(layout_.labelfont); - // FIXME: what to do with those? - //text_.current_font.setLanguage(latex_language); - //text_.real_current_font.setLanguage(latex_language); -} - - -InsetERT::InsetERT(BufferParams const & bp, CollapseStatus status) - : InsetCollapsable(bp, status) +InsetERT::InsetERT(Buffer * buf, CollapseStatus status) + : InsetCollapsable(buf) { - setLayout(bp); - init(); + status_ = status; } -InsetERT::InsetERT(InsetERT const & in) - : InsetCollapsable(in) +void InsetERT::write(ostream & os) const { - init(); -} - - -Inset * InsetERT::clone() const -{ - return new InsetERT(*this); -} - - -#if 0 -InsetERT::InsetERT(BufferParams const & bp, - Language const *, string const & contents, CollapseStatus status) - : InsetCollapsable(bp, status) -{ - Font font(FONT_INHERIT, latex_language); - paragraphs().begin()->insert(0, contents, font); - - // the init has to be after the initialization of the paragraph - // because of the label settings (draw_label for ert insets). - init(); + os << "ERT" << "\n"; + InsetCollapsable::write(os); } -#endif -InsetERT::~InsetERT() +int InsetERT::plaintext(odocstream & os, OutputParams const & rp) const { - InsetERTMailer(*this).hideDialog(); -} + if (!rp.inIndexEntry) + // do not output TeX code + return 0; + ParagraphList::const_iterator par = paragraphs().begin(); + ParagraphList::const_iterator end = paragraphs().end(); -void InsetERT::resetParagraphsFont() -{ - Font font(inherit_font, latex_language); - ParagraphList::iterator par = paragraphs().begin(); - ParagraphList::iterator const end = paragraphs().end(); while (par != end) { - par->resetFonts(font); - par->params().clear(); + pos_type siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + char_type const c = par->getChar(i); + // output the active characters + switch (c) { + case '|': + case '!': + case '@': + os.put(c); + break; + default: + break; + } + } ++par; } + return 0; } -void InsetERT::write(Buffer const & buf, ostream & os) const -{ - os << "ERT" << "\n"; - InsetCollapsable::write(buf, os); -} - - -void InsetERT::read(Buffer const & buf, Lexer & lex) -{ - InsetCollapsable::read(buf, lex); - - // Force default font - // This avoids paragraphs in buffer language that would have a - // foreign language after a document langauge change, and it ensures - // that all new text in ERT gets the "latex" language, since new text - // inherits the language from the last position of the existing text. - // As a side effect this makes us also robust against bugs in LyX - // that might lead to font changes in ERT in .lyx files. - resetParagraphsFont(); -} - - -docstring const InsetERT::editMessage() const -{ - return _("Opened ERT Inset"); -} - - -int InsetERT::latex(Buffer const & buf, odocstream & os, - OutputParams const & op) const -{ - return InsetCollapsable::latex(buf, os, op); -} - - -int InsetERT::plaintext(Buffer const &, odocstream &, - OutputParams const &) const -{ - return 0; // do not output TeX code -} - - -int InsetERT::docbook(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetERT::docbook(odocstream & os, OutputParams const &) const { // FIXME can we do the same thing here as for LaTeX? ParagraphList::const_iterator par = paragraphs().begin(); @@ -181,185 +107,74 @@ int InsetERT::docbook(Buffer const &, odocstream & os, void InsetERT::doDispatch(Cursor & cur, FuncRequest & cmd) { - BufferParams const & bp = cur.buffer().params(); - LayoutPtr const layout = - bp.getTextClass().defaultLayout(); - //lyxerr << "\nInsetERT::doDispatch (begin): cmd: " << cmd << endl; - switch (cmd.action) { - - case LFUN_MOUSE_PRESS: - if (cmd.button() != mouse_button::button3) - InsetCollapsable::doDispatch(cur, cmd); - else - // This makes the cursor leave the - // inset when it collapses on mouse-3 - cur.undispatched(); - break; - - case LFUN_QUOTE_INSERT: { - // We need to bypass the fancy quotes in Text - FuncRequest f(LFUN_SELF_INSERT, "\""); - dispatch(cur, f); - break; - } - case LFUN_INSET_MODIFY: { - InsetCollapsable::CollapseStatus st; - InsetERTMailer::string2params(to_utf8(cmd.argument()), st); - setStatus(cur, st); - break; - } - case LFUN_PASTE: - case LFUN_CLIPBOARD_PASTE: - case LFUN_PRIMARY_SELECTION_PASTE: { - InsetCollapsable::doDispatch(cur, cmd); - - // Since we can only store plain text, we must reset all - // attributes. - // FIXME: Change only the pasted paragraphs - - // ERT contents has always latex_language - resetParagraphsFont(); - break; - } + switch (cmd.action()) { + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "ert") { + cur.recordUndoInset(ATOMIC_UNDO, this); + setStatus(cur, string2params(to_utf8(cmd.argument()))); + break; + } + //fall-through default: - // Force any new text to latex_language - // FIXME: This should only be necessary in init(), but - // new paragraphs that are created by pressing enter at the - // start of an existing paragraph get the buffer language - // and not latex_language, so we take this brute force - // approach. - cur.current_font.fontInfo() = layout->font; - cur.real_current_font.fontInfo() = layout->font; - cur.current_font.setLanguage(latex_language); - cur.real_current_font.setLanguage(latex_language); InsetCollapsable::doDispatch(cur, cmd); break; } + } bool InsetERT::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { - switch (cmd.action) { - case LFUN_CLIPBOARD_PASTE: - case LFUN_INSET_MODIFY: - case LFUN_PASTE: - case LFUN_PRIMARY_SELECTION_PASTE: - case LFUN_QUOTE_INSERT: - status.enabled(true); + switch (cmd.action()) { + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "ert") { + status.setEnabled(true); return true; - - // this one is difficult to get right. As a half-baked - // solution, we consider only the first action of the sequence - case LFUN_COMMAND_SEQUENCE: { - // argument contains ';'-terminated commands - string const firstcmd = token(to_utf8(cmd.argument()), ';', 0); - FuncRequest func(lyxaction.lookupFunc(firstcmd)); - func.origin = cmd.origin; - return getStatus(cur, func, status); } + //fall through - default: - return InsetCollapsable::getStatus(cur, cmd, status); + default: + return InsetCollapsable::getStatus(cur, cmd, status); } } -void InsetERT::setButtonLabel() +docstring const InsetERT::buttonLabel(BufferView const & bv) const { - // FIXME UNICODE - if (decoration() == Classic) - setLabel(isOpen() ? _("ERT") : getNewLabel(_("ERT"))); + if (decoration() == InsetLayout::CLASSIC) + return isOpen(bv) ? _("ERT") : getNewLabel(_("ERT")); else - setLabel(getNewLabel(_("ERT"))); -} - - -bool InsetERT::insetAllowed(InsetCode /* code */) const -{ - return false; -} - - -void InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const -{ - FontInfo tmpfont = mi.base.font; - getDrawFont(mi.base.font); - mi.base.font.realize(tmpfont); - InsetCollapsable::metrics(mi, dim); - mi.base.font = tmpfont; -} - - -void InsetERT::draw(PainterInfo & pi, int x, int y) const -{ - FontInfo tmpfont = pi.base.font; - getDrawFont(pi.base.font); - pi.base.font.realize(tmpfont); - const_cast(*this).setButtonLabel(); - InsetCollapsable::draw(pi, x, y); - pi.base.font = tmpfont; -} - - -bool InsetERT::showInsetDialog(BufferView * bv) const -{ - InsetERTMailer(const_cast(*this)).showDialog(bv); - return true; -} - - -void InsetERT::getDrawFont(FontInfo & font) const -{ - font = inherit_font; - font.realize(layout_.font); -} - - -string const InsetERTMailer::name_("ert"); - -InsetERTMailer::InsetERTMailer(InsetERT & inset) - : inset_(inset) -{} - - -string const InsetERTMailer::inset2string(Buffer const &) const -{ - return params2string(inset_.status()); + return getNewLabel(_("ERT")); } -void InsetERTMailer::string2params(string const & in, - InsetCollapsable::CollapseStatus & status) +InsetCollapsable::CollapseStatus InsetERT::string2params(string const & in) { - status = InsetCollapsable::Collapsed; if (in.empty()) - return; - + return Collapsed; istringstream data(in); - Lexer lex(0,0); + Lexer lex; lex.setStream(data); - - string name; - lex >> name; - if (name != name_) - return print_mailer_error("InsetERTMailer", in, 1, name_); - + lex.setContext("InsetERT::string2params"); + lex >> "ert"; int s; lex >> s; - if (lex) - status = static_cast(s); + return static_cast(s); } -string const -InsetERTMailer::params2string(InsetCollapsable::CollapseStatus status) +string InsetERT::params2string(CollapseStatus status) { ostringstream data; - data << name_ << ' ' << status; + data << "ert" << ' ' << status; return data.str(); } +docstring InsetERT::xhtml(XHTMLStream &, OutputParams const &) const +{ + return docstring(); +} + } // namespace lyx