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
27 #include "insets/insetref.h"
36 FormRef::FormRef(LyXView * lv, Dialogs * d)
37 : FormCommand(lv, d, _("Reference"), new NoRepeatedApplyPolicy),
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::disconnect()
64 FormCommand::disconnect();
70 dialog_ = build_ref();
72 for (int i = 0; !InsetRef::types[i].latex_name.empty(); ++i)
73 fl_addto_choice(dialog_->type,
74 _(InsetRef::types[i].gui_name.c_str()));
76 // Workaround dumb xforms sizing bug
80 // Force the user to use the browser to change refs.
81 fl_deactivate_object(dialog_->ref);
83 // Manage the ok and cancel/close buttons
84 bc_.setOK(dialog_->button_ok);
85 bc_.setApply(dialog_->button_apply);
86 bc_.setCancel(dialog_->button_cancel);
87 bc_.setUndoAll(dialog_->button_restore);
90 #warning I had to uncomment this so the buttons could be disabled in update() (dekel)
91 //bc_.addReadOnly(dialog_->type);
92 //bc_.addReadOnly(dialog_->name);
96 void FormRef::update()
99 fl_set_input(dialog_->ref, params.getContents().c_str());
100 fl_set_input(dialog_->name, params.getOptions().c_str());
101 fl_set_choice(dialog_->type,
102 InsetRef::getType(params.getCmdName()) + 1);
105 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_SAVE, "0");
108 fl_set_object_label(dialog_->button_go, _("Goto reference"));
110 // Name is irrelevant to LaTeX/Literate documents, while
111 // type is irrelevant to LinuxDoc/DocBook.
112 if (lv_->buffer()->isLatex() || lv_->buffer()->isLatex()) {
113 fl_deactivate_object(dialog_->name);
114 fl_set_object_lcol(dialog_->name, FL_INACTIVE);
115 fl_activate_object(dialog_->type);
116 fl_set_object_lcol(dialog_->type, FL_BLACK);
118 fl_set_choice(dialog_->type, 1);
120 fl_activate_object(dialog_->name);
121 fl_set_object_lcol(dialog_->name, FL_BLACK);
122 fl_deactivate_object(dialog_->type);
123 fl_set_object_lcol(dialog_->type, FL_INACTIVE);
126 refs = lv_->buffer()->getLabelList();
129 bc_.readOnly(lv_->buffer()->isReadonly());
133 void FormRef::updateBrowser(vector<string> const & akeys) const
135 vector<string> keys(akeys);
136 if (fl_get_button(dialog_->sort))
137 sort(keys.begin(), keys.end());
139 fl_clear_browser(dialog_->browser);
140 for (vector<string>::const_iterator it = keys.begin();
141 it != keys.end(); ++it)
142 fl_add_browser_line(dialog_->browser, (*it).c_str());
145 fl_add_browser_line(dialog_->browser,
146 _("*** No labels found in document ***"));
148 fl_deactivate_object(dialog_->browser);
149 fl_deactivate_object(dialog_->sort);
150 fl_set_object_lcol(dialog_->browser, FL_INACTIVE);
151 fl_set_object_lcol(dialog_->sort, FL_INACTIVE);
152 fl_set_input(dialog_->ref, "");
154 fl_activate_object(dialog_->browser);
155 fl_set_object_lcol(dialog_->browser, FL_BLACK);
156 fl_activate_object(dialog_->sort);
157 fl_set_object_lcol(dialog_->sort, FL_BLACK);
159 string ref = fl_get_input(dialog_->ref);
160 vector<string>::const_iterator cit =
161 find(keys.begin(), keys.end(), ref);
162 if (cit == keys.end()) {
164 fl_set_input(dialog_->ref, (*cit).c_str());
165 } else if (ref.empty())
166 fl_set_input(dialog_->ref, (*cit).c_str());
168 int const i = static_cast<int>(cit - keys.begin());
169 fl_set_browser_topline(dialog_->browser, max(i-5, 1));
170 fl_select_browser_line(dialog_->browser, i+1);
175 void FormRef::apply()
177 if (!lv_->view()->available())
180 int const type = fl_get_choice(dialog_->type) - 1;
181 params.setCmdName(InsetRef::getName(type));
183 params.setOptions(fl_get_input(dialog_->name));
184 params.setContents(fl_get_input(dialog_->ref));
187 // Only update if contents have changed
188 if (params != inset_->params()) {
189 inset_->setParams(params);
190 lv_->view()->updateInset(inset_, true);
193 lv_->getLyXFunc()->Dispatch(LFUN_REF_INSERT,
194 params.getAsString());
195 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_SAVE, "0");
200 bool FormRef::input(FL_OBJECT *, long data)
204 // goto reference / go back
210 toggle = static_cast<Goto>(toggle + 1);
211 if (toggle == GOFIRST ) toggle = GOREF;
217 Dispatch(LFUN_REF_GOTO,
218 fl_get_input(dialog_->ref));
219 fl_set_object_label(dialog_->button_go, _("Go back"));
225 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
226 fl_set_object_label(dialog_->button_go,
227 _("Goto reference"));
237 // choose browser key
240 unsigned int sel = fl_get_browser(dialog_->browser);
241 if (sel < 1 || sel > refs.size()) break;
243 if (!lv_->buffer()->isReadonly()) {
244 string s = fl_get_browser_line(dialog_->browser, sel);
245 fl_set_input(dialog_->ref, s.c_str());
249 lv_->getLyXFunc()->Dispatch(LFUN_BOOKMARK_GOTO, "0");
250 fl_set_object_label(dialog_->button_go, _("Goto reference"));
252 fl_activate_object(dialog_->type);
253 fl_set_object_lcol(dialog_->type, FL_BLACK);
254 fl_activate_object(dialog_->button_go);
255 fl_set_object_lcol(dialog_->button_go, FL_BLACK);
256 fl_set_object_lcol(dialog_->ref, FL_BLACK);
262 refs = lv_->buffer()->getLabelList();
264 // fall through to...
266 fl_freeze_form(form());
268 fl_unfreeze_form(form());
271 // changed reference type
274 int const type = fl_get_choice(dialog_->type) - 1;
275 if (params.getCmdName() == InsetRef::getName(type) && inset_) {