redcar 0.7 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/CHANGES +42 -0
  2. data/README.md +5 -3
  3. data/Rakefile +39 -81
  4. data/bin/redcar +1 -1
  5. data/lib/redcar.rb +9 -6
  6. data/lib/redcar/installer.rb +1 -1
  7. data/lib/redcar/ruby_extensions.rb +19 -0
  8. data/lib/redcar/runner.rb +1 -1
  9. data/lib/redcar/usage.rb +3 -0
  10. data/lib/redcar_quick_start.rb +11 -11
  11. data/plugins/application/features/step_definitions/tree_steps.rb +22 -5
  12. data/plugins/application/features/step_definitions/window_steps.rb +9 -1
  13. data/plugins/application/features/support/env.rb +5 -2
  14. data/plugins/application/lib/application.rb +51 -46
  15. data/plugins/application/lib/application/window.rb +60 -30
  16. data/plugins/application_swt/lib/application_swt.rb +16 -16
  17. data/plugins/application_swt/lib/application_swt/window.rb +35 -7
  18. data/plugins/auto_completer/features/support/env.rb +0 -2
  19. data/plugins/auto_indenter/features/support/env.rb +0 -1
  20. data/plugins/auto_pairer/features/auto_pairer.feature +50 -45
  21. data/plugins/auto_pairer/features/support/env.rb +0 -1
  22. data/plugins/auto_pairer/lib/auto_pairer/document_controller.rb +11 -6
  23. data/plugins/clipboard-viewer/Screenshot.png +0 -0
  24. data/plugins/clipboard-viewer/lib/clipboard_viewer.rb +50 -0
  25. data/plugins/clipboard-viewer/lib/clipboard_viewer/browser_controller.rb +27 -0
  26. data/plugins/clipboard-viewer/lib/clipboard_viewer/clipboard_bar.rb +67 -0
  27. data/plugins/clipboard-viewer/plugin.rb +9 -0
  28. data/plugins/clipboard-viewer/views/clipboard.html.erb +15 -0
  29. data/plugins/clipboard-viewer/views/default.css +43 -0
  30. data/plugins/clipboard-viewer/views/redcar_small_icon.png +0 -0
  31. data/plugins/comment/features/line_comment.feature +137 -0
  32. data/plugins/comment/features/selection_comment.feature +21 -0
  33. data/plugins/comment/features/step_definitions/comment_steps.rb +7 -0
  34. data/plugins/comment/lib/comment.rb +266 -0
  35. data/plugins/comment/plugin.rb +7 -0
  36. data/plugins/comment/vendor/comment_lib.json +47 -0
  37. data/plugins/declarations/lib/declarations.rb +1 -1
  38. data/plugins/document_search/features/replace.feature +10 -2
  39. data/plugins/document_search/features/support/env.rb +0 -1
  40. data/plugins/document_search/lib/document_search.rb +4 -1
  41. data/plugins/document_search/lib/document_search/replace.rb +11 -3
  42. data/plugins/document_search/lib/document_search/search_and_replace.rb +5 -2
  43. data/plugins/edit_view/features/case_change.feature +9 -9
  44. data/plugins/edit_view/features/cursor_navigation.feature +36 -0
  45. data/plugins/edit_view/features/step_definitions/editing_steps.rb +63 -8
  46. data/plugins/edit_view/features/step_definitions/notebook_steps.rb +2 -0
  47. data/plugins/edit_view/features/step_definitions/tab_steps.rb +8 -5
  48. data/plugins/edit_view/features/support/env.rb +8 -2
  49. data/plugins/edit_view/lib/edit_view.rb +16 -1
  50. data/plugins/edit_view/lib/edit_view/actions/cmd_enter.rb +11 -0
  51. data/plugins/edit_view/lib/edit_view/document.rb +27 -10
  52. data/plugins/edit_view/lib/edit_view/edit_tab.rb +17 -4
  53. data/plugins/edit_view/spec/edit_view/document_spec.rb +3 -0
  54. data/plugins/edit_view_swt/lib/edit_view_swt.rb +42 -3
  55. data/plugins/edit_view_swt/lib/edit_view_swt/word_movement.rb +17 -15
  56. data/plugins/help/lib/help.rb +40 -0
  57. data/plugins/help/plugin.rb +8 -0
  58. data/plugins/html_view/features/step_definitions/html_view_steps.rb +6 -4
  59. data/plugins/line_tools/features/support/env.rb +0 -1
  60. data/plugins/macros/features/step_definitions/macro_steps.rb +0 -55
  61. data/plugins/macros/features/support/env.rb +0 -2
  62. data/plugins/open_default_app/lib/open_default_app.rb +35 -0
  63. data/plugins/open_default_app/plugin.rb +8 -0
  64. data/plugins/open_default_app/screenshot.png +0 -0
  65. data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +17 -3
  66. data/plugins/project/features/find_file.feature +3 -2
  67. data/plugins/project/features/highlight_focussed_tab.feature +8 -0
  68. data/plugins/project/features/move_and_rename_files.feature +25 -0
  69. data/plugins/project/features/open_and_save_files.feature +10 -1
  70. data/plugins/project/features/open_directory_tree.feature +32 -2
  71. data/plugins/project/features/step_definitions/directory_steps.rb +17 -0
  72. data/plugins/project/features/step_definitions/project_tree_steps.rb +3 -0
  73. data/plugins/project/features/sub_project.feature +14 -0
  74. data/plugins/project/features/support/env.rb +22 -3
  75. data/plugins/project/features/watch_for_modified_files.feature +32 -9
  76. data/plugins/project/lib/project.rb +53 -21
  77. data/plugins/project/lib/project/adapters/local.rb +21 -16
  78. data/plugins/project/lib/project/adapters/remote.rb +15 -13
  79. data/plugins/project/lib/project/commands.rb +37 -16
  80. data/plugins/project/lib/project/dir_controller.rb +41 -42
  81. data/plugins/project/lib/project/drb_service.rb +35 -21
  82. data/plugins/project/lib/project/file_list.rb +7 -1
  83. data/plugins/project/lib/project/manager.rb +28 -3
  84. data/plugins/project/lib/project/sub_project.rb +17 -0
  85. data/plugins/project/lib/project/support/recycle.js +2 -0
  86. data/plugins/project/lib/project/support/trash.rb +72 -0
  87. 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
  88. 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
  89. data/plugins/project/spec/project/file_list_spec.rb +4 -0
  90. data/plugins/redcar/features/goto_line_command.feature +20 -0
  91. data/plugins/redcar/redcar.rb +107 -47
  92. data/plugins/repl/lib/repl.rb +20 -20
  93. data/plugins/repl/lib/repl/clojure_mirror.rb +50 -58
  94. data/plugins/repl/lib/repl/groovy_mirror.rb +22 -41
  95. data/plugins/repl/lib/repl/repl_mirror.rb +85 -14
  96. data/plugins/repl/lib/repl/ruby_mirror.rb +12 -39
  97. data/plugins/repl/spec/repl/groovy_mirror_spec.rb +1 -1
  98. data/plugins/repl/spec/repl/ruby_mirror_spec.rb +12 -12
  99. data/plugins/ruby/README +6 -0
  100. data/plugins/ruby/lib/syntax_check/ruby.rb +28 -0
  101. data/plugins/ruby/plugin.rb +7 -0
  102. data/plugins/runnables/features/command_tree.feature +9 -0
  103. data/plugins/runnables/features/file_runner_input.feature +20 -0
  104. data/plugins/runnables/features/run_alternate_command.feature +14 -0
  105. data/plugins/runnables/features/support/env.rb +42 -5
  106. data/plugins/runnables/lib/runnables.rb +67 -21
  107. data/plugins/runnables/lib/runnables/commands.rb +35 -18
  108. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_group.rb +23 -37
  109. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_type_group.rb +16 -18
  110. data/plugins/scm_svn/features/support/env.rb +0 -3
  111. data/plugins/snippets/features/snippets.feature +17 -2
  112. data/plugins/snippets/features/support/env.rb +0 -1
  113. data/plugins/snippets/lib/snippets/tab_handler.rb +51 -18
  114. data/plugins/swt/lib/swt/cucumber_patches.rb +13 -68
  115. data/plugins/swt/lib/swt/cucumber_runner.rb +2 -3
  116. data/plugins/syntax_check/README +6 -0
  117. data/plugins/syntax_check/lib/syntax_check.rb +16 -0
  118. data/plugins/syntax_check/lib/syntax_check/checker.rb +47 -0
  119. data/plugins/syntax_check/lib/syntax_check/error.rb +23 -0
  120. data/plugins/syntax_check/plugin.rb +7 -0
  121. data/plugins/tree_view_swt/lib/tree_view_swt.rb +6 -0
  122. data/plugins/web_bookmarks/Screenshot.png +0 -0
  123. data/plugins/web_bookmarks/lib/web_bookmarks.rb +42 -0
  124. data/plugins/web_bookmarks/lib/web_bookmarks/bookmark.rb +43 -0
  125. data/plugins/web_bookmarks/lib/web_bookmarks/browser_bar.rb +70 -0
  126. data/plugins/web_bookmarks/lib/web_bookmarks/commands.rb +111 -0
  127. data/plugins/web_bookmarks/lib/web_bookmarks/tree.rb +67 -0
  128. data/plugins/web_bookmarks/lib/web_bookmarks/view_controller.rb +22 -0
  129. data/plugins/web_bookmarks/plugin.rb +11 -0
  130. data/plugins/web_bookmarks/views/index.html.erb +5 -0
  131. metadata +60 -10
