]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
* activate the view from the constructor. This makes sure that the
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 653fd779bdb50b1566028a10b03e7464aafc8953..ba6b33dd0c7f6c7893996710ecffbc9c1e77f21f 100644 (file)
@@ -37,6 +37,7 @@
 #include "Cursor.h"
 #include "ErrorList.h"
 #include "Format.h"
+#include "FuncStatus.h"
 #include "FuncRequest.h"
 #include "support/gettext.h"
 #include "Intl.h"
@@ -145,8 +146,8 @@ typedef boost::shared_ptr<Dialog> DialogPtr;
 struct GuiView::GuiViewPrivate
 {
        GuiViewPrivate()
-               : current_work_area_(0), layout_(0),
-               quitting_by_menu_(false), autosave_timeout_(5000), in_show_(false)
+               : current_work_area_(0), layout_(0), autosave_timeout_(5000),
+               in_show_(false)
        {
                // hardcode here the platform specific icon size
                smallIconSize = 14;     // scaling problems
@@ -263,8 +264,6 @@ public:
        unsigned int bigIconSize;
        ///
        QTimer statusbar_timer_;
-       /// are we quitting by the menu?
-       bool quitting_by_menu_;
        /// auto-saving of buffers
        Timeout autosave_timeout_;
        /// flag against a race condition due to multiclicks, see bug #1119
@@ -278,8 +277,13 @@ GuiView::GuiView(int id)
        // GuiToolbars *must* be initialised before the menu bar.
        d.toolbars_ = new GuiToolbars(*this);
 
+       // set ourself as the current view. This is needed for the menu bar
+       // filling, at least for the static special menu item on Mac. Otherwise
+       // they are greyed out.
+       theLyXFunc().setLyXView(this);
+       
        // Fill up the menu bar.
-       guiApp->menus().fillMenuBar(this);
+       guiApp->menus().fillMenuBar(menuBar(), this);
 
        setCentralWidget(d.stack_widget_);
 
@@ -292,9 +296,9 @@ GuiView::GuiView(int id)
        connect(&d.statusbar_timer_, SIGNAL(timeout()),
                this, SLOT(clearMessage()));
 
-       // Qt bug? signal lastWindowClosed does not work
-       setAttribute(Qt::WA_QuitOnClose, false);
+       // We don't want to keep the window in memory if it is closed.
        setAttribute(Qt::WA_DeleteOnClose, true);
+
 #ifndef Q_WS_MACX
        // assign an icon to main form. We do not do it under Qt/Mac,
        // since the icon is provided in the application bundle.
@@ -336,20 +340,6 @@ GuiView::~GuiView()
 }
 
 
-void GuiView::close()
-{
-       d.quitting_by_menu_ = true;
-       d.current_work_area_ = 0;
-       for (int i = 0; i != d.splitter_->count(); ++i) {
-               TabWorkArea * twa = d.tabWorkArea(i);
-               if (twa)
-                       twa->closeAll();
-       }
-       QMainWindow::close();
-       d.quitting_by_menu_ = false;
-}
-
-
 void GuiView::setFocus()
 {
        if (d.current_work_area_)
@@ -381,10 +371,41 @@ void GuiView::showEvent(QShowEvent * e)
 
 void GuiView::closeEvent(QCloseEvent * close_event)
 {
-       // we may have been called through the close window button
-       // which bypasses the LFUN machinery.
-       if (!d.quitting_by_menu_ && guiApp->viewCount() == 1) {
-               if (!quitWriteAll()) {
+       // it can happen that this event arrives without selecting the view,
+       // e.g. when clicking the close button on a background window.
+       theLyXFunc().setLyXView(this);
+
+       while (Buffer * b = buffer()) {
+               if (b->parent()) {
+                       // This is a child document, just close the tab after saving
+                       // but keep the file loaded.
+                       if (!saveBuffer(*b)) {
+                               close_event->ignore();
+                               return;
+                       }
+                       removeWorkArea(d.current_work_area_);
+                       continue;
+               }
+
+               std::vector<int> const & ids = guiApp->viewIds();
+               for (size_type i = 0; i != ids.size(); ++i) {
+                       if (id_ == ids[i])
+                               continue;
+                       if (guiApp->view(ids[i]).workArea(*b)) {
+                               // FIXME 1: should we put an alert box here that the buffer
+                               // is viewed elsewhere?
+                               // FIXME 2: should we try to save this buffer in any case?
+                               //saveBuffer(b);
+
+                               // This buffer is also opened in another view, so
+                               // but close the associated work area nevertheless.
+                               removeWorkArea(d.current_work_area_);
+                               // but don't close it.
+                               b = 0;
+                               break;
+                       }
+               }
+               if (b && !closeBuffer(*b)) {
                        close_event->ignore();
                        return;
                }
@@ -395,8 +416,8 @@ void GuiView::closeEvent(QCloseEvent * close_event)
 
        // Save toolbars configuration
        if (isFullScreen()) {
-        d.toolbars_->toggleFullScreen(!isFullScreen());
-        updateToolbars();
+               d.toolbars_->toggleFullScreen(!isFullScreen());
+               updateToolbars();
        }
 
        // Make sure the timer time out will not trigger a statusbar update.
@@ -422,20 +443,7 @@ void GuiView::closeEvent(QCloseEvent * close_event)
        }
 
        guiApp->unregisterView(id_);
-       if (guiApp->viewCount() > 0) {
-               // Just close the window and do nothing else if this is not the
-               // last window.
-               close_event->accept();
-               return;
-       }
-
-       quitting = true;
-
-       // this is the place where we leave the frontend.
-       // it is the only point at which we start quitting.
        close_event->accept();
-       // quit the event loop
-       qApp->quit();
 }
 
 
@@ -535,6 +543,22 @@ void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa)
 }
 
 
+void GuiView::on_lastWorkAreaRemoved()
+{
+#ifdef Q_WS_MAC
+       // On Mac close the view if there is no Tab open anymore,
+       // but only if no splitter is visible
+       if (!lyxrc.open_buffers_in_tabs && d.splitter_->count() == 1) {
+               TabWorkArea * twa = qobject_cast<TabWorkArea *>(d.splitter_->widget(0));
+               if (twa && twa->count() == 0) {
+                       // close the view, as no tab is open anymore
+                       QTimer::singleShot(0, this, SLOT(close()));
+               }
+       }
+#endif
+}
+
+
 void GuiView::updateStatusBar()
 {
        // let the user see the explicit message
@@ -572,6 +596,10 @@ bool GuiView::event(QEvent * e)
        //      break;
 
        case QEvent::WindowActivate: {
+               if (this == guiApp->currentView()) {
+                       setFocus();
+                       return QMainWindow::event(e);
+               }
                guiApp->setCurrentView(*this);
                if (d.current_work_area_) {
                        BufferView & bv = d.current_work_area_->bufferView();
@@ -713,6 +741,9 @@ TabWorkArea * GuiView::addTabWorkArea()
        TabWorkArea * twa = new TabWorkArea;
        QObject::connect(twa, SIGNAL(currentWorkAreaChanged(GuiWorkArea *)),
                this, SLOT(on_currentWorkAreaChanged(GuiWorkArea *)));
+       QObject::connect(twa, SIGNAL(lastWorkAreaRemoved()),
+                        this, SLOT(on_lastWorkAreaRemoved()));
+
        d.splitter_->addWidget(twa);
        d.stack_widget_->setCurrentWidget(d.splitter_);
        return twa;
@@ -964,6 +995,10 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                enable = buf;
                break;
 
+       case LFUN_CLOSE_TAB_GROUP:
+               enable = d.currentTabWorkArea();
+               break;
+
        case LFUN_TOOLBAR_TOGGLE:
                flag.setOnOff(d.toolbars_->visible(cmd.getArg(0)));
                break;
@@ -1040,6 +1075,24 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
                break;
        }
 
+       case LFUN_COMPLETION_INLINE:
+               if (!d.current_work_area_
+                   || !d.current_work_area_->completer().inlinePossible(view()->cursor()))
+                   enable = false;
+               break;
+
+       case LFUN_COMPLETION_POPUP:
+               if (!d.current_work_area_
+                   || !d.current_work_area_->completer().popupPossible(view()->cursor()))
+                   enable = false;
+               break;
+
+       case LFUN_COMPLETION_COMPLETE:
+               if (!d.current_work_area_
+                       || !d.current_work_area_->completer().inlinePossible(view()->cursor()))
+                   enable = false;
+               break;
+
        default:
                if (!view()) {
                        enable = false;
@@ -1056,20 +1109,19 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd)
 
 static FileName selectTemplateFile()
 {
-       FileDialog dlg(_("Select template file"));
-       dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-       dlg.setButton1(_("Templates|#T#t"), from_utf8(lyxrc.template_path));
+       FileDialog dlg(qt_("Select template file"));
+       dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+       dlg.setButton1(qt_("Templates|#T#t"), toqstr(lyxrc.template_path));
 
        FileDialog::Result result =
-               dlg.open(from_utf8(lyxrc.template_path),
-                            FileFilterList(_("LyX Documents (*.lyx)")),
-                            docstring());
+               dlg.open(toqstr(lyxrc.template_path),
+                            FileFilterList(_("LyX Documents (*.lyx)")));
 
        if (result.first == FileDialog::Later)
                return FileName();
-       if (result.second.empty())
+       if (result.second.isEmpty())
                return FileName();
-       return FileName(to_utf8(result.second));
+       return FileName(fromqstr(result.second));
 }
 
 
@@ -1084,7 +1136,7 @@ Buffer * GuiView::loadDocument(FileName const & filename, bool tolastfiles)
                setBusy(false);
                return 0;
        }
-
+       
        setBuffer(newBuffer);
 
        // scroll to the position when the file was last closed
@@ -1116,20 +1168,18 @@ void GuiView::openDocument(string const & fname)
        string filename;
 
        if (fname.empty()) {
-               FileDialog dlg(_("Select document to open"), LFUN_FILE_OPEN);
-               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-               dlg.setButton2(_("Examples|#E#e"),
-                               from_utf8(addPath(package().system_support().absFilename(), "examples")));
+               FileDialog dlg(qt_("Select document to open"), LFUN_FILE_OPEN);
+               dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+               dlg.setButton2(qt_("Examples|#E#e"),
+                               toqstr(addPath(package().system_support().absFilename(), "examples")));
 
                FileDialog::Result result =
-                       dlg.open(from_utf8(initpath),
-                                    FileFilterList(_("LyX Documents (*.lyx)")),
-                                    docstring());
+                       dlg.open(toqstr(initpath), FileFilterList(_("LyX Documents (*.lyx)")));
 
                if (result.first == FileDialog::Later)
                        return;
 
-               filename = to_utf8(result.second);
+               filename = fromqstr(result.second);
 
                // check selected filename
                if (filename.empty()) {
@@ -1162,6 +1212,7 @@ void GuiView::openDocument(string const & fname)
        Buffer * buf = loadDocument(fullname);
        if (buf) {
                updateLabels(*buf);
+               
                setBuffer(buf);
                buf->errors("Parse");
                str2 = bformat(_("Document %1$s opened."), disp_fn);
@@ -1175,7 +1226,7 @@ void GuiView::openDocument(string const & fname)
 static bool import(GuiView * lv, FileName const & filename,
        string const & format, ErrorList & errorList)
 {
-       FileName const lyxfile(changeExtension(filename.absFilename(), ".lyx"));
+       FileName const lyxfile(support::changeExtension(filename.absFilename(), ".lyx"));
 
        string loader_format;
        vector<string> loaders = theConverters().loaders();
@@ -1186,7 +1237,7 @@ static bool import(GuiView * lv, FileName const & filename,
                                continue;
 
                        string const tofile =
-                               changeExtension(filename.absFilename(),
+                               support::changeExtension(filename.absFilename(),
                                formats.extension(*it));
                        if (!theConverters().convert(0, filename, FileName(tofile),
                                filename, format, *it, errorList))
@@ -1217,7 +1268,7 @@ static bool import(GuiView * lv, FileName const & filename,
                lv->setBuffer(b);
                bool as_paragraphs = loader_format == "textparagraph";
                string filename2 = (loader_format == format) ? filename.absFilename()
-                       : changeExtension(filename.absFilename(),
+                       : support::changeExtension(filename.absFilename(),
                                          formats.extension(loader_format));
                lv->view()->insertPlaintextFile(FileName(filename2), as_paragraphs);
                theLyXFunc().setLyXView(lv);
@@ -1250,10 +1301,10 @@ void GuiView::importDocument(string const & argument)
                docstring const text = bformat(_("Select %1$s file to import"),
                        formats.prettyName(format));
 
-               FileDialog dlg(text, LFUN_BUFFER_IMPORT);
-               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-               dlg.setButton2(_("Examples|#E#e"),
-                       from_utf8(addPath(package().system_support().absFilename(), "examples")));
+               FileDialog dlg(toqstr(text), LFUN_BUFFER_IMPORT);
+               dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+               dlg.setButton2(qt_("Examples|#E#e"),
+                       toqstr(addPath(package().system_support().absFilename(), "examples")));
 
                docstring filter = formats.prettyName(format);
                filter += " (*.";
@@ -1262,14 +1313,12 @@ void GuiView::importDocument(string const & argument)
                filter += ')';
 
                FileDialog::Result result =
-                       dlg.open(from_utf8(initpath),
-                                    FileFilterList(filter),
-                                    docstring());
+                       dlg.open(toqstr(initpath), FileFilterList(filter));
 
                if (result.first == FileDialog::Later)
                        return;
 
-               filename = to_utf8(result.second);
+               filename = fromqstr(result.second);
 
                // check selected filename
                if (filename.empty())
@@ -1282,7 +1331,7 @@ void GuiView::importDocument(string const & argument)
        // get absolute path of file
        FileName const fullname(makeAbsPath(filename));
 
-       FileName const lyxfile(changeExtension(fullname.absFilename(), ".lyx"));
+       FileName const lyxfile(support::changeExtension(fullname.absFilename(), ".lyx"));
 
        // Check if the document already is open
        Buffer * buf = theBufferList().getBuffer(lyxfile.absFilename());
@@ -1371,22 +1420,21 @@ void GuiView::insertLyXFile(docstring const & fname)
                initpath = trypath;
 
        // FIXME UNICODE
-       FileDialog dlg(_("Select LyX document to insert"), LFUN_FILE_INSERT);
-       dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-       dlg.setButton2(_("Examples|#E#e"),
-               from_utf8(addPath(package().system_support().absFilename(),
+       FileDialog dlg(qt_("Select LyX document to insert"), LFUN_FILE_INSERT);
+       dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+       dlg.setButton2(qt_("Examples|#E#e"),
+               toqstr(addPath(package().system_support().absFilename(),
                "examples")));
 
        FileDialog::Result result =
-               dlg.open(from_utf8(initpath),
-                            FileFilterList(_("LyX Documents (*.lyx)")),
-                            docstring());
+               dlg.open(toqstr(initpath),
+                            FileFilterList(_("LyX Documents (*.lyx)")));
 
        if (result.first == FileDialog::Later)
                return;
 
        // FIXME UNICODE
-       filename.set(to_utf8(result.second));
+       filename.set(fromqstr(result.second));
 
        // check selected filename
        if (filename.empty()) {
@@ -1414,17 +1462,17 @@ void GuiView::insertPlaintextFile(docstring const & fname,
                return;
        }
 
-       FileDialog dlg(_("Select file to insert"), (asParagraph ?
+       FileDialog dlg(qt_("Select file to insert"), (asParagraph ?
                LFUN_FILE_INSERT_PLAINTEXT_PARA : LFUN_FILE_INSERT_PLAINTEXT));
 
-       FileDialog::Result result = dlg.open(from_utf8(bv->buffer().filePath()),
-               FileFilterList(), docstring());
+       FileDialog::Result result = dlg.open(toqstr(bv->buffer().filePath()),
+               FileFilterList());
 
        if (result.first == FileDialog::Later)
                return;
 
        // FIXME UNICODE
-       filename.set(to_utf8(result.second));
+       filename.set(fromqstr(result.second));
 
        // check selected filename
        if (filename.empty()) {
@@ -1451,10 +1499,10 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname)
 
                /// No argument? Ask user through dialog.
                // FIXME UNICODE
-               FileDialog dlg(_("Choose a filename to save document as"),
+               FileDialog dlg(qt_("Choose a filename to save document as"),
                                   LFUN_BUFFER_WRITE_AS);
-               dlg.setButton1(_("Documents|#o#O"), from_utf8(lyxrc.document_path));
-               dlg.setButton2(_("Templates|#T#t"), from_utf8(lyxrc.template_path));
+               dlg.setButton1(qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+               dlg.setButton2(qt_("Templates|#T#t"), toqstr(lyxrc.template_path));
 
                if (!isLyXFilename(fname.absFilename()))
                        fname.changeExtension(".lyx");
@@ -1462,14 +1510,14 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname)
                FileFilterList const filter(_("LyX Documents (*.lyx)"));
 
                FileDialog::Result result =
-                       dlg.save(from_utf8(fname.onlyPath().absFilename()),
+                       dlg.save(toqstr(fname.onlyPath().absFilename()),
                                     filter,
-                                    from_utf8(fname.onlyFileName()));
+                                    toqstr(fname.onlyFileName()));
 
                if (result.first == FileDialog::Later)
                        return false;
 
-               fname.set(to_utf8(result.second));
+               fname.set(fromqstr(result.second));
 
                if (fname.empty())
                        return false;
@@ -1555,7 +1603,14 @@ bool GuiView::closeBuffer()
 
 bool GuiView::closeBuffer(Buffer & buf)
 {
+       // goto bookmark to update bookmark pit.
+       //FIXME: we should update only the bookmarks related to this buffer!
+       for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i)
+               theLyXFunc().gotoBookmark(i+1, false, false);
+
        if (buf.isClean() || buf.paragraphs().empty()) {
+               if (buf.masterBuffer() == &buf)
+                       LyX::ref().session().lastOpened().add(buf.fileName());
                theBufferList().release(&buf);
                return true;
        }
@@ -1569,6 +1624,10 @@ bool GuiView::closeBuffer(Buffer & buf)
        else
                file = buf.fileName().displayName(30);
 
+       // Bring this window to top before asking questions.
+       raise();
+       activateWindow();
+
        docstring const text = bformat(_("The document %1$s has unsaved changes."
                "\n\nDo you want to save the document or discard the changes?"), file);
        int const ret = Alert::prompt(_("Save changed document?"),
@@ -1600,17 +1659,6 @@ bool GuiView::closeBuffer(Buffer & buf)
 }
 
 
-bool GuiView::quitWriteAll()
-{
-       while (!theBufferList().empty()) {
-               Buffer * b = theBufferList().first();
-               if (!closeBuffer(*b))
-                       return false;
-       }
-       return true;
-}
-
-
 bool GuiView::dispatch(FuncRequest const & cmd)
 {
        BufferView * bv = view();       
@@ -1619,10 +1667,6 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                bv->cursor().updateFlags(Update::None);
 
        switch(cmd.action) {
-               case LFUN_FILE_OPEN:
-                       openDocument(to_utf8(cmd.argument()));
-                       break;
-
                case LFUN_BUFFER_IMPORT:
                        importDocument(to_utf8(cmd.argument()));
                        break;
@@ -1650,7 +1694,7 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_MENU_OPEN:
-                       if (QMenu * menu = guiApp->menus().menu(toqstr(cmd.argument())))
+                       if (QMenu * menu = guiApp->menus().menu(toqstr(cmd.argument()), *this))
                                menu->exec(QCursor::pos());
                        break;
 
@@ -1752,8 +1796,6 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        break;
 
                case LFUN_DIALOG_HIDE: {
-                       if (quitting)
-                               break;
                        guiApp->hideDialogs(to_utf8(cmd.argument()), 0);
                        break;
                }
@@ -1811,14 +1853,45 @@ bool GuiView::dispatch(FuncRequest const & cmd)
                        setFocus();
                        break;
 
+               case LFUN_COMPLETION_INLINE:
+                       if (d.current_work_area_)
+                               d.current_work_area_->completer().showInline();
+                       break;
+
                case LFUN_SPLIT_VIEW:
                        if (Buffer * buf = buffer()) {
+                               string const orientation = cmd.getArg(0);
+                               d.splitter_->setOrientation(orientation == "vertical"
+                                       ? Qt::Vertical : Qt::Horizontal);
                                TabWorkArea * twa = addTabWorkArea();
                                GuiWorkArea * wa = twa->addWorkArea(*buf, *this);
                                setCurrentWorkArea(wa);
                        }
                        break;
 
+               case LFUN_CLOSE_TAB_GROUP:
+                       if (TabWorkArea * twa = d.currentTabWorkArea()) {
+                               delete twa;
+                               twa = d.currentTabWorkArea();
+                               // Switch to the next GuiWorkArea in the found TabWorkArea.
+                               d.current_work_area_ = twa? twa->currentWorkArea() : 0;
+                               if (d.splitter_->count() == 0)
+                                       // No more work area, switch to the background widget.
+                                       d.setBackground();
+                       }
+                       break;
+                       
+               case LFUN_COMPLETION_POPUP:
+                       if (d.current_work_area_)
+                               d.current_work_area_->completer().showPopup();
+                       break;
+
+
+               case LFUN_COMPLETION_COMPLETE:
+                       if (d.current_work_area_)
+                               d.current_work_area_->completer().tab();
+                       break;
+
                default:
                        return false;
        }
@@ -1855,11 +1928,10 @@ void GuiView::lfunUiToggle(FuncRequest const & cmd)
                int l, t, r, b;
                getContentsMargins(&l, &t, &r, &b);
                //are the frames in default state?
+               d.current_work_area_->setFrameStyle(QFrame::NoFrame);
                if (l == 0) {
-                       d.current_work_area_->setFrameStyle(QFrame::NoFrame);
                        setContentsMargins(-2, -2, -2, -2);
                } else {
-                       d.current_work_area_->setFrameStyle(QFrame::NoFrame);
                        setContentsMargins(0, 0, 0, 0);
                }
                return;
@@ -1915,9 +1987,17 @@ void GuiView::restartCursor()
        if (d.current_work_area_)
                d.current_work_area_->startBlinkingCursor();
 
-       // Take this occasion to update the toobars and layout list.
+       // Take this occasion to update the other GUI elements.
        updateLayoutList();
        updateToolbars();
+       updateStatusBar();
+}
+
+
+void GuiView::updateCompletion(Cursor & cur, bool start, bool keep)
+{
+       if (d.current_work_area_)
+               d.current_work_area_->completer().updateVisibility(cur, start, keep);
 }
 
 namespace {
@@ -1969,7 +2049,7 @@ void GuiView::resetDialogs()
        // FIXME: the "math panels" toolbar takes an awful lot of time to
        // initialise so we don't do that for the time being.
        //d.toolbars_->init();
-       guiApp->menus().fillMenuBar(this);
+       guiApp->menus().fillMenuBar(menuBar(), this);
        if (d.layout_)
                d.layout_->updateContents(true);
        // Now update controls with current buffer.
@@ -2024,13 +2104,6 @@ bool GuiView::isDialogVisible(string const & name) const
 
 void GuiView::hideDialog(string const & name, Inset * inset)
 {
-       // Don't send the signal if we are quitting, because on MSVC it is
-       // destructed before the cut stack in CutAndPaste.cpp, and this method
-       // is called from some inset destructor if the cut stack is not empty
-       // on exit.
-       if (quitting)
-               return;
-
        map<string, DialogPtr>::const_iterator it = d.dialogs_.find(name);
        if (it == d.dialogs_.end())
                return;