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 // Force the user to use the browser to change refs.
74 fl_deactivate_object(dialog_->ref);
76 // Manage the ok and cancel/close buttons
77 bc().setOK(dialog_->button_ok);
78 bc().setApply(dialog_->button_apply);
79 bc().setCancel(dialog_->button_cancel);
80 bc().setUndoAll(dialog_->button_restore);
83 #warning I had to uncomment this so the buttons could be disabled in update() (dekel)
84 //bc().addReadOnly(dialog_->type);
85 //bc().addReadOnly(dialog_->name);
89 void FormRef::update()
92 fl_set_input(dialog_->ref, params.getContents().c_str());
93 fl_set_input(dialog_->name, params.getOptions().c_str());
94 fl_set_choice(dialog_->type,
95 InsetRef::getType(params.getCmdName()) + 1);
99 fl_set_object_label(dialog_->button_go, _("Goto reference"));
101 // Name is irrelevant to LaTeX/Literate documents, while
102 // type is irrelevant to LinuxDoc/DocBook.
103 if (lv_->buffer()->isLatex() || lv_->buffer()->isLatex()) {
104 setEnabled(dialog_->name, false);
105 setEnabled(dialog_->type, true);
107 fl_set_choice(dialog_->type, 1);
109 setEnabled(dialog_->name, true);
110 setEnabled(dialog_->type, false);
113 refs = lv_->buffer()->getLabelList();
116 bc().readOnly(lv_->buffer()->isReadonly());
120 void FormRef::updateBrowser(vector<string> const & akeys) const
122 vector<string> keys(akeys);
123 if (fl_get_button(dialog_->sort))
124 sort(keys.begin(), keys.end());
126 fl_clear_browser(dialog_->browser);
127 for (vector<string>::const_iterator it = keys.begin();
128 it != keys.end(); ++it)
129 fl_add_browser_line(dialog_->browser, (*it).c_str());
132 fl_add_browser_line(dialog_->browser,
133 _("*** No labels found in document ***"));
135 setEnabled(dialog_->browser, false);
136 setEnabled(dialog_->sort, false);
138 fl_set_input(dialog_->ref, "");
140 setEnabled(dialog_->browser, true);
141 setEnabled(dialog_->sort, true);
143 string ref = fl_get_input(dialog_->ref);
144 vector<string>::const_iterator cit =
145 find(keys.begin(), keys.end(), ref);
146 if (cit == keys.end()) {
148 fl_set_input(dialog_->ref, (*cit).c_str());
149 } else if (ref.empty())
150 fl_set_input(dialog_->ref, (*cit).c_str());
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);
159 void FormRef::apply()
161 if (!lv_->view()->available())
164 int const type = fl_get_choice(dialog_->type) - 1;
165 params.setCmdName(InsetRef::getName(type));
167 params.setOptions(fl_get_input(dialog_->name));
168 params.setContents(fl_get_input(dialog_->ref));
171 // Only update if contents have changed
172 if (params != inset_->params()) {
173 inset_->setParams(params);
174 lv_->view()->updateInset(inset_, true);
177 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT,
178 params.getAsString());
183 bool FormRef::input(FL_OBJECT *, long data)
187 // goto reference / go back
195 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_SAVE, "0");
197 Dispatch(LFUN_REF_GOTO,
198 fl_get_input(dialog_->ref));
199 fl_set_object_label(dialog_->button_go, _("Go back"));
201 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
202 fl_set_object_label(dialog_->button_go,
203 _("Goto reference"));
208 // choose browser key
211 unsigned int sel = fl_get_browser(dialog_->browser);
212 if (sel < 1 || sel > refs.size()) break;
214 if (!lv_->buffer()->isReadonly()) {
215 string s = fl_get_browser_line(dialog_->browser, sel);
216 fl_set_input(dialog_->ref, s.c_str());
220 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
222 fl_set_object_label(dialog_->button_go, _("Goto reference"));
224 setEnabled(dialog_->type, true);
225 setEnabled(dialog_->button_go, true);
226 fl_set_object_lcol(dialog_->ref, FL_BLACK);
232 refs = lv_->buffer()->getLabelList();
234 // fall through to...
236 fl_freeze_form(form());
238 fl_unfreeze_form(form());
241 // changed reference type
244 int const type = fl_get_choice(dialog_->type) - 1;
245 if (params.getCmdName() == InsetRef::getName(type) && inset_) {