glimmer-cs-gladiator 0.5.4 → 0.6.4
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 +4 -4
- data/CHANGELOG.md +217 -0
- data/README.md +53 -21
- data/VERSION +1 -1
- data/glimmer-cs-gladiator.gemspec +70 -0
- data/images/glimmer-cs-gladiator-logo.png +0 -0
- data/lib/models/glimmer/gladiator/command.rb +41 -8
- data/lib/models/glimmer/gladiator/dir.rb +1 -1
- data/lib/models/glimmer/gladiator/file.rb +89 -59
- data/lib/views/glimmer/gladiator.rb +564 -231
- data/lib/views/glimmer/gladiator/text_editor.rb +120 -93
- metadata +14 -11
@@ -3,7 +3,7 @@ module Glimmer
|
|
3
3
|
class File
|
4
4
|
include Glimmer
|
5
5
|
|
6
|
-
attr_accessor :line_numbers_content, :
|
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
|
-
@
|
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,25 @@ module Glimmer
|
|
24
26
|
begin
|
25
27
|
# test read dirty content
|
26
28
|
observe(self, :dirty_content) do
|
27
|
-
|
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 =
|
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, :
|
36
|
-
|
37
|
-
async_exec {
|
38
|
-
self.line_number = new_line_number
|
39
|
-
}
|
38
|
+
observe(self, :caret_position) do |new_caret_position|
|
39
|
+
update_line_number_from_caret_position(new_caret_position)
|
40
40
|
end
|
41
|
-
observe(self, :line_number) do
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
}
|
49
|
-
end
|
41
|
+
observe(self, :line_number) do |new_line_number|
|
42
|
+
line_index = line_number - 1
|
43
|
+
new_caret_position = caret_position_for_line_index(line_index)
|
44
|
+
current_caret_position = caret_position
|
45
|
+
line_index_for_new_caret_position = line_index_for_caret_position(new_caret_position)
|
46
|
+
line_index_for_current_caret_position = line_index_for_caret_position(current_caret_position)
|
47
|
+
self.caret_position = new_caret_position unless (current_caret_position && line_index_for_new_caret_position == line_index_for_current_caret_position)
|
50
48
|
end
|
51
49
|
rescue # in case of a binary file
|
52
50
|
stop_filewatcher
|
@@ -54,6 +52,16 @@ module Glimmer
|
|
54
52
|
end
|
55
53
|
end
|
56
54
|
|
55
|
+
def update_line_number_from_caret_position(new_caret_position)
|
56
|
+
new_line_number = line_index_for_caret_position(caret_position) + 1
|
57
|
+
current_line_number = line_number
|
58
|
+
unless (current_line_number && current_line_number == new_line_number)
|
59
|
+
self.line_number = new_line_number
|
60
|
+
# TODO check if the following line is needed
|
61
|
+
self.line_position = caret_position - caret_position_for_line_index(line_number - 1) + 1
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
57
65
|
def path=(the_path)
|
58
66
|
@path = the_path
|
59
67
|
generate_display_path
|
@@ -63,6 +71,15 @@ module Glimmer
|
|
63
71
|
return if @path.empty?
|
64
72
|
@display_path = @path.sub(project_dir.path, '').sub(/^\//, '')
|
65
73
|
end
|
74
|
+
|
75
|
+
def name=(the_name)
|
76
|
+
new_path = path.sub(/#{Regexp.escape(@name)}$/, the_name) unless scratchpad?
|
77
|
+
@name = the_name
|
78
|
+
if !scratchpad? && ::File.exist?(path)
|
79
|
+
FileUtils.mv(path, new_path)
|
80
|
+
self.path = new_path
|
81
|
+
end
|
82
|
+
end
|
66
83
|
|
67
84
|
def scratchpad?
|
68
85
|
path.to_s.empty?
|
@@ -80,48 +97,18 @@ module Glimmer
|
|
80
97
|
send("#{property}=", value)
|
81
98
|
end
|
82
99
|
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
|
-
|
100
|
+
|
98
101
|
def caret_position=(value)
|
99
|
-
|
100
|
-
|
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
|
102
|
+
@last_caret_position = @caret_position
|
103
|
+
@caret_position = value
|
110
104
|
end
|
111
105
|
|
112
106
|
def selection_count=(value)
|
113
|
-
|
107
|
+
#@last_selection_count = @selection_count
|
108
|
+
@selection_count = value
|
109
|
+
@last_selection_count = @selection_count
|
114
110
|
end
|
115
111
|
|
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
112
|
def dirty_content
|
126
113
|
init_content
|
127
114
|
@dirty_content
|
@@ -132,14 +119,50 @@ module Glimmer
|
|
132
119
|
@dirty_content = the_content
|
133
120
|
old_caret_position = caret_position
|
134
121
|
old_top_pixel = top_pixel
|
122
|
+
|
135
123
|
notify_observers(:content)
|
136
124
|
if @formatting_dirty_content_for_writing
|
137
125
|
self.caret_position = old_caret_position
|
138
|
-
self.selection_count = 0
|
139
126
|
self.top_pixel = old_top_pixel
|
140
127
|
end
|
141
128
|
end
|
142
129
|
|
130
|
+
def content
|
131
|
+
dirty_content
|
132
|
+
end
|
133
|
+
|
134
|
+
# to use for widget data-binding
|
135
|
+
def content=(value)
|
136
|
+
value = value.gsub("\t", ' ')
|
137
|
+
if dirty_content != value
|
138
|
+
Command.do(self, :change_content!, value)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def change_content!(value)
|
143
|
+
self.dirty_content = value
|
144
|
+
update_line_number_from_caret_position(caret_position)
|
145
|
+
end
|
146
|
+
|
147
|
+
def start_command
|
148
|
+
@commmand_in_progress = true
|
149
|
+
end
|
150
|
+
|
151
|
+
def end_command
|
152
|
+
@commmand_in_progress = false
|
153
|
+
end
|
154
|
+
|
155
|
+
def command_in_progress?
|
156
|
+
@commmand_in_progress
|
157
|
+
end
|
158
|
+
|
159
|
+
def close
|
160
|
+
stop_filewatcher
|
161
|
+
remove_all_observers
|
162
|
+
initialize(path, project_dir)
|
163
|
+
Command.clear(self)
|
164
|
+
end
|
165
|
+
|
143
166
|
def read_dirty_content
|
144
167
|
path.empty? ? '' : ::File.read(path)
|
145
168
|
end
|
@@ -176,7 +199,9 @@ module Glimmer
|
|
176
199
|
end
|
177
200
|
|
178
201
|
def format_dirty_content_for_writing!
|
179
|
-
|
202
|
+
return if @commmand_in_progress
|
203
|
+
# TODO f ix c ar e t pos it ion after formatting dirty content (diff?)
|
204
|
+
new_dirty_content = dirty_content.to_s.split("\n").map {|line| line.strip.empty? ? line : line.rstrip }.join("\n")
|
180
205
|
new_dirty_content = "#{new_dirty_content.gsub("\r\n", "\n").gsub("\r", "\n").sub(/\n+\z/, '')}\n"
|
181
206
|
if new_dirty_content != self.dirty_content
|
182
207
|
@formatting_dirty_content_for_writing = true
|
@@ -494,13 +519,18 @@ module Glimmer
|
|
494
519
|
write_dirty_content
|
495
520
|
load path
|
496
521
|
end
|
497
|
-
rescue SyntaxError, StandardError => e
|
522
|
+
rescue LoadError, SyntaxError, StandardError => e
|
523
|
+
# TODO consider showing a message dialog or error message console in the future
|
498
524
|
puts e.full_message
|
499
525
|
end
|
500
526
|
end
|
501
527
|
|
502
528
|
def lines
|
503
|
-
dirty_content.
|
529
|
+
need_padding = dirty_content.to_s.end_with?("\n")
|
530
|
+
splittable_content = need_padding ? "#{dirty_content} " : dirty_content
|
531
|
+
the_lines = splittable_content.split("\n")
|
532
|
+
the_lines[-1] = the_lines[-1].strip if need_padding
|
533
|
+
the_lines
|
504
534
|
end
|
505
535
|
|
506
536
|
def line_for_caret_position(caret_position)
|
@@ -510,7 +540,7 @@ module Glimmer
|
|
510
540
|
def line_index_for_caret_position(caret_position)
|
511
541
|
dirty_content[0...caret_position.to_i].count("\n")
|
512
542
|
end
|
513
|
-
|
543
|
+
|
514
544
|
def caret_position_for_line_index(line_index)
|
515
545
|
cp = lines[0...line_index].join("\n").size
|
516
546
|
cp += 1 if line_index > 0
|
@@ -18,10 +18,14 @@ module Glimmer
|
|
18
18
|
APP_ROOT = ::File.expand_path('../../../..', __FILE__)
|
19
19
|
# TODO make sure COMMAND_KEY doesn't clash on Linux/Windows for CMD+CTRL shortcuts
|
20
20
|
COMMAND_KEY = OS.mac? ? :command : :ctrl
|
21
|
+
VERSION = ::File.read(::File.join(APP_ROOT, 'VERSION')).to_s.strip
|
22
|
+
LICENSE = ::File.read(::File.join(APP_ROOT, 'LICENSE.txt')).to_s.strip
|
23
|
+
ICON = ::File.expand_path(::File.join(APP_ROOT, 'images', 'glimmer-cs-gladiator-logo.png'))
|
21
24
|
|
22
25
|
class << self
|
23
26
|
attr_accessor :drag_and_drop
|
24
27
|
attr_accessor :drag
|
28
|
+
attr_accessor :startup
|
25
29
|
end
|
26
30
|
|
27
31
|
## Add options like the following to configure CustomShell by outside consumers
|
@@ -62,20 +66,29 @@ module Glimmer
|
|
62
66
|
before_body {
|
63
67
|
# TODO consider doing loading project files after displaying the GUI instead of holding it up before
|
64
68
|
project_dir #pre-initialize directory
|
65
|
-
at_exit do
|
69
|
+
TOPLEVEL_BINDING.receiver.send(:at_exit) do
|
66
70
|
project_dir.selected_child&.write_raw_dirty_content
|
67
71
|
end
|
68
72
|
Display.setAppName('Gladiator')
|
69
73
|
# make sure the display events are only hooked once if multiple gladiators are created
|
70
74
|
unless defined?(@@display)
|
71
75
|
@@display = display {
|
76
|
+
# TODO look into why a weird java dialog comes up on about (maybe a non-issue once packaged)
|
77
|
+
on_about {
|
78
|
+
display_about_dialog
|
79
|
+
}
|
72
80
|
on_swt_keydown { |key_event|
|
73
81
|
focused_gladiator = display.focus_control.shell&.get_data('custom_shell')
|
74
82
|
focused_gladiator.handle_display_shortcut(key_event) if !focused_gladiator.nil? && key_event.widget.shell == focused_gladiator&.swt_widget
|
75
83
|
}
|
84
|
+
on_swt_Close {
|
85
|
+
save_config
|
86
|
+
project_dir.selected_child&.write_dirty_content
|
87
|
+
}
|
76
88
|
}
|
77
89
|
end
|
78
90
|
|
91
|
+
@default_foreground = :dark_blue
|
79
92
|
@split_orientation = swt(:horizontal)
|
80
93
|
@config_file_path = ::File.join(project_dir.path, '.gladiator')
|
81
94
|
@config = {}
|
@@ -87,42 +100,52 @@ module Glimmer
|
|
87
100
|
#
|
88
101
|
after_body {
|
89
102
|
observe(project_dir, 'children') do
|
90
|
-
select_tree_item unless @rename_in_progress
|
103
|
+
select_tree_item unless @rename_in_progress || Gladiator.startup
|
91
104
|
end
|
92
105
|
observe(project_dir, 'selected_child') do |selected_file|
|
93
106
|
if selected_file
|
94
107
|
if Gladiator.drag && !@tab_folder2
|
95
108
|
@tab_folder1 = @current_tab_folder
|
109
|
+
async_exec { body_root.pack_same_size}
|
96
110
|
@tab_folder_sash_form.content {
|
97
111
|
@current_tab_folder = @tab_folder2 = tab_folder
|
98
112
|
@current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
|
99
113
|
}
|
100
114
|
end
|
101
|
-
select_tree_item unless @rename_in_progress
|
115
|
+
select_tree_item unless @rename_in_progress || Gladiator.startup
|
102
116
|
found_tab_item = selected_tab_item
|
103
117
|
if found_tab_item
|
104
118
|
@current_tab_folder.swt_widget.setSelection(found_tab_item)
|
105
119
|
@current_tab_item = found_tab_item.getData('proxy')
|
106
|
-
@current_text_editor = found_tab_item.getData('text_editor')
|
120
|
+
@current_text_editor = found_tab_item.getData('text_editor') unless found_tab_item.getData('text_editor').nil?
|
107
121
|
@current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
|
108
122
|
elsif selected_file
|
109
123
|
@current_tab_folder.content {
|
110
124
|
@current_tab_item = tab_item { |the_tab_item|
|
111
125
|
text selected_file.name
|
112
|
-
fill_layout
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
126
|
+
fill_layout(:horizontal) {
|
127
|
+
margin_width 0
|
128
|
+
margin_height 0
|
129
|
+
}
|
130
|
+
tab_folder = nil
|
131
|
+
the_text_editor = nil
|
132
|
+
the_tab_item.content {
|
133
|
+
@current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file)
|
134
|
+
@current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
|
135
|
+
the_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
|
136
|
+
@current_text_editor.text_proxy.content {
|
137
|
+
on_focus_gained {
|
138
|
+
tab_folder = the_text_editor.swt_widget.getParent.getParent
|
139
|
+
@current_tab_folder = tab_folder.getData('proxy')
|
140
|
+
@current_tab_item = the_tab_item
|
141
|
+
@current_text_editor = the_text_editor
|
142
|
+
@current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
|
143
|
+
@current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
|
144
|
+
project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
|
145
|
+
}
|
124
146
|
}
|
125
147
|
}
|
148
|
+
|
126
149
|
on_swt_show {
|
127
150
|
@current_tab_item = the_tab_item
|
128
151
|
@current_text_editor = the_text_editor
|
@@ -134,14 +157,20 @@ module Glimmer
|
|
134
157
|
@current_text_editor&.text_widget&.setFocus
|
135
158
|
}
|
136
159
|
}
|
160
|
+
on_widget_disposed {
|
161
|
+
project_dir.selected_child&.write_dirty_content
|
162
|
+
tab_item_file = the_tab_item.swt_tab_item.get_data('file')
|
163
|
+
tab_item_file.close unless [@tab_folder1, @tab_folder2].compact.map(&:items).flatten(1).detect {|ti| ti.get_data('file') == tab_item_file}
|
164
|
+
}
|
137
165
|
}
|
138
166
|
@current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
|
139
167
|
@current_tab_item.swt_tab_item.setData('file', selected_file)
|
140
|
-
@current_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
|
141
168
|
@current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
|
142
169
|
}
|
143
170
|
@current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
|
171
|
+
|
144
172
|
body_root.pack_same_size
|
173
|
+
async_exec { body_root.pack_same_size}
|
145
174
|
end
|
146
175
|
@current_text_editor&.text_widget&.setFocus
|
147
176
|
end
|
@@ -163,17 +192,31 @@ module Glimmer
|
|
163
192
|
#
|
164
193
|
body {
|
165
194
|
shell {
|
195
|
+
grid_layout(2, false)
|
166
196
|
text "Gladiator - #{::File.expand_path(project_dir.path)}"
|
167
197
|
minimum_size 520, 250
|
168
198
|
size 1440, 900
|
169
|
-
|
199
|
+
image ICON
|
200
|
+
|
170
201
|
on_swt_show {
|
171
202
|
swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
|
172
203
|
swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
|
173
204
|
@loaded_config = true
|
174
205
|
}
|
175
|
-
|
206
|
+
|
207
|
+
on_shell_closed {
|
208
|
+
save_config
|
176
209
|
project_dir.selected_child&.write_dirty_content
|
210
|
+
if @tab_folder2
|
211
|
+
current_tab_folder.swt_widget.getItems.each do |tab_item|
|
212
|
+
tab_item.getData('proxy')&.dispose
|
213
|
+
end
|
214
|
+
close_tab_folder
|
215
|
+
end
|
216
|
+
current_tab_folder.swt_widget.getItems.each do |tab_item|
|
217
|
+
tab_item.getData('proxy')&.dispose
|
218
|
+
end
|
219
|
+
body_root.close unless current_tab_folder.swt_widget.getItems.empty?
|
177
220
|
}
|
178
221
|
on_widget_disposed {
|
179
222
|
project_dir.selected_child&.write_dirty_content
|
@@ -185,9 +228,17 @@ module Glimmer
|
|
185
228
|
save_config
|
186
229
|
}
|
187
230
|
on_shell_deactivated {
|
188
|
-
|
231
|
+
project_dir.selected_child&.write_dirty_content
|
189
232
|
}
|
190
233
|
|
234
|
+
if OS.mac?
|
235
|
+
display.swt_display.system_menu.items.find {|mi| mi.id == swt(:id_quit)}.add_selection_listener {
|
236
|
+
save_config
|
237
|
+
project_dir.selected_child&.write_dirty_content
|
238
|
+
exit(0)
|
239
|
+
}
|
240
|
+
end
|
241
|
+
|
191
242
|
menu_bar {
|
192
243
|
menu {
|
193
244
|
text '&File'
|
@@ -216,14 +267,14 @@ module Glimmer
|
|
216
267
|
text '&Split'
|
217
268
|
menu_item(:radio) {
|
218
269
|
text '&Horizontal'
|
219
|
-
selection bind(self, :split_orientation,
|
220
|
-
on_read: ->(o) { split_pane? && o == swt(:horizontal)},
|
270
|
+
selection bind(self, :split_orientation,
|
271
|
+
on_read: ->(o) { split_pane? && o == swt(:horizontal) },
|
221
272
|
on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical) })
|
222
273
|
}
|
223
274
|
menu_item(:radio) {
|
224
275
|
text '&Vertical'
|
225
|
-
selection bind(self, :split_orientation,
|
226
|
-
on_read: ->(o) { split_pane? && o == swt(:vertical)},
|
276
|
+
selection bind(self, :split_orientation,
|
277
|
+
on_read: ->(o) { split_pane? && o == swt(:vertical) },
|
227
278
|
on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal) })
|
228
279
|
}
|
229
280
|
}
|
@@ -250,127 +301,227 @@ module Glimmer
|
|
250
301
|
}
|
251
302
|
}
|
252
303
|
}
|
304
|
+
menu {
|
305
|
+
text '&Help'
|
306
|
+
menu_item {
|
307
|
+
text '&About'
|
308
|
+
on_widget_selected {
|
309
|
+
display_about_dialog
|
310
|
+
}
|
311
|
+
}
|
312
|
+
}
|
253
313
|
}
|
254
314
|
|
255
315
|
composite {
|
256
|
-
grid_layout
|
316
|
+
grid_layout(1, false) {
|
317
|
+
margin_width 0
|
318
|
+
margin_height 0
|
319
|
+
}
|
320
|
+
|
257
321
|
layout_data(:fill, :fill, false, true) {
|
258
322
|
width_hint 300
|
259
323
|
}
|
260
|
-
@
|
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) {
|
324
|
+
@side_bar_sash_form = sash_form(:vertical) {
|
274
325
|
layout_data(:fill, :fill, true, true)
|
275
326
|
sash_width 4
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
327
|
+
|
328
|
+
resize_expand_items = lambda { |event=nil|
|
329
|
+
@file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
|
330
|
+
@file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
|
331
|
+
}
|
332
|
+
|
333
|
+
@file_lookup_expand_bar = expand_bar {
|
334
|
+
layout_data :fill, :fill, true, true
|
335
|
+
font height: 17, style: :bold
|
336
|
+
foreground @default_foreground
|
337
|
+
|
338
|
+
on_swt_show {
|
339
|
+
@file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
|
287
340
|
}
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
341
|
+
|
342
|
+
on_swt_Resize(&resize_expand_items)
|
343
|
+
|
344
|
+
@file_lookup_expand_item = expand_item {
|
345
|
+
grid_layout {
|
346
|
+
margin_width 0
|
347
|
+
margin_height 0
|
294
348
|
}
|
349
|
+
text 'File Lookup'
|
350
|
+
height display.bounds.height
|
351
|
+
|
352
|
+
@filter_text = text {
|
353
|
+
layout_data :fill, :center, true, false
|
354
|
+
text bind(project_dir, 'filter')
|
355
|
+
on_key_pressed { |key_event|
|
356
|
+
if key_event.keyCode == swt(:tab) ||
|
357
|
+
key_event.keyCode == swt(:cr) ||
|
358
|
+
key_event.keyCode == swt(:arrow_up) ||
|
359
|
+
key_event.keyCode == swt(:arrow_down)
|
360
|
+
@file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
|
361
|
+
@file_lookup_list.swt_widget.setFocus
|
362
|
+
end
|
363
|
+
}
|
364
|
+
}
|
365
|
+
|
366
|
+
@file_lookup_list = list(:border, :h_scroll, :v_scroll) {
|
367
|
+
layout_data :fill, :fill, true, true
|
368
|
+
#visible bind(self, 'project_dir.filter') {|f| !!f}
|
369
|
+
selection bind(project_dir, :filtered_path)
|
370
|
+
foreground @default_foreground
|
371
|
+
on_mouse_up {
|
372
|
+
project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
|
373
|
+
}
|
374
|
+
on_key_pressed { |key_event|
|
375
|
+
if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
|
376
|
+
project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
|
377
|
+
@current_text_editor&.text_widget&.setFocus
|
378
|
+
end
|
379
|
+
}
|
380
|
+
drag_source(DND::DROP_COPY) {
|
381
|
+
transfer [TextTransfer.getInstance].to_java(Transfer)
|
382
|
+
on_drag_set_data { |event|
|
383
|
+
Gladiator.drag = true
|
384
|
+
list = event.widget.getControl
|
385
|
+
event.data = list.getSelection.first
|
386
|
+
}
|
387
|
+
}
|
388
|
+
}
|
389
|
+
}
|
390
|
+
|
391
|
+
on_item_collapsed { |event|
|
392
|
+
if @file_explorer_expand_item.swt_expand_item.get_expanded
|
393
|
+
@file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
|
394
|
+
@file_lookup_expand_item.swt_expand_item.height = 0
|
395
|
+
@file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
|
396
|
+
@file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
|
397
|
+
@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]
|
398
|
+
end
|
399
|
+
}
|
400
|
+
|
401
|
+
on_item_expanded {
|
402
|
+
@file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
|
403
|
+
@side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
|
295
404
|
}
|
405
|
+
|
296
406
|
}
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
tree_item = tree.getSelection.first
|
306
|
-
event.data = tree_item.getData.path
|
307
|
-
}
|
407
|
+
|
408
|
+
@file_explorer_expand_bar = expand_bar {
|
409
|
+
layout_data :fill, :fill, true, true
|
410
|
+
font height: 17, style: :bold
|
411
|
+
foreground @default_foreground
|
412
|
+
|
413
|
+
on_swt_show {
|
414
|
+
@file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
|
308
415
|
}
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
416
|
+
|
417
|
+
on_swt_Resize(&resize_expand_items)
|
418
|
+
|
419
|
+
@file_explorer_expand_item = expand_item {
|
420
|
+
grid_layout {
|
421
|
+
margin_width 0
|
422
|
+
margin_height 0
|
315
423
|
}
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
424
|
+
text 'File Explorer'
|
425
|
+
height display.bounds.height
|
426
|
+
|
427
|
+
@file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
|
428
|
+
layout_data :fill, :fill, true, true
|
429
|
+
#visible bind(self, 'project_dir.filter') {|f| !f}
|
430
|
+
items bind(self, :project_dir), tree_properties(children: :children, text: :name)
|
431
|
+
foreground @default_foreground
|
432
|
+
drag_source(DND::DROP_COPY) {
|
433
|
+
transfer [TextTransfer.getInstance].to_java(Transfer)
|
434
|
+
on_drag_set_data { |event|
|
435
|
+
Gladiator.drag = true
|
436
|
+
tree = event.widget.getControl
|
437
|
+
tree_item = tree.getSelection.first
|
438
|
+
event.data = tree_item.getData.path
|
439
|
+
}
|
322
440
|
}
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
441
|
+
menu {
|
442
|
+
@open_menu_item = menu_item {
|
443
|
+
text 'Open'
|
444
|
+
on_widget_selected {
|
445
|
+
project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
|
446
|
+
}
|
447
|
+
}
|
448
|
+
menu_item(:separator)
|
449
|
+
menu_item {
|
450
|
+
text 'Delete'
|
451
|
+
on_widget_selected {
|
452
|
+
tree_item = @file_tree.swt_widget.getSelection.first
|
453
|
+
delete_tree_item(tree_item)
|
454
|
+
}
|
455
|
+
}
|
456
|
+
menu_item {
|
457
|
+
text 'Refresh'
|
458
|
+
on_widget_selected {
|
459
|
+
project_dir.refresh
|
460
|
+
}
|
461
|
+
}
|
462
|
+
menu_item {
|
463
|
+
text 'Rename'
|
464
|
+
on_widget_selected {
|
465
|
+
rename_selected_tree_item
|
466
|
+
}
|
467
|
+
}
|
468
|
+
menu_item {
|
469
|
+
text 'New Directory'
|
470
|
+
on_widget_selected {
|
471
|
+
add_new_directory_to_selected_tree_item
|
472
|
+
}
|
473
|
+
}
|
474
|
+
menu_item {
|
475
|
+
text 'New File'
|
476
|
+
on_widget_selected {
|
477
|
+
add_new_file_to_selected_tree_item
|
478
|
+
}
|
479
|
+
}
|
328
480
|
}
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
on_widget_selected {
|
333
|
-
rename_selected_tree_item
|
481
|
+
on_swt_menudetect { |event|
|
482
|
+
path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
|
483
|
+
@open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
|
334
484
|
}
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
485
|
+
on_mouse_up {
|
486
|
+
if Gladiator.drag_and_drop
|
487
|
+
Gladiator.drag_and_drop = false
|
488
|
+
else
|
489
|
+
project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
|
490
|
+
@current_text_editor&.text_widget&.setFocus
|
491
|
+
end
|
340
492
|
}
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
493
|
+
on_key_pressed { |key_event|
|
494
|
+
if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
|
495
|
+
project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
|
496
|
+
@current_text_editor&.text_widget&.setFocus
|
497
|
+
end
|
498
|
+
}
|
499
|
+
on_paint_control {
|
500
|
+
root_item = @file_tree.swt_widget.getItems.first
|
501
|
+
if root_item && !root_item.getExpanded
|
502
|
+
root_item.setExpanded(true)
|
503
|
+
end
|
346
504
|
}
|
347
505
|
}
|
348
506
|
}
|
349
|
-
|
350
|
-
|
351
|
-
@
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
|
358
|
-
@current_text_editor&.text_widget&.setFocus
|
507
|
+
|
508
|
+
on_item_collapsed { |event|
|
509
|
+
if @file_lookup_expand_item.swt_expand_item.get_expanded
|
510
|
+
@file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
|
511
|
+
@file_explorer_expand_item.swt_expand_item.height = 0
|
512
|
+
@file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
|
513
|
+
@file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
|
514
|
+
@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]
|
359
515
|
end
|
360
516
|
}
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
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
|
517
|
+
|
518
|
+
on_item_expanded {
|
519
|
+
@file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
|
520
|
+
@side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
|
372
521
|
}
|
522
|
+
|
373
523
|
}
|
524
|
+
|
374
525
|
}
|
375
526
|
|
376
527
|
# TODO see if you could replace some of this with Glimmer DSL/API syntax
|
@@ -380,120 +531,224 @@ module Glimmer
|
|
380
531
|
@file_tree_editor.minimumHeight = 20;
|
381
532
|
|
382
533
|
}
|
383
|
-
|
384
|
-
|
534
|
+
|
535
|
+
composite {
|
536
|
+
grid_layout(1, false) {
|
537
|
+
margin_width 0
|
538
|
+
margin_height 0
|
539
|
+
}
|
385
540
|
layout_data :fill, :fill, true, true
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
541
|
+
|
542
|
+
@navigation_expand_bar = expand_bar {
|
543
|
+
layout_data :fill, :top, true, false
|
544
|
+
font height: 17, style: :bold
|
545
|
+
foreground @default_foreground
|
546
|
+
|
547
|
+
@navigation_expand_item = expand_item {
|
548
|
+
text 'Navigation'
|
549
|
+
height 115
|
390
550
|
|
391
|
-
|
392
|
-
|
393
|
-
}
|
394
|
-
|
395
|
-
@file_path_label = styled_text(:none) {
|
396
|
-
layout_data(:fill, :fill, true, false) {
|
397
|
-
horizontal_span 2
|
551
|
+
grid_layout(5, false) {
|
552
|
+
margin_right 5
|
398
553
|
}
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
554
|
+
|
555
|
+
stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
|
556
|
+
|
557
|
+
# row 1
|
558
|
+
|
559
|
+
label {
|
560
|
+
layout_data(:left, :center, false, false)
|
561
|
+
text 'File:'
|
562
|
+
foreground @default_foreground
|
405
563
|
}
|
406
|
-
|
407
|
-
|
564
|
+
|
565
|
+
@file_path_label = styled_text(:none) {
|
566
|
+
layout_data(:fill, :center, true, false) {
|
567
|
+
horizontal_span 2
|
568
|
+
}
|
569
|
+
background color(:widget_background)
|
570
|
+
foreground @default_foreground
|
571
|
+
editable false
|
572
|
+
caret nil
|
573
|
+
text bind(project_dir, 'selected_child.path')
|
574
|
+
on_mouse_up {
|
575
|
+
@file_path_label.swt_widget.selectAll
|
576
|
+
}
|
577
|
+
on_focus_lost {
|
578
|
+
@file_path_label.swt_widget.setSelection(0, 0)
|
579
|
+
}
|
408
580
|
}
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
text 'Line:'
|
415
|
-
}
|
416
|
-
@line_number_text = text {
|
417
|
-
layout_data(:fill, :fill, true, false) {
|
418
|
-
minimum_width 400
|
419
|
-
}
|
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
|
581
|
+
|
582
|
+
label {
|
583
|
+
layout_data(:left, :center, false, false)
|
584
|
+
text 'Caret Position:'
|
585
|
+
foreground @default_foreground
|
425
586
|
}
|
426
|
-
|
427
|
-
|
587
|
+
label(:right) {
|
588
|
+
layout_data(:fill, :center, true, false)
|
589
|
+
text bind(project_dir, 'selected_child.caret_position')
|
590
|
+
foreground @default_foreground
|
591
|
+
font stat_font
|
428
592
|
}
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
}
|
437
|
-
@find_text = text {
|
438
|
-
layout_data(:fill, :center, true, false) {
|
439
|
-
minimum_width 400
|
440
|
-
}
|
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
|
593
|
+
|
594
|
+
# row 2
|
595
|
+
|
596
|
+
label {
|
597
|
+
layout_data(:left, :center, false, false)
|
598
|
+
text 'Line:'
|
599
|
+
foreground @default_foreground
|
450
600
|
}
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
601
|
+
@line_number_text = text {
|
602
|
+
layout_data(:fill, :center, true, false) {
|
603
|
+
minimum_width 400
|
604
|
+
}
|
605
|
+
text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
|
606
|
+
foreground @default_foreground
|
607
|
+
font stat_font
|
608
|
+
on_key_pressed { |key_event|
|
609
|
+
if key_event.keyCode == swt(:cr)
|
610
|
+
@current_text_editor&.text_widget&.setFocus
|
611
|
+
end
|
612
|
+
}
|
613
|
+
on_verify_text { |event|
|
614
|
+
event.doit = !event.text.match(/^\d*$/).to_a.empty?
|
615
|
+
}
|
616
|
+
}
|
617
|
+
label # filler
|
618
|
+
|
619
|
+
label {
|
620
|
+
layout_data(:left, :center, false, false)
|
621
|
+
text 'Line Position:'
|
622
|
+
foreground @default_foreground
|
623
|
+
}
|
624
|
+
label(:right) {
|
625
|
+
layout_data(:fill, :center, true, false)
|
626
|
+
text bind(project_dir, 'selected_child.line_position')
|
627
|
+
foreground @default_foreground
|
628
|
+
font stat_font
|
629
|
+
}
|
630
|
+
|
631
|
+
# row 3
|
632
|
+
|
633
|
+
label {
|
634
|
+
layout_data(:left, :center, false, false)
|
635
|
+
text 'Find:'
|
636
|
+
foreground @default_foreground
|
637
|
+
}
|
638
|
+
@find_text = text {
|
639
|
+
layout_data(:fill, :center, true, false) {
|
640
|
+
minimum_width 400
|
641
|
+
}
|
642
|
+
text bind(project_dir, 'selected_child.find_text')
|
643
|
+
foreground @default_foreground
|
644
|
+
font stat_font
|
456
645
|
on_key_pressed { |key_event|
|
646
|
+
if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
|
647
|
+
project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
|
648
|
+
project_dir.selected_child&.find_next
|
649
|
+
end
|
457
650
|
if key_event.keyCode == swt(:cr)
|
458
651
|
project_dir.selected_child&.find_next
|
459
652
|
end
|
460
653
|
}
|
461
654
|
}
|
655
|
+
composite {
|
656
|
+
layout_data(:left, :center, true, false)
|
657
|
+
row_layout {
|
658
|
+
margin_width 0
|
659
|
+
margin_height 0
|
660
|
+
}
|
661
|
+
button(:check) {
|
662
|
+
selection bind(project_dir, 'selected_child.case_sensitive')
|
663
|
+
on_key_pressed { |key_event|
|
664
|
+
if key_event.keyCode == swt(:cr)
|
665
|
+
project_dir.selected_child&.find_next
|
666
|
+
end
|
667
|
+
}
|
668
|
+
}
|
669
|
+
label {
|
670
|
+
text 'Case-sensitive'
|
671
|
+
foreground @default_foreground
|
672
|
+
}
|
673
|
+
}
|
674
|
+
|
675
|
+
label {
|
676
|
+
layout_data(:left, :center, false, false)
|
677
|
+
text 'Selection Count:'
|
678
|
+
foreground @default_foreground
|
679
|
+
}
|
680
|
+
label(:right) {
|
681
|
+
layout_data(:fill, :center, true, false)
|
682
|
+
text bind(project_dir, 'selected_child.selection_count')
|
683
|
+
foreground @default_foreground
|
684
|
+
font stat_font
|
685
|
+
}
|
686
|
+
|
687
|
+
# row 4
|
688
|
+
|
462
689
|
label {
|
463
|
-
|
690
|
+
layout_data(:left, :center, false, false)
|
691
|
+
text 'Replace:'
|
692
|
+
foreground @default_foreground
|
693
|
+
}
|
694
|
+
@replace_text = text {
|
695
|
+
layout_data(:fill, :center, true, false) {
|
696
|
+
minimum_width 400
|
697
|
+
}
|
698
|
+
text bind(project_dir, 'selected_child.replace_text')
|
699
|
+
foreground @default_foreground
|
700
|
+
font stat_font
|
701
|
+
on_focus_gained {
|
702
|
+
project_dir.selected_child&.ensure_find_next
|
703
|
+
}
|
704
|
+
on_key_pressed { |key_event|
|
705
|
+
if key_event.keyCode == swt(:cr)
|
706
|
+
if project_dir.selected_child
|
707
|
+
Command.do(project_dir.selected_child, :replace_next!)
|
708
|
+
end
|
709
|
+
end
|
710
|
+
}
|
711
|
+
}
|
712
|
+
label # filler
|
713
|
+
label {
|
714
|
+
layout_data(:left, :center, false, false)
|
715
|
+
text 'Top Pixel:'
|
716
|
+
foreground @default_foreground
|
717
|
+
}
|
718
|
+
label(:right) {
|
719
|
+
layout_data(:fill, :center, true, false)
|
720
|
+
text bind(project_dir, 'selected_child.top_pixel')
|
721
|
+
foreground @default_foreground
|
722
|
+
font stat_font
|
464
723
|
}
|
465
724
|
}
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
725
|
+
|
726
|
+
on_item_collapsed {
|
727
|
+
@navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
|
728
|
+
@navigation_expand_item.swt_expand_item.height = 0
|
729
|
+
async_exec {
|
730
|
+
body_root.pack_same_size
|
731
|
+
}
|
471
732
|
}
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
on_focus_gained {
|
478
|
-
project_dir.selected_child&.ensure_find_next
|
479
|
-
}
|
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!)
|
484
|
-
end
|
485
|
-
end
|
733
|
+
|
734
|
+
on_item_expanded {
|
735
|
+
@navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
|
736
|
+
async_exec {
|
737
|
+
body_root.pack_same_size
|
486
738
|
}
|
487
739
|
}
|
488
|
-
|
740
|
+
|
489
741
|
}
|
742
|
+
|
490
743
|
@tab_folder_sash_form = sash_form {
|
491
744
|
layout_data(:fill, :fill, true, true) {
|
492
|
-
width_hint
|
493
|
-
height_hint
|
745
|
+
width_hint 768
|
746
|
+
height_hint 576
|
747
|
+
minimum_width 768
|
748
|
+
minimum_height 576
|
494
749
|
}
|
495
750
|
sash_width 10
|
496
|
-
orientation bind(self, :split_orientation)
|
751
|
+
orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
|
497
752
|
@current_tab_folder = tab_folder {
|
498
753
|
drag_source(DND::DROP_COPY) {
|
499
754
|
transfer [TextTransfer.getInstance].to_java(Transfer)
|
@@ -539,8 +794,8 @@ module Glimmer
|
|
539
794
|
open_file_paths2 = @config[:open_file_paths2]
|
540
795
|
self.split_orientation = swt(@config[:split_orientation] || :horizontal) rescue swt(:horizontal)
|
541
796
|
if @progress_bar_shell.nil?
|
542
|
-
@progress_bar_shell = shell(body_root) {
|
543
|
-
text '
|
797
|
+
@progress_bar_shell = shell(body_root, :title) {
|
798
|
+
text 'Gladiator'
|
544
799
|
fill_layout(:vertical) {
|
545
800
|
margin_width 15
|
546
801
|
margin_height 15
|
@@ -559,37 +814,55 @@ module Glimmer
|
|
559
814
|
open_file_paths1.to_a.each do |file_path|
|
560
815
|
async_exec {
|
561
816
|
Gladiator.drag = false
|
817
|
+
Gladiator.startup = file_path != open_file_paths1.to_a[-1]
|
562
818
|
project_dir.selected_child_path = file_path
|
563
819
|
}
|
564
820
|
end
|
565
821
|
# TODO replace the next line with one that selects the visible tab
|
566
822
|
async_exec {
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
823
|
+
# TODO check why this is not working
|
824
|
+
if open_file_paths1.to_a.include?(@config[:selected_child_path])
|
825
|
+
Gladiator.drag = false
|
826
|
+
Gladiator.startup = false
|
827
|
+
project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
|
828
|
+
project_dir.selected_child&.caret_position = project_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
|
829
|
+
project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
|
830
|
+
end
|
571
831
|
}
|
572
832
|
async_exec {
|
573
833
|
open_file_paths2.to_a.each do |file_path|
|
574
834
|
async_exec {
|
575
835
|
Gladiator.drag = true
|
836
|
+
Gladiator.startup = file_path != open_file_paths2.to_a[-1]
|
576
837
|
project_dir.selected_child_path = file_path
|
577
838
|
}
|
578
839
|
end
|
579
840
|
# TODO replace the next line with one that selects the visible tab
|
580
841
|
async_exec {
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
842
|
+
# TODO check why this is not working
|
843
|
+
if open_file_paths2.to_a.include?(@config[:selected_child_path])
|
844
|
+
Gladiator.drag = true
|
845
|
+
Gladiator.startup = false
|
846
|
+
project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
|
847
|
+
project_dir.selected_child&.caret_position = project_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
|
848
|
+
project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
|
849
|
+
end
|
585
850
|
}
|
586
851
|
async_exec {
|
587
852
|
Gladiator.drag = false
|
588
|
-
@progress_bar_shell
|
853
|
+
@progress_bar_shell&.close
|
589
854
|
@progress_bar_shell = nil
|
590
855
|
@loaded_config = true
|
591
856
|
}
|
592
857
|
}
|
858
|
+
async_exec {
|
859
|
+
Thread.new {
|
860
|
+
all_files = open_file_paths1.to_a + open_file_paths2.to_a
|
861
|
+
all_files.each do |file|
|
862
|
+
project_dir.find_child_file(file)&.dirty_content
|
863
|
+
end
|
864
|
+
}
|
865
|
+
}
|
593
866
|
else
|
594
867
|
@loaded_config = true
|
595
868
|
end
|
@@ -636,8 +909,8 @@ module Glimmer
|
|
636
909
|
@current_tab_item = @current_tab_folder.swt_widget.getData('selected_tab_item')
|
637
910
|
@current_text_editor = @current_tab_item.swt_tab_item.getData('text_editor')
|
638
911
|
project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
|
639
|
-
|
640
|
-
body_root.pack_same_size
|
912
|
+
|
913
|
+
async_exec { body_root.pack_same_size }
|
641
914
|
end
|
642
915
|
end
|
643
916
|
|
@@ -674,6 +947,7 @@ module Glimmer
|
|
674
947
|
parent_path = ::File.dirname(file.path)
|
675
948
|
if file.is_a?(Gladiator::Dir)
|
676
949
|
file_paths = file.all_children.select {|f| f.is_a?(Gladiator::File)}.map(&:path)
|
950
|
+
file.remove_all_observers
|
677
951
|
else
|
678
952
|
file_paths = [file.path]
|
679
953
|
end
|
@@ -777,8 +1051,9 @@ module Glimmer
|
|
777
1051
|
|
778
1052
|
def open_project
|
779
1053
|
selected_directory = directory_dialog.open
|
780
|
-
|
781
|
-
|
1054
|
+
return if selected_directory.nil?
|
1055
|
+
@progress_bar_shell = shell(body_root, :title) {
|
1056
|
+
text 'Gladiator'
|
782
1057
|
fill_layout(:vertical) {
|
783
1058
|
margin_width 15
|
784
1059
|
margin_height 15
|
@@ -803,13 +1078,49 @@ module Glimmer
|
|
803
1078
|
}
|
804
1079
|
end
|
805
1080
|
|
1081
|
+
def display_about_dialog
|
1082
|
+
dialog {
|
1083
|
+
grid_layout(2, false) {
|
1084
|
+
margin_width 15
|
1085
|
+
margin_height 15
|
1086
|
+
}
|
1087
|
+
|
1088
|
+
background :white
|
1089
|
+
image ICON
|
1090
|
+
text 'About'
|
1091
|
+
|
1092
|
+
label {
|
1093
|
+
layout_data :center, :center, false, false
|
1094
|
+
background :white
|
1095
|
+
image ICON, height: 260
|
1096
|
+
}
|
1097
|
+
label {
|
1098
|
+
layout_data :fill, :fill, true, true
|
1099
|
+
background :white
|
1100
|
+
text "Gladiator v#{VERSION}\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
|
1101
|
+
}
|
1102
|
+
}.open
|
1103
|
+
end
|
1104
|
+
|
806
1105
|
def handle_display_shortcut(key_event)
|
807
1106
|
if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'f'
|
808
|
-
|
809
|
-
|
1107
|
+
find_action = lambda do
|
1108
|
+
if current_text_editor&.text_widget&.getSelectionText && current_text_editor&.text_widget&.getSelectionText&.size.to_i > 0
|
1109
|
+
find_text.swt_widget.setText current_text_editor.text_widget.getSelectionText
|
1110
|
+
end
|
1111
|
+
find_text.swt_widget.selectAll
|
1112
|
+
find_text.swt_widget.setFocus
|
1113
|
+
end
|
1114
|
+
if @navigation_expand_item.swt_expand_item.get_expanded
|
1115
|
+
find_action.call
|
1116
|
+
else
|
1117
|
+
@navigation_expand_item.swt_expand_item.set_expanded true
|
1118
|
+
@navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
|
1119
|
+
async_exec {
|
1120
|
+
body_root.pack_same_size
|
1121
|
+
}
|
1122
|
+
async_exec(&find_action)
|
810
1123
|
end
|
811
|
-
find_text.swt_widget.selectAll
|
812
|
-
find_text.swt_widget.setFocus
|
813
1124
|
elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
|
814
1125
|
Clipboard.copy(project_dir.selected_child.path)
|
815
1126
|
elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
|
@@ -905,12 +1216,34 @@ module Glimmer
|
|
905
1216
|
elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'g'
|
906
1217
|
project_dir.selected_child.find_next
|
907
1218
|
elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'l'
|
908
|
-
|
909
|
-
|
1219
|
+
unless @navigation_expand_item.swt_expand_item.get_expanded
|
1220
|
+
@navigation_expand_item.swt_expand_item.set_expanded true
|
1221
|
+
@navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
|
1222
|
+
async_exec {
|
1223
|
+
body_root.pack_same_size
|
1224
|
+
}
|
1225
|
+
async_exec {
|
1226
|
+
line_number_text.swt_widget.selectAll
|
1227
|
+
line_number_text.swt_widget.setFocus
|
1228
|
+
}
|
1229
|
+
else
|
1230
|
+
line_number_text.swt_widget.selectAll
|
1231
|
+
line_number_text.swt_widget.setFocus
|
1232
|
+
end
|
910
1233
|
elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'r'
|
1234
|
+
unless @file_lookup_expand_item.swt_expand_item.get_expanded
|
1235
|
+
@file_lookup_expand_item.swt_expand_item.set_expanded true
|
1236
|
+
@file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
|
1237
|
+
@side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
|
1238
|
+
end
|
911
1239
|
filter_text.swt_widget.selectAll
|
912
1240
|
filter_text.swt_widget.setFocus
|
913
1241
|
elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 't'
|
1242
|
+
unless @file_explorer_expand_item.swt_expand_item.get_expanded
|
1243
|
+
@file_explorer_expand_item.swt_expand_item.set_expanded true
|
1244
|
+
@file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
|
1245
|
+
@side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
|
1246
|
+
end
|
914
1247
|
select_tree_item unless rename_in_progress
|
915
1248
|
file_tree.swt_widget.setFocus
|
916
1249
|
elsif key_event.keyCode == swt(:esc)
|
@@ -921,4 +1254,4 @@ module Glimmer
|
|
921
1254
|
end
|
922
1255
|
end
|
923
1256
|
end
|
924
|
-
end
|
1257
|
+
end
|