glimmer-cs-gladiator 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,7 +23,7 @@ module Glimmer
23
23
  attr_accessor :drag_and_drop
24
24
  attr_accessor :drag
25
25
  end
26
-
26
+
27
27
  ## Add options like the following to configure CustomShell by outside consumers
28
28
  #
29
29
  # options :title, :background_color
@@ -35,16 +35,33 @@ module Glimmer
35
35
  @project_dir ||= Dir.new(project_dir_path)
36
36
  end
37
37
 
38
- attr_reader :find_text, :tab_folder1, :tab_folder2, :filter_text, :rename_in_progress, :line_number_text, :file_tree
39
- attr_accessor :split_orientation, :current_tab_item, :current_tab_folder, :current_text_editor
38
+ def split_orientation=(value)
39
+ @split_orientation = value
40
+ save_config
41
+ if @loaded_config && !split_pane?
42
+ Gladiator.drag = true
43
+ child_path = project_dir.selected_child_path
44
+ project_dir.selected_child = nil
45
+ project_dir.selected_child_path = child_path
46
+ Gladiator.drag = false
47
+ end
48
+ @split_orientation
49
+ end
50
+
51
+ def split_pane?
52
+ pane_count = @tab_folder_sash_form&.children&.size
53
+ pane_count && pane_count > 1
54
+ 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
40
58
 
41
59
  ## Uncomment before_body block to pre-initialize variables to use in body
42
60
  #
43
61
  #
44
62
  before_body {
45
- Thread.new {
46
- project_dir #pre-initialize directory
47
- }
63
+ # TODO consider doing loading project files after displaying the GUI instead of holding it up before
64
+ project_dir #pre-initialize directory
48
65
  at_exit do
49
66
  project_dir.selected_child&.write_raw_dirty_content
50
67
  end
@@ -59,6 +76,7 @@ module Glimmer
59
76
  }
60
77
  end
61
78
 
79
+ @default_foreground = :dark_blue
62
80
  @split_orientation = swt(:horizontal)
63
81
  @config_file_path = ::File.join(project_dir.path, '.gladiator')
64
82
  @config = {}
@@ -92,7 +110,10 @@ module Glimmer
92
110
  @current_tab_folder.content {
93
111
  @current_tab_item = tab_item { |the_tab_item|
94
112
  text selected_file.name
95
- fill_layout :horizontal
113
+ fill_layout(:horizontal) {
114
+ margin_width 0
115
+ margin_height 0
116
+ }
96
117
  @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file)
97
118
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
98
119
  @current_text_editor.text_proxy.content {
@@ -117,6 +138,9 @@ module Glimmer
117
138
  @current_text_editor&.text_widget&.setFocus
118
139
  }
119
140
  }
141
+ on_widget_disposed {
142
+ the_tab_item.swt_tab_item.get_data('file').close
143
+ }
120
144
  }
121
145
  @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
122
146
  @current_tab_item.swt_tab_item.setData('file', selected_file)
@@ -146,10 +170,12 @@ module Glimmer
146
170
  #
147
171
  body {
148
172
  shell {
173
+ grid_layout(2, false)
174
+
149
175
  text "Gladiator - #{::File.expand_path(project_dir.path)}"
150
176
  minimum_size 520, 250
151
177
  size 1440, 900
152
- grid_layout(2, false)
178
+
153
179
  on_swt_show {
154
180
  swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
155
181
  swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
@@ -181,7 +207,7 @@ module Glimmer
181
207
  begin
182
208
  project_dir.selected_child_path = ''
183
209
  rescue => e
184
- pd e
210
+ puts e.full_message
185
211
  end
186
212
  }
187
213
  }
@@ -199,11 +225,15 @@ module Glimmer
199
225
  text '&Split'
200
226
  menu_item(:radio) {
201
227
  text '&Horizontal'
202
- selection bind(self, :split_orientation, on_read: ->(o) { o == swt(:horizontal)}, on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical)})
228
+ selection bind(self, :split_orientation,
229
+ on_read: ->(o) { split_pane? && o == swt(:horizontal)},
230
+ on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical) })
203
231
  }
