/** * \file FormExternal.C * Copyright 2001 the LyX Team * Read the file COPYING * * \author unknown * \author John Levon */ #include #include #include FORMS_H_LOCATION #ifdef __GNUG__ #pragma implementation #endif #include "debug.h" #include "gettext.h" #include "support/LAssert.h" #include "lyx_gui_misc.h" #include "Dialogs.h" #include "LyXView.h" #include "buffer.h" #include "FormExternal.h" #include "frontends/FileDialog.h" #include "LString.h" #include "support/filetools.h" using std::pair; using std::make_pair; using std::endl; FormExternal::FormExternal(LyXView * lv, Dialogs * d) : FormBaseBD(lv, d, _("Edit external file"), new OkCancelReadOnlyPolicy), inset_(0), ih_(0), dialog_(0) { d->showExternal.connect(slot(this, &FormExternal::showInset)); } FormExternal::~FormExternal() { delete dialog_; } extern "C" void ExternalTemplateCB(FL_OBJECT * ob, long data) { FormExternal::templateCB(ob, data); } extern "C" void ExternalBrowseCB(FL_OBJECT * ob, long data) { FormExternal::browseCB(ob, data); } extern "C" void ExternalEditCB(FL_OBJECT * ob, long data) { FormExternal::editCB(ob, data); } extern "C" void ExternalViewCB(FL_OBJECT * ob, long data) { FormExternal::viewCB(ob, data); } extern "C" void ExternalUpdateCB(FL_OBJECT * ob, long data) { FormExternal::updateCB(ob, data); } FL_FORM * FormExternal::form() const { if (dialog_) return dialog_->form; return 0; } void FormExternal::connect() { u_ = d_->updateBufferDependent. connect(slot(this, &FormExternal::updateSlot)); h_ = d_->hideBufferDependent. connect(slot(this, &FormExternal::hide)); FormBase::connect(); } void FormExternal::disconnect() { inset_ = 0; ih_.disconnect(); FormBaseBD::disconnect(); } void FormExternal::updateSlot(bool switched) { if (switched) hide(); else update(); } void FormExternal::showInset(InsetExternal * inset) { Assert(inset); // If connected to another inset, disconnect from it. if (inset_) ih_.disconnect(); inset_ = inset; params_ = inset_->params(); ih_ = inset->hideDialog.connect(slot(this, &FormExternal::hide)); show(); } void FormExternal::build() { dialog_ = build_external(); fl_addto_choice(dialog_->choice_template, getTemplatesComboString().c_str()); // Workaround dumb xforms sizing bug minw_ = form()->w; minh_ = form()->h; bc_.setOK(dialog_->button_ok); bc_.setCancel(dialog_->button_cancel); bc_.refresh(); bc_.addReadOnly(dialog_->input_filename); bc_.addReadOnly(dialog_->button_filenamebrowse); bc_.addReadOnly(dialog_->input_parameters); } string const FormExternal::getTemplatesComboString() const { string result; bool first = true; ExternalTemplateManager::Templates::const_iterator i1, i2; i1 = ExternalTemplateManager::get().getTemplates().begin(); i2 = ExternalTemplateManager::get().getTemplates().end(); for (; i1 != i2; ++i1) { if (!first) result += "|"; else first = false; result += (*i1).second.lyxName; } return result; } int FormExternal::getTemplateComboNumber(string const & name) const { int i = 1; ExternalTemplateManager::Templates::const_iterator i1, i2; i1 = ExternalTemplateManager::get().getTemplates().begin(); i2 = ExternalTemplateManager::get().getTemplates().end(); for (; i1 != i2; ++i1) { if (i1->second.lyxName == name) return i; ++i; } // we can get here if a LyX document has a template not installed // on this machine. return 0; } ExternalTemplate FormExternal::getTemplate(int i) const { ExternalTemplateManager::Templates::const_iterator i1; i1 = ExternalTemplateManager::get().getTemplates().begin(); for (int n = 1; n < i; ++n) ++i1; return (*i1).second; } void FormExternal::update() { fl_set_input(dialog_->input_filename, params_.filename.c_str()); fl_set_input(dialog_->input_parameters, params_.parameters.c_str()); fl_set_choice(dialog_->choice_template, getTemplateComboNumber(params_.templ.lyxName)); updateComboChange(); bc_.valid(); } void FormExternal::updateComboChange() { // Update the help text fl_clear_browser(dialog_->browser_helptext); fl_addto_browser(dialog_->browser_helptext, params_.templ.helpText.c_str()); fl_set_browser_topline(dialog_->browser_helptext, 0); if (params_.templ.automaticProduction) { fl_deactivate_object(dialog_->button_update); fl_set_object_lcol(dialog_->button_update, FL_INACTIVE); } else { fl_activate_object(dialog_->button_update); fl_set_object_lcol(dialog_->button_update, FL_BLACK); } } bool FormExternal::input(FL_OBJECT *, long) { // FIXME: anything to do here ? return true; } void FormExternal::apply() { Assert(inset_); if (lv_->buffer()->isReadonly()) return; params_.filename = fl_get_input(dialog_->input_filename); params_.parameters = fl_get_input(dialog_->input_parameters); params_.templ = getTemplate(fl_get_choice(dialog_->choice_template)); inset_->setFromParams(params_); lv_->view()->updateInset(inset_, true); } void FormExternal::templateCB(FL_OBJECT * ob, long) { FormExternal * form = static_cast(ob->form->u_vdata); // set to the chosen template form->params_.templ = form->getTemplate(fl_get_choice(form->dialog_->choice_template)); form->updateComboChange(); } void FormExternal::browseCB(FL_OBJECT * ob, long) { FormExternal * form = static_cast(ob->form->u_vdata); static string current_path; static int once = 0; string p = fl_get_input(form->dialog_->input_filename); string buf = MakeAbsPath(form->lv_->buffer()->fileName()); string buf2 = OnlyPath(buf); if (!p.empty()) { buf = MakeAbsPath(p, buf2); buf = OnlyPath(buf); } else { buf = OnlyPath(form->lv_->buffer()->fileName()); } FileDialog fileDlg(form->lv_, _("Select external file"), LFUN_SELECT_FILE_SYNC, make_pair(string(_("Document")), string(buf))); /// Determine the template file extension ExternalTemplate const & et = form->params_.templ; string regexp = et.fileRegExp; if (regexp.empty()) regexp = "*"; // FIXME: a temporary hack until the FileDialog interface is updated regexp += "|"; while (1) { string const path = (once) ? current_path : buf; FileDialog::Result result = fileDlg.Select(path, regexp, fl_get_input(form->dialog_->input_filename)); if (result.second.empty()) return; string p = result.second; buf = MakeRelPath(p, buf2); current_path = OnlyPath(p); once = 1; if (contains(p, "#") || contains(p, "~") || contains(p, "$") || contains(p, "%")) { WriteAlert(_("Filename can't contain any " "of these characters:"), // xgettext:no-c-format _("'#', '~', '$' or '%'.")); } else break; } fl_set_input(form->dialog_->input_filename, buf.c_str()); } void FormExternal::editCB(FL_OBJECT * ob, long) { FormExternal * form = static_cast(ob->form->u_vdata); form->apply(); form->inset_->editExternal(); } void FormExternal::viewCB(FL_OBJECT * ob, long) { FormExternal * form = static_cast(ob->form->u_vdata); form->apply(); form->inset_->viewExternal(); } void FormExternal::updateCB(FL_OBJECT * ob, long) { FormExternal * form = static_cast(ob->form->u_vdata); form->apply(); form->inset_->updateExternal(); }