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
@@ -211,6 +211,10 @@ module Redcar
211
211
  @mate_text.get_control.set_focus
212
212
  end
213
213
 
214
+ def is_current?
215
+ EditView.current == @mate_text.get_control
216
+ end
217
+
214
218
  def has_focus?
215
219
  focus_control = ApplicationSWT.display.get_focus_control
216
220
  focus_control == @mate_text.get_control
@@ -40,4 +40,5 @@ tr.error {
40
40
 
41
41
  tr.cancelled {
42
42
  background-color: #EEE;
43
- }
43
+ }
44
+
@@ -3,6 +3,14 @@ require 'html_view/html_tab'
3
3
 
4
4
  module Redcar
5
5
  class HtmlView
6
+ def self.default_css_path
7
+ File.expand_path(File.join(Redcar.root, %w(plugins html_view assets redcar.css)))
8
+ end
9
+
10
+ def self.jquery_path
11
+ File.expand_path(File.join(Redcar.root, %w(plugins html_view assets jquery-1.4.min.js)))
12
+ end
13
+
6
14
  attr_reader :controller
7
15
 
8
16
  def initialize(html_tab)
@@ -18,13 +26,14 @@ module Redcar
18
26
  controller_action("index")
19
27
  end
20
28
 
21
- def controller_action(action_name, path=nil)
22
- action_method_arity = controller.method(action_name).arity
29
+ def controller_action(action_name, params=nil)
30
+ text = nil
23
31
  begin
32
+ action_method_arity = controller.method(action_name).arity
24
33
  text = if action_method_arity == 0
25
34
  controller.send(action_name)
26
35
  elsif action_method_arity == 1
27
- controller.send(action_name, path)
36
+ controller.send(action_name, params)
28
37
  end
29
38
  rescue => e
30
39
  text = <<-HTML
@@ -32,7 +41,11 @@ module Redcar
32
41
  #{e.message}
33
42
  HTML
34
43
  end
35
- @html_tab.controller.browser.set_text(text + setup_javascript_listeners)
44
+ if text
45
+ unless @html_tab.controller.browser.disposed
46
+ @html_tab.controller.browser.set_text(text.to_s + setup_javascript_listeners)
47
+ end
48
+ end
36
49
  end
37
50
 
38
51
  def contents=(source)
@@ -45,7 +58,7 @@ module Redcar
45
58
  def function(args)
46
59
  func_name = args.to_a.first
47
60
  func_args = args.to_a.last.to_a
48
- controller.send(func_name.to_sym, *func_args)
61
+ JSON(controller.send(func_name.to_sym, *func_args))
49
62
  end
50
63
 
51
64
  attr_accessor :controller
@@ -59,7 +72,7 @@ module Redcar
59
72
  (controller.methods - Object.new.methods).each do |method_name|
60
73
  method = []
61
74
  method << " #{method_name.gsub(/_(\w)/) { |a| $1.upcase}}: function() {"
62
- method << " rubyCall(\"#{method_name}\", Array.prototype.slice.call(arguments));"
75
+ method << " return eval(rubyCall(\"#{method_name}\", Array.prototype.slice.call(arguments)));"
63
76
  method << " }"
64
77
  methods << method.join("\n")
65
78
  end
@@ -13,8 +13,8 @@ module Redcar
13
13
  @html_view = HtmlView.new(self)
14
14
  end
15
15
 
16
- def controller_action(action, path)
17
- notify_listeners(:controller_action, action, path)
16
+ def controller_action(action, params)
17
+ notify_listeners(:controller_action, action, params)
18
18
  end
19
19
  end
20
20
  end
@@ -124,5 +124,16 @@ module Redcar
124
124
  end
125
125
  @lost_application_focus = nil
126
126
  end
127
+
128
+ def config_dir
129
+ File.join(path, ".redcar")
130
+ end
131
+
132
+ def config_file(name)
133
+ file_path = File.join(config_dir, name.to_s)
134
+ if File.exist?(file_path)
135
+ YAML.load(File.read(file_path))
136
+ end
137
+ end
127
138
  end
