$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: stipe_at_[hidden]
Date: 2008-08-28 14:08:36
Author: srajko
Date: 2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
New Revision: 48423
URL: http://svn.boost.org/trac/boost/changeset/48423
Log:
guigl window, button, labeled_button and slider work OK
Added:
   sandbox/guigl/boost/guigl/
   sandbox/guigl/boost/guigl/access.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/application.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/event.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/layout/
   sandbox/guigl/boost/guigl/layout/grid.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/parameters.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/platform/
   sandbox/guigl/boost/guigl/platform/glut.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/platform/opengl.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/types.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/
   sandbox/guigl/boost/guigl/view/active_colored.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/base.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/clickable.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/colored.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/compound.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/draggable.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/
   sandbox/guigl/boost/guigl/view/impl/active_colored.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/clickable.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/colored.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/compound.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/draggable.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/labeled.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/mouse_tracking.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/positioned.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/solid_background.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/impl/window.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/labeled.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/mouse_tracking.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/positioned.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/solid_background.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/view/window.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/widget/
   sandbox/guigl/boost/guigl/widget/button.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/widget/labeled_button.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/widget/slider.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/widget/window.hpp   (contents, props changed)
   sandbox/guigl/boost/guigl/window.hpp   (contents, props changed)
   sandbox/guigl/boost/parameter/
   sandbox/guigl/boost/parameter/aux_/
   sandbox/guigl/boost/parameter/aux_/typed_arg_list.hpp   (contents, props changed)
   sandbox/guigl/boost/parameter/aux_/typed_tagged_argument.hpp   (contents, props changed)
   sandbox/guigl/boost/parameter/typed_keyword.hpp   (contents, props changed)
   sandbox/guigl/boost/parameter/typed_name.hpp   (contents, props changed)
   sandbox/guigl/libs/guigl/build/
   sandbox/guigl/libs/guigl/build/xcodeide/
   sandbox/guigl/libs/guigl/build/xcodeide/guigl.xcodeproj/
   sandbox/guigl/libs/guigl/build/xcodeide/guigl.xcodeproj/project.pbxproj   (contents, props changed)
   sandbox/guigl/libs/guigl/example/
   sandbox/guigl/libs/guigl/example/Jamfile   (contents, props changed)
   sandbox/guigl/libs/guigl/example/window_example.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/
   sandbox/guigl/libs/guigl/src/application.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/view/
   sandbox/guigl/libs/guigl/src/view/compound.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/view/positioned.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/view/solid_background.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/view/window.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/widget/
   sandbox/guigl/libs/guigl/src/widget/button.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/widget/labeled_button.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/widget/slider.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/widget/window.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/src/window.cpp   (contents, props changed)
   sandbox/guigl/libs/guigl/test/test_parameter.cpp   (contents, props changed)
Text files modified: 
   sandbox/guigl/libs/guigl/test/Jamfile                                 |    12 +-----------                            
   sandbox/guigl/libs/guigl/test/test_parameter_compilation.cpp          |     4 +++-                                    
   sandbox/guigl/libs/guigl/test/test_parameter_compilation.hpp          |    23 ++++++++++++++++-------                 
   sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.cpp |     2 +-                                      
   sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.hpp |     7 ++++++-                                 
   5 files changed, 27 insertions(+), 21 deletions(-)
