]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt2/QBibtexDialog.C
* filetools.[Ch]: Make functions that start with a capital
[lyx.git] / src / frontends / qt2 / QBibtexDialog.C
index 260ca756fc96122cccf5bd8ad82418ad398ab73f..38f5938b0995867f677ac17fae545166baa6a6cf 100644 (file)
@@ -5,32 +5,38 @@
  *
  * \author John Levon
  *
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
 
+#include "QBibtexDialog.h"
+#include "ui/QBibtexAddDialogBase.h"
+#include "QBibtex.h"
 
-#include "ControlBibtex.h"
+#include "checkedwidgets.h"
+#include "Qt2BC.h"
 #include "qt_helpers.h"
-#include "debug.h"
+#include "validators.h"
+
+#include "controllers/ControlBibtex.h"
+#include "controllers/ButtonPolicies.h"
 
 #include "support/filetools.h"
-#include "support/lyxalgo.h" // eliminate_duplicates
+#include "support/lstrings.h"
 
-#include <qwidget.h>
 #include <qpushbutton.h>
 #include <qcombobox.h>
 #include <qlineedit.h>
 #include <qlistbox.h>
-#include <qcheckbox.h>
-#include <qfiledialog.h>
 
-#include "QBibtexDialog.h"
-#include "QBibtex.h"
+using lyx::support::changeExtension;
+using lyx::support::trim;
 
-#include <vector>
+using std::string;
 
+namespace lyx {
+namespace frontend {
 
 QBibtexDialog::QBibtexDialog(QBibtex * form)
        : QBibtexDialogBase(0, 0, false, 0),
@@ -40,6 +46,43 @@ QBibtexDialog::QBibtexDialog(QBibtex * form)
                form, SLOT(slotOK()));
        connect(closePB, SIGNAL(clicked()),
                form, SLOT(slotClose()));
+
+       add_ = new QBibtexAddDialogBase(this, "", true);
+       Qt2BC * bcview = new Qt2BC(add_bc_);
+       add_bc_.view(bcview);
+       add_bc_.bp(new OkCancelPolicy);
+
+       bcview->setOK(add_->addPB);
+       bcview->setCancel(add_->closePB);
+
+       add_->bibED->setValidator(new PathValidator(false, add_->bibED));
+       addCheckedLineEdit(add_bc_.view(), add_->bibED, 0);
+
+       connect(add_->bibED, SIGNAL(textChanged(const QString&)),
+               this, SLOT(bibEDChanged()));
+       connect(add_->addPB, SIGNAL(clicked()),
+               this, SLOT(addDatabase()));
+       connect(add_->bibLB, SIGNAL(selected(QListBoxItem *)),
+               this, SLOT(addDatabase()));
+       connect(add_->bibLB, SIGNAL(selected(QListBoxItem *)),
+               add_, SLOT(accept()));
+       connect(add_->bibLB, SIGNAL(currentChanged(QListBoxItem *)),
+               this, SLOT(availableChanged()));
+       connect(add_->browsePB, SIGNAL(clicked()),
+               this, SLOT(browseBibPressed()));
+}
+
+
+QBibtexDialog::~QBibtexDialog()
+{}
+
+
+void QBibtexDialog::bibEDChanged()
+{
+       // Indicate to the button controller that the contents have
+       // changed. The actual test of validity is carried out by
+       // the checkedLineEdit.
+       add_bc_.valid(true);
 }
 
 
