X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetert.C;h=15e936c5d201310f9aa7f5b120d24ff2615ae09a;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=73d067ec5a037aeed214dd8f96c638c6f9adbc1e;hpb=29ef6251e8eef7827bc10ee27c8ed320c65bdfcd;p=lyx.git diff --git a/src/insets/insetert.C b/src/insets/insetert.C index 73d067ec5a..15e936c5d2 100644 --- a/src/insets/insetert.C +++ b/src/insets/insetert.C @@ -16,22 +16,29 @@ #include "buffer.h" #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 "LColor.h" +#include "LyXAction.h" #include "lyxlex.h" +#include "lyxtextclass.h" #include "metricsinfo.h" +#include "ParagraphParameters.h" #include "paragraph.h" #include "frontends/Alert.h" -#include "frontends/LyXView.h" -#include "support/std_sstream.h" +#include -using lyx::pos_type; + +namespace lyx { + +using support::token; using std::endl; using std::min; @@ -52,8 +59,10 @@ void InsetERT::init() font.decSize(); font.setColor(LColor::latex); setLabelFont(font); + text_.current_font.setLanguage(latex_language); + text_.real_current_font.setLanguage(latex_language); - setInsetName("ERT"); + setInsetName(from_ascii("ERT")); } @@ -71,27 +80,25 @@ InsetERT::InsetERT(InsetERT const & in) } -auto_ptr InsetERT::clone() const +auto_ptr InsetERT::doClone() const { return auto_ptr(new InsetERT(*this)); } +#if 0 InsetERT::InsetERT(BufferParams const & bp, - Language const * l, string const & contents, CollapseStatus status) + Language const *, string const & contents, CollapseStatus status) : InsetCollapsable(bp, status) { - LyXFont font(LyXFont::ALL_INHERIT, l); - string::const_iterator cit = contents.begin(); - string::const_iterator end = contents.end(); - pos_type pos = 0; - for (; cit != end; ++cit) { - inset.paragraphs().begin()->insertChar(pos++, *cit, font); - } + LyXFont font(LyXFont::ALL_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(); } +#endif InsetERT::~InsetERT() @@ -107,32 +114,51 @@ void InsetERT::write(Buffer const & buf, ostream & os) const } -string const InsetERT::editMessage() const +void InsetERT::read(Buffer const & buf, LyXLex & 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. + LyXFont font(LyXFont::ALL_INHERIT, latex_language); + ParagraphList::iterator par = paragraphs().begin(); + ParagraphList::iterator const end = paragraphs().end(); + while (par != end) { + pos_type siz = par->size(); + for (pos_type i = 0; i <= siz; ++i) { + par->setFont(i, font); + } + ++par; + } +} + + +docstring const InsetERT::editMessage() const { return _("Opened ERT Inset"); } -int InsetERT::latex(Buffer const &, ostream & os, +int InsetERT::latex(Buffer const &, odocstream & os, OutputParams const &) const { - ParagraphList::iterator par = inset.paragraphs().begin(); - ParagraphList::iterator end = inset.paragraphs().end(); + ParagraphList::const_iterator par = paragraphs().begin(); + ParagraphList::const_iterator end = paragraphs().end(); int lines = 0; while (par != end) { pos_type siz = par->size(); for (pos_type i = 0; i < siz; ++i) { // ignore all struck out text - if (isDeletedText(*par, i)) + if (par->isDeleted(i)) continue; - if (par->isNewline(i)) { - os << '\n'; - ++lines; - } else { - os << par->getChar(i); - } + os.put(par->getChar(i)); } ++par; if (par != end) { @@ -145,34 +171,28 @@ int InsetERT::latex(Buffer const &, ostream & os, } -int InsetERT::plaintext(Buffer const &, ostream &, +int InsetERT::plaintext(Buffer const &, odocstream &, OutputParams const & /*runparams*/) const { return 0; } -int InsetERT::linuxdoc(Buffer const &, ostream & os, - OutputParams const &)const +int InsetERT::docbook(Buffer const &, odocstream & os, + OutputParams const &) const { - ParagraphList::iterator par = inset.paragraphs().begin(); - ParagraphList::iterator end = inset.paragraphs().end(); + ParagraphList::const_iterator par = paragraphs().begin(); + ParagraphList::const_iterator end = paragraphs().end(); int lines = 0; while (par != end) { pos_type siz = par->size(); - for (pos_type i = 0; i < siz; ++i) { - if (par->isNewline(i)) { - os << '\n'; - ++lines; - } else { - os << par->getChar(i); - } - } + for (pos_type i = 0; i < siz; ++i) + os.put(par->getChar(i)); ++par; if (par != end) { os << "\n"; - lines ++; + ++lines; } } @@ -180,88 +200,213 @@ int InsetERT::linuxdoc(Buffer const &, ostream & os, } -int InsetERT::docbook(Buffer const &, ostream & os, - OutputParams const &) const +void InsetERT::doDispatch(LCursor & cur, FuncRequest & cmd) { - ParagraphList::iterator par = inset.paragraphs().begin(); - ParagraphList::iterator end = inset.paragraphs().end(); + //lyxerr << "\nInsetERT::doDispatch (begin): cmd: " << cmd << endl; + switch (cmd.action) { - int lines = 0; - while (par != end) { - pos_type siz = par->size(); - for (pos_type i = 0; i < siz; ++i) { - if (par->isNewline(i)) { - os << '\n'; - ++lines; - } else { - os << par->getChar(i); + case LFUN_QUOTE_INSERT: { + // We need to bypass the fancy quotes in LyXText + 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 + + BufferParams const & bp = cur.buffer().params(); + LyXLayout_ptr const layout = + bp.getLyXTextClass().defaultLayout(); + LyXFont font = layout->font; + // ERT contents has always latex_language + font.setLanguage(latex_language); + ParagraphList::iterator const end = paragraphs().end(); + for (ParagraphList::iterator par = paragraphs().begin(); + par != end; ++par) { + // in case par had a manual label + par->setBeginOfBody(); + pos_type const siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + par->setFont(i, font); } + par->params().clear(); } - ++par; - if (par != end) { - os << "\n"; - lines ++; - } + break; + } + 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. + text_.current_font.setLanguage(latex_language); + text_.real_current_font.setLanguage(latex_language); + + InsetCollapsable::doDispatch(cur, cmd); + break; } - - return lines; } -DispatchResult InsetERT::priv_dispatch(LCursor & cur, FuncRequest const & cmd) +bool InsetERT::getStatus(LCursor & cur, FuncRequest const & cmd, + FuncStatus & status) const { - lyxerr << "\nInsetERT::priv_dispatch (begin): cmd: " << cmd << endl; switch (cmd.action) { + // suppress these + case LFUN_ACCENT_ACUTE: + case LFUN_ACCENT_BREVE: + case LFUN_ACCENT_CARON: + case LFUN_ACCENT_CEDILLA: + case LFUN_ACCENT_CIRCLE: + case LFUN_ACCENT_CIRCUMFLEX: + case LFUN_ACCENT_DOT: + case LFUN_ACCENT_GRAVE: + case LFUN_ACCENT_HUNGARIAN_UMLAUT: + case LFUN_ACCENT_MACRON: + case LFUN_ACCENT_OGONEK: + case LFUN_ACCENT_SPECIAL_CARON: + case LFUN_ACCENT_TIE: + case LFUN_ACCENT_TILDE: + case LFUN_ACCENT_UMLAUT: + case LFUN_ACCENT_UNDERBAR: + case LFUN_ACCENT_UNDERDOT: + case LFUN_APPENDIX: + case LFUN_BREAK_LINE: + case LFUN_CAPTION_INSERT: + case LFUN_DEPTH_DECREMENT: + case LFUN_DEPTH_INCREMENT: + case LFUN_DOTS_INSERT: + case LFUN_END_OF_SENTENCE_PERIOD_INSERT: + case LFUN_ENVIRONMENT_INSERT: + case LFUN_ERT_INSERT: + case LFUN_FILE_INSERT: + case LFUN_FLOAT_INSERT: + case LFUN_FLOAT_WIDE_INSERT: + case LFUN_WRAP_INSERT: + case LFUN_FONT_BOLD: + case LFUN_FONT_CODE: + case LFUN_FONT_DEFAULT: + case LFUN_FONT_EMPH: + case LFUN_FONT_FREE_APPLY: + case LFUN_FONT_FREE_UPDATE: + case LFUN_FONT_NOUN: + case LFUN_FONT_ROMAN: + case LFUN_FONT_SANS: + case LFUN_FONT_FRAK: + case LFUN_FONT_ITAL: + case LFUN_FONT_SIZE: + case LFUN_FONT_STATE: + case LFUN_FONT_UNDERLINE: + case LFUN_FOOTNOTE_INSERT: + case LFUN_HFILL_INSERT: + case LFUN_HTML_INSERT: + case LFUN_HYPHENATION_POINT_INSERT: + case LFUN_LIGATURE_BREAK_INSERT: + case LFUN_INDEX_INSERT: + case LFUN_INDEX_PRINT: + case LFUN_LABEL_INSERT: + case LFUN_OPTIONAL_INSERT: + case LFUN_BIBITEM_INSERT: + case LFUN_LINE_INSERT: + case LFUN_PAGEBREAK_INSERT: + case LFUN_CLEARPAGE_INSERT: + case LFUN_CLEARDOUBLEPAGE_INSERT: + case LFUN_LANGUAGE: + case LFUN_LAYOUT: + case LFUN_LAYOUT_PARAGRAPH: + case LFUN_LAYOUT_TABULAR: + case LFUN_MARGINALNOTE_INSERT: + case LFUN_MATH_DISPLAY: + case LFUN_MATH_INSERT: + case LFUN_MATH_MATRIX: + case LFUN_MATH_MODE: + case LFUN_MENU_OPEN: + case LFUN_MENU_SEPARATOR_INSERT: + case LFUN_BRANCH_INSERT: + case LFUN_CHARSTYLE_INSERT: + case LFUN_NOTE_INSERT: + case LFUN_BOX_INSERT: + case LFUN_NOTE_NEXT: + case LFUN_PARAGRAPH_SPACING: + case LFUN_LABEL_GOTO: + case LFUN_REFERENCE_NEXT: + case LFUN_SPACE_INSERT: + case LFUN_SERVER_GOTO_FILE_ROW: + case LFUN_SERVER_NOTIFY: + case LFUN_SERVER_SET_XY: + case LFUN_TABULAR_INSERT: + case LFUN_TOC_INSERT: + case LFUN_URL_INSERT: + case LFUN_FLOAT_LIST: + case LFUN_INSET_INSERT: + case LFUN_PARAGRAPH_PARAMS_APPLY: + case LFUN_PARAGRAPH_UPDATE: + case LFUN_NOMENCL_INSERT: + case LFUN_NOMENCL_PRINT: + case LFUN_NOACTION: + status.enabled(false); + return true; + + case LFUN_QUOTE_INSERT: + case LFUN_INSET_MODIFY: + case LFUN_PASTE: + case LFUN_CLIPBOARD_PASTE: + case LFUN_PRIMARY_SELECTION_PASTE: + status.enabled(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); + } - case LFUN_INSET_MODIFY: { - InsetCollapsable::CollapseStatus st; - InsetERTMailer::string2params(cmd.argument, st); - setStatus(st); - return DispatchResult(true, true); - } - - case LFUN_LAYOUT: - case LFUN_BOLD: - case LFUN_CODE: - case LFUN_DEFAULT: - case LFUN_EMPH: - case LFUN_FREEFONT_APPLY: - case LFUN_FREEFONT_UPDATE: - case LFUN_NOUN: - case LFUN_ROMAN: - case LFUN_SANS: - case LFUN_FRAK: - case LFUN_ITAL: - case LFUN_FONT_SIZE: - case LFUN_FONT_STATE: - case LFUN_UNDERLINE: - return DispatchResult(true); - - default: - return InsetCollapsable::priv_dispatch(cur, cmd); + default: + return InsetCollapsable::getStatus(cur, cmd, status); } } void InsetERT::setButtonLabel() { - setLabel(status() == Collapsed ? getNewLabel(_("ERT")) : _("ERT")); + // FIXME UNICODE + setLabel(isOpen() ? _("ERT") : getNewLabel(_("ERT"))); } -bool InsetERT::insetAllowed(InsetOld::Code code) const +bool InsetERT::insetAllowed(InsetBase::Code /* code */) const { - return code == InsetOld::NEWLINE_CODE; + return false; } -void InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const +bool InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const { LyXFont tmpfont = mi.base.font; getDrawFont(mi.base.font); + mi.base.font.realize(tmpfont); InsetCollapsable::metrics(mi, dim); mi.base.font = tmpfont; + bool const changed = dim_ != dim; dim_ = dim; + return changed; } @@ -269,6 +414,7 @@ void InsetERT::draw(PainterInfo & pi, int x, int y) const { LyXFont tmpfont = pi.base.font; getDrawFont(pi.base.font); + pi.base.font.realize(tmpfont); InsetCollapsable::draw(pi, x, y); pi.base.font = tmpfont; } @@ -332,3 +478,6 @@ InsetERTMailer::params2string(InsetCollapsable::CollapseStatus status) data << name_ << ' ' << status; return data.str(); } + + +} // namespace lyx