3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Angus Leeming
7 * \author Kalle Dalheimer
9 * Full author contact details are available in file CREDITS.
14 #include "QCitation.h"
15 #include "QCitationDialog.h"
16 #include "ui/QCitationFindDialogBase.h"
18 #include "qt_helpers.h"
20 #include "bufferparams.h"
22 #include "controllers/ButtonController.h"
23 #include "controllers/ControlCitation.h"
25 #include "support/lstrings.h"
27 #include <qcheckbox.h>
28 #include <qcombobox.h>
29 #include <qlineedit.h>
31 #include <qmultilineedit.h>
32 #include <qpushbutton.h>
41 using support::getStringFromVector;
42 using support::getVectorFromString;
47 typedef QController<ControlCitation, QView<QCitationDialog> > base_class;
49 QCitation::QCitation(Dialog & parent)
50 : base_class(parent, _("LyX: Citation Reference"))
54 void QCitation::apply()
56 vector<biblio::CiteStyle> const & styles =
57 ControlCitation::getCiteStyles();
59 int const choice = dialog_->citationStyleCO->currentItem();
60 bool const full = dialog_->fulllistCB->isChecked();
61 bool const force = dialog_->forceuppercaseCB->isChecked();
63 string const command =
64 biblio::CitationStyle(styles[choice], full, force)
67 controller().params().setCmdName(command);
68 controller().params().setContents(getStringFromVector(citekeys));
70 string const before = fromqstr(dialog_->textBeforeED->text());
71 controller().params().setSecOptions(before);
73 string const after = fromqstr(dialog_->textAfterED->text());
74 controller().params().setOptions(after);
81 void QCitation::hide()
91 void QCitation::build_dialog()
93 dialog_.reset(new QCitationDialog(this));
95 // Manage the ok, apply, restore and cancel/close buttons
96 bcview().setOK(dialog_->okPB);
97 bcview().setApply(dialog_->applyPB);
98 bcview().setCancel(dialog_->closePB);
99 bcview().setRestore(dialog_->restorePB);
101 bcview().addReadOnly(dialog_->addPB);
102 bcview().addReadOnly(dialog_->deletePB);
103 bcview().addReadOnly(dialog_->upPB);
104 bcview().addReadOnly(dialog_->downPB);
105 bcview().addReadOnly(dialog_->citationStyleCO);
106 bcview().addReadOnly(dialog_->forceuppercaseCB);
107 bcview().addReadOnly(dialog_->fulllistCB);
108 bcview().addReadOnly(dialog_->textBeforeED);
109 bcview().addReadOnly(dialog_->textAfterED);
115 void QCitation::fillStyles()
117 if (citekeys.empty()) {
118 dialog_->citationStyleCO->setEnabled(false);
119 dialog_->citationStyleLA->setEnabled(false);
123 int const orig = dialog_->citationStyleCO->currentItem();
125 dialog_->citationStyleCO->clear();
127 int curr = dialog_->selectedLB->currentItem();
131 string key = citekeys[curr];
133 vector<string> const & sty = controller().getCiteStrings(key);
135 biblio::CiteEngine const engine = controller().getEngine();
136 bool const basic_engine = engine == biblio::ENGINE_BASIC;
138 dialog_->citationStyleCO->setEnabled(!sty.empty() && !basic_engine);
139 dialog_->citationStyleLA->setEnabled(!sty.empty() && !basic_engine);
141 for (vector<string>::const_iterator it = sty.begin();
142 it != sty.end(); ++it) {
143 dialog_->citationStyleCO->insertItem(toqstr(*it));
146 if (orig != -1 && orig < dialog_->citationStyleCO->count())
147 dialog_->citationStyleCO->setCurrentItem(orig);
151 void QCitation::updateStyle()
153 biblio::CiteEngine const engine = controller().getEngine();
154 bool const natbib_engine =
155 engine == biblio::ENGINE_NATBIB_AUTHORYEAR ||
156 engine == biblio::ENGINE_NATBIB_NUMERICAL;
157 bool const basic_engine = engine == biblio::ENGINE_BASIC;
159 dialog_->fulllistCB->setEnabled(natbib_engine);
160 dialog_->forceuppercaseCB->setEnabled(natbib_engine);
161 dialog_->textBeforeED->setEnabled(!basic_engine);
163 string const & command = controller().params().getCmdName();
165 // Find the style of the citekeys
166 vector<biblio::CiteStyle> const & styles =
167 ControlCitation::getCiteStyles();
168 biblio::CitationStyle const cs(command);
170 vector<biblio::CiteStyle>::const_iterator cit =
171 find(styles.begin(), styles.end(), cs.style);
173 // restore the latest natbib style
174 if (style_ >= 0 && style_ < dialog_->citationStyleCO->count())
175 dialog_->citationStyleCO->setCurrentItem(style_);
177 dialog_->citationStyleCO->setCurrentItem(0);
178 dialog_->fulllistCB->setChecked(false);
179 dialog_->forceuppercaseCB->setChecked(false);
181 if (cit != styles.end()) {
182 int const i = int(cit - styles.begin());
183 dialog_->citationStyleCO->setCurrentItem(i);
184 dialog_->fulllistCB->setChecked(cs.full);
185 dialog_->forceuppercaseCB->setChecked(cs.forceUCase);
190 void QCitation::update_contents()
192 // Make the list of all available bibliography keys
193 bibkeys = biblio::getKeys(controller().bibkeysInfo());
194 updateBrowser(dialog_->add_->availableLB, bibkeys);
196 // Ditto for the keys cited in this inset
197 citekeys = getVectorFromString(controller().params().getContents());
198 updateBrowser(dialog_->selectedLB, citekeys);
200 // No keys have been selected yet, so...
201 dialog_->infoML->clear();
202 dialog_->setButtons();
204 dialog_->textBeforeED->setText(
205 toqstr(controller().params().getSecOptions()));
206 dialog_->textAfterED->setText(
207 toqstr(controller().params().getOptions()));
212 // open the find dialog if nothing has been selected (yet)
213 // the bool prevents that this is also done after "apply"
217 bc().valid(isValid());
221 void QCitation::updateBrowser(QListBox * browser,
222 vector<string> const & keys) const
226 for (vector<string>::const_iterator it = keys.begin();
227 it < keys.end(); ++it) {
228 string const key = trim(*it);
229 // FIXME: why the .empty() test ?
231 browser->insertItem(toqstr(key));
236 bool QCitation::isValid()
238 return dialog_->selectedLB->count() > 0;
242 } // namespace frontend