X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetert.C;h=9daea852d7b7aee8c56c8d537e6cb369fef6ae35;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=cc1ea5ba3ced5ca192dded39962137738a777e60;hpb=8075064372c5361f2dfd91860003f0cb317b4e39;p=lyx.git diff --git a/src/insets/insetert.C b/src/insets/insetert.C index cc1ea5ba3c..9daea852d7 100644 --- a/src/insets/insetert.C +++ b/src/insets/insetert.C @@ -16,17 +16,29 @@ #include "insetert.h" #include "gettext.h" #include "lyxfont.h" +#include "language.h" #include "buffer.h" -#include "insets/insettext.h" -#include "support/LOstream.h" #include "lyx_gui_misc.h" #include "BufferView.h" #include "LyXView.h" #include "lyxtext.h" -#include "frontends/Dialogs.h" #include "debug.h" +#include "lyxtextclasslist.h" + +#include "insets/insettext.h" + +#include "frontends/Dialogs.h" +#include "frontends/Alert.h" + +#include "support/LOstream.h" + using std::ostream; +using std::min; +using std::endl; + +using lyx::pos_type; + void InsetERT::init() { @@ -36,7 +48,6 @@ void InsetERT::init() labelfont.decSize(); labelfont.setColor(LColor::latex); setInsetName("ERT"); - } @@ -67,12 +78,20 @@ Inset * InsetERT::clone(Buffer const &, bool same_id) const InsetERT::InsetERT(string const & contents, bool collapsed) : InsetCollapsable(collapsed) { + if (collapsed) + status_ = Collapsed; + else + status_ = Open; +#ifndef INHERIT_LANG + LyXFont font(LyXFont::ALL_INHERIT, latex_language); +#else LyXFont font(LyXFont::ALL_INHERIT); +#endif font.setFamily(LyXFont::TYPEWRITER_FAMILY); font.setColor(LColor::latex); string::const_iterator cit = contents.begin(); string::const_iterator end = contents.end(); - Paragraph::size_type pos = 0; + pos_type pos = 0; for (; cit != end; ++cit) { inset.paragraph()->insertChar(pos++, *cit, font); } @@ -99,28 +118,61 @@ void InsetERT::read(Buffer const * buf, LyXLex & lex) string const tmp_token = lex.getString(); if (tmp_token == "Inlined") { - status_ = Inlined; + status(0, Inlined); } else if (tmp_token == "Collapsed") { - status_ = Collapsed; + status(0, Collapsed); } else { // leave this as default! - status_ = Open; + status(0, Open); } token_found = true; } else { lyxerr << "InsetERT::Read: Missing 'status'-tag!" - << std::endl; + << endl; // take countermeasures lex.pushToken(token); } } - InsetCollapsable::read(buf, lex); +#if 0 +#warning this should be really short lived only for compatibility to +#warning files written 07/08/2001 so this has to go before 1.2.0! (Jug) + if (lex.isOK()) { + lex.next(); + string const token = lex.getString(); + if (token == "collapsed") { + lex.next(); + collapsed_ = lex.getBool(); + } else { + // Take countermeasures + lex.pushToken(token); + } + } +#endif + inset.read(buf, lex); + +#ifndef INHERIT_LANG + LyXFont font(LyXFont::ALL_INHERIT, latex_language); +#else + LyXFont font(LyXFont::ALL_INHERIT); +#endif + + font.setFamily(LyXFont::TYPEWRITER_FAMILY); + font.setColor(LColor::latex); + Paragraph * par = inset.paragraph(); + while (par) { + pos_type siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + par->setFont(i, font); + } + par = par->next(); + } + if (!token_found) { if (collapsed_) { - status_ = Collapsed; + status(0, Collapsed); } else { - status_ = Open; + status(0, Open); } } setButtonLabel(); @@ -131,7 +183,7 @@ void InsetERT::write(Buffer const * buf, ostream & os) const { string st; - switch(status_) { + switch (status_) { case Open: st = "Open"; break; @@ -145,7 +197,34 @@ void InsetERT::write(Buffer const * buf, ostream & os) const os << getInsetName() << "\n" << "status "<< st << "\n"; - InsetCollapsable::write(buf, os); + + //inset.writeParagraphData(buf, os); + string const layout = + textclasslist.NameOfLayout(buf->params.textclass, 0); + Paragraph * par = inset.paragraph(); + while (par) { + os << "\n\\layout " << layout << "\n"; + pos_type siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + Paragraph::value_type c = par->getChar(i); + switch (c) { + case Paragraph::META_INSET: + case Paragraph::META_HFILL: + lyxerr << "Element is not allowed in insertERT" + << endl; + case Paragraph::META_NEWLINE: + os << "\n\\newline \n"; + break; + case '\\': + os << "\n\\backslash \n"; + break; + default: + os << c; + break; + } + } + par = par->next(); + } } @@ -166,16 +245,38 @@ void InsetERT::setFont(BufferView *, LyXFont const &, bool, bool selectall) // if selectall is activated then the fontchange was an outside general // fontchange and this messages is not needed if (!selectall) - WriteAlert(_("Impossible Operation!"), + Alert::alert(_("Impossible Operation!"), _("Not permitted to change font-types inside ERT-insets!"), _("Sorry.")); } +void InsetERT::updateStatus(BufferView * bv, bool swap) const +{ + if (status_ != Inlined) { + if (collapsed_) { + status(bv, swap ? Open : Collapsed); + } else { + status(bv, swap ? Collapsed : Open); + } + } +} + + void InsetERT::edit(BufferView * bv, int x, int y, unsigned int button) { - InsetCollapsable::edit(bv, x, y, button); + if (button == 3) + return; + + if (status_ == Inlined) { + if (!bv->lockInset(this)) + return; + inset.edit(bv, x, y, button); + } else { + InsetCollapsable::edit(bv, x, y, button); + } set_latex_font(bv); + updateStatus(bv); } @@ -190,58 +291,75 @@ Inset::EDITABLE InsetERT::editable() const void InsetERT::edit(BufferView * bv, bool front) { InsetCollapsable::edit(bv, front); + updateStatus(0); set_latex_font(bv); } -void InsetERT::insetButtonRelease(BufferView * bv, int x, int y, int button) + + +void InsetERT::insetButtonPress(BufferView * bv, + int x, int y, int button) +{ + if (status_ == Inlined) { + inset.insetButtonPress(bv, x, y, button); + } else { + InsetCollapsable::insetButtonPress(bv, x, y, button); + } +} + + +bool InsetERT::insetButtonRelease(BufferView * bv, int x, int y, int button) { if (button == 3) { showInsetDialog(bv); - return; + return true; } - if ((x >= 0) && (x < button_length) && - (y >= button_top_y) && (y <= button_bottom_y)) - { -// if (collapsed_) { -// setLabel(_("ERT")); -// } else { -// setLabel(get_new_label()); -// } - if (collapsed_) { - status(bv, Open); -// collapsed_ = false; -// inset.insetButtonRelease(bv, 0, 0, button); -// inset.setUpdateStatus(bv, InsetText::FULL); -// bv->updateInset(this, true); - } else { - status(bv, Collapsed); -// collapsed_ = true; -// bv->unlockInset(this); -// bv->updateInset(this, true); - } - } else if (!collapsed_ && (y > button_bottom_y)) { + + if (status_ != Inlined && (x >= 0) && (x < button_length) && + (y >= button_top_y) && (y <= button_bottom_y)) { + updateStatus(bv, true); + } else { LyXFont font(LyXFont::ALL_SANE); - int yy = ascent(bv, font) + y - - (ascent_collapsed() + - descent_collapsed() + - inset.ascent(bv, font)); - inset.insetButtonRelease(bv, x, yy, button); + int yy = ascent(bv, font) + y - inset.ascent(bv, font); + + // inlined is special - the text appears above + // button_bottom_y + if (status_ == Inlined) { + inset.insetButtonRelease(bv, x, yy, button); + } else if (!collapsed_ && (y > button_bottom_y)) { + yy -= (ascent_collapsed() + descent_collapsed()); + inset.insetButtonRelease(bv, x, yy, button); + } } + return false; } -int InsetERT::latex(Buffer const *, std::ostream & os, bool /*fragile*/, +void InsetERT::insetMotionNotify(BufferView * bv, + int x, int y, int state) +{ + if (status_ == Inlined) { + inset.insetMotionNotify(bv, x, y, state); + } else { + InsetCollapsable::insetMotionNotify(bv, x, y, state); + } +} + + +int InsetERT::latex(Buffer const *, ostream & os, bool /*fragile*/, bool /*free_spc*/) const { Paragraph * par = inset.paragraph(); + int lines = 0; while (par) { - Paragraph::size_type siz = inset.paragraph()->size(); - for (Paragraph::size_type i = 0; i != siz; ++i) { - char c = inset.paragraph()->getChar(i); + pos_type siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + Paragraph::value_type c = par->getChar(i); switch (c) { case Paragraph::META_NEWLINE: os << '\n'; + ++lines; break; default: os << c; @@ -249,28 +367,78 @@ int InsetERT::latex(Buffer const *, std::ostream & os, bool /*fragile*/, } } par = par->next(); + if (par) { + os << "\n\n"; + lines += 2; + } } - return 1; + return lines; } int InsetERT::ascii(Buffer const *, - std::ostream &, int /*linelen*/) const + ostream &, int /*linelen*/) const { return 0; } -int InsetERT::linuxdoc(Buffer const *, std::ostream &) const +int InsetERT::linuxdoc(Buffer const *, ostream & os) const { - return 0; + Paragraph * par = inset.paragraph(); + int lines = 0; + while (par) { + pos_type siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + Paragraph::value_type c = par->getChar(i); + switch (c) { + case Paragraph::META_NEWLINE: + os << '\n'; + ++lines; + break; + default: + os << c; + break; + } + } + par = par->next(); + if (par) { + os << "\n"; + lines ++; + } + } + + return lines; } -int InsetERT::docBook(Buffer const *, std::ostream &) const +int InsetERT::docbook(Buffer const *, ostream & os) const { - return 0; + Paragraph * par = inset.paragraph(); + int lines = 0; + while (par) { + pos_type siz = par->size(); + for (pos_type i = 0; i < siz; ++i) { + Paragraph::value_type c = par->getChar(i); + switch (c) { + case Paragraph::META_NEWLINE: + os << '\n'; + ++lines; + break; + default: + os << c; + break; + } + } + par = par->next(); + if (par) { + os << "\n"; + lines ++; + } + } + + return lines; } @@ -283,16 +451,22 @@ InsetERT::localDispatch(BufferView * bv, kb_action action, string const & arg) set_latex_font(bv); } - switch(action) { + switch (action) { case LFUN_LAYOUT: bv->owner()->setLayout(inset.paragraph()->getLayout()); break; default: result = InsetCollapsable::localDispatch(bv, action, arg); } - switch(action) { + switch (action) { case LFUN_BREAKPARAGRAPH: case LFUN_BREAKPARAGRAPHKEEPLAYOUT: + case LFUN_BACKSPACE: + case LFUN_BACKSPACE_SKIP: + case LFUN_DELETE: + case LFUN_DELETE_SKIP: + case LFUN_DELETE_LINE_FORWARD: + case LFUN_CUT: set_latex_font(bv); break; @@ -306,10 +480,9 @@ InsetERT::localDispatch(BufferView * bv, kb_action action, string const & arg) string const InsetERT::get_new_label() const { string la; - Paragraph::size_type const max_length = 15; - - Paragraph::size_type const p_siz = inset.paragraph()->size(); - Paragraph::size_type const n = std::min(max_length, p_siz); + pos_type const max_length = 15; + pos_type const p_siz = inset.paragraph()->size(); + pos_type const n = min(max_length, p_siz); int i = 0; int j = 0; for(; i < n && j < p_siz; ++j) { @@ -328,7 +501,7 @@ string const InsetERT::get_new_label() const } -void InsetERT::setButtonLabel() +void InsetERT::setButtonLabel() const { if (status_ == Collapsed) { setLabel(get_new_label()); @@ -340,7 +513,11 @@ void InsetERT::setButtonLabel() bool InsetERT::checkInsertChar(LyXFont & font) { +#ifndef INHERIT_LANG + LyXFont f(LyXFont::ALL_INHERIT, latex_language); +#else LyXFont f(LyXFont::ALL_INHERIT); +#endif font = f; font.setFamily(LyXFont::TYPEWRITER_FAMILY); font.setColor(LColor::latex); @@ -409,6 +586,7 @@ void InsetERT::draw(BufferView * bv, LyXFont const & f, } top_x = int(x); + topx_set = true; top_baseline = baseline; int const bl = baseline - ascent(bv, f) + ascent_collapsed(); @@ -427,7 +605,11 @@ void InsetERT::draw(BufferView * bv, LyXFont const & f, void InsetERT::set_latex_font(BufferView * bv) { +#ifndef INHERIT_LANG + LyXFont font(LyXFont::ALL_INHERIT, latex_language); +#else LyXFont font(LyXFont::ALL_INHERIT); +#endif font.setFamily(LyXFont::TYPEWRITER_FAMILY); font.setColor(LColor::latex); @@ -435,11 +617,11 @@ void InsetERT::set_latex_font(BufferView * bv) } -void InsetERT::status(BufferView * bv, ERTStatus const st) +void InsetERT::status(BufferView * bv, ERTStatus const st) const { if (st != status_) { status_ = st; - switch(st) { + switch (st) { case Inlined: inset.setAutoBreakRows(false); break; @@ -454,10 +636,12 @@ void InsetERT::status(BufferView * bv, ERTStatus const st) collapsed_ = true; need_update = FULL; setButtonLabel(); - bv->unlockInset(this); + if (bv) + bv->unlockInset(const_cast(this)); break; } - bv->updateInset(this, true); + if (bv) + bv->updateInset(const_cast(this), false); } } @@ -477,9 +661,16 @@ void InsetERT::open(BufferView * bv) } -void InsetERT::close(BufferView * bv) +void InsetERT::close(BufferView * bv) const { if (collapsed_) return; status(bv, Collapsed); } + + +string const InsetERT::selectNextWordToSpellcheck(BufferView * bv,float &) const +{ + bv->unlockInset(const_cast(this)); + return string(); +}