]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetInfo.cpp
Improve handling of top and bottom margin
[lyx.git] / src / insets / InsetInfo.cpp
index e712a7564d14f803f861663c6d38a8d422f82fd1..0847106dc01e3025c0997f13d2f0f0fdac076543 100644 (file)
@@ -157,9 +157,9 @@ set<string> getTexFileList(string const & filename)
 
        // Normalise paths like /foo//bar ==> /foo/bar
        for (auto doc : doclist) {
-               subst(doc, from_ascii("\r"), docstring());
+               doc = subst(doc, from_ascii("\r"), docstring());
                while (contains(doc, from_ascii("//")))
-                       subst(doc, from_ascii("//"), from_ascii("/"));
+                       doc = subst(doc, from_ascii("//"), from_ascii("/"));
                if (!doc.empty())
                        list.insert(removeExtension(onlyFileName(to_utf8(doc))));
        }
@@ -167,10 +167,16 @@ set<string> getTexFileList(string const & filename)
        // remove duplicates
        return list;
 }
+
+bool translateString(docstring const & in, docstring & out, string const & lcode)
+{
+       out = translateIfPossible(in, lcode);
+       return in != out;
+}
 } // namespace anon
 
 
-docstring InsetInfoParams::getDate(string const iname, QDate const date) const
+docstring InsetInfoParams::getDate(string const iname, QDate const date) const
 {
        QLocale loc;
        if (lang)
@@ -195,7 +201,7 @@ docstring InsetInfoParams::getDate(string const iname, QDate const date) const
 }
 
 