@@ -140,36 +140,36 @@ module Redcar
140
140
  @model.add_listener(:refresh_menu, &method(:refresh_menu))
141
141
  end
142
142
 
143
- class Listener
143
+ class CocoaUIListener
144
+
144
145
  def initialize(name)
145
146
  @name = name
146
147
  end
147
148
 
148
149
  def handle_event(e)
149
- Application::Dialog.message_box("#{@name} menu is not hooked up yet")
150
- end
151
- end
152
-
153
- class QuitListener
154
- def handle_event(e)
155
- unless Redcar.app.events.ignore?(:application_close, Redcar.app)
156
- e.doit = false
157
- Redcar.app.events.create(:application_close, Redcar.app)
150
+ if @name == :prefs
151
+ Redcar::PluginManagerUi::OpenPreferencesCommand.new.run
152
+ elsif @name == :about
153
+ Redcar::Top::AboutCommand.new.run
154
+ elsif @name == :quit
155
+ unless Redcar.app.events.ignore?(:application_close, Redcar.app)
156
+ e.doit = false
157
+ Redcar.app.events.create(:application_close, Redcar.app)
158
+ end
159
+ else
160
+ Application::Dialog.message_box("#{@name} menu is not hooked up yet")
158
161
  end
159
162
  end
160
163
  end
