redcar 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. data/CHANGES +24 -0
  2. data/Rakefile +85 -2
  3. data/lib/json/CHANGES +166 -0
  4. data/lib/json/COPYING +58 -0
  5. data/lib/json/GPL +340 -0
  6. data/lib/json/README +358 -0
  7. data/lib/json/Rakefile +292 -0
  8. data/lib/json/TODO +1 -0
  9. data/lib/json/VERSION +1 -0
  10. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
  11. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
  12. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
  13. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
  14. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
  15. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
  16. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
  17. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
  18. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
  19. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
  20. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
  21. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
  22. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
  23. data/lib/json/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
  24. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
  25. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
  26. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
  27. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
  28. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
  29. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
  30. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
  31. data/lib/json/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
  32. data/lib/json/benchmarks/generator2_benchmark.rb +222 -0
  33. data/lib/json/benchmarks/generator_benchmark.rb +224 -0
  34. data/lib/json/benchmarks/ohai.json +1216 -0
  35. data/lib/json/benchmarks/ohai.ruby +1 -0
  36. data/lib/json/benchmarks/parser2_benchmark.rb +251 -0
  37. data/lib/json/benchmarks/parser_benchmark.rb +259 -0
  38. data/lib/json/bin/edit_json.rb +9 -0
  39. data/lib/json/bin/prettify_json.rb +75 -0
  40. data/lib/json/data/example.json +1 -0
  41. data/lib/json/data/index.html +38 -0
  42. data/lib/json/data/prototype.js +4184 -0
  43. data/lib/json/ext/json/ext/generator/extconf.rb +16 -0
  44. data/lib/json/ext/json/ext/generator/generator.c +1323 -0
  45. data/lib/json/ext/json/ext/generator/generator.h +170 -0
  46. data/lib/json/ext/json/ext/parser/extconf.rb +15 -0
  47. data/lib/json/ext/json/ext/parser/parser.c +1935 -0
  48. data/lib/json/ext/json/ext/parser/parser.h +71 -0
  49. data/lib/json/ext/json/ext/parser/parser.rl +792 -0
  50. data/lib/json/install.rb +26 -0
  51. data/lib/json/lib/json.rb +10 -0
  52. data/lib/json/lib/json/Array.xpm +21 -0
  53. data/lib/json/lib/json/FalseClass.xpm +21 -0
  54. data/lib/json/lib/json/Hash.xpm +21 -0
  55. data/lib/json/lib/json/Key.xpm +73 -0
  56. data/lib/json/lib/json/NilClass.xpm +21 -0
  57. data/lib/json/lib/json/Numeric.xpm +28 -0
  58. data/lib/json/lib/json/String.xpm +96 -0
  59. data/lib/json/lib/json/TrueClass.xpm +21 -0
  60. data/lib/json/lib/json/add/core.rb +148 -0
  61. data/lib/json/lib/json/add/rails.rb +58 -0
  62. data/lib/json/lib/json/common.rb +397 -0
  63. data/lib/json/lib/json/editor.rb +1371 -0
  64. data/lib/json/lib/json/ext.rb +15 -0
  65. data/lib/json/lib/json/json.xpm +1499 -0
  66. data/lib/json/lib/json/pure.rb +77 -0
  67. data/lib/json/lib/json/pure/generator.rb +452 -0
  68. data/lib/json/lib/json/pure/parser.rb +307 -0
  69. data/lib/json/lib/json/version.rb +8 -0
  70. data/lib/json/tests/fixtures/fail1.json +1 -0
  71. data/lib/json/tests/fixtures/fail10.json +1 -0
  72. data/lib/json/tests/fixtures/fail11.json +1 -0
  73. data/lib/json/tests/fixtures/fail12.json +1 -0
  74. data/lib/json/tests/fixtures/fail13.json +1 -0
  75. data/lib/json/tests/fixtures/fail14.json +1 -0
  76. data/lib/json/tests/fixtures/fail18.json +1 -0
  77. data/lib/json/tests/fixtures/fail19.json +1 -0
  78. data/lib/json/tests/fixtures/fail2.json +1 -0
  79. data/lib/json/tests/fixtures/fail20.json +1 -0
  80. data/lib/json/tests/fixtures/fail21.json +1 -0
  81. data/lib/json/tests/fixtures/fail22.json +1 -0
  82. data/lib/json/tests/fixtures/fail23.json +1 -0
  83. data/lib/json/tests/fixtures/fail24.json +1 -0
  84. data/lib/json/tests/fixtures/fail25.json +1 -0
  85. data/lib/json/tests/fixtures/fail27.json +2 -0
  86. data/lib/json/tests/fixtures/fail28.json +2 -0
  87. data/lib/json/tests/fixtures/fail3.json +1 -0
  88. data/lib/json/tests/fixtures/fail4.json +1 -0
  89. data/lib/json/tests/fixtures/fail5.json +1 -0
  90. data/lib/json/tests/fixtures/fail6.json +1 -0
  91. data/lib/json/tests/fixtures/fail7.json +1 -0
  92. data/lib/json/tests/fixtures/fail8.json +1 -0
  93. data/lib/json/tests/fixtures/fail9.json +1 -0
  94. data/lib/json/tests/fixtures/pass1.json +56 -0
  95. data/lib/json/tests/fixtures/pass15.json +1 -0
  96. data/lib/json/tests/fixtures/pass16.json +1 -0
  97. data/lib/json/tests/fixtures/pass17.json +1 -0
  98. data/lib/json/tests/fixtures/pass2.json +1 -0
  99. data/lib/json/tests/fixtures/pass26.json +1 -0
  100. data/lib/json/tests/fixtures/pass3.json +6 -0
  101. data/lib/json/tests/test_json.rb +361 -0
  102. data/lib/json/tests/test_json_addition.rb +162 -0
  103. data/lib/json/tests/test_json_encoding.rb +68 -0
  104. data/lib/json/tests/test_json_fixtures.rb +34 -0
  105. data/lib/json/tests/test_json_generate.rb +122 -0
  106. data/lib/json/tests/test_json_rails.rb +144 -0
  107. data/lib/json/tests/test_json_unicode.rb +76 -0
  108. data/lib/json/tools/fuzz.rb +139 -0
  109. data/lib/json/tools/server.rb +61 -0
  110. data/lib/redcar.rb +5 -3
  111. data/lib/redcar/runner.rb +1 -5
  112. data/lib/redcar_quick_start.rb +2 -7
  113. data/plugins/application/features/support/env.rb +6 -1
  114. data/plugins/application/lib/application/command/history.rb +5 -0
  115. data/plugins/application/lib/application/dialog.rb +1 -1
  116. data/plugins/application_swt/lib/application_swt.rb +0 -1
  117. data/plugins/application_swt/lib/application_swt/html_tab.rb +4 -2
  118. data/plugins/application_swt/lib/application_swt/menu.rb +3 -1
  119. data/plugins/application_swt/lib/application_swt/swt_wrapper.rb +4 -0
  120. data/plugins/core/lib/core.rb +1 -0
  121. data/plugins/core/lib/core/has_spi.rb +10 -0
  122. data/plugins/edit_view/features/new_tab.feature +0 -1
  123. data/plugins/edit_view/features/step_definitions/tab_steps.rb +1 -1
  124. data/plugins/edit_view/lib/edit_view.rb +13 -0
  125. data/plugins/edit_view/lib/edit_view/document/command.rb +1 -1
  126. data/plugins/edit_view_swt/lib/edit_view_swt.rb +4 -0
  127. data/plugins/html_view/assets/redcar.css +2 -1
  128. data/plugins/html_view/lib/html_view.rb +19 -6
  129. data/plugins/html_view/lib/html_view/html_tab.rb +2 -2
  130. data/plugins/project/lib/project.rb +11 -0
  131. data/plugins/project/lib/project/dir_controller.rb +252 -2
  132. data/plugins/project/lib/project/dir_mirror.rb +53 -5
  133. data/plugins/project/lib/project/manager.rb +5 -1
  134. data/plugins/project/views/bulk_rename.html.erb +162 -0
  135. data/plugins/redcar/redcar.rb +22 -2
  136. data/plugins/runnables/icons/cog.png +0 -0
  137. data/plugins/runnables/lib/runnables.rb +99 -0
  138. data/plugins/runnables/plugin_no_load.rb +9 -0
  139. data/plugins/tree/lib/tree.rb +61 -0
  140. data/plugins/tree/lib/tree/controller.rb +53 -4
  141. data/plugins/tree/lib/tree/mirror.rb +56 -16
  142. data/plugins/tree_view_swt/lib/tree_view_swt.rb +250 -24
  143. metadata +2700 -2604
  144. data/plugins/application_swt/lib/application_swt/notebook/drag_and_drop_listener.rb +0 -71
