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.
- data/CHANGES +664 -0
- data/LICENSE +32 -0
- data/README.md +119 -0
- data/Rakefile +283 -0
- data/bin/redcar +29 -0
- data/lib/redcar.rb +307 -0
- data/lib/redcar/installer.rb +178 -0
- data/lib/redcar/instance_exec.rb +25 -0
- data/lib/redcar/logger.rb +64 -0
- data/lib/redcar/plist.rb +83 -0
- data/lib/redcar/ruby_extensions.rb +201 -0
- data/lib/redcar/runner.rb +130 -0
- data/lib/redcar/usage.rb +42 -0
- data/lib/redcar_quick_start.rb +100 -0
- data/lib/regex_replace.rb +221 -0
- data/lib/tasks/app-bundle.rake +63 -0
- data/plugins/application/features/main_menu.feature +9 -0
- data/plugins/application/features/navigation_history.feature +66 -0
- data/plugins/application/features/step_definitions/command_steps.rb +10 -0
- data/plugins/application/features/step_definitions/dialog_steps.rb +25 -0
- data/plugins/application/features/step_definitions/filter_list_dialog_steps.rb +42 -0
- data/plugins/application/features/step_definitions/key_steps.rb +18 -0
- data/plugins/application/features/step_definitions/menu_steps.rb +42 -0
- data/plugins/application/features/step_definitions/navigation_history_steps.rb +4 -0
- data/plugins/application/features/step_definitions/speedbar_steps.rb +88 -0
- data/plugins/application/features/step_definitions/tree_steps.rb +107 -0
- data/plugins/application/features/step_definitions/window_steps.rb +17 -0
- data/plugins/application/features/support/env.rb +257 -0
- data/plugins/application/features/support/fake_event.rb +26 -0
- data/plugins/application/lib/application.rb +425 -0
- data/plugins/application/lib/application/assets/file.png +0 -0
- data/plugins/application/lib/application/clipboard.rb +95 -0
- data/plugins/application/lib/application/command.rb +108 -0
- data/plugins/application/lib/application/command/executor.rb +80 -0
- data/plugins/application/lib/application/command/history.rb +54 -0
- data/plugins/application/lib/application/commands/application_commands.rb +21 -0
- data/plugins/application/lib/application/commands/notebook_commands.rb +73 -0
- data/plugins/application/lib/application/commands/tab_commands.rb +105 -0
- data/plugins/application/lib/application/commands/treebook_commands.rb +117 -0
- data/plugins/application/lib/application/commands/window_commands.rb +68 -0
- data/plugins/application/lib/application/dialog.rb +170 -0
- data/plugins/application/lib/application/dialogs/filter_list_dialog.rb +123 -0
- data/plugins/application/lib/application/dialogs/modeless_list_dialog.rb +85 -0
- data/plugins/application/lib/application/event_spewer.rb +32 -0
- data/plugins/application/lib/application/keymap.rb +41 -0
- data/plugins/application/lib/application/keymap/builder.rb +23 -0
- data/plugins/application/lib/application/menu.rb +117 -0
- data/plugins/application/lib/application/menu/builder.rb +80 -0
- data/plugins/application/lib/application/menu/builder/group.rb +47 -0
- data/plugins/application/lib/application/menu/item.rb +79 -0
- data/plugins/application/lib/application/menu/lazy_menu.rb +25 -0
- data/plugins/application/lib/application/navigation_history.rb +71 -0
- data/plugins/application/lib/application/notebook.rb +163 -0
- data/plugins/application/lib/application/sensitive.rb +57 -0
- data/plugins/application/lib/application/sensitivity.rb +82 -0
- data/plugins/application/lib/application/speedbar.rb +100 -0
- data/plugins/application/lib/application/tab.rb +92 -0
- data/plugins/application/lib/application/tab/command.rb +5 -0
- data/plugins/application/lib/application/toolbar.rb +83 -0
- data/plugins/application/lib/application/toolbar/builder.rb +80 -0
- data/plugins/application/lib/application/toolbar/builder/group.rb +47 -0
- data/plugins/application/lib/application/toolbar/item.rb +71 -0
- data/plugins/application/lib/application/toolbar/lazy_toolbar.rb +25 -0
- data/plugins/application/lib/application/tree.rb +94 -0
- data/plugins/application/lib/application/tree/command.rb +5 -0
- data/plugins/application/lib/application/tree/controller.rb +64 -0
- data/plugins/application/lib/application/tree/mirror.rb +132 -0
- data/plugins/application/lib/application/treebook.rb +83 -0
- data/plugins/application/lib/application/window.rb +274 -0
- data/plugins/application/plugin.rb +8 -0
- data/plugins/application/spec/application/application_spec.rb +23 -0
- data/plugins/application/spec/application/clipboard_spec.rb +55 -0
- data/plugins/application/spec/application/command/executor_spec.rb +78 -0
- data/plugins/application/spec/application/command/history_spec.rb +49 -0
- data/plugins/application/spec/application/command_spec.rb +78 -0
- data/plugins/application/spec/application/controllers/application_controller.rb +4 -0
- data/plugins/application/spec/application/controllers/notebook_controller.rb +4 -0
- data/plugins/application/spec/application/controllers/window_controller.rb +5 -0
- data/plugins/application/spec/application/keymap/builder_spec.rb +17 -0
- data/plugins/application/spec/application/menu/builder_spec.rb +61 -0
- data/plugins/application/spec/application/menu/menu_item_spec.rb +17 -0
- data/plugins/application/spec/application/menu_spec.rb +171 -0
- data/plugins/application/spec/application/navigation_history_spec.rb +96 -0
- data/plugins/application/spec/application/notebook_spec.rb +31 -0
- data/plugins/application/spec/application/sensitive_spec.rb +156 -0
- data/plugins/application/spec/application/speedbar_spec.rb +77 -0
- data/plugins/application/spec/application/treebook_spec.rb +27 -0
- data/plugins/application/spec/application/window_spec.rb +24 -0
- data/plugins/application/spec/spec_helper.rb +18 -0
- data/plugins/application_swt/build.xml +74 -0
- data/plugins/application_swt/lib/application_swt.rb +218 -0
- data/plugins/application_swt/lib/application_swt/bring_to_front.rb +53 -0
- data/plugins/application_swt/lib/application_swt/clipboard.rb +42 -0
- data/plugins/application_swt/lib/application_swt/dialog_adapter.rb +180 -0
- data/plugins/application_swt/lib/application_swt/dialogs/filter_list_dialog_controller.rb +233 -0
- data/plugins/application_swt/lib/application_swt/dialogs/input_dialog.rb +46 -0
- data/plugins/application_swt/lib/application_swt/dialogs/modeless_dialog.rb +113 -0
- data/plugins/application_swt/lib/application_swt/dialogs/modeless_html_dialog.rb +85 -0
- data/plugins/application_swt/lib/application_swt/dialogs/modeless_list_dialog_controller.rb +143 -0
- data/plugins/application_swt/lib/application_swt/dialogs/no_buttons_dialog.rb +24 -0
- data/plugins/application_swt/lib/application_swt/dialogs/text_and_file_dialog.rb +118 -0
- data/plugins/application_swt/lib/application_swt/gradient.rb +61 -0
- data/plugins/application_swt/lib/application_swt/html_tab.rb +79 -0
- data/plugins/application_swt/lib/application_swt/icon.rb +35 -0
- data/plugins/application_swt/lib/application_swt/listener_helpers.rb +20 -0
- data/plugins/application_swt/lib/application_swt/menu.rb +167 -0
- data/plugins/application_swt/lib/application_swt/menu/binding_translator.rb +94 -0
- data/plugins/application_swt/lib/application_swt/notebook.rb +148 -0
- data/plugins/application_swt/lib/application_swt/notebook/tab_drag_and_drop_listener.rb +124 -0
- data/plugins/application_swt/lib/application_swt/notebook/tab_transfer.rb +83 -0
- data/plugins/application_swt/lib/application_swt/speedbar.rb +185 -0
- data/plugins/application_swt/lib/application_swt/speedbar/button_item.rb +20 -0
- data/plugins/application_swt/lib/application_swt/speedbar/combo_item.rb +55 -0
- data/plugins/application_swt/lib/application_swt/speedbar/label_item.rb +15 -0
- data/plugins/application_swt/lib/application_swt/speedbar/slider_item.rb +32 -0
- data/plugins/application_swt/lib/application_swt/speedbar/text_box_item.rb +36 -0
- data/plugins/application_swt/lib/application_swt/speedbar/toggle_item.rb +29 -0
- data/plugins/application_swt/lib/application_swt/tab.rb +84 -0
- data/plugins/application_swt/lib/application_swt/toolbar.rb +138 -0
- data/plugins/application_swt/lib/application_swt/toolbar/binding_translator.rb +94 -0
- data/plugins/application_swt/lib/application_swt/treebook.rb +78 -0
- data/plugins/application_swt/lib/application_swt/window.rb +419 -0
- data/plugins/application_swt/lib/dist/application_swt.jar +0 -0
- data/plugins/application_swt/lib/swt/graphics_utils.rb +193 -0
- data/plugins/application_swt/lib/swt/vtab_folder.rb +177 -0
- data/plugins/application_swt/lib/swt/vtab_item.rb +78 -0
- data/plugins/application_swt/lib/swt/vtab_label.rb +127 -0
- data/plugins/application_swt/plugin.rb +8 -0
- data/plugins/application_swt/spec/application_swt/gradient_spec.rb +133 -0
- data/plugins/application_swt/spec/application_swt/menu/binding_translator_spec.rb +73 -0
- data/plugins/application_swt/spec/application_swt/menu_spec.rb +7 -0
- data/plugins/application_swt/spec/spec_helper.rb +20 -0
- data/plugins/application_swt/src/com/redcareditor/application_swt/CocoaUIEnhancer.java +313 -0
- data/plugins/auto_completer/features/auto_complete.feature +65 -0
- data/plugins/auto_completer/features/step_definitions/auto_complete_steps.rb +4 -0
- data/plugins/auto_completer/features/support/env.rb +2 -0
- data/plugins/auto_completer/lib/auto_completer.rb +129 -0
- data/plugins/auto_completer/lib/auto_completer/current_document_completion_source.rb +19 -0
- data/plugins/auto_completer/lib/auto_completer/document_controller.rb +52 -0
- data/plugins/auto_completer/lib/auto_completer/list_dialog.rb +21 -0
- data/plugins/auto_completer/lib/auto_completer/word_iterator.rb +48 -0
- data/plugins/auto_completer/lib/auto_completer/word_list.rb +47 -0
- data/plugins/auto_completer/plugin.rb +10 -0
- data/plugins/auto_indenter/features/java_style_indentation.feature +36 -0
- data/plugins/auto_indenter/features/ruby_style_indentation.feature +42 -0
- data/plugins/auto_indenter/features/step_definitions/indentation_steps.rb +15 -0
- data/plugins/auto_indenter/features/support/env.rb +1 -0
- data/plugins/auto_indenter/lib/auto_indenter.rb +108 -0
- data/plugins/auto_indenter/lib/auto_indenter/analyzer.rb +100 -0
- data/plugins/auto_indenter/lib/auto_indenter/commands.rb +66 -0
- data/plugins/auto_indenter/lib/auto_indenter/document_controller.rb +103 -0
- data/plugins/auto_indenter/lib/auto_indenter/rules.rb +41 -0
- data/plugins/auto_indenter/plugin.rb +9 -0
- data/plugins/auto_indenter/spec/auto_indenter/analyzer_spec.rb +151 -0
- data/plugins/auto_indenter/spec/spec_helper.rb +5 -0
- data/plugins/auto_pairer/features/auto_pairer.feature +92 -0
- data/plugins/auto_pairer/features/step_definitions/auto_pairer_steps.rb +0 -0
- data/plugins/auto_pairer/features/support/env.rb +1 -0
- data/plugins/auto_pairer/lib/auto_pairer.rb +12 -0
- data/plugins/auto_pairer/lib/auto_pairer/document_controller.rb +168 -0
- data/plugins/auto_pairer/lib/auto_pairer/pairs_for_scope.rb +57 -0
- data/plugins/auto_pairer/plugin.rb +9 -0
- data/plugins/clipboard-viewer/Screenshot.png +0 -0
- data/plugins/clipboard-viewer/lib/clipboard_viewer.rb +50 -0
- data/plugins/clipboard-viewer/lib/clipboard_viewer/browser_controller.rb +27 -0
- data/plugins/clipboard-viewer/lib/clipboard_viewer/clipboard_bar.rb +67 -0
- data/plugins/clipboard-viewer/plugin.rb +9 -0
- data/plugins/clipboard-viewer/views/clipboard.html.erb +19 -0
- data/plugins/clipboard-viewer/views/default.css +43 -0
- data/plugins/clipboard-viewer/views/redcar_small_icon.png +0 -0
- data/plugins/comment/features/line_comment.feature +249 -0
- data/plugins/comment/features/selection_comment.feature +21 -0
- data/plugins/comment/features/step_definitions/comment_steps.rb +7 -0
- data/plugins/comment/lib/comment.rb +268 -0
- data/plugins/comment/plugin.rb +7 -0
- data/plugins/comment/vendor/comment_lib.json +47 -0
- data/plugins/connection_manager/lib/connection_manager.rb +57 -0
- data/plugins/connection_manager/lib/connection_manager/commands.rb +14 -0
- data/plugins/connection_manager/lib/connection_manager/connection_store.rb +87 -0
- data/plugins/connection_manager/lib/connection_manager/controller.rb +100 -0
- data/plugins/connection_manager/lib/connection_manager/filter_dialog.rb +38 -0
- data/plugins/connection_manager/lib/connection_manager/private_key_store.rb +93 -0
- data/plugins/connection_manager/plugin.rb +12 -0
- data/plugins/connection_manager/views/index.html.erb +284 -0
- data/plugins/core/lib/core.rb +41 -0
- data/plugins/core/lib/core/controller.rb +23 -0
- data/plugins/core/lib/core/gui.rb +100 -0
- data/plugins/core/lib/core/has_spi.rb +10 -0
- data/plugins/core/lib/core/interface.rb +73 -0
- data/plugins/core/lib/core/model.rb +11 -0
- data/plugins/core/lib/core/observable.rb +115 -0
- data/plugins/core/lib/core/observable_struct.rb +34 -0
- data/plugins/core/lib/core/persistent_cache.rb +57 -0
- data/plugins/core/lib/core/plugin.rb +12 -0
- data/plugins/core/lib/core/plugin/storage.rb +133 -0
- data/plugins/core/lib/core/reentry_helpers.rb +13 -0
- data/plugins/core/lib/core/resource.rb +86 -0
- data/plugins/core/lib/core/task.rb +62 -0
- data/plugins/core/lib/core/task_queue.rb +72 -0
- data/plugins/core/plugin.rb +7 -0
- data/plugins/core/spec/core/base_storage_spec.rb +81 -0
- data/plugins/core/spec/core/gui_spec.rb +27 -0
- data/plugins/core/spec/core/observable_spec.rb +104 -0
- data/plugins/core/spec/core/persistent_cache_spec.rb +100 -0
- data/plugins/core/spec/core/resource_spec.rb +125 -0
- data/plugins/core/spec/core/shared_storage_spec.rb +49 -0
- data/plugins/core/spec/core/storage_spec.rb +27 -0
- data/plugins/core/spec/core/task_queue_spec.rb +199 -0
- data/plugins/core/spec/spec_helper.rb +27 -0
- data/plugins/declarations/lib/declarations.rb +159 -0
- data/plugins/declarations/lib/declarations/completion_source.rb +22 -0
- data/plugins/declarations/lib/declarations/file.rb +68 -0
- data/plugins/declarations/lib/declarations/parser.rb +186 -0
- data/plugins/declarations/lib/declarations/select_tag_dialog.rb +45 -0
- data/plugins/declarations/plugin.rb +7 -0
- data/plugins/declarations/spec/declarations/file_spec.rb +62 -0
- data/plugins/declarations/spec/fixtures/federalist.rb +15 -0
- data/plugins/declarations/spec/spec_helper.rb +5 -0
- data/plugins/document_search/Readme.md +14 -0
- data/plugins/document_search/features/find.feature +541 -0
- data/plugins/document_search/features/incremental_search.feature +351 -0
- data/plugins/document_search/features/replace.feature +178 -0
- data/plugins/document_search/features/step_definitions/find_steps.rb +16 -0
- data/plugins/document_search/features/support/env.rb +14 -0
- data/plugins/document_search/lib/document_search.rb +191 -0
- data/plugins/document_search/lib/document_search/commands.rb +307 -0
- data/plugins/document_search/lib/document_search/find_speedbar.rb +162 -0
- data/plugins/document_search/lib/document_search/incremental_search_speedbar.rb +70 -0
- data/plugins/document_search/lib/document_search/query_options.rb +21 -0
- data/plugins/document_search/plugin.rb +8 -0
- data/plugins/edit_view/features/align_assignment.feature +106 -0
- data/plugins/edit_view/features/case_change.feature +67 -0
- data/plugins/edit_view/features/cursor_navigation.feature +36 -0
- data/plugins/edit_view/features/cut_and_paste.feature +45 -0
- data/plugins/edit_view/features/grammar.feature +11 -0
- data/plugins/edit_view/features/indentation_commands.feature +49 -0
- data/plugins/edit_view/features/line_delimiter.feature +47 -0
- data/plugins/edit_view/features/multiple_notebooks.feature +52 -0
- data/plugins/edit_view/features/multiple_windows.feature +48 -0
- data/plugins/edit_view/features/new_tab.feature +11 -0
- data/plugins/edit_view/features/soft_tabs.feature +243 -0
- data/plugins/edit_view/features/sort_lines.feature +15 -0
- data/plugins/edit_view/features/step_definitions/editing_steps.rb +350 -0
- data/plugins/edit_view/features/step_definitions/grammar_steps.rb +4 -0
- data/plugins/edit_view/features/step_definitions/key_steps.rb +48 -0
- data/plugins/edit_view/features/step_definitions/notebook_steps.rb +59 -0
- data/plugins/edit_view/features/step_definitions/tab_steps.rb +113 -0
- data/plugins/edit_view/features/step_definitions/window_steps.rb +86 -0
- data/plugins/edit_view/features/support/env.rb +59 -0
- data/plugins/edit_view/features/switch_tabs.feature +106 -0
- data/plugins/edit_view/features/tabs.feature +146 -0
- data/plugins/edit_view/features/undo_and_redo.feature +73 -0
- data/plugins/edit_view/features/word_matching.feature +67 -0
- data/plugins/edit_view/lib/edit_view.rb +659 -0
- data/plugins/edit_view/lib/edit_view/actions/arrow_keys.rb +170 -0
- data/plugins/edit_view/lib/edit_view/actions/cmd_enter.rb +11 -0
- data/plugins/edit_view/lib/edit_view/actions/deletion.rb +40 -0
- data/plugins/edit_view/lib/edit_view/actions/esc.rb +15 -0
- data/plugins/edit_view/lib/edit_view/actions/tab.rb +70 -0
- data/plugins/edit_view/lib/edit_view/command.rb +14 -0
- data/plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb +55 -0
- data/plugins/edit_view/lib/edit_view/commands/text_conversion_commands.rb +85 -0
- data/plugins/edit_view/lib/edit_view/document.rb +796 -0
- data/plugins/edit_view/lib/edit_view/document/command.rb +25 -0
- data/plugins/edit_view/lib/edit_view/document/controller.rb +43 -0
- data/plugins/edit_view/lib/edit_view/document/history.rb +41 -0
- data/plugins/edit_view/lib/edit_view/document/indentation.rb +40 -0
- data/plugins/edit_view/lib/edit_view/document/mirror.rb +42 -0
- data/plugins/edit_view/lib/edit_view/edit_tab.rb +59 -0
- data/plugins/edit_view/lib/edit_view/grammar.rb +58 -0
- data/plugins/edit_view/lib/edit_view/grammars/default.rb +10 -0
- data/plugins/edit_view/lib/edit_view/grammars/ruby.rb +10 -0
- data/plugins/edit_view/lib/edit_view/grammars/ruby_on_rails.rb +7 -0
- data/plugins/edit_view/lib/edit_view/info_speedbar.rb +98 -0
- data/plugins/edit_view/lib/edit_view/modified_tabs_checker.rb +35 -0
- data/plugins/edit_view/lib/edit_view/select_font_dialog.rb +45 -0
- data/plugins/edit_view/lib/edit_view/select_theme_dialog.rb +42 -0
- data/plugins/edit_view/lib/edit_view/tab_settings.rb +135 -0
- data/plugins/edit_view/plugin.rb +9 -0
- data/plugins/edit_view/spec/edit_view/document/indentation_spec.rb +112 -0
- data/plugins/edit_view/spec/edit_view/document_spec.rb +130 -0
- data/plugins/edit_view/spec/spec_helper.rb +5 -0
- data/plugins/edit_view_swt/lib/edit_view_swt.rb +621 -0
- data/plugins/edit_view_swt/lib/edit_view_swt/document.rb +224 -0
- data/plugins/edit_view_swt/lib/edit_view_swt/edit_tab.rb +50 -0
- data/plugins/edit_view_swt/lib/edit_view_swt/word_movement.rb +68 -0
- data/plugins/edit_view_swt/plugin.rb +9 -0
- data/plugins/edit_view_swt/spec/edit_view_swt/word_movement_spec.rb +29 -0
- data/plugins/edit_view_swt/spec/spec_helper.rb +5 -0
- data/plugins/encryption/encryption.rb +52 -0
- data/plugins/encryption/ezcrypto.rb +652 -0
- data/plugins/encryption/jarmor-1.1.jar +0 -0
- data/plugins/encryption/plugin.rb +9 -0
- data/plugins/execute_current_tab/lib/execute_current_tab.rb +68 -0
- data/plugins/execute_current_tab/plugin.rb +8 -0
- data/plugins/help/lib/help.rb +64 -0
- data/plugins/help/lib/help/help_tab.rb +11 -0
- data/plugins/help/lib/help/view_controller.rb +30 -0
- data/plugins/help/plugin.rb +9 -0
- data/plugins/help/views/default.css +31 -0
- data/plugins/help/views/index.html.erb +41 -0
- data/plugins/help/views/redcar_small_icon.png +0 -0
- data/plugins/html_view/assets/blueprint/ie.css +35 -0
- data/plugins/html_view/assets/blueprint/print.css +29 -0
- data/plugins/html_view/assets/blueprint/screen.css +257 -0
- data/plugins/html_view/assets/blueprint/src/forms.css +65 -0
- data/plugins/html_view/assets/blueprint/src/grid.css +281 -0
- data/plugins/html_view/assets/blueprint/src/grid.png +0 -0
- data/plugins/html_view/assets/blueprint/src/ie.css +76 -0
- data/plugins/html_view/assets/blueprint/src/print.css +85 -0
- data/plugins/html_view/assets/blueprint/src/reset.css +38 -0
- data/plugins/html_view/assets/blueprint/src/typography.css +106 -0
- data/plugins/html_view/assets/jquery-1.4.min.js +151 -0
- data/plugins/html_view/assets/json2.js +476 -0
- data/plugins/html_view/assets/redcar.css +44 -0
- data/plugins/html_view/features/browser_bar.feature +47 -0
- data/plugins/html_view/features/fixtures/other.html +1 -0
- data/plugins/html_view/features/fixtures/sample.html +1 -0
- data/plugins/html_view/features/step_definitions/html_view_steps.rb +64 -0
- data/plugins/html_view/features/step_definitions/web_view_steps.rb +12 -0
- data/plugins/html_view/features/support/env.rb +27 -0
- data/plugins/html_view/features/web_preview.feature +21 -0
- data/plugins/html_view/lib/html_controller.rb +50 -0
- data/plugins/html_view/lib/html_view.rb +170 -0
- data/plugins/html_view/lib/html_view/browser_bar.rb +82 -0
- data/plugins/html_view/lib/html_view/commands.rb +64 -0
- data/plugins/html_view/lib/html_view/default_controller.rb +23 -0
- data/plugins/html_view/lib/html_view/html_tab.rb +40 -0
- data/plugins/html_view/plugin.rb +13 -0
- data/plugins/html_view/views/default.css +117 -0
- data/plugins/html_view/views/index.html.erb +5 -0
- data/plugins/html_view/views/watermark-48.png +0 -0
- data/plugins/java/features/fixtures/lib/classes.jar +0 -0
- data/plugins/java/features/fixtures/test.java +0 -0
- data/plugins/java/features/support/env.rb +27 -0
- data/plugins/java/features/syntax_check_java.feature +86 -0
- data/plugins/java/lib/syntax_check/java.rb +86 -0
- data/plugins/java/plugin.rb +7 -0
- data/plugins/key_bindings/lib/key_bindings.rb +34 -0
- data/plugins/key_bindings/plugin.rb +8 -0
- data/plugins/key_bindings/spec/spec_helper.rb +5 -0
- data/plugins/line_tools/features/clear_line.feature +25 -0
- data/plugins/line_tools/features/kill_line.feature +25 -0
- data/plugins/line_tools/features/lower_text.feature +54 -0
- data/plugins/line_tools/features/raise_text.feature +50 -0
- data/plugins/line_tools/features/replace_line.feature +33 -0
- data/plugins/line_tools/features/step_definitions/line_tools_steps.rb +23 -0
- data/plugins/line_tools/features/support/env.rb +0 -0
- data/plugins/line_tools/features/trim_line.feature +73 -0
- data/plugins/line_tools/lib/line_tools.rb +217 -0
- data/plugins/line_tools/plugin.rb +9 -0
- data/plugins/macros/features/block_selection_in_macros.feature +48 -0
- data/plugins/macros/features/predictive_macros.feature +79 -0
- data/plugins/macros/features/record_and_run_macro.feature +87 -0
- data/plugins/macros/features/step_definitions/macro_steps.rb +11 -0
- data/plugins/macros/features/step_definitions/prediction_steps.rb +8 -0
- data/plugins/macros/features/support/env.rb +0 -0
- data/plugins/macros/lib/macros.rb +167 -0
- data/plugins/macros/lib/macros/action_sequence.rb +30 -0
- data/plugins/macros/lib/macros/commands.rb +108 -0
- data/plugins/macros/lib/macros/macro.rb +37 -0
- data/plugins/macros/lib/macros/manager_controller.rb +67 -0
- data/plugins/macros/lib/macros/predictive/document_controller.rb +69 -0
- data/plugins/macros/lib/macros/predictive/sequence_finder.rb +112 -0
- data/plugins/macros/plugin.rb +9 -0
- data/plugins/macros/spec/macros/predictive/sequence_finder_spec.rb +142 -0
- data/plugins/macros/spec/spec_helper.rb +6 -0
- data/plugins/macros/views/macro_manager.html.erb +92 -0
- data/plugins/my_plugin/lib/my_plugin.rb +47 -0
- data/plugins/my_plugin/plugin.rb +8 -0
- data/plugins/open_default_app/lib/open_default_app.rb +61 -0
- data/plugins/open_default_app/plugin.rb +8 -0
- data/plugins/open_default_app/screenshot.png +0 -0
- data/plugins/outline_view/features/outline_view.feature +79 -0
- data/plugins/outline_view/features/step_definitions/outline_steps.rb +45 -0
- data/plugins/outline_view/lib/outline_view.rb +66 -0
- data/plugins/outline_view/lib/outline_view/commands.rb +13 -0
- data/plugins/outline_view/plugin.rb +10 -0
- data/plugins/outline_view/spec/fixtures/some_project/javascript.js +10 -0
- data/plugins/outline_view/spec/fixtures/some_project/nothing_to_see.rb +0 -0
- data/plugins/outline_view/spec/fixtures/some_project/one_lonely_class.rb +2 -0
- data/plugins/outline_view/spec/fixtures/some_project/similar_names.rb +18 -0
- data/plugins/outline_view/spec/fixtures/some_project/something_fancy.rb +736 -0
- data/plugins/outline_view/spec/fixtures/some_project/trailing_space.rb +5 -0
- data/plugins/outline_view_swt/lib/outline_view_swt.rb +79 -0
- data/plugins/outline_view_swt/plugin.rb +7 -0
- data/plugins/pair_highlighter/lib/pair_highlighter.rb +34 -0
- data/plugins/pair_highlighter/lib/pair_highlighter/document_controller.rb +185 -0
- data/plugins/pair_highlighter/plugin.rb +9 -0
- data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +122 -0
- data/plugins/plugin_manager_ui/plugin.rb +13 -0
- data/plugins/plugin_manager_ui/views/index.html.erb +62 -0
- data/plugins/project/features/close_directory_tree.feature +28 -0
- data/plugins/project/features/find_file.feature +119 -0
- data/plugins/project/features/highlight_focussed_tab.feature +53 -0
- data/plugins/project/features/move_and_rename_files.feature +25 -0
- data/plugins/project/features/open_and_save_files.feature +85 -0
- data/plugins/project/features/open_directory_tree.feature +93 -0
- data/plugins/project/features/refresh_directory_tree.feature +44 -0
- data/plugins/project/features/step_definitions/directory_steps.rb +35 -0
- data/plugins/project/features/step_definitions/drb_steps.rb +40 -0
- data/plugins/project/features/step_definitions/file_steps.rb +66 -0
- data/plugins/project/features/step_definitions/find_file_steps.rb +7 -0
- data/plugins/project/features/step_definitions/project_tree_steps.rb +7 -0
- data/plugins/project/features/sub_project.feature +15 -0
- data/plugins/project/features/support/env.rb +35 -0
- data/plugins/project/features/watch_for_modified_files.feature +109 -0
- data/plugins/project/lib/project.rb +266 -0
- data/plugins/project/lib/project/adapters/local.rb +82 -0
- data/plugins/project/lib/project/adapters/remote.rb +96 -0
- data/plugins/project/lib/project/adapters/remote_protocols/ftp.rb +93 -0
- data/plugins/project/lib/project/adapters/remote_protocols/protocol.rb +94 -0
- data/plugins/project/lib/project/adapters/remote_protocols/sftp.rb +181 -0
- data/plugins/project/lib/project/commands.rb +449 -0
- data/plugins/project/lib/project/dir_controller.rb +275 -0
- data/plugins/project/lib/project/dir_mirror.rb +176 -0
- data/plugins/project/lib/project/drb_service.rb +86 -0
- data/plugins/project/lib/project/file_list.rb +164 -0
- data/plugins/project/lib/project/file_mirror.rb +85 -0
- data/plugins/project/lib/project/find_file_dialog.rb +118 -0
- data/plugins/project/lib/project/find_recent_dialog.rb +30 -0
- data/plugins/project/lib/project/manager.rb +545 -0
- data/plugins/project/lib/project/project_tree_controller.rb +24 -0
- data/plugins/project/lib/project/recent.rb +64 -0
- data/plugins/project/lib/project/sub_project.rb +17 -0
- data/plugins/project/lib/project/support/recycle.js +2 -0
- data/plugins/project/lib/project/support/trash.rb +73 -0
- data/plugins/project/plugin.rb +11 -0
- data/plugins/project/spec/fixture_helper.rb +30 -0
- data/plugins/project/spec/project/adapters/remote_protocols/ftp_spec.rb +75 -0
- data/plugins/project/spec/project/adapters/remote_protocols/sftp_spec.rb +121 -0
- data/plugins/project/spec/project/adapters/remote_spec.rb +136 -0
- data/plugins/project/spec/project/dir_mirror_spec.rb +65 -0
- data/plugins/project/spec/project/file_list_spec.rb +151 -0
- data/plugins/project/spec/project/file_mirror_spec.rb +97 -0
- data/plugins/project/spec/spec_helper.rb +26 -0
- data/plugins/project/views/bulk_rename.html.erb +162 -0
- data/plugins/project_search/features/support/env.rb +6 -0
- data/plugins/project_search/features/word_search.feature +34 -0
- data/plugins/project_search/lib/project_search.rb +82 -0
- data/plugins/project_search/lib/project_search/binary_data_detector.rb +46 -0
- data/plugins/project_search/lib/project_search/commands.rb +50 -0
- data/plugins/project_search/lib/project_search/hit.rb +21 -0
- data/plugins/project_search/lib/project_search/images/spinner.gif +0 -0
- data/plugins/project_search/lib/project_search/lucene_index.rb +81 -0
- data/plugins/project_search/lib/project_search/lucene_refresh.rb +22 -0
- data/plugins/project_search/lib/project_search/project.rb +14 -0
- data/plugins/project_search/lib/project_search/query.rb +29 -0
- data/plugins/project_search/lib/project_search/stylesheets/style.css +279 -0
- data/plugins/project_search/lib/project_search/views/_file.html.erb +58 -0
- data/plugins/project_search/lib/project_search/views/index.html.erb +156 -0
- data/plugins/project_search/lib/project_search/word_search.rb +143 -0
- data/plugins/project_search/lib/project_search/word_search_controller.rb +219 -0
- data/plugins/project_search/plugin.rb +8 -0
- data/plugins/project_search/spec/fixtures/project/binary_file.bin +0 -0
- data/plugins/project_search/spec/fixtures/project/foo.txt +43 -0
- data/plugins/project_search/spec/fixtures/project/qux.rb +3 -0
- data/plugins/project_search/spec/project_search/binary_data_detector_spec.rb +24 -0
- data/plugins/project_search/spec/project_search/word_search_spec.rb +157 -0
- data/plugins/project_search/spec/spec_helper.rb +27 -0
- data/plugins/redcar/features/alter_font_size.feature +26 -0
- data/plugins/redcar/features/goto_line_command.feature +20 -0
- data/plugins/redcar/features/step_definitions/env.rb +5 -0
- data/plugins/redcar/features/step_definitions/font_steps.rb +34 -0
- data/plugins/redcar/features/text_editing.feature +34 -0
- data/plugins/redcar/features/text_navigation.feature +30 -0
- data/plugins/redcar/plugin.rb +17 -0
- data/plugins/redcar/redcar.rb +1097 -0
- data/plugins/redcar_debug/lib/redcar_debug.rb +91 -0
- data/plugins/redcar_debug/plugin.rb +8 -0
- data/plugins/redcar_debug/views/history.html.erb +34 -0
- data/plugins/redcar_debug/views/index.html.erb +36 -0
- data/plugins/repl/features/command_editing.feature +55 -0
- data/plugins/repl/features/command_history.feature +75 -0
- data/plugins/repl/features/step_definitions/repl_steps.rb +19 -0
- data/plugins/repl/features/support/env.rb +24 -0
- data/plugins/repl/features/support/fake_repl.rb +16 -0
- data/plugins/repl/lib/repl.rb +40 -0
- data/plugins/repl/lib/repl/repl_command.rb +20 -0
- data/plugins/repl/lib/repl/repl_mirror.rb +255 -0
- data/plugins/repl/lib/repl/repl_tab.rb +154 -0
- data/plugins/repl/plugin.rb +8 -0
- data/plugins/repl/spec/repl/repl_mirror_spec.rb +72 -0
- data/plugins/repl/spec/spec_helper.rb +5 -0
- data/plugins/repl_swt/lib/repl_swt.rb +7 -0
- data/plugins/repl_swt/lib/repl_swt/key_listener.rb +43 -0
- data/plugins/repl_swt/plugin.rb +8 -0
- data/plugins/ruby/features/fixtures/test.rb +0 -0
- data/plugins/ruby/features/support/env.rb +4 -0
- data/plugins/ruby/features/syntax_check_ruby.feature +26 -0
- data/plugins/ruby/lib/ruby.rb +35 -0
- data/plugins/ruby/lib/ruby/repl_mirror.rb +46 -0
- data/plugins/ruby/lib/ruby/syntax_checker.rb +30 -0
- data/plugins/ruby/plugin.rb +8 -0
- data/plugins/ruby/spec/ruby/repl_mirror_spec.rb +202 -0
- data/plugins/ruby/spec/spec_helper.rb +5 -0
- data/plugins/runnables/features/command_tree.feature +63 -0
- data/plugins/runnables/features/file_runner_input.feature +21 -0
- data/plugins/runnables/features/parameter_input.feature +43 -0
- data/plugins/runnables/features/run_alternate_command.feature +15 -0
- data/plugins/runnables/features/run_command_tab.feature +47 -0
- data/plugins/runnables/features/step_definitions/runnable_steps.rb +28 -0
- data/plugins/runnables/features/support/env.rb +124 -0
- data/plugins/runnables/lib/runnables.rb +180 -0
- data/plugins/runnables/lib/runnables/command_output_controller.rb +183 -0
- data/plugins/runnables/lib/runnables/commands.rb +82 -0
- data/plugins/runnables/lib/runnables/output_processor.rb +74 -0
- data/plugins/runnables/lib/runnables/running_process_checker.rb +34 -0
- data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable.rb +62 -0
- data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_group.rb +45 -0
- data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_type_group.rb +30 -0
- data/plugins/runnables/lib/runnables/tree_mirror/tree_controller.rb +36 -0
- data/plugins/runnables/lib/runnables/tree_mirror/tree_mirror.rb +66 -0
- data/plugins/runnables/plugin.rb +9 -0
- data/plugins/runnables/spec/runnables/output_processor_spec.rb +57 -0
- data/plugins/runnables/spec/spec_helper.rb +5 -0
- data/plugins/runnables/views/basic_ansi.css +34 -0
- data/plugins/runnables/views/color_tester.html +50 -0
- data/plugins/runnables/views/command_output.html.erb +32 -0
- data/plugins/runnables/views/default.css +79 -0
- data/plugins/runnables/views/indicator.gif +0 -0
- data/plugins/runnables/views/redcar_small_icon.png +0 -0
- data/plugins/runnables/views/reset.css +53 -0
- data/plugins/runnables/views/running_test.html +41 -0
- data/plugins/runnables/views/wedgeDown.png +0 -0
- data/plugins/runnables/views/wedgeRight.png +0 -0
- data/plugins/scm/lib/scm.rb +296 -0
- data/plugins/scm/lib/scm/commands.rb +48 -0
- data/plugins/scm/lib/scm/commit_mirror.rb +72 -0
- data/plugins/scm/lib/scm/diff_mirror.rb +31 -0
- data/plugins/scm/lib/scm/errors.rb +8 -0
- data/plugins/scm/lib/scm/model.rb +275 -0
- data/plugins/scm/lib/scm/scm_changes_controller.rb +107 -0
- data/plugins/scm/lib/scm/scm_changes_mirror.rb +51 -0
- data/plugins/scm/lib/scm/scm_changes_mirror/change.rb +63 -0
- data/plugins/scm/lib/scm/scm_changes_mirror/changes_node.rb +47 -0
- data/plugins/scm/lib/scm/scm_changes_mirror/drag_controller.rb +78 -0
- data/plugins/scm/lib/scm/scm_commits_controller.rb +49 -0
- data/plugins/scm/lib/scm/scm_commits_mirror.rb +36 -0
- data/plugins/scm/lib/scm/scm_commits_mirror/commit.rb +26 -0
- data/plugins/scm/lib/scm/scm_commits_mirror/commits_node.rb +38 -0
- data/plugins/scm/plugin.rb +8 -0
- data/plugins/scm/spec/spec_helper.rb +5 -0
- data/plugins/scm_git/lib/scm_git.rb +543 -0
- data/plugins/scm_git/lib/scm_git/change.rb +137 -0
- data/plugins/scm_git/lib/scm_git/commit.rb +18 -0
- data/plugins/scm_git/lib/scm_git/config_file.rb +31 -0
- data/plugins/scm_git/plugin.rb +7 -0
- data/plugins/scm_hg/lib/scm_hg.rb +30 -0
- data/plugins/scm_hg/plugin.rb +7 -0
- data/plugins/scm_svn/LICENSE +48 -0
- data/plugins/scm_svn/features/add_and_commit.feature +18 -0
- data/plugins/scm_svn/features/checkout.feature +5 -0
- data/plugins/scm_svn/features/edit_and_index.feature +12 -0
- data/plugins/scm_svn/features/ignore_files.feature +14 -0
- data/plugins/scm_svn/features/merge.feature +34 -0
- data/plugins/scm_svn/features/resolve_conflict.feature +23 -0
- data/plugins/scm_svn/features/revert_and_delete.feature +21 -0
- data/plugins/scm_svn/features/step_definitions/branch_and_merge_steps.rb +27 -0
- data/plugins/scm_svn/features/step_definitions/checkout_steps.rb +25 -0
- data/plugins/scm_svn/features/step_definitions/edit_and_index_steps.rb +50 -0
- data/plugins/scm_svn/features/step_definitions/scm_svn_steps.rb +57 -0
- data/plugins/scm_svn/features/support/env.rb +71 -0
- data/plugins/scm_svn/features/switch_branches.feature +53 -0
- data/plugins/scm_svn/features/update.feature +16 -0
- data/plugins/scm_svn/lib/scm_svn.rb +445 -0
- data/plugins/scm_svn/lib/scm_svn/change.rb +116 -0
- data/plugins/scm_svn/plugin.rb +7 -0
- data/plugins/snippets/features/snippet_indenting.feature +87 -0
- data/plugins/snippets/features/snippets.feature +398 -0
- data/plugins/snippets/features/step_definitions/snippet_steps.rb +16 -0
- data/plugins/snippets/features/support/env.rb +1 -0
- data/plugins/snippets/lib/snippets.rb +111 -0
- data/plugins/snippets/lib/snippets/document_controller.rb +591 -0
- data/plugins/snippets/lib/snippets/explorer.rb +48 -0
- data/plugins/snippets/lib/snippets/tab_handler.rb +117 -0
- data/plugins/snippets/plugin.rb +9 -0
- data/plugins/splash_screen/plugin.rb +8 -0
- data/plugins/splash_screen/splash_screen.rb +62 -0
- data/plugins/strip_trailing_spaces/features/fixtures/test.txt +3 -0
- data/plugins/strip_trailing_spaces/features/strip_trailing_spaces.feature +34 -0
- data/plugins/strip_trailing_spaces/lib/strip_trailing_spaces.rb +60 -0
- data/plugins/strip_trailing_spaces/plugin.rb +8 -0
- data/plugins/syntax_check/README +6 -0
- data/plugins/syntax_check/features/step_definitions/syntax_check_steps.rb +11 -0
- data/plugins/syntax_check/features/support/env.rb +3 -0
- data/plugins/syntax_check/lib/syntax_check.rb +100 -0
- data/plugins/syntax_check/lib/syntax_check/annotation.rb +61 -0
- data/plugins/syntax_check/lib/syntax_check/checker.rb +47 -0
- data/plugins/syntax_check/lib/syntax_check/error.rb +24 -0
- data/plugins/syntax_check/plugin.rb +7 -0
- data/plugins/task_manager/lib/task_manager.rb +30 -0
- data/plugins/task_manager/plugin.rb +11 -0
- data/plugins/task_manager/views/index.html.erb +70 -0
- data/plugins/test_runner/lib/test_runner.rb +40 -0
- data/plugins/test_runner/lib/test_runner/jasmine_test_runner.rb +15 -0
- data/plugins/test_runner/lib/test_runner/rspec_runner.rb +20 -0
- data/plugins/test_runner/lib/test_runner/run_test_command.rb +63 -0
- data/plugins/test_runner/lib/test_runner/runnable_test_runner.rb +42 -0
- data/plugins/test_runner/plugin.rb +8 -0
- data/plugins/test_runner/spec/run_test_command_spec.rb +51 -0
- data/plugins/test_runner/spec/spec_helper.rb +5 -0
- data/plugins/textmate/features/bundle_tree.feature +23 -0
- data/plugins/textmate/features/step_definitions/tree_steps.rb +57 -0
- data/plugins/textmate/features/support/env.rb +19 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/If.tmSnippet +18 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/If__Else.tmSnippet +20 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Include.tmSnippet +16 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Loop.tmSnippet +18 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Unless.tmSnippet +18 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/Var.tmSnippet +16 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/Snippets/next_If__Else.tmSnippet +20 -0
- data/plugins/textmate/features/support/test_bundle.tmbundle/info.plist +26 -0
- data/plugins/textmate/lib/textmate.rb +202 -0
- data/plugins/textmate/lib/textmate/bundle.rb +100 -0
- data/plugins/textmate/lib/textmate/commands.rb +79 -0
- data/plugins/textmate/lib/textmate/environment.rb +76 -0
- data/plugins/textmate/lib/textmate/plist.rb +80 -0
- data/plugins/textmate/lib/textmate/preference.rb +125 -0
- data/plugins/textmate/lib/textmate/snippet.rb +47 -0
- data/plugins/textmate/lib/textmate/tree_mirror.rb +206 -0
- data/plugins/textmate/plugin.rb +8 -0
- data/plugins/textmate/views/installed_bundles.html.erb +24 -0
- data/plugins/todo_list/README.md +22 -0
- data/plugins/todo_list/features/support/env.rb +8 -0
- data/plugins/todo_list/features/todo_list.feature +26 -0
- data/plugins/todo_list/lib/todo_list.rb +49 -0
- data/plugins/todo_list/lib/todo_list/file_parser.rb +58 -0
- data/plugins/todo_list/lib/todo_list/todo_controller.rb +99 -0
- data/plugins/todo_list/plugin.rb +11 -0
- data/plugins/todo_list/spec/fixtures/project/FIXME.file +3 -0
- data/plugins/todo_list/spec/fixtures/project/NOTE.ignored.file +1 -0
- data/plugins/todo_list/spec/fixtures/project/OPTIMIZE_colon.file +1 -0
- data/plugins/todo_list/spec/fixtures/project/XXX.ignored +1 -0
- data/plugins/todo_list/spec/fixtures/project/ignored_directory/TODO.file +2 -0
- data/plugins/todo_list/spec/fixtures/settings.rb +11 -0
- data/plugins/todo_list/spec/spec_helper.rb +6 -0
- data/plugins/todo_list/spec/todo_list/file_parser_spec.rb +35 -0
- data/plugins/todo_list/views/default.css +15 -0
- data/plugins/todo_list/views/index.html.erb +19 -0
- data/plugins/todo_list/views/redcar_small_icon.png +0 -0
- data/plugins/tree_view_swt/lib/tree_view_swt.rb +496 -0
- data/plugins/tree_view_swt/plugin.rb +9 -0
- data/plugins/web_bookmarks/Screenshot.png +0 -0
- data/plugins/web_bookmarks/features/bookmark.feature +37 -0
- data/plugins/web_bookmarks/features/fixtures/other.html +1 -0
- data/plugins/web_bookmarks/features/fixtures/sample.html +1 -0
- data/plugins/web_bookmarks/features/step_definitions/web_steps.rb +4 -0
- data/plugins/web_bookmarks/features/support/env.rb +26 -0
- data/plugins/web_bookmarks/lib/web_bookmarks.rb +49 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/bookmark.rb +52 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/commands.rb +65 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/tree.rb +74 -0
- data/plugins/web_bookmarks/plugin.rb +10 -0
- 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
|