redcar-dev 0.12.17dev

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 (655) hide show
  1. data/CHANGES +664 -0
  2. data/LICENSE +32 -0
  3. data/README.md +119 -0
  4. data/Rakefile +283 -0
  5. data/bin/redcar +29 -0
  6. data/lib/redcar.rb +307 -0
  7. data/lib/redcar/installer.rb +178 -0
  8. data/lib/redcar/instance_exec.rb +25 -0
  9. data/lib/redcar/logger.rb +64 -0
  10. data/lib/redcar/plist.rb +83 -0
  11. data/lib/redcar/ruby_extensions.rb +201 -0
  12. data/lib/redcar/runner.rb +130 -0
  13. data/lib/redcar/usage.rb +42 -0
  14. data/lib/redcar_quick_start.rb +100 -0
  15. data/lib/regex_replace.rb +221 -0
  16. data/lib/tasks/app-bundle.rake +63 -0
  17. data/plugins/application/features/main_menu.feature +9 -0
  18. data/plugins/application/features/navigation_history.feature +66 -0
  19. data/plugins/application/features/step_definitions/command_steps.rb +10 -0
  20. data/plugins/application/features/step_definitions/dialog_steps.rb +25 -0
  21. data/plugins/application/features/step_definitions/filter_list_dialog_steps.rb +42 -0
  22. data/plugins/application/features/step_definitions/key_steps.rb +18 -0
  23. data/plugins/application/features/step_definitions/menu_steps.rb +42 -0
  24. data/plugins/application/features/step_definitions/navigation_history_steps.rb +4 -0
  25. data/plugins/application/features/step_definitions/speedbar_steps.rb +88 -0
  26. data/plugins/application/features/step_definitions/tree_steps.rb +107 -0
  27. data/plugins/application/features/step_definitions/window_steps.rb +17 -0
  28. data/plugins/application/features/support/env.rb +257 -0
  29. data/plugins/application/features/support/fake_event.rb +26 -0
  30. data/plugins/application/lib/application.rb +425 -0
  31. data/plugins/application/lib/application/assets/file.png +0 -0
  32. data/plugins/application/lib/application/clipboard.rb +95 -0
  33. data/plugins/application/lib/application/command.rb +108 -0
  34. data/plugins/application/lib/application/command/executor.rb +80 -0
  35. data/plugins/application/lib/application/command/history.rb +54 -0
  36. data/plugins/application/lib/application/commands/application_commands.rb +21 -0
  37. data/plugins/application/lib/application/commands/notebook_commands.rb +73 -0
  38. data/plugins/application/lib/application/commands/tab_commands.rb +105 -0
  39. data/plugins/application/lib/application/commands/treebook_commands.rb +117 -0
  40. data/plugins/application/lib/application/commands/window_commands.rb +68 -0
  41. data/plugins/application/lib/application/dialog.rb +170 -0
  42. data/plugins/application/lib/application/dialogs/filter_list_dialog.rb +123 -0
  43. data/plugins/application/lib/application/dialogs/modeless_list_dialog.rb +85 -0
  44. data/plugins/application/lib/application/event_spewer.rb +32 -0
  45. data/plugins/application/lib/application/keymap.rb +41 -0
  46. data/plugins/application/lib/application/keymap/builder.rb +23 -0
  47. data/plugins/application/lib/application/menu.rb +117 -0
  48. data/plugins/application/lib/application/menu/builder.rb +80 -0
  49. data/plugins/application/lib/application/menu/builder/group.rb +47 -0
  50. data/plugins/application/lib/application/menu/item.rb +79 -0
  51. data/plugins/application/lib/application/menu/lazy_menu.rb +25 -0
  52. data/plugins/application/lib/application/navigation_history.rb +71 -0
  53. data/plugins/application/lib/application/notebook.rb +163 -0
  54. data/plugins/application/lib/application/sensitive.rb +57 -0
  55. data/plugins/application/lib/application/sensitivity.rb +82 -0
  56. data/plugins/application/lib/application/speedbar.rb +100 -0
  57. data/plugins/application/lib/application/tab.rb +92 -0
  58. data/plugins/application/lib/application/tab/command.rb +5 -0
  59. data/plugins/application/lib/application/toolbar.rb +83 -0
  60. data/plugins/application/lib/application/toolbar/builder.rb +80 -0
  61. data/plugins/application/lib/application/toolbar/builder/group.rb +47 -0
  62. data/plugins/application/lib/application/toolbar/item.rb +71 -0
  63. data/plugins/application/lib/application/toolbar/lazy_toolbar.rb +25 -0
  64. data/plugins/application/lib/application/tree.rb +94 -0
  65. data/plugins/application/lib/application/tree/command.rb +5 -0
  66. data/plugins/application/lib/application/tree/controller.rb +64 -0
  67. data/plugins/application/lib/application/tree/mirror.rb +132 -0
  68. data/plugins/application/lib/application/treebook.rb +83 -0
  69. data/plugins/application/lib/application/window.rb +274 -0
  70. data/plugins/application/plugin.rb +8 -0
  71. data/plugins/application/spec/application/application_spec.rb +23 -0
  72. data/plugins/application/spec/application/clipboard_spec.rb +55 -0
  73. data/plugins/application/spec/application/command/executor_spec.rb +78 -0
  74. data/plugins/application/spec/application/command/history_spec.rb +49 -0
  75. data/plugins/application/spec/application/command_spec.rb +78 -0
  76. data/plugins/application/spec/application/controllers/application_controller.rb +4 -0
  77. data/plugins/application/spec/application/controllers/notebook_controller.rb +4 -0
  78. data/plugins/application/spec/application/controllers/window_controller.rb +5 -0
  79. data/plugins/application/spec/application/keymap/builder_spec.rb +17 -0
  80. data/plugins/application/spec/application/menu/builder_spec.rb +61 -0
  81. data/plugins/application/spec/application/menu/menu_item_spec.rb +17 -0
  82. data/plugins/application/spec/application/menu_spec.rb +171 -0
  83. data/plugins/application/spec/application/navigation_history_spec.rb +96 -0
  84. data/plugins/application/spec/application/notebook_spec.rb +31 -0
  85. data/plugins/application/spec/application/sensitive_spec.rb +156 -0
  86. data/plugins/application/spec/application/speedbar_spec.rb +77 -0
  87. data/plugins/application/spec/application/treebook_spec.rb +27 -0
  88. data/plugins/application/spec/application/window_spec.rb +24 -0
  89. data/plugins/application/spec/spec_helper.rb +18 -0
  90. data/plugins/application_swt/build.xml +74 -0
  91. data/plugins/application_swt/lib/application_swt.rb +218 -0
  92. data/plugins/application_swt/lib/application_swt/bring_to_front.rb +53 -0
  93. data/plugins/application_swt/lib/application_swt/clipboard.rb +42 -0
  94. data/plugins/application_swt/lib/application_swt/dialog_adapter.rb +180 -0
  95. data/plugins/application_swt/lib/application_swt/dialogs/filter_list_dialog_controller.rb +233 -0
  96. data/plugins/application_swt/lib/application_swt/dialogs/input_dialog.rb +46 -0
  97. data/plugins/application_swt/lib/application_swt/dialogs/modeless_dialog.rb +113 -0
  98. data/plugins/application_swt/lib/application_swt/dialogs/modeless_html_dialog.rb +85 -0
  99. data/plugins/application_swt/lib/application_swt/dialogs/modeless_list_dialog_controller.rb +143 -0
  100. data/plugins/application_swt/lib/application_swt/dialogs/no_buttons_dialog.rb +24 -0
  101. data/plugins/application_swt/lib/application_swt/dialogs/text_and_file_dialog.rb +118 -0
  102. data/plugins/application_swt/lib/application_swt/gradient.rb +61 -0
  103. data/plugins/application_swt/lib/application_swt/html_tab.rb +79 -0
  104. data/plugins/application_swt/lib/application_swt/icon.rb +35 -0
  105. data/plugins/application_swt/lib/application_swt/listener_helpers.rb +20 -0
  106. data/plugins/application_swt/lib/application_swt/menu.rb +167 -0
  107. data/plugins/application_swt/lib/application_swt/menu/binding_translator.rb +94 -0
  108. data/plugins/application_swt/lib/application_swt/notebook.rb +148 -0
  109. data/plugins/application_swt/lib/application_swt/notebook/tab_drag_and_drop_listener.rb +124 -0
  110. data/plugins/application_swt/lib/application_swt/notebook/tab_transfer.rb +83 -0
  111. data/plugins/application_swt/lib/application_swt/speedbar.rb +185 -0
  112. data/plugins/application_swt/lib/application_swt/speedbar/button_item.rb +20 -0
  113. data/plugins/application_swt/lib/application_swt/speedbar/combo_item.rb +55 -0
  114. data/plugins/application_swt/lib/application_swt/speedbar/label_item.rb +15 -0
  115. data/plugins/application_swt/lib/application_swt/speedbar/slider_item.rb +32 -0
  116. data/plugins/application_swt/lib/application_swt/speedbar/text_box_item.rb +36 -0
  117. data/plugins/application_swt/lib/application_swt/speedbar/toggle_item.rb +29 -0
  118. data/plugins/application_swt/lib/application_swt/tab.rb +84 -0
  119. data/plugins/application_swt/lib/application_swt/toolbar.rb +138 -0
  120. data/plugins/application_swt/lib/application_swt/toolbar/binding_translator.rb +94 -0
  121. data/plugins/application_swt/lib/application_swt/treebook.rb +78 -0
  122. data/plugins/application_swt/lib/application_swt/window.rb +419 -0
  123. data/plugins/application_swt/lib/dist/application_swt.jar +0 -0
  124. data/plugins/application_swt/lib/swt/graphics_utils.rb +193 -0
  125. data/plugins/application_swt/lib/swt/vtab_folder.rb +177 -0
  126. data/plugins/application_swt/lib/swt/vtab_item.rb +78 -0
  127. data/plugins/application_swt/lib/swt/vtab_label.rb +127 -0
  128. data/plugins/application_swt/plugin.rb +8 -0
  129. data/plugins/application_swt/spec/application_swt/gradient_spec.rb +133 -0
  130. data/plugins/application_swt/spec/application_swt/menu/binding_translator_spec.rb +73 -0
  131. data/plugins/application_swt/spec/application_swt/menu_spec.rb +7 -0
  132. data/plugins/application_swt/spec/spec_helper.rb +20 -0
  133. data/plugins/application_swt/src/com/redcareditor/application_swt/CocoaUIEnhancer.java +313 -0
  134. data/plugins/auto_completer/features/auto_complete.feature +65 -0
  135. data/plugins/auto_completer/features/step_definitions/auto_complete_steps.rb +4 -0
  136. data/plugins/auto_completer/features/support/env.rb +2 -0
  137. data/plugins/auto_completer/lib/auto_completer.rb +129 -0
  138. data/plugins/auto_completer/lib/auto_completer/current_document_completion_source.rb +19 -0
  139. data/plugins/auto_completer/lib/auto_completer/document_controller.rb +52 -0
  140. data/plugins/auto_completer/lib/auto_completer/list_dialog.rb +21 -0
  141. data/plugins/auto_completer/lib/auto_completer/word_iterator.rb +48 -0
  142. data/plugins/auto_completer/lib/auto_completer/word_list.rb +47 -0
  143. data/plugins/auto_completer/plugin.rb +10 -0
  144. data/plugins/auto_indenter/features/java_style_indentation.feature +36 -0
  145. data/plugins/auto_indenter/features/ruby_style_indentation.feature +42 -0
  146. data/plugins/auto_indenter/features/step_definitions/indentation_steps.rb +15 -0
  147. data/plugins/auto_indenter/features/support/env.rb +1 -0
  148. data/plugins/auto_indenter/lib/auto_indenter.rb +108 -0
  149. data/plugins/auto_indenter/lib/auto_indenter/analyzer.rb +100 -0
  150. data/plugins/auto_indenter/lib/auto_indenter/commands.rb +66 -0
  151. data/plugins/auto_indenter/lib/auto_indenter/document_controller.rb +103 -0
  152. data/plugins/auto_indenter/lib/auto_indenter/rules.rb +41 -0
  153. data/plugins/auto_indenter/plugin.rb +9 -0
  154. data/plugins/auto_indenter/spec/auto_indenter/analyzer_spec.rb +151 -0
  155. data/plugins/auto_indenter/spec/spec_helper.rb +5 -0
  156. data/plugins/auto_pairer/features/auto_pairer.feature +92 -0
  157. data/plugins/auto_pairer/features/step_definitions/auto_pairer_steps.rb +0 -0
  158. data/plugins/auto_pairer/features/support/env.rb +1 -0
  159. data/plugins/auto_pairer/lib/auto_pairer.rb +12 -0
  160. data/plugins/auto_pairer/lib/auto_pairer/document_controller.rb +168 -0
  161. data/plugins/auto_pairer/lib/auto_pairer/pairs_for_scope.rb +57 -0
  162. data/plugins/auto_pairer/plugin.rb +9 -0
  163. data/plugins/clipboard-viewer/Screenshot.png +0 -0
  164. data/plugins/clipboard-viewer/lib/clipboard_viewer.rb +50 -0
  165. data/plugins/clipboard-viewer/lib/clipboard_viewer/browser_controller.rb +27 -0
  166. data/plugins/clipboard-viewer/lib/clipboard_viewer/clipboard_bar.rb +67 -0
  167. data/plugins/clipboard-viewer/plugin.rb +9 -0
  168. data/plugins/clipboard-viewer/views/clipboard.html.erb +19 -0
  169. data/plugins/clipboard-viewer/views/default.css +43 -0
  170. data/plugins/clipboard-viewer/views/redcar_small_icon.png +0 -0
  171. data/plugins/comment/features/line_comment.feature +249 -0
  172. data/plugins/comment/features/selection_comment.feature +21 -0
  173. data/plugins/comment/features/step_definitions/comment_steps.rb +7 -0
  174. data/plugins/comment/lib/comment.rb +268 -0
  175. data/plugins/comment/plugin.rb +7 -0
  176. data/plugins/comment/vendor/comment_lib.json +47 -0
  177. data/plugins/connection_manager/lib/connection_manager.rb +57 -0
  178. data/plugins/connection_manager/lib/connection_manager/commands.rb +14 -0
  179. data/plugins/connection_manager/lib/connection_manager/connection_store.rb +87 -0
  180. data/plugins/connection_manager/lib/connection_manager/controller.rb +100 -0
  181. data/plugins/connection_manager/lib/connection_manager/filter_dialog.rb +38 -0
  182. data/plugins/connection_manager/lib/connection_manager/private_key_store.rb +93 -0
  183. data/plugins/connection_manager/plugin.rb +12 -0
  184. data/plugins/connection_manager/views/index.html.erb +284 -0
  185. data/plugins/core/lib/core.rb +41 -0
  186. data/plugins/core/lib/core/controller.rb +23 -0
  187. data/plugins/core/lib/core/gui.rb +100 -0
  188. data/plugins/core/lib/core/has_spi.rb +10 -0
  189. data/plugins/core/lib/core/interface.rb +73 -0
  190. data/plugins/core/lib/core/model.rb +11 -0
  191. data/plugins/core/lib/core/observable.rb +115 -0
  192. data/plugins/core/lib/core/observable_struct.rb +34 -0
  193. data/plugins/core/lib/core/persistent_cache.rb +57 -0
  194. data/plugins/core/lib/core/plugin.rb +12 -0
  195. data/plugins/core/lib/core/plugin/storage.rb +133 -0
  196. data/plugins/core/lib/core/reentry_helpers.rb +13 -0
  197. data/plugins/core/lib/core/resource.rb +86 -0
  198. data/plugins/core/lib/core/task.rb +62 -0
  199. data/plugins/core/lib/core/task_queue.rb +72 -0
  200. data/plugins/core/plugin.rb +7 -0
  201. data/plugins/core/spec/core/base_storage_spec.rb +81 -0
  202. data/plugins/core/spec/core/gui_spec.rb +27 -0
  203. data/plugins/core/spec/core/observable_spec.rb +104 -0
  204. data/plugins/core/spec/core/persistent_cache_spec.rb +100 -0
  205. data/plugins/core/spec/core/resource_spec.rb +125 -0
  206. data/plugins/core/spec/core/shared_storage_spec.rb +49 -0
  207. data/plugins/core/spec/core/storage_spec.rb +27 -0
  208. data/plugins/core/spec/core/task_queue_spec.rb +199 -0
  209. data/plugins/core/spec/spec_helper.rb +27 -0
  210. data/plugins/declarations/lib/declarations.rb +159 -0
  211. data/plugins/declarations/lib/declarations/completion_source.rb +22 -0
  212. data/plugins/declarations/lib/declarations/file.rb +68 -0
  213. data/plugins/declarations/lib/declarations/parser.rb +186 -0
  214. data/plugins/declarations/lib/declarations/select_tag_dialog.rb +45 -0
  215. data/plugins/declarations/plugin.rb +7 -0
  216. data/plugins/declarations/spec/declarations/file_spec.rb +62 -0
  217. data/plugins/declarations/spec/fixtures/federalist.rb +15 -0
  218. data/plugins/declarations/spec/spec_helper.rb +5 -0
  219. data/plugins/document_search/Readme.md +14 -0
  220. data/plugins/document_search/features/find.feature +541 -0
  221. data/plugins/document_search/features/incremental_search.feature +351 -0
  222. data/plugins/document_search/features/replace.feature +178 -0
  223. data/plugins/document_search/features/step_definitions/find_steps.rb +16 -0
  224. data/plugins/document_search/features/support/env.rb +14 -0
  225. data/plugins/document_search/lib/document_search.rb +191 -0
  226. data/plugins/document_search/lib/document_search/commands.rb +307 -0
  227. data/plugins/document_search/lib/document_search/find_speedbar.rb +162 -0
  228. data/plugins/document_search/lib/document_search/incremental_search_speedbar.rb +70 -0
  229. data/plugins/document_search/lib/document_search/query_options.rb +21 -0
  230. data/plugins/document_search/plugin.rb +8 -0
  231. data/plugins/edit_view/features/align_assignment.feature +106 -0
  232. data/plugins/edit_view/features/case_change.feature +67 -0
  233. data/plugins/edit_view/features/cursor_navigation.feature +36 -0
  234. data/plugins/edit_view/features/cut_and_paste.feature +45 -0
  235. data/plugins/edit_view/features/grammar.feature +11 -0
  236. data/plugins/edit_view/features/indentation_commands.feature +49 -0
  237. data/plugins/edit_view/features/line_delimiter.feature +47 -0
  238. data/plugins/edit_view/features/multiple_notebooks.feature +52 -0
  239. data/plugins/edit_view/features/multiple_windows.feature +48 -0
  240. data/plugins/edit_view/features/new_tab.feature +11 -0
  241. data/plugins/edit_view/features/soft_tabs.feature +243 -0
  242. data/plugins/edit_view/features/sort_lines.feature +15 -0
  243. data/plugins/edit_view/features/step_definitions/editing_steps.rb +350 -0
  244. data/plugins/edit_view/features/step_definitions/grammar_steps.rb +4 -0
  245. data/plugins/edit_view/features/step_definitions/key_steps.rb +48 -0
  246. data/plugins/edit_view/features/step_definitions/notebook_steps.rb +59 -0
  247. data/plugins/edit_view/features/step_definitions/tab_steps.rb +113 -0
  248. data/plugins/edit_view/features/step_definitions/window_steps.rb +86 -0
  249. data/plugins/edit_view/features/support/env.rb +59 -0
  250. data/plugins/edit_view/features/switch_tabs.feature +106 -0
  251. data/plugins/edit_view/features/tabs.feature +146 -0
  252. data/plugins/edit_view/features/undo_and_redo.feature +73 -0
  253. data/plugins/edit_view/features/word_matching.feature +67 -0
  254. data/plugins/edit_view/lib/edit_view.rb +659 -0
  255. data/plugins/edit_view/lib/edit_view/actions/arrow_keys.rb +170 -0
  256. data/plugins/edit_view/lib/edit_view/actions/cmd_enter.rb +11 -0
  257. data/plugins/edit_view/lib/edit_view/actions/deletion.rb +40 -0
  258. data/plugins/edit_view/lib/edit_view/actions/esc.rb +15 -0
  259. data/plugins/edit_view/lib/edit_view/actions/tab.rb +70 -0
  260. data/plugins/edit_view/lib/edit_view/command.rb +14 -0
  261. data/plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb +55 -0
  262. data/plugins/edit_view/lib/edit_view/commands/text_conversion_commands.rb +85 -0
  263. data/plugins/edit_view/lib/edit_view/document.rb +796 -0
  264. data/plugins/edit_view/lib/edit_view/document/command.rb +25 -0
  265. data/plugins/edit_view/lib/edit_view/document/controller.rb +43 -0
  266. data/plugins/edit_view/lib/edit_view/document/history.rb +41 -0
  267. data/plugins/edit_view/lib/edit_view/document/indentation.rb +40 -0
  268. data/plugins/edit_view/lib/edit_view/document/mirror.rb +42 -0
  269. data/plugins/edit_view/lib/edit_view/edit_tab.rb +59 -0
  270. data/plugins/edit_view/lib/edit_view/grammar.rb +58 -0
  271. data/plugins/edit_view/lib/edit_view/grammars/default.rb +10 -0
  272. data/plugins/edit_view/lib/edit_view/grammars/ruby.rb +10 -0
  273. data/plugins/edit_view/lib/edit_view/grammars/ruby_on_rails.rb +7 -0
  274. data/plugins/edit_view/lib/edit_view/info_speedbar.rb +98 -0
  275. data/plugins/edit_view/lib/edit_view/modified_tabs_checker.rb +35 -0
  276. data/plugins/edit_view/lib/edit_view/select_font_dialog.rb +45 -0
  277. data/plugins/edit_view/lib/edit_view/select_theme_dialog.rb +42 -0
  278. data/plugins/edit_view/lib/edit_view/tab_settings.rb +135 -0
  279. data/plugins/edit_view/plugin.rb +9 -0
  280. data/plugins/edit_view/spec/edit_view/document/indentation_spec.rb +112 -0
  281. data/plugins/edit_view/spec/edit_view/document_spec.rb +130 -0
  282. data/plugins/edit_view/spec/spec_helper.rb +5 -0
  283. data/plugins/edit_view_swt/lib/edit_view_swt.rb +621 -0
  284. data/plugins/edit_view_swt/lib/edit_view_swt/document.rb +224 -0
  285. data/plugins/edit_view_swt/lib/edit_view_swt/edit_tab.rb +50 -0
  286. data/plugins/edit_view_swt/lib/edit_view_swt/word_movement.rb +68 -0
  287. data/plugins/edit_view_swt/plugin.rb +9 -0
  288. data/plugins/edit_view_swt/spec/edit_view_swt/word_movement_spec.rb +29 -0
  289. data/plugins/edit_view_swt/spec/spec_helper.rb +5 -0
  290. data/plugins/encryption/encryption.rb +52 -0
  291. data/plugins/encryption/ezcrypto.rb +652 -0
  292. data/plugins/encryption/jarmor-1.1.jar +0 -0
  293. data/plugins/encryption/plugin.rb +9 -0
  294. data/plugins/execute_current_tab/lib/execute_current_tab.rb +68 -0
  295. data/plugins/execute_current_tab/plugin.rb +8 -0
  296. data/plugins/help/lib/help.rb +64 -0
  297. data/plugins/help/lib/help/help_tab.rb +11 -0
  298. data/plugins/help/lib/help/view_controller.rb +30 -0
  299. data/plugins/help/plugin.rb +9 -0
  300. data/plugins/help/views/default.css +31 -0
  301. data/plugins/help/views/index.html.erb +41 -0
  302. data/plugins/help/views/redcar_small_icon.png +0 -0
  303. data/plugins/html_view/assets/blueprint/ie.css +35 -0
  304. data/plugins/html_view/assets/blueprint/print.css +29 -0
  305. data/plugins/html_view/assets/blueprint/screen.css +257 -0
  306. data/plugins/html_view/assets/blueprint/src/forms.css +65 -0
  307. data/plugins/html_view/assets/blueprint/src/grid.css +281 -0
  308. data/plugins/html_view/assets/blueprint/src/grid.png +0 -0
  309. data/plugins/html_view/assets/blueprint/src/ie.css +76 -0
  310. data/plugins/html_view/assets/blueprint/src/print.css +85 -0
  311. data/plugins/html_view/assets/blueprint/src/reset.css +38 -0
  312. data/plugins/html_view/assets/blueprint/src/typography.css +106 -0
  313. data/plugins/html_view/assets/jquery-1.4.min.js +151 -0
  314. data/plugins/html_view/assets/json2.js +476 -0
  315. data/plugins/html_view/assets/redcar.css +44 -0
  316. data/plugins/html_view/features/browser_bar.feature +47 -0
  317. data/plugins/html_view/features/fixtures/other.html +1 -0
  318. data/plugins/html_view/features/fixtures/sample.html +1 -0
  319. data/plugins/html_view/features/step_definitions/html_view_steps.rb +64 -0
  320. data/plugins/html_view/features/step_definitions/web_view_steps.rb +12 -0
  321. data/plugins/html_view/features/support/env.rb +27 -0
  322. data/plugins/html_view/features/web_preview.feature +21 -0
  323. data/plugins/html_view/lib/html_controller.rb +50 -0
  324. data/plugins/html_view/lib/html_view.rb +170 -0
  325. data/plugins/html_view/lib/html_view/browser_bar.rb +82 -0
  326. data/plugins/html_view/lib/html_view/commands.rb +64 -0
  327. data/plugins/html_view/lib/html_view/default_controller.rb +23 -0
  328. data/plugins/html_view/lib/html_view/html_tab.rb +40 -0
  329. data/plugins/html_view/plugin.rb +13 -0
  330. data/plugins/html_view/views/default.css +117 -0
  331. data/plugins/html_view/views/index.html.erb +5 -0
  332. data/plugins/html_view/views/watermark-48.png +0 -0
  333. data/plugins/java/features/fixtures/lib/classes.jar +0 -0
  334. data/plugins/java/features/fixtures/test.java +0 -0
  335. data/plugins/java/features/support/env.rb +27 -0
  336. data/plugins/java/features/syntax_check_java.feature +86 -0
  337. data/plugins/java/lib/syntax_check/java.rb +86 -0
  338. data/plugins/java/plugin.rb +7 -0
  339. data/plugins/key_bindings/lib/key_bindings.rb +34 -0
  340. data/plugins/key_bindings/plugin.rb +8 -0
  341. data/plugins/key_bindings/spec/spec_helper.rb +5 -0
  342. data/plugins/line_tools/features/clear_line.feature +25 -0
  343. data/plugins/line_tools/features/kill_line.feature +25 -0
  344. data/plugins/line_tools/features/lower_text.feature +54 -0
  345. data/plugins/line_tools/features/raise_text.feature +50 -0
  346. data/plugins/line_tools/features/replace_line.feature +33 -0
  347. data/plugins/line_tools/features/step_definitions/line_tools_steps.rb +23 -0
  348. data/plugins/line_tools/features/support/env.rb +0 -0
  349. data/plugins/line_tools/features/trim_line.feature +73 -0
  350. data/plugins/line_tools/lib/line_tools.rb +217 -0
  351. data/plugins/line_tools/plugin.rb +9 -0
  352. data/plugins/macros/features/block_selection_in_macros.feature +48 -0
  353. data/plugins/macros/features/predictive_macros.feature +79 -0
  354. data/plugins/macros/features/record_and_run_macro.feature +87 -0
  355. data/plugins/macros/features/step_definitions/macro_steps.rb +11 -0
  356. data/plugins/macros/features/step_definitions/prediction_steps.rb +8 -0
  357. data/plugins/macros/features/support/env.rb +0 -0
  358. data/plugins/macros/lib/macros.rb +167 -0
  359. data/plugins/macros/lib/macros/action_sequence.rb +30 -0
  360. data/plugins/macros/lib/macros/commands.rb +108 -0
  361. data/plugins/macros/lib/macros/macro.rb +37 -0
  362. data/plugins/macros/lib/macros/manager_controller.rb +67 -0
  363. data/plugins/macros/lib/macros/predictive/document_controller.rb +69 -0
  364. data/plugins/macros/lib/macros/predictive/sequence_finder.rb +112 -0
  365. data/plugins/macros/plugin.rb +9 -0
  366. data/plugins/macros/spec/macros/predictive/sequence_finder_spec.rb +142 -0
  367. data/plugins/macros/spec/spec_helper.rb +6 -0
  368. data/plugins/macros/views/macro_manager.html.erb +92 -0
  369. data/plugins/my_plugin/lib/my_plugin.rb +47 -0
  370. data/plugins/my_plugin/plugin.rb +8 -0
  371. data/plugins/open_default_app/lib/open_default_app.rb +61 -0
  372. data/plugins/open_default_app/plugin.rb +8 -0
  373. data/plugins/open_default_app/screenshot.png +0 -0
  374. data/plugins/outline_view/features/outline_view.feature +79 -0
  375. data/plugins/outline_view/features/step_definitions/outline_steps.rb +45 -0
  376. data/plugins/outline_view/lib/outline_view.rb +66 -0
  377. data/plugins/outline_view/lib/outline_view/commands.rb +13 -0
  378. data/plugins/outline_view/plugin.rb +10 -0
  379. data/plugins/outline_view/spec/fixtures/some_project/javascript.js +10 -0
  380. data/plugins/outline_view/spec/fixtures/some_project/nothing_to_see.rb +0 -0
  381. data/plugins/outline_view/spec/fixtures/some_project/one_lonely_class.rb +2 -0
  382. data/plugins/outline_view/spec/fixtures/some_project/similar_names.rb +18 -0
  383. data/plugins/outline_view/spec/fixtures/some_project/something_fancy.rb +736 -0
  384. data/plugins/outline_view/spec/fixtures/some_project/trailing_space.rb +5 -0
  385. data/plugins/outline_view_swt/lib/outline_view_swt.rb +79 -0
  386. data/plugins/outline_view_swt/plugin.rb +7 -0
  387. data/plugins/pair_highlighter/lib/pair_highlighter.rb +34 -0
  388. data/plugins/pair_highlighter/lib/pair_highlighter/document_controller.rb +185 -0
  389. data/plugins/pair_highlighter/plugin.rb +9 -0
  390. data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +122 -0
  391. data/plugins/plugin_manager_ui/plugin.rb +13 -0
  392. data/plugins/plugin_manager_ui/views/index.html.erb +62 -0
  393. data/plugins/project/features/close_directory_tree.feature +28 -0
  394. data/plugins/project/features/find_file.feature +119 -0
  395. data/plugins/project/features/highlight_focussed_tab.feature +53 -0
  396. data/plugins/project/features/move_and_rename_files.feature +25 -0
  397. data/plugins/project/features/open_and_save_files.feature +85 -0
  398. data/plugins/project/features/open_directory_tree.feature +93 -0
  399. data/plugins/project/features/refresh_directory_tree.feature +44 -0
  400. data/plugins/project/features/step_definitions/directory_steps.rb +35 -0
  401. data/plugins/project/features/step_definitions/drb_steps.rb +40 -0
  402. data/plugins/project/features/step_definitions/file_steps.rb +66 -0
  403. data/plugins/project/features/step_definitions/find_file_steps.rb +7 -0
  404. data/plugins/project/features/step_definitions/project_tree_steps.rb +7 -0
  405. data/plugins/project/features/sub_project.feature +15 -0
  406. data/plugins/project/features/support/env.rb +35 -0
  407. data/plugins/project/features/watch_for_modified_files.feature +109 -0
  408. data/plugins/project/lib/project.rb +266 -0
  409. data/plugins/project/lib/project/adapters/local.rb +82 -0
  410. data/plugins/project/lib/project/adapters/remote.rb +96 -0
  411. data/plugins/project/lib/project/adapters/remote_protocols/ftp.rb +93 -0
  412. data/plugins/project/lib/project/adapters/remote_protocols/protocol.rb +94 -0
  413. data/plugins/project/lib/project/adapters/remote_protocols/sftp.rb +181 -0
  414. data/plugins/project/lib/project/commands.rb +449 -0
  415. data/plugins/project/lib/project/dir_controller.rb +275 -0
  416. data/plugins/project/lib/project/dir_mirror.rb +176 -0
  417. data/plugins/project/lib/project/drb_service.rb +86 -0
  418. data/plugins/project/lib/project/file_list.rb +164 -0
  419. data/plugins/project/lib/project/file_mirror.rb +85 -0
  420. data/plugins/project/lib/project/find_file_dialog.rb +118 -0
  421. data/plugins/project/lib/project/find_recent_dialog.rb +30 -0
  422. data/plugins/project/lib/project/manager.rb +545 -0
  423. data/plugins/project/lib/project/project_tree_controller.rb +24 -0
  424. data/plugins/project/lib/project/recent.rb +64 -0
  425. data/plugins/project/lib/project/sub_project.rb +17 -0
  426. data/plugins/project/lib/project/support/recycle.js +2 -0
  427. data/plugins/project/lib/project/support/trash.rb +73 -0
  428. data/plugins/project/plugin.rb +11 -0
  429. data/plugins/project/spec/fixture_helper.rb +30 -0
  430. data/plugins/project/spec/project/adapters/remote_protocols/ftp_spec.rb +75 -0
  431. data/plugins/project/spec/project/adapters/remote_protocols/sftp_spec.rb +121 -0
  432. data/plugins/project/spec/project/adapters/remote_spec.rb +136 -0
  433. data/plugins/project/spec/project/dir_mirror_spec.rb +65 -0
  434. data/plugins/project/spec/project/file_list_spec.rb +151 -0
  435. data/plugins/project/spec/project/file_mirror_spec.rb +97 -0
  436. data/plugins/project/spec/spec_helper.rb +26 -0
  437. data/plugins/project/views/bulk_rename.html.erb +162 -0
  438. data/plugins/project_search/features/support/env.rb +6 -0
  439. data/plugins/project_search/features/word_search.feature +34 -0
  440. data/plugins/project_search/lib/project_search.rb +82 -0
  441. data/plugins/project_search/lib/project_search/binary_data_detector.rb +46 -0
  442. data/plugins/project_search/lib/project_search/commands.rb +50 -0
  443. data/plugins/project_search/lib/project_search/hit.rb +21 -0
  444. data/plugins/project_search/lib/project_search/images/spinner.gif +0 -0
  445. data/plugins/project_search/lib/project_search/lucene_index.rb +81 -0
  446. data/plugins/project_search/lib/project_search/lucene_refresh.rb +22 -0
  447. data/plugins/project_search/lib/project_search/project.rb +14 -0
  448. data/plugins/project_search/lib/project_search/query.rb +29 -0
  449. data/plugins/project_search/lib/project_search/stylesheets/style.css +279 -0
  450. data/plugins/project_search/lib/project_search/views/_file.html.erb +58 -0
  451. data/plugins/project_search/lib/project_search/views/index.html.erb +156 -0
  452. data/plugins/project_search/lib/project_search/word_search.rb +143 -0
  453. data/plugins/project_search/lib/project_search/word_search_controller.rb +219 -0
  454. data/plugins/project_search/plugin.rb +8 -0
  455. data/plugins/project_search/spec/fixtures/project/binary_file.bin +0 -0
  456. data/plugins/project_search/spec/fixtures/project/foo.txt +43 -0
  457. data/plugins/project_search/spec/fixtures/project/qux.rb +3 -0
  458. data/plugins/project_search/spec/project_search/binary_data_detector_spec.rb +24 -0
  459. data/plugins/project_search/spec/project_search/word_search_spec.rb +157 -0
  460. data/plugins/project_search/spec/spec_helper.rb +27 -0
  461. data/plugins/redcar/features/alter_font_size.feature +26 -0
  462. data/plugins/redcar/features/goto_line_command.feature +20 -0
  463. data/plugins/redcar/features/step_definitions/env.rb +5 -0
  464. data/plugins/redcar/features/step_definitions/font_steps.rb +34 -0
  465. data/plugins/redcar/features/text_editing.feature +34 -0
  466. data/plugins/redcar/features/text_navigation.feature +30 -0
  467. data/plugins/redcar/plugin.rb +17 -0
  468. data/plugins/redcar/redcar.rb +1097 -0
  469. data/plugins/redcar_debug/lib/redcar_debug.rb +91 -0
  470. data/plugins/redcar_debug/plugin.rb +8 -0
  471. data/plugins/redcar_debug/views/history.html.erb +34 -0
  472. data/plugins/redcar_debug/views/index.html.erb +36 -0
  473. data/plugins/repl/features/command_editing.feature +55 -0
  474. data/plugins/repl/features/command_history.feature +75 -0
  475. data/plugins/repl/features/step_definitions/repl_steps.rb +19 -0
  476. data/plugins/repl/features/support/env.rb +24 -0
  477. data/plugins/repl/features/support/fake_repl.rb +16 -0
  478. data/plugins/repl/lib/repl.rb +40 -0
  479. data/plugins/repl/lib/repl/repl_command.rb +20 -0
  480. data/plugins/repl/lib/repl/repl_mirror.rb +255 -0
  481. data/plugins/repl/lib/repl/repl_tab.rb +154 -0
  482. data/plugins/repl/plugin.rb +8 -0
  483. data/plugins/repl/spec/repl/repl_mirror_spec.rb +72 -0
  484. data/plugins/repl/spec/spec_helper.rb +5 -0
  485. data/plugins/repl_swt/lib/repl_swt.rb +7 -0
  486. data/plugins/repl_swt/lib/repl_swt/key_listener.rb +43 -0
  487. data/plugins/repl_swt/plugin.rb +8 -0
  488. data/plugins/ruby/features/fixtures/test.rb +0 -0
  489. data/plugins/ruby/features/support/env.rb +4 -0
  490. data/plugins/ruby/features/syntax_check_ruby.feature +26 -0
  491. data/plugins/ruby/lib/ruby.rb +35 -0
  492. data/plugins/ruby/lib/ruby/repl_mirror.rb +46 -0
  493. data/plugins/ruby/lib/ruby/syntax_checker.rb +30 -0
  494. data/plugins/ruby/plugin.rb +8 -0
  495. data/plugins/ruby/spec/ruby/repl_mirror_spec.rb +202 -0
  496. data/plugins/ruby/spec/spec_helper.rb +5 -0
  497. data/plugins/runnables/features/command_tree.feature +63 -0
  498. data/plugins/runnables/features/file_runner_input.feature +21 -0
  499. data/plugins/runnables/features/parameter_input.feature +43 -0
  500. data/plugins/runnables/features/run_alternate_command.feature +15 -0
  501. data/plugins/runnables/features/run_command_tab.feature +47 -0
  502. data/plugins/runnables/features/step_definitions/runnable_steps.rb +28 -0
  503. data/plugins/runnables/features/support/env.rb +124 -0
  504. data/plugins/runnables/lib/runnables.rb +180 -0
  505. data/plugins/runnables/lib/runnables/command_output_controller.rb +183 -0
  506. data/plugins/runnables/lib/runnables/commands.rb +82 -0
  507. data/plugins/runnables/lib/runnables/output_processor.rb +74 -0
  508. data/plugins/runnables/lib/runnables/running_process_checker.rb +34 -0
  509. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable.rb +62 -0
  510. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_group.rb +45 -0
  511. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_type_group.rb +30 -0
  512. data/plugins/runnables/lib/runnables/tree_mirror/tree_controller.rb +36 -0
  513. data/plugins/runnables/lib/runnables/tree_mirror/tree_mirror.rb +66 -0
  514. data/plugins/runnables/plugin.rb +9 -0
  515. data/plugins/runnables/spec/runnables/output_processor_spec.rb +57 -0
  516. data/plugins/runnables/spec/spec_helper.rb +5 -0
  517. data/plugins/runnables/views/basic_ansi.css +34 -0
  518. data/plugins/runnables/views/color_tester.html +50 -0
  519. data/plugins/runnables/views/command_output.html.erb +32 -0
  520. data/plugins/runnables/views/default.css +79 -0
  521. data/plugins/runnables/views/indicator.gif +0 -0
  522. data/plugins/runnables/views/redcar_small_icon.png +0 -0
  523. data/plugins/runnables/views/reset.css +53 -0
  524. data/plugins/runnables/views/running_test.html +41 -0
  525. data/plugins/runnables/views/wedgeDown.png +0 -0
  526. data/plugins/runnables/views/wedgeRight.png +0 -0
  527. data/plugins/scm/lib/scm.rb +296 -0
  528. data/plugins/scm/lib/scm/commands.rb +48 -0
  529. data/plugins/scm/lib/scm/commit_mirror.rb +72 -0
  530. data/plugins/scm/lib/scm/diff_mirror.rb +31 -0
  531. data/plugins/scm/lib/scm/errors.rb +8 -0
  532. data/plugins/scm/lib/scm/model.rb +275 -0
  533. data/plugins/scm/lib/scm/scm_changes_controller.rb +107 -0
  534. data/plugins/scm/lib/scm/scm_changes_mirror.rb +51 -0
  535. data/plugins/scm/lib/scm/scm_changes_mirror/change.rb +63 -0
  536. data/plugins/scm/lib/scm/scm_changes_mirror/changes_node.rb +47 -0
  537. data/plugins/scm/lib/scm/scm_changes_mirror/drag_controller.rb +78 -0
  538. data/plugins/scm/lib/scm/scm_commits_controller.rb +49 -0
  539. data/plugins/scm/lib/scm/scm_commits_mirror.rb +36 -0
  540. data/plugins/scm/lib/scm/scm_commits_mirror/commit.rb +26 -0
  541. data/plugins/scm/lib/scm/scm_commits_mirror/commits_node.rb +38 -0
  542. data/plugins/scm/plugin.rb +8 -0
  543. data/plugins/scm/spec/spec_helper.rb +5 -0
  544. data/plugins/scm_git/lib/scm_git.rb +543 -0
  545. data/plugins/scm_git/lib/scm_git/change.rb +137 -0
  546. data/plugins/scm_git/lib/scm_git/commit.rb +18 -0
  547. data/plugins/scm_git/lib/scm_git/config_file.rb +31 -0
  548. data/plugins/scm_git/plugin.rb +7 -0
  549. data/plugins/scm_hg/lib/scm_hg.rb +30 -0
  550. data/plugins/scm_hg/plugin.rb +7 -0
  551. data/plugins/scm_svn/LICENSE +48 -0
  552. data/plugins/scm_svn/features/add_and_commit.feature +18 -0
  553. data/plugins/scm_svn/features/checkout.feature +5 -0
  554. data/plugins/scm_svn/features/edit_and_index.feature +12 -0
  555. data/plugins/scm_svn/features/ignore_files.feature +14 -0
  556. data/plugins/scm_svn/features/merge.feature +34 -0
  557. data/plugins/scm_svn/features/resolve_conflict.feature +23 -0
  558. data/plugins/scm_svn/features/revert_and_delete.feature +21 -0
  559. data/plugins/scm_svn/features/step_definitions/branch_and_merge_steps.rb +27 -0
  560. data/plugins/scm_svn/features/step_definitions/checkout_steps.rb +25 -0
  561. data/plugins/scm_svn/features/step_definitions/edit_and_index_steps.rb +50 -0
  562. data/plugins/scm_svn/features/step_definitions/scm_svn_steps.rb +57 -0
  563. data/plugins/scm_svn/features/support/env.rb +71 -0
  564. data/plugins/scm_svn/features/switch_branches.feature +53 -0
  565. data/plugins/scm_svn/features/update.feature +16 -0
  566. data/plugins/scm_svn/lib/scm_svn.rb +445 -0
  567. data/plugins/scm_svn/lib/scm_svn/change.rb +116 -0
  568. data/plugins/scm_svn/plugin.rb +7 -0
  569. data/plugins/snippets/features/snippet_indenting.feature +87 -0
  570. data/plugins/snippets/features/snippets.feature +398 -0
  571. data/plugins/snippets/features/step_definitions/snippet_steps.rb +16 -0
  572. data/plugins/snippets/features/support/env.rb +1 -0
  573. data/plugins/snippets/lib/snippets.rb +111 -0
  574. data/plugins/snippets/lib/snippets/document_controller.rb +591 -0
  575. data/plugins/snippets/lib/snippets/explorer.rb +48 -0
  576. data/plugins/snippets/lib/snippets/tab_handler.rb +117 -0
  577. data/plugins/snippets/plugin.rb +9 -0
  578. data/plugins/splash_screen/plugin.rb +8 -0
  579. data/plugins/splash_screen/splash_screen.rb +62 -0
  580. data/plugins/strip_trailing_spaces/features/fixtures/test.txt +3 -0
  581. data/plugins/strip_trailing_spaces/features/strip_trailing_spaces.feature +34 -0
  582. data/plugins/strip_trailing_spaces/lib/strip_trailing_spaces.rb +60 -0
  583. data/plugins/strip_trailing_spaces/plugin.rb +8 -0
  584. data/plugins/syntax_check/README +6 -0
  585. data/plugins/syntax_check/features/step_definitions/syntax_check_steps.rb +11 -0
  586. data/plugins/syntax_check/features/support/env.rb +3 -0
  587. data/plugins/syntax_check/lib/syntax_check.rb +100 -0
  588. data/plugins/syntax_check/lib/syntax_check/annotation.rb +61 -0
  589. data/plugins/syntax_check/lib/syntax_check/checker.rb +47 -0
  590. data/plugins/syntax_check/lib/syntax_check/error.rb +24 -0
  591. data/plugins/syntax_check/plugin.rb +7 -0
  592. data/plugins/task_manager/lib/task_manager.rb +30 -0
  593. data/plugins/task_manager/plugin.rb +11 -0
  594. data/plugins/task_manager/views/index.html.erb +70 -0
  595. data/plugins/test_runner/lib/test_runner.rb +40 -0
  596. data/plugins/test_runner/lib/test_runner/jasmine_test_runner.rb +15 -0
  597. data/plugins/test_runner/lib/test_runner/rspec_runner.rb +20 -0
  598. data/plugins/test_runner/lib/test_runner/run_test_command.rb +63 -0
  599. data/plugins/test_runner/lib/test_runner/runnable_test_runner.rb +42 -0
  600. data/plugins/test_runner/plugin.rb +8 -0
  601. data/plugins/test_runner/spec/run_test_command_spec.rb +51 -0
  602. data/plugins/test_runner/spec/spec_helper.rb +5 -0
  603. data/plugins/textmate/features/bundle_tree.feature +23 -0
  604. data/plugins/textmate/features/step_definitions/tree_steps.rb +57 -0
  605. data/plugins/textmate/features/support/env.rb +19 -0
  606. data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/If.tmSnippet +18 -0
  607. data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/If__Else.tmSnippet +20 -0
  608. data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Include.tmSnippet +16 -0
  609. data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Loop.tmSnippet +18 -0
  610. data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Unless.tmSnippet +18 -0
  611. data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Var.tmSnippet +16 -0
  612. data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/next_If__Else.tmSnippet +20 -0
  613. data/plugins/textmate/features/support/test_bundle.tmbundle/info.plist +26 -0
  614. data/plugins/textmate/lib/textmate.rb +202 -0
  615. data/plugins/textmate/lib/textmate/bundle.rb +100 -0
  616. data/plugins/textmate/lib/textmate/commands.rb +79 -0
  617. data/plugins/textmate/lib/textmate/environment.rb +76 -0
  618. data/plugins/textmate/lib/textmate/plist.rb +80 -0
  619. data/plugins/textmate/lib/textmate/preference.rb +125 -0
  620. data/plugins/textmate/lib/textmate/snippet.rb +47 -0
  621. data/plugins/textmate/lib/textmate/tree_mirror.rb +206 -0
  622. data/plugins/textmate/plugin.rb +8 -0
  623. data/plugins/textmate/views/installed_bundles.html.erb +24 -0
  624. data/plugins/todo_list/README.md +22 -0
  625. data/plugins/todo_list/features/support/env.rb +8 -0
  626. data/plugins/todo_list/features/todo_list.feature +26 -0
  627. data/plugins/todo_list/lib/todo_list.rb +49 -0
  628. data/plugins/todo_list/lib/todo_list/file_parser.rb +58 -0
  629. data/plugins/todo_list/lib/todo_list/todo_controller.rb +99 -0
  630. data/plugins/todo_list/plugin.rb +11 -0
  631. data/plugins/todo_list/spec/fixtures/project/FIXME.file +3 -0
  632. data/plugins/todo_list/spec/fixtures/project/NOTE.ignored.file +1 -0
  633. data/plugins/todo_list/spec/fixtures/project/OPTIMIZE_colon.file +1 -0
  634. data/plugins/todo_list/spec/fixtures/project/XXX.ignored +1 -0
  635. data/plugins/todo_list/spec/fixtures/project/ignored_directory/TODO.file +2 -0
  636. data/plugins/todo_list/spec/fixtures/settings.rb +11 -0
  637. data/plugins/todo_list/spec/spec_helper.rb +6 -0
  638. data/plugins/todo_list/spec/todo_list/file_parser_spec.rb +35 -0
  639. data/plugins/todo_list/views/default.css +15 -0
  640. data/plugins/todo_list/views/index.html.erb +19 -0
  641. data/plugins/todo_list/views/redcar_small_icon.png +0 -0
  642. data/plugins/tree_view_swt/lib/tree_view_swt.rb +496 -0
  643. data/plugins/tree_view_swt/plugin.rb +9 -0
  644. data/plugins/web_bookmarks/Screenshot.png +0 -0
  645. data/plugins/web_bookmarks/features/bookmark.feature +37 -0
  646. data/plugins/web_bookmarks/features/fixtures/other.html +1 -0
  647. data/plugins/web_bookmarks/features/fixtures/sample.html +1 -0
  648. data/plugins/web_bookmarks/features/step_definitions/web_steps.rb +4 -0
  649. data/plugins/web_bookmarks/features/support/env.rb +26 -0
  650. data/plugins/web_bookmarks/lib/web_bookmarks.rb +49 -0
  651. data/plugins/web_bookmarks/lib/web_bookmarks/bookmark.rb +52 -0
  652. data/plugins/web_bookmarks/lib/web_bookmarks/commands.rb +65 -0
  653. data/plugins/web_bookmarks/lib/web_bookmarks/tree.rb +74 -0
  654. data/plugins/web_bookmarks/plugin.rb +10 -0
  655. metadata +937 -0
