glimmer-cs-gladiator 0.6.3 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
@@ -42,7 +67,7 @@ module Glimmer
42
67
  def split_orientation=(value)
43
68
  @split_orientation = value
44
69
  save_config
45
- if @loaded_config && !split_pane?
70
+ if @loaded_config && !split_pane? && !value.nil?
46
71
  Gladiator.drag = true
47
72
  child_path = project_dir.selected_child_path
48
73
  project_dir.selected_child = nil
@@ -56,9 +81,11 @@ module Glimmer
56
81
  pane_count = @tab_folder_sash_form&.children&.size
57
82
  pane_count && pane_count > 1
58
83
  end
59
-
60
- attr_reader :find_text, :tab_folder1, :tab_folder2, :filter_text, :rename_in_progress, :line_number_text, :file_tree, :split_orientation
61
- attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor
84
+
85
+ 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
86
+ attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor, :tab_folder1, :tab_folder2, :maximized_pane, :maximized_editor
87
+ alias maximized_pane? maximized_pane
88
+ alias maximized_editor? maximized_editor
62
89
 
63
90
  ## Uncomment before_body block to pre-initialize variables to use in body
64
91
  #
@@ -70,6 +97,7 @@ module Glimmer
70
97
  project_dir.selected_child&.write_raw_dirty_content
71
98
  end
72
99
  Display.setAppName('Gladiator')
100
+ Display.setAppVersion(VERSION)
73
101
  # make sure the display events are only hooked once if multiple gladiators are created
74
102
  unless defined?(@@display)