-docstring InsetInfoParams::getTime(string const iname, QTime const time) const
+docstring InsetInfoParams::getTime(string const iname, QTime const time) const
 {
        QLocale loc;
        if (lang)
@@ -272,6 +278,7 @@ vector<pair<string,docstring>> InsetInfoParams::getArguments(Buffer const * buf,
                        break;
                }
                result.push_back(make_pair("revision", _("Revision[[Version Control]]")));
+               result.push_back(make_pair("revision-abbrev", _("Abbreviated revision[[Version Control]]")));
                result.push_back(make_pair("tree-revision", _("Tree revision")));
                result.push_back(make_pair("author", _("Author")));
                result.push_back(make_pair("date", _("Date")));
@@ -281,6 +288,7 @@ vector<pair<string,docstring>> InsetInfoParams::getArguments(Buffer const * buf,
 
        case LYX_INFO:
                result.push_back(make_pair("version", _("LyX version")));
+               result.push_back(make_pair("layoutformat", _("LyX layout format")));
                break;
 
        case FIXDATE_INFO:
@@ -378,13 +386,13 @@ bool InsetInfoParams::validateArgument(Buffer const * buf, docstring const & arg
                        || name == "path" || name == "class");
 
        case VCS_INFO:
-               if (name == "revision" || name == "tree-revision"
+               if (name == "revision" || name == "revision-abbrev" || name == "tree-revision"
                    || name == "author" || name == "date" || name == "time")
                        return buf->lyxvc().inUse();
                return false;
 
        case LYX_INFO:
-               return name == "version";
+               return name == "version" || name == "layoutformat";
 
        case FIXDATE_INFO: {
                string date;
@@ -522,6 +530,8 @@ docstring InsetInfo::toolTip(BufferView const &, int, int) const
        case InsetInfoParams::VCS_INFO:
                if (params_.name == "revision")
                        result = _("Version control revision");
+               else if (params_.name == "revision-abbrev")
+                       result = _("Version control abbreviated revision");
                else if (params_.name == "tree-revision")
                        result = _("Version control tree revision");
                else if (params_.name == "author")
@@ -532,7 +542,10 @@ docstring InsetInfo::toolTip(BufferView const &, int, int) const
                        result = _("Version control time");
                break;
        case InsetInfoParams::LYX_INFO:
-               result = _("The current LyX version");
+               if (params_.name == "version")
+                       result = _("The current LyX version");
+               else if (params_.name == "layoutformat")
+                       result = _("The current LyX layout format");
                break;
        case InsetInfoParams::DATE_INFO:
                result = _("The current date");
@@ -706,15 +719,21 @@ void InsetInfo::setInfo(string const & name)
 
 void InsetInfo::error(docstring const & err, Language const * lang)
 {
-       setText(bformat(translateIfPossible(err, lang->code()), from_utf8(params_.name)),
-               Font(inherit_font, lang), false);
+       docstring const res = translateIfPossible(err, lang->code());
+       bool const translated = res != err;
+       // If the string is not translated, we use default lang (English)
+       Font const f = translated ? Font(inherit_font, lang) : Font(inherit_font);
+       setText(bformat(res, from_utf8(params_.name)), f, false);
 }
 
 
 void InsetInfo::info(docstring const & err, Language const * lang)
 {
-       setText(translateIfPossible(err, lang->code()),
-                       Font(inherit_font, lang), false);
+       docstring const res = translateIfPossible(err, lang->code());
+       bool const translated = res != err;
+       // If the string is not translated, we use default lang (English)
+       Font const f = translated ? Font(inherit_font, lang) : Font(inherit_font);
+       setText(translateIfPossible(err, lang->code()), f, false);
 }
 
 
@@ -724,13 +743,21 @@ void InsetInfo::setText(docstring const & str, Language const * lang)
 }
 
 
-bool InsetInfo::forceLTR() const
+bool InsetInfo::forceLTR(OutputParams const &) const
 {
        return params_.force_ltr;
 }
 
 
-void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) {
+bool InsetInfo::forceLocalFontSwitch() const
+{
+       return params_.type == InsetInfoParams::MENU_INFO
+               || params_.type == InsetInfoParams::SHORTCUTS_INFO
+               || params_.type == InsetInfoParams::L7N_INFO;
+}
+
+
+void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype, bool const deleted) {
        // If the Buffer is a clone, then we neither need nor want to do any
        // of what follows. We want, rather, just to inherit how things were
        // in the original Buffer. This is especially important for VCS.
@@ -770,84 +797,105 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) {
                        break;
                }
                docstring sequence;
-               if (params_.type == InsetInfoParams::SHORTCUT_INFO)
+               docstring seq_untranslated;
+               if (params_.type == InsetInfoParams::SHORTCUT_INFO) {
                        sequence = bindings.begin()->print(KeySequence::ForGui);
-               else
+                       seq_untranslated = bindings.begin()->print(KeySequence::ForGui, true);
+               } else {
                        sequence = theTopLevelKeymap().printBindings(func, KeySequence::ForGui);
+                       seq_untranslated = theTopLevelKeymap().printBindings(func, KeySequence::ForGui, true);
+               }
                // QKeySequence returns special characters for keys on the mac
                // Since these are not included in many fonts, we
                // re-translate them to textual names (see #10641)
                odocstringstream ods;
                string const lcode = params_.lang->code();
+               docstring trans;
+               bool is_translated = sequence != seq_untranslated;
                for (size_t n = 0; n < sequence.size(); ++n) {
                        char_type const c = sequence[n];
                        switch(c) {
                        case 0x21b5://Return
                                gui = _("Return[[Key]]");
-                               ods << translateIfPossible(from_ascii("Return[[Key]]"), lcode);
+                               is_translated = translateString(from_ascii("Return[[Key]]"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x21b9://Tab both directions (Win)
                                gui = _("Tab[[Key]]");
-                               ods << translateIfPossible(from_ascii("Tab[[Key]]"), lcode);
+                               is_translated = translateString(from_ascii("Tab[[Key]]"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x21de://Qt::Key_PageUp
                                gui = _("PgUp");
-                               ods << translateIfPossible(from_ascii("PgUp"), lcode);
+                               is_translated = translateString(from_ascii("PgUp"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x21df://Qt::Key_PageDown
                                gui = _("PgDown");
-                               ods << translateIfPossible(from_ascii("PgDown"), lcode);
+                               is_translated = translateString(from_ascii("PgDown"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x21e4://Qt::Key_Backtab
                                gui = _("Backtab");
-                               ods << translateIfPossible(from_ascii("Backtab"), lcode);
+                               is_translated = translateString(from_ascii("Backtab"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x21e5://Qt::Key_Tab
                                gui = _("Tab");
-                               ods << translateIfPossible(from_ascii("Tab"), lcode);
+                               is_translated = translateString(from_ascii("Tab"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x21e7://Shift
                                gui = _("Shift");
-                               ods << translateIfPossible(from_ascii("Shift"), lcode);
+                               is_translated = translateString(from_ascii("Shift"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x21ea://Qt::Key_CapsLock
                                gui = _("CapsLock");
-                               ods << translateIfPossible(from_ascii("CapsLock"), lcode);
+                               is_translated = translateString(from_ascii("CapsLock"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x2303://Control
                                gui = _("Control[[Key]]");
-                               ods << translateIfPossible(from_ascii("Control[[Key]]"), lcode);
+                               is_translated = translateString(from_ascii("Control[[Key]]"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x2318://CMD
                                gui = _("Command[[Key]]");
-                               ods << translateIfPossible(from_ascii("Command[[Key]]"), lcode);
+                               is_translated = translateString(from_ascii("Command[[Key]]"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x2324://Qt::Key_Enter
                                gui = _("Return[[Key]]");
-                               ods << translateIfPossible(from_ascii("Return[[Key]]"), lcode);
+                               is_translated = translateString(from_ascii("Return[[Key]]"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x2325://Option key
                                gui = _("Option[[Key]]");
-                               ods << translateIfPossible(from_ascii("Option[[Key]]"), lcode);
+                               is_translated = translateString(from_ascii("Option[[Key]]"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x2326://Qt::Key_Delete
                                gui = _("Delete[[Key]]");
-                               ods << translateIfPossible(from_ascii("Delete[[Key]]"), lcode);
+                               is_translated = translateString(from_ascii("Delete[[Key]]"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x232b://Qt::Key_Backspace
                                gui = _("Fn+Del");
-                               ods << translateIfPossible(from_ascii("Fn+Delete"), lcode);
+                               is_translated = translateString(from_ascii("Fn+Del"), trans, lcode);
+                               ods << trans;
                                break;
                        case 0x238b://Qt::Key_Escape
                                gui = _("Esc");
-                               ods << translateIfPossible(from_ascii("Esc"), lcode);
+                               is_translated = translateString(from_ascii("Esc"), trans, lcode);
+                               ods << trans;
                                break;
                        default:
                                ods.put(c);
                        }
                }
-               setText(ods.str(), guilang);
-               params_.force_ltr = !guilang->rightToLeft() && !params_.lang->rightToLeft();
+               setText(ods.str(), is_translated ? guilang : nullptr);
+               params_.force_ltr = !is_translated || (!guilang->rightToLeft() && !params_.lang->rightToLeft());
                break;
        }
        case InsetInfoParams::LYXRC_INFO: {
@@ -997,14 +1045,6 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) {
                initialized_ = true;
                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
-               // if the icon is embedded in the executable through
-               // the Qt resource system.
-               // This is only a negligible performance problem:
-               // If the installed icon differs from the resource icon the
-               // installed one is preferred anyway, and all icons that are
-               // embedded in the resources are installed as well.
                FileName file(to_utf8(icon_name));
                if (file.onlyFileNameWithoutExt() == "unknown") {
                        string dir = "images";
@@ -1062,6 +1102,8 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) {
                LyXVC::RevisionInfo itype = LyXVC::Unknown;
                if (params_.name == "revision")
                        itype = LyXVC::File;
+               else if (params_.name == "revision-abbrev")
+                       itype = LyXVC::FileAbbrev;
                else if (params_.name == "tree-revision")
                        itype = LyXVC::Tree;
                else if (params_.name == "author")
@@ -1084,6 +1126,8 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) {
                        break;
                if (params_.name == "version")
                        setText(from_ascii(lyx_version), params_.lang);
+               else if (params_.name == "layoutformat")
+                       setText(convert<docstring>(LAYOUT_FORMAT), params_.lang);
                initialized_ = true;
                break;
        case InsetInfoParams::DATE_INFO:
@@ -1124,7 +1168,7 @@ void InsetInfo::updateBuffer(ParIterator const & it, UpdateType utype) {
 
        // Just to do something with that string
        LYXERR(Debug::INFO, "info inset text: " << gui);
-       InsetCollapsible::updateBuffer(it, utype);
+       InsetCollapsible::updateBuffer(it, utype, deleted);
 }