@@ -8,6 +8,9 @@ module Redcar
8
8
  Project.window_projects.values
9
9
  end
10
10
 
11
+ # Returns the project in the given window
12
+ # @param [Window] window
13
+ # @return Project or nil
11
14
  def self.in_window(window)
12
15
  Project.window_projects[window]
13
16
  end
@@ -124,7 +127,8 @@ module Redcar
124
127
  #
125
128
  # @param [String] path the path of the directory to view
126
129
  def self.open_project_for_path(path)
127
- win = Redcar.app.new_window
130
+ win = Redcar.app.focussed_window
131
+ win = Redcar.app.new_window if !win or Manager.in_window(win)
128
132
  project = Project.new(path).tap do |p|
129
133
  p.open(win) if p.ready?
130
134
  end
@@ -0,0 +1,162 @@
1
+
2
+ <script type="text/javascript" src="file://<%= Redcar::HtmlView.jquery_path %>"></script>
3
+ <link rel="stylesheet" href="file://<%= Redcar::HtmlView.default_css_path %>" type="text/css" media="screen">
4
+
5
+ <h3>Bulk Rename</h3>
6
+ <form id="refresh-form" action="controller/submit">
7
+ <table>
8
+ <tr>
9
+ <td>Match:</td><td> <input name="match-pattern" id="match-pattern" value="<%= match_pattern %>" /></td>
10
+ <td>Replace:</td><td> <input name="replace-pattern" id="replace-pattern" value="<%= replace_pattern %>" /></td>
11
+ <td><input type="submit" id="refresh"></td>
12
+ </tr>
13
+ </table>
14
+ </form>
15
+
16
+ <table>
17
+ <tr>
18
+ <th>Old</th>
19
+ <th>New</th>
20
+ </tr>
21
+ <% pairs.each do |node, new_name| %>
22
+ <tr>
23
+ <td><%= File.basename(node.path) %></td>
24
+ <td class="name-slot"><%= new_name %></td>
25
+ <td class="extra-info"></td>
26
+ </tr>
27
+ <% end %>
28
+ </table>
29
+ <br />
30
+ <hr />
31
+ <br />
32
+ <small><a class="show-examples">Show examples</a></small>
33
+ <div id="examples" style="display:none;" class="example-box">
34
+ <small><a class="hide-examples">Hide examples</a></small>
35
+ <br /><br />
36
+ <p>E.g.</p>
37
+ <table>
38
+ <tr>
39
+ <td>Match</td><td>Replace</td><td>From</td><td>To</td>
40
+ </tr>
41
+ <tr><td>E</td><td>XXXXX</td><td>README</td><td>RXXXXXADME</td></tr>
42
+ <tr><td>$</td><td>.md</td><td>README</td><td>README.md</td></tr>
43
+ </table>
44
+ </div>
45
+ <br />
46
+
47
+
48
+ <script language="javascript">
49
+ jQuery.fn.watch = function( id, fn ) {
50
+
51
+ return this.each(function(){
52
+
53
+ var self = this;
54
+
55
+ var oldVal = self[id];
56
+ $(self).data(
57
+ 'watch_timer',
58
+ setInterval(function(){
59
+ if (self[id] !== oldVal) {
60
+ fn.call(self, id, oldVal, self[id]);
61
+ oldVal = self[id];
62
+ }
63
+ }, 100)
64
+ );
65
+ });
66
+ return self;
67
+ };
68
+
69
+ jQuery.fn.unwatch = function( id ) {
70
+ return this.each(function(){
71
+ clearInterval( $(this).data('watch_timer') );
72
+ });
73
+ };
74
+ jQuery.fn.valuechange = function(fn) {
75
+ return this.bind('valuechange', fn);
76
+ };
77
+
78
+ jQuery.event.special.valuechange = {
79
+
80
+ setup: function() {
81
+
82
+ jQuery(this).watch('value', function(){
83
+ jQuery.event.handle.call(this, {type:'valuechange'});
84
+ });
85
+
86
+ },
87
+
88
+ teardown: function() {
89
+ jQuery(this).unwatch('value');
90
+ }
91
+
92
+ };
93
+
94
+ BulkRename = {
95
+ disableForm: function() {
96
+ $("input#refresh").attr("disabled", true);
97
+ },
98
+
99
+ enableForm: function() {
100
+ $("input#refresh").attr("disabled", false);
101
+ },
102
+
103
+ updateNames: function(newNames) {
104
+ BulkRename.enableForm();
105
+ var nameSlots = $(".name-slot");
106
+ var extraSlots = $(".extra-info");
107
+ $.each(newNames, function(ix, a) {
108
+ var name = a[0];
109
+ var exists = a[1];
110
+ var legal = a[2];
111
+ $(nameSlots[ix]).html(name);
112
+ if (!legal) {
113
+ $(extraSlots[ix]).html("illegal filename");
114
+ BulkRename.disableForm();
115
+ }
116
+ else {
117
+ if (exists) {
118
+ $(extraSlots[ix]).html("conflicts");
119
+ BulkRename.disableForm();
120
+ }
121
+ else {
122
+ $(extraSlots[ix]).html("");
123
+ }
124
+ }
125
+ });
126
+ },
127
+
128
+ init: function() {
129
+ $("#match-pattern").bind("valuechange", function(propName, oldVal, newVal) {
130
+ try {
131
+ var newNames = Controller.refresh($("#match-pattern").attr("value"), $("#replace-pattern").attr("value"));
132
+ BulkRename.updateNames(newNames);
133
+ } catch(e) {
134
+ alert(e.message);
135
+ };
136
+ });
137
+ $("#replace-pattern").bind("valuechange", function(propName, oldVal, newVal) {
138
+ try {
139
+ var newNames = Controller.refresh($("#match-pattern").attr("value"), $("#replace-pattern").attr("value"));
140
+ BulkRename.updateNames(newNames);
141
+ } catch(e) {
142
+ alert(e.message);
143
+ };
144
+ });
145
+
146
+ $(".show-examples").click(function() {
147
+ $("#examples").slideDown();
148
+ $(".show-examples").slideUp();
149
+ });
150
+ $(".hide-examples").click(function() {
151
+ $("#examples").slideUp();
152
+ $(".show-examples").slideDown();
153
+ });
154
+ }
155
+ };
156
+
157
+ BulkRename.init();
158
+
159
+ </script>
160
+
161
+
162
+
@@ -1,4 +1,22 @@
1
+
1
2
  module Redcar
