This commit transfer the ErrorList handling from LyXView to Buffer. It also removes the need for the error signal and simplify the kerbel <-> frontend communication. I think it should speed-up _significantly_ the latex compilation for example in case of problematic files.

TODO 1: All occurrences of "LyXView::showErrorList()" in the "kernel" should be replaced by a boost signal emission (Buffer::errors()). This signal is already connected to this showErrorList() slot.

TODO 2: The ErrorList mechanism is used wrongly in a number of place, most notably in "Converter.C". Instead of replacing the ErrorList in the "Buffer" class, the "Converter" class should maintain its own list instead and connect directly to the LyXView::showErrorList() slot.

Buffer:
* errorList_: new private member and associated access methods.
* setErrorList(): new accessor method.
* addError(): apend an error to the errorList_.
* error(): deleted.
* errors(): new boost signal, unused for now. Shall be used instead of LyXView::showErrorList().

LyXView:
* getErrorList(), addError(), errorlist_, errorConnection_: deleted.
* errorsConnection_: new boost connection for the Buffer::errors() signal.

lyx_main.C:
* LyX::exec2(): manually print all errors.

BufferView.h: remove unneeded ErrorList forward declaration.

BufferView::pimpl::menuInsertLyXFile(): delete Buffer::error() connection and add a FIXME comment

text.C: Use Buffer::addError() instead of Buffer::error() signal emission.

ControlErrorList.C: get the ErrorList from the Buffer instead of LyXView


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14467 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2006-07-15 22:43:37 +00:00
parent 5ddabc82ac
commit 00c37e4781
10 changed files with 97 additions and 52 deletions

View File

@ -28,7 +28,6 @@
class Buffer;
class Change;
class DocIterator;
class ErrorList;
class FuncRequest;
class FuncStatus;
class Language;

View File

@ -787,7 +787,8 @@ void BufferView::Pimpl::menuInsertLyXFile(string const & filenm)
string res;
Buffer buf("", false);
buf.error.connect(boost::bind(&LyXView::addError, owner_, _1));
// FIXME: is there a need for something like that?
//buf.errors.connect(boost::bind(&LyXView::showErrorList, owner_, _1));
if (::loadLyXFile(&buf, makeAbsPath(filename))) {
lyx::cap::pasteParagraphList(cursor_, buf.paragraphs(),
buf.params().textclass);

View File

@ -22,7 +22,6 @@
#include "Chktex.h"
#include "debug.h"
#include "encoding.h"
#include "errorlist.h"
#include "exporter.h"
#include "format.h"
#include "funcrequest.h"
@ -446,15 +445,17 @@ int Buffer::readHeader(LyXLex & lex)
"%1$s %2$s\n"),
token,
lex.getString());
error(ErrorItem(_("Document header error"), s,
-1, 0, 0));
errorList_.push_back(ErrorItem(_("Document header error"),
s, -1, 0, 0));
}
}
}
if (begin_header_line) {
string const s = _("\\begin_header is missing");
error(ErrorItem(_("Document header error"), s, -1, 0, 0));
errorList_.push_back(ErrorItem(_("Document header error"),
s, -1, 0, 0));
}
return unknown_tokens;
}
@ -464,11 +465,14 @@ int Buffer::readHeader(LyXLex & lex)
// Returns false if "\end_document" is not read (Asger)
bool Buffer::readDocument(LyXLex & lex)
{
errorList_.clear();
lex.next();
string const token = lex.getString();
if (token != "\\begin_document") {
string const s = _("\\begin_document is missing");
error(ErrorItem(_("Document header error"), s, -1, 0, 0));
errorList_.push_back(ErrorItem(_("Document header error"),
s, -1, 0, 0));
}
// we are reading in a brand new document
@ -488,6 +492,17 @@ bool Buffer::readDocument(LyXLex & lex)
text().paragraphs().end(),
bind(&Paragraph::setInsetOwner, _1, &inset()));
updateBibfilesCache();
// FIXME: the signal emission below is not needed for now because
// there is a manual call to "LyXView::showErrorList(_("Parse"))"
// in BufferView::pimpl::loadLyXFile()
// Eventually, all manual call to "LyXView::showErrorList()" should
// be replace with this signal emission.
//
// Send the "errors" signal in case of parsing errors
//if (!errorList_.empty())
// errors(_("Parse"));
return res;
}
@ -1657,3 +1672,20 @@ void Buffer::getSourceCode(ostream & os, lyx::pit_type par_begin, lyx::pit_type
docbookParagraphs(paragraphs(), *this, os, runparams);
}
ErrorList const & Buffer::getErrorList() const
{
return errorList_;
}
void Buffer::setErrorList(ErrorList const & errorList) const
{
errorList_ = errorList;
}
void Buffer::addError(ErrorItem const & errorItem) const
{
errorList_.push_back(errorItem);
}

