glimmer-cs-gladiator 0.1.2 → 0.1.3

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: 62d1ccef9ac560b19d5acff7ff5513145fa26fef6f326a9e5d0679890783a0c6
4
- data.tar.gz: f23b2e85d6158c3e1fa7b3314939042a0fc13a0a2707800ecc3233907ebc4640
3
+ metadata.gz: f660a554a1e716632a2eec69dc0204d014b93b8f2e10f35f0c6b3b5a29563a47
4
+ data.tar.gz: cb7758e6669b03bfbdc8925e2c6639885db5406e424edc0860bb7e713c20181c
5
5
  SHA512:
6
- metadata.gz: 0b46d9f5617ef754cc5b791a8e57b60581a355f6f267300dc3282c8dbe937b78adf6cfe55efb5045dd9d7c46653a5bf0cd7fb79bac6451054c588aef088a7784
7
- data.tar.gz: b4dbe7eabd3345ce74ea585584ba5e0bf6acd6b0192289f885418cc51ef6ec5fa3ab9f98fd5223a89cd0efbe09a00974f5bf4bb3cbc4038a8f3a3ab08e86e903
6
+ metadata.gz: 6a3f4d16e7b301079ccf0af079b53304b07d392ecb12f9f9512366fd95e13ed7b658e5dfeb4f8510aa50b2d49fd4b4ed96c14cdcb0bf7049b06a594500445009
7
+ data.tar.gz: 184c54cea2a6411bd5a82b078939c637b27cdb37a238e37301447655dc7e7bb646776e3ce247e57d59c088ccd5efbb407870c753b8f3511ad8dbf1604993c7ff
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Gladiator (Glimmer Editor) 0.1.2 - Glimmer Custom Shell
1
+ # Gladiator (Glimmer Editor) 0.1.3 - 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)
@@ -14,7 +14,8 @@ Gladiator currently supports the following text editing features:
14
14
  - Find & Replace
15
15
  - Show Line Numbers
16
16
  - Jump to Line
17
- - Remember last opened file, caret position, and top line
17
+ - Multiple tab support
18
+ - Remember last opened file, caret position, top line, window size, and window location
18
19
  - Autosave on focus out/quit/open new file
19
20
  - Watch open file for external changes to reflect in editor
20
21
  - Watch subdirectories for changes to reflect in file explorer/file lookup
@@ -50,7 +51,7 @@ To reuse Gladiator as a Glimmer Custom Shell inside another Glimmer application,
50
51
  following to the application's `Gemfile`:
51
52
 
52
53
  ```
53
- gem 'glimmer-cs-gladiator', '0.1.2'
54
+ gem 'glimmer-cs-gladiator', '0.1.3'
54
55
  ```
55
56
 
56
57
  Run:
@@ -24,7 +24,7 @@ module Glimmer
24
24
  end
25
25
  end
26
26
 
27
- attr_accessor :selected_child, :filter, :children, :filtered_path_options
27
+ attr_accessor :selected_child, :filter, :children, :filtered_path_options, :filtered_path
28
28
  attr_reader :path, :display_path
29
29
 
30
30
  def initialize(path)
@@ -102,9 +102,6 @@ module Glimmer
102
102
  @selected_child&.path
103
103
  end
104
104
 
105
- alias filtered_path selected_child_path
106
- alias filtered_path= selected_child_path=
107
-
108
105
  def to_s
109
106
  path
110
107
  end
@@ -6,11 +6,12 @@ module Glimmer
6
6
  include Glimmer
7
7
 
8
8
  attr_accessor :dirty_content, :line_numbers_content, :caret_position, :selection_count, :line_number, :find_text, :replace_text, :top_index
9
- attr_reader :path, :display_path
9
+ attr_reader :path, :display_path, :name
10
10
 
11
11
  def initialize(path)
12
12
  raise "Not a file path: #{path}" unless ::File.file?(path)
13
13
  @display_path = path
14
+ @name = ::File.basename(path)
14
15
  @path = ::File.expand_path(path)
15
16
  read_dirty_content = ::File.read(path)
16
17
  begin
@@ -28,7 +29,7 @@ module Glimmer
28
29
  if line_number
29
30
  line_index = line_number - 1
30
31
  new_caret_position = caret_position_for_line_index(line_index)
31
- self.caret_position = new_caret_position unless line_index_for_caret_position(new_caret_position) == line_index_for_caret_position(caret_position)
32
+ self.caret_position = new_caret_position unless self.caret_position && line_index_for_caret_position(new_caret_position) == line_index_for_caret_position(caret_position)
32
33
  end