Added: sandbox/guigl/boost/guigl/access.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/access.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,59 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__ACCESS_HPP
+#define BOOST__GUIGL__ACCESS_HPP
+
+
+namespace boost { namespace guigl {
+
+namespace view {
+
+template<typename BaseView>
+class compound;
+
+namespace detail {
+
+    template<typename BaseView>
+    class compound_event_visitor;
+
+}
+
+}
+
+struct access
+{
+private:
+    template<typename T>
+    static void draw(T &t)
+    {
+        t.draw();
+    }
+
+    template<typename T, typename E>
+    static bool on_event(T &t, const E& e)
+    {
+        return t.on_event(e);
+    }
+    
+    template<typename Child, typename Parent>
+    static void parent(Child &child, Parent &parent)
+    {
+        child.parent(parent);
+    }
+
+    friend class window;
+    template<typename BaseType>
+    friend class view::compound;
+    template<typename BaseType>
+    friend class view::detail::compound_event_visitor;
+};
+
+}}
+
+#endif // BOOST__GUIGL__ACCESS_HPP
Added: sandbox/guigl/boost/guigl/application.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/application.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,25 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__APPLICATION_HPP
+#define BOOST__GUIGL__APPLICATION_HPP
+
+
+#include <GLUT/glut.h>
+
+
+namespace boost { namespace guigl {
+
+class application {
+public:
+    static void run();
+};
+
+}}
+
+#endif // BOOST__GUIGL__APPLICATION_HPP
Added: sandbox/guigl/boost/guigl/event.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/event.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,73 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__EVENT_HPP
+#define BOOST__GUIGL__EVENT_HPP
+
+
+#include <boost/guigl/types.hpp>
+#include <boost/variant.hpp>
+
+
+namespace boost { namespace guigl {
+
+namespace button {
+
+enum enum_type
+{
+    left, middle, right
+};
+
+}
+
+namespace direction {
+
+enum enum_type
+{
+    up, down
+};
+
+}
+
+namespace region
+{
+
+enum enum_type
+{
+    entry, exit
+};
+
+}
+
+struct movement_event
+{
+    position_type position;
+};
+
+struct entry_exit_event
+{
+    entry_exit_event()
+    {}
+    entry_exit_event(region::enum_type value)
+        : region(value)
+    {}
+    region::enum_type region;
+};
+
+struct button_event
+{
+    position_type position;
+    button::enum_type button;
+    direction::enum_type direction;
+};
+
+typedef boost::variant<button_event, movement_event, entry_exit_event> event_type;
+
+}}
+
+#endif // BOOST__GUIGL__ACCESS_HPP
Added: sandbox/guigl/boost/guigl/layout/grid.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/layout/grid.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,81 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__LAYOUT__GRID_HPP
+#define BOOST__GUIGL__LAYOUT__GRID_HPP
+
+
+#include <boost/guigl/view/base.hpp>
+#include <boost/guigl/types.hpp>
+#include <memory>
+
+
+namespace boost { namespace guigl {
+
+namespace major_direction
+{
+    enum enum_type
+    {
+        horizontal=0,vertical=1
+    };
+}
+
+namespace keywords {
+
+    BOOST_PARAMETER_TYPED_NAME(grid_size,const size_type)
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(horizontal,const unsigned,1)
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(vertical,const unsigned,1)
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(direction,const major_direction::enum_type,major_direction::horizontal)
+    
+    typedef boost::parameter::aux::empty_typed_arg_list default_parameters;
+}
+
+
+namespace layout {
+
+class grid
+{
+public:
+    template<typename ArgumentPack>
+    grid(const ArgumentPack &args)
+        : m_size(args[_grid_size])
+        , m_element_size(m_size.x / args[_horizontal], m_size.y/args[_vertical])
+        , m_direction(args[_direction])
+    {
+        m_dimensions[0] = args[_horizontal];
+        m_dimensions[1] = args[_vertical];
+        m_next[0] = m_next[1] = 0;
+    }
+    
+    template<typename T, typename ArgumentPack>
+    T *create(const ArgumentPack &args)
+    {
+        T *element(new T((
+            args,
+            _size = m_element_size,
+            _position = position_type(m_element_size.x * m_next[0], m_element_size.y * m_next[1])
+        )) );
+        
+        if(++m_next[m_direction] >= m_dimensions[m_direction])
+        {
+            m_next[m_direction] = 0;
+            m_next[!m_direction]++;
+        }
+        return element;
+    }
+private:
+    size_type m_size;
+    size_type m_element_size;
+    unsigned m_dimensions[2];
+    unsigned m_next[2];
+    major_direction::enum_type m_direction;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__POSITIONED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/parameters.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/parameters.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,56 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__PARAMETER_MAP_HPP
+#define BOOST__GUIGL__PARAMETER_MAP_HPP
+
+#include <boost/guigl/types.hpp>
+#include <boost/parameter/typed_name.hpp>
+
+namespace boost { namespace guigl {
+
+namespace keywords {
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(label,const std::string,"")
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(size,const size_type,(size_type(200,200)))
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(position,const position_type,(size_type(0,0)))
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(background,const color_type,(color_type(0,0,0)))
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(color,const color_type,(color_type(1,1,1)))
+    BOOST_PARAMETER_TYPED_NAME_WDEFAULT(active_color,const color_type,(color_type(1,0,0)))
+    
+    typedef boost::parameter::aux::empty_typed_arg_list default_parameters;
+}
+
+using namespace keywords;
+
+template<
+    typename T0=boost::parameter::void_, typename T1=boost::parameter::void_,
+    typename T2=boost::parameter::void_, typename T3=boost::parameter::void_,
+    typename T4=boost::parameter::void_, typename T5=boost::parameter::void_,
+    typename T6=boost::parameter::void_, typename T7=boost::parameter::void_>
+struct argument_pack
+{
+    typedef
+        boost::parameter::aux::typed_arg_list<
+            boost::parameter::aux::typed_tagged_argument<T0>,
+            typename argument_pack<T1, T2, T3, T4, T5, T6, T7>::type
+        > type;
+};
+
+template<>
+struct argument_pack<
+    boost::parameter::void_, boost::parameter::void_,
+    boost::parameter::void_, boost::parameter::void_,
+    boost::parameter::void_, boost::parameter::void_,
+    boost::parameter::void_, boost::parameter::void_>
+{
+    typedef boost::parameter::aux::empty_typed_arg_list type;
+};
+
+}}
+
+#endif // BOOST__GUIGL__PARAMETER_MAP_HPP
Added: sandbox/guigl/boost/guigl/platform/glut.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/platform/glut.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,9 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#include <GLUT/glut.h>
Added: sandbox/guigl/boost/guigl/platform/opengl.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/platform/opengl.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,9 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#include <OpenGL/gl.h>
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/types.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/types.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,24 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__TYPES_HPP
+#define BOOST__GUIGL__TYPES_HPP
+
+
+#include <boost/gil/utilities.hpp>
+#include <boost/gil/typedefs.hpp>
+
+namespace boost { namespace guigl {
+
+typedef gil::point2<double> size_type;
+typedef gil::point2<double> position_type;
+typedef gil::rgb32f_pixel_t color_type;
+
+}}
+
+#endif // BOOST__GUIGL__TYPES_HPP
Added: sandbox/guigl/boost/guigl/view/active_colored.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/active_colored.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,39 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__ACTIVE_COLORED_HPP
+#define BOOST__GUIGL__VIEW__ACTIVE_COLORED_HPP
+
+#include <boost/guigl/view/base.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView=base>
+class active_colored : public BaseView
+{
+    typedef BaseView base_type;
+public:
+    template<typename ArgumentPack>
+    active_colored(const ArgumentPack &args)
+        : base_type(args)
+        , m_active_color(args[_active_color])
+    {}
+    
+    const color_type &active_color() const
+    {   return m_active_color; }
+    const void active_color(const color_type &color)
+    {   m_active_color = color; }
+protected:
+    void use_active_color();
+private:
+    color_type m_active_color;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__ACTIVE_COLORED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/base.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/base.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,79 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__BASE_HPP
+#define BOOST__GUIGL__VIEW__BASE_HPP
+
+#include <boost/guigl/access.hpp>
+#include <boost/guigl/event.hpp>
+#include <boost/guigl/parameters.hpp>
+
+namespace boost { namespace guigl {
+
+class window;
+
+namespace view {
+
+class base
+{
+
+public:
+    template<typename ArgumentPack>
+    base(const ArgumentPack &args)
+        : m_size(args[_size])
+    {}
+    virtual ~base()
+    {}
+    
+    const size_type &size() const
+    {   return m_size; }
+    
+protected:
+    virtual void draw()=0;
+    void draw_prologue() {}
+    void draw_epilogue() {}
+    
+    virtual bool on_event(const event_type &e)
+    {
+        return false;
+    };
+
+    size_type m_size;
+    
+    friend class boost::guigl::access;
+};
+
+}}}
+
+#define BOOST_GUIGL_DRAW                    \
+    void draw_prologue();                   \
+    void draw_epilogue();                   \
+
+#define BOOST_GUIGL_WIDGET_DRAW             \
+    friend class ::boost::guigl::access;    \
+    void draw();                            \
+    void draw_prologue();                   \
+    void draw_epilogue();                   \
+
+#define BOOST_GUIGL_DRAW_IMPL(view_type)    \
+template<typename BaseView>                 \
+void view_type<BaseView>::draw()            \
+{                                           \
+    draw_prologue();                        \
+    draw_epilogue();                        \
+}                                           \
+
+#define BOOST_GUIGL_WIDGET_DRAW_IMPL(widget)\
+void widget::draw()                         \
+{                                           \
+    draw_prologue();                        \
+    draw_epilogue();                        \
+}                                           \
+
+
+#endif // BOOST__GUIGL__VIEW_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/clickable.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/clickable.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,52 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__CLICKABLE_HPP
+#define BOOST__GUIGL__VIEW__CLICKABLE_HPP
+
+#include <boost/guigl/view/base.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+namespace detail {
+
+    template<typename Derived, typename BaseView>
+    struct clickable_static_visitor;
+
+}
+
+template<typename Derived, typename BaseView=base>
+class clickable : public BaseView
+{
+    typedef BaseView base_type;
+public:
+    template<typename ArgumentPack>
+    clickable(const ArgumentPack &args)
+        : base_type(args)
+        , m_button_down(false)
+    {}
+
+protected:
+    bool on_event(const event_type &event_info);
+
+    bool button_down()
+    {   return m_button_down; }
+private:
+    bool m_button_down;
+    void button_down(bool state);
+    void clickable_on_click()
+    {
+        static_cast<Derived *>(this)->clickable_on_click();
+    }
+
+    friend struct detail::clickable_static_visitor<Derived,BaseView>;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__CLICKABLE_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/colored.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/colored.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,40 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__COLORED_HPP
+#define BOOST__GUIGL__VIEW__COLORED_HPP
+
+#include <boost/guigl/view/base.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView=base>
+class colored : public BaseView
+{
+    typedef BaseView base_type;
+public:
+    template<typename ArgumentPack>
+    colored(const ArgumentPack &args)
+        : base_type(args)
+        , m_color(args[_color])
+    {}
+    
+    const color_type &color() const
+    {   return m_color; }
+    const void set_color(const color_type &color)
+    {   m_color = color; }
+protected:
+    BOOST_GUIGL_DRAW
+
+private:
+    color_type m_color;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__COLORED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/compound.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/compound.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,63 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__COMPOUND_HPP
+#define BOOST__GUIGL__VIEW__COMPOUND_HPP
+
+
+#include <boost/guigl/view/positioned.hpp>
+#include <boost/ptr_container/ptr_vector.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+namespace detail
+{
+    template<typename BaseView>
+    struct compound_event_visitor;
+}
+
+template<typename BaseView=base>
+class compound : public BaseView
+{    
+public:
+    typedef BaseView base_type;
+
+    template<typename ArgumentPack>
+    compound(const ArgumentPack &args)
+        : base_type(args)
+        , m_mouse_focus_child(0) 
+    {}
+    
+    compound & operator << (positioned<> *v)
+    {
+        m_children.push_back(v);
+        access::parent(*v, *this);
+        return *this;
+    }
+    
+    bool on_event(const event_type &event_info);
+
+    const ptr_vector<positioned<> > &children() const
+    {   return m_children; }
+    
+protected:
+    BOOST_GUIGL_DRAW
+
+    ptr_vector<positioned<> > &children()
+    {   return m_children; }
+
+private:
+    ptr_vector<positioned<> > m_children;
+    positioned<> * m_mouse_focus_child;
+
+    friend class detail::compound_event_visitor<BaseView>;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/draggable.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/draggable.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,50 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__DRAGGABLE_HPP
+#define BOOST__GUIGL__VIEW__DRAGGABLE_HPP
+
+#include <boost/guigl/view/base.hpp>
+#include <boost/guigl/view/mouse_tracking.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+namespace detail {
+
+    template<typename Derived, typename BaseView>
+    struct draggable_static_visitor;
+
+}
+
+template<typename Derived, typename BaseView=base>
+class draggable : public mouse_tracking<BaseView>
+{
+    typedef mouse_tracking<BaseView> base_type;
+public:
+    template<typename ArgumentPack>
+    draggable(const ArgumentPack &args)
+        : base_type(args)
+    {}
+
+protected:
+    BOOST_GUIGL_DRAW
+
+    bool on_event(const event_type &event_info);
+
+private:
+    void draggable_on_drag(const position_type &position)
+    {
+        static_cast<Derived *>(this)->draggable_on_drag(position);
+    }
+
+    friend struct detail::draggable_static_visitor<Derived,BaseView>;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__CLICKABLE_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/active_colored.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/active_colored.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,25 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__ACTIVE_COLORED_HPP
+#define BOOST__GUIGL__VIEW__IMPL__ACTIVE_COLORED_HPP
+
+#include <boost/guigl/view/active_colored.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView>
+void active_colored<BaseView>::use_active_color()
+{
+    glColor3d(m_active_color[0],m_active_color[1],m_active_color[2]);
+}
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__COLORED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/clickable.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/clickable.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,84 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__CLICKABLE_HPP
+#define BOOST__GUIGL__VIEW__IMPL__CLICKABLE_HPP
+
+#include <boost/guigl/view/colored.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename Derived, typename BaseView>
+inline void clickable<Derived, BaseView>::button_down(bool state)
+{
+    m_button_down = state;
+    static_cast<Derived *>(this)->clickable_button_down(state);
+}
+
+namespace detail {
+
+    template<typename Derived, typename BaseView>
+    struct clickable_static_visitor
+        : public boost::static_visitor<>
+    {
+    public:
+        clickable_static_visitor(clickable<Derived, BaseView> &c)
+            : m_clickable(c)
+        {}
+        
+        typedef bool result_type;
+        
+        template<typename EventInfo>
+        bool operator()(const EventInfo &) const
+        {
+            return false;
+        }
+        
+        bool operator()(const button_event &event_info) const
+        {
+            if(event_info.direction == direction::down)
+            {
+                m_clickable.button_down(true);
+                return true;
+            }
+            if(event_info.direction == direction::up && m_clickable.m_button_down)
+            {
+                m_clickable.button_down(false);
+                m_clickable.clickable_on_click();
+                return true;
+            }
+            return false;
+        }
+        
+        bool operator()(const entry_exit_event &event_info) const
+        {
+            if(event_info.region == region::exit)
+                m_clickable.button_down(false);
+            return true;
+        }
+
+        clickable<Derived, BaseView> &m_clickable;
+    };
+
+}
+
+template<typename Derived, typename BaseView>
+inline bool clickable<Derived, BaseView>::on_event(const event_type &event_info)
+{
+    if(base_type::on_event(event_info))
+        return true;
+    else
+        return boost::apply_visitor(detail::clickable_static_visitor<Derived,BaseView>(*this), event_info);
+}
+
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__CLICKABLE_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/colored.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/colored.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,33 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__COLORED_HPP
+#define BOOST__GUIGL__VIEW__IMPL__COLORED_HPP
+
+#include <boost/guigl/view/colored.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView>
+inline void colored<BaseView>::draw_prologue()
+{
+    BaseView::draw_prologue();
+    glColor3d(m_color[0], m_color[1], m_color[2]);
+}
+    
+template<typename BaseView>
+inline void colored<BaseView>::draw_epilogue()
+{
+    BaseView::draw_epilogue();
+}
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__COLORED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/compound.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/compound.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,143 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__COMPOUND_HPP
+#define BOOST__GUIGL__VIEW__IMPL__COMPOUND_HPP
+
+
+#include <boost/guigl/access.hpp>
+#include <boost/guigl/event.hpp>
+#include <boost/guigl/view/compound.hpp>
+
+#include <iostream>
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView>
+inline void compound<BaseView>::draw_prologue()
+{
+    BaseView::draw_prologue();
+    for(ptr_vector<positioned<> >::iterator it=m_children.begin(); it!=m_children.end(); it++)
+        access::draw(*it);
+}
+
+template<typename BaseView>
+inline void compound<BaseView>::draw_epilogue()
+{
+    BaseView::draw_epilogue();
+}
+
+namespace detail {
+
+template<typename BaseView>
+struct compound_event_visitor
+    : public boost::static_visitor<>
+{
+public:
+    typedef bool result_type;
+
+    compound_event_visitor(compound<BaseView> &view, const event_type &event_info)
+        : view(view), event_info(event_info)
+    {}
+    
+    void set_mouse_focus(positioned<> &child) const
+    {
+        if(!view.m_mouse_focus_child)
+        {
+            // we entered the mouse focus child
+            view.m_mouse_focus_child = &child;
+            access::on_event(child, entry_exit_event(region::entry));
+        }
+        else if(view.m_mouse_focus_child != &child)
+        {
+            // we changed the mouse focus child
+            access::on_event(*view.m_mouse_focus_child, entry_exit_event(region::exit));
+            view.m_mouse_focus_child = &child;
+            access::on_event(*view.m_mouse_focus_child, entry_exit_event(region::entry));
+        }
+    }
+    
+    bool operator()(const button_event &event_info) const
+    {
+        for(ptr_vector<positioned<> >::iterator it=view.children().begin(); it!=view.children().end(); it++)
+        {
+            if(!inside(event_info.position, *it))
+                continue;
+            // if we are sending an event to a child view, it must be active
+            set_mouse_focus(*it);
+            if(access::on_event(*it, this->event_info))
+                return true;
+        }
+        return false;
+    }
+    
+    bool operator()(const movement_event &event_info) const
+    {
+        for(ptr_vector<positioned<> >::iterator it=view.children().begin(); it!=view.children().end(); it++)
+        {
+            if(!inside(event_info.position, *it))
+            {
+                if(&*it == view.m_mouse_focus_child)
+                {
+                    // we left the mouse focus child
+                    view.m_mouse_focus_child = 0;
+                    access::on_event(*it, entry_exit_event(region::exit));
+                }
+                continue;
+            }
+            else
+            {
+                set_mouse_focus(*it);
+                // only the mouse focus child gets movement events
+                // forward the movement event
+                movement_event translated_event_info(event_info);
+                translated_event_info.position -= it->position();
+                access::on_event(*it, translated_event_info);
+                return true;
+            }
+        }
+        return true;        
+    }
+
+    bool operator()(const entry_exit_event &event_info) const
+    {
+        if(event_info.region == region::exit && view.m_mouse_focus_child)
+            access::on_event(*view.m_mouse_focus_child, event_info);
+        view.m_mouse_focus_child = 0;
+        return true;
+    }
+    
+    
+    static bool inside(const position_type &position, const positioned<> &view)
+    {
+        return inside(position.x, view.position().x,  view.position().x + view.size().x)
+                && inside(position.y, view.position().y,  view.position().y + view.size().y);
+    }
+    static bool inside(double pos, double min, double max)
+    {
+        return (pos >= min && pos <= max);
+    }
+
+    compound<BaseView> &view;
+    const event_type &event_info;
+};
+
+}
+
+template<typename BaseView>
+inline bool compound<BaseView>::on_event(const event_type &event_info)
+{
+    if(base_type::on_event(event_info))
+        return true;
+    else
+        return boost::apply_visitor( detail::compound_event_visitor<BaseView>(*this, event_info), event_info);
+}
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__COMPOUND_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/draggable.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/draggable.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,81 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__DRAGGABLE_HPP
+#define BOOST__GUIGL__VIEW__IMPL__DRAGGABLE_HPP
+
+#include <boost/guigl/view/draggable.hpp>
+#include <boost/guigl/view/impl/mouse_tracking.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename Derived, typename BaseView>
+inline void draggable<Derived, BaseView>::draw_prologue()
+{
+    BaseView::draw_prologue();
+}
+
+template<typename Derived, typename BaseView>
+inline void draggable<Derived, BaseView>::draw_epilogue()
+{
+    BaseView::draw_epilogue();
+}
+
+namespace detail {
+
+    template<typename Derived, typename BaseView>
+    struct draggable_static_visitor
+        : public boost::static_visitor<>
+    {
+    public:
+        draggable_static_visitor(draggable<Derived, BaseView> &c)
+            : m_draggable(c)
+        {}
+        
+        typedef bool result_type;
+        
+        template<typename EventInfo>
+        bool operator()(const EventInfo &) const
+        {
+            return false;
+        }
+
+        bool operator()(const button_event &event_info) const
+        {
+            if(event_info.direction == direction::down)
+                m_draggable.draggable_on_drag(m_draggable.mouse_state().get().position);
+            return true;
+        }
+        
+        bool operator()(const movement_event &event_info) const
+        {
+            if(m_draggable.mouse_state().get().button_down)
+                m_draggable.draggable_on_drag(event_info.position);
+            return true;
+        }
+        
+        draggable<Derived, BaseView> &m_draggable;
+    };
+
+}
+
+template<typename Derived, typename BaseView>
+inline bool draggable<Derived, BaseView>::on_event(const event_type &event_info)
+{
+    if(base_type::on_event(event_info))
+        return true;
+    else
+        return boost::apply_visitor(detail::draggable_static_visitor<Derived,BaseView>(*this), event_info);
+}
+
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__DRAGGABLE_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/labeled.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/labeled.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,37 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__LABELED_HPP
+#define BOOST__GUIGL__VIEW__IMPL__LABELED_HPP
+
+#include <boost/guigl/view/labeled.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+#include <boost/guigl/platform/glut.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView>
+inline void labeled<BaseView>::draw_prologue()
+{
+    BaseView::draw_prologue();
+
+    glRasterPos3f((BaseView::size().x - 9*m_label.size())/2, BaseView::size().y-(BaseView::size().y-15)/2, 0);
+    for (std::string::const_iterator it=m_label.begin(); it!=m_label.end(); it++)
+        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, *it);
+}
+    
+template<typename BaseView>
+inline void labeled<BaseView>::draw_epilogue()
+{
+    BaseView::draw_epilogue();
+}
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__LABELED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/mouse_tracking.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/mouse_tracking.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,98 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__MOUSE_TRACKING_HPP
+#define BOOST__GUIGL__VIEW__IMPL__MOUSE_TRACKING_HPP
+
+#include <boost/guigl/view/mouse_tracking.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+#include <boost/guigl/widget/window.hpp>
+
+#include <boost/utility/enable_if.hpp>
+
+#include <iostream>
+
+namespace boost { namespace guigl { namespace view {
+
+namespace detail {
+
+    template<typename BaseView, typename Enable=void>
+    struct get_button_state
+    {
+        static bool is_down(const mouse_tracking<BaseView> &)
+        {   return false; }
+    };
+    
+    template<typename BaseView>
+    struct get_button_state<BaseView, typename enable_if<is_positioned<BaseView> >::type>
+    {
+        static bool is_down(mouse_tracking<BaseView> &view)
+        {
+            const widget::window *window = dynamic_cast<const widget::window *> (view.root());
+            return window->mouse_state() ? window->mouse_state().get().button_down : false;
+        }
+    };
+
+    template<typename BaseView>
+    struct mouse_tracking_static_visitor
+        : public boost::static_visitor<>
+    {
+    public:
+        mouse_tracking_static_visitor(mouse_tracking<BaseView> &m)
+            : m_mouse_tracking(m)
+        {}
+        
+        typedef bool result_type;
+        
+        template<typename EventInfo>
+        bool operator()(const EventInfo &) const
+        {
+            return false;
+        }
+
+        bool operator()(const movement_event &event_info) const
+        {
+            m_mouse_tracking.m_mouse_state.get().position = event_info.position;
+            return false;
+        }
+
+        bool operator()(const button_event &event_info) const
+        {
+            m_mouse_tracking.m_mouse_state.get().button_down = (event_info.direction == direction::down);
+            return false;
+        }
+        
+        bool operator()(const entry_exit_event &event_info) const
+        {
+            if(event_info.region == region::exit)
+                m_mouse_tracking.m_mouse_state = none_t();
+            else
+            {
+                m_mouse_tracking.m_mouse_state = mouse_state();
+                m_mouse_tracking.m_mouse_state.get().button_down = get_button_state<BaseView>::is_down(m_mouse_tracking);
+            }
+            return false;
+        }
+
+        mouse_tracking<BaseView> &m_mouse_tracking;
+    };
+
+}
+
+template<typename BaseView>
+inline bool mouse_tracking<BaseView>::on_event(const event_type &event_info)
+{
+    bool response = base_type::on_event(event_info);
+    boost::apply_visitor(detail::mouse_tracking_static_visitor<BaseView>(*this), event_info);
+    return response;
+}
+
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__MOUSE_TRACKING_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/positioned.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/positioned.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,37 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__POSITIONED_HPP
+#define BOOST__GUIGL__VIEW__IMPL__POSITIONED_HPP
+
+#include <boost/guigl/view/positioned.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+//BOOST_GUIGL_DRAW_IMPL(positioned)
+
+template<typename BaseView>
+inline void positioned<BaseView>::draw_prologue()
+{
+    BaseView::draw_prologue();
+    glPushMatrix();
+    glTranslated(m_position.x, m_position.y, 0);
+}
+    
+template<typename BaseView>
+inline void positioned<BaseView>::draw_epilogue()
+{
+    glPopMatrix();
+    BaseView::draw_epilogue();
+}
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__POSITIONED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/solid_background.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/solid_background.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,36 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__SOLID_BACKGROUND_HPP
+#define BOOST__GUIGL__VIEW__IMPL__SOLID_BACKGROUND_HPP
+
+#include <boost/guigl/view/solid_background.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+//BOOST_GUIGL_DRAW_IMPL(solid_background)
+
+template<typename BaseView>
+inline void solid_background<BaseView>::draw_prologue()
+{
+    BaseView::draw_prologue();
+    glColor3d(m_background_color[0], m_background_color[1], m_background_color[2]);
+    glRectd(0.0, 0.0, solid_background::size().x, solid_background::size().y);
+}
+
+template<typename BaseView>
+inline void solid_background<BaseView>::draw_epilogue()
+{
+    BaseView::draw_epilogue();
+}
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__SOLID_BACKGROUND_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/impl/window.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/impl/window.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,43 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__IMPL__WINDOW_HPP
+#define BOOST__GUIGL__VIEW__IMPL__WINDOW_HPP
+
+
+#include <boost/guigl/view/window.hpp>
+#include <boost/guigl/platform/opengl.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+//BOOST_GUIGL_DRAW_IMPL(window)
+
+template<typename BaseView>
+inline void window<BaseView>::draw_prologue()
+{
+    BaseView::draw_prologue();
+
+    glMatrixMode (GL_PROJECTION);
+    glLoadIdentity ();
+    glOrtho (0, window::size().x, window::size().y, 0, 0, 1);
+    glMatrixMode (GL_MODELVIEW);
+    glDisable(GL_DEPTH_TEST);
+    glClearColor(m_background_color[0], m_background_color[1], m_background_color[2], 0);
+    glClear(GL_COLOR_BUFFER_BIT);
+}
+
+template<typename BaseView>
+inline void window<BaseView>::draw_epilogue()
+{
+    BaseView::draw_epilogue();
+}
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__IMPL__WINDOW_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/labeled.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/labeled.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,39 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__LABELED_HPP
+#define BOOST__GUIGL__VIEW__LABELED_HPP
+
+#include <boost/guigl/view/base.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView=base>
+class labeled : public BaseView
+{
+    typedef BaseView base_type;
+public:
+    template<typename ArgumentPack>
+    labeled(const ArgumentPack &args)
+        : base_type(args)
+        , m_label(args[_label])
+    {}
+    
+    const std::string &label() const
+    {   return m_label; }
+
+protected:
+    BOOST_GUIGL_DRAW
+
+private:
+    std::string m_label;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__POSITIONED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/mouse_tracking.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/mouse_tracking.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,55 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__MOUSE_TRACKING_HPP
+#define BOOST__GUIGL__VIEW__MOUSE_TRACKING_HPP
+
+#include <boost/guigl/view/base.hpp>
+
+namespace boost { namespace guigl {
+
+struct mouse_state
+{
+    position_type position;
+    bool button_down;    
+};
+
+namespace view {
+
+namespace detail {
+
+    template<typename BaseView>
+    struct mouse_tracking_static_visitor;
+
+}
+
+template<typename BaseView=base>
+class mouse_tracking : public BaseView
+{
+    typedef BaseView base_type;
+public:
+    template<typename ArgumentPack>
+    mouse_tracking(const ArgumentPack &args)
+        : base_type(args)
+    {}
+
+    const boost::optional<guigl::mouse_state> &mouse_state() const
+    {   return m_mouse_state; }
+
+protected:
+    bool on_event(const event_type &event_info);
+
+private:
+    boost::optional<guigl::mouse_state> m_mouse_state;
+
+    friend struct detail::mouse_tracking_static_visitor<BaseView>;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__CLICKABLE_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/positioned.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/positioned.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,69 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__POSITIONED_HPP
+#define BOOST__GUIGL__VIEW__POSITIONED_HPP
+
+#include <boost/guigl/view/base.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename View>
+struct is_positioned
+    : public is_positioned<typename View::base_type>
+{};
+
+template<>
+struct is_positioned<base> : public mpl::false_
+{};
+
+template<typename BaseView=base>
+class positioned : public BaseView
+{
+    typedef BaseView base_type;
+public:
+    template<typename ArgumentPack>
+    positioned(const ArgumentPack &args)
+        : base_type(args)
+        , m_position(args[_position])
+        , m_parent(0)
+    {}
+    
+    const position_type &position() const
+    {   return m_position; }
+
+    const base *root() const
+    {
+        const base *root = this;
+        const positioned<> *p_view;
+        while((p_view = dynamic_cast<const positioned<> *>(root)))
+            root = p_view->m_parent;
+        return root;
+    }
+
+protected:
+    BOOST_GUIGL_DRAW
+
+    friend class access;
+    void parent(base &parent)
+    {   m_parent = &parent; }
+private:
+
+    position_type m_position;
+    base *m_parent;
+};
+
+template<typename BaseView>
+struct is_positioned<positioned<BaseView> > : public mpl::true_
+{};
+
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__POSITIONED_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/solid_background.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/solid_background.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,42 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__SOLID_BACKGROUND_HPP
+#define BOOST__GUIGL__VIEW__SOLID_BACKGROUND_HPP
+
+#include <boost/guigl/parameters.hpp>
+#include <boost/guigl/view/base.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView=base>
+class solid_background : public BaseView
+{
+public:
+    typedef BaseView base_type;
+
+    template<typename ArgumentPack>
+    solid_background(const ArgumentPack &args)
+        : base_type(args)
+        , m_background_color(args[_background])
+    {}
+    
+    const color_type &background_color() const
+    {   return m_background_color; }
+
+protected:
+    BOOST_GUIGL_DRAW
+    
+private:
+    color_type m_background_color;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__VIEW__SOLID_BACKGROUND_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/view/window.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/view/window.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,40 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__VIEW__WINDOW_HPP
+#define BOOST__GUIGL__VIEW__WINDOW_HPP
+
+#include <boost/guigl/view/base.hpp>
+
+namespace boost { namespace guigl { namespace view {
+
+template<typename BaseView=base>
+class window : public BaseView
+{
+public:
+    typedef BaseView base_type;
+
+    template<typename Args>
+    window(const Args &args)
+        : base_type(args)
+        , m_background_color(args[_background])
+    {}
+    
+    const color_type &background_color() const
+    {   return m_background_color; }
+    
+protected:
+    BOOST_GUIGL_DRAW
+
+private:
+    color_type m_background_color;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__WINDOW_VIEW_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/widget/button.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/widget/button.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,52 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__WIDGET__BUTTON_HPP
+#define BOOST__GUIGL__WIDGET__BUTTON_HPP
+
+#include <boost/guigl/view/active_colored.hpp>
+#include <boost/guigl/view/clickable.hpp>
+#include <boost/guigl/view/positioned.hpp>
+#include <boost/guigl/view/solid_background.hpp>
+#include <boost/signal.hpp>
+
+namespace boost { namespace guigl { namespace widget {
+
+class button;
+
+typedef
+    view::active_colored<
+        view::solid_background<
+            view::clickable<button,
+                view::positioned<>
+    >   >   > button_base_type;
+
+class button : public button_base_type
+{
+    typedef button_base_type base_type;
+public:
+    template<typename ArgumentPack>
+    button(const ArgumentPack &args)
+        : button_base_type(args)
+    {}
+
+    boost::signal<void()> on_click;
+protected:
+    BOOST_GUIGL_WIDGET_DRAW
+    
+private:
+    void clickable_button_down(bool state);
+    void clickable_on_click()
+    {   on_click(); }
+    
+    friend class view::clickable<button, view::positioned<> >;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__WIDGET__BUTTON_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/widget/labeled_button.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/widget/labeled_button.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,38 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__WIDGET__LABELED_BUTTON_HPP
+#define BOOST__GUIGL__WIDGET__LABELED_BUTTON_HPP
+
+#include <boost/guigl/view/colored.hpp>
+#include <boost/guigl/view/labeled.hpp>
+#include <boost/guigl/widget/button.hpp>
+
+namespace boost { namespace guigl { namespace widget {
+
+typedef view::labeled<
+            view::colored<
+                widget::button
+        >   > labeled_button_base_type;
+
+class labeled_button : public labeled_button_base_type
+{
+    typedef labeled_button_base_type base_type;
+public:
+    template<typename ArgumentPack>
+    labeled_button(const ArgumentPack &args)
+        : labeled_button_base_type(args)
+    {}
+
+protected:
+    BOOST_GUIGL_WIDGET_DRAW
+};
+
+}}}
+
+#endif // BOOST__GUIGL__WIDGET__LABELED_BUTTON_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/widget/slider.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/widget/slider.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,62 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__WIDGET__SLIDER_HPP
+#define BOOST__GUIGL__WIDGET__SLIDER_HPP
+
+#include <boost/guigl/view/active_colored.hpp>
+#include <boost/guigl/view/draggable.hpp>
+#include <boost/guigl/view/positioned.hpp>
+#include <boost/guigl/view/solid_background.hpp>
+#include <boost/signal.hpp>
+
+namespace boost { namespace guigl { namespace widget {
+
+class slider;
+
+typedef
+    view::active_colored<
+        view::draggable<slider,
+            view::solid_background<
+                view::positioned<>
+    >   >   > slider_base_type;
+
+class slider : public slider_base_type
+{
+    typedef slider_base_type base_type;
+public:
+    template<typename ArgumentPack>
+    slider(const ArgumentPack &args)
+        : slider_base_type(args)
+        , m_value(0)
+    {}
+
+    boost::signal<void(const double &)> on_value_change;
+    double value()
+    {   return m_value; }
+    void set_value(double value)
+    {
+        m_value = value;
+        on_value_change(value);
+    }
+protected:
+    BOOST_GUIGL_WIDGET_DRAW
+    
+private:
+    double m_value;
+    void draggable_on_drag(const position_type &position);
+    
+    friend class view::draggable<slider,
+        view::solid_background<
+            view::positioned<>
+    >   >;
+};
+
+}}}
+
+#endif // BOOST__GUIGL__WIDGET__SLIDER_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/widget/window.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/widget/window.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,39 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__WIDGET__WINDOW_HPP
+#define BOOST__GUIGL__WIDGET__WINDOW_HPP
+
+#include <boost/guigl/view/compound.hpp>
+#include <boost/guigl/view/mouse_tracking.hpp>
+#include <boost/guigl/view/window.hpp>
+
+namespace boost { namespace guigl { namespace widget {
+
+typedef view::compound<
+            view::mouse_tracking<
+                view::window<>
+        >   > window_base_type;
+
+class window
+    : public window_base_type
+{
+    typedef window_base_type base_type;
+public:
+    template<typename ArgumentPack>
+    window(const ArgumentPack &args)
+        : base_type(args)
+    {}
+    
+protected:
+    BOOST_GUIGL_WIDGET_DRAW
+};
+
+}}}
+
+#endif // BOOST__GUIGL__WIDGET__WINDOW_HPP
\ No newline at end of file
Added: sandbox/guigl/boost/guigl/window.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/guigl/window.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,44 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST__GUIGL__WINDOW_HPP
+#define BOOST__GUIGL__WINDOW_HPP
+
+
+#include <boost/guigl/access.hpp>
+#include <boost/guigl/event.hpp>
+#include <boost/guigl/parameters.hpp>
+#include <boost/guigl/widget/window.hpp>
+#include <boost/noncopyable.hpp>
+
+#include <memory>
+#include <string>
+
+
+namespace boost { namespace guigl {
+
+class window : public guigl::widget::window, boost::noncopyable
+{
+    typedef argument_pack<tag::label, tag::size, tag::position, tag::background>::type
+        argument_pack_type;
+
+public:
+    window(const argument_pack_type &map);
+    ~window();
+
+    static void redraw(const view::positioned<> &v);
+    
+    class impl;
+private:
+    std::auto_ptr<impl> m_impl;
+    
+};
+
+}}
+
+#endif // BOOST__GUIGL__WINDOW_HPP
Added: sandbox/guigl/boost/parameter/aux_/typed_arg_list.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/parameter/aux_/typed_arg_list.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,475 @@
+/*=================================---------------------------------------------
+    Copyright Daniel Wallin, David Abrahams 2005.
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef TYPED_ARG_LIST_050329_HPP
+#define TYPED_ARG_LIST_050329_HPP
+
+#include <boost/parameter/aux_/void.hpp>
+#include <boost/parameter/aux_/result_of0.hpp>
+#include <boost/parameter/aux_/default.hpp>
+#include <boost/parameter/aux_/parameter_requirements.hpp>
+#include <boost/parameter/aux_/yesno.hpp>
+#include <boost/parameter/aux_/maybe.hpp>
+#include <boost/parameter/aux_/arg_list.hpp>
+#include <boost/parameter/config.hpp>
+
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+
+namespace boost { namespace parameter { 
+
+// Forward declaration for aux::arg_list, below.
+template<class T> struct typed_keyword;
+
+namespace aux {
+
+// Tag type passed to MPL lambda.
+struct lambda_tag;
+
+//
+// Structures used to build the tuple of actual arguments.  The
+// tuple is a nested cons-style list of arg_list specializations
+// terminated by an empty_arg_list.
+//
+// Each specialization of arg_list is derived from its successor in
+// the list type.  This feature is used along with using
+// declarations to build member function overload sets that can
+// match against keywords.
+//
+  
+// MPL sequence support
+struct typed_arg_list_tag;
+
+// Terminates typed_arg_list<> and represents an empty list.  Since this
+// is just the terminating case you might want to look at typed_arg_list
+// first, to get a feel for what's really happening here.
+
+struct empty_typed_arg_list
+{
+    empty_typed_arg_list() {}
+
+    // Constructor taking BOOST_PARAMETER_MAX_ARITY empty_typed_arg_list
+    // arguments; this makes initialization
+    empty_typed_arg_list(
+        BOOST_PP_ENUM_PARAMS(
+            BOOST_PARAMETER_MAX_ARITY, void_ BOOST_PP_INTERCEPT
+        ))
+    {}
+
+    // A metafunction class that, given a keyword and a default
+    // type, returns the appropriate result type for a keyword
+    // lookup given that default
+    struct binding
+    {
+        template<class KW, class Default, class Reference>
+        struct apply
+        {
+            typedef Default type;
+        };
+    };
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+    // Terminator for has_key, indicating that the keyword is unique
+    template <class KW>
+    static no_tag has_key(KW*);
+#endif
+    
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+    || (BOOST_WORKAROUND(__GNUC__, < 3)) \
+    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    
+    // The overload set technique doesn't work with these older
+    // compilers, so they need some explicit handholding.
+      
+    // A metafunction class that, given a keyword, returns the type
+    // of the base sublist whose get() function can produce the
+    // value for that key
+    struct key_owner
+    {
+        template<class KW>
+        struct apply
+        {
+            typedef empty_typed_arg_list type;
+        };
+    };
+
+    template <class K, class T>
+    T& get(default_<K,T> x) const
+    {
+        return x.value;
+    }
+
+    template <class K, class F>
+    typename result_of0<F>::type
+    get(lazy_default<K,F> x) const
+    {
+        return x.compute_default();
+    }
+#endif
+
+    // If this function is called, it means there is no argument
+    // in the list that matches the supplied keyword. Just return
+    // the default value.
+    template <class Tag>
+    const typename Tag::value_type &operator[](const typed_keyword<Tag>&) const
+    {
+        return Tag::default_value();
+    }
+
+    // If this function is called, it means there is no argument
+    // in the list that matches the supplied keyword. Just return
+    // the default value.
+    template <class K, class Default>
+    Default& operator[](default_<K, Default> x) const
+    {
+        return x.value;
+    }
+
+    // If this function is called, it means there is no argument
+    // in the list that matches the supplied keyword. Just evaluate
+    // and return the default value.
+    template <class K, class F>
+    typename result_of0<F>::type
+    operator[](
+        BOOST_PARAMETER_lazy_default_fallback<K,F> x) const
+    {
+        return x.compute_default();
+    }
+
+    // No argument corresponding to ParameterRequirements::key_type
+    // was found if we match this overload, so unless that parameter
+    // has a default, we indicate that the actual arguments don't
+    // match the function's requirements.
+    template <class ParameterRequirements, class ArgPack>
+    static typename ParameterRequirements::has_default
+    satisfies(ParameterRequirements*, ArgPack*);
+
+    // MPL sequence support
+    typedef empty_typed_arg_list type;   // convenience
+    typedef typed_arg_list_tag tag; // For dispatching to sequence intrinsics
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+template<class KW>
+no_tag operator*(empty_typed_arg_list, KW*);
+#endif
+
+// Forward declaration for typed_arg_list::operator,
+template <class KW>
+struct typed_tagged_argument;
+
+// A tuple of tagged arguments, terminated with empty_typed_arg_list.
+// Every TaggedArg is an instance of typed_tagged_argument<>.
+template <class TaggedArg, class Next = empty_typed_arg_list>
+struct typed_arg_list : Next
+{
+    typedef typed_arg_list<TaggedArg,Next> self;
+    typedef typename TaggedArg::key_type key_type;
+
+    typedef typename is_maybe<typename TaggedArg::value_type>::type holds_maybe;
+
+    typedef typename mpl::eval_if<
+        holds_maybe
+      , get_reference<typename TaggedArg::value_type>
+      , get_reference<TaggedArg>
+    >::type reference;
+
+    typedef typename mpl::if_<
+        holds_maybe
+      , reference
+      , typename TaggedArg::value_type
+    >::type value_type;
+
+    TaggedArg arg;      // Stores the argument
+
+    // Store the arguments in successive nodes of this list
+    template< // class A0, class A1, ...
+        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, class A)
+    >
+    typed_arg_list( // A0& a0, A1& a1, ...
+        BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PARAMETER_MAX_ARITY, A, & a)
+    )
+      : Next( // a1, a2, ...
+            BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PARAMETER_MAX_ARITY, a)
+          , void_reference()
+        )
+      , arg(a0)
+    {}
+    
+    // Read the arguments from a typed_arg_list
+    template<typename CTaggedArg, typename CNext>
+    typed_arg_list(const typed_arg_list<CTaggedArg, CNext> &args)
+      : Next(args)
+      , arg(args[typed_keyword<key_type>()])
+    {}
+
+    // Create a new list by prepending arg to a copy of tail.  Used
+    // when incrementally building this structure with the comma
+    // operator.
+    typed_arg_list(TaggedArg arg, Next const& tail)
+      : Next(tail)
+      , arg(arg)
+    {}
+
+    // A metafunction class that, given a keyword and a default
+    // type, returns the appropriate result type for a keyword
+    // lookup given that default
+    struct binding
+    {
+        template <class KW, class Default, class Reference>
+        struct apply
+        {
+          typedef typename mpl::eval_if<
+                boost::is_same<KW, key_type>
+              , mpl::if_<Reference, reference, value_type>
+              , mpl::apply_wrap3<typename Next::binding, KW, Default, Reference>
+          >::type type;
+        };
+    };
+
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && !BOOST_WORKAROUND(__GNUC__, == 2)
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+    friend yes_tag operator*(typed_arg_list, key_type*);
+#  define BOOST_PARAMETER_CALL_HAS_KEY(next, key) (*(next*)0 * (key*)0)
+# else
+    // Overload for key_type, so the assert below will fire if the
+    // same keyword is used again
+    static yes_tag has_key(key_type*);
+    using Next::has_key;
+    
+#  define BOOST_PARAMETER_CALL_HAS_KEY(next, key) next::has_key((key*)0)  
+# endif
+
+    BOOST_MPL_ASSERT_MSG(
+        sizeof(BOOST_PARAMETER_CALL_HAS_KEY(Next,key_type)) == sizeof(no_tag)
+      , duplicate_keyword, (key_type)
+    );
+
+# undef BOOST_PARAMETER_CALL_HAS_KEY
+#endif
+    //
+    // Begin implementation of indexing operators for looking up
+    // specific arguments by name
+    //
+
+    // Helpers that handle the case when TaggedArg is 
+    // empty<T>.
+    template <class D>
+    reference get_default(D const&, mpl::false_) const
+    {
+        return arg.value;
+    }
+
+    template <class D>
+    reference get_default(D const& d, mpl::true_) const
+    {
+        return arg.value ? arg.value.get() : arg.value.construct(d.value);
+    }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+    || BOOST_WORKAROUND(__GNUC__, < 3) \
+    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    // These older compilers don't support the overload set creation
+    // idiom well, so we need to do all the return type calculation
+    // for the compiler and dispatch through an outer function template
+
+    // A metafunction class that, given a keyword, returns the base
+    // sublist whose get() function can produce the value for that
+    // key.
+    struct key_owner
+    {
+        template<class KW>
+        struct apply
+        {
+          typedef typename mpl::eval_if<
+                boost::is_same<KW, key_type>
+              , mpl::identity<typed_arg_list<TaggedArg,Next> >
+              , mpl::apply_wrap1<typename Next::key_owner,KW>
+          >::type type;
+        };
+    };
+
+    // Outer indexing operators that dispatch to the right node's
+    // get() function.
+    template <class KW>
+    typename mpl::apply_wrap3<binding, KW, void_, mpl::true_>::type
+    operator[](keyword<KW> const& x) const
+    {
+        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;
+        return sublist.get(x);
+    }
+
+    template <class KW, class Default>
+    typename mpl::apply_wrap3<binding, KW, Default&, mpl::true_>::type
+    operator[](default_<KW, Default> x) const
+    {
+        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;
+        return sublist.get(x);
+    }
+
+    template <class KW, class F>
+    typename mpl::apply_wrap3<
+        binding,KW
+      , typename result_of0<F>::type
+      , mpl::true_
+    >::type
+    operator[](lazy_default<KW,F> x) const
+    {
+        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;
+        return sublist.get(x);
+    }
+
+    // These just return the stored value; when empty_typed_arg_list is
+    // reached, indicating no matching argument was passed, the
+    // default is returned, or if no default_ or lazy_default was
+    // passed, compilation fails.
+    reference get(keyword<key_type> const&) const
+    {
+        BOOST_MPL_ASSERT_NOT((holds_maybe));
+        return arg.value;
+    }
+
+    template <class Default>
+    reference get(default_<key_type,Default> const& d) const
+    {
+        return get_default(d, holds_maybe());        
+    }
+
+    template <class Default>
+    reference get(lazy_default<key_type, Default>) const
+    {
+        return arg.value;
+    }
+    
+#else
+
+    reference operator[](typed_keyword<key_type> const&) const
+    {
+        BOOST_MPL_ASSERT_NOT((holds_maybe));
+        return arg.value;
+    }
+/*
+    template <class Default>
+    reference operator[](default_<key_type, Default> const& d) const
+    {
+        return get_default(d, holds_maybe());
+    }
+
+    template <class Default>
+    reference operator[](lazy_default<key_type, Default>) const
+    {
+        return arg.value;
+    }*/
+
+    // Builds an overload set including operator[]s defined in base
+    // classes.
+    using Next::operator[];
+
+    //
+    // End of indexing support
+    //
+
+
+    //
+    // For parameter_requirements matching this node's key_type,
+    // return a bool constant wrapper indicating whether the
+    // requirements are satisfied by TaggedArg.  Used only for
+    // compile-time computation and never really called, so a
+    // declaration is enough.
+    //
+    template <class HasDefault, class Predicate, class ArgPack>
+    static typename mpl::apply_wrap2<
+        typename mpl::lambda<Predicate, lambda_tag>::type
+      , value_type, ArgPack
+    >::type
+    satisfies(
+        parameter_requirements<key_type,Predicate,HasDefault>*
+      , ArgPack*
+    );
+
+    // Builds an overload set including satisfies functions defined
+    // in base classes.
+    using Next::satisfies;
+#endif
+
+    // Comma operator to compose argument list without using parameters<>.
+    // Useful for argument lists with undetermined length.
+    template <class KW>
+    typed_arg_list<typed_tagged_argument<KW>, self> 
+    operator,(typed_tagged_argument<KW> x) const
+    {
+        return typed_arg_list<typed_tagged_argument<KW>, self>(x, *this);
+    }
+
+    // MPL sequence support
+    typedef self type;             // Convenience for users
+    typedef Next tail_type;        // For the benefit of iterators
+    typedef typed_arg_list_tag tag; // For dispatching to sequence intrinsics
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)  // ETI workaround
+template <> struct typed_arg_list<int,int> {};
+#endif 
+
+// MPL sequence support
+template <class ArgumentPack>
+struct typed_arg_list_iterator
+{
+    typedef mpl::forward_iterator_tag category;
+
+    // The incremented iterator
+    typedef typed_arg_list_iterator<typename ArgumentPack::tail_type> next;
+    
+    // dereferencing yields the key type
+    typedef typename ArgumentPack::key_type type;
+};
+
+template <>
+struct typed_arg_list_iterator<empty_typed_arg_list> {};
+
+}} // namespace parameter::aux
+
+// MPL sequence support
+namespace mpl
+{
+  template <>
+  struct begin_impl<parameter::aux::typed_arg_list_tag>
+  {
+      template <class S>
+      struct apply
+      {
+          typedef parameter::aux::typed_arg_list_iterator<S> type;
+      };
+  };
+
+  template <>
+  struct end_impl<parameter::aux::typed_arg_list_tag>
+  {
+      template <class>
+      struct apply
+      {
+          typedef parameter::aux::typed_arg_list_iterator<parameter::aux::empty_typed_arg_list> type;
+      };
+  };
+}
+
+} // namespace boost
+
+#endif // ARG_LIST_050329_HPP
+
Added: sandbox/guigl/boost/parameter/aux_/typed_tagged_argument.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/parameter/aux_/typed_tagged_argument.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,179 @@
+/*=================================---------------------------------------------
+    Copyright Daniel Wallin, David Abrahams 2005.
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST_PARAMETER_TYPED_TAGGED_ARGUMENT_050328_HPP
+# define BOOST_PARAMETER_TYPED_TAGGED_ARGUMENT_050328_HPP
+
+# include <boost/parameter/aux_/void.hpp>
+# include <boost/parameter/aux_/typed_arg_list.hpp>
+# include <boost/parameter/aux_/result_of0.hpp>
+# include <boost/parameter/aux_/tagged_argument.hpp>
+# include <boost/mpl/if.hpp>
+# include <boost/mpl/apply_wrap.hpp>
+# include <boost/mpl/and.hpp>
+# include <boost/mpl/not.hpp>
+# include <boost/type_traits/is_same.hpp>
+# include <boost/type_traits/is_convertible.hpp>
+# include <boost/type_traits/is_reference.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+// Holds a reference to an argument of type Keyword::value_type associated with
+// keyword Keyword
+    
+template <class Keyword>
+struct typed_tagged_argument : tagged_argument_base
+{
+    typedef Keyword key_type;
+    typedef typename Keyword::value_type value_type;
+    typedef value_type& reference;
+
+    typed_tagged_argument(reference x) : value(x) {}
+
+    // A metafunction class that, given a keyword and a default
+    // type, returns the appropriate result type for a keyword
+    // lookup given that default
+    struct binding
+    {
+        template <class KW, class Default, class Reference>
+        struct apply
+        {
+          typedef typename mpl::eval_if<
+                boost::is_same<KW, key_type>
+              , mpl::if_<Reference, reference, value_type>
+              , mpl::identity<Default>
+          >::type type;
+        };
+    };
+
+    // Comma operator to compose argument list without using parameters<>.
+    // Useful for argument lists with undetermined length.
+    template <class Keyword2>
+    typed_arg_list<
+        typed_tagged_argument<Keyword>
+      , typed_arg_list<typed_tagged_argument<Keyword2> > 
+    >
+    operator,(typed_tagged_argument<Keyword2> x) const
+    {
+        return typed_arg_list<
+            typed_tagged_argument<Keyword>
+          , typed_arg_list<typed_tagged_argument<Keyword2> > 
+        >(
+            *this
+          , typed_arg_list<typed_tagged_argument<Keyword2> >(x, empty_typed_arg_list())
+        );
+    }
+
+    reference operator[](keyword<Keyword> const&) const
+    {
+        return value;
+    }
+
+# if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    template <class KW, class Default>
+    Default& get_with_default(default_<KW,Default> const& x, int) const
+    {
+        return x.value;
+    }
+
+    template <class Default>
+    reference get_with_default(default_<key_type,Default> const&, long) const
+    {
+        return value;
+    }
+
+    template <class KW, class Default>
+    typename mpl::apply_wrap3<binding, KW, Default&, mpl::true_>::type
+    operator[](default_<KW,Default> const& x) const
+    {
+        return get_with_default(x, 0L);
+    }
+
+    template <class KW, class F>
+    typename result_of0<F>::type 
+    get_with_lazy_default(lazy_default<KW,F> const& x, int) const
+    {
+        return x.compute_default();
+    }
+
+    template <class F>
+    reference get_with_lazy_default(lazy_default<key_type,F> const&, long) const
+    {
+        return value;
+    }
+
+    template <class KW, class F>
+    typename mpl::apply_wrap3<
+        binding,KW
+      , typename result_of0<F>::type
+      , mpl::true_
+    >::type
+    operator[](lazy_default<KW,F> const& x) const
+    {
+        return get_with_lazy_default(x, 0L);
+    }
+# else
+    template <class Default>
+    reference operator[](default_<key_type,Default> const& x) const
+    {
+        return value;
+    }
+
+    template <class F>
+    reference operator[](lazy_default<key_type,F> const& x) const
+    {
+        return value;
+    }
+
+    template <class KW, class Default>
+    Default& operator[](default_<KW,Default> const& x) const
+    {
+        return x.value;
+    }
+
+    template <class KW, class F>
+    typename result_of0<F>::type operator[](lazy_default<KW,F> const& x) const
+    {
+        return x.compute_default();
+    }
+
+    template <class ParameterRequirements>
+    static typename ParameterRequirements::has_default
+    satisfies(ParameterRequirements*);
+
+    template <class HasDefault, class Predicate>
+    static typename mpl::apply1<Predicate, value_type>::type
+    satisfies(
+        parameter_requirements<key_type,Predicate,HasDefault>*
+    );
+# endif
+
+    reference value;
+# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+    // warning suppression
+ private:
+    void operator=(tagged_argument const&);
+ public:    
+# endif
+    // MPL sequence support
+    typedef typed_tagged_argument type;            // Convenience for users
+    typedef empty_typed_arg_list tail_type;        // For the benefit of iterators
+    typedef arg_list_tag tag; // For dispatching to sequence intrinsics
+    
+    template<typename TypedTaggedArgument, typename Next>
+    operator const typed_arg_list<TypedTaggedArgument, Next> () const
+    {
+        return typed_arg_list<typed_tagged_argument>(*this, empty_typed_arg_list());
+    }
+};
+
+}}} // namespace boost::parameter::aux
+
+#endif // BOOST_PARAMETER_TYPED_TAGGED_ARGUMENT_050328_HPP
+
Added: sandbox/guigl/boost/parameter/typed_keyword.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/parameter/typed_keyword.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,81 @@
+/*=================================---------------------------------------------
+    Copyright Daniel Wallin, David Abrahams 2005.
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef TYPED_KEYWORD_050328_HPP
+#define TYPED_KEYWORD_050328_HPP
+
+#include <boost/parameter/aux_/unwrap_cv_reference.hpp>
+#include <boost/parameter/aux_/typed_tagged_argument.hpp>
+#include <boost/parameter/aux_/default.hpp>
+
+namespace boost { namespace parameter {
+
+// Instances of unique specializations of keyword<...> serve to
+// associate arguments with parameter names.  For example:
+//
+//    struct rate_;           // parameter names
+//    struct skew_;
+//    namespace
+//    {
+//      keyword<rate_> rate;  // keywords
+//      keyword<skew_> skew;
+//    }
+//
+//    ...
+//
+//    f(rate = 1, skew = 2.4);
+//
+template <class Tag>
+struct typed_keyword
+{
+    typedef aux::typed_tagged_argument<Tag> typed_tagged_argument_type;
+    
+    typed_tagged_argument_type const
+    operator=(typename Tag::value_type& x) const
+    {
+        return typed_tagged_argument_type(x);
+    }
+
+    template <class Default>
+    aux::default_<Tag, Default>
+    operator|(Default& default_) const
+    {
+        return aux::default_<Tag, Default>(default_);
+    }
+
+    template <class Default>
+    aux::lazy_default<Tag, Default>
+    operator||(Default& default_) const
+    {
+        return aux::lazy_default<Tag, Default>(default_);
+    }
+
+ public: // Insurance against ODR violations
+    
+    // People will need to define these keywords in header files.  To
+    // prevent ODR violations, it's important that the keyword used in
+    // every instantiation of a function template is the same object.
+    // We provide a reference to a common instance of each keyword
+    // object and prevent construction by users.
+    static typed_keyword<Tag> const instance;
+
+    // This interface is deprecated
+    static typed_keyword<Tag>& get()
+    {
+        return const_cast<typed_keyword<Tag>&>(instance);
+    }
+};
+
+template <class Tag>
+typed_keyword<Tag> const typed_keyword<Tag>::instance = {};
+
+}} // namespace boost::parameter
+
+#endif // KEYWORD_050328_HPP
+
Added: sandbox/guigl/boost/parameter/typed_name.hpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/boost/parameter/typed_name.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,145 @@
+/*=================================---------------------------------------------
+    Copyright Daniel Wallin 2006.
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+#ifndef BOOST_PARAMETER_TYPED_NAME_060806_HPP
+# define BOOST_PARAMETER_TYPED_NAME_060806_HPP
+
+# include <boost/parameter/typed_keyword.hpp>
+# include <boost/parameter/name.hpp>
+# include <boost/detail/workaround.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/stringize.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/mpl/placeholders.hpp>
+
+# if !defined(BOOST_NO_SFINAE) \
+  && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+  && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+
+#  include <boost/utility/enable_if.hpp>
+#  include <boost/mpl/lambda.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+// Tag type passed to MPL lambda.
+struct lambda_tag;
+
+struct typed_name_tag_base 
+{};
+
+template <class Tag>
+struct typed_name_tag
+{};
+
+template <class T>
+struct is_typed_name_tag
+  : mpl::false_
+{};
+
+}}} // namespace boost::parameter::aux
+
+namespace boost { namespace mpl {
+
+template <class T>
+struct lambda<
+    T
+  , typename enable_if<
+        parameter::aux::is_typed_name_tag<T>, parameter::aux::lambda_tag
+    >::type
+>
+{
+    typedef true_ is_le;
+    typedef bind3< quote3<parameter::value_type>, arg<2>, T, void> result_;
+    typedef result_ type;
+};
+
+}} // namespace boost::mpl
+
+# endif
+
+
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#  define BOOST_PARAMETER_TYPED_NAME_OBJECT(tag, name)                    \
+    static ::boost::parameter::typed_keyword<tag> const& name             \
+       = ::boost::parameter::typed_keyword<tag>::instance;
+# else
+#  define BOOST_PARAMETER_TYPED_NAME_OBJECT(tag, name)                    \
+    namespace                                                       \
+    {                                                               \
+       ::boost::parameter::typed_keyword<tag> const& name                 \
+       = ::boost::parameter::typed_keyword<tag>::instance;                \
+    }
+# endif
+
+# define BOOST_PARAMETER_BASIC_TYPED_NAME(tag_namespace, tag, name, type)       \
+    namespace tag_namespace                                         \
+    {                                                               \
+      struct tag                                                    \
+      {                                                             \
+          static char const* keyword_name()                         \
+          {                                                         \
+              return BOOST_PP_STRINGIZE(tag);                       \
+          }                                                         \
+                                                                    \
+          typedef boost::parameter::value_type<                     \
+              boost::mpl::_2, tag, boost::parameter::void_          \
+          > _;                                                      \
+                                                                    \
+          typedef boost::parameter::value_type<                     \
+              boost::mpl::_2, tag, boost::parameter::void_          \
+          > _1;                                                     \
+                                                                    \
+          typedef type value_type;                                                          \
+      };                                                            \
+    }                                                               \
+    BOOST_PARAMETER_TYPED_NAME_OBJECT(tag_namespace::tag, name)
+
+# define BOOST_PARAMETER_BASIC_TYPED_NAME_WDEFAULT(tag_namespace, tag, name, type, default_v)       \
+    namespace tag_namespace                                         \
+    {                                                               \
+      struct tag                                                    \
+      {                                                             \
+          static char const* keyword_name()                         \
+          {                                                         \
+              return BOOST_PP_STRINGIZE(tag);                       \
+          }                                                         \
+                                                                    \
+          typedef boost::parameter::value_type<                     \
+              boost::mpl::_2, tag, boost::parameter::void_          \
+          > _;                                                      \
+                                                                    \
+          typedef boost::parameter::value_type<                     \
+              boost::mpl::_2, tag, boost::parameter::void_          \
+          > _1;                                                     \
+                                                                    \
+          typedef type value_type;                                  \
+                                                                    \
+          static value_type &default_value()                        \
+          {                                                         \
+               static value_type value = default_v;                 \
+               return value;                                        \
+          }                                                         \
+                                                                    \
+      };                                                            \
+    }                                                               \
+    BOOST_PARAMETER_TYPED_NAME_OBJECT(tag_namespace::tag, name)
+
+
+# define BOOST_PARAMETER_TYPED_NAME(name,type)                          \
+    BOOST_PARAMETER_BASIC_TYPED_NAME(tag, name, BOOST_PP_CAT(_, name), type)
+
+# define BOOST_PARAMETER_TYPED_NAME_WDEFAULT(name,type,default_v)                \
+    BOOST_PARAMETER_BASIC_TYPED_NAME_WDEFAULT(tag, name, BOOST_PP_CAT(_, name), type,default_v)
+
+/**/
+
+#endif // BOOST_PARAMETER_NAME_060806_HPP
+
Added: sandbox/guigl/libs/guigl/build/xcodeide/guigl.xcodeproj/project.pbxproj
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/build/xcodeide/guigl.xcodeproj/project.pbxproj	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,729 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 42;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		080DD7670C1390D400EEB53D /* test */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 080DD7680C1390F300EEB53D /* Build configuration list for PBXAggregateTarget "test" */;
+			buildPhases = (
+				080DD7660C1390D400EEB53D /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = test;
+			productName = test;
+		};
+		08668C500C19A16F00ACB19A /* example */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 08668C520C19A16F00ACB19A /* Build configuration list for PBXAggregateTarget "example" */;
+			buildPhases = (
+				08668C510C19A16F00ACB19A /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = example;
+			productName = test;
+		};
+		08C675740C139E1300D85379 /* test clean */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 08C675750C139E3100D85379 /* Build configuration list for PBXAggregateTarget "test clean" */;
+			buildPhases = (
+				08C675730C139E1300D85379 /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = "test clean";
+			productName = "clean test";
+		};
+		08D560910E52968C005A2391 /* lib */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 08D560930E52968C005A2391 /* Build configuration list for PBXAggregateTarget "lib" */;
+			buildPhases = (
+				08D560920E52968C005A2391 /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = lib;
+			productName = test;
+		};
+		08F0836C0C1DF6DE00687E1B /* example clean */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 08F0836E0C1DF6DE00687E1B /* Build configuration list for PBXAggregateTarget "example clean" */;
+			buildPhases = (
+				08F0836D0C1DF6DE00687E1B /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = "example clean";
+			productName = test;
+		};
+		08F0FB080C19826400D0865B /* doc */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 08F0FB090C19828200D0865B /* Build configuration list for PBXAggregateTarget "doc" */;
+			buildPhases = (
+				08F0FB070C19826400D0865B /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = doc;
+			productName = doc;
+		};
+		08FD5E6D0C1BA8BC00F00877 /* doc clean */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 08FD5E6F0C1BA8BC00F00877 /* Build configuration list for PBXAggregateTarget "doc clean" */;
+			buildPhases = (
+				08FD5E6E0C1BA8BC00F00877 /* ShellScript */,
+			);
+			dependencies = (
+			);
+			name = "doc clean";
+			productName = doc;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXFileReference section */
+		081B05C30E5FCCB600EF7F91 /* clickable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = clickable.hpp; sourceTree = "<group>"; };
+		081B05CA0E5FCE1300EF7F91 /* clickable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = clickable.hpp; sourceTree = "<group>"; };
+		081B06720E5FD90300EF7F91 /* labeled_button.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = labeled_button.cpp; sourceTree = "<group>"; };
+		081B06E70E5FE50200EF7F91 /* grid.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = grid.hpp; sourceTree = "<group>"; };
+		081B076E0E5FF2DC00EF7F91 /* slider.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = slider.hpp; sourceTree = "<group>"; };
+		081B07890E5FF8D100EF7F91 /* slider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slider.cpp; sourceTree = "<group>"; };
+		081B078D0E5FF94A00EF7F91 /* draggable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = draggable.hpp; sourceTree = "<group>"; };
+		081B07900E5FF9B000EF7F91 /* draggable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = draggable.hpp; sourceTree = "<group>"; };
+		081B07930E5FFBEC00EF7F91 /* mouse_tracking.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mouse_tracking.hpp; sourceTree = "<group>"; };
+		0885D4290E539AF600DFFA5D /* test_field_map_compilation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_field_map_compilation.cpp; sourceTree = "<group>"; };
+		0885D4300E539B5F00DFFA5D /* test_parameter_compilation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_parameter_compilation.cpp; sourceTree = "<group>"; };
+		0885D46A0E539F7000DFFA5D /* test_parameter_dispatch_compilation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_parameter_dispatch_compilation.cpp; sourceTree = "<group>"; };
+		0885D48F0E53A32300DFFA5D /* test_field_map_compilation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_field_map_compilation.hpp; sourceTree = "<group>"; };
+		0885D4900E53A32300DFFA5D /* test_parameter_compilation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_parameter_compilation.hpp; sourceTree = "<group>"; };
+		0885D4910E53A32300DFFA5D /* test_parameter_dispatch_compilation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_parameter_dispatch_compilation.hpp; sourceTree = "<group>"; };
+		08978DC70E5D944B00C79062 /* positioned.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = positioned.hpp; sourceTree = "<group>"; };
+		08978DCA0E5D94A500C79062 /* base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = base.hpp; sourceTree = "<group>"; };
+		08978DD60E5D953000C79062 /* compound.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compound.hpp; sourceTree = "<group>"; };
+		08978DEC0E5D987900C79062 /* solid_background.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = solid_background.hpp; sourceTree = "<group>"; };
+		08978DF20E5D995200C79062 /* window.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = window.hpp; sourceTree = "<group>"; };
+		08978E0C0E5D9C2200C79062 /* window.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = window.hpp; sourceTree = "<group>"; };
+		08978E1E0E5D9DE300C79062 /* button.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = button.cpp; sourceTree = "<group>"; };
+		08978E1F0E5D9E1900C79062 /* window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = window.cpp; sourceTree = "<group>"; };
+		08978EC80E5DA4CD00C79062 /* positioned.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = positioned.hpp; sourceTree = "<group>"; };
+		08978ECC0E5DA55800C79062 /* compound.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compound.hpp; sourceTree = "<group>"; };
+		08978ECF0E5DA5B100C79062 /* solid_background.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = solid_background.hpp; sourceTree = "<group>"; };
+		08978ED00E5DA5BD00C79062 /* window.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = window.hpp; sourceTree = "<group>"; };
+		08978F510E5DABCD00C79062 /* positioned.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = positioned.cpp; sourceTree = "<group>"; };
+		08978F570E5DAC1800C79062 /* compound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = compound.cpp; sourceTree = "<group>"; };
+		08978F580E5DAC2600C79062 /* solid_background.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = solid_background.cpp; sourceTree = "<group>"; };
+		08978F590E5DAC3000C79062 /* window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = window.cpp; sourceTree = "<group>"; };
+		089790490E5DB3E800C79062 /* access.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = access.hpp; sourceTree = "<group>"; };
+		0897911E0E5DB84F00C79062 /* labeled.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = labeled.hpp; sourceTree = "<group>"; };
+		089791210E5DB8B000C79062 /* labeled.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = labeled.hpp; sourceTree = "<group>"; };
+		089791240E5DB9DF00C79062 /* colored.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = colored.hpp; sourceTree = "<group>"; };
+		089791250E5DB9EB00C79062 /* colored.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = colored.hpp; sourceTree = "<group>"; };
+		0897912F0E5DBB0F00C79062 /* labeled_button.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = labeled_button.hpp; sourceTree = "<group>"; };
+		0897913B0E5DBC1000C79062 /* glut.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glut.hpp; sourceTree = "<group>"; };
+		089791BA0E5DC06400C79062 /* event.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = event.hpp; sourceTree = "<group>"; };
+		08998DDF0E528C1F00F583A2 /* window.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = window.hpp; sourceTree = "<group>"; };
+		089B15050E5302870033B2D8 /* test_field_map.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_field_map.cpp; sourceTree = "<group>"; };
+		089B15410E5304660033B2D8 /* types.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = types.hpp; sourceTree = "<group>"; };
+		089D83740E5A35D800325868 /* parameters.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = parameters.hpp; sourceTree = "<group>"; };
+		089D83780E5A3AA900325868 /* test_parameter_map_compilation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_parameter_map_compilation.cpp; sourceTree = "<group>"; };
+		089D83800E5A3C0B00325868 /* test_parameter_map_compilation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_parameter_map_compilation.hpp; sourceTree = "<group>"; };
+		089E06FB0E5D0F3500C425FE /* button.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = button.hpp; sourceTree = "<group>"; };
+		089E34A60E5BB90900D9AD51 /* typed_keyword.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = typed_keyword.hpp; sourceTree = "<group>"; };
+		089E34AB0E5C865400D9AD51 /* typed_name.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = typed_name.hpp; sourceTree = "<group>"; };
+		089E86720E5A80E500DA4902 /* test_parameter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_parameter.cpp; sourceTree = "<group>"; };
+		08A13C090E535040008C8A10 /* field_map.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = field_map.hpp; sourceTree = "<group>"; };
+		08A77AB30E4F91AA00B8793E /* Jamroot */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Jamroot; path = ../../../../Jamroot; sourceTree = SOURCE_ROOT; };
+		08A77AB40E4F91AB00B8793E /* LICENSE_1_0.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE_1_0.txt; path = ../../../../LICENSE_1_0.txt; sourceTree = SOURCE_ROOT; };
+		08A77B010E4FC51C00B8793E /* Jamfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.jam; path = Jamfile; sourceTree = "<group>"; };
+		08AD8F620E5CD63400BFB2C8 /* opengl.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = opengl.hpp; sourceTree = "<group>"; };
+		08D0F2550E6712E90026C6DF /* active_colored.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = active_colored.hpp; sourceTree = "<group>"; };
+		08D0F25D0E67139E0026C6DF /* active_colored.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = active_colored.hpp; sourceTree = "<group>"; };
+		08D5606D0E52901F005A2391 /* window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = window.cpp; sourceTree = "<group>"; };
+		08D5608E0E529642005A2391 /* Jamfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.jam; path = Jamfile; sourceTree = "<group>"; };
+		08D560D20E529971005A2391 /* Jamfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.jam; path = Jamfile; sourceTree = "<group>"; };
+		08D560D70E5299E6005A2391 /* window_example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = window_example.cpp; sourceTree = "<group>"; };
+		08D5614B0E529DF1005A2391 /* application.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = application.hpp; sourceTree = "<group>"; };
+		08D561500E529E3E005A2391 /* application.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = application.cpp; sourceTree = "<group>"; };
+		08E225F00E65D5C700C3319B /* mouse_tracking.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mouse_tracking.hpp; sourceTree = "<group>"; };
+		08F506AB0E5B41AD0020D95E /* typed_tagged_argument.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = typed_tagged_argument.hpp; sourceTree = "<group>"; };
+		08F506AF0E5B42930020D95E /* typed_arg_list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = typed_arg_list.hpp; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXGroup section */
+		080DD7560C13908400EEB53D = {
+			isa = PBXGroup;
+			children = (
+				08F5068A0E5B41900020D95E /* parameter */,
+				08A13C080E535040008C8A10 /* field_map */,
+				08A454D80E5243ED002C4151 /* guigl */,
+				08D5606C0E528FF4005A2391 /* src */,
+				08A77AB30E4F91AA00B8793E /* Jamroot */,
+				08A77AB40E4F91AB00B8793E /* LICENSE_1_0.txt */,
+				08A439340E295B35009845FD /* build */,
+				08FD5DE40C1BA60700F00877 /* doc */,
+				08668C4D0C19A16300ACB19A /* example */,
+				08C675960C13A03E00D85379 /* test */,
+			);
+			sourceTree = "<group>";
+		};
+		081B06DC0E5FE32A00EF7F91 /* layout */ = {
+			isa = PBXGroup;
+			children = (
+				081B06E70E5FE50200EF7F91 /* grid.hpp */,
+			);
+			path = layout;
+			sourceTree = "<group>";
+		};
+		08668C4D0C19A16300ACB19A /* example */ = {
+			isa = PBXGroup;
+			children = (
+				08D560D20E529971005A2391 /* Jamfile */,
+				08D560D70E5299E6005A2391 /* window_example.cpp */,
+			);
+			name = example;
+			path = ../../example;
+			sourceTree = SOURCE_ROOT;
+		};
+		08978DC60E5D943200C79062 /* view */ = {
+			isa = PBXGroup;
+			children = (
+				08978EC60E5DA49D00C79062 /* impl */,
+				08978DC70E5D944B00C79062 /* positioned.hpp */,
+				08978DCA0E5D94A500C79062 /* base.hpp */,
+				08978DD60E5D953000C79062 /* compound.hpp */,
+				08978DEC0E5D987900C79062 /* solid_background.hpp */,
+				08978DF20E5D995200C79062 /* window.hpp */,
+				0897911E0E5DB84F00C79062 /* labeled.hpp */,
+				089791250E5DB9EB00C79062 /* colored.hpp */,
+				081B05C30E5FCCB600EF7F91 /* clickable.hpp */,
+				081B078D0E5FF94A00EF7F91 /* draggable.hpp */,
+				081B07930E5FFBEC00EF7F91 /* mouse_tracking.hpp */,
+				08D0F2550E6712E90026C6DF /* active_colored.hpp */,
+			);
+			path = view;
+			sourceTree = "<group>";
+		};
+		08978E020E5D9B8100C79062 /* widget */ = {
+			isa = PBXGroup;
+			children = (
+				08978E1E0E5D9DE300C79062 /* button.cpp */,
+				08978E1F0E5D9E1900C79062 /* window.cpp */,
+				081B06720E5FD90300EF7F91 /* labeled_button.cpp */,
+				081B07890E5FF8D100EF7F91 /* slider.cpp */,
+			);
+			path = widget;
+			sourceTree = "<group>";
+		};
+		08978EC60E5DA49D00C79062 /* impl */ = {
+			isa = PBXGroup;
+			children = (
+				08978EC80E5DA4CD00C79062 /* positioned.hpp */,
+				08978ECC0E5DA55800C79062 /* compound.hpp */,
+				08978ECF0E5DA5B100C79062 /* solid_background.hpp */,
+				08978ED00E5DA5BD00C79062 /* window.hpp */,
+				089791210E5DB8B000C79062 /* labeled.hpp */,
+				089791240E5DB9DF00C79062 /* colored.hpp */,
+				081B05CA0E5FCE1300EF7F91 /* clickable.hpp */,
+				081B07900E5FF9B000EF7F91 /* draggable.hpp */,
+				08E225F00E65D5C700C3319B /* mouse_tracking.hpp */,
+				08D0F25D0E67139E0026C6DF /* active_colored.hpp */,
+			);
+			path = impl;
+			sourceTree = "<group>";
+		};
+		08978F500E5DABBE00C79062 /* view */ = {
+			isa = PBXGroup;
+			children = (
+				08978F510E5DABCD00C79062 /* positioned.cpp */,
+				08978F570E5DAC1800C79062 /* compound.cpp */,
+				08978F580E5DAC2600C79062 /* solid_background.cpp */,
+				08978F590E5DAC3000C79062 /* window.cpp */,
+			);
+			path = view;
+			sourceTree = "<group>";
+		};
+		089E06FA0E5D0F2A00C425FE /* widget */ = {
+			isa = PBXGroup;
+			children = (
+				089E06FB0E5D0F3500C425FE /* button.hpp */,
+				08978E0C0E5D9C2200C79062 /* window.hpp */,
+				0897912F0E5DBB0F00C79062 /* labeled_button.hpp */,
+				081B076E0E5FF2DC00EF7F91 /* slider.hpp */,
+			);
+			path = widget;
+			sourceTree = "<group>";
+		};
+		08A13C080E535040008C8A10 /* field_map */ = {
+			isa = PBXGroup;
+			children = (
+				08A13C090E535040008C8A10 /* field_map.hpp */,
+			);
+			name = field_map;
+			path = ../../../../boost/field_map;
+			sourceTree = SOURCE_ROOT;
+		};
+		08A439340E295B35009845FD /* build */ = {
+			isa = PBXGroup;
+			children = (
+				08D5608E0E529642005A2391 /* Jamfile */,
+			);
+			name = build;
+			path = ..;
+			sourceTree = SOURCE_ROOT;
+		};
+		08A454D80E5243ED002C4151 /* guigl */ = {
+			isa = PBXGroup;
+			children = (
+				081B06DC0E5FE32A00EF7F91 /* layout */,
+				08978DC60E5D943200C79062 /* view */,
+				089E06FA0E5D0F2A00C425FE /* widget */,
+				08AD8F610E5CD62600BFB2C8 /* platform */,
+				08998DDF0E528C1F00F583A2 /* window.hpp */,
+				08D5614B0E529DF1005A2391 /* application.hpp */,
+				089B15410E5304660033B2D8 /* types.hpp */,
+				089D83740E5A35D800325868 /* parameters.hpp */,
+				089790490E5DB3E800C79062 /* access.hpp */,
+				089791BA0E5DC06400C79062 /* event.hpp */,
+			);
+			name = guigl;
+			path = ../../../../boost/guigl;
+			sourceTree = SOURCE_ROOT;
+		};
+		08AD8F610E5CD62600BFB2C8 /* platform */ = {
+			isa = PBXGroup;
+			children = (
+				08AD8F620E5CD63400BFB2C8 /* opengl.hpp */,
+				0897913B0E5DBC1000C79062 /* glut.hpp */,
+			);
+			path = platform;
+			sourceTree = "<group>";
+		};
+		08C675960C13A03E00D85379 /* test */ = {
+			isa = PBXGroup;
+			children = (
+				0885D48F0E53A32300DFFA5D /* test_field_map_compilation.hpp */,
+				089D83800E5A3C0B00325868 /* test_parameter_map_compilation.hpp */,
+				0885D4900E53A32300DFFA5D /* test_parameter_compilation.hpp */,
+				0885D4910E53A32300DFFA5D /* test_parameter_dispatch_compilation.hpp */,
+				08A77B010E4FC51C00B8793E /* Jamfile */,
+				089B15050E5302870033B2D8 /* test_field_map.cpp */,
+				0885D4290E539AF600DFFA5D /* test_field_map_compilation.cpp */,
+				0885D4300E539B5F00DFFA5D /* test_parameter_compilation.cpp */,
+				089D83780E5A3AA900325868 /* test_parameter_map_compilation.cpp */,
+				0885D46A0E539F7000DFFA5D /* test_parameter_dispatch_compilation.cpp */,
+				089E86720E5A80E500DA4902 /* test_parameter.cpp */,
+			);
+			name = test;
+			path = ../../test;
+			sourceTree = SOURCE_ROOT;
+		};
+		08D5606C0E528FF4005A2391 /* src */ = {
+			isa = PBXGroup;
+			children = (
+				08978F500E5DABBE00C79062 /* view */,
+				08978E020E5D9B8100C79062 /* widget */,
+				08D5606D0E52901F005A2391 /* window.cpp */,
+				08D561500E529E3E005A2391 /* application.cpp */,
+			);
+			name = src;
+			path = ../../src;
+			sourceTree = SOURCE_ROOT;
+		};
+		08F5068A0E5B41900020D95E /* parameter */ = {
+			isa = PBXGroup;
+			children = (
+				08F5068B0E5B41900020D95E /* aux_ */,
+				089E34A60E5BB90900D9AD51 /* typed_keyword.hpp */,
+				089E34AB0E5C865400D9AD51 /* typed_name.hpp */,
+			);
+			name = parameter;
+			path = ../../../../boost/parameter;
+			sourceTree = SOURCE_ROOT;
+		};
+		08F5068B0E5B41900020D95E /* aux_ */ = {
+			isa = PBXGroup;
+			children = (
+				08F506AF0E5B42930020D95E /* typed_arg_list.hpp */,
+				08F506AB0E5B41AD0020D95E /* typed_tagged_argument.hpp */,
+			);
+			path = aux_;
+			sourceTree = "<group>";
+		};
+		08FD5DE40C1BA60700F00877 /* doc */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			name = doc;
+			path = ../../doc;
+			sourceTree = SOURCE_ROOT;
+		};
+/* End PBXGroup section */
+
+/* Begin PBXProject section */
+		080DD7580C13908400EEB53D /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = 080DD7590C13908400EEB53D /* Build configuration list for PBXProject "guigl" */;
+			compatibilityVersion = "Xcode 2.4";
+			hasScannedForEncodings = 0;
+			mainGroup = 080DD7560C13908400EEB53D;
+			projectDirPath = "";
+			projectRoot = ../../../..;
+			targets = (
+				080DD7670C1390D400EEB53D /* test */,
+				08C675740C139E1300D85379 /* test clean */,
+				08F0FB080C19826400D0865B /* doc */,
+				08FD5E6D0C1BA8BC00F00877 /* doc clean */,
+				08668C500C19A16F00ACB19A /* example */,
+				08F0836C0C1DF6DE00687E1B /* example clean */,
+				08D560910E52968C005A2391 /* lib */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		080DD7660C1390D400EEB53D /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# shell script goes here\nstyle=`echo $BUILD_STYLE | sed 'y/DR/dr/'`  \nbjam ../../test $style";
+		};
+		08668C510C19A16F00ACB19A /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# shell script goes here\nstyle=`echo $BUILD_STYLE | sed 'y/DR/dr/'`  \nbjam --v2 ../../example $style";
+		};
+		08C675730C139E1300D85379 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# shell script goes here\nstyle=`echo $BUILD_STYLE | sed 'y/DR/dr/'`  \nbjam --v2 --clean ../../test $style";
+		};
+		08D560920E52968C005A2391 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# shell script goes here\nstyle=`echo $BUILD_STYLE | sed 'y/DR/dr/'`  \nbjam ../../build $style";
+		};
+		08F0836D0C1DF6DE00687E1B /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# shell script goes here\nstyle=`echo $BUILD_STYLE | sed 'y/DR/dr/'`  \nbjam --v2 --toolset=darwin ../../example clean $style";
+		};
+		08F0FB070C19826400D0865B /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "style=`echo $BUILD_STYLE | sed 'y/DR/dr/'`  \ncd ../../doc\nbjam --v2 --toolset=darwin $style";
+		};
+		08FD5E6E0C1BA8BC00F00877 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "cd ../../doc\nbjam --v2 --clean --toolset=darwin release";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		080DD75A0C13908400EEB53D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+			};
+			name = Debug;
+		};
+		080DD75B0C13908400EEB53D /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+			};
+			name = Release;
+		};
+		080DD7690C1390F300EEB53D /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				PRODUCT_NAME = test;
+			};
+			name = Debug;
+		};
+		080DD76A0C1390F300EEB53D /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				PRODUCT_NAME = test;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		08668C530C19A16F00ACB19A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				PRODUCT_NAME = test;
+			};
+			name = Debug;
+		};
+		08668C540C19A16F00ACB19A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				PRODUCT_NAME = test;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		08C675760C139E3100D85379 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				PRODUCT_NAME = "clean test";
+			};
+			name = Debug;
+		};
+		08C675770C139E3100D85379 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				PRODUCT_NAME = "clean test";
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		08D560940E52968C005A2391 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				PRODUCT_NAME = test;
+			};
+			name = Debug;
+		};
+		08D560950E52968C005A2391 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				PRODUCT_NAME = test;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		08F0836F0C1DF6DE00687E1B /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				PRODUCT_NAME = test;
+			};
+			name = Debug;
+		};
+		08F083700C1DF6DE00687E1B /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				PRODUCT_NAME = test;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		08F0FB0A0C19828200D0865B /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				PRODUCT_NAME = doc;
+			};
+			name = Debug;
+		};
+		08F0FB0B0C19828200D0865B /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				PRODUCT_NAME = doc;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		08FD5E700C1BA8BC00F00877 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				PRODUCT_NAME = doc;
+			};
+			name = Debug;
+		};
+		08FD5E710C1BA8BC00F00877 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				PRODUCT_NAME = doc;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		080DD7590C13908400EEB53D /* Build configuration list for PBXProject "guigl" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				080DD75A0C13908400EEB53D /* Debug */,
+				080DD75B0C13908400EEB53D /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		080DD7680C1390F300EEB53D /* Build configuration list for PBXAggregateTarget "test" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				080DD7690C1390F300EEB53D /* Debug */,
+				080DD76A0C1390F300EEB53D /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		08668C520C19A16F00ACB19A /* Build configuration list for PBXAggregateTarget "example" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				08668C530C19A16F00ACB19A /* Debug */,
+				08668C540C19A16F00ACB19A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		08C675750C139E3100D85379 /* Build configuration list for PBXAggregateTarget "test clean" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				08C675760C139E3100D85379 /* Debug */,
+				08C675770C139E3100D85379 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		08D560930E52968C005A2391 /* Build configuration list for PBXAggregateTarget "lib" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				08D560940E52968C005A2391 /* Debug */,
+				08D560950E52968C005A2391 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		08F0836E0C1DF6DE00687E1B /* Build configuration list for PBXAggregateTarget "example clean" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				08F0836F0C1DF6DE00687E1B /* Debug */,
+				08F083700C1DF6DE00687E1B /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		08F0FB090C19828200D0865B /* Build configuration list for PBXAggregateTarget "doc" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				08F0FB0A0C19828200D0865B /* Debug */,
+				08F0FB0B0C19828200D0865B /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		08FD5E6F0C1BA8BC00F00877 /* Build configuration list for PBXAggregateTarget "doc clean" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				08FD5E700C1BA8BC00F00877 /* Debug */,
+				08FD5E710C1BA8BC00F00877 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 080DD7580C13908400EEB53D /* Project object */;
+}
Added: sandbox/guigl/libs/guigl/example/Jamfile
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/example/Jamfile	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,14 @@
+#==================================---------------------------------------------
+#   Copyright 2008 Stjepan Rajko
+#  
+#   Distributed under the Boost Software License, Version 1.0.
+#   (See accompanying file LICENSE_1_0.txt or copy at
+#   http://www.boost.org/LICENSE_1_0.txt)
+#----------------------------------------------===============================*/
+
+project boost/guigl/test
+    : requirements
+        <library>$(TOP)/libs/guigl/build//boost_guigl/<link>static
+    ;
+
+exe window_example : window_example.cpp ;
\ No newline at end of file
Added: sandbox/guigl/libs/guigl/example/window_example.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/example/window_example.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,68 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/application.hpp>
+#include <boost/guigl/layout/grid.hpp>
+#include <boost/guigl/window.hpp>
+#include <boost/guigl/widget/button.hpp>
+#include <boost/guigl/widget/labeled_button.hpp>
+#include <boost/guigl/widget/slider.hpp>
+
+#include <boost/bind.hpp>
+#include <boost/bind/placeholders.hpp>
+
+using namespace boost::guigl;
+
+color_type make_grey(double value)
+{
+    return color_type(value, value, value);
+}
+
+int main()
+{
+    window test_window1(( _label = "window example 1", _size=size_type(300,300) ));
+    window test_window2(( _size=size_type(300,100), _label = "window example 2" ));
+    window test_window3(( _label = "window example 3" ));
+    
+    widget::labeled_button *b1 = new widget::labeled_button((
+        _size=size_type(100,30),
+        _position=position_type(50, 50),
+        _background=color_type(1,1,1),
+        _active_color=color_type(1,0,0),
+        _color=color_type(0,0,0),
+        _label="Button 1"));
+        
+    test_window1 << b1;
+    widget::slider *s = new widget::slider((
+        _size=size_type(100,30),
+        _position=position_type(50,80),
+        _background=color_type(0.5,0.5,0.5),
+        _active_color=color_type(0,1,0) ));
+    test_window1 << s;
+
+    // clicking the button changes the slider value to 0.5
+    b1->on_click.connect(boost::bind(&widget::slider::set_value, s, 0.5));
+    // moving the slider changes the label color of the button
+    s->on_value_change.connect(boost::bind(&widget::labeled_button::set_color, b1, boost::bind(make_grey, _1)));
+    
+    test_window2
+        << new widget::labeled_button((
+            _size=size_type(100,30),
+            _position=position_type(50, 5),
+            _background=color_type(0.5,0.5,0.5),
+            _active_color=color_type(0,1,0),
+            _color=color_type(1,1,1),
+            _label="Button 2"));
+    
+    layout::grid grid_layout(( _grid_size=test_window3.size(), _horizontal=3, _vertical=3 ));
+    for(int i=1; i<=9; i++)
+        test_window3 << grid_layout.create<widget::button>(( _background=color_type(1.0/i,1.0/i,1.0/i) ));
+    
+    application::run();
+}
\ No newline at end of file
Added: sandbox/guigl/libs/guigl/src/application.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/application.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,19 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/application.hpp>
+
+namespace boost { namespace guigl {
+
+void application::run()
+{
+    glutMainLoop();
+}
+
+}}
\ No newline at end of file
Added: sandbox/guigl/libs/guigl/src/view/compound.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/view/compound.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,17 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/view/impl/compound.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+BOOST_GUIGL_DRAW_IMPL(compound)
+
+}}}
Added: sandbox/guigl/libs/guigl/src/view/positioned.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/view/positioned.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,17 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/view/impl/positioned.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+BOOST_GUIGL_DRAW_IMPL(positioned)
+
+}}}
Added: sandbox/guigl/libs/guigl/src/view/solid_background.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/view/solid_background.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,17 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/view/impl/solid_background.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+BOOST_GUIGL_DRAW_IMPL(solid_background)
+
+}}}
Added: sandbox/guigl/libs/guigl/src/view/window.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/view/window.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,17 @@
+/*=================================---------------------------------------------
+    Copyright 2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/view/impl/window.hpp>
+
+
+namespace boost { namespace guigl { namespace view {
+
+BOOST_GUIGL_DRAW_IMPL(window)
+
+}}}
Added: sandbox/guigl/libs/guigl/src/widget/button.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/widget/button.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,41 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/window.hpp>
+#include <boost/guigl/widget/button.hpp>
+#include <boost/guigl/view/impl/active_colored.hpp>
+#include <boost/guigl/view/impl/clickable.hpp>
+#include <boost/guigl/view/impl/positioned.hpp>
+#include <boost/guigl/view/impl/solid_background.hpp>
+
+namespace boost { namespace guigl { namespace widget {
+
+BOOST_GUIGL_WIDGET_DRAW_IMPL(button)
+
+inline void button::draw_prologue()
+{
+    base_type::draw_prologue();
+    if(button_down())
+    {
+        use_active_color();
+        glRectd(0,0,size().x, size().y);
+    }
+}
+
+inline void button::draw_epilogue()
+{
+    base_type::draw_epilogue();
+}
+
+void button::clickable_button_down(bool state)
+{
+    guigl::window::redraw(*this);
+}
+
+}}}
\ No newline at end of file
Added: sandbox/guigl/libs/guigl/src/widget/labeled_button.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/widget/labeled_button.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,28 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/widget/labeled_button.hpp>
+#include <boost/guigl/view/impl/colored.hpp>
+#include <boost/guigl/view/impl/labeled.hpp>
+
+namespace boost { namespace guigl { namespace widget {
+
+BOOST_GUIGL_WIDGET_DRAW_IMPL(labeled_button)
+
+inline void labeled_button::draw_prologue()
+{
+    base_type::draw_prologue();
+}
+
+inline void labeled_button::draw_epilogue()
+{
+    base_type::draw_epilogue();
+}
+
+}}}
\ No newline at end of file
Added: sandbox/guigl/libs/guigl/src/widget/slider.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/widget/slider.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,42 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/window.hpp>
+#include <boost/guigl/widget/slider.hpp>
+#include <boost/guigl/view/impl/active_colored.hpp>
+#include <boost/guigl/view/impl/positioned.hpp>
+#include <boost/guigl/view/impl/solid_background.hpp>
+#include <boost/guigl/view/impl/draggable.hpp>
+#include <iostream>
+
+namespace boost { namespace guigl { namespace widget {
+
+BOOST_GUIGL_WIDGET_DRAW_IMPL(slider)
+
+inline void slider::draw_prologue()
+{
+    base_type::draw_prologue();
+
+    use_active_color();
+    glRectd(0,0,m_value * size().x, size().y);
+}
+
+inline void slider::draw_epilogue()
+{
+    base_type::draw_epilogue();
+}
+
+void slider::draggable_on_drag(const position_type &position)
+{
+    m_value = position.x / size().x;
+    guigl::window::redraw(*this);
+    on_value_change(m_value);
+}
+
+}}}
\ No newline at end of file
Added: sandbox/guigl/libs/guigl/src/widget/window.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/widget/window.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,31 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/widget/window.hpp>
+#include <boost/guigl/view/impl/compound.hpp>
+#include <boost/guigl/view/impl/mouse_tracking.hpp>
+#include <boost/guigl/view/impl/window.hpp>
+
+
+namespace boost { namespace guigl { namespace widget {
+
+BOOST_GUIGL_WIDGET_DRAW_IMPL(window)
+
+inline void window::draw_prologue()
+{
+    base_type::draw_prologue();
+}
+
+inline void window::draw_epilogue()
+{
+    base_type::draw_epilogue();
+}
+
+
+}}}
\ No newline at end of file
Added: sandbox/guigl/libs/guigl/src/window.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/src/window.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,170 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/window.hpp>
+#include <boost/config.hpp>
+
+#include <map>
+
+#include <boost/guigl/platform/glut.hpp>
+#include <iostream>
+
+namespace boost { namespace guigl {
+
+class glut
+{
+public:
+    glut()
+    {
+        int argc = 0;
+        glutInit(&argc,0);
+    }
+    
+    int create_window(const size_type &size, const std::string &label, window::impl *impl)
+    {
+        glutInitWindowSize(size.x, size.y);
+        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA );
+        int id = glutCreateWindow(label.c_str());
+        s_windows[id] = impl;
+        
+       	glutDisplayFunc(display);
+        glutMouseFunc(mouse);
+        glutPassiveMotionFunc(movement);
+        glutMotionFunc(movement);
+        glutEntryFunc(entry);
+                
+        return id;
+    }
+    
+    void destroy_window(int id)
+    {
+        glutDestroyWindow(id);
+    }
+private:
+    static void display();
+    static void mouse(int button, int state, int x, int y);
+    static void movement(int x, int y);
+    static void entry(int state);
+    static std::map<int, window::impl *> s_windows;
+};
+
+std::map<int, window::impl *> glut::s_windows;
+
+
+class window::impl
+{
+public:
+    impl(const window::argument_pack_type &map, window *ptr)
+        : m_window(ptr)
+    {
+        if(!s_glut)
+            s_glut = new glut();
+        m_label = map[_label];
+        m_id = s_glut->create_window(map[_size], m_label, this);
+    }
+    void display()
+    {
+        m_window->draw();
+    }
+    void mouse(int button, int state, int x, int y)
+    {
+        if (!m_window->mouse_state())
+            return;
+
+        button_event event_info;
+        switch(button)
+        {
+            case GLUT_LEFT_BUTTON:
+                event_info.button = button::left; break;
+            case GLUT_MIDDLE_BUTTON:
+                event_info.button = button::middle; break;
+            case GLUT_RIGHT_BUTTON:
+                event_info.button = button::right;
+        }
+        switch(state)
+        {
+            case GLUT_UP:
+                event_info.direction = direction::up; break;
+            case GLUT_DOWN:
+                event_info.direction = direction::down; break;            
+        }
+        event_info.position = position_type(x, y);
+        m_window->on_event(event_info);
+    }
+    void movement(int x, int y)
+    {
+        if (!m_window->mouse_state())
+            return;
+        movement_event event_info;
+        event_info.position = position_type(x, y);
+        m_window->on_event(event_info);
+    }
+    void entry_exit(int state)
+    {
+        entry_exit_event event_info;
+        event_info.region = state == GLUT_ENTERED ? region::entry : region::exit;
+        m_window->on_event(event_info);
+    }
+    ~impl()
+    {
+        s_glut->destroy_window(m_id);
+    }
+    int id() const
+    {   return m_id; }
+private:
+    int m_id;
+    static glut *s_glut;
+    window *m_window;
+    std::string m_label;
+};
+
+glut *window::impl::s_glut = 0;
+
+window::window(const argument_pack_type &args)
+    : widget::window(args)
+    , m_impl(new impl(args, this))
+{}
+
+window::~window()
+{}
+
+void window::redraw(const view::positioned<> &v)
+{
+    const window *window_ptr = dynamic_cast<const window *>(v.root());
+    if(window_ptr)
+        glutPostWindowRedisplay(window_ptr->m_impl->id());
+}
+
+void glut::display()
+{
+    int id = glutGetWindow();
+    s_windows[id]->display();
+    glutSwapBuffers();
+}
+
+void glut::mouse(int button, int state, int x, int y)
+{
+    int id = glutGetWindow();
+    s_windows[id]->mouse(button, state, x, y);
+}
+
+void glut::movement(int x, int y)
+{
+    int id = glutGetWindow();
+    s_windows[id]->movement(x, y);
+}
+
+void glut::entry(int state)
+{
+    int id = glutGetWindow();
+    s_windows[id]->entry_exit(state);
+}
+
+
+} }
\ No newline at end of file
Modified: sandbox/guigl/libs/guigl/test/Jamfile
==============================================================================
--- sandbox/guigl/libs/guigl/test/Jamfile	(original)
+++ sandbox/guigl/libs/guigl/test/Jamfile	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -15,14 +15,4 @@
       <library>/boost/test//boost_unit_test_framework/<link>static
     ;
 
-run test_field_map.cpp ;
-run test_field_map_compilation.cpp ;
-run test_parameter_compilation.cpp ;
-run test_parameter_dispatch_compilation.cpp ;
-
-#obj test_field_map_compilation : test_field_map_compilation.cpp ;
-#time time-test_field_map_compilation :  test_field_map_compilation ;
-#obj test_parameter_compilation : test_parameter_compilation.cpp ;
-#time time-test_parameter_compilation :  test_parameter_compilation ;
-#obj test_parameter_dispatch_compilation : test_parameter_dispatch_compilation.cpp ;
-#time time-test_parameter_dispatch_compilation :  test_parameter_dispatch_compilation ;
\ No newline at end of file
+run test_parameter.cpp ;
Added: sandbox/guigl/libs/guigl/test/test_parameter.cpp
==============================================================================
--- (empty file)
+++ sandbox/guigl/libs/guigl/test/test_parameter.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -0,0 +1,39 @@
+/*=================================---------------------------------------------
+    Copyright 2007,2008 Stjepan Rajko
+  
+    Distributed under the Boost Software License, Version 1.0.
+    (See accompanying file LICENSE_1_0.txt or copy at
+    http://www.boost.org/LICENSE_1_0.txt)
+-----------------------------------------------===============================*/
+
+
+#include <boost/guigl/parameters.hpp>
+
+#define BOOST_TEST_MAIN
+#include <boost/test/unit_test.hpp>
+
+using namespace boost::guigl;
+
+struct size_and_label
+{
+    typedef argument_pack<tag::label, tag::size>::type argument_pack_type;
+
+    size_and_label(const argument_pack_type &args)
+    {
+        label = args[_label];
+        size = args[_size];
+    }
+    std::string label;
+    size_type size;
+};
+
+BOOST_AUTO_TEST_CASE( test_parameter)
+{
+    size_and_label one(( _label = "name 1", _size = size_type(1, 2) ));
+    size_and_label two(( _label = "name 2" ));
+    
+    BOOST_CHECK_EQUAL(one.size.x, 1);
+    BOOST_CHECK_EQUAL(tag::size::default_value().x, 200);
+    BOOST_CHECK_EQUAL(two.size.x, 200);
+    
+}
\ No newline at end of file
Modified: sandbox/guigl/libs/guigl/test/test_parameter_compilation.cpp
==============================================================================
--- sandbox/guigl/libs/guigl/test/test_parameter_compilation.cpp	(original)
+++ sandbox/guigl/libs/guigl/test/test_parameter_compilation.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -1,5 +1,7 @@
 #include <boost/parameter/keyword.hpp>
 #include <boost/parameter/name.hpp>
