]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiBibtex.cpp
Use <cstdint> instead of <boost/cstdint.hpp>
[lyx.git] / src / frontends / qt4 / GuiBibtex.cpp
index a70f976804a1be6c8fa61af77fe16de0245eec3e..8680a384d286e96c63dd92f456788b606d86a933 100644 (file)
@@ -90,6 +90,7 @@ GuiBibtex::GuiBibtex(GuiView & lv)
        connect(browseBibPB, SIGNAL(clicked()),
                this, SLOT(browseBibPressed()));
 
+       selected_model_.insertColumns(0, 1);
        selectionManager = new GuiSelectionManager(this, availableLV, selectedLV,
                        addBibPB, deletePB, upPB, downPB, &available_model_, &selected_model_);
        connect(selectionManager, SIGNAL(selectionChanged()),
@@ -126,15 +127,20 @@ GuiBibtex::GuiBibtex(GuiView & lv)
        bc().addReadOnly(bibtocCB);
        bc().addReadOnly(bibEncodingCO);
 
+#if (QT_VERSION < 0x050000)
+       selectedLV->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
+#else
+       selectedLV->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+#endif
+
        // Always put the default encoding in the first position.
        bibEncodingCO->addItem(qt_("Document Encoding"), "default");
-       QMap<QString, QString> encodinglist;
        for (auto const & encvar : encodings) {
                if (!encvar.unsafe() && !encvar.guiName().empty())
-                       encodinglist.insert(qt_(encvar.guiName()), toqstr(encvar.name()));
+                       encodings_.insert(qt_(encvar.guiName()), toqstr(encvar.name()));
        }
-       QMap<QString, QString>::const_iterator it = encodinglist.constBegin();
-       while (it != encodinglist.constEnd()) {
+       QMap<QString, QString>::const_iterator it = encodings_.constBegin();
+       while (it != encodings_.constEnd()) {
                bibEncodingCO->addItem(it.key(), it.value());
                ++it;
        }
@@ -179,6 +185,7 @@ void GuiBibtex::setButtons()
 void GuiBibtex::selUpdated()
 {
        selectionManager->update();
+       editPB->setEnabled(deletePB->isEnabled());
        changed();
 }
 
@@ -200,7 +207,7 @@ void GuiBibtex::browseBstPressed()
 
        QString const filen = changeExtension(file, "");
        bool present = false;
-       unsigned int pres = 0;
+       int pres = 0;
 
        for (int i = 0; i != styleCB->count(); ++i) {
                if (styleCB->itemText(i) == filen) {
@@ -234,6 +241,19 @@ void GuiBibtex::browseBibPressed()
 }
 
 
+void GuiBibtex::on_editPB_clicked()
+{
+       QModelIndexList selIdx =
+               selectedLV->selectionModel()->selectedIndexes();
+       if (selIdx.isEmpty())
+               return;
+       QModelIndex idx = selIdx.first();
+       QString sel = idx.data().toString();
+       FuncRequest fr(LFUN_INSET_EDIT, fromqstr(sel));
+       dispatch(fr);
+}
+
+
 void GuiBibtex::rescanClicked()
 {
        rescanBibStyles();
@@ -251,6 +271,25 @@ void GuiBibtex::clearSelection()
 void GuiBibtex::setSelectedBibs(QStringList const sl)
 {
        selected_model_.clear();
+       QStringList headers;
+       headers << qt_("Database")
+               << qt_("File Encoding");
+       selected_model_.setHorizontalHeaderLabels(headers);
+       bool const moreencs = usingBiblatex() && sl.count() > 1;
+       selectedLV->setColumnHidden(1, !moreencs);
+       selectedLV->verticalHeader()->setVisible(false);
+       selectedLV->horizontalHeader()->setVisible(moreencs);
+       if (moreencs) {
+               bibEncodingLA->setText(qt_("General E&ncoding:"));
+               bibEncodingCO->setToolTip(qt_("If your bibliography databases use a different "
+                                             "encoding than the LyX document, specify it here. "
+                                             "If indivivual databases have different encodings, "
+                                             "you can set it in the list above."));
+       } else {
+               bibEncodingLA->setText(qt_("E&ncoding:"));
+               bibEncodingCO->setToolTip(qt_("If your bibliography databases use a different "
+                                             "encoding than the LyX document, specify it here"));
+       }
        QStringList::const_iterator it  = sl.begin();
        QStringList::const_iterator end = sl.end();
        for (int i = 0; it != end; ++it, ++i) {
@@ -260,7 +299,19 @@ void GuiBibtex::setSelectedBibs(QStringList const sl)
                si->setToolTip(*it);
                si->setEditable(false);
                selected_model_.insertRow(i, si);
+               QComboBox * cb = new QComboBox;
+               cb->addItem(qt_("General Encoding"), "general");
+               cb->addItem(qt_("Document Encoding"), "auto");
+               QMap<QString, QString>::const_iterator it = encodings_.constBegin();
+               while (it != encodings_.constEnd()) {
+                       cb->addItem(it.key(), it.value());
+                       ++it;
+               }
+               cb->setToolTip(qt_("If this bibliography database uses a different "
+                                  "encoding than specified below, set it here"));
+               selectedLV->setIndexWidget(selected_model_.index(i, 1), cb);
        }
+       editPB->setEnabled(deletePB->isEnabled());
 }
 
 
@@ -278,11 +329,7 @@ QStringList GuiBibtex::selectedBibs()
 
 void GuiBibtex::databaseChanged()
 {
-       QString const item = selectionManager->getSelectedIndex().data().toString();
-       if (!selected_bibs_.contains(item)) {
-               selected_bibs_.append(item);
-       } else
-               selected_bibs_ = selectedBibs();
+       selected_bibs_ = selectedBibs();
        setSelectedBibs(selected_bibs_);
 }
 
@@ -354,6 +401,9 @@ void GuiBibtex::updateContents()
                        styleCB->clearEditText();
        } else
                biblatexOptsLE->setText(toqstr(params_["biblatexopts"]));
+
+       setFileEncodings(getVectorFromString(params_["file_encodings"], from_ascii("\t")));
+       editPB->setEnabled(deletePB->isEnabled());
 }
 
 
@@ -361,8 +411,8 @@ void GuiBibtex::applyView()
 {
        docstring dbs;
 
-       unsigned int maxCount = selected_bibs_.count();
-       for (unsigned int i = 0; i < maxCount; i++) {
+       int maxCount = selected_bibs_.count();
+       for (int i = 0; i < maxCount; i++) {
                if (i != 0)
                        dbs += ',';
                QString item = selected_bibs_.at(i);
@@ -393,6 +443,9 @@ void GuiBibtex::applyView()
        params_["btprint"] = qstring_to_ucs4(btPrintCO->itemData(btPrintCO->currentIndex()).toString());
 
        params_["encoding"] = qstring_to_ucs4(bibEncodingCO->itemData(bibEncodingCO->currentIndex()).toString());
+
+       if (usingBiblatex())
+               params_["file_encodings"] = getStringFromVector(getFileEncodings(), from_ascii("\t"));
 }
 
 
@@ -449,6 +502,37 @@ QStringList GuiBibtex::bibFiles(bool const extension) const
 }
 
 
+vector<docstring> GuiBibtex::getFileEncodings()
+{
+       vector<docstring> res;
+       for (int i = 0; i != selected_model_.rowCount(); ++i) {
+               QStandardItem const * key = selected_model_.item(i, 0);
+               QComboBox * cb = qobject_cast<QComboBox*>(selectedLV->indexWidget(selected_model_.index(i, 1)));
+               QString fenc = cb ? cb->itemData(cb->currentIndex()).toString() : QString();
+               if (key && !key->text().isEmpty() && !fenc.isEmpty() && fenc != "general")
+                       res.push_back(qstring_to_ucs4(key->text()) + " " + qstring_to_ucs4(fenc));
+       }
+       return res;
+}
+
+
+void GuiBibtex::setFileEncodings(vector<docstring> const m)
+{
+       for (docstring const & s: m) {
+               docstring key;
+               QString enc = toqstr(split(s, key, ' '));
+               QModelIndexList qmil =
+                               selected_model_.match(selected_model_.index(0, 0),
+                                                    Qt::DisplayRole, toqstr(key), 1,
+                                                    Qt::MatchFlags(Qt::MatchExactly | Qt::MatchWrap));
+               if (!qmil.empty()) {
+                       QComboBox * cb = qobject_cast<QComboBox*>(selectedLV->indexWidget(selected_model_.index(qmil.front().row(), 1)));
+                       cb->setCurrentIndex(cb->findData(enc));
+               }
+       }
+}
+
+
 void GuiBibtex::rescanBibStyles() const
 {
        if (usingBiblatex())