glimmer-cs-gladiator 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,10 +18,14 @@ module Glimmer
18
18
  APP_ROOT = ::File.expand_path('../../../..', __FILE__)
19
19
  # TODO make sure COMMAND_KEY doesn't clash on Linux/Windows for CMD+CTRL shortcuts
20
20
  COMMAND_KEY = OS.mac? ? :command : :ctrl
21
+ VERSION = ::File.read(::File.join(APP_ROOT, 'VERSION')).to_s.strip
22
+ LICENSE = ::File.read(::File.join(APP_ROOT, 'LICENSE.txt')).to_s.strip
23
+ ICON = ::File.expand_path(::File.join(APP_ROOT, 'images', 'glimmer-cs-gladiator-logo.png'))
21
24
 
22
25
  class << self
23
26
  attr_accessor :drag_and_drop
24
27
  attr_accessor :drag
28
+ attr_accessor :startup
25
29
  end
26
30
 
27
31
  ## Add options like the following to configure CustomShell by outside consumers
@@ -38,7 +42,7 @@ module Glimmer
38
42
  def split_orientation=(value)
39
43
  @split_orientation = value
40
44
  save_config
41
- if @loaded_config && !split_pane?
45
+ if @loaded_config && !split_pane? && !value.nil?
42
46
  Gladiator.drag = true
43
47
  child_path = project_dir.selected_child_path
44
48
  project_dir.selected_child = nil
@@ -52,9 +56,11 @@ module Glimmer
52
56
  pane_count = @tab_folder_sash_form&.children&.size
53
57
  pane_count && pane_count > 1
54
58
  end
55
-
56
- attr_reader :find_text, :tab_folder1, :tab_folder2, :filter_text, :rename_in_progress, :line_number_text, :file_tree, :split_orientation
57
- attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor
59
+
60
+ attr_reader :find_text, :filter_text, :rename_in_progress, :line_number_text, :file_tree, :split_orientation
61
+ attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor, :tab_folder1, :tab_folder2, :maximized_pane, :maximized_editor
62
+ alias maximized_pane? maximized_pane
63
+ alias maximized_editor? maximized_editor
58
64
 
59
65
  ## Uncomment before_body block to pre-initialize variables to use in body
60
66
  #
@@ -62,17 +68,25 @@ module Glimmer
62
68
  before_body {
63
69
  # TODO consider doing loading project files after displaying the GUI instead of holding it up before
64
70
  project_dir #pre-initialize directory
65
- at_exit do
71
+ TOPLEVEL_BINDING.receiver.send(:at_exit) do
66
72
  project_dir.selected_child&.write_raw_dirty_content
67
73
  end
68
74
  Display.setAppName('Gladiator')
69
75
  # make sure the display events are only hooked once if multiple gladiators are created
70
76
  unless defined?(@@display)
71
77
  @@display = display {
78
+ # TODO look into why a weird java dialog comes up on about (maybe a non-issue once packaged)
79
+ on_about {
80
+ display_about_dialog
81
+ }
72
82
  on_swt_keydown { |key_event|
73
83
  focused_gladiator = display.focus_control.shell&.get_data('custom_shell')
74
84
  focused_gladiator.handle_display_shortcut(key_event) if !focused_gladiator.nil? && key_event.widget.shell == focused_gladiator&.swt_widget
75
85
  }
86
+ on_swt_Close {
87
+ save_config
88
+ project_dir.selected_child&.write_dirty_content
89
+ }
76
90
  }
77
91
  end
78
92
 
@@ -88,23 +102,24 @@ module Glimmer
88
102
  #
89
103
  after_body {
90
104
  observe(project_dir, 'children') do
91
- select_tree_item unless @rename_in_progress
105
+ select_tree_item unless @rename_in_progress || Gladiator.startup
92
106
  end
93
107
  observe(project_dir, 'selected_child') do |selected_file|
94
108
  if selected_file
95
109
  if Gladiator.drag && !@tab_folder2
96
- @tab_folder1 = @current_tab_folder
110
+ self.tab_folder1 = current_tab_folder
97
111
  @tab_folder_sash_form.content {
98
- @current_tab_folder = @tab_folder2 = tab_folder
112
+ self.current_tab_folder = self.tab_folder2 = tab_folder {}
99
113
  @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
100
114
  }
115
+ body_root.pack_same_size
101
116
  end
102
- select_tree_item unless @rename_in_progress
117
+ select_tree_item unless @rename_in_progress || Gladiator.startup
103
118
  found_tab_item = selected_tab_item
104
119
  if found_tab_item
105
120
  @current_tab_folder.swt_widget.setSelection(found_tab_item)
106
121
  @current_tab_item = found_tab_item.getData('proxy')
107
- @current_text_editor = found_tab_item.getData('text_editor')
122
+ @current_text_editor = found_tab_item.getData('text_editor') unless found_tab_item.getData('text_editor').nil?
108
123
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
109
124
  elsif selected_file
110
125
  @current_tab_folder.content {
@@ -114,37 +129,42 @@ module Glimmer
114
129
  margin_width 0
115
130
  margin_height 0
116
131
  }
117
- @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file)
118
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
119
- @current_text_editor.text_proxy.content {
120
- on_focus_gained {
121
- tab_folder = the_text_editor.swt_widget.getParent.getParent
122
- @current_tab_folder = tab_folder.getData('proxy')
123
- @current_tab_item = the_tab_item
124
- @current_text_editor = the_text_editor
125
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
126
- @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
127
- project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
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')
147
+ }
128
148
  }
129
149
  }
