watobo 0.9.21 → 0.9.23

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 (283) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +46 -1
  3. data/bin/nfq_server.rb +0 -9
  4. data/bin/watobo_gui.rb +3 -13
  5. data/custom-views/prettify-json.rb +9 -18
  6. data/icons/watobo.ico +0 -0
  7. data/icons/watobo.ico.old +0 -0
  8. data/lib/watobo.rb +10 -19
  9. data/lib/watobo/adapters.rb +5 -14
  10. data/lib/watobo/adapters/data_store.rb +50 -59
  11. data/lib/watobo/adapters/file/file_store.rb +287 -296
  12. data/lib/watobo/adapters/file/marshal_store.rb +293 -296
  13. data/lib/watobo/adapters/session_store.rb +5 -14
  14. data/lib/watobo/ca.rb +1 -10
  15. data/lib/watobo/config.rb +197 -206
  16. data/lib/watobo/constants.rb +0 -9
  17. data/lib/watobo/core.rb +3 -12
  18. data/lib/watobo/core/active_check.rb +72 -135
  19. data/lib/watobo/core/active_checks.rb +49 -58
  20. data/lib/watobo/core/ca.rb +369 -389
  21. data/lib/watobo/core/cert_store.rb +34 -43
  22. data/lib/watobo/core/chat.rb +92 -101
  23. data/lib/watobo/core/chats.rb +271 -280
  24. data/lib/watobo/core/client_cert_store.rb +106 -35
  25. data/lib/watobo/core/conversation.rb +48 -57
  26. data/lib/watobo/core/cookie.rb +23 -32
  27. data/lib/watobo/core/egress_handlers.rb +98 -0
  28. data/lib/watobo/core/finding.rb +66 -75
  29. data/lib/watobo/core/findings.rb +107 -114
  30. data/lib/watobo/core/forwarding_proxy.rb +13 -22
  31. data/lib/watobo/core/fuzz_gen.rb +0 -9
  32. data/lib/watobo/core/intercept_carver.rb +166 -177
  33. data/lib/watobo/core/intercept_filter.rb +235 -244
  34. data/lib/watobo/core/interceptor.rb +98 -107
  35. data/lib/watobo/core/min_class.rb +4 -13
  36. data/lib/watobo/core/netfilter_queue.rb +170 -179
  37. data/lib/watobo/core/ott_cache.rb +132 -141
  38. data/lib/watobo/core/parameter.rb +43 -52
  39. data/lib/watobo/core/passive_check.rb +103 -102
  40. data/lib/watobo/core/passive_checks.rb +48 -57
  41. data/lib/watobo/core/passive_scanner.rb +54 -55
  42. data/lib/watobo/core/plugin.rb +11 -20
  43. data/lib/watobo/core/project.rb +3 -9
  44. data/lib/watobo/core/proxy.rb +43 -52
  45. data/lib/watobo/core/request.rb +125 -123
  46. data/lib/watobo/core/response.rb +44 -53
  47. data/lib/watobo/core/scanner.rb +0 -9
  48. data/lib/watobo/core/scanner3.rb +405 -414
  49. data/lib/watobo/core/scope.rb +83 -92
  50. data/lib/watobo/core/session.rb +1043 -1026
  51. data/lib/watobo/core/sid_cache.rb +98 -107
  52. data/lib/watobo/core/subscriber.rb +25 -34
  53. data/lib/watobo/defaults.rb +21 -30
  54. data/lib/watobo/external/diff/lcs.rb +0 -9
  55. data/lib/watobo/external/diff/lcs/array.rb +0 -9
  56. data/lib/watobo/external/diff/lcs/block.rb +0 -9
  57. data/lib/watobo/external/diff/lcs/callbacks.rb +0 -9
  58. data/lib/watobo/external/diff/lcs/change.rb +0 -9
  59. data/lib/watobo/external/diff/lcs/hunk.rb +0 -9
  60. data/lib/watobo/external/diff/lcs/ldiff.rb +0 -9
  61. data/lib/watobo/external/diff/lcs/string.rb +0 -9
  62. data/lib/watobo/externals.rb +6 -15
  63. data/lib/watobo/framework.rb +4 -13
  64. data/lib/watobo/framework/create_project.rb +60 -69
  65. data/lib/watobo/framework/init.rb +0 -9
  66. data/lib/watobo/framework/init_modules.rb +0 -9
  67. data/lib/watobo/framework/license_text.rb +28 -37
  68. data/lib/watobo/framework/load_chat.rb +13 -22
  69. data/lib/watobo/gui.rb +132 -123
  70. data/lib/watobo/gui/about_watobo.rb +0 -9
  71. data/lib/watobo/gui/browser_preview.rb +0 -9
  72. data/lib/watobo/gui/certificate_dialog.rb +0 -9
  73. data/lib/watobo/gui/chat_diff.rb +0 -9
  74. data/lib/watobo/gui/chatviewer_frame.rb +73 -72
  75. data/lib/watobo/gui/checkboxtree.rb +0 -9
  76. data/lib/watobo/gui/checks_policy_frame.rb +0 -9
  77. data/lib/watobo/gui/client_cert_dialog.rb +96 -87
  78. data/lib/watobo/gui/confirm_scan_dialog.rb +0 -9
  79. data/lib/watobo/gui/conversation_table.rb +158 -164
  80. data/lib/watobo/gui/conversation_table_ctrl.rb +207 -216
  81. data/lib/watobo/gui/conversation_table_ctrl2.rb +373 -382
  82. data/lib/watobo/gui/csrf_token_dialog.rb +0 -9
  83. data/lib/watobo/gui/custom_viewer.rb +374 -383
  84. data/lib/watobo/gui/dashboard.rb +296 -303
  85. data/lib/watobo/gui/define_scope_frame.rb +0 -9
  86. data/lib/watobo/gui/differ_frame.rb +215 -224
  87. data/lib/watobo/gui/edit_comment.rb +0 -9
  88. data/lib/watobo/gui/edit_scope_dialog.rb +0 -9
  89. data/lib/watobo/gui/export_dialog.rb +104 -113
  90. data/lib/watobo/gui/finding_info.rb +0 -9
  91. data/lib/watobo/gui/findings_tree.rb +210 -217
  92. data/lib/watobo/gui/full_scan_dialog.rb +0 -9
  93. data/lib/watobo/gui/fuzzer_gui.rb +1295 -1313
  94. data/lib/watobo/gui/fxsave_thread.rb +14 -0
  95. data/lib/watobo/gui/goto_url_dialog.rb +70 -79
  96. data/lib/watobo/gui/hex_viewer.rb +0 -9
  97. data/lib/watobo/gui/html_viewer.rb +287 -296
  98. data/lib/watobo/gui/intercept_filter_dialog.rb +188 -197
  99. data/lib/watobo/gui/interceptor_gui.rb +1041 -1051
  100. data/lib/watobo/gui/interceptor_settings_dialog.rb +0 -9
  101. data/lib/watobo/gui/json_viewer.rb +287 -0
  102. data/lib/watobo/gui/list_box.rb +101 -110
  103. data/lib/watobo/gui/log_file_viewer.rb +32 -41
  104. data/lib/watobo/gui/log_viewer.rb +83 -88
  105. data/lib/watobo/gui/login_wizzard.rb +0 -9
  106. data/lib/watobo/gui/main_window.rb +587 -618
  107. data/lib/watobo/gui/manual_request_editor.rb +620 -565
  108. data/lib/watobo/gui/master_pw_dialog.rb +0 -9
  109. data/lib/watobo/gui/mixins/gui_settings.rb +29 -38
  110. data/lib/watobo/gui/page_tree.rb +217 -226
  111. data/lib/watobo/gui/password_policy_dialog.rb +0 -9
  112. data/lib/watobo/gui/plugin_board.rb +0 -9
  113. data/lib/watobo/gui/preferences_dialog.rb +0 -9
  114. data/lib/watobo/gui/progress_window.rb +17 -27
  115. data/lib/watobo/gui/project_wizzard.rb +0 -9
  116. data/lib/watobo/gui/proxy_dialog.rb +1 -10
  117. data/lib/watobo/gui/quick_scan_dialog.rb +0 -9
  118. data/lib/watobo/gui/request_builder_frame.rb +102 -111
  119. data/lib/watobo/gui/request_editor.rb +181 -137
  120. data/lib/watobo/gui/rewrite_filters_dialog.rb +394 -403
  121. data/lib/watobo/gui/rewrite_rules_dialog.rb +372 -381
  122. data/lib/watobo/gui/save_chat_dialog.rb +140 -149
  123. data/lib/watobo/gui/scanner_settings_dialog.rb +0 -9
  124. data/lib/watobo/gui/select_chat_dialog.rb +0 -9
  125. data/lib/watobo/gui/session_management_dialog.rb +0 -9
  126. data/lib/watobo/gui/sites_tree.rb +0 -9
  127. data/lib/watobo/gui/status_bar.rb +0 -9
  128. data/lib/watobo/gui/table_editor.rb +0 -9
  129. data/lib/watobo/gui/tagless_viewer.rb +0 -9
  130. data/lib/watobo/gui/templates/plugin.rb +0 -9
  131. data/lib/watobo/gui/templates/plugin2.rb +92 -100
  132. data/lib/watobo/gui/templates/plugin_base.rb +144 -153
  133. data/lib/watobo/gui/text_viewer.rb +0 -9
  134. data/lib/watobo/gui/transcoder_window.rb +0 -9
  135. data/lib/watobo/gui/utils/gui_utils.rb +0 -9
  136. data/lib/watobo/gui/utils/init_icons.rb +86 -95
  137. data/lib/watobo/gui/utils/load_icons.rb +33 -42
  138. data/lib/watobo/gui/utils/load_plugins.rb +116 -119
  139. data/lib/watobo/gui/utils/master_password.rb +68 -77
  140. data/lib/watobo/gui/utils/save_default_settings.rb +113 -122
  141. data/lib/watobo/gui/utils/save_project_settings.rb +0 -9
  142. data/lib/watobo/gui/utils/save_proxy_settings.rb +41 -50
  143. data/lib/watobo/gui/utils/save_scanner_settings.rb +18 -27
  144. data/lib/watobo/gui/utils/session_history.rb +112 -121
  145. data/lib/watobo/gui/workspace_dialog.rb +0 -9
  146. data/lib/watobo/gui/www_auth_dialog.rb +0 -9
  147. data/lib/watobo/gui/xml_viewer_frame.rb +0 -9
  148. data/lib/watobo/http.rb +4 -13
  149. data/lib/watobo/http/cookies/cookies.rb +26 -35
  150. data/lib/watobo/http/data/data.rb +45 -54
  151. data/lib/watobo/http/data/json.rb +47 -55
  152. data/lib/watobo/http/url/url.rb +38 -47
  153. data/lib/watobo/http/xml/xml.rb +124 -130
  154. data/lib/watobo/interceptor.rb +3 -12
  155. data/lib/watobo/interceptor/proxy.rb +742 -739
  156. data/lib/watobo/interceptor/transparent.rb +22 -24
  157. data/lib/watobo/mixins.rb +10 -19
  158. data/lib/watobo/mixins/check_info.rb +27 -36
  159. data/lib/watobo/mixins/httpparser.rb +613 -637
  160. data/lib/watobo/mixins/request_parser.rb +88 -97
  161. data/lib/watobo/mixins/shapers.rb +515 -529
  162. data/lib/watobo/mixins/transcoders.rb +3 -11
  163. data/lib/watobo/parser.rb +1 -10
  164. data/lib/watobo/parser/html.rb +83 -92
  165. data/lib/watobo/patch_fxruby_setfocus.rb +26 -0
  166. data/lib/watobo/sockets.rb +3 -12
  167. data/lib/watobo/sockets/agent.rb +828 -837
  168. data/lib/watobo/sockets/client_socket.rb +308 -312
  169. data/lib/watobo/sockets/connection.rb +401 -410
  170. data/lib/watobo/sockets/http_socket.rb +11 -13
  171. data/lib/watobo/sockets/ntlm_auth.rb +129 -138
  172. data/lib/watobo/utils.rb +10 -19
  173. data/lib/watobo/utils/check_regex.rb +0 -9
  174. data/lib/watobo/utils/copy_object.rb +0 -9
  175. data/lib/watobo/utils/crypto.rb +0 -9
  176. data/lib/watobo/utils/expand_range.rb +23 -32
  177. data/lib/watobo/utils/export_xml.rb +97 -106
  178. data/lib/watobo/utils/file_management.rb +9 -11
  179. data/lib/watobo/utils/hexprint.rb +9 -18
  180. data/lib/watobo/utils/load_chat.rb +0 -9
  181. data/lib/watobo/utils/load_icon.rb +0 -9
  182. data/lib/watobo/utils/ntlm.rb +866 -875
  183. data/lib/watobo/utils/print_debug.rb +12 -21
  184. data/lib/watobo/utils/response_builder.rb +90 -99
  185. data/lib/watobo/utils/response_hash.rb +0 -9
  186. data/lib/watobo/utils/secure_eval.rb +0 -9
  187. data/lib/watobo/utils/strings.rb +10 -19
  188. data/lib/watobo/utils/text2request.rb +0 -9
  189. data/lib/watobo/utils/url.rb +23 -32
  190. data/lib/watobo/utils/utf16.rb +11 -20
  191. data/modules/active/Apache/mod_status.rb +0 -9
  192. data/modules/active/Apache/multiview.rb +151 -160
  193. data/modules/active/Flash/crossdomain.rb +0 -9
  194. data/modules/active/JWT/jwt_oauth2_none.rb +111 -0
  195. data/modules/active/cq5/cq5_default_selectors.rb +106 -115
  196. data/modules/active/cq5/cqp_user_enumeration.rb +125 -134
  197. data/modules/active/directories/dirwalker.rb +0 -9
  198. data/modules/active/discovery/fileextensions.rb +0 -9
  199. data/modules/active/discovery/http_methods.rb +0 -9
  200. data/modules/active/discovery/jsmapfiles.rb +79 -0
  201. data/modules/active/domino/domino_db.rb +68 -76
  202. data/modules/active/dotNET/custom_errors.rb +102 -111
  203. data/modules/active/dotNET/dotnet_files.rb +90 -99
  204. data/modules/active/fileinclusion/lfi_simple.rb +0 -9
  205. data/modules/active/jboss/jboss_basic.rb +0 -9
  206. data/modules/active/sap/business_objects.rb +51 -60
  207. data/modules/active/sap/its_commands.rb +0 -9
  208. data/modules/active/sap/its_service_parameter.rb +0 -9
  209. data/modules/active/sap/its_services.rb +0 -9
  210. data/modules/active/sap/its_xss.rb +0 -9
  211. data/modules/active/shell_shock/shell_shock.rb +139 -148
  212. data/modules/active/siebel/siebel_apps.rb +160 -169
  213. data/modules/active/sqlinjection/sql_boolean.rb +0 -9
  214. data/modules/active/sqlinjection/sql_numerical.rb +198 -0
  215. data/modules/active/sqlinjection/sqli_error.rb +0 -9
  216. data/modules/active/sqlinjection/sqli_timing.rb +220 -229
  217. data/modules/active/struts2/default_handler_ognl.rb +106 -115
  218. data/modules/active/struts2/include_params_ognl.rb +105 -114
  219. data/modules/active/xml/xml_xxe.rb +112 -123
  220. data/modules/active/xss/xss_ng.rb +214 -223
  221. data/modules/active/xss/xss_simple.rb +0 -9
  222. data/modules/passive/ajax.rb +68 -77
  223. data/modules/passive/autocomplete.rb +56 -65
  224. data/modules/passive/cookie_options.rb +0 -9
  225. data/modules/passive/cookie_xss.rb +0 -9
  226. data/modules/passive/detect_code.rb +0 -9
  227. data/modules/passive/detect_fileupload.rb +0 -9
  228. data/modules/passive/detect_infrastructure.rb +0 -9
  229. data/modules/passive/detect_one_time_tokens.rb +0 -9
  230. data/modules/passive/dirindexing.rb +0 -9
  231. data/modules/passive/disclosure_domino.rb +55 -64
  232. data/modules/passive/disclosure_emails.rb +0 -9
  233. data/modules/passive/disclosure_ipaddr.rb +55 -53
  234. data/modules/passive/filename_as_parameter.rb +0 -9
  235. data/modules/passive/form_spotter.rb +0 -9
  236. data/modules/passive/hidden_fields.rb +50 -59
  237. data/modules/passive/hotspots.rb +0 -9
  238. data/modules/passive/in_script_parameter.rb +0 -9
  239. data/modules/passive/json_web_token.rb +93 -0
  240. data/modules/passive/multiple_server_headers.rb +0 -9
  241. data/modules/passive/possible_login.rb +0 -9
  242. data/modules/passive/redirect_url.rb +0 -9
  243. data/modules/passive/redirectionz.rb +0 -9
  244. data/modules/passive/sap-headers.rb +56 -65
  245. data/modules/passive/xss_dom.rb +0 -9
  246. data/plugins/aem/aem.rb +11 -20
  247. data/plugins/aem/gui/main.rb +118 -127
  248. data/plugins/aem/gui/tree_view.rb +171 -180
  249. data/plugins/aem/lib/agent.rb +130 -138
  250. data/plugins/aem/lib/dispatcher.rb +45 -51
  251. data/plugins/aem/lib/engine.rb +177 -186
  252. data/plugins/catalog/catalog.rb +345 -355
  253. data/plugins/crawler/crawler.rb +4 -13
  254. data/plugins/crawler/gui.rb +5 -14
  255. data/plugins/crawler/gui/auth_frame.rb +270 -279
  256. data/plugins/crawler/gui/crawler_gui.rb +271 -276
  257. data/plugins/crawler/gui/general_settings_frame.rb +96 -105
  258. data/plugins/crawler/gui/hooks_frame.rb +80 -89
  259. data/plugins/crawler/gui/scope_frame.rb +50 -59
  260. data/plugins/crawler/gui/settings_tabbook.rb +38 -47
  261. data/plugins/crawler/gui/status_frame.rb +59 -68
  262. data/plugins/crawler/lib/bags.rb +18 -27
  263. data/plugins/crawler/lib/constants.rb +11 -20
  264. data/plugins/crawler/lib/engine.rb +488 -497
  265. data/plugins/crawler/lib/grabber.rb +68 -77
  266. data/plugins/crawler/lib/status.rb +71 -80
  267. data/plugins/crawler/lib/uri_mp.rb +12 -21
  268. data/plugins/filefinder/filefinder.rb +326 -333
  269. data/plugins/sqlmap/bin/test.rb +78 -87
  270. data/plugins/sqlmap/gui.rb +4 -13
  271. data/plugins/sqlmap/gui/main.rb +218 -227
  272. data/plugins/sqlmap/gui/options_frame.rb +97 -106
  273. data/plugins/sqlmap/lib/sqlmap_ctrl.rb +90 -100
  274. data/plugins/sqlmap/sqlmap.rb +2 -11
  275. data/plugins/sslchecker/cli/sslchecker_cli.rb +0 -9
  276. data/plugins/sslchecker/gui/cipher_table.rb +246 -254
  277. data/plugins/sslchecker/gui/gui.rb +258 -264
  278. data/plugins/sslchecker/gui/sslchecker.rb +4 -13
  279. data/plugins/sslchecker/lib/check.rb +127 -133
  280. data/plugins/wshell/gui/main.rb +119 -117
  281. data/plugins/wshell/lib/core.rb +38 -88
  282. data/plugins/wshell/wshell.rb +11 -20
  283. metadata +170 -164
