glimmer-cs-gladiator 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
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