150
+
130
151
  on_swt_show {
131
152
  @current_tab_item = the_tab_item
132
153
  @current_text_editor = the_text_editor
133
- @current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
154
+ self.current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
134
155
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
135
156
  @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
136
157
  project_dir.selected_child = selected_file
137
- async_exec {
138
- @current_text_editor&.text_widget&.setFocus
139
- }
158
+ @current_text_editor&.text_widget&.setFocus
140
159
  }
141
160
  on_widget_disposed {
142
- the_tab_item.swt_tab_item.get_data('file').close
143
- }
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
+ }
144
165
  }
145
166
  @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
146
167
  @current_tab_item.swt_tab_item.setData('file', selected_file)
147
- @current_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
148
168
  @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
149
169
  }
150
170
  @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
@@ -153,6 +173,16 @@ module Glimmer
153
173
  @current_text_editor&.text_widget&.setFocus
154
174
  end
155
175
  end
176
+ observe(self, 'maximized_pane') do
177
+ if tab_folder2
178
+ @tab_folder_sash_form.maximized_control = (current_tab_folder.swt_widget if maximized_pane?)
179
+ end
180
+ end
181
+ observe(self, 'maximized_editor') do
182
+ @file_area_and_editor_area_sash_form.maximized_control = (@editor_area_composite.swt_widget if maximized_editor?)
183
+ @navigation_expand_item.swt_expand_item.set_expanded !maximized_editor?
184
+ body_root.pack_same_size
185
+ end
156
186
  observe(project_dir, 'selected_child') do
157
187
  save_config
158
188
  end
@@ -170,19 +200,30 @@ module Glimmer
170
200
  #
171
201
  body {
172
202
  shell {
173
- grid_layout(2, false)
174
-
175
203
  text "Gladiator - #{::File.expand_path(project_dir.path)}"
176
204
  minimum_size 520, 250
177
205
  size 1440, 900
206
+ image ICON
178
207
 
179
208
  on_swt_show {
180
209
  swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
181
210
  swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
182
211
  @loaded_config = true
183
212
  }
184
- on_swt_close {
213
+
214
+ on_shell_closed {
215
+ save_config
185
216
  project_dir.selected_child&.write_dirty_content
217
+ if @tab_folder2
218
+ current_tab_folder.swt_widget.getItems.each do |tab_item|
219
+ tab_item.getData('proxy')&.dispose
220
+ 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?
186
227
  }
187
228
  on_widget_disposed {
188
229
  project_dir.selected_child&.write_dirty_content
@@ -194,46 +235,108 @@ module Glimmer
194
235
  save_config
195
236
  }
196
237
  on_shell_deactivated {
197
- @current_text_editor&.file&.write_dirty_content
238
+ project_dir.selected_child&.write_dirty_content
198
239
  }
199
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)
246
+ }
247
+ end
248
+
200
249
  menu_bar {
201
250
  menu {
202
251
  text '&File'
203
252
 
204
253
  menu_item {
205
254
  text 'New &Scratchpad'
255
+ accelerator COMMAND_KEY, :shift, :s
206
256
  on_widget_selected {
207
- begin
208
- project_dir.selected_child_path = ''
209
- rescue => e
210
- puts e.full_message
211
- end
257
+ project_dir.selected_child_path = ''
212
258
  }
213
259
  }
214
- menu_item(:separator)
215
260
  menu_item {
216
261
  text 'Open &Project...'
262
+ accelerator COMMAND_KEY, :o
217
263
  on_widget_selected {
218
264
  open_project
219
265
  }
220
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
+ }
221
277
  }
222
278
  menu {
223
279
  text '&View'
224
280
  menu {
225
- text '&Split'
226
- menu_item(:radio) {
227
- text '&Horizontal'
228
- selection bind(self, :split_orientation,
229
- on_read: ->(o) { split_pane? && o == swt(:horizontal)},
230
- on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical) })
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
+ }
231
296
  }
232
- menu_item(:radio) {
233
- text '&Vertical'
234
- selection bind(self, :split_orientation,
235
- on_read: ->(o) { split_pane? && o == swt(:vertical)},
236
- on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal) })
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]
237
340
  }
238
341
  }
239
342
  }
@@ -254,467 +357,480 @@ module Glimmer
254
357
  # }
255
358
  menu_item {
256
359
  text '&Ruby'
360
+ accelerator COMMAND_KEY, :shift, :r
257
361
  on_widget_selected {
258
- project_dir.selected_child.run
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
+ }
374
+ }
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
259
382
  }
260
383
  }
261
384
  }
262
385
  }
