redcar 0.7 → 0.8
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.
- data/CHANGES +42 -0
- data/README.md +5 -3
- data/Rakefile +39 -81
- data/bin/redcar +1 -1
- data/lib/redcar.rb +9 -6
- data/lib/redcar/installer.rb +1 -1
- data/lib/redcar/ruby_extensions.rb +19 -0
- data/lib/redcar/runner.rb +1 -1
- data/lib/redcar/usage.rb +3 -0
- data/lib/redcar_quick_start.rb +11 -11
- data/plugins/application/features/step_definitions/tree_steps.rb +22 -5
- data/plugins/application/features/step_definitions/window_steps.rb +9 -1
- data/plugins/application/features/support/env.rb +5 -2
- data/plugins/application/lib/application.rb +51 -46
- data/plugins/application/lib/application/window.rb +60 -30
- data/plugins/application_swt/lib/application_swt.rb +16 -16
- data/plugins/application_swt/lib/application_swt/window.rb +35 -7
- data/plugins/auto_completer/features/support/env.rb +0 -2
- data/plugins/auto_indenter/features/support/env.rb +0 -1
- data/plugins/auto_pairer/features/auto_pairer.feature +50 -45
- data/plugins/auto_pairer/features/support/env.rb +0 -1
- data/plugins/auto_pairer/lib/auto_pairer/document_controller.rb +11 -6
- data/plugins/clipboard-viewer/Screenshot.png +0 -0
- data/plugins/clipboard-viewer/lib/clipboard_viewer.rb +50 -0
- data/plugins/clipboard-viewer/lib/clipboard_viewer/browser_controller.rb +27 -0
- data/plugins/clipboard-viewer/lib/clipboard_viewer/clipboard_bar.rb +67 -0
- data/plugins/clipboard-viewer/plugin.rb +9 -0
- data/plugins/clipboard-viewer/views/clipboard.html.erb +15 -0
- data/plugins/clipboard-viewer/views/default.css +43 -0
- data/plugins/clipboard-viewer/views/redcar_small_icon.png +0 -0
- data/plugins/comment/features/line_comment.feature +137 -0
- data/plugins/comment/features/selection_comment.feature +21 -0
- data/plugins/comment/features/step_definitions/comment_steps.rb +7 -0
- data/plugins/comment/lib/comment.rb +266 -0
- data/plugins/comment/plugin.rb +7 -0
- data/plugins/comment/vendor/comment_lib.json +47 -0
- data/plugins/declarations/lib/declarations.rb +1 -1
- data/plugins/document_search/features/replace.feature +10 -2
- data/plugins/document_search/features/support/env.rb +0 -1
- data/plugins/document_search/lib/document_search.rb +4 -1
- data/plugins/document_search/lib/document_search/replace.rb +11 -3
- data/plugins/document_search/lib/document_search/search_and_replace.rb +5 -2
- data/plugins/edit_view/features/case_change.feature +9 -9
- data/plugins/edit_view/features/cursor_navigation.feature +36 -0
- data/plugins/edit_view/features/step_definitions/editing_steps.rb +63 -8
- data/plugins/edit_view/features/step_definitions/notebook_steps.rb +2 -0
- data/plugins/edit_view/features/step_definitions/tab_steps.rb +8 -5
- data/plugins/edit_view/features/support/env.rb +8 -2
- data/plugins/edit_view/lib/edit_view.rb +16 -1
- data/plugins/edit_view/lib/edit_view/actions/cmd_enter.rb +11 -0
- data/plugins/edit_view/lib/edit_view/document.rb +27 -10
- data/plugins/edit_view/lib/edit_view/edit_tab.rb +17 -4
- data/plugins/edit_view/spec/edit_view/document_spec.rb +3 -0
- data/plugins/edit_view_swt/lib/edit_view_swt.rb +42 -3
- data/plugins/edit_view_swt/lib/edit_view_swt/word_movement.rb +17 -15
- data/plugins/help/lib/help.rb +40 -0
- data/plugins/help/plugin.rb +8 -0
- data/plugins/html_view/features/step_definitions/html_view_steps.rb +6 -4
- data/plugins/line_tools/features/support/env.rb +0 -1
- data/plugins/macros/features/step_definitions/macro_steps.rb +0 -55
- data/plugins/macros/features/support/env.rb +0 -2
- data/plugins/open_default_app/lib/open_default_app.rb +35 -0
- data/plugins/open_default_app/plugin.rb +8 -0
- data/plugins/open_default_app/screenshot.png +0 -0
- data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +17 -3
- data/plugins/project/features/find_file.feature +3 -2
- data/plugins/project/features/highlight_focussed_tab.feature +8 -0
- data/plugins/project/features/move_and_rename_files.feature +25 -0
- data/plugins/project/features/open_and_save_files.feature +10 -1
- data/plugins/project/features/open_directory_tree.feature +32 -2
- data/plugins/project/features/step_definitions/directory_steps.rb +17 -0
- data/plugins/project/features/step_definitions/project_tree_steps.rb +3 -0
- data/plugins/project/features/sub_project.feature +14 -0
- data/plugins/project/features/support/env.rb +22 -3
- data/plugins/project/features/watch_for_modified_files.feature +32 -9
- data/plugins/project/lib/project.rb +53 -21
- data/plugins/project/lib/project/adapters/local.rb +21 -16
- data/plugins/project/lib/project/adapters/remote.rb +15 -13
- data/plugins/project/lib/project/commands.rb +37 -16
- data/plugins/project/lib/project/dir_controller.rb +41 -42
- data/plugins/project/lib/project/drb_service.rb +35 -21
- data/plugins/project/lib/project/file_list.rb +7 -1
- data/plugins/project/lib/project/manager.rb +28 -3
- data/plugins/project/lib/project/sub_project.rb +17 -0
- data/plugins/project/lib/project/support/recycle.js +2 -0
- data/plugins/project/lib/project/support/trash.rb +72 -0
- data/plugins/project/spec/fixtures/multi-byte-files/a/341/204/200/341/205/247/341/206/274/341/204/205/341/205/251/foo +1 -0
- data/plugins/project/spec/fixtures/multi-byte-files//341/204/220/341/205/246/341/204/211/341/205/263/341/204/220/341/205/263.py +1 -0
- data/plugins/project/spec/project/file_list_spec.rb +4 -0
- data/plugins/redcar/features/goto_line_command.feature +20 -0
- data/plugins/redcar/redcar.rb +107 -47
- data/plugins/repl/lib/repl.rb +20 -20
- data/plugins/repl/lib/repl/clojure_mirror.rb +50 -58
- data/plugins/repl/lib/repl/groovy_mirror.rb +22 -41
- data/plugins/repl/lib/repl/repl_mirror.rb +85 -14
- data/plugins/repl/lib/repl/ruby_mirror.rb +12 -39
- data/plugins/repl/spec/repl/groovy_mirror_spec.rb +1 -1
- data/plugins/repl/spec/repl/ruby_mirror_spec.rb +12 -12
- data/plugins/ruby/README +6 -0
- data/plugins/ruby/lib/syntax_check/ruby.rb +28 -0
- data/plugins/ruby/plugin.rb +7 -0
- data/plugins/runnables/features/command_tree.feature +9 -0
- data/plugins/runnables/features/file_runner_input.feature +20 -0
- data/plugins/runnables/features/run_alternate_command.feature +14 -0
- data/plugins/runnables/features/support/env.rb +42 -5
- data/plugins/runnables/lib/runnables.rb +67 -21
- data/plugins/runnables/lib/runnables/commands.rb +35 -18
- data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_group.rb +23 -37
- data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_type_group.rb +16 -18
- data/plugins/scm_svn/features/support/env.rb +0 -3
- data/plugins/snippets/features/snippets.feature +17 -2
- data/plugins/snippets/features/support/env.rb +0 -1
- data/plugins/snippets/lib/snippets/tab_handler.rb +51 -18
- data/plugins/swt/lib/swt/cucumber_patches.rb +13 -68
- data/plugins/swt/lib/swt/cucumber_runner.rb +2 -3
- data/plugins/syntax_check/README +6 -0
- data/plugins/syntax_check/lib/syntax_check.rb +16 -0
- data/plugins/syntax_check/lib/syntax_check/checker.rb +47 -0
- data/plugins/syntax_check/lib/syntax_check/error.rb +23 -0
- data/plugins/syntax_check/plugin.rb +7 -0
- data/plugins/tree_view_swt/lib/tree_view_swt.rb +6 -0
- data/plugins/web_bookmarks/Screenshot.png +0 -0
- data/plugins/web_bookmarks/lib/web_bookmarks.rb +42 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/bookmark.rb +43 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/browser_bar.rb +70 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/commands.rb +111 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/tree.rb +67 -0
- data/plugins/web_bookmarks/lib/web_bookmarks/view_controller.rb +22 -0
- data/plugins/web_bookmarks/plugin.rb +11 -0
- data/plugins/web_bookmarks/views/index.html.erb +5 -0
- metadata +60 -10
@@ -5,27 +5,31 @@ module Redcar
|
|
5
5
|
def touch(new_file_path)
|
6
6
|
FileUtils.touch(new_file_path)
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def mkdir(new_dir_path)
|
10
10
|
FileUtils.mkdir(new_dir_path)
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def mv(path, new_path)
|
14
14
|
FileUtils.mv(path, new_path)
|
15
|
+
new_path = File.join(new_path, File.basename(path)) unless File.file?(new_path)
|
16
|
+
Manager.update_tab_for_path(path,new_path)
|
15
17
|
end
|
16
|
-
|
18
|
+
|
17
19
|
def file?(path)
|
18
20
|
File.file?(path)
|
19
21
|
end
|
20
|
-
|
22
|
+
|
21
23
|
def directory?(path)
|
22
|
-
File.directory?
|
24
|
+
# JRuby's File.directory? seems to have a problem with multi-byte strings
|
25
|
+
f = java.io.File.new(path.to_java)
|
26
|
+
f.directory?
|
23
27
|
end
|
24
|
-
|
28
|
+
|
25
29
|
def empty_directory?(path)
|
26
30
|
Dir.glob("#{path}/*", File::FNM_DOTMATCH).length <= 2
|
27
31
|
end
|
28
|
-
|
32
|
+
|
29
33
|
def fetch_contents(path, force=false)
|
30
34
|
Dir.glob("#{path}/*", File::FNM_DOTMATCH).map do |fn|
|
31
35
|
is_dir = directory?(fn)
|
@@ -47,31 +51,32 @@ module Redcar
|
|
47
51
|
def save(file, contents)
|
48
52
|
File.open(file, "wb") {|f| f.print contents }
|
49
53
|
end
|
50
|
-
|
54
|
+
|
51
55
|
def mtime(file)
|
52
|
-
File.
|
56
|
+
File.mtime(file)
|
53
57
|
end
|
54
|
-
|
58
|
+
|
55
59
|
def exists?(file)
|
56
60
|
File.exists?(file)
|
57
61
|
end
|
58
|
-
|
62
|
+
|
59
63
|
def delete(file)
|
60
|
-
FileUtils.rm_rf(file)
|
64
|
+
FileUtils.rm_rf(file) unless Trash.recycle(file)
|
65
|
+
Manager.update_tab_for_path(file)
|
61
66
|
end
|
62
|
-
|
67
|
+
|
63
68
|
def load_contents(file)
|
64
69
|
File.open(file, 'rb') do |f|; f.read; end
|
65
70
|
end
|
66
|
-
|
71
|
+
|
67
72
|
def save_contents(file)
|
68
73
|
File.open(file, "wb") {|f| f.print contents }
|
69
74
|
end
|
70
|
-
|
75
|
+
|
71
76
|
def refresh_operation(tree)
|
72
77
|
yield
|
73
78
|
end
|
74
79
|
end
|
75
80
|
end
|
76
81
|
end
|
77
|
-
end
|
82
|
+
end
|
@@ -4,14 +4,14 @@ module Redcar
|
|
4
4
|
module Adapters
|
5
5
|
class Remote
|
6
6
|
class PathDoesNotExist < StandardError; end
|
7
|
-
|
7
|
+
|
8
8
|
PROTOCOLS = {
|
9
9
|
:ftp => RemoteProtocols::FTP,
|
10
10
|
:sftp => RemoteProtocols::SFTP
|
11
11
|
}
|
12
|
-
|
12
|
+
|
13
13
|
attr_accessor :protocol, :host, :user, :password, :private_key_files
|
14
|
-
|
14
|
+
|
15
15
|
def initialize(protocol, host, user, password, private_key_files)
|
16
16
|
@protocol = protocol
|
17
17
|
@host = host
|
@@ -20,7 +20,7 @@ module Redcar
|
|
20
20
|
@private_key_files = private_key_files
|
21
21
|
target
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def target
|
25
25
|
@target ||= PROTOCOLS[protocol].new(host, user, password, private_key_files)
|
26
26
|
end
|
@@ -35,8 +35,9 @@ module Redcar
|
|
35
35
|
|
36
36
|
def mv(path, new_path)
|
37
37
|
target.mv(path, new_path)
|
38
|
+
Manager.update_tab_for_path(path,new_path)
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
def mtime(file)
|
41
42
|
target.mtime(file)
|
42
43
|
end
|
@@ -44,11 +45,11 @@ module Redcar
|
|
44
45
|
def file?(path)
|
45
46
|
target.file?(path)
|
46
47
|
end
|
47
|
-
|
48
|
+
|
48
49
|
def directory?(path)
|
49
50
|
target.directory?(path)
|
50
51
|
end
|
51
|
-
|
52
|
+
|
52
53
|
def fetch_contents(path)
|
53
54
|
target.fetch_contents(path)
|
54
55
|
end
|
@@ -60,27 +61,28 @@ module Redcar
|
|
60
61
|
def save(file, contents)
|
61
62
|
target.save(file)
|
62
63
|
end
|
63
|
-
|
64
|
+
|
64
65
|
def stat(file)
|
65
66
|
target.stat(file)
|
66
67
|
end
|
67
|
-
|
68
|
+
|
68
69
|
def delete(file)
|
69
70
|
target.delete(file)
|
71
|
+
Manager.update_tab_for_path(file)
|
70
72
|
end
|
71
73
|
|
72
74
|
def exists?(path)
|
73
75
|
target.exists?(path)
|
74
76
|
end
|
75
|
-
|
77
|
+
|
76
78
|
def load(file)
|
77
79
|
target.load(file)
|
78
80
|
end
|
79
|
-
|
81
|
+
|
80
82
|
def save(file, contents)
|
81
83
|
target.save(file, contents)
|
82
84
|
end
|
83
|
-
|
85
|
+
|
84
86
|
def refresh_operation(tree)
|
85
87
|
visible_paths = tree.visible_nodes.map {|n| n.path}
|
86
88
|
visible_dirs = visible_paths.map {|path| File.dirname(path) }.uniq
|
@@ -91,4 +93,4 @@ module Redcar
|
|
91
93
|
end
|
92
94
|
end
|
93
95
|
end
|
94
|
-
end
|
96
|
+
end
|
@@ -158,6 +158,7 @@ module Redcar
|
|
158
158
|
else
|
159
159
|
FileSaveAsCommand.new.run
|
160
160
|
end
|
161
|
+
tab.update_for_file_changes
|
161
162
|
end
|
162
163
|
end
|
163
164
|
|
@@ -244,19 +245,22 @@ module Redcar
|
|
244
245
|
|
245
246
|
class RevealInProjectCommand < ProjectCommand
|
246
247
|
def execute
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
248
|
+
if project and project.window.trees_visible?
|
249
|
+
tab = Redcar.app.focussed_window.focussed_notebook_tab
|
250
|
+
return unless tab.is_a?(EditTab) && tab.edit_view.document.mirror
|
251
|
+
|
252
|
+
path = tab.edit_view.document.mirror.path
|
253
|
+
tree = project.tree
|
254
|
+
current = tree.tree_mirror.top
|
255
|
+
while current.any?
|
256
|
+
ancestor_node = current.detect {|node| path =~ /^#{node.path}($|\/)/}
|
257
|
+
return unless ancestor_node
|
258
|
+
tree.expand(ancestor_node)
|
259
|
+
current = ancestor_node.children
|
260
|
+
end
|
261
|
+
tree.select(ancestor_node)
|
262
|
+
project.window.treebook.focus_tree(project.tree)
|
257
263
|
end
|
258
|
-
tree.select(ancestor_node)
|
259
|
-
project.window.treebook.focus_tree(project.tree)
|
260
264
|
end
|
261
265
|
end
|
262
266
|
|
@@ -286,8 +290,11 @@ module Redcar
|
|
286
290
|
::Spoon.spawn(app, *options)
|
287
291
|
else
|
288
292
|
# TODO: This really needs proper escaping.
|
289
|
-
|
290
|
-
|
293
|
+
if options
|
294
|
+
options = options.map {|o| "\"#{o}\""}.join(' ')
|
295
|
+
else
|
296
|
+
options = ""
|
297
|
+
end
|
291
298
|
Thread.new do
|
292
299
|
system("#{app} #{options}")
|
293
300
|
puts " Finished: #{app} #{options}"
|
@@ -303,7 +310,8 @@ module Redcar
|
|
303
310
|
preferred = Manager.storage['preferred_file_browser']
|
304
311
|
case Redcar.platform
|
305
312
|
when :osx
|
306
|
-
|
313
|
+
# Spoon doesn't seem to like `open`
|
314
|
+
system('open', '-a', 'Finder', path)
|
307
315
|
when :windows
|
308
316
|
run_application('explorer.exe', path.gsub("/","\\"))
|
309
317
|
when :linux
|
@@ -335,7 +343,20 @@ module Redcar
|
|
335
343
|
preferred = Manager.storage['preferred_command_line']
|
336
344
|
case Redcar.platform
|
337
345
|
when :osx
|
338
|
-
|
346
|
+
unless preferred
|
347
|
+
preferred = "Terminal"
|
348
|
+
Manager.storage['preferred_command_line'] = preferred
|
349
|
+
end
|
350
|
+
command = <<-BASH.gsub(/^\s{12}/, '')
|
351
|
+
osascript <<END
|
352
|
+
tell application "#{preferred}"
|
353
|
+
do script "cd \\\"#{path}\\\""
|
354
|
+
activate
|
355
|
+
end tell
|
356
|
+
END
|
357
|
+
BASH
|
358
|
+
# Spoon doesn't seem to work with `osascript`
|
359
|
+
system(command)
|
339
360
|
when :windows
|
340
361
|
run_application('start cmd.exe', '/kcd ' + path.gsub("/","\\"))
|
341
362
|
when :linux
|
@@ -3,39 +3,39 @@ module Redcar
|
|
3
3
|
class Project
|
4
4
|
class DirController
|
5
5
|
include Redcar::Tree::Controller
|
6
|
-
|
6
|
+
|
7
7
|
def self.adapter(node, tree=nil)
|
8
8
|
node ? node.adapter : tree.tree_mirror.adapter
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def activated(tree, node)
|
12
12
|
if node.leaf?
|
13
13
|
FileOpenCommand.new(node.path, node.adapter).run
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def handle_error(tree, error)
|
18
18
|
tree.close
|
19
19
|
Application::Dialog.message_box(error.message, :type => :error)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
class DragController
|
23
23
|
include Redcar::Tree::Controller::DragController
|
24
|
-
|
24
|
+
|
25
25
|
attr_reader :tree
|
26
|
-
|
26
|
+
|
27
27
|
def initialize(tree)
|
28
28
|
@tree = tree
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def reorderable?
|
32
32
|
false
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def can_drop?(nodes, target, position)
|
36
36
|
nodes.all? {|node| droppable?(node, target)}
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def do_drop(nodes, target, position)
|
40
40
|
paths = nodes.map {|node| node.path }
|
41
41
|
non_nested_paths = remove_nested_paths(paths)
|
@@ -48,24 +48,24 @@ module Redcar
|
|
48
48
|
end
|
49
49
|
tree.refresh
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
private
|
53
|
-
|
53
|
+
|
54
54
|
def droppable?(from_node, target_node)
|
55
55
|
# you can always drop into the top level of the tree
|
56
56
|
return true if target_node == nil
|
57
|
-
|
57
|
+
|
58
58
|
# can't drop a file/dir onto itself
|
59
59
|
return false if from_node.path == target_node.path
|
60
|
-
|
60
|
+
|
61
61
|
# can't drop a directory into its children
|
62
62
|
!child_of?(from_node.path, target_node.path)
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
def child_of?(path, possible_child_path)
|
66
66
|
possible_child_path =~ /^#{Regexp.escape(path)}\//
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
# Removes paths which are children of higher level paths also being
|
70
70
|
# dragged.
|
71
71
|
def remove_nested_paths(paths)
|
@@ -79,14 +79,14 @@ module Redcar
|
|
79
79
|
keep
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
def drag_controller(tree)
|
84
84
|
DragController.new(tree)
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
def right_click(tree, node)
|
88
88
|
controller = self
|
89
|
-
|
89
|
+
|
90
90
|
menu = Menu.new
|
91
91
|
Redcar.plugin_manager.objects_implementing(:project_context_menus).each do |object|
|
92
92
|
# a lot of plugins will only really care about the node that was clicked
|
@@ -101,15 +101,15 @@ module Redcar
|
|
101
101
|
puts("Invalid project_context_menus hook detected in "+object.class.name)
|
102
102
|
end
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
Application::Dialog.popup_menu(menu, :pointer)
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
def new_file(tree, node)
|
109
109
|
enclosing_dir = node ? node.directory : tree.tree_mirror.path
|
110
110
|
new_file_name = uniq_name(enclosing_dir, "New File")
|
111
111
|
new_file_path = File.join(enclosing_dir, new_file_name)
|
112
|
-
|
112
|
+
|
113
113
|
adapter = DirController.adapter(node, tree)
|
114
114
|
adapter.touch(new_file_path)
|
115
115
|
tree.refresh
|
@@ -117,7 +117,7 @@ module Redcar
|
|
117
117
|
new_file_node = DirMirror::Node.cache[new_file_path]
|
118
118
|
tree.edit(new_file_node)
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
def new_dir(tree, node)
|
122
122
|
enclosing_dir = node ? node.directory : tree.tree_mirror.path
|
123
123
|
new_dir_name = uniq_name(enclosing_dir, "New Directory")
|
@@ -129,7 +129,7 @@ module Redcar
|
|
129
129
|
new_dir_node = DirMirror::Node.cache[new_dir_path]
|
130
130
|
tree.edit(new_dir_node)
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
def rename(tree, node)
|
134
134
|
nodes = tree.selection
|
135
135
|
if nodes.length == 1
|
@@ -138,7 +138,7 @@ module Redcar
|
|
138
138
|
bulk_rename(tree, nodes)
|
139
139
|
end
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
def single_rename(tree, node)
|
143
143
|
if node.text =~ /^(.*)\.[^\.]+$/
|
144
144
|
tree.edit(node, 0, $1.length)
|
@@ -146,19 +146,19 @@ module Redcar
|
|
146
146
|
tree.edit(node)
|
147
147
|
end
|
148
148
|
end
|
149
|
-
|
149
|
+
|
150
150
|
def bulk_rename(tree, nodes)
|
151
151
|
tab = Redcar.app.focussed_window.new_tab(HtmlTab)
|
152
152
|
controller = BulkRenameController.new(tab, tree, nodes)
|
153
153
|
tab.html_view.controller = controller
|
154
154
|
tab.focus
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
class BulkRenameController
|
158
158
|
include Redcar::HtmlController
|
159
|
-
|
159
|
+
|
160
160
|
attr_reader :pairs, :match_pattern, :replace_pattern
|
161
|
-
|
161
|
+
|
162
162
|
def initialize(tab, tree, nodes)
|
163
163
|
@tab = tab
|
164
164
|
@tree = tree
|
@@ -167,16 +167,16 @@ module Redcar
|
|
167
167
|
@replace_pattern = ""
|
168
168
|
@adapter = DirController.adapter(nodes.first, tree)
|
169
169
|
end
|
170
|
-
|
170
|
+
|
171
171
|
def title
|
172
172
|
"Bulk Rename"
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
def index
|
176
176
|
rhtml = ERB.new(File.read(File.join(File.dirname(__FILE__), "..", "..", "views", "bulk_rename.html.erb")))
|
177
177
|
rhtml.result(binding)
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
def refresh(new_match_pattern, new_replace_pattern)
|
181
181
|
begin
|
182
182
|
@match_pattern = /#{new_match_pattern}/
|
@@ -198,29 +198,28 @@ module Redcar
|
|
198
198
|
puts e.message
|
199
199
|
puts e.backtrace
|
200
200
|
end
|
201
|
-
|
201
|
+
|
202
202
|
def submit(params)
|
203
203
|
@pairs.each do |node, _|
|
204
204
|
old_name = File.basename(node.path)
|
205
205
|
new_name = transform_name(old_name)
|
206
206
|
next if old_name == new_name
|
207
207
|
new_path = File.join(File.dirname(node.path), new_name)
|
208
|
-
|
209
208
|
@adapter.mv(node.path, new_path)
|
210
209
|
end
|
211
210
|
@tab.close
|
212
211
|
@tree.refresh
|
213
212
|
end
|
214
|
-
|
213
|
+
|
215
214
|
private
|
216
|
-
|
215
|
+
|
217
216
|
def transform_name(old_name)
|
218
217
|
old_name.sub(match_pattern, replace_pattern)
|
219
218
|
end
|
220
|
-
|
219
|
+
|
221
220
|
def legal_path?(path)
|
222
221
|
return true if File.exist?(path)
|
223
|
-
|
222
|
+
|
224
223
|
begin
|
225
224
|
FileUtils.touch(path)
|
226
225
|
FileUtils.rm(path)
|
@@ -230,7 +229,7 @@ module Redcar
|
|
230
229
|
end
|
231
230
|
end
|
232
231
|
end
|
233
|
-
|
232
|
+
|
234
233
|
def delete(tree, _)
|
235
234
|
nodes = tree.selection
|
236
235
|
basenames = nodes.map {|node| File.basename(node.path) }
|
@@ -243,7 +242,7 @@ module Redcar
|
|
243
242
|
tree.refresh
|
244
243
|
end
|
245
244
|
end
|
246
|
-
|
245
|
+
|
247
246
|
def edited(tree, node, text)
|
248
247
|
new_path = File.expand_path(File.join(File.dirname(node.path), text))
|
249
248
|
return if node.path == new_path
|
@@ -254,9 +253,9 @@ module Redcar
|
|
254
253
|
new_node = DirMirror::Node.create_from_path(adapter, {:fullname => new_path, :type => node.type})
|
255
254
|
tree.select(new_node)
|
256
255
|
end
|
257
|
-
|
256
|
+
|
258
257
|
private
|
259
|
-
|
258
|
+
|
260
259
|
def uniq_name(path, name)
|
261
260
|
return name unless File.exist?(File.join(path, name))
|
262
261
|
i = 1
|
@@ -270,4 +269,4 @@ module Redcar
|
|
270
269
|
end
|
271
270
|
end
|
272
271
|
|
273
|
-
|
272
|
+
|