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