]> 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 e461d8fe26d4277e94de1c7abe83a0fcaaed3216..38f5938b0995867f677ac17fae545166baa6a6cf 100644 (file)
@@ -1,30 +1,43 @@
 /**
  * \file QBibtexDialog.C
- * Copyright 2001 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- * \author John Levon <moz@compsoc.man.ac.uk>
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
  */
 
 #include <config.h>
-#include "ControlBibtex.h"
-#include "gettext.h"
-#include "debug.h"
+
+#include "QBibtexDialog.h"
+#include "ui/QBibtexAddDialogBase.h"
+#include "QBibtex.h"
+
+#include "checkedwidgets.h"
+#include "Qt2BC.h"
+#include "qt_helpers.h"
+#include "validators.h"
+
+#include "controllers/ControlBibtex.h"
+#include "controllers/ButtonPolicies.h"
 
 #include "support/filetools.h"
+#include "support/lstrings.h"
 
-#include <qwidget.h>
 #include <qpushbutton.h>
 #include <qcombobox.h>
-#include <qlistbox.h>
 #include <qlineedit.h>
-#include <qcheckbox.h>
-#include <qfiledialog.h>
+#include <qlistbox.h>
+
+using lyx::support::changeExtension;
+using lyx::support::trim;
+
+using std::string;
+
+namespace lyx {
+namespace frontend {
 
-#include "QBibtexDialog.h"
-#include "QBibtex.h"
 QBibtexDialog::QBibtexDialog(QBibtex * form)
        : QBibtexDialogBase(0, 0, false, 0),
        form_(form)
@@ -33,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);
 }
 
 
@@ -44,57 +94,111 @@ void QBibtexDialog::change_adaptor()
 
 void QBibtexDialog::browsePressed()
 {
-       QString file = QFileDialog::getOpenFileName(QString::null,
-               _("BibTeX style files (*.bst)"), this, 0, _("Select a BibTeX style"));
-       if (!file.isNull()) {
-               styleED->setText(ChangeExtension(OnlyFilename(file.latin1()), "").c_str());
+       string const file = form_->controller().browseBst("");
+
+       if (!file.empty()) {
+               string const filen = changeExtension(file, "");
+               bool present = false;
+               unsigned int pres = 0;
+
+               for (int i = 0; i != styleCB->count(); ++i) {
+                       if (fromqstr(styleCB->text(i)) == filen) {
+                               present = true;
+                               pres = i;
+                       }
+               }
+
+               if (!present)
+                       styleCB->insertItem(toqstr(filen),0);
+
+               styleCB->setCurrentItem(pres);
                form_->changed();
        }
 }
 
 
-void QBibtexDialog::addPressed()
+void QBibtexDialog::browseBibPressed()
 {
-       QString file = QFileDialog::getOpenFileName(QString::null,
-               _("BibTeX database files (*.bib)"), this, 0, _("Select a BibTeX database to add"));
-       if (!file.isNull()) {
-               // FIXME: check duplicates
-               databaseLB->insertItem(ChangeExtension(file.latin1(), "").c_str());
-               form_->changed();
+       string const file = trim(form_->controller().browseBib(""));
+
+       if (!file.empty()) {
+               string const f = changeExtension(file, "");
+               bool present = false;
+
+               for (unsigned int i = 0; i != add_->bibLB->count(); i++) {
+                       if (fromqstr(add_->bibLB->text(i)) == f)
+                               present = true;
+               }
+
+               if (!present) {
+                       add_->bibLB->insertItem(toqstr(f));
+                       form_->changed();
+               }
+
+               add_->bibED->setText(toqstr(f));
        }
 }
 
 
-void QBibtexDialog::deletePressed()
+void QBibtexDialog::addPressed()
 {
-       databaseLB->removeItem(databaseLB->currentItem());
+       add_->exec();
+       add_bc_.valid(false);
 }
 
 
-void QBibtexDialog::styleChanged(const QString & sel)
+void QBibtexDialog::addDatabase()
 {
-       if (form_->readOnly())
+       int const sel = add_->bibLB->currentItem();
+       string const file = trim(fromqstr(add_->bibED->text()));
+
+       if (sel < 0 && file.empty())
                return;
 
-       if (string(_("Other ...")) == sel.latin1()) {
-               styleED->setEnabled(true);
-               stylePB->setEnabled(true);
-       } else {
-               styleED->setEnabled(false);
-               stylePB->setEnabled(false);
-               styleED->setText("");
+       // 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 (!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::databaseChanged()
 {
        deletePB->setEnabled(!form_->readOnly() && databaseLB->currentItem() != -1);
 }
 
 
+void QBibtexDialog::availableChanged()
+{
+       form_->changed();
+}
+
+
 void QBibtexDialog::closeEvent(QCloseEvent *e)
 {
        form_->slotWMHide();
        e->accept();
 }
+
+} // namespace frontend
+} // namespace lyx