386
+
387
+ @file_area_and_editor_area_sash_form = sash_form(:horizontal) {
388
+ weights 1, 5
263
389
 
264
- composite {
265
- grid_layout(1, false) {
266
- margin_width 0
267
- margin_height 0
268
- }
269
-
270
- layout_data(:fill, :fill, false, true) {
271
- width_hint 300
272
- }
273
- @side_bar_sash_form = sash_form(:vertical) {
274
- layout_data(:fill, :fill, true, true)
275
- sash_width 4
276
-
277
- resize_expand_items = lambda { |event=nil|
278
- @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
279
- @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
390
+ composite {
391
+ grid_layout(1, false) {
392
+ margin_width 0
393
+ margin_height 0
280
394
  }
281
395
 
282
- @file_lookup_expand_bar = expand_bar {
283
- layout_data :fill, :fill, true, true
284
- font height: 17, style: :bold
285
- foreground @default_foreground
286
-
287
- on_swt_show {
288
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
289
- }
396
+ @side_bar_sash_form = sash_form(:vertical) {
397
+ layout_data(:fill, :fill, true, true)
398
+ sash_width 4
290
399
 
291
- on_swt_Resize(&resize_expand_items)
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
403
+ }
292
404
 
293
- @file_lookup_expand_item = expand_item {
294
- grid_layout {
295
- margin_width 0
296
- margin_height 0
297
- }
298
- text 'File Lookup'
299
- height display.bounds.height
405
+ @file_lookup_expand_bar = expand_bar {
406
+ layout_data :fill, :fill, true, true
407
+ font height: 17, style: :bold
408
+ foreground @default_foreground
300
409
 
301
- @filter_text = text {
302
- layout_data :fill, :center, true, false
303
- text bind(project_dir, 'filter')
304
- on_key_pressed { |key_event|
305
- if key_event.keyCode == swt(:tab) ||
306
- key_event.keyCode == swt(:cr) ||
307
- key_event.keyCode == swt(:arrow_up) ||
308
- key_event.keyCode == swt(:arrow_down)
309
- @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
310
- @file_lookup_list.swt_widget.setFocus
311
- end
312
- }
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
313
412
  }
314
-
315
- @file_lookup_list = list(:border, :h_scroll, :v_scroll) {
316
- layout_data :fill, :fill, true, true
317
- #visible bind(self, 'project_dir.filter') {|f| !!f}
318
- selection bind(project_dir, :filtered_path)
319
- foreground @default_foreground
320
- on_mouse_up {
321
- project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
413
+
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
322
420
  }
323
- on_key_pressed { |key_event|
324
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
325
- project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
326
- @current_text_editor&.text_widget&.setFocus
327
- end
421
+ text 'File Lookup'
422
+ height display.bounds.height
423
+
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
435
+ }
328
436
  }
329
- drag_source(DND::DROP_COPY) {
330
- transfer [TextTransfer.getInstance].to_java(Transfer)
331
- on_drag_set_data { |event|
332
- Gladiator.drag = true
333
- list = event.widget.getControl
334
- event.data = list.getSelection.first
437
+
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
451
+ }
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
+ }
335
459
  }
336
460
  }
337
461
  }
338
- }
339
-
340
- on_item_collapsed { |event|
341
- if @file_explorer_expand_item.swt_expand_item.get_expanded
342
- @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
343
- @file_lookup_expand_item.swt_expand_item.height = 0
344
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
345
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
346
- @side_bar_sash_form.weights = [@file_lookup_expand_item.swt_expand_item.header_height, @file_lookup_expand_bar_height + @file_explorer_expand_bar_height - @file_lookup_expand_item.swt_expand_item.header_height]
347
- end
348
- }
349
-
350
- on_item_expanded {
351
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
352
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
353
- }
354
-
355
- }
356
-
357
- @file_explorer_expand_bar = expand_bar {
358
- layout_data :fill, :fill, true, true
359
- font height: 17, style: :bold
360
- foreground @default_foreground
462
+
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
+ }
361
472
 
362
- on_swt_show {
363
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
364
- }
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]
476
+ }
477
+
478
+ }
365
479
 
366
- on_swt_Resize(&resize_expand_items)
367
-
368
- @file_explorer_expand_item = expand_item {
369
- grid_layout {
370
- margin_width 0
371
- margin_height 0
372
- }
373
- text 'File Explorer'
374
- height display.bounds.height
480
+ @file_explorer_expand_bar = expand_bar {
481
+ layout_data :fill, :fill, true, true
482
+ font height: 17, style: :bold
483
+ foreground @default_foreground
375
484
 
376
- @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
377
- layout_data :fill, :fill, true, true
378
- #visible bind(self, 'project_dir.filter') {|f| !f}
379
- items bind(self, :project_dir), tree_properties(children: :children, text: :name)
380
- foreground @default_foreground
381
- drag_source(DND::DROP_COPY) {
382
- transfer [TextTransfer.getInstance].to_java(Transfer)
383
- on_drag_set_data { |event|
384
- Gladiator.drag = true
385
- tree = event.widget.getControl
386
- tree_item = tree.getSelection.first
387
- event.data = tree_item.getData.path
388
- }
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
389
495
  }
390
- menu {
391
- @open_menu_item = menu_item {
392
- text 'Open'
393
- on_widget_selected {
394
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
496
+ text 'File Explorer'
497
+ height display.bounds.height
498
+
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)
503
+ 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
395
511
  }
396
512
  }
397
- menu_item(:separator)
398
- menu_item {
399
- text 'Delete'
400
- on_widget_selected {
401
- tree_item = @file_tree.swt_widget.getSelection.first
402
- delete_tree_item(tree_item)
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
+ }
403
519
  }
404
- }
405
- menu_item {
406
- text 'Refresh'
407
- on_widget_selected {
408
- project_dir.refresh
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
+ }
409
527
  }
410
- }
411
- menu_item {
412
- text 'Rename'
413
- on_widget_selected {
414
- rename_selected_tree_item
528
+ menu_item {
529
+ text 'Refresh'
530
+ on_widget_selected {
531
+ project_dir.refresh
532
+ }
415
533
  }
416
- }
417
- menu_item {
418
- text 'New Directory'
419
- on_widget_selected {
420
- add_new_directory_to_selected_tree_item
534
+ menu_item {
535
+ text 'Rename'
536
+ on_widget_selected {
537
+ rename_selected_tree_item
538
+ }
421
539
  }
422
- }
423
- menu_item {
424
- text 'New File'
425
- on_widget_selected {
426
- add_new_file_to_selected_tree_item
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
+ }
427
551
  }
428
552
  }
429
- }
430
- on_swt_menudetect { |event|
431
- path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
432
- @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
433
- }
434
- on_mouse_up {
435
- if Gladiator.drag_and_drop
436
- Gladiator.drag_and_drop = false
437
- else
438
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
439
- @current_text_editor&.text_widget&.setFocus
440
- end
441
- }
442
- on_key_pressed { |key_event|
443
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
444
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
445
- @current_text_editor&.text_widget&.setFocus
446
- end
447
- }
448
- on_paint_control {
449
- root_item = @file_tree.swt_widget.getItems.first
450
- if root_item && !root_item.getExpanded
451
- root_item.setExpanded(true)
452
- end
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
556
+ }
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
564
+ }
565
+ 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)
568
+ @current_text_editor&.text_widget&.setFocus
569
+ end
570
+ }
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
576
+ }
453
577
  }
