glimmer-cs-gladiator 0.7.0 → 0.8.1

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.
@@ -1,3 +1,24 @@
1
+ # Copyright (c) 2020-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
1
22
  require 'fileutils'
2
23
  require 'os'
3
24
 
@@ -6,6 +27,10 @@ require 'models/glimmer/gladiator/file'
6
27
  require 'models/glimmer/gladiator/command'
7
28
 
8
29
  require 'views/glimmer/gladiator/text_editor'
30
+ require 'views/glimmer/gladiator/file_lookup_list'
31
+ require 'views/glimmer/gladiator/file_explorer_tree'
32
+ require 'views/glimmer/gladiator/gladiator_menu_bar'
33
+ require 'views/glimmer/gladiator/progress_shell'
9
34
 
10
35
  Clipboard.implementation = Clipboard::Java
11
36
  Clipboard.copy(Clipboard.paste) # pre-initialize library to avoid slowdown during use
@@ -18,6 +43,7 @@ module Glimmer
18
43
  APP_ROOT = ::File.expand_path('../../../..', __FILE__)
19
44
  # TODO make sure COMMAND_KEY doesn't clash on Linux/Windows for CMD+CTRL shortcuts
20
45
  COMMAND_KEY = OS.mac? ? :command : :ctrl
46
+ CONTROL_KEY = OS.mac? ? :ctrl : :alt
21
47
  VERSION = ::File.read(::File.join(APP_ROOT, 'VERSION')).to_s.strip
22
48
  LICENSE = ::File.read(::File.join(APP_ROOT, 'LICENSE.txt')).to_s.strip
23
49
  ICON = ::File.expand_path(::File.join(APP_ROOT, 'images', 'glimmer-cs-gladiator-logo.png'))
@@ -57,7 +83,7 @@ module Glimmer
57
83
  pane_count && pane_count > 1
58
84
  end
59
85
 
60
- attr_reader :find_text, :filter_text, :rename_in_progress, :line_number_text, :file_tree, :split_orientation
86
+ attr_reader :find_text, :filter_text, :line_number_text, :split_orientation, :tab_folder_sash_form, :side_bar_sash_form, :file_area_and_editor_area_sash_form, :file_explorer_expand_item, :file_explorer_expand_item, :file_lookup_expand_item, :file_explorer_expand_item, :file_lookup_expand_item_height, :file_explorer_expand_item_height
61
87
  attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor, :tab_folder1, :tab_folder2, :maximized_pane, :maximized_editor
62
88
  alias maximized_pane? maximized_pane
63
89
  alias maximized_editor? maximized_editor
@@ -72,6 +98,7 @@ module Glimmer
72
98
  project_dir.selected_child&.write_raw_dirty_content
73
99
  end
74
100
  Display.setAppName('Gladiator')
101
+ Display.setAppVersion(VERSION)
75
102
  # make sure the display events are only hooked once if multiple gladiators are created
76
103
  unless defined?(@@display)
77
104
  @@display = display {
@@ -79,12 +106,15 @@ module Glimmer
79
106
  on_about {
80
107
  display_about_dialog
81
108
  }
109
+ on_quit {
110
+ project_dir.selected_child&.write_dirty_content
111
+ display.swt_display.shells.each(&:close)
112
+ }
82
113
  on_swt_keydown { |key_event|
83
114
  focused_gladiator = display.focus_control.shell&.get_data('custom_shell')
84
115
  focused_gladiator.handle_display_shortcut(key_event) if !focused_gladiator.nil? && key_event.widget.shell == focused_gladiator&.swt_widget
85
116
  }
86
117
  on_swt_Close {
87
- save_config
88
118
  project_dir.selected_child&.write_dirty_content
89
119
  }
90
120
  }
@@ -102,73 +132,80 @@ module Glimmer
102
132
  #
