]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiView.cpp
Now LyX closes the current document WA only by default (other WAs remain open).
[lyx.git] / src / frontends / qt4 / GuiView.cpp
index 5ddfe193fd8012e4f29fbf6e6c8eced121bedf56..3eda5409a27cd6e0f4382abdb946e9e009ce7a4e 100644 (file)
@@ -330,6 +330,18 @@ struct GuiView::GuiViewPrivate
                return tabWorkArea(0);
        }
 
+       int countWorkAreasOf(Buffer & buf)
+       {
+               int areas = tabWorkAreaCount();
+               int count = 0;
+               for (int i = 0; i != areas;  ++i) {
+                       TabWorkArea * twa = tabWorkArea(i);
+                       if (twa->workArea(buf))
+                               ++count;
+               }
+               return count;
+       }
+
 #if (QT_VERSION >= 0x040400)
        void setPreviewFuture(QFuture<Buffer::ExportStatus> const & f)
        {
@@ -1022,8 +1034,9 @@ void GuiView::updateWindowTitle(GuiWorkArea * wa)
 
 void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa)
 {
-       QObject::disconnect(d.current_work_area_, SIGNAL(busy(bool)),
-               this, SLOT(setBusy(bool)));
+       if (d.current_work_area_)
+               QObject::disconnect(d.current_work_area_, SIGNAL(busy(bool)),
+                       this, SLOT(setBusy(bool)));
        disconnectBuffer();
        disconnectBufferView();
        connectBufferView(wa->bufferView());
@@ -1404,12 +1417,14 @@ void GuiView::updateToolbars()
                        lyx::getStatus(FuncRequest(LFUN_CHANGES_TRACK)).onOff(true);
                bool const mathmacrotemplate =
                        lyx::getStatus(FuncRequest(LFUN_IN_MATHMACROTEMPLATE)).enabled();
+               bool const ipa =
+                       lyx::getStatus(FuncRequest(LFUN_IN_IPA)).enabled();
 
                for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; ++it)
-                       it->second->update(math, table, review, mathmacrotemplate);
+                       it->second->update(math, table, review, mathmacrotemplate, ipa);
        } else
                for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; ++it)
-                       it->second->update(false, false, false, false);
+                       it->second->update(false, false, false, false, false);
 }
 
 
@@ -1685,6 +1700,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
 
        case LFUN_BUFFER_CLOSE:
+       case LFUN_VIEW_CLOSE:
                enable = doc_buffer;
                break;
 
@@ -1702,7 +1718,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
 
        case LFUN_CLOSE_TAB_GROUP:
