redcar 0.11.0dev → 0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. data/CHANGES +14 -1
  2. data/README.md +28 -8
  3. data/Rakefile +23 -18
  4. data/bin/redcar +9 -4
  5. data/lib/redcar.rb +42 -4
  6. data/lib/redcar/installer.rb +7 -2
  7. data/lib/redcar/logger.rb +64 -0
  8. data/lib/redcar/runner.rb +17 -8
  9. data/lib/redcar/usage.rb +2 -0
  10. data/plugins/application/features/step_definitions/tree_steps.rb +4 -4
  11. data/plugins/application/features/support/env.rb +6 -6
  12. data/plugins/application/lib/application.rb +31 -3
  13. data/plugins/application/lib/application/command.rb +6 -0
  14. data/plugins/application/lib/application/command/executor.rb +0 -1
  15. data/plugins/application/lib/application/commands/application_commands.rb +21 -0
  16. data/plugins/application/lib/application/commands/notebook_commands.rb +73 -0
  17. data/plugins/application/lib/application/commands/tab_commands.rb +105 -0
  18. data/plugins/application/lib/application/commands/treebook_commands.rb +117 -0
  19. data/plugins/application/lib/application/commands/window_commands.rb +68 -0
  20. data/plugins/{tree/lib → application/lib/application}/tree.rb +0 -4
  21. data/plugins/{tree/lib → application/lib/application}/tree/command.rb +0 -0
  22. data/plugins/{tree/lib → application/lib/application}/tree/controller.rb +0 -0
  23. data/plugins/{tree/lib → application/lib/application}/tree/mirror.rb +0 -0
  24. data/plugins/application/spec/application/keymap/builder_spec.rb +1 -1
  25. data/plugins/application/spec/application/menu/builder_spec.rb +2 -2
  26. data/plugins/application_swt/lib/application_swt.rb +4 -2
  27. data/plugins/application_swt/lib/swt/vtab_label.rb +6 -3
  28. data/plugins/auto_indenter/lib/auto_indenter/document_controller.rb +6 -3
  29. data/plugins/clojure/lib/clojure.rb +2 -2
  30. data/plugins/core/lib/core.rb +0 -4
  31. data/plugins/core/lib/core/gui.rb +2 -4
  32. data/plugins/core/lib/core/plugin/storage.rb +68 -21
  33. data/plugins/core/spec/core/base_storage_spec.rb +81 -0
  34. data/plugins/core/spec/core/shared_storage_spec.rb +49 -0
  35. data/plugins/core/spec/core/storage_spec.rb +13 -63
  36. data/plugins/declarations/lib/declarations.rb +3 -1
  37. data/plugins/document_search/features/replace.feature +29 -20
  38. data/plugins/document_search/lib/document_search/find_speedbar.rb +4 -1
  39. data/plugins/edit_view/features/indentation_commands.feature +6 -5
  40. data/plugins/edit_view/features/step_definitions/notebook_steps.rb +4 -4
  41. data/plugins/edit_view/features/step_definitions/tab_steps.rb +7 -7
  42. data/plugins/edit_view/features/step_definitions/window_steps.rb +2 -2
  43. data/plugins/edit_view/lib/edit_view.rb +15 -1
  44. data/plugins/edit_view/lib/edit_view/modified_tabs_checker.rb +7 -7
  45. data/plugins/edit_view_swt/lib/edit_view_swt.rb +7 -6
  46. data/plugins/execute_current_tab/lib/execute_current_tab.rb +1 -1
  47. data/plugins/groovy/lib/groovy.rb +3 -3
  48. data/plugins/groovy/lib/groovy/commands.rb +1 -1
  49. data/plugins/help/lib/help/view_controller.rb +5 -0
  50. data/plugins/help/views/index.html.erb +10 -1
  51. data/plugins/html_view/features/step_definitions/html_view_steps.rb +1 -1
  52. data/plugins/html_view/features/support/env.rb +0 -15
  53. data/plugins/html_view/lib/html_view.rb +3 -4
  54. data/plugins/html_view/lib/html_view/commands.rb +1 -1
  55. data/plugins/key_bindings/lib/key_bindings.rb +34 -0
  56. data/plugins/key_bindings/plugin.rb +8 -0
  57. data/plugins/{tree → key_bindings}/spec/spec_helper.rb +0 -0
  58. data/plugins/line_tools/features/lower_text.feature +3 -4
  59. data/plugins/line_tools/lib/line_tools.rb +6 -5
  60. data/plugins/mirah/lib/mirah.rb +2 -2
  61. data/plugins/pair_highlighter/lib/pair_highlighter/document_controller.rb +5 -3
  62. data/plugins/project/features/open_directory_tree.feature +1 -1
  63. data/plugins/project/features/step_definitions/file_steps.rb +5 -5
  64. data/plugins/project/features/step_definitions/find_file_steps.rb +2 -3
  65. data/plugins/project/features/support/env.rb +4 -0
  66. data/plugins/project/lib/project.rb +15 -9
  67. data/plugins/project/lib/project/commands.rb +46 -16
  68. data/plugins/project/lib/project/dir_controller.rb +1 -1
  69. data/plugins/project/lib/project/dir_mirror.rb +3 -2
  70. data/plugins/project/lib/project/drb_service.rb +3 -1
  71. data/plugins/project/lib/project/file_list.rb +99 -21
  72. data/plugins/project/lib/project/find_file_dialog.rb +8 -24
  73. data/plugins/project/lib/project/manager.rb +68 -12
  74. data/plugins/project/lib/project/project_tree_controller.rb +1 -1
  75. data/plugins/project/plugin.rb +1 -2
  76. data/plugins/project_search/features/word_search.feature +1 -1
  77. data/plugins/project_search/lib/project_search.rb +16 -6
  78. data/plugins/project_search/lib/project_search/commands.rb +15 -28
  79. data/plugins/project_search/lib/project_search/hit.rb +4 -0
  80. data/plugins/project_search/lib/project_search/lucene_index.rb +14 -4
  81. data/plugins/project_search/lib/project_search/views/_file.html.erb +11 -11
  82. data/plugins/project_search/lib/project_search/word_search.rb +22 -4
  83. data/plugins/project_search/spec/project_search/word_search_spec.rb +2 -2
  84. data/plugins/redcar/redcar.rb +140 -588
  85. data/plugins/repl/features/step_definitions/repl_steps.rb +3 -3
  86. data/plugins/repl/features/support/fake_repl.rb +1 -1
  87. data/plugins/ruby/lib/ruby.rb +4 -4
  88. data/plugins/runnables/features/fixtures/alternate.ruby +1 -0
  89. data/plugins/runnables/features/fixtures/line_app.rb +1 -0
  90. data/plugins/runnables/features/fixtures/name_app.rb +1 -0
  91. data/plugins/runnables/features/fixtures/params_app.rb +1 -0
  92. data/plugins/runnables/features/fixtures/runnable_app.rb +1 -0
  93. data/plugins/runnables/lib/runnables.rb +21 -0
  94. data/plugins/runnables/lib/runnables/command_output_controller.rb +14 -9
  95. data/plugins/runnables/lib/runnables/output_processor.rb +4 -4
  96. data/plugins/runnables/lib/runnables/running_process_checker.rb +6 -6
  97. data/plugins/runnables/plugin.rb +1 -2
  98. data/plugins/scm/lib/scm.rb +18 -18
  99. data/plugins/scm/lib/scm/commit_mirror.rb +2 -2
  100. data/plugins/scm/lib/scm/scm_changes_controller.rb +1 -1
  101. data/plugins/scm_hg/lib/scm_hg.rb +1 -1
  102. data/plugins/snippets/lib/snippets/document_controller.rb +46 -40
  103. data/plugins/swt/lib/swt.rb +2 -0
  104. data/plugins/test_runner/lib/test_runner.rb +1 -0
  105. data/plugins/test_runner/lib/test_runner/jasmine_test_runner.rb +15 -0
  106. data/plugins/test_runner/lib/test_runner/runnable_test_runner.rb +21 -5
  107. data/plugins/textmate/lib/textmate.rb +5 -1
  108. data/plugins/textmate/lib/textmate/preference.rb +4 -0
  109. data/plugins/textmate/lib/textmate/snippet.rb +0 -2
  110. data/plugins/textmate/lib/textmate/tree_mirror.rb +6 -5
  111. data/plugins/textmate/plugin.rb +1 -1
  112. data/plugins/textmate/vendor/redcar-bundles/Bundles/C.tmbundle/Syntaxes/C.plist +2 -2
  113. data/plugins/textmate/vendor/redcar-bundles/Bundles/Clojure.tmbundle/info.plist +2 -0
  114. data/plugins/textmate/vendor/redcar-bundles/Bundles/Cucumber.tmbundle/Syntaxes/Cucumber_Plain_Text_Feature.tmLanguage +0 -4
  115. data/plugins/textmate/vendor/redcar-bundles/Bundles/Cucumber.tmbundle/info.plist +2 -0
  116. data/plugins/textmate/vendor/redcar-bundles/Bundles/Mirah.tmbundle/info.plist +3 -1
  117. data/plugins/textmate/vendor/redcar-bundles/Bundles/Palm-WebOS-Development.tmbundle/info.plist +2 -0
  118. data/plugins/textmate/vendor/redcar-bundles/Bundles/RedcarRepl.tmbundle/info.plist +2 -0
  119. data/plugins/textmate/vendor/redcar-bundles/Bundles/SQL.tmbundle/info.plist +2 -0
  120. data/plugins/textmate/vendor/redcar-bundles/Bundles/Scala.tmbundle/info.plist +2 -0
  121. data/plugins/textmate/vendor/redcar-bundles/Bundles/Smalltalk.tmbundle/Preferences/GNU_Smalltalk.tmPreferences +1 -1
  122. data/plugins/textmate/vendor/redcar-bundles/Bundles/Smalltalk.tmbundle/Preferences/MIST_Smalltalk_Format.tmPreferences +1 -1
  123. data/plugins/textmate/vendor/redcar-bundles/Bundles/Smalltalk.tmbundle/info.plist +2 -0
  124. data/plugins/textmate/vendor/redcar-bundles/Bundles/Vala.tmbundle/info.plist +4 -2
  125. data/plugins/textmate/vendor/redcar-bundles/Bundles/Webrat.tmbundle/info.plist +2 -0
  126. data/plugins/textmate/vendor/redcar-bundles/Bundles/YAML.tmbundle/Syntaxes/YAML.plist +1 -0
  127. data/plugins/textmate/vendor/redcar-bundles/Bundles/groovy.tmbundle/info.plist +2 -0
  128. data/plugins/textmate/vendor/redcar-bundles/Themes/Twilight.tmTheme +0 -2
  129. data/plugins/todo_list/lib/todo_list.rb +3 -3
  130. data/plugins/todo_list/lib/todo_list/todo_controller.rb +1 -1
  131. data/plugins/web_bookmarks/features/step_definitions/web_steps.rb +1 -1
  132. data/plugins/web_bookmarks/lib/web_bookmarks.rb +11 -4
  133. data/plugins/web_bookmarks/lib/web_bookmarks/commands.rb +1 -1
  134. data/plugins/web_bookmarks/plugin.rb +1 -2
  135. metadata +29 -20
  136. data/plugins/core/lib/core/logger.rb +0 -28
  137. data/plugins/file_parser/lib/file_parser.rb +0 -125
  138. data/plugins/file_parser/plugin.rb +0 -7
  139. data/plugins/tree/plugin.rb +0 -9
