]> git.lyx.org Git - lyx.git/blob - src/frontends/qt2/QCitation.C
85183bccf3ac57eef4b16f846050e70804bec6c6
[lyx.git] / src / frontends / qt2 / QCitation.C
1 /**
2  * \file QCitation.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Angus Leeming
7  * \author Kalle Dalheimer
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "ui/QCitationFindDialogBase.h"
15 #include "QCitationDialog.h"
16 #include "QCitation.h"
17
18 #include <qcheckbox.h>
19 #include <qcombobox.h>
20 #include <qlineedit.h>
21 #include <qlistbox.h>
22 #include <qmultilineedit.h>
23 #include <qpushbutton.h>
24 #include <qlabel.h>
25
26 #include "Qt2BC.h"
27 #include "ControlCitation.h"
28 #include "qt_helpers.h"
29 #include "support/lstrings.h"
30
31 using namespace lyx::support;
32
33 using std::find;
34
35 using std::vector;
36
37
38 typedef QController<ControlCitation, QView<QCitationDialog> > base_class;
39
40 QCitation::QCitation(Dialog & parent)
41         : base_class(parent, _("LyX: Citation Reference"))
42 {}
43
44
45 void QCitation::apply()
46 {
47         vector<biblio::CiteStyle> const & styles =
48                 ControlCitation::getCiteStyles();
49
50         int const choice = dialog_->citationStyleCO->currentItem();
51         bool const full  = dialog_->fulllistCB->isChecked();
52         bool const force = dialog_->forceuppercaseCB->isChecked();
53
54         string const command =
55                 biblio::getCiteCommand(styles[choice], full, force);
56
57         controller().params().setCmdName(command);
58         controller().params().setContents(getStringFromVector(citekeys));
59
60         string const after = fromqstr(dialog_->textAfterED->text());
61         controller().params().setOptions(after);
62 }
63
64
65 void QCitation::hide()
66 {
67         citekeys.clear();
68         bibkeys.clear();
69
70         QDialogView::hide();
71 }
72
73
74 void QCitation::build_dialog()
75 {
76         dialog_.reset(new QCitationDialog(this));
77
78         // Manage the ok, apply, restore and cancel/close buttons
79         bcview().setOK(dialog_->okPB);
80         bcview().setApply(dialog_->applyPB);
81         bcview().setCancel(dialog_->closePB);
82         bcview().setRestore(dialog_->restorePB);
83
84         bcview().addReadOnly(dialog_->addPB);
85         bcview().addReadOnly(dialog_->deletePB);
86         bcview().addReadOnly(dialog_->upPB);
87         bcview().addReadOnly(dialog_->downPB);
88         bcview().addReadOnly(dialog_->citationStyleCO);
89         bcview().addReadOnly(dialog_->forceuppercaseCB);
90         bcview().addReadOnly(dialog_->fulllistCB);
91         // add when enabled !
92         //bcview().addReadOnly(dialog_->textBeforeED);
93         bcview().addReadOnly(dialog_->textAfterED);
94 }
95
96
97 void QCitation::fillStyles()
98 {
99         if (citekeys.empty()) {
100                 dialog_->citationStyleCO->setEnabled(false);
101                 dialog_->citationStyleLA->setEnabled(false);
102                 return;
103         }
104
105         int const orig = dialog_->citationStyleCO->currentItem();
106
107         dialog_->citationStyleCO->clear();
108
109         int curr = dialog_->selectedLB->currentItem();
110         if (curr < 0)
111                 curr = 0;
112
113         string key = citekeys[curr];
114
115         vector<string> const & sty = controller().getCiteStrings(key);
116
117         bool const natbib = controller().usingNatbib();
118         dialog_->citationStyleCO->setEnabled(!sty.empty() && natbib);
119         dialog_->citationStyleLA->setEnabled(!sty.empty() && natbib);
120
121         for (vector<string>::const_iterator it = sty.begin();
122                 it != sty.end(); ++it) {
123                 dialog_->citationStyleCO->insertItem(toqstr(*it));
124         }
125
126         if (orig != -1 && orig < dialog_->citationStyleCO->count())
127                 dialog_->citationStyleCO->setCurrentItem(orig);
128 }
129
130
131 void QCitation::updateStyle()
132 {
133         bool const natbib = controller().usingNatbib();
134
135         dialog_->fulllistCB->setEnabled(natbib);
136         dialog_->forceuppercaseCB->setEnabled(natbib);
137
138         string const & command = controller().params().getCmdName();
139
140         // Find the style of the citekeys
141         vector<biblio::CiteStyle> const & styles =
142                 ControlCitation::getCiteStyles();
143         biblio::CitationStyle cs = biblio::getCitationStyle(command);
144
145         vector<biblio::CiteStyle>::const_iterator cit =
146                 find(styles.begin(), styles.end(), cs.style);
147
148         dialog_->citationStyleCO->setCurrentItem(0);
149         dialog_->fulllistCB->setChecked(false);
150         dialog_->forceuppercaseCB->setChecked(false);
151
152         if (cit != styles.end()) {
153                 int const i = int(cit - styles.begin());
154                 dialog_->citationStyleCO->setCurrentItem(i);
155                 dialog_->fulllistCB->setChecked(cs.full);
156                 dialog_->forceuppercaseCB->setChecked(cs.forceUCase);
157         }
158 }
159
160
161 void QCitation::update_contents()
162 {
163         // Make the list of all available bibliography keys
164         bibkeys = biblio::getKeys(controller().bibkeysInfo());
165         updateBrowser(dialog_->add_->availableLB, bibkeys);
166
167         // Ditto for the keys cited in this inset
168         citekeys = getVectorFromString(controller().params().getContents());
169         updateBrowser(dialog_->selectedLB, citekeys);
170
171         // No keys have been selected yet, so...
172         dialog_->infoML->clear();
173         dialog_->setButtons();
174
175         dialog_->textAfterED->setText(toqstr(controller().params().getOptions()));
176
177         fillStyles();
178         updateStyle();
179 }
180
181
182 void QCitation::updateBrowser(QListBox * browser,
183                               vector<string> const & keys) const
184 {
185         browser->clear();
186
187         for (vector<string>::const_iterator it = keys.begin();
188                 it < keys.end(); ++it) {
189                 string const key = trim(*it);
190                 // FIXME: why the .empty() test ?
191                 if (!key.empty())
192                         browser->insertItem(toqstr(key));
193         }
194 }