2 /* This file is part of
3 * ======================================================
5 * LyX, The Document Processor
7 * Copyright 2000 The LyX Team.
9 * ======================================================
15 #include FORMS_H_LOCATION
18 #pragma implementation
27 #include "insets/insetref.h"
28 #include "xforms_helpers.h"
38 FormRef::FormRef(LyXView * lv, Dialogs * d)
39 : FormCommand(lv, d, _("Reference")),
42 // let the dialog be shown
43 // These are permanent connections so we won't bother
44 // storing a copy because we won't be disconnecting.
45 d->showRef.connect(slot(this, &FormRef::showInset));
46 d->createRef.connect(slot(this, &FormRef::createInset));
50 FL_FORM * FormRef::form() const
58 void FormRef::disconnect()
61 FormCommand::disconnect();
67 dialog_.reset(build_ref());
69 for (int i = 0; !InsetRef::types[i].latex_name.empty(); ++i)
70 fl_addto_choice(dialog_->type,
71 _(InsetRef::types[i].gui_name.c_str()));
73 // Workaround dumb xforms sizing bug
77 // Force the user to use the browser to change refs.
78 fl_deactivate_object(dialog_->ref);
80 // Manage the ok and cancel/close buttons
81 bc().setOK(dialog_->button_ok);
82 bc().setApply(dialog_->button_apply);
83 bc().setCancel(dialog_->button_cancel);
84 bc().setUndoAll(dialog_->button_restore);
87 #warning I had to uncomment this so the buttons could be disabled in update() (dekel)
88 //bc().addReadOnly(dialog_->type);
89 //bc().addReadOnly(dialog_->name);
93 void FormRef::update()
96 fl_set_input(dialog_->ref, params.getContents().c_str());
97 fl_set_input(dialog_->name, params.getOptions().c_str());
98 fl_set_choice(dialog_->type,
99 InsetRef::getType(params.getCmdName()) + 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 setEnabled(dialog_->name, false);
109 setEnabled(dialog_->type, true);
111 fl_set_choice(dialog_->type, 1);
113 setEnabled(dialog_->name, true);
114 setEnabled(dialog_->type, false);
117 refs = lv_->buffer()->getLabelList();
120 bc().readOnly(lv_->buffer()->isReadonly());
124 void FormRef::updateBrowser(vector<string> const & akeys) const
126 vector<string> keys(akeys);
127 if (fl_get_button(dialog_->sort))
128 sort(keys.begin(), keys.end());
130 fl_clear_browser(dialog_->browser);
131 for (vector<string>::const_iterator it = keys.begin();
132 it != keys.end(); ++it)
133 fl_add_browser_line(dialog_->browser, (*it).c_str());
136 fl_add_browser_line(dialog_->browser,
137 _("*** No labels found in document ***"));
139 setEnabled(dialog_->browser, false);
140 setEnabled(dialog_->sort, false);
142 fl_set_input(dialog_->ref, "");
144 setEnabled(dialog_->browser, true);
145 setEnabled(dialog_->sort, true);
147 string ref = fl_get_input(dialog_->ref);
148 vector<string>::const_iterator cit =
149 find(keys.begin(), keys.end(), ref);
150 if (cit == keys.end()) {
152 fl_set_input(dialog_->ref, (*cit).c_str());
153 } else if (ref.empty())
154 fl_set_input(dialog_->ref, (*cit).c_str());
156 int const i = static_cast<int>(cit - keys.begin());
157 fl_set_browser_topline(dialog_->browser, max(i-5, 1));
158 fl_select_browser_line(dialog_->browser, i+1);
163 void FormRef::apply()
165 if (!lv_->view()->available())
168 int const type = fl_get_choice(dialog_->type) - 1;
169 params.setCmdName(InsetRef::getName(type));
171 params.setOptions(fl_get_input(dialog_->name));
172 params.setContents(fl_get_input(dialog_->ref));
175 // Only update if contents have changed
176 if (params != inset_->params()) {
177 inset_->setParams(params);
178 lv_->view()->updateInset(inset_, true);
181 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT,
182 params.getAsString());
187 bool FormRef::input(FL_OBJECT *, long data)
191 // goto reference / go back
199 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_SAVE, "0");
201 Dispatch(LFUN_REF_GOTO,
202 fl_get_input(dialog_->ref));
203 fl_set_object_label(dialog_->button_go, _("Go back"));
205 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
206 fl_set_object_label(dialog_->button_go,
207 _("Goto reference"));
212 // choose browser key
215 unsigned int sel = fl_get_browser(dialog_->browser);
216 if (sel < 1 || sel > refs.size()) break;
218 if (!lv_->buffer()->isReadonly()) {
219 string s = fl_get_browser_line(dialog_->browser, sel);
220 fl_set_input(dialog_->ref, s.c_str());
224 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
226 fl_set_object_label(dialog_->button_go, _("Goto reference"));
228 setEnabled(dialog_->type, true);
229 setEnabled(dialog_->button_go, true);
230 fl_set_object_lcol(dialog_->ref, FL_BLACK);
236 refs = lv_->buffer()->getLabelList();
238 // fall through to...
240 fl_freeze_form(form());
242 fl_unfreeze_form(form());
245 // changed reference type
248 int const type = fl_get_choice(dialog_->type) - 1;
249 if (params.getCmdName() == InsetRef::getName(type) && inset_) {