3
+ def self.safely(text=nil)
4
+ if text == nil
5
+ text = caller[1]
6
+ end
7
+ begin
8
+ yield
9
+ rescue => e
10
+ message = "Error in: " + text
11
+ Application::Dialog.message_box(
12
+ message,
13
+ :type => :error, :buttons => :ok)
14
+ puts message
15
+ puts e.class.to_s + ": " + e.message
16
+ puts e.backtrace
17
+ end
18
+ end
19
+
2
20
  module Top
3
21
  class QuitCommand < Command
4
22
 
@@ -772,10 +790,10 @@ module Redcar
772
790
  link "Ctrl+V", PasteCommand
773
791
  link "Ctrl+D", DuplicateCommand
774
792
 
775
- link "Shift+Home", MoveTopCommand
793
+ link "Ctrl+Home", MoveTopCommand
776
794
  link "Home", MoveHomeCommand
777
795
  link "End", MoveEndCommand
778
- link "Shift+End", MoveBottomCommand
796
+ link "Ctrl+End", MoveBottomCommand
779
797
 
780
798
  link "Ctrl+[", DecreaseIndentCommand
781
799
  link "Ctrl+]", IncreaseIndentCommand
@@ -868,6 +886,8 @@ module Redcar
868
886
  sub_menu "Project" do
