X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiCitation.cpp;h=addfe5000821bbd612248ce15c6b1337176b711c;hb=8e7d7e42952f0119db1c192386a63d1d9ede3b7f;hp=35f7e913a7fc835638c4e4251d2a52fa78cdb452;hpb=f792df16b38fb5b5877dfcae9dfcf3bb8891561f;p=lyx.git diff --git a/src/frontends/qt4/GuiCitation.cpp b/src/frontends/qt4/GuiCitation.cpp index 35f7e913a7..addfe50008 100644 --- a/src/frontends/qt4/GuiCitation.cpp +++ b/src/frontends/qt4/GuiCitation.cpp @@ -41,7 +41,7 @@ #undef KeyPress -#include +#include "support/regex.h" #include #include @@ -114,8 +114,6 @@ 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); } @@ -195,20 +193,12 @@ void GuiCitation::updateControls() // 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. +// two methods, though they should be divisible. That is, we should +// not have to call fillStyles() every time through here. void GuiCitation::updateControls(BiblioInfo const & bi) { - if (selectionManager->selectedFocused()) { - if (selectedLV->selectionModel()->selectedIndexes().isEmpty()) - updateInfo(bi, availableLV->currentIndex()); - else - updateInfo(bi, selectedLV->currentIndex()); - } else { - if (availableLV->selectionModel()->selectedIndexes().isEmpty()) - updateInfo(bi, QModelIndex()); - else - updateInfo(bi, availableLV->currentIndex()); - } + QModelIndex idx = selectionManager->getSelectedIndex(); + updateInfo(bi, idx); setButtons(); textBeforeED->setText(toqstr(params_["before"])); @@ -259,59 +249,65 @@ void GuiCitation::updateStyle() vector::const_iterator cit = std::find(styles.begin(), styles.end(), cs.style); - // restore the latest natbib style - if (style_ >= 0 && style_ < citationStyleCO->count()) - citationStyleCO->setCurrentIndex(style_); - else - citationStyleCO->setCurrentIndex(0); - if (cit != styles.end()) { - int const i = int(cit - styles.begin()); - citationStyleCO->setCurrentIndex(i); fulllistCB->setChecked(cs.full); forceuppercaseCB->setChecked(cs.forceUpperCase); } else { + // restore the last used natbib style + if (style_ >= 0 && style_ < citationStyleCO->count()) { + // the necessary update will be performed later + citationStyleCO->blockSignals(true); + citationStyleCO->setCurrentIndex(style_); + citationStyleCO->blockSignals(false); + } fulllistCB->setChecked(false); forceuppercaseCB->setChecked(false); } updateFormatting(cs.style); } + // 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(BiblioInfo const & bi) { - int const oldIndex = citationStyleCO->currentIndex(); - - citationStyleCO->clear(); - QStringList selected_keys = selected_model_.stringList(); - if (selected_keys.empty()) { + int curr = selectedLV->model()->rowCount() - 1; + + if (curr < 0 || selected_keys.empty()) { + citationStyleCO->clear(); citationStyleCO->setEnabled(false); citationStyleLA->setEnabled(false); return; } - int curr = selectedLV->model()->rowCount() - 1; - if (curr < 0) - return; - if (!selectedLV->selectionModel()->selectedIndexes().empty()) curr = selectedLV->selectionModel()->selectedIndexes()[0].row(); QStringList sty = citationStyles(bi, curr); - citationStyleCO->setEnabled(!sty.isEmpty()); - citationStyleLA->setEnabled(!sty.isEmpty()); - - if (sty.isEmpty()) + if (sty.isEmpty()) { + // some error + citationStyleCO->setEnabled(false); + citationStyleLA->setEnabled(false); + citationStyleCO->clear(); return; - + } + + citationStyleCO->blockSignals(true); + + // save old index + int const oldIndex = citationStyleCO->currentIndex(); + citationStyleCO->clear(); citationStyleCO->insertItems(0, sty); - + citationStyleCO->setEnabled(true); + citationStyleLA->setEnabled(true); + // restore old index if (oldIndex != -1 && oldIndex < citationStyleCO->count()) citationStyleCO->setCurrentIndex(oldIndex); + + citationStyleCO->blockSignals(false); } @@ -344,7 +340,7 @@ void GuiCitation::fillEntries(BiblioInfo const & bi) } -bool GuiCitation::isSelected(const QModelIndex & idx) +bool GuiCitation::isSelected(QModelIndex const & idx) { QString const str = idx.data().toString(); return selected_model_.stringList().contains(str); @@ -368,8 +364,8 @@ void GuiCitation::updateInfo(BiblioInfo const & bi, QModelIndex const & idx) } QString const keytxt = toqstr( - bi.getInfo(qstring_to_ucs4(idx.data().toString()))); - infoML->document()->setPlainText(keytxt); + bi.getInfo(qstring_to_ucs4(idx.data().toString()), buffer(), true)); + infoML->document()->setHtml(keytxt); } @@ -528,6 +524,30 @@ void GuiCitation::init() else cited_keys_ = str.split(","); selected_model_.setStringList(cited_keys_); + if (selected_model_.rowCount()) { + selectedLV->blockSignals(true); + selectedLV->setFocus(); + QModelIndex idx = selected_model_.index(0, 0); + selectedLV->selectionModel()->select(idx, + QItemSelectionModel::ClearAndSelect); + selectedLV->blockSignals(false); + + // set the style combo appropriately + string const & command = params_.getCmdName(); + vector const & styles = citeStyles_; + CitationStyle const cs = citationStyleFromString(command); + + vector::const_iterator cit = + std::find(styles.begin(), styles.end(), cs.style); + if (cit != styles.end()) { + int const i = int(cit - styles.begin()); + // the necessary update will be performed later + citationStyleCO->blockSignals(true); + citationStyleCO->setCurrentIndex(i); + citationStyleCO->blockSignals(false); + } + } else + availableLV->setFocus(); fillFields(bi); fillEntries(bi); updateControls(bi); @@ -602,7 +622,7 @@ void GuiCitation::setCitedKeys() bool GuiCitation::initialiseParams(string const & data) { - InsetCommand::string2params("citation", data, params_); + InsetCommand::string2params(data, params_); CiteEngine const engine = buffer().params().citeEngine(); citeStyles_ = citeStyles(engine); init(); @@ -653,9 +673,9 @@ static docstring escape_special_chars(docstring const & expr) { // Search for all chars '.|*?+(){}[^$]\' // Note that '[' and '\' must be escaped. - // This is a limitation of boost::regex, but all other chars in BREs + // This is a limitation of lyx::regex, but all other chars in BREs // are assumed literal. - static const boost::regex reg("[].|*?+(){}^$\\[\\\\]"); + static const lyx::regex reg("[].|*?+(){}^$\\[\\\\]"); // $& is a perl-like expression that expands to all // of the current match @@ -663,7 +683,7 @@ static docstring escape_special_chars(docstring const & expr) // boost to treat it as a literal. // Thus, to prefix a matched expression with '\', we use: // FIXME: UNICODE - return from_utf8(boost::regex_replace(to_utf8(expr), reg, "\\\\$&")); + return from_utf8(lyx::regex_replace(to_utf8(expr), reg, string("\\\\$&"))); } @@ -680,15 +700,15 @@ vector GuiCitation::searchKeys(BiblioInfo const & bi, if (!regex) // We must escape special chars in the search_expr so that - // it is treated as a simple string by boost::regex. + // it is treated as a simple string by lyx::regex. expr = escape_special_chars(expr); - boost::regex reg_exp; + lyx::regex reg_exp; try { reg_exp.assign(to_utf8(expr), case_sensitive ? - boost::regex_constants::normal : boost::regex_constants::icase); - } catch (boost::regex_error & e) { - // boost::regex throws an exception if the regular expression is not + lyx::regex_constants::ECMAScript : lyx::regex_constants::icase); + } catch (lyx::regex_error & e) { + // lyx::regex throws an exception if the regular expression is not // valid. LYXERR(Debug::GUI, e.what()); return vector(); @@ -714,10 +734,10 @@ vector GuiCitation::searchKeys(BiblioInfo const & bi, continue; try { - if (boost::regex_search(data, reg_exp)) + if (lyx::regex_search(data, reg_exp)) foundKeys.push_back(*it); } - catch (boost::regex_error & e) { + catch (lyx::regex_error & e) { LYXERR(Debug::GUI, e.what()); return vector(); } @@ -728,7 +748,7 @@ vector GuiCitation::searchKeys(BiblioInfo const & bi, void GuiCitation::dispatchParams() { - std::string const lfun = InsetCommand::params2string("citation", params_); + std::string const lfun = InsetCommand::params2string(params_); dispatch(FuncRequest(getLfun(), lfun)); }