33
34
  end
34
35
  rescue
@@ -57,18 +58,22 @@ module Glimmer
57
58
  def stop_filewatcher
58
59
  @filewatcher&.stop
59
60
  end
60
-
61
- def write_dirty_content
61
+
62
+ def format_dirty_content_for_writing!
62
63
  new_dirty_content = "#{dirty_content.gsub("\r\n", "\n").gsub("\r", "\n").sub(/\n+\z/, '')}\n"
63
64
  self.dirty_content = new_dirty_content if new_dirty_content != self.dirty_content
64
- ::File.write(path, dirty_content) if ::File.exists?(path) && dirty_content.to_s.strip.size > 0
65
+ end
66
+
67
+ def write_dirty_content
68
+ format_dirty_content_for_writing!
69
+ ::File.write(path, dirty_content) if ::File.exists?(path)
65
70
  rescue => e
66
71
  puts "Error in writing dirty content for #{path}"
67
72
  puts e.full_message
68
73
  end
69
74
 
70
75
  def write_raw_dirty_content
71
- ::File.write(path, dirty_content) if ::File.exists?(path) && dirty_content.to_s.strip.size > 0
76
+ ::File.write(path, dirty_content) if ::File.exists?(path)
72
77
  rescue => e
73
78
  puts "Error in writing raw dirty content for #{path}"
74
79
  puts e.full_message
@@ -99,7 +104,7 @@ module Glimmer
99
104
  end
100
105
  end
101
106
  self.dirty_content = new_lines.join("\n")
102
- if old_selection_count > 0
107
+ if old_selection_count.to_i > 0
103
108
  self.caret_position = caret_position_for_line_index(old_caret_position_line_index)
104
109
  self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position)
105
110
  else
@@ -125,7 +130,7 @@ module Glimmer
125
130
  end
126
131
  old_caret_position = self.caret_position
127
132
  self.dirty_content = new_lines.join("\n")
128
- if old_selection_count > 0
133
+ if old_selection_count.to_i > 0
129
134
  self.caret_position = caret_position_for_line_index(old_caret_position_line_index)
130
135
  self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position)
131
136
  else
@@ -154,7 +159,7 @@ module Glimmer
154
159
  end
155
160
  end
156
161
  self.dirty_content = new_lines.join("\n")
157
- if old_selection_count > 0
162
+ if old_selection_count.to_i > 0
158
163
  self.caret_position = caret_position_for_line_index(old_caret_position_line_index)
159
164
  self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position)
160
165
  else
@@ -166,12 +171,15 @@ module Glimmer
166
171
 
167
172
  def kill_line!
168
173
  new_lines = lines
169
- return if new_lines.size < 2
174
+ return if new_lines.size < 1
170
175
  line_indices = line_indices_for_selection(caret_position, selection_count)
171
176
  new_lines = new_lines[0...line_indices.first] + new_lines[(line_indices.last+1)...new_lines.size]
172
177
  old_caret_position = self.caret_position
173
- self.dirty_content = new_lines.join("\n")
174
- self.caret_position = old_caret_position
178
+ old_line_index = self.line_number - 1
179
+ line_position = line_position_for_caret_position(old_caret_position)
180
+ self.dirty_content = "#{new_lines.join("\n")}\n"
181
+ self.caret_position = caret_position_for_line_index(old_line_index) + [line_position, lines[old_line_index].to_s.size].min
182
+ self.selection_count = 0
175
183
  end
176
184
 
177
185
  def duplicate_line!
@@ -190,7 +198,7 @@ module Glimmer
190
198
  new_lines.insert(the_line_indices.first + i, the_line)
191
199
  end
192
200
  self.dirty_content = new_lines.join("\n")
193
- if old_selection_count > 0
201
+ if old_selection_count.to_i > 0
194
202
  self.caret_position = caret_position_for_line_index(old_caret_position_line_index)
195
203
  self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position)
196
204
  else
@@ -202,12 +210,21 @@ module Glimmer
202
210
  return if find_text.to_s.empty?
203
211
  all_lines = lines
204
212
  the_line_index = line_index_for_caret_position(caret_position)