869
887
  item "Find File", Project::FindFileCommand
870
888
  item "Refresh Directory", Project::RefreshDirectoryCommand
889
+ #separator
890
+ #item "Runnables", Runnables::ShowRunnables
871
891
  end
872
892
  sub_menu "Debug" do
873
893
  item "Task Manager", TaskManager::OpenCommand
Binary file
@@ -0,0 +1,99 @@
1
+
2
+ module Redcar
3
+ class Runnables
4
+
5
+ class TreeMirror
6
+ include Redcar::Tree::Mirror
7
+
8
+ def initialize(project)
9
+ runnables = project.config_file(:runnables)
10
+ if runnables
11
+ @top = runnables.map do |name, info|
12
+ Runnable.new(name, info)
13
+ end
14
+ else
15
+ @top = [HelpItem.new]
16
+ end
17
+ end
18
+
19
+ def title
20
+ "Runnables"
21
+ end
22
+
23
+ def top
24
+ @top
25
+ end
26
+ end
27
+
28
+ class HelpItem
29
+ include Redcar::Tree::Mirror::NodeMirror
30
+
31
+ def text
32
+ "No runnables (HELP)"
33
+ end
34
+ end
35
+
36
+ class Runnable
37
+ include Redcar::Tree::Mirror::NodeMirror
38
+
39
+ def initialize(name, info)
40
+ @name = name
41
+ @info = info
42
+ end
43
+
44
+ def text
45
+ @name
46
+ end
47
+
48
+ def leaf?
49
+ @info[:command]
50
+ end
51
+
52
+ def icon
53
+ if leaf?
54
+ File.dirname(__FILE__) + "/../icons/cog.png"
55
+ end
56
+ end
57
+
58
+ def children
59
+ return [] if leaf?
60
+
61
+ @info.map do |name, info|
62
+ Runnable.new(name, info)
63
+ end
64
+ end
65
+
66
+ def command
67
+ @info[:command]
68
+ end
69
+ end
70
+
71
+ class TreeController
72
+ include Redcar::Tree::Controller
73
+
74
+ def initialize(project)
75
+ @project = project
76
+ end
77
+
78
+ def activated(tree, node)
79
+ command = node.command
80
+ output = `#{command}`
81
+ tab = Redcar.app.focussed_window.new_tab(EditTab)
82
+ tab.edit_view.document.text = output
83
+ tab.title = node.text
84
+ tab.focus
85
+ end
86
+ end
87
+
88
+ class ShowRunnables < Redcar::Command
89
+ def execute
90
+ project = Project::Manager.in_window(win)
91
+ tree = Tree.new(
92
+ TreeMirror.new(project),
93
+ TreeController.new(project)
94
+ )
95
+ win.treebook.add_tree(tree)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,9 @@
1
+
2
+ Plugin.define do
3
+ name "runnables"
4
+ version "1.0"
5
+ file "lib", "runnables"
6
+ object "Redcar::Runnables"
7
+ dependencies "tree", ">0",
8
+ "application", ">0"
9
+ end
@@ -3,20 +3,81 @@ require 'tree/controller'
3
3
  require 'tree/mirror'