128
139
  end
@@ -2,13 +2,263 @@
2
2
  module Redcar
3
3
  class Project
4
4
  class DirController
5
- def activated(node)
5
+ include Redcar::Tree::Controller
6
+
7
+ def activated(tree, node)
6
8
  if node.leaf?
7
9
  FileOpenCommand.new(node.path).run
8
10
  end
9
11
  end
12
+
13
+ class DragController
14
+ include Redcar::Tree::Controller::DragController
15
+
16
+ attr_reader :tree
17
+
18
+ def initialize(tree)
19
+ @tree = tree
20
+ end
21
+
22
+ def reorderable?
23
+ false
24
+ end
25
+
26
+ def can_drop?(nodes, target, position)
27
+ nodes.all? {|node| droppable?(node, target)}
28
+ end
29
+
30
+ def do_drop(nodes, target, position)
31
+ paths = nodes.map {|node| node.path }
32
+ non_nested_paths = remove_nested_paths(paths)
33
+ non_nested_paths.each do |path|
34
+ dir = target ? target.directory : tree.tree_mirror.path
35
+ unless File.dirname(path) == dir
36
+ FileUtils.mv(path, dir)
37
+ end
38
+ end
39
+ tree.refresh
40
+ end
41
+
42
+ private
43
+
44
+ def droppable?(from_node, target_node)
45
+ # you can always drop into the top level of the tree
46
+ return true if target_node == nil
47
+
48
+ # can't drop a file/dir onto itself
49
+ return false if from_node.path == target_node.path
50
+
51
+ # can't drop a directory into its children
52
+ !child_of?(from_node.path, target_node.path)
53
+ end
54
+
55
+ def child_of?(path, possible_child_path)
56
+ possible_child_path =~ /^#{Regexp.escape(path)}\//
57
+ end
58
+
59
+ # Removes paths which are children of higher level paths also being
60
+ # dragged.
61
+ def remove_nested_paths(paths)
62
+ sorted = paths.sort
63
+ keep = [sorted.first]
64
+ sorted[1..-1].each do |path|
65
+ unless child_of?(keep.last, path)
66
+ keep << path
67
+ end
68
+ end
69
+ keep
70
+ end
71
+ end
72
+
73
+ def drag_controller(tree)
74
+ DragController.new(tree)
75
+ end
76
+
77
+ def right_click(tree, node)
78
+ controller = self
79
+
80
+ menu = Menu::Builder.build do
81
+ item("New File") { controller.new_file(tree, node) }
82
+ item("New Directory") { controller.new_dir(tree, node) }
83
+ separator
84
+ if tree.selection.length > 1
85
+ dirs = tree.selection.map {|node| node.parent_dir }
86
+ if dirs.uniq.length == 1
87
+ item("Bulk Rename") { controller.rename(tree, node) }
88
+ end
89
+ else
90
+ item("Rename") { controller.rename(tree, node) }
91
+ end
92
+ item("Delete") { controller.delete(tree, node) }
93
+ separator
94
+ if DirMirror.show_hidden_files?
95
+ item("Hide Hidden Files") do
96
+ DirMirror.show_hidden_files = false
97
+ tree.refresh
98
+ end
99
+ else
100
+ item("Show Hidden Files") do
101
+ DirMirror.show_hidden_files = true
102
+ tree.refresh
103
+ end
104
+ end
105
+ end
106
+
107
+ Application::Dialog.popup_menu(menu, :pointer)
108
+ end
109
+
110
+ def new_file(tree, node)
111
+ enclosing_dir = node ? node.directory : tree.tree_mirror.path
112
+ new_file_name = uniq_name(enclosing_dir, "New File")
113
+ new_file_path = File.join(enclosing_dir, new_file_name)
114
+ FileUtils.touch(new_file_path)
115
+ tree.refresh
116
+ tree.expand(node)
117
+ new_file_node = DirMirror::Node.create_from_path(new_file_path)
118
+ tree.edit(new_file_node)
119
+ end
120
+
121
+ def new_dir(tree, node)
122
+ enclosing_dir = node ? node.directory : tree.tree_mirror.path
123
+ new_dir_name = uniq_name(enclosing_dir, "New Directory")
124
+ new_dir_path = File.join(enclosing_dir, new_dir_name)
125
+ FileUtils.mkdir(new_dir_path)
126
+ tree.refresh
127
+ tree.expand(node)
128
+ new_dir_node = DirMirror::Node.create_from_path(new_dir_path)
129
+ tree.edit(new_dir_node)
130
+ end
131
+
132
+ def rename(tree, node)
133
+ nodes = tree.selection
134
+ if nodes.length == 1
135
+ single_rename(tree, node)
136
+ else
137
+ bulk_rename(tree, nodes)
138
+ end
139
+ end
140
+
141
+ def single_rename(tree, node)
142
+ if node.text =~ /^(.*)\.[^\.]+$/
143
+ tree.edit(node, 0, $1.length)
144
+ else
145
+ tree.edit(node)
146
+ end
147
+ end
148
+
149
+ def bulk_rename(tree, nodes)
150
+ tab = Redcar.app.focussed_window.new_tab(HtmlTab)
151
+ controller = BulkRenameController.new(tab, tree, nodes)
152
+ tab.html_view.controller = controller
153
+ tab.focus
154
+ end
155
+
156
+ class BulkRenameController
157
+ attr_reader :pairs, :match_pattern, :replace_pattern
158
+
159
+ def initialize(tab, tree, nodes)
160
+ @tab = tab
161
+ @tree = tree
162
+ @pairs = nodes.map {|node| [node, File.basename(node.path)] }
163
+ @match_pattern = ""
164
+ @replace_pattern = ""
165
+ end
166
+
167
+ def title
168
+ "Bulk Rename"
169
+ end
170
+
171
+ def index
172
+ rhtml = ERB.new(File.read(File.join(File.dirname(__FILE__), "..", "..", "views", "bulk_rename.html.erb")))
173
+ rhtml.result(binding)
174
+ end
175
+
176
+ def refresh(new_match_pattern, new_replace_pattern)
177
+ begin
178
+ @match_pattern = /#{new_match_pattern}/
179
+ rescue
180
+ return []
181
+ end
182
+ @replace_pattern = new_replace_pattern
183
+ result = @pairs.map do |node, _|
184
+ old_name = File.basename(node.path)
185
+ new_name = transform_name(old_name)
186
+ new_path = File.join(File.dirname(node.path), new_name)
187
+ conflicts = (File.exist?(new_path) and new_name != old_name)
188
+ legal = (new_name != "" and legal_path?(new_path))
189
+ [new_name, conflicts, legal]
190
+ end
191
+ result
192
+ end
193
+
194
+ def submit(params)
195
+ p [:submit, params]
196
+ @pairs.each do |node, _|
197
+ old_name = File.basename(node.path)
198
+ new_name = transform_name(old_name)
199
+ next if old_name == new_name
200
+ new_path = File.join(File.dirname(node.path), new_name)
201
+ FileUtils.mv(node.path, new_path)
202
+ end
203
+ @tab.close
204
+ @tree.refresh
205
+ end
206
+
207
+ private
208
+
209
+ def transform_name(old_name)
210
+ old_name.sub(match_pattern, replace_pattern)
211
+ end
212
+
213
+ def legal_path?(path)
214
+ return true if File.exist?(path)
215
+
216
+ begin
217
+ FileUtils.touch(path)
218
+ FileUtils.rm(path)
219
+ return true
220
+ rescue Errno::ENOENT
221
+ return false
222
+ end
223
+ end
224
+ end
225
+
226
+ def delete(tree, _)
227
+ nodes = tree.selection
228
+ basenames = nodes.map {|node| File.basename(node.path) }
229
+ msg = "Really delete #{basenames.join(", ")}?"
230
+ result = Application::Dialog.message_box(msg, :type => :question, :buttons => :yes_no)
231
+ if result == :yes
232
+ nodes.each do |node|
233
+ FileUtils.rm_rf(node.path)
234
+ end
235
+ tree.refresh
236
+ end
237
+ end
238
+
239
+ def edited(tree, node, text)
240
+ new_path = File.expand_path(File.join(File.dirname(node.path), text))
241
+ return if node.path == new_path
242
+
243
+ FileUtils.mv(node.path, new_path)
244
+ tree.refresh
245
+ new_node = DirMirror::Node.create_from_path(new_path)
246
+ tree.select(new_node)
247
+ end
248
+
249
+ private
250
+
251
+ def uniq_name(path, name)
252
+ return name unless File.exist?(File.join(path, name))
253
+ i = 1
254
+ loop do
255
+ new_name = name + " #{i}"
256
+ return new_name unless File.exist?(File.join(path, new_name))
257
+ i += 1
258
+ end
259
+ end
10
260
  end