205
- all_lines.rotate(the_line_index + 1).each_with_index do |the_line, the_index|
206
- the_index = (the_index + the_line_index + 1)%all_lines.size
207
- if the_line.downcase.include?(find_text.to_s.downcase)
208
- self.caret_position = the_line.downcase.index(find_text.to_s.downcase) + caret_position_for_line_index(the_index)
209
- self.selection_count = find_text.to_s.size
210
- return
213
+ line_position = line_position_for_caret_position(caret_position)
214
+ found =
215
+ 2.times do |i|
216
+ rotation = the_line_index
217
+ all_lines.rotate(rotation).each_with_index do |the_line, the_index|
218
+ the_index = (the_index + rotation)%all_lines.size
219
+ start_position = 0
220
+ start_position = line_position + find_text.to_s.size if i == 0 && the_index == the_line_index && found_text?(caret_position)
221
+ text_to_find_in = the_line.downcase[start_position..-1]
222
+ occurrence_index = text_to_find_in.index(find_text.to_s.downcase)
223
+ if occurrence_index
224
+ self.caret_position = caret_position_for_line_index(the_index) + start_position + occurrence_index
225
+ self.selection_count = find_text.to_s.size
226
+ return
227
+ end
211
228
  end
212
229
  end
213
230
  end
@@ -216,21 +233,34 @@ module Glimmer
216
233
  return if find_text.to_s.empty?
217
234
  all_lines = lines
218
235
  the_line_index = line_index_for_caret_position(caret_position)
219
- all_lines.rotate(the_line_index).each_with_index.map do |the_line, the_index|
220
- the_index = (the_index + the_line_index)%all_lines.size
221
- [the_line, the_index]
222
- end.reverse.each do |the_line, the_index|
223
- if the_line.downcase.include?(find_text.to_s.downcase)
224
- self.caret_position = the_line.downcase.index(find_text.to_s.downcase) + caret_position_for_line_index(the_index)
225
- self.selection_count = find_text.to_s.size
226
- return
236
+ line_position = line_position_for_caret_position(caret_position)
237
+ 2.times do |i|
238
+ rotation = - the_line_index - 1 + all_lines.size
239
+ all_lines.reverse.rotate(rotation).each_with_index do |the_line, the_index|
240
+ the_index = all_lines.size - 1 - (the_index + rotation)%all_lines.size
241
+ if the_index == the_line_index
242
+ start_position = i > 0 ? 0 : (the_line.size - line_position)
243
+ else
244
+ start_position = 0
245
+ end
246
+ text_to_find_in = the_line.downcase.reverse[start_position...the_line.size].to_s
247
+ occurrence_index = text_to_find_in.index(find_text.to_s.downcase.reverse)
248
+ if occurrence_index
249
+ self.caret_position = caret_position_for_line_index(the_index) + (the_line.size - (start_position + occurrence_index + find_text.to_s.size))
250
+ self.selection_count = find_text.to_s.size
251
+ return
252
+ end
227
253
  end
228
254
  end
229
255
  end
230
256
 
231
257
  def ensure_find_next
232
258
  return if find_text.to_s.empty? || dirty_content.to_s.strip.size < 1
233
- find_next unless dirty_content[caret_position.to_i, find_text.to_s.size] == find_text
259
+ find_next unless found_text?(self.caret_position)
260
+ end
261
+
262
+ def found_text?(caret_position)
263
+ dirty_content[caret_position.to_i, find_text.to_s.size].to_s.downcase == find_text.to_s.downcase
234
264
  end
235
265
 
236
266
  def replace_next!
@@ -263,23 +293,18 @@ module Glimmer
263
293
  return if old_lines.size < 2
264
294
  old_selection_count = self.selection_count
265
295
  old_caret_position = self.caret_position
266
- old_caret_position_line_index = line_index_for_caret_position(old_caret_position)
267
- old_caret_position_line_caret_position = caret_position_for_caret_position_start_of_line(old_caret_position_line_index)
296
+ old_caret_position_line_caret_position = caret_position_for_caret_position_start_of_line(old_caret_position)
297
+ old_caret_position_line_position = old_caret_position - old_caret_position_line_caret_position
268
298
  old_end_caret_line_index = end_caret_position_line_index(caret_position, selection_count)
269
299
  new_lines = lines
270
300
  the_line_indices = line_indices_for_selection(caret_position, selection_count)
271
301
  the_lines = lines_for_selection(caret_position, selection_count)
272
302
  new_line_index = [the_line_indices.first - 1, 0].max
273
- delta = -1 * (new_lines[new_line_index].size + 1)
274
303
  new_lines[the_line_indices.first..the_line_indices.last] = []
