X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetcollapsable.C;h=e4015dd1cf24a5d968aec31aeb854c53e016e80d;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=beb5728367899f973eae4977e676edc6fef5faef;hpb=7c984f40f2bb6dd91d6e0faba0bbec135a121694;p=lyx.git diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index beb5728367..e4015dd1cf 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -19,21 +19,25 @@ #include "lyxfont.h" #include "BufferView.h" #include "Painter.h" -#include "insets/insettext.h" -#include "support/LOstream.h" -#include "support/lstrings.h" #include "debug.h" #include "lyxtext.h" #include "font.h" #include "lyxlex.h" -class LyXText; +#include "insets/insettext.h" + +#include "support/LOstream.h" +#include "support/lstrings.h" +using std::vector; using std::ostream; using std::endl; using std::max; +class LyXText; + + InsetCollapsable::InsetCollapsable(bool collapsed) : UpdatableInset(), collapsed_(collapsed), button_length(0), button_top_y(0), button_bottom_y(0), @@ -87,12 +91,12 @@ void InsetCollapsable::write(Buffer const * buf, ostream & os) const void InsetCollapsable::read(Buffer const * buf, LyXLex & lex) { - if (lex.IsOK()) { + if (lex.isOK()) { lex.next(); - string const token = lex.GetString(); + string const token = lex.getString(); if (token == "collapsed") { lex.next(); - collapsed_ = lex.GetBool(); + collapsed_ = lex.getBool(); } else { lyxerr << "InsetCollapsable::Read: Missing collapsed!" << endl; @@ -195,7 +199,6 @@ void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, if (!isOpen()) { draw_collapsed(pain, baseline, x); - x += TEXT_TO_INSET_OFFSET; return; } @@ -217,6 +220,7 @@ void InsetCollapsable::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(); @@ -225,6 +229,8 @@ void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, inset.draw(bv, f, bl + descent_collapsed() + inset.ascent(bv, f), x, cleared); + if (x < (top_x + button_length + TEXT_TO_INSET_OFFSET)) + x = top_x + button_length + TEXT_TO_INSET_OFFSET; } @@ -235,9 +241,12 @@ void InsetCollapsable::edit(BufferView * bv, int xp, int yp, if (collapsed_) { collapsed_ = false; + // set this only here as it should be recollapsed only if + // it was already collapsed! + first_after_edit = true; if (!bv->lockInset(this)) return; - bv->updateInset(this, true); + bv->updateInset(this, false); inset.edit(bv); } else { if (!bv->lockInset(this)) @@ -265,13 +274,14 @@ void InsetCollapsable::edit(BufferView * bv, bool front) if (!bv->lockInset(this)) return; inset.setUpdateStatus(bv, InsetText::FULL); - bv->updateInset(this, true); + bv->updateInset(this, false); inset.edit(bv, front); } else { if (!bv->lockInset(this)) return; inset.edit(bv, front); } + first_after_edit = true; } @@ -316,10 +326,11 @@ void InsetCollapsable::insetButtonPress(BufferView * bv, } -void InsetCollapsable::insetButtonRelease(BufferView * bv, +bool InsetCollapsable::insetButtonRelease(BufferView * bv, int x, int y, int button) { - if ((x >= 0) && (x < button_length) && + bool ret = false; + if ((button != 3) && (x >= 0) && (x < button_length) && (y >= button_top_y) && (y <= button_bottom_y)) { if (collapsed_) { @@ -327,11 +338,11 @@ void InsetCollapsable::insetButtonRelease(BufferView * bv, // should not be called on inset open! // inset.insetButtonRelease(bv, 0, 0, button); inset.setUpdateStatus(bv, InsetText::FULL); - bv->updateInset(this, true); + bv->updateInset(this, false); } else { collapsed_ = true; bv->unlockInset(this); - bv->updateInset(this, true); + bv->updateInset(this, false); } } else if (!collapsed_ && (y > button_bottom_y)) { LyXFont font(LyXFont::ALL_SANE); @@ -339,8 +350,12 @@ void InsetCollapsable::insetButtonRelease(BufferView * bv, (ascent_collapsed() + descent_collapsed() + inset.ascent(bv, font)); - inset.insetButtonRelease(bv, x, yy, button); + ret = inset.insetButtonRelease(bv, x, yy, button); + } + if ((button == 3) && !ret) { + return showInsetDialog(bv); } + return false; } @@ -365,16 +380,35 @@ void InsetCollapsable::insetKeyPress(XKeyEvent * xke) int InsetCollapsable::latex(Buffer const * buf, ostream & os, - bool fragile, bool free_spc) const + bool fragile, bool free_spc) const { return inset.latex(buf, os, fragile, free_spc); } +int InsetCollapsable::ascii(Buffer const * buf, ostream & os, int ll) const +{ + return inset.ascii(buf, os, ll); +} + + +int InsetCollapsable::linuxdoc(Buffer const * buf, ostream & os) const +{ + return inset.linuxdoc(buf, os); +} + + +int InsetCollapsable::docbook(Buffer const * buf, ostream & os) const +{ + return inset.docbook(buf, os); +} + +#if 0 int InsetCollapsable::getMaxWidth(BufferView * bv, - UpdatableInset const * inset) const + UpdatableInset const * in) const { - int const w = UpdatableInset::getMaxWidth(bv, inset); +#if 0 + int const w = UpdatableInset::getMaxWidth(bv, in); if (w < 0) { // What does a negative max width signify? (Lgb) @@ -383,14 +417,22 @@ int InsetCollapsable::getMaxWidth(BufferView * bv, } // should be at least 30 pixels !!! return max(30, w - width_collapsed()); +#else + return UpdatableInset::getMaxWidth(bv, in); +#endif } +#endif void InsetCollapsable::update(BufferView * bv, LyXFont const & font, bool reinit) { - if (in_update) + if (in_update) { + if (reinit && owner()) { + owner()->update(bv, font, true); + } return; + } in_update = true; inset.update(bv, font, reinit); if (reinit && owner()) { @@ -402,11 +444,12 @@ void InsetCollapsable::update(BufferView * bv, LyXFont const & font, UpdatableInset::RESULT InsetCollapsable::localDispatch(BufferView * bv, kb_action action, - string const & arg) + string const & arg) { UpdatableInset::RESULT result = inset.localDispatch(bv, action, arg); - if (result == FINISHED) + if (result >= FINISHED) bv->unlockInset(this); + first_after_edit = false; return result; } @@ -420,7 +463,7 @@ bool InsetCollapsable::lockInsetInInset(BufferView * bv, UpdatableInset * in) bool InsetCollapsable::unlockInsetInInset(BufferView * bv, UpdatableInset * in, - bool lr) + bool lr) { if (&inset == in) { bv->unlockInset(this); @@ -432,7 +475,7 @@ bool InsetCollapsable::unlockInsetInInset(BufferView * bv, UpdatableInset * in, bool InsetCollapsable::updateInsetInInset(BufferView * bv, Inset *in) { - if (&inset == in) + if (in == this) return true; return inset.updateInsetInInset(bv, in); } @@ -525,7 +568,7 @@ void InsetCollapsable::resizeLyXText(BufferView * bv, bool force) const } -std::vector const InsetCollapsable::getLabelList() const +vector const InsetCollapsable::getLabelList() const { return inset.getLabelList(); } @@ -561,6 +604,12 @@ Paragraph * InsetCollapsable::firstParagraph() const } +Paragraph * InsetCollapsable::getFirstParagraph(int i) const +{ + return inset.getFirstParagraph(i); +} + + LyXCursor const & InsetCollapsable::cursor(BufferView * bv) const { return inset.cursor(bv); @@ -580,21 +629,54 @@ void InsetCollapsable::open(BufferView * bv) if (!collapsed_) return; collapsed_ = false; - bv->updateInset(this, true); + bv->updateInset(this, false); } -void InsetCollapsable::close(BufferView * bv) +void InsetCollapsable::close(BufferView * bv) const { if (collapsed_) return; collapsed_ = true; - bv->updateInset(this, true); + bv->updateInset(const_cast(this), false); } -void InsetCollapsable::setLabel(string const & l) +void InsetCollapsable::setLabel(string const & l) const { label = l; } + + +bool InsetCollapsable::searchForward(BufferView * bv, string const & str, + bool cs, bool mw) +{ + bool found = inset.searchForward(bv, str, cs, mw); + if (first_after_edit && !found) + close(bv); + first_after_edit = false; + return found; +} + + +bool InsetCollapsable::searchBackward(BufferView * bv, string const & str, + bool cs, bool mw) +{ + bool found = inset.searchBackward(bv, str, cs, mw); + if (first_after_edit && !found) + close(bv); + first_after_edit = false; + return found; +} + + +string const InsetCollapsable::selectNextWordToSpellcheck(BufferView * bv, + float & value) const +{ + string const str = inset.selectNextWordToSpellcheck(bv, value); + if (first_after_edit && str.empty()) + close(bv); + first_after_edit = false; + return str; +}