3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
14 #include "FormCitation.h"
19 #include "citationdlg.h"
25 FormCitation::FormCitation(LyXView *v, Dialogs *d)
26 : dialog_(0), lv_(v), d_(d), inset_(0), h_(0), u_(0), ih_(0),
27 keys(0), chosenkeys(0)
29 d->showCitation.connect(slot(this, &FormCitation::showCitation));
30 d->createCitation.connect(slot(this, &FormCitation::createCitation));
34 FormCitation::~FormCitation()
40 void FormCitation::showCitation(InsetCommand * const inset)
42 // FIXME: when could inset be 0 here ?
47 readonly = lv_->buffer()->isReadonly();
48 ih_ = inset_->hide.connect(slot(this,&FormCitation::hide));
49 params = inset->params();
55 void FormCitation::createCitation(string const & arg)
57 // we could already be showing stuff, clear it out
61 readonly = lv_->buffer()->isReadonly();
62 params.setFromString(arg);
67 void FormCitation::updateButtons()
70 dialog_->add->setEnabled(false);
71 dialog_->remove->setEnabled(false);
72 dialog_->up->setEnabled(false);
73 dialog_->down->setEnabled(false);
77 bool ischosenkey = !selectedChosenKey.empty();
79 vector<string>::const_iterator iter =
80 find(chosenkeys.begin(), chosenkeys.end(), selectedKey);
82 dialog_->add->setEnabled(!selectedKey.empty() && iter == chosenkeys.end());
83 dialog_->remove->setEnabled(ischosenkey);
84 dialog_->up->setEnabled(ischosenkey);
85 dialog_->down->setEnabled(ischosenkey);
89 void FormCitation::updateChosenList()
91 dialog_->chosen->setAutoUpdate(false);
92 dialog_->chosen->clear();
94 for (vector< string >::const_iterator iter = chosenkeys.begin();
95 iter != chosenkeys.end(); ++iter) {
96 dialog_->chosen->insertItem(iter->c_str());
98 dialog_->chosen->setAutoUpdate(true);
99 dialog_->chosen->update();
103 void FormCitation::updateAvailableList()
105 dialog_->keys->setAutoUpdate(false);
106 dialog_->keys->clear();
108 for (vector< pair<string,string> >::const_iterator iter = keys.begin();
109 iter != keys.end(); ++iter) {
110 dialog_->keys->insertItem(iter->first.c_str());
112 dialog_->keys->setAutoUpdate(true);
113 dialog_->keys->update();
117 // we can safely ignore the parameter because we can always update
118 void FormCitation::update(bool)
122 vector < pair<string,string> > const ckeys = lv_->buffer()->getBibkeyList();
124 for (vector< pair<string,string> >::const_iterator iter = ckeys.begin();
125 iter != ckeys.end(); ++iter) {
126 keys.push_back(*iter);
129 updateAvailableList();
134 string tmp, paramkeys(params.getContents());
135 paramkeys = frontStrip(split(paramkeys, tmp, ','));
137 while (!tmp.empty()) {
138 chosenkeys.push_back(tmp);
139 paramkeys = frontStrip(split(paramkeys, tmp, ','));
143 selectedChosenKey.erase();
145 dialog_->entry->setText("");
147 dialog_->after->setText(params.getOptions().c_str());
152 dialog_->keys->setFocusPolicy(QWidget::NoFocus);
153 dialog_->chosen->setFocusPolicy(QWidget::NoFocus);
154 dialog_->after->setFocusPolicy(QWidget::NoFocus);
155 dialog_->buttonOk->setEnabled(false);
156 dialog_->buttonCancel->setText(_("&Close"));
158 dialog_->keys->setFocusPolicy(QWidget::StrongFocus);
159 dialog_->chosen->setFocusPolicy(QWidget::StrongFocus);
160 dialog_->after->setFocusPolicy(QWidget::StrongFocus);
161 dialog_->buttonOk->setEnabled(true);
162 dialog_->buttonCancel->setText(_("&Cancel"));
166 void FormCitation::apply()
173 for (vector< string >::const_iterator iter = chosenkeys.begin();
174 iter != chosenkeys.end(); ++iter) {
175 if (iter != chosenkeys.begin())
180 params.setContents(contents);
181 params.setOptions(dialog_->after->text());
184 if (params != inset_->params()) {
185 inset_->setParams(params);
186 lv_->view()->updateInset(inset_, true);
189 lv_->getLyXFunc()->Dispatch(LFUN_CITATION_INSERT, params.getAsString().c_str());
192 void FormCitation::show()
195 dialog_ = new CitationDialog(this, 0, _("LyX: Citation Reference"), false);
197 if (!dialog_->isVisible()) {
198 h_ = d_->hideBufferDependent.connect(slot(this, &FormCitation::hide));
199 u_ = d_->updateBufferDependent.connect(slot(this, &FormCitation::update));
203 dialog_->setActiveWindow();
209 void FormCitation::close()
217 void FormCitation::hide()
223 void FormCitation::selectChosen()
225 for (unsigned int i=0; i < dialog_->chosen->count(); ++i) {
226 if (dialog_->chosen->text(i)==selectedChosenKey) {
227 dialog_->chosen->setSelected(i,true);
228 dialog_->chosen->setTopItem(i);
234 void FormCitation::add()
236 if (selectedKey.empty())
239 for (vector< pair<string,string> >::const_iterator iter = keys.begin();
240 iter != keys.end(); ++iter) {
241 if (iter->first == selectedKey) {
242 chosenkeys.push_back(iter->first);
247 selectedChosenKey.erase();
252 void FormCitation::remove()
254 if (selectedChosenKey.empty())
257 for (vector< string >::iterator iter = chosenkeys.begin();
258 iter != chosenkeys.end(); ++iter) {
259 if (*iter==selectedChosenKey) {
260 chosenkeys.erase(iter);
264 selectedChosenKey.erase();
269 void FormCitation::up()
271 if (selectedChosenKey.empty())
274 // Qt will select the first one on redo, so we need this
275 string tmp = selectedChosenKey;
277 vector< string >::iterator iter = chosenkeys.begin();
279 for (; iter != chosenkeys.end(); ++iter) {
280 if (*iter==selectedChosenKey && iter!=chosenkeys.begin()) {
282 chosenkeys.erase(iter);
283 chosenkeys.insert(iter-1,tmp);
287 if (iter==chosenkeys.end())
291 selectedChosenKey=tmp;
296 void FormCitation::down()
298 if (selectedChosenKey.empty())
301 // Qt will select the first one on redo, so we need this
302 string tmp = selectedChosenKey;
304 vector< string >::iterator iter = chosenkeys.begin();
306 for (; iter != chosenkeys.end(); ++iter) {
307 if (*iter == selectedChosenKey && (iter+1)!=chosenkeys.end()) {
309 chosenkeys.erase(iter);
310 chosenkeys.insert(iter+1, tmp);
314 if (iter == chosenkeys.end())
318 selectedChosenKey=tmp;
323 void FormCitation::select_key(char const * key)
328 vector<string>::const_iterator iter =
329 find(chosenkeys.begin(), chosenkeys.end(), key);
331 if (iter != chosenkeys.end())
341 void FormCitation::highlight_key(char const * key)
349 for (unsigned int i=0; i < keys.size(); i++) {
350 if (keys[i].first == key) {
351 dialog_->entry->setText(keys[i].second.c_str());
352 dialog_->chosen->clearFocus();
353 dialog_->chosen->clearSelection();
354 selectedChosenKey.erase();
363 void FormCitation::highlight_chosen(char const * key)
365 selectedChosenKey.erase();
366 selectedChosenKey = key;
370 for (i=0; i < keys.size(); i++) {
371 if (keys[i].first == key) {
372 if (keys[i].second.compare(dialog_->entry->text()))
373 dialog_->entry->setText(keys[i].second.c_str());
374 dialog_->keys->clearFocus();
375 dialog_->keys->clearSelection();
381 if (i == keys.size())
382 dialog_->entry->setText(_("Key not found in references."));