454
578
  }
455
- }
456
-
457
- on_item_collapsed { |event|
458
- if @file_lookup_expand_item.swt_expand_item.get_expanded
459
- @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
460
- @file_explorer_expand_item.swt_expand_item.height = 0
461
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
462
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
463
- @side_bar_sash_form.weights = [@file_explorer_expand_bar_height + @file_explorer_expand_bar_height - @file_explorer_expand_item.swt_expand_item.header_height, @file_explorer_expand_item.swt_expand_item.header_height]
464
- end
465
- }
466
-
467
- on_item_expanded {
468
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
469
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
470
- }
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
+ }
471
589
 
472
- }
473
-
474
- }
475
-
476
- # TODO see if you could replace some of this with Glimmer DSL/API syntax
477
- @file_tree_editor = TreeEditor.new(@file_tree.swt_widget);
478
- @file_tree_editor.horizontalAlignment = swt(:left);
479
- @file_tree_editor.grabHorizontal = true;
480
- @file_tree_editor.minimumHeight = 20;
481
-
482
- }
483
-
484
- composite {
485
- grid_layout(1, false) {
486
- margin_width 0
487
- margin_height 0
488
- }
489
- layout_data :fill, :fill, true, true
490
-
491
- @navigation_expand_bar = expand_bar {
492
- layout_data :fill, :top, true, false
493
- font height: 17, style: :bold
494
- foreground @default_foreground
495
-
496
- @navigation_expand_item = expand_item {
497
- text 'Navigation'
498
- height 115
499
-
500
- grid_layout(5, false) {
501
- margin_right 5
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
+
502
595
  }
503
-
504
- stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
505
596
 
506
- # row 1
597
+ }
507
598
 
508
- label {
509
- layout_data(:left, :center, false, false)
510
- text 'File:'
511
- foreground @default_foreground
512
- }
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;
513
604
 
514
- @file_path_label = styled_text(:none) {
515
- layout_data(:fill, :center, true, false) {
516
- horizontal_span 2
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
517
624
  }
518
- background color(:widget_background)
519
- foreground @default_foreground
520
- editable false
521
- caret nil
522
- text bind(project_dir, 'selected_child.path')
523
- on_mouse_up {
524
- @file_path_label.swt_widget.selectAll
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
525
634
  }
526
- on_focus_lost {
527
- @file_path_label.swt_widget.setSelection(0, 0)
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
647
+ }
648
+ on_focus_lost {
649
+ @file_path_label.swt_widget.setSelection(0, 0)
650
+ }
528
651
  }
529
- }
530
-
531
- label {
532
- layout_data(:left, :center, false, false)
533
- text 'Caret Position:'
534
- foreground @default_foreground
535
- }
536
- label(:right) {
537
- layout_data(:fill, :center, true, false)
538
- text bind(project_dir, 'selected_child.caret_position')
539
- foreground @default_foreground
540
- font stat_font
541
- }
542
-
543
- # row 2
544
-
545
- label {
546
- layout_data(:left, :center, false, false)
547
- text 'Line:'
548
- foreground @default_foreground
549
- }
550
- @line_number_text = text {
551
- layout_data(:fill, :center, true, false) {
552
- minimum_width 400
652
+
653
+ label {
654
+ layout_data(:left, :center, false, false)
655
+ text 'Caret Position:'
656
+ foreground @default_foreground
553
657
  }
554
- text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
555
- foreground @default_foreground
556
- font stat_font
557
- on_key_pressed { |key_event|
558
- if key_event.keyCode == swt(:cr)
559
- @current_text_editor&.text_widget&.setFocus
560
- end
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
561
663
  }
562
- on_verify_text { |event|
563
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
664
+
665
+ # row 2
666
+
667
+ label {
668
+ layout_data(:left, :center, false, false)
669
+ text 'Line:'
670
+ foreground @default_foreground
564
671
  }
565
- }
566
- label # filler
567
-
568
- label {
569
- layout_data(:left, :center, false, false)
570
- text 'Line Position:'
571
- foreground @default_foreground
572
- }
573
- label(:right) {
574
- layout_data(:fill, :center, true, false)
575
- text bind(project_dir, 'selected_child.line_position')
576
- foreground @default_foreground
577
- font stat_font
578
- }
579
-
580
- # row 3
581
-
582
- label {
583
- layout_data(:left, :center, false, false)
584
- text 'Find:'
585
- foreground @default_foreground
586
- }
587
- @find_text = text {
588
- layout_data(:fill, :center, true, false) {
589
- minimum_width 400
672
+ @line_number_text = text {
673
+ layout_data(:fill, :center, true, false) {
674
+ minimum_width 400
675
+ }
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
683
+ }
684
+ on_verify_text { |event|
685
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
686
+ }
590
687
  }
591
- text bind(project_dir, 'selected_child.find_text')
592
- foreground @default_foreground
593
- font stat_font
594
- on_key_pressed { |key_event|
595
- if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
596
- project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
597
- project_dir.selected_child&.find_next
598
- end
599
- if key_event.keyCode == swt(:cr)
600
- project_dir.selected_child&.find_next
601
- end
688
+ label # filler
689
+
690
+ label {
691
+ layout_data(:left, :center, false, false)
692
+ text 'Line Position:'
693
+ foreground @default_foreground
602
694
  }
603
- }
604
- composite {
605
- layout_data(:left, :center, true, false)
606
- row_layout {
607
- margin_width 0
608
- margin_height 0
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
609
708
  }
610
- button(:check) {
611
- selection bind(project_dir, 'selected_child.case_sensitive')
709
+ @find_text = text {
710
+ layout_data(:fill, :center, true, false) {
711
+ minimum_width 400
712
+ }
713
+ text bind(project_dir, 'selected_child.find_text')
714
+ foreground @default_foreground
715
+ font stat_font
612
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
613
721
  if key_event.keyCode == swt(:cr)
614
722
  project_dir.selected_child&.find_next
615
723
  end
616
724
  }
617
725
  }
726
+ composite {
727
+ layout_data(:left, :center, true, false)
728
+ row_layout {
729
+ margin_width 0
730
+ margin_height 0
731
+ }
732
+ button(:check) {
733
+ selection bind(project_dir, 'selected_child.case_sensitive')
734
+ on_key_pressed { |key_event|
735
+ if key_event.keyCode == swt(:cr)
736
+ project_dir.selected_child&.find_next
737
+ end
738
+ }
739
+ }
740
+ label {
741
+ text 'Case-sensitive'
742
+ foreground @default_foreground
743
+ }
744
+ }
745
+
618
746
  label {
619
- text 'Case-sensitive'
747
+ layout_data(:left, :center, false, false)
748
+ text 'Selection Count:'
749
+ foreground @default_foreground
620
750
  }
621
- }
622
-
623
- label {
624
- layout_data(:left, :center, false, false)
625
- text 'Selection Count:'
626
- foreground @default_foreground
627
- }
628
- label(:right) {
629
- layout_data(:fill, :center, true, false)
630
- text bind(project_dir, 'selected_child.selection_count')
631
- foreground @default_foreground
632
- font stat_font
633
- }
634
-
635
- # row 4
636
-
637
- label {
638
- layout_data(:left, :center, false, false)
639
- text 'Replace:'
640
- foreground @default_foreground
641
- }
642
- @replace_text = text {
643
- layout_data(:fill, :center, true, false) {
644
- minimum_width 400
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
645
756
  }
646
- text bind(project_dir, 'selected_child.replace_text')
647
- foreground @default_foreground
648
- font stat_font
649
- on_focus_gained {
650
- project_dir.selected_child&.ensure_find_next
757
+
758
+ # row 4
759
+
760
+ label {
761
+ layout_data(:left, :center, false, false)
762
+ text 'Replace:'
763
+ foreground @default_foreground
651
764
  }
652
- on_key_pressed { |key_event|
653
- if key_event.keyCode == swt(:cr)
654
- if project_dir.selected_child
655
- Command.do(project_dir.selected_child, :replace_next!)
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
656
780
  end
657
- end
781
+ }
782
+ }
783
+ label # filler
784
+ label {
785
+ layout_data(:left, :center, false, false)
786
+ text 'Top Pixel:'
787
+ foreground @default_foreground
788
+ }
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
658
794
  }
659
795
  }
660
- label # filler
661
- label {
662
- layout_data(:left, :center, false, false)
663
- text 'Top Pixel:'
664
- foreground @default_foreground
796
+
797
+ on_item_collapsed {
798
+ collapse_navigation_expand_bar_height
665
799
  }
666
- label(:right) {
667
- layout_data(:fill, :center, true, false)
668
- text bind(project_dir, 'selected_child.top_pixel')
669
- foreground @default_foreground
670
- font stat_font
800
+
801
+ on_item_expanded {
802
+ expand_navigation_expand_bar
671
803
  }
804
+
672
805
  }
673
806
 
674
- on_item_collapsed {
675
- @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
676
- @navigation_expand_item.swt_expand_item.height = 0
677
- async_exec {
678
- body_root.pack_same_size
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
679
813
  }
680
- }
681
-
682
- on_item_expanded {
683
- @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
684
- async_exec {
685
- body_root.pack_same_size
686
- }
687
- }
688
-
689
- }
690
-
691
- @tab_folder_sash_form = sash_form {
692
- layout_data(:fill, :fill, true, true) {
693
- width_hint 768
694
- height_hint 576
695
- minimum_width 768
696
- minimum_height 576
697
- }
698
- sash_width 10
699
- orientation bind(self, :split_orientation)
700
- @current_tab_folder = tab_folder {
701
- drag_source(DND::DROP_COPY) {
702
- transfer [TextTransfer.getInstance].to_java(Transfer)
703
- event_data = nil
704
- on_drag_start {|event|
705
- Gladiator.drag = true
706
- tab_folder = event.widget.getControl
707
- tab_item = tab_folder.getItem(Point.new(event.x, event.y))
708
- event_data = tab_item.getData('file_path')
709
- }
710
- on_drag_set_data { |event|
711
- event.data = event_data
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
+ }
712
828
  }
713
829
  }
830
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
714
831
  }
715
- @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
716
832
  }
717
- }
833
+ } # end of sash form
718
834
  }
