* Do not keep pointers to data structures around if you don't know

whether the data structure outlives the pointer:

  InsetLayouts are really owned by the corresponding TextClass. So
  keep the TextClass alive by keeping a TextClassPtr around for the
  pointers lifetime. This fixes Bug #4538.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22782 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Stefan Schimanski 2008-02-05 10:34:01 +00:00
parent 790411d174
commit 2f1699747a
6 changed files with 45 additions and 34 deletions

View File

@ -445,17 +445,15 @@ void switchBetweenClasses(TextClassPtr const & c1,
if (inset->lyxCode() != FLEX_CODE) if (inset->lyxCode() != FLEX_CODE)
// FIXME: Should we verify all InsetCollapsable? // FIXME: Should we verify all InsetCollapsable?
continue; continue;
docstring const name = inset->name(); inset->setLayout(c2);
InsetLayout const & il = tclass2.insetlayout(name); if (inset->getLayout().labelstring != from_utf8("UNDEFINED"))
inset->setLayout(il);
if (il.labelstring != from_utf8("UNDEFINED"))
continue; continue;
// The flex inset is undefined in tclass2 // The flex inset is undefined in tclass2
docstring const s = bformat(_( docstring const s = bformat(_(
"Flex inset %1$s is " "Flex inset %1$s is "
"undefined because of class " "undefined because of class "
"conversion from\n%2$s to %3$s"), "conversion from\n%2$s to %3$s"),
name, from_utf8(tclass1.name()), inset->name(), from_utf8(tclass1.name()),
from_utf8(tclass2.name())); from_utf8(tclass2.name()));
// To warn the user that something had to be done. // To warn the user that something had to be done.
errorlist.push_back(ErrorItem( errorlist.push_back(ErrorItem(

View File

@ -102,9 +102,7 @@ Inset * createInset(Buffer & buf, FuncRequest const & cmd)
case LFUN_FLEX_INSERT: { case LFUN_FLEX_INSERT: {
string s = cmd.getArg(0); string s = cmd.getArg(0);
TextClass const & tclass = params.getTextClass(); return new InsetFlex(params, params.getTextClassPtr(), s);
InsetLayout const & il = tclass.insetlayout(from_utf8(s));
return new InsetFlex(params, il);
} }
case LFUN_NOTE_INSERT: { case LFUN_NOTE_INSERT: {
@ -385,8 +383,6 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
auto_ptr<Inset> inset; auto_ptr<Inset> inset;
TextClass const & tclass = buf.params().getTextClass();
lex.next(); lex.next();
string tmptok = lex.getString(); string tmptok = lex.getString();
@ -480,8 +476,8 @@ Inset * readInset(Lexer & lex, Buffer const & buf)
} else if (tmptok == "Flex") { } else if (tmptok == "Flex") {
lex.next(); lex.next();
string s = lex.getString(); string s = lex.getString();
InsetLayout const & il = tclass.insetlayout(from_utf8(s)); inset.reset(new InsetFlex(buf.params(),
inset.reset(new InsetFlex(buf.params(), il)); buf.params().getTextClassPtr(), s));
} else if (tmptok == "Branch") { } else if (tmptok == "Branch") {
inset.reset(new InsetBranch(buf.params(), inset.reset(new InsetBranch(buf.params(),
InsetBranchParams())); InsetBranchParams()));

View File

@ -74,10 +74,11 @@ InsetCollapsable::Geometry InsetCollapsable::geometry() const
InsetCollapsable::InsetCollapsable(BufferParams const & bp, InsetCollapsable::InsetCollapsable(BufferParams const & bp,
CollapseStatus status, InsetLayout const * il) CollapseStatus status, TextClassPtr tc)
: InsetText(bp), layout_(il), status_(status), : InsetText(bp), status_(status),
openinlined_(false), autoOpen_(false), mouse_hover_(false) openinlined_(false), autoOpen_(false), mouse_hover_(false)
{ {
setLayout(tc);
setAutoBreakRows(true); setAutoBreakRows(true);
setDrawFrame(true); setDrawFrame(true);
setFrameColor(Color_collapsableframe); setFrameColor(Color_collapsableframe);
@ -86,6 +87,7 @@ InsetCollapsable::InsetCollapsable(BufferParams const & bp,
InsetCollapsable::InsetCollapsable(InsetCollapsable const & rhs) InsetCollapsable::InsetCollapsable(InsetCollapsable const & rhs)
: InsetText(rhs), : InsetText(rhs),
textClass_(rhs.textClass_),
layout_(rhs.layout_), layout_(rhs.layout_),
labelstring_(rhs.labelstring_), labelstring_(rhs.labelstring_),
button_dim(rhs.button_dim), button_dim(rhs.button_dim),
@ -116,14 +118,20 @@ docstring InsetCollapsable::toolTip(BufferView const & bv, int x, int y) const
void InsetCollapsable::setLayout(BufferParams const & bp) void InsetCollapsable::setLayout(BufferParams const & bp)
{ {
setLayout(bp.getTextClass().insetlayout(name())); setLayout(bp.getTextClassPtr());
} }
void InsetCollapsable::setLayout(InsetLayout const & il) void InsetCollapsable::setLayout(TextClassPtr tc)
{ {
layout_ = &il; textClass_ = tc;
labelstring_ = layout_->labelstring; if ( tc.get() != 0 ) {
layout_ = &tc->insetlayout(name());
labelstring_ = layout_->labelstring;
} else {
layout_ = 0;
labelstring_ = _("UNDEFINED");
}
setButtonLabel(); setButtonLabel();
} }

View File

@ -19,6 +19,8 @@
#include "InsetText.h" #include "InsetText.h"
#include "Box.h" #include "Box.h"
#include "TextClass.h"
#include "TextClassPtr.h"
#include <string> #include <string>
@ -41,7 +43,7 @@ public:
InsetCollapsable( InsetCollapsable(
BufferParams const &, BufferParams const &,
CollapseStatus status = Inset::Open, CollapseStatus status = Inset::Open,
InsetLayout const * il = 0 TextClassPtr tc = TextClassPtr((TextClass *)0)
); );
/// ///
InsetCollapsable(InsetCollapsable const & rhs); InsetCollapsable(InsetCollapsable const & rhs);
@ -52,10 +54,13 @@ public:
docstring name() const { return from_ascii("Collapsable"); } docstring name() const { return from_ascii("Collapsable"); }
InsetLayout const & getLayout(BufferParams const &) const InsetLayout const & getLayout(BufferParams const &) const
{ return *layout_; } { return *layout_; }
InsetLayout const & getLayout() const
{ return *layout_; }
/// ///
void setLayout(BufferParams const &); void setLayout(BufferParams const &);
/// (Re-)set the character style parameters from \p il /// (Re-)set the character style parameters from \p tc according
void setLayout(InsetLayout const & il); /// to name()
void setLayout(TextClassPtr tc);
/// ///
void read(Buffer const &, Lexer &); void read(Buffer const &, Lexer &);
/// ///
@ -165,10 +170,11 @@ protected:
/// ///
virtual void resetParagraphsFont(); virtual void resetParagraphsFont();
protected:
///
InsetLayout const * layout_;
private: private:
/// text class to keep the InsetLayout above in memory
TextClassPtr textClass_;
/// cache for the layout_. Make sure it is in sync with the text class!
InsetLayout const * layout_;
/// ///
Dimension dimensionCollapsed() const; Dimension dimensionCollapsed() const;
/// ///

View File

@ -43,12 +43,13 @@ namespace lyx {
InsetFlex::InsetFlex(BufferParams const & bp, InsetFlex::InsetFlex(BufferParams const & bp,
InsetLayout const & il) TextClassPtr tc, string const & layoutName)
: InsetCollapsable(bp, Collapsed, &il) : InsetCollapsable(bp, Collapsed, tc),
name_(layoutName)
{ {
name_ = il.name; setLayout(tc); // again, because now the name is initialized
packages_ = il.requires; packages_ = getLayout().requires;
preamble_ = il.preamble; preamble_ = getLayout().preamble;
} }
@ -65,7 +66,7 @@ Inset * InsetFlex::clone() const
bool InsetFlex::undefined() const bool InsetFlex::undefined() const
{ {
return layout_->labelstring == from_utf8("UNDEFINED"); return getLayout().labelstring == from_utf8("UNDEFINED");
} }
@ -118,8 +119,8 @@ int InsetFlex::docbook(Buffer const & buf, odocstream & os,
ParagraphList::const_iterator end = paragraphs().end(); ParagraphList::const_iterator end = paragraphs().end();
if (!undefined()) if (!undefined())
sgml::openTag(os, layout_->latexname, sgml::openTag(os, getLayout().latexname,
par->getID(buf, runparams) + layout_->latexparam); par->getID(buf, runparams) + getLayout().latexparam);
for (; par != end; ++par) { for (; par != end; ++par) {
par->simpleDocBookOnePar(buf, os, runparams, par->simpleDocBookOnePar(buf, os, runparams,
@ -128,7 +129,7 @@ int InsetFlex::docbook(Buffer const & buf, odocstream & os,
} }
if (!undefined()) if (!undefined())
sgml::closeTag(os, layout_->latexname); sgml::closeTag(os, getLayout().latexname);
return 0; return 0;
} }

View File

@ -15,6 +15,7 @@
#include "InsetCollapsable.h" #include "InsetCollapsable.h"
using std::string;
namespace lyx { namespace lyx {
@ -25,7 +26,8 @@ namespace lyx {
class InsetFlex : public InsetCollapsable { class InsetFlex : public InsetCollapsable {
public: public:
/// ///
InsetFlex(BufferParams const &, InsetLayout const &); InsetFlex(BufferParams const &,
TextClassPtr tc, string const & layoutName);
/// ///
docstring name() const { return from_utf8(name_); } docstring name() const { return from_utf8(name_); }