@@ -15,7 +15,7 @@ module Redcar
15
15
  if tree == @project.tree and r = win.treebook.trees.detect do |t|
16
16
  t.tree_mirror.title == @title
17
17
  end
18
- r.close
18
+ @project.close
19
19
  end
20
20
  end
21
21
  end
@@ -7,6 +7,5 @@ Plugin.define do
7
7
  dependencies "edit_view", ">0",
8
8
  "HTML View", ">0",
9
9
  "connection_manager", ">0",
10
- "application", ">=1.1",
11
- "tree", ">=0"
10
+ "application", ">=1.1"
12
11
  end
@@ -5,7 +5,7 @@ Feature: Word search
5
5
  Background:
6
6
  Given I will choose "plugins/project_search/spec/fixtures/project" from the "open_directory" dialog
7
7
  And I open a directory
8
- When I open the "Word Search" from the "Project" menu
8
+ When I open the "Search" from the "Project" menu
9
9
  And I wait "3" seconds
10
10
 
11
11
  Scenario: See the search interface
@@ -15,7 +15,10 @@ class ProjectSearch
15
15
  Redcar::Menu::Builder.build do
16
16
  sub_menu "Project" do
17
17
  group :priority => 1 do
18
- item "Search", :command => ProjectSearch::WordSearchCommand
18
+ item "Word Search", :command => ProjectSearch::WordSearchCommand
19
+ end
20
+ sub_menu "Refresh", :priority => 31 do
21
+ item "Search index", :command => ProjectSearch::RefreshIndex
19
22
  end
20
23
  end
21
24
  end
@@ -33,8 +36,8 @@ class ProjectSearch
33
36
 
34
37
  def self.toolbars
35
38
  Redcar::ToolBar::Builder.build do
36
- item "Search", :command => WordSearchCommand,
37
- :icon => File.join(Redcar::ICONS_DIRECTORY, "application-search-result.png"),
39
+ item "Word Search", :command => WordSearchCommand,
40
+ :icon => File.join(Redcar::ICONS_DIRECTORY, "application-search-result.png"),
38
41
  :barname => :project
39
42
  end
40
43
  end
@@ -54,13 +57,20 @@ class ProjectSearch
54
57
  end
55
58
  end
56
59
 
57
- Lucene::Config.use do |config|
58
- config[:store_on_file] = true
60
+ def self.shared_storage
61
+ @shared_storage ||= begin
62
+ storage = Redcar::Plugin::SharedStorage.new('shared__ignored_files')
63
+ storage.set_or_update_default('ignored_file_patterns', [/tags$/, /\.log$/])
64
+ storage.save
65
+ end
66
+ end
67
+
68
+ Lucene::Config.use do |config|
69
+ config[:store_on_file] = true
59
70
  config[:storage_path] = ""
60
71
  config[:id_field] = :id
61
72
  end
62
73
 
63
-
64
74
  def self.project_refresh_task_type
65
75
  LuceneRefresh
66
76
  end
@@ -1,5 +1,18 @@
1
1
 
2
2
  class ProjectSearch
3
+ class RefreshIndex < Redcar::Command
4
+ sensitize :open_project
5
+
6
+ def execute
7
+ if project = Redcar::Project::Manager.focussed_project
8
+ if index = ProjectSearch.indexes[project.path]
9
+ index.delete
10
+ project.refresh
11
+ end
12
+ end
13
+ end
14
+ end
15
+
3
16
  class WordSearchCommand < Redcar::Command
4
17
  sensitize :open_project
5
18
 
@@ -12,7 +25,7 @@ class ProjectSearch
12
25
 
13
26
  def execute
14
27
  if project = Redcar::Project::Manager.focussed_project
15
- if (tab = find_open_instance)
28
+ if tab = find_open_instance
16
29
  tab.html_view.refresh
17
30
  tab.focus
18
31
  else
@@ -31,32 +44,6 @@ class ProjectSearch
31
44
  return
32
45
  end
33
46
  end
34
-
35
- class RegexSearchCommand < Redcar::Command
36
- sensitize :open_project
37
-
38
- def execute
39
- if Redcar::Project::Manager.focussed_project
40
- if (tab = find_open_instance)
41
- tab.html_view.controller = tab.html_view.controller # refresh
42
- else
43
- tab = win.new_tab(Redcar::HtmlTab)
44
- tab.html_view.controller = ProjectSearch::RegexSearchController.new
45
- end
46
- tab.focus
47
- else
48
- # warning
49
- Redcar::Application::Dialog.message_box("You need an open project to be able to use Find In Project!", :type => :error)
50
- end
51
- end
47
+ end
52
48
 
53
- private
54
49
 
55
- def find_open_instance
56
- all_tabs = Redcar.app.focussed_window.notebooks.map { |nb| nb.tabs }.flatten
57
- all_tabs.find do |t|
58
- t.is_a?(Redcar::HtmlTab) && t.title == ProjectSearch::RegexSearchController.new.title
59
- end
60
- end
61
- end
62
- end
@@ -13,5 +13,9 @@ class ProjectSearch
13
13
  def line(start_with=nil, end_with=nil)