719
835
  }
720
836
 
@@ -740,7 +856,7 @@ module Glimmer
740
856
  project_dir.ignore_paths ||= ['packages', 'tmp']
741
857
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
742
858
  open_file_paths2 = @config[:open_file_paths2]
743
- self.split_orientation = swt(@config[:split_orientation] || :horizontal) rescue swt(:horizontal)
859
+ self.split_orientation = (swt(@config[:split_orientation]) rescue swt(:horizontal)) if @config[:split_orientation]
744
860
  if @progress_bar_shell.nil?
745
861
  @progress_bar_shell = shell(body_root, :title) {
746
862
  text 'Gladiator'
@@ -762,53 +878,72 @@ module Glimmer
762
878
  open_file_paths1.to_a.each do |file_path|
763
879
  async_exec {
764
880
  Gladiator.drag = false
881
+ Gladiator.startup = file_path != open_file_paths1.to_a[-1]
765
882
  project_dir.selected_child_path = file_path
766
883
  }
767
884
  end
768
885
  # TODO replace the next line with one that selects the visible tab
769
886
  async_exec {
770
- Gladiator.drag = false
771
- project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path] && open_file_paths1.to_a.include?(@config[:selected_child_path])
772
- project_dir.selected_child&.caret_position = project_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
773
- project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
887
+ # TODO check why this is not working
888
+ if open_file_paths1.to_a.include?(@config[:selected_child_path])
889
+ Gladiator.drag = false
890
+ Gladiator.startup = false
891
+ project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
892
+ project_dir.selected_child&.caret_position = project_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
893
+ project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
894
+ end
774
895
  }