161
164
 
162
165
  def add_swt_listeners
163
166
  if Redcar.platform == :osx
164
- quit_listener = Listener.new(:quit)
165
- about_listener = Listener.new(:about)
166
- prefs_listener = Listener.new(:prefs)
167
167
  enhancer = com.redcareditor.application_swt.CocoaUIEnhancer.new("Redcar")
168
168
  enhancer.hook_application_menu(
169
169
  ApplicationSWT.display,
170
- QuitListener.new,
171
- about_listener,
172
- prefs_listener
170
+ CocoaUIListener.new(:quit),
171
+ CocoaUIListener.new(:about),
172
+ CocoaUIListener.new(:prefs)
173
173
  )
174
174
  end
175
175
  end
@@ -64,8 +64,10 @@ module Redcar
64
64
  @window.add_listener(:speedbar_opened, &method(:speedbar_opened))
65
65
  @window.add_listener(:speedbar_closed, &method(:speedbar_closed))
66
66
 
67
+ @window.add_listener(:toggle_trees_visible, &method(:toggle_sash_widths))
68
+
67
69
  @window.treebook.add_listener(:tree_added) do
68
- if @treebook_unopened
70
+ if @treebook_unopened or not @window.trees_visible?
69
71
  reset_sash_widths
70
72
  @treebook_unopened = false
71
73
  end
@@ -77,6 +79,18 @@ module Redcar
77
79
  @shell.add_key_listener(KeyListener.new(self))
78
80
  end
79
81
 
82
+ def treebook_visible?
83
+ @sash.layout_data.left.offset > SASH_WIDTH
84
+ end
85
+
86
+ def fullscreen
87
+ @shell.fullScreen()
88
+ end
89
+
90
+ def fullscreen=(value)
91
+ @shell.setFullScreen(value)
92
+ end
93
+
80
94
  class KeyListener
81
95
  def initialize(edit_view_swt)
82
96
  @edit_view_swt = edit_view_swt
@@ -118,11 +132,11 @@ module Redcar
118
132
 
119
133
  def refresh_menu
120
134
  old_menu_bar = shell.menu_bar
121
- @menu_controller = ApplicationSWT::Menu.new(self, Redcar.app.main_menu, Redcar.app.main_keymap, Swt::SWT::BAR)
135
+ @menu_controller = ApplicationSWT::Menu.new(self, Redcar.app.main_menu(@window), Redcar.app.main_keymap, Swt::SWT::BAR)
122
136
  shell.menu_bar = @menu_controller.menu_bar
