]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetInclude.cpp
Fix text frame drawing.
[lyx.git] / src / insets / InsetInclude.cpp
index 6ab2324a2b3151ed2ef87858a6bb9ec52638be38..82a48be4f9b6987e170e9d2499f77eb2f3bef733 100644 (file)
@@ -81,7 +81,6 @@ using support::sum;
 
 using std::endl;
 using std::string;
-using std::auto_ptr;
 using std::istringstream;
 using std::ostream;
 using std::ostringstream;
@@ -148,7 +147,7 @@ void InsetInclude::doDispatch(Cursor & cur, FuncRequest & cmd)
                                if (par_old.getParamValue("label") !=
                                    par_new.getParamValue("label")
                                    && !par_new.getParamValue("label").empty())
-                                       cur.bv().buffer()->changeRefsIfUnique(
+                                       cur.bv().buffer().changeRefsIfUnique(
                                                from_utf8(par_old.getParamValue("label")),
                                                from_utf8(par_new.getParamValue("label")),
                                                Inset::REF_CODE);
@@ -279,9 +278,9 @@ void InsetInclude::set(InsetCommandParams const & p, Buffer const & buffer)
 }
 
 
-auto_ptr<Inset> InsetInclude::doClone() const
+Inset * InsetInclude::clone() const
 {
-       return auto_ptr<Inset>(new InsetInclude(*this));
+       return new InsetInclude(*this);
 }
 
 
@@ -384,45 +383,39 @@ Buffer * getChildBuffer(Buffer const & buffer, InsetCommandParams const & params
                return childBuffer;
 }
 
+} // namespace anon
 
 /// return true if the file is or got loaded.
-bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params)
+Buffer * loadIfNeeded(Buffer const & parent, InsetCommandParams const & params)
 {
        if (isVerbatim(params) || isListings(params))
-               return false;
+               return 0;
+
+       string const parent_filename = parent.fileName();
+       FileName const included_file = makeAbsPath(to_utf8(params["filename"]),
+                          onlyPath(parent_filename));
 
-       FileName const included_file = includedFilename(buffer, params);
        if (!isLyXFilename(included_file.absFilename()))
-               return false;
+               return 0;
 
-       Buffer * buf = theBufferList().getBuffer(included_file.absFilename());
-       if (!buf) {
+       Buffer * child = theBufferList().getBuffer(included_file.absFilename());
+       if (!child) {
                // the readonly flag can/will be wrong, not anymore I think.
                if (!fs::exists(included_file.toFilesystemEncoding()))
-                       return false;
-               if (use_gui) {
-                       lyx::dispatch(FuncRequest(LFUN_BUFFER_CHILD_OPEN,
-                               included_file.absFilename() + "|true"));
-                       buf = theBufferList().getBuffer(included_file.absFilename());
-               }
-               else {
-                       buf = theBufferList().newBuffer(included_file.absFilename());
-                       if (!loadLyXFile(buf, included_file)) {
-                               //close the buffer we just opened
-                               theBufferList().close(buf, false);
-                               return false;
-                       }
+                       return 0;
+
+               child = theBufferList().newBuffer(included_file.absFilename());
+               if (!loadLyXFile(child, included_file)) {
+                       //close the buffer we just opened
+                       theBufferList().close(child, false);
+                       return 0;
                }
-               return buf;
        }
-       buf->setParentName(parentFilename(buffer));
-       return true;
+       child->setParentName(parent_filename);
+       return child;
 }
 
 
-} // namespace anon
-
-
 int InsetInclude::latex(Buffer const & buffer, odocstream & os,
                        OutputParams const & runparams) const
 {
@@ -488,7 +481,7 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
 
                Buffer * tmp = theBufferList().getBuffer(included_file.absFilename());
 
-               if (tmp->params().textclass != m_buffer->params().textclass) {
+               if (tmp->params().getBaseClass() != m_buffer->params().getBaseClass()) {
                        // FIXME UNICODE
                        docstring text = bformat(_("Included file `%1$s'\n"
                                                "has textclass `%2$s'\n"
@@ -499,6 +492,26 @@ int InsetInclude::latex(Buffer const & buffer, odocstream & os,
                        Alert::warning(_("Different textclasses"), text);
                        //return 0;
                }
+               
+               // Make sure modules used in child are all included in master
+               //FIXME It might be worth loading the children's modules into the master
+               //over in BufferParams rather than doing this check.
+               vector<string> const masterModules = m_buffer->params().getModules();
+               vector<string> const childModules = tmp->params().getModules();
+               vector<string>::const_iterator it = childModules.begin();
+               vector<string>::const_iterator end = childModules.end();
+               for (; it != end; ++it) {
+                       string const module = *it;
+                       vector<string>::const_iterator found = 
+                               find(masterModules.begin(), masterModules.end(), module);
+                       if (found != masterModules.end()) {
+                               docstring text = bformat(_("Included file `%1$s'\n"
+                                                       "uses module `%2$s'\n"
+                                                       "which is not used in parent file."),
+                                      makeDisplayPath(included_file.absFilename()), from_utf8(module));
+                               Alert::warning(_("Module not found"), text);
+                       }
+               }
 
                tmp->markDepClean(m_buffer->temppath());
 
@@ -730,13 +743,14 @@ void InsetInclude::getLabelList(Buffer const & buffer,
 
 
 void InsetInclude::fillWithBibKeys(Buffer const & buffer,
-               std::vector<std::pair<string, docstring> > & keys) const
+               BiblioInfo & keys, InsetIterator const & /*di*/) const
 {
        if (loadIfNeeded(buffer, params_)) {
                string const included_file = includedFilename(buffer, params_).absFilename();
                Buffer * tmp = theBufferList().getBuffer(included_file);
+               //FIXME This is kind of a dirty hack and should be made reasonable.
                tmp->setParentName("");
-               tmp->fillWithBibKeys(keys);
+               keys.fillWithBibKeys(tmp);
                tmp->setParentName(parentFilename(buffer));
        }
 }
@@ -770,12 +784,12 @@ InsetInclude::getBibfilesCache(Buffer const & buffer) const
 
 bool InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const
 {
-       BOOST_ASSERT(mi.base.bv && mi.base.bv->buffer());
+       BOOST_ASSERT(mi.base.bv);
 
        bool use_preview = false;
        if (RenderPreview::status() != LyXRC::PREVIEW_OFF) {
                graphics::PreviewImage const * pimage =
-                       preview_->getPreviewImage(*mi.base.bv->buffer());
+                       preview_->getPreviewImage(mi.base.bv->buffer());
                use_preview = pimage && pimage->image();
        }
 
@@ -784,7 +798,7 @@ bool InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const
        } else {
                if (!set_label_) {
                        set_label_ = true;
-                       button_.update(getScreenLabel(*mi.base.bv->buffer()),
+                       button_.update(getScreenLabel(mi.base.bv->buffer()),
                                       true);
                }
                button_.metrics(mi, dim);
@@ -803,12 +817,12 @@ void InsetInclude::draw(PainterInfo & pi, int x, int y) const
 {
        setPosCache(pi, x, y);
 
-       BOOST_ASSERT(pi.base.bv && pi.base.bv->buffer());
+       BOOST_ASSERT(pi.base.bv);
 
        bool use_preview = false;
        if (RenderPreview::status() != LyXRC::PREVIEW_OFF) {
                graphics::PreviewImage const * pimage =
-                       preview_->getPreviewImage(*pi.base.bv->buffer());
+                       preview_->getPreviewImage(pi.base.bv->buffer());
                use_preview = pimage && pimage->image();
        }
 
@@ -922,7 +936,7 @@ void InsetInclude::addToToc(TocList & toclist, Buffer const & buffer, ParConstIt
 
 
 void InsetInclude::updateLabels(Buffer const & buffer, 
-                               ParIterator const &) const
+                               ParIterator const &)
 {
        Buffer const * const childbuffer = getChildBuffer(buffer, params_);
        if (childbuffer)
@@ -944,6 +958,16 @@ void InsetInclude::updateLabels(Buffer const & buffer,
 }
 
 
+void InsetInclude::registerEmbeddedFiles(Buffer const & buffer,
+       EmbeddedFiles & files, ParConstIterator const & pit) const
+{
+       // include and input are temprarily not considered.
+       if (isVerbatim(params_) || isListings(params_))
+               files.registerFile(includedFilename(buffer, params_).absFilename(),
+                       EmbeddedFile::AUTO, pit);
+}
+
+
 string const InsetIncludeMailer::name_("include");
 
 InsetIncludeMailer::InsetIncludeMailer(InsetInclude & inset)