14
14
  @line.gsub(@regex) { start_with.to_s + $& + end_with.to_s }
15
15
  end
16
+
17
+ def inspect
18
+ "<Hit #{file}:#{line_num}>"
19
+ end
16
20
  end
17
21
  end
@@ -13,6 +13,16 @@ class ProjectSearch
13
13
  File.join(@project.config_dir, 'lucene_last_updated')
14
14
  end
15
15
 
16
+ def lucene_index_dir
17
+ File.join(@project.config_dir, "lucene")
18
+ end
19
+
20
+ def delete
21
+ FileUtils.rm(timestamp_file_path)
22
+ FileUtils.rm_r(lucene_index_dir)
23
+ load
24
+ end
25
+
16
26
  def load
17
27
  @last_updated = Time.at(0)
18
28
  if File.exist?(timestamp_file_path)
@@ -35,12 +45,12 @@ class ProjectSearch
35
45
  changed_files = @project.file_list.changed_since(last_updated)
36
46
  @last_updated = Time.now
37
47
  changed_files.reject! do |fn, ts|
38
- fn.index(@project.config_dir)
48
+ fn.index(@project.config_dir) or Redcar::Project::FileList.hide_file_path?(fn)
39
49
  end
40
- Lucene::Transaction.run do
41
- @lucene_index ||= Lucene::Index.new(File.join(@project.config_dir, "lucene"))
50
+ Lucene::Transaction.run do
51
+ @lucene_index ||= Lucene::Index.new(lucene_index_dir)
42
52
  begin
43
- @lucene_index.field_infos[:contents][:store] = true
53
+ @lucene_index.field_infos[:contents][:store] = true
44
54
  @lucene_index.field_infos[:contents][:tokenized] = true
45
55
  changed_files.each do |fn, ts|
46
56
  unless File.basename(fn)[0..0] == "." or fn.include?(".git")
47
57
  contents = File.read(fn)
@@ -15,16 +15,16 @@
15
15
  <% hits.each_with_index do |hit, i| %>
16
16
  <% next_hit = hits[i + 1] %>
17
17
  <% next_hit_line_num = next_hit ? next_hit.line_num : 100_000_000 %>
18
-
19
- <% if @word_search.context? and last_matching_line_num and (hit.line_num - last_matching_line_num) > (@word_search.context_size * 2) %>
18
+ <% display_line_num = hit.line_num + 1%>
19
+ <% if @word_search.context? and last_matching_line_num and (display_line_num - last_matching_line_num) > (@word_search.context_size * 2) %>
20
20
  <tr class="divider file_<%= file_num %>">
21
21
  <td class="line_num">. . .</td>
22
22
  <td class="text">&nbsp;</td> <!-- extra space to ensure line-height is respected -->
23
23
  </tr>
24
24
  <% end %>
25
-
25
+
26
26
  <% hit.pre_context.each_with_index do |context_line, i| %>
27
- <% this_line_num = hit.line_num - @word_search.context_size + i %>
27
+ <% this_line_num = display_line_num - @word_search.context_size + i %>
28
28
  <% unless this_line_num <= last_displayed_line_num %>
29
29
  <% line_index += 1 %>
30
30
  <tr class="result file_<%= file_num %> line_<%= this_line_num %> <%= (line_index % 2 == 0 ? 'even' : 'odd') %>" data-href='<%= CGI::escapeHTML(file) %>' data-line_num='<%= this_line_num %>'>
@@ -34,17 +34,17 @@
34
34
  </tr>
35
35
  <% end %>
36
36
  <% end %>
37
-
37
+
38
38
  <% line_index += 1 %>
39
- <% last_displayed_line_num = hit.line_num %>
40
- <tr class="result file_<%= file_num %> line_<%= hit.line_num %> <%= (line_index % 2 == 0 ? 'even' : 'odd') %>" data-href='<%= CGI::escapeHTML(file) %>' data-line_num='<%= hit.line_num %>'>
41
- <td class='line_num'><%= hit.line_num %></td>
39
+ <% last_displayed_line_num = display_line_num %>
40
+ <tr class="result file_<%= file_num %> line_<%= display_line_num %> <%= (line_index % 2 == 0 ? 'even' : 'odd') %>" data-href='<%= CGI::escapeHTML(file) %>' data-line_num='<%= display_line_num %>'>
41
+ <td class='line_num'><%= display_line_num %></td>
42
42
  <% text = CGI.escapeHTML(hit.line).gsub(@word_search.regex) { "<span>#{$&}</span>" } %>
43
43
  <td class='text'><pre><%= text.chomp + " " %></pre></td> <!-- extra space to ensure line-height is respected -->
44
44
  </tr>
45
45
 
46
46
  <% hit.post_context.each_with_index do |context_line, i| %>
47
- <% this_line_num = hit.line_num + i + 1%>
47
+ <% this_line_num = display_line_num + i + 1%>
48
48
  <% unless this_line_num >= next_hit_line_num %>
49
49
  <% last_displayed_line_num = this_line_num %>
50
50
  <% line_index += 1 %>
@@ -55,6 +55,6 @@
55
55
  </tr>
56
56
  <% end %>
57
57
  <% end %>
58
-
59
- <% last_matching_line_num = hit.line_num %>
58
+
59
+ <% last_matching_line_num = display_line_num %>
60
60
  <% end %>
@@ -49,6 +49,7 @@ class ProjectSearch
49
49
  remove_hits << hit
50
50
  end
51
51
  end
52
+
52
53
  hits_needing_post_context -= remove_hits
53
54
 
54
55
  if matching_line?(line)
@@ -59,11 +60,10 @@ class ProjectSearch
59
60
  hits_needing_post_context << hit
60
61
  end
61
62
  end
62
-
63
- if pre_context.length == context_size
63
+ pre_context << line
64
+ if pre_context.length > context_size
64
65
  pre_context.shift
65
66
  end
66
- pre_context << line
67
67
  end
68
68
  send_file_results(file_hits)
69
69
  end
@@ -97,7 +97,25 @@ class ProjectSearch
97
97
  new_doc_ids = index.find(:contents => bit.downcase).map {|doc| doc.id }
98
98
  doc_ids = doc_ids ? (doc_ids & new_doc_ids) : new_doc_ids
99
99
  end
100
- doc_ids
100
+ doc_ids.reject {|doc_id| Redcar::Project::FileList.hide_file_path?(doc_id) }
101
+ end
102
+ end
103
+
104
+ def ignore_regexes
105
+ self.class.shared_storage['ignored_file_patterns']
106
+ end
107
+
108
+ def ignore_file?(filename)
109
+ if self.class.storage['ignore_file_patterns']
110
+ ignore_regexes.any? {|re| re =~ filename }
111
+ end
112
+ end
113
+
114
+ def inspect
115
+ if @results
116
+ "<ProjectSearch::WordSearch #{project.path} \"#{query_string}\" #{@results.length} hits>"
117
+ else
118
+ "<ProjectSearch::WordSearch #{project.path} \"#{query_string}\" ...>"
101
119
  end
102
120
  end
103
121
  end
@@ -37,7 +37,7 @@ describe ProjectSearch::WordSearch do
37
37
  results.length.should == 1
38
38
  result = results.first
39
39
  result.should be_an_instance_of(ProjectSearch::Hit)
40
- result.file.should == project_search_fixture_dir + "/foo.txt"
40
+ File.expand_path(result.file).should == File.expand_path(project_search_fixture_dir + "/foo.txt")
41
41
  result.line_num.should == 0
42
42
  result.line("<b>", "</b>").should == "<b>Foo</b> Bar Baz"
43
43
  end
@@ -68,7 +68,7 @@ describe ProjectSearch::WordSearch do
68
68
  results.length.should == 1
69
69
  result = results.first
70
70
  result.should be_an_instance_of(ProjectSearch::Hit)
71
- result.file.should == project_search_fixture_dir + "/foo.txt"
71
+ File.expand_path(result.file).should == File.expand_path(project_search_fixture_dir + "/foo.txt")
72
72
  result.line_num.should == 2
