3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
13 #include FORMS_H_LOCATION
16 #pragma implementation
21 #include "support/LAssert.h"
22 #include "lyx_gui_misc.h"
26 #include "FormExternal.h"
27 #include "frontends/FileDialog.h"
29 #include "support/filetools.h"
35 FormExternal::FormExternal(LyXView * lv, Dialogs * d)
36 : FormBaseBD(lv, d, _("Edit external file"), new OkCancelReadOnlyPolicy),
37 inset_(0), ih_(0), dialog_(0)
39 d->showExternal.connect(slot(this, &FormExternal::showInset));
43 FormExternal::~FormExternal()
49 extern "C" void ExternalTemplateCB(FL_OBJECT * ob, long data)
51 FormExternal::templateCB(ob, data);
55 extern "C" void ExternalBrowseCB(FL_OBJECT * ob, long data)
57 FormExternal::browseCB(ob, data);
61 extern "C" void ExternalEditCB(FL_OBJECT * ob, long data)
63 FormExternal::editCB(ob, data);
67 extern "C" void ExternalViewCB(FL_OBJECT * ob, long data)
69 FormExternal::viewCB(ob, data);
73 extern "C" void ExternalUpdateCB(FL_OBJECT * ob, long data)
75 FormExternal::updateCB(ob, data);
79 FL_FORM * FormExternal::form() const
87 void FormExternal::connect()
89 u_ = d_->updateBufferDependent.
90 connect(slot(this, &FormExternal::updateSlot));
91 h_ = d_->hideBufferDependent.
92 connect(slot(this, &FormExternal::hide));
97 void FormExternal::disconnect()
101 FormBaseBD::disconnect();
105 void FormExternal::updateSlot(bool switched)
114 void FormExternal::showInset(InsetExternal * inset)
118 // If connected to another inset, disconnect from it.
123 params_ = inset_->params();
125 ih_ = inset->hideDialog.connect(slot(this, &FormExternal::hide));
130 void FormExternal::build()
132 dialog_ = build_external();
134 fl_addto_choice(dialog_->choice_template,
135 getTemplatesComboString().c_str());
137 // Workaround dumb xforms sizing bug
141 bc_.setOK(dialog_->button_ok);
142 bc_.setCancel(dialog_->button_cancel);
145 bc_.addReadOnly(dialog_->input_filename);
146 bc_.addReadOnly(dialog_->button_filenamebrowse);
147 bc_.addReadOnly(dialog_->input_parameters);
151 string const FormExternal::getTemplatesComboString() const
155 ExternalTemplateManager::Templates::const_iterator i1, i2;
156 i1 = ExternalTemplateManager::get().getTemplates().begin();
157 i2 = ExternalTemplateManager::get().getTemplates().end();
158 for (; i1 != i2; ++i1) {
164 result += (*i1).second.lyxName;
170 int FormExternal::getTemplateComboNumber(string const & name) const
173 ExternalTemplateManager::Templates::const_iterator i1, i2;
174 i1 = ExternalTemplateManager::get().getTemplates().begin();
175 i2 = ExternalTemplateManager::get().getTemplates().end();
176 for (; i1 != i2; ++i1) {
177 if (i1->second.lyxName == name)
181 // we can get here if a LyX document has a template not installed
187 ExternalTemplate FormExternal::getTemplate(int i) const
189 ExternalTemplateManager::Templates::const_iterator i1;
190 i1 = ExternalTemplateManager::get().getTemplates().begin();
191 for (int n = 1; n < i; ++n)
198 void FormExternal::update()
200 fl_set_input(dialog_->input_filename, params_.filename.c_str());
201 fl_set_input(dialog_->input_parameters, params_.parameters.c_str());
203 fl_set_choice(dialog_->choice_template, getTemplateComboNumber(params_.templ.lyxName));
211 void FormExternal::updateComboChange()
213 // Update the help text
214 fl_clear_browser(dialog_->browser_helptext);
215 fl_addto_browser(dialog_->browser_helptext, params_.templ.helpText.c_str());
216 fl_set_browser_topline(dialog_->browser_helptext, 0);
218 if (params_.templ.automaticProduction) {
219 fl_deactivate_object(dialog_->button_update);
220 fl_set_object_lcol(dialog_->button_update, FL_INACTIVE);
222 fl_activate_object(dialog_->button_update);
223 fl_set_object_lcol(dialog_->button_update, FL_BLACK);
228 bool FormExternal::input(FL_OBJECT *, long)
230 // FIXME: anything to do here ?
235 void FormExternal::apply()
239 if (lv_->buffer()->isReadonly())
242 params_.filename = fl_get_input(dialog_->input_filename);
243 params_.parameters = fl_get_input(dialog_->input_parameters);
244 params_.templ = getTemplate(fl_get_choice(dialog_->choice_template));
246 inset_->setFromParams(params_);
247 lv_->view()->updateInset(inset_, true);
251 void FormExternal::templateCB(FL_OBJECT * ob, long)
253 FormExternal * form = static_cast<FormExternal*>(ob->form->u_vdata);
255 // set to the chosen template
256 form->params_.templ = form->getTemplate(fl_get_choice(form->dialog_->choice_template));
258 form->updateComboChange();
262 void FormExternal::browseCB(FL_OBJECT * ob, long)
264 FormExternal * form = static_cast<FormExternal*>(ob->form->u_vdata);
266 static string current_path;
269 string p = fl_get_input(form->dialog_->input_filename);
270 string buf = MakeAbsPath(form->lv_->buffer()->fileName());
271 string buf2 = OnlyPath(buf);
274 buf = MakeAbsPath(p, buf2);
277 buf = OnlyPath(form->lv_->buffer()->fileName());
280 FileDialog fileDlg(form->lv_, _("Select external file"),
281 LFUN_SELECT_FILE_SYNC,
282 make_pair(string(_("Document")), string(buf)));
284 /// Determine the template file extension
285 ExternalTemplate const & et = form->params_.templ;
287 string regexp = et.fileRegExp;
291 // FIXME: a temporary hack until the FileDialog interface is updated
295 string const path = (once) ? current_path : buf;
296 FileDialog::Result result = fileDlg.Select(path, regexp, fl_get_input(form->dialog_->input_filename));
298 if (result.second.empty())
301 string p = result.second;
303 buf = MakeRelPath(p, buf2);
304 current_path = OnlyPath(p);
307 if (contains(p, "#") || contains(p, "~") || contains(p, "$")
308 || contains(p, "%")) {
309 WriteAlert(_("Filename can't contain any "
310 "of these characters:"),
311 // xgettext:no-c-format
312 _("'#', '~', '$' or '%'."));
317 fl_set_input(form->dialog_->input_filename, buf.c_str());
321 void FormExternal::editCB(FL_OBJECT * ob, long)
323 FormExternal * form = static_cast<FormExternal*>(ob->form->u_vdata);
326 form->inset_->editExternal();
330 void FormExternal::viewCB(FL_OBJECT * ob, long)
332 FormExternal * form = static_cast<FormExternal*>(ob->form->u_vdata);
335 form->inset_->viewExternal();
339 void FormExternal::updateCB(FL_OBJECT * ob, long)
341 FormExternal * form = static_cast<FormExternal*>(ob->form->u_vdata);
344 form->inset_->updateExternal();