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
@@ -1,44 +1,84 @@
1
1
 
2
2
  module Redcar
3
3
  class Tree
4
- # Abstract interface. A Mirror allows an TreeView contents to reflect
5
- # some other resource, for example a directory tree on disk.
6
- # They have methods for loading the contents from the resource.
7
- #
8
- # Events: changed
4
+
5
+ # SPI specification. Implement a class including this module and
6
+ # pass an instance to Tree#new to populate the contents of a Tree.
9
7
  module Mirror
10
8
  include Redcar::Observable
11
9
 
12
- # Return the title of the resource. (e.g. the name of the directory)
10
+ # Return the title of the tree.
13
11
  #
14
12
  # @return [String]
15
13
  def title
16
- raise "not implemented"
14
+ "Tree"
17
15
  end
18
16
 
19
- # Return the top entries in the Tree. (e.g. the files in the top dir)
17
+ # Return the top level entries in the Tree. Each element should
18
+ # be an instance of a class implementing Redcar::Tree::Mirror::NodeMirror
20
19
  #
21
20
  # @return [Array<NodeMirror>]
22
21
  def top
23
- raise "not implemented"
22
+ []
24
23
  end
25
24
 
26
- # Does the resource still exist (e.g. does the dir exist?)
25
+ # Does the resource still exist
27
26
  #
28
27
  # @return [Boolean]
29
28
  def exist?
30
- raise "not implemented"
29
+ true
30
+ end
31
+
32
+ # What type of data does the tree contain? If Node#to_data returns an
33
+ # absolute path to a file, then :file may be specified for OS integration.
34
+ #
35
+ # @return [Symbol] either :file or :text
36
+ def data_type
37
+ :text
31
38
  end
32
39
 
33
40
  # Has the top nodes changed since the last time `top`
34
- # were was called? (E.g. have the contents of the top level dir changed)
41
+ # was called?
35
42
  #
36
43
  # @return [Boolean]
37
44
  def changed?
45
+ false
46
+ end
47
+
48
+ # Should drag and drop be permitted?
49
+ #
50
+ # @return [Boolean]
51
+ def drag_and_drop?
52
+ false
53
+ end
54
+
55
+ # Create a node from the data created by to_data. This is the reverse
56
+ # operation to #to_data, and should turn the String (in case data_type
57
+ # if :text) or Array of Strings (in case data_type is :file) into an
58
+ # array of nodes
59
+ #
60
+ # @return [NodeMirror]
61
+ def from_data(data)
62
+ raise "not implemented"
63
+ end
64
+
65
+ # This must be implemented (along with a from_data method)
66
+ # in order to allow drag and drop and copy and paste within the tree.
67
+ #
68
+ # If the Tree::Mirror data_type is :text (the default), this must
69
+ # return a String. The string should be a *complete* representation
70
+ # of the data in the nodes, so that the from_data method can turn the
71
+ # string back into nodes
72
+ #
73
+ # If the Tree::Mirror data_type is :file, this must return an
74
+ # array of Strings, where each string is the absolute path to the file.
75
+ #
76
+ # @return [String or Array<String>]
77
+ def to_data(nodes)
38
78
  raise "not implemented"
39
79
  end
40
80
 
41
- # This is the abstract representation of a ROW in a TreeView.
81
+ # This is the required interface of a ROW in a TreeView.
42
82
  module NodeMirror
43
83
  include Redcar::Observable
44
84
 
@@ -51,14 +91,14 @@ module Redcar
51
91
 
52
92
  # Which icon to show next to the text
53
93
  def icon
54
- raise "not implemented"
94
+ nil
55
95
  end
56
96
 
57
97
  # This node's children
58
98
  #
59
99
  # @return [Array<NodeMirror>]
60
100
  def children
61
- raise "not implemented"
101
+ []
62
102
  end
63
103
 
64
104
  # Whether this node is a leaf node or not (different to whether or
@@ -66,7 +106,7 @@ module Redcar
66
106
  #
67
107
  # @return [Boolean]
68
108
  def leaf?
69
- raise "not implemented"
109
+ true
70
110
  end
71
111
  end
72
112
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Redcar
3
3
  class TreeViewSWT
4
- attr_reader :viewer
4
+ attr_reader :viewer, :model
5
5
 
6
6
  def self.storage
7
7
  @storage ||= begin