123
137
  old_menu_bar.dispose if old_menu_bar
124
138
  end
125
-
139
+
126
140
  def refresh_toolbar
127
141
  if Redcar.app.show_toolbar?
128
142
  @toolbar_controller = ApplicationSWT::ToolBar.new(self, Redcar.app.main_toolbar, Swt::SWT::HORIZONTAL | Swt::SWT::BORDER)
@@ -134,7 +148,7 @@ module Redcar
134
148
  end
135
149
  reset_sash_height
136
150
  end
137
-
151
+
138
152
  def set_icon
139
153
  path = File.join(icon_dir, icon_file)
140
154
  icon = Swt::Graphics::Image.new(ApplicationSWT.display, path)
@@ -323,20 +337,34 @@ module Redcar
323
337
  @shell.layout
324
338
  end
325
339
 
340
+ def toggle_sash_widths
341
+ if not treebook_visible?
342
+ reset_sash_widths
343
+ else
344
+ @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, 0)
345
+ @shell.layout
346
+ end
347
+ end
348
+
349
+ def set_sash_widths(offset)
350
+ @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, offset)
351
+ @shell.layout
352
+ end
353
+
326
354
  def reset_notebook_sash_widths
327
355
  width = (100/@window.notebooks.length).to_i
328
356
  widths = [width]*@window.notebooks.length
329
357
  @notebook_sash.setWeights(widths.to_java(:int))
330
358
  end
331
-
359
+
332
360
  def reset_sash_height
333
361
  @sash.layout_data.top = Swt::Layout::FormAttachment.new(0, @toolbar_height.to_i)
334
362
  @left_composite.layout_data.top = Swt::Layout::FormAttachment.new(0, 5 + @toolbar_height.to_i)
335
363
  @right_composite.layout_data.top = Swt::Layout::FormAttachment.new(0, 5 + @toolbar_height.to_i)
336
- @shell.layout
364
+ @shell.layout
337
365
  @shell.redraw
338
366
  end
339
-
367
+
340
368
  end
341
369
  end
342
370
  end
@@ -1,4 +1,2 @@
1
1
 
2
- RequireSupportFiles File.dirname(__FILE__) + "/../../../edit_view/features/"
3
-
4
2
 
@@ -1,2 +1 @@
1
1
 
2
- RequireSupportFiles File.dirname(__FILE__) + "/../../../edit_view/features/"
@@ -1,86 +1,91 @@
1
1
  Feature: Automatically insert paired characters
2
- # This isn't a proper test because I haven't found a way to simulate
3
- # a keypress so that text is inserted and the cursor moves. Therefore these
4
- # tests assume that the cursor may be in the wrong place at any moment.
5
2
 
6
3
  Scenario: Inserts quote marks
7
4
  When I open a new edit tab
8
- And I insert "\"" at the cursor
9
- Then the contents should be "\"\""
5
+ And I type "\""
6
+ Then the contents should be "\"<c>\""
7
+
8
+ Scenario: Don't insert quote mark if we're already open
9
+ When I open a new edit tab
10
+ And I replace the contents with "foo \" bár q"
11
+ And I move to the end of the line
12
+ And I move left
13
+ When I type "\""
14
+ Then the contents should be "foo \" bár \"q"
10
15
 
11
16
  Scenario: Inserts parentheses
12
17
  When I open a new edit tab
13
- And I insert "(" at the cursor
14
- Then the contents should be "()"
18
+ And I type "("
19
+ Then the contents should be "(<c>)"
15
20
 
16
21
  Scenario: Delete start character (quotes)
17
22
  When I open a new edit tab
18
- And I insert "\"" at the cursor
19
- And I move the cursor to 1
20
- And I press the Backspace key in the edit tab
23
+ And I type "\""
24
+ And I backspace
21
25
  Then the contents should be ""
22
26
 
23
27
  Scenario: Delete start character (parentheses)
24
28
  When I open a new edit tab
25
- And I insert "(" at the cursor
26
- And I move the cursor to 1
27
- And I press the Backspace key in the edit tab
29
+ And I type "("
30
+ And I backspace
28
31
  Then the contents should be ""
29
32
 
30
33
  Scenario: Type over ends
31
34
  When I open a new edit tab
32
- And I insert "(" at the cursor
33
- And I move the cursor to 1
34
- And I insert ")" at the cursor
35
- Then the contents should be "()"
35
+ And I type "("
36
+ And I type ")"
37
+ Then the contents should be "()<c>"
36
38
 
