diff src/genprops.awk @ 7849:3249f64f69b2

Initial low-level support for property listeners. * * * Make listeners work for all properties.
author Michael Goffioul <michael.goffioul@gmail.com>
date Fri, 29 Feb 2008 17:38:32 +0100
parents 6bb2bbc2bf45
children 263cdf57a1dd
line wrap: on
line diff
--- a/src/genprops.awk
+++ b/src/genprops.awk
@@ -244,6 +244,7 @@
   printf ("  void set (const caseless_str& pname, const octave_value& val);\n\n");
   printf ("  octave_value get (bool all = false) const;\n\n");
   printf ("  octave_value get (const caseless_str& pname) const;\n\n");
+  printf ("  property get_property (const caseless_str& pname);\n\n");
   printf ("  std::string graphics_object_name (void) const { return go_name; }\n\n");
   printf ("  static property_list::pval_map_type factory_defaults (void);\n\n");
   printf ("private:\n  static std::string go_name;\n\n");
@@ -312,14 +313,21 @@
 
       if (emit_set[i] == "definition")
       {
-        printf ("\n  {\n    if (! error_state)\n      {\n        %s = val;\n",
-          name[i]);
+	if (updaters[i] || limits[i] || mode[i])
+	  has_builtin_listeners = 1;
+	else
+	  has_builtin_listeners = 0;
+
+        printf ("\n  {\n    if (! error_state)\n      {\n        %s.set (val, %s);\n",
+          name[i], (has_builtin_listeners ? "false" : "true"));
         if (updater[i])
           printf ("        update_%s ();\n", name[i]);
         if (limits[i])
           printf ("        update_axis_limits (\"%s\");\n", name[i]);
         if (mode[i])
           printf ("        set_%smode (\"manual\");\n", name[i]);
+	if (has_builtin_listeners)
+	  printf ("        %s.run_listeners (POSTSET);\n", name[i]);
         printf ("        mark_modified ();\n      }\n  }\n\n");
       }
       else
@@ -429,6 +437,22 @@
     printf ("  else\n    retval = base_properties::get (pname);\n\n") >> filename;
     printf ("  return retval;\n}\n\n") >> filename;
 
+    ## get_property method
+
+    printf ("property\n%s::properties::get_property (const caseless_str& pname)\n{\n",
+            class_name) >> filename;
+
+    for (i = 1; i<= idx; i++)
+    {
+      printf ("  %sif (pname.compare (\"%s\"))\n",
+              (i > 1 ? "else " : ""), name[i]) >> filename;
+      printf ("    return property (&%s, true);\n", name[i]) >> filename;
+    }
+
+    printf ("  else\n    return base_properties::get_property (pname);\n") >> filename;
+    printf ("}\n\n") >> filename;
+
+
     ## factory defaults method
 
     printf ("property_list::pval_map_type\n%s::properties::factory_defaults (void)\n{\n",