775
896
  async_exec {
776
897
  open_file_paths2.to_a.each do |file_path|
777
898
  async_exec {
778
899
  Gladiator.drag = true
900
+ Gladiator.startup = file_path != open_file_paths2.to_a[-1]
779
901
  project_dir.selected_child_path = file_path
780
902
  }
781
903
  end
782
904
  # TODO replace the next line with one that selects the visible tab
783
905
  async_exec {
784
- Gladiator.drag = true
785
- project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path] && open_file_paths2.to_a.include?(@config[:selected_child_path])
786
- project_dir.selected_child&.caret_position = project_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
787
- project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
906
+ # TODO check why this is not working
907
+ if open_file_paths2.to_a.include?(@config[:selected_child_path])
908
+ Gladiator.drag = true
909
+ Gladiator.startup = false
910
+ project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
911
+ project_dir.selected_child&.caret_position = project_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
912
+ project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
913
+ end
788
914
  }
789
915
  async_exec {
790
916
  Gladiator.drag = false
791
- @progress_bar_shell.close
917
+ @progress_bar_shell&.close
792
918
  @progress_bar_shell = nil
793
919
  @loaded_config = true
794
920
  }
795
921
  }
922
+ async_exec {
923
+ Thread.new {
924
+ all_files = open_file_paths1.to_a + open_file_paths2.to_a
925
+ all_files.each do |file|
926
+ project_dir.find_child_file(file)&.dirty_content
927
+ end
928
+ }
929
+ }
796
930
  else
797
931
  @loaded_config = true
798
932
  end
799
933
  end
800
934
 
801
935
  def save_config
802
- return unless @loaded_config
936
+ return if !@loaded_config || body_root.disposed?
803
937
  child = project_dir.selected_child
804
938
  return if child.nil?
805
939
  tab_folder1 = @tab_folder1 || @current_tab_folder
806
940
  tab_folder2 = @tab_folder2
807
941
  open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
808
942
  open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