11
261
  end
12
262
  end
13
263
 
14
-
264
+
@@ -2,6 +2,14 @@
2
2
  module Redcar
3
3
  class Project
4
4
  class DirMirror
5
+ class << self
6
+ attr_accessor :show_hidden_files
7
+
8
+ def show_hidden_files?
9
+ show_hidden_files
10
+ end
11
+ end
12
+
5
13
  include Redcar::Tree::Mirror
6
14
  attr_reader :path
7
15
 
@@ -23,22 +31,46 @@ module Redcar
23
31
  @changed
24
32
  end
25
33
 
26
- # Get the top-level nodes
27
- #
28
- # @return [Array<Node>]
34
+ # Drag and drop is allowed in Dir trees
35
+ def drag_and_drop?
36
+ true
37
+ end
38
+
39
+ # The files and directories in the top of the directory.
29
40
  def top
30
41
  @changed = false
31
42
  Node.create_all_from_path(@path)
32
43
  end
33
44
 
45
+ # We specify a :file data type to take advantage of OS integration.
46
+ def data_type
47
+ :file
48
+ end
49
+
50
+ # Return the Node for this path.
51
+ #
52
+ # @return [Node]
53
+ def from_data(path)
54
+ Node.create_from_path(path)
55
+ end
56
+
57
+ # Turn the nodes into data.
58
+ def to_data(nodes)
59
+ nodes.map {|node| node.path }
60
+ end
61
+
34
62
  class Node
