redcar 0.5.5dev → 0.5.6dev

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/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- REDCAR_VERSION = "0.5.5dev" # also change in lib/redcar.rb!
1
+ REDCAR_VERSION = "0.5.6dev" # also change in lib/redcar.rb!
2
2
  require 'rubygems'
3
3
  require 'fileutils'
4
4
  require 'spec/rake/spectask'
@@ -51,7 +51,7 @@ end
51
51
  #
52
52
  # and so on.
53
53
  module Redcar
54
- VERSION = '0.5.5dev' # also change in the Rakefile!
54
+ VERSION = '0.5.6dev' # also change in the Rakefile!
55
55
  VERSION_MAJOR = 0
56
56
  VERSION_MINOR = 5
57
57
  VERSION_RELEASE = 0
@@ -1,14 +1,33 @@
1
-
1
+ require "open3"
2
+
2
3
  class JvmOptionsProbe
4
+
3
5
  def initialize
4
- @help = `java -help`
6
+ @d32 = @d64 = @client = false
7
+
8
+ if Redcar.platform == :windows
9
+ @help = `java -h`
10
+ @d32 = (@help == `java -d32`) ? true : false
11
+ @d64 = (@help == `java -d64`) ? true : false
12
+ @client = (@help == `java -client`) ? true : false
13
+ else
14
+ @help = Open3.popen3("java -h")[2].readlines
15
+ @d32 = (@help == Open3.popen3("java -d32")[2].readlines) ? true : false
16
+ @d64 = (@help == Open3.popen3("java -d64")[2].readlines) ? true : false
17
+ @client = (@help == Open3.popen3("java -client")[2].readlines) ? true : false
18
+ end
5
19
  end
6
-
20
+
7
21
  def can_use_d32?
8
- @help.include?("-d32")
22
+ @d32
9
23
  end
10
-
24
+
25
+ def can_use_d64?
26
+ @d64
27
+ end
28
+
11
29
  def can_use_client?
12
- @help.include?("-client")
30
+ @client
13
31
  end
14
- end
32
+ end
33
+
@@ -5,17 +5,17 @@ require 'auto_completer/word_iterator'
5
5
  require 'auto_completer/word_list'
6
6
 
7
7
  module Redcar
8
- class AutoCompleter
8
+ class AutoCompleter
9
9
  WORD_CHARACTERS = /\w|_/ # /(\s|\t|\.|\r|\(|\)|,|;)/
10
-
10
+
11
11
  def self.document_controller_types
12
12
  [AutoCompleter::DocumentController]
13
13
  end
14
-
14
+
15
15
  def self.autocompletion_source_types
16
16
  [AutoCompleter::CurrentDocumentCompletionSource]
17
17
  end
18
-
18
+
19
19
  def self.all_autocompletion_source_types
20
20
  result = []
21
21
  Redcar.plugin_manager.objects_implementing(:autocompletion_source_types).each do |object|
@@ -23,7 +23,23 @@ module Redcar
23
23
  end
24
24
  result
25
25
  end
26
-
26
+
27
+ #def self.edit_view_context_menus(offset)
28
+ # cmd = AutoCompleter::MenuAutoCompleterCommand.new
29
+ # cmd.merge_menu(offset)
30
+ # completions = cmd.run
31
+ # Menu::Builder.build do
32
+ # sub_menu "Auto Completion" do
33
+ # if completions
34
+ # completions.entries.each {|item| append item }
35
+ # else
36
+ # item "(No Suggestions)" do
37
+ # end
38
+ # end
39
+ # end
40
+ # end
41
+ #end
42
+
27
43
  def self.menus
28
44
  Menu::Builder.build do
29
45
  sub_menu "Edit" do
@@ -34,13 +50,13 @@ module Redcar
34
50
  end
35
51
  end
36
52
  end
37
-
53
+
38
54
  class AutoCompleteCommand < Redcar::EditTabCommand
39
-
55
+
40
56
  def execute
41
57
  controller = doc.controllers(AutoCompleter::DocumentController).first
42
58
  controller.start_modification
43
-
59
+
44
60
  if controller.in_completion?
45
61
  doc.delete(doc.cursor_offset - controller.length_of_previous, controller.length_of_previous)
46
62
  prefix = controller.prefix
@@ -57,7 +73,7 @@ module Redcar
57
73
  controller.right = right
58
74
  end
59
75
  end
60
-
76
+
61
77
  if prefix
62
78
  index = (controller.index || 0) + 1