943
+ split_orientation_value = split_orientation == swt(:horizontal) ? 'horizontal' : (split_orientation == swt(:vertical) ? 'vertical' : nil)
809
944
  @config = {
810
945
  selected_child_path: child.path,
811
- split_orientation: split_orientation == swt(:horizontal) ? 'horizontal' : 'vertical',
946
+ split_orientation: split_orientation_value,
812
947
  caret_position: child.caret_position,
813
948
  top_pixel: child.top_pixel,
814
949
  shell_width: swt_widget&.getBounds&.width,
@@ -824,23 +959,70 @@ module Glimmer
824
959
  rescue => e
825
960
  puts e.full_message
826
961
  end
962
+
963
+ def navigate_to_next_tab_folder
964
+ if tab_folder2
965
+ self.maximized_pane = false
966
+ if current_tab_folder == tab_folder1
967
+ self.current_tab_folder = tab_folder2
968
+ else
969
+ self.current_tab_folder = tab_folder1
970
+ end
971
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
972
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
973
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
974
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
975
+ end
976
+ end
977
+
978
+ def navigate_to_previous_tab_folder
979
+ if tab_folder2
980
+ self.maximized_pane = false
981
+ if current_tab_folder == tab_folder2
982
+ self.current_tab_folder = tab_folder1
983
+ else
984
+ self.current_tab_folder = tab_folder2
985
+ end
986
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
987
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
988
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
989
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
990
+ end
991
+ end
827
992
 
828
- def close_tab_folder
993
+ def close_all_tabs(closing_tab_folder = nil)
994
+ closing_tab_folder ||= current_tab_folder
995
+ closing_tab_folder.swt_widget.getItems.each do |tab_item|
996
+ project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
997
+ tab_item.getData('proxy')&.dispose
998
+ end
999
+ close_tab_folder(closing_tab_folder)
1000
+ if self.current_tab_item.nil?
1001
+ filter_text.swt_widget.selectAll
1002
+ filter_text.swt_widget.setFocus
1003
+ end
1004
+ end
1005
+
1006
+ def close_tab_folder(closing_tab_folder = nil)
1007
+ closing_tab_folder ||= current_tab_folder
829
1008
  if @tab_folder2 && !selected_tab_item
830
- if @current_tab_folder == @tab_folder2
1009
+ if closing_tab_folder == @tab_folder2
831
1010
  @tab_folder2.swt_widget.dispose
832
- @current_tab_folder = @tab_folder1
1011
+ self.current_tab_folder = @tab_folder1
833
1012
  else
834
1013
  @tab_folder1.swt_widget.dispose
835
- @current_tab_folder = @tab_folder1 = @tab_folder2
1014
+ self.current_tab_folder = self.tab_folder1 = @tab_folder2
836
1015
  end
837
- @tab_folder2 = nil
1016
+ self.tab_folder2 = nil
1017
+ body_root.pack_same_size
838
1018
 
839
- @current_tab_item = @current_tab_folder.swt_widget.getData('selected_tab_item')
1019
+ @current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
840
1020
  @current_text_editor = @current_tab_item.swt_tab_item.getData('text_editor')
841
1021
  project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
842
-
843
- body_root.pack_same_size
1022
+ @current_text_editor&.text_widget&.setFocus
1023
+ async_exec { @current_text_editor&.text_widget&.setFocus }
1024
+ else
1025
+ self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
844
1026
  end
845
1027
  end
846
1028
 
@@ -855,6 +1037,23 @@ module Glimmer
855
1037
  def other_tab_items
856
1038
  @current_tab_folder.swt_widget.getItems.reject { |ti| ti.getData('file_path') == project_dir.selected_child&.path }
857
1039
  end
1040
+
1041
+ def collapse_navigation_expand_bar_height
1042
+ @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
1043
+ @navigation_expand_item.swt_expand_item.height = 0
1044
+ body_root.pack_same_size
1045
+ async_exec {
1046
+ body_root.pack_same_size
1047
+ }
1048
+ end
1049
+
1050
+ def expand_navigation_expand_bar_height
1051
+ @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
1052
+ body_root.pack_same_size
1053
+ async_exec {
1054
+ body_root.pack_same_size
1055
+ }
1056
+ end
858
1057
 
859
1058
  def extract_tree_item_path(tree_item)
860
1059
  return if tree_item.nil?
@@ -948,22 +1147,24 @@ module Glimmer
948
1147
  file = edited_tree_item.getData
949
1148
  file_path = file.path
950
1149
  file.name
951
- if new_file
952
- project_dir.selected_child_path = file_path
953
- else
954
- found_text_editor&.file = file
955
- found_tab_item&.setData('file', file)
956
- found_tab_item&.setData('file_path', file.path)
957
- found_tab_item&.setText(file.name)
958
- body_root.pack_same_size
959
- if current_file
1150
+ if ::File.file?(file_path)
1151
+ if new_file
960
1152
  project_dir.selected_child_path = file_path
961
1153
  else
962
- selected_tab_item&.getData('text_editor')&.text_widget&.setFocus
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
+ }
963
1167
  end
964
- async_exec {
965
- @file_tree.swt_widget.showItem(edited_tree_item)
966
- }
967
1168
  end
968
1169
  project_dir.resume_refresh
969
1170
  },
@@ -981,6 +1182,7 @@ module Glimmer
981
1182
 
982
1183
  def open_project
983
1184
  selected_directory = directory_dialog.open
