X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetert.C;h=37fc79acc64456f9aa8825f7a73db9708581581b;hb=ce1f7f257823c9995035c6cbb75f1ea63d9995b6;hp=a05d684befce813b607869621a26c187f41eb72c;hpb=6b5c9696b6669b48062bec96707c78d605e1af58;p=lyx.git diff --git a/src/insets/insetert.C b/src/insets/insetert.C index a05d684bef..37fc79acc6 100644 --- a/src/insets/insetert.C +++ b/src/insets/insetert.C @@ -1,36 +1,37 @@ -/* This file is part of - * ====================================================== +/** + * \file insetert.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * LyX, The Document Processor + * \author Jürgen Vigna + * \author Lars Gullik Bjønnes * - * Copyright 1998 The LyX Team. - * - *======================================================*/ - + * Full author contact details are available in file CREDITS + */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "insetert.h" -#include "gettext.h" -#include "lyxfont.h" -#include "language.h" +#include "insettext.h" + #include "buffer.h" #include "BufferView.h" -#include "frontends/LyXView.h" -#include "lyxtext.h" #include "debug.h" -#include "lyxrow.h" +#include "funcrequest.h" +#include "gettext.h" +#include "language.h" +#include "lyxfont.h" #include "lyxlex.h" +#include "lyxrow.h" +#include "lyxtext.h" +#include "WordLangTuple.h" -#include "insets/insettext.h" - -#include "frontends/Dialogs.h" #include "frontends/Alert.h" +#include "frontends/Dialogs.h" +#include "frontends/LyXView.h" #include "support/LOstream.h" +#include "support/LAssert.h" +#include "support/lstrings.h" using std::ostream; @@ -104,7 +105,8 @@ InsetERT::InsetERT(BufferParams const & bp, InsetERT::~InsetERT() { - hideDialog(); + InsetERTMailer mailer(*this); + mailer.hideDialog(); } @@ -153,11 +155,7 @@ void InsetERT::read(Buffer const * buf, LyXLex & lex) inset.read(buf, lex); #ifdef SET_HARD_FONT -#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(); @@ -210,12 +208,14 @@ void InsetERT::write(Buffer const * buf, ostream & os) const 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"; + if (par->getInset(i)->lyxCode() != Inset::NEWLINE_CODE) { + lyxerr << "Element is not allowed in insertERT" + << endl; + } else { + par->getInset(i)->write(buf, os); + } break; + case '\\': os << "\n\\backslash \n"; break; @@ -243,12 +243,14 @@ bool InsetERT::insertInset(BufferView *, Inset *) void InsetERT::setFont(BufferView *, LyXFont const &, bool, bool selectall) { +#ifdef WITH_WARNINGS +#warning FIXME. More UI stupidity... +#endif // if selectall is activated then the fontchange was an outside general // fontchange and this messages is not needed if (!selectall) - Alert::alert(_("Impossible Operation!"), - _("Not permitted to change font-types inside ERT-insets!"), - _("Sorry.")); + Alert::error(_("Cannot change font"), + _("You cannot change font settings inside TeX code.")); } @@ -296,55 +298,51 @@ void InsetERT::edit(BufferView * bv, bool front) } - - -void InsetERT::insetButtonPress(BufferView * bv, - int x, int y, mouse_button::state button) +void InsetERT::lfunMousePress(FuncRequest const & cmd) { - if (status_ == Inlined) { - inset.insetButtonPress(bv, x, y, button); - } else { - InsetCollapsable::insetButtonPress(bv, x, y, button); - } + if (status_ == Inlined) + inset.localDispatch(cmd); + else + InsetCollapsable::localDispatch(cmd); } -bool InsetERT::insetButtonRelease(BufferView * bv, int x, int y, - mouse_button::state button) +bool InsetERT::lfunMouseRelease(FuncRequest const & cmd) { - if (button == mouse_button::button3) { + BufferView * bv = cmd.view(); + + if (cmd.button() == mouse_button::button3) { showInsetDialog(bv); return true; } - if (status_ != Inlined && (x >= 0) && (x < button_length) && - (y >= button_top_y) && (y <= button_bottom_y)) { + if (status_ != Inlined && (cmd.x >= 0) && (cmd.x < button_length) && + (cmd.y >= button_top_y) && (cmd.y <= button_bottom_y)) { updateStatus(bv, true); } else { LyXFont font(LyXFont::ALL_SANE); - int yy = ascent(bv, font) + y - inset.ascent(bv, font); + FuncRequest cmd1 = cmd; + cmd1.y = ascent(bv, font) + cmd.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); + if (status_ == Inlined) + inset.localDispatch(cmd1); + else if (!collapsed_ && (cmd.y > button_bottom_y)) { + cmd1.y -= ascent_collapsed() + descent_collapsed(); + inset.localDispatch(cmd1); } } return false; } -void InsetERT::insetMotionNotify(BufferView * bv, - int x, int y, mouse_button::state state) +void InsetERT::lfunMouseMotion(FuncRequest const & cmd) { - if (status_ == Inlined) { - inset.insetMotionNotify(bv, x, y, state); - } else { - InsetCollapsable::insetMotionNotify(bv, x, y, state); - } + if (status_ == Inlined) + inset.localDispatch(cmd); + else + InsetCollapsable::localDispatch(cmd); } @@ -356,15 +354,15 @@ int InsetERT::latex(Buffer const *, ostream & os, bool /*fragile*/, 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: + // ignore all struck out text + if (isDeletedText(*par, i)) + continue; + + if (par->isNewline(i)) { os << '\n'; ++lines; - break; - default: - os << c; - break; + } else { + os << par->getChar(i); } } par = par->next(); @@ -378,8 +376,7 @@ int InsetERT::latex(Buffer const *, ostream & os, bool /*fragile*/, } -int InsetERT::ascii(Buffer const *, - ostream &, int /*linelen*/) const +int InsetERT::ascii(Buffer const *, ostream &, int /*linelen*/) const { return 0; } @@ -392,15 +389,11 @@ int InsetERT::linuxdoc(Buffer const *, ostream & os) const 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: + if (par->isNewline(i)) { os << '\n'; ++lines; - break; - default: - os << c; - break; + } else { + os << par->getChar(i); } } par = par->next(); @@ -421,15 +414,11 @@ int InsetERT::docbook(Buffer const *, ostream & os, bool) const 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: + if (par->isNewline(i)) { os << '\n'; ++lines; - break; - default: - os << c; - break; + } else { + os << par->getChar(i); } } par = par->next(); @@ -443,23 +432,63 @@ int InsetERT::docbook(Buffer const *, ostream & os, bool) const } -UpdatableInset::RESULT -InsetERT::localDispatch(BufferView * bv, kb_action action, string const & arg) +Inset::RESULT InsetERT::localDispatch(FuncRequest const & cmd) { - UpdatableInset::RESULT result = DISPATCHED_NOUPDATE; + Inset::RESULT result = UNDISPATCHED; + BufferView * bv = cmd.view(); - if (!inset.paragraph()->size()) { + if (inset.paragraph()->empty()) { set_latex_font(bv); } - switch (action) { + switch (cmd.action) { + case LFUN_INSET_MODIFY: { + InsetERT::ERTStatus status_; + InsetERTMailer::string2params(cmd.argument, status_); + + status(bv, status_); + + /* FIXME: I refuse to believe we have to live + * with ugliness like this ! Note that this + * rebreak *is* needed. Consider a change from + * Open (needfullrow) to Inlined (only the space + * taken by the text). + */ + LyXText * t = inset.getLyXText(cmd.view()); + t->need_break_row = t->rows().begin(); + t->fullRebreak(); + t->setCursorIntern(t->cursor.par(), t->cursor.pos()); + inset.update(cmd.view(), true); + bv->updateInset(this); + result = DISPATCHED; + } + break; + + case LFUN_MOUSE_PRESS: + lfunMousePress(cmd); + result = DISPATCHED; + break; + + case LFUN_MOUSE_MOTION: + lfunMouseMotion(cmd); + result = DISPATCHED; + break; + + case LFUN_MOUSE_RELEASE: + lfunMouseRelease(cmd); + result = DISPATCHED; + break; + case LFUN_LAYOUT: bv->owner()->setLayout(inset.paragraph()->layout()->name()); + result = DISPATCHED_NOUPDATE; break; + default: - result = InsetCollapsable::localDispatch(bv, action, arg); + result = InsetCollapsable::localDispatch(cmd); } - switch (action) { + + switch (cmd.action) { case LFUN_BREAKPARAGRAPH: case LFUN_BREAKPARAGRAPHKEEPLAYOUT: case LFUN_BACKSPACE: @@ -484,8 +513,8 @@ string const InsetERT::get_new_label() const 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; + pos_type i = 0; + pos_type j = 0; for(; i < n && j < p_siz; ++j) { if (inset.paragraph()->isInset(j)) continue; @@ -515,11 +544,7 @@ void InsetERT::setButtonLabel() const bool InsetERT::checkInsertChar(LyXFont & /* font */) { #ifdef SET_HARD_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); @@ -556,63 +581,16 @@ int InsetERT::width(BufferView * bv, LyXFont const & font) const void InsetERT::draw(BufferView * bv, LyXFont const & f, - int baseline, float & x, bool cleared) const + int baseline, float & x) const { - Painter & pain = bv->painter(); - - button_length = width_collapsed(); - button_top_y = -ascent(bv, f); - button_bottom_y = -ascent(bv, f) + ascent_collapsed() + - descent_collapsed(); - - if (!isOpen()) { - draw_collapsed(pain, baseline, x); - return; - } - - float old_x = x; - - if (!owner()) - x += static_cast(scroll()); - - if (!cleared && (inset.need_update == InsetText::FULL || - inset.need_update == InsetText::INIT || - top_x != int(x) || - top_baseline != baseline)) - { - // we don't need anymore to clear here we just have to tell - // the underlying LyXText that it should do the RowClear! - inset.setUpdateStatus(bv, InsetText::FULL); - bv->text->status(bv, LyXText::CHANGED_IN_DRAW); - return; - } - - top_x = int(x); - topx_set = true; - top_baseline = baseline; - - int const bl = baseline - ascent(bv, f) + ascent_collapsed(); - - if (inlined()) { - inset.draw(bv, f, baseline, x, cleared); - } else { - draw_collapsed(pain, bl, old_x); - inset.draw(bv, f, - bl + descent_collapsed() + inset.ascent(bv, f), - x, cleared); - } - need_update = NONE; + InsetCollapsable::draw(bv, f, baseline, x, inlined()); } void InsetERT::set_latex_font(BufferView * /* bv */) { #ifdef SET_HARD_FONT -#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); @@ -627,7 +605,6 @@ void InsetERT::status(BufferView * bv, ERTStatus const st) const { if (st != status_) { status_ = st; - need_update = FULL; switch (st) { case Inlined: if (bv) @@ -644,15 +621,18 @@ void InsetERT::status(BufferView * bv, ERTStatus const st) const bv->unlockInset(const_cast(this)); break; } - if (bv) - bv->updateInset(const_cast(this), false); + if (bv) { + bv->updateInset(const_cast(this)); + bv->buffer()->markDirty(); + } } } bool InsetERT::showInsetDialog(BufferView * bv) const { - bv->owner()->getDialogs()->showERT(const_cast(this)); + InsetERTMailer mailer(const_cast(*this)); + mailer.showDialog(bv); return true; } @@ -674,8 +654,8 @@ void InsetERT::close(BufferView * bv) const } -WordLangTuple InsetERT::selectNextWordToSpellcheck(BufferView * bv, - float &) const +WordLangTuple const +InsetERT::selectNextWordToSpellcheck(BufferView * bv, float &) const { bv->unlockInset(const_cast(this)); return WordLangTuple(); @@ -684,11 +664,7 @@ WordLangTuple InsetERT::selectNextWordToSpellcheck(BufferView * bv, void InsetERT::getDrawFont(LyXFont & font) const { -#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); @@ -701,23 +677,57 @@ int InsetERT::getMaxWidth(BufferView * bv, UpdatableInset const * in) const if (status_ != Inlined || w < 0) return w; LyXText * text = inset.getLyXText(bv); - int rw = text->firstRow()->width(); + int rw = text->rows().begin()->width(); if (!rw) rw = w; rw += 40; - if (!text->firstRow()->next() && rw < w) + if (text->rows().size() == 1 && rw < w) return -1; return w; } -void InsetERT::update(BufferView * bv, LyXFont const & font, - bool reinit) +void InsetERT::update(BufferView * bv, bool reinit) { if (inset.need_update & InsetText::INIT || - inset.need_update & InsetText::FULL) - { + inset.need_update & InsetText::FULL) { setButtonLabel(); } - InsetCollapsable::update(bv, font, reinit); + + InsetCollapsable::update(bv, reinit); +} + + +string const InsetERTMailer::name_("ert"); + +InsetERTMailer::InsetERTMailer(InsetERT & inset) + : inset_(inset) +{} + + +string const InsetERTMailer::inset2string() const +{ + return params2string(inset_.status()); +} + + +void InsetERTMailer::string2params(string const & in, + InsetERT::ERTStatus & status) +{ + status = InsetERT::Collapsed; + + string name; + string body = split(in, name, ' '); + + if (body.empty()) + return; + + status = static_cast(strToInt(body)); +} + + +string const +InsetERTMailer::params2string(InsetERT::ERTStatus status) +{ + return name_ + ' ' + tostr(status); }