X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNomencl.cpp;h=ac990b14080423c447de52e9dceaae3507ae2747;hb=2bbf8e5f2d4ffd691258f94ba46baebf5aa3204c;hp=86eed23682387f4bc9cc12e0d23db76d7081f652;hpb=ce473c810a170503289a46c821c4b1df0902e9e0;p=features.git diff --git a/src/insets/InsetNomencl.cpp b/src/insets/InsetNomencl.cpp index 86eed23682..ac990b1408 100644 --- a/src/insets/InsetNomencl.cpp +++ b/src/insets/InsetNomencl.cpp @@ -17,13 +17,21 @@ #include "Buffer.h" #include "DispatchResult.h" +#include "Font.h" +#include "Encoding.h" #include "FuncRequest.h" +#include "FuncStatus.h" #include "InsetIterator.h" #include "InsetList.h" #include "LaTeXFeatures.h" -#include "MetricsInfo.h" +#include "Length.h" +#include "LyX.h" +#include "OutputParams.h" +#include "output_xhtml.h" #include "sgml.h" +#include "frontends/FontMetrics.h" + #include "support/docstream.h" #include "support/gettext.h" #include "support/lstrings.h" @@ -40,8 +48,8 @@ namespace lyx { // ///////////////////////////////////////////////////////////////////// -InsetNomencl::InsetNomencl(InsetCommandParams const & p) - : InsetCommand(p, "nomenclature"), +InsetNomencl::InsetNomencl(Buffer * buf, InsetCommandParams const & p) + : InsetCommand(buf, p), nomenclature_entry_id(sgml::uniqueID(from_ascii("nomen"))) {} @@ -51,8 +59,10 @@ ParamInfo const & InsetNomencl::findInfo(string const & /* cmdName */) static ParamInfo param_info_; if (param_info_.empty()) { param_info_.add("prefix", ParamInfo::LATEX_OPTIONAL); - param_info_.add("symbol", ParamInfo::LATEX_REQUIRED); - param_info_.add("description", ParamInfo::LATEX_REQUIRED); + param_info_.add("symbol", ParamInfo::LATEX_REQUIRED, + ParamInfo::HANDLING_LATEXIFY); + param_info_.add("description", ParamInfo::LATEX_REQUIRED, + ParamInfo::HANDLING_LATEXIFY); } return param_info_; } @@ -92,6 +102,12 @@ int InsetNomencl::docbook(odocstream & os, OutputParams const &) const } +docstring InsetNomencl::xhtml(XHTMLStream &, OutputParams const &) const +{ + return docstring(); +} + + int InsetNomencl::docbookGlossary(odocstream & os) const { os << "\n" @@ -118,17 +134,24 @@ void InsetNomencl::validate(LaTeXFeatures & features) const // ///////////////////////////////////////////////////////////////////// -InsetPrintNomencl::InsetPrintNomencl(InsetCommandParams const & p) - : InsetCommand(p, "printnomenclature") +InsetPrintNomencl::InsetPrintNomencl(Buffer * buf, InsetCommandParams const & p) + : InsetCommand(buf, p) {} ParamInfo const & InsetPrintNomencl::findInfo(string const & /* cmdName */) { - // there are no parameters to give because the symbol width is set via - // nomencl's \nomlabelwidth in InsetPrintNomencl::latex and not as - // optional parameter of \printnomenclature + // The symbol width is set via nomencl's \nomlabelwidth in + // InsetPrintNomencl::latex and not as optional parameter of + // \printnomenclature static ParamInfo param_info_; + if (param_info_.empty()) { + // how is the width set? + // values: none|auto|custom + param_info_.add("set_width", ParamInfo::LYX_INTERNAL); + // custom width + param_info_.add("width", ParamInfo::LYX_INTERNAL); + } return param_info_; } @@ -139,6 +162,51 @@ docstring InsetPrintNomencl::screenLabel() const } +void InsetPrintNomencl::doDispatch(Cursor & cur, FuncRequest & cmd) +{ + switch (cmd.action()) { + + case LFUN_INSET_MODIFY: { + InsetCommandParams p(NOMENCL_PRINT_CODE); + // FIXME UNICODE + InsetCommand::string2params(to_utf8(cmd.argument()), p); + if (p.getCmdName().empty()) { + cur.noScreenUpdate(); + break; + } + setParams(p); + break; + } + + default: + InsetCommand::doDispatch(cur, cmd); + break; + } +} + + +bool InsetPrintNomencl::getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + switch (cmd.action()) { + + case LFUN_INSET_DIALOG_UPDATE: + case LFUN_INSET_MODIFY: + status.setEnabled(true); + return true; + + default: + return InsetCommand::getStatus(cur, cmd, status); + } +} + + +docstring InsetPrintNomencl::xhtml(XHTMLStream &, OutputParams const &) const +{ + return docstring(); +} + + int InsetPrintNomencl::docbook(odocstream & os, OutputParams const &) const { os << "\n"; @@ -163,10 +231,11 @@ int InsetPrintNomencl::docbook(odocstream & os, OutputParams const &) const } -docstring nomenclWidest(Buffer const & buffer) +namespace { +docstring nomenclWidest(Buffer const & buffer, OutputParams const & runparams) { - // nomenclWidest() determines and returns the widest used nomenclature - // symbol in the document + // nomenclWidest() determines and returns the widest used + // nomenclature symbol in the document int w = 0; docstring symb; @@ -184,38 +253,69 @@ docstring nomenclWidest(Buffer const & buffer) if (inset->lyxCode() != NOMENCL_CODE) continue; nomencl = static_cast(inset); - docstring const symbol = nomencl->getParam("symbol"); - // we can only check for the number of characters, since it is - // impossible to get the info that "iiiii" is smaller than "WW" - // we therefore output w times "W" as string ("W" is always the - // widest character) - int const wx = symbol.size(); - if (wx > w) + docstring const symbol = + nomencl->getParam("symbol"); + // This is only an approximation, + // but the best we can get. + int const wx = use_gui ? + theFontMetrics(Font()).width(symbol) : + symbol.size(); + if (wx > w) { w = wx; + symb = symbol; + } + } + } + // return the widest (or an empty) string + if (symb.empty()) + return symb; + + // we have to encode the string properly + docstring latex_symb; + for (size_t n = 0; n < symb.size(); ++n) { + try { + latex_symb += runparams.encoding->latexChar(symb[n]); + } catch (EncodingException & /* e */) { + if (runparams.dryrun) { + latex_symb += "<" + _("LyX Warning: ") + + _("uncodable character") + " '"; + latex_symb += docstring(1, symb[n]); + latex_symb += "'>"; + } } } - // return the widest symbol as w times a "W" - for (int n = 1; n <= w; ++n) - symb = symb + "W"; - return symb; + return latex_symb; } +} // namespace anon -int InsetPrintNomencl::latex(odocstream & os, OutputParams const &) const +int InsetPrintNomencl::latex(odocstream & os, OutputParams const & runparams_in) const { + OutputParams runparams = runparams_in; int lines = 0; - docstring widest = nomenclWidest(buffer()); - // set the label width via nomencl's command \nomlabelwidth - // this must be output before the command \printnomenclature - if (!widest.empty()) { - // assure that the width is never below the predefined value of 1 cm - os << "\\settowidth{\\nomlabelwidth}{" << widest <<"}\n"; - os << "\\ifthenelse{%\n \\lengthtest{\\nomlabelwidth < 1cm}}\n"; - os << " {\\setlength{\\nomlabelwidth}{1cm}}\n {}\n"; - ++lines; + if (getParam("set_width") == "auto") { + docstring widest = nomenclWidest(buffer(), runparams); + // Set the label width via nomencl's command \nomlabelwidth. + // This must be output before the command \printnomenclature + if (!widest.empty()) { + os << "\\settowidth{\\nomlabelwidth}{" + << widest + << "}\n"; + ++lines; + } + } else if (getParam("set_width") == "custom") { + // custom length as optional arg of \printnomenclature + string const width = + Length(to_ascii(getParam("width"))).asLatexString(); + os << '\\' + << from_ascii(getCmdName()) + << '[' + << from_ascii(width) + << "]{}"; + return lines; } // output the command \printnomenclature - os << getCommand(); + os << getCommand(runparams); return lines; } @@ -223,8 +323,6 @@ int InsetPrintNomencl::latex(odocstream & os, OutputParams const &) const void InsetPrintNomencl::validate(LaTeXFeatures & features) const { features.require("nomencl"); - // needed for InsetPrintNomencl::latex - features.require("ifthen"); } @@ -234,4 +332,10 @@ InsetCode InsetPrintNomencl::lyxCode() const } +docstring InsetPrintNomencl::contextMenu(BufferView const &, int, int) const +{ + return from_ascii("context-nomenclprint"); +} + + } // namespace lyx