glimmer-cs-gladiator 0.5.4 → 0.6.0

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: 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