X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiCitation.cpp;h=35f7e913a7fc835638c4e4251d2a52fa78cdb452;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=abc30048c296dd335e28cfaf5b35e8d7cd98c9d9;hpb=2cf301033e456abd7fe6984503ec1a1a4e7fc231;p=lyx.git diff --git a/src/frontends/qt4/GuiCitation.cpp b/src/frontends/qt4/GuiCitation.cpp index abc30048c2..35f7e913a7 100644 --- a/src/frontends/qt4/GuiCitation.cpp +++ b/src/frontends/qt4/GuiCitation.cpp @@ -1,3 +1,4 @@ + /** * \file GuiCitation.cpp * This file is part of LyX, the document processor. @@ -103,8 +104,6 @@ GuiCitation::GuiCitation(GuiView & lv) this, SLOT(on_okPB_clicked())); connect(textAfterED, SIGNAL(returnPressed()), this, SLOT(on_okPB_clicked())); - - connect(this, SIGNAL(rejected()), this, SLOT(cleanUp())); selectionManager = new GuiSelectionManager(availableLV, selectedLV, addPB, deletePB, upPB, downPB, &available_model_, &selected_model_); @@ -115,6 +114,8 @@ GuiCitation::GuiCitation(GuiView & lv) connect(selectionManager, SIGNAL(okHook()), this, SLOT(on_okPB_clicked())); + setFocusProxy(availableLV); + // FIXME: the sizeHint() for this is _way_ too high infoML->setFixedHeight(60); } @@ -126,19 +127,10 @@ GuiCitation::~GuiCitation() } -void GuiCitation::cleanUp() -{ - clearSelection(); - clearParams(); - close(); -} - - void GuiCitation::closeEvent(QCloseEvent * e) { clearSelection(); - clearParams(); - e->accept(); + DialogView::closeEvent(e); } @@ -191,30 +183,37 @@ void GuiCitation::on_restorePB_clicked() } +void GuiCitation::updateControls() +{ + BiblioInfo const & bi = bibInfo(); + updateControls(bi); +} + + // The main point of separating this out is that the fill*() methods // called in update() do not need to be called for INTERNAL updates, // such as when addPB is pressed, as the list of fields, entries, etc, // will not have changed. At the moment, however, the division between // fillStyles() and updateStyle() doesn't lend itself to dividing the // two methods, though they should be divisible. -void GuiCitation::updateControls() +void GuiCitation::updateControls(BiblioInfo const & bi) { if (selectionManager->selectedFocused()) { if (selectedLV->selectionModel()->selectedIndexes().isEmpty()) - updateInfo(availableLV->currentIndex()); + updateInfo(bi, availableLV->currentIndex()); else - updateInfo(selectedLV->currentIndex()); + updateInfo(bi, selectedLV->currentIndex()); } else { if (availableLV->selectionModel()->selectedIndexes().isEmpty()) - updateInfo(QModelIndex()); + updateInfo(bi, QModelIndex()); else - updateInfo(availableLV->currentIndex()); + updateInfo(bi, availableLV->currentIndex()); } setButtons(); textBeforeED->setText(toqstr(params_["before"])); textAfterED->setText(toqstr(params_["after"])); - fillStyles(); + fillStyles(bi); updateStyle(); } @@ -232,8 +231,14 @@ void GuiCitation::updateFormatting(CiteStyle currentStyle) bool const isNocite = currentStyle == NOCITE; - fulllistCB->setEnabled(natbib_engine && haveSelection && !isNocite); - forceuppercaseCB->setEnabled(natbib_engine && haveSelection && !isNocite); + bool const isCiteyear = + currentStyle == CITEYEAR || + currentStyle == CITEYEARPAR; + + fulllistCB->setEnabled(natbib_engine && haveSelection && !isNocite + && !isCiteyear); + forceuppercaseCB->setEnabled(natbib_engine && haveSelection + && !isNocite && !isCiteyear); textBeforeED->setEnabled(!basic_engine && haveSelection && !isNocite); textBeforeLA->setEnabled(!basic_engine && haveSelection && !isNocite); textAfterED->setEnabled(haveSelection && !isNocite); @@ -275,7 +280,7 @@ void GuiCitation::updateStyle() // This one needs to be called whenever citationStyleCO needs // to be updated---and this would be on anything that changes the // selection in selectedLV, or on a general update. -void GuiCitation::fillStyles() +void GuiCitation::fillStyles(BiblioInfo const & bi) { int const oldIndex = citationStyleCO->currentIndex(); @@ -295,7 +300,7 @@ void GuiCitation::fillStyles() if (!selectedLV->selectionModel()->selectedIndexes().empty()) curr = selectedLV->selectionModel()->selectedIndexes()[0].row(); - QStringList sty = citationStyles(curr); + QStringList sty = citationStyles(bi, curr); citationStyleCO->setEnabled(!sty.isEmpty()); citationStyleLA->setEnabled(!sty.isEmpty()); @@ -310,13 +315,13 @@ void GuiCitation::fillStyles() } -void GuiCitation::fillFields() +void GuiCitation::fillFields(BiblioInfo const & bi) { fieldsCO->blockSignals(true); int const oldIndex = fieldsCO->currentIndex(); fieldsCO->clear(); - QStringList const fields = to_qstring_list(bibInfo().getFields()); - fieldsCO->insertItem(0, qt_("All Fields")); + QStringList const fields = to_qstring_list(bi.getFields()); + fieldsCO->insertItem(0, qt_("All fields")); fieldsCO->insertItem(1, qt_("Keys")); fieldsCO->insertItems(2, fields); if (oldIndex != -1 && oldIndex < fieldsCO->count()) @@ -325,13 +330,13 @@ void GuiCitation::fillFields() } -void GuiCitation::fillEntries() +void GuiCitation::fillEntries(BiblioInfo const & bi) { entriesCO->blockSignals(true); int const oldIndex = entriesCO->currentIndex(); entriesCO->clear(); - QStringList const entries = to_qstring_list(bibInfo().getEntries()); - entriesCO->insertItem(0, qt_("All Entry Types")); + QStringList const entries = to_qstring_list(bi.getEntries()); + entriesCO->insertItem(0, qt_("All entry types")); entriesCO->insertItems(1, entries); if (oldIndex != -1 && oldIndex < entriesCO->count()) entriesCO->setCurrentIndex(oldIndex); @@ -355,15 +360,15 @@ void GuiCitation::setButtons() } -void GuiCitation::updateInfo(QModelIndex const & idx) +void GuiCitation::updateInfo(BiblioInfo const & bi, QModelIndex const & idx) { - if (!idx.isValid() || bibInfo().empty()) { + if (!idx.isValid() || bi.empty()) { infoML->document()->clear(); return; } QString const keytxt = toqstr( - bibInfo().getInfo(qstring_to_ucs4(idx.data().toString()))); + bi.getInfo(qstring_to_ucs4(idx.data().toString()))); infoML->document()->setPlainText(keytxt); } @@ -372,7 +377,8 @@ void GuiCitation::findText(QString const & text, bool reset) { //"All Fields" and "Keys" are the first two int index = fieldsCO->currentIndex() - 2; - vector const & fields = bibInfo().getFields(); + BiblioInfo const & bi = bibInfo(); + vector const & fields = bi.getFields(); docstring field; if (index <= -1 || index >= int(fields.size())) @@ -386,7 +392,7 @@ void GuiCitation::findText(QString const & text, bool reset) //"All Entry Types" is first. index = entriesCO->currentIndex() - 1; - vector const & entries = bibInfo().getEntries(); + vector const & entries = bi.getEntries(); docstring entry_type; if (index < 0 || index >= int(entries.size())) entry_type = from_ascii(""); @@ -395,14 +401,14 @@ void GuiCitation::findText(QString const & text, bool reset) bool const case_sentitive = caseCB->checkState(); bool const reg_exp = regexCB->checkState(); - findKey(text, onlyKeys, field, entry_type, + findKey(bi, text, onlyKeys, field, entry_type, case_sentitive, reg_exp, reset); //FIXME //It'd be nice to save and restore the current selection in //availableLV. Currently, we get an automatic reset, since the //model is reset. - updateControls(); + updateControls(bi); } @@ -511,7 +517,8 @@ void GuiCitation::clearSelection() void GuiCitation::init() { // Make the list of all available bibliography keys - all_keys_ = to_qstring_list(bibInfo().getKeys()); + BiblioInfo const & bi = bibInfo(); + all_keys_ = to_qstring_list(bi.getKeys()); available_model_.setStringList(all_keys_); // Ditto for the keys cited in this inset @@ -521,14 +528,14 @@ void GuiCitation::init() else cited_keys_ = str.split(","); selected_model_.setStringList(cited_keys_); - - fillFields(); - fillEntries(); - updateControls(); + fillFields(bi); + fillEntries(bi); + updateControls(bi); } -void GuiCitation::findKey(QString const & str, bool only_keys, +void GuiCitation::findKey(BiblioInfo const & bi, + QString const & str, bool only_keys, docstring field, docstring entry_type, bool case_sensitive, bool reg_exp, bool reset) { @@ -568,22 +575,22 @@ void GuiCitation::findKey(QString const & str, bool only_keys, // First, filter by entry_type, which will be faster than // what follows, so we may get to do that on less. vector keyVector = to_docstring_vector(keys); - filterByEntryType(keyVector, entry_type); + filterByEntryType(bi, keyVector, entry_type); if (str.isEmpty()) result = to_qstring_list(keyVector); else - result = to_qstring_list(searchKeys(keyVector, only_keys, + result = to_qstring_list(searchKeys(bi, keyVector, only_keys, qstring_to_ucs4(str), field, case_sensitive, reg_exp)); available_model_.setStringList(result); } -QStringList GuiCitation::citationStyles(int sel) +QStringList GuiCitation::citationStyles(BiblioInfo const & bi, int sel) { docstring const key = qstring_to_ucs4(cited_keys_[sel]); - return to_qstring_list(bibInfo().getCiteStrings(key, buffer())); + return to_qstring_list(bi.getCiteStrings(key, buffer())); } @@ -609,7 +616,7 @@ void GuiCitation::clearParams() } -void GuiCitation::filterByEntryType( +void GuiCitation::filterByEntryType(BiblioInfo const & bi, vector & keyVector, docstring entry_type) { if (entry_type.empty()) @@ -617,12 +624,12 @@ void GuiCitation::filterByEntryType( vector::iterator it = keyVector.begin(); vector::iterator end = keyVector.end(); - + vector result; for (; it != end; ++it) { docstring const key = *it; - BiblioInfo::const_iterator cit = bibInfo().find(key); - if (cit == bibInfo().end()) + BiblioInfo::const_iterator cit = bi.find(key); + if (cit == bi.end()) continue; if (cit->second.entryType() == entry_type) result.push_back(key); @@ -660,7 +667,7 @@ static docstring escape_special_chars(docstring const & expr) } -vector GuiCitation::searchKeys( +vector GuiCitation::searchKeys(BiblioInfo const & bi, vector const & keys_to_search, bool only_keys, docstring const & search_expression, docstring field, bool case_sensitive, bool regex) @@ -690,8 +697,8 @@ vector GuiCitation::searchKeys( vector::const_iterator it = keys_to_search.begin(); vector::const_iterator end = keys_to_search.end(); for (; it != end; ++it ) { - BiblioInfo::const_iterator info = bibInfo().find(*it); - if (info == bibInfo().end()) + BiblioInfo::const_iterator info = bi.find(*it); + if (info == bi.end()) continue; BibTeXInfo const & kvm = info->second; @@ -700,8 +707,8 @@ vector GuiCitation::searchKeys( data = to_utf8(*it); else if (field.empty()) data = to_utf8(*it) + ' ' + to_utf8(kvm.allData()); - else if (kvm.hasField(field)) - data = to_utf8(kvm.getValueForField(field)); + else + data = to_utf8(kvm[field]); if (data.empty()) continue; @@ -728,6 +735,7 @@ void GuiCitation::dispatchParams() BiblioInfo const & GuiCitation::bibInfo() const { + buffer().checkBibInfoCache(); return buffer().masterBibInfo(); } @@ -764,5 +772,5 @@ Dialog * createGuiCitation(GuiView & lv) { return new GuiCitation(lv); } } // namespace frontend } // namespace lyx -#include "GuiCitation_moc.cpp" +#include "moc_GuiCitation.cpp"