X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiLog.cpp;h=320b9773168e9af324df13e25efd8c834f77e97f;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=eb56985b4003c1c0df47bf9586793d5c669dc405;hpb=9a95d2a936748c057db94a3083c4b9e6587eea0b;p=lyx.git diff --git a/src/frontends/qt4/GuiLog.cpp b/src/frontends/qt4/GuiLog.cpp index eb56985b40..320b977316 100644 --- a/src/frontends/qt4/GuiLog.cpp +++ b/src/frontends/qt4/GuiLog.cpp @@ -4,64 +4,69 @@ * Licence details can be found in the file COPYING. * * \author John Levon + * \author Angus Leeming + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ #include -#include - #include "GuiLog.h" + +#include "GuiApplication.h" #include "qt_helpers.h" +#include "Lexer.h" -#include "frontends/Application.h" +#include "support/docstring.h" +#include "support/FileName.h" +#include "support/gettext.h" -#include -#include #include +#include +#include + +#include +#include + +using namespace std; +using namespace lyx::support; namespace lyx { namespace frontend { + +// Regular expressions needed at several places +// Information +QRegExp exprInfo("^(Document Class:|LaTeX Font Info:|File:|Package:|Language:|Underfull|Overfull|\\(|\\\\).*$"); +// Warnings +QRegExp exprWarning("^(LaTeX Warning|Package \\w+ Warning).*$"); +// Errors +QRegExp exprError("^!.*$"); + + ///////////////////////////////////////////////////////////////////// // -// GuiLogDialog +// LogHighlighter // -///////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////// - -GuiLogDialog::GuiLogDialog(GuiLog * form) - : form_(form) +class LogHighlighter : public QSyntaxHighlighter { - setupUi(this); - - connect(closePB, SIGNAL(clicked()), - form, SLOT(slotClose())); - connect( updatePB, SIGNAL( clicked() ), - this, SLOT( updateClicked() ) ); -} - +public: + LogHighlighter(QTextDocument * parent); -void GuiLogDialog::closeEvent(QCloseEvent * e) -{ - form_->slotWMHide(); - e->accept(); -} +private: + void highlightBlock(QString const & text); +private: + QTextCharFormat infoFormat; + QTextCharFormat warningFormat; + QTextCharFormat errorFormat; +}; -void GuiLogDialog::updateClicked() -{ - form_->update_contents(); -} -///////////////////////////////////////////////////////////////////// -// -// LogHighlighter -// -///////////////////////////////////////////////////////////////////// - LogHighlighter::LogHighlighter(QTextDocument * parent) : QSyntaxHighlighter(parent) { @@ -74,28 +79,25 @@ LogHighlighter::LogHighlighter(QTextDocument * parent) void LogHighlighter::highlightBlock(QString const & text) { // Info - QRegExp exprInfo("^(Document Class:|LaTeX Font Info:|File:|Package:|Language:|Underfull|Overfull|\\(|\\\\).*$"); - int index = text.indexOf(exprInfo); + int index = exprInfo.indexIn(text); while (index >= 0) { int length = exprInfo.matchedLength(); setFormat(index, length, infoFormat); - index = text.indexOf(exprInfo, index + length); + index = exprInfo.indexIn(text, index + length); } // LaTeX Warning: - QRegExp exprWarning("^LaTeX Warning.*$"); - index = text.indexOf(exprWarning); + index = exprWarning.indexIn(text); while (index >= 0) { int length = exprWarning.matchedLength(); setFormat(index, length, warningFormat); - index = text.indexOf(exprWarning, index + length); + index = exprWarning.indexIn(text, index + length); } // ! error - QRegExp exprError("^!.*$"); - index = text.indexOf(exprError); + index = exprError.indexIn(text); while (index >= 0) { int length = exprError.matchedLength(); setFormat(index, length, errorFormat); - index = text.indexOf(exprError, index + length); + index = exprError.indexIn(text, index + length); } } @@ -106,38 +108,217 @@ void LogHighlighter::highlightBlock(QString const & text) // ///////////////////////////////////////////////////////////////////// +GuiLog::GuiLog(GuiView & lv) + : GuiDialog(lv, "log", qt_("LaTeX Log")), type_(LatexLog) +{ + setupUi(this); -GuiLog::GuiLog(GuiDialog & parent) - : GuiView(parent, docstring()) -{} + connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose())); + connect(updatePB, SIGNAL(clicked()), this, SLOT(updateContents())); + connect(findPB, SIGNAL(clicked()), this, SLOT(find())); + // FIXME: find via returnPressed() does not work! + connect(findLE, SIGNAL(returnPressed()), this, SLOT(find())); + connect(logTypeCO, SIGNAL(activated(int)), + this, SLOT(typeChanged(int))); + bc().setPolicy(ButtonPolicy::OkCancelPolicy); -void GuiLog::build_dialog() -{ - dialog_.reset(new GuiLogDialog(this)); // set syntax highlighting - highlighter = new LogHighlighter(dialog_->logTB->document()); - // - dialog_->logTB->setReadOnly(true); - QFont font(toqstr(theApp()->typewriterFontName())); + highlighter = new LogHighlighter(logTB->document()); + + logTB->setReadOnly(true); + QFont font(guiApp->typewriterFontName()); font.setKerning(false); font.setFixedPitch(true); font.setStyleHint(QFont::TypeWriter); - dialog_->logTB->setFont(font); + logTB->setFont(font); +} + + +void GuiLog::updateContents() +{ + setTitle(toqstr(title())); + + ostringstream ss; + getContents(ss); + + logTB->setPlainText(toqstr(ss.str())); + + nextErrorPB->setEnabled(contains(exprError)); + nextWarningPB->setEnabled(contains(exprWarning)); +} + + +void GuiLog::typeChanged(int i) +{ + string const type = + fromqstr(logTypeCO->itemData(i).toString()); + string ext; + if (type == "latex") + ext = "log"; + else if (type == "bibtex") + ext = "blg"; + else if (type == "index") + ext = "ilg"; + + if (!ext.empty()) + logfile_.changeExtension(ext); + + updateContents(); +} + + +void GuiLog::find() +{ + logTB->find(findLE->text()); +} + + +void GuiLog::on_nextErrorPB_clicked() +{ + goTo(exprError); +} + + +void GuiLog::on_nextWarningPB_clicked() +{ + goTo(exprWarning); +} + + +void GuiLog::goTo(QRegExp const & exp) const +{ + QTextCursor const newc = + logTB->document()->find(exp, logTB->textCursor()); + logTB->setTextCursor(newc); +} + + +bool GuiLog::contains(QRegExp const & exp) const +{ + return !logTB->document()->find(exp, logTB->textCursor()).isNull(); } -void GuiLog::update_contents() +bool GuiLog::initialiseParams(string const & data) { - setViewTitle(controller().title()); + istringstream is(data); + Lexer lex; + lex.setStream(is); + + string logtype, logfile; + lex >> logtype; + if (lex) { + lex.next(true); + logfile = lex.getString(); + } + if (!lex) + // Parsing of the data failed. + return false; + + logTypeCO->setEnabled(logtype == "latex"); + logTypeCO->clear(); + + FileName log(logfile); + + if (logtype == "latex") { + type_ = LatexLog; + logTypeCO->addItem(qt_("LaTeX"), toqstr(logtype)); + FileName tmp = log; + tmp.changeExtension("blg"); + if (tmp.exists()) + logTypeCO->addItem(qt_("BibTeX"), QString("bibtex")); + tmp.changeExtension("ilg"); + if (tmp.exists()) + logTypeCO->addItem(qt_("Index"), QString("index")); + // FIXME: not sure "literate" still works. + } else if (logtype == "literate") { + type_ = LiterateLog; + logTypeCO->addItem(qt_("Literate"), toqstr(logtype)); + } else if (logtype == "lyx2lyx") { + type_ = Lyx2lyxLog; + logTypeCO->addItem(qt_("LyX2LyX"), toqstr(logtype)); + } else if (logtype == "vc") { + type_ = VCLog; + logTypeCO->addItem(qt_("Version Control"), toqstr(logtype)); + } else + return false; + + logfile_ = log; - std::ostringstream ss; - controller().getContents(ss); + updateContents(); - dialog_->logTB->setPlainText(toqstr(ss.str())); + return true; } + +void GuiLog::clearParams() +{ + logfile_.erase(); +} + + +docstring GuiLog::title() const +{ + switch (type_) { + case LatexLog: + return _("LaTeX Log"); + case LiterateLog: + return _("Literate Programming Build Log"); + case Lyx2lyxLog: + return _("lyx2lyx Error Log"); + case VCLog: + return _("Version Control Log"); + default: + return docstring(); + } +} + + +void GuiLog::getContents(ostream & ss) const +{ + ifstream in(logfile_.toFilesystemEncoding().c_str()); + + bool success = false; + + // FIXME UNICODE + // Our caller interprets the file contents as UTF8, but is that + // correct? + if (in) { + ss << in.rdbuf(); + success = ss.good(); + } + + if (success) + return; + + switch (type_) { + case LatexLog: + ss << to_utf8(_("Log file not found.")); + break; + case LiterateLog: + ss << to_utf8(_("No literate programming build log file found.")); + break; + case Lyx2lyxLog: + ss << to_utf8(_("No lyx2lyx error log file found.")); + break; + case VCLog: + ss << to_utf8(_("No version control log file found.")); + break; + } +} + + +void GuiLog::on_copyPB_clicked() +{ + qApp->clipboard()->setText(logTB->toPlainText()); +} + + +Dialog * createGuiLog(GuiView & lv) { return new GuiLog(lv); } + + } // namespace frontend } // namespace lyx -#include "GuiLog_moc.cpp" +#include "moc_GuiLog.cpp"