]> git.lyx.org Git - lyx.git/blob - src/frontends/kde/FormCitation.C
Added Ascii export for tabulars + small fixes
[lyx.git] / src / frontends / kde / FormCitation.C
1 /*
2  * FormCitation.C
3  * (C) 2000 LyX Team
4  * John Levon, moz@compsoc.man.ac.uk
5  */
6
7 /***************************************************************************
8  *                                                                         *
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.                                   *
13  *                                                                         *
14  ***************************************************************************/
15
16 #include <config.h>
17
18 #include <algorithm> 
19
20 #include "Dialogs.h"
21 #include "FormCitation.h"
22 #include "gettext.h"
23 #include "buffer.h"
24 #include "LyXView.h"
25 #include "lyxfunc.h"
26 #include "formcitationdialog.h"
27  
28 using std::vector;
29 using std::pair;
30 using std::find;
31  
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)
35 {
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));
41 }
42
43 FormCitation::~FormCitation()
44 {
45         delete dialog_;
46 }
47
48 void FormCitation::showCitation(InsetCommand * const inset)
49 {
50         // FIXME: when could inset be 0 here ?
51         if (inset==0)
52                 return;
53
54         inset_ = inset;
55         readonly = lv_->buffer()->isReadonly();
56         ih_ = inset_->hide.connect(slot(this,&FormCitation::hide));
57         params = inset->params();
58         
59         show();
60 }
61
62 void FormCitation::createCitation(string const & arg)
63 {
64         // we could already be showing stuff, clear it out
65         if (inset_)
66                 close();
67
68         readonly = lv_->buffer()->isReadonly();
69         params.setFromString(arg);
70         show();
71 }
72
73 void FormCitation::updateButtons()
74
75         bool ischosenkey = !selectedChosenKey.empty();
76  
77         vector<string>::const_iterator iter = 
78                 find(chosenkeys.begin(), chosenkeys.end(), selectedKey);
79
80         dialog_->add->setEnabled(!selectedKey.empty() && iter == chosenkeys.end());
81         dialog_->remove->setEnabled(ischosenkey);
82         dialog_->up->setEnabled(ischosenkey);
83         dialog_->down->setEnabled(ischosenkey);
84 }
85  
86 void FormCitation::updateChosenList()
87 {
88         dialog_->chosen->setAutoUpdate(false);
89         dialog_->chosen->clear();
90
91         for (vector< string >::const_iterator iter = chosenkeys.begin();
92                 iter != chosenkeys.end(); ++iter) {
93                 dialog_->chosen->insertItem(iter->c_str());
94         }
95         dialog_->chosen->setAutoUpdate(true);
96         dialog_->chosen->update();
97 }
98
99 void FormCitation::updateAvailableList()
100 {
101         dialog_->keys->setAutoUpdate(false);
102         dialog_->keys->clear();
103
104         for (vector< pair<string,string> >::const_iterator iter = keys.begin();
105                 iter != keys.end(); ++iter) {
106                 dialog_->keys->insertItem(iter->first.c_str());
107         }
108         dialog_->keys->setAutoUpdate(true);
109         dialog_->keys->update();
110 }
111  
112 void FormCitation::update()
113 {
114         keys.clear();
115  
116         vector < pair<string,string> > ckeys = lv_->buffer()->getBibkeyList(); 
117
118         for (vector< pair<string,string> >::const_iterator iter = ckeys.begin();
119                 iter != ckeys.end(); ++iter) {
120                 keys.push_back(*iter);
121         }
122  
123         updateAvailableList();
124         selectedKey.erase();
125  
126         chosenkeys.clear();
127  
128         string tmp, paramkeys(params.getContents());
129         paramkeys = frontStrip(split(paramkeys, tmp, ','));
130
131         while (!tmp.empty()) {
132                 chosenkeys.push_back(tmp);
133                 paramkeys = frontStrip(split(paramkeys, tmp, ','));
134         }
135
136         updateChosenList();
137         selectedChosenKey.erase();
138  
139         dialog_->entry->setText("");
140
141         dialog_->after->setText(params.getOptions().c_str());
142
143         updateButtons();
144  
145         if (readonly) {
146                 dialog_->keys->setFocusPolicy(QWidget::NoFocus);
147                 dialog_->chosen->setFocusPolicy(QWidget::NoFocus);
148                 dialog_->after->setFocusPolicy(QWidget::NoFocus);
149                 dialog_->buttonOk->setEnabled(false);
150                 dialog_->buttonCancel->setText(_("&Close"));
151         } else {
152                 dialog_->keys->setFocusPolicy(QWidget::StrongFocus);
153                 dialog_->chosen->setFocusPolicy(QWidget::StrongFocus);
154                 dialog_->after->setFocusPolicy(QWidget::StrongFocus);
155                 dialog_->buttonOk->setEnabled(true);
156                 dialog_->buttonCancel->setText(_("&Cancel"));
157         }
158 }
159
160 void FormCitation::apply()
161 {
162         if (readonly)
163                 return;
164
165         string contents;
166
167         for (vector< string >::const_iterator iter = chosenkeys.begin();
168                 iter != chosenkeys.end(); ++iter) {
169                 if (iter != chosenkeys.begin())
170                         contents += ", ";
171                 contents += *iter;
172         }
173                 
174         params.setContents(contents);
175         params.setOptions(dialog_->after->text());
176          
177         if (inset_ != 0) {
178                 if (params != inset_->params()) {
179                         inset_->setParams(params);
180                         lv_->view()->updateInset(inset_, true);
181                 }
182         } else
183                 lv_->getLyXFunc()->Dispatch(LFUN_CITATION_INSERT, params.getAsString().c_str());
184 }
185
186 void FormCitation::show()
187 {
188         if (!dialog_)
189                 dialog_ = new FormCitationDialog(this, 0, _("LyX: Citation Reference"), false);
190
191         if (!dialog_->isVisible()) {
192                 h_ = d_->hideBufferDependent.connect(slot(this, &FormCitation::hide));
193                 u_ = d_->updateBufferDependent.connect(slot(this, &FormCitation::update));
194         }
195
196         dialog_->raise();
197         dialog_->setActiveWindow();
198
199         update();
200         dialog_->show();
201 }
202
203 void FormCitation::close()
204 {
205         h_.disconnect();
206         u_.disconnect();
207         ih_.disconnect();
208         inset_ = 0;
209 }
210
211 void FormCitation::hide()
212 {
213         dialog_->hide();
214         close();
215 }
216
217 void FormCitation::selectChosen()
218 {
219         for (unsigned int i=0; i < dialog_->chosen->count(); ++i) {
220                 if (dialog_->chosen->text(i)==selectedChosenKey) {
221                         dialog_->chosen->setSelected(i,true);
222                         dialog_->chosen->setTopItem(i);
223                         break;
224                 }
225         }
226 }
227  
228 void FormCitation::add()
229 {
230         if (selectedKey.empty())
231                 return;
232
233         for (vector< pair<string,string> >::const_iterator iter = keys.begin(); 
234                 iter != keys.end(); ++iter) {
235                 if (iter->first == selectedKey) {
236                         chosenkeys.push_back(iter->first);
237                         break; 
238                 }
239         }
240                  
241         selectedChosenKey.erase();
242         updateChosenList();
243         updateButtons();
244 }
245
246 void FormCitation::remove()
247 {
248         if (selectedChosenKey.empty())
249                 return; 
250
251         for (vector< string >::iterator iter = chosenkeys.begin();
252                 iter != chosenkeys.end(); ++iter) {
253                 if (*iter==selectedChosenKey) {
254                         chosenkeys.erase(iter);
255                         break;
256                 }
257         }
258         selectedChosenKey.erase();
259         updateChosenList();
260         updateButtons();
261 }
262
263 void FormCitation::up()
264 {
265         if (selectedChosenKey.empty())
266                 return;
267
268         // Qt will select the first one on redo, so we need this 
269         string tmp = selectedChosenKey;
270  
271         vector< string >::iterator iter = chosenkeys.begin();
272
273         for (; iter != chosenkeys.end(); ++iter) {
274                 if (*iter==selectedChosenKey && iter!=chosenkeys.begin()) {
275                         string tmp = *iter;
276                         chosenkeys.erase(iter);
277                         chosenkeys.insert(iter-1,tmp);
278                         break;
279                 }
280         }
281         if (iter==chosenkeys.end())
282                 return;
283  
284         updateChosenList();
285         selectedChosenKey=tmp;
286         selectChosen();
287 }
288
289 void FormCitation::down()
290 {
291         if (selectedChosenKey.empty())
292                 return;
293
294         // Qt will select the first one on redo, so we need this 
295         string tmp = selectedChosenKey;
296  
297         vector< string >::iterator iter = chosenkeys.begin();
298
299         for (; iter != chosenkeys.end(); ++iter) {
300                 if (*iter==selectedChosenKey && (iter+1)!=chosenkeys.end()) {
301                         string tmp = *iter;
302                         chosenkeys.erase(iter);
303                         chosenkeys.insert(iter+1, tmp);
304                         break;
305                 }
306         }
307         if (iter==chosenkeys.end())
308                 return;
309  
310         updateChosenList();
311         selectedChosenKey=tmp;
312         selectChosen();
313 }
314  
315 void FormCitation::select_key(const char *key)
316 {
317         vector<string>::const_iterator iter = 
318                 find(chosenkeys.begin(), chosenkeys.end(), key);
319
320         if (iter!=chosenkeys.end())
321                 return;
322
323         selectedKey.erase();
324         selectedKey = key;
325
326         add();
327 }
328  
329 void FormCitation::highlight_key(const char *key)
330 {
331         selectedKey.erase();
332         selectedKey = key;
333
334         for (unsigned int i=0; i < keys.size(); i++) {
335                 if (keys[i].first==key) {
336                         dialog_->entry->setText(keys[i].second.c_str());
337                         dialog_->chosen->clearFocus();
338                         dialog_->chosen->clearSelection();
339                         dialog_->up->setEnabled(false);
340                         dialog_->down->setEnabled(false);
341                         dialog_->remove->setEnabled(false);
342                         selectedChosenKey.erase();
343                         break;
344                 }
345         }
346
347         updateButtons();
348 }
349
350 void FormCitation::highlight_chosen(const char *key)
351 {
352         selectedChosenKey.erase();
353         selectedChosenKey = key;
354  
355         unsigned int i;
356
357         for (i=0; i < keys.size(); i++) {
358                 if (keys[i].first==key) {
359                         if (keys[i].second.compare(dialog_->entry->text()))
360                                 dialog_->entry->setText(keys[i].second.c_str());
361                         dialog_->keys->clearFocus();
362                         dialog_->keys->clearSelection();
363                         dialog_->add->setEnabled(false);
364                         selectedKey.erase();
365                         break;
366                 }
367         }
368
369         if (i==keys.size())
370                 dialog_->entry->setText(_("Key not found in references."));
371  
372         updateButtons();
373 }