reflexion 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. checksums.yaml +7 -0
  2. data/.doc/ext/reflex/application.cpp +54 -39
  3. data/.doc/ext/reflex/capture_event.cpp +87 -0
  4. data/.doc/ext/reflex/draw_event.cpp +103 -0
  5. data/.doc/ext/reflex/event.cpp +73 -0
  6. data/.doc/ext/reflex/focus_event.cpp +98 -0
  7. data/.doc/ext/reflex/frame_event.cpp +133 -0
  8. data/.doc/ext/reflex/image_view.cpp +74 -0
  9. data/.doc/ext/reflex/key_event.cpp +124 -0
  10. data/.doc/ext/reflex/native.cpp +45 -6
  11. data/.doc/ext/reflex/pointer_event.cpp +181 -0
  12. data/.doc/ext/reflex/reflex.cpp +17 -41
  13. data/.doc/ext/reflex/scroll_event.cpp +141 -0
  14. data/.doc/ext/reflex/selector.cpp +135 -0
  15. data/.doc/ext/reflex/style.cpp +253 -0
  16. data/.doc/ext/reflex/style_length.cpp +133 -0
  17. data/.doc/ext/reflex/style_length2.cpp +149 -0
  18. data/.doc/ext/reflex/style_length4.cpp +192 -0
  19. data/.doc/ext/reflex/update_event.cpp +77 -0
  20. data/.doc/ext/reflex/view.cpp +408 -88
  21. data/.doc/ext/reflex/wheel_event.cpp +146 -0
  22. data/.doc/ext/reflex/window.cpp +95 -92
  23. data/Rakefile +6 -5
  24. data/VERSION +1 -1
  25. data/ext/reflex/application.cpp +67 -49
  26. data/ext/reflex/capture_event.cpp +92 -0
  27. data/ext/reflex/draw_event.cpp +110 -0
  28. data/ext/reflex/event.cpp +77 -0
  29. data/ext/reflex/extconf.rb +18 -68
  30. data/ext/reflex/focus_event.cpp +104 -0
  31. data/ext/reflex/frame_event.cpp +143 -0
  32. data/ext/reflex/image_view.cpp +77 -0
  33. data/ext/reflex/key_event.cpp +133 -0
  34. data/ext/reflex/native.cpp +45 -6
  35. data/ext/reflex/pointer_event.cpp +195 -0
  36. data/ext/reflex/reflex.cpp +21 -47
  37. data/ext/reflex/scroll_event.cpp +152 -0
  38. data/ext/reflex/selector.cpp +144 -0
  39. data/ext/reflex/style.cpp +277 -0
  40. data/ext/reflex/style_length.cpp +140 -0
  41. data/ext/reflex/style_length2.cpp +157 -0
  42. data/ext/reflex/style_length4.cpp +204 -0
  43. data/ext/reflex/update_event.cpp +81 -0
  44. data/ext/reflex/view.cpp +469 -114
  45. data/ext/reflex/wheel_event.cpp +158 -0
  46. data/ext/reflex/window.cpp +130 -123
  47. data/include/reflex/application.h +12 -7
  48. data/include/reflex/defs.h +13 -89
  49. data/include/reflex/event.h +260 -0
  50. data/include/reflex/exception.h +17 -11
  51. data/include/reflex/image_view.h +45 -0
  52. data/include/reflex/reflex.h +2 -6
  53. data/include/reflex/ruby/application.h +40 -13
  54. data/include/reflex/ruby/event.h +72 -0
  55. data/include/reflex/ruby/image_view.h +25 -0
  56. data/include/reflex/ruby/selector.h +27 -0
  57. data/include/reflex/ruby/style.h +27 -0
  58. data/include/reflex/ruby/style_length.h +37 -0
  59. data/include/reflex/ruby/view.h +193 -38
  60. data/include/reflex/ruby/window.h +123 -39
  61. data/include/reflex/ruby.h +3 -2
  62. data/include/reflex/selector.h +64 -0
  63. data/include/reflex/style.h +144 -0
  64. data/include/reflex/style_length.h +147 -0
  65. data/include/reflex/view.h +182 -19
  66. data/include/reflex/window.h +35 -19
  67. data/include/reflex.h +7 -0
  68. data/lib/reflex/application.rb +14 -5
  69. data/lib/reflex/arc_shape.rb +20 -0
  70. data/lib/reflex/button.rb +75 -0
  71. data/lib/reflex/capture_event.rb +37 -0
  72. data/lib/reflex/color.rb +13 -0
  73. data/lib/reflex/color_space.rb +13 -0
  74. data/lib/reflex/draw_event.rb +19 -0
  75. data/lib/reflex/ellipse_shape.rb +20 -0
  76. data/lib/reflex/ext.rb +1 -1
  77. data/lib/reflex/flags.rb +18 -0
  78. data/lib/reflex/focus_event.rb +38 -0
  79. data/lib/reflex/font.rb +13 -0
  80. data/lib/reflex/frame_event.rb +42 -0
  81. data/lib/reflex/helper.rb +87 -30
  82. data/lib/reflex/image_view.rb +25 -0
  83. data/lib/reflex/key_event.rb +38 -0
  84. data/lib/reflex/line_shape.rb +20 -0
  85. data/lib/reflex/list_view.rb +15 -0
  86. data/lib/reflex/model.rb +149 -0
  87. data/lib/reflex/model_owner.rb +57 -0
  88. data/lib/reflex/model_view.rb +22 -0
  89. data/lib/reflex/module.rb +11 -7
  90. data/lib/reflex/pointer_event.rb +85 -0
  91. data/lib/reflex/rect_shape.rb +20 -0
  92. data/lib/reflex/reflex.rb +13 -2
  93. data/lib/reflex/scroll_event.rb +19 -0
  94. data/lib/reflex/selector.rb +31 -0
  95. data/lib/reflex/shader.rb +13 -0
  96. data/lib/reflex/shape.rb +34 -0
  97. data/lib/reflex/style.rb +55 -0
  98. data/lib/reflex/style_length.rb +30 -0
  99. data/lib/reflex/style_length2.rb +34 -0
  100. data/lib/reflex/style_length4.rb +38 -0
  101. data/lib/reflex/text_view.rb +55 -0
  102. data/lib/reflex/update_event.rb +19 -0
  103. data/lib/reflex/view.rb +38 -4
  104. data/lib/reflex/wheel_event.rb +19 -0
  105. data/lib/reflex/window.rb +7 -5
  106. data/lib/reflex.rb +38 -1
  107. data/lib/reflexion/include.rb +5 -0
  108. data/lib/reflexion.rb +100 -0
  109. data/reflex.gemspec +3 -4
  110. data/samples/app.rb +13 -0
  111. data/samples/bats.rb +91 -0
  112. data/samples/checker.rb +36 -0
  113. data/{examples/ruby/shapes.rb → samples/fans.rb} +12 -16
  114. data/samples/fps.rb +46 -0
  115. data/samples/grid.rb +60 -0
  116. data/{examples/ruby → samples}/hello.rb +14 -16
  117. data/samples/image.rb +44 -0
  118. data/samples/ios/hello/hello/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  119. data/samples/ios/hello/hello/Images.xcassets/LaunchImage.launchimage/Contents.json +51 -0
  120. data/samples/ios/hello/hello/en.lproj/InfoPlist.strings +2 -0
  121. data/samples/ios/hello/hello/hello-Info.plist +47 -0
  122. data/samples/ios/hello/hello/hello-Prefix.pch +10 -0
  123. data/samples/ios/hello/hello/main.cpp +79 -0
  124. data/samples/ios/hello/hello.xcodeproj/project.pbxproj +725 -0
  125. data/{examples/ruby → samples}/key.rb +11 -14
  126. data/samples/layout.rb +89 -0
  127. data/samples/model.rb +86 -0
  128. data/samples/osx/hello/hello/Images.xcassets/AppIcon.appiconset/Contents.json +58 -0
  129. data/samples/osx/hello/hello/en.lproj/Credits.rtf +29 -0
  130. data/samples/osx/hello/hello/en.lproj/InfoPlist.strings +2 -0
  131. data/samples/osx/hello/hello/hello-Info.plist +32 -0
  132. data/samples/osx/hello/hello/hello-Prefix.pch +3 -0
  133. data/samples/osx/hello/hello/main.cpp +79 -0
  134. data/samples/osx/hello/hello.xcodeproj/project.pbxproj +725 -0
  135. data/samples/reflexion/hello.rb +24 -0
  136. data/samples/reflexion/paint.rb +40 -0
  137. data/samples/reflexion/pulse.rb +34 -0
  138. data/samples/repl.rb +69 -0
  139. data/samples/shader.rb +41 -0
  140. data/samples/shapes.rb +30 -0
  141. data/{examples/ruby → samples}/text.rb +7 -8
  142. data/samples/tree.rb +71 -0
  143. data/samples/views.rb +41 -0
  144. data/samples/visuals.rb +22 -0
  145. data/src/event.cpp +225 -0
  146. data/src/exception.cpp +24 -15
  147. data/src/image_view.cpp +70 -0
  148. data/src/ios/app_delegate.h +17 -0
  149. data/src/ios/app_delegate.mm +120 -0
  150. data/src/ios/application.mm +116 -0
  151. data/src/{cocoa/applicationdata.h → ios/application_data.h} +6 -6
  152. data/src/ios/event.h +26 -0
  153. data/src/ios/event.mm +31 -0
  154. data/src/ios/native_window.h +37 -0
  155. data/src/ios/native_window.mm +220 -0
  156. data/src/ios/opengl_view.h +13 -0
  157. data/src/ios/opengl_view.mm +131 -0
  158. data/src/{cocoa → ios}/reflex.mm +8 -12
  159. data/src/ios/window.mm +303 -0
  160. data/src/ios/window_data.h +75 -0
  161. data/src/osx/app_delegate.h +17 -0
  162. data/src/{cocoa/cocoaapplication.mm → osx/app_delegate.mm} +90 -48
  163. data/src/osx/application.mm +132 -0
  164. data/src/osx/application_data.h +45 -0
  165. data/src/osx/event.h +42 -0
  166. data/src/osx/event.mm +112 -0
  167. data/src/osx/native_window.h +26 -0
  168. data/src/osx/native_window.mm +322 -0
  169. data/src/{cocoa/openglview.h → osx/opengl_view.h} +0 -4
  170. data/src/{cocoa/openglview.mm → osx/opengl_view.mm} +66 -23
  171. data/src/osx/reflex.mm +50 -0
  172. data/src/osx/window.mm +308 -0
  173. data/src/osx/window_data.h +75 -0
  174. data/src/selector.cpp +121 -0
  175. data/src/style.cpp +576 -0
  176. data/src/style_length.cpp +341 -0
  177. data/src/view.cpp +1228 -129
  178. data/src/win32/application.cpp +1 -1
  179. data/src/window.cpp +54 -26
  180. data/test/helper.rb +8 -4
  181. data/test/test_capture_event.rb +41 -0
  182. data/test/test_event.rb +20 -0
  183. data/test/test_has_frame.rb +45 -0
  184. data/test/test_model.rb +9 -0
  185. data/test/test_model_owner.rb +9 -0
  186. data/test/test_selector.rb +75 -0
  187. data/test/test_style.rb +70 -0
  188. data/test/test_style_length.rb +38 -0
  189. data/test/test_style_length2.rb +50 -0
  190. data/test/test_style_length4.rb +56 -0
  191. data/test/test_view.rb +97 -23
  192. data/test/test_window.rb +54 -46
  193. metadata +205 -84
  194. data/.doc/ext/reflex/defs.cpp +0 -8
  195. data/.doc/ext/reflex/key.cpp +0 -122
  196. data/.doc/ext/reflex/points.cpp +0 -151
  197. data/.gitignore +0 -14
  198. data/ChangeLog +0 -8
  199. data/examples/hello/.gitignore +0 -2
  200. data/examples/hello/Rakefile +0 -41
  201. data/examples/hello/main.cpp +0 -18
  202. data/examples/ruby/app.rb +0 -13
  203. data/examples/ruby/checker.rb +0 -41
  204. data/examples/ruby/fps.rb +0 -49
  205. data/examples/ruby/grid.rb +0 -65
  206. data/examples/ruby/views.rb +0 -88
  207. data/examples/ruby/visuals.rb +0 -27
  208. data/ext/reflex/defs.cpp +0 -8
  209. data/ext/reflex/key.cpp +0 -129
  210. data/ext/reflex/points.cpp +0 -161
  211. data/include/reflex/ruby/key.h +0 -39
  212. data/include/reflex/ruby/points.h +0 -39
  213. data/lib/reflex/visuals/string.rb +0 -53
  214. data/src/cocoa/application.mm +0 -101
  215. data/src/cocoa/cocoaapplication.h +0 -21
  216. data/src/cocoa/cocoawindow.h +0 -46
  217. data/src/cocoa/cocoawindow.mm +0 -230
  218. data/src/cocoa/defs.h +0 -34
  219. data/src/cocoa/defs.mm +0 -87
  220. data/src/cocoa/window.mm +0 -148
  221. data/src/cocoa/windowdata.h +0 -56
  222. data/src/defs.cpp +0 -47
  223. data/src/helper.h +0 -12
  224. data/src/reflex.cpp +0 -43
  225. /data/{README → README.md} +0 -0