63
79
  if word_list.completions.length == index
@@ -65,23 +81,23 @@ module Redcar
65
81
  end
66
82
  completion = word_list.completions[index]
67
83
  controller.index = index
68
-
84
+
69
85
  start_offset = right
70
86
  doc.insert(right, completion[prefix.length..-1])
71
87
  word_end_offset = right + completion.length - prefix.length
72
88
  doc.cursor_offset = word_end_offset
73
-
89
+
74
90
  controller.length_of_previous = completion.length - prefix.length
75
-
91
+
76
92
  controller.start_completion
77
93
  end
78
94
  controller.end_modification
79
95
  end
80
-
96
+
81
97
  private
82
-
98
+
83
99
  def alternatives(prefix)
84
- sources = AutoCompleter.all_autocompletion_source_types.map do |t|
100
+ sources = AutoCompleter.all_autocompletion_source_types.map do |t|
85
101
  t.new(doc, Project::Manager.focussed_project)
86
102
  end
87
103
  word_list = WordList.new
@@ -92,8 +108,8 @@ module Redcar
92
108
  end
93
109
  word_list
94
110
  end
95
-
96
- # returns the prefix that is being touched by the cursor and a range
111
+
112
+ # returns the prefix that is being touched by the cursor and a range
97
113
  # containing offsets of the prefix.
98
114
  def touched_prefix
99
115
  range = doc.current_word_range
@@ -103,10 +119,15 @@ module Redcar
103
119
  return prefix, left, right
104
120
  end
105
121
  end
106
-
122
+
107
123
  class MenuAutoCompleterCommand < AutoCompleteCommand
108
-
124
+
125
+ def merge_menu(offset)
126
+ @merge_menu = offset
127
+ end
128
+
109
129
  def execute
130
+ #TODO: something with offset?
110
131
  controller = doc.controllers(AutoCompleter::DocumentController).first
111
132
  input_word = ""
112
133
  word_list = controller.word_list
@@ -117,7 +138,7 @@ module Redcar
117
138
  controller.prefix = prefix
118
139
  controller.left = left
119
140
  controller.right = right
120
-
141
+
121
142
  cur_doc = doc
122
143
  builder = Menu::Builder.new do
123
144
  word_list.words.each do |current_word, word_distance|
@@ -128,12 +149,13 @@ module Redcar
128
149
  end
129
150
  end
130
151
  end
131
-
132
- Application::Dialog.popup_menu(builder.menu, :cursor)
152
+ if @merge_menu
153
+ builder.menu
154
+ else
155
+ Application::Dialog.popup_menu(builder.menu, :cursor)
156
+ end
133
157
  end
134
158
  end
135
159
  end
136
160
  end
137
161
  end
138
-
139
-
@@ -24,7 +24,7 @@ module Redcar
24
24
  include Redcar::Model
25
25
  extend Redcar::Observable
26
26
  include Redcar::Observable
27
-
27
+
28
28
  extend Forwardable
29
29
 
30
30
  module Handler
@@ -33,21 +33,21 @@ module Redcar
33
33
  def handle(edit_view, modifiers)
34
34
  end
35
35
  end
36
-
36
+
37
37
  class << self
38
38
  attr_reader :undo_sensitivity, :redo_sensitivity
39
39
  attr_reader :focussed_edit_view
40
40
  end
41
-
41
+
42
42
  def self.tab_settings
43
43
  @tab_settings ||= TabSettings.new
44
44
  end
45
45
 
46
- # unused?
46
+ # unused?
47
47
  def self.storage
48
48
  @storage ||= Plugin::Storage.new('edit_view_plugin')
49
49
  end
50
-
50
+
51
51
  def self.menus
52
52
  Menu::Builder.build do
53
53
  sub_menu "Edit" do
@@ -68,6 +68,29 @@ module Redcar
68
68
  end
69
69
  end
70
70
 