275
304
  new_lines[new_line_index...new_line_index] = the_lines
276
305
  self.dirty_content = new_lines.join("\n")
277
- if old_selection_count > 0
278
- self.caret_position = caret_position_for_line_index(old_caret_position_line_index) + delta
279
- self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position + delta)
280
- else
281
- self.caret_position = old_caret_position + delta
282
- end
306
+ self.caret_position = caret_position_for_line_index(new_line_index) + [old_caret_position_line_position, new_lines[new_line_index].size].min
307
+ self.selection_count = old_selection_count.to_i if old_selection_count.to_i > 0
283
308
  end
284
309
 
285
310
  def move_down!
@@ -287,23 +312,18 @@ module Glimmer
287
312
  return if old_lines.size < 2
288
313
  old_selection_count = self.selection_count
289
314
  old_caret_position = self.caret_position
290
- old_caret_position_line_index = line_index_for_caret_position(old_caret_position)
291
- old_caret_position_line_caret_position = caret_position_for_caret_position_start_of_line(old_caret_position_line_index)
315
+ old_caret_position_line_caret_position = caret_position_for_caret_position_start_of_line(old_caret_position)
316
+ old_caret_position_line_position = old_caret_position - old_caret_position_line_caret_position
292
317
  old_end_caret_line_index = end_caret_position_line_index(caret_position, selection_count)
293
318
  new_lines = lines
294
319
  the_line_indices = line_indices_for_selection(caret_position, selection_count)
295
320
  the_lines = lines_for_selection(caret_position, selection_count)
296
321
  new_line_index = [the_line_indices.first + 1, new_lines.size - 1].min
297
- delta = new_lines[new_line_index].size + 1
298
322
  new_lines[the_line_indices.first..the_line_indices.last] = []
299
323
  new_lines[new_line_index...new_line_index] = the_lines
300
324
  self.dirty_content = new_lines.join("\n")
301
- if old_selection_count > 0
302
- self.caret_position = caret_position_for_line_index(old_caret_position_line_index) + delta
303
- self.selection_count = (caret_position_for_line_index(old_end_caret_line_index + 1) - self.caret_position + delta)
304
- else
305
- self.caret_position = old_caret_position + delta
306
- end
325
+ self.caret_position = caret_position_for_line_index(new_line_index) + [old_caret_position_line_position, new_lines[new_line_index].size].min
326
+ self.selection_count = old_selection_count.to_i if old_selection_count.to_i > 0
307
327
  end
308
328
 
309
329
  def lines
@@ -327,6 +347,13 @@ module Glimmer
327
347
  def caret_position_for_caret_position_start_of_line(caret_position)
328
348
  caret_position_for_line_index(line_index_for_caret_position(caret_position))
329
349
  end
350
+
351
+ # position within line containing "caret position" (e.g. for caret position 5 in 1st line, they match as 5, for 15 in line 2 with line 1 having 10 characters, line position is 4)
352
+ # TODO consider renaming to line_character_position_for_caret_position
353
+ def line_position_for_caret_position(caret_position)
354
+ caret_position = caret_position.to_i
355
+ caret_position - caret_position_for_caret_position_start_of_line(caret_position)
356
+ end
330
357
 
331
358
  def line_caret_positions_for_selection(caret_position, selection_count)
332
359
  line_indices = line_indices_for_selection(caret_position, selection_count)