73
73
  result.line("<b>", "</b>").should == "<b>Corge</b> <b>Corge</b> <b>Corge</b>"
74
74
  end
@@ -52,41 +52,7 @@ module Redcar
52
52
  end
53
53
 
54
54
  module Top
55
- class QuitCommand < Command
56
-
57
- def execute
58
- check_for_modified_tabs_and_quit
59
- end
60
-
61
- private
62
-
63
- def check_for_modified_tabs_and_quit
64
- EditView::ModifiedTabsChecker.new(
65
- Redcar.app.all_tabs.select {|t| t.is_a?(EditTab)},
66
- "Save all before quitting?",
67
- :none => lambda { check_for_running_processes_and_quit },
68
- :continue => lambda { check_for_running_processes_and_quit },
69
- :cancel => nil
70
- ).check
71
- end
72
-
73
- def check_for_running_processes_and_quit
74
- Runnables::RunningProcessChecker.new(
75
- Redcar.app.all_tabs.select {|t| t.is_a?(HtmlTab)},
76
- "Kill all and quit?",
77
- :none => lambda { quit },
78
- :continue => lambda { quit },
79
- :cancel => nil
80
- ).check
81
- end
82
-
83
- def quit
84
- Project::Manager.open_projects.each {|pr| pr.close }
85
- Redcar.app.quit
86
- end
87
- end
88
-
89
- class NewCommand < Command
55
+ class OpenNewEditTabCommand < Command
90
56
 
91
57
  def execute
92
58
  unless win.nil?
@@ -101,76 +67,6 @@ module Redcar
101
67
  end
102
68
  end
103
69
 
104
- class NewNotebookCommand < Command
105
- # sensitize :single_notebook
106
-
107
- def execute
108
- #unless win.notebooks.length > 1
109
- win.create_notebook
110
- # end
111
- end
112
- end
113
-
114
- class NewWindowCommand < Command
115
-
116
- def initialize(title=nil)
117
- @title = title
118
- end
119
-
120
- def execute
121
- window = Redcar.app.new_window
122
- window.title = @title if @title
123
- end
124
- end
125
-
126
- class CloseWindowCommand < Command
127
- def initialize(window=nil)
128
- @window = window
129
- end
130
-
131
- def execute
132
- check_for_modified_tabs_and_close_window
133
- quit_if_no_windows if [:linux, :windows].include?(Redcar.platform)
134
- @window = nil
135
- end
136
-
137
- private
138
-
139
- def quit_if_no_windows
140
- if Redcar.app.windows.length == 0
141
- if Application.storage['stay_resident_after_last_window_closed'] && !(ARGV.include?("--multiple-instance"))
142
- puts 'continuing to run to wait for incoming drb connections later'
143
- else
144
- QuitCommand.new.run
145
- end
146
- end
147
- end
148
-
149
- def check_for_modified_tabs_and_close_window
150
- EditView::ModifiedTabsChecker.new(
151
- win.notebooks.map(&:tabs).flatten.select {|t| t.is_a?(EditTab)},
152
- "Save all before closing the window?",
153
- :none => lambda { check_for_running_processes_and_close_window },
154
- :continue => lambda { check_for_running_processes_and_close_window },
155
- :cancel => nil
156
- ).check
157
- end
158
-
159
- def check_for_running_processes_and_close_window
160
- Runnables::RunningProcessChecker.new(
161
- win.notebooks.map(&:tabs).flatten.select {|t| t.is_a?(HtmlTab)},
162
- "Kill them and close the window?",
163
- :none => lambda { win.close },
164
- :continue => lambda { win.close },
165
- :cancel => nil
166
- ).check
167
- end
168
-
169
- def win
170
- @window || super
171
- end
172
- end
173
-
174
70
  class GenerateWindowsMenu < Command
175
71
  def initialize(builder)
176
72
  @builder = builder
@@ -205,9 +101,15 @@ module Redcar
205
101
  book.tabs.each_with_index do |tab,i|
206
102
  num = i + 1
207
103
  if num < 10
208
- @builder.item "Tab #{num}: #{trim(tab.title)}", :type => :radio, :active => (tab == focussed_tab), :command => Top.const_get("SelectTab#{num}Command")
104
+ @builder.item("Tab #{num}: #{trim(tab.title)}",
105
+ :type => :radio,
106
+ :active => (tab == focussed_tab),
107
+ :command => Redcar::Application.const_get("SelectTab#{num}Command")
108
+ )
209
109
  else
210
- @builder.item("Tab #{num}: #{trim(tab.title)}", :type => :radio, :active => (tab == focussed_tab)) {tab.focus}
110
+ @builder.item("Tab #{num}: #{trim(tab.title)}",
111
+ :type => :radio,
112
+ :active => (tab == focussed_tab)) { tab.focus }
211
113
  end
212
114
  end
213
115
  if book = win.nonfocussed_notebook and book.tabs.any?
@@ -221,133 +123,9 @@ module Redcar
221
123
  end
222
124
  end
223
125
 
224
- class FocusWindowCommand < Command
225
- def initialize(window=nil)
226
- @window = window
227
- end
228
-
229
- def execute
230
- win.focus
231
- @window = nil
232
- end
233
-
234
- def win
235
- @window || super
236
- end
237
- end
238
-
239
- class RotateNotebooksCommand < Command
240
- sensitize :multiple_notebooks
241
-
242
- def execute
243
- win.rotate_notebooks
244
- end
245
- end
246
-
247
- class CloseNotebookCommand < Command
248
- sensitize :multiple_notebooks
249
-
250
- def execute
251
- unless win.notebooks.length == 1
252
- win.close_notebook
253
- end
254
- end
255
- end
256
-
257
- class SwitchNotebookCommand < Command
258
- sensitize :multiple_notebooks, :other_notebook_has_tab
259
-
260
- def execute
261
- new_notebook = win.nonfocussed_notebook
262
- if new_notebook.focussed_tab
263
- new_notebook.focussed_tab.focus
264
- end
265
- end
266
- end
267
-
268
- class MoveTabToOtherNotebookCommand < Command
269
- sensitize :multiple_notebooks, :open_tab
270
-
271
- def execute
272
- current_notebook = tab.notebook
273
- i = win.notebooks.index current_notebook
274
-
275
- target_notebook = win.notebooks[ (i + 1) % win.notebooks.length ]
276
- target_notebook.grab_tab_from(current_notebook, tab)
277
- tab.focus
278
- end
279
- end
280
-
281
- class OpenTreeFinderCommand < TreeCommand
282
-
283
- def execute
284
- if win = Redcar.app.focussed_window
285
- if trees = win.treebook.trees and trees.any?
286
- titles = []
287
- trees.each {|t| titles << t.tree_mirror.title}
288
- dialog = TreeFuzzyFilter.new(win,titles)
289
- dialog.open
290
- end
291
- end
292
- end
293
-
294
- class TreeFuzzyFilter < FilterListDialog
295
-
296
- def initialize(win,titles)
297
- super()
298
- @win = win
299
- @titles = titles
300
- end
301
-
302
- def selected(text,ix)
303
- if tree = @win.treebook.trees.detect do |tree|
304
- tree.tree_mirror.title == text
305
- end
306
- if @win.treebook.focussed_tree == tree
307
- @win.set_trees_visible(true) if not @win.trees_visible?
308
- else
309
- @win.treebook.focus_tree(tree)
310
- end
311
- tree.focus
312
- close
313
- end
314
- end
315
-
316
- def update_list(filter)
317
- @titles.select do |t|
318
- t.downcase.include?(filter.downcase)
319
- end
320
- end
321
- end
322
- end
323
-
324
- class CloseTreeCommand < TreeCommand
325
- def execute
326
- win = Redcar.app.focussed_window
327
- if win and treebook = win.treebook
328
- if tree = treebook.focussed_tree
329
- treebook.remove_tree(tree)
330
- end
331
- end
332
- end
333
- end
334
-
335
- class ToggleTreesCommand < TreeCommand
336
- def execute
337
- win = Redcar.app.focussed_window
338
- if win and treebook = win.treebook
339
- if win.trees_visible?
340
- win.set_trees_visible(false)
341
- else
342
- win.set_trees_visible(true)
343
- end
344
- end
345
- end
346
- end
347
-
348
126
  class AboutCommand < Command