@@ -10,11 +10,11 @@ module Redcar
10
10
  storage
11
11
  end
12
12
  end
13
-
14
13
 
15
14
  def initialize(composite, model)
16
15
  @composite, @model = composite, model
17
- @viewer = JFace::Viewers::TreeViewer.new(@composite, Swt::SWT::VIRTUAL)
16
+ tree_style = Swt::SWT::VIRTUAL | Swt::SWT::MULTI
17
+ @viewer = JFace::Viewers::TreeViewer.new(@composite, tree_style)
18
18
  @viewer.set_content_provider(TreeMirrorContentProvider.new)
19
19
  @viewer.set_input(@model.tree_mirror)
20
20
  @viewer.set_label_provider(TreeMirrorLabelProvider.new)
@@ -22,32 +22,230 @@ module Redcar
22
22
  if @model.tree_controller
23
23
  @viewer.add_tree_listener(@viewer.getControl, TreeListener.new)
24
24
  @viewer.add_double_click_listener(DoubleClickListener.new)
25
- @viewer.add_open_listener(OpenListener.new(@model.tree_controller))
26
- end
27
-
28
- @model.add_listener(:refresh) do
29
- s = Time.now
30
- begin
31
- @viewer.refresh if TreeViewSWT.storage['refresh_trees_on_refocus']
32
- rescue => e
33
- # Don't know why the @viewer sometimes throws these:
34
- # "undefined method `getParent' for #<Redcar::TreeViewSWT::TreeMirrorContentProvider:0x44655c8c> (NoMethodError)"
35
- # It looks like it is expecting a ILazyTreeViewContentProvider, because getParent
36
- # is in the API for that.
37
- puts e.message
38
- puts e.backtrace
25
+ @viewer.add_open_listener(OpenListener.new(@model))
26
+ control.add_mouse_listener(MouseListener.new(self))
27
+ end
28
+
29
+ register_dnd if @model.tree_mirror.drag_and_drop?
30
+
31
+ @model.add_listener(:refresh) { @viewer.refresh }
32
+
33
+ @editor = Swt::Custom::TreeEditor.new(control)
34
+
35
+ @editor.horizontalAlignment = Swt::SWT::LEFT
36
+ @editor.grabHorizontal = true
37
+
38
+ @model.add_listener(:edit_element, &method(:edit_element))
39
+ @model.add_listener(:expand_element, &method(:expand_element))
40
+ @model.add_listener(:select_element, &method(:select_element))
41
+ end
42
+
43
+ class DragSourceListener
44
+ attr_reader :tree, :dragged_elements
45
+
46
+ def initialize(tree_view_swt, tree)
47
+ @tree_view_swt = tree_view_swt
48
+ @tree = tree
49
+ end
50
+
51
+ def drag_start(event)
52
+ selection = tree.get_selection
53
+ if selection.length > 0
54
+ event.doit = true
55
+ @dragged_elements = selection.map do |item|
56
+ @tree_view_swt.item_to_element(item)
57
+ end
58
+ Redcar.safely do
59
+ @tree_view_swt.drag_controller.drag_start(@dragged_elements)
60
+ end
61
+ else
62
+ event.doit = false
63
+ end
64
+ end
65
+
66
+ def drag_set_data(event)
67
+ case tree_mirror.data_type
68
+ when :file
69
+ Redcar.safely do
70
+ @data = tree_mirror.to_data(dragged_elements).to_java(:string)
71
+ end
72
+ event.data = @data
73
+ when :text
74
+ Redcar.safely do
75
+ @data = tree_mirror.to_data(dragged_elements)
76
+ end
77
+ event.data = @data
78
+ else
79
+ raise "unknown tree data_type #{tree.tree_mirror.data_type}"
80
+ end
81
+ end
82
+
83
+ def drag_finished(*_); end
84
+
85
+ def tree_mirror
86
+ @tree_view_swt.model.tree_mirror
87
+ end
88
+ end
89
+
90
+ class DropAdapter < JFace::Viewers::ViewerDropAdapter
91
+ def initialize(tree_view_swt, drag_source_listener, viewer)
92
+ @tree_view_swt = tree_view_swt
93
+ @drag_source_listener = drag_source_listener
94
+ super(viewer)
95
+ end
96
+
97
+ def validateDrop(target, operation, transfer_data_type)
98
+ pos = location_to_position(get_current_location)
99
+ Redcar.safely do
100
+ @tree_view_swt.drag_controller.can_drop?(@drag_source_listener.dragged_elements, target, pos)
101
+ end
102
+ end
103
+
104
+ def performDrop(data)
105
+ elements = data.to_a.map {|datum| @tree_view_swt.model.tree_mirror.from_data(datum) }
106
+ pos = location_to_position(get_current_location)
107
+ Redcar.safely do
108
+ @tree_view_swt.drag_controller.do_drop(elements, get_current_target, pos)
109
+ end
110
+ true
111
+ end
112
+
113
+ private
114
+
115
+ def location_to_position(location)
116
+ if Redcar.safely { @tree_view_swt.drag_controller.reorderable? }
117
+ {1 => :before, 2 => :after, 3 => :onto}[location]
118
+ else
119
+ :onto
120
+ end
121
+ end
122
+ end
123
+
124
+ def register_dnd
125
+ case Redcar.safely { @model.tree_mirror.data_type }
126
+ when :file
127
+ types = [Swt::DND::FileTransfer.getInstance()].to_java(:"org.eclipse.swt.dnd.FileTransfer")
128
+ when :text
129
+ types = [Swt::DND::TextTransfer.getInstance()].to_java(:"org.eclipse.swt.dnd.TextTransfer")
130
+ else
131
+ raise "unknown tree data_type #{Redcar.safely { tree.tree_mirror.data_type }}"
132
+ end
133
+ operations = Swt::DND::DND::DROP_MOVE | Swt::DND::DND::DROP_COPY
134
+
135
+ source_listener = DragSourceListener.new(self, @viewer.get_tree)
136
+ drop_adapter = DropAdapter.new(self, source_listener, @viewer)
137
+ drop_adapter.set_feedback_enabled(drag_controller.reorderable?)
138
+
139
+ @viewer.add_drag_support(operations, types, source_listener)
140
+ @viewer.add_drop_support(operations, types, drop_adapter)
141
+ end
142
+
143
+ def drag_controller
144
+ @model.tree_controller.drag_controller(@model)
145
+ end
146
+
147
+ def edit_element(element, select_from, select_to)
148
+ item = element_to_item(element)
149
+ unless item
150
+ puts "ERROR: when trying to edit, no visible item for #{element.inspect}"
151
+ return
152
+ end
153
+
154
+ text = Swt::Widgets::Text.new(control, Swt::SWT::NONE)
155
+ text.set_text(item.get_text)
156
+ colour = ApplicationSWT.display.get_system_color(Swt::SWT::COLOR_GRAY)
157
+ text.set_background(colour)
158
+
159
+ @editor.set_editor(text, item)
160
+ text.set_selection(select_from || 0, select_to || text.get_text.length)
161
+ listener = EditorListener.new(self, element, text)
162
+ text.add_listener(Swt::SWT::FocusOut, listener)
163
+ text.add_listener(Swt::SWT::Traverse, listener)
164
+
165
+ text.set_focus
166
+ end
167
+
168
+ def edited_element(element, text)
169
+ if @model.tree_controller and @model.tree_controller.respond_to?(:edited)
170
+ Redcar.safely("edit element") do
171
+ @model.tree_controller.edited(@model, element, text)
172
+ end
173
+ end
174
+ end
175
+
176
+ def expand_element(element)
177
+ if item = element_to_item(element)
178
+ @viewer.expandToLevel(element, 1)
179
+ end
180
+ end
181
+
182
+ def select_element(element)
183
+ if item = element_to_item(element)
184
+ @viewer.get_tree.set_selection(item)
185
+ end
186
+ end
187
+
188
+ def element_to_item(element)
189
+ @viewer.test_find_item(element)
190
+ end
191
+
192
+ def item_to_element(item)
193
+ @viewer.getViewerRowFromItem(item).get_element
194
+ end
195
+
196
+ def selection
197
+ @viewer.get_tree.get_selection.map {|i| item_to_element(i) }
198
+ end
199
+
200
+ class EditorListener
201
+ def initialize(tree_view_swt, element, text_widget)
202
+ @tree_view_swt = tree_view_swt
203
+ @element = element
204
+ @text = text_widget
205
+ end
206
+
207
+ def handle_event(e)
208
+ case e.type
209
+ when Swt::SWT::FocusOut
210
+ new_text = @text.get_text
211
+ @text.dispose
212
+ @tree_view_swt.edited_element(@element, new_text)
213
+ when Swt::SWT::Traverse
214
+ case e.detail
215
+ when Swt::SWT::TRAVERSE_RETURN
216
+ new_text = @text.get_text
217
+ @text.dispose
218
+ e.doit = false
219
+ @tree_view_swt.edited_element(@element, new_text)
220
+ when Swt::SWT::TRAVERSE_ESCAPE
221
+ @text.dispose
222
+ e.doit = false
223
+ end
39
224
  end
