Code

Renamed ColorDef to PaintDef to prep for expanded functionality.
authorjoncruz <joncruz@users.sourceforge.net>
Fri, 20 Mar 2009 06:50:37 +0000 (06:50 +0000)
committerjoncruz <joncruz@users.sourceforge.net>
Fri, 20 Mar 2009 06:50:37 +0000 (06:50 +0000)
src/dialogs/CMakeLists.txt
src/interface.cpp
src/ui/dialog/CMakeLists.txt
src/ui/dialog/swatches.cpp
src/ui/dialog/swatches.h
src/widgets/Makefile_insert
src/widgets/eek-color-def.cpp [deleted file]
src/widgets/eek-color-def.h [deleted file]
src/widgets/ege-paint-def.cpp [new file with mode: 0644]
src/widgets/ege-paint-def.h [new file with mode: 0644]

index 9d2ed9eb87740cee77445b8184dfdc66f9fc96bc..4e6b1ee3de715da1c413025e3135bfbb98006ec2 100644 (file)
@@ -1,8 +1,6 @@
 SET(dialogs_SRC
 clonetiler.cpp
 dialog-events.cpp
-eek-color-def.cpp
-eek-preview.cpp
 export.cpp
 extensions.cpp
 fill-style.cpp
@@ -25,4 +23,4 @@ xml-tree.cpp
 )
 ADD_LIBRARY(dialogs STATIC ${dialogs_SRC})
 TARGET_LINK_LIBRARIES(dialogs
-2geom ${INKSCAPE_LIBS})
\ No newline at end of file
+2geom ${INKSCAPE_LIBS})
index c162ea6d68fef6b384672db7f72c72f1f335465f..144611c9a5950cd98c206a5984a42e0682e88695 100644 (file)
@@ -63,7 +63,7 @@
 #include "style.h"
 #include "event-context.h"
 #include "gradient-drag.h"
-#include "widgets/eek-color-def.h"
+#include "widgets/ege-paint-def.h"
 
 // Include Mac OS X menu synchronization on native OSX build
 #ifdef GDK_WINDOWING_QUARTZ