@@ -0,0 +1,95 @@
1
+ module Glimmer
2
+ class Gladiator
3
+ class TextEditor
4
+ include Glimmer::UI::CustomWidget
5
+
6
+ options :file
7
+
8
+ attr_reader :text_widget
9
+
10
+ after_body {
11
+ @text_widget = @text.swt_widget
12
+ }
13
+
14
+ body {
15
+ composite {
16
+ layout_data :fill, :fill, true, true
17
+ grid_layout 2, false
18
+ @line_numbers_text = text(:multi) {
19
+ layout_data(:right, :fill, false, true)
20
+ font name: 'Consolas', height: 15
21
+ background color(:widget_background)
22
+ foreground rgb(75, 75, 75)
23
+ text bind(file, 'line_numbers_content')
24
+ top_index bind(file, 'top_index')
25
+ on_focus_gained {
26
+ @text&.swt_widget.setFocus
27
+ }
28
+ on_key_pressed {
29
+ @text&.swt_widget.setFocus
30
+ }
31
+ on_mouse_up {
32
+ @text&.swt_widget.setFocus
33
+ }
34
+ }
35
+ @text = text(:multi, :border, :h_scroll, :v_scroll) {
36
+ layout_data :fill, :fill, true, true
37
+ font name: 'Consolas', height: 15
38
+ foreground rgb(75, 75, 75)
39
+ text bind(file, 'dirty_content')
40
+ focus true
41
+ caret_position bind(file, 'caret_position')
42
+ selection_count bind(file, 'selection_count')
43
+ top_index bind(file, 'top_index')
44
+ on_focus_lost {
45
+ file&.write_dirty_content
46
+ }
47
+ on_key_pressed { |key_event|
48
+ if key_event.stateMask == swt(:command) && key_event.character.chr.downcase == '/'
49
+ file.comment_line!
50
+ elsif key_event.stateMask == swt(:command) && key_event.character.chr.downcase == 'k'
51
+ file.kill_line!
52
+ elsif key_event.stateMask == swt(:command) && key_event.character.chr.downcase == 'd'
53
+ file.duplicate_line!
54
+ elsif key_event.stateMask == swt(:command) && key_event.character.chr.downcase == '['
55
+ file.outdent!
56
+ elsif key_event.stateMask == swt(:command) && key_event.character.chr.downcase == ']'
57
+ file.indent!
58
+ elsif key_event.keyCode == swt(:page_up)
59
+ file.page_up
60
+ key_event.doit = false
61
+ elsif key_event.keyCode == swt(:page_down)
62
+ file.page_down
63
+ key_event.doit = false
64
+ elsif key_event.keyCode == swt(:home)
65
+ file.home
66
+ key_event.doit = false
67
+ elsif key_event.keyCode == swt(:end)
68
+ file.end
69
+ key_event.doit = false
70
+ elsif key_event.stateMask == swt(:command) && key_event.keyCode == swt(:arrow_up)
71
+ file.move_up!
72
+ key_event.doit = false
73
+ elsif key_event.stateMask == swt(:command) && key_event.keyCode == swt(:arrow_down)
74
+ file.move_down!
75
+ key_event.doit = false
76
+ end
77
+ }
78
+ on_verify_text { |verify_event|
79
+ key_code = verify_event.keyCode
80
+ case key_code
81
+ when swt(:tab)
82
+ if file.selection_count.to_i > 0
83
+ file.indent!
84
+ verify_event.doit = false
85
+ else
86
+ verify_event.text = ' '
87
+ end
88
+ end
89
+ }
90
+ }
91
+ }
92
+ }
93
+ end
94
+ end
95
+ end
@@ -1,6 +1,8 @@
1
1
  require 'models/glimmer/gladiator/dir'
2
2
  require 'models/glimmer/gladiator/file'
3
3
 
4
+ require 'views/glimmer/gladiator/text_editor'
5
+
4
6
  Clipboard.implementation = Clipboard::Java
5
7
  Clipboard.copy(Clipboard.paste) # pre-initialize library to avoid slowdown during use
6
8
 
@@ -24,12 +26,11 @@ module Glimmer
24
26
  @config_file_path = ::File.join(local_dir, '.gladiator')
25
27
  @config = {}
26
28
  Gladiator::Dir.local_dir.all_children # pre-caches children
27
- load_config
28
29
  @display = display {
29
30
  on_event_keydown { |key_event|
30
31
  if Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == 'f'
31
- if @text.swt_widget.getSelectionText && @text.swt_widget.getSelectionText.size > 0
32
- @find_text.swt_widget.setText @text.swt_widget.getSelectionText
32
+ if @text_editor.text_widget.getSelectionText && @text_editor.text_widget.getSelectionText.size > 0
33
+ @find_text.swt_widget.setText @text_editor.text_widget.getSelectionText
33
34
  end
34
35
  @find_text.swt_widget.selectAll
35
36
  @find_text.swt_widget.setFocus
@@ -37,6 +38,26 @@ module Glimmer
37
38
  Clipboard.copy(Gladiator::Dir.local_dir.selected_child.path)
38
39
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command, :shift) && key_event.character.chr.downcase == 'g'
39
40
  Gladiator::Dir.local_dir.selected_child.find_previous
41
+ # elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command, :shift) && key_event.character.chr.downcase == 'w'
42
+ # @tab_folder.swt_widget.getItems.each(&:dispose)
43
+ # elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command, :alt) && key_event.character.chr.downcase == 'w'
44
+ # @tab_folder.swt_widget.getItems.each do |ti|
45
+ # ti.dispose unless ti == @tab_folder.swt_widget.getSelection()
46
+ # end
47
+ # elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == 'w'
48
+ # @tab_folder.swt_widget.getSelection.each(&:dispose)
49
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command, :shift) && key_event.character.chr.downcase == ']'
50
+ @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
51
+ @text_editor.text_widget.setFocus
52
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command, :shift) && key_event.character.chr.downcase == '['
53
+ @tab_folder.swt_widget.setSelection([@tab_folder.swt_widget.getSelectionIndex() - 1, 0].max) if @tab_folder.swt_widget.getItemCount > 0
54
+ @text_editor.text_widget.setFocus
55
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == '1'
56
+ @tab_folder.swt_widget.setSelection(0) if @tab_folder.swt_widget.getItemCount > 0
57
+ @text_editor.text_widget.setFocus
58
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == '9'
59
+ @tab_folder.swt_widget.setSelection(@tab_folder.swt_widget.getItemCount - 1) if @tab_folder.swt_widget.getItemCount > 0
60
+ @text_editor.text_widget.setFocus
40
61
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == 'g'
41
62
  Gladiator::Dir.local_dir.selected_child.find_next
