From 307319e95ec40e0c8ad8aa784d9539eaf86d5e7e Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Mon, 6 Aug 2018 20:07:15 +0200 Subject: [PATCH] Introduce InsetInfoParams This allows to open the dialog without having an inset already. --- lib/ui/stdmenus.inc | 4 +- src/Text3.cpp | 4 +- src/frontends/qt4/GuiInfo.cpp | 46 ++- src/frontends/qt4/GuiInfo.h | 6 +- src/frontends/qt4/Menus.cpp | 5 +- src/insets/InsetInfo.cpp | 708 +++++++++++++++++----------------- src/insets/InsetInfo.h | 41 +- 7 files changed, 427 insertions(+), 387 deletions(-) diff --git a/lib/ui/stdmenus.inc b/lib/ui/stdmenus.inc index 51e6f75325..32c453b3da 100644 --- a/lib/ui/stdmenus.inc +++ b/lib/ui/stdmenus.inc @@ -425,8 +425,8 @@ Menuset Item "Date (Current)|D" "info-insert date" Item "Date (Last Modification)|L" "info-insert moddate" Item "Date (Fix)|F" "info-insert fixdate" -# Separator -# Item "Other...|O" "info-insert" + Separator + Item "Other...|O" "info-insert" End Menu "insert_logos" diff --git a/src/Text3.cpp b/src/Text3.cpp index 3e0f1abc6a..1b0788ddbb 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -1996,10 +1996,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_INFO_INSERT: { - Inset * inset; if (cmd.argument().empty()) { - bv->showDialog("info"); + bv->showDialog("info", cur.current_font.language()->lang()); } else { + Inset * inset; inset = createInset(cur.buffer(), cmd); if (!inset) break; diff --git a/src/frontends/qt4/GuiInfo.cpp b/src/frontends/qt4/GuiInfo.cpp index ea515afde1..f4c8d8b592 100644 --- a/src/frontends/qt4/GuiInfo.cpp +++ b/src/frontends/qt4/GuiInfo.cpp @@ -20,6 +20,10 @@ #include "BufferParams.h" #include "BufferView.h" #include "Cursor.h" +#include "Language.h" + +#include "GuiApplication.h" +#include "GuiView.h" #include "insets/InsetInfo.h" @@ -170,9 +174,9 @@ GuiInfo::GuiInfo(QWidget * parent) : InsetParamsWidget(parent) void GuiInfo::paramsToDialog(Inset const * inset) { InsetInfo const * ii = static_cast(inset); - inset_ = const_cast(inset); - QString const type = toqstr(ii->infoType()); - QString name = toqstr(ii->infoName()); + params_ = ii->params(); + QString const type = toqstr(params_.infoType()); + QString name = toqstr(params_.name); QString fixdate; if (type == "fixdate") { fixdate = name.section('@', 1, 1); @@ -229,22 +233,32 @@ docstring GuiInfo::dialogToParams() const } +bool GuiInfo::initialiseParams(std::string const & sdata) +{ + Language const * lang = languages.getLanguage(sdata); + if (!lang) + return false; + params_.lang = lang; + updateArguments(); + return true; +} + + void GuiInfo::updateArguments(int i) { infoLW->clear(); - if (inset_) { - InsetInfo * ii = static_cast(inset_); - vector> args = ii->getArguments(info_types[i]); - for (auto const & p : args) { - QListWidgetItem * li = new QListWidgetItem(toqstr(p.second)); - li->setData(Qt::UserRole, toqstr(p.first)); - if (p.first == "invalid") - // non-selectable, disabled item! - li->setFlags(Qt::NoItemFlags); - if (p.first == "custom") - li->setData(Qt::ToolTipRole, qt_("Enter a valid value below")); - infoLW->addItem(li); - } + BufferView const * bv = guiApp->currentView()->currentBufferView(); + vector> args = params_.getArguments(const_cast(&bv->buffer()), + info_types[i]); + for (auto const & p : args) { + QListWidgetItem * li = new QListWidgetItem(toqstr(p.second)); + li->setData(Qt::UserRole, toqstr(p.first)); + if (p.first == "invalid") + // non-selectable, disabled item! + li->setFlags(Qt::NoItemFlags); + if (p.first == "custom") + li->setData(Qt::ToolTipRole, qt_("Enter a valid value below")); + infoLW->addItem(li); } if (infoLW->count() > 0) infoLW->setCurrentRow(0); diff --git a/src/frontends/qt4/GuiInfo.h b/src/frontends/qt4/GuiInfo.h index 3cff528241..ff8096871c 100644 --- a/src/frontends/qt4/GuiInfo.h +++ b/src/frontends/qt4/GuiInfo.h @@ -13,6 +13,7 @@ #define GUI_INFO_H #include "InsetParamsWidget.h" +#include "insets/InsetInfo.h" #include "ui_InfoUi.h" namespace lyx { @@ -26,7 +27,7 @@ class GuiInfo : public InsetParamsWidget, public Ui::InfoUi Q_OBJECT protected Q_SLOTS: - void updateArguments(int i); + void updateArguments(int i = 1); public: GuiInfo(QWidget * parent = 0); @@ -39,9 +40,10 @@ private: QString dialogTitle() const { return qt_("Field Settings"); } void paramsToDialog(Inset const *); docstring dialogToParams() const; + bool initialiseParams(std::string const &); bool checkWidgets(bool readonly) const; //@} - Inset * inset_; + InsetInfoParams params_; }; } // namespace frontend diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp index 64f17edfa2..686081789e 100644 --- a/src/frontends/qt4/Menus.cpp +++ b/src/frontends/qt4/Menus.cpp @@ -1679,8 +1679,9 @@ void MenuDefinition::expandInfoArguments(BufferView const * bv) } InsetInfo const * iinset = static_cast(inset); - string const type = iinset->infoType(); - vector> const args = iinset->getArguments(type); + string const type = iinset->params().infoType(); + vector> const args = + iinset->params().getArguments(&bv->buffer(), type); // Don't generate a menu for big lists (such as lfuns and rcs) if (args.size() > 15) diff --git a/src/insets/InsetInfo.cpp b/src/insets/InsetInfo.cpp index 3c02b2e077..5ee5b17404 100644 --- a/src/insets/InsetInfo.cpp +++ b/src/insets/InsetInfo.cpp @@ -63,25 +63,25 @@ namespace lyx { namespace { -typedef Translator NameTranslator; +typedef Translator NameTranslator; NameTranslator const initTranslator() { - NameTranslator translator(InsetInfo::UNKNOWN_INFO, "unknown"); + NameTranslator translator(InsetInfoParams::UNKNOWN_INFO, "unknown"); - translator.addPair(InsetInfo::SHORTCUTS_INFO, "shortcuts"); - translator.addPair(InsetInfo::SHORTCUT_INFO, "shortcut"); - translator.addPair(InsetInfo::LYXRC_INFO, "lyxrc"); - translator.addPair(InsetInfo::PACKAGE_INFO, "package"); - translator.addPair(InsetInfo::TEXTCLASS_INFO, "textclass"); - translator.addPair(InsetInfo::MENU_INFO, "menu"); - translator.addPair(InsetInfo::ICON_INFO, "icon"); - translator.addPair(InsetInfo::BUFFER_INFO, "buffer"); - translator.addPair(InsetInfo::LYX_INFO, "lyxinfo"); - translator.addPair(InsetInfo::VCS_INFO, "vcs"); - translator.addPair(InsetInfo::DATE_INFO, "date"); - translator.addPair(InsetInfo::MODDATE_INFO, "moddate"); - translator.addPair(InsetInfo::FIXDATE_INFO, "fixdate"); + translator.addPair(InsetInfoParams::SHORTCUTS_INFO, "shortcuts"); + translator.addPair(InsetInfoParams::SHORTCUT_INFO, "shortcut"); + translator.addPair(InsetInfoParams::LYXRC_INFO, "lyxrc"); + translator.addPair(InsetInfoParams::PACKAGE_INFO, "package"); + translator.addPair(InsetInfoParams::TEXTCLASS_INFO, "textclass"); + translator.addPair(InsetInfoParams::MENU_INFO, "menu"); + translator.addPair(InsetInfoParams::ICON_INFO, "icon"); + translator.addPair(InsetInfoParams::BUFFER_INFO, "buffer"); + translator.addPair(InsetInfoParams::LYX_INFO, "lyxinfo"); + translator.addPair(InsetInfoParams::VCS_INFO, "vcs"); + translator.addPair(InsetInfoParams::DATE_INFO, "date"); + translator.addPair(InsetInfoParams::MODDATE_INFO, "moddate"); + translator.addPair(InsetInfoParams::FIXDATE_INFO, "fixdate"); return translator; } @@ -94,25 +94,25 @@ NameTranslator const & nameTranslator() } -typedef Translator DefaultValueTranslator; +typedef Translator DefaultValueTranslator; DefaultValueTranslator const initDVTranslator() { - DefaultValueTranslator translator(InsetInfo::UNKNOWN_INFO, ""); + DefaultValueTranslator translator(InsetInfoParams::UNKNOWN_INFO, ""); - translator.addPair(InsetInfo::SHORTCUTS_INFO, "info-insert"); - translator.addPair(InsetInfo::SHORTCUT_INFO, "info-insert"); - translator.addPair(InsetInfo::LYXRC_INFO, "user_name"); - translator.addPair(InsetInfo::PACKAGE_INFO, "graphics"); - translator.addPair(InsetInfo::TEXTCLASS_INFO, "article"); - translator.addPair(InsetInfo::MENU_INFO, "info-insert"); - translator.addPair(InsetInfo::ICON_INFO, "info-insert"); - translator.addPair(InsetInfo::BUFFER_INFO, "name"); - translator.addPair(InsetInfo::LYX_INFO, "version"); - translator.addPair(InsetInfo::VCS_INFO, "revision"); - translator.addPair(InsetInfo::DATE_INFO, "loclong"); - translator.addPair(InsetInfo::MODDATE_INFO, "loclong"); - translator.addPair(InsetInfo::FIXDATE_INFO, "loclong"); + translator.addPair(InsetInfoParams::SHORTCUTS_INFO, "info-insert"); + translator.addPair(InsetInfoParams::SHORTCUT_INFO, "info-insert"); + translator.addPair(InsetInfoParams::LYXRC_INFO, "user_name"); + translator.addPair(InsetInfoParams::PACKAGE_INFO, "graphics"); + translator.addPair(InsetInfoParams::TEXTCLASS_INFO, "article"); + translator.addPair(InsetInfoParams::MENU_INFO, "info-insert"); + translator.addPair(InsetInfoParams::ICON_INFO, "info-insert"); + translator.addPair(InsetInfoParams::BUFFER_INFO, "name"); + translator.addPair(InsetInfoParams::LYX_INFO, "version"); + translator.addPair(InsetInfoParams::VCS_INFO, "revision"); + translator.addPair(InsetInfoParams::DATE_INFO, "loclong"); + translator.addPair(InsetInfoParams::MODDATE_INFO, "loclong"); + translator.addPair(InsetInfoParams::FIXDATE_INFO, "loclong"); return translator; } @@ -126,217 +126,14 @@ DefaultValueTranslator const & defaultValueTranslator() } // namespace -///////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////// // -// InsetInfo +// InsetInfoParams // -///////////////////////////////////////////////////////////////////////// - - - -InsetInfo::InsetInfo(Buffer * buf, string const & name) - : InsetCollapsible(buf), initialized_(false), - type_(UNKNOWN_INFO), name_(), force_ltr_(false) -{ - setInfo(name); - status_ = Collapsed; -} - - -Inset * InsetInfo::editXY(Cursor & cur, int x, int y) -{ - // do not allow the cursor to be set in this Inset - return Inset::editXY(cur, x, y); -} - - -string InsetInfo::infoType() const -{ - return nameTranslator().find(type_); -} - - -docstring InsetInfo::layoutName() const -{ - return from_ascii("Info:" + infoType()); -} - - -docstring InsetInfo::toolTip(BufferView const &, int, int) const -{ - docstring result; - switch (nameTranslator().find(infoType())) { - case UNKNOWN_INFO: - result = _("Invalid information inset"); - break; - case SHORTCUT_INFO: - result = bformat(_("The keybard shortcut for the function '%1$s'"), - from_utf8(name_)); - break; - case SHORTCUTS_INFO: - result = bformat(_("The keybard shortcuts for the function '%1$s'"), - from_utf8(name_)); - break; - case MENU_INFO: - result = bformat(_("The menu location for the function '%1$s'"), - from_utf8(name_)); - break; - case ICON_INFO: - result = bformat(_("The toolbar icon for the function '%1$s'"), - from_utf8(name_)); - break; - case LYXRC_INFO: - result = bformat(_("The preference setting for the preference key '%1$s'"), - from_utf8(name_)); - break; - case PACKAGE_INFO: - result = bformat(_("Availability of the LaTeX package '%1$s'"), - from_utf8(name_)); - break; - case TEXTCLASS_INFO: - result = bformat(_("Availability of the LaTeX class '%1$s'"), - from_utf8(name_)); - break; - case BUFFER_INFO: - if (name_ == "name") - result = _("The name of this file"); - else if (name_ == "path") - result = _("The path where this file is saved"); - else if (name_ == "class") - result = _("The class this document uses"); - break; - case VCS_INFO: - if (name_ == "revision") - result = _("Version control revision"); - else if (name_ == "tree-revision") - result = _("Version control tree revision"); - else if (name_ == "author") - result = _("Version control author"); - else if (name_ == "date") - result = _("Version control date"); - else if (name_ == "time") - result = _("Version control time"); - break; - case LYX_INFO: - result = _("The current LyX version"); - break; - case DATE_INFO: - result = _("The current date"); - break; - case MODDATE_INFO: - result = _("The date of last save"); - break; - case FIXDATE_INFO: - result = _("A static date"); - break; - } - - return result; -} - - -void InsetInfo::read(Lexer & lex) -{ - string token; - while (lex.isOK()) { - lex.next(); - token = lex.getString(); - if (token == "type") { - lex.next(); - token = lex.getString(); - type_ = nameTranslator().find(token); - } else if (token == "arg") { - lex.next(true); - name_ = lex.getString(); - } else if (token == "\\end_inset") - break; - } - if (token != "\\end_inset") { - lex.printError("Missing \\end_inset at this point"); - throw ExceptionMessage(WarningException, - _("Missing \\end_inset at this point."), - from_utf8(token)); - } -} - - -void InsetInfo::write(ostream & os) const -{ - os << "Info\ntype \"" << infoType() - << "\"\narg " << Lexer::quoteString(name_); -} - - -bool InsetInfo::validateModifyArgument(docstring const & arg) const -{ - string type; - string name = trim(split(to_utf8(arg), type, ' ')); - - switch (nameTranslator().find(type)) { - case UNKNOWN_INFO: - return false; - - case SHORTCUT_INFO: - case SHORTCUTS_INFO: - case MENU_INFO: { - FuncRequest func = lyxaction.lookupFunc(name); - return func.action() != LFUN_UNKNOWN_ACTION; - } - - case ICON_INFO: { - FuncCode const action = lyxaction.lookupFunc(name).action(); - if (action == LFUN_UNKNOWN_ACTION) { - string dir = "images"; - return !imageLibFileSearch(dir, name, "svgz,png").empty(); - } - return true; - } - - case LYXRC_INFO: { - set rcs = lyxrc.getRCs(); - return rcs.find(name) != rcs.end(); - } - - case PACKAGE_INFO: - case TEXTCLASS_INFO: - return true; - - case BUFFER_INFO: - return (name == "name" || name == "path" || name == "class"); - - case VCS_INFO: - if (name == "revision" || name == "tree-revision" - || name == "author" || name == "date" || name == "time") - return buffer().lyxvc().inUse(); - return false; - - case LYX_INFO: - return name == "version"; - - case FIXDATE_INFO: { - string date; - string piece; - date = split(name, piece, '@'); - if (!date.empty() && !QDate::fromString(toqstr(date), Qt::ISODate).isValid()) - return false; - if (!piece.empty()) - name = piece; - } - // fall through - case DATE_INFO: - case MODDATE_INFO: { - if (name == "long" || name == "short" || name == "ISO") - return true; - else { - QDate date = QDate::currentDate(); - return !date.toString(toqstr(name)).isEmpty(); - } - } - } - - return false; -} +/////////////////////////////////////////////////////////////////////// +InsetInfoParams infoparams; namespace{ set getTexFileList(string const & filename) @@ -364,34 +161,34 @@ set getTexFileList(string const & filename) } } // namespace anon - -docstring InsetInfo::getDate(string const name, QDate const date) const +docstring InsetInfoParams::getDate(string const iname, QDate const date) const { QLocale loc; - if (lang_) - loc = QLocale(toqstr(lang_->code())); - if (name == "long") + if (lang) + loc = QLocale(toqstr(lang->code())); + if (iname == "long") return qstring_to_ucs4(loc.toString(date, QLocale::LongFormat)); - else if (name == "short") + else if (iname == "short") return qstring_to_ucs4(loc.toString(date, QLocale::ShortFormat)); - else if (name == "ISO") + else if (iname == "ISO") return qstring_to_ucs4(date.toString(Qt::ISODate)); - else if (name == "loclong") - return qstring_to_ucs4(loc.toString(date, toqstr(lang_->dateFormat(0)))); - else if (name == "locmedium") - return qstring_to_ucs4(loc.toString(date, toqstr(lang_->dateFormat(1)))); - else if (name == "locshort") - return qstring_to_ucs4(loc.toString(date, toqstr(lang_->dateFormat(2)))); + else if (iname == "loclong") + return qstring_to_ucs4(loc.toString(date, toqstr(lang->dateFormat(0)))); + else if (iname == "locmedium") + return qstring_to_ucs4(loc.toString(date, toqstr(lang->dateFormat(1)))); + else if (iname == "locshort") + return qstring_to_ucs4(loc.toString(date, toqstr(lang->dateFormat(2)))); else - return qstring_to_ucs4(loc.toString(date, toqstr(name))); + return qstring_to_ucs4(loc.toString(date, toqstr(iname))); } -vector> InsetInfo::getArguments(string const & type) const +vector> InsetInfoParams::getArguments(Buffer const * buf, + string const & itype) const { vector> result; - switch (nameTranslator().find(type)) { + switch (nameTranslator().find(itype)) { case UNKNOWN_INFO: result.push_back(make_pair("invalid", _("Please select a valid type!"))); break; @@ -422,7 +219,7 @@ vector> InsetInfo::getArguments(string const & type) cons case PACKAGE_INFO: case TEXTCLASS_INFO: { result.push_back(make_pair("custom", _("Custom"))); - string const filename = (type == "package") ? "styFiles.lst" + string const filename = (itype == "package") ? "styFiles.lst" : "clsFiles.lst"; set flist = getTexFileList(filename); for (auto const & f : flist) @@ -437,7 +234,7 @@ vector> InsetInfo::getArguments(string const & type) cons break; case VCS_INFO: { - if (!buffer().lyxvc().inUse()) { + if (!buf->lyxvc().inUse()) { result.push_back(make_pair("invalid", _("No version control!"))); break; } @@ -456,11 +253,11 @@ vector> InsetInfo::getArguments(string const & type) cons case FIXDATE_INFO: case DATE_INFO: case MODDATE_INFO: - string const dt = split(name_, '@'); + string const dt = split(name, '@'); QDate date; - if (type == "moddate") - date = QDateTime::fromTime_t(buffer().fileName().lastModified()).date(); - else if (type == "fixdate" && !dt.empty()) + if (itype == "moddate") + date = QDateTime::fromTime_t(buf->fileName().lastModified()).date(); + else if (itype == "fixdate" && !dt.empty()) date = QDate::fromString(toqstr(dt), Qt::ISODate); else date = QDate::currentDate(); @@ -483,6 +280,220 @@ vector> InsetInfo::getArguments(string const & type) cons } +string InsetInfoParams::infoType() const +{ + return nameTranslator().find(type); +} + + + +///////////////////////////////////////////////////////////////////////// +// +// InsetInfo +// +///////////////////////////////////////////////////////////////////////// + + + +InsetInfo::InsetInfo(Buffer * buf, string const & name) + : InsetCollapsible(buf), initialized_(false) +{ + params_.type = InsetInfoParams::UNKNOWN_INFO; + params_.force_ltr = false; + setInfo(name); + status_ = Collapsed; +} + + +Inset * InsetInfo::editXY(Cursor & cur, int x, int y) +{ + // do not allow the cursor to be set in this Inset + return Inset::editXY(cur, x, y); +} + + +docstring InsetInfo::layoutName() const +{ + return from_ascii("Info:" + params_.infoType()); +} + + +docstring InsetInfo::toolTip(BufferView const &, int, int) const +{ + docstring result; + switch (nameTranslator().find(params_.infoType())) { + case InsetInfoParams::UNKNOWN_INFO: + result = _("Invalid information inset"); + break; + case InsetInfoParams::SHORTCUT_INFO: + result = bformat(_("The keybard shortcut for the function '%1$s'"), + from_utf8(params_.name)); + break; + case InsetInfoParams::SHORTCUTS_INFO: + result = bformat(_("The keybard shortcuts for the function '%1$s'"), + from_utf8(params_.name)); + break; + case InsetInfoParams::MENU_INFO: + result = bformat(_("The menu location for the function '%1$s'"), + from_utf8(params_.name)); + break; + case InsetInfoParams::ICON_INFO: + result = bformat(_("The toolbar icon for the function '%1$s'"), + from_utf8(params_.name)); + break; + case InsetInfoParams::LYXRC_INFO: + result = bformat(_("The preference setting for the preference key '%1$s'"), + from_utf8(params_.name)); + break; + case InsetInfoParams::PACKAGE_INFO: + result = bformat(_("Availability of the LaTeX package '%1$s'"), + from_utf8(params_.name)); + break; + case InsetInfoParams::TEXTCLASS_INFO: + result = bformat(_("Availability of the LaTeX class '%1$s'"), + from_utf8(params_.name)); + break; + case InsetInfoParams::BUFFER_INFO: + if (params_.name == "name") + result = _("The name of this file"); + else if (params_.name == "path") + result = _("The path where this file is saved"); + else if (params_.name == "class") + result = _("The class this document uses"); + break; + case InsetInfoParams::VCS_INFO: + if (params_.name == "revision") + result = _("Version control revision"); + else if (params_.name == "tree-revision") + result = _("Version control tree revision"); + else if (params_.name == "author") + result = _("Version control author"); + else if (params_.name == "date") + result = _("Version control date"); + else if (params_.name == "time") + result = _("Version control time"); + break; + case InsetInfoParams::LYX_INFO: + result = _("The current LyX version"); + break; + case InsetInfoParams::DATE_INFO: + result = _("The current date"); + break; + case InsetInfoParams::MODDATE_INFO: + result = _("The date of last save"); + break; + case InsetInfoParams::FIXDATE_INFO: + result = _("A static date"); + break; + } + + return result; +} + + +void InsetInfo::read(Lexer & lex) +{ + string token; + while (lex.isOK()) { + lex.next(); + token = lex.getString(); + if (token == "type") { + lex.next(); + token = lex.getString(); + params_.type = nameTranslator().find(token); + } else if (token == "arg") { + lex.next(true); + params_.name = lex.getString(); + } else if (token == "\\end_inset") + break; + } + if (token != "\\end_inset") { + lex.printError("Missing \\end_inset at this point"); + throw ExceptionMessage(WarningException, + _("Missing \\end_inset at this point."), + from_utf8(token)); + } +} + + +void InsetInfo::write(ostream & os) const +{ + os << "Info\ntype \"" << params_.infoType() + << "\"\narg " << Lexer::quoteString(params_.name); +} + + +bool InsetInfo::validateModifyArgument(docstring const & arg) const +{ + string type; + string name = trim(split(to_utf8(arg), type, ' ')); + + switch (nameTranslator().find(type)) { + case InsetInfoParams::UNKNOWN_INFO: + return false; + + case InsetInfoParams::SHORTCUT_INFO: + case InsetInfoParams::SHORTCUTS_INFO: + case InsetInfoParams::MENU_INFO: { + FuncRequest func = lyxaction.lookupFunc(name); + return func.action() != LFUN_UNKNOWN_ACTION; + } + + case InsetInfoParams::ICON_INFO: { + FuncCode const action = lyxaction.lookupFunc(name).action(); + if (action == LFUN_UNKNOWN_ACTION) { + string dir = "images"; + return !imageLibFileSearch(dir, name, "svgz,png").empty(); + } + return true; + } + + case InsetInfoParams::LYXRC_INFO: { + set rcs = lyxrc.getRCs(); + return rcs.find(name) != rcs.end(); + } + + case InsetInfoParams::PACKAGE_INFO: + case InsetInfoParams::TEXTCLASS_INFO: + return true; + + case InsetInfoParams::BUFFER_INFO: + return (name == "name" || name == "path" || name == "class"); + + case InsetInfoParams::VCS_INFO: + if (name == "revision" || name == "tree-revision" + || name == "author" || name == "date" || name == "time") + return buffer().lyxvc().inUse(); + return false; + + case InsetInfoParams::LYX_INFO: + return name == "version"; + + case InsetInfoParams::FIXDATE_INFO: { + string date; + string piece; + date = split(name, piece, '@'); + if (!date.empty() && !QDate::fromString(toqstr(date), Qt::ISODate).isValid()) + return false; + if (!piece.empty()) + name = piece; + } + // fall through + case InsetInfoParams::DATE_INFO: + case InsetInfoParams::MODDATE_INFO: { + if (name == "long" || name == "short" || name == "ISO") + return true; + else { + QDate date = QDate::currentDate(); + return !date.toString(toqstr(name)).isEmpty(); + } + } + } + + return false; +} + + bool InsetInfo::showInsetDialog(BufferView * bv) const { bv->showDialog("info"); @@ -507,11 +518,11 @@ bool InsetInfo::getStatus(Cursor & cur, FuncRequest const & cmd, flag.setEnabled(true); string typestr; string name = trim(split(to_utf8(cmd.argument()), typestr, ' ')); - info_type type = nameTranslator().find(typestr); - string origname = name_; - if (type == FIXDATE_INFO) - split(name_, origname, '@'); - flag.setOnOff(type == type_ && name == origname); + InsetInfoParams::info_type type = nameTranslator().find(typestr); + string origname = params_.name; + if (type == InsetInfoParams::FIXDATE_INFO) + split(params_.name, origname, '@'); + flag.setOnOff(type == params_.type && name == origname); return true; } //fall through @@ -560,24 +571,24 @@ void InsetInfo::setInfo(string const & name) string saved_date_specifier; // Store old date specifier for potential re-use - if (!name_.empty()) - saved_date_specifier = split(name_, '@'); + if (!params_.name.empty()) + saved_date_specifier = split(params_.name, '@'); // info_type name string type; - name_ = trim(split(name, type, ' ')); - type_ = nameTranslator().find(type); - if (name_.empty()) - name_ = defaultValueTranslator().find(type_); - if (type_ == FIXDATE_INFO) { - string const date_specifier = split(name_, '@'); + params_.name = trim(split(name, type, ' ')); + params_.type = nameTranslator().find(type); + if (params_.name.empty()) + params_.name = defaultValueTranslator().find(params_.type); + if (params_.type == InsetInfoParams::FIXDATE_INFO) { + string const date_specifier = split(params_.name, '@'); // If an explicit new fix date is specified, use that // Otherwise, use the old one or, if there is none, // the current date if (date_specifier.empty()) { if (saved_date_specifier.empty()) - name_ += "@" + fromqstr(QDate::currentDate().toString(Qt::ISODate)); + params_.name += "@" + fromqstr(QDate::currentDate().toString(Qt::ISODate)); else - name_ += "@" + saved_date_specifier; + params_.name += "@" + saved_date_specifier; } } } @@ -585,7 +596,7 @@ void InsetInfo::setInfo(string const & name) void InsetInfo::error(docstring const & err, Language const * lang) { - setText(bformat(translateIfPossible(err, lang->code()), from_utf8(name_)), + setText(bformat(translateIfPossible(err, lang->code()), from_utf8(params_.name)), Font(inherit_font, lang), false); } @@ -605,7 +616,7 @@ void InsetInfo::setText(docstring const & str, Language const * lang) bool InsetInfo::forceLTR() const { - return force_ltr_; + return params_.force_ltr; } @@ -619,137 +630,137 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) { return; BufferParams const & bp = buffer().params(); - lang_ = it.paragraph().getFontSettings(bp, it.pos()).language(); + params_.lang = it.paragraph().getFontSettings(bp, it.pos()).language(); Language const * tryguilang = languages.getFromCode(Messages::guiLanguage()); // Some info insets use the language of the GUI (if available) - Language const * guilang = tryguilang ? tryguilang : lang_; + Language const * guilang = tryguilang ? tryguilang : params_.lang; - force_ltr_ = !lang_->rightToLeft(); + params_.force_ltr = !params_.lang->rightToLeft(); // This is just to get the string into the po files docstring gui; - switch (type_) { - case UNKNOWN_INFO: + switch (params_.type) { + case InsetInfoParams::UNKNOWN_INFO: gui = _("Unknown Info!"); - info(from_ascii("Unknown Info!"), lang_); + info(from_ascii("Unknown Info!"), params_.lang); initialized_ = false; break; - case SHORTCUT_INFO: - case SHORTCUTS_INFO: { + case InsetInfoParams::SHORTCUT_INFO: + case InsetInfoParams::SHORTCUTS_INFO: { // shortcuts can change, so we need to re-do this each time - FuncRequest const func = lyxaction.lookupFunc(name_); + FuncRequest const func = lyxaction.lookupFunc(params_.name); if (func.action() == LFUN_UNKNOWN_ACTION) { gui = _("Unknown action %1$s"); - error(from_ascii("Unknown action %1$s"), lang_); + error(from_ascii("Unknown action %1$s"), params_.lang); break; } KeyMap::Bindings bindings = theTopLevelKeymap().findBindings(func); if (bindings.empty()) { gui = _("undefined"); - info(from_ascii("undefined"), lang_); + info(from_ascii("undefined"), params_.lang); break; } - if (type_ == SHORTCUT_INFO) + if (params_.type == InsetInfoParams::SHORTCUT_INFO) setText(bindings.begin()->print(KeySequence::ForGui), guilang); else setText(theTopLevelKeymap().printBindings(func, KeySequence::ForGui), guilang); - force_ltr_ = !guilang->rightToLeft() && !lang_->rightToLeft(); + params_.force_ltr = !guilang->rightToLeft() && !params_.lang->rightToLeft(); break; } - case LYXRC_INFO: { + case InsetInfoParams::LYXRC_INFO: { // this information could change, if the preferences are changed, // so we will recalculate each time through. ostringstream oss; - if (name_.empty()) { + if (params_.name.empty()) { gui = _("undefined"); - info(from_ascii("undefined"), lang_); + info(from_ascii("undefined"), params_.lang); break; } // FIXME this uses the serialization mechanism to get the info // we want, which i guess works but is a bit strange. - lyxrc.write(oss, true, name_); + lyxrc.write(oss, true, params_.name); string result = oss.str(); if (result.size() < 2) { gui = _("undefined"); - info(from_ascii("undefined"), lang_); + info(from_ascii("undefined"), params_.lang); break; } string::size_type loc = result.rfind("\n", result.size() - 2); loc = loc == string::npos ? 0 : loc + 1; - if (result.size() < loc + name_.size() + 1 - || result.substr(loc + 1, name_.size()) != name_) { + if (result.size() < loc + params_.name.size() + 1 + || result.substr(loc + 1, params_.name.size()) != params_.name) { gui = _("undefined"); - info(from_ascii("undefined"), lang_); + info(from_ascii("undefined"), params_.lang); break; } // remove leading comments and \\name and space - result = result.substr(loc + name_.size() + 2); + result = result.substr(loc + params_.name.size() + 2); // remove \n and "" result = rtrim(result, "\n"); result = trim(result, "\""); - setText(from_utf8(result), lang_); + setText(from_utf8(result), params_.lang); break; } - case PACKAGE_INFO: + case InsetInfoParams::PACKAGE_INFO: // only need to do this once. if (initialized_) break; // check in packages.lst - if (LaTeXFeatures::isAvailable(name_)) { + if (LaTeXFeatures::isAvailable(params_.name)) { gui = _("yes"); - info(from_ascii("yes"), lang_); + info(from_ascii("yes"), params_.lang); } else { gui = _("no"); - info(from_ascii("no"), lang_); + info(from_ascii("no"), params_.lang); } initialized_ = true; break; - case TEXTCLASS_INFO: { + case InsetInfoParams::TEXTCLASS_INFO: { // the TextClass can change LayoutFileList const & list = LayoutFileList::get(); bool available = false; - // name_ is the class name - if (list.haveClass(name_)) - available = list[name_].isTeXClassAvailable(); + // params_.name is the class name + if (list.haveClass(params_.name)) + available = list[params_.name].isTeXClassAvailable(); if (available) { gui = _("yes"); - info(from_ascii("yes"), lang_); + info(from_ascii("yes"), params_.lang); } else { gui = _("no"); - info(from_ascii("no"), lang_); + info(from_ascii("no"), params_.lang); } break; } - case MENU_INFO: { + case InsetInfoParams::MENU_INFO: { // only need to do this once. if (initialized_) break; // and we will not keep trying if we fail initialized_ = true; docstring_list names; - FuncRequest const func = lyxaction.lookupFunc(name_); + FuncRequest const func = lyxaction.lookupFunc(params_.name); if (func.action() == LFUN_UNKNOWN_ACTION) { gui = _("Unknown action %1$s"); - error(from_ascii("Unknown action %1$s"), lang_); + error(from_ascii("Unknown action %1$s"), params_.lang); break; } // iterate through the menubackend to find it if (!theApp()) { gui = _("Can't determine menu entry for action %1$s in batch mode"); - error(from_ascii("Can't determine menu entry for action %1$s in batch mode"), lang_); + error(from_ascii("Can't determine menu entry for action %1$s in batch mode"), params_.lang); break; } if (!theApp()->searchMenu(func, names)) { gui = _("No menu entry for action %1$s"); - error(from_ascii("No menu entry for action %1$s"), lang_); + error(from_ascii("No menu entry for action %1$s"), params_.lang); break; } // if found, return its path. clear(); Paragraph & par = paragraphs().front(); Font const f(inherit_font, guilang); - force_ltr_ = !guilang->rightToLeft(); + params_.force_ltr = !guilang->rightToLeft(); //Font fu = f; //fu.fontInfo().setUnderbar(FONT_ON); for (docstring const & name : names) { @@ -767,13 +778,13 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) { } break; } - case ICON_INFO: { + case InsetInfoParams::ICON_INFO: { // only need to do this once. if (initialized_) break; // and we will not keep trying if we fail initialized_ = true; - FuncRequest func = lyxaction.lookupFunc(name_); + FuncRequest func = lyxaction.lookupFunc(params_.name); docstring icon_name = frontend::Application::iconName(func, true); // FIXME: We should use the icon directly instead of // going through FileName. The code below won't work @@ -786,7 +797,7 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) { FileName file(to_utf8(icon_name)); if (file.onlyFileNameWithoutExt() == "unknown") { string dir = "images"; - FileName file2(imageLibFileSearch(dir, name_, "svgz,png")); + FileName file2(imageLibFileSearch(dir, params_.name, "svgz,png")); if (!file2.empty()) file = file2; } @@ -812,70 +823,71 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) { igp.width = Length(1, Length::EM); inset->setParams(igp); clear(); - Font const f(inherit_font, lang_); + Font const f(inherit_font, params_.lang); paragraphs().front().insertInset(0, inset, f, Change(Change::UNCHANGED)); break; } - case BUFFER_INFO: { + case InsetInfoParams::BUFFER_INFO: { // this could all change, so we will recalculate each time - if (name_ == "name") - setText(from_utf8(buffer().fileName().onlyFileName()), lang_); - else if (name_ == "path") - setText(from_utf8(os::latex_path(buffer().filePath())), lang_); - else if (name_ == "class") - setText(from_utf8(bp.documentClass().name()), lang_); + if (params_.name == "name") + setText(from_utf8(buffer().fileName().onlyFileName()), params_.lang); + else if (params_.name == "path") + setText(from_utf8(os::latex_path(buffer().filePath())), params_.lang); + else if (params_.name == "class") + setText(from_utf8(bp.documentClass().name()), params_.lang); break; } - case VCS_INFO: { + case InsetInfoParams::VCS_INFO: { // this information could change, in principle, so we will // recalculate each time through if (!buffer().lyxvc().inUse()) { gui = _("No version control!"); - info(from_ascii("No version control!"), lang_); + info(from_ascii("No version control!"), params_.lang); break; } LyXVC::RevisionInfo itype = LyXVC::Unknown; - if (name_ == "revision") + if (params_.name == "revision") itype = LyXVC::File; - else if (name_ == "tree-revision") + else if (params_.name == "tree-revision") itype = LyXVC::Tree; - else if (name_ == "author") + else if (params_.name == "author") itype = LyXVC::Author; - else if (name_ == "time") + else if (params_.name == "time") itype = LyXVC::Time; - else if (name_ == "date") + else if (params_.name == "date") itype = LyXVC::Date; string binfo = buffer().lyxvc().revisionInfo(itype); if (binfo.empty()) { gui = _("%1$s[[vcs data]] unknown"); - error(from_ascii("%1$s[[vcs data]] unknown"), lang_); + error(from_ascii("%1$s[[vcs data]] unknown"), params_.lang); } else - setText(from_utf8(binfo), lang_); + setText(from_utf8(binfo), params_.lang); break; } - case LYX_INFO: + case InsetInfoParams::LYX_INFO: // only need to do this once. if (initialized_) break; - if (name_ == "version") - setText(from_ascii(lyx_version), lang_); + if (params_.name == "version") + setText(from_ascii(lyx_version), params_.lang); initialized_ = true; break; - case DATE_INFO: - case MODDATE_INFO: - case FIXDATE_INFO: { - string date_format = name_; - string const date_specifier = (type_ == FIXDATE_INFO && contains(name_, '@')) - ? split(name_, date_format, '@') : string(); + case InsetInfoParams::DATE_INFO: + case InsetInfoParams::MODDATE_INFO: + case InsetInfoParams::FIXDATE_INFO: { + string date_format = params_.name; + string const date_specifier = (params_.type == InsetInfoParams::FIXDATE_INFO + && contains(params_.name, '@')) + ? split(params_.name, date_format, '@') : string(); QDate date; - if (type_ == MODDATE_INFO) + if (params_.type == InsetInfoParams::MODDATE_INFO) date = QDateTime::fromTime_t(buffer().fileName().lastModified()).date(); - else if (type_ == FIXDATE_INFO && !date_specifier.empty()) + else if (params_.type == InsetInfoParams::FIXDATE_INFO && !date_specifier.empty()) date = QDate::fromString(toqstr(date_specifier), Qt::ISODate); else date = QDate::currentDate(); - setText(getDate(date_format, date), lang_); + setText(params_.getDate(date_format, date), params_.lang); } } // Just to do something with that string diff --git a/src/insets/InsetInfo.h b/src/insets/InsetInfo.h index e7bb91d4bc..5d60e05b79 100644 --- a/src/insets/InsetInfo.h +++ b/src/insets/InsetInfo.h @@ -97,7 +97,7 @@ the command buffer (view->Toolbar->Command Buffer). */ -class InsetInfo : public InsetCollapsible { +class InsetInfoParams { public: enum info_type { DATE_INFO, // Current Date @@ -115,7 +115,28 @@ public: LYX_INFO, // LyX version information UNKNOWN_INFO, // Invalid type }; + /// + docstring getDate(std::string const, QDate const date = QDate::currentDate()) const; + /// + std::vector> getArguments(Buffer const * buf, + std::string const &) const; + /// + info_type type; + /// + std::string infoType() const; + /// + std::string name; + /// + Language const * lang; + /// + bool force_ltr; +}; +/// +extern InsetInfoParams infoparams; + +class InsetInfo : public InsetCollapsible { +public: /// InsetInfo(Buffer * buf, std::string const & info = std::string()); /// @@ -138,14 +159,8 @@ public: /// void write(std::ostream & os) const; /// - std::string infoType() const; - /// - std::string infoName() const { return name_; } - /// bool validateModifyArgument(docstring const & argument) const; /// - std::vector> getArguments(std::string const &) const; - /// bool showInsetDialog(BufferView * bv) const; /// bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const; @@ -165,6 +180,8 @@ public: std::string contextMenuName() const; /// should paragraph indendation be omitted in any case? bool neverIndent() const { return true; } + /// + InsetInfoParams params() const { return params_; } private: /// @@ -175,20 +192,14 @@ private: void info(docstring const & err, Language const *); /// void setText(docstring const & str, Language const *); - /// - docstring getDate(std::string const, QDate const date = QDate::currentDate()) const; // make sure that the other version of setText is still available. using InsetCollapsible::setText; /// bool initialized_; /// - info_type type_; + InsetInfoParams params_; /// - std::string name_; - /// - bool force_ltr_; - /// - Language const * lang_; + friend class InsetInfoParams; };