+#include <boost/fusion/include/vector.hpp>
+#include <boost/fusion/include/make_vector.hpp>
 
 #define BOOST_TEST_MAIN
 #include <boost/test/unit_test.hpp>
@@ -9,5 +11,5 @@
 
 using namespace boost;
 
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 20, <libs/guigl/test/test_parameter_compilation.hpp>))
+#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 50, <libs/guigl/test/test_parameter_compilation.hpp>))
     #include BOOST_PP_ITERATE()
Modified: sandbox/guigl/libs/guigl/test/test_parameter_compilation.hpp
==============================================================================
--- sandbox/guigl/libs/guigl/test/test_parameter_compilation.hpp	(original)
+++ sandbox/guigl/libs/guigl/test/test_parameter_compilation.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -16,12 +16,16 @@
 class named_constructableN
 {
 public:
-    template<typename FM0, typename FM1, typename FM2>
-    named_constructableN(const FM0 &a0, const FM1 &a1, const FM2 &a2)
+
+    template<typename ArgumentPack>
+    named_constructableN(const ArgumentPack &args)
     {
-        label = (a0, a1, a2)[_labelN];
-        size = (a0, a1, a2)[_sizeN];
-        volume = (a0, a1, a2)[_volumeN];
+        label = args[_labelN];
+        size = args[_sizeN];
+        volume = args[_volumeN];
+        
+        fusion::vector<fusion::vector<fusion::vector<int> >, fusion::vector<float>, fusion::vector<int> > v3;
+        v3 = fusion::make_vector(fusion::make_vector(fusion::make_vector(1)),  fusion::make_vector(1.5), fusion::make_vector(true));
     }
     std::string label;
     int size;
@@ -31,9 +35,14 @@
 
 BOOST_AUTO_TEST_CASE( BOOST_PP_CAT(test_multi_param_construction,N) )
 {
-    named_constructableN constructed(_labelN = "hello", _sizeN = 1, _volumeN = 1.0);
+    named_constructableN constructed((_labelN = "hello", _sizeN = 1, _volumeN = 1.0));
+    named_constructableN constructed2((_sizeN = 1, _volumeN = 1.0, _labelN = "hello"));
+    named_constructableN constructed3((_labelN = "hello", _volumeN = 1.0, _sizeN = 1));
+    named_constructableN constructed4((_volumeN = 1.0, _sizeN = 1, _labelN = "hello"));
     BOOST_CHECK_EQUAL(constructed.label, "hello");
     BOOST_CHECK_EQUAL(constructed.size, 1);    
     BOOST_CHECK_EQUAL(constructed.volume, 1.0);    
-
+    BOOST_CHECK_EQUAL(constructed2.label, "hello");
+    BOOST_CHECK_EQUAL(constructed2.size, 1);    
+    BOOST_CHECK_EQUAL(constructed2.volume, 1.0);
 }
\ No newline at end of file
Modified: sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.cpp
==============================================================================
--- sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.cpp	(original)
+++ sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.cpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -10,6 +10,6 @@
 
 using namespace boost;
 
-#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 20, <libs/guigl/test/test_parameter_dispatch_compilation.hpp>))
+#define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 50, <libs/guigl/test/test_parameter_dispatch_compilation.hpp>))
     #include BOOST_PP_ITERATE()
 
Modified: sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.hpp
==============================================================================
--- sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.hpp	(original)
+++ sandbox/guigl/libs/guigl/test/test_parameter_dispatch_compilation.hpp	2008-08-28 14:08:30 EDT (Thu, 28 Aug 2008)
@@ -41,8 +41,13 @@
 BOOST_AUTO_TEST_CASE( BOOST_PP_CAT(test_multi_param_construction,N) )
 {
     named_constructableN constructed(_labelN = "hello", _sizeN = 1, _volumeN = 1.0);
+    named_constructableN constructed2(_sizeN = 1, _volumeN = 1.0, _labelN = "hello");
+    named_constructableN constructed3(_labelN = "hello", _volumeN = 1.0, _sizeN = 1);
+    named_constructableN constructed4(_volumeN = 1.0, _sizeN = 1, _labelN = "hello");
     BOOST_CHECK_EQUAL(constructed.label, "hello");
     BOOST_CHECK_EQUAL(constructed.size, 1);    
     BOOST_CHECK_EQUAL(constructed.volume, 1.0);    
-
+    BOOST_CHECK_EQUAL(constructed2.label, "hello");
+    BOOST_CHECK_EQUAL(constructed2.size, 1);    
+    BOOST_CHECK_EQUAL(constructed2.volume, 1.0);
 }
\ No newline at end of file