42
63
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == 'l'
@@ -56,20 +77,42 @@ module Glimmer
56
77
  #
57
78
  after_body {
58
79
  observe(Gladiator::Dir.local_dir, 'selected_child') do
59
- @field_container.swt_widget.pack
60
- end
61
- observe(Gladiator::Dir.local_dir, 'selected_child.line_numbers_content') do
62
- if @last_line_numbers_content != Gladiator::Dir.local_dir.selected_child.line_numbers_content
80
+ selected_file = Gladiator::Dir.local_dir.selected_child
81
+ found_tab_item = @tab_folder.swt_widget.getItems.detect {|ti| ti.getData('file_path') == selected_file.path}
82
+ if found_tab_item
83
+ @tab_folder.swt_widget.setSelection(found_tab_item)
84
+ @tab_item = found_tab_item.getData('tab_item')
85
+ @text_editor = found_tab_item.getData('text_editor')
86
+ else
87
+ @tab_folder.content {
88
+ @tab_item = tab_item { |the_tab_item|
89
+ text selected_file.name
90
+ fill_layout :horizontal
91
+ @text_editor = the_text_editor = text_editor(file: selected_file)
92
+ on_event_show {
93
+ Gladiator::Dir.local_dir.selected_child = selected_file
94
+ @tab_item = the_tab_item
95
+ @text_editor = the_text_editor
96
+ }
97
+ }
98
+ @tab_item.swt_tab_item.setData('file_path', selected_file.path)
99
+ @tab_item.swt_tab_item.setData('tab_item', @tab_item)
100
+ @tab_item.swt_tab_item.setData('text_editor', @text_editor)
101
+ }
102
+ @tab_folder.swt_widget.setSelection(@tab_item.swt_tab_item)
63
103
  body_root.pack_same_size
64
- @last_line_numbers_content = Gladiator::Dir.local_dir.selected_child.line_numbers_content
65
104
  end
66
105
  end
106
+ observe(Gladiator::Dir.local_dir, 'selected_child') do
107
+ save_config
108
+ end
67
109
  observe(Gladiator::Dir.local_dir, 'selected_child.caret_position') do
68
110
  save_config
69
111
  end
70
112
  observe(Gladiator::Dir.local_dir, 'selected_child.top_index') do
71
113
  save_config
72
- end
114
+ end
115
+ load_config
73
116
  }
74
117
 
75
118
  ## Add widget content inside custom shell body
@@ -87,6 +130,12 @@ module Glimmer
87
130
  on_widget_disposed {
88
131
  Gladiator::Dir.local_dir.selected_child&.write_dirty_content
89
132
  }
133
+ on_control_resized {
134
+ save_config
135
+ }
136
+ on_control_moved {
137
+ save_config
138
+ }
90
139
  composite {
91
140
  grid_layout 1, false
92
141
  layout_data(:fill, :fill, false, true) {
@@ -104,7 +153,7 @@ module Glimmer
104
153
  @list.swt_widget.select(0) if @list.swt_widget.getSelectionIndex() == -1
105
154
  @list.swt_widget.setFocus
106
155
  elsif key_event.keyCode == swt(:esc)
107
- @text.swt_widget.setFocus
156
+ @text_editor.text_widget.setFocus
108
157
  end
109
158
  }
110
159
  }