@@ -0,0 +1,8 @@
1
+
2
+ Plugin.define do
3
+ name "open_default_app"
4
+ version "0.2"
5
+ file "lib", "open_default_app.rb"
6
+ object "Redcar::OpenDefaultApp"
7
+ dependencies "redcar", ">0"
8
+ end
@@ -0,0 +1,79 @@
1
+ Feature: Outline View
2
+
3
+ Background:
4
+ Given I will choose "plugins/outline_view/spec/fixtures/some_project" from the "open_directory" dialog
5
+ When I open a directory
6
+
7
+ Scenario: Outline View without anything to see
8
+ Given I have opened "plugins/outline_view/spec/fixtures/some_project/nothing_to_see.rb"
9
+ And I run the command Redcar::OutlineView::OpenOutlineViewCommand
10
+ Then there should be an outline view open
11
+ And the outline view should have no entries
12
+
13
+ Scenario: Outline View with something small
14
+ Given I have opened "plugins/outline_view/spec/fixtures/some_project/one_lonely_class.rb"
15
+ And I run the command Redcar::OutlineView::OpenOutlineViewCommand
16
+ Then there should be an outline view open
17
+ And the outline view should have 1 entry
18
+ And I should see "IAmAllAlone" at 0 with the "class" icon in the outline view
19
+ When I select the outline view
20
+ Then the selected text should be "class IAmAllAlone"
21
+
22
+ Scenario: Ruby methods with trailing space
23
+ Given I have opened "plugins/outline_view/spec/fixtures/some_project/trailing_space.rb"
24
+ And I run the command Redcar::OutlineView::OpenOutlineViewCommand
25
+ Then there should be an outline view open
26
+ And the outline view should have 2 entries
27
+ And I should see "trailing_space" at 1 with the "method" icon in the outline view
28
+
29
+ Scenario: Something fancier
30
+ Given I have opened "plugins/outline_view/spec/fixtures/some_project/something_fancy.rb"
31
+ And I run the command Redcar::OutlineView::OpenOutlineViewCommand
32
+ Then there should be an outline view open
33
+ And the outline view should have 88 entries
34
+ And I should see "Redcar" at 0 with the "class" icon in the outline view
35
+ When I set the outline filter to "delim"
36
+ And I wait 2 seconds
37
+ Then the outline view should have 2 entries
38
+ And I should see "delim" at 1 with the "alias" icon in the outline view
39
+ And I should see "line_delimiter" at 0 with the "method" icon in the outline view
40
+ When I set the outline filter to "selected"
41
+ And I wait 2 seconds
42
+ Then the outline view should have 2 entries
43
+ And I should see "selection_range_changed" at 0 with the "method" icon in the outline view
44
+ And I should see "selected_text" at 1 with the "method" icon in the outline view
45
+ And I select the outline view
46
+ Then the selected text should be " def selection_range_changed(start_offset, end_offset)\n"
47
+
48
+ Scenario: Matching kinda similar names
49
+ Given I have opened "plugins/outline_view/spec/fixtures/some_project/similar_names.rb"
50
+ And I run the command Redcar::OutlineView::OpenOutlineViewCommand
51
+ Then there should be an outline view open
52
+ And the outline view should have 6 entries
53
+ And I should see "SimilarNames" at 0 with the "class" icon in the outline view
54
+ And I should see "file" at 1 with the "method" icon in the outline view
55
+ And I should see "file_name" at 2 with the "method" icon in the outline view
56
+ And I should see "file_type" at 3 with the "method" icon in the outline view
57
+ And I should see "file_handle" at 4 with the "method" icon in the outline view
58
+ And I should see "file" at 5 with the "method" icon in the outline view
59
+ When I set the outline filter to "file"
60
+ And I wait 2 seconds
61
+ Then the outline view should have 5 entries
62
+
63
+ Scenario: Simple Javascript
64
+ Given I have opened "plugins/outline_view/spec/fixtures/some_project/javascript.js"
65
+ And I run the command Redcar::OutlineView::OpenOutlineViewCommand
66
+ Then there should be an outline view open
67
+ And the outline view should have 3 entries
68
+ And I should see "SomeConstructor" at 0 with the "class" icon in the outline view
69
+ When I set the outline filter to "some"
70
+ And I wait 2 seconds
71
+ Then the outline view should have 2 entries
72
+ And I should see "someMethod" at 1 with the "method" icon in the outline view
73
+ And I should see "SomeConstructor" at 0 with the "class" icon in the outline view
74
+ When I set the outline filter to "another"
75
+ And I wait 2 seconds
76
+ Then the outline view should have 1 entry
77
+ And I should see "anotherMethod" at 0 with the "method" icon in the outline view
78
+ And I select the outline view
79
+ Then the selected text should be "function anotherMethod(a,b,c)"
@@ -0,0 +1,45 @@
1
+ def outline_view
2
+ dialog(Redcar::OutlineViewSWT::OutlineViewDialogSWT)
3
+ end
4
+
5
+ def outline_view_items
6
+ outline_view.list.get_items.to_a
7
+ end
8
+
9
+ Then /^I open an outline view$/ do
10
+ Redcar::OutlineView::OutlineViewDialog.new(Redcar.app.focussed_window.focussed_notebook_tab.document).open
11
+ end
12
+
13
+ Then /^there should be an outline view open$/ do
14
+ outline_view.should_not be_nil
15
+ end
16
+
17
+ Then /^there should be no outline view open$/ do
18
+ outline_view.should be_nil
19
+ end
20
+
21
+ When /^I set the outline filter to "(.*)"$/ do |text|
22
+ outline_view.text.set_text(text)
23
+ end
24
+
25
+ When /^I select the outline view$/ do
26
+ outline_view.controller.selected
27
+ end
28
+
29
+ When /^I wait (\d+) seconds$/ do |time|
30
+ Cucumber::Ast::StepInvocation.wait_time = time.to_f
31
+ end
32
+
33
+ Then /^the outline view should have (no|\d+) entr(?:y|ies)$/ do |num|
34
+ num = (num == "no" ? 0 : num.to_i)
35
+ outline_view_items.length.should == num
36
+ end
37
+
38
+ Then /^I should see "(.*)" at (\d+)(?: with the "(.*)" icon )in the outline view$/ do |text, pos, icon|
39
+ pos = pos.to_i
40
+ outline_view_items[pos].text.should == text
41
+ icon = Redcar::OutlineViewSWT::ICONS[icon.to_sym]
42
+ item = outline_view_items[pos]
43
+ item.get_image.should == icon
44
+ end
45
+
@@ -0,0 +1,66 @@
1
+ require "outline_view/commands"
2
+
3
+ module Redcar
4
+ class OutlineView
5
+
6
+ def self.menus
7
+ Menu::Builder.build do
8
+ sub_menu "View" do
9
+ item "Current Document Outline", :command => OutlineView::OpenOutlineViewCommand, :priority => :first
10
+ end
11
+ end
12
+ end
13
+
14
+ def self.keymaps
15
+ linwin = Keymap.build("main", [:linux, :windows]) do
16
+ link "Ctrl+I", OutlineView::OpenOutlineViewCommand
17
+ end
18
+ osx = Keymap.build("main", [:osx]) do
19
+ link "Cmd+I", OutlineView::OpenOutlineViewCommand
20
+ end
21
+ [linwin, osx]
22
+ end
23
+
24
+ class OutlineViewDialog < FilterListDialog
25
+ include Redcar::Model
26
+ include Redcar::Observable
27
+
28
+ attr_accessor :document
29
+ attr_accessor :last_list
30
+
31
+ def initialize(document)
32
+ self.controller = Redcar::OutlineViewSWT.new(self)
33
+ @document = document
34
+ @last_list = {}
35
+ end
36
+
37
+ def close
38
+ super
39
+ end
40
+
41
+ def update_list(filter)
42
+ file = Declarations::File.new(@document.path)
43
+ file.add_tags_for_paths([@document.path])
44
+ re = make_regex(filter)
45
+ @last_list.clear
46
+ result = {}
47
+ file.tags.each do |name, _, match|
48
+ if name =~ re
49
+ @last_list[match] = name
50
+ result[match] = {:name => name, :kind => Declarations.match_kind(@document.path, match)}
51
+ end
52
+ end
53
+ result
54
+ end
55
+
56
+ def selected(match, closing=true)
57
+ if @last_list
58
+ Redcar.app.navigation_history.save(@document)
59
+ DocumentSearch::FindNextRegex.new(Regexp.new(Regexp.quote(match)), true).run_in_focussed_tab_edit_view
60
+ Redcar.app.navigation_history.save(@document)
61
+ close if closing
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ module Redcar
2
+ class OutlineView
3
+ class OpenOutlineViewCommand < Redcar::EditTabCommand
4
+
5
+ def execute
6
+ cur_doc = Redcar.app.focussed_window.focussed_notebook_tab.document
7
+ if cur_doc
8
+ OutlineView::OutlineViewDialog.new(cur_doc).open
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ Plugin.define do
2
+ name "outline_view"
3
+ version "0.1.0"
4
+ file "lib", "outline_view"
5
+ object "Redcar::OutlineView"
6
+ dependencies "declarations", ">0",
7
+ "edit_view", ">0",
8
+ "document_search", ">0",
9
+ "outline_view_swt", ">0"
10
+ end
@@ -0,0 +1,10 @@
1
+ function SomeConstructor(a,b,c,d,e) {
2
+ // you might wanna do stuff here
3
+ }
4
+
5
+ function someMethod(a,b,c,d) {
6
+ }
7
+
8
+ function anotherMethod(a,b,c) {
9
+ someMethod(a,b,c, null);
10
+ }
@@ -0,0 +1,2 @@
1
+ class IAmAllAlone
2
+ end
@@ -0,0 +1,18 @@
1
+ class SimilarNames
2
+
3
+ def file
4
+ end
5
+
6
+ def file_name
7
+ end
8
+
9
+ def file_type
10
+ end
11
+
12
+ def file_handle
13
+ end
14
+
15
+ def self.file
16
+ end
17
+
18
+ end
@@ -0,0 +1,736 @@
1
+ module Redcar
2
+ # This class controls access to the document text in an edit tab.
3
+ # There are methods to read, modify and register listeners
4
+ # for the document.
5
+ class Document
6
+ include Redcar::Model
7
+ include Redcar::Observable
8
+ extend Forwardable
9
+
10
+ def self.all_document_controller_types
11
+ result = []
12
+ Redcar.plugin_manager.objects_implementing(:document_controller_types).each do |object|
13
+ result += object.document_controller_types
14
+ end
15
+ result
16
+ end
17
+
18
+ class << self
19
+ attr_accessor :default_mirror
20
+ end
21
+
22
+ attr_reader :mirror, :edit_view
23
+
24
+ def initialize(edit_view)
25
+ @edit_view = edit_view
26
+ @grammar = Redcar::Grammar.new(self)
27
+ get_controllers
28
+ end
29
+
30
+ def get_controllers
31
+ @controllers = {
32
+ Controller::ModificationCallbacks => [],
33
+ Controller::NewlineCallback => [],
34
+ Controller::CursorCallbacks => [],
35
+ Controller => []
36
+ }
37
+ Document.all_document_controller_types.each do |type|
38
+ controller = type.new
39
+ controller.document = self
40
+ @controllers.each do |key, value|
41
+ if controller.is_a?(key)
42
+ value << controller
43
+ end
44
+ end
45
+ end
46
+ Redcar.plugin_manager.objects_implementing(:document_cursor_listener).each do |object|
47
+ controller = object.document_cursor_listener
48
+ controller.document = self
49
+ @controllers.each do |key, value|
50
+ if controller.is_a?(key)
51
+ value << controller
52
+ end
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ def controllers(klass=nil)
59
+ if klass
60
+ @controllers.values.flatten.uniq.select {|c| c.is_a?(klass) }
61
+ else
62
+ @controllers.values.flatten.uniq
63
+ end
64
+ end
65
+
66
+ # Call the before_save and after_save callbacks on any plugins that need it
67
+ #
68
+ # Pass self as an argument since plugins that use before_save
69
+ # will most likely need access to the document being saved.
70
+ def between_save_hooks
71
+ Redcar.plugin_manager.objects_implementing(:before_save).each do |object|
72
+ object.before_save(self)
73
+ end
74
+ yield
75
+ Redcar.plugin_manager.objects_implementing(:after_save).each do |object|
76
+ object.after_save(self)
77
+ end
78
+ end
79
+
80
+ def save!
81
+ between_save_hooks do
82
+ @mirror.commit(to_s)
83
+ @edit_view.reset_last_checked
84
+ set_modified(false)
85
+ end
86
+ end
87
+
88
+ def modified?
89
+ @modified
90
+ end
91
+
92
+ def title
93
+ @mirror ? @mirror.title : nil
94
+ end
95
+
96
+ # helper method to get the mirror's path if it has one
97
+ def path
98
+ if @mirror and @mirror.respond_to?(:path) and @mirror.path
99
+ @mirror.path
100
+ else
101
+ nil
102
+ end
103
+ end
104
+
105
+ def exists?
106
+ edit_view.exists?
107
+ end
108
+
109
+ def mirror=(new_mirror)
110
+ notify_listeners(:new_mirror, new_mirror) do
111
+ @mirror = new_mirror
112
+ mirror.add_listener(:change) do
113
+ update_from_mirror
114
+ end
115
+ update_from_mirror
116
+ end
117
+ end
118
+
119
+ def mirror_changed?
120
+ mirror and mirror.changed?
121
+ end
122
+
123
+ def verify_text(start_offset, end_offset, text)
124
+ @change = [start_offset, end_offset, text]
125
+ @controllers[Controller::ModificationCallbacks].each do |controller|
126
+ rescue_document_controller_error(controller) do
127
+ controller.before_modify(start_offset, end_offset, text)
128
+ end
129
+ end
130
+ end
131
+
132
+ def modify_text
133
+ start_offset, end_offset, text = *@change
134
+ set_modified(true)
135
+ @controllers[Controller::ModificationCallbacks].each do |controller|
136
+ rescue_document_controller_error(controller) do
137
+ controller.after_modify
138
+ end
139
+ end
140
+ @controllers[Controller::NewlineCallback].each do |controller|
141
+ if text == line_delimiter
142
+ rescue_document_controller_error(controller) do
143
+ controller.after_newline(line_at_offset(start_offset) + 1)
144
+ end
145
+ end
146
+ end
147
+ @change = nil
148
+ notify_listeners(:changed)
149
+ end
150
+
151
+ def cursor_moved(new_offset)
152
+ @controllers[Controller::CursorCallbacks].each do |controller|
153
+ rescue_document_controller_error(controller) do
154
+ controller.cursor_moved(new_offset)
155
+ end
156
+ end
157
+ end
158
+
159
+ def about_to_be_changed(start_offset, length, text)
160
+ end
161
+
162
+ def changed(start_offset, length, text)
163
+ notify_listeners(:changed)
164
+ end
165
+
166
+ def selection_range_changed(start_offset, end_offset)
167
+ notify_listeners(:selection_range_changed, start_offset..end_offset)
168
+ end
169
+
170
+ def single_line?
171
+ controller.single_line?
172
+ end
173
+
174
+ # Returns the line delimiter for this document. Either
175
+ # \n or \r\n. It will attempt to detect the delimiter from the document
176
+ # or it will default to the platform delimiter.
177
+ #
178
+ # @return [String]
179
+ def line_delimiter
180
+ controller.get_line_delimiter
181
+ end
182
+
183
+ alias :delim :line_delimiter
184
+
185
+ # Is there any text selected? (Or equivalently, is the length
186
+ # of the selection equal to 0)
187
+ #
188
+ # @return [Boolean]
189
+ def selection?
190
+ selection_range.count > 0
191
+ end
192
+
193
+ # Insert text
194
+ #
195
+ # @param [Integer] offset character offset from the start of the document
196
+ # @param [String] text text to insert
197
+ def insert(offset, text)
198
+ return unless text and offset
199
+ text = text.gsub(delim, "") if single_line?
200
+ replace(offset, 0, text)
201
+ end
202
+
203
+ # Insert text at the cursor offset
204
+ #
205
+ # @param [String] text text to insert
206
+ def insert_at_cursor(text)
207
+ insert(cursor_offset, text)
208
+ end
209
+
210
+ # Delete text
211
+ #
212
+ # @param [Integer] offset character offset from the start of the document
213
+ # @param [Integer] length length of text to delete
214
+ def delete(offset, length)
215
+ replace(offset, length, "")
216
+ end
217
+
218
+ # Replace text
219
+ #
220
+ # @param [Integer] offset character offset from the start of the document
221
+ # @param [Integer] length length of text to replace
222
+ # @param [String] text replacement text
223
+ def replace(offset, length, text)
224
+ text = text.gsub(delim, "") if single_line?
225
+ controller.replace(offset, length, text)
226
+ end
227
+
228
+ # Length of the document in characters
229
+ #
230
+ # @return [Integer]
231
+ def length
232
+ controller.length
233
+ end
234
+
235
+ # Number of lines.
236
+ #
237
+ # @return [Integer]
238
+ def line_count
239
+ controller.line_count
240
+ end
241
+
242
+ # The entire contents of the document
243
+ #
244
+ # @return [String]
245
+ def to_s
246
+ controller.to_s
247
+ end
248
+
249
+ # Set the contents of the document
250
+ #
251
+ # @param [String] text new text
252
+ def text=(text)
253
+ controller.text = text
254
+ end
255
+
256
+ def controller_text
257
+ controller.text
258
+ end
259
+
260
+ # Get the line index of the given offset
261
+ #
262
+ # @param [Integer] offset zero-based character offset
263
+ # @return [Integer] zero-based index
264
+ def line_at_offset(offset)
265
+ controller.line_at_offset(offset)
266
+ end
267
+
268
+ # Get the character offset at the start of the given line
269
+ #
270
+ # @param [Integer] line zero-based line index
271
+ # @return [Integer] zero-based character offset
272
+ def offset_at_line(line)
273
+ controller.offset_at_line(line)
274
+ end
275
+
276
+ # Get the position of the cursor.
277
+ #
278
+ # @return [Integer] zero-based character offset
279
+ def cursor_offset
280
+ controller.cursor_offset
281
+ end
282
+
283
+ def cursor_line_offset
284
+ cursor_offset - offset_at_line(cursor_line)
285
+ end
286
+
287
+ # Set the position of the cursor.
288
+ #
289
+ # @param [Integer] offset zero-based character offset
290
+ def cursor_offset=(offset)
291
+ controller.cursor_offset = offset
292
+ end
293
+
294
+ # The line index the cursor is on (zero-based)
295
+ #
296
+ # @return [Integer]
297
+ def cursor_line
298
+ line_at_offset(cursor_offset)
299
+ end
300
+
301
+ def cursor_line_start_offset
302
+ offset_at_line(cursor_line)
303
+ end
304
+
305
+ def cursor_line_end_offset
306
+ offset_at_line_end(cursor_line)
307
+ end
308
+
309
+ def offset_at_line_end(line_ix)
310
+ if line_ix == line_count - 1
311
+ end_offset = length
312
+ else
313
+ end_offset = offset_at_line(line_ix + 1)
314
+ end
315
+ end
316
+
317
+ def word
318
+ @grammar.word
319
+ end
320
+
321
+ # The word at an offset.
322
+ #
323
+ # @param [Integer] an offset
324
+ # @return [String] the text of the word
325
+ def word_at_offset(offset)
326
+ range = word_range_at_offset(offset)
327
+ get_range(range.first, range.last - range.first)
328
+ end
329
+
330
+ # The word found at the current cursor offset.
331
+ #
332
+ # @return [String] the text of the word
333
+ def current_word
334
+ word_at_offset(cursor_offset)
335
+ end
336
+
337
+ # The range of the word at an offset.
338
+ #
339
+ # @param [Integer] an offset
340
+ # @return [Range<Integer>] a range between two character offsets
341
+ def word_range_at_offset(offset)
342
+ line_ix = line_at_offset(offset)
343
+ match_left = offset == 0 ? false : !/\s/.match(get_slice(offset - 1, offset))
344
+ match_right = offset == length ? false : !/\s/.match(get_slice(offset, offset + 1))
345
+ if match_left && match_right
346
+ match_word_around(offset)
347
+ elsif match_left
348
+ match_word_left_of(offset)
349
+ elsif match_right
350
+ match_word_right_of(offset)
351
+ else
352
+ offset..offset
353
+ end
354
+ end
355
+
356
+ # Returns the range of the word located around an offset.
357
+ # Before using this method, it's best to make sure there actually
358
+ # might be a word around the offset. This means we are not at the beginning
359
+ # or end of the file and there are no spaces left and right from the offset.
360
+ #
361
+ # @param [Integer] an offset
362
+ # @return [Range<Integer>] a range between two character offsets
363
+ def match_word_around(offset)
364
+ line_index = line_at_offset(offset)
365
+ line_end_offset = offset_at_line_end(line_index)
366
+ right = 0
367
+ matched_offsets = offset..offset
368
+ until false
369
+ new_match = match_word_left_of(offset + right)
370
+ if new_match.last - new_match.first > matched_offsets.last - matched_offsets.first && new_match.first <= offset
371
+ matched_offsets = new_match
372
+ end
373
+ right += 1
374
+ if offset + right == length + 1 || /\s/.match(get_slice(offset, offset + right))
375
+ break
376
+ end
377
+ end
378
+ matched_offsets
379
+ end
380
+
381
+ # Returns the range of the word located left of an offset.
382
+ # Before using this method, it's best to make sure there actually
383
+ # might be a word left of the offset. This means we are not at the beginning
384
+ # of the file and there are no spaces left of the offset.
385
+ #
386
+ # @param [Integer] an offset
387
+ # @return [Range<Integer>] a range between two character offsets
388
+ def match_word_left_of(offset)
389
+ line_index = line_at_offset(offset)
390
+ line_start_offset = offset_at_line(line_index)
391
+ left = -1
392
+ matched_left = false
393
+ matched_offsets = offset..offset
394
+ until offset + left == line_start_offset - 1 || /\s/.match(get_slice(offset + left, offset))
395
+ current_offsets = offset + left..offset
396
+ if word.match(get_slice(current_offsets.first, current_offsets.last))
397
+ matched_offsets = current_offsets
398
+ matched_left = true
399
+ elsif matched_left
400
+ break
401
+ end
402
+ left -= 1
403
+ end
404
+ matched_offsets
405
+ end
406
+
407
+ # Returns the range of the word located right of an offset.
408
+ # Before using this method, it's best to make sure there actually
409
+ # might be a word right of the offset. This means we are not at the end of
410
+ # the file and there are no spaces right of the offset.
411
+ #
412
+ # @param [Integer] an offset
413
+ # @return [Range<Integer>] a range between two character offsets
414
+ def match_word_right_of(offset)
415
+ line_index = line_at_offset(offset)
416
+ line_end_offset = offset_at_line_end(line_index)
417
+ right = 0
418
+ matched_offsets = offset..offset
419
+ until offset + right == length + 1 || /\s/.match(get_slice(offset, offset + right))
420
+ if word.match(get_slice(offset, offset + right))
421
+ matched_offsets = offset..offset + right
422
+ end
423
+ right += 1
424
+ end
425
+ matched_offsets
426
+ end
427
+
428
+ # The range of the word at the current cursor position.
429
+ #
430
+ # @return [Range<Integer>] a range between two character offsets
431
+ def current_word_range
432
+ word_range_at_offset(cursor_offset)
433
+ end
434
+
435
+ # The range of text selected by the user.
436
+ #
437
+ # @return [Range<Integer>] a range between two character offsets
438
+ def selection_range
439
+ controller.selection_range
440
+ end
441
+
442
+ # The ranges of text selected by the user.
443
+ #
444
+ # @return [Range<Integer>] a range between two character offsets
445
+ def selection_ranges
446
+ controller.selection_ranges
447
+ end
448
+
449
+ def selection_offset
450
+ controller.selection_offset
451
+ end
452
+
453
+ def selection_offset=(value)
454
+ set_selection_range(cursor_offset, value)
455
+ end
456
+
457
+ def selection_line
458
+ line_at_offset(selection_offset)
459
+ end
460
+
461
+ def selection_line_offset
462
+ selection_offset - offset_at_line(selection_line)
463
+ end
464
+
465
+ # Set the range of text selected by the user.
466
+ #
467
+ # @param [Integer] cursor_offset
468
+ # @param [Integer] selection_offset
469
+ def set_selection_range(cursor_offset, selection_offset)
470
+ controller.set_selection_range(cursor_offset, selection_offset)
471
+ end
472
+
473
+ # Select all text in the document.
474
+ def select_all
475
+ set_selection_range(length, 0)
476
+ end
477
+
478
+ # Get the text selected by the user. If no text is selected
479
+ # returns "".
480
+ #
481
+ # @return [String]
482
+ def selected_text
483
+ get_range(selection_range.begin, selection_range.count)
484
+ end
485
+
486
+ # Is the document in block selection mode.
487
+ def block_selection_mode?
488
+ controller.block_selection_mode?
489
+ end
490
+
491
+ # Turn the block selection mode on or off.
492
+ def block_selection_mode=(boolean)
493
+ controller.block_selection_mode = !!boolean
494
+ end
495
+
496
+ # Get a range of text from the document.
497
+ #
498
+ # @param [Integer] start the character offset of the start of the range
499
+ # @param [Integer] length the length of the string to get
500
+ # @return [String] the text
501
+ def get_range(start, length)
502
+ controller.get_range(start, length)
503
+ end
504
+
505
+ # Get a slice of text from the document.
506
+ #
507
+ # @param [Integer] start_offset the character offset of the start of the slice
508
+ # @param [Integer] end_offset the character offset of the end of the slice
509
+ # @return [String] the text
510
+ def get_slice(start_offset, end_offset)
511
+ get_range(start_offset, end_offset - start_offset)
512
+ end
513
+
514
+ # Get the text of a line by index. (Includes a trailing "\n",
515
+ # unless it is the last line in the document.)
516
+ #
517
+ # @param [Integer] line_ix the zero-based line number
518
+ # @return [String] the text of the line
519
+ def get_line(line_ix)
520
+ controller.get_range(
521
+ offset_at_line(line_ix),
522
+ offset_at_line_end(line_ix) - offset_at_line(line_ix)
523
+ )
524
+ end
525
+
526
+ # Get the text of a line by index.
527
+ #
528
+ # @param [Integer] line_ix the zero-based line number
529
+ # @return [String] the text of the line
530
+ def get_line_without_end_of_line(line_ix)
531
+ controller.get_range(
532
+ offset_at_line(line_ix),
533
+ offset_at_inner_end_of_line(line_ix) - offset_at_line(line_ix)
534
+ )
535
+ end
536
+
537
+ # Get all text
538
+ def get_all_text
539
+ get_range(0, length)
540
+ end
541
+
542
+ # Replace a line in the document. This has two modes. In the first,
543
+ # you supply the replacement text as an argument:
544
+ #
545
+ # replace_line(10, "new line text")
546
+ #
547
+ # In the second, you supply a block. The block argument is the current
548
+ # text of the line, and the return value of the block is the
549
+ # replacement text:
550
+ #
551
+ # replace_line(10) {|current_text| current_text.upcase }
552
+ def replace_line(line_ix, text=nil)
553
+ text ||= yield(get_line_without_end_of_line(line_ix))
554
+ start_offset = offset_at_line(line_ix)
555
+ end_offset = offset_at_inner_end_of_line(line_ix)
556
+ replace(start_offset, end_offset - start_offset, text)
557
+ end
558
+
559
+ # Replace the currently selected text. This has two modes. In the first,
560
+ # you supply the replacement text as an argument:
561
+ #
562
+ # replace_selection("new text")
563
+ #
564
+ # In the second, you supply a block. The block argument is the current
565
+ # selected text, and the return value of the block is the
566
+ # replacement text:
567
+ #
568
+ # replace_selection {|current_text| current_text.upcase }
569
+ def replace_selection(new_text=nil)
570
+ previous_cursor_offset = cursor_offset
571
+
572
+ sr = selection_range
573
+ start_offset = sr.first
574
+ end_offset = sr.last
575
+ new_text = new_text || yield(selected_text)
576
+
577
+ replace(start_offset, end_offset - start_offset, new_text)
578
+
579
+ new_end_offset = start_offset + new_text.length
580
+
581
+ if previous_cursor_offset == end_offset
582
+ self.set_selection_range(new_end_offset, start_offset)
583
+ else
584
+ self.set_selection_range(start_offset, new_end_offset)
585
+ end
586
+ end
587
+
588
+ # Replace the current word. This has two modes. In the first,
589
+ # you supply the replacement text as an argument:
590
+ #
591
+ # replace_word_at_offset(offset, "new text")
592
+ #
593
+ # In the second, you supply a block. The block argument is the current
594
+ # word, and the return value of the block is the
595
+ # replacement text:
596
+ #
597
+ # replace_word_at_offset(offset) {|current_text| current_text.upcase }
598
+ def replace_word_at_offset(offset, new_text=nil)
599
+ previous_offset = cursor_offset
600
+
601
+ wr = word_range_at_offset(offset)
602
+ start_offset = wr.first
603
+ end_offset = wr.last
604
+ new_text = new_text || yield(word_at_offset(offset))
605
+ replace(start_offset, end_offset - start_offset, new_text)
606
+
607
+ self.cursor_offset = [previous_offset, start_offset + new_text.length].min
608
+ end
609
+
610
+ # Get the offset at the end of a given line, *before* the line delimiter.
611
+ #
612
+ # @param [Integer] line_ix a zero-based line index
613
+ def offset_at_inner_end_of_line(line_ix)
614
+ if line_ix == line_count - 1
615
+ length
616
+ else
617
+ offset_at_line(line_ix + 1) - delim.length
618
+ end
619
+ end
620
+
621
+ # Does the minimum amount of scrolling that brings the given line
622
+ # into the viewport. Which may be none at all.
623
+ #
624
+ # @param [Integer] line_ix a zero-based line index
625
+ def scroll_to_line(line_ix)
626
+ if line_ix > biggest_visible_line
627
+ top_line_ix = smallest_visible_line + (line_ix - biggest_visible_line) + 2
628
+ top_line_ix = [top_line_ix, line_count - 1].min
629
+ scroll_to_line_at_top(top_line_ix)
630
+ elsif line_ix < smallest_visible_line
631
+ bottom_line_ix = line_ix - 2
632
+ bottom_line_ix = [bottom_line_ix, 0].max
633
+ scroll_to_line_at_top(bottom_line_ix)
634
+ end
635
+ end
636
+
637
+ # Tries to scroll so the given line is at the top of the viewport.
638
+ #
639
+ # @param [Integer] line_ix a zero-based line index
640
+ def scroll_to_line_at_top(line_ix)
641
+ @edit_view.controller.scroll_to_line(line_ix)
642
+ end
643
+
644
+ # The line_ix of the line at the top of the viewport.
645
+ #
646
+ # @return [Integer] a zero-based line index
647
+ def smallest_visible_line
648
+ @edit_view.controller.smallest_visible_line
649
+ end
650
+
651
+ # The line_ix of the line at the bottom of the viewport.
652
+ #
653
+ # @return [Integer] a zero-based line index
654
+ def biggest_visible_line
655
+ @edit_view.controller.biggest_visible_line
656
+ end
657
+
658
+ def ensure_visible(offset)
659
+ @edit_view.controller.ensure_visible(offset)
660
+ end
661
+
662
+ def num_lines_visible
663
+ biggest_visible_line - smallest_visible_line
664
+ end
665
+
666
+ # The scope hierarchy at this point
667
+ #
668
+ # @param [String]
669
+ def cursor_scope
670
+ controller.scope_at(cursor_line, cursor_line_offset)
671
+ end
672
+
673
+ def create_mark(offset, gravity=:right)
674
+ controller.create_mark(offset, gravity)
675
+ end
676
+
677
+ def delete_mark(mark)
678
+ controller.delete_mark(mark)
679
+ end
680
+
681
+ # Everything within the block will be treated as a single action
682
+ # for the purposes of Undo.
683
+ #
684
+ # doc.compound { first_thing; second_thing }
685
+ def compound
686
+ @edit_view.controller.compound { yield }
687
+ end
688
+
689
+ def update_from_mirror
690
+ previous_line = cursor_line
691
+ top_line = smallest_visible_line
692
+
693
+ self.text = mirror.read
694
+
695
+ @modified = false
696
+ @edit_view.title = title_with_star
697
+ if line_count > previous_line
698
+ self.cursor_offset = offset_at_line(previous_line)
699
+ scroll_to_line_at_top(top_line)
700
+ end
701
+ end
702
+
703
+ def set_modified(boolean)
704
+ @modified = boolean
705
+ @edit_view.title = title_with_star
706
+ end
707
+
708
+ def indentation
709
+ Document::Indentation.new(self, @edit_view.tab_width, @edit_view.soft_tabs?)
710
+ end
711
+
712
+ private
713
+
714
+ def title_with_star
715
+ if mirror
716
+ if @modified
717
+ "*" + mirror.title
718
+ else
719
+ mirror.title
720
+ end
721
+ else
722
+ "untitled"
723
+ end
724
+ end
725
+
726
+ def rescue_document_controller_error(controller)
727
+ begin
728
+ yield
729
+ rescue => e
730
+ puts "*** ERROR in Document controller: #{controller.inspect}"
731
+ puts e.class.name + ": " + e.message
732
+ puts e.backtrace
733
+ end
734
+ end
735
+ end
736
+ end