40
225
  end
41
226
  end
42
227
 
43
228
  def control
44
- @viewer.getControl
229
+ @viewer.get_control
45
230
  end
46
231
 
47
232
  def close
48
233
  @viewer.getControl.dispose
49
234
  end
50
235
 
236
+ def right_click(mouse_event)
237
+ if @model.tree_controller
238
+ point = Swt::Graphics::Point.new(mouse_event.x, mouse_event.y)
239
+ item = @viewer.get_item_at(point)
240
+ element = item ? @viewer.getViewerRowFromItem(item).get_element : nil
241
+ if @model.tree_controller.respond_to?(:right_click)
242
+ Redcar.safely("right click on tree") do
243
+ @model.tree_controller.right_click(@model, element)
244
+ end
245
+ end
246
+ end
247
+ end
248
+
51
249
  class TreeListener
52
250
  def tree_collapsed(e)
53
251
  end
@@ -64,6 +262,22 @@ module Redcar
64
262
  end
65
263
  end
66
264
 
265
+ class MouseListener
266
+ def initialize(tree_view_swt)
267
+ @tree_view_swt = tree_view_swt
268
+ end
269
+
270
+ def mouse_double_click(_); end
271
+ def mouse_up(_)
272
+ end
273
+
274
+ def mouse_down(e)
275
+ if e.button == 3
276
+ @tree_view_swt.right_click(e)
277
+ end
278
+ end
279
+ end
280
+
67
281
  class DoubleClickListener
