]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/FormRef.C
Swap two printer related help messages.
[lyx.git] / src / frontends / xforms / FormRef.C
1 // -*- C++ -*-
2 /* This file is part of
3  * ====================================================== 
4  *
5  *           LyX, The Document Processor
6  *
7  *           Copyright 2000 The LyX Team.
8  *
9  * ======================================================
10  */
11
12 #include <config.h>
13
14 #include FORMS_H_LOCATION
15
16 #ifdef __GNUG__
17 #pragma implementation
18 #endif
19
20
21 #include "Dialogs.h"
22 #include "FormRef.h"
23 #include "LyXView.h"
24 #include "buffer.h"
25 #include "form_ref.h"
26 #include "lyxfunc.h"
27
28 #include <algorithm>
29
30 using std::find;
31 using std::max;
32 using std::sort;
33 using std::vector;
34
35 FormRef::FormRef(LyXView * lv, Dialogs * d)
36         : FormCommand(lv, d, _("Reference"), new NoRepeatedApplyPolicy),
37           toggle(GOBACK), dialog_(0)
38 {
39         // let the dialog be shown
40         // These are permanent connections so we won't bother
41         // storing a copy because we won't be disconnecting.
42         d->showRef.connect(slot(this, &FormRef::showInset));
43         d->createRef.connect(slot(this, &FormRef::createInset));
44 }
45
46
47 FormRef::~FormRef()
48 {
49         delete dialog_;
50 }
51
52
53 FL_FORM * FormRef::form() const
54 {
55         if (dialog_) return dialog_->form;
56         return 0;
57 }
58
59
60 void FormRef::disconnect()
61 {
62         refs.clear();
63         FormCommand::disconnect();
64 }
65
66
67 void FormRef::build()
68 {
69         dialog_ = build_ref();
70
71         fl_addto_choice(dialog_->type,
72                         _(" Ref | Page | TextRef | TextPage | PrettyRef "));
73
74         // Workaround dumb xforms sizing bug
75         minw_ = form()->w;
76         minh_ = form()->h;
77
78         // Force the user to use the browser to change refs.
79         fl_deactivate_object(dialog_->ref);
80
81         // Manage the ok and cancel/close buttons
82         bc_.setOK(dialog_->button_ok);
83         bc_.setApply(dialog_->button_apply);
84         bc_.setCancel(dialog_->button_cancel);
85         bc_.setUndoAll(dialog_->button_restore);
86         bc_.refresh();
87
88         bc_.addReadOnly(dialog_->type);
89         bc_.addReadOnly(dialog_->name);
90 }
91
92
93 void FormRef::update()
94 {
95         fl_set_input(dialog_->ref,  params.getContents().c_str());
96         fl_set_input(dialog_->name, params.getOptions().c_str());
97
98         Type type = getType();
99         fl_set_choice(dialog_->type, type+1);
100
101         toggle = GOBACK;
102         fl_set_object_label(dialog_->button_go, _("Goto reference"));
103
104         // Name is irrelevant to LaTeX documents
105         if (lv_->buffer()->isLatex()) {
106                 fl_deactivate_object(dialog_->name);
107                 fl_set_object_lcol(dialog_->name, FL_INACTIVE);
108         }
109
110         refs = lv_->buffer()->getLabelList();
111         updateBrowser(refs);
112
113         bc_.readOnly(lv_->buffer()->isReadonly());
114 }
115
116
117 void FormRef::updateBrowser(vector<string> const & akeys) const
118 {
119         vector<string> keys(akeys);
120         if (fl_get_button(dialog_->sort))
121                 sort(keys.begin(), keys.end());
122
123         fl_clear_browser(dialog_->browser);
124         for (vector<string>::const_iterator it = keys.begin();
125              it != keys.end(); ++it)
126                 fl_add_browser_line(dialog_->browser, (*it).c_str());
127
128         if (keys.empty()) {
129                 fl_add_browser_line(dialog_->browser,
130                                     _("*** No labels found in document ***"));
131
132                 fl_deactivate_object(dialog_->browser);
133                 fl_deactivate_object(dialog_->button_update);
134                 fl_deactivate_object(dialog_->sort);
135                 fl_set_object_lcol(dialog_->browser, FL_INACTIVE);
136                 fl_set_object_lcol(dialog_->button_update, FL_INACTIVE);
137                 fl_set_object_lcol(dialog_->sort, FL_INACTIVE);
138         } else {
139                 fl_set_browser_topline(dialog_->browser, 1);
140                 fl_activate_object(dialog_->browser);
141                 fl_set_object_lcol(dialog_->browser, FL_BLACK);
142                 fl_activate_object(dialog_->button_update);
143                 fl_set_object_lcol(dialog_->button_update, FL_BLACK);
144                 fl_activate_object(dialog_->sort);
145                 fl_set_object_lcol(dialog_->sort, FL_BLACK);
146
147                 string ref = fl_get_input(dialog_->ref);
148                 vector<string>::const_iterator cit =
149                         find(keys.begin(), keys.end(), ref);
150
151                 if (cit != keys.end()) {
152                         int const i = static_cast<int>(cit - keys.begin());
153                         fl_set_browser_topline(dialog_->browser, max(i-5, 1));
154                         fl_select_browser_line(dialog_->browser, i+1);
155                 }
156         }
157 }
158
159
160 void FormRef::apply()
161 {
162         if (!lv_->view()->available())
163                 return;
164
165         Type const type = static_cast<Type>(fl_get_choice(dialog_->type) - 1);
166         params.setCmdName(getName(type));
167
168         params.setOptions(fl_get_input(dialog_->name));
169         params.setContents(fl_get_input(dialog_->ref));
170
171         if (inset_ != 0) {
172                 // Only update if contents have changed
173                 if (params != inset_->params()) {
174                         inset_->setParams(params);
175                         lv_->view()->updateInset(inset_, true);
176                 }
177         } else {
178                 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT,
179                                             params.getAsString());
180         }
181 }
182
183
184 bool FormRef::input(FL_OBJECT *, long data)
185 {
186         bool activate(true);
187         switch (data) {
188         // goto reference / go back
189         case 1:
190         {
191                 // No change to data
192                 activate = false;
193                 
194                 toggle = static_cast<Goto>(toggle + 1);
195                 if (toggle == GOFIRST ) toggle = GOREF;
196         
197                 switch (toggle) {
198                 case GOREF:
199                 {
200                         lv_->getLyXFunc()->
201                                 Dispatch(LFUN_REF_GOTO,
202                                          params.getContents());
203                         fl_set_object_label(dialog_->button_go, _("Go back"));
204                 }
205                 break;
206
207                 case GOBACK:
208                 {
209                         lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
210                         fl_set_object_label(dialog_->button_go,
211                                             _("Goto reference"));
212                 }
213                 break;
214
215                 default:
216                         break;
217                 }
218         }
219         break;
220
221         // choose browser key
222         case 2:
223         {
224                 unsigned int sel = fl_get_browser(dialog_->browser);
225                 if (sel < 1 || sel > refs.size()) break;
226
227                 if (!lv_->buffer()->isReadonly()) {
228                         string s = fl_get_browser_line(dialog_->browser, sel);
229                         fl_set_input(dialog_->ref, s.c_str());
230                 }
231
232                 toggle = GOBACK;
233                 lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
234                 fl_set_object_label(dialog_->button_go, _("Goto reference"));
235
236                 fl_activate_object(dialog_->type);
237                 fl_set_object_lcol(dialog_->type, FL_BLACK);
238                 fl_activate_object(dialog_->button_go);
239                 fl_set_object_lcol(dialog_->button_go, FL_BLACK);
240                 fl_set_object_lcol(dialog_->ref, FL_BLACK);
241         }
242         break;
243
244         // update or sort
245         case 3:
246                 refs = lv_->buffer()->getLabelList();
247
248                 // fall through to...
249         case 4:
250                 fl_freeze_form(form());
251                 updateBrowser(refs);
252                 fl_unfreeze_form(form());
253                 break;
254
255         // changed reference type
256         case 5:
257         {
258                 Type type = static_cast<Type>( 
259                         fl_get_choice(dialog_->type) - 1);
260                 if (params.getCmdName() == getName(type)
261                     && inset_) {
262                         activate = false;
263                 }
264         }
265         break;
266
267         default:
268                 break;
269         }
270
271         return activate;
272 }
273
274
275 FormRef::Type FormRef::getType() const
276 {
277         Type type;
278
279         if (params.getCmdName() == "ref" )
280                 type = REF;
281
282         else if (params.getCmdName() == "pageref" )
283                 type = PAGEREF;
284
285         else if (params.getCmdName() == "vref" )
286                 type = VREF;
287
288         else if (params.getCmdName() == "vpageref" )
289                 type = VPAGEREF;
290
291         else
292                 type = PRETTYREF;
293         
294         return type;
295 }
296
297
298 string const FormRef::getName(Type type) const
299 {
300         string name;
301
302         switch (type) {
303         case REF:
304                 name = "ref";
305                 break;
306         case PAGEREF:
307                 name = "pageref";
308                 break;
309         case VREF:
310                 name = "vref";
311                 break;
312         case VPAGEREF:
313                 name = "vpageref";
314                 break;
315         case PRETTYREF:
316                 name = "prettyref";
317                 break;
318         }
319         
320         return name;
321 }