71
+ def self.edit_view_context_menus
72
+ Menu::Builder.build do
73
+ group(:priority => :first) do
74
+ item ("Cut" ) { Redcar::Top::CutCommand.new.run }
75
+ item ("Copy" ) { Redcar::Top::CopyCommand.new.run }
76
+ item ("Paste") { Redcar::Top::PasteCommand.new.run}
77
+ end
78
+ group(:priority => 20) do
79
+ separator
80
+ sub_menu "Convert Text" do
81
+ item ("to Uppercase") {EditView::UpcaseTextCommand.new.run}
82
+ item ("to Lowercase") {EditView::DowncaseTextCommand.new.run}
83
+ item ("to Titlecase") {EditView::TitlizeTextCommand.new.run}
84
+ item ("to Opposite Case") {EditView::OppositeCaseTextCommand.new.run}
85
+ separator
86
+ item ("to CamelCase") {EditView::CamelCaseTextCommand.new.run}
87
+ item ("to snake_case") {EditView::UnderscoreTextCommand.new.run}
88
+ item ("Toggle PascalCase-underscore-camelCase") {EditView::CamelSnakePascalRotateTextCommand.new.run}
89
+ end
90
+ end
91
+ end
92
+ end
93
+
71
94
  def self.all_handlers(type)
72
95
  result = []
73
96
  method_name = :"#{type}_handlers"
@@ -80,31 +103,31 @@ module Redcar
80
103
  def self.arrow_left_handlers
81
104
  [Actions::ArrowLeftHandler]
82
105
  end
83
-
106
+
84
107
  def self.arrow_right_handlers
85
108
  [Actions::ArrowRightHandler]
86
109
  end
87
-
110
+
88
111
  def self.tab_handlers
89
112
  [Actions::IndentTabHandler]
90
113
  end
91
-
114
+
92
115
  def self.backspace_handlers
93
116
  [Actions::BackspaceHandler]
94
117
  end
95
-
118
+
96
119
  def self.delete_handlers
97
120
  [Actions::DeleteHandler]
98
121
  end
99
-
122
+
100
123
  def self.esc_handlers
101
124
  [Actions::EscapeHandler]
102
125
  end
103
-
126
+
104
127
  def self.all_tab_handlers
105
128
  all_handlers(:tab)
106
129
  end
107
-
130
+
108
131
  def self.all_esc_handlers
109
132
  all_handlers(:esc)
110
133
  end
@@ -140,27 +163,27 @@ module Redcar
140
163
  def tab_pressed(modifiers)
141
164
  handle_key(EditView.all_tab_handlers, modifiers)
142
165
  end
143
-
166
+
144
167
  def esc_pressed(modifiers)
145
168
  handle_key(EditView.all_esc_handlers, modifiers)
146
169
  end
147
-
170
+
148
171
  def left_pressed(modifiers)
149
172
  handle_key(EditView.all_arrow_left_handlers, modifiers)
150
173
  end
151
-
174
+
152
175
  def right_pressed(modifiers)
153
176
  handle_key(EditView.all_arrow_right_handlers, modifiers)
154
177
  end
155
-
178
+
156
179
  def delete_pressed(modifiers)
157
180
  handle_key(EditView.all_delete_handlers, modifiers)
158
181
  end
159
-
182
+
160
183
  def backspace_pressed(modifiers)
161
184
  handle_key(EditView.all_backspace_handlers, modifiers)
162
185
  end
163
-
186
+
164
187
  # Called by the GUI whenever an EditView is focussed or
165
188
  # loses focus. Sends :focussed_edit_view event.
166
189
  #
@@ -174,14 +197,14 @@ module Redcar
174
197
  edit_view.check_for_updated_document if edit_view
175
198
  notify_listeners(:focussed_edit_view, edit_view)
176
199
  end
177
-
200
+
178
201
  def self.current
179
202
  tab = Redcar.app.focussed_window.focussed_notebook.focussed_tab
180
203
  if tab.is_a?(Redcar::EditTab)
181
204
  tab.edit_view
182
205
  end
183
206
  end
184
-
207
+
185
208
  def self.sensitivities
