1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 2000-2001 The LyX Team.
8 * ======================================================
11 * \author Angus Leeming, a.leeming@ic.ac.uk
18 #pragma implementation
22 #include "ControlRef.h"
25 #include "xforms_helpers.h"
26 #include "insets/insetref.h"
27 #include "helper_funcs.h" // getStringFromVector
28 #include "support/lstrings.h" // frontStrip, strip
35 typedef FormCB<ControlRef, FormDB<FD_form_ref> > base_class;
37 FormRef::FormRef(ControlRef & c)
38 : base_class(c, _("Reference")),
45 dialog_.reset(build_ref());
47 for (int i = 0; !InsetRef::types[i].latex_name.empty(); ++i)
48 fl_addto_choice(dialog_->type,
49 _(InsetRef::types[i].gui_name.c_str()));
51 // Force the user to use the browser to change refs.
52 fl_deactivate_object(dialog_->ref);
54 // Manage the ok and cancel/close buttons
55 bc().setOK(dialog_->button_ok);
56 bc().setApply(dialog_->button_apply);
57 bc().setCancel(dialog_->button_cancel);
58 bc().setRestore(dialog_->button_restore);
60 bc().addReadOnly(dialog_->button_update);
61 bc().addReadOnly(dialog_->name);
62 bc().addReadOnly(dialog_->ref);
66 void FormRef::update()
68 fl_set_input(dialog_->ref,
69 controller().params().getContents().c_str());
70 fl_set_input(dialog_->name,
71 controller().params().getOptions().c_str());
72 fl_set_choice(dialog_->type,
73 InsetRef::getType(controller().params().getCmdName()) + 1);
76 fl_set_object_label(dialog_->button_go, _("Go to reference"));
78 // Name is irrelevant to LaTeX/Literate documents
79 if (controller().docType() == ControlRef::LATEX ||
80 controller().docType() == ControlRef::LITERATE) {
81 setEnabled(dialog_->name, false);
83 setEnabled(dialog_->name, true);
86 // type is irrelevant to LinuxDoc/DocBook.
87 if (controller().docType() == ControlRef::LINUXDOC ||
88 controller().docType() == ControlRef::DOCBOOK) {
89 fl_set_choice(dialog_->type, 1);
90 setEnabled(dialog_->type, false);
92 setEnabled(dialog_->type, true);
96 " " + getStringFromVector(controller().getBufferList(), " | ") + " ";
97 fl_clear_choice(dialog_->buffer);
98 fl_addto_choice(dialog_->buffer, choice.c_str());
99 fl_set_choice(dialog_->buffer, controller().getBufferNum() + 1);
101 refs_ = controller().getLabelList(string());
102 updateBrowser(refs_);
106 void FormRef::updateBrowser(vector<string> const & akeys) const
108 vector<string> keys(akeys);
109 if (fl_get_button(dialog_->sort))
110 sort(keys.begin(), keys.end());
112 fl_clear_browser(dialog_->browser);
113 for (vector<string>::const_iterator it = keys.begin();
114 it != keys.end(); ++it)
115 fl_add_browser_line(dialog_->browser, it->c_str());
118 fl_add_browser_line(dialog_->browser,
119 _("*** No labels found in document ***"));
121 setEnabled(dialog_->browser, false);
122 setEnabled(dialog_->sort, false);
124 fl_set_input(dialog_->ref, "");
126 setEnabled(dialog_->browser, true);
127 setEnabled(dialog_->sort, true);
129 string ref = fl_get_input(dialog_->ref);
130 vector<string>::const_iterator cit = (ref.empty())
132 : find(keys.begin(), keys.end(), ref);
133 if (cit == keys.end()) {
134 fl_deselect_browser(dialog_->browser);
137 fl_set_input(dialog_->ref, cit->c_str());
139 int const i = static_cast<int>(cit - keys.begin());
140 fl_set_browser_topline(dialog_->browser, max(i-5, 1));
141 fl_select_browser_line(dialog_->browser, i+1);
147 void FormRef::apply()
149 int const type = fl_get_choice(dialog_->type) - 1;
150 controller().params().setCmdName(InsetRef::getName(type));
152 controller().params().setOptions(fl_get_input(dialog_->name));
153 controller().params().setContents(fl_get_input(dialog_->ref));
157 ButtonPolicy::SMInput FormRef::input(FL_OBJECT * ob, long)
159 ButtonPolicy::SMInput activate(ButtonPolicy::SMI_VALID);
161 if (ob == dialog_->button_go) {
162 // goto reference / go back
165 activate = ButtonPolicy::SMI_NOOP;
169 controller().gotoRef(fl_get_input(dialog_->ref));
170 fl_set_object_label(dialog_->button_go, _("Go back"));
172 controller().gotoBookmark();
173 fl_set_object_label(dialog_->button_go,
174 _("Go to reference"));
177 } else if (ob == dialog_->browser) {
179 unsigned int sel = fl_get_browser(dialog_->browser);
180 if (sel < 1 || sel > refs_.size())
181 return ButtonPolicy::SMI_NOOP;
183 if (!controller().isReadonly()) {
184 string s = fl_get_browser_line(dialog_->browser, sel);
185 fl_set_input(dialog_->ref, s.c_str());
189 controller().gotoBookmark();
191 fl_set_object_label(dialog_->button_go, _("Go to reference"));
193 setEnabled(dialog_->type, true);
194 setEnabled(dialog_->button_go, true);
195 fl_set_object_lcol(dialog_->ref, FL_BLACK);
197 } else if (ob == dialog_->button_update ||
198 ob == dialog_->sort ||
199 ob == dialog_->buffer) {
201 if (ob == dialog_->button_update ||
202 ob == dialog_->buffer) {
204 frontStrip(strip(fl_get_choice_text(dialog_->buffer)));
205 refs_ = controller().getLabelList(name);
208 fl_freeze_form(form());
209 updateBrowser(refs_);
210 fl_unfreeze_form(form());
212 } else if (ob == dialog_->type) {
214 int const type = fl_get_choice(dialog_->type) - 1;
215 if (controller().params().getCmdName() ==
216 InsetRef::getName(type)) {
217 activate = ButtonPolicy::SMI_NOOP;