$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r52849 - in sandbox/mirror: boost/mirror boost/mirror/factory boost/mirror/factory/wx_constructor_gui libs/mirror/example/factories
From: chochlik_at_[hidden]
Date: 2009-05-08 07:25:00
Author: matus.chochlik
Date: 2009-05-08 07:24:59 EDT (Fri, 08 May 2009)
New Revision: 52849
URL: http://svn.boost.org/trac/boost/changeset/52849
Log:
[mirror 0.4.x]
- added function caller functionality to the wx_constructor_gui
- updated the simple_gui example to show the wx function caller
Text files modified: 
   sandbox/mirror/boost/mirror/factory/wx_constructor_gui.hpp         |    87 ++++++++++++++++++++++++++++++++------- 
   sandbox/mirror/boost/mirror/factory/wx_constructor_gui/default.hpp |     2                                         
   sandbox/mirror/boost/mirror/functor_call.hpp                       |     1                                         
   sandbox/mirror/libs/mirror/example/factories/simple_gui.cpp        |     5 ++                                      
   sandbox/mirror/libs/mirror/example/factories/tetrahedron.hpp       |    12 +++++                                   
   5 files changed, 90 insertions(+), 17 deletions(-)
Modified: sandbox/mirror/boost/mirror/factory/wx_constructor_gui.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/factory/wx_constructor_gui.hpp	(original)
+++ sandbox/mirror/boost/mirror/factory/wx_constructor_gui.hpp	2009-05-08 07:24:59 EDT (Fri, 08 May 2009)
@@ -11,6 +11,7 @@
 #define BOOST_MIRROR_FACTORY_WX_CONSTRUCTOR_GUI_HPP
 
 #include <boost/mirror/factory.hpp>
+#include <boost/mirror/functor_call.hpp>
 
 #include <boost/mirror/factory/wx_constructor_gui/data.hpp>
 #include <boost/mirror/factory/wx_constructor_gui/utils.hpp>
@@ -26,16 +27,17 @@
 namespace boost {
 namespace mirror {
 namespace utils {
+namespace detail {
 
-template <class Product>
-class wx_factory_dialog
+class wx_constructor_gui_dialog
 {
 private:
         // the dialog 
         wxDialog* dialog;
-
+protected:
         // the data passed to the factory
         wx_constructor_gui_data data;
+private:
         wx_constructor_gui_data make_data(wxWindow* parent)
         {
                 assert(parent != 0);
@@ -90,11 +92,8 @@
                 // make and return the data
                 return wx_constructor_gui_data(panel, sizer, 0);
         }
-
-	// the factory
-	factory< wx_constructor_gui, Product > fact;
-public:
-	wx_factory_dialog(wxWindow* parent, wxString caption)
+protected:
+	wx_constructor_gui_dialog(wxWindow* parent, wxString caption)
          : dialog(
                 new wxDialog(
                         parent, 
@@ -102,7 +101,14 @@
                         caption
                 )
         ), data(make_data(dialog))
-	 , fact(&data, 0)
+	{ }
+
+	~wx_constructor_gui_dialog(void)
+	{
+		dialog->Destroy();
+	}
+
+	void init(void)
         {
                 // and resize the dialog
                 dialog->GetSizer()->SetSizeHints(dialog);
@@ -112,18 +118,36 @@
                 );
         }
 
-	~wx_factory_dialog(void)
+	inline bool gather_input(void)
         {
-		dialog->Destroy();
+		assert(dialog != 0);
+		// center the dialog 
+		dialog->Center();
+		// show it modally and return result
+		return dialog->ShowModal() == wxID_OK;
+	}
+
+};
+
+} // namespace detail
+
+template <class Product>
+class wx_factory_dialog : public detail::wx_constructor_gui_dialog
+{
+private:
+	// the factory
+	factory< wx_constructor_gui, Product > fact;
+public:
+	wx_factory_dialog(wxWindow* parent, wxString caption)
+	 : detail::wx_constructor_gui_dialog(parent, caption)
+	 , fact(&data)
+	{
+		init();
         }
 
         inline Product* create(void)
         {
-		assert(dialog != 0);
-		// center the dialog 
-		dialog->Center();
-		// show it modally
-		if(dialog->ShowModal() == wxID_OK)
+		if(gather_input())
                 {
                         return fact.new_();
                 }
@@ -131,6 +155,37 @@
         }
 };
 
+template <class Class, int Index>
+class wx_fn_call_dialog : public detail::wx_constructor_gui_dialog
+{
+private:
+	typedef meta_member_functions<Class> meta_functions;
+	typedef mpl::int_<Index> function_index;
+	functor_caller<wx_constructor_gui, meta_functions, function_index> 
+		caller;
+	typedef typename meta_functions::template function<function_index> 
+		meta_function;
+	typedef typename meta_function::result_type::reflected_type 
+		result_type;
+public:
+	wx_fn_call_dialog(wxWindow* parent, wxString caption)
+	 : detail::wx_constructor_gui_dialog(parent, caption)
+	 , caller(&data)
+	{
+		init();
+	}
+
+	template <class Class>
+	inline result_type call_on(Class& instance)
+	{
+		if(gather_input())
+		{
+			return caller(instance);
+		}
+		throw ::std::runtime_error("Operation cancelled by user");
+	}
+};
+
 } // namespace utils
 } // namespace mirror
 } // namespace boost
