X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Finsets%2Finsetcollapsable.C;h=00b3e869ec6c3ce989ecb5b63d41ecf05bcfa110;hb=1e394731004491d04abe436112b5a89521bbd19a;hp=a5149e020f5cb6246ba846741ced5ea9e25df94a;hpb=94c00c08a86bbe839d0d9f357a345c1f8250eafb;p=lyx.git diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index a5149e020f..00b3e869ec 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -1,8 +1,8 @@ /* This file is part of * ====================================================== - * + * * LyX, The Document Processor - * + * * Copyright 1998-2001 The LyX Team. * * ====================================================== @@ -18,29 +18,34 @@ #include "gettext.h" #include "lyxfont.h" #include "BufferView.h" -#include "Painter.h" -#include "insets/insettext.h" -#include "support/LOstream.h" -#include "support/lstrings.h" +#include "frontends/Painter.h" #include "debug.h" #include "lyxtext.h" -#include "font.h" +#include "frontends/font_metrics.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; -InsetCollapsable::InsetCollapsable(bool collapsed) - : UpdatableInset(), collapsed_(collapsed), - button_length(0), button_top_y(0), button_bottom_y(0), - label("Label"), draw_label(label), autocollapse(true), - oldWidth(0), need_update(FULL), - inlined(false), change_label_with_text(false) - +class LyXText; + +InsetCollapsable::InsetCollapsable(BufferParams const & bp, bool collapsed) + : UpdatableInset(), collapsed_(collapsed), inset(bp), + button_length(0), button_top_y(0), button_bottom_y(0), + need_update(NONE), label("Label"), +#if 0 + autocollapse(false), +#endif + oldWidth(0), in_update(false), first_after_edit(false) { inset.setOwner(this); inset.setAutoBreakRows(true); @@ -50,6 +55,21 @@ InsetCollapsable::InsetCollapsable(bool collapsed) } +InsetCollapsable::InsetCollapsable(InsetCollapsable const & in, bool same_id) + : UpdatableInset(in, same_id), collapsed_(in.collapsed_), + framecolor(in.framecolor), labelfont(in.labelfont), inset(in.inset), + button_length(0), button_top_y(0), button_bottom_y(0), + need_update(NONE), label(in.label), +#if 0 + autocollapse(in.autocollapse), +#endif + oldWidth(0), in_update(false), first_after_edit(false) +{ + inset.init(&(in.inset), same_id); + inset.setOwner(this); +} + + bool InsetCollapsable::insertInset(BufferView * bv, Inset * in) { if (!insetAllowed(in->lyxCode())) { @@ -71,86 +91,66 @@ 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; + // Take countermeasures + lex.pushToken(token); } } inset.read(buf, lex); - if (collapsed_ && change_label_with_text) { - draw_label = get_new_label(); - } else { - draw_label = label; - } } -//int InsetCollapsable::ascent_collapsed(Painter & pain) const -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(draw_label, labelfont, width, ascent, descent); -#endif + font_metrics::buttonText(label, labelfont, width, ascent, descent); return ascent; } -//int InsetCollapsable::descent_collapsed(Painter & pain) const -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(draw_label, labelfont, width, ascent, descent); -#endif + font_metrics::buttonText(label, labelfont, width, ascent, descent); return descent; } //int InsetCollapsable::width_collapsed(Painter & pain) const -int InsetCollapsable::width_collapsed(Painter & /*pain*/) const +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(draw_label, labelfont, width, ascent, descent); -#endif + font_metrics::buttonText(label, labelfont, width, ascent, descent); return width + (2*TEXT_TO_INSET_OFFSET); } -int InsetCollapsable::ascent(BufferView * bv, LyXFont const &) const +int InsetCollapsable::ascent(BufferView * /*bv*/, LyXFont const &) const { - return ascent_collapsed(bv->painter()); + return ascent_collapsed(); } int InsetCollapsable::descent(BufferView * bv, LyXFont const & font) const { - if (collapsed_) - return descent_collapsed(bv->painter()); + if (collapsed_) + return descent_collapsed(); - return descent_collapsed(bv->painter()) + return descent_collapsed() + inset.descent(bv, font) + inset.ascent(bv, font) + TEXT_TO_BOTTOM_OFFSET; @@ -159,123 +159,108 @@ int InsetCollapsable::descent(BufferView * bv, LyXFont const & font) const int InsetCollapsable::width(BufferView * bv, LyXFont const & font) const { - if (collapsed_) - return width_collapsed(bv->painter()); + if (collapsed_) + return width_collapsed(); - int widthCollapsed = width_collapsed(bv->painter()); + int widthCollapsed = width_collapsed(); return (inset.width(bv, font) > widthCollapsed) ? inset.width(bv, font) : widthCollapsed; } -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); -#else pain.buttonText(int(x) + TEXT_TO_INSET_OFFSET, - baseline, draw_label, labelfont); -#endif -#if 0 - x += width + TEXT_TO_INSET_OFFSET; -#else - x += width_collapsed(pain) + TEXT_TO_INSET_OFFSET; -#endif + baseline, label, labelfont); + x += width_collapsed(); } -void InsetCollapsable::draw(BufferView * bv, LyXFont const & f, - int baseline, float & x, bool cleared) const +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; Painter & pain = bv->painter(); - button_length = width_collapsed(pain); + button_length = width_collapsed(); button_top_y = -ascent(bv, f); - button_bottom_y = -ascent(bv, f) + ascent_collapsed(pain) + - descent_collapsed(pain); + 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; } 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)) { -#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(pain); + int const bl = baseline - ascent(bv, f) + ascent_collapsed(); draw_collapsed(pain, bl, old_x); - inset.draw(bv, f, - bl + descent_collapsed(pain) + inset.ascent(bv, f), - x, cleared); - need_update = NONE; + 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; } void InsetCollapsable::edit(BufferView * bv, int xp, int yp, - unsigned int button) + mouse_button::state button) { UpdatableInset::edit(bv, xp, yp, button); if (collapsed_) { - draw_label = label; 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); - inset.edit(bv, 0, 0, button); + inset.edit(bv); } else { if (!bv->lockInset(this)) return; - LyXFont font(LyXFont::ALL_SANE); - int yy = ascent(bv, font) + yp - - (ascent_collapsed(bv->painter()) + - descent_collapsed(bv->painter()) + - inset.ascent(bv, font)); - inset.edit(bv, xp, yy, button); + if (yp <= button_bottom_y) { + inset.edit(bv, xp, 0, button); + } else { + LyXFont font(LyXFont::ALL_SANE); + int yy = ascent(bv, font) + yp - + (ascent_collapsed() + + descent_collapsed() + + inset.ascent(bv, font)); + inset.edit(bv, xp, yy, button); + } } } @@ -285,12 +270,13 @@ void InsetCollapsable::edit(BufferView * bv, bool front) UpdatableInset::edit(bv, front); if (collapsed_) { - draw_label = label; collapsed_ = false; if (!bv->lockInset(this)) return; + inset.setUpdateStatus(bv, InsetText::FULL); bv->updateInset(this, false); inset.edit(bv, front); + first_after_edit = true; } else { if (!bv->lockInset(this)) return; @@ -309,6 +295,7 @@ Inset::EDITABLE InsetCollapsable::editable() const void InsetCollapsable::insetUnlock(BufferView * bv) { +#if 0 if (autocollapse) { if (change_label_with_text) { draw_label = get_new_label(); @@ -317,6 +304,7 @@ void InsetCollapsable::insetUnlock(BufferView * bv) } collapsed_ = true; } +#endif inset.insetUnlock(bv); if (scroll()) scroll(bv, 0.0F); @@ -324,82 +312,97 @@ 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, mouse_button::state button) { if (!collapsed_ && (y > button_bottom_y)) { LyXFont font(LyXFont::ALL_SANE); int yy = ascent(bv, font) + y - - (ascent_collapsed(bv->painter()) + - descent_collapsed(bv->painter()) + + (ascent_collapsed() + + descent_collapsed() + inset.ascent(bv, font)); inset.insetButtonPress(bv, x, yy, button); } } -void InsetCollapsable::insetButtonRelease(BufferView * bv, - int x, int y, int button) +bool InsetCollapsable::insetButtonRelease(BufferView * bv, + int x, int y, mouse_button::state button) { - if ((x >= 0) && (x < button_length) && - (y >= button_top_y) && (y <= button_bottom_y)) { + bool ret = false; + if ((button != mouse_button::button3) && (x < button_length) && + (y >= button_top_y) && (y <= button_bottom_y)) + { if (collapsed_) { - draw_label = label; 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); } else { - if (change_label_with_text) { - draw_label = get_new_label(); - } else { - draw_label = label; - } collapsed_ = true; bv->unlockInset(this); bv->updateInset(this, false); } - } else if (!collapsed_ && (y > button_top_y)) { + } else if (!collapsed_ && (y > button_bottom_y)) { LyXFont font(LyXFont::ALL_SANE); int yy = ascent(bv, font) + y - - (ascent_collapsed(bv->painter()) + - descent_collapsed(bv->painter()) + + (ascent_collapsed() + + descent_collapsed() + inset.ascent(bv, font)); - inset.insetButtonRelease(bv, x, yy, button); + ret = inset.insetButtonRelease(bv, x, yy, button); } + if ((button == mouse_button::button3) && !ret) { + return showInsetDialog(bv); + } + return ret; } void InsetCollapsable::insetMotionNotify(BufferView * bv, - int x, int y, int state) + int x, int y, mouse_button::state state) { - if (x > button_bottom_y) { + if (y > button_bottom_y) { LyXFont font(LyXFont::ALL_SANE); int yy = ascent(bv, font) + y - - (ascent_collapsed(bv->painter()) + - descent_collapsed(bv->painter()) + + (ascent_collapsed() + + descent_collapsed() + inset.ascent(bv, font)); inset.insetMotionNotify(bv, x, yy, state); } } -void InsetCollapsable::insetKeyPress(XKeyEvent * xke) +int InsetCollapsable::latex(Buffer const * buf, ostream & os, + bool fragile, bool free_spc) const { - inset.insetKeyPress(xke); + return inset.latex(buf, os, fragile, free_spc); } -int InsetCollapsable::latex(Buffer const * buf, ostream & os, - bool fragile, bool free_spc) const +int InsetCollapsable::ascii(Buffer const * buf, ostream & os, int ll) const { - return inset.latex(buf, os, fragile, free_spc); + 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) @@ -407,14 +410,29 @@ int InsetCollapsable::getMaxWidth(BufferView * bv, return w; } // should be at least 30 pixels !!! - return max(30, w - width_collapsed(bv->painter())); + 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 (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; } @@ -423,8 +441,9 @@ InsetCollapsable::localDispatch(BufferView * bv, kb_action action, 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; } @@ -450,13 +469,13 @@ 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); } -unsigned int InsetCollapsable::insetInInsetY() +int InsetCollapsable::insetInInsetY() const { return inset.insetInInsetY() - (top_baseline - inset.y()); } @@ -510,7 +529,7 @@ UpdatableInset * InsetCollapsable::getFirstLockingInsetOfType(Inset::Code c) void InsetCollapsable::setFont(BufferView * bv, LyXFont const & font, - bool toggleall, bool selectall) + bool toggleall, bool selectall) { inset.setFont(bv, font, toggleall, selectall); } @@ -543,7 +562,7 @@ void InsetCollapsable::resizeLyXText(BufferView * bv, bool force) const } -std::vector const InsetCollapsable::getLabelList() const +vector const InsetCollapsable::getLabelList() const { return inset.getLabelList(); } @@ -554,7 +573,7 @@ bool InsetCollapsable::nodraw() const return inset.nodraw(); } - + int InsetCollapsable::scroll(bool recursive) const { int sx = UpdatableInset::scroll(false); @@ -568,6 +587,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); } @@ -578,6 +598,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); @@ -591,47 +617,60 @@ Inset * InsetCollapsable::getInsetFromID(int id_arg) const return inset.getInsetFromID(id_arg); } -void InsetCollapsable::open(BufferView * bv, bool flag) + +void InsetCollapsable::open(BufferView * bv) { - if (flag == !collapsed_) - return; - collapsed_ = !flag; - if (collapsed_ && change_label_with_text) { - draw_label = get_new_label(); - } else { - draw_label = label; - } + if (!collapsed_) return; + + collapsed_ = false; bv->updateInset(this, false); } -void InsetCollapsable::setLabel(string const & l, bool flag) +void InsetCollapsable::close(BufferView * bv) const +{ + if (collapsed_) + return; + + collapsed_ = true; + bv->updateInset(const_cast(this), false); +} + + +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; - } } -string InsetCollapsable::get_new_label() const +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) { - string la; + bool found = inset.searchBackward(bv, str, cs, mw); + if (first_after_edit && !found) + close(bv); + first_after_edit = false; + return found; +} - int n = std::min(10, inset.paragraph()->size()); - int i,j; - for(i=0,j=0; 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::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; }