]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiCitation.cpp
Enable OK/Apply buttons when resetting to class defaults.
[lyx.git] / src / frontends / qt4 / GuiCitation.cpp
index c1694bb539eba1e4d99eff955fd0ee8a0bfb0926..cecdbca0939359e6211c0b539897057733f43561 100644 (file)
@@ -92,7 +92,7 @@ static vector<lyx::docstring> to_docstring_vector(QStringList const & qlist)
 
 GuiCitation::GuiCitation(GuiView & lv)
        : DialogView(lv, "citation", qt_("Citation")),
-         style_(0), params_(insetCode("citation"))
+         style_(QString()), literal_(false), params_(insetCode("citation"))
 {
        setupUi(this);
 
@@ -188,7 +188,7 @@ void GuiCitation::closeEvent(QCloseEvent * e)
 void GuiCitation::applyView()
 {
        int const choice = max(0, citationStyleCO->currentIndex());
-       style_ = choice;
+       style_ = citationStyleCO->itemData(citationStyleCO->currentIndex()).toString();
        bool const full  = starredCB->isChecked();
        bool const force = forceuppercaseCB->isChecked();
 
@@ -235,6 +235,13 @@ void GuiCitation::on_restorePB_clicked()
 }
 
 
+void GuiCitation::on_literalCB_clicked()
+{
+       literal_ = literalCB->isChecked();
+       changed();
+}
+
+
 void GuiCitation::updateControls()
 {
        BiblioInfo const & bi = bibInfo();
@@ -251,14 +258,14 @@ void GuiCitation::updateControls(BiblioInfo const & bi)
        QModelIndex idx = selectionManager->getSelectedIndex(1);
        updateInfo(bi, idx);
        int i = citationStyleCO->currentIndex();
-       if (i == -1)
+       if (i == -1 || i > int(citeStyles_.size()))
                i = 0;
        updateFormatting(citeStyles_[i]);
        selectionManager->update();
 }
 
 
-void GuiCitation::updateFormatting(CitationStyle currentStyle)
+void GuiCitation::updateFormatting(CitationStyle const & currentStyle)
 {
        BufferParams const bp = documentBuffer().params();
        bool const force = currentStyle.forceUpperCase;
@@ -372,9 +379,9 @@ void GuiCitation::updateStyles(BiblioInfo const & bi)
        }
 
        static const size_t max_length = 80;
-       QStringList sty = citationStyles(bi, max_length);
+       BiblioInfo::CiteStringMap sty = citationStyles(bi, max_length);
 
-       if (sty.isEmpty()) {
+       if (sty.empty()) {
                // some error
                citationStyleCO->setEnabled(false);
                citationStyleLA->setEnabled(false);
@@ -384,16 +391,21 @@ void GuiCitation::updateStyles(BiblioInfo const & bi)
 
        citationStyleCO->blockSignals(true);
 
-       // save old index
-       int const curindex = citationStyleCO->currentIndex();
-       int const oldIndex = (curindex < 0) ? style_ : curindex;
+       // save old style selection
+       QString const curdata =
+               citationStyleCO->itemData(citationStyleCO->currentIndex()).toString();
+       QString const olddata = (curdata.isEmpty()) ? style_ : curdata;
        citationStyleCO->clear();
-       citationStyleCO->insertItems(0, sty);
+       BiblioInfo::CiteStringMap::const_iterator cit = sty.begin();
+       BiblioInfo::CiteStringMap::const_iterator end = sty.end();
+       for (int ii = 1; cit != end; ++cit, ++ii)
+               citationStyleCO->addItem(toqstr(cit->second), toqstr(cit->first));
        citationStyleCO->setEnabled(true);
        citationStyleLA->setEnabled(true);
-       // restore old index
-       if (oldIndex != -1 && oldIndex < citationStyleCO->count())
-               citationStyleCO->setCurrentIndex(oldIndex);
+       // restore old style selection
+       int const i = citationStyleCO->findData(olddata);
+       if (i != -1)
+               citationStyleCO->setCurrentIndex(i);
 
        citationStyleCO->blockSignals(false);
 }
@@ -752,7 +764,13 @@ void GuiCitation::init()
                documentBuffer().params().fullAuthorList());
        textBeforeED->setText(toqstr(params_["before"]));
        textAfterED->setText(toqstr(params_["after"]));
-       literalCB->setChecked(params_["literal"] == "true");
+
+       // if this is a new citation, we set the literal checkbox
+       // to its last set value.
+       if (cited_keys_.isEmpty())
+               literalCB->setChecked(literal_);
+       else
+               literalCB->setChecked(params_["literal"] == "true");
 
        setPreTexts(getVectorFromString(params_["pretextlist"], from_ascii("\t")));
        setPostTexts(getVectorFromString(params_["posttextlist"], from_ascii("\t")));
@@ -842,7 +860,7 @@ void GuiCitation::findKey(BiblioInfo const & bi,
 }
 
 
-QStringList GuiCitation::citationStyles(BiblioInfo const & bi, size_t max_size)
+BiblioInfo::CiteStringMap GuiCitation::citationStyles(BiblioInfo const & bi, size_t max_size)
 {
        vector<docstring> const keys = to_docstring_vector(cited_keys_);
        vector<CitationStyle> styles = citeStyles_;
@@ -878,8 +896,8 @@ QStringList GuiCitation::citationStyles(BiblioInfo const & bi, size_t max_size)
        ci.isQualified = qualified;
        ci.pretexts = pres;
        ci.posttexts = posts;
-       vector<docstring> ret = bi.getCiteStrings(keys, styles, documentBuffer(), ci);
-       return to_qstring_list(ret);
+       BiblioInfo::CiteStringMap ret = bi.getCiteStrings(keys, styles, documentBuffer(), ci);
+       return ret;
 }
 
 
@@ -1031,10 +1049,9 @@ BiblioInfo const & GuiCitation::bibInfo() const
 }
 
 
-void GuiCitation::saveSession() const
+void GuiCitation::saveSession(QSettings & settings) const
 {
-       Dialog::saveSession();
-       QSettings settings;
+       Dialog::saveSession(settings);
        settings.setValue(
                sessionKey() + "/regex", regexp_->isChecked());
        settings.setValue(
@@ -1043,6 +1060,8 @@ void GuiCitation::saveSession() const
                sessionKey() + "/autofind", instant_->isChecked());
        settings.setValue(
                sessionKey() + "/citestyle", style_);
+       settings.setValue(
+               sessionKey() + "/literal", literal_);
 }
 
 
@@ -1053,7 +1072,8 @@ void GuiCitation::restoreSession()
        regexp_->setChecked(settings.value(sessionKey() + "/regex").toBool());
        casesense_->setChecked(settings.value(sessionKey() + "/casesensitive").toBool());
        instant_->setChecked(settings.value(sessionKey() + "/autofind", true).toBool());
-       style_ = settings.value(sessionKey() + "/citestyle").toInt();
+       style_ = settings.value(sessionKey() + "/citestyle").toString();
+       literal_ = settings.value(sessionKey() + "/literal", false).toBool();
        updateFilterHint();
 }