349
127
  def execute
350
- new_tab = Top::NewCommand.new.run
128
+ new_tab = Top::OpenNewEditTabCommand.new.run
351
129
  new_tab.document.text = <<-TXT
352
130
  About: Redcar\nVersion: #{Redcar::VERSION}
353
131
  Ruby Version: #{RUBY_VERSION}
@@ -362,7 +140,7 @@ Redcar.environment: #{Redcar.environment}
362
140
 
363
141
  class ChangelogCommand < Command
364
142
  def execute
365
- new_tab = Top::NewCommand.new.run
143
+ new_tab = Top::OpenNewEditTabCommand.new.run
366
144
  new_tab.document.text = File.read(File.join(File.dirname(__FILE__), "..", "..", "CHANGES"))
367
145
  new_tab.edit_view.reset_undo
368
146
  new_tab.edit_view.document.set_modified(false)
@@ -382,135 +160,6 @@ Redcar.environment: #{Redcar.environment}
382
160
  end
383
161
  end
384
162
 
385
- class CloseTabCommand < TabCommand
386
- def initialize(tab=nil)
387
- @tab = tab
388
- end
389
-
390
- def tab
391
- @tab || super
392
- end
393
-
394
- def execute
395
- if tab.is_a?(EditTab)
396
- if tab.edit_view.document.modified?
397
- tab.focus
398
- result = Application::Dialog.message_box(
399
- "This tab has unsaved changes. \n\nSave before closing?",
400
- :buttons => :yes_no_cancel
401
- )
402
- case result
403
- when :yes
404
- tab.edit_view.document.save!
405
- close_tab
406
- when :no
407
- close_tab
408
- when :cancel
409
- end
410
- else
411
- close_tab
412
- end
413
- elsif tab.is_a?(HtmlTab)
414
- if tab.html_view.controller and message = tab.html_view.controller.ask_before_closing
415
- tab.focus
416
- result = Application::Dialog.message_box(
417
- message,
418
- :buttons => :yes_no_cancel
419
- )
420
- case result
421
- when :yes
422
- close_tab
423
- when :no
424
- close_tab
425
- when :cancel
426
- end
427
- else
428
- close_tab
429
- end
430
- else
431
- close_tab
432
- end
433
- @tab = nil
434
- end
435
-
436
- private
437
-
438
- def close_tab
439
- win = tab.notebook.window
440
- tab.close
441
- # this will break a lot of features:
442
- #if win.all_tabs.empty? and not Project::Manager.in_window(win)
443
- # win.close
444
- #end
445
- end
446
- end
447
-
448
- class CloseAll < Redcar::Command
449
- def execute
450
- window = Redcar.app.focussed_window
451
- tabs = window.all_tabs
452
- tabs.each do |t|
453
- Redcar::Top::CloseTabCommand.new(t).run
454
- end
455
- end
456
- end
457
-
458
- class CloseOthers < Redcar::Command
459
- def execute
460
- window = Redcar.app.focussed_window
461
- current_tab = Redcar.app.focussed_notebook_tab
462
- tabs = window.all_tabs
463
- tabs.each do |t|
464
- unless t == current_tab
465
- Redcar::Top::CloseTabCommand.new(t).run
466
- end
467
- end
468
- end
469
- end
470
-
471
- class SwitchTreeDownCommand < TreeCommand
472
-
473
- def execute
474
- win = Redcar.app.focussed_window
475
- win.treebook.switch_down
476
- end
477
- end
478
-
479
- class SwitchTreeUpCommand < TreeCommand
480
-
481
- def execute
482
- win = Redcar.app.focussed_window
483
- win.treebook.switch_up
484
- end
485
- end
486
-
487
- class SwitchTabDownCommand < TabCommand
488
-
489
- def execute
490
- win.focussed_notebook.switch_down
491
- end
492
- end
493
-
494
- class SwitchTabUpCommand < TabCommand
495
-
496
- def execute
497
- win.focussed_notebook.switch_up
498
- end
499
- end
500
-
501
- class MoveTabUpCommand < TabCommand
502
-
503
- def execute
504
- win.focussed_notebook.move_up
505
- end
506
- end
507
-
508
- class MoveTabDownCommand < TabCommand
509
-
510
- def execute
511
- win.focussed_notebook.move_down
512
- end
513
- end
514
163
 
515
164
  class UndoCommand < EditTabCommand
516
165
  sensitize :undoable
@@ -802,22 +451,6 @@ Redcar.environment: #{Redcar.environment}
802
451
  end
803
452
  end
804
453
 
805
- class DialogExample < Redcar::Command
806
- def execute
807
- builder = Menu::Builder.new do
808
- item("Foo") { p :foo }
809
- item("Bar") { p :bar }
810
- separator
811
- sub_menu "Baz" do
812
- item("Qux") { p :qx }
813
- item("Quux") { p :quux }
814
- item("Corge") { p :corge }
815
- end
816
- end
817
- win.popup_menu(builder.menu)
818
- end
819
- end
820
-
821
454
  class GotoLineCommand < Redcar::EditTabCommand
822
455
 
823
456
  class Speedbar < Redcar::Speedbar
@@ -856,79 +489,6 @@ Redcar.environment: #{Redcar.environment}
856
489
  end
857
490
  end
858
491
 
859
- class TreebookWidthCommand < Command
860
- sensitize :open_trees
861
-
862
- def increment
863
- raise "Please implement me!"
864
- end
865
-
866
- def execute
867
- if win = Redcar.app.focussed_window
868
- if increment > 0
869
- win.adjust_treebook_width(true)
870
- else
871
- win.adjust_treebook_width(false)
872
- end
873
- end
874
- end
875
- end
876
-
877
- ["In","De"].each do |prefix|
878
- const_set("#{prefix}creaseTreebookWidthCommand", Class.new(TreebookWidthCommand)).class_eval do
879
- define_method :increment do
880
- prefix == "In" ? 1 : -1
881
- end
882
- end
883
- end
884
-
885
- class EnlargeNotebookCommand < Command
886
- sensitize :multiple_notebooks
887
- def index
888
- raise "Please define me!"
889
- end
890
-
891
- def execute
892
- if win = Redcar.app.focussed_window
893
- win.enlarge_notebook(index)
894
- end
895
- end
896
- end
897
-
898
- ["First","Second"].each do |book|
899
- const_set("Enlarge#{book}NotebookCommand", Class.new(EnlargeNotebookCommand)).class_eval do
900
- define_method :index do
901
- book == "First" ? 0 : 1
902
- end
903
- end
904
- end
905
-
906
- # define commands from SelectTab1Command to SelectTab9Command
907
- (1..9).each do |tab_num|
908
- const_set("SelectTab#{tab_num}Command", Class.new(Redcar::TabCommand)).class_eval do
909
- define_method :execute do
910
- notebook = Redcar.app.focussed_window_notebook
911
- notebook.tabs[tab_num-1].focus if notebook.tabs[tab_num-1]
912
- end
913
- end
914
- end
915
-
916
- class ResetNotebookWidthsCommand < Command
917
- sensitize :multiple_notebooks
918
-
919
- def execute
920
- if win = Redcar.app.focussed_window
921
- win.reset_notebook_widths
922
- end
923
- end
924
- end
925
-
926
- class ToggleFullscreen < Command
927
- def execute
928
- Redcar.app.focussed_window.fullscreen = !Redcar.app.focussed_window.fullscreen
929
- end
930
- end
931
-
932
492
  class ToggleInvisibles < Redcar::EditTabCommand
933
493
  def execute
934
494
  EditView.show_invisibles = !EditView.show_invisibles?
@@ -941,14 +501,6 @@ Redcar.environment: #{Redcar.environment}
941
501
  end
942
502
  end
943
503
 
944
- class ToggleToolbar < Command
945
-
946
- def execute
947
- Redcar.app.toggle_show_toolbar
948
- Redcar.app.refresh_toolbar!
949
- end
950
- end
951
-
952
504
  class SelectNewFont < EditTabCommand
953
505
  def execute
954
506
  Redcar::EditView::SelectFontDialog.new.open
