]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
fix file-insert crash. update problem remaining now.
[lyx.git] / src / BufferView_pimpl.C
index 3387a9df7deedf4e9bc132d5fcd7cb05b6cacb1a..2d828e3be83323b8f44623c604c252a783876dc3 100644 (file)
@@ -135,7 +135,35 @@ BufferView::Pimpl::Pimpl(BufferView * bv, LyXView * owner,
 void BufferView::Pimpl::addError(ErrorItem const & ei)
 {
        errorlist_.push_back(ei);
+}
+
+
+void BufferView::Pimpl::connectBuffer(Buffer & buf)
+{
+       if (errorConnection_.connected())
+               disconnectBuffer();
+
+       errorConnection_ = buf.error.connect(boost::bind(&BufferView::Pimpl::addError, this, _1));
+       messageConnection_ = buf.message.connect(boost::bind(&LyXView::message, owner_, _1));
+       busyConnection_ = buf.busy.connect(boost::bind(&LyXView::busy, owner_, _1));
+}
+
 
+void BufferView::Pimpl::disconnectBuffer()
+{
+       errorConnection_.disconnect();
+       messageConnection_.disconnect();
+       busyConnection_.disconnect();
+}
+
+
+bool BufferView::Pimpl::newFile(string const & filename, 
+                               string const & tname,
+                               bool isNamed)
+{
+       Buffer * b = ::newFile(filename, tname, isNamed);
+       buffer(b);
+       return true;
 }
 
 
@@ -169,26 +197,18 @@ bool BufferView::Pimpl::loadLyXFile(string const & filename, bool tolastfiles)
        }
        Buffer * b = bufferlist.newBuffer(s);
 
-       //attach to the error signal in the buffer
-       b->parseError.connect(boost::bind(&BufferView::Pimpl::addError,
-                                         this, _1));
-
-       bool loaded = ::loadLyXFile(b, s);
+       connectBuffer(*b);
 
-       if (! loaded) {
+       if (! ::loadLyXFile(b, s)) {
                bufferlist.release(b);
-               string text = bformat(_("The document %1$s does "
-                                       "not yet exist.\n\n"
-                                       "Do you want to create "
+               string text = bformat(_("The document %1$s does not yet "
+                                       "exist.\n\nDo you want to create "
                                        "a new document?"), s);
                int const ret = Alert::prompt(_("Create new document?"),
                         text, 0, 1, _("&Create"), _("Cancel"));
 
-               if (ret == 0)
-                       b = newFile(s, string(), true);
-               else
+               if (ret != 0)
                        return false;
-
        }
 
        buffer(b);
@@ -196,12 +216,12 @@ bool BufferView::Pimpl::loadLyXFile(string const & filename, bool tolastfiles)
        if (tolastfiles)
                lastfiles->newFile(b->fileName());
 
-       if (loaded)
-               bv_->showErrorList(_("Parse"));
+       bv_->showErrorList(_("Parse"));
 
        return true;
 }
 
+
 WorkArea & BufferView::Pimpl::workarea() const
 {
        return *workarea_.get();
@@ -225,6 +245,7 @@ void BufferView::Pimpl::buffer(Buffer * b)
        lyxerr[Debug::INFO] << "Setting buffer in BufferView ("
                            << b << ')' << endl;
        if (buffer_) {
+               disconnectBuffer();
                buffer_->delUser(bv_);
 
                // Put the old text into the TextCache, but
@@ -253,6 +274,7 @@ void BufferView::Pimpl::buffer(Buffer * b)
        if (buffer_) {
                lyxerr[Debug::INFO] << "Buffer addr: " << buffer_ << endl;
                buffer_->addUser(bv_);
+               connectBuffer(*buffer_);
 
                // If we don't have a text object for this, we make one
                if (bv_->text == 0) {
@@ -360,16 +382,14 @@ int BufferView::Pimpl::resizeCurrentBuffer()
                mark_set = bv_->text->selection.mark();
                the_locking_inset = bv_->theLockingInset();
                buffer_->resizeInsets(bv_);
-               // I don't think the delete and new are necessary here we
-               // just could call only init! (Jug 20020419)
-               delete bv_->text;
-               bv_->text = new LyXText(bv_);
                bv_->text->init(bv_);
        } else {
+               lyxerr << "text not available!\n";
                // See if we have a text in TextCache that fits
                // the new buffer_ with the correct width.
                bv_->text = textcache.findFit(buffer_, workarea().workWidth());
                if (bv_->text) {
+                       lyxerr << "text in cache!\n";
                        if (lyxerr.debugging()) {
                                lyxerr << "Found a LyXText that fits:\n";
                                textcache.show(lyxerr, make_pair(buffer_, make_pair(workarea().workWidth(), bv_->text)));
@@ -381,9 +401,10 @@ int BufferView::Pimpl::resizeCurrentBuffer()
 
                        buffer_->resizeInsets(bv_);
                } else {
+                       lyxerr << "no text in cache!\n";
                        bv_->text = new LyXText(bv_);
+                       buffer_->resizeInsets(bv_);
                        bv_->text->init(bv_);
-                       //buffer_->resizeInsets(bv_);
                }
 
                par = bv_->text->ownerParagraphs().end();
@@ -930,6 +951,9 @@ void BufferView::Pimpl::MenuInsertLyXFile(string const & filen)
                owner_->message(bformat(_("Document %1$s inserted."), disp_fn));
        else
                owner_->message(bformat(_("Could not insert document %1$s"), disp_fn));
+
+#warning remove this if update() is gone
+       bv_->text->fullRebreak();
 }