glimmer-cs-gladiator 0.5.4 → 0.6.0

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: d31e7dd5189317eaeb3a91a175a050ffaaeb4e82d6c8709167477d26dd7bf237
4
- data.tar.gz: 370a540665a9d7f3d08154f1e98530521f72e9a720f35fa83f982747e2e5bf5e
3
+ metadata.gz: 686df61b4e15ac85a1cc5d08cb3e83f088bce3a40b2a6e155101f657189075f3
4
+ data.tar.gz: 12874887ef0d8a846ef43d5eb89ad2d1ec184fe3d0171a4cf692a1f9348efe61
5
5
  SHA512:
6
- metadata.gz: 7af2ad9407c442ad6634a843ad3b5fc6cac47dadbd84ec0dc0b19f8d38b858950648a951383be811f040232ab426cbf0dffc1ad1d003a33a6a3cefd07d6c6832
7
- data.tar.gz: a9d30dc68de3f7de8fa25c9860c57885892e4ceeea734c63bc4fd2b257736afc0e1b0c7a062d03af93991d03d05907dbfbe058adcf6e13d695ce524167ce5aef
6
+ metadata.gz: 8816804e0a23b860d98b6f583dba265cafac70ce3960b297f5c99dfa6de27d55441c5f959378d4851901e7cf059ec565bdbfc5911c114e8f41e250191f4b27fb
7
+ data.tar.gz: 288eccb3f7edbd055d54c0f05d9878a1630c057ca1f7464f7ecb586e5a632d33466197511f0e564900816dbb0b76b3a86ddc743d0fb0d60763a776ef592eb9d2
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-cs-gladiator-logo.svg' height=85 /> Gladiator 0.5.4 - [Ugliest Text Editor Ever](https://www.reddit.com/r/ruby/comments/hgve8k/gladiator_glimmer_editor_ugliest_text_editor_ever/)
1
+ # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-cs-gladiator-logo.svg' height=85 /> Gladiator 0.6.0 - [Ugliest Text Editor Ever](https://www.reddit.com/r/ruby/comments/hgve8k/gladiator_glimmer_editor_ugliest_text_editor_ever/)
2
2
  ## [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=40 /> Glimmer Custom Shell](https://github.com/AndyObtiva/glimmer-dsl-swt#custom-shell-gem)
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer-cs-gladiator.svg)](http://badge.fury.io/rb/glimmer-cs-gladiator)
4
4
 
@@ -11,21 +11,14 @@ I leave building truly professional text editors to software tooling experts who
11
11
 
12
12
  ## Features
13
13
 
14
- Gladiator currently supports the following text editing features (including keyboard shortcuts with Mac CMD=CTRL on Windows/Linux):
15
- - Ruby Syntax Highlighting with colors
16
- - Open Project from File Menu (CMD+SHIFT+P)
17
- - Scratchpad for running arbitrary Ruby/Glimmer code without saving to disk (CMD+SHIFT+S)
18
- - Run Ruby code (CMD+SHIFT+R)
19
- - File explorer navigation with context menu to open file, rename, delete, add new file, add new directory, or refresh tree (CMD+T)
20
- - File lookup by name ignoring slashes, underscores, and dots to ease lookup (CMD+R)
21
- - Watch open file for external changes to automatically refresh in editor
22
- - Watch project subdirectories for changes to automatically refresh in file explorer/file lookup
23
- - Find & Replace (CMD+F)
14
+ Gladiator currently supports the following text editing features (including keyboard shortcuts with Mac CMD=CTRL on Windows/Linux)
15
+
16
+ ### Text Editor
17
+
18
+ - Text Editor with Colored Ruby Syntax Highlighting
24
19
  - Show Line Numbers
25
- - Jump to Line (CMD+L)
26
- - Multiple tab support (CMD+SHIFT+[ & CMD+SHIFT+] for tab navigation. CMD+1-9 to jump to a specific tab)
27
- - Remember opened tabs, caret position, top line, window size, and window location
28
- - Autosave on focus out/quit/open new file
20
+ - Multi-tab support (CMD+SHIFT+[ & CMD+SHIFT+] for tab navigation. CMD+1-9 to jump to a specific tab)
21
+ - Drag and drop split pane (drag a file from File Tree or File Lookup List, and it splits the pane)
29
22
  - Duplicate Line(s)/selection (CMD+D)
30
23
  - Kill Line(s)/selection (CMD+K)
31
24
  - Move line/selection up (CMD+UP)
@@ -33,8 +26,41 @@ Gladiator currently supports the following text editing features (including keyb
33
26
  - Comment/Uncomment line/selection (CMD+/)
34
27
  - Indent/Unindent line/selection (CMD+] & CMD+[)
35
28
  - Insert/Prefix New Line (CMD+ENTER & CMD+SHIFT+ENTER)
36
- - Split Pane & Change Split Orientation to Horizontal/Vertical via View Menu (CMD+SHIFT+O)
37
- - Drag and Drop Text Editor Split Screen (drag a file from File Tree or File Lookup List, and it splits the pane)
29
+
30
+ ### File Explorer Tree
31
+
32
+ - Collapsable file explorer tree listing files and directories for open project
33
+ - Context menu to open file, rename, delete, add new file, add new directory, and refresh tree
34
+ - Jump to open file in tree (CMD+T)
35
+
36
+ ### File Lookup List Filter
37
+
38
+ - Collapsable file lookup list filter (CMD+R)
39
+ - Semi-fuzzy filtering by ignoring slashes, underscores, and dots to ease lookup
40
+
41
+ ### Navigation Area
42
+
43
+ - Show current text editor file name
44
+ - Show file navigation stats (Caret Position / Line Position / Selection Count / Top Pixel)
45
+ - Jump to Line (CMD+L)
46
+ - Find & Replace (CMD+F)
47
+
48
+ ### Menus
49
+
50
+ - File Menu to Open Project (CMD+SHIFT+P) and open Scratchpad for running arbitrary Ruby/Glimmer code without saving to disk (CMD+SHIFT+S)
51
+ - View Menu to Split Pane & Change Split Orientation to Horizontal/Vertical (CMD+SHIFT+O)
52
+ - Run Menu to run Ruby code (CMD+SHIFT+R)
53
+
54
+ ### Watch External Changes
55
+
56
+ - Watch open file for external changes to automatically refresh in editor
57
+ - Watch project subdirectories for changes to automatically refresh in file explorer/file lookup
58
+
59
+ ### Automatic Data Management
60
+
61
+ - Autosave on focus out/quit/open new file
62
+ - Remember opened tabs, caret position, top pixel, window size, and window location
63
+ - [Default](#configuration) "ignore paths" to avoid bogging down editor with irrelevant directory files
38
64
 
39
65
  ## Platforms
40
66
 
@@ -110,7 +136,7 @@ To reuse Gladiator as a Glimmer Custom Shell inside another Glimmer application,
110
136
  following to the application's `Gemfile`:
111
137
 
112
138
  ```
113
- gem 'glimmer-cs-gladiator', '~> 0.5.4'
139
+ gem 'glimmer-cs-gladiator', '~> 0.6.0'
114
140
  ```
115
141
 
116
142
  Run:
@@ -136,7 +162,7 @@ Opens Gladiator with "/Users/User/code" as the root directory.
136
162
 
137
163
  ## Configuration
138
164
 
139
- Gladiator automatically saves configuration data in a `.gladiator` file at the directory it is run from.
165
+ Gladiator automatically saves configuration data in a `.gladiator` file at the directory it is run from. It may be edited to add extra ignore paths.
140
166
 
141
167
  It currently remembers:
142
168
  - Last opened files (in both split panes if split)
@@ -176,4 +202,4 @@ Copyright (c) 2020 Andy Maleh. See [LICENSE.txt](LICENSE.txt) for further detail
176
202
 
177
203
  [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=40 />](https://github.com/AndyObtiva/glimmer) Built with [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) (JRuby Desktop Development GUI Library)
178
204
 
179
- Gladiator icon made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a>
205
+ Gladiator icon made by <a href="https://www.flaticon.com/authors/freepik" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.4
1
+ 0.6.0
@@ -1,6 +1,8 @@
1
1
  module Glimmer
2
2
  class Gladiator
3
3
  class Command
4
+ include Glimmer
5
+
4
6
  class << self
5
7
  include Glimmer
6
8
 
@@ -13,11 +15,18 @@ module Glimmer
13
15
  command_history[file] ||= [Command.new(file)]
14
16
  end
15
17
 
16
- def do(file, method = nil, command: nil)
17
- command ||= Command.new(file, method)
18
- command_history_for(file)&.last&.next_command = command
19
- command.do
20
- command_history_for(file) << command
18
+ def do(file, method = nil, *args, command: nil)
19
+ if command.nil?
20
+ command ||= Command.new(file, method, *args)
21
+ command.previous_command = command_history_for(file).last
22
+ unless command_history_for(file).last.method == :change_content! && method == :change_content!
23
+ command_history_for(file).last.next_command = command
24
+ end
25
+ command.do
26
+ command_history_for(file) << command unless command_history_for(file).last.method == :change_content! && method == :change_content!
27
+ else
28
+ command_history_for(file) << command
29
+ end
21
30
  end
22
31
 
23
32
  def undo(file)
@@ -30,15 +39,22 @@ module Glimmer
30
39
  command = command_history_for(file).last
31
40
  command&.redo
32
41
  end
42
+
43
+ def clear(file)
44
+ command_history[file] = [Command.new(file)]
45
+ end
33
46
  end
34
47
 
35
- attr_accessor :file, :method, :next_command, :previous_file_content, :previous_file_caret_position, :previous_file_selection_count
48
+ attr_accessor :file, :method, :args, :previous_command, :next_command,
49
+ :file_dirty_content, :file_caret_position, :file_selection_count, :previous_file_dirty_content, :previous_file_caret_position, :previous_file_selection_count
36
50
 
37
- def initialize(file, method = nil)
51
+ def initialize(file, method = nil, *args)
38
52
  @file = file
39
53
  @method = method
54
+ @args = args
40
55
  end
41
56
 
57
+
42
58
  def native?
43
59
  @method.nil?
44
60
  end
@@ -56,6 +72,9 @@ module Glimmer
56
72
 
57
73
  def redo
58
74
  return if next_command.nil?# || next_command.native?
75
+ @file.dirty_content = next_command.file_dirty_content.clone
76
+ @file.caret_position = next_command.file_caret_position
77
+ @file.selection_count = next_command.file_selection_count
59
78
  Command.do(next_command.file, command: next_command)
60
79
  end
61
80
 
@@ -63,6 +82,10 @@ module Glimmer
63
82
  @previous_file_dirty_content = @file.dirty_content.clone
64
83
  @previous_file_caret_position = @file.caret_position
65
84
  @previous_file_selection_count = @file.selection_count
85
+ if @method == :change_content!
86
+ @previous_file_caret_position = @file.last_caret_position
87
+ @previous_file_selection_count = @file.last_selection_count
88
+ end
66
89
  end
67
90
 
68
91
  def restore
@@ -72,7 +95,17 @@ module Glimmer
72
95
  end
73
96
 
74
97
  def execute
75
- @file.send(@method)
98
+ @file.start_command
99
+ @file.send(@method, *@args)
100
+ @file.end_command
101
+ @file_dirty_content = @file.dirty_content.clone
102
+ @file_caret_position = @file.caret_position
103
+ @file_selection_count = @file.selection_count
104
+ if previous_command.method == :change_content! && @method == :change_content!
105
+ previous_command.file_dirty_content = @file_dirty_content
106
+ previous_command.file_caret_position = @file_caret_position
107
+ previous_command.file_selection_count = @file_selection_count
108
+ end
76
109
  end
77
110
  end
78
111
  end
@@ -219,7 +219,7 @@ module Glimmer
219
219
  def eql?(other)
220
220
  self.path.eql?(other&.path)
221
221
  end
222
-
222
+
223
223
  def hash
224
224
  self.path.hash
225
225
  end
@@ -3,7 +3,7 @@ module Glimmer
3
3
  class File
4
4
  include Glimmer
5
5
 
6
- attr_accessor :line_numbers_content, :selection, :line_number, :find_text, :replace_text, :top_pixel, :display_path, :case_sensitive
6
+ attr_accessor :line_numbers_content, :line_number, :find_text, :replace_text, :top_pixel, :display_path, :case_sensitive, :caret_position, :selection_count, :last_caret_position, :last_selection_count, :line_position
7
7
  attr_reader :name, :path, :project_dir
8
8
 
9
9
  def initialize(path='', project_dir=nil)
@@ -13,9 +13,11 @@ module Glimmer
13
13
  @name = path.empty? ? 'Scratchpad' : ::File.basename(path)
14
14
  self.path = ::File.expand_path(path) unless path.empty?
15
15
  @top_pixel = 0
16
+ @caret_position = 0
16
17
  @selection_count = 0
17
- @selection = Point.new(0, 0 + @selection_count)
18
+ @last_selection_count = 0
18
19
  @line_number = 1
20
+ @init = nil
19
21
  end
20
22
 
21
23
  def init_content
@@ -24,29 +26,28 @@ module Glimmer
24
26
  begin
25
27
  # test read dirty content
26
28
  observe(self, :dirty_content) do
27
- lines_text_size = lines.size.to_s.size
29
+ line_count = lines.empty? ? 1 : lines.size
30
+ lines_text_size = [line_count.to_s.size, 4].max
28
31
  old_top_pixel = top_pixel
29
- self.line_numbers_content = lines.size.times.map {|n| (' ' * (lines_text_size - (n+1).to_s.size)) + (n+1).to_s }.join("\n")
32
+ self.line_numbers_content = line_count.times.map {|n| (' ' * (lines_text_size - (n+1).to_s.size)) + (n+1).to_s }.join("\n")
30
33
  self.top_pixel = old_top_pixel
31
34
  end
32
35
  the_dirty_content = read_dirty_content
33
36
  the_dirty_content.split("\n") # test that it is not a binary file (crashes to rescue block otherwise)
34
37
  self.dirty_content = the_dirty_content
35
- observe(self, :selection) do
38
+ observe(self, :caret_position) do |new_caret_position|
36
39
  new_line_number = line_index_for_caret_position(caret_position) + 1
37
- async_exec {
38
- self.line_number = new_line_number
39
- }
40
+ current_line_number = line_number
41
+ self.line_number = new_line_number unless current_line_number && current_line_number == new_line_number
42
+ self.line_position = caret_position - caret_position_for_line_index(line_number - 1) + 1
40
43
  end
41
- observe(self, :line_number) do
42
- if line_number
43
- line_index = line_number - 1
44
- new_caret_position = caret_position_for_line_index(line_index)
45
- current_caret_position = self.caret_position
46
- async_exec {
47
- self.caret_position = new_caret_position unless current_caret_position && line_index_for_caret_position(new_caret_position) == line_index_for_caret_position(current_caret_position)
48
- }
49
- end
44
+ observe(self, :line_number) do |new_line_number|
45
+ line_index = line_number - 1
46
+ new_caret_position = caret_position_for_line_index(line_index)
47
+ current_caret_position = caret_position
48
+ line_index_for_new_caret_position = line_index_for_caret_position(new_caret_position)
49
+ line_index_for_current_caret_position = line_index_for_caret_position(current_caret_position)
50
+ self.caret_position = new_caret_position unless (current_caret_position && line_index_for_new_caret_position == line_index_for_current_caret_position)
50
51
  end
51
52
  rescue # in case of a binary file
52
53
  stop_filewatcher
@@ -63,6 +64,15 @@ module Glimmer
63
64
  return if @path.empty?
64
65
  @display_path = @path.sub(project_dir.path, '').sub(/^\//, '')
65
66
  end
67
+
68
+ def name=(the_name)
69
+ new_path = path.sub(/#{Regexp.escape(@name)}$/, the_name) unless scratchpad?
70
+ @name = the_name
71
+ if !scratchpad? && ::File.exist?(path)
72
+ FileUtils.mv(path, new_path)
73
+ self.path = new_path
74
+ end
75
+ end
66
76
 
67
77
  def scratchpad?
68
78
  path.to_s.empty?
@@ -80,48 +90,18 @@ module Glimmer
80
90
  send("#{property}=", value)
81
91
  end
82
92
  end
83
-
84
- # to use for widget data-binding
85
- def content=(value)
86
- value = value.gsub("\t", ' ')
87
- if dirty_content != value
88
- # TODO fix this command recording hack by truly recording every text change as a proper command (add process_key command, paste command, cut command, etc...)
89
- Command.do(self) # record a native (OS-widget) operation
90
- self.dirty_content = value
91
- end
92
- end
93
-
94
- def content
95
- dirty_content
96
- end
97
-
93
+
98
94
  def caret_position=(value)
99
- old_top_pixel = top_pixel
100
- self.selection = Point.new(value, value + selection_count.to_i)
101
- self.top_pixel = old_top_pixel
102
- end
103
-
104
- def caret_position
105
- selection.x
106
- end
107
-
108
- def selection_count
109
- selection.y - selection.x
95
+ @last_caret_position = @caret_position
96
+ @caret_position = value
110
97
  end
111
98
 
112
99
  def selection_count=(value)
113
- self.selection = Point.new(caret_position, caret_position + value.to_i)
100
+ #@last_selection_count = @selection_count
101
+ @selection_count = value
102
+ @last_selection_count = @selection_count
114
103
  end
115
104
 
116
- def name=(the_name)
117
- new_path = path.sub(/#{Regexp.escape(@name)}$/, the_name) unless scratchpad?
118
- @name = the_name
119
- if !scratchpad? && ::File.exist?(path)
120
- FileUtils.mv(path, new_path)
121
- self.path = new_path
122
- end
123
- end
124
-
125
105
  def dirty_content
126
106
  init_content
127
107
  @dirty_content
@@ -132,14 +112,49 @@ module Glimmer
132
112
  @dirty_content = the_content
133
113
  old_caret_position = caret_position
134
114
  old_top_pixel = top_pixel
115
+
135
116
  notify_observers(:content)
136
117
  if @formatting_dirty_content_for_writing
137
118
  self.caret_position = old_caret_position
138
- self.selection_count = 0
139
119
  self.top_pixel = old_top_pixel
140
120
  end
141
121
  end
142
122
 
123
+ def content
124
+ dirty_content
125
+ end
126
+
127
+ # to use for widget data-binding
128
+ def content=(value)
129
+ value = value.gsub("\t", ' ')
130
+ if dirty_content != value
131
+ Command.do(self, :change_content!, value)
132
+ end
133
+ end
134
+
135
+ def change_content!(value)
136
+ self.dirty_content = value
137
+ end
138
+
139
+ def start_command
140
+ @commmand_in_progress = true
141
+ end
142
+
143
+ def end_command
144
+ @commmand_in_progress = false
145
+ end
146
+
147
+ def command_in_progress?
148
+ @commmand_in_progress
149
+ end
150
+
151
+ def close
152
+ stop_filewatcher
153
+ remove_all_observers
154
+ initialize(path, project_dir)
155
+ Command.clear(self)
156
+ end
157
+
143
158
  def read_dirty_content
144
159
  path.empty? ? '' : ::File.read(path)
145
160
  end
@@ -176,7 +191,9 @@ module Glimmer
176
191
  end
177
192
 
178
193
  def format_dirty_content_for_writing!
179
- new_dirty_content = dirty_content.split("\n").map {|line| line.strip.empty? ? line : line.rstrip }.join("\n")
194
+ return if @commmand_in_progress
195
+ # TODO f ix c ar e t pos it ion after formatting dirty content (diff?)
196
+ new_dirty_content = dirty_content.to_s.split("\n").map {|line| line.strip.empty? ? line : line.rstrip }.join("\n")
180
197
  new_dirty_content = "#{new_dirty_content.gsub("\r\n", "\n").gsub("\r", "\n").sub(/\n+\z/, '')}\n"
181
198
  if new_dirty_content != self.dirty_content
182
199
  @formatting_dirty_content_for_writing = true
@@ -76,6 +76,7 @@ module Glimmer
76
76
  }
77
77
  end
78
78
 
79
+ @default_foreground = :dark_blue
79
80
  @split_orientation = swt(:horizontal)
80
81
  @config_file_path = ::File.join(project_dir.path, '.gladiator')
81
82
  @config = {}
@@ -109,7 +110,10 @@ module Glimmer
109
110
  @current_tab_folder.content {
110
111
  @current_tab_item = tab_item { |the_tab_item|
111
112
  text selected_file.name
112
- fill_layout :horizontal
113
+ fill_layout(:horizontal) {
114
+ margin_width 0
115
+ margin_height 0
116
+ }
113
117
  @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file)
114
118
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
115
119
  @current_text_editor.text_proxy.content {
@@ -134,6 +138,9 @@ module Glimmer
134
138
  @current_text_editor&.text_widget&.setFocus
135
139
  }
136
140
  }
141
+ on_widget_disposed {
142
+ the_tab_item.swt_tab_item.get_data('file').close
143
+ }
137
144
  }
138
145
  @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
139
146
  @current_tab_item.swt_tab_item.setData('file', selected_file)
@@ -163,10 +170,12 @@ module Glimmer
163
170
  #
164
171
  body {
165
172
  shell {
173
+ grid_layout(2, false)
174
+
166
175
  text "Gladiator - #{::File.expand_path(project_dir.path)}"
167
176
  minimum_size 520, 250
168
177
  size 1440, 900
169
- grid_layout(2, false)
178
+
170
179
  on_swt_show {
171
180
  swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
172
181
  swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
@@ -216,14 +225,14 @@ module Glimmer
216
225
  text '&Split'
217
226
  menu_item(:radio) {
218
227
  text '&Horizontal'
219
- selection bind(self, :split_orientation,
220
- on_read: ->(o) { split_pane? && o == swt(:horizontal)},
228
+ selection bind(self, :split_orientation,
229
+ on_read: ->(o) { split_pane? && o == swt(:horizontal)},
221
230
  on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical) })
222
231
  }
223
232
  menu_item(:radio) {
224
233
  text '&Vertical'
225
- selection bind(self, :split_orientation,
226
- on_read: ->(o) { split_pane? && o == swt(:vertical)},
234
+ selection bind(self, :split_orientation,
235
+ on_read: ->(o) { split_pane? && o == swt(:vertical)},
227
236
  on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal) })
228
237
  }
229
238
  }
@@ -253,124 +262,215 @@ module Glimmer
253
262
  }
254
263
 
255
264
  composite {
256
- grid_layout 1, false
265
+ grid_layout(1, false) {
266
+ margin_width 0
267
+ margin_height 0
268
+ }
269
+
257
270
  layout_data(:fill, :fill, false, true) {
258
271
  width_hint 300
259
272
  }
260
- @filter_text = text {
261
- layout_data :fill, :center, true, false
262
- text bind(project_dir, 'filter')
263
- on_key_pressed { |key_event|
264
- if key_event.keyCode == swt(:tab) ||
265
- key_event.keyCode == swt(:cr) ||
266
- key_event.keyCode == swt(:arrow_up) ||
267
- key_event.keyCode == swt(:arrow_down)
268
- @list.swt_widget.select(0) if @list.swt_widget.getSelectionIndex() == -1
269
- @list.swt_widget.setFocus
270
- end
271
- }
272
- }
273
- sash_form(:vertical) {
273
+ @side_bar_sash_form = sash_form(:vertical) {
274
274
  layout_data(:fill, :fill, true, true)
275
275
  sash_width 4
276
- @list = list(:border, :h_scroll, :v_scroll) {
277
- #visible bind(self, 'project_dir.filter') {|f| !!f}
278
- selection bind(project_dir, :filtered_path)
279
- on_mouse_up {
280
- project_dir.selected_child_path = @list.swt_widget.getSelection.first
281
- }
282
- on_key_pressed { |key_event|
283
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
284
- project_dir.selected_child_path = @list.swt_widget.getSelection.first
285
- @current_text_editor&.text_widget&.setFocus
286
- end
287
- }
288
- drag_source(DND::DROP_COPY) {
289
- transfer [TextTransfer.getInstance].to_java(Transfer)
290
- on_drag_set_data { |event|
291
- Gladiator.drag = true
292
- list = event.widget.getControl
293
- event.data = list.getSelection.first
294
- }
295
- }
276
+
277
+ resize_expand_items = lambda { |event=nil|
278
+ @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
279
+ @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
296
280
  }
297
- @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
298
- #visible bind(self, 'project_dir.filter') {|f| !f}
299
- items bind(self, :project_dir), tree_properties(children: :children, text: :name)
300
- drag_source(DND::DROP_COPY) {
301
- transfer [TextTransfer.getInstance].to_java(Transfer)
302
- on_drag_set_data { |event|
303
- Gladiator.drag = true
304
- tree = event.widget.getControl
305
- tree_item = tree.getSelection.first
306
- event.data = tree_item.getData.path
307
- }
308
- }
309
- menu {
310
- @open_menu_item = menu_item {
311
- text 'Open'
312
- on_widget_selected {
313
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
281
+
282
+ @file_lookup_expand_bar = expand_bar {
283
+ layout_data :fill, :fill, true, true
284
+ font height: 17, style: :bold
285
+ foreground @default_foreground
286
+
287
+ on_swt_show {
288
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
289
+ }
290
+
291
+ on_swt_Resize(&resize_expand_items)
292
+
293
+ @file_lookup_expand_item = expand_item {
294
+ grid_layout {
295
+ margin_width 0
296
+ margin_height 0
297
+ }
298
+ text 'File Lookup'
299
+ height display.bounds.height
300
+
301
+ @filter_text = text {
302
+ layout_data :fill, :center, true, false
303
+ text bind(project_dir, 'filter')
304
+ on_key_pressed { |key_event|
305
+ if key_event.keyCode == swt(:tab) ||
306
+ key_event.keyCode == swt(:cr) ||
307
+ key_event.keyCode == swt(:arrow_up) ||
308
+ key_event.keyCode == swt(:arrow_down)
309
+ @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
310
+ @file_lookup_list.swt_widget.setFocus
311
+ end
314
312
  }
315
313
  }
316
- menu_item(:separator)
317
- menu_item {
318
- text 'Delete'
319
- on_widget_selected {
320
- tree_item = @file_tree.swt_widget.getSelection.first
321
- delete_tree_item(tree_item)
314
+
315
+ @file_lookup_list = list(:border, :h_scroll, :v_scroll) {
316
+ layout_data :fill, :fill, true, true
317
+ #visible bind(self, 'project_dir.filter') {|f| !!f}
318
+ selection bind(project_dir, :filtered_path)
319
+ foreground @default_foreground
320
+ on_mouse_up {
321
+ project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
322
322
  }
323
- }
324
- menu_item {
325
- text 'Refresh'
326
- on_widget_selected {
327
- project_dir.refresh
323
+ on_key_pressed { |key_event|
324
+ if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
325
+ project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
326
+ @current_text_editor&.text_widget&.setFocus
327
+ end
328
328
  }
329
- }
330
- menu_item {
331
- text 'Rename'
332
- on_widget_selected {
333
- rename_selected_tree_item
329
+ drag_source(DND::DROP_COPY) {
330
+ transfer [TextTransfer.getInstance].to_java(Transfer)
331
+ on_drag_set_data { |event|
332
+ Gladiator.drag = true
333
+ list = event.widget.getControl
334
+ event.data = list.getSelection.first
335
+ }
334
336
  }
335
337
  }
336
- menu_item {
337
- text 'New Directory'
338
- on_widget_selected {
339
- add_new_directory_to_selected_tree_item
338
+ }
339
+
340
+ on_item_collapsed { |event|
341
+ if @file_explorer_expand_item.swt_expand_item.get_expanded
342
+ @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
343
+ @file_lookup_expand_item.swt_expand_item.height = 0
344
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
345
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
346
+ @side_bar_sash_form.weights = [@file_lookup_expand_item.swt_expand_item.header_height, @file_lookup_expand_bar_height + @file_explorer_expand_bar_height - @file_lookup_expand_item.swt_expand_item.header_height]
347
+ end
348
+ }
349
+
350
+ on_item_expanded {
351
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
352
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
353
+ }
354
+
355
+ }
356
+
357
+ @file_explorer_expand_bar = expand_bar {
358
+ layout_data :fill, :fill, true, true
359
+ font height: 17, style: :bold
360
+ foreground @default_foreground
361
+
362
+ on_swt_show {
363
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
364
+ }
365
+
366
+ on_swt_Resize(&resize_expand_items)
367
+
368
+ @file_explorer_expand_item = expand_item {
369
+ grid_layout {
370
+ margin_width 0
371
+ margin_height 0
372
+ }
373
+ text 'File Explorer'
374
+ height display.bounds.height
375
+
376
+ @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
377
+ layout_data :fill, :fill, true, true
378
+ #visible bind(self, 'project_dir.filter') {|f| !f}
379
+ items bind(self, :project_dir), tree_properties(children: :children, text: :name)
380
+ foreground @default_foreground
381
+ drag_source(DND::DROP_COPY) {
382
+ transfer [TextTransfer.getInstance].to_java(Transfer)
383
+ on_drag_set_data { |event|
384
+ Gladiator.drag = true
385
+ tree = event.widget.getControl
386
+ tree_item = tree.getSelection.first
387
+ event.data = tree_item.getData.path
388
+ }
340
389
  }
341
- }
342
- menu_item {
343
- text 'New File'
344
- on_widget_selected {
345
- add_new_file_to_selected_tree_item
390
+ menu {
391
+ @open_menu_item = menu_item {
392
+ text 'Open'
393
+ on_widget_selected {
394
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
395
+ }
396
+ }
397
+ menu_item(:separator)
398
+ menu_item {
399
+ text 'Delete'
400
+ on_widget_selected {
401
+ tree_item = @file_tree.swt_widget.getSelection.first
402
+ delete_tree_item(tree_item)
403
+ }
404
+ }
405
+ menu_item {
406
+ text 'Refresh'
407
+ on_widget_selected {
408
+ project_dir.refresh
409
+ }
410
+ }
411
+ menu_item {
412
+ text 'Rename'
413
+ on_widget_selected {
414
+ rename_selected_tree_item
415
+ }
416
+ }
417
+ menu_item {
418
+ text 'New Directory'
419
+ on_widget_selected {
420
+ add_new_directory_to_selected_tree_item
421
+ }
422
+ }
423
+ menu_item {
424
+ text 'New File'
425
+ on_widget_selected {
426
+ add_new_file_to_selected_tree_item
427
+ }
428
+ }
429
+ }
430
+ on_swt_menudetect { |event|
431
+ path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
432
+ @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
433
+ }
434
+ on_mouse_up {
435
+ if Gladiator.drag_and_drop
436
+ Gladiator.drag_and_drop = false
437
+ else
438
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
439
+ @current_text_editor&.text_widget&.setFocus
440
+ end
441
+ }
442
+ on_key_pressed { |key_event|
443
+ if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
444
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
445
+ @current_text_editor&.text_widget&.setFocus
446
+ end
447
+ }
448
+ on_paint_control {
449
+ root_item = @file_tree.swt_widget.getItems.first
450
+ if root_item && !root_item.getExpanded
451
+ root_item.setExpanded(true)
452
+ end
346
453
  }
347
454
  }
348
455
  }
349
- on_swt_menudetect { |event|
350
- path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
351
- @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
352
- }
353
- on_mouse_up {
354
- if Gladiator.drag_and_drop
355
- Gladiator.drag_and_drop = false
356
- else
357
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
358
- @current_text_editor&.text_widget&.setFocus
359
- end
360
- }
361
- on_key_pressed { |key_event|
362
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
363
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
364
- @current_text_editor&.text_widget&.setFocus
456
+
457
+ on_item_collapsed { |event|
458
+ if @file_lookup_expand_item.swt_expand_item.get_expanded
459
+ @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
460
+ @file_explorer_expand_item.swt_expand_item.height = 0
461
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
462
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
463
+ @side_bar_sash_form.weights = [@file_explorer_expand_bar_height + @file_explorer_expand_bar_height - @file_explorer_expand_item.swt_expand_item.header_height, @file_explorer_expand_item.swt_expand_item.header_height]
365
464
  end
366
- }
367
- on_paint_control {
368
- root_item = @file_tree.swt_widget.getItems.first
369
- if root_item && !root_item.getExpanded
370
- root_item.setExpanded(true)
371
- end
372
- }
373
- }
465
+ }
466
+
467
+ on_item_expanded {
468
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
469
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
470
+ }
471
+
472
+ }
473
+
374
474
  }
375
475
 
376
476
  # TODO see if you could replace some of this with Glimmer DSL/API syntax
@@ -380,117 +480,220 @@ module Glimmer
380
480
  @file_tree_editor.minimumHeight = 20;
381
481
 
382
482
  }
383
- @editor_container = composite {
384
- grid_layout 1, false
483
+
484
+ composite {
485
+ grid_layout(1, false) {
486
+ margin_width 0
487
+ margin_height 0
488
+ }
385
489
  layout_data :fill, :fill, true, true
386
- composite {
387
- grid_layout 3, false
388
-
389
- # row 1
390
-
391
- label {
392
- text 'File:'
393
- }
490
+
491
+ @navigation_expand_bar = expand_bar {
492
+ layout_data :fill, :top, true, false
493
+ font height: 17, style: :bold
494
+ foreground @default_foreground
495
+
496
+ @navigation_expand_item = expand_item {
497
+ text 'Navigation'
498
+ height 115
394
499
 
395
- @file_path_label = styled_text(:none) {
396
- layout_data(:fill, :fill, true, false) {
397
- horizontal_span 2
500
+ grid_layout(5, false) {
501
+ margin_right 5
398
502
  }
399
- background color(:widget_background)
400
- editable false
401
- caret nil
402
- text bind(project_dir, 'selected_child.path')
403
- on_mouse_up {
404
- @file_path_label.swt_widget.selectAll
503
+
504
+ stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
505
+
506
+ # row 1
507
+
508
+ label {
509
+ layout_data(:left, :center, false, false)
510
+ text 'File:'
511
+ foreground @default_foreground
405
512
  }
406
- on_focus_lost {
407
- @file_path_label.swt_widget.setSelection(0, 0)
513
+
514
+ @file_path_label = styled_text(:none) {
515
+ layout_data(:fill, :center, true, false) {
516
+ horizontal_span 2
517
+ }
518
+ background color(:widget_background)
519
+ foreground @default_foreground
520
+ editable false
521
+ caret nil
522
+ text bind(project_dir, 'selected_child.path')
523
+ on_mouse_up {
524
+ @file_path_label.swt_widget.selectAll
525
+ }
526
+ on_focus_lost {
527
+ @file_path_label.swt_widget.setSelection(0, 0)
528
+ }
408
529
  }
409
- }
410
-
411
- # row 2
412
-
413
- label {
414
- text 'Line:'
415
- }
416
- @line_number_text = text {
417
- layout_data(:fill, :fill, true, false) {
418
- minimum_width 400
530
+
531
+ label {
532
+ layout_data(:left, :center, false, false)
533
+ text 'Caret Position:'
534
+ foreground @default_foreground
419
535
  }
420
- text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
421
- on_key_pressed { |key_event|
422
- if key_event.keyCode == swt(:cr)
423
- @current_text_editor&.text_widget&.setFocus
424
- end
536
+ label(:right) {
537
+ layout_data(:fill, :center, true, false)
538
+ text bind(project_dir, 'selected_child.caret_position')
539
+ foreground @default_foreground
540
+ font stat_font
425
541
  }
426
- on_verify_text { |event|
427
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
542
+
543
+ # row 2
544
+
545
+ label {
546
+ layout_data(:left, :center, false, false)
547
+ text 'Line:'
548
+ foreground @default_foreground
428
549
  }
429
- }
430
- label
431
-
432
- # row 3
433
-
434
- label {
435
- text 'Find:'
436
- }
437
- @find_text = text {
438
- layout_data(:fill, :center, true, false) {
439
- minimum_width 400
550
+ @line_number_text = text {
551
+ layout_data(:fill, :center, true, false) {
552
+ minimum_width 400
553
+ }
554
+ text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
555
+ foreground @default_foreground
556
+ font stat_font
557
+ on_key_pressed { |key_event|
558
+ if key_event.keyCode == swt(:cr)
559
+ @current_text_editor&.text_widget&.setFocus
560
+ end
561
+ }
562
+ on_verify_text { |event|
563
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
564
+ }
440
565
  }
441
- text bind(project_dir, 'selected_child.find_text')
442
- on_key_pressed { |key_event|
443
- if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
444
- project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
445
- project_dir.selected_child&.find_next
446
- end
447
- if key_event.keyCode == swt(:cr)
448
- project_dir.selected_child&.find_next
449
- end
566
+ label # filler
567
+
568
+ label {
569
+ layout_data(:left, :center, false, false)
570
+ text 'Line Position:'
571
+ foreground @default_foreground
450
572
  }
451
- }
452
- composite {
453
- row_layout
454
- button(:check) {
455
- selection bind(project_dir, 'selected_child.case_sensitive')
573
+ label(:right) {
574
+ layout_data(:fill, :center, true, false)
575
+ text bind(project_dir, 'selected_child.line_position')
576
+ foreground @default_foreground
577
+ font stat_font
578
+ }
579
+
580
+ # row 3
581
+
582
+ label {
583
+ layout_data(:left, :center, false, false)
584
+ text 'Find:'
585
+ foreground @default_foreground
586
+ }
587
+ @find_text = text {
588
+ layout_data(:fill, :center, true, false) {
589
+ minimum_width 400
590
+ }
591
+ text bind(project_dir, 'selected_child.find_text')
592
+ foreground @default_foreground
593
+ font stat_font
456
594
  on_key_pressed { |key_event|
595
+ if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
596
+ project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
597
+ project_dir.selected_child&.find_next
598
+ end
457
599
  if key_event.keyCode == swt(:cr)
458
600
  project_dir.selected_child&.find_next
459
601
  end
460
602
  }
461
603
  }
604
+ composite {
605
+ layout_data(:left, :center, true, false)
606
+ row_layout {
607
+ margin_width 0
608
+ margin_height 0
609
+ }
610
+ button(:check) {
611
+ selection bind(project_dir, 'selected_child.case_sensitive')
612
+ on_key_pressed { |key_event|
613
+ if key_event.keyCode == swt(:cr)
614
+ project_dir.selected_child&.find_next
615
+ end
616
+ }
617
+ }
618
+ label {
619
+ text 'Case-sensitive'
620
+ }
621
+ }
622
+
462
623
  label {
463
- text 'Case-sensitive'
624
+ layout_data(:left, :center, false, false)
625
+ text 'Selection Count:'
626
+ foreground @default_foreground
464
627
  }
465
- }
466
-
467
- # row 4
468
-
469
- label {
470
- text 'Replace:'
471
- }
472
- @replace_text = text {
473
- layout_data(:fill, :fill, true, false) {
474
- minimum_width 300
628
+ label(:right) {
629
+ layout_data(:fill, :center, true, false)
630
+ text bind(project_dir, 'selected_child.selection_count')
631
+ foreground @default_foreground
632
+ font stat_font
475
633
  }
476
- text bind(project_dir, 'selected_child.replace_text')
477
- on_focus_gained {
478
- project_dir.selected_child&.ensure_find_next
634
+
635
+ # row 4
636
+
637
+ label {
638
+ layout_data(:left, :center, false, false)
639
+ text 'Replace:'
640
+ foreground @default_foreground
479
641
  }
480
- on_key_pressed { |key_event|
481
- if key_event.keyCode == swt(:cr)
482
- if project_dir.selected_child
483
- Command.do(project_dir.selected_child, :replace_next!)
642
+ @replace_text = text {
643
+ layout_data(:fill, :center, true, false) {
644
+ minimum_width 400
645
+ }
646
+ text bind(project_dir, 'selected_child.replace_text')
647
+ foreground @default_foreground
648
+ font stat_font
649
+ on_focus_gained {
650
+ project_dir.selected_child&.ensure_find_next
651
+ }
652
+ on_key_pressed { |key_event|
653
+ if key_event.keyCode == swt(:cr)
654
+ if project_dir.selected_child
655
+ Command.do(project_dir.selected_child, :replace_next!)
656
+ end
484
657
  end
485
- end
658
+ }
659
+ }
660
+ label # filler
661
+ label {
662
+ layout_data(:left, :center, false, false)
663
+ text 'Top Pixel:'
664
+ foreground @default_foreground
665
+ }
666
+ label(:right) {
667
+ layout_data(:fill, :center, true, false)
668
+ text bind(project_dir, 'selected_child.top_pixel')
669
+ foreground @default_foreground
670
+ font stat_font
486
671
  }
487
672
  }
488
- label
673
+
674
+ on_item_collapsed {
675
+ @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
676
+ @navigation_expand_item.swt_expand_item.height = 0
677
+ async_exec {
678
+ body_root.pack_same_size
679
+ }
680
+ }
681
+
682
+ on_item_expanded {
683
+ @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
684
+ async_exec {
685
+ body_root.pack_same_size
686
+ }
687
+ }
688
+
489
689
  }
690
+
490
691
  @tab_folder_sash_form = sash_form {
491
692
  layout_data(:fill, :fill, true, true) {
492
- width_hint 640
493
- height_hint 480
693
+ width_hint 768
694
+ height_hint 576
695
+ minimum_width 768
696
+ minimum_height 576
494
697
  }
495
698
  sash_width 10
496
699
  orientation bind(self, :split_orientation)
@@ -539,8 +742,8 @@ module Glimmer
539
742
  open_file_paths2 = @config[:open_file_paths2]
540
743
  self.split_orientation = swt(@config[:split_orientation] || :horizontal) rescue swt(:horizontal)
541
744
  if @progress_bar_shell.nil?
542
- @progress_bar_shell = shell(body_root) {
543
- text 'Opening Last Open Files'
745
+ @progress_bar_shell = shell(body_root, :title) {
746
+ text 'Gladiator'
544
747
  fill_layout(:vertical) {
545
748
  margin_width 15
546
749
  margin_height 15
@@ -674,6 +877,7 @@ module Glimmer
674
877
  parent_path = ::File.dirname(file.path)
675
878
  if file.is_a?(Gladiator::Dir)
676
879
  file_paths = file.all_children.select {|f| f.is_a?(Gladiator::File)}.map(&:path)
880
+ file.remove_all_observers
677
881
  else
678
882
  file_paths = [file.path]
679
883
  end
@@ -777,8 +981,8 @@ module Glimmer
777
981
 
778
982
  def open_project
779
983
  selected_directory = directory_dialog.open
780
- @progress_bar_shell = shell(body_root) {
781
- text 'Opening Project'
984
+ @progress_bar_shell = shell(body_root, :title) {
985
+ text 'Gladiator'
782
986
  fill_layout(:vertical) {
783
987
  margin_width 15
784
988
  margin_height 15
@@ -19,13 +19,19 @@ module Glimmer
19
19
 
20
20
  body {
21
21
  composite {
22
+ grid_layout(2, false)
23
+ # TODO troubleshoot why adding margin height 0 causes gladiator to start resizing window smaller than necessary upon launch of Gladiator
24
+ # {
25
+ # margin_height 0
26
+ # }
27
+
22
28
  layout_data :fill, :fill, true, true
23
- grid_layout 2, false
24
- @line_numbers_text = styled_text(:multi, :wrap, :border) {
29
+ @line_numbers_text = styled_text(:multi, :border) {
25
30
  layout_data(:right, :fill, false, true)
31
+
26
32
  font name: 'Consolas', height: OS.mac? ? 15 : 12
27
33
  background color(:widget_background)
28
- foreground rgb(0, 0, 250)
34
+ foreground :dark_blue
29
35
  text bind(self, 'file.line_numbers_content')
30
36
  top_pixel bind(self, 'file.top_pixel', read_only: true)
31
37
  top_margin 5
@@ -33,7 +39,6 @@ module Glimmer
33
39
  bottom_margin 5
34
40
  left_margin 5
35
41
  editable false
36
- alignment swt(:right)
37
42
  on_focus_gained {
38
43
  @text&.swt_widget.setFocus
39
44
  }
@@ -51,7 +56,8 @@ module Glimmer
51
56
  foreground rgb(75, 75, 75)
52
57
  text bind(self, 'file.content')
53
58
  focus true
54
- selection bind(self, 'file.selection')
59
+ selection_count bind(self, 'file.selection_count')
60
+ caret_position bind(self, 'file.caret_position')
55
61
  top_pixel bind(self, 'file.top_pixel')
56
62
  top_margin 5
57
63
  right_margin 5
@@ -144,7 +150,7 @@ module Glimmer
144
150
  }
145
151
  }
146
152
  }
147
-
153
+
148
154
  def extract_char(event)
149
155
  event.keyCode.chr
150
156
  rescue => e
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.5.4
4
+ version: 0.6.0
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-11-20 00:00:00.000000000 Z
11
+ date: 2020-11-23 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: 4.17.10.0
18
+ version: 4.17.10.2
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 5.0.0.0
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 4.17.10.0
29
+ version: 4.17.10.2
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: 5.0.0.0