186
209
  [
187
210
  Sensitivity.new(:edit_tab_focussed, Redcar.app, false, [:tab_focussed]) do |tab|
@@ -196,12 +219,12 @@ module Redcar
196
219
  tab and tab.is_a?(EditTab) and tab.edit_view.document.selection?
197
220
  end
198
221
  end,
199
- @undo_sensitivity =
222
+ @undo_sensitivity =
200
223
  Sensitivity.new(:undoable, Redcar.app, false, [:focussed_tab_changed, :tab_focussed]) do
201
224
  tab = Redcar.app.focussed_window.focussed_notebook.focussed_tab
202
225
  tab and tab.is_a?(EditTab) and tab.edit_view.undoable?
203
226
  end,
204
- @redo_sensitivity =
227
+ @redo_sensitivity =
205
228
  Sensitivity.new(:redoable, Redcar.app, false, [:focussed_tab_changed, :tab_focussed]) do
206
229
  tab = Redcar.app.focussed_window.focussed_notebook.focussed_tab
207
230
  tab and tab.is_a?(EditTab) and tab.edit_view.redoable?
@@ -223,36 +246,36 @@ module Redcar
223
246
  default_font = "Courier New"
224
247
  default_font_size = 9
225
248
  end
226
- [ EditView.storage["font"] || default_font,
249
+ [ EditView.storage["font"] || default_font,
227
250
  EditView.storage["font-size"] || default_font_size ]
228
251
  end
229
-
252
+
230
253
  def self.font
231
254
  font_info[0]
232
255
  end
233
-
256
+
234
257
  def self.font_size
235
258
  font_info[1]
236
259
  end
237
-
260
+
238
261
  def self.font=(font)
239
262
  EditView.storage["font"] = font
240
263
  all_edit_views.each {|ev| ev.refresh_font }
241
- end
242
-
243
- def refresh_font
264
+ end
265
+
266
+ def refresh_font
244
267
  notify_listeners(:font_changed)
245
268
  end
246
-
269
+
247
270
  def self.font_size=(size)
248
271
  EditView.storage["font-size"] = size
249
272
  all_edit_views.each {|ev| ev.refresh_font }
250
273
  end
251
-
274
+
252
275
  def self.theme
253
276
  EditView.storage["theme"] || "Twilight"
254
277
  end
255
-
278
+
256
279
  def self.theme=(theme)
257
280
  theme.gsub!(/ \(Current\)$/, '')
258
281
  EditView.storage["theme"] = theme
@@ -265,55 +288,55 @@ module Redcar
265
288
  def self.themes
266
289
  @themes ||= []
267
290
  end
268
-
291
+
269
292
  def refresh_theme
270
293
  notify_listeners(:theme_changed)
271
294
  end
272
-
295
+
273
296
  def self.focussed_tab_edit_view
274
297
  Redcar.app.focussed_notebook_tab.edit_view if Redcar.app.focussed_notebook_tab and Redcar.app.focussed_notebook_tab.edit_tab?
275
298
  end
276
-
299
+
277
300
  def self.focussed_edit_view_document
278
301
  focussed_tab_edit_view.document if focussed_tab_edit_view
279
302
  end
280
-
303
+
281
304
  def self.focussed_document_mirror
282
305
  focussed_edit_view_document.mirror if focussed_edit_view_document
283
306
  end
284
-
307
+
285
308
  def self.all_edit_views
286
309
  Redcar.app.windows.map {|w| w.notebooks.map {|n| n.tabs}.flatten }.flatten.select {|t| t.is_a?(EditTab)}.map {|t| t.edit_view}
287
310
  end
288
-
311
+
289
312
  attr_reader :document
290
-
313
+
291
314
  def initialize
292
315
  create_document
293
316
  @grammar = nil
294
317
  @focussed = nil
295
318
  end
296
-
319
+
297
320
  def create_document
298
321
  @document = Redcar::Document.new(self)
299
322
  end
300
-
323
+
301
324
  def_delegators :controller, :undo, :redo,
302
325
  :undoable?, :redoable?,
303
326
  :reset_undo,
304
327
  :cursor_offset, :cursor_offset=,
305
328
  :scroll_to_line, :compound,
306
329
  :begin_compound, :end_compound
307
-
330
+
308
331
  def grammar
309
332
  @grammar
310
333
  end
311
-
334
+
312
335
  def grammar=(name)
313
336
  set_grammar(name)
314
337
  notify_listeners(:grammar_changed, name)
315
338
  end
316
-
339
+
317
340
  def set_grammar(name)
318
341
  @grammar = name
319
342
  self.tab_width = EditView.tab_settings.width_for(name)
@@ -325,11 +348,11 @@ module Redcar
325
348
  refresh_show_line_numbers
326
349
  refresh_show_annotations
327
350
  end
328
-
351
+
329
352
  def focus
330
353
  notify_listeners(:focussed)
331
354
  end
332
-
355
+
333
356
  def exists?
334
357
  controller.exists?
335
358
  end
@@ -337,57 +360,57 @@ module Redcar
337
360
  def tab_width
338
361
  @tab_width
339
362
  end
340
-
363
+
341
364
  def tab_width=(val)
342
365
  @tab_width = val
343
366
  EditView.tab_settings.set_width_for(grammar, val)
344
367
  notify_listeners(:tab_width_changed, val)
345
368
  end
346
-
369
+
347
370
  def set_tab_width(val)
348
371
  @tab_width = val
349
372
  end
350
-
373
+
351
374
  def soft_tabs?
352
375
  @soft_tabs
353
376
  end
354
-
377
+
355
378
  def soft_tabs=(bool)
356
379
  @soft_tabs = bool
357
380
  EditView.tab_settings.set_softness_for(grammar, bool)
358
381
  notify_listeners(:softness_changed, bool)
359
382
  end
360
-
383
+
361
384
  def show_margin?
362
385
  @show_margin
363
386
  end
364
-
387
+
365
388
  def show_margin=(bool)
366
389
  @show_margin = bool
367
390
  EditView.tab_settings.set_show_margin_for(grammar, bool)
368
391
  notify_listeners(:show_margin_changed, bool)
369
392
  end
370
-
393
+
371
394
  def word_wrap?
372
395
  @word_wrap
373
396
  end
374
-
397
+
375
398
  def word_wrap=(bool)
376
399
  @word_wrap = bool
377
400
  EditView.tab_settings.set_word_wrap_for(grammar, bool)
378
401
  notify_listeners(:word_wrap_changed, bool)
379
402
  end
380
-
403
+
381
404
  def margin_column
382
405
  @margin_column
383
406
  end
384
-
407
+
385
408
  def margin_column=(val)
386
409
  @margin_column = val
387
410
  EditView.tab_settings.set_margin_column_for(grammar, val)
388
411
  notify_listeners(:margin_column_changed, val)
389
412
  end
390
-
413
+
391
414
  def show_invisibles?
392
415
  @show_invisibles
393
416
  end
@@ -400,7 +423,7 @@ module Redcar
400
423
  EditView.tab_settings.set_show_invisibles(bool)
401
424
  all_edit_views.each {|ev| ev.refresh_show_invisibles }
402
425
  end
403
-
426
+
404
427
  def refresh_show_invisibles
405
428
  @show_invisibles = EditView.tab_settings.show_invisibles?
406
429
  notify_listeners(:invisibles_changed, @show_invisibles)
@@ -418,7 +441,7 @@ module Redcar
418
441
  EditView.tab_settings.set_show_line_numbers(bool)
419
442
  all_edit_views.each {|ev| ev.refresh_show_line_numbers }
420
443
  end
421
-
444
+
422
445
  def refresh_show_line_numbers
423
446
  @show_line_numbers = EditView.tab_settings.show_line_numbers?
424
447
  notify_listeners(:line_number_visibility_changed, @show_line_numbers)
@@ -436,7 +459,7 @@ module Redcar
436
459
  EditView.tab_settings.set_show_annotations(bool)
437
460
  all_edit_views.each {|ev| ev.refresh_show_annotations }
438
461
  end
439
-
462
+
440
463
  def refresh_show_annotations
441
464
  @show_annotations = EditView.tab_settings.show_annotations?
442
465
  notify_listeners(:annotations_visibility_changed, @show_annotations)
@@ -451,30 +474,30 @@ module Redcar
451
474
  :cursor_offset => cursor_offset,
452
475
  :grammar => grammar }
453
476
  end
454
-
477
+
455
478
  def deserialize(data)
456
479
  self.grammar = data[:grammar]
457
480
  document.text = data[:contents]
458
481
  self.cursor_offset = data[:cursor_offset]
459
482
  end
460
-
483
+
461
484
  def delay_parsing
462
485
  controller.delay_parsing { yield }
463
486
  end
464
-
487
+
465
488
  def reset_last_checked
466
489
  @last_checked = Time.now
467
490
  end
468
-
491
+
469
492
  def check_for_updated_document
470
493
  # awful forward dependency on the Project plugin here....
471
- if document and
472
- document.mirror and
473
- document.mirror.is_a?(Project::FileMirror) and
494
+ if document and
495
+ document.mirror and
496
+ document.mirror.is_a?(Project::FileMirror) and
474
497
  document.mirror.changed_since?(@last_checked)
475
498
  if document.modified?
476
499
  result = Application::Dialog.message_box(
477
- "This file has been changed on disc, and you have unsaved changes in Redcar.\n\n" +
500
+ "This file has been changed on disc, and you have unsaved changes in Redcar.\n\n" +
478
501
  "Revert to version on disc (and lose your changes)?",
479
502
  :buttons => :yes_no
480
503
  )
@@ -489,5 +512,4 @@ module Redcar
489
512
  @last_checked = Time.now
490
513
  end
491
514
  end
492
- end
493
-
515
+ end