75
103
  @@display = display {
@@ -100,19 +128,19 @@ module Glimmer
100
128
  #
101
129
  after_body {
102
130
  observe(project_dir, 'children') do
103
- select_tree_item unless @rename_in_progress || Gladiator.startup
131
+ @file_explorer_tree.select_tree_item unless Gladiator.startup
104
132
  end
105
133
  observe(project_dir, 'selected_child') do |selected_file|
106
134
  if selected_file
107
135
  if Gladiator.drag && !@tab_folder2
108
- @tab_folder1 = @current_tab_folder
109
- async_exec { body_root.pack_same_size}
136
+ self.tab_folder1 = current_tab_folder
110
137
  @tab_folder_sash_form.content {
111
- @current_tab_folder = @tab_folder2 = tab_folder
138
+ self.current_tab_folder = self.tab_folder2 = tab_folder {}
112
139
  @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
113
140
  }
141
+ body_root.pack_same_size
114
142
  end
115
- select_tree_item unless @rename_in_progress || Gladiator.startup
143
+ @file_explorer_tree.select_tree_item unless Gladiator.startup
116
144
  found_tab_item = selected_tab_item
117
145
  if found_tab_item
118
146
  @current_tab_folder.swt_widget.setSelection(found_tab_item)
@@ -136,7 +164,7 @@ module Glimmer
136
164
  @current_text_editor.text_proxy.content {
137
165
  on_focus_gained {
138
166
  tab_folder = the_text_editor.swt_widget.getParent.getParent
139
- @current_tab_folder = tab_folder.getData('proxy')
167
+ self.current_tab_folder = tab_folder.getData('proxy')
140
168
  @current_tab_item = the_tab_item
141
169
  @current_text_editor = the_text_editor
142
170
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
@@ -149,13 +177,11 @@ module Glimmer
149
177
  on_swt_show {
150
178
  @current_tab_item = the_tab_item
151
179
  @current_text_editor = the_text_editor
152
- @current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
180
+ self.current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
153
181
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
154
182
  @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
155
183
  project_dir.selected_child = selected_file
156
- async_exec {
157
- @current_text_editor&.text_widget&.setFocus
158
- }
184
+ @current_text_editor&.text_widget&.setFocus
159
185
  }
160
186
  on_widget_disposed {
161
187
  project_dir.selected_child&.write_dirty_content
@@ -168,13 +194,27 @@ module Glimmer
168
194
  @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
169
195
  }
170
196
  @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
171
-
172
197
  body_root.pack_same_size
173
- async_exec { body_root.pack_same_size}
174
198
  end
175
199
  @current_text_editor&.text_widget&.setFocus
176
200
  end
177
201
  end
202
+ observe(self, 'maximized_pane') do
203
+ if tab_folder2
204
+ @tab_folder_sash_form.maximized_control = (current_tab_folder.swt_widget if maximized_pane?)
205
+ end
206
+ end
207
+ observe(self, 'maximized_editor') do
208
+ @file_area_and_editor_area_sash_form.maximized_control = (@editor_area_composite.swt_widget if maximized_editor?)
209
+ if !maximized_editor?
210
+ expand_navigation_expand_bar_height
211
+ else
212
+ collapse_navigation_expand_bar_height
213
+ end
214
+ @navigation_expand_item.swt_expand_item.set_expanded !maximized_editor?
215
+ body_root.pack_same_size
216
+ async_exec { body_root.pack_same_size }
217
+ end
178
218
  observe(project_dir, 'selected_child') do
179
219
  save_config
180
220
  end
@@ -191,581 +231,441 @@ module Glimmer
191
231
  ## Top-most widget must be a shell or another custom shell
192
232
  #
193
233
  body {
194
- shell {
195
- grid_layout(2, false)
196
- text "Gladiator - #{::File.expand_path(project_dir.path)}"
197
- minimum_size 520, 250
198
- size 1440, 900
199
- image ICON
200
-
201
- on_swt_show {
202
- swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
203
- swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
204
- @loaded_config = true
234
+ if !::Dir.glob(::File.join(project_dir_path, 'glimmer-cs-gladiator.jar')).empty?
235
+ shell(:no_trim, :no_background) {
236
+ gladiator_menu_bar(gladiator: self, editing: false)
237
+
238
+ on_swt_show {
239
+ open_project
240
+ }
205
241
  }
206
-
207
- on_shell_closed {
208
- save_config
209
- project_dir.selected_child&.write_dirty_content
210
- if @tab_folder2
242
+ else
243
+ shell {
244
+ text "Gladiator - #{::File.expand_path(project_dir.path)}"
245
+ minimum_size 590, 250
246
+ image ICON
247
+
248
+ on_swt_show {
249
+ unless @shell_visible
250
+ if @config[:shell_width] && @config[:shell_height]
251
+ swt_widget.set_size(@config[:shell_width], @config[:shell_height])
252
+ else
253
+ swt_widget.set_size(display.bounds.width, display.bounds.height)
254
+ end
255
+ end
256
+ swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
257
+ @loaded_config = true
258
+ @shell_visible = true
259
+ }
260
+
261
+ on_shell_closed {
262
+ save_config
263
+ project_dir.selected_child&.write_dirty_content
264
+ if @tab_folder2
265
+ current_tab_folder.swt_widget.getItems.each do |tab_item|
266
+ tab_item.getData('proxy')&.dispose
267
+ end
268
+ close_tab_folder
269
+ end
211
270
  current_tab_folder.swt_widget.getItems.each do |tab_item|
212
271
  tab_item.getData('proxy')&.dispose
213
272
  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?
220
- }
221
- on_widget_disposed {
222
- project_dir.selected_child&.write_dirty_content
223
- }
224
- on_control_resized {
225
- save_config
226
- }
227
- on_control_moved {
228
- save_config
229
- }
230
- on_shell_deactivated {
231
- project_dir.selected_child&.write_dirty_content
232
- }
233
-
234
- display.swt_display.system_menu.items.find {|mi| mi.id == swt(:id_quit)}.add_selection_listener {
235
- save_config
236
- project_dir.selected_child&.write_dirty_content
237
- exit(0)
238
- }
239
-
240
- menu_bar {
241
- menu {
242
- text '&File'
243
-
244
- menu_item {
245
- text 'New &Scratchpad'
246
- on_widget_selected {
247
- begin
248
- project_dir.selected_child_path = ''
249
- rescue => e
250
- puts e.full_message
251
- end
252
- }
253
- }
254
- menu_item(:separator)
255
- menu_item {
256
- text 'Open &Project...'
257
- on_widget_selected {
258
- open_project
259
- }
260
- }
261
- }
262
- menu {
263
- text '&View'
264
- menu {
265
- text '&Split'
266
- menu_item(:radio) {
267
- text '&Horizontal'
268
- selection bind(self, :split_orientation,
269
- on_read: ->(o) { split_pane? && o == swt(:horizontal) },
270
- on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical) })
271
- }
272
- menu_item(:radio) {
273
- text '&Vertical'
274
- selection bind(self, :split_orientation,
275
- on_read: ->(o) { split_pane? && o == swt(:vertical) },
276
- on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal) })
277
- }
278
- }
273
+ body_root.close unless current_tab_folder.swt_widget.getItems.empty?
279
274
  }
280
- menu {
281
- text '&Run'
282
- # menu_item {
283
- # text 'Launch Glimmer &App'
284
- # on_widget_selected {
285
- # parent_path = project_dir.path
286
- ## current_directory_name = ::File.basename(parent_path)
287
- ## assumed_shell_script = ::File.join(parent_path, 'bin', current_directory_name)
288
- ## 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)
289
- ## load assumed_shell_script
290
- # FileUtils.cd(parent_path) do
291
- # system 'glimmer run'
292
- # end
293
- # }
294
- # }
295
- menu_item {
296
- text '&Ruby'
297
- on_widget_selected {
298
- project_dir.selected_child.run
299
- }
300
- }
275
+ on_widget_disposed {
276
+ project_dir.selected_child&.write_dirty_content
301
277
  }
302
- menu {
303
- text '&Help'
304
- menu_item {
305
- text '&About'
306
- on_widget_selected {
307
- display_about_dialog
308
- }
309
- }
278
+ on_control_resized {
279
+ save_config
310
280
  }
311
- }
312
-
313
- composite {
314
- grid_layout(1, false) {
315
- margin_width 0
316
- margin_height 0
281
+ on_control_moved {
282
+ save_config
317
283
  }
318
-
319
- layout_data(:fill, :fill, false, true) {
320
- width_hint 300
284
+ on_shell_deactivated {
285
+ project_dir.selected_child&.write_dirty_content
321
286
  }
322
- @side_bar_sash_form = sash_form(:vertical) {
323
- layout_data(:fill, :fill, true, true)
324
- sash_width 4
325
-
326
- resize_expand_items = lambda { |event=nil|
327
- @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
328
- @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
287
+
288
+ if OS.mac?
289
+ display.swt_display.system_menu.items.find {|mi| mi.id == swt(:id_quit)}.add_selection_listener {
290
+ save_config
291
+ project_dir.selected_child&.write_dirty_content
292
+ display.swt_display.shells.each(&:close)
329
293
  }
330
-
331
- @file_lookup_expand_bar = expand_bar {
332
- layout_data :fill, :fill, true, true
333
- font height: 17, style: :bold
334
- foreground @default_foreground
335
-
336
- on_swt_show {
337
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
294
+ end
295
+
296
+ # Menu Bar
297
+ gladiator_menu_bar(gladiator: self, editing: true)
298
+
299
+ @file_area_and_editor_area_sash_form = sash_form(:horizontal) {
300
+ weights 1, 5
301
+
302
+ composite {
303
+ grid_layout(1, false) {
304
+ margin_width 0
305
+ margin_height 0
338
306
  }
339
307
 
340
- on_swt_Resize(&resize_expand_items)
341
-
342
- @file_lookup_expand_item = expand_item {
343
- grid_layout {
344
- margin_width 0
345
- margin_height 0
308
+ @side_bar_sash_form = sash_form(:vertical) {
309
+ layout_data(:fill, :fill, true, true)
310
+ sash_width 4
311
+
312
+ resize_expand_items = lambda { |event=nil|
313
+ @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
314
+ @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
346
315
  }
347
- text 'File Lookup'
348
- height display.bounds.height
349
316
 
350
- @filter_text = text {
351
- layout_data :fill, :center, true, false
352
- text bind(project_dir, 'filter')
353
- on_key_pressed { |key_event|
354
- if key_event.keyCode == swt(:tab) ||
355
- key_event.keyCode == swt(:cr) ||
356
- key_event.keyCode == swt(:arrow_up) ||
357
- key_event.keyCode == swt(:arrow_down)
358
- @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
359
- @file_lookup_list.swt_widget.setFocus
317
+ @file_lookup_expand_bar = expand_bar {
318
+ layout_data :fill, :fill, true, true
319
+ font height: 17, style: :bold
320
+ foreground @default_foreground
321
+
322
+ on_swt_show {
323
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
324
+ }
325
+
326
+ on_swt_Resize(&resize_expand_items)
327
+
328
+ @file_lookup_expand_item = expand_item {
329
+ grid_layout {
330
+ margin_width 0
331
+ margin_height 0
332
+ }
333
+ text 'File Lookup'
334
+ height display.bounds.height
335
+
336
+ @filter_text = text {
337
+ layout_data :fill, :center, true, false
338
+ text bind(project_dir, 'filter')
339
+ on_key_pressed { |key_event|
340
+ if key_event.keyCode == swt(:tab) ||
341
+ key_event.keyCode == swt(:cr) ||
342
+ key_event.keyCode == swt(:arrow_up) ||
343
+ key_event.keyCode == swt(:arrow_down)
344
+ @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
345
+ @file_lookup_list.swt_widget.setFocus
346
+ end
347
+ }
348
+ }
349
+
350
+ @file_lookup_list = file_lookup_list(gladiator: self, foreground_color: @default_foreground) {
351
+ layout_data :fill, :fill, true, true
352
+ }
353
+ }
354
+
355
+ on_item_collapsed { |event|
356
+ if @file_explorer_expand_item.swt_expand_item.get_expanded
357
+ @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
358
+ @file_lookup_expand_item.swt_expand_item.height = 0
359
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
360
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
361
+ @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]
360
362
  end
361
363
  }
364
+
365
+ on_item_expanded {
366
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
367
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
368
+ }
369
+
362
370
  }
363
-
364
- @file_lookup_list = list(:border, :h_scroll, :v_scroll) {
371
+
372
+ @file_explorer_expand_bar = expand_bar {
365
373
  layout_data :fill, :fill, true, true
366
- #visible bind(self, 'project_dir.filter') {|f| !!f}
367
- selection bind(project_dir, :filtered_path)
374
+ font height: 17, style: :bold
368
375
  foreground @default_foreground
369
- on_mouse_up {
370
- project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
376
+
377
+ on_swt_show {
378
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
371
379
  }
372
- on_key_pressed { |key_event|
373
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
374
- project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
375
- @current_text_editor&.text_widget&.setFocus
380
+
381
+ on_swt_Resize(&resize_expand_items)
382
+
383
+ @file_explorer_expand_item = expand_item {
384
+ grid_layout {
385
+ margin_width 0
386
+ margin_height 0
387
+ }
388
+ text 'File Explorer'
389
+ height display.bounds.height
390
+
391
+ @file_explorer_tree = file_explorer_tree(gladiator: self, foreground_color: @default_foreground) {
392
+ layout_data :fill, :fill, true, true
393
+ }
394
+ }
395
+
396
+ on_item_collapsed { |event|
397
+ if @file_lookup_expand_item.swt_expand_item.get_expanded
398
+ @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
399
+ @file_explorer_expand_item.swt_expand_item.height = 0
400
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
401
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
402
+ @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]
376
403
  end
377
404
  }
378
- drag_source(DND::DROP_COPY) {
379
- transfer [TextTransfer.getInstance].to_java(Transfer)
380
- on_drag_set_data { |event|
381
- Gladiator.drag = true
382
- list = event.widget.getControl
383
- event.data = list.getSelection.first
384
- }
405
+
406
+ on_item_expanded {
407
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
408
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
385
409
  }
410
+
386
411
  }
412
+
387
413
  }
388
-
389
- on_item_collapsed { |event|
390
- if @file_explorer_expand_item.swt_expand_item.get_expanded
391
- @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
392
- @file_lookup_expand_item.swt_expand_item.height = 0
393
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
394
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
395
- @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]
396
- end
397
- }
398
-
399
- on_item_expanded {
400
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
401
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
402
- }
403
-
414
+
404
415
  }
405
416
 
406
- @file_explorer_expand_bar = expand_bar {
407
- layout_data :fill, :fill, true, true
408
- font height: 17, style: :bold
409
- foreground @default_foreground
410
-
411
- on_swt_show {
412
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
417
+ @editor_area_composite = composite {
418
+ grid_layout(1, false) {
419
+ margin_width 0
420
+ margin_height 0
413
421
  }
414
422
 
415
- on_swt_Resize(&resize_expand_items)
416
-
417
- @file_explorer_expand_item = expand_item {
418
- grid_layout {
419
- margin_width 0
420
- margin_height 0
423
+ @navigation_expand_bar = expand_bar {
424
+ layout_data(:fill, :top, true, false) {
425
+ minimum_width 480
421
426
  }
422
- text 'File Explorer'
423
- height display.bounds.height
427
+ font height: 17, style: :bold
428
+ foreground @default_foreground
424
429
 
425
- @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
426
- layout_data :fill, :fill, true, true
427
- #visible bind(self, 'project_dir.filter') {|f| !f}
428
- items bind(self, :project_dir), tree_properties(children: :children, text: :name)
429
- foreground @default_foreground
430
- drag_source(DND::DROP_COPY) {
431
- transfer [TextTransfer.getInstance].to_java(Transfer)
432
- on_drag_set_data { |event|
433
- Gladiator.drag = true
434
- tree = event.widget.getControl
435
- tree_item = tree.getSelection.first
436
- event.data = tree_item.getData.path
430
+ @navigation_expand_item = expand_item {
431
+ text 'Navigation'
432
+ height 115
433
+
434
+ grid_layout(5, false) {
435
+ margin_right 5
436
+ }
437
+
438
+ stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
439
+
440
+ # row 1
441
+
442
+ label {
443
+ layout_data(:left, :center, false, false)
444
+ text 'File:'
445
+ foreground @default_foreground
446
+ }
447
+
448
+ @file_path_label = styled_text(:none) {
449
+ layout_data(:fill, :center, true, false) {
450
+ horizontal_span 2
451
+ }
452
+ background color(:widget_background)
453
+ foreground @default_foreground
454
+ editable false
455
+ caret nil
456
+ text bind(project_dir, 'selected_child.path')
457
+ on_mouse_up {
458
+ @file_path_label.swt_widget.selectAll
459
+ }
460
+ on_focus_lost {
461
+ @file_path_label.swt_widget.setSelection(0, 0)
437
462
  }
438
463
  }
439
- menu {
440
- @open_menu_item = menu_item {
441
- text 'Open'
442
- on_widget_selected {
443
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
444
- }
464
+
465
+ label {
466
+ layout_data(:left, :center, false, false) {
467
+ minimum_width 100
445
468
  }
446
- menu_item(:separator)
447
- menu_item {
448
- text 'Delete'
449
- on_widget_selected {
450
- tree_item = @file_tree.swt_widget.getSelection.first
451
- delete_tree_item(tree_item)
452
- }
469
+ text 'Caret Position:'
470
+ foreground @default_foreground
471
+ }
472
+ label(:right) {
473
+ layout_data(:fill, :center, true, false) {
474
+ minimum_width 50
453
475
  }
454
- menu_item {
455
- text 'Refresh'
456
- on_widget_selected {
457
- project_dir.refresh
458
- }
476
+ text bind(project_dir, 'selected_child.caret_position')
477
+ foreground @default_foreground
478
+ font stat_font
479
+ }
480
+
481
+ # row 2
482
+
483
+ label {
484
+ layout_data(:left, :center, false, false)
485
+ text 'Line:'
486
+ foreground @default_foreground
487
+ }
488
+ @line_number_text = text {
489
+ layout_data(:fill, :center, true, false) {
490
+ width_hint 400
491
+ minimum_width 100
459
492
  }
460
- menu_item {
461
- text 'Rename'
462
- on_widget_selected {
463
- rename_selected_tree_item
464
- }
493
+ text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
494
+ foreground @default_foreground
495
+ font stat_font
496
+ on_key_pressed { |key_event|
497
+ if key_event.keyCode == swt(:cr)
498
+ @current_text_editor&.text_widget&.setFocus
499
+ end
465
500
  }
466
- menu_item {
467
- text 'New Directory'
468
- on_widget_selected {
469
- add_new_directory_to_selected_tree_item
470
- }
501
+ on_verify_text { |event|
502
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
503
+ }
504
+ }
505
+ label # filler
506
+
507
+ label {
508
+ layout_data(:left, :center, false, false) {
509
+ minimum_width 100
510
+ }
511
+ text 'Line Position:'
512
+ foreground @default_foreground
513
+ }
514
+ label(:right) {
515
+ layout_data(:fill, :center, true, false) {
516
+ minimum_width 50
517
+ }
518
+ text bind(project_dir, 'selected_child.line_position')
519
+ foreground @default_foreground
520
+ font stat_font
521
+ }
522
+
523
+ # row 3
524
+
525
+ label {
526
+ layout_data(:left, :center, false, false)
527
+ text 'Find:'
528
+ foreground @default_foreground
529
+ }
530
+ @find_text = text {
531
+ layout_data(:fill, :center, true, false) {
532
+ width_hint 400
533
+ minimum_width 100
534
+ }
535
+ text bind(project_dir, 'selected_child.find_text')
536
+ foreground @default_foreground
537
+ font stat_font
538
+ on_key_pressed { |key_event|
539
+ if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
540
+ project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
541
+ project_dir.selected_child&.find_next
542
+ end
543
+ if key_event.keyCode == swt(:cr)
544
+ project_dir.selected_child&.find_next
545
+ end
471
546
  }
472
- menu_item {
473
- text 'New File'
474
- on_widget_selected {
475
- add_new_file_to_selected_tree_item
547
+ }
548
+ composite {
549
+ layout_data(:left, :center, true, false) {
550
+ minimum_width 120
551
+ }
552
+ row_layout {
553
+ margin_width 0
554
+ margin_height 0
555
+ }
556
+ button(:check) {
557
+ selection bind(project_dir, 'selected_child.case_sensitive')
558
+ on_key_pressed { |key_event|
559
+ if key_event.keyCode == swt(:cr)
560
+ project_dir.selected_child&.find_next
561
+ end
476
562
  }
477
563
  }
564
+ label {
565
+ text 'Case-sensitive'
566
+ foreground @default_foreground
567
+ }
478
568
  }
479
- on_swt_menudetect { |event|
480
- path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
481
- @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
569
+
570
+ label {
571
+ layout_data(:left, :center, false, false) {
572
+ minimum_width 100
573
+ }
574
+ text 'Selection Count:'
575
+ foreground @default_foreground
482
576
  }
483
- on_mouse_up {
484
- if Gladiator.drag_and_drop
485
- Gladiator.drag_and_drop = false
486
- else
487
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
488
- @current_text_editor&.text_widget&.setFocus
489
- end
577
+ label(:right) {
578
+ layout_data(:fill, :center, true, false) {
579
+ minimum_width 50
580
+ }
581
+ text bind(project_dir, 'selected_child.selection_count')
582
+ foreground @default_foreground
583
+ font stat_font
490
584
  }
491
- on_key_pressed { |key_event|
492
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
493
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
494
- @current_text_editor&.text_widget&.setFocus
495
- end
585
+
586
+ # row 4
587
+
588
+ label {
589
+ layout_data(:left, :center, false, false)
590
+ text 'Replace:'
591
+ foreground @default_foreground
496
592
  }
497
- on_paint_control {
498
- root_item = @file_tree.swt_widget.getItems.first
499
- if root_item && !root_item.getExpanded
500
- root_item.setExpanded(true)
501
- end
593
+ @replace_text = text {
594
+ layout_data(:fill, :center, true, false) {
595
+ width_hint 400
596
+ minimum_width 100
597
+ }
598
+ text bind(project_dir, 'selected_child.replace_text')
599
+ foreground @default_foreground
600
+ font stat_font
601
+ on_focus_gained {
602
+ project_dir.selected_child&.ensure_find_next
603
+ }
604
+ on_key_pressed { |key_event|
605
+ if key_event.keyCode == swt(:cr)
606
+ if project_dir.selected_child
607
+ Command.do(project_dir.selected_child, :replace_next!)
608
+ end
609
+ end
610
+ }
611
+ }
612
+ label # filler
613
+ label {
614
+ layout_data(:left, :center, false, false) {
615
+ minimum_width 100
616
+ }
617
+ text 'Top Pixel:'
618
+ foreground @default_foreground
619
+ }
620
+ label(:right) {
621
+ layout_data(:fill, :center, true, false) {
622
+ minimum_width 50
623
+ }
624
+ text bind(project_dir, 'selected_child.top_pixel')
625
+ foreground @default_foreground
626
+ font stat_font
502
627
  }
503
628
  }
504
- }
505
-
506
- on_item_collapsed { |event|
507
- if @file_lookup_expand_item.swt_expand_item.get_expanded
508
- @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
509
- @file_explorer_expand_item.swt_expand_item.height = 0
510
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
511
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
512
- @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]
513
- end
514
- }
515
-
516
- on_item_expanded {
517
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
518
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
519
- }
520
-
521
- }
522
-
523
- }
524
-
525
- # TODO see if you could replace some of this with Glimmer DSL/API syntax
526
- @file_tree_editor = TreeEditor.new(@file_tree.swt_widget);
527
- @file_tree_editor.horizontalAlignment = swt(:left);
528
- @file_tree_editor.grabHorizontal = true;
529
- @file_tree_editor.minimumHeight = 20;
530
-
531
- }
532
-
533
- composite {
534
- grid_layout(1, false) {
535
- margin_width 0
536
- margin_height 0
537
- }
538
- layout_data :fill, :fill, true, true
539
-
540
- @navigation_expand_bar = expand_bar {
541
- layout_data :fill, :top, true, false
542
- font height: 17, style: :bold
543
- foreground @default_foreground
544
-
545
- @navigation_expand_item = expand_item {
546
- text 'Navigation'
547
- height 115
548
-
549
- grid_layout(5, false) {
550
- margin_right 5
551
- }
552
-
553
- stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
554
-
555
- # row 1
556
-
557
- label {
558
- layout_data(:left, :center, false, false)
559
- text 'File:'
560
- foreground @default_foreground
561
- }
562
-
563
- @file_path_label = styled_text(:none) {
564
- layout_data(:fill, :center, true, false) {
565
- horizontal_span 2
566
- }
567
- background color(:widget_background)
568
- foreground @default_foreground
569
- editable false
570
- caret nil
571
- text bind(project_dir, 'selected_child.path')
572
- on_mouse_up {
573
- @file_path_label.swt_widget.selectAll
574
- }
575
- on_focus_lost {
576
- @file_path_label.swt_widget.setSelection(0, 0)
629
+
630
+ on_item_collapsed {
631
+ collapse_navigation_expand_bar_height
577
632
  }
578
- }
579
-
580
- label {
581
- layout_data(:left, :center, false, false)
582
- text 'Caret Position:'
583
- foreground @default_foreground
584
- }
585
- label(:right) {
586
- layout_data(:fill, :center, true, false)
587
- text bind(project_dir, 'selected_child.caret_position')
588
- foreground @default_foreground
589
- font stat_font
590
- }
591
633
 
592
- # row 2
593
-
594
- label {
595
- layout_data(:left, :center, false, false)
596
- text 'Line:'
597
- foreground @default_foreground
598
- }
599
- @line_number_text = text {
600
- layout_data(:fill, :center, true, false) {
601
- minimum_width 400
602
- }
603
- text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
604
- foreground @default_foreground
605
- font stat_font
606
- on_key_pressed { |key_event|
607
- if key_event.keyCode == swt(:cr)
608
- @current_text_editor&.text_widget&.setFocus
609
- end
610
- }
611
- on_verify_text { |event|
612
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
613
- }
614
- }
615
- label # filler
616
-
617
- label {
618
- layout_data(:left, :center, false, false)
619
- text 'Line Position:'
620
- foreground @default_foreground
621
- }
622
- label(:right) {
623
- layout_data(:fill, :center, true, false)
624
- text bind(project_dir, 'selected_child.line_position')
625
- foreground @default_foreground
626
- font stat_font
627
- }
628
-
629
- # row 3
630
-
631
- label {
632
- layout_data(:left, :center, false, false)
633
- text 'Find:'
634
- foreground @default_foreground
635
- }
636
- @find_text = text {
637
- layout_data(:fill, :center, true, false) {
638
- minimum_width 400
639
- }
640
- text bind(project_dir, 'selected_child.find_text')
641
- foreground @default_foreground
642
- font stat_font
643
- on_key_pressed { |key_event|
644
- if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
645
- project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
646
- project_dir.selected_child&.find_next
647
- end
648
- if key_event.keyCode == swt(:cr)
649
- project_dir.selected_child&.find_next
650
- end
651
- }
652
- }
653
- composite {
654
- layout_data(:left, :center, true, false)
655
- row_layout {
656
- margin_width 0
657
- margin_height 0
658
- }
659
- button(:check) {
660
- selection bind(project_dir, 'selected_child.case_sensitive')
661
- on_key_pressed { |key_event|
662
- if key_event.keyCode == swt(:cr)
663
- project_dir.selected_child&.find_next
664
- end
665
- }
666
- }
667
- label {
668
- text 'Case-sensitive'
669
- foreground @default_foreground
634
+ on_item_expanded {
635
+ expand_navigation_expand_bar_height
670
636
  }
671
- }
672
637
 
673
- label {
674
- layout_data(:left, :center, false, false)
675
- text 'Selection Count:'
676
- foreground @default_foreground
677
- }
678
- label(:right) {
679
- layout_data(:fill, :center, true, false)
680
- text bind(project_dir, 'selected_child.selection_count')
681
- foreground @default_foreground
682
- font stat_font
683
638
  }
684
639
 
685
- # row 4
686
-
687
- label {
688
- layout_data(:left, :center, false, false)
689
- text 'Replace:'
690
- foreground @default_foreground
691
- }
692
- @replace_text = text {
693
- layout_data(:fill, :center, true, false) {
694
- minimum_width 400
695
- }
696
- text bind(project_dir, 'selected_child.replace_text')
697
- foreground @default_foreground
698
- font stat_font
699
- on_focus_gained {
700
- project_dir.selected_child&.ensure_find_next
701
- }
702
- on_key_pressed { |key_event|
703
- if key_event.keyCode == swt(:cr)
704
- if project_dir.selected_child
705
- Command.do(project_dir.selected_child, :replace_next!)
706
- end
707
- end
708
- }
709
- }
710
- label # filler
711
- label {
712
- layout_data(:left, :center, false, false)
713
- text 'Top Pixel:'
714
- foreground @default_foreground
715
- }
716
- label(:right) {
717
- layout_data(:fill, :center, true, false)
718
- text bind(project_dir, 'selected_child.top_pixel')
719
- foreground @default_foreground
720
- font stat_font
721
- }
722
- }
723
-
724
- on_item_collapsed {
725
- @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
726
- @navigation_expand_item.swt_expand_item.height = 0
727
- async_exec {
728
- body_root.pack_same_size
729
- }
730
- }
731
-
732
- on_item_expanded {
733
- @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
734
- async_exec {
735
- body_root.pack_same_size
736
- }
737
- }
738
-
739
- }
740
-
741
- @tab_folder_sash_form = sash_form {
742
- layout_data(:fill, :fill, true, true) {
743
- width_hint 768
744
- height_hint 576
745
- minimum_width 768
746
- minimum_height 576
747
- }
748
- sash_width 10
749
- orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
750
- @current_tab_folder = tab_folder {
751
- drag_source(DND::DROP_COPY) {
752
- transfer [TextTransfer.getInstance].to_java(Transfer)
753
- event_data = nil
754
- on_drag_start {|event|
755
- Gladiator.drag = true
756
- tab_folder = event.widget.getControl
757
- tab_item = tab_folder.getItem(Point.new(event.x, event.y))
758
- event_data = tab_item.getData('file_path')
640
+ @tab_folder_sash_form = sash_form {
641
+ layout_data(:fill, :fill, true, true) {
642
+ width_hint 768
643
+ height_hint 576
644
+ minimum_width 168
645
+ minimum_height 176
759
646
  }
760
- on_drag_set_data { |event|
761
- event.data = event_data
647
+ orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
648
+ self.current_tab_folder = self.tab_folder1 = tab_folder {
649
+ drag_source(DND::DROP_COPY) {
650
+ transfer [TextTransfer.getInstance].to_java(Transfer)
651
+ event_data = nil
652
+ on_drag_start {|event|
653
+ Gladiator.drag = true
654
+ tab_folder = event.widget.getControl
655
+ tab_item = tab_folder.getItem(Point.new(event.x, event.y))
656
+ event_data = tab_item.getData('file_path')
657
+ }
658
+ on_drag_set_data { |event|
659
+ event.data = event_data
660
+ }
661
+ }
762
662
  }
663
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
763
664
  }
764
665
  }
765
- @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
766
- }
666
+ } # end of sash form
767
667
  }
768
- }
668
+ end
769
669
  }
770
670
 
771
671
  def load_config_ignore_paths
@@ -790,23 +690,11 @@ module Glimmer
790
690
  project_dir.ignore_paths ||= ['packages', 'tmp']
791
691
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
792
692
  open_file_paths2 = @config[:open_file_paths2]
793
- self.split_orientation = swt(@config[:split_orientation] || :horizontal) rescue swt(:horizontal)
794
- if @progress_bar_shell.nil?
795
- @progress_bar_shell = shell(body_root, :title) {
796
- text 'Gladiator'
797
- fill_layout(:vertical) {
798
- margin_width 15
799
- margin_height 15
800
- spacing 5
801
- }
802
- label(:center) {
803
- text "Opening Last Open Files"
804
- font height: 20
805
- }
806
- # @progress_bar = progress_bar(:horizontal, :indeterminate)
807
- }
693
+ self.split_orientation = (swt(@config[:split_orientation]) rescue swt(:horizontal)) if @config[:split_orientation]
694
+ if @progress_shell.nil?
695
+ @progress_shell = progress_shell(gladiator: self, progress_text: 'Opening Last Open Files')
808
696
  async_exec {
809
- @progress_bar_shell.open
697
+ @progress_shell.open
810
698
  }
811
699
  end
812
700
  open_file_paths1.to_a.each do |file_path|
@@ -848,8 +736,8 @@ module Glimmer
848
736
  }
849
737
  async_exec {
850
738
  Gladiator.drag = false
851
- @progress_bar_shell&.close
852
- @progress_bar_shell = nil
739
+ @progress_shell&.close
740
+ @progress_shell = nil
853
741
  @loaded_config = true
854
742
  }
855
743
  }
@@ -867,16 +755,17 @@ module Glimmer
867
755
  end
868
756
 
869
757
  def save_config
870
- return unless @loaded_config
758
+ return if !@loaded_config || body_root&.disposed?
871
759
  child = project_dir.selected_child
872
760
  return if child.nil?
873
761
  tab_folder1 = @tab_folder1 || @current_tab_folder
874
762
  tab_folder2 = @tab_folder2
875
763
  open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
876
764
  open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
765
+ split_orientation_value = split_orientation == swt(:horizontal) ? 'horizontal' : (split_orientation == swt(:vertical) ? 'vertical' : nil)
877
766
  @config = {
878
767
  selected_child_path: child.path,
879
- split_orientation: split_orientation == swt(:horizontal) ? 'horizontal' : 'vertical',
768
+ split_orientation: split_orientation_value,
880
769
  caret_position: child.caret_position,
881
770
  top_pixel: child.top_pixel,
882
771
  shell_width: swt_widget&.getBounds&.width,
@@ -892,23 +781,70 @@ module Glimmer
892
781
  rescue => e
893
782
  puts e.full_message
894
783
  end
784
+
785
+ def navigate_to_next_tab_folder
786
+ if tab_folder2
787
+ self.maximized_pane = false
788
+ if current_tab_folder == tab_folder1
789
+ self.current_tab_folder = tab_folder2
790
+ else
791
+ self.current_tab_folder = tab_folder1
792
+ end
793
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
794
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
795
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
796
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
797
+ end
798
+ end
799
+
800
+ def navigate_to_previous_tab_folder
801
+ if tab_folder2
802
+ self.maximized_pane = false
803
+ if current_tab_folder == tab_folder2
804
+ self.current_tab_folder = tab_folder1
805
+ else
806
+ self.current_tab_folder = tab_folder2
807
+ end
808
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
809
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
810
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
811
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
812
+ end
813
+ end
895
814
 
896
- def close_tab_folder
815
+ def close_all_tabs(closing_tab_folder = nil)
816
+ closing_tab_folder ||= current_tab_folder
817
+ closing_tab_folder.swt_widget.getItems.each do |tab_item|
818
+ project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
819
+ tab_item.getData('proxy')&.dispose
820
+ end
821
+ close_tab_folder(closing_tab_folder)
822
+ if self.current_tab_item.nil?
823
+ filter_text.swt_widget.selectAll
824
+ filter_text.swt_widget.setFocus
825
+ end
826
+ end
827
+
828
+ def close_tab_folder(closing_tab_folder = nil, single_tab: false)
829
+ closing_tab_folder ||= current_tab_folder
897
830
  if @tab_folder2 && !selected_tab_item
898
- if @current_tab_folder == @tab_folder2
831
+ if closing_tab_folder == @tab_folder2
899
832
  @tab_folder2.swt_widget.dispose
900
- @current_tab_folder = @tab_folder1
833
+ self.current_tab_folder = @tab_folder1
901
834
  else
902
835
  @tab_folder1.swt_widget.dispose
903
- @current_tab_folder = @tab_folder1 = @tab_folder2
836
+ self.current_tab_folder = self.tab_folder1 = @tab_folder2
904
837
  end
905
- @tab_folder2 = nil
838
+ self.tab_folder2 = nil
839
+ body_root.pack_same_size
906
840
 
907
- @current_tab_item = @current_tab_folder.swt_widget.getData('selected_tab_item')
841
+ @current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
908
842
  @current_text_editor = @current_tab_item.swt_tab_item.getData('text_editor')
909
843
  project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
910
-
911
- async_exec { body_root.pack_same_size }
844
+ @current_text_editor&.text_widget&.setFocus
845
+ async_exec { @current_text_editor&.text_widget&.setFocus }
846
+ elsif !single_tab
847
+ self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
912
848
  end
913
849
  end
914
850
 
@@ -923,122 +859,18 @@ module Glimmer
923
859
  def other_tab_items
924
860
  @current_tab_folder.swt_widget.getItems.reject { |ti| ti.getData('file_path') == project_dir.selected_child&.path }
925
861
  end
926
-
927
- def extract_tree_item_path(tree_item)
928
- return if tree_item.nil?
929
- if tree_item.getParentItem
930
- ::File.join(extract_tree_item_path(tree_item.getParentItem), tree_item.getText)
931
- else
932
- project_dir.path
933
- end
934
- end
935
-
936
- def select_tree_item
937
- return unless project_dir.selected_child&.name
938
- tree_items_to_select = @file_tree.depth_first_search { |ti| ti.getData.path == project_dir.selected_child.path }
939
- @file_tree.swt_widget.setSelection(tree_items_to_select)
940
- end
941
-
942
- def delete_tree_item(tree_item)
943
- return if tree_item.nil?
944
- file = tree_item.getData
945
- parent_path = ::File.dirname(file.path)
946
- if file.is_a?(Gladiator::Dir)
947
- file_paths = file.all_children.select {|f| f.is_a?(Gladiator::File)}.map(&:path)
948
- file.remove_all_observers
949
- else
950
- file_paths = [file.path]
951
- end
952
- file_paths.each do |file_path|
953
- found_tab_item = find_tab_item(file_path)
954
- if found_tab_item
955
- project_dir.selected_child_path_history.delete(found_tab_item.getData('file_path'))
956
- found_tab_item.getData('proxy')&.dispose
957
- end
958
- end
959
- file.delete! # TODO consider supporting command undo/redo
960
- project_dir.refresh(async: false)
961
- parent_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == parent_path}.first
962
- @file_tree.swt_widget.showItem(parent_tree_item)
963
- parent_tree_item.setExpanded(true)
964
- rescue => e
965
- puts e.full_message
966
- end
967
-
968
- def add_new_directory_to_selected_tree_item
969
- project_dir.pause_refresh
970
- tree_item = @file_tree.swt_widget.getSelection.first
971
- directory_path = extract_tree_item_path(tree_item)
972
- return if directory_path.nil?
973
- if !::Dir.exist?(directory_path)
974
- tree_item = tree_item.getParentItem
975
- directory_path = ::File.dirname(directory_path)
976
- end
977
- new_directory_path = ::File.expand_path(::File.join(directory_path, 'new_directory'))
978
- FileUtils.mkdir_p(new_directory_path)
979
- project_dir.refresh(async: false, force: true)
980
- new_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == new_directory_path}.first
981
- @file_tree.swt_widget.showItem(new_tree_item)
982
- rename_tree_item(new_tree_item)
983
- end
984
-
985
- def add_new_file_to_selected_tree_item
986
- project_dir.pause_refresh
987
- tree_item = @file_tree.swt_widget.getSelection.first
988
- directory_path = extract_tree_item_path(tree_item)
989
- if !::Dir.exist?(directory_path)
990
- tree_item = tree_item.getParentItem
991
- directory_path = ::File.dirname(directory_path)
992
- end
993
- new_file_path = ::File.expand_path(::File.join(directory_path, 'new_file'))
994
- FileUtils.touch(new_file_path)
995
- # TODO look into refreshing only the parent directory to avoid slowdown
996
- project_dir.refresh(async: false, force: true)
997
- new_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == new_file_path}.first
998
- @file_tree.swt_widget.showItem(new_tree_item)
999
- rename_tree_item(new_tree_item, true)
1000
- end
1001
-
1002
- def rename_selected_tree_item
1003
- project_dir.pause_refresh
1004
- tree_item = @file_tree.swt_widget.getSelection.first
1005
- rename_tree_item(tree_item)
862
+
863
+ def collapse_navigation_expand_bar_height
864
+ @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
865
+ @navigation_expand_item.swt_expand_item.height = 0
866
+ body_root.pack_same_size
867
+ async_exec { body_root.pack_same_size }
1006
868
  end
1007
869
 
1008
- def rename_tree_item(tree_item, new_file = false)
1009
- original_file = tree_item.getData
1010
- current_file = project_dir.selected_child_path == original_file.path
1011
- found_tab_item = find_tab_item(original_file.path)
1012
- found_text_editor = found_tab_item&.getData('text_editor')
1013
- @file_tree.edit_tree_item(
1014
- tree_item,
1015
- after_write: -> (edited_tree_item) {
1016
- file = edited_tree_item.getData
1017
- file_path = file.path
1018
- file.name
1019
- if new_file
1020
- project_dir.selected_child_path = file_path
1021
- else
1022
- found_text_editor&.file = file
1023
- found_tab_item&.setData('file', file)
1024
- found_tab_item&.setData('file_path', file.path)
1025
- found_tab_item&.setText(file.name)
1026
- body_root.pack_same_size
1027
- if current_file
1028
- project_dir.selected_child_path = file_path
1029
- else
1030
- selected_tab_item&.getData('text_editor')&.text_widget&.setFocus
1031
- end
1032
- async_exec {
1033
- @file_tree.swt_widget.showItem(edited_tree_item)
1034
- }
1035
- end
1036
- project_dir.resume_refresh
1037
- },
1038
- after_cancel: -> {
1039
- project_dir.resume_refresh
1040
- }
1041
- )
870
+ def expand_navigation_expand_bar_height
871
+ @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height || 140
872
+ body_root.pack_same_size
873
+ async_exec { body_root.pack_same_size }
1042
874
  end
1043
875
 
1044
876
  def extract_char(event)
@@ -1050,27 +882,15 @@ module Glimmer
1050
882
  def open_project
1051
883
  selected_directory = directory_dialog.open
1052
884
  return if selected_directory.nil?
1053
- @progress_bar_shell = shell(body_root, :title) {
1054
- text 'Gladiator'
1055
- fill_layout(:vertical) {
1056
- margin_width 15
1057
- margin_height 15
1058
- spacing 5
1059
- }
1060
- label(:center) {
1061
- text "Opening Project: #{::File.basename(selected_directory)}"
1062
- font height: 20
1063
- }
1064
- # @progress_bar = progress_bar(:horizontal, :indeterminate)
1065
- }
885
+ @progress_shell = progress_shell(gladiator: self, progress_text: "Opening Project: #{::File.basename(selected_directory)}")
1066
886
  async_exec {
1067
- @progress_bar_shell.open
887
+ @progress_shell.open
1068
888
  }
1069
889
  async_exec {
1070
890
  gladiator(project_dir_path: selected_directory) {
1071
891
  on_swt_show {
1072
- @progress_bar_shell.close
1073
- @progress_bar_shell = nil
892
+ @progress_shell.close
893
+ @progress_shell = nil
1074
894
  }
1075
895
  }.open if selected_directory
1076
896
  }
@@ -1083,18 +903,19 @@ module Glimmer
1083
903
  margin_height 15
1084
904
  }
1085
905
 
906
+ background :white
1086
907
  image ICON
1087
908
  text 'About'
1088
- background :white
1089
909
 
1090
910
  label {
1091
911
  layout_data :center, :center, false, false
912
+ background :white
1092
913
  image ICON, height: 260
1093
914
  }
1094
915
  label {
1095
916
  layout_data :fill, :fill, true, true
1096
- text "Gladiator v#{VERSION}\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
1097
917
  background :white
918
+ text "Gladiator v#{VERSION} (Beta)\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
1098
919
  }
1099
920
  }.open
1100
921
  end
@@ -1112,29 +933,22 @@ module Glimmer
1112
933
  find_action.call
1113
934
  else
1114
935
  @navigation_expand_item.swt_expand_item.set_expanded true
1115
- @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
1116
936
  async_exec {
1117
937
  body_root.pack_same_size
938
+ find_action.call
1118
939
  }
1119
- async_exec(&find_action)
1120
940
  end
1121
941
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
1122
942
  Clipboard.copy(project_dir.selected_child.path)
1123
943
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
1124
944
  project_dir.selected_child.find_previous
1125
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'p'
1126
- open_project
1127
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 's'
1128
- project_dir.selected_child_path = '' # scratchpad
945
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
946
+ self.maximized_pane = false
947
+ old_split_orientation = self.split_orientation
948
+ self.split_orientation = split_pane? && split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
949
+ @tab_folder_sash_form.weights = [1, 1] if old_split_orientation.nil?
1129
950
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'w'
1130
- current_tab_folder.swt_widget.getItems.each do |tab_item|
1131
- project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
1132
- tab_item.getData('proxy')&.dispose
1133
- end
1134
- close_tab_folder
1135
- self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
1136
- filter_text.swt_widget.selectAll
1137
- filter_text.swt_widget.setFocus
951
+ close_all_tabs
1138
952
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :alt) && extract_char(key_event) == 'w'
1139
953
  other_tab_items.each do |tab_item|
1140
954
  project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
@@ -1144,17 +958,22 @@ module Glimmer
1144
958
  if selected_tab_item
1145
959
  project_dir.selected_child_path_history.delete(project_dir.selected_child.path)
1146
960
  selected_tab_item.getData('proxy')&.dispose
1147
- close_tab_folder
961
+ close_tab_folder(single_tab: true)
962
+ # if self.current_tab_item.nil?
963
+ # filter_text.swt_widget.selectAll
964
+ # filter_text.swt_widget.setFocus
965
+ # else
966
+ # current_text_editor&.text_widget&.setFocus
967
+ # end
1148
968
  if selected_tab_item.nil?
1149
969
  self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
1150
970
  filter_text.swt_widget.selectAll
1151
971
  filter_text.swt_widget.setFocus
1152
972
  else
1153
973
  current_text_editor&.text_widget&.setFocus
974
+ # async_exec { current_text_editor&.text_widget&.setFocus }
1154
975
  end
1155
976
  end
1156
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
1157
- self.split_orientation = split_pane? && split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
1158
977
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
1159
978
  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
1160
979
  current_text_editor&.text_widget&.setFocus
@@ -1162,27 +981,9 @@ module Glimmer
1162
981
  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
1163
982
  current_text_editor&.text_widget&.setFocus
1164
983
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == ']'
1165
- if tab_folder2
1166
- if current_tab_folder == tab_folder1
1167
- self.current_tab_folder = tab_folder2
1168
- else
1169
- self.current_tab_folder = tab_folder1
1170
- end
1171
- self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
1172
- self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
1173
- current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
1174
- end
984
+ navigate_to_next_tab_folder
1175
985
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == '['
1176
- if tab_folder2
1177
- if current_tab_folder == tab_folder2
1178
- self.current_tab_folder = tab_folder1
1179
- else
1180
- self.current_tab_folder = tab_folder2
1181
- end
1182
- self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
1183
- self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
1184
- current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
1185
- end
986
+ navigate_to_previous_tab_folder
1186
987
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
1187
988
  current_tab_folder.swt_widget.setSelection(0) if current_tab_folder.swt_widget.getItemCount >= 1
1188
989
  current_text_editor&.text_widget&.setFocus
@@ -1228,6 +1029,7 @@ module Glimmer
1228
1029
  line_number_text.swt_widget.setFocus
1229
1030
  end
1230
1031
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'r'
1032
+ self.maximized_editor = false
1231
1033
  unless @file_lookup_expand_item.swt_expand_item.get_expanded
1232
1034
  @file_lookup_expand_item.swt_expand_item.set_expanded true
1233
1035
  @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
@@ -1236,13 +1038,14 @@ module Glimmer
1236
1038
  filter_text.swt_widget.selectAll
1237
1039
  filter_text.swt_widget.setFocus
1238
1040
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 't'
1041
+ self.maximized_editor = false
1239
1042
  unless @file_explorer_expand_item.swt_expand_item.get_expanded
1240
1043
  @file_explorer_expand_item.swt_expand_item.set_expanded true
1241
1044
  @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
1242
1045
  @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
1243
1046
  end
1244
- select_tree_item unless rename_in_progress
1245
- file_tree.swt_widget.setFocus
1047
+ @file_explorer_tree.select_tree_item
1048
+ @file_explorer_tree.swt_widget.setFocus
1246
1049
  elsif key_event.keyCode == swt(:esc)
1247
1050
  if current_text_editor
1248
1051
  project_dir.selected_child_path = current_text_editor.file.path