X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiExternal.cpp;h=38443e8db5d30872f70a7a4888a6d84d67165084;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=44ffefd58a498fa7384c7af778f4412e32f3c912;hpb=212386be8a1573fb52b5da718961835816a3c8e2;p=lyx.git diff --git a/src/frontends/qt4/GuiExternal.cpp b/src/frontends/qt4/GuiExternal.cpp index 44ffefd58a..38443e8db5 100644 --- a/src/frontends/qt4/GuiExternal.cpp +++ b/src/frontends/qt4/GuiExternal.cpp @@ -5,110 +5,140 @@ * * \author John Levon * \author Angus Leeming + * \author Asger Alstrup * * Full author contact details are available in file CREDITS. */ #include -#include "lengthcommon.h" +#include "GuiExternal.h" + +#include "FuncRequest.h" +#include "support/gettext.h" +#include "Length.h" #include "LyXRC.h" +#include "insets/ExternalSupport.h" #include "insets/ExternalTemplate.h" #include "insets/InsetExternal.h" -#include "support/lstrings.h" +#include "graphics/GraphicsCache.h" +#include "graphics/GraphicsCacheItem.h" +#include "graphics/GraphicsImage.h" + #include "support/convert.h" -#include "support/os.h" +#include "support/filetools.h" +#include "support/lstrings.h" #include "support/lyxlib.h" - -#include "GuiExternal.h" +#include "support/os.h" #include "LengthCombo.h" #include "qt_helpers.h" #include "Validator.h" +#include +#include #include #include -#include #include #include -namespace external = lyx::external; - -using lyx::support::isStrDbl; -using lyx::support::token; -using lyx::support::trim; -using lyx::support::float_equal; +using namespace std; +using namespace lyx::support; -using lyx::support::os::internal_path; +namespace lyx { +namespace frontend { -using std::string; -using std::vector; -using std::find; +using namespace external; +namespace { -namespace lyx { -namespace frontend { +RotationDataType origins[] = { + RotationData::DEFAULT, + RotationData::TOPLEFT, + RotationData::BOTTOMLEFT, + RotationData::BASELINELEFT, + RotationData::CENTER, + RotationData::TOPCENTER, + RotationData::BOTTOMCENTER, + RotationData::BASELINECENTER, + RotationData::TOPRIGHT, + RotationData::BOTTOMRIGHT, + RotationData::BASELINERIGHT +}; + + +// These are the strings, corresponding to the above, that the GUI should +// use. Note that they can/should be translated. +char const * const origin_gui_strs[] = { + N_("Default"), + N_("Top left"), N_("Bottom left"), N_("Baseline left"), + N_("Center"), N_("Top center"), N_("Bottom center"), N_("Baseline center"), + N_("Top right"), N_("Bottom right"), N_("Baseline right") +}; + +external::Template getTemplate(int i) +{ + if (external::TemplateManager::get().getTemplates().empty()) + return Template(); + external::TemplateManager::Templates::const_iterator i1 + = external::TemplateManager::get().getTemplates().begin(); + advance(i1, i); + return i1->second; +} -///////////////////////////////////////////////////////////////////// -// -// GuiExternalDialog -// -///////////////////////////////////////////////////////////////////// +} // namespace anon -GuiExternalDialog::GuiExternalDialog(GuiExternal * form) - : form_(form) +GuiExternal::GuiExternal(GuiView & lv) + : GuiDialog(lv, "external", qt_("External Material")), bbChanged_(false) { setupUi(this); - connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK())); - connect(applyPB, SIGNAL(clicked()), form, SLOT(slotApply())); - connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose())); - connect(displayCB, SIGNAL(toggled(bool)), - showCO, SLOT(setEnabled(bool))); - connect(displayCB, SIGNAL(toggled(bool)), + connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK())); + connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply())); + connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose())); + + /* + connect(displayGB, SIGNAL(toggled(bool)), displayscaleED, SLOT(setEnabled(bool))); - connect(showCO, SIGNAL(activated(const QString&)), - this, SLOT(change_adaptor())); + */ connect(originCO, SIGNAL(activated(int)), this, SLOT(change_adaptor())); connect(aspectratioCB, SIGNAL(stateChanged(int)), this, SLOT(change_adaptor())); connect(browsePB, SIGNAL(clicked()), this, SLOT(browseClicked())); - connect(editPB, SIGNAL(clicked()), - this, SLOT(editClicked())); - connect(externalCO, SIGNAL(activated(const QString &)), + connect(externalCO, SIGNAL(activated(QString)), this, SLOT(templateChanged())); - connect(extraED, SIGNAL(textChanged(const QString &)), - this, SLOT(extraChanged(const QString&))); - connect(extraFormatCO, SIGNAL(activated(const QString &)), - this, SLOT(formatChanged(const QString&))); + connect(extraED, SIGNAL(textChanged(QString)), + this, SLOT(extraChanged(QString))); + connect(extraFormatCO, SIGNAL(activated(QString)), + this, SLOT(formatChanged(QString))); connect(widthUnitCO, SIGNAL(activated(int)), this, SLOT(widthUnitChanged())); connect(heightUnitCO, SIGNAL(selectionChanged(lyx::Length::UNIT)), this, SLOT(change_adaptor())); - connect(displayCB, SIGNAL(stateChanged(int)), + connect(displayGB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor())); - connect(displayscaleED, SIGNAL(textChanged(const QString &)), + connect(displayscaleED, SIGNAL(textChanged(QString)), this, SLOT(change_adaptor())); - connect(angleED, SIGNAL(textChanged(const QString &)), + connect(angleED, SIGNAL(textChanged(QString)), this, SLOT(change_adaptor())); - connect(widthED, SIGNAL(textChanged(const QString &)), + connect(widthED, SIGNAL(textChanged(QString)), this, SLOT(sizeChanged())); - connect(heightED, SIGNAL(textChanged(const QString &)), + connect(heightED, SIGNAL(textChanged(QString)), this, SLOT(sizeChanged())); - connect(fileED, SIGNAL(textChanged(const QString &)), + connect(fileED, SIGNAL(textChanged(QString)), this, SLOT(change_adaptor())); connect(clipCB, SIGNAL(stateChanged(int)), this, SLOT(change_adaptor())); connect(getbbPB, SIGNAL(clicked()), this, SLOT(getbbClicked())); - connect(xrED, SIGNAL(textChanged(const QString &)), this, SLOT(bbChanged())); - connect(ytED, SIGNAL(textChanged(const QString &)), this, SLOT(bbChanged())); - connect(xlED, SIGNAL(textChanged(const QString &)), this, SLOT(bbChanged())); - connect(ybED, SIGNAL(textChanged(const QString &)), this, SLOT(bbChanged())); + connect(xrED, SIGNAL(textChanged(QString)), this, SLOT(bbChanged())); + connect(ytED, SIGNAL(textChanged(QString)), this, SLOT(bbChanged())); + connect(xlED, SIGNAL(textChanged(QString)), this, SLOT(bbChanged())); + connect(ybED, SIGNAL(textChanged(QString)), this, SLOT(bbChanged())); connect(draftCB, SIGNAL(clicked()), this, SLOT(change_adaptor())); QIntValidator * validator = new QIntValidator(displayscaleED); @@ -126,250 +156,228 @@ GuiExternalDialog::GuiExternalDialog(GuiExternal * form) heightED->setValidator(unsignedLengthValidator(heightED)); setFocusProxy(fileED); -} + bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy); + + bc().setOK(okPB); + bc().setApply(applyPB); + bc().setCancel(closePB); + + bc().addReadOnly(fileED); + bc().addReadOnly(browsePB); + bc().addReadOnly(externalCO); + bc().addReadOnly(draftCB); + bc().addReadOnly(displayscaleED); + bc().addReadOnly(displayGB); + bc().addReadOnly(angleED); + bc().addReadOnly(originCO); + bc().addReadOnly(heightUnitCO); + bc().addReadOnly(heightED); + bc().addReadOnly(aspectratioCB); + bc().addReadOnly(widthUnitCO); + bc().addReadOnly(widthED); + bc().addReadOnly(clipCB); + bc().addReadOnly(getbbPB); + bc().addReadOnly(ytED); + bc().addReadOnly(xlED); + bc().addReadOnly(xrED); + bc().addReadOnly(ybED); + bc().addReadOnly(extraFormatCO); + bc().addReadOnly(extraED); + + bc().addCheckedLineEdit(angleED, angleLA); + bc().addCheckedLineEdit(displayscaleED, scaleLA); + bc().addCheckedLineEdit(heightED, heightLA); + bc().addCheckedLineEdit(widthED, widthLA); + bc().addCheckedLineEdit(xlED, lbLA); + bc().addCheckedLineEdit(ybED, lbLA); + bc().addCheckedLineEdit(xrED, rtLA); + bc().addCheckedLineEdit(ytED, rtLA); + bc().addCheckedLineEdit(fileED, fileLA); + + external::TemplateManager::Templates::const_iterator i1, i2; + i1 = external::TemplateManager::get().getTemplates().begin(); + i2 = external::TemplateManager::get().getTemplates().end(); + for (; i1 != i2; ++i1) + externalCO->addItem(qt_(i1->second.lyxName)); -void GuiExternalDialog::show() -{ - QDialog::show(); -} + // Fill the origins combo + for (size_t i = 0; i != sizeof(origins) / sizeof(origins[0]); ++i) + originCO->addItem(qt_(origin_gui_strs[i])); + // add scale item + widthUnitCO->insertItem(0, qt_("Scale%"), "scale"); +} -bool GuiExternalDialog::activateAspectratio() const +bool GuiExternal::activateAspectratio() const { - if (widthUnitCO->currentIndex() == 0) + if (usingScale()) return false; - string const wstr = fromqstr(widthED->text()); - if (wstr.empty()) + QString const wstr = widthED->text(); + if (wstr.isEmpty()) return false; - bool const wIsDbl = isStrDbl(wstr); - if (wIsDbl && float_equal(convert(wstr), 0.0, 0.05)) + bool wIsDbl; + double val = wstr.trimmed().toDouble(&wIsDbl); + if (wIsDbl && float_equal(val, 0.0, 0.05)) return false; Length l; - if (!wIsDbl && (!isValidLength(wstr, &l) || l.zero())) + if (!wIsDbl && (!isValidLength(fromqstr(wstr), &l) || l.zero())) return false; - string const hstr = fromqstr(heightED->text()); - if (hstr.empty()) + QString const hstr = heightED->text(); + if (hstr.isEmpty()) return false; - bool const hIsDbl = isStrDbl(hstr); - if (hIsDbl && float_equal(convert(hstr), 0.0, 0.05)) + bool hIsDbl; + val = hstr.trimmed().toDouble(&hIsDbl); + if (hIsDbl && float_equal(val, 0.0, 0.05)) return false; - if (!hIsDbl && (!isValidLength(hstr, &l) || l.zero())) + if (!hIsDbl && (!isValidLength(fromqstr(hstr), &l) || l.zero())) return false; return true; } -void GuiExternalDialog::bbChanged() -{ - form_->controller().bbChanged(true); - form_->changed(); -} - - -void GuiExternalDialog::browseClicked() -{ - int const choice = externalCO->currentIndex(); - docstring const template_name = - from_utf8(form_->controller().getTemplate(choice).lyxName); - docstring const str = - form_->controller().browse(qstring_to_ucs4(fileED->text()), - template_name); - if (!str.empty()) { - fileED->setText(toqstr(str)); - form_->changed(); - } -} - - -void GuiExternalDialog::change_adaptor() +bool GuiExternal::usingScale() const { - form_->changed(); + return (widthUnitCO->itemData( + widthUnitCO->currentIndex()).toString() == "scale"); } -void GuiExternalDialog::closeEvent(QCloseEvent * e) +void GuiExternal::bbChanged() { - form_->slotWMHide(); - e->accept(); + bbChanged_ = true; + changed(); } -void GuiExternalDialog::editClicked() +void GuiExternal::browseClicked() { - form_->controller().editExternal(); -} - - - -void GuiExternalDialog::extraChanged(const QString& text) -{ - std::string const format = fromqstr(extraFormatCO->currentText()); - form_->extra_[format] = text; - form_->changed(); + int const choice = externalCO->currentIndex(); + QString const template_name = toqstr(getTemplate(choice).lyxName); + QString const str = browse(fileED->text(), template_name); + if (!str.isEmpty()) { + fileED->setText(str); + changed(); + } } -void GuiExternalDialog::formatChanged(const QString& format) +void GuiExternal::change_adaptor() { - extraED->setText(form_->extra_[fromqstr(format)]); + changed(); } -void GuiExternalDialog::getbbClicked() +void GuiExternal::extraChanged(const QString & text) { - form_->getBB(); + extra_[extraFormatCO->currentText()] = text; + changed(); } -void GuiExternalDialog::sizeChanged() +void GuiExternal::formatChanged(const QString & format) { - aspectratioCB->setEnabled(activateAspectratio()); - form_->changed(); + extraED->setText(extra_[format]); } -void GuiExternalDialog::templateChanged() +void GuiExternal::getbbClicked() { - form_->updateTemplate(); - form_->changed(); -} + xlED->setText("0"); + ybED->setText("0"); + xrED->setText("0"); + ytED->setText("0"); + string const filename = fromqstr(fileED->text()); + if (filename.empty()) + return; -void GuiExternalDialog::widthUnitChanged() -{ - bool useHeight = (widthUnitCO->currentIndex() > 0); + FileName const abs_file(support::makeAbsPath(filename, fromqstr(bufferFilepath()))); + + // try to get it from the file, if possible + string bb = readBB_from_PSFile(abs_file); + if (bb.empty()) { + // we don't, so ask the Graphics Cache if it has loaded the file + int width = 0; + int height = 0; + + graphics::Cache & gc = graphics::Cache::get(); + if (gc.inCache(abs_file)) { + graphics::Image const * image = gc.item(abs_file)->image(); + + if (image) { + width = image->width(); + height = image->height(); + } + } + bb = "0 0 " + convert(width) + ' ' + convert(height); + } - if (useHeight) - widthED->setValidator(unsignedLengthValidator(widthED)); - else - widthED->setValidator(new QDoubleValidator(0, 1000, 2, widthED)); + xlED->setText(toqstr(token(bb, ' ', 0))); + ybED->setText(toqstr(token(bb, ' ', 1))); + xrED->setText(toqstr(token(bb, ' ', 2))); + ytED->setText(toqstr(token(bb, ' ', 3))); - heightED->setEnabled(useHeight); - heightUnitCO->setEnabled(useHeight); - form_->changed(); + bbChanged_ = false; } -///////////////////////////////////////////////////////////////////// -// -// GuiExternal -// -///////////////////////////////////////////////////////////////////// - -namespace { - -Length::UNIT defaultUnit() +void GuiExternal::sizeChanged() { - Length::UNIT default_unit = Length::CM; - switch (lyxrc.default_papersize) { - case PAPER_USLETTER: - case PAPER_USLEGAL: - case PAPER_USEXECUTIVE: - default_unit = Length::IN; - break; - default: - break; - } - return default_unit; + aspectratioCB->setEnabled(activateAspectratio()); + changed(); } -void setDisplay(QCheckBox & displayCB, QComboBox & showCO, QLineEdit & scaleED, - external::DisplayType display, unsigned int scale, - bool read_only) +void GuiExternal::templateChanged() { - int item = 0; - switch (display) { - case external::DefaultDisplay: - item = 0; - break; - case external::MonochromeDisplay: - item = 1; - break; - case external::GrayscaleDisplay: - item = 2; - break; - case external::ColorDisplay: - item = 3; - break; - case external::PreviewDisplay: - item = 4; - break; - case external::NoDisplay: - item = 0; - break; - } - - showCO.setCurrentIndex(item); - bool const no_display = display == external::NoDisplay; - showCO.setEnabled(!no_display && !read_only); - displayCB.setChecked(!no_display); - scaleED.setEnabled(!no_display && !read_only); - scaleED.setText(toqstr(convert(scale))); + updateTemplate(); + changed(); } -void getDisplay(external::DisplayType & display, - unsigned int & scale, - QCheckBox const & displayCB, - QComboBox const & showCO, - QLineEdit const & scaleED) +void GuiExternal::widthUnitChanged() { - switch (showCO.currentIndex()) { - case 0: - display = external::DefaultDisplay; - break; - case 1: - display = external::MonochromeDisplay; - break; - case 2: - display = external::GrayscaleDisplay; - break; - case 3: - display = external::ColorDisplay; - break; - case 4: - display = external::PreviewDisplay; - break; - } - - if (!displayCB.isChecked()) - display = external::NoDisplay; + if (usingScale()) + widthED->setValidator(new QDoubleValidator(0, 1000, 2, widthED)); + else + widthED->setValidator(unsignedLengthValidator(widthED)); - scale = convert(fromqstr(scaleED.text())); + heightED->setEnabled(!usingScale()); + heightUnitCO->setEnabled(!usingScale()); + changed(); } -void setRotation(QLineEdit & angleED, QComboBox & originCO, - external::RotationData const & data) +static void setRotation(QLineEdit & angleED, QComboBox & originCO, + external::RotationData const & data) { originCO.setCurrentIndex(int(data.origin())); - angleED.setText(toqstr(data.angle)); + doubleToWidget(&angleED, data.angle); } -void getRotation(external::RotationData & data, - QLineEdit const & angleED, QComboBox const & originCO) +static void getRotation(external::RotationData & data, + QLineEdit const & angleED, QComboBox const & originCO) { typedef external::RotationData::OriginType OriginType; data.origin(static_cast(originCO.currentIndex())); - data.angle = fromqstr(angleED.text()); + data.angle = widgetToDoubleStr(&angleED); } -void setSize(QLineEdit & widthED, QComboBox & widthUnitCO, - QLineEdit & heightED, LengthCombo & heightUnitCO, - QCheckBox & aspectratioCB, - external::ResizeData const & data) +static void setSize(QLineEdit & widthED, LengthCombo & widthUnitCO, + QLineEdit & heightED, LengthCombo & heightUnitCO, + QCheckBox & aspectratioCB, + external::ResizeData const & data) { bool using_scale = data.usingScale(); - std::string scale = data.scale; + string scale = data.scale; if (data.no_resize()) { // Everything is zero, so default to this! using_scale = true; @@ -377,19 +385,15 @@ void setSize(QLineEdit & widthED, QComboBox & widthUnitCO, } if (using_scale) { - widthED.setText(toqstr(scale)); - widthUnitCO.setCurrentIndex(0); - } else { - widthED.setText(toqstr(convert(data.width.value()))); - // Because 'Scale' is position 0... - // Note also that width cannot be zero here, so - // we don't need to worry about the default unit. - widthUnitCO.setCurrentIndex(data.width.unit() + 1); - } + doubleToWidget(&widthED, scale); + widthUnitCO.setCurrentItem("scale"); + } else + lengthToWidgets(&widthED, &widthUnitCO, + data.width.asString(), Length::defaultUnit()); string const h = data.height.zero() ? string() : data.height.asString(); - Length::UNIT default_unit = data.width.zero() ? - defaultUnit() : data.width.unit(); + Length::UNIT const default_unit = data.width.zero() ? + Length::defaultUnit() : data.width.unit(); lengthToWidgets(&heightED, &heightUnitCO, h, default_unit); heightED.setEnabled(!using_scale); @@ -403,183 +407,94 @@ void setSize(QLineEdit & widthED, QComboBox & widthUnitCO, } -void getSize(external::ResizeData & data, - QLineEdit const & widthED, QComboBox const & widthUnitCO, - QLineEdit const & heightED, LengthCombo const & heightUnitCO, - QCheckBox const & aspectratioCB) +static void getSize(external::ResizeData & data, + QLineEdit const & widthED, QComboBox const & widthUnitCO, + QLineEdit const & heightED, LengthCombo const & heightUnitCO, + QCheckBox const & aspectratioCB, bool const scaling) { - string const width = fromqstr(widthED.text()); - - if (widthUnitCO.currentIndex() > 0) { - // Subtract one, because scale is 0. - int const unit = widthUnitCO.currentIndex() - 1; - - Length w; - if (isValidLength(width, &w)) - data.width = w; - else if (isStrDbl(width)) - data.width = Length(convert(width), - static_cast(unit)); - else - data.width = Length(); - - data.scale = string(); - - } else { + if (scaling) { // scaling instead of a width - data.scale = width; + data.scale = widgetToDoubleStr(&widthED); data.width = Length(); + } else { + data.width = Length(widgetsToLength(&widthED, &widthUnitCO)); + data.scale = string(); } - data.height = Length(widgetsToLength(&heightED, &heightUnitCO)); - data.keepAspectRatio = aspectratioCB.isChecked(); } void setCrop(QCheckBox & clipCB, - QLineEdit & xlED, QLineEdit & ybED, - QLineEdit & xrED, QLineEdit & ytED, - external::ClipData const & data) + QLineEdit & xlED, QLineEdit & ybED, + QLineEdit & xrED, QLineEdit & ytED, + external::ClipData const & data) { clipCB.setChecked(data.clip); graphics::BoundingBox const & bbox = data.bbox; - xlED.setText(toqstr(convert(bbox.xl))); - ybED.setText(toqstr(convert(bbox.yb))); - xrED.setText(toqstr(convert(bbox.xr))); - ytED.setText(toqstr(convert(bbox.yt))); + xlED.setText(QString::number(bbox.xl)); + ybED.setText(QString::number(bbox.yb)); + xrED.setText(QString::number(bbox.xr)); + ytED.setText(QString::number(bbox.yt)); } -void getCrop(external::ClipData & data, - QCheckBox const & clipCB, - QLineEdit const & xlED, QLineEdit const & ybED, - QLineEdit const & xrED, QLineEdit const & ytED, - bool bb_changed) +static void getCrop(external::ClipData & data, + QCheckBox const & clipCB, + QLineEdit const & xlED, QLineEdit const & ybED, + QLineEdit const & xrED, QLineEdit const & ytED, + bool bb_changed) { data.clip = clipCB.isChecked(); if (!bb_changed) return; - data.bbox.xl = convert(fromqstr(xlED.text())); - data.bbox.yb = convert(fromqstr(ybED.text())); - data.bbox.xr = convert(fromqstr(xrED.text())); - data.bbox.yt = convert(fromqstr(ytED.text())); + data.bbox.xl = xlED.text().toInt(); + data.bbox.yb = ybED.text().toInt(); + data.bbox.xr = xrED.text().toInt(); + data.bbox.yt = ytED.text().toInt(); } -void getExtra(external::ExtraData & data, - GuiExternal::MapType const & extra) +void GuiExternal::updateContents() { - typedef GuiExternal::MapType MapType; - MapType::const_iterator it = extra.begin(); - MapType::const_iterator const end = extra.end(); - for (; it != end; ++it) - data.set(it->first, trim(fromqstr(it->second))); -} - -} // namespace anon - - -GuiExternal::GuiExternal(GuiDialog & parent) - : GuiView(parent, _("External Material")) -{} - - -void GuiExternal::build_dialog() -{ - dialog_.reset(new GuiExternalDialog(this)); - - bc().setOK(dialog_->okPB); - bc().setApply(dialog_->applyPB); - bc().setCancel(dialog_->closePB); - - bc().addReadOnly(dialog_->fileED); - bc().addReadOnly(dialog_->browsePB); - bc().addReadOnly(dialog_->editPB); - bc().addReadOnly(dialog_->externalCO); - bc().addReadOnly(dialog_->draftCB); - bc().addReadOnly(dialog_->displayscaleED); - bc().addReadOnly(dialog_->showCO); - bc().addReadOnly(dialog_->displayCB); - bc().addReadOnly(dialog_->angleED); - bc().addReadOnly(dialog_->originCO); - bc().addReadOnly(dialog_->heightUnitCO); - bc().addReadOnly(dialog_->heightED); - bc().addReadOnly(dialog_->aspectratioCB); - bc().addReadOnly(dialog_->widthUnitCO); - bc().addReadOnly(dialog_->widthED); - bc().addReadOnly(dialog_->clipCB); - bc().addReadOnly(dialog_->getbbPB); - bc().addReadOnly(dialog_->ytED); - bc().addReadOnly(dialog_->xlED); - bc().addReadOnly(dialog_->xrED); - bc().addReadOnly(dialog_->ybED); - bc().addReadOnly(dialog_->extraFormatCO); - bc().addReadOnly(dialog_->extraED); - - bc().addCheckedLineEdit(dialog_->angleED, dialog_->angleLA); - bc().addCheckedLineEdit(dialog_->displayscaleED, dialog_->scaleLA); - bc().addCheckedLineEdit(dialog_->heightED, dialog_->heightLA); - bc().addCheckedLineEdit(dialog_->widthED, dialog_->widthLA); - bc().addCheckedLineEdit(dialog_->xlED, dialog_->lbLA); - bc().addCheckedLineEdit(dialog_->ybED, dialog_->lbLA); - bc().addCheckedLineEdit(dialog_->xrED, dialog_->rtLA); - bc().addCheckedLineEdit(dialog_->ytED, dialog_->rtLA); - bc().addCheckedLineEdit(dialog_->fileED, dialog_->fileLA); - - std::vector templates(controller().getTemplates()); - - for (std::vector::const_iterator cit = templates.begin(); - cit != templates.end(); ++cit) { - dialog_->externalCO->addItem(qt_(*cit)); - } - - // Fill the origins combo - typedef vector Origins; - Origins const & all_origins = external::all_origins(); - for (Origins::size_type i = 0; i != all_origins.size(); ++i) - dialog_->originCO->addItem(toqstr(external::origin_gui_str(i))); - - // Fill the width combo - dialog_->widthUnitCO->addItem(qt_("Scale%")); - for (int i = 0; i < num_units; i++) - dialog_->widthUnitCO->addItem(qt_(unit_name_gui[i])); -} - - -void GuiExternal::update_contents() -{ - dialog_->tab->setCurrentIndex(0); - InsetExternalParams const & params = controller().params(); - string const name = - params.filename.outputFilename(kernel().bufferFilepath()); - dialog_->fileED->setText(toqstr(name)); + params_.filename.outputFilename(fromqstr(bufferFilepath())); + fileED->setText(toqstr(name)); + + int index = 0; + external::TemplateManager::Templates::const_iterator i1, i2; + i1 = external::TemplateManager::get().getTemplates().begin(); + i2 = external::TemplateManager::get().getTemplates().end(); + for (int i = 0; i1 != i2; ++i1, ++i) { + if (i1->second.lyxName == params_.templatename()) { + index = i; + break; + } + } - dialog_->externalCO->setCurrentIndex( - controller().getTemplateNumber(params.templatename())); + externalCO->setCurrentIndex(index); updateTemplate(); - dialog_->draftCB->setChecked(params.draft); + draftCB->setChecked(params_.draft); + + displayGB->setChecked(params_.display); + displayscaleED->setText(QString::number(params_.lyxscale)); + bool scaled = params_.display && !isBufferReadonly() && + (params_.preview_mode != PREVIEW_INSTANT); + displayscaleED->setEnabled(scaled); + scaleLA->setEnabled(scaled); + displayGB->setEnabled(lyxrc.display_graphics); - setDisplay(*dialog_->displayCB, *dialog_->showCO, - *dialog_->displayscaleED, - params.display, params.lyxscale, readOnly()); - setRotation(*dialog_->angleED, *dialog_->originCO, params.rotationdata); + setRotation(*angleED, *originCO, params_.rotationdata); - setSize(*dialog_->widthED, *dialog_->widthUnitCO, - *dialog_->heightED, *dialog_->heightUnitCO, - *dialog_->aspectratioCB, - params.resizedata); + setSize(*widthED, *widthUnitCO, *heightED, *heightUnitCO, + *aspectratioCB, params_.resizedata); - setCrop(*dialog_->clipCB, - *dialog_->xlED, *dialog_->ybED, - *dialog_->xrED, *dialog_->ytED, - params.clipdata); - controller().bbChanged(!params.clipdata.bbox.empty()); + setCrop(*clipCB, *xlED, *ybED, *xrED, *ytED, params_.clipdata); + bbChanged_ = !params_.clipdata.bbox.empty(); isValid(); } @@ -587,43 +502,46 @@ void GuiExternal::update_contents() void GuiExternal::updateTemplate() { - external::Template templ = - controller().getTemplate(dialog_->externalCO->currentIndex()); - dialog_->externalTB->setPlainText(qt_(templ.helpText)); + external::Template templ = getTemplate(externalCO->currentIndex()); + externalTB->setPlainText(qt_(templ.helpText)); // Ascertain which (if any) transformations the template supports - // and disable tabs hosting unsupported transforms. + // and disable tabs and Group Boxes hosting unsupported transforms. typedef vector TransformIDs; TransformIDs const transformIds = templ.transformIds; TransformIDs::const_iterator tr_begin = transformIds.begin(); TransformIDs::const_iterator const tr_end = transformIds.end(); - bool found = find(tr_begin, tr_end, external::Rotate) != tr_end; - dialog_->tab->setTabEnabled( - dialog_->tab->indexOf(dialog_->rotatetab), found); - found = find(tr_begin, tr_end, external::Resize) != tr_end; - dialog_->tab->setTabEnabled( - dialog_->tab->indexOf(dialog_->scaletab), found); + bool found = std::find(tr_begin, tr_end, external::Rotate) != tr_end; + rotationGB->setEnabled(found); + + found = std::find(tr_begin, tr_end, external::Resize) != tr_end; + scaleGB->setEnabled(found); + + found = std::find(tr_begin, tr_end, external::Clip) != tr_end; + cropGB->setEnabled(found); - found = find(tr_begin, tr_end, external::Clip) != tr_end; - dialog_->tab->setTabEnabled( - dialog_->tab->indexOf(dialog_->croptab), found); + tab->setTabEnabled(tab->indexOf(sizetab), + rotationGB->isEnabled() + || scaleGB->isEnabled() + || cropGB->isEnabled()); - found = find(tr_begin, tr_end, external::Extra) != tr_end; - dialog_->tab->setTabEnabled( - dialog_->tab->indexOf(dialog_->optionstab), found); + found = std::find(tr_begin, tr_end, external::Extra) != tr_end; + optionsGB->setEnabled(found); + + bool scaled = displayGB->isChecked() && displayGB->isEnabled() && + !isBufferReadonly() && (templ.preview_mode != PREVIEW_INSTANT); + displayscaleED->setEnabled(scaled); + scaleLA->setEnabled(scaled); if (!found) return; // Ascertain whether the template has any formats supporting // the 'Extra' option - QLineEdit * const extraED = dialog_->extraED; - QComboBox * const extraCB = dialog_->extraFormatCO; - extra_.clear(); extraED->clear(); - extraCB->clear(); + extraFormatCO->clear(); external::Template::Formats::const_iterator it = templ.formats.begin(); external::Template::Formats::const_iterator end = templ.formats.end(); @@ -632,93 +550,103 @@ void GuiExternal::updateTemplate() it->second.option_transformers.end()) continue; string const format = it->first; - string const opt = controller().params().extradata.get(format); - extraCB->addItem(toqstr(format)); - extra_[format] = toqstr(opt); + string const opt = params_.extradata.get(format); + extraFormatCO->addItem(toqstr(format)); + extra_[toqstr(format)] = toqstr(opt); } - bool const enabled = extraCB->count() > 0; + bool const enabled = extraFormatCO->count() > 0; - dialog_->tab->setTabEnabled( - dialog_->tab->indexOf(dialog_->optionstab), enabled); - extraED->setEnabled(enabled && !kernel().isBufferReadonly()); - extraCB->setEnabled(enabled); + optionsGB->setEnabled(enabled); + extraED->setEnabled(enabled && !isBufferReadonly()); + extraFormatCO->setEnabled(enabled); if (enabled) { - extraCB->setCurrentIndex(0); - extraED->setText(extra_[fromqstr(extraCB->currentText())]); + extraFormatCO->setCurrentIndex(0); + extraED->setText(extra_[extraFormatCO->currentText()]); } } -void GuiExternal::apply() +void GuiExternal::applyView() { - InsetExternalParams params = controller().params(); + params_.filename.set(fromqstr(fileED->text()), fromqstr(bufferFilepath())); + params_.settemplate(getTemplate(externalCO->currentIndex()).lyxName); - params.filename.set(internal_path(fromqstr(dialog_->fileED->text())), - kernel().bufferFilepath()); + params_.draft = draftCB->isChecked(); + params_.lyxscale = displayscaleED->text().toInt(); + params_.display = displayGB->isChecked(); - params.settemplate(controller().getTemplate( - dialog_->externalCO->currentIndex()).lyxName); + if (rotationGB->isEnabled()) + getRotation(params_.rotationdata, *angleED, *originCO); - params.draft = dialog_->draftCB->isChecked(); + if (scaleGB->isEnabled()) + getSize(params_.resizedata, *widthED, *widthUnitCO, + *heightED, *heightUnitCO, *aspectratioCB, usingScale()); - getDisplay(params.display, params.lyxscale, - *dialog_->displayCB, *dialog_->showCO, - *dialog_->displayscaleED); + if (cropGB->isEnabled()) + getCrop(params_.clipdata, *clipCB, *xlED, *ybED, + *xrED, *ytED, bbChanged_); - if (dialog_->tab->isTabEnabled( - dialog_->tab->indexOf(dialog_->rotatetab))) - getRotation(params.rotationdata, - *dialog_->angleED, *dialog_->originCO); + if (optionsGB->isEnabled()) { + MapType::const_iterator it = extra_.begin(); + MapType::const_iterator const end = extra_.end(); + for (; it != end; ++it) + params_.extradata.set(fromqstr(it.key()), fromqstr(it.value().trimmed())); + } +} - if (dialog_->tab->isTabEnabled( - dialog_->tab->indexOf(dialog_->scaletab))) - getSize(params.resizedata, - *dialog_->widthED, *dialog_->widthUnitCO, - *dialog_->heightED, *dialog_->heightUnitCO, - *dialog_->aspectratioCB); - if (dialog_->tab->isTabEnabled( - dialog_->tab->indexOf(dialog_->croptab))) - getCrop(params.clipdata, - *dialog_->clipCB, - *dialog_->xlED, *dialog_->ybED, - *dialog_->xrED, *dialog_->ytED, - controller().bbChanged()); +bool GuiExternal::initialiseParams(string const & data) +{ + InsetExternal::string2params(data, buffer(), params_); + return true; +} - if (dialog_->tab->isTabEnabled( - dialog_->tab->indexOf(dialog_->optionstab))) - getExtra(params.extradata, extra_); - controller().setParams(params); +void GuiExternal::clearParams() +{ + params_ = InsetExternalParams(); } -void GuiExternal::getBB() +void GuiExternal::dispatchParams() { - dialog_->xlED->setText("0"); - dialog_->ybED->setText("0"); - dialog_->xrED->setText("0"); - dialog_->ytED->setText("0"); + string const lfun = InsetExternal::params2string(params_, buffer()); + dispatch(FuncRequest(getLfun(), lfun)); +} - string const filename = fromqstr(dialog_->fileED->text()); - if (filename.empty()) - return; - string const bb = controller().readBB(filename); - if (bb.empty()) - return; +static QStringList templateFilters(QString const & template_name) +{ + /// Determine the template file extension + external::TemplateManager const & etm = + external::TemplateManager::get(); + external::Template const * const et_ptr = + etm.getTemplateByName(fromqstr(template_name)); + + return fileFilters(et_ptr ? toqstr(et_ptr->fileRegExp) : QString()); +} + + +QString GuiExternal::browse(QString const & input, + QString const & template_name) const +{ + QString const title = qt_("Select external file"); + QString const bufpath = bufferFilepath(); + QStringList const filter = templateFilters(template_name); - dialog_->xlED->setText(toqstr(token(bb, ' ', 0))); - dialog_->ybED->setText(toqstr(token(bb, ' ', 1))); - dialog_->xrED->setText(toqstr(token(bb, ' ', 2))); - dialog_->ytED->setText(toqstr(token(bb, ' ', 3))); + QString const label1 = qt_("Documents|#o#O"); + QString const dir1 = toqstr(lyxrc.document_path); - controller().bbChanged(false); + return browseRelFile(input, bufpath, title, filter, false, label1, dir1); } + +Dialog * createGuiExternal(GuiView & lv) { return new GuiExternal(lv); } + + } // namespace frontend } // namespace lyx -#include "GuiExternal_moc.cpp" +#include "moc_GuiExternal.cpp"