@@ -116,13 +165,13 @@ module Glimmer
116
165
  }
117
166
  #visible bind(Gladiator::Dir, 'local_dir.filter') {|f| !!f}
118
167
  selection bind(Gladiator::Dir.local_dir, :filtered_path)
119
- on_widget_selected {
168
+ on_mouse_up {
120
169
  Gladiator::Dir.local_dir.selected_child_path = @list.swt_widget.getSelection.first
121
170
  }
122
171
  on_key_pressed { |key_event|
123
172
  if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr) || Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :lf)
124
173
  Gladiator::Dir.local_dir.selected_child_path = @list.swt_widget.getSelection.first
125
- @text.swt_widget.setFocus
174
+ @text_editor.text_widget.setFocus
126
175
  end
127
176
  }
128
177
  }
@@ -138,7 +187,7 @@ module Glimmer
138
187
  on_key_pressed { |key_event|
139
188
  if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr) || Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :lf)
140
189
  Gladiator::Dir.local_dir.selected_child_path = @tree.swt_widget.getSelection&.first&.getText
141
- @text.swt_widget.setFocus
190
+ @text_editor.text_widget.setFocus
142
191
  end
143
192
  }
144
193
  on_paint_control {
@@ -150,10 +199,10 @@ module Glimmer
150
199
  }
151
200
  }
152
201
  }
153
- composite {
202
+ @editor_container = composite {
154
203
  grid_layout 1, false
155
204
  layout_data :fill, :fill, true, true
156
- @field_container = composite {
205
+ composite {
157
206
  grid_layout 2, false
158
207
  @file_path_label = styled_text(:none) {
159
208
  layout_data(:fill, :fill, true, false) {
@@ -180,7 +229,7 @@ module Glimmer
180
229
  text bind(Gladiator::Dir.local_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
181
230
  on_key_pressed { |key_event|
182
231
  if key_event.keyCode == swt(:cr)
183
- @text.swt_widget.setFocus
232
+ @text_editor.text_widget.setFocus
184
233
  end
185
234
  }
186
235
  }
@@ -196,7 +245,7 @@ module Glimmer
196
245
  if key_event.keyCode == swt(:cr)
197
246
  Gladiator::Dir.local_dir.selected_child.find_next
198
247
  elsif key_event.keyCode == swt(:esc)
199
- @text.swt_widget.setFocus
248
+ @text_editor.text_widget.setFocus
200
249
  end
201
250
  }
202
251
  }
@@ -215,87 +264,13 @@ module Glimmer
215
264
  if key_event.keyCode == swt(:cr)
216
265
  Gladiator::Dir.local_dir.selected_child.replace_next!
217
266
  elsif key_event.keyCode == swt(:esc)
218
- @text.swt_widget.setFocus
267
+ @text_editor.text_widget.setFocus
219
268
  end
220
269
  }
221
270
  }
222
271
  }
223
- composite {
224
- layout_data :fill, :fill, true, true
225
- grid_layout 2, false
226
- @line_numbers_text = text(:multi) {
227
- layout_data(:right, :fill, false, true)
228
- font name: 'Consolas', height: 15
229
- background color(:widget_background)
230
- foreground rgb(75, 75, 75)
231
- text bind(Gladiator::Dir.local_dir, 'selected_child.line_numbers_content')
232
- top_index bind(Gladiator::Dir.local_dir, 'selected_child.top_index')
233
- on_focus_gained {
234
- @text&.swt_widget.setFocus
235
- }
236
- on_key_pressed {
237
- @text&.swt_widget.setFocus
238
- }
239
- on_mouse_up {
240
- @text&.swt_widget.setFocus
241
- }
242
- }
243
- @text = text(:multi, :border, :h_scroll, :v_scroll) {
244
- layout_data :fill, :fill, true, true
245
- font name: 'Consolas', height: 15
246
- foreground rgb(75, 75, 75)
247
- text bind(Gladiator::Dir.local_dir, 'selected_child.dirty_content')
248
- focus true
249
- caret_position bind(Gladiator::Dir.local_dir, 'selected_child.caret_position')
250
- selection_count bind(Gladiator::Dir.local_dir, 'selected_child.selection_count')
251
- top_index bind(Gladiator::Dir.local_dir, 'selected_child.top_index')
252
- on_focus_lost {
253
- Gladiator::Dir.local_dir.selected_child&.write_dirty_content
254
- }
255
- on_key_pressed { |key_event|
256
- if Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == '/'
257
- Gladiator::Dir.local_dir.selected_child.comment_line!
258
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == 'k'
259
- Gladiator::Dir.local_dir.selected_child.kill_line!
260
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == 'd'
261
- Gladiator::Dir.local_dir.selected_child.duplicate_line!
262
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == '['
263
- Gladiator::Dir.local_dir.selected_child.outdent!
264
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :command) && key_event.character.chr.downcase == ']'
265
- Gladiator::Dir.local_dir.selected_child.indent!
266
- elsif key_event.keyCode == swt(:page_up)
267
- Gladiator::Dir.local_dir.selected_child.page_up
268
- key_event.doit = false
269
- elsif key_event.keyCode == swt(:page_down)
270
- Gladiator::Dir.local_dir.selected_child.page_down
271
- key_event.doit = false
272
- elsif key_event.keyCode == swt(:home)
273
- Gladiator::Dir.local_dir.selected_child.home
274
- key_event.doit = false
275
- elsif key_event.keyCode == swt(:end)
276
- Gladiator::Dir.local_dir.selected_child.end
277
- key_event.doit = false
278
- elsif key_event.stateMask == swt(:command) && key_event.keyCode == swt(:arrow_up)
279
- Gladiator::Dir.local_dir.selected_child.move_up!
280
- key_event.doit = false
281
- elsif key_event.stateMask == swt(:command) && key_event.keyCode == swt(:arrow_down)
282
- Gladiator::Dir.local_dir.selected_child.move_down!
283
- key_event.doit = false
284
- end
285
- }
286
- on_verify_text { |verify_event|
287
- key_code = verify_event.keyCode
288
- case key_code
289
- when swt(:tab)
290
- if Gladiator::Dir.local_dir.selected_child.selection_count.to_i > 0
291
- Gladiator::Dir.local_dir.selected_child.indent!
292
- verify_event.doit = false
293
- else
294
- verify_event.text = ' '
295
- end
296
- end
297
- }
298
- }
272
+ @tab_folder = tab_folder {
273
+ layout_data(:fill, :fill, true, true)
299
274
  }
300
275
  }