4
4
 
5
5
  module Redcar
6
+ # Pass classes implementing Redcar::Tree::Mirror and
7
+ # Redcar::Tree::Controller to Tree#new to create a tree. Pass to
8
+ # window.treebook.add_tree to open the Tree in a Window.
9
+ #
10
+ # Trees build up their contents by querying the Tree::Mirror. For
11
+ # instance, a simple tree containing the numbers 1 to 10 could be created
12
+ # like this:
13
+ #
14
+ # class CountMirror
15
+ # include Redcar::Tree::Mirror
16
+ #
17
+ # def top
18
+ # (1..10).map {|i| CountNode.new(i)}
19
+ # end
20
+ #
21
+ #  class CountNode
22
+ # include Redcar::Tree::NodeMirror
23
+ #
24
+ # def initialize(i)
25
+ # @i = i
26
+ # end
27
+ #
28
+ # def text
29
+ # @i.to_s
30
+ # end
31
+ # end
32
+ # end
33
+ #
34
+ # tree = Tree.new(CountMirror.new)
35
+ # Redcar.app.focussed_window.treebook.add_tree(tree)
6
36
  class Tree
7
37
  include Redcar::Model
8
38
  include Redcar::Observable
39
+ include Redcar::HasSPI
9
40
 
10
41
  attr_reader :tree_mirror, :tree_controller