@@ -51,86 +94,103 @@ void QBibtexDialog::change_adaptor()
 
 void QBibtexDialog::browsePressed()
 {
-       QString const file =
-               QFileDialog::getOpenFileName(QString::null,
-                                            qt_("BibTeX style files (*.bst)"),
-                                            this,
-                                            0,
-                                            qt_("Select a BibTeX style"));
-       if (!file.isNull()) {
-               string const filen = ChangeExtension(fromqstr(file), "");
+       string const file = form_->controller().browseBst("");
+
+       if (!file.empty()) {
+               string const filen = changeExtension(file, "");
                bool present = false;
-               int pres = 0;
+               unsigned int pres = 0;
 
-               for (unsigned int i = 0; i != styleCB->count(); i++) {
+               for (int i = 0; i != styleCB->count(); ++i) {
                        if (fromqstr(styleCB->text(i)) == filen) {
                                present = true;
                                pres = i;
                        }
                }
 
-               if (!present) 
+               if (!present)
                        styleCB->insertItem(toqstr(filen),0);
-               
+
                styleCB->setCurrentItem(pres);
                form_->changed();
        }
 }
 
+
 void QBibtexDialog::browseBibPressed()
 {
-       QString const file = QFileDialog::getOpenFileName(QString::null,
-               qt_("BibTeX database files (*.bib)"), this, 0, qt_("Select a BibTeX database to add"));
+       string const file = trim(form_->controller().browseBib(""));
 
-       if (!file.isNull()) {
-               string const f = ChangeExtension(fromqstr(file), "");
+       if (!file.empty()) {
+               string const f = changeExtension(file, "");
                bool present = false;
 
-               for (unsigned int i = 0; i != databaseLB->count(); i++) {
-                       if (fromqstr(databaseLB->text(i)) == f)
+               for (unsigned int i = 0; i != add_->bibLB->count(); i++) {
+                       if (fromqstr(add_->bibLB->text(i)) == f)
                                present = true;
                }
 
                if (!present) {
-                       databaseLB->insertItem(toqstr(f));
+                       add_->bibLB->insertItem(toqstr(f));
                        form_->changed();
                }
+
+               add_->bibED->setText(toqstr(f));
        }
 }
 
+
 void QBibtexDialog::addPressed()
 {
-       QString const file = addBibED->text();
-       if (!file.isNull()) {
-               string const f = ChangeExtension(file.latin1(), "");
-               bool present = false;
-               for(unsigned int i = 0; i != databaseLB->count(); ++i) {
-                       if (databaseLB->text(i).latin1() == f)
-                               present = true;
+       add_->exec();
+       add_bc_.valid(false);
+}
 
+
+void QBibtexDialog::addDatabase()
+{
+       int const sel = add_->bibLB->currentItem();
+       string const file = trim(fromqstr(add_->bibED->text()));
+
+       if (sel < 0 && file.empty())
+               return;
+
+       // Add the selected browser_bib keys to browser_database
+       // multiple selections are possible
+       for (unsigned int i = 0; i != add_->bibLB->count(); i++) {
+               if (add_->bibLB->isSelected(i)) {
+                       // do not allow duplicates
+                       if ((databaseLB->findItem(add_->bibLB->text(i))) == 0)
+                               databaseLB->insertItem(add_->bibLB->text(i));
                }
-               if (!present) {
-                       databaseLB->insertItem(f.c_str());
-                       form_->changed();
-               }
        }
+
+       if (!file.empty()) {
+               QString const f = toqstr(changeExtension(file, ""));
+               if ((databaseLB->findItem(f)) == 0)
+                       databaseLB->insertItem(f);
+       }
+
+       form_->changed();
 }
 
+
 void QBibtexDialog::deletePressed()
 {
        databaseLB->removeItem(databaseLB->currentItem());
 }
 
 
-void QBibtexDialog::styleChanged(QString const & sel)
+
+void QBibtexDialog::databaseChanged()
 {
-       styleCB->insertItem(sel,0);
+       deletePB->setEnabled(!form_->readOnly() && databaseLB->currentItem() != -1);
 }
 
 
-void QBibtexDialog::databaseChanged()
+void QBibtexDialog::availableChanged()
 {
-       deletePB->setEnabled(!form_->readOnly() && databaseLB->currentItem() != -1);
+       form_->changed();
 }
 
 
@@ -139,3 +199,6 @@ void QBibtexDialog::closeEvent(QCloseEvent *e)
        form_->slotWMHide();
        e->accept();
 }
+
+} // namespace frontend
+} // namespace lyx