]> git.lyx.org Git - features.git/blob - src/frontends/qt2/QBibtex.C
introduce namespace lyx::support
[features.git] / src / frontends / qt2 / QBibtex.C
1 /**
2  * \file QBibtex.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author John Levon
7  * \author Herbert Voss
8  *
9  * Full author contact details are available in file CREDITS
10  */
11
12 #include <config.h>
13
14
15 #include "support/lstrings.h"
16
17 #include "ControlBibtex.h"
18 #include "qt_helpers.h"
19 #include "debug.h"
20
21 #include "support/filetools.h" // ChangeExtension
22 #include "support/lstrings.h" // getVectorFromString
23
24 #include <qlineedit.h>
25 #include <qcombobox.h>
26 #include <qpushbutton.h>
27 #include <qlistbox.h>
28 #include <qcheckbox.h>
29
30 #include "ui/QBibtexAddDialogBase.h"
31 #include "QBibtexDialog.h"
32 #include "QBibtex.h"
33 #include "Qt2BC.h"
34
35 using namespace lyx::support;
36
37 using std::vector;
38
39 typedef QController<ControlBibtex, QView<QBibtexDialog> > base_class;
40
41
42 QBibtex::QBibtex(Dialog & parent)
43         : base_class(parent, _("BibTeX"))
44 {
45 }
46
47
48 void QBibtex::build_dialog()
49 {
50         dialog_.reset(new QBibtexDialog(this));
51
52         bcview().setOK(dialog_->okPB);
53         bcview().setCancel(dialog_->closePB);
54         bcview().addReadOnly(dialog_->databaseLB);
55         bcview().addReadOnly(dialog_->stylePB);
56         bcview().addReadOnly(dialog_->styleCB);
57         bcview().addReadOnly(dialog_->bibtocCB);
58         bcview().addReadOnly(dialog_->addBibPB);
59         bcview().addReadOnly(dialog_->deletePB);
60 }
61
62
63 void QBibtex::update_contents()
64 {
65         dialog_->databaseLB->clear();
66
67         string bibs(controller().params().getContents());
68         string bib;
69
70         while (!bibs.empty()) {
71                 bibs = split(bibs, bib, ',');
72                 bib = trim(bib);
73                 if (!bib.empty())
74                         dialog_->databaseLB->insertItem(toqstr(bib));
75         }
76
77         dialog_->add_->bibLB->clear();
78
79         vector<string> bib_str;
80         controller().getBibFiles(bib_str);
81         for (vector<string>::const_iterator it = bib_str.begin();
82                 it != bib_str.end(); ++it) {
83                 string bibItem(ChangeExtension(*it, ""));
84                 dialog_->add_->bibLB->insertItem(toqstr(bibItem));
85         }
86
87         string bibtotoc = "bibtotoc";
88         string bibstyle(controller().params().getOptions());
89
90         // bibtotoc exists?
91         if (prefixIs(bibstyle, bibtotoc)) {
92                 dialog_->bibtocCB->setChecked(true);
93
94                 // bibstyle exists?
95                 if (contains(bibstyle,','))
96                         bibstyle = split(bibstyle, bibtotoc, ',');
97                 else
98                         bibstyle.erase();
99         } else
100                 dialog_->bibtocCB->setChecked(false);
101
102
103         dialog_->styleCB->clear();
104
105         int item_nr(-1);
106
107         vector<string> str;
108         controller().getBibStyles(str);
109         for (vector<string>::const_iterator it = str.begin();
110                 it != str.end(); ++it) {
111                 string item(ChangeExtension(*it, ""));
112                 if (item == bibstyle)
113                         item_nr = int(it - str.begin());
114                 dialog_->styleCB->insertItem(toqstr(item));
115         }
116
117         if (item_nr == -1) {
118                 dialog_->styleCB->insertItem(toqstr(bibstyle));
119                 item_nr = dialog_->styleCB->count() - 1;
120         }
121
122         dialog_->styleCB->setCurrentItem(item_nr);
123 }
124
125
126 void QBibtex::apply()
127 {
128         string dbs(fromqstr(dialog_->databaseLB->text(0)));
129
130         unsigned int maxCount = dialog_->databaseLB->count();
131         for (unsigned int i = 1; i < maxCount; i++) {
132                 dbs += ',';
133                 dbs += fromqstr(dialog_->databaseLB->text(i));
134         }
135
136         controller().params().setContents(dbs);
137
138         string const bibstyle(fromqstr(dialog_->styleCB->currentText()));
139         bool const bibtotoc(dialog_->bibtocCB->isChecked());
140
141         if (bibtotoc && (!bibstyle.empty())) {
142                 // both bibtotoc and style
143                 controller().params().setOptions("bibtotoc," + bibstyle);
144         } else if (bibtotoc) {
145                 // bibtotoc and no style
146                 controller().params().setOptions("bibtotoc");
147         } else {
148                 // only style. An empty one is valid, because some
149                 // documentclasses have an own \bibliographystyle{}
150                 // command!
151                 controller().params().setOptions(bibstyle);
152         }
153 }
154
155
156 bool QBibtex::isValid()
157 {
158         return dialog_->databaseLB->count() != 0;
159 }