X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetert.C;h=15e936c5d201310f9aa7f5b120d24ff2615ae09a;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=712a1c0ddc09b3348d613d2f4c4a866d2913bd3c;hpb=323cafa18c2315759087d976e800aebd894fb40f;p=lyx.git diff --git a/src/insets/insetert.C b/src/insets/insetert.C index 712a1c0ddc..15e936c5d2 100644 --- a/src/insets/insetert.C +++ b/src/insets/insetert.C @@ -32,12 +32,13 @@ #include "paragraph.h" #include "frontends/Alert.h" -#include "frontends/LyXView.h" #include -using lyx::pos_type; -using lyx::support::token; + +namespace lyx { + +using support::token; using std::endl; using std::min; @@ -58,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")); } @@ -83,23 +86,19 @@ auto_ptr InsetERT::doClone() const } +#if 0 InsetERT::InsetERT(BufferParams const & bp, Language const *, string const & contents, CollapseStatus status) : InsetCollapsable(bp, status) { - //LyXFont font(LyXFont::ALL_INHERIT, lang); - LyXFont font; - getDrawFont(font); - string::const_iterator cit = contents.begin(); - string::const_iterator end = contents.end(); - pos_type pos = 0; - for (; cit != end; ++cit) - 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() @@ -115,13 +114,37 @@ 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::const_iterator par = paragraphs().begin(); @@ -132,10 +155,10 @@ int InsetERT::latex(Buffer const &, ostream & os, 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; - os << par->getChar(i); + os.put(par->getChar(i)); } ++par; if (par != end) { @@ -148,36 +171,14 @@ 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 -{ - 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) - os << par->getChar(i); - ++par; - if (par != end) { - os << "\n"; - lines ++; - } - } - - return lines; -} - - -int InsetERT::docbook(Buffer const &, ostream & os, +int InsetERT::docbook(Buffer const &, odocstream & os, OutputParams const &) const { ParagraphList::const_iterator par = paragraphs().begin(); @@ -187,7 +188,7 @@ int InsetERT::docbook(Buffer const &, ostream & os, while (par != end) { pos_type siz = par->size(); for (pos_type i = 0; i < siz; ++i) - os << par->getChar(i); + os.put(par->getChar(i)); ++par; if (par != end) { os << "\n"; @@ -204,14 +205,21 @@ void InsetERT::doDispatch(LCursor & cur, FuncRequest & cmd) //lyxerr << "\nInsetERT::doDispatch (begin): cmd: " << cmd << endl; switch (cmd.action) { + 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(cmd.argument, st); - setStatus(st); + InsetERTMailer::string2params(to_utf8(cmd.argument()), st); + setStatus(cur, st); break; } case LFUN_PASTE: - case LFUN_PASTESELECTION: { + case LFUN_CLIPBOARD_PASTE: + case LFUN_PRIMARY_SELECTION_PASTE: { InsetCollapsable::doDispatch(cur, cmd); // Since we can only store plain text, we must reset all @@ -222,12 +230,11 @@ void InsetERT::doDispatch(LCursor & cur, FuncRequest & cmd) LyXLayout_ptr const layout = bp.getLyXTextClass().defaultLayout(); LyXFont font = layout->font; - // We need to set the language for non-english documents - font.setLanguage(bp.language); + // 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) { - par->layout(layout); // in case par had a manual label par->setBeginOfBody(); pos_type const siz = par->size(); @@ -239,6 +246,15 @@ void InsetERT::doDispatch(LCursor & cur, FuncRequest & cmd) 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; } @@ -250,108 +266,113 @@ bool InsetERT::getStatus(LCursor & cur, FuncRequest const & cmd, { switch (cmd.action) { // suppress these - case LFUN_ACUTE: - case LFUN_BREVE: - case LFUN_CARON: - case LFUN_CEDILLA: - case LFUN_CIRCLE: - case LFUN_CIRCUMFLEX: - case LFUN_DOT: - case LFUN_GRAVE: - case LFUN_HUNG_UMLAUT: - case LFUN_MACRON: - case LFUN_OGONEK: - case LFUN_SPECIAL_CARON: - case LFUN_TIE: - case LFUN_TILDE: - case LFUN_UMLAUT: - case LFUN_UNDERBAR: - case LFUN_UNDERDOT: + 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_BREAKLINE: - case LFUN_INSET_CAPTION: - case LFUN_DEPTH_MIN: - case LFUN_DEPTH_PLUS: - case LFUN_LDOTS: - case LFUN_END_OF_SENTENCE: + 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_INSET_ERT: + case LFUN_ERT_INSERT: case LFUN_FILE_INSERT: - case LFUN_INSET_FLOAT: - case LFUN_INSET_WIDE_FLOAT: - case LFUN_INSET_WRAP: - 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_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_UNDERLINE: - case LFUN_INSET_FOOTNOTE: - case LFUN_HFILL: - case LFUN_HTMLURL: - case LFUN_HYPHENATION: - case LFUN_LIGATURE_BREAK: + 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_INSERT_LABEL: - case LFUN_INSET_OPTARG: - case LFUN_INSERT_BIBITEM: - case LFUN_INSERT_LINE: - case LFUN_INSERT_PAGEBREAK: + 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_INSET_MARGINAL: + case LFUN_MARGINALNOTE_INSERT: case LFUN_MATH_DISPLAY: - case LFUN_INSERT_MATH: - case LFUN_INSERT_MATRIX: + case LFUN_MATH_INSERT: + case LFUN_MATH_MATRIX: case LFUN_MATH_MODE: - case LFUN_MENU_OPEN_BY_NAME: - case LFUN_MENU_SEPARATOR: - case LFUN_INSERT_BRANCH: - case LFUN_INSERT_CHARSTYLE: - case LFUN_INSERT_NOTE: - case LFUN_INSERT_BOX: - case LFUN_GOTONOTE: + 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_QUOTE: - case LFUN_REF_GOTO: - case LFUN_REFERENCE_GOTO: + case LFUN_LABEL_GOTO: + case LFUN_REFERENCE_NEXT: case LFUN_SPACE_INSERT: - case LFUN_GOTOFILEROW: - case LFUN_NOTIFY: - case LFUN_SETXY: + 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: + case LFUN_URL_INSERT: case LFUN_FLOAT_LIST: case LFUN_INSET_INSERT: - case LFUN_PARAGRAPH_APPLY: + 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_PASTESELECTION: + 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_SEQUENCE: { + case LFUN_COMMAND_SEQUENCE: { // argument contains ';'-terminated commands - string const firstcmd = token(cmd.argument, ';', 0); + string const firstcmd = token(to_utf8(cmd.argument()), ';', 0); FuncRequest func(lyxaction.lookupFunc(firstcmd)); func.origin = cmd.origin; return getStatus(cur, func, status); @@ -365,7 +386,8 @@ bool InsetERT::getStatus(LCursor & cur, FuncRequest const & cmd, void InsetERT::setButtonLabel() { - setLabel(status() == Collapsed ? getNewLabel(_("ERT")) : _("ERT")); + // FIXME UNICODE + setLabel(isOpen() ? _("ERT") : getNewLabel(_("ERT"))); } @@ -375,14 +397,16 @@ bool InsetERT::insetAllowed(InsetBase::Code /* code */) const } -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; } @@ -390,8 +414,7 @@ void InsetERT::draw(PainterInfo & pi, int x, int y) const { LyXFont tmpfont = pi.base.font; getDrawFont(pi.base.font); - // I don't understand why the above .realize isn't needed, or - // even wanted, here. It just works. -- MV 10.04.2005 + pi.base.font.realize(tmpfont); InsetCollapsable::draw(pi, x, y); pi.base.font = tmpfont; } @@ -455,3 +478,6 @@ InsetERTMailer::params2string(InsetCollapsable::CollapseStatus status) data << name_ << ' ' << status; return data.str(); } + + +} // namespace lyx