2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
7 * Copyright 2000 The LyX Team.
9 * ======================================================
14 #include FORMS_H_LOCATION
17 #pragma implementation
33 static int const minw_hb = 250;
36 FormRef::FormRef(LyXView * lv, Dialogs * d)
37 : FormCommand(lv, d, _("Reference"), new OkCancelReadOnlyPolicy),
38 toggle(GOBACK), dialog_(0)
40 // let the dialog be shown
41 // These are permanent connections so we won't bother
42 // storing a copy because we won't be disconnecting.
43 d->showRef.connect(slot(this, &FormRef::showInset));
44 d->createRef.connect(slot(this, &FormRef::createInset));
54 FL_FORM * FormRef::form() const
56 if (dialog_) return dialog_->form;
61 void FormRef::connect()
63 fl_set_form_maxsize(form(), 2 * minw_, minh_);
64 FormCommand::connect();
68 void FormRef::disconnect()
71 FormCommand::disconnect();
77 dialog_ = build_ref();
79 fl_addto_choice(dialog_->type,
80 _(" Ref | Page | TextRef | TextPage | PrettyRef "));
82 // Workaround dumb xforms sizing bug
87 // Name is irrelevant to LaTeX documents
88 if (lv_->buffer()->isLatex()) {
89 fl_deactivate_object(dialog_->name);
90 fl_set_object_lcol(dialog_->name, FL_INACTIVE);
93 // Can change reference only through browser
94 fl_deactivate_object(dialog_->ref);
96 // Manage the ok and cancel/close buttons
97 bc_.setOK(dialog_->button_ok);
98 bc_.setCancel(dialog_->button_cancel);
101 bc_.addReadOnly(dialog_->type);
105 void FormRef::update()
107 fl_set_input(dialog_->ref, params.getContents().c_str());
108 fl_set_input(dialog_->name, params.getOptions().c_str());
110 Type type = getType();
111 fl_set_choice(dialog_->type, type + 1);
114 fl_set_object_label(dialog_->button_go, _("Goto reference"));
118 refs = lv_->buffer()->getLabelList();
124 bc_.readOnly(lv_->buffer()->isReadonly());
128 void FormRef::updateBrowser(vector<string> const & akeys) const
130 vector<string> keys(akeys);
131 if (fl_get_button( dialog_->sort))
132 sort(keys.begin(), keys.end());
134 fl_clear_browser(dialog_->browser);
135 for (vector<string>::const_iterator it = keys.begin();
136 it != keys.end(); ++it)
137 fl_add_browser_line(dialog_->browser, (*it).c_str());
140 fl_add_browser_line(dialog_->browser,
141 _("*** No labels found in document ***"));
143 fl_deactivate_object(dialog_->browser);
144 fl_deactivate_object(dialog_->button_update);
145 fl_deactivate_object(dialog_->sort);
146 fl_set_object_lcol(dialog_->browser, FL_INACTIVE);
147 fl_set_object_lcol(dialog_->button_update, FL_INACTIVE);
148 fl_set_object_lcol(dialog_->sort, FL_INACTIVE);
150 fl_set_browser_topline(dialog_->browser, 1);
151 fl_activate_object(dialog_->browser);
152 fl_set_object_lcol(dialog_->browser, FL_BLACK);
153 fl_activate_object(dialog_->button_update);
154 fl_set_object_lcol(dialog_->button_update, FL_BLACK);
155 fl_activate_object(dialog_->sort);
156 fl_set_object_lcol(dialog_->sort, FL_BLACK);
161 void FormRef::showBrowser() const
163 fl_show_object(dialog_->browser);
164 fl_show_object(dialog_->button_update);
165 fl_show_object(dialog_->sort);
169 fl_deactivate_object(dialog_->type);
170 fl_set_object_lcol(dialog_->type, FL_INACTIVE);
171 fl_deactivate_object(dialog_->button_go);
172 fl_set_object_lcol(dialog_->button_go, FL_INACTIVE);
173 fl_set_object_lcol(dialog_->ref, FL_INACTIVE);
178 void FormRef::hideBrowser() const
180 fl_hide_object(dialog_->browser);
181 fl_hide_object(dialog_->button_update);
182 fl_hide_object(dialog_->sort);
184 setSize(minw_hb, 280);
186 fl_activate_object(dialog_->type);
187 fl_set_object_lcol(dialog_->type, FL_BLACK);
188 fl_activate_object(dialog_->button_go);
189 fl_set_object_lcol(dialog_->button_go, FL_BLACK);
190 fl_set_object_lcol(dialog_->ref, FL_BLACK);
195 void FormRef::setSize(int w, int dx) const
197 static int x1 = dialog_->name->x;
198 static int y1 = dialog_->name->y;
199 static int x2 = dialog_->ref->x;
200 static int y2 = dialog_->ref->y;
201 static int x3 = dialog_->type->x;
202 static int y3 = dialog_->type->y;
203 static int x4 = dialog_->button_go->x;
204 static int y4 = dialog_->button_go->y;
205 static int x5 = dialog_->button_ok->x;
206 static int y5 = dialog_->button_ok->y;
207 static int x6 = dialog_->button_cancel->x;
208 static int y6 = dialog_->button_cancel->y;
210 if (form()->w != w) {
212 fl_set_form_size(form(), minw_, minh_);
216 fl_set_object_position(dialog_->name, x1 - dx, y1);
217 fl_set_object_position(dialog_->ref, x2 - dx, y2);
218 fl_set_object_position(dialog_->type, x3 - dx, y3);
219 fl_set_object_position(dialog_->button_go, x4 - dx, y4);
220 fl_set_object_position(dialog_->button_ok, x5 - dx, y5);
221 fl_set_object_position(dialog_->button_cancel, x6 - dx, y6);
223 // These two must be reset apparently
224 // Name is irrelevant to LaTeX documents
225 if (lv_->buffer()->isLatex()) {
226 fl_deactivate_object(dialog_->name);
227 fl_set_object_lcol(dialog_->name, FL_INACTIVE);
230 // Can change reference only through browser
231 fl_deactivate_object(dialog_->ref);
235 void FormRef::apply()
237 if (!lv_->view()->available())
240 Type const type = static_cast<Type>(fl_get_choice(dialog_->type) - 1);
241 params.setCmdName(getName(type));
243 params.setOptions(fl_get_input(dialog_->name));
246 // Only update if contents have changed
247 if (params != inset_->params()) {
248 inset_->setParams(params);
249 lv_->view()->updateInset(inset_, true);
252 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT,
253 params.getAsString());
259 #warning check use of buttoncontroller
260 // Seems okay except that goref and goback shouldn't
261 // affect the status of ok.
263 bool FormRef::input(FL_OBJECT *, long data)
267 // goto reference / go back
270 toggle = static_cast<Goto>(toggle + 1);
271 if (toggle == GOFIRST ) toggle = GOREF;
277 Dispatch(LFUN_REF_GOTO,
278 params.getContents());
279 fl_set_object_label(dialog_->button_go, _("Go back"));
285 lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
286 fl_set_object_label(dialog_->button_go,
287 _("Goto reference"));
297 // choose browser key
300 unsigned int sel = fl_get_browser(dialog_->browser);
301 if (sel < 1 || sel > refs.size()) break;
303 string s = fl_get_browser_line(dialog_->browser, sel);
304 fl_set_input(dialog_->ref, s.c_str());
305 params.setContents(s);
308 lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
309 fl_set_object_label(dialog_->button_go, _("Goto reference"));
311 fl_activate_object(dialog_->type);
312 fl_set_object_lcol(dialog_->type, FL_BLACK);
313 fl_activate_object(dialog_->button_go);
314 fl_set_object_lcol(dialog_->button_go, FL_BLACK);
315 fl_set_object_lcol(dialog_->ref, FL_BLACK);
322 fl_freeze_form(form());
324 fl_unfreeze_form(form());
328 // changed reference type
331 Type type = static_cast<Type>(
332 fl_get_choice(dialog_->type) - 1);
333 if (params.getCmdName() == getName(type)
347 FormRef::Type FormRef::getType() const
351 if (params.getCmdName() == "ref" )
354 else if (params.getCmdName() == "pageref" )
357 else if (params.getCmdName() == "vref" )
360 else if (params.getCmdName() == "vpageref" )
370 string const FormRef::getName(Type type) const