Modified: sandbox/mirror/boost/mirror/factory/wx_constructor_gui/default.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/factory/wx_constructor_gui/default.hpp	(original)
+++ sandbox/mirror/boost/mirror/factory/wx_constructor_gui/default.hpp	2009-05-08 07:24:59 EDT (Fri, 08 May 2009)
@@ -38,7 +38,7 @@
                 // make a label for the static box sizer
                 wxString label(
                         MetaFunctions::
-			template constructor<FuncIndex>::params::
+			template function<FuncIndex>::params::
                         template param<ParamIndex>::base_name()
                 );
                 // the panel which will be the parent of
Modified: sandbox/mirror/boost/mirror/functor_call.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/functor_call.hpp	(original)
+++ sandbox/mirror/boost/mirror/functor_call.hpp	2009-05-08 07:24:59 EDT (Fri, 08 May 2009)
@@ -11,6 +11,7 @@
 #define BOOST_MIRROR_FUNCTOR_CALL_HPP
 
 #include <boost/mirror/factory.hpp>
+#include <boost/mirror/meta_mem_functions.hpp>
 
 namespace boost {
 namespace mirror {
Modified: sandbox/mirror/libs/mirror/example/factories/simple_gui.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/factories/simple_gui.cpp	(original)
+++ sandbox/mirror/libs/mirror/example/factories/simple_gui.cpp	2009-05-08 07:24:59 EDT (Fri, 08 May 2009)
@@ -49,6 +49,11 @@
                 // if we were successful
                 if(t)
                 {
+			utils::wx_fn_call_dialog<T, 0> reset_apex(
+				0,
+				wxT("GUI test")
+			);
+			reset_apex.call_on(*t);
                         // show some info 
                         wxString message;
                         message.Printf(
Modified: sandbox/mirror/libs/mirror/example/factories/tetrahedron.hpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/factories/tetrahedron.hpp	(original)
+++ sandbox/mirror/libs/mirror/example/factories/tetrahedron.hpp	2009-05-08 07:24:59 EDT (Fri, 08 May 2009)
@@ -14,6 +14,8 @@
 
 #include <math.h>
 #include <boost/mirror/meta_class.hpp>
+#include <boost/mirror/meta_constructors.hpp>
+#include <boost/mirror/meta_mem_functions.hpp>
         
 namespace test {
         
@@ -105,6 +107,11 @@
         const vector& c(void) const {return base.c;}
         const vector& d(void) const {return apex;}
 
+	void reset_apex(const vector& _apex)
+	{
+		apex = _apex;
+	}
+
         double volume(void) const
         {
                 return fabs(((a()-d())*((b()-d())%(c()-d()))))/6.0;
@@ -148,6 +155,11 @@
         ::test::tetrahedron,
         (((::test::triangle)(base))((::test::vector)(apex)))
 )
+BOOST_MIRROR_REG_MEM_FUNCTIONS_BEGIN(::test::tetrahedron)
+BOOST_MIRROR_REG_MEM_FUNCTION(
+	0, void, reset_apex, ((const ::test::vector&)(apex))
+)
+BOOST_MIRROR_REG_MEM_FUNCTIONS_END
 
 } // namespace mirror
 } // namespace boost