@@ -1243,15 +1243,15 @@ sp_ui_drag_data_received(GtkWidget *widget,
             bool worked = false;
             Glib::ustring colorspec;
             if ( data->format == 8 ) {
-                eek::ColorDef color;
+                ege::PaintDef color;
                 worked = color.fromMIMEData("application/x-oswb-color",
                                             reinterpret_cast<char*>(data->data),
                                             data->length,
                                             data->format);
                 if ( worked ) {
-                    if ( color.getType() == eek::ColorDef::CLEAR ) {
+                    if ( color.getType() == ege::PaintDef::CLEAR ) {
                         colorspec = ""; // TODO check if this is sufficient
-                    } else if ( color.getType() == eek::ColorDef::NONE ) {
+                    } else if ( color.getType() == ege::PaintDef::NONE ) {
                         colorspec = "none";
                     } else {
                         unsigned int r = color.getR();
index 1d912cf9f9f5a63483340d7dfc9766b5fb2ce876..ea63d602334ade8c6b7af6a96ed09ab9256829a0 100644 (file)
@@ -16,6 +16,8 @@ dock-behavior.cpp
 document-metadata.cpp
 document-properties.cpp
 extension-editor.cpp
+eek-preview.cpp
+ege-paint-def.cpp
 filedialog.cpp
 filedialogimpl-gtkmm.cpp
 fill-and-stroke.cpp
index 8fb811e3d205448dc2693c8a5287e07e8d1843ce..6470b3a5a0a5040043faede8f1ebb464b3669e4c 100644 (file)
@@ -47,7 +47,7 @@ namespace UI {
 namespace Dialogs {
 
 
-ColorItem::ColorItem(eek::ColorDef::ColorType type) :
+ColorItem::ColorItem(ege::PaintDef::ColorType type) :
     def(type),
     _isLive(false),
     _linkIsTone(false),
@@ -145,7 +145,7 @@ static void dragBegin( GtkWidget */*widget*/, GdkDragContext* dc, gpointer data
         using Inkscape::IO::Resource::ICONS;
         using Inkscape::IO::Resource::SYSTEM;
 
-        if (item->def.getType() != eek::ColorDef::RGB){
+        if (item->def.getType() != ege::PaintDef::RGB){
             GError *error = NULL;
             gsize bytesRead = 0;
             gsize bytesWritten = 0;
@@ -444,7 +444,7 @@ Gtk::Widget* ColorItem::getPreview(PreviewStyle style, ViewType view, ::PreviewS
         Gtk::Widget* newBlot = Glib::wrap(eekWidget);
 
         eek_preview_set_color( preview, (def.getR() << 8) | def.getR(), (def.getG() << 8) | def.getG(), (def.getB() << 8) | def.getB());
-        if ( def.getType() != eek::ColorDef::RGB ) {
+        if ( def.getType() != ege::PaintDef::RGB ) {
             using Inkscape::IO::Resource::get_path;
             using Inkscape::IO::Resource::ICONS;
             using Inkscape::IO::Resource::SYSTEM;
@@ -601,18 +601,18 @@ void ColorItem::buttonClicked(bool secondary)
         SPCSSAttr *css = sp_repr_css_attr_new();
         Glib::ustring descr;
         switch (def.getType()) {
-            case eek::ColorDef::CLEAR: {
+            case ege::PaintDef::CLEAR: {
                 // TODO actually make this clear
                 sp_repr_css_set_property( css, attrName, "none" );
                 descr = secondary? _("Remove stroke color") : _("Remove fill color");
                 break;
             }
-            case eek::ColorDef::NONE: {
+            case ege::PaintDef::NONE: {
                 sp_repr_css_set_property( css, attrName, "none" );
                 descr = secondary? _("Set stroke color to none") : _("Set fill color to none");
                 break;
             }
-            case eek::ColorDef::RGB: {
+            case ege::PaintDef::RGB: {
                 gchar c[64];
                 guint32 rgba = (def.getR() << 24) | (def.getG() << 16) | (def.getB() << 8) | 0xff;
                 sp_svg_write_color(c, sizeof(c), rgba);
@@ -997,8 +997,8 @@ SwatchesPanel::SwatchesPanel(gchar const* prefsPath) :
 {
     Gtk::RadioMenuItem* hotItem = 0;
     _holder = new PreviewHolder();
-    _clear = new ColorItem( eek::ColorDef::CLEAR );
-    _remove = new ColorItem( eek::ColorDef::NONE );
+    _clear = new ColorItem( ege::PaintDef::CLEAR );
+    _remove = new ColorItem( ege::PaintDef::NONE );
     {
         JustForNow *docPalette = new JustForNow();
 
index ed311242e7e7fc35280f5868e5b10ae13e6a1569..8b83e1450e666d4fc41e2dc84dafe4e3abd0680b 100644 (file)
@@ -15,7 +15,7 @@
 
 #include "ui/widget/panel.h"
 #include "ui/previewholder.h"
-#include "widgets/eek-color-def.h"
+#include "widgets/ege-paint-def.h"
 
 namespace Inkscape {
 namespace UI {
@@ -31,7 +31,7 @@ class ColorItem : public Inkscape::UI::Previewable
 {
     friend void _loadPaletteFile( gchar const *filename );
 public:
-    ColorItem( eek::ColorDef::ColorType type );
+    ColorItem( ege::PaintDef::ColorType type );
     ColorItem( unsigned int r, unsigned int g, unsigned int b,
                Glib::ustring& name );
     virtual ~ColorItem();
@@ -42,7 +42,7 @@ public:
                                     ::PreviewSize size,
                                     guint ratio);
     void buttonClicked(bool secondary = false);
-    eek::ColorDef def;
+    ege::PaintDef def;
 
 private:
     static void _dropDataIn( GtkWidget *widget,
index 13f2b33eb56c3e37e09d75e42b52405007f97125..08b2433eafd5fbe2e89e4d6a1110cbfe1337b535 100644 (file)
@@ -7,10 +7,10 @@ ink_common_sources += \
        widgets/dash-selector.h         \
        widgets/desktop-widget.cpp      \
        widgets/desktop-widget.h        \
-       widgets/eek-color-def.cpp       \
-       widgets/eek-color-def.h         \
        widgets/eek-preview.cpp         \
        widgets/eek-preview.h           \
+       widgets/ege-paint-def.cpp       \
+       widgets/ege-paint-def.h         \
        widgets/fill-style.cpp          \
        widgets/fill-style.h            \
        widgets/font-selector.cpp       \
diff --git a/src/widgets/eek-color-def.cpp b/src/widgets/eek-color-def.cpp
deleted file mode 100644 (file)
index 8542e55..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/** @file
- * @brief EEK color definition
- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Eek Color Definition.
- *
- * The Initial Developer of the Original Code is
- * Jon A. Cruz.
- * Portions created by the Initial Developer are Copyright (C) 2006
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "config.h"
-
-#ifdef HAVE_LIBINTL_H
-#include <libintl.h>
-#endif
-
-#include <stdint.h>
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <stdlib.h>
-#include <string.h>
-
-#if !defined(_)
-#define _(s) gettext(s)
-#endif // !defined(_)
-
-#include "eek-color-def.h"
-
-namespace eek
-{
-
-static std::string mimeTEXT("text/plain");
-static std::string mimeX_COLOR("application/x-color");
-static std::string mimeOSWB_COLOR("application/x-oswb-color");
-
-static std::string doubleToStr(double d);
-
-ColorDef::ColorDef() :
-    descr(_("none")),
-    type(NONE),
-    r(0),
-    g(0),
-    b(0),
-    editable(false)
-{
-}
-
-ColorDef::ColorDef( ColorType type ) :
-    descr(),
-    type(type),
-    r(0),
-    g(0),
-    b(0),
-    editable(false)
-{
-    switch (type) {
-        case CLEAR:
-            descr = _("remove");
-            break;
-        case NONE:
-            descr = _("none");
-            break;
-        case RGB:
-            descr = "";
-            break;
-    }
-}
-
-ColorDef::ColorDef( unsigned int r, unsigned int g, unsigned int b, const std::string& description ) :
-    descr(description),
-    type(RGB),
-    r(r),
-    g(g),
-    b(b),
-    editable(false)
-{
-}
-
-ColorDef::~ColorDef()
-{
-}
-
-ColorDef::ColorDef( ColorDef const &other )
-{
-    if ( this != &other ) {
-        *this = other;
-    }
-}
-
-ColorDef& ColorDef::operator=( ColorDef const &other )
-{
-    if ( this != & other )
-    {
-        type = other.type;
-        r = other.r;
-        g = other.g;
-        b = other.b;
-        descr = other.descr;
-        editable = other.editable;
-    }
-    return *this;
-}
-
-class ColorDef::HookData {
-public:
-    HookData( ColorCallback cb, void* data ) {_cb = cb; _data = data;}
-    ColorCallback _cb;
-    void* _data;
-};
-
-
-std::vector<std::string> ColorDef::getMIMETypes()
-{
-    std::vector<std::string> listing;
-    listing.push_back(mimeOSWB_COLOR);
-    listing.push_back(mimeX_COLOR);
-    listing.push_back(mimeTEXT);
-    return listing;
-}
-
-void ColorDef::getMIMEData(std::string const & type, char*& dest, int& len, int& format)
-{
-    if ( type == mimeTEXT ) {
-        dest = new char[8];
-        snprintf( dest, 8, "#%02x%02x%02x", getR(), getG(), getB() );
-        dest[7] = 0;
-        len = 8;
-        format = 8;
-    } else if ( type == mimeX_COLOR ) {
-        uint16_t* tmp = new uint16_t[4];
-        tmp[0] = (getR() << 8) | getR();
-        tmp[1] = (getG() << 8) | getG();
-        tmp[2] = (getB() << 8) | getB();
-        tmp[3] = 0xffff;
-        dest = reinterpret_cast<char*>(tmp);
-        len = 8;
-        format = 16;
-    } else if ( type == mimeOSWB_COLOR ) {
-        std::string tmp("<paint>");
-        switch ( getType() ) {
-            case eek::ColorDef::NONE:
-            {
-                tmp += "<nocolor/>";
-            }
-            break;
-            case eek::ColorDef::CLEAR:
-            {
-                tmp += "<clear/>";
-            }
-            break;
-            default:
-            {
-                tmp += std::string("<color name=\"") + descr + "\">";
-                tmp += "<sRGB r=\"";
-                tmp += doubleToStr(getR()/255.0);
-                tmp += "\" g=\"";
-                tmp += doubleToStr(getG()/255.0);
-                tmp += "\" b=\"";
-                tmp += doubleToStr(getB()/255.0);
-                tmp += "\"/>";
-                tmp += "</color>";
-            }
-        }
-        tmp += "</paint>";
-        len = tmp.size();
-        dest = new char[len];
-        // Note that this is not null-terminated:
-        memcpy(dest, tmp.c_str(), len);
-        format = 8;
-    } else {
-        // nothing
-        dest = 0;
-        len = 0;
-    }
-}
-
-bool ColorDef::fromMIMEData(std::string const & type, char const * data, int len, int /*format*/)
-{
-    bool worked = false;
-    bool changed = false;
-    if ( type == mimeTEXT ) {
-    } else if ( type == mimeX_COLOR ) {
-    } else if ( type == mimeOSWB_COLOR ) {
-        std::string xml(data, len);
-        if ( xml.find("<nocolor/>") != std::string::npos ) {
-            if ( (this->type != eek::ColorDef::NONE)
-                 || (this->r != 0)
-                 || (this->g != 0)
-                 || (this->b != 0) ) {
-                this->type = eek::ColorDef::NONE;
-                this->r = 0;
-                this->g = 0;
-                this->b = 0;
-                changed = true;
-            }
-            worked = true;
-        } else {
-            size_t pos = xml.find("<sRGB");
-            if ( pos != std::string::npos ) {
-                size_t endPos = xml.find(">", pos);
-                std::string srgb = xml.substr(pos, endPos);
-                this->type = eek::ColorDef::RGB;
-                size_t numPos = srgb.find("r=");
-                if (numPos != std::string::npos) {
-                    char* endPtr = 0;
-                    double dbl = strtod(srgb.c_str() + numPos + 3, &endPtr);
-                    this->r = static_cast<int>(255 * dbl);
-                }
-                numPos = srgb.find("g=");
-                if (numPos != std::string::npos) {
-                    char* endPtr = 0;
-                    double dbl = strtod(srgb.c_str() + numPos + 3, &endPtr);
-                    this->g = static_cast<int>(255 * dbl);
-                }
-                numPos = srgb.find("b=");
-                if (numPos != std::string::npos) {
-                    char* endPtr = 0;
-                    double dbl = strtod(srgb.c_str() + numPos + 3, &endPtr);
-                    this->b = static_cast<int>(255 * dbl);
-                }
-
-                size_t pos = xml.find("<color ");
-                if ( pos != std::string::npos ) {
-                    size_t endPos = xml.find(">", pos);
-                    std::string colorTag = xml.substr(pos, endPos);
-
-                    size_t namePos = colorTag.find("name=");
-                    if (namePos != std::string::npos) {
-                        char quote = colorTag[namePos + 5];
-                        endPos = colorTag.find(quote, namePos + 6);
-                        descr = colorTag.substr(namePos + 6, endPos - (namePos + 6));
-                    }
-                }
-                changed = true;
-                worked = true;
-            }
-        }
-    }
-    if ( changed ) {
-        // beware of callbacks changing things
-        for ( std::vector<HookData*>::iterator it = _listeners.begin(); it != _listeners.end(); ++it )
-        {
-            if ( (*it)->_cb )
-            {
-                (*it)->_cb( (*it)->_data );
-            }
-        }
-    }
-    return worked;
-}
-
-void ColorDef::setRGB( unsigned int r, unsigned int g, unsigned int b )
-{
-    if ( r != this->r || g != this->g || b != this->b ) {
-        this->r = r;
-        this->g = g;
-        this->b = b;
-
-        // beware of callbacks changing things
-        for ( std::vector<HookData*>::iterator it = _listeners.begin(); it != _listeners.end(); ++it )
-        {
-            if ( (*it)->_cb )
-            {
-                (*it)->_cb( (*it)->_data );
-            }
-        }
-    }
-}
-
-void ColorDef::addCallback( ColorCallback cb, void* data )
-{
-    _listeners.push_back( new HookData(cb, data) );
-}
-
-void ColorDef::removeCallback( ColorCallback /*cb*/, void* /*data*/ )
-{
-}
-
-static std::string doubleToStr(double d)
-{
-    // TODO ensure "." is used for decimal separator.
-    std::stringstream out;
-    out << d;
-    return out.str();
-}
-
-} // namespace eek
-
-/*
-  Local Variables:
-  mode:c++
-  c-file-style:"stroustrup"
-  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
-  indent-tabs-mode:nil
-  fill-column:99
-  End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/widgets/eek-color-def.h b/src/widgets/eek-color-def.h
deleted file mode 100644 (file)
index 2f6117d..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/** @file
- * @brief EEK color definition
- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Eek Color Definition.
- *
- * The Initial Developer of the Original Code is
- * Jon A. Cruz.
- * Portions created by the Initial Developer are Copyright (C) 2006
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef SEEN_EEK_COLOR_DEF_H
-#define SEEN_EEK_COLOR_DEF_H
-
-#include <string>
-#include <vector>
-
-namespace eek
-{
-
-typedef void (*ColorCallback)( void* data );
-
-
-class ColorDef
-{
-public:
-    enum ColorType{CLEAR, NONE, RGB};
-
-    ColorDef();
-    ColorDef(ColorType type);
-    ColorDef( unsigned int r, unsigned int g, unsigned int b, const std::string& description );
-    virtual ~ColorDef();
-
-    ColorDef( ColorDef const &other );
-    virtual ColorDef& operator=( ColorDef const &other );
-
-    ColorType getType() const { return type; }
-
-    std::vector<std::string> getMIMETypes();
-    void getMIMEData(std::string const & type, char*& dest, int& len, int& format);
-    bool fromMIMEData(std::string const & type, char const * data, int len, int format);
-
-    void setRGB( unsigned int r, unsigned int g, unsigned int b );
-    unsigned int getR() const { return r; }
-    unsigned int getG() const { return g; }
-    unsigned int getB() const { return b; }
-
-    void addCallback( ColorCallback cb, void* data );
-    void removeCallback( ColorCallback cb, void* data );
-
-    bool isEditable() const { return editable; }
-    void setEditable( bool edit ) { editable = edit; }
-
-    std::string descr;
-
-protected:
-    ColorType type;
-    unsigned int r;
-    unsigned int g;
-    unsigned int b;
-    bool editable;
-
-private:
-    class HookData;
-
-    std::vector<HookData*> _listeners;
-};
-
-
-} // namespace eek
-
-#endif // SEEN_EEK_COLOR_DEF_H
-
-/*
-  Local Variables:
-  mode:c++
-  c-file-style:"stroustrup"
-  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
-  indent-tabs-mode:nil
-  fill-column:99
-  End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/widgets/ege-paint-def.cpp b/src/widgets/ege-paint-def.cpp
new file mode 100644 (file)
index 0000000..dc1579c
--- /dev/null
@@ -0,0 +1,328 @@
+/** @file
+ * @brief EGE paint definition
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Eek Color Definition.
+ *
+ * The Initial Developer of the Original Code is
+ * Jon A. Cruz.
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "config.h"
+
+#ifdef HAVE_LIBINTL_H
+#include <libintl.h>
+#endif
+
+#include <stdint.h>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdlib.h>
+#include <string.h>
+
+#if !defined(_)
+#define _(s) gettext(s)
+#endif // !defined(_)
+
+#include "ege-paint-def.h"
+
+namespace ege
+{
+
+static std::string mimeTEXT("text/plain");
+static std::string mimeX_COLOR("application/x-color");
+static std::string mimeOSWB_COLOR("application/x-oswb-color");
+
+static std::string doubleToStr(double d);
+
+PaintDef::PaintDef() :
+    descr(_("none")),
+    type(NONE),
+    r(0),
+    g(0),
+    b(0),
+    editable(false)
+{
+}
+
+PaintDef::PaintDef( ColorType type ) :
+    descr(),
+    type(type),
+    r(0),
+    g(0),
+    b(0),
+    editable(false)
+{
+    switch (type) {
+        case CLEAR:
+            descr = _("remove");
+            break;
+        case NONE:
+            descr = _("none");
+            break;
+        case RGB:
+            descr = "";
+            break;
+    }
+}
+
+PaintDef::PaintDef( unsigned int r, unsigned int g, unsigned int b, const std::string& description ) :
+    descr(description),
+    type(RGB),
+    r(r),
+    g(g),
+    b(b),
+    editable(false)
+{
+}
+
+PaintDef::~PaintDef()
+{
+}
+
+PaintDef::PaintDef( PaintDef const &other )
+{
+    if ( this != &other ) {
+        *this = other;
+    }
+}
+
+PaintDef& PaintDef::operator=( PaintDef const &other )
+{
+    if ( this != & other )
+    {
+        type = other.type;
+        r = other.r;
+        g = other.g;
+        b = other.b;
+        descr = other.descr;
+        editable = other.editable;
+    }
+    return *this;
+}
+
+class PaintDef::HookData {
+public:
+    HookData( ColorCallback cb, void* data ) {_cb = cb; _data = data;}
+    ColorCallback _cb;
+    void* _data;
+};
+
+
+std::vector<std::string> PaintDef::getMIMETypes()
+{
+    std::vector<std::string> listing;
+    listing.push_back(mimeOSWB_COLOR);
+    listing.push_back(mimeX_COLOR);
+    listing.push_back(mimeTEXT);
+    return listing;
+}
+
+void PaintDef::getMIMEData(std::string const & type, char*& dest, int& len, int& format)
+{
+    if ( type == mimeTEXT ) {
+        dest = new char[8];
+        snprintf( dest, 8, "#%02x%02x%02x", getR(), getG(), getB() );
+        dest[7] = 0;
+        len = 8;
+        format = 8;
+    } else if ( type == mimeX_COLOR ) {
+        uint16_t* tmp = new uint16_t[4];
+        tmp[0] = (getR() << 8) | getR();
+        tmp[1] = (getG() << 8) | getG();
+        tmp[2] = (getB() << 8) | getB();
+        tmp[3] = 0xffff;
+        dest = reinterpret_cast<char*>(tmp);
+        len = 8;
+        format = 16;
+    } else if ( type == mimeOSWB_COLOR ) {
+        std::string tmp("<paint>");
+        switch ( getType() ) {
+            case ege::PaintDef::NONE:
+            {
+                tmp += "<nocolor/>";
+            }
+            break;
+            case ege::PaintDef::CLEAR:
+            {
+                tmp += "<clear/>";
+            }
+            break;
+            default:
+            {
+                tmp += std::string("<color name=\"") + descr + "\">";
+                tmp += "<sRGB r=\"";
+                tmp += doubleToStr(getR()/255.0);
+                tmp += "\" g=\"";
+                tmp += doubleToStr(getG()/255.0);
+                tmp += "\" b=\"";
+                tmp += doubleToStr(getB()/255.0);
+                tmp += "\"/>";
+                tmp += "</color>";
+            }
+        }
+        tmp += "</paint>";
+        len = tmp.size();
+        dest = new char[len];
+        // Note that this is not null-terminated:
+        memcpy(dest, tmp.c_str(), len);
+        format = 8;
+    } else {
+        // nothing
+        dest = 0;
+        len = 0;
+    }
+}
+
+bool PaintDef::fromMIMEData(std::string const & type, char const * data, int len, int /*format*/)
+{
+    bool worked = false;
+    bool changed = false;
+    if ( type == mimeTEXT ) {
+    } else if ( type == mimeX_COLOR ) {
+    } else if ( type == mimeOSWB_COLOR ) {
+        std::string xml(data, len);
+        if ( xml.find("<nocolor/>") != std::string::npos ) {
+            if ( (this->type != ege::PaintDef::NONE)
+                 || (this->r != 0)
+                 || (this->g != 0)
+                 || (this->b != 0) ) {
+                this->type = ege::PaintDef::NONE;
+                this->r = 0;
+                this->g = 0;
+                this->b = 0;
+                changed = true;
+            }
+            worked = true;
+        } else {
+            size_t pos = xml.find("<sRGB");
+            if ( pos != std::string::npos ) {
+                size_t endPos = xml.find(">", pos);
+                std::string srgb = xml.substr(pos, endPos);
+                this->type = ege::PaintDef::RGB;
+                size_t numPos = srgb.find("r=");
+                if (numPos != std::string::npos) {
+                    char* endPtr = 0;
+                    double dbl = strtod(srgb.c_str() + numPos + 3, &endPtr);
+                    this->r = static_cast<int>(255 * dbl);
+                }
+                numPos = srgb.find("g=");
+                if (numPos != std::string::npos) {
+                    char* endPtr = 0;
+                    double dbl = strtod(srgb.c_str() + numPos + 3, &endPtr);
+                    this->g = static_cast<int>(255 * dbl);
+                }
+                numPos = srgb.find("b=");
+                if (numPos != std::string::npos) {
+                    char* endPtr = 0;
+                    double dbl = strtod(srgb.c_str() + numPos + 3, &endPtr);
+                    this->b = static_cast<int>(255 * dbl);
+                }
+
+                size_t pos = xml.find("<color ");
+                if ( pos != std::string::npos ) {
+                    size_t endPos = xml.find(">", pos);
+                    std::string colorTag = xml.substr(pos, endPos);
+
+                    size_t namePos = colorTag.find("name=");
+                    if (namePos != std::string::npos) {
+                        char quote = colorTag[namePos + 5];
+                        endPos = colorTag.find(quote, namePos + 6);
+                        descr = colorTag.substr(namePos + 6, endPos - (namePos + 6));
+                    }
+                }
+                changed = true;
+                worked = true;
+            }
+        }
+    }
+    if ( changed ) {
+        // beware of callbacks changing things
+        for ( std::vector<HookData*>::iterator it = _listeners.begin(); it != _listeners.end(); ++it )
+        {
+            if ( (*it)->_cb )
+            {
+                (*it)->_cb( (*it)->_data );
+            }
+        }
+    }
+    return worked;
+}
+
+void PaintDef::setRGB( unsigned int r, unsigned int g, unsigned int b )
+{
+    if ( r != this->r || g != this->g || b != this->b ) {
+        this->r = r;
+        this->g = g;
+        this->b = b;
+
+        // beware of callbacks changing things
+        for ( std::vector<HookData*>::iterator it = _listeners.begin(); it != _listeners.end(); ++it )
+        {
+            if ( (*it)->_cb )
+            {
+                (*it)->_cb( (*it)->_data );
+            }
+        }
+    }
+}
+
+void PaintDef::addCallback( ColorCallback cb, void* data )
+{
+    _listeners.push_back( new HookData(cb, data) );
+}
+
+void PaintDef::removeCallback( ColorCallback /*cb*/, void* /*data*/ )
+{
+}
+
+static std::string doubleToStr(double d)
+{
+    // TODO ensure "." is used for decimal separator.
+    std::stringstream out;
+    out << d;
+    return out.str();
+}
+
+} // namespace ege
+
+/*
+  Local Variables:
+  mode:c++
+  c-file-style:"stroustrup"
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+  indent-tabs-mode:nil
+  fill-column:99
+  End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/widgets/ege-paint-def.h b/src/widgets/ege-paint-def.h
new file mode 100644 (file)
index 0000000..b47aec8
--- /dev/null
@@ -0,0 +1,111 @@
+/** @file
+ * @brief EGE paint definition
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Eek Color Definition.
+ *
+ * The Initial Developer of the Original Code is
+ * Jon A. Cruz.
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef SEEN_EGE_PAINT_DEF_H
+#define SEEN_EGE_PAINT_DEF_H
+
+#include <string>
+#include <vector>
+
+namespace ege
+{
+
+typedef void (*ColorCallback)( void* data );
+
+
+class PaintDef
+{
+public:
+    enum ColorType{CLEAR, NONE, RGB};
+
+    PaintDef();
+    PaintDef(ColorType type);
+    PaintDef( unsigned int r, unsigned int g, unsigned int b, const std::string& description );
+    virtual ~PaintDef();
+
+    PaintDef( PaintDef const &other );
+    virtual PaintDef& operator=( PaintDef const &other );
+
+    ColorType getType() const { return type; }
+
+    std::vector<std::string> getMIMETypes();
+    void getMIMEData(std::string const & type, char*& dest, int& len, int& format);
+    bool fromMIMEData(std::string const & type, char const * data, int len, int format);
+
+    void setRGB( unsigned int r, unsigned int g, unsigned int b );
+    unsigned int getR() const { return r; }
+    unsigned int getG() const { return g; }
+    unsigned int getB() const { return b; }
+
+    void addCallback( ColorCallback cb, void* data );
+    void removeCallback( ColorCallback cb, void* data );
+
+    bool isEditable() const { return editable; }
+    void setEditable( bool edit ) { editable = edit; }
+
+    std::string descr;
+
+protected:
+    ColorType type;
+    unsigned int r;
+    unsigned int g;
+    unsigned int b;
+    bool editable;
+
+private:
+    class HookData;
+
+    std::vector<HookData*> _listeners;
+};
+
+
+} // namespace ege
+
+#endif // SEEN_EGE_PAINT_DEF_H
+
+/*
+  Local Variables:
+  mode:c++
+  c-file-style:"stroustrup"
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+  indent-tabs-mode:nil
+  fill-column:99
+  End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :