X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLColor.C;h=1642e4f6c35cd2f270f45792c7c4069997569467;hb=de3c8e5b80effa940c92980032389c868f377d6b;hp=b2a5cc43eb9ee95251733ec4357bf5aa455cc137;hpb=59323f5154937b3626107ffbad969d37afcd9abd;p=lyx.git diff --git a/src/LColor.C b/src/LColor.C index b2a5cc43eb..1642e4f6c3 100644 --- a/src/LColor.C +++ b/src/LColor.C @@ -1,178 +1,282 @@ -// -*- C++ -*- -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright 1998-2000 The LyX Team +/** + * \file LColor.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - *======================================================*/ + * \author Asger Alstrup + * \author Lars Gullik Bjønnes + * \author Matthias Ettrich + * \author Jean-Marc Lasgouttes + * \author John Levon + * \author André Pönitz + * \author Martin Vermeer + * + * Full author contact details are available in file CREDITS. + */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - -#include - #include "debug.h" -#include "LColor.h" -#include "support/LAssert.h" #include "gettext.h" +#include "LColor.h" #include "support/lstrings.h" +#include -void LColor::fill(LColor::color col, string const & gui, - string const & latex, string const & x11, - string const & lyx) { - information in; - in.guiname = gui; - in.latexname = latex; - in.x11name = x11; - in.lyxname = lyx; +using lyx::support::compare_ascii_no_case; +using lyx::support::ascii_lowercase; + +using std::endl; +using std::string; + + +namespace { + +struct ColorEntry { + int lcolor; + char const * guiname; + char const * latexname; + char const * x11name; + char const * lyxname; +}; - infotab[col] = in; } +struct LColor::Pimpl { + /// + struct information { + /// the name as it appears in the GUI + string guiname; + /// the name used in LaTeX + string latexname; + /// the name for X11 + string x11name; + /// the name for LyX + string lyxname; + }; + + /// initialise a color entry + void fill(ColorEntry const & entry) + { + information in; + in.lyxname = string(entry.lyxname); + in.latexname = string(entry.latexname); + in.x11name = string(entry.x11name); + in.guiname = string(entry.guiname); + infotab[entry.lcolor] = in; + transform[string(entry.lyxname)] = int(entry.lcolor); + } + + /// + typedef std::map InfoTab; + /// the table of color information + InfoTab infotab; + + typedef std::map Transform; + /// the transform between colour name string and integer code. + Transform transform; + +}; + LColor::LColor() + : pimpl_(new Pimpl) { // LColor::color, gui, latex, x11, lyx - fill(none, _("none"), "none", "black", "none"); - fill(black, _("black"), "black", "black", "black"); - fill(white, _("white"), "white", "white", "white"); - fill(red, _("red"), "red", "red", "red"); - fill(green, _("green"), "green", "green", "green"); - fill(blue, _("blue"), "blue", "blue", "blue"); - fill(cyan, _("cyan"), "cyan", "cyan", "cyan"); - fill(magenta, _("magenta"), "magenta", "magenta", "magenta"); - fill(yellow, _("yellow"), "yellow", "yellow", "yellow"); - fill(background, _("background"), "background", "linen", "background"); - fill(foreground, _("foreground"), "foreground", "black", "foreground"); - fill(selection, _("selection"), "selection", "LightBlue", "selection"); - fill(latex, _("latex"), "latex", "DarkRed", "latex"); - fill(floats, _("floats"), "floats", "red", "floats"); - fill(note, _("note"), "note", "black", "note"); - fill(notebg, _("note background"), "notebg", "yellow", "notebg"); - fill(noteframe, _("note frame"), "noteframe", "black", "noteframe"); - fill(depthbar, _("depth bar"), "depthbar", "IndianRed", "depthbar"); - fill(command, _("command-inset"), "command", "black", "command"); - fill(commandbg, _("command-inset background"), "commandbg", "grey80", "commandbg"); - fill(commandframe, _("inset frame"), "commandframe", "black", "commandframe"); - fill(accent, _("accent"), "accent", "black", "accent"); - fill(accentbg, _("accent background"), "accentbg", "offwhite", "accentbg"); - fill(accentframe, _("accent frame"), "accentframe", "linen", "accentframe"); - fill(minipageline, _("minipage line"), "minipageline", "violet", "minipageline"); - fill(special, _("special char"), "special", "RoyalBlue", "special"); - fill(math, _("math"), "math", "DarkBlue", "math"); - fill(mathbg, _("math background"), "mathbg", "AntiqueWhite", "mathbg"); - fill(mathframe, _("math frame"), "mathframe", "Magenta", "mathframe"); - fill(mathcursor, _("math cursor"), "mathcursor", "black", "mathcursor"); - fill(mathline, _("math line"), "mathline", "Blue", "mathline"); - fill(footnote, _("footnote"), "footnote", "DarkRed", "footnote"); - fill(footnotebg, _("footnote background"), "footnotebg", "grey60", "footnotebg"); - fill(footnoteframe, _("footnote frame"), "footnoteframe", "IndianRed", "footnoteframe"); - fill(ert, _("ert"), "ert", "DarkRed", "ert"); - fill(inset, _("inset"), "inset", "black", "inset"); - fill(insetbg, _("inset background"), "insetbg", "grey60", "insetbg"); - fill(insetframe, _("inset frame"), "insetframe", "IndianRed", "insetframe"); - fill(error, _("error"), "error", "Red", "error"); - fill(eolmarker, _("end-of-line marker"), "eolmarker", "Brown", "eolmarker"); - fill(appendixline, _("appendix line"), "appendixline", "Brown", "appendixline"); - fill(vfillline, _("vfill line"), "vfillline", "Brown", "vfillline"); - fill(topline, _("top/bottom line"), "topline", "Brown", "topline"); - fill(tableline, _("table line"), "tableline", "black", "tableline"); - fill(tabularline, _("tabular line"), "tabularline", "black", - "tabularline"); - fill(tabularonoffline, _("tabularonoff line"), "tabularonoffline", - "LightSteelBlue", "tabularonoffline"); - fill(bottomarea, _("bottom area"), "bottomarea", "grey40", "bottomarea"); - fill(pagebreak, _("page break"), "pagebreak", "RoyalBlue", "pagebreak"); - fill(top, _("top of button"), "top", "grey80", "top"); - fill(bottom, _("bottom of button"), "bottom", "grey40", "bottom"); - fill(left, _("left of button"), "left", "grey80", "left"); - fill(right, _("right of button"), "right", "grey40", "right"); - fill(buttonbg, _("button background"), "buttonbg", "grey60", "buttonbg"); - fill(inherit, _("inherit"), "inherit", "black", "inherit"); - fill(ignore, _("ignore"), "ignore", "black", "ignore"); + static ColorEntry const items[] = { + { none, N_("none"), "none", "black", "none" }, + { black, N_("black"), "black", "black", "black" }, + { white, N_("white"), "white", "white", "white" }, + { red, N_("red"), "red", "red", "red" }, + { green, N_("green"), "green", "green", "green" }, + { blue, N_("blue"), "blue", "blue", "blue" }, + { cyan, N_("cyan"), "cyan", "cyan", "cyan" }, + { magenta, N_("magenta"), "magenta", "magenta", "magenta" }, + { yellow, N_("yellow"), "yellow", "yellow", "yellow" }, + { cursor, N_("cursor"), "cursor", "black", "cursor" }, + { background, N_("background"), "background", "linen", "background" }, + { foreground, N_("text"), "foreground", "black", "foreground" }, + { selection, N_("selection"), "selection", "LightBlue", "selection" }, + { latex, N_("LaTeX text"), "latex", "DarkRed", "latex" }, + { preview, N_("previewed snippet"), "preview", "black", "preview" }, + { note, N_("note"), "note", "yellow", "note" }, + { notebg, N_("note background"), "notebg", "yellow", "notebg" }, + { comment, N_("comment"), "comment", "magenta", "comment" }, + { commentbg, N_("comment background"), "commentbg", "linen", "commentbg" }, + { greyedout, N_("greyedout inset"), "greyedout", "red", "greyedout" }, + { greyedoutbg, N_("greyedout inset background"), "greyedoutbg", "linen", "greyedoutbg" }, + { depthbar, N_("depth bar"), "depthbar", "IndianRed", "depthbar" }, + { language, N_("language"), "language", "Blue", "language" }, + { command, N_("command inset"), "command", "black", "command" }, + { commandbg, N_("command inset background"), "commandbg", "azure", "commandbg" }, + { commandframe, N_("command inset frame"), "commandframe", "black", "commandframe" }, + { special, N_("special character"), "special", "RoyalBlue", "special" }, + { math, N_("math"), "math", "DarkBlue", "math" }, + { mathbg, N_("math background"), "mathbg", "linen", "mathbg" }, + { graphicsbg, N_("graphics background"), "graphicsbg", "linen", "graphicsbg" }, + { mathmacrobg, N_("Math macro background"), "mathmacrobg", "linen", "mathmacrobg" }, + { mathframe, N_("math frame"), "mathframe", "Magenta", "mathframe" }, + { mathline, N_("math line"), "mathline", "Blue", "mathline" }, + { captionframe, N_("caption frame"), "captionframe", "DarkRed", "captionframe" }, + { collapsable, N_("collapsable inset text"), "collapsable", "DarkRed", "collapsable" }, + { collapsableframe, N_("collapsable inset frame"), "collapsableframe", "IndianRed", "collapsableframe" }, + { insetbg, N_("inset background"), "insetbg", "grey80", "insetbg" }, + { insetframe, N_("inset frame"), "insetframe", "IndianRed", "insetframe" }, + { error, N_("LaTeX error"), "error", "Red", "error" }, + { eolmarker, N_("end-of-line marker"), "eolmarker", "Brown", "eolmarker" }, + { appendix, N_("appendix marker"), "appendix", "Brown", "appendix" }, + { changebar, N_("change bar"), "changebar", "Blue", "changebar" }, + { strikeout, N_("Deleted text"), "strikeout", "Red", "strikeout" }, + { newtext, N_("Added text"), "newtext", "Blue", "newtext" }, + { added_space, N_("added space markers"), "added_space", "Brown", "added_space" }, + { topline, N_("top/bottom line"), "topline", "Brown", "topline" }, + { tabularline, N_("table line"), "tabularline", "black", + "tabularline" }, + { tabularonoffline, N_("table on/off line"), "tabularonoffline", + "LightSteelBlue", "tabularonoffline" }, + { bottomarea, N_("bottom area"), "bottomarea", "grey40", "bottomarea" }, + { pagebreak, N_("page break"), "pagebreak", "RoyalBlue", "pagebreak" }, + { top, N_("top of button"), "top", "grey90", "top" }, + { bottom, N_("bottom of button"), "bottom", "grey60", "bottom" }, + { left, N_("left of button"), "left", "grey90", "left" }, + { right, N_("right of button"), "right", "grey60", "right" }, + { buttonbg, N_("button background"), "buttonbg", "grey80", "buttonbg" }, + { inherit, N_("inherit"), "inherit", "black", "inherit" }, + { ignore, N_("ignore"), "ignore", "black", "ignore" }, + { ignore, 0, 0, 0, 0 } + }; + + for (int i = 0; items[i].guiname; ++i) + pimpl_->fill(items[i]); } -string LColor::getGUIName(LColor::color c) const +LColor::LColor(LColor const & c) + : pimpl_(new Pimpl(*c.pimpl_)) +{} + + +LColor::~LColor() +{} + + +void LColor::operator=(LColor const & c) { - InfoTab::const_iterator ici = infotab.find(c); - if (ici != infotab.end()) - return (*ici).second.guiname; + LColor tmp(c); + boost::swap(pimpl_, tmp.pimpl_); +} + +string const LColor::getGUIName(LColor::color c) const +{ + Pimpl::InfoTab::const_iterator it = pimpl_->infotab.find(c); + if (it != pimpl_->infotab.end()) + return _(it->second.guiname); return "none"; } -string LColor::getX11Name(LColor::color c) const +string const LColor::getX11Name(LColor::color c) const { - InfoTab::const_iterator ici = infotab.find(c); - if (ici != infotab.end()) - return (*ici).second.x11name; + Pimpl::InfoTab::const_iterator it = pimpl_->infotab.find(c); + if (it != pimpl_->infotab.end()) + return it->second.x11name; lyxerr << "LyX internal error: Missing color" - " entry in LColor.C for " << int(c) << '\n'; - lyxerr << "Using black.\n"; + " entry in LColor.C for " << int(c) << '\n' + << "Using black." << endl; return "black"; } -string LColor::getLaTeXName(LColor::color c) const +string const LColor::getLaTeXName(LColor::color c) const { - InfoTab::const_iterator ici = infotab.find(c); - if (ici != infotab.end()) - return (*ici).second.latexname; + Pimpl::InfoTab::const_iterator it = pimpl_->infotab.find(c); + if (it != pimpl_->infotab.end()) + return it->second.latexname; return "black"; } -string LColor::getLyXName(LColor::color c) const +string const LColor::getLyXName(LColor::color c) const { - InfoTab::const_iterator ici = infotab.find(c); - if (ici != infotab.end()) - return (*ici).second.lyxname; + Pimpl::InfoTab::const_iterator it = pimpl_->infotab.find(c); + if (it != pimpl_->infotab.end()) + return it->second.lyxname; return "black"; } -void LColor::setColor(LColor::color col, string const & x11name) +bool LColor::setColor(LColor::color col, string const & x11name) +{ + Pimpl::InfoTab::iterator it = pimpl_->infotab.find(col); + if (it == pimpl_->infotab.end()) { + lyxerr << "Color " << col << " not found in database." + << std::endl; + return false; + } + + // "inherit" is returned for colors not in the database + // (and anyway should not be redefined) + if (col == none || col == inherit || col == ignore) { + lyxerr << "Color " << getLyXName(col) + << " may not be redefined" << endl; + return false; + } + + it->second.x11name = x11name; + return true; +} + + +bool LColor::setColor(string const & lyxname, string const &x11name) { - InfoTab::iterator iti = infotab.find(col); - if (iti != infotab.end()) { - (*iti).second.x11name = x11name; - return; + string const lcname = ascii_lowercase(lyxname); + if (pimpl_->transform.find(lcname) == pimpl_->transform.end()) { + lyxerr[Debug::GUI] + << "LColor::setColor: Unknown color \"" + << lyxname << '"' << endl; + addColor(static_cast(pimpl_->infotab.size()), lcname); } - lyxerr << "LyX internal error: color and such.\n"; - Assert(false); + + return setColor(static_cast(pimpl_->transform[lcname]), + x11name); } LColor::color LColor::getFromGUIName(string const & guiname) const { - InfoTab::const_iterator ici = infotab.begin(); - for (; ici != infotab.end(); ++ici) { - if (!compare_no_case((*ici).second.guiname, guiname)) - return (*ici).first; + Pimpl::InfoTab::const_iterator it = pimpl_->infotab.begin(); + Pimpl::InfoTab::const_iterator end = pimpl_->infotab.end(); + for (; it != end; ++it) { + if (!compare_ascii_no_case(_(it->second.guiname), guiname)) + return static_cast(it->first); } - return LColor::ignore; + return LColor::inherit; +} + + +void LColor::addColor(LColor::color c, string const & lyxname) const +{ + ColorEntry ce = { c, "", "", "", lyxname.c_str() }; + pimpl_->fill(ce); } LColor::color LColor::getFromLyXName(string const & lyxname) const { - - InfoTab::const_iterator ici = infotab.begin(); - for (; ici != infotab.end(); ++ici) { - if (!compare_no_case((*ici).second.lyxname, lyxname)) - return (*ici).first; + string const lcname = ascii_lowercase(lyxname); + if (pimpl_->transform.find(lcname) == pimpl_->transform.end()) { + lyxerr << "LColor::getFromLyXName: Unknown color \"" + << lyxname << '"' << endl; + return none; } - return LColor::inherit; + + return static_cast(pimpl_->transform[lcname]); } + // The evil global LColor instance LColor lcolor; +// An equally evil global system LColor instance +LColor system_lcolor;