]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetinclude.C
prevent crash when inserting minipage in table cell,
[lyx.git] / src / insets / insetinclude.C
index 75a1ca5b43355814aa2e07f18378431daa0bd0f0..03f9d0d5eba96ccad37331829bda998246e65ee0 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "insetinclude.h"
 #include "buffer.h"
+#include "buffer_funcs.h"
 #include "bufferlist.h"
 #include "BufferView.h"
 #include "debug.h"
@@ -22,7 +23,8 @@
 #include "Lsstream.h"
 #include "lyxlex.h"
 #include "lyxrc.h"
-#include "Lsstream.h"
+#include "metricsinfo.h"
+#include "dimension.h"
 
 #include "frontends/Dialogs.h"
 #include "frontends/LyXView.h"
 
 #include <cstdlib>
 
+using namespace lyx::support;
+
 using std::ostream;
 using std::endl;
 using std::vector;
 using std::pair;
+using std::auto_ptr;
+
 
 extern BufferList bufferlist;
 
 
-class InsetInclude::PreviewImpl : public grfx::PreviewedInset {
+class InsetInclude::PreviewImpl : public lyx::graphics::PreviewedInset {
 public:
        ///
        PreviewImpl(InsetInclude & p) : PreviewedInset(p) {}
@@ -91,19 +97,30 @@ string const uniqueID()
 
 InsetInclude::InsetInclude(Params const & p)
        : params_(p), include_label(uniqueID()),
-         preview_(new PreviewImpl(*this))
+         preview_(new PreviewImpl(*this)),
+         set_label_(false)
 {}
 
 
 InsetInclude::InsetInclude(InsetCommandParams const & p, Buffer const & b)
        : include_label(uniqueID()),
-         preview_(new PreviewImpl(*this))
+         preview_(new PreviewImpl(*this)),
+         set_label_(false)
 {
        params_.cparams = p;
        params_.masterFilename_ = b.fileName();
 }
 
 
+InsetInclude::InsetInclude(InsetInclude const & other)
+       : InsetOld(other),
+         params_(other.params_),
+         include_label(other.include_label),
+         preview_(new PreviewImpl(*this)),
+         set_label_(other.set_label_)
+{}
+
+
 InsetInclude::~InsetInclude()
 {
        InsetIncludeMailer mailer(*this);
@@ -136,7 +153,7 @@ dispatch_result InsetInclude::localDispatch(FuncRequest const & cmd)
                return DISPATCHED;
 
        default:
-               return InsetButton::localDispatch(cmd);
+               return InsetOld::localDispatch(cmd);
        }
 }
 
@@ -186,29 +203,21 @@ void InsetInclude::set(Params const & p)
        if (preview_->monitoring())
                preview_->stopMonitoring();
 
-       if (grfx::PreviewedInset::activated() && params_.flag == INPUT)
+       if (lyx::graphics::PreviewedInset::activated() && params_.flag == INPUT)
                preview_->generatePreview();
 }
 
 
-Inset * InsetInclude::clone(Buffer const & buffer) const
+auto_ptr<InsetBase> InsetInclude::clone() const
 {
-       Params p(params_);
-       p.masterFilename_ = buffer.fileName();
+       //Params p(params_);
+       //p.masterFilename_ = buffer.fileName();
+#warning FIXME: broken cross-doc copy/paste - must fix
 
-       return new InsetInclude(p);
+       return auto_ptr<InsetBase>(new InsetInclude(params_));
 }
 
 
-// Inset * InsetInclude::clone(Buffer const & buffer, bool) const
-// {
-//     Params p(params_);
-//     p.masterFilename_ = buffer.fileName();
-
-//     return new InsetInclude(p);
-// }
-
-
 void InsetInclude::write(Buffer const *, ostream & os) const
 {
        os << "Include " << params_.cparams.getCommand() << '\n'
@@ -289,8 +298,8 @@ bool InsetInclude::loadIfNeeded() const
        FileInfo finfo(getFileName());
        if (!finfo.isOK())
                return false;
-
-       return bufferlist.loadLyXFile(getFileName(), false) != 0;
+       return loadLyXFile(bufferlist.newBuffer(getFileName()),
+                          getFileName());
 }
 
 
