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