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