X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetcollapsable.C;h=ce43acc582135c7dfc603ace9d0a760c7e93a5fe;hb=9f3dd22dd39c419522914846b21dd2b45720ad0a;hp=197c782f4c89e6e53a775306d0f434342123922c;hpb=d32d0cbb9552186e0d69ee2320baf2570402fc72;p=lyx.git diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index 197c782f4c..ce43acc582 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -25,6 +25,7 @@ #include "debug.h" #include "lyxtext.h" #include "font.h" +#include "lyxlex.h" class LyXText; @@ -36,18 +37,11 @@ using std::max; InsetCollapsable::InsetCollapsable(bool collapsed) : UpdatableInset(), collapsed_(collapsed), button_length(0), button_top_y(0), button_bottom_y(0), - label("Label"), -#if 0 - draw_label(label), -#endif + need_update(NONE), label("Label"), #if 0 autocollapse(false), #endif - oldWidth(0), need_update(FULL), - inlined(false) -#if 0 - , change_label_with_text(false) -#endif + oldWidth(0), in_update(false) { inset.setOwner(this); inset.setAutoBreakRows(true); @@ -61,18 +55,11 @@ InsetCollapsable::InsetCollapsable(InsetCollapsable const & in, bool same_id) : UpdatableInset(in, same_id), collapsed_(in.collapsed_), framecolor(in.framecolor), labelfont(in.labelfont), button_length(0), button_top_y(0), button_bottom_y(0), - label(in.label), -#if 0 - draw_label(label), -#endif + need_update(NONE), label(in.label), #if 0 - autocollapse(in.autocollapse), -#endif - oldWidth(0), need_update(FULL), - inlined(in.inlined) -#if 0 - , change_label_with_text(in.change_label_with_text) + autocollapse(in.autocollapse), #endif + oldWidth(0), in_update(false) { inset.init(&(in.inset), same_id); inset.setOwner(this); @@ -100,12 +87,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; @@ -114,44 +101,25 @@ void InsetCollapsable::read(Buffer const * buf, LyXLex & lex) } } inset.read(buf, lex); -#if 0 - if (collapsed_ && change_label_with_text) { - draw_label = get_new_label(); - } else { - draw_label = label; - } -#endif } -//int InsetCollapsable::ascent_collapsed(Painter & pain) const int InsetCollapsable::ascent_collapsed() const { int width = 0; int ascent = 0; int descent = 0; -#if 0 - pain.buttonText(0, 0, draw_label, labelfont, false, - width, ascent, descent); -#else lyxfont::buttonText(label, labelfont, width, ascent, descent); -#endif return ascent; } -//int InsetCollapsable::descent_collapsed(Painter & pain) const int InsetCollapsable::descent_collapsed() const { int width = 0; int ascent = 0; int descent = 0; -#if 0 - pain.buttonText(0, 0, draw_label, labelfont, false, - width, ascent, descent); -#else lyxfont::buttonText(label, labelfont, width, ascent, descent); -#endif return descent; } @@ -162,12 +130,7 @@ int InsetCollapsable::width_collapsed() const int width; int ascent; int descent; -#if 0 - pain.buttonText(TEXT_TO_INSET_OFFSET, 0, draw_label, labelfont, false, - width, ascent, descent); -#else lyxfont::buttonText(label, labelfont, width, ascent, descent); -#endif return width + (2*TEXT_TO_INSET_OFFSET); } @@ -202,24 +165,24 @@ int InsetCollapsable::width(BufferView * bv, LyXFont const & font) const } -void InsetCollapsable::draw_collapsed(Painter & pain, int baseline, float & x) const +void InsetCollapsable::draw_collapsed(Painter & pain, + int baseline, float & x) const { -#if 0 - int width = 0; - pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, - baseline, draw_label, labelfont, true, width); - x += width + TEXT_TO_INSET_OFFSET; -#else pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, baseline, label, labelfont); x += width_collapsed(); -#endif } void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, int baseline, float & x, bool cleared) const { + if (need_update != NONE) { + const_cast(&inset)->update(bv, f, true); + bv->text->status(bv, LyXText::CHANGED_IN_DRAW); + need_update = NONE; + return; + } if (nodraw()) return; @@ -230,7 +193,7 @@ void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, button_bottom_y = -ascent(bv, f) + ascent_collapsed() + descent_collapsed(); - if (collapsed_) { + if (!isOpen()) { draw_collapsed(pain, baseline, x); x += TEXT_TO_INSET_OFFSET; return; @@ -238,50 +201,33 @@ void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, float old_x = x; -#if 0 - UpdatableInset::draw(bv, f, baseline, x, cleared); -#else if (!owner()) x += static_cast(scroll()); -#endif + if (!cleared && (inset.need_update == InsetText::FULL || - inset.need_update == InsetText::INIT || - top_x != int(x) || - top_baseline != baseline)) + inset.need_update == InsetText::INIT || + top_x != int(x) || + top_baseline != baseline)) { -#if 1 // 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; -#else - int w = owner() ? width(bv, f) : pain.paperWidth(); - int h = ascent(bv, f) + descent(bv, f); - int const tx = (needFullRow() && !owner()) ? 0 : int(x); - int const ty = max(0, baseline - ascent(bv, f)); - - if ((ty + h) > pain.paperHeight()) - h = pain.paperHeight(); - if ((top_x + w) > pain.paperWidth()) - w = pain.paperWidth(); - if (baseline < 0) - h += (baseline - ascent(bv, f)); - pain.fillRectangle(tx, ty - 1, w, h + 2); - cleared = true; -#endif } top_x = int(x); + topx_set = true; top_baseline = baseline; int const bl = baseline - ascent(bv, f) + ascent_collapsed(); - + draw_collapsed(pain, bl, old_x); inset.draw(bv, f, - bl + descent_collapsed() + inset.ascent(bv, f), - x, cleared); - need_update = NONE; + 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; } @@ -291,13 +237,13 @@ void InsetCollapsable::edit(BufferView * bv, int xp, int yp, UpdatableInset::edit(bv, xp, yp, button); if (collapsed_) { -#if 0 - draw_label = label; -#endif 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, false); + bv->updateInset(this, true); inset.edit(bv); } else { if (!bv->lockInset(this)) @@ -321,20 +267,18 @@ void InsetCollapsable::edit(BufferView * bv, bool front) UpdatableInset::edit(bv, front); if (collapsed_) { -#if 0 - draw_label = label; -#endif collapsed_ = false; if (!bv->lockInset(this)) return; inset.setUpdateStatus(bv, InsetText::FULL); - bv->updateInset(this, false); + bv->updateInset(this, true); inset.edit(bv, front); } else { if (!bv->lockInset(this)) return; inset.edit(bv, front); } + first_after_edit = true; } @@ -365,8 +309,8 @@ void InsetCollapsable::insetUnlock(BufferView * bv) } -void InsetCollapsable::insetButtonPress(BufferView * bv, int x, int y, - int button) +void InsetCollapsable::insetButtonPress(BufferView * bv, + int x, int y, int button) { if (!collapsed_ && (y > button_bottom_y)) { LyXFont font(LyXFont::ALL_SANE); @@ -380,29 +324,21 @@ void InsetCollapsable::insetButtonPress(BufferView * bv, int x, int y, void InsetCollapsable::insetButtonRelease(BufferView * bv, - int x, int y, int button) + int x, int y, int button) { if ((x >= 0) && (x < button_length) && - (y >= button_top_y) && (y <= button_bottom_y)) { + (y >= button_top_y) && (y <= button_bottom_y)) + { if (collapsed_) { -#if 0 - draw_label = label; -#endif collapsed_ = false; - inset.insetButtonRelease(bv, 0, 0, button); +// should not be called on inset open! +// inset.insetButtonRelease(bv, 0, 0, button); inset.setUpdateStatus(bv, InsetText::FULL); - bv->updateInset(this, false); + bv->updateInset(this, true); } else { -#if 0 - if (change_label_with_text) { - draw_label = get_new_label(); - } else { - draw_label = label; - } -#endif collapsed_ = true; bv->unlockInset(this); - bv->updateInset(this, false); + bv->updateInset(this, true); } } else if (!collapsed_ && (y > button_bottom_y)) { LyXFont font(LyXFont::ALL_SANE); @@ -416,7 +352,7 @@ void InsetCollapsable::insetButtonRelease(BufferView * bv, void InsetCollapsable::insetMotionNotify(BufferView * bv, - int x, int y, int state) + int x, int y, int state) { if (y > button_bottom_y) { LyXFont font(LyXFont::ALL_SANE); @@ -436,16 +372,17 @@ 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::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) @@ -454,13 +391,27 @@ int InsetCollapsable::getMaxWidth(BufferView * bv, } // should be at least 30 pixels !!! return max(30, w - width_collapsed()); +#else + return UpdatableInset::getMaxWidth(bv, in); +#endif } void InsetCollapsable::update(BufferView * bv, LyXFont const & font, - bool reinit) + bool reinit) { + if (in_update) { + if (reinit && owner()) { + owner()->update(bv, font, true); + } + return; + } + in_update = true; inset.update(bv, font, reinit); + if (reinit && owner()) { + owner()->update(bv, font, true); + } + in_update = false; } @@ -471,6 +422,7 @@ InsetCollapsable::localDispatch(BufferView * bv, kb_action action, UpdatableInset::RESULT result = inset.localDispatch(bv, action, arg); if (result == FINISHED) bv->unlockInset(this); + first_after_edit = false; return result; } @@ -614,6 +566,7 @@ int InsetCollapsable::scroll(bool recursive) const Paragraph * InsetCollapsable::getParFromID(int id) const { + lyxerr[Debug::INFO] << "Looking for paragraph " << id << endl; return inset.getParFromID(id); } @@ -638,79 +591,56 @@ Inset * InsetCollapsable::getInsetFromID(int id_arg) const } -#if 0 -void InsetCollapsable::open(BufferView * bv, bool flag) -{ - if (flag == !collapsed_) - return; - collapsed_ = !flag; -#if 0 - if (collapsed_ && change_label_with_text) { - draw_label = get_new_label(); - } else { - draw_label = label; - } -#endif - bv->updateInset(this, false); -} -#else void InsetCollapsable::open(BufferView * bv) { if (!collapsed_) return; collapsed_ = false; - bv->updateInset(this, false); + bv->updateInset(this, true); } -void InsetCollapsable::close(BufferView * bv) +void InsetCollapsable::close(BufferView * bv) const { - if (collapsed_) return; + if (collapsed_) + return; collapsed_ = true; - bv->updateInset(this, false); + bv->updateInset(const_cast(this), true); } -#endif -#if 0 -void InsetCollapsable::setLabel(string const & l, bool flag) +void InsetCollapsable::setLabel(string const & l) const { label = l; - change_label_with_text = flag; - if (collapsed_ && change_label_with_text) { - draw_label = get_new_label(); - } else { - draw_label = label; - } } -#else -void InsetCollapsable::setLabel(string const & l) + + +bool InsetCollapsable::searchForward(BufferView * bv, string const & str, + bool const & cs, bool const & mw) { - label = l; + 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 const & cs, bool const & mw) +{ + bool found = inset.searchBackward(bv, str, cs, mw); + if (first_after_edit && !found) + close(bv); + first_after_edit = false; + return found; } -#endif -#if 0 -string const InsetCollapsable::get_new_label() const -{ - string la; - Paragraph::size_type const max_length = 15; - - int n = std::min(max_length, inset.paragraph()->size()); - int i = 0; - int j = 0; - for(; i < n && j < inset.paragraph()->size(); ++j) { - if (inset.paragraph()->isInset(j)) - continue; - la += inset.paragraph()->getChar(j); - ++i; - } - if ((i > 0) && (j < inset.paragraph()->size())) - la += "..."; - if (la.empty()) - la = label; - return la; +string const InsetCollapsable::selectNextWord(BufferView * bv, float & value) const +{ + string str = inset.selectNextWord(bv, value); + if (first_after_edit && str.empty()) + close(bv); + first_after_edit = false; + return str; } -#endif