commit adc93015f9c356d4e5d594df86c888faaab8ad8b
Author: Juergen Spitzmueller <[email protected]>
Date: Sat Dec 31 14:57:09 2016 +0100
Rework default bibliography style UI
* Use a combo with all available styles
* Correctly reset default on engine change
* Consider that EngineTypes might have different defaults
---
lib/citeengines/natbib.citeengine | 2 +-
lib/configure.py | 19 ++++--
src/BufferParams.cpp | 3 +-
src/CiteEnginesList.cpp | 52 ++++++++++++++--
src/CiteEnginesList.h | 10 +++-
src/TextClass.cpp | 17 +++++-
src/TextClass.h | 5 +-
src/frontends/qt4/GuiDocument.cpp | 122 ++++++++++++++++++++++++++++++-------
src/frontends/qt4/GuiDocument.h | 8 ++-
src/frontends/qt4/ui/BiblioUi.ui | 62 +++++++++++++++----
src/insets/InsetBibtex.cpp | 2 +-
11 files changed, 243 insertions(+), 59 deletions(-)
diff --git a/lib/citeengines/natbib.citeengine
b/lib/citeengines/natbib.citeengine
index dcd160f..c738e51 100644
--- a/lib/citeengines/natbib.citeengine
+++ b/lib/citeengines/natbib.citeengine
@@ -14,7 +14,7 @@ Format 62
Requires natbib
CiteEngineType authoryear|numerical
-DefaultBiblio plainnat
+DefaultBiblio authoryear:plainnat|numerical:plainnat
CiteEngine authoryear
Citet*[][]
diff --git a/lib/configure.py b/lib/configure.py
index 680e32a..fb5dcc6 100644
--- a/lib/configure.py
+++ b/lib/configure.py
@@ -1511,7 +1511,7 @@ def checkCiteEnginesConfig():
## It has been automatically generated by configure
## Use "Options/Reconfigure" if you need to update it after a
## configuration change.
-## "CiteEngineName" "filename" "CiteEngineType" "Description" "Packages"
"Requires" "Excludes"
+## "CiteEngineName" "filename" "CiteEngineType" "DefaultBiblio" "Description"
"Packages" "Requires" "Excludes"
''')
# build the list of available modules
@@ -1550,16 +1550,17 @@ def processCiteEngineFile(file, filename, bool_docbook):
#Excludes: [list of excluded engines]
The last two lines are optional.
We expect output:
- "CiteEngineName" "filename" "CiteEngineType" "Description"
"Packages" "Requires" "Excludes"
+ "CiteEngineName" "filename" "CiteEngineType" "DefaultBiblio"
"Description" "Packages" "Requires" "Excludes"
'''
remods = re.compile(r'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
- rereqs = re.compile(r'#+\s*Requires: (.*)')
- reexcs = re.compile(r'#+\s*Excludes: (.*)')
+ rereqs = re.compile(r'#+\s*Requires:\s*(.*)')
+ reexcs = re.compile(r'#+\s*Excludes:\s*(.*)')
redbeg = re.compile(r'#+\s*DescriptionBegin\s*$')
redend = re.compile(r'#+\s*DescriptionEnd\s*$')
- recet = re.compile(r'\s*CiteEngineType (.*)')
+ recet = re.compile(r'\s*CiteEngineType\s*(.*)')
+ redb = re.compile(r'\s*DefaultBiblio\s*(.*)')
- modname = desc = pkgs = req = excl = cet = ""
+ modname = desc = pkgs = req = excl = cet = db = ""
readingDescription = False
descLines = []
@@ -1603,6 +1604,10 @@ def processCiteEngineFile(file, filename, bool_docbook):
if res != None:
cet = res.group(1)
continue
+ res = redb.search(line)
+ if res != None:
+ db = res.group(1)
+ continue
if modname == "":
logger.warning("Cite Engine File file without \DeclareLyXCiteEngine
line. ")
@@ -1625,7 +1630,7 @@ def processCiteEngineFile(file, filename, bool_docbook):
cm.write(line + '\n')
cm.close()
- return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet,
desc, pkgs, req, excl)
+ return '"%s" "%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename,
cet, db, desc, pkgs, req, excl)
def checkTeXAllowSpaces():
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 1e7f772..9cab407 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -3240,7 +3240,8 @@ bool BufferParams::addCiteEngine(vector<string> const &
engine)
string const & BufferParams::defaultBiblioStyle() const
{
- return documentClass().defaultBiblioStyle();
+ map<string, string> bs = documentClass().defaultBiblioStyle();
+ return bs[documentClass().opt_enginetype()];
}
diff --git a/src/CiteEnginesList.cpp b/src/CiteEnginesList.cpp
index 209c8bc..0e3f455 100644
--- a/src/CiteEnginesList.cpp
+++ b/src/CiteEnginesList.cpp
@@ -38,11 +38,11 @@ CiteEnginesList theCiteEnginesList;
LyXCiteEngine::LyXCiteEngine(string const & n, string const & i,
- vector<string> const & cet, string const & d,
- vector<string> const & p,
+ vector<string> const & cet, vector<string> const &
dbs,
+ string const & d, vector<string> const & p,
vector<string> const & r, vector<string> const &
e):
- name_(n), id_(i), engine_types_(cet), description_(d), package_list_(p),
- required_engines_(r), excluded_engines_(e),
+ name_(n), id_(i), engine_types_(cet), default_biblios_(dbs),
description_(d),
+ package_list_(p), required_engines_(r), excluded_engines_(e),
checked_(false), available_(false)
{
filename_ = id_ + ".citeengine";
@@ -118,6 +118,33 @@ bool LyXCiteEngine::areCompatible(string const & eng1,
string const & eng2)
}
+string LyXCiteEngine::getDefaultBiblio(CiteEngineType const & cet) const
+{
+ string res;
+ string const etp = theCiteEnginesList.getTypeAsString(cet) + ":";
+ //check whether all of the required packages are available
+ vector<string>::const_iterator it = default_biblios_.begin();
+ vector<string>::const_iterator end = default_biblios_.end();
+ for (; it != end; ++it) {
+ string const s = *it;
+ if (prefixIs(s, etp))
+ res = split(s, ':');
+ else if (!contains(s, ':') && res.empty())
+ res = s;
+ }
+ return res;
+}
+
+
+bool LyXCiteEngine::isDefaultBiblio(string const & bf) const
+{
+ if (find(default_biblios_.begin(), default_biblios_.end(), bf) !=
default_biblios_.end())
+ return true;
+ string const bfp = ":" + bf;
+ return find(default_biblios_.begin(), default_biblios_.end(), bfp) !=
default_biblios_.end();
+}
+
+
// used when sorting the cite engine list.
class EngineSorter {
public:
@@ -219,6 +246,16 @@ bool CiteEnginesList::read()
}
if (!lex.next(true))
break;
+ string db = lex.getString();
+ LYXERR(Debug::TCLASS, "Default Biblio: " << db);
+ vector<string> dbs;
+ while (!db.empty()) {
+ string p;
+ db = split(db, p, '|');
+ dbs.push_back(p);
+ }
+ if (!lex.next(true))
+ break;
string const desc = lex.getString();
LYXERR(Debug::TCLASS, "Description: " << desc);
//FIXME Add packages
@@ -254,7 +291,7 @@ bool CiteEnginesList::read()
}
// This code is run when we have
// cename, fname, desc, pkgs, req and exc
- addCiteEngine(cename, fname, cets, desc, pkgs, req,
exc);
+ addCiteEngine(cename, fname, cets, dbs, desc, pkgs,
req, exc);
} // end switch
} //end while
@@ -267,11 +304,12 @@ bool CiteEnginesList::read()
void CiteEnginesList::addCiteEngine(string const & cename,
- string const & filename, vector<string> const & cets, string const &
description,
+ string const & filename, vector<string> const & cets,
+ vector<string> const & dbs, string const & description,
vector<string> const & pkgs, vector<string> const & req,
vector<string> const & exc)
{
- LyXCiteEngine ce(cename, filename, cets, description, pkgs, req, exc);
+ LyXCiteEngine ce(cename, filename, cets, dbs, description, pkgs, req,
exc);
englist_.push_back(ce);
}
diff --git a/src/CiteEnginesList.h b/src/CiteEnginesList.h
index 17cfbb8..f1fc04b 100644
--- a/src/CiteEnginesList.h
+++ b/src/CiteEnginesList.h
@@ -51,6 +51,7 @@ public:
///
LyXCiteEngine(std::string const & name, std::string const & id,
std::vector<std::string> const & enginetypes,
+ std::vector<std::string> const & defaultbiblios,
std::string const & description,
std::vector<std::string> const & packagelist,
std::vector<std::string> const & requires,
@@ -70,6 +71,10 @@ public:
///
bool hasEngineType(CiteEngineType const &) const;
///
+ std::string getDefaultBiblio(CiteEngineType const &) const;
+ ///
+ bool isDefaultBiblio(std::string const &) const;
+ ///
std::string const & getDescription() const { return description_; }
///
std::vector<std::string> const & getPackageList() const
@@ -97,6 +102,8 @@ private:
std::string filename_;
/// the engine type(s)
std::vector<std::string> engine_types_;
+ /// default bibliography styles
+ std::vector<std::string> default_biblios_;
/// a short description for use in the ui
std::string description_;
/// the LaTeX packages on which this depends, if any
@@ -153,7 +160,8 @@ public:
void operator=(CiteEnginesList const &);
/// add an engine to the list
void addCiteEngine(std::string const &, std::string const &,
- std::vector<std::string> const &, std::string const &,
std::vector<std::string> const &,
+ std::vector<std::string> const &, std::vector<std::string>
const &,
+ std::string const &, std::vector<std::string> const &,
std::vector<std::string> const &, std::vector<std::string>
const &);
///
std::vector<LyXCiteEngine> englist_;
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index d14ef29..73f3cd1 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -759,8 +759,21 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc,
ReadType rt)
break;
case TC_DEFAULTBIBLIO:
- if (lexrc.next())
- cite_default_biblio_style_ =
rtrim(lexrc.getString());
+ if (lexrc.next()) {
+ vector<string> const dbs =
+
getVectorFromString(rtrim(lexrc.getString()), "|");
+ vector<string>::const_iterator it =
dbs.begin();
+ vector<string>::const_iterator end = dbs.end();
+ for (; it != end; ++it) {
+ if (!contains(*it, ':'))
+
cite_default_biblio_style_[opt_enginetype_] = *it;
+ else {
+ string eng;
+ string const db = split(*it,
eng, ':');
+ cite_default_biblio_style_[eng]
= db;
+ }
+ }
+ }
break;
case TC_FULLAUTHORLIST:
diff --git a/src/TextClass.h b/src/TextClass.h
index d082e10..3f83216 100644
--- a/src/TextClass.h
+++ b/src/TextClass.h
@@ -330,7 +330,7 @@ protected:
/// Citation macros
std::map<CiteEngineType, std::map<std::string, std::string> >
cite_macros_;
/// The default BibTeX bibliography style file
- std::string cite_default_biblio_style_;
+ std::map<std::string, std::string> cite_default_biblio_style_;
/// Whether full author lists are supported
bool cite_full_author_list_;
/// The possible citation styles
@@ -487,7 +487,8 @@ public:
///
std::vector<CitationStyle> const & citeStyles(CiteEngineType const &)
const;
///
- std::string const & defaultBiblioStyle() const { return
cite_default_biblio_style_; }
+ std::map<std::string, std::string> const & defaultBiblioStyle() const
+ { return cite_default_biblio_style_; }
///
bool const & fullAuthorList() const { return cite_full_author_list_; }
protected:
diff --git a/src/frontends/qt4/GuiDocument.cpp
b/src/frontends/qt4/GuiDocument.cpp
index d971eeb..34b2fc0 100644
--- a/src/frontends/qt4/GuiDocument.cpp
+++ b/src/frontends/qt4/GuiDocument.cpp
@@ -1130,15 +1130,23 @@ GuiDocument::GuiDocument(GuiView & lv)
connect(biblioModule->citeEngineCO, SIGNAL(activated(int)),
this, SLOT(citeEngineChanged(int)));
connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
- this, SLOT(biblioChanged()));
+ this, SLOT(citeStyleChanged()));
connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
this, SLOT(biblioChanged()));
connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
this, SLOT(bibtexChanged(int)));
connect(biblioModule->bibtexOptionsLE, SIGNAL(textChanged(QString)),
this, SLOT(biblioChanged()));
- connect(biblioModule->bibtexStyleLE, SIGNAL(textChanged(QString)),
+ connect(biblioModule->defaultBiblioCO, SIGNAL(activated(int)),
+ this, SLOT(biblioChanged()));
+ connect(biblioModule->defaultBiblioCO, SIGNAL(editTextChanged(QString)),
this, SLOT(biblioChanged()));
+ connect(biblioModule->defaultBiblioCO, SIGNAL(editTextChanged(QString)),
+ this, SLOT(updateResetDefaultBiblio()));
+ connect(biblioModule->rescanBibliosPB, SIGNAL(clicked()),
+ this, SLOT(rescanBibFiles()));
+ connect(biblioModule->resetDefaultBiblioPB, SIGNAL(clicked()),
+ this, SLOT(resetDefaultBibfile()));
biblioModule->citeEngineCO->clear();
for (LyXCiteEngine const & cet : theCiteEnginesList) {
@@ -1150,8 +1158,8 @@ GuiDocument::GuiDocument(GuiView & lv)
biblioModule->bibtexOptionsLE->setValidator(new NoNewLineValidator(
biblioModule->bibtexOptionsLE));
- biblioModule->bibtexStyleLE->setValidator(new NoNewLineValidator(
- biblioModule->bibtexStyleLE));
+ biblioModule->defaultBiblioCO->lineEdit()->setValidator(new
NoNewLineValidator(
+ biblioModule->defaultBiblioCO->lineEdit()));
// NOTE: we do not provide "custom" here for security reasons!
biblioModule->bibtexCO->clear();
@@ -2271,41 +2279,58 @@ void GuiDocument::biblioChanged()
}
+void GuiDocument::rescanBibFiles()
+{
+ rescanTexStyles("bst");
+}
+
+
+void GuiDocument::resetDefaultBibfile()
+{
+ QString const engine =
+ biblioModule->citeEngineCO->itemData(
+
biblioModule->citeEngineCO->currentIndex()).toString();
+
+ CiteEngineType const cet =
+ CiteEngineType(biblioModule->citeStyleCO->itemData(
+
biblioModule->citeStyleCO->currentIndex()).toInt());
+
+
updateDefaultBiblio(theCiteEnginesList[fromqstr(engine)]->getDefaultBiblio(cet));
+}
+
+
void GuiDocument::citeEngineChanged(int n)
{
- QString const engine =
biblioModule->citeEngineCO->itemData(n).toString();
+ QString const engine =
+ biblioModule->citeEngineCO->itemData(n).toString();
vector<string> const engs =
theCiteEnginesList[fromqstr(engine)]->getEngineType();
updateCiteStyles(engs);
+ resetDefaultBibfile();
biblioChanged();
}
-void GuiDocument::bibtexChanged(int n)
+void GuiDocument::citeStyleChanged()
{
- biblioModule->bibtexOptionsLE->setEnabled(
- biblioModule->bibtexCO->itemData(n).toString() != "default");
- biblioChanged();
-}
-
+ QString const engine =
+ biblioModule->citeEngineCO->itemData(
+
biblioModule->citeEngineCO->currentIndex()).toString();
+ if (theCiteEnginesList[fromqstr(engine)]->isDefaultBiblio(
+
fromqstr(biblioModule->defaultBiblioCO->currentText())))
+ resetDefaultBibfile();
-void GuiDocument::setAuthorYear(bool authoryear)
-{
- if (authoryear)
- biblioModule->citeStyleCO->setCurrentIndex(
-
biblioModule->citeStyleCO->findData(ENGINE_TYPE_AUTHORYEAR));
biblioChanged();
}
-void GuiDocument::setNumerical(bool numerical)
+void GuiDocument::bibtexChanged(int n)
{
- if (numerical)
- biblioModule->citeStyleCO->setCurrentIndex(
-
biblioModule->citeStyleCO->findData(ENGINE_TYPE_NUMERICAL));
+ biblioModule->bibtexOptionsLE->setEnabled(
+ biblioModule->bibtexCO->itemData(n).toString() != "default");
biblioChanged();
}
@@ -2617,7 +2642,7 @@ void GuiDocument::applyView()
bp_.use_bibtopic =
biblioModule->bibtopicCB->isChecked();
- bp_.biblio_style = fromqstr(biblioModule->bibtexStyleLE->text());
+ bp_.biblio_style =
fromqstr(biblioModule->defaultBiblioCO->currentText());
string const bibtex_command =
fromqstr(biblioModule->bibtexCO->itemData(
@@ -3040,7 +3065,7 @@ void GuiDocument::paramsToDialog()
biblioModule->bibtopicCB->setChecked(
bp_.use_bibtopic);
- biblioModule->bibtexStyleLE->setText(toqstr(bp_.biblio_style));
+ updateDefaultBiblio(bp_.defaultBiblioStyle());
string command;
string options =
@@ -3626,6 +3651,59 @@ void GuiDocument::updateIncludeonlys()
}
+void GuiDocument::updateDefaultBiblio(string const & style)
+{
+ QString const bibstyle = toqstr(style);
+ biblioModule->defaultBiblioCO->clear();
+
+ int item_nr = -1;
+
+ QStringList str = texFileList("bstFiles.lst");
+ // test whether we have a valid list, otherwise run rescan
+ if (str.isEmpty()) {
+ rescanTexStyles("bst");
+ str = texFileList("bstFiles.lst");
+ }
+ for (int i = 0; i != str.size(); ++i)
+ str[i] = onlyFileName(str[i]);
+ // sort on filename only (no path)
+ str.sort();
+
+ for (int i = 0; i != str.count(); ++i) {
+ QString item = changeExtension(str[i], "");
+ if (item == bibstyle)
+ item_nr = i;
+ biblioModule->defaultBiblioCO->addItem(item);
+ }
+
+ if (item_nr == -1 && !bibstyle.isEmpty()) {
+ biblioModule->defaultBiblioCO->addItem(bibstyle);
+ item_nr = biblioModule->defaultBiblioCO->count() - 1;
+ }
+
+ if (item_nr != -1)
+ biblioModule->defaultBiblioCO->setCurrentIndex(item_nr);
+ else
+ biblioModule->defaultBiblioCO->clearEditText();
+
+ updateResetDefaultBiblio();
+}
+
+
+void GuiDocument::updateResetDefaultBiblio()
+{
+ QString const engine =
+ biblioModule->citeEngineCO->itemData(
+
biblioModule->citeEngineCO->currentIndex()).toString();
+ CiteEngineType const cet =
+ CiteEngineType(biblioModule->citeStyleCO->itemData(
+
biblioModule->citeStyleCO->currentIndex()).toInt());
+ biblioModule->resetDefaultBiblioPB->setEnabled(
+ theCiteEnginesList[fromqstr(engine)]->getDefaultBiblio(cet)
+ !=
fromqstr(biblioModule->defaultBiblioCO->currentText()));
+}
+
+
void GuiDocument::updateContents()
{
// Nothing to do here as the document settings is not cursor dependant.
diff --git a/src/frontends/qt4/GuiDocument.h b/src/frontends/qt4/GuiDocument.h
index e5aa4fa..012a7a1 100644
--- a/src/frontends/qt4/GuiDocument.h
+++ b/src/frontends/qt4/GuiDocument.h
@@ -115,10 +115,12 @@ private Q_SLOTS:
void classChanged_adaptor();
void languagePackageChanged(int);
void biblioChanged();
+ void rescanBibFiles();
+ void resetDefaultBibfile();
void citeEngineChanged(int);
+ void citeStyleChanged();
void bibtexChanged(int);
- void setAuthorYear(bool);
- void setNumerical(bool);
+ void updateResetDefaultBiblio();
void updateModuleInfo();
void modulesChanged();
void changeBackgroundColor();
@@ -181,6 +183,8 @@ private:
void updateSelectedModules();
///
void updateIncludeonlys();
+ ///
+ void updateDefaultBiblio(std::string const & style);
/// save as default template
void saveDocDefault();
/// reset to default params
diff --git a/src/frontends/qt4/ui/BiblioUi.ui b/src/frontends/qt4/ui/BiblioUi.ui
index 7cc821b..b6ce417 100644
--- a/src/frontends/qt4/ui/BiblioUi.ui
+++ b/src/frontends/qt4/ui/BiblioUi.ui
@@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
- <width>418</width>
+ <width>475</width>
<height>394</height>
</rect>
</property>
@@ -46,7 +46,7 @@
<string/>
</property>
<property name="text">
- <string>Sty&le Engine:</string>
+ <string>Sty&le engine:</string>
</property>
<property name="buddy">
<cstring>citeEngineCO</cstring>
@@ -116,36 +116,72 @@
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout_1">
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="bibtopicCB">
+ <property name="toolTip">
+ <string>Select this if you want to split your bibliography into
sections</string>
+ </property>
+ <property name="text">
+ <string>S&ectioned bibliography</string>
+ </property>
+ </widget>
+ </item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_1">
<item>
<widget class="QLabel" name="bibtexStyleLA">
<property name="text">
- <string>Default st&yle:</string>
+ <string>Default BibTeX st&yle:</string>
</property>
<property name="buddy">
- <cstring>bibtexStyleLE</cstring>
+ <cstring>defaultBiblioCO</cstring>
</property>
</widget>
</item>
<item>
- <widget class="QLineEdit" name="bibtexStyleLE">
+ <widget class="QComboBox" name="defaultBiblioCO">
<property name="toolTip">
- <string>Define the default BibTeX style</string>
+ <string>Here, you can define a BibTeX style that is suggested in
the BibTeX dialog by default</string>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="rescanBibliosPB">
+ <property name="toolTip">
+ <string>Rescan style files</string>
+ </property>
+ <property name="text">
+ <string>Re&scan</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="resetDefaultBiblioPB">
+ <property name="toolTip">
+ <string>Reset to the preset default</string>
+ </property>
+ <property name="text">
+ <string>&Reset</string>
</property>
</widget>
</item>
</layout>
</item>
- <item row="1" column="0">
- <widget class="QCheckBox" name="bibtopicCB">
- <property name="toolTip">
- <string>Select this if you want to split your bibliography into
sections</string>
+ <item row="0" column="1">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
</property>
- <property name="text">
- <string>S&ectioned bibliography</string>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
</property>
- </widget>
+ </spacer>
</item>
</layout>
</widget>
diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp
index 13c91b0..1c4090a 100644
--- a/src/insets/InsetBibtex.cpp
+++ b/src/insets/InsetBibtex.cpp
@@ -328,7 +328,7 @@ void InsetBibtex::latex(otexstream & os, OutputParams const
& runparams) const
}
if (style == "default")
- style = buffer().params().biblio_style;
+ style = buffer().params().defaultBiblioStyle();
if (!style.empty() && !buffer().params().use_bibtopic) {
string base = normalizeName(buffer(), runparams, style, ".bst");