301
276
  }
@@ -309,16 +284,26 @@ module Glimmer
309
284
  Gladiator::Dir.local_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
310
285
  Gladiator::Dir.local_dir.selected_child&.caret_position = Gladiator::Dir.local_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position]) if @config[:caret_position]
311
286
  Gladiator::Dir.local_dir.selected_child&.top_index = @config[:top_index] if @config[:top_index]
287
+ body_root.on_event_show do
288
+ swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
289
+ swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
290
+ @loaded_config = true
291
+ end
312
292
  end
313
293
  end
314
294
 
315
295
  def save_config
296
+ return unless @loaded_config
316
297
  child = Gladiator::Dir.local_dir.selected_child
317
298
  return if child.nil?
318
299
  @config = {
319
300
  selected_child_path: child.path,
320
301
  caret_position: child.caret_position,
321
302
  top_index: child.top_index,
303
+ shell_width: swt_widget&.getBounds&.width,
304
+ shell_height: swt_widget&.getBounds&.height,
305
+ shell_x: swt_widget&.getBounds&.x,
306
+ shell_y: swt_widget&.getBounds&.y,
322
307
  }
323
308
  config_yaml = YAML.dump(@config)
324
309
  ::File.write(@config_file_path, config_yaml) unless config_yaml.to_s.empty?
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.2
4
+ version: 0.1.3
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-05-14 00:00:00.000000000 Z
11
+ date: 2020-05-16 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.2
18
+ version: 0.7.3
19
19
  name: glimmer
20
20
  type: :runtime
21
21
  prerelease: false
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.7.2
26
+ version: 0.7.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.8.1
103
+ name: puts_debuggerer
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.8.1
97
111
  description: Gladiator (short for Glimmer Editor) is a Glimmer sample project under
98
112
  on-going development. It is not intended to be a full-fledged editor by any means,
99
113
  yet mostly a fun educational exercise in using Glimmer to build a text editor. Gladiator
@@ -116,6 +130,7 @@ files:
116
130
  - lib/models/glimmer/gladiator/dir.rb
117
131
  - lib/models/glimmer/gladiator/file.rb
118
132
  - lib/views/glimmer/gladiator.rb
133
+ - lib/views/glimmer/gladiator/text_editor.rb
119
134
  homepage: http://github.com/AndyObtiva/glimmer-cs-gladiator
120
135
  licenses:
121
136
  - MIT