37
39
  Scenario: Wrap selected text
38
40
  When I open a new edit tab
39
- And I insert "Boris" at the cursor
41
+ And I type "Boris"
40
42
  And I select from 0 to 5
41
- And I replace 0 to 5 with "("
42
- Then the contents should be "(Boris)"
43
+ And I type "("
44
+ Then the contents should be "(Boris)<c>"
43
45
 
44
46
  Scenario: Inserts ending character nested
45
47
  When I open a new edit tab
46
- And I insert "\"" at 0
47
- And I insert "(" at 1
48
- Then the contents should be "\"()\""
48
+ And I type "\""
49
+ And I type "("
50
+ Then the contents should be "\"(<c>)\""
49
51
 
50
52
  Scenario: Delete start character nested
51
53
  When I open a new edit tab
52
- And I insert "\"" at 0
53
- And I insert "(" at 1
54
- And I move the cursor to 2
55
- And I press the Backspace key in the edit tab
56
- Then the contents should be "\"\""
57
- And I move the cursor to 1
58
- And I press the Backspace key in the edit tab
54
+ And I type "\""
55
+ And I type "("
56
+ And I backspace
57
+ Then the contents should be "\"<c>\""
58
+ When I backspace
59
59
  Then the contents should be ""
60
60
 
61
61
  Scenario: Type over ends nested
62
62
  When I open a new edit tab
63
- And I insert "(" at 0
64
- And I insert "\"" at 1
65
- And I insert "\"" at 2
66
- And I insert ")" at 3
67
- Then the contents should be "(\"\")"
63
+ And I type "("
64
+ And I type "\""
65
+ And I type "\""
66
+ And I type ")"
67
+ Then the contents should be "(\"\")<c>"
68
68
 
69
69
  Scenario: Don't delete start character if moved away
70
70
  When I open a new edit tab
71
- And I replace the contents with "0123456789"
72
- And I insert "(" at 0
73
- And I move the cursor to 5
74
- And I move the cursor to 1
75
- And I press the Backspace key in the edit tab
76
- Then the contents should be ")0123456789"
71
+ And I type "0123456789"
72
+ And I move to the start of the line
73
+ And I type "("
74
+ And I move to the end of the line
75
+ And I move to the start of the line
76
+ And I move right
77
+ And I backspace
78
+ Then the contents should be "<c>)0123456789"
77
79
 
78
80
  Scenario: Don't type over end if moved away
79
81
  When I open a new edit tab
80
- And I replace the contents with "0123456789"
81
- And I insert "(" at 0
82
- And I move the cursor to 5
83
- And I insert ")" at 1
82
+ And I type "0123456789"
83
+ And I move to the start of the line
84
+ And I type "("
85
+ And I move to the end of the line
86
+ And I move to the start of the line
87
+ And I move right
88
+ And I type ")"
84
89
  Then the contents should be "())0123456789"
85
90
 
86
91
 
@@ -1,2 +1 @@
1
1
 
2
- RequireSupportFiles File.dirname(__FILE__) + "/../../../edit_view/features/"
@@ -85,16 +85,21 @@ module Redcar
85
85
  end_mark_pair = find_mark_pair_by_end(start_offset)
86
86
  if end_mark_pair and end_mark_pair.text == text
87
87
  @type_over_end = true
88
- #@buffer.parser.stop_parsing
89
88
  end
90
89
  end
91
90
  # Insert matching ends
92
- if !@type_over_end and @rules.include?(text) and !@ignore_insert and !@done
93
- @insert_end = true
94
- if document.selection?
95
- @selected_text = document.selected_text
91
+ if !@type_over_end and @rules.include?(text) and !@ignore_insert and !@done and
92
+ line_num = document.line_at_offset(start_offset)
93
+ line = document.get_line(line_num)
94
+ offset_of_line = document.offset_at_line(line_num)
95
+ pre_text = line.chars[0..(start_offset-offset_of_line)].to_s
96
+ equal_ends = (@rules[text] == text)
97
+ if !equal_ends or pre_text.scan(text).length % 2 == 0
98
+ @insert_end = true
99
+ if document.selection?
100
+ @selected_text = document.selected_text
101
+ end
96
102
  end
97
- # @buffer.parser.stop_parsing
98
103
  end
99
104
  end
100
105
  end
