]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiCitation.cpp
Support for CJK quotation marks
[lyx.git] / src / frontends / qt4 / GuiCitation.cpp
index 63b6bc6b0ca2d5f252bd66235c04e1fed983c919..10c91670afbb4a6985973102aa4015c7f976e89f 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "GuiCitation.h"
 
+#include "GuiApplication.h"
 #include "GuiSelectionManager.h"
 #include "LyXToolBox.h"
 #include "qt_helpers.h"
@@ -34,6 +35,7 @@
 #include "support/lstrings.h"
 
 #include <QCloseEvent>
+#include <QMenu>
 #include <QSettings>
 #include <QShowEvent>
 #include <QVariant>
@@ -89,10 +91,36 @@ static vector<lyx::docstring> to_docstring_vector(QStringList const & qlist)
 
 GuiCitation::GuiCitation(GuiView & lv)
        : DialogView(lv, "citation", qt_("Citation")),
-         params_(insetCode("citation"))
+         style_(0), params_(insetCode("citation"))
 {
        setupUi(this);
 
+       // The filter bar
+       filter_ = new FancyLineEdit(this);
+       filter_->setButtonPixmap(FancyLineEdit::Right, getPixmap("images/", "editclear", "svgz,png"));
+       filter_->setButtonVisible(FancyLineEdit::Right, true);
+       filter_->setButtonToolTip(FancyLineEdit::Right, qt_("Clear text"));
+       filter_->setAutoHideButton(FancyLineEdit::Right, true);
+       filter_->setPlaceholderText(qt_("All avail. citations"));
+
+       filterBarL->addWidget(filter_, 0);
+       findKeysLA->setBuddy(filter_);
+
+       // Add search options as button menu
+       regexp_ = new QAction(qt_("Regular e&xpression"), this);
+       regexp_->setCheckable(true);
+       casesense_ = new QAction(qt_("Case se&nsitive"), this);
+       casesense_->setCheckable(true);
+       instant_ = new QAction(qt_("Search as you &type"), this);
+       instant_->setCheckable(true);
+       instant_->setChecked(true);
+
+       QMenu * searchOpts = new QMenu(this);
+       searchOpts->addAction(regexp_);
+       searchOpts->addAction(casesense_);
+       searchOpts->addAction(instant_);
+       searchOptionsPB->setMenu(searchOpts);
+
        connect(citationStyleCO, SIGNAL(activated(int)),
                this, SLOT(on_citationStyleCO_currentIndexChanged(int)));
        connect(fulllistCB, SIGNAL(clicked()),
@@ -103,8 +131,6 @@ GuiCitation::GuiCitation(GuiView & lv)
                this, SLOT(updateStyles()));
        connect(textAfterED, SIGNAL(textChanged(QString)),
                this, SLOT(updateStyles()));
-       connect(findLE, SIGNAL(returnPressed()),
-               this, SLOT(on_searchPB_clicked()));
        connect(textBeforeED, SIGNAL(returnPressed()),
                this, SLOT(on_okPB_clicked()));
        connect(textAfterED, SIGNAL(returnPressed()),
@@ -119,7 +145,20 @@ GuiCitation::GuiCitation(GuiView & lv)
        connect(selectionManager, SIGNAL(okHook()),
                this, SLOT(on_okPB_clicked()));
 
-       setFocusProxy(availableLV);
+       connect(filter_, SIGNAL(rightButtonClicked()),
+               this, SLOT(resetFilter()));
+       connect(filter_, SIGNAL(textEdited(QString)),
+               this, SLOT(filterChanged(QString)));
+       connect(filter_, SIGNAL(returnPressed()),
+               this, SLOT(filterPressed()));
+       connect(regexp_, SIGNAL(triggered()),
+               this, SLOT(regexChanged()));
+       connect(casesense_, SIGNAL(triggered()),
+               this, SLOT(caseChanged()));
+       connect(instant_, SIGNAL(triggered(bool)),
+               this, SLOT(instantChanged(bool)));
+
+       setFocusProxy(filter_);
 }
 
 
@@ -152,42 +191,12 @@ void GuiCitation::applyView()
 
 void GuiCitation::showEvent(QShowEvent * e)
 {
-       findLE->clear();
+       filter_->clear();
        availableLV->setFocus();
-
-       // Set the minimal size of the QToolbox. Without this, the size of the
-       // QToolbox is only determined by values in the ui file (e.g. computed by
-       // qtcreator) and therefore causes portability and localisation issues. Note
-       // that the page widgets must have a layout with layoutSizeContraint =
-       // SetMinimumSize or similar.  KNOWN ISSUE: the calculations are incorrect
-       // the first time the dialog is shown. This problem is mitigated by the fact
-       // that LyX remembers the dialog sizes between sessions.
-       QSize minimum_size = QSize(0,0);
-       // Compute the max of the minimal sizes of the pages
-       QWidget * page;
-       for (int i = 0; (page = citationTB->widget(i)); ++i)
-               minimum_size = minimum_size.expandedTo(page->minimumSizeHint());
-       // Add the height of the tabs
-       if (citationTB->currentWidget())
-               minimum_size.rheight() += citationTB->height() -
-                       citationTB->currentWidget()->height();
-       citationTB->setMinimumSize(minimum_size);
-
        DialogView::showEvent(e);
 }
 
 
-void GuiCitation::on_citationTB_currentChanged(int i)
-{
-       if (i == 0)
-               findLE->setFocus();
-       else if (citationStyleCO->isEnabled())
-               citationStyleCO->setFocus();
-       else
-               textAfterED->setFocus();
-}
-
-
 void GuiCitation::on_okPB_clicked()
 {
        applyView();
@@ -212,6 +221,7 @@ void GuiCitation::on_applyPB_clicked()
 void GuiCitation::on_restorePB_clicked()
 {
        init();
+       updateFilterHint();
 }
 
 
@@ -294,7 +304,8 @@ void GuiCitation::updateStyles(BiblioInfo const & bi)
        citationStyleCO->blockSignals(true);
 
        // save old index
-       int const oldIndex = citationStyleCO->currentIndex();
+       int const curindex = citationStyleCO->currentIndex();
+       int const oldIndex = (curindex < 0) ? style_ : curindex;
        citationStyleCO->clear();
        citationStyleCO->insertItems(0, sty);
        citationStyleCO->setEnabled(true);
@@ -355,9 +366,11 @@ void GuiCitation::updateInfo(BiblioInfo const & bi, QModelIndex const & idx)
 {
        if (!idx.isValid() || bi.empty()) {
                infoML->document()->clear();
+               infoML->setToolTip(qt_("Displays a sketchy preview if a citation is selected above"));
                return;
        }
 
+       infoML->setToolTip(qt_("Sketchy preview of the selected citation"));
        QString const keytxt = toqstr(
                bi.getInfo(qstring_to_ucs4(idx.data().toString()), documentBuffer(), true));
        infoML->document()->setHtml(keytxt);
@@ -390,8 +403,9 @@ void GuiCitation::findText(QString const & text, bool reset)
        else
                entry_type = entries[index];
 
-       bool const case_sentitive = caseCB->checkState();
-       bool const reg_exp = regexCB->checkState();
+       bool const case_sentitive = casesense_->isChecked();
+       bool const reg_exp = regexp_->isChecked();
+
        findKey(bi, text, onlyKeys, field, entry_type,
                       case_sentitive, reg_exp, reset);
        //FIXME
@@ -405,13 +419,13 @@ void GuiCitation::findText(QString const & text, bool reset)
 
 void GuiCitation::on_fieldsCO_currentIndexChanged(int /*index*/)
 {
-       findText(findLE->text(), true);
+       findText(filter_->text(), true);
 }
 
 
 void GuiCitation::on_entriesCO_currentIndexChanged(int /*index*/)
 {
-       findText(findLE->text(), true);
+       findText(filter_->text(), true);
 }
 
 
@@ -425,43 +439,58 @@ void GuiCitation::on_citationStyleCO_currentIndexChanged(int index)
 }
 
 
-void GuiCitation::on_findLE_textChanged(const QString & text)
+void GuiCitation::filterChanged(const QString & text)
 {
-       bool const searchAsWeGo = (asTypeCB->checkState() == Qt::Checked);
-       searchPB->setDisabled(text.isEmpty() || searchAsWeGo);
        if (!text.isEmpty()) {
-               if (searchAsWeGo)
-                       findText(findLE->text());
+               if (instant_->isChecked())
+                       findText(filter_->text());
                return;
        }
-       findText(findLE->text());
-       findLE->setFocus();
+       findText(filter_->text());
+       filter_->setFocus();
 }
 
-void GuiCitation::on_searchPB_clicked()
+
+void GuiCitation::filterPressed()
 {
-       findText(findLE->text(), true);
+       findText(filter_->text(), true);
 }
 
 
-void GuiCitation::on_caseCB_stateChanged(int)
+void GuiCitation::resetFilter()
 {
-       findText(findLE->text());
+       filter_->setText(QString());
+       findText(filter_->text(), true);
 }
 
 
-void GuiCitation::on_regexCB_stateChanged(int)
+void GuiCitation::caseChanged()
 {
-       findText(findLE->text());
+       findText(filter_->text());
 }
 
 
-void GuiCitation::on_asTypeCB_stateChanged(int)
+void GuiCitation::regexChanged()
 {
-       bool const searchAsWeGo = (asTypeCB->checkState() == Qt::Checked);
-       searchPB->setDisabled(findLE->text().isEmpty() || searchAsWeGo);
-       if (searchAsWeGo)
-               findText(findLE->text(), true);
+       findText(filter_->text());
+}
+
+
+void GuiCitation::updateFilterHint()
+{
+       QString const 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>");
+       filter_->setToolTip(hint);
+}
+
+
+void GuiCitation::instantChanged(bool checked)
+{
+       if (checked)
+               findText(filter_->text(), true);
+
+       updateFilterHint();
 }
 
 
@@ -571,6 +600,7 @@ void GuiCitation::findKey(BiblioInfo const & bi,
        bool case_sensitive, bool reg_exp, bool reset)
 {
        // FIXME THREAD
+       // This should be moved to a class member.
        // Used for optimisation: store last searched string.
        static QString last_searched_string;
        // Used to disable the above optimisation.
@@ -785,11 +815,13 @@ void GuiCitation::saveSession() const
        Dialog::saveSession();
        QSettings settings;
        settings.setValue(
-               sessionKey() + "/regex", regexCB->isChecked());
+               sessionKey() + "/regex", regexp_->isChecked());
+       settings.setValue(
+               sessionKey() + "/casesensitive", casesense_->isChecked());
        settings.setValue(
-               sessionKey() + "/casesensitive", caseCB->isChecked());
+               sessionKey() + "/autofind", instant_->isChecked());
        settings.setValue(
-               sessionKey() + "/autofind", asTypeCB->isChecked());
+               sessionKey() + "/citestyle", style_);
 }
 
 
@@ -797,12 +829,11 @@ void GuiCitation::restoreSession()
 {
        Dialog::restoreSession();
        QSettings settings;
-       regexCB->setChecked(
-               settings.value(sessionKey() + "/regex").toBool());
-       caseCB->setChecked(
-               settings.value(sessionKey() + "/casesensitive").toBool());
-       asTypeCB->setChecked(
-               settings.value(sessionKey() + "/autofind").toBool());
+       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();
+       updateFilterHint();
 }