View File

@ -12,6 +12,7 @@
#ifndef BUFFER_H
#define BUFFER_H
#include "errorlist.h"
#include "InsetList.h"
#include "dociterator.h"
@ -112,8 +113,8 @@ public:
/// do we have a paragraph with this id?
bool hasParWithID(int id) const;
/// This signal is emitted when a parsing error shows up.
boost::signal<void(ErrorItem)> error;
/// This signal is emitted when some parsing error shows up.
boost::signal<void(std::string)> errors;
/// This signal is emitted when some message shows up.
boost::signal<void(std::string)> message;
/// This signal is emitted when the buffer busy status change.
@ -347,6 +348,21 @@ public:
/// get source code (latex/docbook/linuxdoc) for some paragraphs
void getSourceCode(std::ostream & os, lyx::pit_type par_begin, lyx::pit_type par_end);
/// errorList_ accessor.
ErrorList const & getErrorList() const;
/// replace the internal errorList_
/** FIXME: This method is const for now because the ErrorList GUI
* showing mechanism is used by other classes in order to show their
* own processing errors (ex: Converter.C).
*/
void setErrorList(ErrorList const &) const;
/// add an error to the errorList_
/** FIXME: This method is const for now because the ErrorList GUI
* showing mechanism is used by other classes in order to show their
* own processing errors (ex: Converter.C).
*/
void addError(ErrorItem const &) const;
private:
/** Inserts a file into a document
\return \c false if method fails.
@ -368,6 +384,13 @@ private:
/// A cache for the bibfiles (including bibfiles of loaded child
/// documents), needed for appropriate update of natbib labels.
std::vector<std::string> bibfilesCache_;
/// An error list (replaces the error insets)
/** FIXME: This member is mutable for now because the ErrorList GUI
* showing mechanism is used by other classes in order to show their
* own processing errors (ex: Converter.C).
*/
mutable ErrorList errorList_;
};
#endif

View File

@ -230,15 +230,15 @@ void bufferErrors(Buffer const & buf, TeXErrors const & terr)
pos_end);
} while (found && id_start == id_end && pos_start == pos_end);
buf.error(ErrorItem(cit->error_desc, cit->error_text,
id_start, pos_start, pos_end));
buf.addError(ErrorItem(cit->error_desc,
cit->error_text, id_start, pos_start, pos_end));
}
}
void bufferErrors(Buffer const & buf, ErrorList const & el)
{
for_each(el.begin(), el.end(), bind(ref(buf.error), _1));
buf.setErrorList(el);
}

View File