35
-
36
63
  include Redcar::Tree::Mirror::NodeMirror
37
64
 
38
65
  attr_reader :path
39
66
 
40
67
  def self.create_all_from_path(path)
41
- Dir[path + "/*"].sort_by do |fn|
68
+ fs = Dir.glob(path + "/*", File::FNM_DOTMATCH)
69
+ fs = fs.reject {|f| [".", ".."].include?(File.basename(f))}
70
+ unless DirMirror.show_hidden_files?
71
+ fs = fs.reject {|f| File.basename(f) =~ /^\./ }
72
+ end
73
+ fs.sort_by do |fn|
42
74
  File.basename(fn).downcase
43
75
  end.sort_by do |path|
44
76
  File.directory?(path) ? -1 : 1
@@ -70,9 +102,25 @@ module Redcar
70
102
  end
71
103
 
72
104
  def leaf?
105
+ file?
106
+ end
107
+
108
+ def file?
73
109
  File.file?(@path)
74
110
  end
75
111
 
112
+ def directory?
113
+ File.directory?(@path)
114
+ end
115
+
116
+ def parent_dir
117
+ File.dirname(@path)
118
+ end
119
+
120
+ def directory
121
+ directory? ? @path : File.dirname(@path)
122
+ end
123
+
76
124
  def children
77
125
  Node.create_all_from_path(@path)
78
126
  end