sws 0.4

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 (158) hide show
  1. data/doc/DOC.otl +34 -0
  2. data/doc/Makefile +13 -0
  3. data/doc/architecture.dia +0 -0
  4. data/doc/docbook/architecture.png +0 -0
  5. data/doc/docbook/concepts.docbook +474 -0
  6. data/doc/docbook/installation.docbook +57 -0
  7. data/doc/docbook/introduction.docbook +130 -0
  8. data/doc/docbook/sws_manual.docbook +35 -0
  9. data/doc/docbook/todo.docbook +38 -0
  10. data/doc/docbook/tutorial.docbook +594 -0
  11. data/examples/README +1 -0
  12. data/examples/addressbook/CardBrowse/CardBrowse.html +43 -0
  13. data/examples/addressbook/CardBrowse/CardBrowse.rb +65 -0
  14. data/examples/addressbook/CardBrowse/CardBrowse.sws +92 -0
  15. data/examples/addressbook/Login/LoginPage.html +12 -0
  16. data/examples/addressbook/Login/LoginPage.rb +19 -0
  17. data/examples/addressbook/Login/LoginPage.sws +15 -0
  18. data/examples/addressbook/README +1 -0
  19. data/examples/addressbook/addressbook.rb +70 -0
  20. data/examples/addressbook/application.yaml +8 -0
  21. data/examples/addressbook/db.yaml +7 -0
  22. data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.html +11 -0
  23. data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.rb +21 -0
  24. data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.sws +25 -0
  25. data/examples/component_demo/ComponentDemo.rb +21 -0
  26. data/examples/component_demo/ConditionalDemo/ConditionalDemo.html +18 -0
  27. data/examples/component_demo/ConditionalDemo/ConditionalDemo.rb +2 -0
  28. data/examples/component_demo/ConditionalDemo/ConditionalDemo.sws +22 -0
  29. data/examples/component_demo/FileUploadDemo/FileUploadDemo.html +10 -0
  30. data/examples/component_demo/FileUploadDemo/FileUploadDemo.rb +9 -0
  31. data/examples/component_demo/FileUploadDemo/FileUploadDemo.sws +33 -0
  32. data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.html +12 -0
  33. data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.rb +21 -0
  34. data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.sws +40 -0
  35. data/examples/component_demo/FormListsDemo/FormListsDemo.html +11 -0
  36. data/examples/component_demo/FormListsDemo/FormListsDemo.rb +37 -0
  37. data/examples/component_demo/FormListsDemo/FormListsDemo.sws +47 -0
  38. data/examples/component_demo/GenericDemo/GenericDemo.html +4 -0
  39. data/examples/component_demo/GenericDemo/GenericDemo.rb +2 -0
  40. data/examples/component_demo/GenericDemo/GenericDemo.sws +10 -0
  41. data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.html +8 -0
  42. data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.rb +20 -0
  43. data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.sws +19 -0
  44. data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.html +11 -0
  45. data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.rb +2 -0
  46. data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.sws +14 -0
  47. data/examples/component_demo/PageWrapper/PageWrapper.html +23 -0
  48. data/examples/component_demo/PageWrapper/PageWrapper.rb +2 -0
  49. data/examples/component_demo/PageWrapper/PageWrapper.sws +42 -0
  50. data/examples/component_demo/README +1 -0
  51. data/examples/component_demo/RepetitionDemo/RepetitionDemo.html +13 -0
  52. data/examples/component_demo/RepetitionDemo/RepetitionDemo.rb +19 -0
  53. data/examples/component_demo/RepetitionDemo/RepetitionDemo.sws +20 -0
  54. data/examples/component_demo/StringDemo/StringDemo.html +5 -0
  55. data/examples/component_demo/StringDemo/StringDemo.rb +16 -0
  56. data/examples/component_demo/StringDemo/StringDemo.sws +14 -0
  57. data/examples/component_demo/application.yaml +28 -0
  58. data/examples/component_demo/poweredby.jpg +0 -0
  59. data/examples/component_demo/style.css +1 -0
  60. data/examples/movies/Menu/Menu.html +3 -0
  61. data/examples/movies/Menu/Menu.rb +7 -0
  62. data/examples/movies/Menu/Menu.sws +7 -0
  63. data/examples/movies/MovieBrowse/MovieBrowse.html +68 -0
  64. data/examples/movies/MovieBrowse/MovieBrowse.rb +178 -0
  65. data/examples/movies/MovieBrowse/MovieBrowse.sws +127 -0
  66. data/examples/movies/README +1 -0
  67. data/examples/movies/UserBrowse/UserBrowse.html +50 -0
  68. data/examples/movies/UserBrowse/UserBrowse.rb +69 -0
  69. data/examples/movies/UserBrowse/UserBrowse.sws +49 -0
  70. data/examples/movies/application.yaml +11 -0
  71. data/examples/movies/da.rb +36 -0
  72. data/examples/movies/dbmovies.rb +44 -0
  73. data/examples/movies/frameworks/TestFramework/framework.yaml +4 -0
  74. data/examples/movies/frameworks/TestFramework/resources/im1.jpg +0 -0
  75. data/examples/movies/images/pbr1b.jpg +0 -0
  76. data/examples/movies/movies.rb +28 -0
  77. data/examples/movies/movies.sds +119 -0
  78. data/examples/movies/movies.sqlite +0 -0
  79. data/examples/movies/movies_mysql.sql +28 -0
  80. data/examples/movies/movies_postgres.sql +27 -0
  81. data/examples/movies/movies_sqlite.sql +28 -0
  82. data/lib/sws.rb +89 -0
  83. data/lib/sws/Core/components/CheckBox/CheckBox.api +5 -0
  84. data/lib/sws/Core/components/CheckBox/CheckBox.rb +45 -0
  85. data/lib/sws/Core/components/CheckBoxList/CheckBoxList.api +13 -0
  86. data/lib/sws/Core/components/CheckBoxList/CheckBoxList.rb +54 -0
  87. data/lib/sws/Core/components/Conditional/Conditional.api +3 -0
  88. data/lib/sws/Core/components/Conditional/Conditional.html +1 -0
  89. data/lib/sws/Core/components/Conditional/Conditional.rb +39 -0
  90. data/lib/sws/Core/components/Conditional/Conditional.sws +2 -0
  91. data/lib/sws/Core/components/Content/Content.rb +18 -0
  92. data/lib/sws/Core/components/ExceptionPage/ExceptionPage.html +13 -0
  93. data/lib/sws/Core/components/ExceptionPage/ExceptionPage.rb +18 -0
  94. data/lib/sws/Core/components/ExceptionPage/ExceptionPage.sws +16 -0
  95. data/lib/sws/Core/components/FileUpload/FileUpload.api +16 -0
  96. data/lib/sws/Core/components/FileUpload/FileUpload.rb +62 -0
  97. data/lib/sws/Core/components/Form/Form.api +9 -0
  98. data/lib/sws/Core/components/Form/Form.html +3 -0
  99. data/lib/sws/Core/components/Form/Form.rb +55 -0
  100. data/lib/sws/Core/components/Form/Form.sws +12 -0
  101. data/lib/sws/Core/components/GenericContainer/GenericContainer.api +10 -0
  102. data/lib/sws/Core/components/GenericContainer/GenericContainer.html +1 -0
  103. data/lib/sws/Core/components/GenericContainer/GenericContainer.rb +39 -0
  104. data/lib/sws/Core/components/GenericContainer/GenericContainer.sws +12 -0
  105. data/lib/sws/Core/components/GenericElement/GenericElement.api +10 -0
  106. data/lib/sws/Core/components/GenericElement/GenericElement.rb +34 -0
  107. data/lib/sws/Core/components/HiddenField/HiddenField.api +7 -0
  108. data/lib/sws/Core/components/HiddenField/HiddenField.rb +37 -0
  109. data/lib/sws/Core/components/Hyperlink/Hyperlink.api +13 -0
  110. data/lib/sws/Core/components/Hyperlink/Hyperlink.html +1 -0
  111. data/lib/sws/Core/components/Hyperlink/Hyperlink.rb +102 -0
  112. data/lib/sws/Core/components/Hyperlink/Hyperlink.sws +12 -0
  113. data/lib/sws/Core/components/Image/Image.api +11 -0
  114. data/lib/sws/Core/components/Image/Image.rb +49 -0
  115. data/lib/sws/Core/components/ImageButton/ImageButton.api +16 -0
  116. data/lib/sws/Core/components/ImageButton/ImageButton.rb +76 -0
  117. data/lib/sws/Core/components/Link/Link.api +11 -0
  118. data/lib/sws/Core/components/Link/Link.rb +39 -0
  119. data/lib/sws/Core/components/PasswordField/PasswordField.api +7 -0
  120. data/lib/sws/Core/components/PasswordField/PasswordField.rb +41 -0
  121. data/lib/sws/Core/components/RadioButton/RadioButton.api +7 -0
  122. data/lib/sws/Core/components/RadioButton/RadioButton.rb +44 -0
  123. data/lib/sws/Core/components/RadioButtonList/RadioButtonList.api +20 -0
  124. data/lib/sws/Core/components/RadioButtonList/RadioButtonList.rb +76 -0
  125. data/lib/sws/Core/components/Repetition/Repetition.api +10 -0
  126. data/lib/sws/Core/components/Repetition/Repetition.html +1 -0
  127. data/lib/sws/Core/components/Repetition/Repetition.rb +137 -0
  128. data/lib/sws/Core/components/Repetition/Repetition.sws +2 -0
  129. data/lib/sws/Core/components/ResetButton/ResetButton.api +5 -0
  130. data/lib/sws/Core/components/ResetButton/ResetButton.rb +28 -0
  131. data/lib/sws/Core/components/Select/Select.api +24 -0
  132. data/lib/sws/Core/components/Select/Select.rb +57 -0
  133. data/lib/sws/Core/components/String/String.api +5 -0
  134. data/lib/sws/Core/components/String/String.rb +28 -0
  135. data/lib/sws/Core/components/SubmitButton/SubmitButton.api +6 -0
  136. data/lib/sws/Core/components/SubmitButton/SubmitButton.rb +53 -0
  137. data/lib/sws/Core/components/TextArea/TextArea.api +9 -0
  138. data/lib/sws/Core/components/TextArea/TextArea.rb +28 -0
  139. data/lib/sws/Core/components/TextField/TextField.api +9 -0
  140. data/lib/sws/Core/components/TextField/TextField.rb +46 -0
  141. data/lib/sws/Core/framework.yaml +25 -0
  142. data/lib/sws/JSComponents/components/JSMenu/JSMenu.api +5 -0
  143. data/lib/sws/JSComponents/components/JSMenu/JSMenu.html +58 -0
  144. data/lib/sws/JSComponents/components/JSMenu/JSMenu.rb +34 -0
  145. data/lib/sws/JSComponents/components/JSMenu/JSMenu.sws +37 -0
  146. data/lib/sws/JSComponents/framework.yaml +3 -0
  147. data/lib/sws/adaptor.rb +334 -0
  148. data/lib/sws/application.rb +604 -0
  149. data/lib/sws/component.rb +656 -0
  150. data/lib/sws/cookie.rb +27 -0
  151. data/lib/sws/direct_action.rb +38 -0
  152. data/lib/sws/extensions.rb +49 -0
  153. data/lib/sws/parsers.rb +374 -0
  154. data/lib/sws/request.rb +308 -0
  155. data/lib/sws/response.rb +70 -0
  156. data/lib/sws/session.rb +195 -0
  157. data/lib/sws/slot.rb +198 -0
  158. metadata +263 -0
