X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FToolbarBackend.C;h=b12fed44df1b0f956d33e2acc45285935a02072b;hb=e7f4618bcce770369cf46335c2c7f0164b4b8857;hp=b16f85120b3273c418cef9656f3389c5bcf89d01;hpb=31f6d268e2ae124ffb1d80cf83316390d72c3637;p=lyx.git diff --git a/src/ToolbarBackend.C b/src/ToolbarBackend.C index b16f85120b..b12fed44df 100644 --- a/src/ToolbarBackend.C +++ b/src/ToolbarBackend.C @@ -3,18 +3,19 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author unknown + * \author Jean-Marc Lasgouttes + * \author John Levon * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. */ #include #include "ToolbarBackend.h" +#include "funcrequest.h" #include "LyXAction.h" #include "lyxlex.h" #include "debug.h" -#include "lyxlex.h" #include "gettext.h" #include "support/lstrings.h" @@ -22,7 +23,19 @@ #include "frontends/controllers/ControlMath.h" + +namespace lyx { + +using support::compare_ascii_no_case; +using support::getVectorFromString; +using support::libFileSearch; +using support::subst; + using std::endl; +using std::make_pair; +using std::string; +using std::vector; + ToolbarBackend toolbarbackend; @@ -33,18 +46,19 @@ enum tooltags { TO_ENDTOOLBAR, TO_SEPARATOR, TO_LAYOUTS, + TO_MINIBUFFER, TO_LAST }; - struct keyword_item toolTags[TO_LAST - 1] = { { "end", TO_ENDTOOLBAR }, { "item", TO_ADD }, { "layouts", TO_LAYOUTS }, + { "minibuffer", TO_MINIBUFFER }, { "separator", TO_SEPARATOR } }; -} // end of anon namespace +} // namespace anon ToolbarBackend::ToolbarBackend() @@ -64,21 +78,13 @@ void ToolbarBackend::read(LyXLex & lex) Toolbar tb; tb.name = lex.getString(); - lex.next(true); - string type = lex.getString(); - if (!compare_ascii_no_case(type, "off")) - tb.display_type = OFF; - else if (!compare_ascii_no_case(type, "on")) - tb.display_type = ON; - else if (!compare_ascii_no_case(type, "math")) - tb.display_type = MATH; - else if (!compare_ascii_no_case(type, "table")) - tb.display_type = TABLE; - else { - lyxerr << "ToolbarBackend::read: unrecognised token:`" - << type << '\'' << endl; + if (!lex.isOK()) { + lyxerr << "ToolbarBackend::read: Malformed toolbar " + "description " << lex.getString() << endl; + return; } + tb.gui_name = lex.getString(); bool quit = false; @@ -91,22 +97,29 @@ void ToolbarBackend::read(LyXLex & lex) switch (lex.lex()) { case TO_ADD: if (lex.next(true)) { - string const tooltip = _(lex.getString()); + docstring const tooltip = translateIfPossible(lex.getDocString()); lex.next(true); - string const func = lex.getString(); + string const func_arg = lex.getString(); lyxerr[Debug::PARSER] << "ToolbarBackend::read TO_ADD func: `" - << func << '\'' << endl; + << func_arg << '\'' << endl; + + FuncRequest func = + lyxaction.lookupFunc(func_arg); add(tb, func, tooltip); } break; + case TO_MINIBUFFER: + add(tb, FuncRequest(kb_action(MINIBUFFER))); + break; + case TO_SEPARATOR: - add(tb, SEPARATOR); + add(tb, FuncRequest(kb_action(SEPARATOR))); break; case TO_LAYOUTS: - add(tb, LAYOUTS); + add(tb, FuncRequest(kb_action(LAYOUTS))); break; case TO_ENDTOOLBAR: @@ -125,47 +138,111 @@ void ToolbarBackend::read(LyXLex & lex) } -void ToolbarBackend::add(Toolbar & tb, int action, string const & tooltip) +void ToolbarBackend::readToolbars(LyXLex & lex) { - tb.items.push_back(make_pair(action, tooltip)); -} + //consistency check + if (compare_ascii_no_case(lex.getString(), "toolbars")) { + lyxerr << "ToolbarBackend::read: ERROR wrong token:`" + << lex.getString() << '\'' << endl; + } + lex.next(true); -void ToolbarBackend::add(Toolbar & tb, string const & func, string const & tooltip) -{ - int const tf = lyxaction.LookupFunc(func); + while (lex.isOK()) { + string name = lex.getString(); + lex.next(true); - if (tf == -1) { - lyxerr << "ToolbarBackend::add: no LyX command called `" - << func << "' exists!" << endl; - } else { - add(tb, tf, tooltip); + if (!compare_ascii_no_case(name, "end")) + return; + + Toolbars::iterator tcit = toolbars.begin(); + Toolbars::iterator tend = toolbars.end(); + for (; tcit != tend; ++tcit) { + if (tcit->name == name) + break; + } + + if (tcit == tend) { + lyxerr << "ToolbarBackend: undefined toolbar " + << name << endl; + return; + } + + tcit->flags = static_cast(0); + string flagstr = lex.getString(); + lex.next(true); + vector flags = getVectorFromString(flagstr); + + vector::const_iterator cit = flags.begin(); + vector::const_iterator end = flags.end(); + + for (; cit != end; ++cit) { + int flag = 0; + if (!compare_ascii_no_case(*cit, "off")) + flag = OFF; + else if (!compare_ascii_no_case(*cit, "on")) + flag = ON; + else if (!compare_ascii_no_case(*cit, "math")) + flag = MATH; + else if (!compare_ascii_no_case(*cit, "table")) + flag = TABLE; + else if (!compare_ascii_no_case(*cit, "review")) + flag = REVIEW; + else if (!compare_ascii_no_case(*cit, "top")) + flag = TOP; + else if (!compare_ascii_no_case(*cit, "bottom")) + flag = BOTTOM; + else if (!compare_ascii_no_case(*cit, "left")) + flag = LEFT; + else if (!compare_ascii_no_case(*cit, "right")) + flag = RIGHT; + else { + lyxerr << "ToolbarBackend::read: unrecognised token:`" + << *cit << '\'' << endl; + } + tcit->flags = static_cast(tcit->flags | flag); + } + + usedtoolbars.push_back(*tcit); } } -string const ToolbarBackend::getIcon(int action) +void ToolbarBackend::add(Toolbar & tb, + FuncRequest const & func, docstring const & tooltip) { + tb.items.push_back(make_pair(func, tooltip)); + tb.items.back().first.origin = FuncRequest::TOOLBAR; +} + + +string const ToolbarBackend::getIcon(FuncRequest const & f) +{ + using frontend::find_xpm; + string fullname; - FuncRequest f = lyxaction.retrieveActionArg(action); - - if (f.action == LFUN_INSERT_MATH) { - if (!f.argument.empty()) - fullname = find_xpm(f.argument.substr(1)); - } else if (f.action == LFUN_MATH_DELIM) { - fullname = find_xpm(f.argument); - } else { + + switch (f.action) { + case LFUN_MATH_INSERT: + if (!f.argument().empty()) + fullname = find_xpm(to_utf8(f.argument()).substr(1)); + break; + case LFUN_MATH_DELIM: + case LFUN_MATH_BIGDELIM: + fullname = find_xpm(to_utf8(f.argument())); + break; + default: string const name = lyxaction.getActionName(f.action); string xpm_name(name); - if (!f.argument.empty()) - xpm_name = subst(name + ' ' + f.argument, ' ', '_'); + if (!f.argument().empty()) + xpm_name = subst(name + ' ' + to_utf8(f.argument()), ' ', '_'); - fullname = LibFileSearch("images", xpm_name, "xpm"); + fullname = libFileSearch("images", xpm_name, "xpm").absFilename(); if (fullname.empty()) { // try without the argument - fullname = LibFileSearch("images", name, "xpm"); + fullname = libFileSearch("images", name, "xpm").absFilename(); } } @@ -175,5 +252,11 @@ string const ToolbarBackend::getIcon(int action) return fullname; } - return LibFileSearch("images", "unknown", "xpm"); + lyxerr[Debug::GUI] << "Cannot find icon for command \"" + << lyxaction.getActionName(f.action) + << '(' << to_utf8(f.argument()) << ")\"" << endl; + return libFileSearch("images", "unknown", "xpm").absFilename(); } + + +} // namespace lyx