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
35 FormRef::FormRef(LyXView * lv, Dialogs * d)
36 : FormCommand(lv, d, _("Reference"), new NoRepeatedApplyPolicy),
37 toggle(GOBACK), dialog_(0)
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));
53 FL_FORM * FormRef::form() const
55 if (dialog_) return dialog_->form;
60 void FormRef::disconnect()
63 FormCommand::disconnect();
69 dialog_ = build_ref();
71 fl_addto_choice(dialog_->type,
72 _(" Ref | Page | TextRef | TextPage | PrettyRef "));
74 // Workaround dumb xforms sizing bug
78 // Force the user to use the browser to change refs.
79 fl_deactivate_object(dialog_->ref);
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);
88 #warning I had to uncomment this so the buttons could be disabled in update() (dekel)
89 //bc_.addReadOnly(dialog_->type);
90 //bc_.addReadOnly(dialog_->name);
94 void FormRef::update()
97 fl_set_input(dialog_->ref, params.getContents().c_str());
98 fl_set_input(dialog_->name, params.getOptions().c_str());
99 fl_set_choice(dialog_->type, getType()+1);
103 fl_set_object_label(dialog_->button_go, _("Goto reference"));
105 // Name is irrelevant to LaTeX/Literate documents, while
106 // type is irrelevant to LinuxDoc/DocBook.
107 if (lv_->buffer()->isLatex() || lv_->buffer()->isLatex()) {
108 fl_deactivate_object(dialog_->name);
109 fl_set_object_lcol(dialog_->name, FL_INACTIVE);
110 fl_activate_object(dialog_->type);
111 fl_set_object_lcol(dialog_->type, FL_BLACK);
113 fl_set_choice(dialog_->type, REF+1);
115 fl_activate_object(dialog_->name);
116 fl_set_object_lcol(dialog_->name, FL_BLACK);
117 fl_deactivate_object(dialog_->type);
118 fl_set_object_lcol(dialog_->type, FL_INACTIVE);
121 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_->sort);
145 fl_set_object_lcol(dialog_->browser, FL_INACTIVE);
146 fl_set_object_lcol(dialog_->sort, FL_INACTIVE);
147 fl_set_input(dialog_->ref, "");
149 fl_activate_object(dialog_->browser);
150 fl_set_object_lcol(dialog_->browser, FL_BLACK);
151 fl_activate_object(dialog_->sort);
152 fl_set_object_lcol(dialog_->sort, FL_BLACK);
154 string ref = fl_get_input(dialog_->ref);
155 vector<string>::const_iterator cit =
156 find(keys.begin(), keys.end(), ref);
157 if (cit == keys.end())
160 fl_set_input(dialog_->ref, (*cit).c_str());
162 int const i = static_cast<int>(cit - keys.begin());
163 fl_set_browser_topline(dialog_->browser, max(i-5, 1));
164 fl_select_browser_line(dialog_->browser, i+1);
169 void FormRef::apply()
171 if (!lv_->view()->available())
174 Type const type = static_cast<Type>(fl_get_choice(dialog_->type) - 1);
175 params.setCmdName(getName(type));
177 params.setOptions(fl_get_input(dialog_->name));
178 params.setContents(fl_get_input(dialog_->ref));
181 // Only update if contents have changed
182 if (params != inset_->params()) {
183 inset_->setParams(params);
184 lv_->view()->updateInset(inset_, true);
187 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT,
188 params.getAsString());
193 bool FormRef::input(FL_OBJECT *, long data)
197 // goto reference / go back
203 toggle = static_cast<Goto>(toggle + 1);
204 if (toggle == GOFIRST ) toggle = GOREF;
210 Dispatch(LFUN_REF_GOTO,
211 fl_get_input(dialog_->ref));
212 fl_set_object_label(dialog_->button_go, _("Go back"));
218 lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
219 fl_set_object_label(dialog_->button_go,
220 _("Goto reference"));
230 // choose browser key
233 unsigned int sel = fl_get_browser(dialog_->browser);
234 if (sel < 1 || sel > refs.size()) break;
236 if (!lv_->buffer()->isReadonly()) {
237 string s = fl_get_browser_line(dialog_->browser, sel);
238 fl_set_input(dialog_->ref, s.c_str());
242 lv_->getLyXFunc()->Dispatch(LFUN_REF_BACK);
243 fl_set_object_label(dialog_->button_go, _("Goto reference"));
245 fl_activate_object(dialog_->type);
246 fl_set_object_lcol(dialog_->type, FL_BLACK);
247 fl_activate_object(dialog_->button_go);
248 fl_set_object_lcol(dialog_->button_go, FL_BLACK);
249 fl_set_object_lcol(dialog_->ref, FL_BLACK);
255 refs = lv_->buffer()->getLabelList();
257 // fall through to...
259 fl_freeze_form(form());
261 fl_unfreeze_form(form());
264 // changed reference type
267 Type type = static_cast<Type>(
268 fl_get_choice(dialog_->type) - 1);
269 if (params.getCmdName() == getName(type)
284 FormRef::Type FormRef::getType() const
288 if (params.getCmdName() == "ref" )
291 else if (params.getCmdName() == "pageref" )
294 else if (params.getCmdName() == "vref" )
297 else if (params.getCmdName() == "vpageref" )
307 string const FormRef::getName(Type type) const