]> git.lyx.org Git - lyx.git/blob - src/frontends/kde/FormRef.C
John's KDE FormRef patch
[lyx.git] / src / frontends / kde / FormRef.C
1 /*
2  * FormRef.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 "Dialogs.h"
19 #include "FormRef.h"
20 #include "gettext.h"
21 #include "buffer.h"
22 #include "LyXView.h"
23 #include "lyxfunc.h"
24 #include "formrefdialog.h"
25 #include "debug.h"
26
27 FormRef::FormRef(LyXView *v, Dialogs *d)
28         : dialog_(0), lv_(v), d_(d), inset_(0), h_(0), u_(0), ih_(0),
29         sort(0), gotowhere(GOTOREF), type(REF), refs(0)
30 {
31         // let the dialog be shown
32         // This is a permanent connection so we won't bother
33         // storing a copy because we won't be disconnecting.
34         d->showRef.connect(slot(this, &FormRef::showRef));
35         d->createRef.connect(slot(this, &FormRef::createRef));
36 }
37
38 FormRef::~FormRef()
39 {
40         delete dialog_;
41 }
42
43 void FormRef::showRef(InsetCommand * const inset)
44 {
45         // FIXME: when could inset be 0 here ?
46         if (inset==0)
47                 return;
48
49         inset_ = inset;
50         readonly = lv_->buffer()->isReadonly();
51         ih_ = inset_->hide.connect(slot(this,&FormRef::hide));
52         params = inset->params();
53         
54         show();
55 }
56
57 void FormRef::createRef(string const & arg)
58 {
59         if (inset_)
60                 close();
61
62         readonly = lv_->buffer()->isReadonly();
63         params.setFromString(arg);
64         show();
65 }
66
67 void FormRef::select(const char *text)
68 {
69         params.setContents(text);
70         lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
71         gotowhere = GOTOREF;
72         dialog_->buttonGoto->setText(_("&Goto reference"));
73         dialog_->buttonGoto->setEnabled(true);
74         if (!readonly) {
75                 dialog_->type->setEnabled(true);
76                 dialog_->reference->setText(text);
77                 dialog_->buttonOk->setEnabled(true);
78         }
79 }
80
81 void FormRef::set_sort(bool on)
82 {
83         if (on!=sort) {
84                 sort=on;
85                 dialog_->refs->clear();
86                 updateRefs();
87         }
88 }
89
90 void FormRef::goto_ref()
91 {
92         switch (gotowhere) {
93                 case GOTOREF:
94                         lv_->getLyXFunc()->Dispatch(LFUN_REF_GOTO, params.getContents().c_str());
95                         gotowhere=GOTOBACK;
96                         dialog_->buttonGoto->setText(_("&Go back"));
97                         break;
98                 case GOTOBACK:
99                         lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK, params.getContents().c_str());
100                         gotowhere=GOTOREF;
101                         dialog_->buttonGoto->setText(_("&Goto reference"));
102                         break;
103                 }
104 }
105
106 void FormRef::updateRefs()
107 {
108         dialog_->refs->setAutoUpdate(false);
109  
110         for (vector< string >::const_iterator iter = refs.begin();
111                 iter != refs.end(); ++iter) {
112                 if (sort)
113                         dialog_->refs->inSort(iter->c_str());
114                 else
115                         dialog_->refs->insertItem(iter->c_str());
116         }
117         dialog_->refs->setAutoUpdate(true);
118         dialog_->refs->update();
119 }
120
121 void FormRef::update()
122 {
123         dialog_->reference->setText(params.getContents().c_str());
124         dialog_->refname->setText(params.getOptions().c_str());
125
126         if (params.getCmdName()=="prettyref") {
127                 type = PRETTYREF;
128                 dialog_->type->setCurrentItem(4);
129         } else if (params.getCmdName()=="pageref") {
130                 type = PAGEREF;
131                 dialog_->type->setCurrentItem(1);
132         } else if (params.getCmdName()=="vref") {
133                 type = VREF;
134                 dialog_->type->setCurrentItem(2);
135         } else if (params.getCmdName()=="vpageref") {
136                 type = VPAGEREF;
137                 dialog_->type->setCurrentItem(3);
138         } else {
139                 type = REF;
140                 dialog_->type->setCurrentItem(0);
141         }
142
143         dialog_->buttonGoto->setText(_("&Goto reference"));
144
145         gotowhere = GOTOREF;
146
147         dialog_->sort->setChecked(sort);
148
149         dialog_->refs->clear();
150         dialog_->type->setEnabled(false);
151  
152         if (inset_) {
153                 // FIXME: should totally remove and re-size dialog,
154                 // but doesn't seem easily possible
155                 dialog_->refs->hide();
156                 dialog_->labelrefs->hide();
157                 dialog_->sort->hide();
158                 dialog_->buttonUpdate->hide();
159                 dialog_->buttonGoto->setEnabled(true); 
160         } else {
161                 dialog_->refs->show();
162                 dialog_->labelrefs->show();
163                 dialog_->sort->show();
164                 dialog_->buttonUpdate->show();
165                 refs = lv_->buffer()->getLabelList();
166                 if (!refs.empty())
167                         dialog_->sort->setEnabled(true);
168                 updateRefs();
169         }
170         
171         if (params.getContents()=="") {
172                 dialog_->buttonGoto->setEnabled(false);
173                 dialog_->buttonOk->setEnabled(false);
174         } else {
175                 dialog_->buttonGoto->setEnabled(true);
176                 dialog_->buttonOk->setEnabled(true);
177         }
178
179         if (readonly) {
180                 dialog_->type->setEnabled(false);
181                 dialog_->buttonOk->setEnabled(false);
182                 dialog_->buttonUpdate->setEnabled(false);
183                 dialog_->buttonCancel->setText(_("&Close"));
184         } else {
185                 dialog_->type->setEnabled(true);
186                 dialog_->buttonUpdate->setEnabled(true);
187                 dialog_->buttonCancel->setText(_("&Cancel"));
188         }
189 }
190
191 void FormRef::apply()
192 {
193         if (readonly)
194                 return;
195
196         if (!lv_->view()->available())
197                 return;
198
199         switch (dialog_->type->currentItem()) {
200                 case 0:
201                         params.setCmdName("ref");
202                         break;
203                 case 1:
204                         params.setCmdName("pageref");
205                         break;
206                 case 2:
207                         params.setCmdName("vref");
208                         break;
209                 case 3:
210                         params.setCmdName("vpageref");
211                         break;
212                 case 4:
213                         params.setCmdName("prettyref");
214                         break;
215                 default:
216                         lyxerr[Debug::GUI] << "Unknown Ref Type" << endl;
217         }
218
219         params.setOptions(dialog_->refname->text());
220
221         if (inset_ != 0) {
222                 if (params != inset_->params()) {
223                         inset_->setParams(params);
224                         lv_->view()->updateInset(inset_, true);
225                 }
226         } else
227                 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT, params.getAsString().c_str());
228 }
229
230 void FormRef::show()
231 {
232         if (!dialog_)
233                 dialog_ = new FormRefDialog(this, 0, _("LyX: Cross Reference"), false);
234
235         if (!dialog_->isVisible()) {
236                 h_ = d_->hideBufferDependent.connect(slot(this, &FormRef::hide));
237                 u_ = d_->updateBufferDependent.connect(slot(this, &FormRef::update));
238         }
239
240         dialog_->raise();
241         dialog_->setActiveWindow();
242
243         update();
244         dialog_->show();
245 }
246
247 void FormRef::close()
248 {
249         h_.disconnect();
250         u_.disconnect();
251         ih_.disconnect();
252         inset_ = 0;
253 }
254
255 void FormRef::hide()
256 {
257         dialog_->hide();
258         close();
259 }