sws 0.4

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