#include "GuiApplication.h"
#include "GuiSelectionManager.h"
-#include "LyXToolBox.h"
#include "qt_helpers.h"
#include "Buffer.h"
#include "TextClass.h"
#include "FuncRequest.h"
+#include "insets/InsetCitation.h"
#include "insets/InsetCommand.h"
#include "support/debug.h"
GuiCitation::GuiCitation(GuiView & lv)
: DialogView(lv, "citation", qt_("Citation")),
- style_(0), params_(insetCode("citation"))
+ style_(QString()), params_(insetCode("citation"))
{
setupUi(this);
connect(textAfterED, SIGNAL(textChanged(QString)),
this, SLOT(updateStyles()));
connect(textBeforeED, SIGNAL(returnPressed()),
- this, SLOT(on_okPB_clicked()));
+ this, SLOT(on_buttonBox_accepted()));
connect(textAfterED, SIGNAL(returnPressed()),
- this, SLOT(on_okPB_clicked()));
+ this, SLOT(on_buttonBox_accepted()));
- selectionManager = new GuiSelectionManager(availableLV, selectedLV,
+ selectionManager = new GuiSelectionManager(this, availableLV, selectedLV,
addPB, deletePB, upPB, downPB, &available_model_, &selected_model_, 1);
connect(selectionManager, SIGNAL(selectionChanged()),
this, SLOT(setCitedKeys()));
connect(selectionManager, SIGNAL(updateHook()),
this, SLOT(updateControls()));
connect(selectionManager, SIGNAL(okHook()),
- this, SLOT(on_okPB_clicked()));
+ this, SLOT(on_buttonBox_accepted()));
connect(filter_, SIGNAL(rightButtonClicked()),
this, SLOT(resetFilter()));
this, SLOT(filterChanged(QString)));
connect(filter_, SIGNAL(returnPressed()),
this, SLOT(filterPressed()));
+#if (QT_VERSION < 0x050000)
+ connect(filter_, SIGNAL(downPressed()),
+ availableLV, SLOT(setFocus()));
+#else
+ connect(filter_, &FancyLineEdit::downPressed,
+ availableLV, [=](){ focusAndHighlight(availableLV); });
+#endif
connect(regexp_, SIGNAL(triggered()),
this, SLOT(regexChanged()));
connect(casesense_, SIGNAL(triggered()),
selectedLV->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
#endif
+ selectedLV->setToolTip(qt_("Ordered list of all cited references.\n"
+ "You can reorder, add and remove references with the buttons on the left."));
setFocusProxy(filter_);
}
-GuiCitation::~GuiCitation()
-{
- delete selectionManager;
-}
-
-
void GuiCitation::closeEvent(QCloseEvent * e)
{
clearSelection();
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();
void GuiCitation::showEvent(QShowEvent * e)
{
- filter_->clear();
+ if (!filter_->text().isEmpty())
+ filterPressed();
availableLV->setFocus();
DialogView::showEvent(e);
}
-void GuiCitation::on_okPB_clicked()
+void GuiCitation::on_buttonBox_accepted()
{
applyView();
clearSelection();
}
-void GuiCitation::on_cancelPB_clicked()
+void GuiCitation::on_buttonBox_rejected()
{
clearSelection();
hide();
}
-void GuiCitation::on_applyPB_clicked()
+void GuiCitation::on_buttonBox_clicked(QAbstractButton * button)
{
- applyView();
+ switch (buttonBox->standardButton(button)) {
+ case QDialogButtonBox::Apply:
+ applyView();
+ break;
+ case QDialogButtonBox::Reset:
+ init();
+ updateFilterHint();
+ filterPressed();
+ break;
+ default:
+ break;
+ }
}
-void GuiCitation::on_restorePB_clicked()
+void GuiCitation::on_literalCB_clicked()
{
- init();
- updateFilterHint();
+ InsetCitation::last_literal = literalCB->isChecked();
+ changed();
}
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]);
+ updateFormatting(citeStyles_[size_type(i)]);
selectionManager->update();
}
-void GuiCitation::updateFormatting(CitationStyle currentStyle)
+void GuiCitation::updateFormatting(CitationStyle const & currentStyle)
{
BufferParams const bp = documentBuffer().params();
bool const force = currentStyle.forceUpperCase;
bool const qualified = currentStyle.hasQualifiedList
&& (rows > 1
|| !params_["pretextlist"].empty()
- || !params_["posttextlist"].empty());
+ || !params_["posttextlist"].empty()
+ || !getPreTexts().empty()
+ || !getPostTexts().empty());
+
selectedLV->horizontalHeader()->setVisible(qualified);
selectedLV->setColumnHidden(0, !qualified);
selectedLV->setColumnHidden(2, !qualified);
+ bool const haveSelection = rows > 0;
if (qualified) {
textBeforeLA->setText(qt_("General text befo&re:"));
textAfterLA->setText(qt_("General &text after:"));
textBeforeED->setToolTip(qt_("Text that precedes the whole reference list. "
- "For text that precedes individual items, double-click on the respective entry above."));
+ "For text that precedes individual items, "
+ "double-click on the respective entry above."));
textAfterLA->setToolTip(qt_("General &text after:"));
textAfterED->setToolTip(qt_("Text that follows the whole reference list. "
- "For text that follows individual items, double-click on the respective entry above."));
+ "For text that follows individual items, "
+ "double-click on the respective entry above."));
} else {
textBeforeLA->setText(qt_("Text befo&re:"));
- textBeforeED->setToolTip(qt_("Text that precedes the reference (e.g., \"cf.\")"));
+ if (textbefore && haveSelection)
+ textBeforeED->setToolTip(qt_("Text that precedes the reference (e.g., \"cf.\")"));
+ else
+ textBeforeED->setToolTip(qt_("Text that precedes the reference (e.g., \"cf.\"), "
+ "if the current citation style supports this."));
textAfterLA->setText(qt_("&Text after:"));
- textAfterED->setToolTip(qt_("Text that follows the reference (e.g., pages)"));
+ if (textafter && haveSelection)
+ textAfterED->setToolTip(qt_("Text that follows the reference (e.g., pages)"));
+ else
+ textAfterED->setToolTip(qt_("Text that follows the reference (e.g., pages), "
+ "if the current citation style supports this."));
}
- bool const haveSelection = rows > 0;
-
forceuppercaseCB->setEnabled(force && haveSelection);
+ if (force && haveSelection)
+ forceuppercaseCB->setToolTip(qt_("Force upper case in names (\"Del Piero\", not \"del Piero\")."));
+ else
+ forceuppercaseCB->setToolTip(qt_("Force upper case in names (\"Del Piero\", not \"del Piero\"), "
+ "if the current citation style supports this."));
starredCB->setEnabled(full && haveSelection);
textBeforeED->setEnabled(textbefore && haveSelection);
textBeforeLA->setEnabled(textbefore && haveSelection);
} else {
// This is the default meaning of the starred commands
starredCB->setText(qt_("All aut&hors"));
- starredCB->setToolTip(qt_("Always list all authors (rather than using \"et al.\")"));
+ if (full && haveSelection)
+ starredCB->setToolTip(qt_("Always list all authors (rather than using \"et al.\")"));
+ else
+ starredCB->setToolTip(qt_("Always list all authors (rather than using \"et al.\"), "
+ "if the current citation style supports this."));
}
+ if (availableLV->selectionModel()->selectedIndexes().isEmpty())
+ availableLV->setToolTip(qt_("All references available for citing."));
+ else
+ availableLV->setToolTip(qt_("All references available for citing.\n"
+ "To add the selected one, hit Add, press Enter or double-click.\n"
+ "Hit Ctrl-Enter to add and close the dialog."));
}
}
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);
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);
}
void GuiCitation::setButtons()
{
int const srows = selectedLV->model()->rowCount();
- applyPB->setEnabled(srows > 0);
- okPB->setEnabled(srows > 0);
+ buttonBox->button(QDialogButtonBox::Apply)->setEnabled(srows > 0);
+ buttonBox->button(QDialogButtonBox::Ok)->setEnabled(srows > 0);
}
//either "All Fields" or "Keys" or an invalid value
field = from_ascii("");
else
- field = fields[index];
+ field = fields[size_type(index)];
//Was it "Keys"?
bool const onlyKeys = index == -1;
if (index < 0 || index >= int(entries.size()))
entry_type = from_ascii("");
else
- entry_type = entries[index];
+ entry_type = entries[size_type(index)];
bool const case_sentitive = casesense_->isChecked();
bool const reg_exp = regexp_->isChecked();
{
if (index >= 0 && index < citationStyleCO->count()) {
vector<CitationStyle> const & styles = citeStyles_;
- updateFormatting(styles[index]);
+ updateFormatting(styles[size_type(index)]);
changed();
}
}
void GuiCitation::updateFilterHint()
{
- QString const hint = instant_->isChecked() ?
+ QString hint = instant_->isChecked() ?
qt_("Enter string to filter the list of available citations") :
qt_("Enter string to filter the list of available citations and press <Enter>");
+ hint += qt_("\nThe down arrow key will get you into the list of filtered citations.");
filter_->setToolTip(hint);
}
vector<CitationStyle> const & styles = citeStyles_;
- CitationStyle cs = styles[choice];
+ CitationStyle cs = styles[size_type(choice)];
if (!cs.textBefore)
before.clear();
for (int i = 0; i != selected_model_.rowCount(); ++i) {
QStandardItem const * key = selected_model_.item(i, 1);
QStandardItem const * post = selected_model_.item(i, 2);
- if (key && post)
+ if (key && post && !key->text().isEmpty() && !post->text().isEmpty())
res.push_back(qstring_to_ucs4(key->text()) + " " + qstring_to_ucs4(post->text()));
}
return res;
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(InsetCitation::last_literal);
+ else
+ literalCB->setChecked(params_["literal"] == "true");
setPreTexts(getVectorFromString(params_["pretextlist"], from_ascii("\t")));
setPostTexts(getVectorFromString(params_["posttextlist"], from_ascii("\t")));
citationStyleCO->blockSignals(true);
citationStyleCO->setCurrentIndex(i);
citationStyleCO->blockSignals(false);
- updateFormatting(citeStyles_[i]);
+ updateFormatting(citeStyles_[size_type(i)]);
} else
availableLV->setFocus();
- applyPB->setEnabled(false);
- okPB->setEnabled(false);
+ buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false);
+ buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
}
}
-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_;
int ind = citationStyleCO->currentIndex();
if (ind == -1)
ind = 0;
- CitationStyle cs = styles[ind];
+ CitationStyle cs = styles[size_type(ind)];
vector<docstring> pretexts = getPreTexts();
vector<docstring> posttexts = getPostTexts();
bool const qualified = cs.hasQualifiedList
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;
}
}
-bool GuiCitation::initialiseParams(string const & data)
+bool GuiCitation::initialiseParams(string const & sdata)
{
- InsetCommand::string2params(data, params_);
+ InsetCommand::string2params(sdata, params_);
citeCmds_ = documentBuffer().params().citeCommands();
citeStyles_ = documentBuffer().params().citeStyles();
init();
continue;
BibTeXInfo const & kvm = info->second;
- string data;
+ string sdata;
if (only_keys)
- data = to_utf8(*it);
+ sdata = to_utf8(*it);
else if (field.empty())
- data = to_utf8(*it) + ' ' + to_utf8(kvm.allData());
+ sdata = to_utf8(*it) + ' ' + to_utf8(kvm.allData());
else
- data = to_utf8(kvm[field]);
+ sdata = to_utf8(kvm[field]);
- if (data.empty())
+ if (sdata.empty())
continue;
try {
- if (lyx::regex_search(data, reg_exp))
+ if (lyx::regex_search(sdata, reg_exp))
foundKeys.push_back(*it);
}
catch (lyx::regex_error const & e) {
}
-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(
sessionKey() + "/autofind", instant_->isChecked());
settings.setValue(
sessionKey() + "/citestyle", style_);
+ settings.setValue(
+ sessionKey() + "/literal", InsetCitation::last_literal);
}
QSettings settings;
regexp_->setChecked(settings.value(sessionKey() + "/regex").toBool());
casesense_->setChecked(settings.value(sessionKey() + "/casesensitive").toBool());
- instant_->setChecked(settings.value(sessionKey() + "/autofind").toBool());
- style_ = settings.value(sessionKey() + "/citestyle").toInt();
+ instant_->setChecked(settings.value(sessionKey() + "/autofind", true).toBool());
+ style_ = settings.value(sessionKey() + "/citestyle").toString();
+ InsetCitation::last_literal =
+ settings.value(sessionKey() + "/literal", false).toBool();
updateFilterHint();
}