@@ -1010,20 +562,20 @@ Redcar.environment: #{Redcar.environment}
1010
562
 
1011
563
  def self.keymaps
1012
564
  osx = Redcar::Keymap.build("main", :osx) do
1013
- link "Cmd+N", NewCommand
1014
- link "Cmd+Shift+N", NewNotebookCommand
1015
- link "Cmd+Alt+N", NewWindowCommand
1016
- link "Cmd+O", Project::FileOpenCommand
565
+ link "Cmd+N", OpenNewEditTabCommand
566
+ link "Cmd+Shift+N", Application::OpenNewNotebookCommand
567
+ link "Cmd+Alt+N", Application::OpenNewWindowCommand
568
+ link "Cmd+O", Project::OpenFileCommand
1017
569
  link "Cmd+U", Project::FileReloadCommand
1018
570
  link "Cmd+Shift+O", Project::DirectoryOpenCommand
1019
571
  link "Cmd+Alt+Ctrl+P", Project::FindRecentCommand
1020
572
  #link "Cmd+Ctrl+O", Project::OpenRemoteCommand
1021
- link "Cmd+S", Project::FileSaveCommand
1022
- link "Cmd+Shift+S", Project::FileSaveAsCommand
1023
- link "Cmd+W", CloseTabCommand
1024
- link "Cmd+Shift+W", CloseWindowCommand
1025
- link "Alt+Shift+W", CloseTreeCommand
1026
- link "Cmd+Q", QuitCommand
573
+ link "Cmd+S", Project::SaveFileCommand
574
+ link "Cmd+Shift+S", Project::SaveFileAsCommand
575
+ link "Cmd+W", Application::CloseTabCommand
576
+ link "Cmd+Shift+W", Application::CloseWindowCommand
577
+ link "Alt+Shift+W", Application::CloseTreeCommand
578
+ link "Cmd+Q", Application::QuitCommand
1027
579
 
1028
580
  #link "Cmd+Return", MoveNextLineCommand
1029
581
 
@@ -1062,29 +614,28 @@ Redcar.environment: #{Redcar.environment}
1062
614
  link "Ctrl+Shift+^", SortLinesCommand
1063
615
 
1064
616
  link "Cmd+T", Project::FindFileCommand
1065
- link "Cmd+Shift+Alt+O", MoveTabToOtherNotebookCommand
1066
- link "Cmd+Alt+O", SwitchNotebookCommand
1067
- link "Alt+Shift+[", SwitchTreeUpCommand
1068
- link "Alt+Shift+]", SwitchTreeDownCommand
1069
- link "Cmd+Shift+[", SwitchTabDownCommand
1070
- link "Cmd+Shift+]", SwitchTabUpCommand
1071
- link "Ctrl+Shift+[", MoveTabDownCommand
1072
- link "Ctrl+Shift+]", MoveTabUpCommand
1073
- link "Cmd+Shift++", ToggleFullscreen
1074
- link "Cmd+Shift+T", OpenTreeFinderCommand
1075
- link "Alt+Shift+J", IncreaseTreebookWidthCommand
1076
- link "Alt+Shift+H", DecreaseTreebookWidthCommand
1077
- link "Cmd+Shift+>", EnlargeFirstNotebookCommand
1078
- link "Cmd+Shift+<", EnlargeSecondNotebookCommand
1079
- link "Cmd+Shift+L", ResetNotebookWidthsCommand
1080
- link "Cmd+Shift+:", RotateNotebooksCommand
1081
- link "Alt+Shift+N", CloseNotebookCommand
617
+ link "Cmd+Shift+Alt+O", Application::MoveTabToOtherNotebookCommand
618
+ link "Cmd+Alt+O", Application::SwitchNotebookCommand
619
+ link "Alt+Shift+[", Application::SwitchTreeUpCommand
620
+ link "Alt+Shift+]", Application::SwitchTreeDownCommand
621
+ link "Cmd+Shift+[", Application::SwitchTabDownCommand
622
+ link "Cmd+Shift+]", Application::SwitchTabUpCommand
623
+ link "Ctrl+Shift+[", Application::MoveTabDownCommand
624
+ link "Ctrl+Shift+]", Application::MoveTabUpCommand
625
+ link "Cmd+Shift++", Application::ToggleFullscreen
626
+ link "Cmd+Shift+T", Application::OpenTreeFinderCommand
627
+ link "Alt+Shift+J", Application::IncreaseTreebookWidthCommand
628
+ link "Alt+Shift+H", Application::DecreaseTreebookWidthCommand
629
+ link "Cmd+Shift+>", Application::EnlargeNotebookCommand
630
+ link "Cmd+Shift+L", Application::ResetNotebookWidthsCommand
631
+ link "Cmd+Shift+:", Application::RotateNotebooksCommand
632
+ link "Alt+Shift+N", Application::CloseNotebookCommand
1082
633
  link "Cmd+Alt+I", ToggleInvisibles
1083
634
  link "Cmd++", IncreaseFontSize
1084
635
  link "Cmd+-", DecreaseFontSize
1085
636
 
1086
637
  link "Ctrl+Shift+P", PrintScopeCommand
1087
- link "Cmd+Shift+H", ToggleTreesCommand
638
+ link "Cmd+Shift+H", Application::ToggleTreesCommand
1088
639
 
1089
640
  # link "Cmd+Shift+R", PluginManagerUi::ReloadLastReloadedCommand
1090
641
 
@@ -1093,25 +644,25 @@ Redcar.environment: #{Redcar.environment}
1093
644
 
1094
645
  # map SelectTab<number>Command
1095
646
  (1..9).each do |tab_num|
1096
- link "Cmd+#{tab_num}", Top.const_get("SelectTab#{tab_num}Command")
647
+ link "Cmd+#{tab_num}", Application.const_get("SelectTab#{tab_num}Command")
1097
648
  end
1098
649
 
1099
650
  end
1100
651
 
1101
652
  linwin = Redcar::Keymap.build("main", [:linux, :windows]) do
1102
- link "Ctrl+N", NewCommand
1103
- link "Ctrl+Shift+N", NewNotebookCommand
1104
- link "Ctrl+Alt+N", NewWindowCommand
1105
- link "Ctrl+O", Project::FileOpenCommand
653
+ link "Ctrl+N", OpenNewEditTabCommand
654
+ link "Ctrl+Shift+N", Application::OpenNewNotebookCommand
655
+ link "Ctrl+Alt+N", Application::OpenNewWindowCommand
656
+ link "Ctrl+O", Project::OpenFileCommand
1106
657
  link "Ctrl+Shift+O", Project::DirectoryOpenCommand
1107
658
  link "Ctrl+Alt+Shift+P", Project::FindRecentCommand
1108
659
  #link "Alt+Shift+O", Project::OpenRemoteCommand
1109
- link "Ctrl+S", Project::FileSaveCommand
1110
- link "Ctrl+Shift+S", Project::FileSaveAsCommand
1111
- link "Ctrl+W", CloseTabCommand
1112
- link "Ctrl+Shift+W", CloseWindowCommand
1113
- link "Alt+Shift+W", CloseTreeCommand
1114
- link "Ctrl+Q", QuitCommand
660
+ link "Ctrl+S", Project::SaveFileCommand
661
+ link "Ctrl+Shift+S", Project::SaveFileAsCommand
662
+ link "Ctrl+W", Application::CloseTabCommand
663
+ link "Ctrl+Shift+W", Application::CloseWindowCommand
664
+ link "Alt+Shift+W", Application::CloseTreeCommand
665
+ link "Ctrl+Q", Application::QuitCommand
1115
666
 
1116
667
  link "Ctrl+Enter", MoveNextLineCommand
1117
668
 
@@ -1141,7 +692,7 @@ Redcar.environment: #{Redcar.environment}
1141
692
  link "Escape", AutoCompleter::AutoCompleteCommand
1142
693
  link "Ctrl+Escape", AutoCompleter::MenuAutoCompleterCommand
1143
694
  link "Ctrl+Space", AutoCompleter::AutoCompleteCommand
1144
-
695
+
1145
696
  link "Ctrl+Shift+Space", AutoCompleter::MenuAutoCompleterCommand
1146
697
 
