4 * John Levon, moz@compsoc.man.ac.uk
7 /***************************************************************************
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
14 ***************************************************************************/
21 #include "FormCitation.h"
26 #include "formcitationdialog.h"
32 FormCitation::FormCitation(LyXView *v, Dialogs *d)
33 : dialog_(0), lv_(v), d_(d), inset_(0), h_(0), u_(0), ih_(0),
34 keys(0), chosenkeys(0)
36 // let the dialog be shown
37 // This is a permanent connection so we won't bother
38 // storing a copy because we won't be disconnecting.
39 d->showCitation.connect(slot(this, &FormCitation::showCitation));
40 d->createCitation.connect(slot(this, &FormCitation::createCitation));
43 FormCitation::~FormCitation()
48 void FormCitation::showCitation(InsetCommand * const inset)
50 // FIXME: when could inset be 0 here ?
55 readonly = lv_->buffer()->isReadonly();
56 ih_ = inset_->hide.connect(slot(this,&FormCitation::hide));
57 params = inset->params();
62 void FormCitation::createCitation(string const & arg)
64 // we could already be showing stuff, clear it out
68 readonly = lv_->buffer()->isReadonly();
69 params.setFromString(arg);
73 void FormCitation::updateButtons()
75 bool ischosenkey = !selectedChosenKey.empty();
77 vector<string>::const_iterator iter =
78 find(chosenkeys.begin(), chosenkeys.end(), selectedKey);
80 dialog_->add->setEnabled(!selectedKey.empty() && iter == chosenkeys.end());
81 dialog_->remove->setEnabled(ischosenkey);
82 dialog_->up->setEnabled(ischosenkey);
83 dialog_->down->setEnabled(ischosenkey);
86 void FormCitation::updateChosenList()
88 dialog_->chosen->setAutoUpdate(false);
89 dialog_->chosen->clear();
91 for (vector< string >::const_iterator iter = chosenkeys.begin();
92 iter != chosenkeys.end(); ++iter) {
93 dialog_->chosen->insertItem(iter->c_str());
95 dialog_->chosen->setAutoUpdate(true);
96 dialog_->chosen->update();
99 void FormCitation::updateAvailableList()
101 dialog_->keys->setAutoUpdate(false);
102 dialog_->keys->clear();
104 for (vector< pair<string,string> >::const_iterator iter = keys.begin();
105 iter != keys.end(); ++iter) {
106 dialog_->keys->insertItem(iter->first.c_str());
108 dialog_->keys->setAutoUpdate(true);
109 dialog_->keys->update();
113 // we can safely ignore the parameter because we can always update
114 void FormCitation::update(bool)
118 vector < pair<string,string> > ckeys = lv_->buffer()->getBibkeyList();
120 for (vector< pair<string,string> >::const_iterator iter = ckeys.begin();
121 iter != ckeys.end(); ++iter) {
122 keys.push_back(*iter);
125 updateAvailableList();
130 string tmp, paramkeys(params.getContents());
131 paramkeys = frontStrip(split(paramkeys, tmp, ','));
133 while (!tmp.empty()) {
134 chosenkeys.push_back(tmp);
135 paramkeys = frontStrip(split(paramkeys, tmp, ','));
139 selectedChosenKey.erase();
141 dialog_->entry->setText("");
143 dialog_->after->setText(params.getOptions().c_str());
148 dialog_->keys->setFocusPolicy(QWidget::NoFocus);
149 dialog_->chosen->setFocusPolicy(QWidget::NoFocus);
150 dialog_->after->setFocusPolicy(QWidget::NoFocus);
151 dialog_->buttonOk->setEnabled(false);
152 dialog_->buttonCancel->setText(_("&Close"));
154 dialog_->keys->setFocusPolicy(QWidget::StrongFocus);
155 dialog_->chosen->setFocusPolicy(QWidget::StrongFocus);
156 dialog_->after->setFocusPolicy(QWidget::StrongFocus);
157 dialog_->buttonOk->setEnabled(true);
158 dialog_->buttonCancel->setText(_("&Cancel"));
162 void FormCitation::apply()
169 for (vector< string >::const_iterator iter = chosenkeys.begin();
170 iter != chosenkeys.end(); ++iter) {
171 if (iter != chosenkeys.begin())
176 params.setContents(contents);
177 params.setOptions(dialog_->after->text());
180 if (params != inset_->params()) {
181 inset_->setParams(params);
182 lv_->view()->updateInset(inset_, true);
185 lv_->getLyXFunc()->Dispatch(LFUN_CITATION_INSERT, params.getAsString().c_str());
188 void FormCitation::show()
191 dialog_ = new FormCitationDialog(this, 0, _("LyX: Citation Reference"), false);
193 if (!dialog_->isVisible()) {
194 h_ = d_->hideBufferDependent.connect(slot(this, &FormCitation::hide));
195 u_ = d_->updateBufferDependent.connect(slot(this, &FormCitation::update));
199 dialog_->setActiveWindow();
205 void FormCitation::close()
213 void FormCitation::hide()
219 void FormCitation::selectChosen()
221 for (unsigned int i=0; i < dialog_->chosen->count(); ++i) {
222 if (dialog_->chosen->text(i)==selectedChosenKey) {
223 dialog_->chosen->setSelected(i,true);
224 dialog_->chosen->setTopItem(i);
230 void FormCitation::add()
232 if (selectedKey.empty())
235 for (vector< pair<string,string> >::const_iterator iter = keys.begin();
236 iter != keys.end(); ++iter) {
237 if (iter->first == selectedKey) {
238 chosenkeys.push_back(iter->first);
243 selectedChosenKey.erase();
248 void FormCitation::remove()
250 if (selectedChosenKey.empty())
253 for (vector< string >::iterator iter = chosenkeys.begin();
254 iter != chosenkeys.end(); ++iter) {
255 if (*iter==selectedChosenKey) {
256 chosenkeys.erase(iter);
260 selectedChosenKey.erase();
265 void FormCitation::up()
267 if (selectedChosenKey.empty())
270 // Qt will select the first one on redo, so we need this
271 string tmp = selectedChosenKey;
273 vector< string >::iterator iter = chosenkeys.begin();
275 for (; iter != chosenkeys.end(); ++iter) {
276 if (*iter==selectedChosenKey && iter!=chosenkeys.begin()) {
278 chosenkeys.erase(iter);
279 chosenkeys.insert(iter-1,tmp);
283 if (iter==chosenkeys.end())
287 selectedChosenKey=tmp;
291 void FormCitation::down()
293 if (selectedChosenKey.empty())
296 // Qt will select the first one on redo, so we need this
297 string tmp = selectedChosenKey;
299 vector< string >::iterator iter = chosenkeys.begin();
301 for (; iter != chosenkeys.end(); ++iter) {
302 if (*iter==selectedChosenKey && (iter+1)!=chosenkeys.end()) {
304 chosenkeys.erase(iter);
305 chosenkeys.insert(iter+1, tmp);
309 if (iter==chosenkeys.end())
313 selectedChosenKey=tmp;
317 void FormCitation::select_key(const char *key)
319 vector<string>::const_iterator iter =
320 find(chosenkeys.begin(), chosenkeys.end(), key);
322 if (iter!=chosenkeys.end())
331 void FormCitation::highlight_key(const char *key)
336 for (unsigned int i=0; i < keys.size(); i++) {
337 if (keys[i].first==key) {
338 dialog_->entry->setText(keys[i].second.c_str());
339 dialog_->chosen->clearFocus();
340 dialog_->chosen->clearSelection();
341 dialog_->up->setEnabled(false);
342 dialog_->down->setEnabled(false);
343 dialog_->remove->setEnabled(false);
344 selectedChosenKey.erase();
352 void FormCitation::highlight_chosen(const char *key)
354 selectedChosenKey.erase();
355 selectedChosenKey = key;
359 for (i=0; i < keys.size(); i++) {
360 if (keys[i].first==key) {
361 if (keys[i].second.compare(dialog_->entry->text()))
362 dialog_->entry->setText(keys[i].second.c_str());
363 dialog_->keys->clearFocus();
364 dialog_->keys->clearSelection();
365 dialog_->add->setEnabled(false);
372 dialog_->entry->setText(_("Key not found in references."));