@@ -336,7 +345,7 @@ int InsetInclude::latex(Buffer const * buffer, ostream & os,
                tmp->markDepClean(buffer->tmppath);
 
                tmp->makeLaTeXFile(writefile, OnlyPath(getMasterFilename()),
-                                  runparams, true);
+                                  runparams, false);
        }
 
        if (isVerbatim()) {
@@ -485,22 +494,18 @@ void InsetInclude::validate(LaTeXFeatures & features) const
 }
 
 
-vector<string> const InsetInclude::getLabelList() const
+void InsetInclude::getLabelList(std::vector<string> & list) const
 {
-       vector<string> l;
-
        if (loadIfNeeded()) {
                Buffer * tmp = bufferlist.getBuffer(getFileName());
                tmp->setParentName("");
-               l = tmp->getLabelList();
+               tmp->getLabelList(list);
                tmp->setParentName(getMasterFilename());
        }
-
-       return l;
 }
 
 
-void InsetInclude::fillWithBibKeys(vector<pair<string,string> > & keys) const
+void InsetInclude::fillWithBibKeys(std::vector<std::pair<string,string> > & keys) const
 {
        if (loadIfNeeded()) {
                Buffer * tmp = bufferlist.getBuffer(getFileName());
@@ -511,49 +516,43 @@ void InsetInclude::fillWithBibKeys(vector<pair<string,string> > & keys) const
 }
 
 
-int InsetInclude::ascent(BufferView * bv, LyXFont const & font) const
+void InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const
 {
-       return preview_->previewReady() ?
-               preview_->pimage()->ascent() : InsetButton::ascent(bv, font);
-}
-
-
-int InsetInclude::descent(BufferView * bv, LyXFont const & font) const
-{
-       return preview_->previewReady() ?
-               preview_->pimage()->descent() : InsetButton::descent(bv, font);
-}
-
-
-int InsetInclude::width(BufferView * bv, LyXFont const & font) const
-{
-       return preview_->previewReady() ?
-               preview_->pimage()->width() : InsetButton::width(bv, font);
+       if (preview_->previewReady()) {
+               dim.asc = preview_->pimage()->ascent();
+               dim.des = preview_->pimage()->descent();
+               dim.wid = preview_->pimage()->width();
+       } else {
+               if (!set_label_) {
+                       set_label_ = true;
+                       button_.update(getScreenLabel(mi.base.bv->buffer()),
+                                      editable() != NOT_EDITABLE);
+               }
+               button_.metrics(mi, dim);
+       }
+       dim_ = dim;
 }
 
 
-void InsetInclude::draw(BufferView * bv, LyXFont const & font, int y,
-                       float & xx) const
+void InsetInclude::draw(PainterInfo & pi, int x, int y) const
 {
-       cache(bv);
+       cache(pi.base.bv);
        if (!preview_->previewReady()) {
-               InsetButton::draw(bv, font, y, xx);
+               button_.draw(pi, x, y);
                return;
        }
 
        if (!preview_->monitoring())
                preview_->startMonitoring();
 
-       int const x = int(xx);
-       int const w = width(bv, font);
-       int const d = descent(bv, font);
-       int const a = ascent(bv, font);
-       int const h = a + d;
-
-       bv->painter().image(x, y - a, w, h,
+       pi.pain.image(x, y - dim_.asc, dim_.wid, dim_.height(),
                            *(preview_->pimage()->image()));
+}
+
 
-       xx += w;
+BufferView * InsetInclude::view() const
+{
+       return button_.view();
 }
 
 
@@ -561,7 +560,7 @@ void InsetInclude::draw(BufferView * bv, LyXFont const & font, int y,
 // preview stuff
 //
 
-void InsetInclude::addPreview(grfx::PreviewLoader & ploader) const
+void InsetInclude::addPreview(lyx::graphics::PreviewLoader & ploader) const
 {
        preview_->addPreview(ploader);
 }
@@ -614,7 +613,7 @@ InsetIncludeMailer::InsetIncludeMailer(InsetInclude & inset)
 {}
 
 
-string const InsetIncludeMailer::inset2string() const
+string const InsetIncludeMailer::inset2string(Buffer const &) const
 {
        return params2string(inset_.params());
 }