1147
698
  link "Ctrl+U", EditView::UpcaseTextCommand
@@ -1153,28 +704,26 @@ Redcar.environment: #{Redcar.environment}
1153
704
  link "Ctrl+Shift+^", SortLinesCommand
1154
705
 
1155
706
  link "Ctrl+T", Project::FindFileCommand
1156
- link "Ctrl+Shift+Alt+O", MoveTabToOtherNotebookCommand
707
+ link "Ctrl+Shift+Alt+O", Application::MoveTabToOtherNotebookCommand
1157
708
 
1158
709
  link "Ctrl+Shift+P", PrintScopeCommand
1159
710
 
1160
- link "Ctrl+Alt+O", SwitchNotebookCommand
1161
- link "Ctrl+Shift+H", ToggleTreesCommand
1162
- link "Alt+Page Up", SwitchTreeUpCommand
1163
- link "Alt+Page Down", SwitchTreeDownCommand
1164
- link "Ctrl+Page Up", SwitchTabDownCommand
1165
- link "Ctrl+Page Down", SwitchTabUpCommand
1166
- link "Ctrl+Shift+Page Up", MoveTabDownCommand
1167
- link "Ctrl+Shift+Page Down", MoveTabUpCommand
1168
- link "Ctrl+Shift+T", OpenTreeFinderCommand
1169
- link "Alt+Shift+J", IncreaseTreebookWidthCommand
1170
- link "Alt+Shift+H", DecreaseTreebookWidthCommand
1171
- link "Ctrl+Shift+>", EnlargeFirstNotebookCommand
1172
- link "Ctrl+Shift+<", EnlargeSecondNotebookCommand
1173
- link "Ctrl+Shift+L", ResetNotebookWidthsCommand
1174
- link "Ctrl+Shift+:", RotateNotebooksCommand
1175
- link "Alt+Shift+N", CloseNotebookCommand
1176
- # link "Ctrl+Shift+R", PluginManagerUi::ReloadLastReloadedCommand
1177
- link "F11", ToggleFullscreen
711
+ link "Ctrl+Alt+O", Application::SwitchNotebookCommand
712
+ link "Ctrl+Shift+H", Application::ToggleTreesCommand
713
+ link "Alt+Page Up", Application::SwitchTreeUpCommand
714
+ link "Alt+Page Down", Application::SwitchTreeDownCommand
715
+ link "Ctrl+Page Up", Application::SwitchTabDownCommand
716
+ link "Ctrl+Page Down", Application::SwitchTabUpCommand
717
+ link "Ctrl+Shift+Page Up", Application::MoveTabDownCommand
718
+ link "Ctrl+Shift+Page Down", Application::MoveTabUpCommand
719
+ link "Ctrl+Shift+T", Application::OpenTreeFinderCommand
720
+ link "Alt+Shift+J", Application::IncreaseTreebookWidthCommand
721
+ link "Alt+Shift+H", Application::DecreaseTreebookWidthCommand
722
+ link "Ctrl+Shift+>", Application::EnlargeNotebookCommand
723
+ link "Ctrl+Shift+L", Application::ResetNotebookWidthsCommand
724
+ link "Ctrl+Shift+:", Application::RotateNotebooksCommand
725
+ link "Alt+Shift+N", Application::CloseNotebookCommand
726
+ link "F11", Application::ToggleFullscreen
1178
727
  link "Ctrl+Alt+I", ToggleInvisibles
1179
728
  link "Ctrl++", IncreaseFontSize
1180
729
  link "Ctrl+-", DecreaseFontSize
@@ -1185,7 +734,7 @@ Redcar.environment: #{Redcar.environment}
1185
734
 
1186
735
  # map SelectTab<number>Command
1187
736
  (1..9).each do |tab_num|
1188
- link "Alt+#{tab_num}", Top.const_get("SelectTab#{tab_num}Command")
737
+ link "Alt+#{tab_num}", Application.const_get("SelectTab#{tab_num}Command")
1189
738
  end
1190
739
 
1191
740
  end
@@ -1195,15 +744,15 @@ Redcar.environment: #{Redcar.environment}
1195
744
 
1196
745
  def self.toolbars
1197
746
  ToolBar::Builder.build do
1198
- item "New File", :command => NewCommand, :icon => :new, :barname => :core
1199
- item "Open File", :command => Project::FileOpenCommand, :icon => :open, :barname => :core
747
+ item "New File", :command => OpenNewEditTabCommand, :icon => :new, :barname => :core
748
+ item "Open File", :command => Project::OpenFileCommand, :icon => :open, :barname => :core
1200
749
  item "Open Directory", :command => Project::DirectoryOpenCommand, :icon => :open_dir, :barname => :core
1201
- item "Save File", :command => Project::FileSaveCommand, :icon => :save, :barname => :core
1202
- item "Save File As", :command => Project::FileSaveAsCommand, :icon => :save_as, :barname => :core
750
+ item "Save File", :command => Project::SaveFileCommand, :icon => :save, :barname => :core
751
+ item "Save File As", :command => Project::SaveFileAsCommand, :icon => :save_as, :barname => :core
1203
752
  item "Undo", :command => UndoCommand, :icon => :undo, :barname => :core
1204
753
  item "Redo", :command => RedoCommand, :icon => :redo, :barname => :core
1205
- item "New Notebook", :command => NewNotebookCommand, :icon => File.join(Redcar::ICONS_DIRECTORY, "book--plus.png"), :barname => :edit
1206
- item "Close Notebook", :command => CloseNotebookCommand, :icon => File.join(Redcar::ICONS_DIRECTORY, "book--minus.png"), :barname => :edit
754
+ item "New Notebook", :command => Application::OpenNewNotebookCommand, :icon => File.join(Redcar::ICONS_DIRECTORY, "book--plus.png"), :barname => :edit
755
+ item "Close Notebook", :command => Application::CloseNotebookCommand, :icon => File.join(Redcar::ICONS_DIRECTORY, "book--minus.png"), :barname => :edit
1207
756
  end
1208
757
  end
1209
758
 
@@ -1211,22 +760,22 @@ Redcar.environment: #{Redcar.environment}
1211
760
  Menu::Builder.build do
1212
761
  sub_menu "File", :priority => :first do
1213
762
  group(:priority => :first) do
1214
- item "New", NewCommand
1215
- item "New Window", NewWindowCommand
763
+ item "New", OpenNewEditTabCommand
764
+ item "New Window", Application::OpenNewWindowCommand
1216
765
  end
1217
766
 
1218
767
  group(:priority => 10) do
1219
768
  separator
1220
- item "Close Tab", CloseTabCommand
1221
- item "Close Tree", CloseTreeCommand
1222
- item "Close Window", CloseWindowCommand
1223
- item "Close Others", CloseOthers
1224
- item "Close All", CloseAll
769
+ item "Close Tab", Application::CloseTabCommand
770
+ item "Close Tree", Application::CloseTreeCommand
771
+ item "Close Window", Application::CloseWindowCommand
772
+ item "Close Others", Application::CloseOthers
773
+ item "Close All", Application::CloseAll
1225
774
  end
1226
775
 
1227
776
  group(:priority => :last) do
1228
777
  separator
1229
- item "Quit", QuitCommand
778
+ item "Quit", Application::QuitCommand
1230
779
  end
1231
780
  end
1232
781
  sub_menu "Edit", :priority => 5 do
@@ -1282,7 +831,7 @@ Redcar.environment: #{Redcar.environment}
1282
831
  group(:priority => 10) do
1283
832
  item "Task Manager", TaskManager::OpenCommand
1284
833
  separator
1285
- #item "Print Scope Tree", PrintScopeTreeCommand
834
+ item "Print Scope Tree", PrintScopeTreeCommand
1286
835
  item "Print Scope at Cursor", PrintScopeCommand
1287
836
  end
1288
837
  end
@@ -1297,49 +846,48 @@ Redcar.environment: #{Redcar.environment}
1297
846
  end
1298
847
  group(:priority => 10) do
1299
848
  separator
1300
- item "Toggle Fullscreen", :command => ToggleFullscreen, :type => :check, :active => window ? window.fullscreen : false
849
+ item "Toggle Fullscreen", :command => Application::ToggleFullscreen, :type => :check, :active => window ? window.fullscreen : false
1301
850
  end
