static docstring previewAndDestroy(Buffer const * orig, Buffer * buffer, string const & format);
static docstring exportAndDestroy(Buffer const * orig, Buffer * buffer, string const & format);
static docstring compileAndDestroy(Buffer const * orig, Buffer * buffer, string const & format);
- static docstring saveAndDestroy(Buffer const * orig, Buffer * buffer, FileName const & fname);
+ static docstring autosaveAndDestroy(Buffer const * orig, Buffer * buffer);
template<class T>
static docstring runAndDestroy(const T& func, Buffer const * orig, Buffer * buffer, string const & format, string const & msg);
LYXERR(Debug::DEBUG, "GuiView::closeEvent()");
if (!GuiViewPrivate::busyBuffers.isEmpty()) {
- Alert::warning(_("Exit LyX"), _("LyX could not be closed because documents are processed by LyX."));
+ Alert::warning(_("Exit LyX"),
+ _("LyX could not be closed because documents are being processed by LyX."));
close_event->setAccepted(false);
return;
}
}
+GuiWorkArea * GuiView::workArea(int index)
+{
+ if (TabWorkArea * twa = d.currentTabWorkArea())
+ if (index < twa->count())
+ return dynamic_cast<GuiWorkArea *>(twa->widget(index));
+ return 0;
+}
+
+
GuiWorkArea * GuiView::workArea(Buffer & buffer)
{
if (currentWorkArea()
#if (QT_VERSION >= 0x040400)
-docstring GuiView::GuiViewPrivate::saveAndDestroy(Buffer const * orig, Buffer * buffer, FileName const & fname)
+docstring GuiView::GuiViewPrivate::autosaveAndDestroy(
+ Buffer const * orig, Buffer * buffer)
{
- bool failed = true;
- FileName const tmp_ret = FileName::tempName("lyxauto");
- if (!tmp_ret.empty()) {
- if (buffer->writeFile(tmp_ret))
- failed = !tmp_ret.moveTo(fname);
- }
- if (failed) {
- // failed to write/rename tmp_ret so try writing direct
- failed = buffer->writeFile(fname);
- }
+ bool const success = buffer->autoSave();
delete buffer;
busyBuffers.remove(orig);
- return failed
- ? _("Automatic save failed!")
- : _("Automatic save done.");
+ return success
+ ? _("Automatic save done.")
+ : _("Automatic save failed!");
}
#endif
#if (QT_VERSION >= 0x040400)
GuiViewPrivate::busyBuffers.insert(buffer);
- QFuture<docstring> f = QtConcurrent::run(GuiViewPrivate::saveAndDestroy, buffer, buffer->clone(),
- buffer->getAutosaveFileName());
+ QFuture<docstring> f = QtConcurrent::run(GuiViewPrivate::autosaveAndDestroy,
+ buffer, buffer->clone());
d.autosave_watcher_.setFuture(f);
#else
buffer->autoSave();
#endif
+ resetAutosaveTimers();
}
Buffer & buf = wa->bufferView().buffer();
if (close_buffer && GuiViewPrivate::busyBuffers.contains(&buf)) {
- Alert::warning(_("Close document "), _("Document could not be closed because it is processed by LyX."));
+ Alert::warning(_("Close document"),
+ _("Document could not be closed because it is being processed by LyX."));
return false;
}
return false;
break;
case 1:
- // if we crash after this we could
- // have no autosave file but I guess
- // this is really improbable (Jug)
- // Sometime improbable things happen, bug 6857 (ps)
+ // If we crash after this we could have no autosave file
+ // but I guess this is really improbable (Jug).
+ // Sometimes improbable things happen:
+ // - see bug http://www.lyx.org/trac/ticket/6587 (ps)
// buf.removeAutosaveFile();
if (hiding)
// revert all changes
void GuiView::gotoNextOrPreviousBuffer(NextOrPrevious np)
{
- Buffer * const curbuf = documentBufferView()
- ? &documentBufferView()->buffer() : 0;
- Buffer * nextbuf = curbuf;
- while (true) {
- if (np == NEXTBUFFER)
- nextbuf = theBufferList().next(nextbuf);
- else
- nextbuf = theBufferList().previous(nextbuf);
- if (nextbuf == curbuf)
- break;
- if (nextbuf == 0) {
- nextbuf = curbuf;
- break;
+ if (!documentBufferView())
+ return;
+
+ if (TabWorkArea * twa = d.currentTabWorkArea()) {
+ Buffer * const curbuf = &documentBufferView()->buffer();
+ int nwa = twa->count();
+ for (int i = 0; i < nwa; ++i) {
+ if (&workArea(i)->bufferView().buffer() == curbuf) {
+ int next_index;
+ if (np == NEXTBUFFER)
+ next_index = (i == nwa - 1 ? 0 : i + 1);
+ else
+ next_index = (i == 0 ? nwa - 1 : i - 1);
+ setBuffer(&workArea(next_index)->bufferView().buffer());
+ break;
+ }
}
- if (workArea(*nextbuf))
- break;
}
- setBuffer(nextbuf);
}
bool const success = func(format, update_unincluded);
delete buffer;
busyBuffers.remove(orig);
+ if (msg == "preview") {
+ return success
+ ? bformat(_("Successful preview of format: %1$s"), from_utf8(format))
+ : bformat(_("Error while previewing format: %1$s"), from_utf8(format));
+ }
return success
- ? bformat(_("Successful " + msg + " to format: %1$s"), from_utf8(format))
- : bformat(_("Error " + msg + " format: %1$s"), from_utf8(format));
+ ? bformat(_("Successful export to format: %1$s"), from_utf8(format))
+ : bformat(_("Error while exporting format: %1$s"), from_utf8(format));
}
#endif
}
+void GuiView::dispatchToBufferView(FuncRequest const & cmd, DispatchResult & dr)
+{
+ BufferView * bv = currentBufferView();
+ LASSERT(bv, /**/);
+
+ // Let the current BufferView dispatch its own actions.
+ bv->dispatch(cmd, dr);
+
+ // Try with the document BufferView dispatch if any.
+ BufferView * doc_bv = documentBufferView();
+ if (doc_bv && !dr.dispatched())
+ doc_bv->dispatch(cmd, dr);
+
+ // OK, so try the current Buffer itself...
+ if (!dr.dispatched())
+ bv->buffer().dispatch(cmd, dr);
+
+ // and with the document Buffer.
+ if (doc_bv && !dr.dispatched())
+ doc_bv->buffer().dispatch(cmd, dr);
+
+ // Then let the current Cursor dispatch its own actions.
+ if (!dr.dispatched()) {
+ Cursor old = bv->cursor();
+ bv->cursor().dispatch(cmd);
+
+ // notify insets we just left
+ // FIXME: move this code to Cursor::dispatch
+ if (bv->cursor() != old) {
+ old.beginUndoGroup();
+ old.fixIfBroken();
+ bool badcursor = notifyCursorLeavesOrEnters(old, bv->cursor());
+ if (badcursor) {
+ bv->cursor().fixIfBroken();
+ bv->fixInlineCompletionPos();
+ }
+ old.endUndoGroup();
+ }
+
+ // update completion. We do it here and not in
+ // processKeySym to avoid another redraw just for a
+ // changed inline completion
+ if (cmd.origin() == FuncRequest::KEYBOARD) {
+ if (cmd.action() == LFUN_SELF_INSERT
+ || (cmd.action() == LFUN_ERT_INSERT && bv->cursor().inMathed()))
+ updateCompletion(bv->cursor(), true, true);
+ else if (cmd.action() == LFUN_CHAR_DELETE_BACKWARD)
+ updateCompletion(bv->cursor(), false, true);
+ else
+ updateCompletion(bv->cursor(), false, false);
+ }
+
+ dr = bv->cursor().result();
+ }
+}
+
+
void GuiView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
{
BufferView * bv = currentBufferView();
break;
}
default:
- dr.dispatched(false);
+ // The LFUN must be for one of BufferView, Buffer or Cursor;
+ // let's try that:
+ dispatchToBufferView(cmd, dr);
break;
}
if (statusBar()->isVisible())
statusBar()->hide();
}
-
- return;
}