204
232
  menu_item(:radio) {
205
233
  text '&Vertical'
206
- selection bind(self, :split_orientation, on_read: ->(o) { o == swt(:vertical)}, on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal)})
234
+ selection bind(self, :split_orientation,
235
+ on_read: ->(o) { split_pane? && o == swt(:vertical)},
236
+ on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal) })
207
237
  }
208
238
  }
209
239
  }
@@ -232,126 +262,215 @@ module Glimmer
232
262
  }
233
263
 
234
264
  composite {
235
- grid_layout 1, false
265
+ grid_layout(1, false) {
266
+ margin_width 0
267
+ margin_height 0
268
+ }
269
+
236
270
  layout_data(:fill, :fill, false, true) {
237
271
  width_hint 300
238
272
  }
239
- @filter_text = text {
240
- layout_data :fill, :center, true, false
241
- text bind(project_dir, 'filter')
242
- on_key_pressed { |key_event|
243
- if key_event.keyCode == swt(:tab) ||
244
- key_event.keyCode == swt(:cr) ||
245
- key_event.keyCode == swt(:arrow_up) ||
246
- key_event.keyCode == swt(:arrow_down)
247
- @list.swt_widget.select(0) if @list.swt_widget.getSelectionIndex() == -1
248
- @list.swt_widget.setFocus
249
- end
250
- }
251
- }
252
- composite {
253
- fill_layout(:vertical) {
254
- spacing 5
255
- }
273
+ @side_bar_sash_form = sash_form(:vertical) {
256
274
  layout_data(:fill, :fill, true, true)
257
- @list = list(:border, :h_scroll, :v_scroll) {
258
- #visible bind(self, 'project_dir.filter') {|f| !!f}
259
- selection bind(project_dir, :filtered_path)
260
- on_mouse_up {
261
- project_dir.selected_child_path = @list.swt_widget.getSelection.first
262
- }
263
- on_key_pressed { |key_event|
264
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
265
- project_dir.selected_child_path = @list.swt_widget.getSelection.first
266
- @current_text_editor&.text_widget&.setFocus
267
- end
268
- }
269
- drag_source(DND::DROP_COPY) {
270
- transfer [TextTransfer.getInstance].to_java(Transfer)
271
- on_drag_set_data { |event|
272
- Gladiator.drag = true
273
- list = event.widget.getControl
274
- event.data = list.getSelection.first
275
- }
276
- }
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
277
280
  }
278
- @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
279
- #visible bind(self, 'project_dir.filter') {|f| !f}
280
- items bind(self, :project_dir), tree_properties(children: :children, text: :name)
281
- drag_source(DND::DROP_COPY) {
282
- transfer [TextTransfer.getInstance].to_java(Transfer)
283
- on_drag_set_data { |event|
284
- Gladiator.drag = true
285
- tree = event.widget.getControl
286
- tree_item = tree.getSelection.first
287
- event.data = tree_item.getData.path
288
- }
289
- }
290
- menu {
291
- @open_menu_item = menu_item {
292
- text 'Open'
293
- on_widget_selected {
294
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
281
+
282
+ @file_lookup_expand_bar = expand_bar {
283
+ layout_data :fill, :fill, true, true
284
+ font height: 17, style: :bold
285
+ foreground @default_foreground
286
+
287
+ on_swt_show {
288
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
289
+ }
290
+
291
+ on_swt_Resize(&resize_expand_items)
292
+
293
+ @file_lookup_expand_item = expand_item {
294
+ grid_layout {
295
+ margin_width 0
296
+ margin_height 0
297
+ }
298
+ text 'File Lookup'
299
+ height display.bounds.height
300
+
301
+ @filter_text = text {
302
+ layout_data :fill, :center, true, false
303
+ text bind(project_dir, 'filter')
304
+ on_key_pressed { |key_event|
305
+ if key_event.keyCode == swt(:tab) ||
306
+ key_event.keyCode == swt(:cr) ||
307
+ key_event.keyCode == swt(:arrow_up) ||
308
+ key_event.keyCode == swt(:arrow_down)
309
+ @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
310
+ @file_lookup_list.swt_widget.setFocus
311
+ end
295
312
  }
296
313
  }
297
- menu_item(:separator)
298
- menu_item {
299
- text 'Delete'
300
- on_widget_selected {
301
- tree_item = @file_tree.swt_widget.getSelection.first
302
- delete_tree_item(tree_item)
314
+
315
+ @file_lookup_list = list(:border, :h_scroll, :v_scroll) {
316
+ layout_data :fill, :fill, true, true
317
+ #visible bind(self, 'project_dir.filter') {|f| !!f}
318
+ selection bind(project_dir, :filtered_path)
319
+ foreground @default_foreground
320
+ on_mouse_up {
321
+ project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
303
322
  }
304
- }
305
- menu_item {
306
- text 'Refresh'
307
- on_widget_selected {
308
- project_dir.refresh
323
+ on_key_pressed { |key_event|
324
+ if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
325
+ project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
326
+ @current_text_editor&.text_widget&.setFocus
327
+ end
309
328
  }
310
- }
311
- menu_item {
312
- text 'Rename'
313
- on_widget_selected {
314
- rename_selected_tree_item
329
+ drag_source(DND::DROP_COPY) {
330
+ transfer [TextTransfer.getInstance].to_java(Transfer)
331
+ on_drag_set_data { |event|
332
+ Gladiator.drag = true
333
+ list = event.widget.getControl
334
+ event.data = list.getSelection.first
335
+ }
315
336
  }
316
337
  }
317
- menu_item {
318
- text 'New Directory'
319
- on_widget_selected {
320
- add_new_directory_to_selected_tree_item
338
+ }
339
+
340
+ on_item_collapsed { |event|
341
+ if @file_explorer_expand_item.swt_expand_item.get_expanded
342
+ @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
343
+ @file_lookup_expand_item.swt_expand_item.height = 0
344
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
345
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
346
+ @side_bar_sash_form.weights = [@file_lookup_expand_item.swt_expand_item.header_height, @file_lookup_expand_bar_height + @file_explorer_expand_bar_height - @file_lookup_expand_item.swt_expand_item.header_height]
347
+ end
348
+ }
349
+
350
+ on_item_expanded {
351
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
352
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
353
+ }
354
+
355
+ }
356
+
357
+ @file_explorer_expand_bar = expand_bar {
358
+ layout_data :fill, :fill, true, true
359
+ font height: 17, style: :bold
360
+ foreground @default_foreground
361
+
362
+ on_swt_show {
363
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
364
+ }
365
+
366
+ on_swt_Resize(&resize_expand_items)
367
+
368
+ @file_explorer_expand_item = expand_item {
369
+ grid_layout {
370
+ margin_width 0
371
+ margin_height 0
372
+ }
373
+ text 'File Explorer'
374
+ height display.bounds.height
375
+
376
+ @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
377
+ layout_data :fill, :fill, true, true
378
+ #visible bind(self, 'project_dir.filter') {|f| !f}
379
+ items bind(self, :project_dir), tree_properties(children: :children, text: :name)
380
+ foreground @default_foreground
381
+ drag_source(DND::DROP_COPY) {
382
+ transfer [TextTransfer.getInstance].to_java(Transfer)
383
+ on_drag_set_data { |event|
384
+ Gladiator.drag = true
385
+ tree = event.widget.getControl
386
+ tree_item = tree.getSelection.first
387
+ event.data = tree_item.getData.path
388
+ }
321
389
  }
322
- }
323
- menu_item {
324
- text 'New File'
325
- on_widget_selected {
326
- add_new_file_to_selected_tree_item
390
+ menu {
391
+ @open_menu_item = menu_item {
392
+ text 'Open'
393
+ on_widget_selected {
394
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
395
+ }
396
+ }
397
+ menu_item(:separator)
398
+ menu_item {
399
+ text 'Delete'
400
+ on_widget_selected {
401
+ tree_item = @file_tree.swt_widget.getSelection.first
402
+ delete_tree_item(tree_item)
403
+ }
404
+ }
405
+ menu_item {
406
+ text 'Refresh'
407
+ on_widget_selected {
408
+ project_dir.refresh
409
+ }
410
+ }
411
+ menu_item {
412
+ text 'Rename'
413
+ on_widget_selected {
414
+ rename_selected_tree_item
415
+ }
416
+ }
417
+ menu_item {
418
+ text 'New Directory'
419
+ on_widget_selected {
420
+ add_new_directory_to_selected_tree_item
421
+ }
422
+ }
423
+ menu_item {
424
+ text 'New File'
425
+ on_widget_selected {
426
+ add_new_file_to_selected_tree_item
427
+ }
428
+ }
429
+ }
430
+ on_swt_menudetect { |event|
431
+ path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
432
+ @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
433
+ }
434
+ on_mouse_up {
435
+ if Gladiator.drag_and_drop
436
+ Gladiator.drag_and_drop = false
437
+ else
438
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
439
+ @current_text_editor&.text_widget&.setFocus
440
+ end
441
+ }
442
+ on_key_pressed { |key_event|
443
+ if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
444
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
445
+ @current_text_editor&.text_widget&.setFocus
446
+ end
447
+ }
448
+ on_paint_control {
449
+ root_item = @file_tree.swt_widget.getItems.first
450
+ if root_item && !root_item.getExpanded
451
+ root_item.setExpanded(true)
452
+ end
327
453
  }
328
454
  }
329
455
  }
330
- on_swt_menudetect { |event|
331
- path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
332
- @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
333
- }
334
- on_mouse_up {
335
- if Gladiator.drag_and_drop
336
- Gladiator.drag_and_drop = false
337
- else
338
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
339
- @current_text_editor&.text_widget&.setFocus
456
+
457
+ on_item_collapsed { |event|
458
+ if @file_lookup_expand_item.swt_expand_item.get_expanded
459
+ @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
460
+ @file_explorer_expand_item.swt_expand_item.height = 0
461
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
462
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
463
+ @side_bar_sash_form.weights = [@file_explorer_expand_bar_height + @file_explorer_expand_bar_height - @file_explorer_expand_item.swt_expand_item.header_height, @file_explorer_expand_item.swt_expand_item.header_height]
340
464
  end
341
- }
342
- on_key_pressed { |key_event|
343
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
344
- project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
345
- @current_text_editor&.text_widget&.setFocus
346
- end
347
- }
348
- on_paint_control {
349
- root_item = @file_tree.swt_widget.getItems.first
350
- if root_item && !root_item.getExpanded
351
- root_item.setExpanded(true)
352
- end
353
- }
354
- }
465
+ }
466
+
467
+ on_item_expanded {
468
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
469
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
470
+ }
471
+
472
+ }
473
+
355
474
  }
356
475
 
357
476
  # TODO see if you could replace some of this with Glimmer DSL/API syntax
@@ -361,117 +480,220 @@ module Glimmer
361
480
  @file_tree_editor.minimumHeight = 20;
362
481
 
363
482
  }
364
- @editor_container = composite {
365
- grid_layout 1, false
483
+
484
+ composite {
485
+ grid_layout(1, false) {
486
+ margin_width 0
487
+ margin_height 0
488
+ }
366
489
  layout_data :fill, :fill, true, true
367
- composite {
368
- grid_layout 3, false
369
-
370
- # row 1
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
371
499
 
372
- label {
373
- text 'File:'
374
- }
375
-
376
- @file_path_label = styled_text(:none) {
377
- layout_data(:fill, :fill, true, false) {
378
- horizontal_span 2
500
+ grid_layout(5, false) {
501
+ margin_right 5
379
502
  }
380
- background color(:widget_background)
381
- editable false
382
- caret nil
383
- text bind(project_dir, 'selected_child.path')
384
- on_mouse_up {
385
- @file_path_label.swt_widget.selectAll
503
+
504
+ stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
505
+
506
+ # row 1
507
+
508
+ label {
509
+ layout_data(:left, :center, false, false)
510
+ text 'File:'
511
+ foreground @default_foreground
386
512
  }
387
- on_focus_lost {
388
- @file_path_label.swt_widget.setSelection(0, 0)
513
+
514
+ @file_path_label = styled_text(:none) {
515
+ layout_data(:fill, :center, true, false) {
516
+ horizontal_span 2
517
+ }
518
+ background color(:widget_background)
519
+ foreground @default_foreground
520
+ editable false
521
+ caret nil
522
+ text bind(project_dir, 'selected_child.path')
523
+ on_mouse_up {
524
+ @file_path_label.swt_widget.selectAll
525
+ }
526
+ on_focus_lost {
527
+ @file_path_label.swt_widget.setSelection(0, 0)
528
+ }
389
529
  }
390
- }
391
-
392
- # row 2
393
-
394
- label {
395
- text 'Line:'
396
- }
397
- @line_number_text = text {
398
- layout_data(:fill, :fill, true, false) {
399
- minimum_width 400
530
+
531
+ label {
532
+ layout_data(:left, :center, false, false)
533
+ text 'Caret Position:'
534
+ foreground @default_foreground
400
535
  }
401
- text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
402
- on_key_pressed { |key_event|
403
- if key_event.keyCode == swt(:cr)
404
- @current_text_editor&.text_widget&.setFocus
405
- end
536
+ label(:right) {
537
+ layout_data(:fill, :center, true, false)
538
+ text bind(project_dir, 'selected_child.caret_position')
539
+ foreground @default_foreground
540
+ font stat_font
406
541
  }
407
- on_verify_text { |event|
408
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
542
+
543
+ # row 2
544
+
545
+ label {
546
+ layout_data(:left, :center, false, false)
547
+ text 'Line:'
548
+ foreground @default_foreground
409
549
  }
410
- }
411
- label
412
-
413
- # row 3
414
-
415
- label {
416
- text 'Find:'
417
- }
418
- @find_text = text {
419
- layout_data(:fill, :center, true, false) {
420
- minimum_width 400
550
+ @line_number_text = text {
551
+ layout_data(:fill, :center, true, false) {
552
+ minimum_width 400
553
+ }
554
+ text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
555
+ foreground @default_foreground
556
+ font stat_font
557
+ on_key_pressed { |key_event|
558
+ if key_event.keyCode == swt(:cr)
559
+ @current_text_editor&.text_widget&.setFocus
560
+ end
561
+ }
562
+ on_verify_text { |event|
563
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
564
+ }
421
565
  }
422
- text bind(project_dir, 'selected_child.find_text')
423
- on_key_pressed { |key_event|
424
- if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
425
- project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
426
- project_dir.selected_child&.find_next
427
- end
428
- if key_event.keyCode == swt(:cr)
429
- project_dir.selected_child&.find_next
430
- end
566
+ label # filler
567
+
568
+ label {
569
+ layout_data(:left, :center, false, false)
570
+ text 'Line Position:'
571
+ foreground @default_foreground
431
572
  }
432
- }
433
- composite {
434
- row_layout
435
- button(:check) {
436
- selection bind(project_dir, 'selected_child.case_sensitive')
573
+ label(:right) {
574
+ layout_data(:fill, :center, true, false)
575
+ text bind(project_dir, 'selected_child.line_position')
576
+ foreground @default_foreground
577
+ font stat_font
578
+ }
579
+
580
+ # row 3
581
+
582
+ label {
583
+ layout_data(:left, :center, false, false)
584
+ text 'Find:'
585
+ foreground @default_foreground
586
+ }
587
+ @find_text = text {
588
+ layout_data(:fill, :center, true, false) {
589
+ minimum_width 400
590
+ }
591
+ text bind(project_dir, 'selected_child.find_text')
592
+ foreground @default_foreground
593
+ font stat_font
437
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
438
599
  if key_event.keyCode == swt(:cr)
439
600
  project_dir.selected_child&.find_next
440
601
  end
441
602
  }
442
603
  }
604
+ composite {
605
+ layout_data(:left, :center, true, false)
606
+ row_layout {
607
+ margin_width 0
608
+ margin_height 0
609
+ }
610
+ button(:check) {
611
+ selection bind(project_dir, 'selected_child.case_sensitive')
612
+ on_key_pressed { |key_event|
613
+ if key_event.keyCode == swt(:cr)
614
+ project_dir.selected_child&.find_next
615
+ end
616
+ }
617
+ }
618
+ label {
619
+ text 'Case-sensitive'
620
+ }
621
+ }
622
+
443
623
  label {
444
- text 'Case-sensitive'
624
+ layout_data(:left, :center, false, false)
625
+ text 'Selection Count:'
626
+ foreground @default_foreground
445
627
  }
446
- }
447
-
448
- # row 4
449
-
450
- label {
451
- text 'Replace:'
452
- }
453
- @replace_text = text {
454
- layout_data(:fill, :fill, true, false) {
455
- minimum_width 300
628
+ label(:right) {
629
+ layout_data(:fill, :center, true, false)
630
+ text bind(project_dir, 'selected_child.selection_count')
631
+ foreground @default_foreground
632
+ font stat_font
456
633
  }
457
- text bind(project_dir, 'selected_child.replace_text')
458
- on_focus_gained {
459
- project_dir.selected_child&.ensure_find_next
634
+
635
+ # row 4
636
+
637
+ label {
638
+ layout_data(:left, :center, false, false)
639
+ text 'Replace:'
640
+ foreground @default_foreground
460
641
  }
461
- on_key_pressed { |key_event|
462
- if key_event.keyCode == swt(:cr)
463
- if project_dir.selected_child
464
- Command.do(project_dir.selected_child, :replace_next!)
642
+ @replace_text = text {
643
+ layout_data(:fill, :center, true, false) {
644
+ minimum_width 400
645
+ }
646
+ text bind(project_dir, 'selected_child.replace_text')
647
+ foreground @default_foreground
648
+ font stat_font
649
+ on_focus_gained {
650
+ project_dir.selected_child&.ensure_find_next
651
+ }
652
+ on_key_pressed { |key_event|
653
+ if key_event.keyCode == swt(:cr)
654
+ if project_dir.selected_child
655
+ Command.do(project_dir.selected_child, :replace_next!)
656
+ end
465
657
  end
466
- end
658
+ }
659
+ }
660
+ label # filler
661
+ label {
662
+ layout_data(:left, :center, false, false)
663
+ text 'Top Pixel:'
664
+ foreground @default_foreground
665
+ }
666
+ label(:right) {
667
+ layout_data(:fill, :center, true, false)
668
+ text bind(project_dir, 'selected_child.top_pixel')
669
+ foreground @default_foreground
670
+ font stat_font
467
671
  }
468
672
  }
469
- label
673
+
674
+ on_item_collapsed {
675
+ @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
676
+ @navigation_expand_item.swt_expand_item.height = 0
677
+ async_exec {
678
+ body_root.pack_same_size
679
+ }
680
+ }
681
+
682
+ on_item_expanded {
683
+ @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
684
+ async_exec {
685
+ body_root.pack_same_size
686
+ }
687
+ }
688
+
470
689
  }
690
+
471
691
  @tab_folder_sash_form = sash_form {
472
692
  layout_data(:fill, :fill, true, true) {
473
- width_hint 640
474
- height_hint 480
693
+ width_hint 768
694
+ height_hint 576
695
+ minimum_width 768
696
+ minimum_height 576
475
697
  }
476
698
  sash_width 10
477
699
  orientation bind(self, :split_orientation)
@@ -518,20 +740,59 @@ module Glimmer
518
740
  project_dir.ignore_paths ||= ['packages', 'tmp']
519
741
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
520
742
  open_file_paths2 = @config[:open_file_paths2]
521
- open_file_paths1.to_a.each do |file_path|
522
- project_dir.selected_child_path = file_path
743
+ self.split_orientation = swt(@config[:split_orientation] || :horizontal) rescue swt(:horizontal)
744
+ if @progress_bar_shell.nil?
745
+ @progress_bar_shell = shell(body_root, :title) {
746
+ text 'Gladiator'
747
+ fill_layout(:vertical) {
748
+ margin_width 15
749
+ margin_height 15
750
+ spacing 5
751
+ }
752
+ label(:center) {
753
+ text "Opening Last Open Files"
754
+ font height: 20
755
+ }
756
+ # @progress_bar = progress_bar(:horizontal, :indeterminate)
757
+ }
758
+ async_exec {
759
+ @progress_bar_shell.open
760
+ }
523
761
  end
524
- # TODO replace the next line with one that selects the visible tab
525
- project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path] && open_file_paths1.to_a.include?(@config[:selected_child_path])
526
- Gladiator.drag = true
527
- open_file_paths2.to_a.each do |file_path|
528
- project_dir.selected_child_path = file_path
762
+ open_file_paths1.to_a.each do |file_path|
763
+ async_exec {
764
+ Gladiator.drag = false
765
+ project_dir.selected_child_path = file_path
766
+ }
529
767
  end
530
768
  # TODO replace the next line with one that selects the visible tab
531
- project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path] && open_file_paths2.to_a.include?(@config[:selected_child_path])
532
- Gladiator.drag = false
533
- 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]
534
- project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
769
+ 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]
774
+ }
775
+ async_exec {
776
+ open_file_paths2.to_a.each do |file_path|
777
+ async_exec {
778
+ Gladiator.drag = true
779
+ project_dir.selected_child_path = file_path
780
+ }
781
+ end
782
+ # TODO replace the next line with one that selects the visible tab
783
+ 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]
788
+ }
789
+ async_exec {
790
+ Gladiator.drag = false
791
+ @progress_bar_shell.close
792
+ @progress_bar_shell = nil
793
+ @loaded_config = true
794
+ }
795
+ }
535
796
  else
536
797
  @loaded_config = true
537
798
  end
@@ -547,6 +808,7 @@ module Glimmer
547
808
  open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
548
809
  @config = {
549
810
  selected_child_path: child.path,
811
+ split_orientation: split_orientation == swt(:horizontal) ? 'horizontal' : 'vertical',
550
812
  caret_position: child.caret_position,
551
813
  top_pixel: child.top_pixel,
552
814
  shell_width: swt_widget&.getBounds&.width,
@@ -582,8 +844,12 @@ module Glimmer
582
844
  end
583
845
  end
584
846
 
847
+ def find_tab_item(file_path)
848
+ @current_tab_folder.swt_widget.getItems.detect { |ti| ti.getData('file_path') == file_path }
849
+ end
850
+
585
851
  def selected_tab_item
586
- @current_tab_folder.swt_widget.getItems.detect { |ti| ti.getData('file_path') == project_dir.selected_child&.path }
852
+ find_tab_item(project_dir.selected_child&.path)
587
853
  end
588
854
 
589
855
  def other_tab_items
@@ -609,25 +875,28 @@ module Glimmer
609
875
  return if tree_item.nil?
610
876
  file = tree_item.getData
611
877
  parent_path = ::File.dirname(file.path)
878
+ if file.is_a?(Gladiator::Dir)
879
+ file_paths = file.all_children.select {|f| f.is_a?(Gladiator::File)}.map(&:path)
880
+ file.remove_all_observers
881
+ else
882
+ file_paths = [file.path]
883
+ end
884
+ file_paths.each do |file_path|
885
+ found_tab_item = find_tab_item(file_path)
886
+ if found_tab_item
887
+ project_dir.selected_child_path_history.delete(found_tab_item.getData('file_path'))
888
+ found_tab_item.getData('proxy')&.dispose
889
+ end
890
+ end
612
891
  file.delete! # TODO consider supporting command undo/redo
613
892
  project_dir.refresh(async: false)
614
893
  parent_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == parent_path}.first
615
894
  @file_tree.swt_widget.showItem(parent_tree_item)
616
895
  parent_tree_item.setExpanded(true)
617
- # TODO close text editor tab
618
- # if file.is_a?(::File)
619
- # close tab
620
- # end
621
896
  rescue => e
622
897
  puts e.full_message
623
898
  end
624
899
 
625
- def rename_selected_tree_item
626
- project_dir.pause_refresh
627
- tree_item = @file_tree.swt_widget.getSelection.first
628
- rename_tree_item(tree_item)
629
- end
630
-
631
900
  def add_new_directory_to_selected_tree_item
632
901
  project_dir.pause_refresh
633
902
  tree_item = @file_tree.swt_widget.getSelection.first
@@ -642,7 +911,7 @@ module Glimmer
642
911
  project_dir.refresh(async: false, force: true)
643
912
  new_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == new_directory_path}.first
644
913
  @file_tree.swt_widget.showItem(new_tree_item)
645
- rename_tree_item(new_tree_item, true)
914
+ rename_tree_item(new_tree_item)
646
915
  end
647
916
 
648
917
  def add_new_file_to_selected_tree_item
@@ -662,14 +931,40 @@ module Glimmer
662
931
  rename_tree_item(new_tree_item, true)
663
932
  end
664
933
 
665
- def rename_tree_item(tree_item, open_afterwards = false)
934
+ def rename_selected_tree_item
935
+ project_dir.pause_refresh
936
+ tree_item = @file_tree.swt_widget.getSelection.first
937
+ rename_tree_item(tree_item)
938
+ end
939
+
940
+ def rename_tree_item(tree_item, new_file = false)
941
+ original_file = tree_item.getData
942
+ current_file = project_dir.selected_child_path == original_file.path
943
+ found_tab_item = find_tab_item(original_file.path)
944
+ found_text_editor = found_tab_item&.getData('text_editor')
666
945
  @file_tree.edit_tree_item(
667
946
  tree_item,
668
947
  after_write: -> (edited_tree_item) {
669
948
  file = edited_tree_item.getData
670
949
  file_path = file.path
671
- # TODO rename file in tab title
672
- project_dir.selected_child_path = file_path if open_afterwards
950
+ 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
960
+ project_dir.selected_child_path = file_path
961
+ else
962
+ selected_tab_item&.getData('text_editor')&.text_widget&.setFocus
963
+ end
964
+ async_exec {
965
+ @file_tree.swt_widget.showItem(edited_tree_item)
966
+ }
967
+ end
673
968
  project_dir.resume_refresh
674
969
  },
675
970
  after_cancel: -> {
@@ -686,8 +981,8 @@ module Glimmer
686
981
 
687
982
  def open_project
688
983
  selected_directory = directory_dialog.open
689
- @progress_bar_shell = shell(body_root) {
690
- text 'Opening Project'
984
+ @progress_bar_shell = shell(body_root, :title) {
985
+ text 'Gladiator'
691
986
  fill_layout(:vertical) {
692
987
  margin_width 15
693
988
  margin_height 15
@@ -699,19 +994,16 @@ module Glimmer
699
994
  }
700
995
  # @progress_bar = progress_bar(:horizontal, :indeterminate)
701
996
  }
702
- Thread.new {
703
- async_exec {
704
- @progress_bar_shell.open
705
- }
997
+ async_exec {
998
+ @progress_bar_shell.open
706
999
  }
707
- Thread.new {
708
- async_exec {
709
- gladiator(project_dir_path: selected_directory) {
710
- on_swt_show {
711
- @progress_bar_shell.close
712
- }
713
- }.open if selected_directory
714
- }
1000
+ async_exec {
1001
+ gladiator(project_dir_path: selected_directory) {
1002
+ on_swt_show {
1003
+ @progress_bar_shell.close
1004
+ @progress_bar_shell = nil
1005
+ }
1006
+ }.open if selected_directory
715
1007
  }
716
1008
  end
717
1009
 
@@ -758,7 +1050,7 @@ module Glimmer
758
1050
  end
759
1051
  end
760
1052
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
761
- self.split_orientation = split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
1053
+ self.split_orientation = split_pane? && split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
762
1054
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
763
1055
  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
764
1056
  current_text_editor&.text_widget&.setFocus
@@ -833,4 +1125,4 @@ module Glimmer
833
1125
  end
834
1126
  end
835
1127
  end
836
- end
1128
+ end