On Mon, Aug 04, 2003 at 02:23:57PM +0100, Angus Leeming spake thusly:
 
> >> Yes. But I'll wager that the thought police will not let this one
> >> get past them. I'm afraid that you will be taken in for
> >> 're-education'.
> > 
> > Re-educate me :-)
> 
> If I remember rightly, room 101 contains your worst nightmare. In the 
> case of Winston Smith, rats were going to eat away his face. Do you 
> _really_ want to go down that route or will you not just submit to 
> the will of the state?
> 
> -- 
> Angus

Perhaps I'd better have a closer look at LColor.[Ch]... how's life
been lately on Airstrip One?
;-)

Attached a first attempt for comment...  as you see, I'm struggling.

Martin

// -*- C++ -*-
/* This file is part of
 * ======================================================
 *
 *           LyX, The Document Processor
 *
 *          Copyright 1998-2001 The LyX Team
 *
 *======================================================*/

#ifndef LCOLOR_H
#define LCOLOR_H

#include "LString.h"

/**
  This is a stateless class.

  It has one basic purposes:
  To serve as a color-namespace container (the Color enum).


  */
/**
 * \class LColor
 *
 * A class holding color definitions and associated names for
 * LaTeX, X11, the GUI, and LyX internally.
 *
 * A color can be one of the following kinds:
 *
 * - A real, predefined color, such as black, white, red or green.
 * - A logical color, such as no color, inherit, math
 */

class LColor 
// made copyable for same reasons as LyXRC was made copyable. See there for
// explanation.
{
public:
        /// Names of colors, including all logical colors
        enum color {
                /// No particular color---clear or default
                none,
                /// The different text colors
                black,
                ///
                white,
                ///
                red,
                ///
                green,
                ///
                blue,
                ///
                cyan,
                ///
                magenta,
                ///
                yellow,

                // Needed interface colors

                /// Cursor color
                cursor,
                /// Background color
                background,
                /// Foreground color
                foreground,
                /// Background color of selected text
                selection,
                /// Text color in LaTeX mode
                latex,
                /// The color used for previews
                preview,

                /// Text color for notes
                note,
                /// Background color of notes
                notebg,
                /// Text color for comments
                comment,
                /// Background color of comments
                commentbg,
                /// Text color for greyedout inset
                greyedout,
                /// Background color of greyedout inset
                greyedoutbg,


                /// Color for the depth bars in the margin
                depthbar,
                /// Color for marking foreign language words
                language,

                /// Text color for command insets
                command,
                /// Background color for command insets
                commandbg,
                /// Frame color for command insets
                commandframe,

                /// Special chars text color
                special,

                /// Graphics inset background color
                graphicsbg,
                /// Math inset text color
                math,
                /// Math inset background color
                mathbg,
                /// Macro math inset background color
                mathmacrobg,
                /// Math inset frame color
                mathframe,
                /// Math line color
                mathline,

                /// caption frame color
                captionframe,

                /// collapsable insets text
                collapsable,
                /// collapsable insets frame
                collapsableframe,

                /// Inset marker background color
                insetbg,
                /// Inset marker frame color
                insetframe,

                /// Error box text color
                error,
                /// EOL marker color
                eolmarker,
                /// Added space colour
                added_space,
                /// Appendix marker color
                appendix,
                /// changebar color
                changebar,
                /// strike-out color
                strikeout,
                /// added text color
                newtext,
                /// Top and bottom line color
                topline,
                /// Table line color
                tabularline,
                /// Table line color
                tabularonoffline,
                /// Bottom area color
                bottomarea,
                /// Page break color
                pagebreak,

                // FIXME: why are the next four separate ??
                /// Color used for top of boxes
                top,
                /// Color used for bottom of boxes
                bottom,
                /// Color used for left side of boxes
                left,
                /// Color used for right side of boxes
                right,
                /// Color used for bottom background
                buttonbg,

                // Logical attributes

                /// Color is inherited
                inherit,
                /// For ignoring updates of a color
                ignore
        };

        ///
        LColor();
        ///
        LColor(LColor const &);
        ///
        ~LColor();
        ///
        void operator=(LColor const &);
        /// set the given LyX color to the color defined by the X11 name given
        void setColor(LColor::color col, string const & x11name);
        /// set the given LyX color to the color defined by the X11 name given
        bool setColor(string const & lyxname, string const & x11name);

        /// Get GUI name of color
        string const getGUIName(LColor::color c) const;
        ///
        string const getGUIName(string const & s) const;

        /// Get X11 name of color
        string const getX11Name(LColor::color c) const;
        ///
        string const getX11Name(string const & s) const;

        /// Get LaTeX name of color
        string const getLaTeXName(LColor::color c) const;
        ///
        string const getLaTeXName(string const & s) const;

        /// Get LyX name of color
        string const getLyXName(LColor::color c) const;
        /// (string-to-string version not needed as it is identity)
        
        /// get the color from the GUI name
        LColor::color getFromGUIName(string const & guiname) const;
        /// get the color from the LyX name
        LColor::color getFromLyXName(string const & lyxname) const;
private:
        ///
        struct Pimpl;
        ///
        Pimpl * pimpl_;
};

/// the current color definitions
extern LColor lcolor;
/// the system color definitions
extern LColor system_lcolor;

#endif
/* This file is part of
 * ======================================================
 *
 *           LyX, The Document Processor
 *
 *          Copyright 1998-2001 The LyX Team
 *
 *======================================================*/