@ -167,12 +167,17 @@ bool LyXView::loadLyXFile(string const & filename, bool tolastfiles)
void LyXView::connectBuffer(Buffer & buf)
{
if (errorConnection_.connected())
if (errorsConnection_.connected())
disconnectBuffer();
errorConnection_ =
buf.error.connect(
boost::bind(&LyXView::addError, this, _1));
// FIXME: (Abdel 15/07/2006) The connection below is not used for
// now.
// Nevertheless, it would be a very good idea to replace all manual
// calls of showErrorList to a call of the new modified
// "Buffer::errors" boost signal.
errorsConnection_ =
buf.errors.connect(
boost::bind(&LyXView::showErrorList, this, _1));
messageConnection_ =
buf.message.connect(
@ -202,7 +207,6 @@ void LyXView::connectBuffer(Buffer & buf)
void LyXView::disconnectBuffer()
{
errorConnection_.disconnect();
messageConnection_.disconnect();
busyConnection_.disconnect();
titleConnection_.disconnect();
@ -212,29 +216,17 @@ void LyXView::disconnectBuffer()
}
void LyXView::addError(ErrorItem const & ei)
{
errorlist_.push_back(ei);
}
void LyXView::showErrorList(string const & action)
{
if (errorlist_.size()) {
Buffer * b = work_area_->bufferView().buffer();
if (!b->getErrorList().empty()) {
string const title = bformat(_("%1$s Errors (%2$s)"),
action, buffer()->fileName());
getDialogs().show("errorlist", title);
errorlist_.clear();
}
}
ErrorList const & LyXView::getErrorList() const
{
return errorlist_;
}
void LyXView::showReadonly(bool)
{
updateWindowTitle();

View File

@ -13,8 +13,6 @@
#ifndef LYXVIEW_H
#define LYXVIEW_H
#include "errorlist.h"
#include <boost/scoped_ptr.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/signal.hpp>
@ -167,15 +165,8 @@ public:
/// This is needed for the qt3 and gtk frontend.
lyx::frontend::WorkArea * workArea();
/// get the stored error list
ErrorList const & getErrorList() const;
/// show the error list to the user
void showErrorList(std::string const &);
/// add an error to the list
/** FIXME: public method until the signal connection in
* BufferView::menuInsertLyXFile() is removed.
*/
void addError(ErrorItem const &);
protected:
/// current work area (screen view of a BufferView).
@ -210,11 +201,8 @@ private:
/// dialogs for this view
boost::scoped_ptr<Dialogs> dialogs_;
/// An error list (replaces the error insets)
ErrorList errorlist_;
/// buffer errors signal connection
boost::signals::connection errorConnection_;
boost::signals::connection errorsConnection_;
/// buffer messages signal connection
boost::signals::connection messageConnection_;
/// buffer busy status signal connection

View File

@ -11,7 +11,6 @@
#include <config.h>
#include "ControlErrorList.h"
#include "frontends/LyXView.h"
#include "buffer.h"
#include "BufferView.h"
#include "debug.h"
@ -42,7 +41,7 @@ ErrorList const & ControlErrorList::errorList() const
bool ControlErrorList::initialiseParams(string const & name)
{
errorlist_ = kernel().lyxview().getErrorList();
errorlist_ = kernel().bufferview()->buffer()->getErrorList();
name_ = name;
return true;
}

View File

@ -83,6 +83,7 @@ namespace fs = boost::filesystem;
using std::endl;
using std::string;
using std::vector;
using std::mem_fun_ref;
#ifndef CXX_GLOBAL_CSTD
using std::exit;
@ -285,11 +286,21 @@ int LyX::exec2(int & argc, char * argv[])
last_loaded = newFile(*it, string(), true);
} else {
Buffer * buf = bufferlist.newBuffer(s, false);
buf->error.connect(boost::bind(&LyX::printError, this, _1));
if (loadLyXFile(buf, s))
last_loaded = buf;
else
bufferlist.release(buf);
ErrorList const & el = buf->getErrorList();
if (!el.empty()) {
// There should be a way to use the following but I (abdel) don't know
// how to make it compile on MSVC2005.
//for_each(el.begin(), el.end(), mem_fun_ref(&LyX::printError));
for (ErrorList::const_iterator it = el.begin();
it != el.end(); ++it) {
printError(*it);
}
}
}
}

View File

@ -180,7 +180,7 @@ void readParToken(Buffer const & buf, Paragraph & par, LyXLex & lex,
bool hasLayout = tclass.hasLayout(layoutname);
if (!hasLayout) {
buf.error(ErrorItem(_("Unknown layout"),
buf.addError(ErrorItem(_("Unknown layout"),
bformat(_("Layout '%1$s' does not exist in textclass '%2$s'\nTrying to use the default instead.\n"),
layoutname, tclass.name()), par.id(), 0, par.size()));
layoutname = tclass.defaultLayoutName();
@ -212,7 +212,7 @@ void readParToken(Buffer const & buf, Paragraph & par, LyXLex & lex,
else {
lex.eatLine();
string line = lex.getString();
buf.error(ErrorItem(_("Unknown Inset"), line,
buf.addError(ErrorItem(_("Unknown Inset"), line,
par.id(), 0, par.size()));
}
} else if (token == "\\family") {
@ -329,7 +329,7 @@ void readParToken(Buffer const & buf, Paragraph & par, LyXLex & lex,
lyx::time_type ct;
is >> aid >> ct;
if (aid >= bp.author_map.size()) {
buf.error(ErrorItem(_("Change tracking error"),
buf.addError(ErrorItem(_("Change tracking error"),
bformat(_("Unknown author index for insertion: %1$d\n"), aid),
par.id(), 0, par.size()));
@ -343,7 +343,7 @@ void readParToken(Buffer const & buf, Paragraph & par, LyXLex & lex,
lyx::time_type ct;
is >> aid >> ct;
if (aid >= bp.author_map.size()) {
buf.error(ErrorItem(_("Change tracking error"),
buf.addError(ErrorItem(_("Change tracking error"),
bformat(_("Unknown author index for deletion: %1$d\n"), aid),
par.id(), 0, par.size()));
@ -352,7 +352,7 @@ void readParToken(Buffer const & buf, Paragraph & par, LyXLex & lex,
change = Change(Change::DELETED, bp.author_map[aid], ct);
} else {
lex.eatLine();
buf.error(ErrorItem(_("Unknown token"),
buf.addError(ErrorItem(_("Unknown token"),
bformat(_("Unknown token: %1$s %2$s\n"), token, lex.getString()),
par.id(), 0, par.size()));
}