@@ -1,405 +1,396 @@
1
- #.
2
- # rewrite_filters_dialog.rb
3
- #.
4
- # Copyright 2014 by siberas, http://www.siberas.de
5
- # This file is part of WATOBO (Web Application Tool Box) http://watobo.sourceforge.com
6
- # WATOBO is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation version 2 of the License.
7
- # WATOBO is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8
- # You should have received a copy of the GNU General Public License along with WATOBO; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
9
-
10
1
  # @private
11
- module Watobo#:nodoc: all
12
- module Gui
13
- class FilterTableCtrl < FXHorizontalFrame
14
- attr_accessor :target
15
-
16
- def initialize(owner,target = nil, opts)
17
- @target = target
18
- super owner, opts
19
- matrix = FXMatrix.new(self, 4, :opts => MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y)
20
-
21
- %w( Location Match Pattern Flags ).each do |l|
22
- FXLabel.new(matrix, l)
23
- end
24
-
25
- @locations_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
26
- #@filterCombo.width =200
27
-
28
- @locations_combo.numVisible = 0
29
- @locations_combo.numColumns = 10
30
- @locations_combo.editable = false
31
- @locations_combo.connect(SEL_COMMAND){}
32
-
33
- @match_type_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
34
- #@filterCombo.width =200
35
-
36
- @match_type_combo.numVisible = 0
37
- @match_type_combo.numColumns = 10
38
- @match_type_combo.editable = false
39
- @match_type_combo.connect(SEL_COMMAND){}
40
-
41
- @pattern_txt = FXTextField.new(matrix, 20, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_FILL_COLUMN)
42
-
43
- @flags_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
44
- #@filterCombo.width =200
45
-
46
- @flags_combo.numVisible = 0
47
- @flags_combo.numColumns = 10
48
- @flags_combo.editable = false
49
- @flags_combo.connect(SEL_COMMAND){}
50
-
51
- frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
52
- top_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
53
-
54
- @del_btn = FXButton.new(top_btn_frame, "Del" , nil, nil)
55
- @del_btn.enable
56
- @del_btn.connect(SEL_COMMAND){ delete_filter }
57
-
58
- # @edit_btn = FXButton.new(top_btn_frame, "Edit ..." , nil, nil)
59
- # @edit_btn.enable
60
- # @edit_btn.connect(SEL_COMMAND){ delete_filter }
61
-
62
- @up_btn = FXButton.new(top_btn_frame, "Up" , nil, nil)
63
- @up_btn.enable
64
-
65
- @down_btn = FXButton.new(top_btn_frame, "Down" , nil, nil)
66
- @down_btn.enable
67
-
68
- add_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
69
- @add_btn = FXButton.new(add_btn_frame, "Add ..." , nil, nil, )
70
- @add_btn.enable
71
- @add_btn.connect(SEL_COMMAND){ add_filter }
72
-
73
- end
74
-
75
- private
76
-
77
- def init_handlers()
78
-
79
- end
80
-
81
-
82
- def add_match_type(l)
83
- @match_type_combo.appendItem(l.to_s, l)
84
- @match_type_combo.numVisible = @match_type_combo.numItems
85
- end
86
-
87
- def add_location(l)
88
- @locations_combo.appendItem(l.to_s, l)
89
- @locations_combo.numVisible = @locations_combo.numItems
90
- end
91
-
92
- def add_flag(l)
93
- @flags_combo.appendItem(l.to_s, l)
94
- @flags_combo.numVisible = @flags_combo.numItems
95
- end
96
-
97
- def delete_filter
98
- @target.delete_current_row if @target.respond_to? :delete_current_row
99
-
100
- end
101
-
102
- def add_filter
103
- return false if @target.nil?
104
- #TODO: Add some checks if filter is ok
105
- location = @locations_combo.getItemData(@locations_combo.currentItem)
106
- pattern = @pattern_txt.text
107
- match_type = @match_type_combo.getItemData(@match_type_combo.currentItem)
108
- flag = @flags_combo.getItemData(@flags_combo.currentItem)
109
-
110
- prefs = {
111
- :match_type => match_type,
112
- :flags => ( flag != :none ) ? [flag] : []
113
- }
114
-
115
- filter = case location
116
- when :url
117
- Watobo::Interceptor::UrlFilter.new(pattern, prefs)
118
- when :method
119
- Watobo::Interceptor::MethodFilter.new(pattern, prefs)
120
- when :url_parms
121
- Watobo::Interceptor::HttpParmsFilter.new(pattern, prefs)
122
- when :status
123
- Watobo::Interceptor::StatusFilter.new(pattern, prefs)
124
- when :flags
125
- Watobo::Interceptor::FlagFilter.new('', prefs)
126
- end
127
- @target.add_filter filter
128
- end
129
-
130
- end
131
-
132
- class RequestFilterCtrl < FilterTableCtrl
133
- def initialize(owner, target, opts)
134
- super owner, target, opts
135
- add_location :url
136
- add_location :method
137
- #add_location :header
138
- #add_location :cookie
139
- add_location :url_parms
140
-
141
- add_match_type :match
142
- add_match_type :not_match
143
-
144
- add_flag :none
145
- add_flag :request
146
- end
147
- end
148
-
149
- class ResponseFilterCtrl < FilterTableCtrl
150
- def initialize(owner, target, opts)
151
- super owner, target, opts
152
- # add_location :body
153
- # add_location :header
154
- add_location :status
155
- add_location :header
156
- add_location :flags
157
-
158
- add_match_type :match
159
- add_match_type :not_match
160
-
161
- add_flag :none
162
- add_flag :request
163
- end
164
- end
165
-
166
- class FilterTable < FXTable
167
- attr :filters
168
- def add_filter(filter)
169
- @filters << filter
170
- add_filter_row(filter)
171
- end
172
-
173
- def get_current_filter
174
- puts self.currentRow
175
- end
176
-
177
- def delete_row_by_index(index)
178
- return false if index < 0
179
- return false if index > self.numRows-1
180
- @filters.delete_at index
181
- self.clearItems
182
- init_columns
183
-
184
- @filters.each do |r|
185
- add_filter_row r
186
- end
187
- adjust_cell_width
188
- self.selectRow self.currentRow if self.currentRow >= 0
189
- true
190
- end
191
-
192
- def delete_current_row
193
- i = self.currentRow
194
- return false if i < 0
195
- delete_row_by_index i
196
- end
197
-
198
- def initialize( owner, filters=[], opts={} )
199
- @event_dispatcher_listeners = Hash.new
200
- parms = { :opts => TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y|TABLE_READONLY|LAYOUT_SIDE_TOP,
201
- :padding => 2
202
- }
203
- parms.update opts
204
-
205
- super(owner, parms)
206
-
207
- self.extend Watobo::Subscriber
208
- self.setBackColor(FXRGB(255, 255, 255))
209
- self.setCellColor(0, 0, FXRGB(255, 255, 255))
210
- self.setCellColor(0, 1, FXRGB(255, 240, 240))
211
- self.setCellColor(1, 0, FXRGB(240, 255, 240))
212
- self.setCellColor(1, 1, FXRGB(240, 240, 255))
213
-
214
- @columns=Hash.new
215
-
216
- @filters = []
217
- @filters.concat filters
218
-
219
- add_column "Location", 80
220
- add_column "Match", 80
221
- add_column "Pattern", 80
222
- add_column "Flags", 80
223
-
224
-
225
- init_columns
226
-
227
- @filters.each do |r|
228
- add_filter_row r
229
- end
230
- adjust_cell_width
231
-
232
- self.connect(SEL_SELECTED){|sender,sel,pos|
233
- self.selectRow pos.row
234
- # notify(:filter_selected, @filters[pos.row])
235
- }
236
- end
237
-
238
- private
239
-
240
- def add_filter_row(filter)
241
- return false if filter.nil?
242
- row_index = self.getNumRows
243
- self.appendRows(1)
244
-
245
- self.rowHeader.setItemJustify(row_index, FXHeaderItem::RIGHT)
246
- self.setRowText(row_index, (row_index+1).to_s)
247
-
248
- index = @columns[:location][:order]
249
- self.setItemText(row_index, index, filter.name)
250
- self.getItem(row_index, index).justify = FXTableItem::LEFT
251
-
252
- index = @columns[:match][:order]
253
- self.setItemText(row_index, index, filter.match_type.to_s)
254
- self.getItem(row_index, index).justify = FXTableItem::LEFT
255
-
256
- index = @columns[:flags][:order]
257
- self.setItemText(row_index, index, filter.flags.join(","))
258
- self.getItem(row_index, index).justify = FXTableItem::LEFT
259
-
260
- index = @columns[:pattern][:order]
261
- self.setItemText(row_index, index, filter.pattern)
262
- self.getItem(row_index, index).justify = FXTableItem::LEFT
263
-
264
-
265
- end
266
- def add_column(name, width, order=0)
267
- o = ( order == 0 ) ? @columns.length : order
268
- @columns[name.downcase.to_sym] = { :name => name,
269
- :width => width,
270
- :order => o
271
- }
272
-
273
- end
274
-
275
- def adjust_cell_width()
276
- begin
277
- self.rowHeader.width = 30
278
- #self.fitColumnsToContents(0)
279
- @columns.each_with_index do |v,i|
280
-
281
- self.setColumnWidth(i, v[1][:width])
282
- end
283
- rescue => bang
284
- puts "!!!ERROR: adjustCellWidth"
285
- puts bang
286
- puts bang.backtrace
287
- end
288
-
289
- end
290
-
291
- def init_columns
292
- self.setTableSize(0, @columns.length)
293
- self.visibleRows = 5
294
- self.visibleColumns = @columns.length
295
-
296
- @columns.sort_by{|k,v| v[:order] }.each_with_index do |v,i|
297
- self.setColumnText( i, v[1][:name] )
298
- end
299
-
300
- end
301
-
302
- end
303
-
304
- class RequestFilterTable < FilterTable
305
- def initialize(owner, opts={})
306
- super owner, opts
307
- add_column "Action", 50
308
- add_column "Location", 80
309
- add_column "Pattern", 80
310
- add_column "Content", 80
311
- add_column "Filter", 80
312
-
313
- init_columns
314
- adjust_cell_width
315
-
316
- end
317
- end
318
-
319
- class RequestFilterDialog < FXDialogBox
320
-
321
- include Responder
322
- def filter
323
- f = Watobo::Interceptor::FilterChain.new
324
- f.set_filters @table.filters
325
- f
326
- end
327
-
328
- def initialize(owner, rule, settings = {} )
329
- super(owner, "Request Rule Filter", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
330
-
331
- FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
332
-
333
- @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
334
-
335
- @table = FilterTable.new(@main_frame, rule.filters)
336
- @table_ctrl = RequestFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
337
-
338
- buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
339
- @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
340
- @finishButton.enable
341
- @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
342
- #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
343
- self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
344
- end
345
-
346
- @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
347
- :target => self, :selector => FXDialogBox::ID_CANCEL,
348
- :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
349
- end
350
-
351
- private
352
-
353
- def onAccept(sender, sel, event)
354
-
355
- getApp().stopModal(self, 1)
356
- self.hide()
357
- return 1
358
- end
359
-
360
-
361
- end
362
-
363
- class ResponseFilterDialog < FXDialogBox
364
-
365
- include Responder
366
- def filter
367
- f = Watobo::Interceptor::FilterChain.new
368
- f.set_filters @table.filters
369
- f
370
- end
371
-
372
- def initialize(owner, rule, settings = {} )
373
- super(owner, "Response Rule Filters", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
374
-
375
- FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
376
-
377
- @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
378
-
379
- @table = FilterTable.new(@main_frame, rule.filters)
380
- @table_ctrl = ResponseFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
381
-
382
- buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
383
- @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
384
- @finishButton.enable
385
- @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
386
- #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
387
- self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
388
- end
389
-
390
- @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
391
- :target => self, :selector => FXDialogBox::ID_CANCEL,
392
- :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
393
- end
394
-
395
- private
396
-
397
- def onAccept(sender, sel, event)
398
- getApp().stopModal(self, 1)
399
- self.hide()
400
- return 1
401
- end
402
-
403
- end
404
- end
2
+ module Watobo#:nodoc: all
3
+ module Gui
4
+ class FilterTableCtrl < FXHorizontalFrame
5
+ attr_accessor :target
6
+
7
+ def initialize(owner,target = nil, opts)
8
+ @target = target
9
+ super owner, opts
10
+ matrix = FXMatrix.new(self, 4, :opts => MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y)
11
+
12
+ %w( Location Match Pattern Flags ).each do |l|
13
+ FXLabel.new(matrix, l)
14
+ end
15
+
16
+ @locations_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
17
+ #@filterCombo.width =200
18
+
19
+ @locations_combo.numVisible = 0
20
+ @locations_combo.numColumns = 10
21
+ @locations_combo.editable = false
22
+ @locations_combo.connect(SEL_COMMAND){}
23
+
24
+ @match_type_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
25
+ #@filterCombo.width =200
26
+
27
+ @match_type_combo.numVisible = 0
28
+ @match_type_combo.numColumns = 10
29
+ @match_type_combo.editable = false
30
+ @match_type_combo.connect(SEL_COMMAND){}
31
+
32
+ @pattern_txt = FXTextField.new(matrix, 20, nil, 0, :opts => TEXTFIELD_NORMAL|LAYOUT_FILL_COLUMN)
33
+
34
+ @flags_combo = FXComboBox.new(matrix, 10, nil, 0, COMBOBOX_STATIC|FRAME_SUNKEN|FRAME_THICK)
35
+ #@filterCombo.width =200
36
+
37
+ @flags_combo.numVisible = 0
38
+ @flags_combo.numColumns = 10
39
+ @flags_combo.editable = false
40
+ @flags_combo.connect(SEL_COMMAND){}
41
+
42
+ frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
43
+ top_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
44
+
45
+ @del_btn = FXButton.new(top_btn_frame, "Del" , nil, nil)
46
+ @del_btn.enable
47
+ @del_btn.connect(SEL_COMMAND){ delete_filter }
48
+
49
+ # @edit_btn = FXButton.new(top_btn_frame, "Edit ..." , nil, nil)
50
+ # @edit_btn.enable
51
+ # @edit_btn.connect(SEL_COMMAND){ delete_filter }
52
+
53
+ @up_btn = FXButton.new(top_btn_frame, "Up" , nil, nil)
54
+ @up_btn.enable
55
+
56
+ @down_btn = FXButton.new(top_btn_frame, "Down" , nil, nil)
57
+ @down_btn.enable
58
+
59
+ add_btn_frame = FXHorizontalFrame.new(frame,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
60
+ @add_btn = FXButton.new(add_btn_frame, "Add ..." , nil, nil, )
61
+ @add_btn.enable
62
+ @add_btn.connect(SEL_COMMAND){ add_filter }
63
+
64
+ end
65
+
66
+ private
67
+
68
+ def init_handlers()
69
+
70
+ end
71
+
72
+
73
+ def add_match_type(l)
74
+ @match_type_combo.appendItem(l.to_s, l)
75
+ @match_type_combo.numVisible = @match_type_combo.numItems
76
+ end
77
+
78
+ def add_location(l)
79
+ @locations_combo.appendItem(l.to_s, l)
80
+ @locations_combo.numVisible = @locations_combo.numItems
81
+ end
82
+
83
+ def add_flag(l)
84
+ @flags_combo.appendItem(l.to_s, l)
85
+ @flags_combo.numVisible = @flags_combo.numItems
86
+ end
87
+
88
+ def delete_filter
89
+ @target.delete_current_row if @target.respond_to? :delete_current_row
90
+
91
+ end
92
+
93
+ def add_filter
94
+ return false if @target.nil?
95
+ #TODO: Add some checks if filter is ok
96
+ location = @locations_combo.getItemData(@locations_combo.currentItem)
97
+ pattern = @pattern_txt.text
98
+ match_type = @match_type_combo.getItemData(@match_type_combo.currentItem)
99
+ flag = @flags_combo.getItemData(@flags_combo.currentItem)
100
+
101
+ prefs = {
102
+ :match_type => match_type,
103
+ :flags => ( flag != :none ) ? [flag] : []
104
+ }
105
+
106
+ filter = case location
107
+ when :url
108
+ Watobo::Interceptor::UrlFilter.new(pattern, prefs)
109
+ when :method
110
+ Watobo::Interceptor::MethodFilter.new(pattern, prefs)
111
+ when :url_parms
112
+ Watobo::Interceptor::HttpParmsFilter.new(pattern, prefs)
113
+ when :status
114
+ Watobo::Interceptor::StatusFilter.new(pattern, prefs)
115
+ when :flags
116
+ Watobo::Interceptor::FlagFilter.new('', prefs)
117
+ end
118
+ @target.add_filter filter
119
+ end
120
+
121
+ end
122
+
123
+ class RequestFilterCtrl < FilterTableCtrl
124
+ def initialize(owner, target, opts)
125
+ super owner, target, opts
126
+ add_location :url
127
+ add_location :method
128
+ #add_location :header
129
+ #add_location :cookie
130
+ add_location :url_parms
131
+
132
+ add_match_type :match
133
+ add_match_type :not_match
134
+
135
+ add_flag :none
136
+ add_flag :request
137
+ end
138
+ end
139
+
140
+ class ResponseFilterCtrl < FilterTableCtrl
141
+ def initialize(owner, target, opts)
142
+ super owner, target, opts
143
+ # add_location :body
144
+ # add_location :header
145
+ add_location :status
146
+ add_location :header
147
+ add_location :flags
148
+
149
+ add_match_type :match
150
+ add_match_type :not_match
151
+
152
+ add_flag :none
153
+ add_flag :request
154
+ end
155
+ end
156
+
157
+ class FilterTable < FXTable
158
+ attr :filters
159
+ def add_filter(filter)
160
+ @filters << filter
161
+ add_filter_row(filter)
162
+ end
163
+
164
+ def get_current_filter
165
+ puts self.currentRow
166
+ end
167
+
168
+ def delete_row_by_index(index)
169
+ return false if index < 0
170
+ return false if index > self.numRows-1
171
+ @filters.delete_at index
172
+ self.clearItems
173
+ init_columns
174
+
175
+ @filters.each do |r|
176
+ add_filter_row r
177
+ end
178
+ adjust_cell_width
179
+ self.selectRow self.currentRow if self.currentRow >= 0
180
+ true
181
+ end
182
+
183
+ def delete_current_row
184
+ i = self.currentRow
185
+ return false if i < 0
186
+ delete_row_by_index i
187
+ end
188
+
189
+ def initialize( owner, filters=[], opts={} )
190
+ @event_dispatcher_listeners = Hash.new
191
+ parms = { :opts => TABLE_COL_SIZABLE|TABLE_ROW_SIZABLE|LAYOUT_FILL_X|LAYOUT_FILL_Y|TABLE_READONLY|LAYOUT_SIDE_TOP,
192
+ :padding => 2
193
+ }
194
+ parms.update opts
195
+
196
+ super(owner, parms)
197
+
198
+ self.extend Watobo::Subscriber
199
+ self.setBackColor(FXRGB(255, 255, 255))
200
+ self.setCellColor(0, 0, FXRGB(255, 255, 255))
201
+ self.setCellColor(0, 1, FXRGB(255, 240, 240))
202
+ self.setCellColor(1, 0, FXRGB(240, 255, 240))
203
+ self.setCellColor(1, 1, FXRGB(240, 240, 255))
204
+
205
+ @columns=Hash.new
206
+
207
+ @filters = []
208
+ @filters.concat filters
209
+
210
+ add_column "Location", 80
211
+ add_column "Match", 80
212
+ add_column "Pattern", 80
213
+ add_column "Flags", 80
214
+
215
+
216
+ init_columns
217
+
218
+ @filters.each do |r|
219
+ add_filter_row r
220
+ end
221
+ adjust_cell_width
222
+
223
+ self.connect(SEL_SELECTED){|sender,sel,pos|
224
+ self.selectRow pos.row
225
+ # notify(:filter_selected, @filters[pos.row])
226
+ }
227
+ end
228
+
229
+ private
230
+
231
+ def add_filter_row(filter)
232
+ return false if filter.nil?
233
+ row_index = self.getNumRows
234
+ self.appendRows(1)
235
+
236
+ self.rowHeader.setItemJustify(row_index, FXHeaderItem::RIGHT)
237
+ self.setRowText(row_index, (row_index+1).to_s)
238
+
239
+ index = @columns[:location][:order]
240
+ self.setItemText(row_index, index, filter.name)
241
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
242
+
243
+ index = @columns[:match][:order]
244
+ self.setItemText(row_index, index, filter.match_type.to_s)
245
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
246
+
247
+ index = @columns[:flags][:order]
248
+ self.setItemText(row_index, index, filter.flags.join(","))
249
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
250
+
251
+ index = @columns[:pattern][:order]
252
+ self.setItemText(row_index, index, filter.pattern)
253
+ self.getItem(row_index, index).justify = FXTableItem::LEFT
254
+
255
+
256
+ end
257
+ def add_column(name, width, order=0)
258
+ o = ( order == 0 ) ? @columns.length : order
259
+ @columns[name.downcase.to_sym] = { :name => name,
260
+ :width => width,
261
+ :order => o
262
+ }
263
+
264
+ end
265
+
266
+ def adjust_cell_width()
267
+ begin
268
+ self.rowHeader.width = 30
269
+ #self.fitColumnsToContents(0)
270
+ @columns.each_with_index do |v,i|
271
+
272
+ self.setColumnWidth(i, v[1][:width])
273
+ end
274
+ rescue => bang
275
+ puts "!!!ERROR: adjustCellWidth"
276
+ puts bang
277
+ puts bang.backtrace
278
+ end
279
+
280
+ end
281
+
282
+ def init_columns
283
+ self.setTableSize(0, @columns.length)
284
+ self.visibleRows = 5
285
+ self.visibleColumns = @columns.length
286
+
287
+ @columns.sort_by{|k,v| v[:order] }.each_with_index do |v,i|
288
+ self.setColumnText( i, v[1][:name] )
289
+ end
290
+
291
+ end
292
+
293
+ end
294
+
295
+ class RequestFilterTable < FilterTable
296
+ def initialize(owner, opts={})
297
+ super owner, opts
298
+ add_column "Action", 50
299
+ add_column "Location", 80
300
+ add_column "Pattern", 80
301
+ add_column "Content", 80
302
+ add_column "Filter", 80
303
+
304
+ init_columns
305
+ adjust_cell_width
306
+
307
+ end
308
+ end
309
+
310
+ class RequestFilterDialog < FXDialogBox
311
+
312
+ include Responder
313
+ def filter
314
+ f = Watobo::Interceptor::FilterChain.new
315
+ f.set_filters @table.filters
316
+ f
317
+ end
318
+
319
+ def initialize(owner, rule, settings = {} )
320
+ super(owner, "Request Rule Filter", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
321
+
322
+ FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
323
+
324
+ @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
325
+
326
+ @table = FilterTable.new(@main_frame, rule.filters)
327
+ @table_ctrl = RequestFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
328
+
329
+ buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
330
+ @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
331
+ @finishButton.enable
332
+ @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
333
+ #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
334
+ self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
335
+ end
336
+
337
+ @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
338
+ :target => self, :selector => FXDialogBox::ID_CANCEL,
339
+ :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
340
+ end
341
+
342
+ private
343
+
344
+ def onAccept(sender, sel, event)
345
+
346
+ getApp().stopModal(self, 1)
347
+ self.hide()
348
+ return 1
349
+ end
350
+
351
+
352
+ end
353
+
354
+ class ResponseFilterDialog < FXDialogBox
355
+
356
+ include Responder
357
+ def filter
358
+ f = Watobo::Interceptor::FilterChain.new
359
+ f.set_filters @table.filters
360
+ f
361
+ end
362
+
363
+ def initialize(owner, rule, settings = {} )
364
+ super(owner, "Response Rule Filters", DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE, :width => 650, :height => 300)
365
+
366
+ FXMAPFUNC(SEL_COMMAND, ID_ACCEPT, :onAccept)
367
+
368
+ @main_frame = FXVerticalFrame.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y, :padding => 0)
369
+
370
+ @table = FilterTable.new(@main_frame, rule.filters)
371
+ @table_ctrl = ResponseFilterCtrl.new(@main_frame, @table, :opts => LAYOUT_FILL_X|FRAME_SUNKEN|FRAME_THICK)
372
+
373
+ buttons_frame = FXHorizontalFrame.new(@main_frame, :opts => LAYOUT_FILL_X|LAYOUT_BOTTOM)
374
+ @finishButton = FXButton.new(buttons_frame, "Accept" , nil, nil, :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
375
+ @finishButton.enable
376
+ @finishButton.connect(SEL_COMMAND) do |sender, sel, item|
377
+ #self.handle(self, FXSEL(SEL_COMMAND, ID_CANCEL), nil)
378
+ self.handle(self, FXSEL(SEL_COMMAND, ID_ACCEPT), nil)
379
+ end
380
+
381
+ @cancelButton = FXButton.new(buttons_frame, "Cancel" ,
382
+ :target => self, :selector => FXDialogBox::ID_CANCEL,
383
+ :opts => BUTTON_NORMAL|LAYOUT_RIGHT)
384
+ end
385
+
386
+ private
387
+
388
+ def onAccept(sender, sel, event)
389
+ getApp().stopModal(self, 1)
390
+ self.hide()
391
+ return 1
392
+ end
393
+
394
+ end
395
+ end
405
396
  end