X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiBibtex.cpp;h=ff0a03e272222dfcb0b7d2c6eb41d12d9fea0154;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=69aebc49611014affa0c3d39208c4dbb1e9198b6;hpb=88293cbcfb546a8aa5484f2c62a8b9b3ce3b4317;p=lyx.git diff --git a/src/frontends/qt4/GuiBibtex.cpp b/src/frontends/qt4/GuiBibtex.cpp index 69aebc4961..ff0a03e272 100644 --- a/src/frontends/qt4/GuiBibtex.cpp +++ b/src/frontends/qt4/GuiBibtex.cpp @@ -4,9 +4,9 @@ * Licence details can be found in the file COPYING. * * \author John Levon - * \author Herbert Voß + * \author Herbert Voß * \author Angus Leeming - * \author Jürgen Spitzmüller + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -17,15 +17,22 @@ #include "Buffer.h" #include "BufferParams.h" -#include "ui_BibtexAddUi.h" +#include "FuncRequest.h" +#include "LyXRC.h" #include "qt_helpers.h" #include "Validator.h" -#include "LyXRC.h" + +#include "ui_BibtexAddUi.h" #include "ButtonPolicy.h" +#include "frontends/alert.h" + +#include "insets/InsetBibtex.h" + #include "support/debug.h" -#include "support/FileFilterList.h" +#include "support/ExceptionMessage.h" +#include "support/FileName.h" #include "support/filetools.h" // changeExtension #include "support/gettext.h" #include "support/lstrings.h" @@ -43,7 +50,8 @@ namespace frontend { GuiBibtex::GuiBibtex(GuiView & lv) - : GuiCommand(lv, "bibtex", qt_("BibTeX Bibliography")) + : GuiDialog(lv, "bibtex", qt_("BibTeX Bibliography")), + params_(insetCode("bibtex")) { setupUi(this); @@ -71,6 +79,8 @@ GuiBibtex::GuiBibtex(GuiView & lv) this, SLOT(change_adaptor())); connect(addBibPB, SIGNAL(clicked()), this, SLOT(addPressed())); + connect(rescanPB, SIGNAL(clicked()), + this, SLOT(rescanClicked())); add_ = new GuiBibtexAddDialog(this); add_bc_.setPolicy(ButtonPolicy::OkCancelPolicy); @@ -84,6 +94,8 @@ GuiBibtex::GuiBibtex(GuiView & lv) this, SLOT(addDatabase())); connect(add_->addPB, SIGNAL(clicked()), add_, SLOT(accept())); + connect(add_->rescanPB, SIGNAL(clicked()), + this, SLOT(rescanClicked())); connect(add_->bibLW, SIGNAL(itemActivated(QListWidgetItem *)), this, SLOT(addDatabase())); connect(add_->bibLW, SIGNAL(itemActivated(QListWidgetItem *)), @@ -128,51 +140,51 @@ void GuiBibtex::change_adaptor() void GuiBibtex::browsePressed() { - docstring const file = browseBst(docstring()); - - if (!file.empty()) { - // FIXME UNICODE - docstring const filen = from_utf8(changeExtension(to_utf8(file), "")); - bool present = false; - unsigned int pres = 0; - - for (int i = 0; i != styleCB->count(); ++i) { - if (qstring_to_ucs4(styleCB->itemText(i)) == filen) { - present = true; - pres = i; - } - } + QString const file = browseBst(QString()); + + if (file.isEmpty()) + return; - if (!present) - styleCB->insertItem(0, toqstr(filen)); + QString const filen = changeExtension(file, ""); + bool present = false; + unsigned int pres = 0; - styleCB->setCurrentIndex(pres); - changed(); + for (int i = 0; i != styleCB->count(); ++i) { + if (styleCB->itemText(i) == filen) { + present = true; + pres = i; + } } + + if (!present) + styleCB->insertItem(0, filen); + + styleCB->setCurrentIndex(pres); + changed(); } void GuiBibtex::browseBibPressed() { - docstring const file = trim(browseBib(docstring())); + QString const file = browseBib(QString()).trimmed(); - if (!file.empty()) { - // FIXME UNICODE - QString const f = toqstr(changeExtension(to_utf8(file), "")); - bool present = false; + if (file.isEmpty()) + return; - for (int i = 0; i < add_->bibLW->count(); ++i) { - if (add_->bibLW->item(i)->text() == f) - present = true; - } + QString const f = changeExtension(file, ""); + bool present = false; - if (!present) { - add_->bibLW->addItem(f); - changed(); - } + for (int i = 0; i < add_->bibLW->count(); ++i) { + if (add_->bibLW->item(i)->text() == f) + present = true; + } - add_->bibED->setText(f); + if (!present) { + add_->bibLW->addItem(f); + changed(); } + + add_->bibED->setText(f); } @@ -186,9 +198,9 @@ void GuiBibtex::addPressed() void GuiBibtex::addDatabase() { int const sel = add_->bibLW->currentRow(); - docstring const file = trim(qstring_to_ucs4(add_->bibED->text())); + QString const file = add_->bibED->text().trimmed(); - if (sel < 0 && file.empty()) + if (sel < 0 && file.isEmpty()) return; // Add the selected browser_bib keys to browser_database @@ -202,24 +214,20 @@ void GuiBibtex::addDatabase() if (matches.empty()) { QString label = item->text(); QListWidgetItem * db = new QListWidgetItem(label); - db->setFlags(db->flags() | Qt::ItemIsSelectable - | Qt::ItemIsUserCheckable); - db->setCheckState(Qt::Checked); + db->setFlags(db->flags() | Qt::ItemIsSelectable); databaseLW->addItem(db); } } } - if (!file.empty()) { + if (!file.isEmpty()) { add_->bibED->clear(); - QString const f = toqstr(from_utf8(changeExtension(to_utf8(file), ""))); + QString const f = changeExtension(file, ""); QList matches = databaseLW->findItems(f, Qt::MatchExactly); if (matches.empty()) { QListWidgetItem * db = new QListWidgetItem(f); - db->setFlags(db->flags() | Qt::ItemIsSelectable - | Qt::ItemIsUserCheckable); - db->setCheckState(Qt::Checked); + db->setFlags(db->flags() | Qt::ItemIsSelectable); databaseLW->addItem(db); } } @@ -260,6 +268,13 @@ void GuiBibtex::downPressed() } +void GuiBibtex::rescanClicked() +{ + rescanBibStyles(); + updateContents(); +} + + void GuiBibtex::databaseChanged() { bool readOnly = isBufferReadonly(); @@ -284,34 +299,25 @@ void GuiBibtex::updateContents() databaseLW->clear(); docstring bibs = params_["bibfiles"]; - docstring embs = params_["embed"]; docstring bib; - docstring emb; while (!bibs.empty()) { bibs = split(bibs, bib, ','); - embs = split(embs, emb, ','); bib = trim(bib); if (!bib.empty()) { QListWidgetItem * db = new QListWidgetItem(toqstr(bib)); - db->setFlags(db->flags() | Qt::ItemIsSelectable - | Qt::ItemIsUserCheckable); - db->setCheckState(emb.empty() ? Qt::Unchecked : Qt::Checked); + db->setFlags(db->flags() | Qt::ItemIsSelectable); databaseLW->addItem(db); } } add_->bibLW->clear(); - vector bib_str; - getBibFiles(bib_str); - for (vector::const_iterator it = bib_str.begin(); - it != bib_str.end(); ++it) { - string bibItem(changeExtension(*it, "")); - add_->bibLW->addItem(toqstr(bibItem)); - } + QStringList bibfiles = bibFiles(); + for (int i = 0; i != bibfiles.count(); ++i) + add_->bibLW->addItem(changeExtension(bibfiles[i], "")); - string bibstyle = getStylefile(); + QString bibstyle = styleFile(); bibtocCB->setChecked(bibtotoc() && !bibtopic); bibtocCB->setEnabled(!bibtopic); @@ -333,20 +339,18 @@ void GuiBibtex::updateContents() styleCB->clear(); - int item_nr(-1); + int item_nr = -1; - vector str; - getBibStyles(str); - for (vector::const_iterator it = str.begin(); - it != str.end(); ++it) { - string item(changeExtension(*it, "")); + QStringList str = bibStyles(); + for (int i = 0; i != str.count(); ++i) { + QString item = changeExtension(str[i], ""); if (item == bibstyle) - item_nr = int(it - str.begin()); - styleCB->addItem(toqstr(item)); + item_nr = i; + styleCB->addItem(item); } - if (item_nr == -1 && !bibstyle.empty()) { - styleCB->addItem(toqstr(bibstyle)); + if (item_nr == -1 && !bibstyle.isEmpty()) { + styleCB->addItem(bibstyle); item_nr = styleCB->count() - 1; } @@ -359,24 +363,23 @@ void GuiBibtex::updateContents() void GuiBibtex::applyView() { - docstring dbs = qstring_to_ucs4(databaseLW->item(0)->text()); - docstring emb = databaseLW->item(0)->checkState() == Qt::Checked ? _("true") : _("false"); + docstring dbs; unsigned int maxCount = databaseLW->count(); - for (unsigned int i = 1; i < maxCount; i++) { - dbs += ','; - dbs += qstring_to_ucs4(databaseLW->item(i)->text()); - emb += ','; - emb += databaseLW->item(i)->checkState() == Qt::Checked ? _("true") : _("false"); + for (unsigned int i = 0; i < maxCount; i++) { + if (i != 0) + dbs += ','; + QString item = databaseLW->item(i)->text(); + docstring bibfile = qstring_to_ucs4(item); + dbs += bibfile; } params_["bibfiles"] = dbs; - params_["embed"] = emb; docstring const bibstyle = qstring_to_ucs4(styleCB->currentText()); bool const bibtotoc = bibtocCB->isChecked(); - if (bibtotoc && (!bibstyle.empty())) { + if (bibtotoc && !bibstyle.empty()) { // both bibtotoc and style params_["options"] = "bibtotoc," + bibstyle; } else if (bibtotoc) { @@ -427,63 +430,55 @@ bool GuiBibtex::isValid() } -docstring const GuiBibtex::browseBib(docstring const & in_name) const +QString GuiBibtex::browseBib(QString const & in_name) const { - // FIXME UNICODE - docstring const label1 = _("Documents|#o#O"); - docstring const dir1 = from_utf8(lyxrc.document_path); - FileFilterList const filter(_("BibTeX Databases (*.bib)")); - return browseRelFile(in_name, from_utf8(bufferFilepath()), - _("Select a BibTeX database to add"), filter, false, label1, dir1); + QString const label1 = qt_("Documents|#o#O"); + QString const dir1 = toqstr(lyxrc.document_path); + QStringList const filter(qt_("BibTeX Databases (*.bib)")); + return browseRelFile(in_name, bufferFilepath(), + qt_("Select a BibTeX database to add"), filter, false, label1, dir1); } -docstring const GuiBibtex::browseBst(docstring const & in_name) const +QString GuiBibtex::browseBst(QString const & in_name) const { - // FIXME UNICODE - docstring const label1 = _("Documents|#o#O"); - docstring const dir1 = from_utf8(lyxrc.document_path); - FileFilterList const filter(_("BibTeX Styles (*.bst)")); - return browseRelFile(in_name, from_utf8(bufferFilepath()), - _("Select a BibTeX style"), filter, false, label1, dir1); + QString const label1 = qt_("Documents|#o#O"); + QString const dir1 = toqstr(lyxrc.document_path); + QStringList const filter(qt_("BibTeX Styles (*.bst)")); + return browseRelFile(in_name, bufferFilepath(), + qt_("Select a BibTeX style"), filter, false, label1, dir1); } -void GuiBibtex::getBibStyles(vector & data) const +QStringList GuiBibtex::bibStyles() const { - data.clear(); - - getTexFileList("bstFiles.lst", data); - // test, if we have a valid list, otherwise run rescan - if (data.empty()) { + QStringList data = texFileList("bstFiles.lst"); + // test whether we have a valid list, otherwise run rescan + if (data.isEmpty()) { rescanBibStyles(); - getTexFileList("bstFiles.lst", data); + data = texFileList("bstFiles.lst"); } - vector::iterator it = data.begin(); - vector::iterator end = data.end(); - for (; it != end; ++it) - *it = support::onlyFilename(*it); + for (int i = 0; i != data.size(); ++i) + data[i] = onlyFilename(data[i]); // sort on filename only (no path) - sort(data.begin(), data.end()); + data.sort(); + return data; } -void GuiBibtex::getBibFiles(vector & data) const +QStringList GuiBibtex::bibFiles() const { - data.clear(); - - getTexFileList("bibFiles.lst", data); - // test, if we have a valid list, otherwise run rescan - if (data.empty()) { + QStringList data = texFileList("bibFiles.lst"); + // test whether we have a valid list, otherwise run rescan + if (data.isEmpty()) { rescanBibStyles(); - getTexFileList("bibFiles.lst", data); + data = texFileList("bibFiles.lst"); } - vector::iterator it = data.begin(); - vector::iterator end = data.end(); - for (; it != end; ++it) - *it = support::onlyFilename(*it); + for (int i = 0; i != data.size(); ++i) + data[i] = onlyFilename(data[i]); // sort on filename only (no path) - sort(data.begin(), data.end()); + data.sort(); + return data; } @@ -505,52 +500,70 @@ bool GuiBibtex::bibtotoc() const } -string const GuiBibtex::getStylefile() const +QString GuiBibtex::styleFile() const { // the different bibtex packages have (and need) their // own "plain" stylefiles - biblio::CiteEngine const engine = buffer().params().getEngine(); - docstring defaultstyle; + CiteEngine const engine = buffer().params().citeEngine(); + QString defaultstyle; switch (engine) { - case biblio::ENGINE_BASIC: - defaultstyle = from_ascii("plain"); + case ENGINE_BASIC: + defaultstyle = "plain"; break; - case biblio::ENGINE_NATBIB_AUTHORYEAR: - defaultstyle = from_ascii("plainnat"); + case ENGINE_NATBIB_AUTHORYEAR: + defaultstyle = "plainnat"; break; - case biblio::ENGINE_NATBIB_NUMERICAL: - defaultstyle = from_ascii("plainnat"); + case ENGINE_NATBIB_NUMERICAL: + defaultstyle = "plainnat"; break; - case biblio::ENGINE_JURABIB: - defaultstyle = from_ascii("jurabib"); + case ENGINE_JURABIB: + defaultstyle = "jurabib"; break; } - docstring bst = params_["options"]; + QString bst = toqstr(params_["options"]); if (bibtotoc()){ // bibstyle exists? - if (contains(bst, ',')) { - docstring bibtotoc = from_ascii("bibtotoc"); - bst = split(bst, bibtotoc, ','); - } else - bst.erase(); + int pos = bst.indexOf(','); + if (pos != -1) { + // FIXME: check + // docstring bibtotoc = from_ascii("bibtotoc"); + // bst = split(bst, bibtotoc, ','); + bst = bst.mid(pos + 1); + } else { + bst.clear(); + } } // propose default style file for new insets // existing insets might have (legally) no bst files // (if the class already provides a style) - if (bst.empty() && params_["bibfiles"].empty()) + if (bst.isEmpty() && params_["bibfiles"].empty()) bst = defaultstyle; - // FIXME UNICODE - return to_utf8(bst); + return bst; } +bool GuiBibtex::initialiseParams(std::string const & data) +{ + InsetCommand::string2params("bibtex", data, params_); + return true; +} + + +void GuiBibtex::dispatchParams() +{ + std::string const lfun = InsetCommand::params2string("bibtex", params_); + dispatch(FuncRequest(getLfun(), lfun)); +} + + + Dialog * createGuiBibtex(GuiView & lv) { return new GuiBibtex(lv); } } // namespace frontend } // namespace lyx -#include "GuiBibtex_moc.cpp" +#include "moc_GuiBibtex.cpp"