#include <config.h>

#include "debug.h"
#include "LColor.h"
#include "support/LAssert.h"
#include "gettext.h"
#include "support/lstrings.h"

#include <map>

using namespace lyx::support;

using std::endl;


namespace {

struct ColorEntry {
        LColor::color lcolor;
        char const * guiname;
        char const * latexname;
        char const * x11name;
        char const * lyxname;
};

struct TransformEntry {
        char const * lyxname;
        int ncolor;
};

}

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 = infotab[entry.lcolor];
                in.guiname   = entry.guiname;
                in.latexname = entry.latexname;
                in.x11name   = entry.x11name;
                in.lyxname   = entry.lyxname;

                int & no = transform[entry.lyxname];
                no = entry.lcolor;
        }
        
        ///
        typedef std::map<int, information> InfoTab;
        /// the table of color information
        InfoTab infotab;

        typedef std::map<string, int> Transform;
        /// the transform between colour name string and integer code.
        Transform transform;
};


LColor::LColor()
        : pimpl_(new Pimpl)
{
        //  LColor::color, gui, latex, x11, lyx
        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]);
}


LColor::LColor(LColor const & c)
        : pimpl_(new Pimpl(*c.pimpl_))
{}


LColor::~LColor()
{
        delete pimpl_;
}


void LColor::operator=(LColor const & c)
{
        LColor tmp(c);
        std::swap(pimpl_, tmp.pimpl_);
}



string const LColor::getGUIName(LColor::color c) const
{
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
        if (ici != pimpl_->infotab.end())
                return _(ici->second.guiname);
        return "none";
}


string const LColor::getGUIName(string const &  s) const
{
        Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
        if (ici != pimpl_->transform.end()) {
                Pimpl::InfoTab::const_iterator 
                        it = pimpl_->infotab.find(ici->second);
                if (it != pimpl_->infotab.end()) 
                        return it->second.guiname;      
        }
        return "none";
}



string const LColor::getX11Name(LColor::color c) const
{
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
        if (ici != pimpl_->infotab.end())
                return ici->second.x11name;

        lyxerr << "LyX internal error: Missing color"
                " entry in LColor.C for " << int(c) << endl;
        lyxerr << "Using black." << endl;
        return "black";
}


string const LColor::getX11Name(string const & s) const
{
        Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
        if (ici != pimpl_->transform.end()) {
                Pimpl::InfoTab::const_iterator 
                        it = pimpl_->infotab.find(ici->second);
                if (it != pimpl_->infotab.end()) 
                        return it->second.x11name;
        }
        lyxerr << "LyX internal error: Missing color"
                " entry in LColor.C for " << s << endl;
        lyxerr << "Using black." << endl;
        return "black";
}



string const LColor::getLaTeXName(LColor::color c) const
{
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
        if (ici != pimpl_->infotab.end())
                return ici->second.latexname;
        return "black";
}


string const LColor::getLaTeXName(string const & s) const
{
        Pimpl::Transform::const_iterator ici = pimpl_->transform.find(s);
        if (ici != pimpl_->transform.end()) {
                Pimpl::InfoTab::const_iterator 
                        it = pimpl_->infotab.find(ici->second);
                if (it != pimpl_->infotab.end()) 
                        return it->second.latexname;
        }
        return "black";
}



string const LColor::getLyXName(LColor::color c) const
{
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.find(c);
        if (ici != pimpl_->infotab.end())
                return ici->second.lyxname;
        return "black";
}


void LColor::setColor(LColor::color col, string const & x11name)
{
        Pimpl::InfoTab::iterator iti = pimpl_->infotab.find(col);
        if (iti != pimpl_->infotab.end()) {
                iti->second.x11name = x11name;
                return;
        }
        lyxerr << "LyX internal error: color and such." << endl;
        Assert(false);
}


bool LColor::setColor(string const & lyxname, string const & x11name)
{
        color col = getFromLyXName(lyxname);

        // "inherit" is returned for colors not in the database
        // (and anyway should not be redefined)
        if (col == inherit || col == ignore) {
                lyxerr << "Color " << lyxname << " is undefined or may not be"
                        " redefined" << endl;
                return false;
        }
        setColor (col, x11name);
        return true;
}


LColor::color LColor::getFromGUIName(string const & guiname) const
{
        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.begin();
        Pimpl::InfoTab::const_iterator end = pimpl_->infotab.end();
        for (; ici != end; ++ici) {
                if (!compare_ascii_no_case(_(ici->second.guiname), guiname))
                        return static_cast<LColor::color>(ici->first);
        }
        return LColor::inherit;
}


LColor::color LColor::getFromLyXName(string const & lyxname) const
{
        // should this simply become: 
        // return static_cast<LColor::color>(transform[lyxname]);
        // ?

        Pimpl::InfoTab::const_iterator ici = pimpl_->infotab.begin();
        Pimpl::InfoTab::const_iterator end = pimpl_->infotab.end();
        for (; ici != end; ++ici) {
                if (!compare_ascii_no_case(ici->second.lyxname, lyxname))
                        return static_cast<LColor::color>(ici->first);
        }
        return LColor::inherit;
}


// The evil global LColor instance
LColor lcolor;
// An equally evil global system LColor instance
LColor system_lcolor;

Attachment: pgp00000.pgp
Description: PGP signature

Reply via email to