glimmer-cs-gladiator 0.1.7 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18bd05231ab3815f4432ee79395284dbe6e5cd34244b1642b7bff4f7a3921c29
4
- data.tar.gz: f2b2a7d6faf0154d878a3c25944a9b3a59c256a45feaf5b2b975379b357f598b
3
+ metadata.gz: d1fedd5416ae759bea0cbfa6d14572cedd58f74d14c544a187efb9310c5954c3
4
+ data.tar.gz: fd0d141721cb77e391c6a07aea9bbb637d326c22374ffc5e2f157487116f59a2
5
5
  SHA512:
6
- metadata.gz: e82f4d0a5306bb03d767fa3dd1f7b23b970ba5fc5fbc87010c3388d2fcaec010134d3780d0fcc7d29b0c85113bb9f5c8daf8ef6284d4fc6b561064ccdd6ba88d
7
- data.tar.gz: fb7a4b16181113d96478f0458a6abebe7c85c6be6d1b3568b39f412d56e278641a58d61e6aea1c977246aa21433f6084da7787db38ae3ee322d1ff5b1f1109f9
6
+ metadata.gz: 19c5ae152d5bbe45f434c06da679b1779b844ad180cca79a945f4368d05bb50a2342ca5d085a1ad7c8b06b6aa5a97548c98d4487ee66f0b0be3f4a16089c7d74
7
+ data.tar.gz: 3acdffb642c32c894af12b9f4fa27f51a4b04eba7c13dbedc6a5c89e6dc97da7dd1cd79c3c93a75c2c0e7318866d3de33b58ad269ffee29b221632ff21b02348
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Gladiator (Glimmer Editor) 0.1.7 - Glimmer Custom Shell
1
+ # Gladiator (Glimmer Editor) 0.1.8 - Glimmer Custom Shell
2
2
  [![Gem Version](https://badge.fury.io/rb/glimmer-cs-gladiator.svg)](http://badge.fury.io/rb/glimmer-cs-gladiator)
3
3
 
4
4
  ![Gladiator](images/glimmer-gladiator.png)
@@ -35,8 +35,9 @@ Gladiator currently supports the following text editing features:
35
35
 
36
36
  ## Pre-requisites
37
37
 
38
- - JRuby 9.2.11.1 (supporting Ruby 2.5.x syntax) (find at https://www.jruby.org/download)
39
- - Java SE Runtime Environment 7 or higher (find at https://www.oracle.com/java/technologies/javase-downloads.html)
38
+ - [Glimmer](https://github.com/AndyObtiva/glimmer) (Ruby Desktop Development GUI Library): '>= 0.8.0', '< 2.0.0' (dependency included in Ruby gem).
39
+ - [JRuby](https://www.jruby.org/download): Same version required by [Glimmer](https://github.com/AndyObtiva/glimmer)
40
+ - [JDK](https://www.oracle.com/java/technologies/javase-downloads.html): Same version required by [Glimmer](https://github.com/AndyObtiva/glimmer)
40
41
 
41
42
  ## Setup Instructions
42
43
 
@@ -60,7 +61,7 @@ To reuse Gladiator as a Glimmer Custom Shell inside another Glimmer application,
60
61
  following to the application's `Gemfile`:
61
62
 
62
63
  ```
63
- gem 'glimmer-cs-gladiator', '0.1.7'
64
+ gem 'glimmer-cs-gladiator', '0.1.8'
64
65
  ```
65
66
 
66
67
  Run:
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.8
@@ -0,0 +1,75 @@
1
+ module Glimmer
2
+ class Gladiator
3
+ class Command
4
+ class << self
5
+ def command_history
6
+ @command_history ||= {}
7
+ end
8
+
9
+ def command_history_for(file)
10
+ # keeping a first command to make redo support work by remembering next command after undoing all
11
+ command_history[file] ||= [Command.new(file)]
12
+ end
13
+
14
+ def do(file, method = nil, command: nil)
15
+ command ||= Command.new(file, method)
16
+ command_history_for(file)&.last&.next_command = command
17
+ command.do
18
+ command_history_for(file) << command
19
+ end
20
+
21
+ def undo(file)
22
+ return if command_history_for(file).size <= 1
23
+ command_history_for(file).pop.undo
24
+ end
25
+
26
+ def redo(file)
27
+ command_history_for(file).last&.redo
28
+ end
29
+ end
30
+
31
+ attr_accessor :file, :method, :next_command, :previous_file_content, :previous_file_caret_position, :previous_file_selection_count
32
+
33
+ def initialize(file, method = nil)
34
+ @file = file
35
+ @method = method
36
+ end
37
+
38
+ def native?
39
+ @method.nil?
40
+ end
41
+
42
+ def do
43
+ return if native?
44
+ backup
45
+ execute
46
+ end
47
+
48
+ def undo
49
+ return if native?
50
+ restore
51
+ end
52
+
53
+ def redo
54
+ return if next_command.nil?# || next_command.native?
55
+ Command.do(next_command.file, command: next_command)
56
+ end
57
+
58
+ def backup
59
+ @previous_file_dirty_content = @file.dirty_content.clone
60
+ @previous_file_caret_position = @file.caret_position
61
+ @previous_file_selection_count = @file.selection_count
62
+ end
63
+
64
+ def restore
65
+ @file.dirty_content = @previous_file_dirty_content.clone
66
+ @file.caret_position = @previous_file_caret_position
67
+ @file.selection_count = @previous_file_selection_count
68
+ end
69
+
70
+ def execute
71
+ @file.send(@method)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -5,11 +5,12 @@ module Glimmer
5
5
  class File
6
6
  include Glimmer
7
7
 
8
- attr_accessor :line_numbers_content, :selection, :selection_count, :line_number, :find_text, :replace_text, :top_index, :path, :display_path
9
- attr_reader :name, :dirty_content
8
+ attr_accessor :dirty_content, :line_numbers_content, :selection, :selection_count, :line_number, :find_text, :replace_text, :top_index, :path, :display_path, :case_sensitive
9
+ attr_reader :name
10
10
 
11
11
  def initialize(path)
12
12
  raise "Not a file path: #{path}" unless ::File.file?(path)
13
+ @command_history = []
13
14
  @display_path = path
14
15
  @name = ::File.basename(path)
15
16
  @path = ::File.expand_path(path)
@@ -40,6 +41,16 @@ module Glimmer
40
41
  # no op in case of a binary file
41
42
  end
42
43
  end
44
+
45
+ # to use for widget data-binding
46
+ def content=(value)
47
+ Command.do(self) # record a native (OS-widget) operation
48
+ self.dirty_content = value
49
+ end
50
+
51
+ def content
52
+ dirty_content
53
+ end
43
54
 
44
55
  def caret_position=(value)
45
56
  self.selection = Point.new(value, value + selection_count.to_i)
@@ -64,6 +75,7 @@ module Glimmer
64
75
 
65
76
  def dirty_content=(the_content)
66
77
  @dirty_content = the_content if ::File.exist?(path)
78
+ notify_observers(:content)
67
79
  end
68
80
 
69
81
  def start_filewatcher
@@ -264,7 +276,7 @@ module Glimmer
264
276
  end
265
277
 
266
278
  def find_next
267
- return if find_text.to_s.empty?
279
+ return if find_text.to_s.empty?
268
280
  all_lines = lines
269
281
  the_line_index = line_index_for_caret_position(caret_position)
270
282
  line_position = line_position_for_caret_position(caret_position)
@@ -275,8 +287,8 @@ module Glimmer
275
287
  the_index = (the_index + rotation)%all_lines.size
276
288
  start_position = 0
277
289
  start_position = line_position + find_text.to_s.size if i == 0 && the_index == the_line_index && found_text?(caret_position)
278
- text_to_find_in = the_line.downcase[start_position..-1]
279
- occurrence_index = text_to_find_in&.index(find_text.to_s.downcase)
290
+ text_to_find_in = the_line[start_position..-1]
291
+ occurrence_index = case_sensitive ? text_to_find_in&.index(find_text.to_s) : text_to_find_in&.downcase&.index(find_text.to_s.downcase)
280
292
  if occurrence_index
281
293
  self.caret_position = caret_position_for_line_index(the_index) + start_position + occurrence_index
282
294
  self.selection_count = find_text.to_s.size
@@ -340,10 +352,12 @@ module Glimmer
340
352
  end
341
353
 
342
354
  def home
355
+ self.selection_count = 0
343
356
  self.line_number = 1
344
357
  end
345
358
 
346
359
  def end
360
+ self.selection_count = 0
347
361
  self.line_number = lines.size
348
362
  end
349
363
 
@@ -8,6 +8,7 @@ require 'os'
8
8
 
9
9
  require 'models/glimmer/gladiator/dir'
10
10
  require 'models/glimmer/gladiator/file'
11
+ require 'models/glimmer/gladiator/command'
11
12
 
12
13
  require 'views/glimmer/gladiator/text_editor'
13
14
 
@@ -37,7 +38,7 @@ module Glimmer
37
38
  @display = display {
38
39
  on_event_keydown { |key_event|
39
40
  if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'f'
40
- if @text_editor.text_widget.getSelectionText && @text_editor.text_widget.getSelectionText.size > 0
41
+ if @text_editor&.text_widget&.getSelectionText && @text_editor&.text_widget&.getSelectionText&.size.to_i > 0
41
42
  @find_text.swt_widget.setText @text_editor.text_widget.getSelectionText
42
43
  end
43
44
  @find_text.swt_widget.selectAll
@@ -54,7 +55,7 @@ module Glimmer
54
55
  @tab_item = @text_editor = Dir.local_dir.selected_child = nil
55
56
  @filter_text.swt_widget.selectAll
56
57
  @filter_text.swt_widget.setFocus
57
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && key_event.character == 8721
58
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :alt) && extract_char(key_event) == 'w'
58
59
  other_tab_items.each do |tab_item|
59
60
  Dir.local_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
60
61
  tab_item.getData('proxy').dispose
@@ -72,10 +73,10 @@ module Glimmer
72
73
  end
73
74
  end
74
75
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
75
- @tab_folder.swt_widget.setSelection([@tab_folder.swt_widget.getSelectionIndex() + 1, @tab_folder.swt_widget.getItemCount - 1].min) if @tab_folder.swt_widget.getItemCount > 0
76
+ @tab_folder.swt_widget.setSelection((@tab_folder.swt_widget.getSelectionIndex() + 1) % @tab_folder.swt_widget.getItemCount) if @tab_folder.swt_widget.getItemCount > 0
76
77
  @text_editor.text_widget.setFocus
77
78
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == '['
78
- @tab_folder.swt_widget.setSelection([@tab_folder.swt_widget.getSelectionIndex() - 1, 0].max) if @tab_folder.swt_widget.getItemCount > 0
79
+ @tab_folder.swt_widget.setSelection((@tab_folder.swt_widget.getSelectionIndex() - 1) % @tab_folder.swt_widget.getItemCount) if @tab_folder.swt_widget.getItemCount > 0
79
80
  @text_editor.text_widget.setFocus
80
81
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
81
82
  @tab_folder.swt_widget.setSelection(0) if @tab_folder.swt_widget.getItemCount >= 1
@@ -220,12 +221,11 @@ module Glimmer
220
221
  }
221
222
  }
222
223
  composite {
224
+ fill_layout(:vertical) {
225
+ spacing 5
226
+ }
223
227
  layout_data(:fill, :fill, true, true)
224
228
  @list = list(:border, :h_scroll, :v_scroll) {
225
- layout_data(:fill, :fill, true, true) {
226
- #exclude bind(Gladiator::Dir.local_dir, :filter) {|f| !f}
227
- minimum_height 400
228
- }
229
229
  #visible bind(Gladiator::Dir, 'local_dir.filter') {|f| !!f}
230
230
  selection bind(Gladiator::Dir.local_dir, :filtered_path)
231
231
  on_mouse_up {
@@ -234,14 +234,11 @@ module Glimmer
234
234
  on_key_pressed { |key_event|
235
235
  if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
236
236
  Gladiator::Dir.local_dir.selected_child_path = @list.swt_widget.getSelection.first
237
- @text_editor.text_widget.setFocus
237
+ @text_editor&.text_widget&.setFocus
238
238
  end
239
239
  }
240
240
  }
241
241
  @tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
242
- layout_data(:fill, :fill, true, true) {
243
- #exclude bind(Gladiator::Dir.local_dir, :filter) {|f| !!f}
244
- }
245
242
  #visible bind(Gladiator::Dir, 'local_dir.filter') {|f| !f}
246
243
  items bind(Gladiator::Dir, :local_dir), tree_properties(children: :children, text: :name)
247
244
  menu {
@@ -317,10 +314,13 @@ module Glimmer
317
314
  grid_layout 1, false
318
315
  layout_data :fill, :fill, true, true
319
316
  composite {
320
- grid_layout 2, false
317
+ grid_layout 3, false
318
+
319
+ # row 1
320
+
321
321
  @file_path_label = styled_text(:none) {
322
322
  layout_data(:fill, :fill, true, false) {
323
- horizontal_span 2
323
+ horizontal_span 3
324
324
  }
325
325
  background color(:widget_background)
326
326
  editable false
@@ -333,6 +333,9 @@ module Glimmer
333
333
  @file_path_label.swt_widget.setSelection(0, 0)
334
334
  }
335
335
  }
336
+
337
+ # row 2
338
+
336
339
  label {
337
340
  text 'Line:'
338
341
  }
@@ -343,13 +346,17 @@ module Glimmer
343
346
  text bind(Gladiator::Dir.local_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
344
347
  on_key_pressed { |key_event|
345
348
  if key_event.keyCode == swt(:cr)
346
- @text_editor.text_widget.setFocus
349
+ @text_editor&.text_widget&.setFocus
347
350
  end
348
351
  }
349
352
  on_verify_text { |event|
350
353
  event.doit = !event.text.match(/^\d*$/).to_a.empty?
351
354
  }
352
355
  }
356
+ label
357
+
358
+ # row 3
359
+
353
360
  label {
354
361
  text 'Find:'
355
362
  }
@@ -359,11 +366,32 @@ module Glimmer
359
366
  }
360
367
  text bind(Gladiator::Dir.local_dir, 'selected_child.find_text')
361
368
  on_key_pressed { |key_event|
369
+ if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
370
+ Dir.local_dir.selected_child.case_sensitive = !Dir.local_dir.selected_child.case_sensitive
371
+ Gladiator::Dir.local_dir.selected_child&.find_next
372
+ end
362
373
  if key_event.keyCode == swt(:cr)
363
- Gladiator::Dir.local_dir.selected_child.find_next
374
+ Gladiator::Dir.local_dir.selected_child&.find_next
364
375
  end
365
376
  }
366
377
  }
378
+ composite {
379
+ row_layout
380
+ button(:check) {
381
+ selection bind(Dir.local_dir, 'selected_child.case_sensitive')
382
+ on_key_pressed { |key_event|
383
+ if key_event.keyCode == swt(:cr)
384
+ Gladiator::Dir.local_dir.selected_child&.find_next
385
+ end
386
+ }
387
+ }
388
+ label {
389
+ text 'Case-sensitive'
390
+ }
391
+ }
392
+
393
+ # row 4
394
+
367
395
  label {
368
396
  text 'Replace:'
369
397
  }
@@ -373,14 +401,17 @@ module Glimmer
373
401
  }
374
402
  text bind(Gladiator::Dir.local_dir, 'selected_child.replace_text')
375
403
  on_focus_gained {
376
- Gladiator::Dir.local_dir.selected_child.ensure_find_next
404
+ Gladiator::Dir.local_dir.selected_child&.ensure_find_next
377
405
  }
378
406
  on_key_pressed { |key_event|
379
407
  if key_event.keyCode == swt(:cr)
380
- Gladiator::Dir.local_dir.selected_child.replace_next!
408
+ if Gladiator::Dir.local_dir.selected_child
409
+ Command.do(Gladiator::Dir.local_dir.selected_child, :replace_next!)
410
+ end
381
411
  end
382
412
  }
383
413
  }
414
+ label
384
415
  }
385
416
  @tab_folder = tab_folder {
386
417
  layout_data(:fill, :fill, true, true)
@@ -456,7 +487,7 @@ module Glimmer
456
487
  def delete_tree_item(tree_item)
457
488
  file = tree_item.getData
458
489
  parent_path = ::File.dirname(file.path)
459
- file.delete!
490
+ file.delete! # TODO consider supporting command undo/redo
460
491
  Dir.local_dir.refresh(async: false)
461
492
  parent_tree_item = @tree.depth_first_search {|ti| ti.getData.path == parent_path}.first
462
493
  @tree.swt_widget.showItem(parent_tree_item)
@@ -36,7 +36,7 @@ module Glimmer
36
36
  layout_data :fill, :fill, true, true
37
37
  font name: 'Consolas', height: OS.mac? ? 15 : 12
38
38
  foreground rgb(75, 75, 75)
39
- text bind(file, 'dirty_content')
39
+ text bind(file, :content)
40
40
  focus true
41
41
  selection bind(file, 'selection')
42
42
  selection_count bind(file, 'selection_count')
@@ -45,26 +45,30 @@ module Glimmer
45
45
  file&.write_dirty_content
46
46
  }
47
47
  on_key_pressed { |key_event|
48
- if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == '/'
49
- file.comment_line!
50
- key_event.doit = false
48
+ if (Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'z') || (key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'y')
49
+ key_event.doit = !Command.redo(file)
50
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'z'
51
+ key_event.doit = !Command.undo(file)
52
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == '/'
53
+ Command.do(file, :comment_line!)
54
+ key_event.doit = false
51
55
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'k'
52
- file.kill_line!
56
+ Command.do(file, :kill_line!)
53
57
  key_event.doit = false
54
58
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'd'
55
- file.duplicate_line!
59
+ Command.do(file, :duplicate_line!)
56
60
  key_event.doit = false
57
61
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == '['
58
- file.outdent!
62
+ Command.do(file, :outdent!)
59
63
  key_event.doit = false
60
64
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == ']'
61
- file.indent!
65
+ Command.do(file, :indent!)
62
66
  key_event.doit = false
63
67
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && key_event.keyCode == swt(:cr)
64
- file.prefix_new_line!
68
+ Command.do(file, :prefix_new_line!)
65
69
  key_event.doit = false
66
70
  elsif key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
67
- file.insert_new_line!
71
+ Command.do(file, :insert_new_line!)
68
72
  key_event.doit = false
69
73
  elsif key_event.keyCode == swt(:page_up)
70
74
  file.page_up
@@ -79,10 +83,10 @@ module Glimmer
79
83
  file.end
80
84
  key_event.doit = false
81
85
  elsif key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:arrow_up)
82
- file.move_up!
86
+ Command.do(file, :move_up!)
83
87
  key_event.doit = false
84
88
  elsif key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:arrow_down)
85
- file.move_down!
89
+ Command.do(file, :move_down!)
86
90
  key_event.doit = false
87
91
  end
88
92
  }
@@ -95,7 +99,7 @@ module Glimmer
95
99
  end
96
100
  when swt(:tab)
97
101
  if file.selection_count.to_i > 0
98
- file.indent!
102
+ Command.do(file, :indent!)
99
103
  verify_event.doit = false
100
104
  else
101
105
  verify_event.text = ' '
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-cs-gladiator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Maleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-02 00:00:00.000000000 Z
11
+ date: 2020-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 0.7.0
18
+ version: 0.8.0
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 2.0.0
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.7.0
29
+ version: 0.8.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 2.0.0
@@ -130,9 +130,11 @@ extra_rdoc_files:
130
130
  files:
131
131
  - LICENSE.txt
132
132
  - README.md
133
+ - VERSION
133
134
  - bin/gladiator
134
135
  - bin/gladiator_runner.rb
135
136
  - lib/glimmer-cs-gladiator.rb
137
+ - lib/models/glimmer/gladiator/command.rb
136
138
  - lib/models/glimmer/gladiator/dir.rb
137
139
  - lib/models/glimmer/gladiator/file.rb
138
140
  - lib/views/glimmer/gladiator.rb