68
282
  def double_click(e)
69
283
 
@@ -84,12 +298,14 @@ module Redcar
84
298
  end
85
299
 
86
300
  class OpenListener
87
- def initialize(controller)
88
- @controller = controller
301
+ def initialize(tree_model)
302
+ @tree_model = tree_model
89
303
  end
90
304
 
91
305
  def open(e)
92
- @controller.activated(e.getSelection.toArray.to_a.first)
306
+ Redcar.safely("tree row activation") do
307
+ @tree_model.tree_controller.activated(@tree_model, e.getSelection.toArray.to_a.first)
308
+ end
93
309
  end
94
310
  end
95
311
 
@@ -111,6 +327,10 @@ module Redcar
111
327
  def get_children(tree_node)
112
328
  tree_node.children.to_java
113
329
  end
330
+
331
+ def get_parent(tree_node)
332
+ # not sure why this is necessary
333
+ end
114
334
 
115
335
  def dispose
116
336
  end
@@ -130,11 +350,13 @@ module Redcar
130
350
  end
131
351
 
132
352
  def get_image(tree_node)
133
- case tree_node.icon
353
+ case icon = tree_node.icon
134
354
  when :directory
135
355
  dir_image
136
356
  when :file
137
357
  file_image
358
+ when String
359
+ image(icon)
138
360
  end
139
361
  end
140
362
 
@@ -143,17 +365,21 @@ module Redcar
143
365
 
144
366
  private
145
367
 
368
+ def image(path)
369
+ Swt::Graphics::Image.new(ApplicationSWT.display, path)
370
+ end
371
+
146
372
  def dir_image
147
373
  @dir_image ||= begin
148
374
  path = File.join(Redcar.root, %w(plugins application icons darwin-folder.png))
149
- Swt::Graphics::Image.new(ApplicationSWT.display, path)
375
+ image(path)
150
376
  end
151
377
  end
152
378
 
153
379
  def file_image
154
380
  @file_image ||= begin
155
381
  path = File.join(Redcar.root, %w(plugins application icons darwin-file.png))
156
- Swt::Graphics::Image.new(ApplicationSWT.display, path)
382
+ image(path)
157
383
  end
158
384
  end
159
385
  end