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,796 @@
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
+ end
56
+
57
+ def controllers(klass=nil)
58
+ if klass
59
+ @controllers.values.flatten.uniq.select {|c| c.is_a?(klass) }
60
+ else
61
+ @controllers.values.flatten.uniq
62
+ end
63
+ end
64
+
65
+ # Call the before_save and after_save callbacks on any plugins that need it
66
+ #
67
+ # Pass self as an argument since plugins that use before_save
68
+ # will most likely need access to the document being saved.
69
+ def between_save_hooks
70
+ Redcar.plugin_manager.objects_implementing(:before_save).each do |object|
71
+ object.before_save(self)
72
+ end
73
+ yield
74
+ Redcar.plugin_manager.objects_implementing(:after_save).each do |object|
75
+ object.after_save(self)
76
+ end
77
+ end
78
+
79
+ def save!
80
+ between_save_hooks do
81
+ @mirror.commit(to_s)
82
+ @edit_view.reset_last_checked
83
+ set_modified(false)
84
+ notify_listeners(:mirror_committed,@mirror)
85
+ Redcar.app.repeat_event(:mirror_committed) if Redcar.app
86
+ end
87
+ end
88
+
89
+ def modified?
90
+ @modified
91
+ end
92
+
93
+ def title
94
+ @mirror ? @mirror.title : nil
95
+ end
96
+
97
+ # helper method to get the mirror's path if it has one
98
+ def path
99
+ if @mirror and @mirror.respond_to?(:path) and @mirror.path
100
+ @mirror.path
101
+ else
102
+ nil
103
+ end
104
+ end
105
+
106
+ def exists?
107
+ edit_view.exists?
108
+ end
109
+
110
+ def mirror=(new_mirror)
111
+ notify_listeners(:new_mirror, new_mirror) do
112
+ @mirror = new_mirror
113
+ mirror.add_listener(:change) do
114
+ update_from_mirror
115
+ end
116
+ update_from_mirror
117
+ end
118
+ end
119
+
120
+ def mirror_changed?
121
+ mirror and mirror.changed?
122
+ end
123
+
124
+ def verify_text(start_offset, end_offset, text)
125
+ @change = [start_offset, end_offset, text]
126
+ @controllers[Controller::ModificationCallbacks].each do |controller|
127
+ rescue_document_controller_error(controller) do
128
+ controller.before_modify(start_offset, end_offset, text)
129
+ end
130
+ end
131
+ end
132
+
133
+ def modify_text
134
+ start_offset, end_offset, text = *@change
135
+ set_modified(true)
136
+ @controllers[Controller::ModificationCallbacks].each do |controller|
137
+ rescue_document_controller_error(controller) do
138
+ controller.after_modify
139
+ end
140
+ end
141
+ @controllers[Controller::NewlineCallback].each do |controller|
142
+ if text == line_delimiter
143
+ rescue_document_controller_error(controller) do
144
+ controller.after_newline(line_at_offset(start_offset) + 1)
145
+ end
146
+ end
147
+ end
148
+ @change = nil
149
+ notify_listeners(:changed)
150
+ end
151
+
152
+ def cursor_moved(new_offset)
153
+ @controllers[Controller::CursorCallbacks].each do |controller|
154
+ rescue_document_controller_error(controller) do
155
+ controller.cursor_moved(new_offset)
156
+ end
157
+ end
158
+ end
159
+
160
+ def about_to_be_changed(start_offset, length, text)
161
+ end
162
+
163
+ def changed(start_offset, length, text)
164
+ notify_listeners(:changed)
165
+ end
166
+
167
+ def selection_range_changed(start_offset, end_offset)
168
+ notify_listeners(:selection_range_changed, start_offset..end_offset)
169
+ end
170
+
171
+ def single_line?
172
+ controller.single_line?
173
+ end
174
+
175
+ # Returns the line delimiter for this document. Either
176
+ # \n or \r\n. It will attempt to detect the delimiter from the document
177
+ # or it will default to the platform delimiter.
178
+ #
179
+ # @return [String]
180
+ def line_delimiter
181
+ controller.get_line_delimiter
182
+ end
183
+
184
+ alias :delim :line_delimiter
185
+
186
+ # Is there any text selected? (Or equivalently, is the length
187
+ # of the selection equal to 0)
188
+ #
189
+ # @return [Boolean]
190
+ def selection?
191
+ selection_range.count > 0
192
+ end
193
+
194
+ # Insert text
195
+ #
196
+ # @param [Integer] offset character offset from the start of the document
197
+ # @param [String] text text to insert
198
+ def insert(offset, text)
199
+ return unless text and offset
200
+ text = text.gsub(delim, "") if single_line?
201
+ replace(offset, 0, text)
202
+ end
203
+
204
+ # Insert text at the cursor offset
205
+ #
206
+ # @param [String] text text to insert
207
+ def insert_at_cursor(text)
208
+ insert(cursor_offset, text)
209
+ end
210
+
211
+ # Delete text
212
+ #
213
+ # @param [Integer] offset character offset from the start of the document
214
+ # @param [Integer] length length of text to delete
215
+ def delete(offset, length)
216
+ replace(offset, length, "")
217
+ end
218
+
219
+ # Replace text
220
+ #
221
+ # @param [Integer] offset character offset from the start of the document
222
+ # @param [Integer] length length of text to replace
223
+ # @param [String] text replacement text
224
+ def replace(offset, length, text)
225
+ text = text.gsub(delim, "") if single_line?
226
+ controller.replace(offset, length, text)
227
+ end
228
+
229
+ # Length of the document in characters
230
+ #
231
+ # @return [Integer]
232
+ def length
233
+ controller.length
234
+ end
235
+
236
+ # Number of lines.
237
+ #
238
+ # @return [Integer]
239
+ def line_count
240
+ controller.line_count
241
+ end
242
+
243
+ # The entire contents of the document
244
+ #
245
+ # @return [String]
246
+ def to_s
247
+ controller.to_s
248
+ end
249
+
250
+ # Set the contents of the document
251
+ #
252
+ # @param [String] text new text
253
+ def text=(text)
254
+ controller.text = text
255
+ end
256
+
257
+ def controller_text
258
+ controller.text
259
+ end
260
+
261
+ # Get the line index of the given offset
262
+ #
263
+ # @param [Integer] offset zero-based character offset
264
+ # @return [Integer] zero-based index
265
+ def line_at_offset(offset)
266
+ controller.line_at_offset(offset)
267
+ end
268
+
269
+ # Get the character offset at the start of the given line
270
+ #
271
+ # @param [Integer] line zero-based line index
272
+ # @return [Integer] zero-based character offset
273
+ def offset_at_line(line)
274
+ controller.offset_at_line(line)
275
+ end
276
+
277
+ # Get the position of the cursor.
278
+ #
279
+ # @return [Integer] zero-based character offset
280
+ def cursor_offset
281
+ controller.cursor_offset
282
+ end
283
+
284
+ def cursor_line_offset
285
+ cursor_offset - offset_at_line(cursor_line)
286
+ end
287
+
288
+ # Set the position of the cursor.
289
+ #
290
+ # @param [Integer] offset zero-based character offset
291
+ def cursor_offset=(offset)
292
+ controller.cursor_offset = offset
293
+ end
294
+
295
+ # The line index the cursor is on (zero-based)
296
+ #
297
+ # @return [Integer]
298
+ def cursor_line
299
+ line_at_offset(cursor_offset)
300
+ end
301
+
302
+ def cursor_line_start_offset
303
+ offset_at_line(cursor_line)
304
+ end
305
+
306
+ def cursor_line_end_offset
307
+ offset_at_line_end(cursor_line)
308
+ end
309
+
310
+ def offset_at_line_end(line_ix)
311
+ if line_ix == line_count - 1
312
+ end_offset = length
313
+ else
314
+ end_offset = offset_at_line(line_ix + 1)
315
+ end
316
+ end
317
+
318
+ def word
319
+ @grammar.word
320
+ end
321
+
322
+ # The word at an offset.
323
+ #
324
+ # @param [Integer] an offset
325
+ # @return [String] the text of the word
326
+ def word_at_offset(offset)
327
+ range = word_range_at_offset(offset)
328
+ get_range(range.first, range.last - range.first)
329
+ end
330
+
331
+ # The word found at the current cursor offset.
332
+ #
333
+ # @return [String] the text of the word
334
+ def current_word
335
+ word_at_offset(cursor_offset)
336
+ end
337
+
338
+ # The range of the word at an offset.
339
+ #
340
+ # @param [Integer] an offset
341
+ # @return [Range<Integer>] a range between two character offsets
342
+ def word_range_at_offset(offset)
343
+ line_ix = line_at_offset(offset)
344
+ match_left = offset == 0 ? false : !/\s/.match(get_slice(offset - 1, offset))
345
+ match_right = offset == length ? false : !/\s/.match(get_slice(offset, offset + 1))
346
+ if match_left && match_right
347
+ match_word_around(offset)
348
+ elsif match_left
349
+ match_word_left_of(offset)
350
+ elsif match_right
351
+ match_word_right_of(offset)
352
+ else
353
+ offset..offset
354
+ end
355
+ end
356
+
357
+ # Returns the range of the word located around an offset.
358
+ # Before using this method, it's best to make sure there actually
359
+ # might be a word around the offset. This means we are not at the beginning
360
+ # or end of the file and there are no spaces left and right from the offset.
361
+ #
362
+ # @param [Integer] an offset
363
+ # @return [Range<Integer>] a range between two character offsets
364
+ def match_word_around(offset)
365
+ line_index = line_at_offset(offset)
366
+ line_end_offset = offset_at_line_end(line_index)
367
+ right = 0
368
+ matched_offsets = offset..offset
369
+ until false
370
+ new_match = match_word_left_of(offset + right)
371
+ if new_match.last - new_match.first > matched_offsets.last - matched_offsets.first && new_match.first <= offset
372
+ matched_offsets = new_match
373
+ end
374
+ right += 1
375
+ if offset + right == length + 1 || /\s/.match(get_slice(offset, offset + right))
376
+ break
377
+ end
378
+ end
379
+ matched_offsets
380
+ end
381
+
382
+ # Returns the range of the word located left of an offset.
383
+ # Before using this method, it's best to make sure there actually
384
+ # might be a word left of the offset. This means we are not at the beginning
385
+ # of the file and there are no spaces left of the offset.
386
+ #
387
+ # @param [Integer] an offset
388
+ # @return [Range<Integer>] a range between two character offsets
389
+ def match_word_left_of(offset)
390
+ line_index = line_at_offset(offset)
391
+ line_start_offset = offset_at_line(line_index)
392
+ left = -1
393
+ matched_left = false
394
+ matched_offsets = offset..offset
395
+ until offset + left == line_start_offset - 1 || /\s/.match(get_slice(offset + left, offset))
396
+ current_offsets = offset + left..offset
397
+ if word.match(get_slice(current_offsets.first, current_offsets.last))
398
+ matched_offsets = current_offsets
399
+ matched_left = true
400
+ elsif matched_left
401
+ break
402
+ end
403
+ left -= 1
404
+ end
405
+ matched_offsets
406
+ end
407
+
408
+ # Returns the range of the word located right of an offset.
409
+ # Before using this method, it's best to make sure there actually
410
+ # might be a word right of the offset. This means we are not at the end of
411
+ # the file and there are no spaces right of the offset.
412
+ #
413
+ # @param [Integer] an offset
414
+ # @return [Range<Integer>] a range between two character offsets
415
+ def match_word_right_of(offset)
416
+ line_index = line_at_offset(offset)
417
+ line_end_offset = offset_at_line_end(line_index)
418
+ right = 0
419
+ matched_offsets = offset..offset
420
+ until offset + right == length + 1 || /\s/.match(get_slice(offset, offset + right))
421
+ if word.match(get_slice(offset, offset + right))
422
+ matched_offsets = offset..offset + right
423
+ end
424
+ right += 1
425
+ end
426
+ matched_offsets
427
+ end
428
+
429
+ # The range of the word at the current cursor position.
430
+ #
431
+ # @return [Range<Integer>] a range between two character offsets
432
+ def current_word_range
433
+ word_range_at_offset(cursor_offset)
434
+ end
435
+
436
+ # The range of text selected by the user.
437
+ #
438
+ # @return [Range<Integer>] a range between two character offsets
439
+ def selection_range
440
+ controller.selection_range
441
+ end
442
+
443
+ # The ranges of text selected by the user.
444
+ #
445
+ # @return [Range<Integer>] a range between two character offsets
446
+ def selection_ranges
447
+ controller.selection_ranges
448
+ end
449
+
450
+ def selection_offset
451
+ controller.selection_offset
452
+ end
453
+
454
+ def selection_offset=(value)
455
+ set_selection_range(cursor_offset, value)
456
+ end
457
+
458
+ def selection_line
459
+ line_at_offset(selection_offset)
460
+ end
461
+
462
+ def selection_line_offset
463
+ selection_offset - offset_at_line(selection_line)
464
+ end
465
+
466
+ # Set the range of text selected by the user.
467
+ #
468
+ # @param [Integer] cursor_offset
469
+ # @param [Integer] selection_offset
470
+ def set_selection_range(cursor_offset, selection_offset)
471
+ controller.set_selection_range(cursor_offset, selection_offset)
472
+ end
473
+
474
+ # Select all text in the document.
475
+ def select_all
476
+ set_selection_range(length, 0)
477
+ end
478
+
479
+ # Get the text selected by the user. If no text is selected
480
+ # returns "".
481
+ #
482
+ # @return [String]
483
+ def selected_text
484
+ get_range(selection_range.begin, selection_range.count)
485
+ end
486
+
487
+ # Is the document in block selection mode.
488
+ def block_selection_mode?
489
+ controller.block_selection_mode?
490
+ end
491
+
492
+ # Turn the block selection mode on or off.
493
+ def block_selection_mode=(boolean)
494
+ controller.block_selection_mode = !!boolean
495
+ end
496
+
497
+ # Get a range of text from the document.
498
+ #
499
+ # @param [Integer] start the character offset of the start of the range
500
+ # @param [Integer] length the length of the string to get
501
+ # @return [String] the text
502
+ def get_range(start, length)
503
+ controller.get_range(start, length)
504
+ end
505
+
506
+ # Get a slice of text from the document.
507
+ #
508
+ # @param [Integer] start_offset the character offset of the start of the slice
509
+ # @param [Integer] end_offset the character offset of the end of the slice
510
+ # @return [String] the text
511
+ def get_slice(start_offset, end_offset)
512
+ get_range(start_offset, end_offset - start_offset)
513
+ end
514
+
515
+ # Get the text of a line by index. (Includes a trailing "\n",
516
+ # unless it is the last line in the document.)
517
+ #
518
+ # @param [Integer] line_ix the zero-based line number
519
+ # @return [String] the text of the line
520
+ def get_line(line_ix)
521
+ controller.get_range(
522
+ offset_at_line(line_ix),
523
+ offset_at_line_end(line_ix) - offset_at_line(line_ix)
524
+ )
525
+ end
526
+
527
+ # Get the text of a line by index.
528
+ #
529
+ # @param [Integer] line_ix the zero-based line number
530
+ # @return [String] the text of the line
531
+ def get_line_without_end_of_line(line_ix)
532
+ controller.get_range(
533
+ offset_at_line(line_ix),
534
+ offset_at_inner_end_of_line(line_ix) - offset_at_line(line_ix)
535
+ )
536
+ end
537
+
538
+ # Get all text
539
+ def get_all_text
540
+ get_range(0, length)
541
+ end
542
+
543
+ # Replace a line in the document. This has two modes. In the first,
544
+ # you supply the replacement text as an argument:
545
+ #
546
+ # replace_line(10, "new line text")
547
+ #
548
+ # In the second, you supply a block. The block argument is the current
549
+ # text of the line, and the return value of the block is the
550
+ # replacement text:
551
+ #
552
+ # replace_line(10) {|current_text| current_text.upcase }
553
+ def replace_line(line_ix, text=nil)
554
+ text ||= yield(get_line_without_end_of_line(line_ix))
555
+ start_offset = offset_at_line(line_ix)
556
+ end_offset = offset_at_inner_end_of_line(line_ix)
557
+ replace(start_offset, end_offset - start_offset, text)
558
+ end
559
+
560
+ # Replace the currently selected text. This has two modes. In the first,
561
+ # you supply the replacement text as an argument:
562
+ #
563
+ # replace_selection("new text")
564
+ #
565
+ # In the second, you supply a block. The block argument is the current
566
+ # selected text, and the return value of the block is the
567
+ # replacement text:
568
+ #
569
+ # replace_selection {|current_text| current_text.upcase }
570
+ def replace_selection(new_text=nil)
571
+ previous_cursor_offset = cursor_offset
572
+
573
+ sr = selection_range
574
+ start_offset = sr.first
575
+ end_offset = sr.last
576
+ new_text = new_text || yield(selected_text)
577
+
578
+ replace(start_offset, end_offset - start_offset, new_text)
579
+
580
+ new_end_offset = start_offset + new_text.length
581
+
582
+ if previous_cursor_offset == end_offset
583
+ self.set_selection_range(new_end_offset, start_offset)
584
+ else
585
+ self.set_selection_range(start_offset, new_end_offset)
586
+ end
587
+ end
588
+
589
+ # Replace the current word. This has two modes. In the first,
590
+ # you supply the replacement text as an argument:
591
+ #
592
+ # replace_word_at_offset(offset, "new text")
593
+ #
594
+ # In the second, you supply a block. The block argument is the current
595
+ # word, and the return value of the block is the
596
+ # replacement text:
597
+ #
598
+ # replace_word_at_offset(offset) {|current_text| current_text.upcase }
599
+ def replace_word_at_offset(offset, new_text=nil)
600
+ previous_offset = cursor_offset
601
+
602
+ wr = word_range_at_offset(offset)
603
+ start_offset = wr.first
604
+ end_offset = wr.last
605
+ new_text = new_text || yield(word_at_offset(offset))
606
+ replace(start_offset, end_offset - start_offset, new_text)
607
+
608
+ self.cursor_offset = [previous_offset, start_offset + new_text.length].min
609
+ end
610
+
611
+ # Get the offset at the end of a given line, *before* the line delimiter.
612
+ #
613
+ # @param [Integer] line_ix a zero-based line index
614
+ def offset_at_inner_end_of_line(line_ix)
615
+ if line_ix == line_count - 1
616
+ length
617
+ else
618
+ offset_at_line(line_ix + 1) - delim.length
619
+ end
620
+ end
621
+
622
+ # Does the minimum amount of scrolling that brings the given line
623
+ # into the viewport. Which may be none at all.
624
+ #
625
+ # @param [Integer] line_ix a zero-based line index
626
+ def scroll_to_line(line_ix)
627
+ if line_ix > biggest_visible_line
628
+ top_line_ix = smallest_visible_line + (line_ix - biggest_visible_line) + 2
629
+ top_line_ix = [top_line_ix, line_count - 1].min
630
+ scroll_to_line_at_top(top_line_ix)
631
+ elsif line_ix < smallest_visible_line
632
+ bottom_line_ix = line_ix - 2
633
+ bottom_line_ix = [bottom_line_ix, 0].max
634
+ scroll_to_line_at_top(bottom_line_ix)
635
+ end
636
+ end
637
+
638
+ # Does the minimum amount of scrolling that brings the given horizontal
639
+ # offset into the viewport. Which may be none at all.
640
+ #
641
+ # @param [Integer] offset a zero-based horizontal offset
642
+ def scroll_to_horizontal_offset(offset)
643
+ line = cursor_line
644
+ start = offset_at_line(line)
645
+ lend = offset_at_inner_end_of_line(line)
646
+ dist = largest_visible_horizontal_index - smallest_visible_horizontal_index
647
+ if offset > 0 and offset <= lend - start # if offset exists at line
648
+ if offset < dist
649
+ @edit_view.controller.scroll_to_horizontal_offset(0)
650
+ else
651
+ if offset > largest_visible_horizontal_index
652
+ @edit_view.controller.scroll_to_horizontal_offset(offset-dist)
653
+ elsif offset < smallest_visible_horizontal_index
654
+ @edit_view.controller.scroll_to_horizontal_offset(offset)
655
+ end
656
+ end
657
+ end
658
+ end
659
+
660
+ # Tries to scroll so the given line is at the top of the viewport.
661
+ #
662
+ # @param [Integer] line_ix a zero-based line index
663
+ def scroll_to_line_at_top(line_ix)
664
+ @edit_view.controller.scroll_to_line(line_ix)
665
+ end
666
+
667
+ # Tries to scroll so the given line is in the middle of the viewport. If the line
668
+ # is above (smaller index) than the midline, defers to scroll_to_line_at_top(0).
669
+ #
670
+ # @param [Integer] line_ix a zero-based line index
671
+ def scroll_to_line_at_middle(line_ix)
672
+ midline = num_lines_visible / 2
673
+ if line_ix > midline
674
+ scroll_to_line_at_top(line_ix - midline)
675
+ else
676
+ scroll_to_line_at_top(0)
677
+ end
678
+ end
679
+
680
+ # The line_ix of the line at the top of the viewport.
681
+ #
682
+ # @return [Integer] a zero-based line index
683
+ def smallest_visible_line
684
+ @edit_view.controller.smallest_visible_line
685
+ end
686
+
687
+ # The line_ix of the line at the bottom of the viewport.
688
+ #
689
+ # @return [Integer] a zero-based line index
690
+ def biggest_visible_line
691
+ @edit_view.controller.biggest_visible_line
692
+ end
693
+
694
+ def largest_visible_horizontal_index
695
+ @edit_view.controller.largest_visible_horizontal_index
696
+ end
697
+
698
+ def smallest_visible_horizontal_index
699
+ @edit_view.controller.smallest_visible_horizontal_index
700
+ end
701
+
702
+ def ensure_visible(offset)
703
+ @edit_view.controller.ensure_visible(offset)
704
+ end
705
+
706
+ # Ensures the cursor is visible as near the center of the viewport as possible. Scrolls
707
+ # vertically until the cursor is near the center. Scrolls horizontally only enough to make
708
+ # the cursor visible.
709
+ def ensure_cursor_visible
710
+ scroll_to_line_at_middle(cursor_line)
711
+ ensure_visible(cursor_offset) unless visible_horizontal_index_range.include?(cursor_line_offset)
712
+ end
713
+
714
+ def num_lines_visible
715
+ biggest_visible_line - smallest_visible_line
716
+ end
717
+
718
+ def visible_horizontal_index_range
719
+ smallest_visible_horizontal_index .. largest_visible_horizontal_index
720
+ end
721
+
722
+ # The scope hierarchy at this point
723
+ #
724
+ # @param [String]
725
+ def cursor_scope
726
+ controller.scope_at(cursor_line, cursor_line_offset)
727
+ end
728
+
729
+ def create_mark(offset, gravity=:right)
730
+ controller.create_mark(offset, gravity)
731
+ end
732
+
733
+ def delete_mark(mark)
734
+ controller.delete_mark(mark)
735
+ end
736
+
737
+ # Everything within the block will be treated as a single action
738
+ # for the purposes of Undo.
739
+ #
740
+ # doc.compound { first_thing; second_thing }
741
+ def compound
742
+ @edit_view.controller.compound { yield }
743
+ end
744
+
745
+ def update_from_mirror
746
+ previous_line = cursor_line
747
+ top_line = smallest_visible_line
748
+
749
+ self.text = mirror.read
750
+
751
+ @modified = false
752
+ @edit_view.title = title_with_star
753
+ if line_count > previous_line
754
+ self.cursor_offset = offset_at_line(previous_line)
755
+ scroll_to_line_at_top(top_line)
756
+ end
757
+ end
758
+
759
+ def set_modified(boolean)
760
+ @modified = boolean
761
+ @edit_view.title = title_with_star
762
+ end
763
+
764
+ def indentation
765
+ Document::Indentation.new(self, @edit_view.tab_width, @edit_view.soft_tabs?)
766
+ end
767
+
768
+ def inspect
769
+ "#<Redcar::Document:#{object_id} #{title.inspect}>"
770
+ end
771
+
772
+ private
773
+
774
+ def title_with_star
775
+ if mirror
776
+ if @modified
777
+ "*" + mirror.title
778
+ else
779
+ mirror.title
780
+ end
781
+ else
782
+ "untitled"
783
+ end
784
+ end
785
+
786
+ def rescue_document_controller_error(controller)
787
+ begin
788
+ yield
789
+ rescue => e
790
+ puts "*** ERROR in Document controller: #{controller.inspect}"
791
+ puts e.class.name + ": " + e.message
792
+ puts e.backtrace
793
+ end
794
+ end
795
+ end
796
+ end