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"
37 FormRef::FormRef(LyXView * lv, Dialogs * d)
38 : FormCommand(lv, d, _("Reference"), new NoRepeatedApplyPolicy),
39 at_ref(false), dialog_(0)
41 // let the dialog be shown
42 // These are permanent connections so we won't bother
43 // storing a copy because we won't be disconnecting.
44 d->showRef.connect(slot(this, &FormRef::showInset));
45 d->createRef.connect(slot(this, &FormRef::createInset));
55 FL_FORM * FormRef::form() const
57 if (dialog_) return dialog_->form;
62 void FormRef::disconnect()
65 FormCommand::disconnect();
71 dialog_ = build_ref();
73 for (int i = 0; !InsetRef::types[i].latex_name.empty(); ++i)
74 fl_addto_choice(dialog_->type,
75 _(InsetRef::types[i].gui_name.c_str()));
77 // Workaround dumb xforms sizing bug
81 // Force the user to use the browser to change refs.
82 fl_deactivate_object(dialog_->ref);
84 // Manage the ok and cancel/close buttons
85 bc_.setOK(dialog_->button_ok);
86 bc_.setApply(dialog_->button_apply);
87 bc_.setCancel(dialog_->button_cancel);
88 bc_.setUndoAll(dialog_->button_restore);
91 #warning I had to uncomment this so the buttons could be disabled in update() (dekel)
92 //bc_.addReadOnly(dialog_->type);
93 //bc_.addReadOnly(dialog_->name);
97 void FormRef::update()
100 fl_set_input(dialog_->ref, params.getContents().c_str());
101 fl_set_input(dialog_->name, params.getOptions().c_str());
102 fl_set_choice(dialog_->type,
103 InsetRef::getType(params.getCmdName()) + 1);
107 fl_set_object_label(dialog_->button_go, _("Goto reference"));
109 // Name is irrelevant to LaTeX/Literate documents, while
110 // type is irrelevant to LinuxDoc/DocBook.
111 if (lv_->buffer()->isLatex() || lv_->buffer()->isLatex()) {
112 setEnabled(dialog_->name, false);
113 setEnabled(dialog_->type, true);
115 fl_set_choice(dialog_->type, 1);
117 setEnabled(dialog_->name, true);
118 setEnabled(dialog_->type, false);
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 setEnabled(dialog_->browser, false);
144 setEnabled(dialog_->sort, false);
146 fl_set_input(dialog_->ref, "");
148 setEnabled(dialog_->browser, true);
149 setEnabled(dialog_->sort, true);
151 string ref = fl_get_input(dialog_->ref);
152 vector<string>::const_iterator cit =
153 find(keys.begin(), keys.end(), ref);
154 if (cit == keys.end()) {
156 fl_set_input(dialog_->ref, (*cit).c_str());
157 } else if (ref.empty())
158 fl_set_input(dialog_->ref, (*cit).c_str());
160 int const i = static_cast<int>(cit - keys.begin());
161 fl_set_browser_topline(dialog_->browser, max(i-5, 1));
162 fl_select_browser_line(dialog_->browser, i+1);
167 void FormRef::apply()
169 if (!lv_->view()->available())
172 int const type = fl_get_choice(dialog_->type) - 1;
173 params.setCmdName(InsetRef::getName(type));
175 params.setOptions(fl_get_input(dialog_->name));
176 params.setContents(fl_get_input(dialog_->ref));
179 // Only update if contents have changed
180 if (params != inset_->params()) {
181 inset_->setParams(params);
182 lv_->view()->updateInset(inset_, true);
185 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT,
186 params.getAsString());
191 bool FormRef::input(FL_OBJECT *, long data)
195 // goto reference / go back
203 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_SAVE, "0");
205 Dispatch(LFUN_REF_GOTO,
206 fl_get_input(dialog_->ref));
207 fl_set_object_label(dialog_->button_go, _("Go back"));
209 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
210 fl_set_object_label(dialog_->button_go,
211 _("Goto reference"));
216 // choose browser key
219 unsigned int sel = fl_get_browser(dialog_->browser);
220 if (sel < 1 || sel > refs.size()) break;
222 if (!lv_->buffer()->isReadonly()) {
223 string s = fl_get_browser_line(dialog_->browser, sel);
224 fl_set_input(dialog_->ref, s.c_str());
228 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
230 fl_set_object_label(dialog_->button_go, _("Goto reference"));
232 setEnabled(dialog_->type, true);
233 setEnabled(dialog_->button_go, true);
234 fl_set_object_lcol(dialog_->ref, FL_BLACK);
240 refs = lv_->buffer()->getLabelList();
242 // fall through to...
244 fl_freeze_form(form());
246 fl_unfreeze_form(form());
249 // changed reference type
252 int const type = fl_get_choice(dialog_->type) - 1;
253 if (params.getCmdName() == InsetRef::getName(type) && inset_) {