103
133
  after_body {
104
134
  observe(project_dir, 'children') do
105
- select_tree_item unless @rename_in_progress || Gladiator.startup
135
+ @file_explorer_tree.select_tree_item unless Gladiator.startup
106
136
  end
107
137
  observe(project_dir, 'selected_child') do |selected_file|
108
138
  if selected_file
109
139
  if Gladiator.drag && !@tab_folder2
110
140
  self.tab_folder1 = current_tab_folder
111
141
  @tab_folder_sash_form.content {
112
- self.current_tab_folder = self.tab_folder2 = tab_folder {}
142
+ self.current_tab_folder = self.tab_folder2 = text_editor_group_tab_folder
113
143
  @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
114
144
  }
115
145
  body_root.pack_same_size
116
146
  end
117
- select_tree_item unless @rename_in_progress || Gladiator.startup
147
+ @file_explorer_tree.select_tree_item unless Gladiator.startup
118
148
  found_tab_item = selected_tab_item
119
149
  if found_tab_item
120
150
  @current_tab_folder.swt_widget.setSelection(found_tab_item)
121
151
  @current_tab_item = found_tab_item.getData('proxy')
122
152
  @current_text_editor = found_tab_item.getData('text_editor') unless found_tab_item.getData('text_editor').nil?
123
153
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
124
- elsif selected_file
125
- @current_tab_folder.content {
126
- @current_tab_item = tab_item { |the_tab_item|
127
- text selected_file.name
128
- fill_layout(:horizontal) {
129
- margin_width 0
130
- margin_height 0
131
- }
132
- tab_folder = nil
133
- the_text_editor = nil
134
- the_tab_item.content {
135
- @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file)
136
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
137
- the_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
138
- @current_text_editor.text_proxy.content {
139
- on_focus_gained {
140
- tab_folder = the_text_editor.swt_widget.getParent.getParent
141
- self.current_tab_folder = tab_folder.getData('proxy')
142
- @current_tab_item = the_tab_item
143
- @current_text_editor = the_text_editor
144
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
145
- @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
146
- project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
154
+ else
155
+ begin
156
+ @current_tab_folder.content {
157
+ @current_tab_item = tab_item { |the_tab_item|
158
+ text selected_file.name
159
+ fill_layout(:horizontal) {
160
+ margin_width 0
161
+ margin_height 0
162
+ }
163
+ tab_folder = nil
164
+ the_text_editor = nil
165
+ the_tab_item.content {
166
+ @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file) {
167
+ layout_data :fill, :fill, true, true
168
+ }
169
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
170
+ the_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
171
+ @current_text_editor.text_proxy.content {
172
+ on_focus_gained {
173
+ tab_folder = the_text_editor.swt_widget.getParent.getParent
174
+ self.current_tab_folder = tab_folder.getData('proxy')
175
+ @current_tab_item = the_tab_item
176
+ @current_text_editor = the_text_editor
177
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
178
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
179
+ project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
180
+ }
147
181
  }
148
182
  }
183
+ on_swt_show {
184
+ @current_tab_item = the_tab_item
185
+ @current_text_editor = the_text_editor
186
+ self.current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
187
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
188
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
189
+ project_dir.selected_child = selected_file
190
+ @current_text_editor&.load_content
191
+ @current_text_editor&.text_widget&.setFocus
192
+ save_config unless selected_file.nil?
193
+ }
194
+ on_widget_disposed {
195
+ project_dir.selected_child&.write_dirty_content
196
+ tab_item_file = the_tab_item.swt_tab_item.get_data('file')
197
+ tab_item_file.close unless [@tab_folder1, @tab_folder2].compact.map(&:items).flatten(1).detect {|ti| ti.get_data('file') == tab_item_file}
198
+ }
149
199
  }
150
-
151
- on_swt_show {
152
- @current_tab_item = the_tab_item
153
- @current_text_editor = the_text_editor
154
- self.current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
155
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
156
- @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
157
- project_dir.selected_child = selected_file
158
- @current_text_editor&.text_widget&.setFocus
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
- }
200
+ @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
201
+ @current_tab_item.swt_tab_item.setData('file', selected_file)
202
+ @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
165
203
  }
166
- @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
167
- @current_tab_item.swt_tab_item.setData('file', selected_file)
168
- @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
169
- }
170
- @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
171
- body_root.pack_same_size
204
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
205
+ body_root.pack_same_size
206
+ rescue => e
207
+ puts e.full_message
208
+ end
172
209
  end
173
210
  @current_text_editor&.text_widget&.setFocus
174
211
  end
@@ -180,8 +217,14 @@ module Glimmer
180
217
  end
181
218
  observe(self, 'maximized_editor') do
182
219
  @file_area_and_editor_area_sash_form.maximized_control = (@editor_area_composite.swt_widget if maximized_editor?)
220
+ if !maximized_editor?
221
+ expand_navigation_expand_bar_height
222
+ else
223
+ collapse_navigation_expand_bar_height
224
+ end
183
225
  @navigation_expand_item.swt_expand_item.set_expanded !maximized_editor?
184
226
  body_root.pack_same_size
227
+ async_exec { body_root.pack_same_size }
185
228
  end
186
229
  observe(project_dir, 'selected_child') do
187
230
  save_config
@@ -199,640 +242,449 @@ module Glimmer
199
242
  ## Top-most widget must be a shell or another custom shell
200
243
  #
201
244
  body {
202
- shell {
203
- text "Gladiator - #{::File.expand_path(project_dir.path)}"
204
- minimum_size 520, 250
205
- size 1440, 900
206
- image ICON
207
-
208
- on_swt_show {
209
- swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
210
- swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
211
- @loaded_config = true
245
+ if !::Dir.glob(::File.join(project_dir_path, 'glimmer-cs-gladiator.jar')).empty?
246
+ shell(:no_trim, :no_background) {
247
+ gladiator_menu_bar(gladiator: self, editing: false)
248
+
249
+ on_swt_show {
250
+ open_project
251
+ }
212
252
  }
213
-
214
- on_shell_closed {
215
- save_config
216
- project_dir.selected_child&.write_dirty_content
217
- if @tab_folder2
253
+ else
254
+ shell {
255
+ text "Gladiator - #{::File.expand_path(project_dir.path)}"
256
+ minimum_size 590, 250
257
+ image ICON
258
+
259
+ on_swt_show {
260
+ unless @shell_visible
261
+ if @config[:shell_width] && @config[:shell_height]
262
+ swt_widget.set_size(@config[:shell_width], @config[:shell_height])
263
+ else
264
+ swt_widget.set_size(display.bounds.width, display.bounds.height)
265
+ end
266
+ end
267
+ swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
268
+ @loaded_config = true
269
+ @shell_visible = true
270
+ }
271
+
272
+ on_shell_closed {
273
+ project_dir.selected_child&.write_dirty_content
274
+ if @tab_folder2
275
+ current_tab_folder.swt_widget.getItems.each do |tab_item|
276
+ tab_item.getData('proxy')&.dispose
277
+ end
278
+ close_tab_folder
279
+ end
218
280
  current_tab_folder.swt_widget.getItems.each do |tab_item|
219
281
  tab_item.getData('proxy')&.dispose
220
282
  end
221
- close_tab_folder
222
- end
223
- current_tab_folder.swt_widget.getItems.each do |tab_item|
224
- tab_item.getData('proxy')&.dispose
225
- end
226
- body_root.close unless current_tab_folder.swt_widget.getItems.empty?
227
- }
228
- on_widget_disposed {
229
- project_dir.selected_child&.write_dirty_content
230
- }
231
- on_control_resized {
232
- save_config
233
- }
234
- on_control_moved {
235
- save_config
236
- }
237
- on_shell_deactivated {
238
- project_dir.selected_child&.write_dirty_content
239
- }
240
-
241
- if OS.mac?
242
- display.swt_display.system_menu.items.find {|mi| mi.id == swt(:id_quit)}.add_selection_listener {
243
- save_config
244
- project_dir.selected_child&.write_dirty_content
245
- display.swt_display.shells.each(&:close)
283
+ body_root.close unless current_tab_folder.swt_widget.getItems.empty?
246
284
  }
247
- end
248
-
249
- menu_bar {
250
- menu {
251
- text '&File'
252
-
253
- menu_item {
254
- text 'New &Scratchpad'
255
- accelerator COMMAND_KEY, :shift, :s
256
- on_widget_selected {
257
- project_dir.selected_child_path = ''
258
- }
259
- }
260
- menu_item {
261
- text 'Open &Project...'
262
- accelerator COMMAND_KEY, :o
263
- on_widget_selected {
264
- open_project
265
- }
266
- }
267
- menu_item(:separator)
268
- menu_item {
269
- text '&Quit Project'
270
- accelerator COMMAND_KEY, :alt, :q
271
- on_widget_selected {
272
- save_config
273
- project_dir.selected_child&.write_dirty_content
274
- body_root.close
275
- }
276
- }
285
+ on_widget_disposed {
286
+ project_dir.selected_child&.write_dirty_content
277
287
  }
278
- menu {
279
- text '&View'
280
- menu {
281
- text '&Split Pane'
282
- menu { |menu_proxy|
283
- text '&Orientation'
284
- menu_item(:radio) {
285
- text '&Horizontal'
286
- selection bind(self, :split_orientation,
287
- on_read: ->(o) { split_pane? && o == swt(:horizontal) },
288
- on_write: ->(b) { b.nil? ? nil : (b ? swt(:horizontal) : swt(:vertical)) })
289
- }
290
- menu_item(:radio) {
291
- text '&Vertical'
292
- selection bind(self, :split_orientation,
293
- on_read: ->(o) { split_pane? && o == swt(:vertical) },
294
- on_write: ->(b) { b.nil? ? nil : (b ? swt(:vertical) : swt(:horizontal)) })
295
- }
296
- }
297
- menu_item(:check) {
298
- text '&Maximize Pane'
299
- enabled bind(self, :tab_folder2)
300
- accelerator COMMAND_KEY, :shift, :m
301
- selection bind(self, :maximized_pane)
302
- }
303
- menu_item {
304
- text 'Reset &Panes'
305
- enabled bind(self, :tab_folder2)
306
- accelerator COMMAND_KEY, :shift, :p
307
- on_widget_selected {
308
- if tab_folder2
309
- self.maximized_pane = false
310
- @tab_folder_sash_form.weights = [1, 1]
311
- end
312
- }
313
- }
314
- menu_item {
315
- text '&Unsplit'
316
- enabled bind(self, :tab_folder2)
317
- accelerator COMMAND_KEY, :shift, :u
318
- on_widget_selected {
319
- if tab_folder2
320
- self.maximized_pane = false
321
- navigate_to_next_tab_folder if current_tab_folder != tab_folder2
322
- close_all_tabs(tab_folder2)
323
- self.split_orientation = nil
324
- body_root.pack_same_size
325
- end
326
- }
327
- }
328
- }
329
- menu_item(:check) {
330
- text '&Maximize Editor'
331
- accelerator COMMAND_KEY, :ctrl, :m
332
- selection bind(self, :maximized_editor)
333
- }
334
- menu_item {
335
- text '&Reset All'
336
- accelerator COMMAND_KEY, :ctrl, :r
337
- on_widget_selected {
338
- self.maximized_editor = false
339
- @file_area_and_editor_area_sash_form.weights = [1, 5]
340
- }
341
- }
288
+ on_control_resized {
289
+ save_config
342
290
  }
343
- menu {
344
- text '&Run'
345
- # menu_item {
346
- # text 'Launch Glimmer &App'
347
- # on_widget_selected {
348
- # parent_path = project_dir.path
349
- ## current_directory_name = ::File.basename(parent_path)
350
- ## assumed_shell_script = ::File.join(parent_path, 'bin', current_directory_name)
351
- ## assumed_shell_script = ::Dir.glob(::File.join(parent_path, 'bin', '*')).detect {|f| ::File.file?(f) && !::File.read(f).include?('#!/usr/bin/env')} if !::File.exist?(assumed_shell_script)
352
- ## load assumed_shell_script
353
- # FileUtils.cd(parent_path) do
354
- # system 'glimmer run'
355
- # end
356
- # }
357
- # }
358
- menu_item {
359
- text '&Ruby'
360
- accelerator COMMAND_KEY, :shift, :r
361
- on_widget_selected {
362
- begin
363
- project_dir.selected_child.run
364
- rescue Exception => e
365
- dialog {
366
- text 'Run - Ruby - Error Encountered!'
367
- label {
368
- text e.full_message
369
- }
370
- }.open
371
- end
372
- }
373
- }
291
+ on_control_moved {
292
+ save_config
374
293
  }
375
- menu {
376
- text '&Help'
377
- menu_item {
378
- text '&About'
379
- accelerator COMMAND_KEY, :shift, :a
380
- on_widget_selected {
381
- display_about_dialog
382
- }
383
- }
294
+ on_shell_deactivated {
295
+ project_dir.selected_child&.write_dirty_content
384
296
  }
385
- }
386
-
387
- @file_area_and_editor_area_sash_form = sash_form(:horizontal) {
388
- weights 1, 5
389
-
390
- composite {
391
- grid_layout(1, false) {
392
- margin_width 0
393
- margin_height 0
394
- }
395
-
396
- @side_bar_sash_form = sash_form(:vertical) {
397
- layout_data(:fill, :fill, true, true)
398
- sash_width 4
399
-
400
- resize_expand_items = lambda { |event=nil|
401
- @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
402
- @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
297
+
298
+ # Menu Bar
299
+ gladiator_menu_bar(gladiator: self, editing: true)
300
+
301
+ @file_area_and_editor_area_sash_form = sash_form(:horizontal) {
302
+ weights 1, 5
303
+
304
+ composite {
305
+ grid_layout(1, false) {
306
+ margin_width 0
307
+ margin_height 0
403
308
  }
404
309
 
405
- @file_lookup_expand_bar = expand_bar {
406
- layout_data :fill, :fill, true, true
407
- font height: 17, style: :bold
408
- foreground @default_foreground
310
+ @side_bar_sash_form = sash_form(:vertical) {
311
+ layout_data(:fill, :fill, true, true)
312
+ sash_width 4
409
313
 
410
- on_swt_show {
411
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
314
+ resize_expand_items = lambda { |event=nil|
315
+ @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
316
+ @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
412
317
  }
413
318
 
414
- on_swt_Resize(&resize_expand_items)
415
-
416
- @file_lookup_expand_item = expand_item {
417
- grid_layout {
418
- margin_width 0
419
- margin_height 0
319
+ @file_lookup_expand_bar = expand_bar {
320
+ layout_data :fill, :fill, true, true
321
+ font height: 17, style: :bold
322
+ foreground @default_foreground
323
+
324
+ on_swt_show {
325
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
420
326
  }
421
- text 'File Lookup'
422
- height display.bounds.height
423
327
 
424
- @filter_text = text {
425
- layout_data :fill, :center, true, false
426
- text bind(project_dir, 'filter')
427
- on_key_pressed { |key_event|
428
- if key_event.keyCode == swt(:tab) ||
429
- key_event.keyCode == swt(:cr) ||
430
- key_event.keyCode == swt(:arrow_up) ||
431
- key_event.keyCode == swt(:arrow_down)
432
- @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
433
- @file_lookup_list.swt_widget.setFocus
434
- end
328
+ on_swt_Resize(&resize_expand_items)
329
+
330
+ @file_lookup_expand_item = expand_item {
331
+ grid_layout {
332
+ margin_width 0
333
+ margin_height 0
334
+ }
335
+ text 'File Lookup'
336
+ height display.bounds.height
337
+
338
+ @filter_text = text {
339
+ layout_data :fill, :center, true, false
340
+ text bind(project_dir, 'filter')
341
+ on_key_pressed { |key_event|
342
+ if key_event.keyCode == swt(:tab) ||
343
+ key_event.keyCode == swt(:cr) ||
344
+ key_event.keyCode == swt(:arrow_up) ||
345
+ key_event.keyCode == swt(:arrow_down)
346
+ @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
347
+ @file_lookup_list.swt_widget.setFocus
348
+ end
349
+ }
435
350
  }
351
+
352
+ @file_lookup_list = file_lookup_list(gladiator: self, foreground_color: @default_foreground) {
353
+ layout_data :fill, :fill, true, true
354
+ }
355
+ }
356
+
357
+ on_item_collapsed { |event|
358
+ if @file_explorer_expand_item.swt_expand_item.get_expanded
359
+ @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
360
+ @file_lookup_expand_item.swt_expand_item.height = 0
361
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
362
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
363
+ @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]
364
+ end
436
365
  }
437
366
 
438
- @file_lookup_list = list(:border, :h_scroll, :v_scroll) {
439
- layout_data :fill, :fill, true, true
440
- #visible bind(self, 'project_dir.filter') {|f| !!f}
441
- selection bind(project_dir, :filtered_path)
442
- foreground @default_foreground
443
- on_mouse_up {
444
- project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
445
- }
446
- on_key_pressed { |key_event|
447
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
448
- project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
449
- @current_text_editor&.text_widget&.setFocus
450
- end
367
+ on_item_expanded {
368
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
369
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
370
+ }
371
+
372
+ }
373
+
374
+ @file_explorer_expand_bar = expand_bar {
375
+ layout_data :fill, :fill, true, true
376
+ font height: 17, style: :bold
377
+ foreground @default_foreground
378
+
379
+ on_swt_show {
380
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
381
+ }
382
+
383
+ on_swt_Resize(&resize_expand_items)
384
+
385
+ @file_explorer_expand_item = expand_item {
386
+ grid_layout {
387
+ margin_width 0
388
+ margin_height 0
451
389
  }
452
- drag_source(DND::DROP_COPY) {
453
- transfer [TextTransfer.getInstance].to_java(Transfer)
454
- on_drag_set_data { |event|
455
- Gladiator.drag = true
456
- list = event.widget.getControl
457
- event.data = list.getSelection.first
458
- }
390
+ text 'File Explorer'
391
+ height display.bounds.height
392
+
393
+ @file_explorer_tree = file_explorer_tree(gladiator: self, foreground_color: @default_foreground) {
394
+ layout_data :fill, :fill, true, true
459
395
  }
460
396
  }
461
- }
397
+
398
+ on_item_collapsed { |event|
399
+ if @file_lookup_expand_item.swt_expand_item.get_expanded
400
+ @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
401
+ @file_explorer_expand_item.swt_expand_item.height = 0
402
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
403
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
404
+ @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]
405
+ end
406
+ }
462
407
 
463
- on_item_collapsed { |event|
464
- if @file_explorer_expand_item.swt_expand_item.get_expanded
465
- @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
466
- @file_lookup_expand_item.swt_expand_item.height = 0
467
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
468
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
469
- @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]
470
- end
471
- }
472
-
473
- on_item_expanded {
474
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
475
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
408
+ on_item_expanded {
409
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
410
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
411
+ }
412
+
476
413
  }
477
-
414
+
415
+ }
416
+
417
+ }
418
+
419
+ @editor_area_composite = composite {
420
+ grid_layout(1, false) {
421
+ margin_width 0
422
+ margin_height 0
478
423
  }
479
424
 
480
- @file_explorer_expand_bar = expand_bar {
481
- layout_data :fill, :fill, true, true
425
+ @navigation_expand_bar = expand_bar {
426
+ layout_data(:fill, :top, true, false) {
427
+ minimum_width 480
428
+ }
482
429
  font height: 17, style: :bold
483
430
  foreground @default_foreground
484
431
 
485
- on_swt_show {
486
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
487
- }
488
-
489
- on_swt_Resize(&resize_expand_items)
490
-
491
- @file_explorer_expand_item = expand_item {
492
- grid_layout {
493
- margin_width 0
494
- margin_height 0
432
+ @navigation_expand_item = expand_item {
433
+ text 'Navigation'
434
+ height 115
435
+
436
+ grid_layout(5, false) {
437
+ margin_right 5
495
438
  }
496
- text 'File Explorer'
497
- height display.bounds.height
498
439
 
499
- @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
500
- layout_data :fill, :fill, true, true
501
- #visible bind(self, 'project_dir.filter') {|f| !f}
502
- items bind(self, :project_dir), tree_properties(children: :children, text: :name)
440
+ stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
441
+
442
+ # row 1
443
+
444
+ label {
445
+ layout_data(:left, :center, false, false)
446
+ text 'File:'
503
447
  foreground @default_foreground
504
- drag_source(DND::DROP_COPY) {
505
- transfer [TextTransfer.getInstance].to_java(Transfer)
506
- on_drag_set_data { |event|
507
- Gladiator.drag = true
508
- tree = event.widget.getControl
509
- tree_item = tree.getSelection.first
510
- event.data = tree_item.getData.path
511
- }
448
+ }
449
+
450
+ @file_path_label = styled_text(:none) {
451
+ layout_data(:fill, :center, true, false) {
452
+ horizontal_span 2
512
453
  }
513
- menu {
514
- @open_menu_item = menu_item {
515
- text 'Open'
516
- on_widget_selected {
517
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
518
- }
519
- }
520
- menu_item(:separator)
521
- menu_item {
522
- text 'Delete'
523
- on_widget_selected {
524
- tree_item = @file_tree.swt_widget.getSelection.first
525
- delete_tree_item(tree_item)
526
- }
527
- }
528
- menu_item {
529
- text 'Refresh'
530
- on_widget_selected {
531
- project_dir.refresh
532
- }
533
- }
534
- menu_item {
535
- text 'Rename'
536
- on_widget_selected {
537
- rename_selected_tree_item
538
- }
539
- }
540
- menu_item {
541
- text 'New Directory'
542
- on_widget_selected {
543
- add_new_directory_to_selected_tree_item
544
- }
545
- }
546
- menu_item {
547
- text 'New File'
548
- on_widget_selected {
549
- add_new_file_to_selected_tree_item
550
- }
551
- }
454
+ background color(:widget_background)
455
+ foreground @default_foreground
456
+ editable false
457
+ caret nil
458
+ text bind(project_dir, 'selected_child.path')
459
+ on_mouse_up {
460
+ @file_path_label.swt_widget.selectAll
552
461
  }
553
- on_swt_menudetect { |event|
554
- path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
555
- @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
462
+ on_focus_lost {
463
+ @file_path_label.swt_widget.setSelection(0, 0)
556
464
  }
557
- on_mouse_up {
558
- if Gladiator.drag_and_drop
559
- Gladiator.drag_and_drop = false
560
- else
561
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
562
- @current_text_editor&.text_widget&.setFocus
563
- end
465
+ }
466
+
467
+ label {
468
+ layout_data(:left, :center, false, false) {
469
+ minimum_width 100
470
+ }
471
+ text 'Caret Position:'
472
+ foreground @default_foreground
473
+ }
474
+ label(:right) {
475
+ layout_data(:fill, :center, true, false) {
476
+ minimum_width 50
477
+ }
478
+ text bind(project_dir, 'selected_child.caret_position')
479
+ foreground @default_foreground
480
+ font stat_font
481
+ }
482
+
483
+ # row 2
484
+
485
+ label {
486
+ layout_data(:left, :center, false, false)
487
+ text 'Line:'
488
+ foreground @default_foreground
489
+ }
490
+ @line_number_text = text {
491
+ layout_data(:fill, :center, true, false) {
492
+ width_hint 400
493
+ minimum_width 100
564
494
  }
495
+ text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
496
+ foreground @default_foreground
497
+ font stat_font
565
498
  on_key_pressed { |key_event|
566
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
567
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
499
+ if key_event.keyCode == swt(:cr)
568
500
  @current_text_editor&.text_widget&.setFocus
569
501
  end
570
502
  }
571
- on_paint_control {
572
- root_item = @file_tree.swt_widget.getItems.first
573
- if root_item && !root_item.getExpanded
574
- root_item.setExpanded(true)
575
- end
503
+ on_verify_text { |event|
504
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
576
505
  }
577
506
  }
578
- }
579
-
580
- on_item_collapsed { |event|
581
- if @file_lookup_expand_item.swt_expand_item.get_expanded
582
- @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
583
- @file_explorer_expand_item.swt_expand_item.height = 0
584
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
585
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
586
- @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]
587
- end
588
- }
589
-
590
- on_item_expanded {
591
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
592
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
593
- }
594
-
595
- }
596
-
597
- }
598
-
599
- # TODO see if you could replace some of this with Glimmer DSL/API syntax
600
- @file_tree_editor = TreeEditor.new(@file_tree.swt_widget);
601
- @file_tree_editor.horizontalAlignment = swt(:left);
602
- @file_tree_editor.grabHorizontal = true;
603
- @file_tree_editor.minimumHeight = 20;
604
-
605
- }
606
-
607
- @editor_area_composite = composite {
608
- grid_layout(1, false) {
609
- margin_width 0
610
- margin_height 0
611
- }
612
-
613
- @navigation_expand_bar = expand_bar {
614
- layout_data :fill, :top, true, false
615
- font height: 17, style: :bold
616
- foreground @default_foreground
617
-
618
- @navigation_expand_item = expand_item {
619
- text 'Navigation'
620
- height 115
621
-
622
- grid_layout(5, false) {
623
- margin_right 5
624
- }
625
-
626
- stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
627
-
628
- # row 1
629
-
630
- label {
631
- layout_data(:left, :center, false, false)
632
- text 'File:'
633
- foreground @default_foreground
634
- }
635
-
636
- @file_path_label = styled_text(:none) {
637
- layout_data(:fill, :center, true, false) {
638
- horizontal_span 2
639
- }
640
- background color(:widget_background)
641
- foreground @default_foreground
642
- editable false
643
- caret nil
644
- text bind(project_dir, 'selected_child.path')
645
- on_mouse_up {
646
- @file_path_label.swt_widget.selectAll
507
+ label # filler
508
+
509
+ label {
510
+ layout_data(:left, :center, false, false) {
511
+ minimum_width 100
512
+ }
513
+ text 'Line Position:'
514
+ foreground @default_foreground
647
515
  }
648
- on_focus_lost {
649
- @file_path_label.swt_widget.setSelection(0, 0)
516
+ label(:right) {
517
+ layout_data(:fill, :center, true, false) {
518
+ minimum_width 50
519
+ }
520
+ text bind(project_dir, 'selected_child.line_position')
521
+ foreground @default_foreground
522
+ font stat_font
650
523
  }
651
- }
652
-
653
- label {
654
- layout_data(:left, :center, false, false)
655
- text 'Caret Position:'
656
- foreground @default_foreground
657
- }
658
- label(:right) {
659
- layout_data(:fill, :center, true, false)
660
- text bind(project_dir, 'selected_child.caret_position')
661
- foreground @default_foreground
662
- font stat_font
663
- }
664
-
665
- # row 2
666
-
667
- label {
668
- layout_data(:left, :center, false, false)
669
- text 'Line:'
670
- foreground @default_foreground
671
- }
672
- @line_number_text = text {
673
- layout_data(:fill, :center, true, false) {
674
- minimum_width 400
524
+
525
+ # row 3
526
+
527
+ label {
528
+ layout_data(:left, :center, false, false)
529
+ text 'Find:'
530
+ foreground @default_foreground
675
531
  }
676
- text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
677
- foreground @default_foreground
678
- font stat_font
679
- on_key_pressed { |key_event|
680
- if key_event.keyCode == swt(:cr)
681
- @current_text_editor&.text_widget&.setFocus
682
- end
532
+ @find_text = text {
533
+ layout_data(:fill, :center, true, false) {
534
+ width_hint 400
535
+ minimum_width 100
536
+ }
537
+ text bind(project_dir, 'selected_child.find_text')
538
+ foreground @default_foreground
539
+ font stat_font
540
+ on_key_pressed { |key_event|
541
+ if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
542
+ project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
543
+ project_dir.selected_child&.find_next
544
+ end
545
+ if key_event.keyCode == swt(:cr)
546
+ project_dir.selected_child&.find_next
547
+ end
548
+ }
683
549
  }
684
- on_verify_text { |event|
685
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
550
+ composite {
551
+ layout_data(:left, :center, true, false) {
552
+ minimum_width 120
553
+ }
554
+ row_layout {
555
+ margin_width 0
556
+ margin_height 0
557
+ }
558
+ button(:check) {
559
+ selection bind(project_dir, 'selected_child.case_sensitive')
560
+ on_key_pressed { |key_event|
561
+ if key_event.keyCode == swt(:cr)
562
+ project_dir.selected_child&.find_next
563
+ end
564
+ }
565
+ }
566
+ label {
567
+ text 'Case-sensitive'
568
+ foreground @default_foreground
569
+ }
686
570
  }
687
- }
688
- label # filler
689
-
690
- label {
691
- layout_data(:left, :center, false, false)
692
- text 'Line Position:'
693
- foreground @default_foreground
694
- }
695
- label(:right) {
696
- layout_data(:fill, :center, true, false)
697
- text bind(project_dir, 'selected_child.line_position')
698
- foreground @default_foreground
699
- font stat_font
700
- }
701
-
702
- # row 3
703
-
704
- label {
705
- layout_data(:left, :center, false, false)
706
- text 'Find:'
707
- foreground @default_foreground
708
- }
709
- @find_text = text {
710
- layout_data(:fill, :center, true, false) {
711
- minimum_width 400
571
+
572
+ label {
573
+ layout_data(:left, :center, false, false) {
574
+ minimum_width 100
575
+ }
576
+ text 'Selection Count:'
577
+ foreground @default_foreground
712
578
  }
713
- text bind(project_dir, 'selected_child.find_text')
714
- foreground @default_foreground
715
- font stat_font
716
- on_key_pressed { |key_event|
717
- if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
718
- project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
719
- project_dir.selected_child&.find_next
720
- end
721
- if key_event.keyCode == swt(:cr)
722
- project_dir.selected_child&.find_next
723
- end
579
+ label(:right) {
580
+ layout_data(:fill, :center, true, false) {
581
+ minimum_width 50
582
+ }
583
+ text bind(project_dir, 'selected_child.selection_count')
584
+ foreground @default_foreground
585
+ font stat_font
724
586
  }
725
- }
726
- composite {
727
- layout_data(:left, :center, true, false)
728
- row_layout {
729
- margin_width 0
730
- margin_height 0
587
+
588
+ # row 4
589
+
590
+ label {
591
+ layout_data(:left, :center, false, false)
592
+ text 'Replace:'
593
+ foreground @default_foreground
731
594
  }
732
- button(:check) {
733
- selection bind(project_dir, 'selected_child.case_sensitive')
595
+ @replace_text = text {
596
+ layout_data(:fill, :center, true, false) {
597
+ width_hint 400
598
+ minimum_width 100
599
+ }
600
+ text bind(project_dir, 'selected_child.replace_text')
601
+ foreground @default_foreground
602
+ font stat_font
603
+ on_focus_gained {
604
+ project_dir.selected_child&.ensure_find_next
605
+ }
734
606
  on_key_pressed { |key_event|
735
607
  if key_event.keyCode == swt(:cr)
736
- project_dir.selected_child&.find_next
608
+ if project_dir.selected_child
609
+ Command.do(project_dir.selected_child, :replace_next!)
610
+ end
737
611
  end
738
612
  }
739
613
  }
614
+ label # filler
740
615
  label {
741
- text 'Case-sensitive'
616
+ layout_data(:left, :center, false, false) {
617
+ minimum_width 100
618
+ }
619
+ text 'Top Pixel:'
742
620
  foreground @default_foreground
743
621
  }
744
- }
745
-
746
- label {
747
- layout_data(:left, :center, false, false)
748
- text 'Selection Count:'
749
- foreground @default_foreground
750
- }
751
- label(:right) {
752
- layout_data(:fill, :center, true, false)
753
- text bind(project_dir, 'selected_child.selection_count')
754
- foreground @default_foreground
755
- font stat_font
756
- }
757
-
758
- # row 4
759
-
760
- label {
761
- layout_data(:left, :center, false, false)
762
- text 'Replace:'
763
- foreground @default_foreground
764
- }
765
- @replace_text = text {
766
- layout_data(:fill, :center, true, false) {
767
- minimum_width 400
768
- }
769
- text bind(project_dir, 'selected_child.replace_text')
770
- foreground @default_foreground
771
- font stat_font
772
- on_focus_gained {
773
- project_dir.selected_child&.ensure_find_next
774
- }
775
- on_key_pressed { |key_event|
776
- if key_event.keyCode == swt(:cr)
777
- if project_dir.selected_child
778
- Command.do(project_dir.selected_child, :replace_next!)
779
- end
780
- end
622
+ label(:right) {
623
+ layout_data(:fill, :center, true, false) {
624
+ minimum_width 50
625
+ }
626
+ text bind(project_dir, 'selected_child.top_pixel')
627
+ foreground @default_foreground
628
+ font stat_font
781
629
  }
782
630
  }
783
- label # filler
784
- label {
785
- layout_data(:left, :center, false, false)
786
- text 'Top Pixel:'
787
- foreground @default_foreground
631
+
632
+ on_item_collapsed {
633
+ collapse_navigation_expand_bar_height
788
634
  }
789
- label(:right) {
790
- layout_data(:fill, :center, true, false)
791
- text bind(project_dir, 'selected_child.top_pixel')
792
- foreground @default_foreground
793
- font stat_font
635
+
636
+ on_item_expanded {
637
+ expand_navigation_expand_bar_height
794
638
  }
795
- }
796
639
 
797
- on_item_collapsed {
798
- collapse_navigation_expand_bar_height
799
640
  }
800
-
801
- on_item_expanded {
802
- expand_navigation_expand_bar
803
- }
804
-
805
- }
806
-
807
- @tab_folder_sash_form = sash_form {
808
- layout_data(:fill, :fill, true, true) {
809
- width_hint 768
810
- height_hint 576
811
- minimum_width 768
812
- minimum_height 576
813
- }
814
- orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
815
- self.current_tab_folder = self.tab_folder1 = tab_folder {
816
- drag_source(DND::DROP_COPY) {
817
- transfer [TextTransfer.getInstance].to_java(Transfer)
818
- event_data = nil
819
- on_drag_start {|event|
820
- Gladiator.drag = true
821
- tab_folder = event.widget.getControl
822
- tab_item = tab_folder.getItem(Point.new(event.x, event.y))
823
- event_data = tab_item.getData('file_path')
824
- }
825
- on_drag_set_data { |event|
826
- event.data = event_data
827
- }
641
+
642
+ @tab_folder_sash_form = sash_form {
643
+ layout_data(:fill, :fill, true, true) {
644
+ width_hint 768
645
+ height_hint 576
646
+ minimum_width 168
647
+ minimum_height 176
828
648
  }
649
+ orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
650
+ self.current_tab_folder = self.tab_folder1 = text_editor_group_tab_folder
651
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder) # TODO see if we could get rid of this as it seems redundant
829
652
  }
830
- @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
831
653
  }
654
+ } # end of sash form
655
+ }
656
+ end
657
+ }
658
+
659
+ def text_editor_group_tab_folder
660
+ tab_folder { |tab_folder_proxy|
661
+ on_widget_selected {
662
+ self.current_tab_folder = tab_folder_proxy
663
+ selected_file = @current_tab_item&.swt_tab_item&.getData('file')
664
+ if selected_file
665
+ project_dir.selected_child = selected_file
666
+ @current_tab_item = @current_tab_folder.swt_widget.getSelection.first.getData('proxy')
667
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item) #TODO see if we can get rid of this as it seems redundant
668
+ @current_text_editor = @current_tab_item.swt_tab_item.getData('text_editor')
669
+ @current_text_editor&.load_content
670
+ @current_text_editor&.text_widget&.setFocus
671
+ end
672
+ }
673
+ drag_source(DND::DROP_COPY) {
674
+ transfer [TextTransfer.getInstance].to_java(Transfer)
675
+ event_data = nil
676
+ on_drag_start {|event|
677
+ Gladiator.drag = true
678
+ tab_folder = event.widget.getControl
679
+ tab_item = tab_folder.getItem(Point.new(event.x, event.y))
680
+ event_data = tab_item.getData('file_path')
681
+ }
682
+ on_drag_set_data { |event|
683
+ event.data = event_data
832
684
  }
833
- } # end of sash form
685
+ }
834
686
  }
835
- }
687
+ end
836
688
 
837
689
  def load_config_ignore_paths
838
690
  # TODO eliminate duplication with load_config
@@ -857,22 +709,10 @@ module Glimmer
857
709
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
858
710
  open_file_paths2 = @config[:open_file_paths2]
859
711
  self.split_orientation = (swt(@config[:split_orientation]) rescue swt(:horizontal)) if @config[:split_orientation]
860
- if @progress_bar_shell.nil?
861
- @progress_bar_shell = shell(body_root, :title) {
862
- text 'Gladiator'
863
- fill_layout(:vertical) {
864
- margin_width 15
865
- margin_height 15
866
- spacing 5
867
- }
868
- label(:center) {
869
- text "Opening Last Open Files"
870
- font height: 20
871
- }
872
- # @progress_bar = progress_bar(:horizontal, :indeterminate)
873
- }
712
+ if @progress_shell.nil?
713
+ @progress_shell = progress_shell(gladiator: self, progress_text: 'Opening Last Open Files')
874
714
  async_exec {
875
- @progress_bar_shell.open
715
+ @progress_shell.open
876
716
  }
877
717
  end
878
718
  open_file_paths1.to_a.each do |file_path|
@@ -914,8 +754,8 @@ module Glimmer
914
754
  }
915
755
  async_exec {
916
756
  Gladiator.drag = false
917
- @progress_bar_shell&.close
918
- @progress_bar_shell = nil
757
+ @progress_shell&.close
758
+ @progress_shell = nil
919
759
  @loaded_config = true
920
760
  }
921
761
  }
@@ -933,16 +773,16 @@ module Glimmer
933
773
  end
934
774
 
935
775
  def save_config
936
- return if !@loaded_config || body_root.disposed?
776
+ return if !@loaded_config || body_root&.disposed?
937
777
  child = project_dir.selected_child
938
778
  return if child.nil?
939
779
  tab_folder1 = @tab_folder1 || @current_tab_folder
940
780
  tab_folder2 = @tab_folder2
941
- open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
942
- open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
781
+ open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}.reject {|path| path.to_s.strip.empty?}
782
+ open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}.reject {|path| path.to_s.strip.empty?}
943
783
  split_orientation_value = split_orientation == swt(:horizontal) ? 'horizontal' : (split_orientation == swt(:vertical) ? 'vertical' : nil)
944
784
  @config = {
945
- selected_child_path: child.path,
785
+ selected_child_path: child.nil? ? open_file_paths1&.first&.path : child.path,
946
786
  split_orientation: split_orientation_value,
947
787
  caret_position: child.caret_position,
948
788
  top_pixel: child.top_pixel,
@@ -1003,7 +843,7 @@ module Glimmer
1003
843
  end
1004
844
  end
1005
845
 
1006
- def close_tab_folder(closing_tab_folder = nil)
846
+ def close_tab_folder(closing_tab_folder = nil, single_tab: false)
1007
847
  closing_tab_folder ||= current_tab_folder
1008
848
  if @tab_folder2 && !selected_tab_item
1009
849
  if closing_tab_folder == @tab_folder2
@@ -1021,7 +861,7 @@ module Glimmer
1021
861
  project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
1022
862
  @current_text_editor&.text_widget&.setFocus
1023
863
  async_exec { @current_text_editor&.text_widget&.setFocus }
1024
- else
864
+ elsif !single_tab
1025
865
  self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
1026
866
  end
1027
867
  end
@@ -1042,136 +882,13 @@ module Glimmer
1042
882
  @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
1043
883
  @navigation_expand_item.swt_expand_item.height = 0
1044
884
  body_root.pack_same_size
1045
- async_exec {
1046
- body_root.pack_same_size
1047
- }
885
+ async_exec { body_root.pack_same_size }
1048
886
  end
1049
887
 
1050
888
  def expand_navigation_expand_bar_height
1051
- @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
889
+ @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height || 140
1052
890
  body_root.pack_same_size
1053
- async_exec {
1054
- body_root.pack_same_size
1055
- }
1056
- end
1057
-
1058
- def extract_tree_item_path(tree_item)
1059
- return if tree_item.nil?
1060
- if tree_item.getParentItem
1061
- ::File.join(extract_tree_item_path(tree_item.getParentItem), tree_item.getText)
1062
- else
1063
- project_dir.path
1064
- end
1065
- end
1066
-
1067
- def select_tree_item
1068
- return unless project_dir.selected_child&.name
1069
- tree_items_to_select = @file_tree.depth_first_search { |ti| ti.getData.path == project_dir.selected_child.path }
1070
- @file_tree.swt_widget.setSelection(tree_items_to_select)
1071
- end
1072
-
1073
- def delete_tree_item(tree_item)
1074
- return if tree_item.nil?
1075
- file = tree_item.getData
1076
- parent_path = ::File.dirname(file.path)
1077
- if file.is_a?(Gladiator::Dir)
1078
- file_paths = file.all_children.select {|f| f.is_a?(Gladiator::File)}.map(&:path)
1079
- file.remove_all_observers
1080
- else
1081
- file_paths = [file.path]
1082
- end
1083
- file_paths.each do |file_path|
1084
- found_tab_item = find_tab_item(file_path)
1085
- if found_tab_item
1086
- project_dir.selected_child_path_history.delete(found_tab_item.getData('file_path'))
1087
- found_tab_item.getData('proxy')&.dispose
1088
- end
1089
- end
1090
- file.delete! # TODO consider supporting command undo/redo
1091
- project_dir.refresh(async: false)
1092
- parent_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == parent_path}.first
1093
- @file_tree.swt_widget.showItem(parent_tree_item)
1094
- parent_tree_item.setExpanded(true)
1095
- rescue => e
1096
- puts e.full_message
1097
- end
1098
-
1099
- def add_new_directory_to_selected_tree_item
1100
- project_dir.pause_refresh
1101
- tree_item = @file_tree.swt_widget.getSelection.first
1102
- directory_path = extract_tree_item_path(tree_item)
1103
- return if directory_path.nil?
1104
- if !::Dir.exist?(directory_path)
1105
- tree_item = tree_item.getParentItem
1106
- directory_path = ::File.dirname(directory_path)
1107
- end
1108
- new_directory_path = ::File.expand_path(::File.join(directory_path, 'new_directory'))
1109
- FileUtils.mkdir_p(new_directory_path)
1110
- project_dir.refresh(async: false, force: true)
1111
- new_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == new_directory_path}.first
1112
- @file_tree.swt_widget.showItem(new_tree_item)
1113
- rename_tree_item(new_tree_item)
1114
- end
1115
-
1116
- def add_new_file_to_selected_tree_item
1117
- project_dir.pause_refresh
1118
- tree_item = @file_tree.swt_widget.getSelection.first
1119
- directory_path = extract_tree_item_path(tree_item)
1120
- if !::Dir.exist?(directory_path)
1121
- tree_item = tree_item.getParentItem
1122
- directory_path = ::File.dirname(directory_path)
1123
- end
1124
- new_file_path = ::File.expand_path(::File.join(directory_path, 'new_file'))
1125
- FileUtils.touch(new_file_path)
1126
- # TODO look into refreshing only the parent directory to avoid slowdown
1127
- project_dir.refresh(async: false, force: true)
1128
- new_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == new_file_path}.first
1129
- @file_tree.swt_widget.showItem(new_tree_item)
1130
- rename_tree_item(new_tree_item, true)
1131
- end
1132
-
1133
- def rename_selected_tree_item
1134
- project_dir.pause_refresh
1135
- tree_item = @file_tree.swt_widget.getSelection.first
1136
- rename_tree_item(tree_item)
1137
- end
1138
-
1139
- def rename_tree_item(tree_item, new_file = false)
1140
- original_file = tree_item.getData
1141
- current_file = project_dir.selected_child_path == original_file.path
1142
- found_tab_item = find_tab_item(original_file.path)
1143
- found_text_editor = found_tab_item&.getData('text_editor')
1144
- @file_tree.edit_tree_item(
1145
- tree_item,
1146
- after_write: -> (edited_tree_item) {
1147
- file = edited_tree_item.getData
1148
- file_path = file.path
1149
- file.name
1150
- if ::File.file?(file_path)
1151
- if new_file
1152
- project_dir.selected_child_path = file_path
1153
- else
1154
- found_text_editor&.file = file
1155
- found_tab_item&.setData('file', file)
1156
- found_tab_item&.setData('file_path', file.path)
1157
- found_tab_item&.setText(file.name)
1158
- body_root.pack_same_size
1159
- if current_file
1160
- project_dir.selected_child_path = file_path
1161
- else
1162
- selected_tab_item&.getData('text_editor')&.text_widget&.setFocus
1163
- end
1164
- async_exec {
1165
- @file_tree.swt_widget.showItem(edited_tree_item)
1166
- }
1167
- end
1168
- end
1169
- project_dir.resume_refresh
1170
- },
1171
- after_cancel: -> {
1172
- project_dir.resume_refresh
1173
- }
1174
- )
891
+ async_exec { body_root.pack_same_size }
1175
892
  end
1176
893
 
1177
894
  def extract_char(event)
@@ -1183,27 +900,15 @@ module Glimmer
1183
900
  def open_project
1184
901
  selected_directory = directory_dialog.open
1185
902
  return if selected_directory.nil?
1186
- @progress_bar_shell = shell(body_root, :title) {
1187
- text 'Gladiator'
1188
- fill_layout(:vertical) {
1189
- margin_width 15
1190
- margin_height 15
1191
- spacing 5
1192
- }
1193
- label(:center) {
1194
- text "Opening Project: #{::File.basename(selected_directory)}"
1195
- font height: 20
1196
- }
1197
- # @progress_bar = progress_bar(:horizontal, :indeterminate)
1198
- }
903
+ @progress_shell = progress_shell(gladiator: self, progress_text: "Opening Project: #{::File.basename(selected_directory)}")
1199
904
  async_exec {
1200
- @progress_bar_shell.open
905
+ @progress_shell.open
1201
906
  }
1202
907
  async_exec {
1203
908
  gladiator(project_dir_path: selected_directory) {
1204
909
  on_swt_show {
1205
- @progress_bar_shell.close
1206
- @progress_bar_shell = nil
910
+ @progress_shell.close
911
+ @progress_shell = nil
1207
912
  }
1208
913
  }.open if selected_directory
1209
914
  }
@@ -1228,36 +933,31 @@ module Glimmer
1228
933
  label {
1229
934
  layout_data :fill, :fill, true, true
1230
935
  background :white
1231
- text "Gladiator v#{VERSION}\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
936
+ text "Gladiator v#{VERSION} (Beta)\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
1232
937
  }
1233
938
  }.open
1234
939
  end
1235
940
 
1236
941
  def handle_display_shortcut(key_event)
1237
942
  if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'f'
1238
- find_action = lambda do
1239
- if current_text_editor&.text_widget&.getSelectionText && current_text_editor&.text_widget&.getSelectionText&.size.to_i > 0
1240
- find_text.swt_widget.setText current_text_editor.text_widget.getSelectionText
1241
- end
1242
- find_text.swt_widget.selectAll
1243
- find_text.swt_widget.setFocus
1244
- end
1245
- if @navigation_expand_item.swt_expand_item.get_expanded
1246
- find_action.call
1247
- else
943
+ if !@navigation_expand_item.swt_expand_item.get_expanded
944
+ expand_navigation_expand_bar_height
1248
945
  @navigation_expand_item.swt_expand_item.set_expanded true
1249
- async_exec {
1250
- body_root.pack_same_size
1251
- find_action.call
1252
- }
1253
946
  end
947
+ if current_text_editor&.text_widget&.getSelectionText && current_text_editor&.text_widget&.getSelectionText&.size.to_i > 0
948
+ find_text.swt_widget.setText current_text_editor.text_widget.getSelectionText
949
+ end
950
+ find_text.swt_widget.selectAll
951
+ find_text.swt_widget.setFocus
1254
952
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
1255
953
  Clipboard.copy(project_dir.selected_child.path)
1256
954
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
1257
955
  project_dir.selected_child.find_previous
1258
956
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
1259
957
  self.maximized_pane = false
958
+ old_split_orientation = self.split_orientation
1260
959
  self.split_orientation = split_pane? && split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
960
+ @tab_folder_sash_form.weights = [1, 1] if old_split_orientation.nil?
1261
961
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'w'
1262
962
  close_all_tabs
1263
963
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :alt) && extract_char(key_event) == 'w'
@@ -1269,25 +969,34 @@ module Glimmer
1269
969
  if selected_tab_item
1270
970
  project_dir.selected_child_path_history.delete(project_dir.selected_child.path)
1271
971
  selected_tab_item.getData('proxy')&.dispose
1272
- close_tab_folder
972
+ close_tab_folder(single_tab: true)
973
+ # if self.current_tab_item.nil?
974
+ # filter_text.swt_widget.selectAll
975
+ # filter_text.swt_widget.setFocus
976
+ # else
977
+ # current_text_editor&.text_widget&.setFocus
978
+ # end
1273
979
  if selected_tab_item.nil?
1274
980
  self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
1275
981
  filter_text.swt_widget.selectAll
1276
982
  filter_text.swt_widget.setFocus
1277
983
  else
1278
984
  current_text_editor&.text_widget&.setFocus
985
+ # async_exec { current_text_editor&.text_widget&.setFocus }
1279
986
  end
1280
987
  end
1281
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
988
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']' || Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :ctrl) && key_event.keyCode == swt(:page_down)
1282
989
  current_tab_folder.swt_widget.setSelection((current_tab_folder.swt_widget.getSelectionIndex() + 1) % current_tab_folder.swt_widget.getItemCount) if current_tab_folder.swt_widget.getItemCount > 0
1283
990
  current_text_editor&.text_widget&.setFocus
1284
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == '['
991
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == '[' || Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :ctrl) && key_event.keyCode == swt(:page_up)
1285
992
  current_tab_folder.swt_widget.setSelection((current_tab_folder.swt_widget.getSelectionIndex() - 1) % current_tab_folder.swt_widget.getItemCount) if current_tab_folder.swt_widget.getItemCount > 0
1286
993
  current_text_editor&.text_widget&.setFocus
1287
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == ']'
994
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, CONTROL_KEY) && extract_char(key_event) == ']'
1288
995
  navigate_to_next_tab_folder
1289
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == '['
996
+ key_event.doit = false
997
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, CONTROL_KEY) && extract_char(key_event) == '['
1290
998
  navigate_to_previous_tab_folder
999
+ key_event.doit = false
1291
1000
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
1292
1001
  current_tab_folder.swt_widget.setSelection(0) if current_tab_folder.swt_widget.getItemCount >= 1
1293
1002
  current_text_editor&.text_widget&.setFocus
@@ -1348,8 +1057,8 @@ module Glimmer
1348
1057
  @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
1349
1058
  @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
1350
1059
  end
1351
- select_tree_item unless rename_in_progress
1352
- file_tree.swt_widget.setFocus
1060
+ @file_explorer_tree.select_tree_item
1061
+ @file_explorer_tree.swt_widget.setFocus
1353
1062
  elsif key_event.keyCode == swt(:esc)
1354
1063
  if current_text_editor
1355
1064
  project_dir.selected_child_path = current_text_editor.file.path