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,2 @@
1
+ content:
2
+ _class: SWS::Content
@@ -0,0 +1,5 @@
1
+ value:
2
+ required: true
3
+ default: "'Reset'"
4
+
5
+ other_tag_string:
@@ -0,0 +1,28 @@
1
+ module SWS
2
+
3
+ # Represents <INPUT type=reset tag
4
+ # Bindings:
5
+ # - value (required, default: "Reset") - string to display on the button
6
+ # - other_tag_string - generic string to add to the tag
7
+ class ResetButton < FormElement
8
+
9
+
10
+ # Appends #generate_html() output to response
11
+ def append_to_response ( response )
12
+ response << generate_html()
13
+ end
14
+
15
+
16
+ # Generates HTML code for Reset button
17
+ def generate_html ()
18
+
19
+ string = "<INPUT type=\"reset\""
20
+ string << bound_slot_string( "value" )
21
+ string << generic_attr_string() << ">"
22
+ return string
23
+
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,24 @@
1
+ list:
2
+ required: true
3
+
4
+ item:
5
+ required: true
6
+ settable: true
7
+
8
+ display_string:
9
+
10
+ selections:
11
+ required: true
12
+ settable: true
13
+
14
+ size:
15
+ default: 5
16
+
17
+ multiple:
18
+ required: true
19
+
20
+ empty_string:
21
+
22
+ disabled:
23
+
24
+ other_tag_string:
@@ -0,0 +1,57 @@
1
+ module SWS
2
+
3
+ # Represents <SELECT> HTML tag
4
+ # Bindings:
5
+ # - list (required) - array of object to be displayed in the form of
6
+ # options
7
+ # - item (required,settable) - an object to use as list iterator
8
+ # - selections (required,settable) - object(s) selected from this element (if
9
+ # multiple objects are selected, array is returned here - otherwise the
10
+ # selected object itself)
11
+ # - display_string - string to display (if not set, the item itself will be
12
+ # used)
13
+ # - disabled - if true, the tag will be inactive
14
+ # - size (default: 5) - size attribute of the tag
15
+ # - multiple (required) - if true, multiple object can be selected
16
+ # - other_tag_string - generic string to add to the tag
17
+ class Select < MultipleSelectionList
18
+
19
+
20
+ def generate_html ()
21
+
22
+ string = "<SELECT name=\"#{element_name()}.selections\" "
23
+ string << @slots["size"].to_tag_attribute()
24
+ if ( @slots["multiple"].value() == true )
25
+ string << " multiple"
26
+ end
27
+ if ( slot_bound?( "disabled" ) && @slots["disabled"].value() == true )
28
+ string << " disabled"
29
+ end
30
+ string << generic_attr_string() << ">"
31
+ if ( slot_bound?( "empty_string" ) )
32
+ string << "<OPTION value=__empty_string>"
33
+ string << @slots["empty_string"].value()
34
+ string << "</OPTION>"
35
+ end
36
+ list().each_index do |index|
37
+ item = list[index]
38
+ @slots["item"].value = item
39
+ if ( slot_bound?( "display_string" ) )
40
+ display_string = @slots["display_string"].value()
41
+ else
42
+ display_string = item
43
+ end
44
+ string << "<OPTION value=#{index}"
45
+ if ( (selections().is_a?(Array) && selections().include?(item)) || (selections() == item) )
46
+ string << " selected"
47
+ end
48
+ string << ">#{display_string}</OPTION>"
49
+ end
50
+ string << "</SELECT>"
51
+ return string
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,5 @@
1
+ value:
2
+ required: true
3
+
4
+ escape_html:
5
+ default: true
@@ -0,0 +1,28 @@
1
+ module SWS
2
+
3
+ # Represents some text to be rendered literally in HTML. Very commonly used
4
+ # component.
5
+ # Bindings:
6
+ # - value (required) - string to display
7
+ class String < Component
8
+
9
+
10
+ def append_to_response ( response )
11
+
12
+ value = @slots["value"].value.to_s
13
+ if ( @slots["escape_html"].value )
14
+ value.gsub!( /</,"&lt;" )
15
+ value.gsub!( />/,"&gt;" )
16
+ end
17
+ response << value
18
+
19
+ end
20
+
21
+
22
+ def container? ()
23
+ return false
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,6 @@
1
+ value:
2
+ default: "'Submit'"
3
+
4
+ action:
5
+
6
+ other_tag_string:
@@ -0,0 +1,53 @@
1
+ module SWS
2
+
3
+ # Represents <INPUT type=submit 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
+ class SubmitButton < FormElement
9
+
10
+
11
+ def initialize (*args)
12
+ super
13
+ @action = nil
14
+ end
15
+
16
+ # Overriden method from Component class - sets the action to perform if
17
+ # the "value" parameter is not empty
18
+ def update_binding ( key, value )
19
+
20
+ if ( key == "value" )
21
+ @action = @slots["action"].bound_object()
22
+ end
23
+
24
+ end
25
+
26
+
27
+ # If the action has been set up (see #update_binding( key,value )) it is
28
+ # called now. Otherwise just nil is returned.
29
+ def perform_action ()
30
+
31
+ if ( @action )
32
+ return @action.call()
33
+ else
34
+ return nil
35
+ end
36
+
37
+ end
38
+
39
+
40
+ # Appends #generate_html() output to response
41
+ def append_to_response ( response )
42
+ response << generate_html()
43
+ end
44
+
45
+
46
+ # Generates HTML output containing <INPUT type="submit" tag
47
+ def generate_html ()
48
+ return "<INPUT TYPE=\"submit\" NAME=\"#{element_name()}.value\" VALUE=\"#{@slots["value"].value}\"#{generic_attr_string()}>"
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,9 @@
1
+ value:
2
+ required: true
3
+ settable: true
4
+
5
+ rows:
6
+
7
+ cols:
8
+
9
+ other_tag_string:
@@ -0,0 +1,28 @@
1
+ module SWS
2
+
3
+ # Represents <TEXTAREA> tag<br>
4
+ # Bindings:
5
+ # - value (required,settable) - contents of the tag
6
+ # - cols - number of textarea cols
7
+ # - rows - number of textarea rows
8
+ # - other_tag_string - generic string to add to the tag
9
+ class TextArea < FormElement
10
+
11
+
12
+ def append_to_response ( response )
13
+ response << generate_html()
14
+ end
15
+
16
+
17
+ def generate_html ()
18
+
19
+ string = "<TEXTAREA name=\"#{element_name()}.value\""
20
+ string << bound_slot_string( "cols","rows" )
21
+ string << "#{generic_attr_string()}>#{@slots["value"].value}</TEXTAREA>"
22
+ return string
23
+
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,9 @@
1
+ value:
2
+ required: true
3
+ settable: true
4
+
5
+ format:
6
+
7
+ other_tag_string:
8
+
9
+ size:
@@ -0,0 +1,46 @@
1
+ module SWS
2
+
3
+ # Represents tag <INPUT type=text
4
+ # Bindings:
5
+ # - value (required,settable) - contents of the textfield
6
+ # - format - method of "value" object to be used before updating it (eg. for a
7
+ # Float you can use to_i() method here to get Fixnum object)
8
+ # - other_tag_string - generic string to add to the tag
9
+ class TextField < FormElement
10
+
11
+
12
+ def generate_html ()
13
+
14
+ string = "<INPUT TYPE=\"text\" NAME=\"#{element_name()}.value\" VALUE=\"#{@slots["value"].value}\""
15
+ string << bound_slot_string( "size" )
16
+ string << "#{generic_attr_string()}>"
17
+ return string
18
+
19
+ end
20
+
21
+
22
+ def append_to_response ( response )
23
+ response << generate_html()
24
+ end
25
+
26
+
27
+ # If the "format" slot value has been set, uses it to format "value" slot
28
+ # value
29
+ def update_binding ( key,value )
30
+
31
+ if ( key == "value" )
32
+ if ( slot_bound?("format") )
33
+ @slots["value"].value = value.method( @slots["format"].value ).call()
34
+ else
35
+ @slots["value"].value = value
36
+ end
37
+ else
38
+ #TODO: not sure if necessary - there are no more settable slots beside "value"
39
+ super
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,25 @@
1
+ components:
2
+ SWS::CheckBox: components/CheckBox
3
+ SWS::CheckBoxList: components/CheckBoxList
4
+ SWS::Conditional: components/Conditional
5
+ SWS::Content: components/Content
6
+ SWS::FileUpload: components/FileUpload
7
+ SWS::Form: components/Form
8
+ SWS::GenericContainer: components/GenericContainer
9
+ SWS::GenericElement: components/GenericElement
10
+ SWS::HiddenField: components/HiddenField
11
+ SWS::Hyperlink: components/Hyperlink
12
+ SWS::Image: components/Image
13
+ SWS::ImageButton: components/ImageButton
14
+ SWS::Link: components/Link
15
+ SWS::PasswordField: components/PasswordField
16
+ SWS::RadioButton: components/RadioButton
17
+ SWS::RadioButtonList: components/RadioButtonList
18
+ SWS::Repetition: components/Repetition
19
+ SWS::ResetButton: components/ResetButton
20
+ SWS::Select: components/Select
21
+ SWS::String: components/String
22
+ SWS::SubmitButton: components/SubmitButton
23
+ SWS::TextArea: components/TextArea
24
+ SWS::TextField: components/TextField
25
+ SWS::ExceptionPage: components/ExceptionPage
@@ -0,0 +1,5 @@
1
+ actions:
2
+ required: true
3
+
4
+ menu_class:
5
+
@@ -0,0 +1,58 @@
1
+ <script language="javascript">
2
+ function doPopupMenu<span sws="menu_id_string"/>(event) {
3
+ if( document.menu_opened != 1 )
4
+ {
5
+ document.onmousedown = null;
6
+ document.menu_opened = 1;
7
+ var menu = document.getElementById("menu<span sws="menu_id_string"/>");
8
+
9
+ var X = 0;
10
+ var Y = 0;
11
+ // Gecko part
12
+ if( event.pageX != 0 )
13
+ X = event.pageX;
14
+ if( event.pageY != 0 )
15
+ X = event.pageY;
16
+ // IE part
17
+ // TODO: test it on IE ! (only tested on Firefox and Opera)
18
+ if( event.x != 0 )
19
+ X = event.x;
20
+ if( event.y != 0 )
21
+ Y = event.y;
22
+
23
+ menu.style.top = event.pageY+15;
24
+ menu.style.left = event.pageX;
25
+ menu.style.visibility = "visible";
26
+ document.menu_opened = 1;
27
+ }
28
+ }
29
+
30
+ function doCloseMenu<span sws="menu_id_string"/>() {
31
+ if ( document.menu_opened == 1 )
32
+ {
33
+ var menu = document.getElementById("menu<span sws="menu_id_string"/>");
34
+
35
+ menu.style.visibility = "hidden";
36
+ document.menu_opened = 0;
37
+ }
38
+ }
39
+
40
+ function toggleCloseMenu<span sws="menu_id_string"/>() {
41
+ if( document.menu_opened == 1) {
42
+ document.onmousedown = doCloseMenu<span sws="menu_id_string"/>
43
+ }
44
+ else
45
+ document.onmousedown = null;
46
+ }
47
+ </script>
48
+
49
+ <a sws="menu_link"><span sws="contento"></span></a>
50
+ <span sws="menu_div">
51
+ <table sws="menu_table">
52
+ <span sws="actions_repetition">
53
+ <tr><td>
54
+ <a sws="action_link"><span sws="action_string"></span></a>
55
+ </td></tr>
56
+ </span>
57
+ </table>
58
+ </span>
@@ -0,0 +1,34 @@
1
+ module JSComponents
2
+
3
+ class JSMenu < SWS::Component
4
+
5
+ synchronize_slot :actions
6
+ synchronize_slot :menu_class
7
+
8
+ attr_reader :actions, :menu_class
9
+
10
+ attr_accessor :action_cursor
11
+
12
+ def action_for_cursor
13
+ return action_cursor["action"].call()
14
+ end
15
+
16
+ def name_for_cursor
17
+ return action_cursor["name"]
18
+ end
19
+
20
+ def menu_link_js_events
21
+ return "onMouseDown=\"doPopupMenu#{menu_id()}(event);\" onMouseUp=\"toggleCloseMenu#{menu_id()}();\""
22
+ end
23
+
24
+ def menu_id
25
+ return self.object_id.abs
26
+ end
27
+
28
+ def menu_div_id
29
+ return "menu#{menu_id()}"
30
+ end
31
+
32
+ end
33
+
34
+ end