1185
+ return if selected_directory.nil?
984
1186
  @progress_bar_shell = shell(body_root, :title) {
985
1187
  text 'Gladiator'
986
1188
  fill_layout(:vertical) {
@@ -1007,30 +1209,57 @@ module Glimmer
1007
1209
  }
1008
1210
  end
1009
1211
 
1212
+ def display_about_dialog
1213
+ dialog {
1214
+ grid_layout(2, false) {
1215
+ margin_width 15
1216
+ margin_height 15
1217
+ }
1218
+
1219
+ background :white
1220
+ image ICON
1221
+ text 'About'
1222
+
1223
+ label {
1224
+ layout_data :center, :center, false, false
1225
+ background :white
1226
+ image ICON, height: 260
1227
+ }
1228
+ label {
1229
+ layout_data :fill, :fill, true, true
1230
+ background :white
1231
+ text "Gladiator v#{VERSION}\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
1232
+ }
1233
+ }.open
1234
+ end
1235
+
1010
1236
  def handle_display_shortcut(key_event)
1011
1237
  if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'f'
1012
- if current_text_editor&.text_widget&.getSelectionText && current_text_editor&.text_widget&.getSelectionText&.size.to_i > 0
1013
- find_text.swt_widget.setText current_text_editor.text_widget.getSelectionText
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
1248
+ @navigation_expand_item.swt_expand_item.set_expanded true
1249
+ async_exec {
1250
+ body_root.pack_same_size
1251
+ find_action.call
1252
+ }
1014
1253
  end
1015
- find_text.swt_widget.selectAll
1016
- find_text.swt_widget.setFocus
1017
1254
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
1018
1255
  Clipboard.copy(project_dir.selected_child.path)
1019
1256
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
1020
1257
  project_dir.selected_child.find_previous
1021
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'p'
1022
- open_project
1023
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 's'
1024
- project_dir.selected_child_path = '' # scratchpad
1258
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
1259
+ self.maximized_pane = false
1260
+ self.split_orientation = split_pane? && split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
1025
1261
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'w'
1026
- current_tab_folder.swt_widget.getItems.each do |tab_item|
1027
- project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
1028
- tab_item.getData('proxy')&.dispose
1029
- end
1030
- close_tab_folder
1031
- self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
1032
- filter_text.swt_widget.selectAll
1033
- filter_text.swt_widget.setFocus
1262
+ close_all_tabs
1034
1263
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :alt) && extract_char(key_event) == 'w'
1035
1264
  other_tab_items.each do |tab_item|
1036
1265
  project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
@@ -1049,8 +1278,6 @@ module Glimmer
1049
1278
  current_text_editor&.text_widget&.setFocus
1050
1279
  end
1051
1280
  end
1052
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
1053
- self.split_orientation = split_pane? && split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
1054
1281
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
1055
1282
  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
1056
1283
  current_text_editor&.text_widget&.setFocus
@@ -1058,27 +1285,9 @@ module Glimmer
1058
1285
  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
1059
1286
  current_text_editor&.text_widget&.setFocus
1060
1287
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == ']'
1061
- if tab_folder2
1062
- if current_tab_folder == tab_folder1
1063
- self.current_tab_folder = tab_folder2
1064
- else
1065
- self.current_tab_folder = tab_folder1
1066
- end
1067
- self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
1068
- self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
1069
- current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
1070
- end
1288
+ navigate_to_next_tab_folder
1071
1289
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == '['
1072
- if tab_folder2
1073
- if current_tab_folder == tab_folder2
1074
- self.current_tab_folder = tab_folder1
1075
- else
1076
- self.current_tab_folder = tab_folder2
1077
- end
1078
- self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
1079
- self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
1080
- current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
1081
- end
1290
+ navigate_to_previous_tab_folder
1082
1291
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
1083
1292
  current_tab_folder.swt_widget.setSelection(0) if current_tab_folder.swt_widget.getItemCount >= 1
1084
1293
  current_text_editor&.text_widget&.setFocus
@@ -1109,12 +1318,36 @@ module Glimmer
1109
1318
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'g'
1110
1319
  project_dir.selected_child.find_next
1111
1320
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'l'
1112
- line_number_text.swt_widget.selectAll
1113
- line_number_text.swt_widget.setFocus
1321
+ unless @navigation_expand_item.swt_expand_item.get_expanded
1322
+ @navigation_expand_item.swt_expand_item.set_expanded true
1323
+ @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
1324
+ async_exec {
1325
+ body_root.pack_same_size
1326
+ }
1327
+ async_exec {
1328
+ line_number_text.swt_widget.selectAll
1329
+ line_number_text.swt_widget.setFocus
1330
+ }
1331
+ else
1332
+ line_number_text.swt_widget.selectAll
1333
+ line_number_text.swt_widget.setFocus
1334
+ end
1114
1335
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'r'
1336
+ self.maximized_editor = false
1337
+ unless @file_lookup_expand_item.swt_expand_item.get_expanded
1338
+ @file_lookup_expand_item.swt_expand_item.set_expanded true
1339
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
1340
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
1341
+ end
1115
1342
  filter_text.swt_widget.selectAll
1116
1343
  filter_text.swt_widget.setFocus
1117
1344
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 't'
1345
+ self.maximized_editor = false
1346
+ unless @file_explorer_expand_item.swt_expand_item.get_expanded
1347
+ @file_explorer_expand_item.swt_expand_item.set_expanded true
1348
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
1349
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
1350
+ end
1118
1351
  select_tree_item unless rename_in_progress
1119
1352
  file_tree.swt_widget.setFocus
1120
1353
  elsif key_event.keyCode == swt(:esc)
@@ -1125,4 +1358,4 @@ module Glimmer
1125
1358
  end
1126
1359
  end
1127
1360
  end
1128
- end
1361
+ end