-               enable = d.currentTabWorkArea();
+               enable = d.tabWorkAreaCount() > 1;
                break;
 
        case LFUN_TOOLBAR_TOGGLE: {
@@ -2026,8 +2042,9 @@ static bool import(GuiView * lv, FileName const & filename,
        string loader_format;
        vector<string> loaders = theConverters().loaders();
        if (find(loaders.begin(), loaders.end(), format) == loaders.end()) {
-               for (vector<string>::const_iterator it = loaders.begin();
-                        it != loaders.end(); ++it) {
+               vector<string>::const_iterator it = loaders.begin();
+               vector<string>::const_iterator en = loaders.end();
+               for (; it != en; ++it) {
                        if (!theConverters().isReachable(format, *it))
                                continue;
 
@@ -2286,7 +2303,8 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname)
        // if there is already a Buffer open with this name, we do not want
        // to have another one. (the second test makes sure we're not just
        // trying to overwrite ourselves, which is fine.)
-       if (theBufferList().exists(fname) && fname != oldname) {
+       if (theBufferList().exists(fname) && fname != oldname
+                 && theBufferList().getBuffer(fname) != &b) {
                docstring const text = 
                        bformat(_("The file\n%1$s\nis already open in your current session.\n"
                            "Please close it before attempting to overwrite it.\n"
@@ -2316,7 +2334,10 @@ bool GuiView::renameBuffer(Buffer & b, docstring const & newname)
                }
        }
 
-       return saveBuffer(b, fname);
+       bool const saved = saveBuffer(b, fname);
+       if (saved)
+               b.reload(false);
+       return saved;
 }
 
 
@@ -2450,10 +2471,45 @@ bool GuiView::hideWorkArea(GuiWorkArea * wa)
 }
 
 
+// We only want to close the buffer if it is not visible in other workareas
+// of the same view, nor in other views, and if this is not a child
 bool GuiView::closeWorkArea(GuiWorkArea * wa)
 {
        Buffer & buf = wa->bufferView().buffer();
-       return closeWorkArea(wa, !buf.parent());
+
+       bool last_wa = d.countWorkAreasOf(buf) == 1
+               && !inOtherView(buf) && !buf.parent();
+
+       bool close_buffer = last_wa;
+
+       if (last_wa) {
+               if (lyxrc.close_buffer_with_last_view == "yes")
+                       ; // Nothing to do
+               else if (lyxrc.close_buffer_with_last_view == "no")
+                       close_buffer = false;
+               else {
+                       docstring file;
+                       if (buf.isUnnamed())
+                               file = from_utf8(buf.fileName().onlyFileName());
+                       else
+                               file = buf.fileName().displayName(30);
+                       docstring const text = bformat(
+                               _("Last view on document %1$s is being closed.\n"
+                                 "Would you like to close or hide the document?\n"
+                                 "\n"
+                                 "Hidden documents can be displayed back through\n"
+                                 "the menu: View->Hidden->...\n"
+                                 "\n"
+                                 "To remove this question, set your preference in:\n"
+                                 "  Tools->Preferences->Look&Feel->UserInterface\n"
+                               ), file);
+                       int ret = Alert::prompt(_("Close or hide document?"),
+                               text, 0, 1, _("&Close"), _("&Hide"));
+                       close_buffer = (ret == 0);
+               }
+       }
+
+       return closeWorkArea(wa, close_buffer);
 }
 
 
@@ -3109,12 +3165,12 @@ bool GuiView::GuiViewPrivate::asyncBufferProcessing(
                gv_->message(msg);
        }
        GuiViewPrivate::busyBuffers.insert(used_buffer);
-  Buffer * cloned_buffer = used_buffer->cloneFromMaster();
-  if (!cloned_buffer) {
-      Alert::error(_("Export Error"), 
-                   _("Error cloning the Buffer."));
-      return false;
-  }
+       Buffer * cloned_buffer = used_buffer->cloneFromMaster();
+       if (!cloned_buffer) {
+               Alert::error(_("Export Error"),
+                            _("Error cloning the Buffer."));
+               return false;
+       }
        QFuture<Buffer::ExportStatus> f = QtConcurrent::run(
                                asyncFunc,
                                used_buffer,
@@ -3562,6 +3618,21 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        }
                        break;
 
+               case LFUN_VIEW_CLOSE:
+                       if (TabWorkArea * twa = d.currentTabWorkArea()) {
+                               closeWorkArea(twa->currentWorkArea());
+                               d.current_work_area_ = 0;
+                               twa = d.currentTabWorkArea();
+                               // Switch to the next GuiWorkArea in the found TabWorkArea.
+                               if (twa) {
+                                       // Make sure the work area is up to date.
+                                       setCurrentWorkArea(twa->currentWorkArea());
+                               } else {
+                                       setCurrentWorkArea(0);
+                               }
+                       }
+                       break;
+
                case LFUN_COMPLETION_INLINE:
                        if (d.current_work_area_)
                                d.current_work_area_->completer().showInline();
@@ -3636,6 +3707,8 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                        doc_buffer->absFileName(),
                                                "tex")).mangledFileName()
                                : doc_buffer->latexName();
+                       string const fulltexname = 
+                               support::makeAbsPath(texname, doc_master->temppath()).absFileName();
                        string const mastername =
                                removeExtension(doc_master->latexName());
                        FileName const dviname(addName(path.absFileName(),
@@ -3656,9 +3729,14 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                                command = lyxrc.forward_search_pdf;
                        }
 
-                       int row = doc_buffer->texrow().getRowFromIdPos(bv->cursor().paragraph().id(), bv->cursor().pos());
+                       DocIterator tmpcur = bv->cursor();
+                       // Leave math first
+                       while (tmpcur.inMathed())
+                               tmpcur.pop_back();
+                       int row = tmpcur.inMathed() ? 0 : doc_buffer->texrow().getRowFromIdPos(
+                                                               tmpcur.paragraph().id(), tmpcur.pos());
                        LYXERR(Debug::ACTION, "Forward search: row:" << row
-                               << " id:" << bv->cursor().paragraph().id());
+                               << " id:" << tmpcur.paragraph().id());
                        if (!row || command.empty()) {
                                dr.setMessage(_("Couldn't proceed."));
                                break;
@@ -3666,6 +3744,7 @@ void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        string texrow = convert<string>(row);
 
                        command = subst(command, "$$n", texrow);
+                       command = subst(command, "$$f", fulltexname);
                        command = subst(command, "$$t", texname);
                        command = subst(command, "$$o", outname);