Mercurial > octave-nkf
annotate src/genprops.awk @ 7853:263cdf57a1dd
Use all properties in factory default values (including the ones starting with __)
author | Michael Goffioul <michael.goffioul@gmail.com> |
---|---|
date | Sun, 02 Mar 2008 14:44:31 +0100 |
parents | 3249f64f69b2 |
children | 8f3459a90bf3 |
rev | line source |
---|---|
7019 | 1 ## Copyright (C) 2007 John W. Eaton |
2 ## | |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by the | |
7 ## Free Software Foundation; either version 3 of the License, or (at | |
8 ## your option) any later version. | |
9 ## | |
10 ## Octave is distributed in the hope that it will be useful, but WITHOUT | |
11 ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 ## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
13 ## for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
16 ## along with Octave; see the file COPYING. If not, see | |
17 ## <http://www.gnu.org/licenses/>. | |
18 ## | |
6874 | 19 ## This script is used to generate the graphics.h file from graphics.h.in. |
20 ## | |
21 ## Lines between the BEGIN_PROPERTIES and END_PROPERTIES markers have | |
22 ## one of the following formats: | |
23 ## | |
24 ## TYPE NAME | |
25 ## TYPE NAME QUALIFIERS | |
26 ## mutable TYPE NAME | |
27 ## mutable TYPE NAME QUALIFIERS | |
28 ## | |
29 ## For each property, we generate a declaration for the property. | |
30 ## | |
31 ## If QUALIFIERS is omitted, we generate the following functions directly | |
32 ## in the class declaration: | |
33 ## | |
6875 | 34 ## TYPE |
35 ## get_NAME (void) const | |
36 ## { | |
37 ## return NAME; | |
38 ## } | |
39 ## | |
40 ## void | |
41 ## set_NAME (const TYPE& val) | |
42 ## { | |
43 ## if (! error_state) | |
44 ## NAME = val; | |
45 ## } | |
46 ## | |
47 ## void | |
48 ## set_NAME (const octave_value& val) | |
49 ## { | |
50 ## set_NAME (TYPE (val)); | |
51 ## } | |
6874 | 52 ## |
53 ## If present, the QUALIFIERS string may include any of the characters | |
7379 | 54 ## g, G, m, s, S, o, O, h, which have the following meanings: |
6874 | 55 ## |
56 ## g: There is a custom inline definition for the get function, | |
57 ## so we don't emit one. | |
58 ## | |
59 ## G: There is a custom extern definition for the get function, | |
60 ## so we emit only the declaration. | |
61 ## | |
62 ## s: There is a custom inline definition for the type-specific set | |
63 ## function, so we don't emit one. | |
64 ## | |
65 ## S: There is a custom extern definition for the type-specific set | |
66 ## function, so we emit only the declaration. | |
67 ## | |
68 ## o: There is a custom inline definition for the octave_value version | |
69 ## of the set function, so we don't emit one. | |
70 ## | |
71 ## O: There is a custom extern definition for the octave_value version | |
72 ## of the set function, so we emit only the declaration. | |
73 ## | |
6904 | 74 ## a: The octave_value version of the set function will use assignment: |
75 ## | |
76 ## void | |
77 ## set_NAME (const octave_value& val) | |
78 ## { | |
79 ## TYPE tmp (NAME); | |
80 ## tmp = val; | |
81 ## set_NAME (tmp); | |
82 ## } | |
83 ## | |
84 ## This is useful for things like the radio_value classes which | |
85 ## use an overloaded assignment operator of the form | |
86 ## | |
87 ## radio_property& operator = (const octave_value& val); | |
88 ## | |
89 ## that preserves the list of possible values, which is different | |
90 ## from what would happen if we simply used the | |
91 ## | |
92 ## TYPE (const octave_value&) | |
93 ## | |
94 ## constructor, which creates a new radio_property and so cannot | |
95 ## preserve the old list of possible values. | |
96 ## | |
7214 | 97 ## l: Add the line |
98 ## | |
99 ## update_axis_limits ("NAME"); | |
100 ## | |
101 ## to the type-specific set function. | |
102 ## | |
6874 | 103 ## m: Add the line |
104 ## | |
105 ## set_NAMEmode ("manual"); | |
106 ## | |
107 ## to the type-specific set function. | |
108 ## | |
7379 | 109 ## h: Make the property hidden |
110 ## | |
7427 | 111 ## r: Make the property read-only. A read-only property is not |
112 ## settable from the global set (caseless_str, octave_value) | |
113 ## method, but still has set_X accessor. | |
114 ## | |
115 ## u: The property has an updater method. This effectively add | |
116 ## the line | |
117 ## | |
118 ## update_NAME (); | |
119 ## | |
120 ## to the type-specific set function. This line is added before | |
121 ## any other update call (like those added by the 'l' or 'm' | |
122 ## modifiers. | |
123 ## | |
6874 | 124 ## The 'o' and 'O' qualifiers are only useful when the the property type |
125 ## is something other than octave_value. | |
126 | |
7363 | 127 ## simple accessor |
128 | |
129 function emit_get_accessor (i, rtype, faccess) | |
130 { | |
131 printf (" %s get_%s (void) const", rtype, name[i]); | |
132 | |
133 if (emit_get[i] == "definition") | |
134 printf (" { return %s.%s (); }\n", name[i], faccess); | |
135 else | |
136 printf (";\n"); | |
137 } | |
138 | |
139 ## bool_property | |
140 | |
141 function emit_get_bool (i) | |
142 { | |
143 printf (" bool is_%s (void) const", name[i]); | |
144 | |
145 if (emit_get[i] == "definition") | |
146 printf (" { return %s.is_on (); }\n", name[i]); | |
147 else | |
148 printf (";\n"); | |
149 | |
150 emit_get_accessor(i, "std::string", "current_value"); | |
151 } | |
152 | |
153 ## radio_property | |
154 | |
155 function emit_get_radio (i) | |
156 { | |
157 printf (" bool %s_is (const std::string& v) const", name[i]); | |
158 | |
159 if (emit_get[i] == "definition") | |
160 printf (" { return %s.is (v); }\n", name[i]); | |
161 else | |
162 printf (";\n"); | |
163 | |
164 emit_get_accessor(i, "std::string", "current_value"); | |
165 } | |
166 | |
167 ## color_property | |
168 | |
169 function emit_get_color (i) | |
170 { | |
171 printf (" bool %s_is_rgb (void) const { return %s.is_rgb (); }\n", name[i], name[i]); | |
172 | |
173 printf (" bool %s_is (const std::string& v) const", name[i]); | |
174 | |
175 if (emit_get[i] == "definition") | |
176 printf (" { return %s.is (v); }\n", name[i]); | |
177 else | |
178 printf (";\n"); | |
179 | |
180 printf (" Matrix get_%s_rgb (void) const", name[i]); | |
181 | |
182 if (emit_get[i] == "definition") | |
183 printf (" { return (%s.is_rgb () ? %s.rgb () : Matrix ()); }\n", name[i], name[i]); | |
184 else | |
185 printf (";\n"); | |
186 | |
187 emit_get_accessor(i, "octave_value", "get"); | |
188 } | |
189 | |
7844
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
190 ## double_radio_property |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
191 |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
192 function emit_get_double_radio (i) |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
193 { |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
194 printf (" bool %s_is_double (void) const { return %s.is_double (); }\n", name[i], name[i]); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
195 |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
196 printf (" bool %s_is (const std::string& v) const", name[i]); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
197 |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
198 if (emit_get[i] == "definition") |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
199 printf (" { return %s.is (v); }\n", name[i]); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
200 else |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
201 printf (";\n"); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
202 |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
203 printf (" double get_%s_double (void) const", name[i]); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
204 |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
205 if (emit_get[i] == "definition") |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
206 printf (" { return (%s.is_double () ? %s.double_value () : 0); }\n", name[i], name[i]); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
207 else |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
208 printf (";\n"); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
209 |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
210 emit_get_accessor(i, "octave_value", "get"); |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
211 } |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
212 |
7363 | 213 ## callback_property |
214 | |
215 function emit_get_callback (i) | |
216 { | |
7367 | 217 printf (" void execute_%s (const octave_value& data = octave_value ()) const", name[i]); |
7363 | 218 |
219 if (emit_get[i] == "definition") | |
7367 | 220 printf (" { %s.execute (data); }\n", name[i]); |
7363 | 221 else |
222 printf (";\n"); | |
223 | |
224 emit_get_accessor(i, "octave_value", "get"); | |
225 } | |
226 | |
7836
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
227 ## array_property |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
228 |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
229 function emit_get_array (i) |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
230 { |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
231 emit_get_accessor(i, "octave_value", "get"); |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
232 |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
233 printf (" array_property get_%s_property (void) const { return %s; }\n", |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
234 name[i], name[i]); |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
235 } |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
236 |
7363 | 237 ## common section |
238 | |
239 function emit_common_declarations () | |
240 { | |
241 printf ("public:\n"); | |
242 printf (" properties (const graphics_handle& mh, const graphics_handle& p);\n\n"); | |
243 printf (" ~properties (void) { }\n\n"); | |
7406 | 244 printf (" void set (const caseless_str& pname, const octave_value& val);\n\n"); |
7379 | 245 printf (" octave_value get (bool all = false) const;\n\n"); |
7406 | 246 printf (" octave_value get (const caseless_str& pname) const;\n\n"); |
7849
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
247 printf (" property get_property (const caseless_str& pname);\n\n"); |
7363 | 248 printf (" std::string graphics_object_name (void) const { return go_name; }\n\n"); |
249 printf (" static property_list::pval_map_type factory_defaults (void);\n\n"); | |
250 printf ("private:\n static std::string go_name;\n\n"); | |
251 } | |
252 | |
7225 | 253 function emit_declarations () |
6874 | 254 { |
7363 | 255 if (class_name) |
256 emit_common_declarations(); | |
257 | |
6874 | 258 if (idx > 0) |
7363 | 259 print "private:\n"; |
6874 | 260 |
261 for (i = 1; i <= idx; i++) | |
7363 | 262 printf (" %s%s %s;\n", mutable[i] ? "mutable " : "", type[i], name[i]); |
6874 | 263 |
264 if (idx > 0) | |
7363 | 265 print "\npublic:\n"; |
6874 | 266 |
267 for (i = 1; i <= idx; i++) | |
268 { | |
7363 | 269 if (emit_get[i]) |
270 { | |
7836
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
271 if (type[i] == "any_property") |
7363 | 272 emit_get_accessor(i, "octave_value", "get"); |
273 else if (type[i] == "handle_property") | |
274 emit_get_accessor(i, "graphics_handle", "handle_value"); | |
275 else if (type[i] == "string_property") | |
276 emit_get_accessor(i, "std::string", "string_value"); | |
277 else if (type[i] == "double_property") | |
278 emit_get_accessor(i, "double", "double_value"); | |
7844
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
279 else if (type[i] == "double_radio_property") |
3d60445d3638
Add new double_radio_property class for alpha values.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7836
diff
changeset
|
280 emit_get_double_radio(i); |
7836
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
281 else if (type[i] == "array_property" \ |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
282 || type[i] == "row_vector_property") |
4fb2db9c87dd
Turn cdata properties into array_property. Add min/max computation to array_property.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7826
diff
changeset
|
283 emit_get_array(i); |
7363 | 284 else if (type[i] == "bool_property") |
285 emit_get_bool(i); | |
286 else if (type[i] == "radio_property") | |
287 emit_get_radio(i); | |
288 else if (type[i] == "color_property") | |
289 emit_get_color(i); | |
290 else if (type[i] == "callback_property") | |
291 emit_get_callback(i); | |
292 else | |
6874 | 293 { |
7363 | 294 printf (" %s get_%s (void) const", type[i], name[i]); |
6874 | 295 |
7363 | 296 if (emit_get[i] == "definition") |
297 printf (" { return %s; }\n", name[i]); | |
298 else | |
299 printf (";\n"); | |
6874 | 300 } |
7363 | 301 printf ("\n"); |
302 } | |
6874 | 303 } |
304 | |
305 if (idx > 0) | |
7363 | 306 printf ("\n"); |
6874 | 307 |
308 for (i = 1; i <= idx; i++) | |
309 { | |
7363 | 310 if (emit_set[i]) |
311 { | |
312 printf (" void set_%s (const octave_value& val)", name[i], type[i]); | |
6874 | 313 |
7363 | 314 if (emit_set[i] == "definition") |
315 { | |
7849
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
316 if (updaters[i] || limits[i] || mode[i]) |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
317 has_builtin_listeners = 1; |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
318 else |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
319 has_builtin_listeners = 0; |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
320 |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
321 printf ("\n {\n if (! error_state)\n {\n %s.set (val, %s);\n", |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
322 name[i], (has_builtin_listeners ? "false" : "true")); |
7427 | 323 if (updater[i]) |
7826
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
324 printf (" update_%s ();\n", name[i]); |
7363 | 325 if (limits[i]) |
326 printf (" update_axis_limits (\"%s\");\n", name[i]); | |
327 if (mode[i]) | |
328 printf (" set_%smode (\"manual\");\n", name[i]); | |
7849
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
329 if (has_builtin_listeners) |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
330 printf (" %s.run_listeners (POSTSET);\n", name[i]); |
7363 | 331 printf (" mark_modified ();\n }\n }\n\n"); |
6874 | 332 } |
7363 | 333 else |
334 printf (";\n\n"); | |
335 } | |
6874 | 336 |
7826
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
337 if (updater[i] == "extern") |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
338 { |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
339 printf (" void update_%s (void);\n\n", name[i]); |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
340 } |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
341 |
7363 | 342 ## if (emit_ov_set[i]) |
343 ## { | |
344 ## printf (" void set_%s (const octave_value& val)", name[i]); | |
345 ## | |
346 ## if (emit_ov_set[i] == "definition") | |
347 ## printf (" { set_%s (%s (val)); }\n\n", name[i], type[i]); | |
348 ## else if (emit_ov_set[i] == "assignment") | |
349 ## { | |
350 ## printf ("\n {\n %s tmp (%s);\n tmp = val;\n set_%s (tmp);\n };\n\n", | |
351 ## type[i], name[i], name[i], name[i]); | |
352 ## } | |
353 ## else | |
354 ## printf (";\n"); | |
355 ## } | |
6874 | 356 } |
357 | |
7363 | 358 ## if (idx > 0) |
359 ## print "\nprivate:"; | |
360 } | |
361 | |
362 function emit_source () | |
363 { | |
364 if (class_name) | |
365 { | |
366 printf ("// ******** %s ********\n\n", class_name) >> filename; | |
367 | |
368 ## constructor | |
369 | |
370 printf ("%s::properties::properties (const graphics_handle& mh, const graphics_handle& p)\n", class_name) >> filename; | |
371 printf (" : base_properties (go_name, mh, p),\n") >> filename; | |
372 | |
373 for (i = 1; i <= idx; i++) | |
374 { | |
7397 | 375 printf (" %s (\"%s\", mh, %s)", name[i], name[i], defval[i]) >> filename; |
7363 | 376 if (i < idx) |
377 printf (",") >> filename; | |
378 printf ("\n") >> filename; | |
379 } | |
380 | |
7379 | 381 printf ("{\n") >> filename; |
7363 | 382 |
7379 | 383 for (i = 1; i <= idx; i++) |
384 { | |
385 ## printf (" insert_static_property (\"%s\", %s);\n", name[i], name[i]) >> filename; | |
386 if (hidden[i]) | |
387 printf (" %s.set_hidden (true);\n", name[i]) >> filename; | |
388 } | |
7363 | 389 |
7379 | 390 printf (" init ();\n}\n\n") >> filename; |
7363 | 391 |
392 ## set method | |
393 | |
7406 | 394 printf ("void\n%s::properties::set (const caseless_str& pname, const octave_value& val)\n{\n", |
7363 | 395 class_name) >> filename; |
396 | |
397 for (i = 1; i <= idx; i++) | |
398 { | |
7403 | 399 if (! readonly[i]) |
7406 | 400 printf (" %sif (pname.compare (\"%s\"))\n set_%s (val);\n", |
7403 | 401 (i > 1 ? "else " : ""), name[i], name[i]) >> filename; |
7363 | 402 } |
403 | |
7406 | 404 printf (" else\n base_properties::set (pname, val);\n}\n\n") >> filename; |
7363 | 405 |
406 ## get "all" method | |
407 | |
7379 | 408 printf ("octave_value\n%s::properties::get (bool all) const\n{\n", class_name) >> filename; |
409 printf (" Octave_map m = base_properties::get (all).map_value ();\n\n") >> filename; | |
7363 | 410 |
411 for (i = 1; i <= idx; i++) | |
412 { | |
7379 | 413 if (hidden[i]) |
414 printf (" if (all)\n m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i], | |
415 (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename; | |
416 else | |
417 printf (" m.assign (\"%s\", get_%s ()%s);\n", name[i], name[i], | |
418 (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename; | |
7363 | 419 } |
420 | |
421 printf ("\n return m;\n}\n\n") >> filename; | |
422 | |
423 ## get "one" method | |
424 | |
7406 | 425 printf ("octave_value\n%s::properties::get (const caseless_str& pname) const\n{\n", |
7363 | 426 class_name) >> filename; |
427 printf (" octave_value retval;\n\n") >> filename; | |
428 | |
429 for (i = 1; i<= idx; i++) | |
430 { | |
7406 | 431 printf (" %sif (pname.compare (\"%s\"))\n", |
7363 | 432 (i > 1 ? "else " : ""), name[i]) >> filename; |
433 printf (" retval = get_%s ()%s;\n", name[i], | |
434 (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename; | |
435 } | |
436 | |
7406 | 437 printf (" else\n retval = base_properties::get (pname);\n\n") >> filename; |
7363 | 438 printf (" return retval;\n}\n\n") >> filename; |
439 | |
7849
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
440 ## get_property method |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
441 |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
442 printf ("property\n%s::properties::get_property (const caseless_str& pname)\n{\n", |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
443 class_name) >> filename; |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
444 |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
445 for (i = 1; i<= idx; i++) |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
446 { |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
447 printf (" %sif (pname.compare (\"%s\"))\n", |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
448 (i > 1 ? "else " : ""), name[i]) >> filename; |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
449 printf (" return property (&%s, true);\n", name[i]) >> filename; |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
450 } |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
451 |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
452 printf (" else\n return base_properties::get_property (pname);\n") >> filename; |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
453 printf ("}\n\n") >> filename; |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
454 |
3249f64f69b2
Initial low-level support for property listeners.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7848
diff
changeset
|
455 |
7363 | 456 ## factory defaults method |
457 | |
458 printf ("property_list::pval_map_type\n%s::properties::factory_defaults (void)\n{\n", | |
459 class_name) >> filename; | |
460 printf (" property_list::pval_map_type m;\n\n") >> filename; | |
461 | |
462 for (i = 1; i <= idx; i++) | |
463 { | |
7397 | 464 dval = defval[i]; |
7363 | 465 if (type[i] == "radio_property" || type[i] == "color_property") |
7397 | 466 dval = gensub (/^.*\{(.*)\}.*$/, "\"\\1\"", "g", dval); |
467 if (! dval) | |
468 dval = "octave_value ()"; | |
7853
263cdf57a1dd
Use all properties in factory default values (including the ones starting with __)
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7849
diff
changeset
|
469 printf (" m[\"%s\"] = %s%s;\n", name[i], dval, |
263cdf57a1dd
Use all properties in factory default values (including the ones starting with __)
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7849
diff
changeset
|
470 (type[i] == "handle_property" ? ".as_octave_value ()" : "")) >> filename; |
7363 | 471 } |
472 | |
473 printf ("\n return m;\n}\n\n") >> filename; | |
474 | |
475 ## go_name static field | |
476 | |
477 printf ("std::string %s::properties::go_name (\"%s\");\n\n", | |
478 class_name, class_name) >> filename; | |
479 } | |
6874 | 480 } |
481 | |
482 BEGIN { | |
7363 | 483 filename = "graphics-props.cc"; |
484 printf ("// DO NOT EDIT! Generated automatically by genprops.awk.\n\n"); | |
485 printf ("// DO NOT EDIT! Generated automatically by genprops.awk.\n\n") > filename; | |
486 } | |
487 | |
488 /BEGIN_PROPERTIES\(.*\)/ { | |
489 gather = 1; | |
490 idx = 0; | |
491 class_name = gensub (/^.*BEGIN_PROPERTIES\((.*)\)/, "\\1", "g"); | |
492 next; | |
6874 | 493 } |
494 | |
495 /BEGIN_PROPERTIES/ { | |
7363 | 496 gather = 1; |
497 idx = 0; | |
498 class_name = ""; | |
499 next; | |
6874 | 500 } |
501 | |
502 /END_PROPERTIES/ { | |
7363 | 503 emit_declarations(); |
504 emit_source(); | |
505 gather = 0; | |
506 next; | |
6874 | 507 } |
508 | |
509 { | |
510 if (gather) | |
7363 | 511 { |
7403 | 512 if (NF < 2 || /^[ \t]*\/\//) |
7363 | 513 next; |
6874 | 514 |
7363 | 515 idx++; |
6874 | 516 |
7363 | 517 field = 1; |
6874 | 518 |
7363 | 519 if ($field == "mutable") |
520 { | |
521 mutable[idx] = 1; | |
522 field++; | |
523 } | |
524 else | |
525 mutable[idx] = 0; | |
6874 | 526 |
7363 | 527 type[idx] = $(field++); |
528 name[idx] = $(field++); | |
6874 | 529 |
7363 | 530 limits[idx] = 0; |
531 mode[idx] = 0; | |
7403 | 532 hidden[idx] = 0; |
533 readonly[idx] = 0; | |
7363 | 534 emit_get[idx] = "definition"; |
535 emit_set[idx] = "definition"; | |
7397 | 536 defval[idx] = ""; |
7427 | 537 updater[idx] = ""; |
7363 | 538 ## if (type[idx] == "octave_value") |
539 ## emit_ov_set[idx] = ""; | |
540 ## else | |
541 ## emit_ov_set[idx] = "definition"; | |
6874 | 542 |
7363 | 543 if (NF >= field) |
544 { | |
545 if ($field != ",") | |
546 { | |
547 quals = $(field++); | |
7214 | 548 |
7363 | 549 if (index (quals, "l")) |
550 limits[idx] = 1; | |
6874 | 551 |
7363 | 552 if (index (quals, "m")) |
553 mode[idx] = 1; | |
554 | |
555 ## There is a custom inline definition for the get function, | |
556 ## so we don't emit anything. | |
557 if (index (quals, "g")) | |
558 emit_get[idx] = ""; | |
6874 | 559 |
7363 | 560 ## There is a custom extern definition for the get function, |
561 ## but we still emit the declaration. | |
562 if (index (quals, "G")) | |
563 emit_get[idx] = "declaration"; | |
6874 | 564 |
7363 | 565 ## There is a custom inline definition for the set function, |
566 ## so we don't emit anything. | |
567 if (index (quals, "s")) | |
568 emit_set[idx] = ""; | |
6874 | 569 |
7363 | 570 ## There is a custom extern definition for the set function, |
571 ## but we still emit the declaration. | |
572 if (index (quals, "S")) | |
573 emit_set[idx] = "declaration"; | |
7379 | 574 |
7403 | 575 ## The property is hidden |
576 if (index (quals, "h")) | |
577 hidden[idx] = 1; | |
578 | |
579 ## The property is read-only | |
580 if (index (quals, "r")) | |
581 readonly[idx] = 1; | |
6904 | 582 |
7826
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
583 ## There is an inline updater method that should be called |
7427 | 584 ## from the set method |
585 if (index (quals, "u")) | |
7826
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
586 updater[idx] = "inline"; |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
587 |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
588 ## There is an extern updater method that should be called |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
589 ## from the set method |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
590 if (index (quals, "U")) |
68550ad9ee9c
Add support for extern updaters. Add set_figure_position interface to graphics_backend.
Michael Goffioul <michael.goffioul@gmail.com>
parents:
7523
diff
changeset
|
591 updater[idx] = "extern"; |
7427 | 592 |
7363 | 593 ## ## emmit an asignment set function |
594 ## if (index (quals, "a")) | |
595 ## emit_ov_set[idx] = "assignment"; | |
596 ## | |
597 ## if (type[idx] != "octave_value") | |
598 ## { | |
599 ## ## The 'o' and 'O' qualifiers are only useful when the | |
600 ## ## the property type is something other than an | |
601 ## ## octave_value. | |
602 ## | |
603 ## ## There is a custom inline definition for the | |
604 ## ## octave_value version of the set function, so we | |
605 ## ## don't emit anything. | |
606 ## if (index (quals, "o")) | |
607 ## emit_ov_set[idx] = ""; | |
608 ## | |
609 ## ## There is a custom extern definition for the | |
610 ## ## octave_value version of the set function, but we | |
611 ## ## still emit the declaration. | |
612 ## if (index (quals, "O")) | |
613 ## emit_ov_set[idx] = "declaration"; | |
614 ## } | |
615 } | |
6874 | 616 |
7363 | 617 if (NF > field && $field == ",") |
618 { | |
619 field++; | |
6874 | 620 |
7363 | 621 for (i = field; i <= NF; i++) |
7397 | 622 defval[idx] = (defval[idx] (i > field ? " " : "") $i); |
7363 | 623 } |
6874 | 624 } |
7363 | 625 |
626 } | |
6874 | 627 else |
7363 | 628 print $0; |
6883 | 629 } |