@@ -0,0 +1,50 @@
1
+
2
+ require 'clipboard_viewer/clipboard_bar'
3
+ require 'clipboard_viewer/browser_controller'
4
+
5
+ module Redcar
6
+ class ClipboardViewer
7
+
8
+ def self.menus
9
+ Redcar::Menu::Builder.build do
10
+ sub_menu "Plugins" do
11
+ sub_menu "Clipboard" do
12
+ item "Clipboard Viewer Bar", :command => OpenClipboardBar , :priority => 18
13
+ item "Clipboard Browser" , :command => OpenClipboardBrowser, :priority => 18
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.storage
20
+ @storage ||= begin
21
+ storage = Plugin::Storage.new('clipboard_viewer')
22
+ storage.set_default('chars_to_display', 50)
23
+ storage.set_default('lines_to_display', 3)
24
+ storage
25
+ end
26
+ end
27
+
28
+ class OpenClipboardBar < Redcar::Command
29
+ def execute
30
+ window = Redcar.app.focussed_window
31
+ speedbar = Redcar::ClipboardViewer::ClipboardBar.new
32
+ window.open_speedbar(speedbar)
33
+ end
34
+ end
35
+
36
+ class OpenClipboardBrowser < Redcar::Command
37
+
38
+ def initialize(list=Redcar.app.clipboard)
39
+ @list = list || []
40
+ end
41
+
42
+ def execute
43
+ controller = BrowserController.new(@list)
44
+ tab = win.new_tab(HtmlTab)
45
+ tab.html_view.controller = controller
46
+ tab.focus
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+
2
+ module Redcar
3
+ class ClipboardViewer
4
+ class BrowserController
5
+ include HtmlController
6
+
7
+ def initialize(list)
8
+ @list = list.to_a.reverse
9
+ end
10
+
11
+ def title
12
+ "Clipboard History"
13
+ end
14
+
15
+ def copy(idx)
16
+ text = @list[idx]
17
+ Redcar.app.clipboard >> text if text
18
+ false
19
+ end
20
+
21
+ def index
22
+ rhtml = ERB.new(File.read(File.join(File.dirname(__FILE__), "..","..", "views", "clipboard.html.erb")))
23
+ rhtml.result(binding)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,67 @@
1
+ module Redcar
2
+ class ClipboardViewer
3
+ class ClipboardBar < Redcar::Speedbar
4
+ include Redcar::Observable
5
+
6
+ def initialize
7
+ @size = ClipboardViewer.storage['chars_to_display'].to_i
8
+ @line_limit = ClipboardViewer.storage['lines_to_display'].to_i
9
+ load_list
10
+ @listener = Redcar.app.clipboard.add_listener(:added) {|t|load_list}
11
+ end
12
+
13
+ def close
14
+ Redcar.app.clipboard.remove_listener(@listener)
15
+ end
16
+
17
+ def load_list
18
+ @list = Redcar.app.clipboard || []
19
+ values = display_values(@list)
20
+ if values.length > 0
21
+ clip_list.items = values
22
+ clip_list.value = values.first
23
+ else
24
+ clip_list.items = [" "*(@size+5)]
25
+ clip_list.value = clip_list.items.first
26
+ end
27
+ end
28
+
29
+ combo :clip_list
30
+ button :paste_selected, "Paste!", "Return" do
31
+ tab = Redcar.app.focussed_window.focussed_notebook_tab
32
+ content = @list.to_a.reverse.detect do |r|
33
+ l = r.to_s
34
+ val = clip_list.value.to_s
35
+ val = val[0,val.length-3] if val =~ /\.\.\.$/
36
+ l.length >= val.length and l[0,val.length].to_s == val.to_s
37
+ end
38
+ tab.edit_view.document.insert_at_cursor(content.to_s) if tab.is_a?(EditTab) and content
39
+ load_list
40
+ end
41
+
42
+ button :browse, "Browse", nil do
43
+ OpenClipboardBrowser.new(@list).run
44
+ end
45
+
46
+ def display_values(list)
47
+ display = list.to_a.reverse.map do |l|
48
+ value = ""
49
+ r=0
50
+ l.to_s.each_line do |line|
51
+ value += line if r <= @line_limit - 1
52
+ value += "..." if r == @line_limit
53
+ r+=1
54
+ break if r > @line_limit - 1
55
+ end
56
+ value = value[0,value.length-1] if value =~ /\n$/
57
+ if value.length > @size
58
+ value[0,@size]+"..."
59
+ else
60
+ value
61
+ end
62
+ end
63
+ display || []
64
+ end
65
+ end
66
+ end
67
+ end