@@ -0,0 +1,16 @@
1
+ value:
2
+ default: "'Submit'"
3
+
4
+ action:
5
+
6
+ src:
7
+
8
+ framework:
9
+
10
+ resource:
11
+
12
+ alt:
13
+
14
+ title:
15
+
16
+ other_tag_string:
@@ -0,0 +1,76 @@
1
+ module SWS
2
+
3
+ # Represents <INPUT type=image HTML tag
4
+ # Bindings:
5
+ # - value (required,default: "Submit") - string to be displayed on the button.
6
+ # - action - method to be called on button click
7
+ # - other_tag_string - generic string to add to the tag
8
+ # - src - URL to image source
9
+ # - resource - name of the resource to be used as the image
10
+ # - framework - the framework the resource resides in
11
+ class ImageButton < FormElement
12
+
13
+
14
+ def initialize (*args)
15
+ super
16
+ @action = nil
17
+ end
18
+
19
+ # Overriden method from Component class - sets the action to perform if
20
+ # the "value" parameter is not empty
21
+ def update_binding ( key, value )
22
+
23
+ #TODO: make these params accessible by user
24
+ if ( key == "x" || key == "y" )
25
+ @action = @slots["action"].bound_object()
26
+ end
27
+
28
+ end
29
+
30
+
31
+ # If the action has been set up (see #update_binding( key,value )) it is
32
+ # called now. Otherwise just nil is returned.
33
+ def perform_action ()
34
+
35
+ if ( @action )
36
+ return @action.call()
37
+ else
38
+ return nil
39
+ end
40
+
41
+ end
42
+
43
+
44
+ # Appends #generate_html() output to response
45
+ def append_to_response ( response )
46
+ response << generate_html()
47
+ end
48
+
49
+
50
+ # Generates HTML output containing <INPUT type="submit" tag
51
+ def generate_html ()
52
+
53
+ string = "<INPUT TYPE=\"image\" NAME=\"#{element_name()}\" VALUE=\"#{@slots["value"].value}\"#{generic_attr_string()}"
54
+ if ( slot_bound?( "resource" ) )
55
+ framework = slot_bound?("framework") ? @slots["framework"].value : "app"
56
+ src = app().adaptor.base_path() + app().resource_request_handler_key + "/" + framework + "/" + @slots["resource"].value
57
+ elsif ( slot_bound?("src") )
58
+ src = @slots["src"].value()
59
+ end
60
+
61
+ string << " src=\"#{src}\""
62
+
63
+ ["alt", "title"].each do |attr|
64
+ if ( slot_bound?(attr) )
65
+ string << " #{@slots[attr].to_tag_attribute}"
66
+ end
67
+ end
68
+
69
+ string << ">"
70
+ return string
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
@@ -0,0 +1,11 @@
1
+ href:
2
+
3
+ rel:
4
+
5
+ type:
6
+
7
+ resource:
8
+
9
+ framework:
10
+
11
+ other_tag_string:
@@ -0,0 +1,39 @@
1
+ module SWS
2
+
3
+ # Represents <LINK tag
4
+ # Bindings:
5
+ # - href (required) - href attribute of the tag
6
+ # - rel - rel attribute of the tag
7
+ # - type - type attribute of the tag
8
+ # - other_tag_string - generic string to add to the tag
9
+ class Link < Component
10
+
11
+ def container? ()
12
+ return false
13
+ end
14
+
15
+
16
+ def append_to_response ( response )
17
+ response << generate_html()
18
+ end
19
+
20
+
21
+ def generate_html ()
22
+
23
+ string = "<LINK"
24
+ if ( slot_bound?( "resource" ) )
25
+ framework = slot_bound?("framework") ? @slots["framework"].value : "app"
26
+ href = app().adaptor.base_path() + app().resource_request_handler_key + "/" + framework + "/" + @slots["resource"].value
27
+ else
28
+ href = @slots["href"].value
29
+ end
30
+ string << " href=\"#{href}\""
31
+ string << bound_slot_string( "rel","type" )
32
+ string << generic_attr_string() << ">"
33
+ return string
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,7 @@
1
+ value:
2
+ required: true
3
+ settable: true
4
+
5
+ format:
6
+
7
+ other_tag_string:
@@ -0,0 +1,41 @@
1
+ module SWS
2
+
3
+ # Represents tag <INPUT type=password
4
+ # Bindings:
5
+ # - value (required,settable) - contents of the password field
6
+ # - format - method of "value" object to be used before updating it
7
+ # (eg. you can use to_i() method to get Fixnum object)
8
+ # - other_tag_string - generic string to add to the tag
9
+ class PasswordField < FormElement
10
+
11
+
12
+ def generate_html ()
13
+ return "<INPUT TYPE=\"password\" NAME=\"#{element_name()}.value\" VALUE=\"#{@slots["value"].value}\"#{generic_attr_string()}>"
14
+ end
15
+
16
+
17
+ def append_to_response ( response )
18
+ response << generate_html()
19
+ end
20
+
21
+
22
+ # If the "format" slot value has been set, uses it to format "value" slot
23
+ # value
24
+ def update_binding ( key,value )
25
+
26
+ if ( key == "value" )
27
+ if ( slot_bound?("format") )
28
+ @slots["value"].value = value.method( @slots["format"].value ).call()
29
+ else
30
+ @slots["value"].value = value
31
+ end
32
+ else
33
+ #TODO: not sure if necessary - there is no more settable slots beside "value"
34
+ super
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,7 @@
1
+ checked:
2
+ required: true
3
+ settable: true
4
+
5
+ disabled:
6
+
7
+ other_tag_string:
@@ -0,0 +1,44 @@
1
+ module SWS
2
+
3
+ # Represens <INPUT type=radio HTML tag.
4
+ # Bindings:
5
+ # - checked (required, settable) - if true, the radiobutton will be checked
6
+ # - disabled - if true, the radiobutton will be rendered inactive.
7
+ # - other_tag_string - generic string to add to the tag
8
+ class RadioButton < FormElement
9
+
10
+
11
+ def process_bindings ()
12
+
13
+ if ( @parameters["checked"] == "on" )
14
+ @slots["checked"].value = true
15
+ else
16
+ @slots["checked"].value = false
17
+ end
18
+
19
+ end
20
+
21
+
22
+ def append_to_response ( response )
23
+ response << generate_html()
24
+ end
25
+
26
+
27
+ # Generates HTML output for radiobutton form element
28
+ def generate_html ()
29
+
30
+ string = "<INPUT type=\"radio\" name=\"#{element_name()}.checked\""
31
+ if ( @slots["checked"].value() == true || @slots["checked"].value() == "true" )
32
+ string << " checked"
33
+ end
34
+ if ( slot_bound?( "disabled" ) && @slots["disabled"] )
35
+ string << " disabled"
36
+ end
37
+ string << generic_attr_string() << ">"
38
+ return string
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,20 @@
1
+ list:
2
+ required: true
3
+
4
+ item:
5
+ required: true
6
+ settable: true
7
+
8
+ display_string:
9
+
10
+ selection:
11
+ required: true
12
+ settable: true
13
+
14
+ prefix:
15
+
16
+ suffix:
17
+
18
+ disabled:
19
+
20
+ other_tag_string:
@@ -0,0 +1,76 @@
1
+ module SWS
2
+
3
+ # Represents a list of radiobuttons with the same name.
4
+ # Bindings:
5
+ # - list (required) - array of object to be displayed in the form of
6
+ # radiobuttons
7
+ # - item (required,settable) - an object to use as list iterator
8
+ # - selection (required,settable) - object selected from radiobutton list
9
+ # - display_string - string to display (if not set, the item itself will be
10
+ # used)
11
+ # - prefix - HTML code to add before each radiobutton
12
+ # - suffix - HTML code to add after each radiobutton
13
+ # - disabled - if true, the radiobuttons will be inactive
14
+ # - other_tag_string - generic string to add to each <INPUT type=radiobutton
15
+ # tag
16
+ class RadioButtonList < ListElement
17
+
18
+
19
+ # Returns value of "selection" slot
20
+ def selection ()
21
+ return @slots["selection"].value()
22
+ end
23
+
24
+
25
+ # Sets the value of "selection" slot
26
+ def selection= ( selection )
27
+
28
+ if ( selection == nil )
29
+ @slots["selection"].value = nil
30
+ else
31
+ @slots["selection"].value = list[selection.to_i]
32
+ end
33
+
34
+ end
35
+
36
+
37
+ def process_bindings ()
38
+ self.selection = @parameters["selection"]
39
+ end
40
+
41
+
42
+ def generate_html ()
43
+
44
+ string = ""
45
+ generic_string = generic_attr_string()
46
+ list().each_index do |index|
47
+ item = list[index]
48
+ @slots["item"].value = item
49
+ if ( slot_bound?( "display_string" ) )
50
+ display_string = @slots["display_string"].value()
51
+ else
52
+ display_string = item
53
+ end
54
+ if ( slot_bound?( "prefix" ) )
55
+ string << @slots["prefix"].value()
56
+ end
57
+ string << "<INPUT type=\"radio\" name=\"#{element_name()}.selection\" value=#{index}"
58
+ if ( slot_bound?( "disabled" ) && @slots["disabled"].value() == true )
59
+ string << " disabled"
60
+ end
61
+ if ( selection == item )
62
+ string << " checked"
63
+ end
64
+ string << generic_string << ">\n"
65
+ string << display_string
66
+ if ( slot_bound?("suffix") )
67
+ string << @slots["suffix"].value()
68
+ end
69
+ end
70
+ return string
71
+
72
+ end
73
+
74
+ end
75
+
76
+ end
@@ -0,0 +1,10 @@
1
+ list:
2
+ required: true
3
+
4
+ item:
5
+ required: true
6
+ settable: true
7
+
8
+ index:
9
+ settable: true
10
+
@@ -0,0 +1 @@
1
+ <span sws="content"/>
@@ -0,0 +1,137 @@
1
+ module SWS
2
+
3
+ # Most complex component. Renders its content repeteadly - basing on
4
+ # list.each. Differs strongly from other components: instead of single
5
+ # @subcomponents array it has @subcomponent_array, where index is a number
6
+ # of iteration and value is subcomponent array for this iteration of list
7
+ # Then in various phases of request loop list is iterated and @subcomponents
8
+ # is set to proper value retrieved from @subcomponent_array - the phase is
9
+ # then repeated for each element in @subcomponent_array
10
+ # Bindings:
11
+ # - list (required) - array of object to iterate through
12
+ # - item (required, settable ) - object used as list iterator
13
+ # - index (settable) - an index of current item in list iterator
14
+ class Repetition < Component
15
+
16
+
17
+ def initialize ( name, request, parent, slots )
18
+ super
19
+ @subcomponent_array = Array.new
20
+ end
21
+
22
+
23
+ # Tokenizes binding - retrieves iteration number from binding name and calls
24
+ # super with @subcomponents set to proper @subcomponent_array[number] object
25
+ def tokenize_binding ( key,value )
26
+
27
+ if ( md = /^(\d+)\.(.*)$/.match( key ) ) #extract iteration number (must be present) and rest of binding
28
+ @subcomponents = @subcomponent_array [md[1].to_i]
29
+ super( md[2],value )
30
+ else #without dot - should never happen here (repetition has no settable bindings)
31
+ raise( "Cannot set parameter #{key} to value #{value} in Repetition" )
32
+ end
33
+
34
+ end
35
+
36
+
37
+ # Calls awake repeatedly for each element in @subcomponent_array
38
+ def awake ()
39
+
40
+ @list.each_index do |i|
41
+ @subcomponents = @subcomponent_array [i]
42
+ super
43
+ end
44
+
45
+ end
46
+
47
+
48
+ # Calls sleep repeatedly for each element in @subcomponent_array
49
+ def sleep ()
50
+
51
+ @list.each_index do |i|
52
+ @subcomponents = @subcomponent_array [i]
53
+ super
54
+ end
55
+
56
+ end
57
+
58
+
59
+ # Overriden method of the Component class - initializes elements of
60
+ # @subcomponent_array and calls super for each one of them
61
+ def create_component_tree ()
62
+
63
+ @list = @slots["list"].value()
64
+ @list.each_index do |i|
65
+ @slots["item"].value = @list[i]
66
+ if ( slot_bound?("index") )
67
+ @slots["index"].value = i
68
+ end
69
+ @subcomponent_array [i] = Array.new()
70
+ @subcomponents = @subcomponent_array [i]
71
+ super
72
+ end
73
+
74
+ end
75
+
76
+
77
+ # Performs action - again, calls super for each element of
78
+ # @subcomponent_array
79
+ def perform_action ()
80
+
81
+ @list.each_index do |i|
82
+
83
+ @slots["item"].value = @list[i]
84
+ if ( slot_bound?("index") )
85
+ @slots["index"].value = i
86
+ end
87
+ @subcomponents = @subcomponent_array[i]
88
+ #dirty hack to set bindings to proper values :)
89
+ @subcomponents.each { |com| com.process_bindings() }
90
+ next_page = super
91
+ return next_page if ( next_page )
92
+
93
+ end
94
+ return nil
95
+
96
+ end
97
+
98
+
99
+ # Processes bindings - calls super for.. guest what? :)
100
+ def process_bindings ()
101
+
102
+ @list.each_index do |i|
103
+ @slots["item"].value = @list[i]
104
+ if ( slot_bound?("index") )
105
+ @slots["index"].value = i
106
+ end
107
+ @subcomponents = @subcomponent_array[i]
108
+ super
109
+ end
110
+
111
+ end
112
+
113
+
114
+ # Calls super for each element of @subcomponent_array. Number of iteration
115
+ # is added to the name of the receiver.
116
+ def append_to_response ( response )
117
+
118
+ #store original name of the repetition
119
+ old_name = @name.dup()
120
+ @list.each_index do |i|
121
+ @slots["item"].value = @list[i]
122
+ if ( slot_bound?("index") )
123
+ @slots["index"].value = i
124
+ end
125
+ @subcomponents = @subcomponent_array[i]
126
+ # Add iteration number to the end of name - will be necessary in other phases
127
+ @name << ".#{i}"
128
+ super
129
+ # Revert name
130
+ @name = old_name.dup()
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+
137
+ end