11
42
 
43
+ # @param [Tree::Mirror] an instance of a class including Tree::Mirror
44
+ # @param [Tree::Controller] an instance of a class including Tree::Controller
12
45
  def initialize(tree_mirror, tree_controller=nil)
46
+ assert_interface(tree_mirror, Redcar::Tree::Mirror)
47
+ if tree_controller
48
+ assert_interface(tree_controller, Redcar::Tree::Controller)
49
+ end
13
50
  @tree_mirror = tree_mirror
14
51
  @tree_controller = tree_controller
15
52
  end
16
53
 
54
+ # Refresh the tree by requerying the mirror from the top and
55
+ # recursing down through open items.
17
56
  def refresh
18
57
  notify_listeners(:refresh)
19
58
  end
59
+
60
+ # Begin an edit operation on the node. This allows the user
61
+ # to edit the text. When the user has finished, TreeController#edited
62
+ # will be called with the new text.
63
+ def edit(node, select_from=nil, select_to=nil)
64
+ notify_listeners(:edit_element, node, select_from, select_to)
65
+ end
66
+
67
+ # Expand the node.
68
+ def expand(node)
69
+ notify_listeners(:expand_element, node)
70
+ end
71
+
72
+ # Select the node.
73
+ def select(node)
74
+ notify_listeners(:select_element, node)
75
+ end
76
+
77
+ # @return [Array<NodeMirror>] the selected nodes
78
+ def selection
79
+ controller.selection
80
+ end
20
81
  end
21
82
  end
22
83
 
@@ -1,11 +1,60 @@
1
1
 
2
2
  module Redcar
3
3
  class Tree
4
- # Abstract interface. The Controller's methods are called when the Tree's
5
- # rows are activated.
4
+ # SPI specification. Implement a class including this module
5
+ # and pass an instance to Tree#new to respond to tree events.
6
6
  module Controller
7
- def activated(node)
8
- raise "not implemented"
7
+
8
+ # Called when a node in a tree is activated (e.g double clicked).
9
+ # ONLY called when that node is a leaf node. If the node is not a
10
+ # leaf node then the tree will expand the node instead and query
11
+ # for its children.
12
+ def activated(tree, node); end
13
+
14
+ # Called when a node in a tree is right clicked on. node may be nil
15
+ # if the right click happened over the tree but not on a node.
16
+ def right_click(tree, node); end
17
+
18
+ # Called after an edit operation with the new text of the
19
+ # node. See Tree#edit
20
+ def edited(tree, node, text); end
21
+
22
+ # Called when a drag operation begins. Should return
23
+ # a Redcar::Tree::Controller::DragController.
24
+ def drag_controller(tree)
25
+ DragController::Fake.new
26
+ end
27
+
28
+ # SPI for Tree drag and drop. Implement this class to support drag and
29
+ # drop in your tree.
30
+ module DragController
31
+ class Fake; include DragController; end
32
+
33
+ # Can elements in the tree be reordered by dragging and
34
+ # dropping? Shows insertion feedback in the GUI.
35
+ def reorderable?
36
+ false
37
+ end
38
+
39
+ # Called with the dragged nodes when a drag operation begins
40
+ def drag_start(nodes); end
41
+
42
+ # Called during a drag operation when the cursor hovers over other
43
+ # rows.
44
+ #
45
+ # @param nodes - the dragged nodes
46
+ # @param target - the hovered over node, or nil if the empty tree area
47
+ # @param position - one of :onto, :before, :after (always :onto unless
48
+ # reorderable?)
49
+ def can_drop?(nodes, target, position); end
50
+
51
+ # Called when the user has dropped nodes onto another node.
52
+ #
53
+ # @param nodes - the dragged nodes
54
+ # @param target - the hovered over node, or nil if the empty tree area
55
+ # @param position - one of :onto, :before, :after (always :onto unless
56
+ # reorderable?)
57
+ def do_drop(nodes, target, position); end
9
58
  end
10
59
  end
11
60
  end