X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiErrorList.cpp;h=f104cd2ffba1461ff9213a1ff6d639fe4b6aafc4;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=8630ffd8ef9dd077670a605c646769421aae8eae;hpb=9a95d2a936748c057db94a3083c4b9e6587eea0b;p=lyx.git diff --git a/src/frontends/qt4/GuiErrorList.cpp b/src/frontends/qt4/GuiErrorList.cpp index 8630ffd8ef..f104cd2ffb 100644 --- a/src/frontends/qt4/GuiErrorList.cpp +++ b/src/frontends/qt4/GuiErrorList.cpp @@ -11,98 +11,151 @@ #include #include "GuiErrorList.h" + #include "qt_helpers.h" +#include "Buffer.h" +#include "BufferView.h" +#include "FuncRequest.h" +#include "ParIterator.h" +#include "Text.h" + +#include "support/debug.h" +#include "support/gettext.h" +#include "support/lstrings.h" + #include -#include #include -#include +#include +#include + +using namespace std; +using namespace lyx::support; namespace lyx { namespace frontend { -///////////////////////////////////////////////////////////////////// -// -// GuiErrorListDialog -// -///////////////////////////////////////////////////////////////////// - -GuiErrorListDialog::GuiErrorListDialog(GuiErrorList * form) - : form_(form) +GuiErrorList::GuiErrorList(GuiView & lv) + : GuiDialog(lv, "errorlist", qt_("Error List")) { setupUi(this); + connect(closePB, SIGNAL(clicked()), - form, SLOT(slotClose())); - connect(errorsLW, SIGNAL( itemActivated(QListWidgetItem *)), - form, SLOT(slotClose())); - connect( errorsLW, SIGNAL( itemClicked(QListWidgetItem *)), - this, SLOT(select_adaptor(QListWidgetItem *))); + this, SLOT(slotClose())); + connect(viewLogPB, SIGNAL(clicked()), + this, SLOT(viewLog())); + connect(errorsLW, SIGNAL(currentRowChanged(int)), + this, SLOT(select())); + + bc().setPolicy(ButtonPolicy::OkCancelPolicy); + bc().setCancel(closePB); } -void GuiErrorListDialog::select_adaptor(QListWidgetItem * item) +void GuiErrorList::showEvent(QShowEvent * e) { - form_->select(item); + select(); + paramsToDialog(); + e->accept(); } -void GuiErrorListDialog::closeEvent(QCloseEvent * e) +void GuiErrorList::select() { - form_->slotWMHide(); - e->accept(); + int const item = errorsLW->row(errorsLW->currentItem()); + if (item == -1) + return; + goTo(item); + descriptionTB->setPlainText( + toqstr(errorList()[item].description)); } -void GuiErrorListDialog::showEvent(QShowEvent *e) +void GuiErrorList::viewLog() { - errorsLW->setCurrentRow(0); - form_->select(errorsLW->item(0)); - e->accept(); + dispatch(FuncRequest(LFUN_DIALOG_SHOW, "latexlog")); } -///////////////////////////////////////////////////////////////////// -// -// GuiErrorList -// -///////////////////////////////////////////////////////////////////// - - -GuiErrorList::GuiErrorList(GuiDialog & parent) - : GuiView(parent, docstring()) -{} +void GuiErrorList::paramsToDialog() +{ + setTitle(toqstr(name_)); + errorsLW->clear(); + descriptionTB->setPlainText(QString()); + + ErrorList::const_iterator it = errorList().begin(); + ErrorList::const_iterator end = errorList().end(); + for (; it != end; ++it) + errorsLW->addItem(toqstr(it->error)); + errorsLW->setCurrentRow(0); +} -void GuiErrorList::build_dialog() +ErrorList const & GuiErrorList::errorList() const { - dialog_.reset(new GuiErrorListDialog(this)); - bc().setCancel(dialog_->closePB); + return from_master_ ? + bufferview()->buffer().masterBuffer()->errorList(error_type_) + : bufferview()->buffer().errorList(error_type_); } -void GuiErrorList::select(QListWidgetItem * wi) +bool GuiErrorList::initialiseParams(string const & data) { - int const item = dialog_->errorsLW->row(wi); - controller().goTo(item); - dialog_->descriptionTB->setPlainText(toqstr(controller().errorList()[item].description)); + from_master_ = prefixIs(data, "from_master|"); + string error_type = data; + if (from_master_) + error_type = split(data, '|'); + error_type_ = error_type; + Buffer const * buf = from_master_ ? + bufferview()->buffer().masterBuffer() + : &bufferview()->buffer(); + name_ = bformat(_("%1$s Errors (%2$s)"), _(error_type), + from_utf8(buf->absFileName())); + paramsToDialog(); + return true; } -void GuiErrorList::update_contents() +bool GuiErrorList::goTo(int item) { - setViewTitle(from_utf8(controller().name())); - dialog_->errorsLW->clear(); - dialog_->descriptionTB->setPlainText(QString()); - - ErrorList::const_iterator it = controller().errorList().begin(); - ErrorList::const_iterator end = controller().errorList().end(); - for(; it != end; ++it) { - dialog_->errorsLW->addItem(toqstr(it->error)); + ErrorItem const & err = errorList()[item]; + + if (err.par_id == -1) + return false; + + if (from_master_) + // FIXME: implement + return false; + + Buffer const & buf = buffer(); + DocIterator dit = buf.getParFromID(err.par_id); + + if (dit == doc_iterator_end(&buf)) { + // FIXME: Happens when loading a read-only doc with + // unknown layout. Should this be the case? + LYXERR0("par id " << err.par_id << " not found"); + return false; } + + // Now make the selection. + // if pos_end is 0, this means it is end-of-paragraph + pos_type const s = dit.paragraph().size(); + pos_type const end = err.pos_end ? min(err.pos_end, s) : s; + pos_type const start = min(err.pos_start, end); + pos_type const range = end - start; + dit.pos() = start; + BufferView * bv = const_cast(bufferview()); + // FIXME: If we used an LFUN, we would not need this line: + bv->putSelectionAt(dit, range, false); + bv->processUpdateFlags(Update::Force | Update::FitCursor); + return true; } + +Dialog * createGuiErrorList(GuiView & lv) { return new GuiErrorList(lv); } + } // namespace frontend } // namespace lyx -#include "GuiErrorList_moc.cpp" +#include "moc_GuiErrorList.cpp"