data/src/osx/window.mm ADDED
@@ -0,0 +1,308 @@
1
+ // -*- objc -*-
2
+ #include "reflex/window.h"
3
+
4
+
5
+ #import <Cocoa/Cocoa.h>
6
+ #include <rays/bounds.h>
7
+ #include "reflex/event.h"
8
+ #include "reflex/exception.h"
9
+ #include "window_data.h"
10
+ #import "native_window.h"
11
+
12
+
13
+ namespace Reflex
14
+ {
15
+
16
+
17
+ void set_window (View* view, Window* window);
18
+
19
+ void call_key_event (View* v, const KeyEvent& e);
20
+
21
+ void call_pointer_event (View* v, const PointerEvent& e);
22
+
23
+ void call_wheel_event (View* v, const WheelEvent& e);
24
+
25
+
26
+ void
27
+ set_focus (Window* window, View* view)
28
+ {
29
+ if (!window || !view)
30
+ argument_error(__FILE__, __LINE__);
31
+
32
+ View* current = window->self->focus.get();
33
+ if (current == view) return;
34
+
35
+ window->self->focus.reset(view);
36
+
37
+ FocusEvent e(FocusEvent::BLUR, view, current);
38
+
39
+ if (current)
40
+ {
41
+ current->on_blur(&e);
42
+ current->redraw();
43
+ }
44
+
45
+ if (view)
46
+ {
47
+ e.type = FocusEvent::FOCUS;
48
+ view->on_focus(&e);
49
+ view->redraw();
50
+ }
51
+ }
52
+
53
+ void
54
+ register_capture (View* view)
55
+ {
56
+ if (!view)
57
+ argument_error(__FILE__, __LINE__);
58
+
59
+ const Window* window = view->window();
60
+ if (!window)
61
+ invalid_state_error(__FILE__, __LINE__, "this view does not belong to any Window.");
62
+
63
+ window->self->capturing_views[view] = true;
64
+ }
65
+
66
+ void
67
+ unregister_capture (View* view)
68
+ {
69
+ if (!view)
70
+ argument_error(__FILE__, __LINE__);
71
+
72
+ const Window* window = view->window();
73
+ if (!window) return;
74
+
75
+ CapturingViews::iterator it = window->self->capturing_views.find(view);
76
+ if (it == window->self->capturing_views.end()) return;
77
+
78
+ it->second = false;
79
+ }
80
+
81
+ void
82
+ cleanup_capturing_views (Window* window)
83
+ {
84
+ CapturingViews::iterator end = window->self->capturing_views.end();
85
+ for (CapturingViews::iterator it = window->self->capturing_views.begin(); it != end;)
86
+ {
87
+ CapturingViews::iterator t = it++;
88
+ if (!t->second) window->self->capturing_views.erase(t);
89
+ }
90
+ }
91
+
92
+
93
+ Window::Window ()
94
+ {
95
+ [[[NativeWindow alloc] init] bind: this];
96
+
97
+ set_window(self->root.get(), this);
98
+
99
+ self->painter.canvas(0, 0, 1, 1);
100
+ }
101
+
102
+ Window::~Window ()
103
+ {
104
+ //close();
105
+
106
+ set_window(self->root.get(), NULL);
107
+ }
108
+
109
+ void
110
+ Window::show ()
111
+ {
112
+ if (!*this)
113
+ invalid_state_error(__FILE__, __LINE__);
114
+
115
+ if (--self->hide_count == 0)
116
+ [self->native makeKeyAndOrderFront: nil];
117
+ }
118
+
119
+ void
120
+ Window::hide ()
121
+ {
122
+ if (!*this)
123
+ invalid_state_error(__FILE__, __LINE__);
124
+
125
+ if (++self->hide_count == 1)
126
+ [self->native orderOut: self->native];
127
+ }
128
+
129
+ void
130
+ Window::close ()
131
+ {
132
+ if (!*this)
133
+ invalid_state_error(__FILE__, __LINE__);
134
+
135
+ [self->native close];
136
+ }
137
+
138
+ void
139
+ Window::redraw ()
140
+ {
141
+ if (!*this)
142
+ invalid_state_error(__FILE__, __LINE__);
143
+
144
+ self->redraw = true;
145
+ }
146
+
147
+ void
148
+ Window::set_title (const char* title)
149
+ {
150
+ if (!title)
151
+ argument_error(__FILE__, __LINE__);
152
+
153
+ if (!*this)
154
+ invalid_state_error(__FILE__, __LINE__);
155
+
156
+ [self->native setTitle: [NSString stringWithUTF8String: title]];
157
+ }
158
+
159
+ const char*
160
+ Window::title () const
161
+ {
162
+ if (!*this)
163
+ invalid_state_error(__FILE__, __LINE__);
164
+
165
+ NSString* s = [self->native title];
166
+ self->title_tmp = s ? [s UTF8String] : "";
167
+ return self->title_tmp.c_str();
168
+ }
169
+
170
+ void
171
+ Window::set_frame (coord x, coord y, coord width, coord height)
172
+ {
173
+ if (!*this)
174
+ invalid_state_error(__FILE__, __LINE__);
175
+
176
+ NSRect frame =
177
+ [NativeWindow frameRectForContentRect: NSMakeRect(x, y, width, height)];
178
+ [self->native setFrame: frame display: NO animate: NO];
179
+ }
180
+
181
+ void
182
+ Window::set_frame (const Bounds& bounds)
183
+ {
184
+ set_frame(bounds.x, bounds.y, bounds.width, bounds.height);
185
+ }
186
+
187
+ Bounds
188
+ Window::frame () const
189
+ {
190
+ if (!*this)
191
+ invalid_state_error(__FILE__, __LINE__);
192
+
193
+ NSRect rect = [self->native contentRectForFrameRect: [self->native frame]];
194
+ return Bounds(
195
+ rect.origin.x,
196
+ rect.origin.y,
197
+ rect.size.width,
198
+ rect.size.height);
199
+ }
200
+
201
+ bool
202
+ Window::hidden () const
203
+ {
204
+ if (!*this)
205
+ invalid_state_error(__FILE__, __LINE__);
206
+
207
+ return self->hide_count > 0;
208
+ }
209
+
210
+ View*
211
+ Window::root ()
212
+ {
213
+ if (!*this)
214
+ invalid_state_error(__FILE__, __LINE__);
215
+
216
+ return self->root.get();
217
+ }
218
+
219
+ View*
220
+ Window::focus ()
221
+ {
222
+ if (!*this)
223
+ invalid_state_error(__FILE__, __LINE__);
224
+
225
+ return self->focus.get();
226
+ }
227
+
228
+ Painter*
229
+ Window::painter ()
230
+ {
231
+ if (!*this)
232
+ invalid_state_error(__FILE__, __LINE__);
233
+
234
+ return &self->painter;
235
+ }
236
+
237
+ void
238
+ Window::on_key (KeyEvent* e)
239
+ {
240
+ if (!e)
241
+ argument_error(__FILE__, __LINE__);
242
+
243
+ switch (e->type)
244
+ {
245
+ case KeyEvent::DOWN: on_key_down(e); break;
246
+ case KeyEvent::UP: on_key_up(e); break;
247
+ case KeyEvent::NONE: break;
248
+ }
249
+
250
+ CapturingViews::iterator end = self->capturing_views.end();
251
+ for (CapturingViews::iterator it = self->capturing_views.begin(); it != end; ++it)
252
+ {
253
+ KeyEvent event = *e;
254
+ event.capture = true;
255
+ call_key_event(const_cast<View*>(it->first.get()), event);
256
+ }
257
+
258
+ if (self->focus)
259
+ call_key_event(self->focus.get(), *e);
260
+
261
+ cleanup_capturing_views(this);
262
+ }
263
+
264
+ void
265
+ Window::on_pointer (PointerEvent* e)
266
+ {
267
+ if (!e)
268
+ argument_error(__FILE__, __LINE__);
269
+
270
+ switch (e->type)
271
+ {
272
+ case PointerEvent::DOWN: on_pointer_down(e); break;
273
+ case PointerEvent::UP: on_pointer_up(e); break;
274
+ case PointerEvent::MOVE: on_pointer_move(e); break;
275
+ case PointerEvent::NONE: break;
276
+ }
277
+
278
+ CapturingViews::iterator end = self->capturing_views.end();
279
+ for (CapturingViews::iterator it = self->capturing_views.begin(); it != end; ++it)
280
+ {
281
+ PointerEvent event = *e;
282
+ event.capture = true;
283
+ for (size_t i = 0; i < event.size; ++i)
284
+ event[i] = it->first.get()->from_window(event[i]);
285
+ call_pointer_event(const_cast<View*>(it->first.get()), event);
286
+ }
287
+
288
+ call_pointer_event(root(), *e);
289
+
290
+ cleanup_capturing_views(this);
291
+ }
292
+
293
+ void
294
+ Window::on_wheel (WheelEvent* e)
295
+ {
296
+ if (!e)
297
+ argument_error(__FILE__, __LINE__);
298
+
299
+ call_wheel_event(root(), *e);
300
+ }
301
+
302
+ Window::operator bool () const
303
+ {
304
+ return self && *self;
305
+ }
306
+
307
+
308
+ }// Reflex
@@ -0,0 +1,75 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __REFLEX_OSX_WINDOW_DATA_H__
4
+ #define __REFLEX_OSX_WINDOW_DATA_H__
5
+
6
+
7
+ #include <map>
8
+ #include <xot/time.h>
9
+ #include <rays/point.h>
10
+ #include <rays/painter.h>
11
+ #include <reflex/window.h>
12
+ #include <reflex/view.h>
13
+
14
+
15
+ @class NativeWindow;
16
+
17
+
18
+ namespace Reflex
19
+ {
20
+
21
+
22
+ typedef std::map<View::Ref, bool> CapturingViews;
23
+
24
+
25
+ struct Window::Data
26
+ {
27
+
28
+ NativeWindow* native;
29
+
30
+ int hide_count;
31
+
32
+ bool redraw;
33
+
34
+ Painter painter;
35
+
36
+ View::Ref root, focus;
37
+
38
+ Rays::Point prev_position, prev_size;
39
+
40
+ double prev_time_update, prev_time_draw, prev_fps;
41
+
42
+ String title_tmp;
43
+
44
+ CapturingViews capturing_views;
45
+
46
+ Data ()
47
+ : native(nil), hide_count(1), redraw(true), root(create_root_view()), prev_fps(0)
48
+ {
49
+ prev_time_update = prev_time_draw = Xot::time();
50
+ }
51
+
52
+ operator bool () const
53
+ {
54
+ return native;
55
+ }
56
+
57
+ bool operator ! () const
58
+ {
59
+ return !operator bool();
60
+ }
61
+
62
+ static View* create_root_view ()
63
+ {
64
+ View* v = new View;
65
+ v->set_name("ROOT");
66
+ return v;
67
+ }
68
+
69
+ };// Window::Data
70
+
71
+
72
+ }// Reflex
73
+
74
+
75
+ #endif//EOH
data/src/selector.cpp ADDED
@@ -0,0 +1,121 @@
1
+ #include "reflex/selector.h"
2
+
3
+
4
+ #include "reflex/exception.h"
5
+
6
+
7
+ namespace Reflex
8
+ {
9
+
10
+
11
+ struct Selector::Data
12
+ {
13
+
14
+ String name;
15
+
16
+ TagSet tags;
17
+
18
+ bool operator == (const Data& rhs)
19
+ {
20
+ return name == rhs.name && tags == rhs.tags;
21
+ }
22
+
23
+ };// Selector::Data
24
+
25
+
26
+ Selector::Selector (const char* name)
27
+ {
28
+ if (name) set_name(name);
29
+ }
30
+
31
+ void
32
+ Selector::set_name (const char* name)
33
+ {
34
+ self->name = name ? name : "";
35
+ }
36
+
37
+ const char*
38
+ Selector::name () const
39
+ {
40
+ return self->name.empty() ? NULL : self->name.c_str();
41
+ }
42
+
43
+ void
44
+ Selector::add_tag (const char* tag)
45
+ {
46
+ if (!tag || *tag == '\0')
47
+ argument_error(__FILE__, __LINE__);
48
+
49
+ iterator it = self->tags.find(tag);
50
+ if (it != self->tags.end()) return;
51
+
52
+ self->tags.insert(tag);
53
+ }
54
+
55
+ void
56
+ Selector::remove_tag (const char* tag)
57
+ {
58
+ if (!tag || *tag == '\0')
59
+ argument_error(__FILE__, __LINE__);
60
+
61
+ iterator it = self->tags.find(tag);
62
+ if (it == self->tags.end()) return;
63
+
64
+ self->tags.erase(it);
65
+ }
66
+
67
+ Selector::iterator
68
+ Selector::begin ()
69
+ {
70
+ return self->tags.begin();
71
+ }
72
+
73
+ Selector::const_iterator
74
+ Selector::begin () const
75
+ {
76
+ return self->tags.begin();
77
+ }
78
+
79
+ Selector::iterator
80
+ Selector::end ()
81
+ {
82
+ return self->tags.end();
83
+ }
84
+
85
+ Selector::const_iterator
86
+ Selector::end () const
87
+ {
88
+ return self->tags.end();
89
+ }
90
+
91
+ bool
92
+ Selector::match (const This& obj) const
93
+ {
94
+ if (self->name.empty() && self->tags.empty())
95
+ return false;
96
+
97
+ const TagSet& obj_tags = obj.self->tags;
98
+ const_iterator obj_end = obj_tags.end();
99
+
100
+ iterator end = this->end();
101
+ for (iterator it = begin(); it != end; ++it)
102
+ if (obj_tags.find(*it) == obj_end)
103
+ return false;
104
+
105
+ return self->name.empty() || self->name == obj.self->name;
106
+ }
107
+
108
+ bool
109
+ operator == (const Selector& lhs, const Selector& rhs)
110
+ {
111
+ return *lhs.self == *rhs.self;
112
+ }
113
+
114
+ bool
115
+ operator != (const Selector& lhs, const Selector& rhs)
116
+ {
117
+ return !operator==(lhs, rhs);
118
+ }
119
+
120
+
121
+ }// Reflex