1302
851
  group(:priority => 15) do
1303
852
  separator
1304
853
  sub_menu "Trees" do
1305
- item "Open Tree Finder", OpenTreeFinderCommand
1306
- item "Toggle Tree Visibility", ToggleTreesCommand
1307
- item "Increase Tree Width", IncreaseTreebookWidthCommand
1308
- item "Decrease Tree Width", DecreaseTreebookWidthCommand
854
+ item "Open Tree Finder", Application::OpenTreeFinderCommand
855
+ item "Toggle Tree Visibility", Application::ToggleTreesCommand
856
+ item "Increase Tree Width", Application::IncreaseTreebookWidthCommand
857
+ item "Decrease Tree Width", Application::DecreaseTreebookWidthCommand
1309
858
  separator
1310
- item "Previous Tree", SwitchTreeUpCommand
1311
- item "Next Tree", SwitchTreeDownCommand
859
+ item "Previous Tree", Application::SwitchTreeUpCommand
860
+ item "Next Tree", Application::SwitchTreeDownCommand
1312
861
  end
1313
862
  lazy_sub_menu "Windows" do
1314
863
  GenerateWindowsMenu.new(self).run
1315
864
  end
1316
865
  sub_menu "Notebooks" do
1317
- item "New Notebook", NewNotebookCommand
1318
- item "Close Notebook", CloseNotebookCommand
1319
- item "Rotate Notebooks", RotateNotebooksCommand
1320
- item "Move Tab To Other Notebook", MoveTabToOtherNotebookCommand
1321
- item "Switch Notebooks", SwitchNotebookCommand
866
+ item "New Notebook", Application::OpenNewNotebookCommand
867
+ item "Close Notebook", Application::CloseNotebookCommand
868
+ item "Rotate Notebooks", Application::RotateNotebooksCommand
869
+ item "Move Tab To Other Notebook", Application::MoveTabToOtherNotebookCommand
870
+ item "Switch Notebooks", Application::SwitchNotebookCommand
1322
871
  separator
1323
- item "Enlarge First Notebook", EnlargeFirstNotebookCommand
1324
- item "Enlarge Second Notebook", EnlargeSecondNotebookCommand
1325
- item "Reset Notebook Widths", ResetNotebookWidthsCommand
872
+ item "Enlarge First Notebook", Application::EnlargeNotebookCommand
873
+ item "Reset Notebook Widths", Application::ResetNotebookWidthsCommand
1326
874
  end
1327
875
  sub_menu "Tabs" do
1328
- item "Previous Tab", SwitchTabDownCommand
1329
- item "Next Tab", SwitchTabUpCommand
1330
- item "Move Tab Left", MoveTabDownCommand
1331
- item "Move Tab Right", MoveTabUpCommand
876
+ item "Previous Tab", Application::SwitchTabDownCommand
877
+ item "Next Tab", Application::SwitchTabUpCommand
878
+ item "Move Tab Left", Application::MoveTabDownCommand
879
+ item "Move Tab Right", Application::MoveTabUpCommand
1332
880
  separator
1333
881
  # GenerateTabsMenu.new(self).run # TODO: find a way to maintain keybindings with lazy menus
1334
882
  item "Focussed Notebook", ShowTitle
1335
883
  (1..9).each do |num|
1336
- item "Tab #{num}", Top.const_get("SelectTab#{num}Command")
884
+ item "Tab #{num}", Application.const_get("SelectTab#{num}Command")
1337
885
  end
1338
886
  end
1339
887
  end
1340
888
  group(:priority => :last) do
1341
889
  separator
1342
- item "Show Toolbar", :command => ToggleToolbar, :type => :check, :active => Redcar.app.show_toolbar?
890
+ item "Show Toolbar", :command => Application::ToggleToolbar, :type => :check, :active => Redcar.app.show_toolbar?
1343
891
  item "Show Invisibles", :command => ToggleInvisibles, :type => :check, :active => EditView.show_invisibles?
1344
892
  item "Show Line Numbers", :command => ToggleLineNumbers, :type => :check, :active => EditView.show_line_numbers?
1345
893
  end
@@ -1370,19 +918,19 @@ Redcar.environment: #{Redcar.environment}
1370
918
  end
1371
919
 
1372
920
  def tab_close(tab)
1373
- CloseTabCommand.new(tab).run
921
+ Application::CloseTabCommand.new(tab).run
1374
922
  end
1375
923
 
1376
924
  def window_close(win)
1377
- CloseWindowCommand.new(win).run
925
+ Application::CloseWindowCommand.new(win).run
1378
926
  end
1379
927
 
1380
928
  def application_close(app)
1381
- QuitCommand.new.run
929
+ Application::QuitCommand.new.run
1382
930
  end
1383
931
 
1384
932
  def window_focus(win)
1385
- FocusWindowCommand.new(win).run
933
+ Application::FocusWindowCommand.new(win).run
1386
934
  end
1387
935
  end
1388
936
 
@@ -1391,36 +939,40 @@ Redcar.environment: #{Redcar.environment}
1391
939
  end
1392
940
 
1393
941
  def self.start(args=[])
1394
- puts "loading plugins took #{Time.now - PROCESS_START_TIME}"
1395
- Redcar.update_gui do
1396
- Application.start
1397
- ApplicationSWT.start
1398
- Swt.splash_screen.inc(1) if Swt.splash_screen
1399
- EditViewSWT.start
1400
- Swt.splash_screen.inc(7) if Swt.splash_screen
1401
- s = Time.now
1402
- if Redcar.gui
1403
- Redcar.app.controller = ApplicationSWT.new(Redcar.app)
942
+ begin
943
+ Redcar.log.info("startup milestone: loading plugins took #{Time.now - Redcar.process_start_time}")
944
+ Redcar.update_gui do
945
+ Application.start
946
+ ApplicationSWT.start
947
+ EditViewSWT.start
948
+ Swt.splash_screen.inc(1) if Swt.splash_screen
949
+ s = Time.now
950
+ if Redcar.gui
951
+ Redcar.app.controller = ApplicationSWT.new(Redcar.app)
952
+ end
953
+ Redcar.app.refresh_menu!
954
+ Redcar.app.load_sensitivities
955
+ Redcar.log.info("initializing gui took #{Time.now - s}s")
956
+ end
957
+ Redcar.update_gui do
958
+ Swt.splash_screen.close if Swt.splash_screen
959
+ win = Redcar.app.make_sure_at_least_one_window_open
960
+ win.close if win and args.include?("--no-window")
961
+ Redcar.log.info("startup milestone: window open #{Time.now - Redcar.process_start_time}")
962
+ Redcar::Project::Manager.start(args)
963
+ Redcar.log.info("startup milestone: project open #{Time.now - Redcar.process_start_time}")
964
+ end
965
+ Redcar.load_useful_libraries
966
+ Redcar.log.info("startup milestone: complete: #{Time.now - Redcar.process_start_time}")
967
+ if args.include?("--compute-textmate-cache-and-quit")
968
+ Redcar::Textmate.all_bundles
969
+ exit
970
+ end
971
+ rescue => e
972
+ Redcar.log.error("error in startup: #{e.inspect}")
973
+ e.backtrace.each do |line|
974
+ Redcar.log.error(line)
1404
975
  end
1405
- Redcar.app.refresh_menu!
1406
- Redcar.app.load_sensitivities
1407
- puts "initializing gui took #{Time.now - s}s"
1408
- end
1409
- Redcar.update_gui do
1410
- Swt.splash_screen.inc(2) if Swt.splash_screen
1411
- s = Time.now
1412
- Redcar::Project::Manager.start(args)
1413
- puts "project start took #{Time.now - s}s"
1414
- win = Redcar.app.make_sure_at_least_one_window_open
1415
- win.close if win and args.include?("--no-window")
1416
- end
1417
- Redcar.update_gui do
1418
- Swt.splash_screen.close if Swt.splash_screen
1419
- end
1420
- puts "start time: #{Time.now - $redcar_process_start_time}"
1421
- if args.include?("--compute-textmate-cache-and-quit")
1422
- Redcar::Textmate.all_bundles
1423
- exit
1424
976
  end
1425
977
  end
1426
978
  end