redcar 0.3.6 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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