reflexion 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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