glimmer-cs-gladiator 0.7.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -1,5 +1,6 @@
1
1
  $LOAD_PATH.unshift(File.expand_path('..', __FILE__))
2
2
 
3
+ require 'glimmer-dsl-swt'
3
4
  require 'filewatcher'
4
5
  require 'clipboard'
5
6
  require 'puts_debuggerer'
@@ -0,0 +1,6 @@
1
+ require_relative '../glimmer-cs-gladiator'
2
+
3
+ include Glimmer
4
+
5
+ local_dir = ENV['LOCAL_DIR'] || '.'
6
+ gladiator(project_dir_path: local_dir).open
@@ -23,7 +23,7 @@ module Glimmer
23
23
  command_history_for(file).last.next_command = command
24
24
  end
25
25
  command.do
26
- command_history_for(file) << command unless command_history_for(file).last.method == :change_content! && method == :change_content!
26
+ command_history_for(file) << command unless command_history_for(file).last.method == :change_content! && method == :change_content!
27
27
  else
28
28
  command_history_for(file) << command
29
29
  end
@@ -45,7 +45,7 @@ module Glimmer
45
45
  end
46
46
  end
47
47
 
48
- attr_accessor :file, :method, :args, :previous_command, :next_command,
48
+ attr_accessor :file, :method, :args, :previous_command, :next_command,
49
49
  :file_dirty_content, :file_caret_position, :file_selection_count, :previous_file_dirty_content, :previous_file_caret_position, :previous_file_selection_count
50
50
 
51
51
  def initialize(file, method = nil, *args)
@@ -5,6 +5,8 @@ module Glimmer
5
5
  class Dir
6
6
  include Glimmer
7
7
  include Glimmer::DataBinding::ObservableModel
8
+
9
+ IGNORE_PATHS = ['.gladiator', '.gladiator-scratchpad', '.git', 'coverage', 'packages', 'node_modules', 'tmp', 'vendor', 'pkg', 'dist']
8
10
 
9
11
  attr_accessor :selected_child, :filter, :children, :filtered_path_options, :filtered_path, :display_path, :ignore_paths
10
12
  attr_reader :name, :parent, :path
@@ -36,7 +38,7 @@ module Glimmer
36
38
  end
37
39
  self.path = ::File.expand_path(path)
38
40
  @name = ::File.basename(::File.expand_path(path))
39
- @ignore_paths = ['.gladiator', '.git', 'coverage', 'packages', 'node_modules', 'tmp', 'vendor', 'pkg']
41
+ @ignore_paths = IGNORE_PATHS
40
42
  self.filtered_path_options = []
41
43
  end
42
44
 
@@ -72,8 +74,10 @@ module Glimmer
72
74
  def retrieve_children
73
75
  @children = ::Dir.glob(::File.join(@path, '*')).reject do |p|
74
76
  # TODO make sure to configure ignore_paths in a preferences dialog
75
- project_dir.ignore_paths.reduce(false) do |result, ignore_path|
76
- result || p.include?(ignore_path)
77
+ if project_dir == self
78
+ project_dir.ignore_paths.any? do |ignore_path|
79
+ p.include?(ignore_path)
80
+ end
77
81
  end
78
82
  end.map do |p|
79
83
  ::File.file?(p) ? File.new(p, project_dir) : Dir.new(p, project_dir)
@@ -93,7 +97,7 @@ module Glimmer
93
97
  def depth_first_search_file(dir, file_path)
94
98
  dir.children.each do |child|
95
99
  if child.is_a?(File)
96
- return child if child.path.include?(file_path)
100
+ return child if child.path.include?(file_path.to_s)
97
101
  else
98
102
  result = depth_first_search_file(child, file_path)
99
103
  return result unless result.nil?
@@ -173,7 +177,8 @@ module Glimmer
173
177
  # scratchpad scenario
174
178
  if selected_path.empty? # Scratchpad
175
179
  @selected_child&.write_dirty_content
176
- return (self.selected_child = File.new)
180
+ @scratchpad = (self.selected_child = File.new('', project_dir.path)) if @scratchpad.nil? || @scratchpad.closed?
181
+ return @scratchpad
177
182
  end
178
183
  full_selected_path = selected_path.include?(project_dir.path) ? selected_path : ::File.join(project_dir.path, selected_path)
179
184
  return if ::Dir.exist?(full_selected_path) ||
@@ -20,6 +20,69 @@ module Glimmer
20
20
  @init = nil
21
21
  end
22
22
 
23
+ def language
24
+ # TODO consider using Rouge::Lexer.guess_by_filename instead and perhaps guess_by_source when it fails
25
+ extension = path.split('.').last if path.to_s.include?('.')
26
+ return 'ruby' if scratchpad?
27
+ return 'ruby' if path.to_s.end_with?('Gemfile') || path.to_s.end_with?('Rakefile')
28
+ return 'ruby' if dirty_content.start_with?('#!/usr/bin/env ruby') || dirty_content.start_with?('#!/usr/bin/env jruby')
29
+ return 'yaml' if path.to_s.end_with?('Gemfile.lock')
30
+ return 'shell' if extension.nil? && path.to_s.include?('/bin/')
31
+ case extension
32
+ # TODO extract case statement to an external config file
33
+ when 'rb'
34
+ 'ruby'
35
+ when 'md', 'markdown'
36
+ 'markdown'
37
+ when 'js', 'es6'
38
+ 'javascript'
39
+ when 'json'
40
+ 'json'
41
+ when 'yaml'
42
+ 'yaml'
43
+ when 'html'
44
+ 'html'
45
+ when 'h', 'c'
46
+ 'c'
47
+ when 'hs'
48
+ 'haskell'
49
+ when 'gradle'
50
+ 'gradle'
51
+ when 'cpp'
52
+ 'cpp'
53
+ when 'css'
54
+ 'css'
55
+ when 'java'
56
+ 'java'
57
+ when 'jsp'
58
+ 'jsp'
59
+ when 'plist'
60
+ 'plist'
61
+ when 'haml'
62
+ 'haml'
63
+ when 'xml'
64
+ 'xml'
65
+ when 'ini'
66
+ 'ini'
67
+ when 'pl'
68
+ 'perl'
69
+ when 'tcl'
70
+ 'tcl'
71
+ when 'sass'
72
+ 'sass'
73
+ when 'scss'
74
+ 'scss'
75
+ when 'sql'
76
+ 'sql'
77
+ when 'sh'
78
+ 'shell'
79
+ when 'vue'
80
+ 'vue'
81
+ when 'txt', nil
82
+ 'plain_text'
83
+ end
84
+ end
85
+
23
86
  def init_content
24
87
  unless @init
25
88
  @init = true
@@ -82,7 +145,13 @@ module Glimmer
82
145
  end
83
146
 
84
147
  def scratchpad?
85
- path.to_s.empty?
148
+ path.to_s.empty? # TODO consider updating to set the .gladiator-scratchpad path directly
149
+ end
150
+
151
+ def scratchpad_file
152
+ scratchpad_file = ::File.join(project_dir.path, '.gladiator-scratchpad')
153
+ ::File.write(scratchpad_file, content)
154
+ scratchpad_file
86
155
  end
87
156
 
88
157
  def backup_properties
@@ -141,6 +210,7 @@ module Glimmer
141
210
 
142
211
  def change_content!(value)
143
212
  self.dirty_content = value
213
+ format_dirty_content_for_writing!(force: true) if value.to_s.include?("\r\n")
144
214
  update_line_number_from_caret_position(caret_position)
145
215
  end
146
216
 
@@ -157,12 +227,17 @@ module Glimmer
157
227
  end
158
228
 
159
229
  def close
230
+ @closed = true
160
231
  stop_filewatcher
161
232
  remove_all_observers
162
233
  initialize(path, project_dir)
163
234
  Command.clear(self)
164
235
  end
165
236
 
237
+ def closed?
238
+ @closed
239
+ end
240
+
166
241
  def read_dirty_content
167
242
  path.empty? ? '' : ::File.read(path)
168
243
  end
@@ -198,14 +273,15 @@ module Glimmer
198
273
  puts e.full_message
199
274
  end
200
275
 
201
- def format_dirty_content_for_writing!
202
- return if @commmand_in_progress
203
- # TODO f ix c ar e t pos it ion after formatting dirty content (diff?)
276
+ def format_dirty_content_for_writing!(force: false)
277
+ return if !force && @commmand_in_progress
204
278
  new_dirty_content = dirty_content.to_s.split("\n").map {|line| line.strip.empty? ? line : line.rstrip }.join("\n")
205
279
  new_dirty_content = "#{new_dirty_content.gsub("\r\n", "\n").gsub("\r", "\n").sub(/\n+\z/, '')}\n"
206
280
  if new_dirty_content != self.dirty_content
207
281
  @formatting_dirty_content_for_writing = true
282
+ caret_position_diff = dirty_content.to_s.size - new_dirty_content.size
208
283
  self.dirty_content = new_dirty_content
284
+ self.caret_position = caret_position - caret_position_diff
209
285
  @formatting_dirty_content_for_writing = false
210
286
  end
211
287
  end
@@ -456,21 +532,70 @@ module Glimmer
456
532
  end
457
533
 
458
534
  def home
459
- self.selection_count = 0
460
535
  self.line_number = 1
536
+ self.selection_count = 0
461
537
  end
462
538
 
463
539
  def end
464
- self.selection_count = 0
465
540
  self.line_number = lines.size
541
+ self.selection_count = 0
466
542
  end
467
543
 
468
544
  def start_of_line
469
545
  self.caret_position = caret_position_for_line_index(self.line_number - 1)
546
+ self.selection_count = 0
470
547
  end
471
548
 
472
549
  def end_of_line
473
550
  self.caret_position = caret_position_for_line_index(self.line_number) - 1
551
+ self.selection_count = 0
552
+ end
553
+
554
+ def select_to_start_of_line
555
+ old_caret_position = caret_position
556
+ self.caret_position = caret_position_for_line_index(self.line_number - 1)
557
+ self.selection_count = old_caret_position - caret_position
558
+ end
559
+
560
+ def select_to_end_of_line
561
+ self.caret_position = selection_count == 0 ? caret_position : caret_position + selection_count
562
+ self.selection_count = (caret_position_for_line_index(self.line_number) - 1) - caret_position
563
+ end
564
+
565
+ def delete!
566
+ new_dirty_content = dirty_content
567
+ new_dirty_content[caret_position...(caret_position + selection_count)] = ''
568
+ old_caret_position = caret_position
569
+ self.dirty_content = new_dirty_content
570
+ self.caret_position = old_caret_position
571
+ end
572
+
573
+ def cut!
574
+ Clipboard.copy(selected_text)
575
+ delete!
576
+ end
577
+
578
+ def copy
579
+ Clipboard.copy(selected_text)
580
+ end
581
+
582
+ def paste!
583
+ new_dirty_content = dirty_content
584
+ pasted_text = Clipboard.paste
585
+ new_dirty_content[caret_position...(caret_position + selection_count)] = pasted_text
586
+ old_caret_position = caret_position
587
+ self.dirty_content = new_dirty_content
588
+ self.caret_position = old_caret_position + pasted_text.to_s.size
589
+ self.selection_count = 0
590
+ end
591
+
592
+ def select_all
593
+ self.caret_position = 0
594
+ self.selection_count = dirty_content.to_s.size
595
+ end
596
+
597
+ def selected_text
598
+ dirty_content.to_s[caret_position, selection_count]
474
599
  end
475
600
 
476
601
  def move_up!
@@ -513,13 +638,13 @@ module Glimmer
513
638
 
514
639
  def run
515
640
  if scratchpad?
516
- eval content
641
+ load scratchpad_file
517
642
  else
518
643
  write_dirty_content
519
644
  load path
520
645
  end
521
646
  end
522
-
647
+
523
648
  def lines
524
649
  need_padding = dirty_content.to_s.end_with?("\n")
525
650
  splittable_content = need_padding ? "#{dirty_content} " : dirty_content
@@ -29,6 +29,9 @@ require 'models/glimmer/gladiator/command'
29
29
  require 'views/glimmer/gladiator/text_editor'
30
30
  require 'views/glimmer/gladiator/file_lookup_list'
31
31
  require 'views/glimmer/gladiator/file_explorer_tree'
32
+ require 'views/glimmer/gladiator/gladiator_menu_bar'
33
+ require 'views/glimmer/gladiator/progress_shell'
34
+ require 'views/glimmer/gladiator/file_edit_menu'
32
35
 
33
36
  Clipboard.implementation = Clipboard::Java
34
37
  Clipboard.copy(Clipboard.paste) # pre-initialize library to avoid slowdown during use
@@ -41,6 +44,7 @@ module Glimmer
41
44
  APP_ROOT = ::File.expand_path('../../../..', __FILE__)
42
45
  # TODO make sure COMMAND_KEY doesn't clash on Linux/Windows for CMD+CTRL shortcuts
43
46
  COMMAND_KEY = OS.mac? ? :command : :ctrl
47
+ CONTROL_KEY = OS.mac? ? :ctrl : :alt
44
48
  VERSION = ::File.read(::File.join(APP_ROOT, 'VERSION')).to_s.strip
45
49
  LICENSE = ::File.read(::File.join(APP_ROOT, 'LICENSE.txt')).to_s.strip
46
50
  ICON = ::File.expand_path(::File.join(APP_ROOT, 'images', 'glimmer-cs-gladiator-logo.png'))
@@ -58,6 +62,11 @@ module Glimmer
58
62
  # option :height, 240
59
63
  option :project_dir_path
60
64
 
65
+ attr_reader :find_text, :filter_text, :line_number_text, :split_orientation, :tab_folder_sash_form, :side_bar_sash_form, :file_area_and_editor_area_sash_form, :file_explorer_expand_item, :file_explorer_expand_item, :file_lookup_expand_item, :file_explorer_expand_item, :file_lookup_expand_item_height, :file_explorer_expand_item_height
66
+ attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor, :tab_folder1, :tab_folder2, :maximized_pane, :maximized_editor
67
+ alias maximized_pane? maximized_pane
68
+ alias maximized_editor? maximized_editor
69
+
61
70
  def project_dir
62
71
  @project_dir ||= Dir.new(project_dir_path)
63
72
  end
@@ -80,10 +89,9 @@ module Glimmer
80
89
  pane_count && pane_count > 1
81
90
  end
82
91
 
83
- attr_reader :find_text, :filter_text, :line_number_text, :split_orientation
84
- attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor, :tab_folder1, :tab_folder2, :maximized_pane, :maximized_editor
85
- alias maximized_pane? maximized_pane
86
- alias maximized_editor? maximized_editor
92
+ def app_mode?
93
+ project_dir_path == '.' && ENV['APP_MODE'].to_s == 'true' || !::Dir.glob(::File.join(project_dir_path, 'glimmer-cs-gladiator.jar')).empty?
94
+ end
87
95
 
88
96
  ## Uncomment before_body block to pre-initialize variables to use in body
89
97
  #
@@ -95,6 +103,7 @@ module Glimmer
95
103
  project_dir.selected_child&.write_raw_dirty_content
96
104
  end
97
105
  Display.setAppName('Gladiator')
106
+ Display.setAppVersion(VERSION)
98
107
  # make sure the display events are only hooked once if multiple gladiators are created
99
108
  unless defined?(@@display)
100
109
  @@display = display {
@@ -102,23 +111,27 @@ module Glimmer
102
111
  on_about {
103
112
  display_about_dialog
104
113
  }
114
+ on_quit {
115
+ display.swt_display.shells.each { |shell|
116
+ gladiator = shell.get_data('custom_shell')
117
+ gladiator.project_dir.selected_child&.write_dirty_content
118
+ shell.close
119
+ }
120
+ }
105
121
  on_swt_keydown { |key_event|
106
122
  focused_gladiator = display.focus_control.shell&.get_data('custom_shell')
107
- focused_gladiator.handle_display_shortcut(key_event) if !focused_gladiator.nil? && key_event.widget.shell == focused_gladiator&.swt_widget
108
- }
109
- on_swt_Close {
110
- save_config
111
- project_dir.selected_child&.write_dirty_content
123
+ focused_gladiator.handle_display_shortcut(key_event) if !focused_gladiator.nil? && focused_gladiator.is_a?(Glimmer::Gladiator) && key_event.widget.shell == focused_gladiator&.swt_widget
112
124
  }
113
125
  }
114
126
  end
115
127
 
116
128
  @default_foreground = :dark_blue
117
129
  @split_orientation = swt(:horizontal)
118
- @config_file_path = ::File.join(project_dir.path, '.gladiator')
119
- @config = {}
120
- load_config_ignore_paths
121
- # project_dir.all_children # pre-caches children
130
+ unless app_mode?
131
+ @config_file_path = ::File.join(project_dir.path, '.gladiator')
132
+ @config = {}
133
+ load_config_ignore_paths
134
+ end
122
135
  }
123
136
 
124
137
  ## Uncomment after_body block to setup observers for widgets in body
@@ -132,7 +145,7 @@ module Glimmer
132
145
  if Gladiator.drag && !@tab_folder2
133
146
  self.tab_folder1 = current_tab_folder
134
147
  @tab_folder_sash_form.content {
135
- self.current_tab_folder = self.tab_folder2 = tab_folder {}
148
+ self.current_tab_folder = self.tab_folder2 = text_editor_group_tab_folder
136
149
  @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
137
150
  }
138
151
  body_root.pack_same_size
@@ -144,54 +157,63 @@ module Glimmer
144
157
  @current_tab_item = found_tab_item.getData('proxy')
145
158
  @current_text_editor = found_tab_item.getData('text_editor') unless found_tab_item.getData('text_editor').nil?
146
159
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
147
- elsif selected_file
148
- @current_tab_folder.content {
149
- @current_tab_item = tab_item { |the_tab_item|
150
- text selected_file.name
151
- fill_layout(:horizontal) {
152
- margin_width 0
153
- margin_height 0
154
- }
155
- tab_folder = nil
156
- the_text_editor = nil
157
- the_tab_item.content {
158
- @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file)
159
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
160
- the_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
161
- @current_text_editor.text_proxy.content {
162
- on_focus_gained {
163
- tab_folder = the_text_editor.swt_widget.getParent.getParent
164
- self.current_tab_folder = tab_folder.getData('proxy')
165
- @current_tab_item = the_tab_item
166
- @current_text_editor = the_text_editor
167
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
168
- @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
169
- project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
160
+ else
161
+ begin
162
+ @current_tab_folder.content {
163
+ @current_tab_item = tab_item { |the_tab_item|
164
+ text selected_file.name
165
+ fill_layout(:horizontal) {
166
+ margin_width 0
167
+ margin_height 0
168
+ }
169
+ tab_folder = nil
170
+ the_text_editor = nil
171
+ the_tab_item.content {
172
+ @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file) {
173
+ layout_data :fill, :fill, true, true
174
+ }
175
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
176
+ the_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
177
+ @current_text_editor.text_proxy.content {
178
+ on_focus_gained {
179
+ tab_folder = the_text_editor.swt_widget.getParent.getParent
180
+ self.current_tab_folder = tab_folder.getData('proxy')
181
+ @current_tab_item = the_tab_item
182
+ @current_text_editor = the_text_editor
183
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
184
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
185
+ project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
186
+ }
170
187
  }
171
188
  }
189
+ on_swt_show {
190
+ @current_tab_item = the_tab_item
191
+ @current_text_editor = the_text_editor
192
+ self.current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
193
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
194
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
195
+ project_dir.selected_child = selected_file
196
+ @current_text_editor&.load_content
197
+ @current_text_editor&.text_widget&.setFocus
198
+ save_config unless selected_file.nil?
199
+ }
200
+ on_widget_disposed {
201
+ project_dir.selected_child&.write_dirty_content
202
+ tab_item_file = the_tab_item.swt_tab_item.get_data('file')
203
+ if (@tab_folder1 != @current_tab_folder && !@tab_folder1&.items&.detect {|ti| ti.get_data('file') == tab_item_file}) || (@tab_folder2 != @current_tab_folder && !@tab_folder2&.items&.detect {|ti| ti.get_data('file') == tab_item_file})
204
+ tab_item_file.close
205
+ end
206
+ }
172
207
  }
173
-
174
- on_swt_show {
175
- @current_tab_item = the_tab_item
176
- @current_text_editor = the_text_editor
177
- self.current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
178
- @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
179
- @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
180
- project_dir.selected_child = selected_file
181
- @current_text_editor&.text_widget&.setFocus
182
- }
183
- on_widget_disposed {
184
- project_dir.selected_child&.write_dirty_content
185
- tab_item_file = the_tab_item.swt_tab_item.get_data('file')
186
- tab_item_file.close unless [@tab_folder1, @tab_folder2].compact.map(&:items).flatten(1).detect {|ti| ti.get_data('file') == tab_item_file}
187
- }
208
+ @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
209
+ @current_tab_item.swt_tab_item.setData('file', selected_file)
210
+ @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
188
211
  }
189
- @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
190
- @current_tab_item.swt_tab_item.setData('file', selected_file)
191
- @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
192
- }
193
- @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
194
- body_root.pack_same_size
212
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
213
+ body_root.pack_same_size
214
+ rescue => e
215
+ Glimmer::Config.logger.error {e.full_message}
216
+ end
195
217
  end
196
218
  @current_text_editor&.text_widget&.setFocus
197
219
  end
@@ -221,546 +243,463 @@ module Glimmer
221
243
  observe(project_dir, 'selected_child.top_pixel') do
222
244
  save_config
223
245
  end
224
- load_config
246
+ load_config unless app_mode?
225
247
  }
226
248
 
227
249
  ## Add widget content inside custom shell body
228
250
  ## Top-most widget must be a shell or another custom shell
229
251
  #
230
252
  body {
231
- shell {
232
- text "Gladiator - #{::File.expand_path(project_dir.path)}"
233
- minimum_size 520, 250
234
- size 1440, 900
235
- image ICON
236
-
237
- on_swt_show {
238
- swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
239
- swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
240
- @loaded_config = true
253
+ if app_mode?
254
+ shell {
255
+ text 'Gladiator'
256
+ minimum_size 250, 250
257
+ image ICON
258
+ gladiator_menu_bar(gladiator: self, editing: false)
259
+
260
+ button {
261
+ text 'Open Project...'
262
+
263
+ on_widget_selected {
264
+ open_project
265
+ }
266
+ }
241
267
  }
242
-
243
- on_shell_closed {
244
- save_config
245
- project_dir.selected_child&.write_dirty_content
246
- if @tab_folder2
268
+ else
269
+ shell {
270
+ text "Gladiator - #{::File.expand_path(project_dir.path)}"
271
+ minimum_size 590, 250
272
+ image ICON
273
+
274
+ on_swt_show {
275
+ unless @shell_visible
276
+ if @config[:shell_width] && @config[:shell_height]
277
+ swt_widget.set_size(@config[:shell_width], @config[:shell_height])
278
+ else
279
+ swt_widget.set_size(display.bounds.width, display.bounds.height)
280
+ end
281
+ end
282
+ swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
283
+ @loaded_config = true
284
+ @shell_visible = true
285
+ }
286
+
287
+ on_shell_closed {
288
+ project_dir.selected_child&.write_dirty_content
289
+ if @tab_folder2
290
+ current_tab_folder.swt_widget.getItems.each do |tab_item|
291
+ tab_item.getData('proxy')&.dispose
292
+ end
293
+ close_tab_folder
294
+ end
247
295
  current_tab_folder.swt_widget.getItems.each do |tab_item|
248
296
  tab_item.getData('proxy')&.dispose
249
297
  end
250
- close_tab_folder
251
- end
252
- current_tab_folder.swt_widget.getItems.each do |tab_item|
253
- tab_item.getData('proxy')&.dispose
254
- end
255
- body_root.close unless current_tab_folder.swt_widget.getItems.empty?
256
- }
257
- on_widget_disposed {
258
- project_dir.selected_child&.write_dirty_content
259
- }
260
- on_control_resized {
261
- save_config
262
- }
263
- on_control_moved {
264
- save_config
265
- }
266
- on_shell_deactivated {
267
- project_dir.selected_child&.write_dirty_content
268
- }
269
-
270
- if OS.mac?
271
- display.swt_display.system_menu.items.find {|mi| mi.id == swt(:id_quit)}.add_selection_listener {
272
- save_config
273
- project_dir.selected_child&.write_dirty_content
274
- display.swt_display.shells.each(&:close)
298
+ body_root.close unless current_tab_folder.swt_widget.getItems.empty?
275
299
  }
276
- end
277
-
278
- menu_bar {
279
- menu {
280
- text '&File'
281
-
282
- menu_item {
283
- text 'New &Scratchpad'
284
- accelerator COMMAND_KEY, :shift, :s
285
- on_widget_selected {
286
- project_dir.selected_child_path = ''
287
- }
288
- }
289
- menu_item {
290
- text 'Open &Project...'
291
- accelerator COMMAND_KEY, :o
292
- on_widget_selected {
293
- open_project
294
- }
295
- }
296
- menu_item(:separator)
297
- menu_item {
298
- text '&Quit Project'
299
- accelerator COMMAND_KEY, :alt, :q
300
- on_widget_selected {
301
- save_config
302
- project_dir.selected_child&.write_dirty_content
303
- body_root.close
304
- }
305
- }
300
+ on_widget_disposed {
301
+ project_dir.selected_child&.write_dirty_content
306
302
  }
307
- menu {
308
- text '&View'
309
- menu {
310
- text '&Split Pane'
311
- menu { |menu_proxy|
312
- text '&Orientation'
313
- menu_item(:radio) {
314
- text '&Horizontal'
315
- selection bind(self, :split_orientation,
316
- on_read: ->(o) { split_pane? && o == swt(:horizontal) },
317
- on_write: ->(b) { b.nil? ? nil : (b ? swt(:horizontal) : swt(:vertical)) })
318
- }
319
- menu_item(:radio) {
320
- text '&Vertical'
321
- selection bind(self, :split_orientation,
322
- on_read: ->(o) { split_pane? && o == swt(:vertical) },
323
- on_write: ->(b) { b.nil? ? nil : (b ? swt(:vertical) : swt(:horizontal)) })
324
- }
325
- }
326
- menu_item(:check) {
327
- text '&Maximize Pane'
328
- enabled bind(self, :tab_folder2)
329
- accelerator COMMAND_KEY, :shift, :m
330
- selection bind(self, :maximized_pane)
331
- }
332
- menu_item {
333
- text 'Reset &Panes'
334
- enabled bind(self, :tab_folder2)
335
- accelerator COMMAND_KEY, :shift, :p
336
- on_widget_selected {
337
- if tab_folder2
338
- self.maximized_pane = false
339
- @tab_folder_sash_form.weights = [1, 1]
340
- end
341
- }
342
- }
343
- menu_item {
344
- text '&Unsplit'
345
- enabled bind(self, :tab_folder2)
346
- accelerator COMMAND_KEY, :shift, :u
347
- on_widget_selected {
348
- if tab_folder2
349
- self.maximized_pane = false
350
- navigate_to_next_tab_folder if current_tab_folder != tab_folder2
351
- close_all_tabs(tab_folder2)
352
- self.split_orientation = nil
353
- body_root.pack_same_size
354
- end
355
- }
356
- }
357
- }
358
- menu_item(:check) {
359
- text '&Maximize Editor'
360
- accelerator COMMAND_KEY, :ctrl, :m
361
- selection bind(self, :maximized_editor)
362
- }
363
- menu_item {
364
- text '&Reset All'
365
- accelerator COMMAND_KEY, :ctrl, :r
366
- on_widget_selected {
367
- self.maximized_editor = false
368
- @file_area_and_editor_area_sash_form.weights = [1, 5]
369
- @side_bar_sash_form.weights = [1, 1]
370
- }
371
- }
303
+ on_control_resized {
304
+ save_config
372
305
  }
373
- menu {
374
- text '&Run'
375
- # menu_item {
376
- # text 'Launch Glimmer &App'
377
- # on_widget_selected {
378
- # parent_path = project_dir.path
379
- ## current_directory_name = ::File.basename(parent_path)
380
- ## assumed_shell_script = ::File.join(parent_path, 'bin', current_directory_name)
381
- ## assumed_shell_script = ::Dir.glob(::File.join(parent_path, 'bin', '*')).detect {|f| ::File.file?(f) && !::File.read(f).include?('#!/usr/bin/env')} if !::File.exist?(assumed_shell_script)
382
- ## load assumed_shell_script
383
- # FileUtils.cd(parent_path) do
384
- # system 'glimmer run'
385
- # end
386
- # }
387
- # }
388
- menu_item {
389
- text '&Ruby'
390
- accelerator COMMAND_KEY, :shift, :r
391
- on_widget_selected {
392
- begin
393
- project_dir.selected_child.run
394
- rescue Exception => e
395
- dialog {
396
- text 'Run - Ruby - Error Encountered!'
397
- label {
398
- text e.full_message
399
- }
400
- }.open
401
- end
402
- }
403
- }
306
+ on_control_moved {
307
+ save_config
404
308
  }
405
- menu {
406
- text '&Help'
407
- menu_item {
408
- text '&About'
409
- accelerator COMMAND_KEY, :shift, :a
410
- on_widget_selected {
411
- display_about_dialog
412
- }
413
- }
309
+ on_shell_deactivated {
310
+ project_dir.selected_child&.write_dirty_content
414
311
  }
415
- }
416
-
417
- @file_area_and_editor_area_sash_form = sash_form(:horizontal) {
418
- weights 1, 5
419
-
420
- composite {
421
- grid_layout(1, false) {
422
- margin_width 0
423
- margin_height 0
424
- }
425
-
426
- @side_bar_sash_form = sash_form(:vertical) {
427
- layout_data(:fill, :fill, true, true)
428
- sash_width 4
429
-
430
- resize_expand_items = lambda { |event=nil|
431
- @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
432
- @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
312
+
313
+ # Menu Bar
314
+ gladiator_menu_bar(gladiator: self, editing: true)
315
+
316
+ @file_area_and_editor_area_sash_form = sash_form(:horizontal) {
317
+ weights 1, 5
318
+
319
+ composite {
320
+ grid_layout(1, false) {
321
+ margin_width 0
322
+ margin_height 0
433
323
  }
434
324
 
435
- @file_lookup_expand_bar = expand_bar {
436
- layout_data :fill, :fill, true, true
437
- font height: 17, style: :bold
438
- foreground @default_foreground
325
+ @side_bar_sash_form = sash_form(:vertical) {
326
+ layout_data(:fill, :fill, true, true)
327
+ sash_width 4
439
328
 
440
- on_swt_show {
441
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
329
+ resize_expand_items = lambda { |event=nil|
330
+ @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
331
+ @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
442
332
  }
443
333
 
444
- on_swt_Resize(&resize_expand_items)
445
-
446
- @file_lookup_expand_item = expand_item {
447
- grid_layout {
448
- margin_width 0
449
- margin_height 0
334
+ @file_lookup_expand_bar = expand_bar {
335
+ layout_data :fill, :fill, true, true
336
+ font height: 17, style: :bold
337
+ foreground @default_foreground
338
+
339
+ on_swt_show {
340
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
450
341
  }
451
- text 'File Lookup'
452
- height display.bounds.height
453
342
 
454
- @filter_text = text {
455
- layout_data :fill, :center, true, false
456
- text bind(project_dir, 'filter')
457
- on_key_pressed { |key_event|
458
- if key_event.keyCode == swt(:tab) ||
459
- key_event.keyCode == swt(:cr) ||
460
- key_event.keyCode == swt(:arrow_up) ||
461
- key_event.keyCode == swt(:arrow_down)
462
- @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
463
- @file_lookup_list.swt_widget.setFocus
464
- end
343
+ on_swt_Resize(&resize_expand_items)
344
+
345
+ @file_lookup_expand_item = expand_item {
346
+ grid_layout {
347
+ margin_width 0
348
+ margin_height 0
349
+ }
350
+ text 'File Lookup'
351
+ height display.bounds.height
352
+
353
+ @filter_text = text {
354
+ layout_data :fill, :center, true, false
355
+ text bind(project_dir, 'filter')
356
+ on_key_pressed { |key_event|
357
+ if key_event.keyCode == swt(:tab) ||
358
+ key_event.keyCode == swt(:cr) ||
359
+ key_event.keyCode == swt(:arrow_up) ||
360
+ key_event.keyCode == swt(:arrow_down)
361
+ @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
362
+ @file_lookup_list.swt_widget.setFocus
363
+ end
364
+ }
365
+ }
366
+
367
+ @file_lookup_list = file_lookup_list(gladiator: self, foreground_color: @default_foreground) {
368
+ layout_data :fill, :fill, true, true
465
369
  }
466
370
  }
467
-
468
- @file_lookup_list = file_lookup_list(gladiator: self, foreground_color: @default_foreground) {
469
- layout_data :fill, :fill, true, true
371
+
372
+ on_item_collapsed { |event|
373
+ if @file_explorer_expand_item.swt_expand_item.get_expanded
374
+ @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
375
+ @file_lookup_expand_item.swt_expand_item.height = 0
376
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
377
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
378
+ @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]
379
+ end
470
380
  }
471
- }
472
381
 
473
- on_item_collapsed { |event|
474
- if @file_explorer_expand_item.swt_expand_item.get_expanded
475
- @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
476
- @file_lookup_expand_item.swt_expand_item.height = 0
477
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
478
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
479
- @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]
480
- end
481
- }
482
-
483
- on_item_expanded {
484
- @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
485
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
486
- }
487
-
488
- }
489
-
490
- @file_explorer_expand_bar = expand_bar {
491
- layout_data :fill, :fill, true, true
492
- font height: 17, style: :bold
493
- foreground @default_foreground
494
-
495
- on_swt_show {
496
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
382
+ on_item_expanded {
383
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
384
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
385
+ }
386
+
497
387
  }
498
388
 
499
- on_swt_Resize(&resize_expand_items)
500
-
501
- @file_explorer_expand_item = expand_item {
502
- grid_layout {
503
- margin_width 0
504
- margin_height 0
389
+ @file_explorer_expand_bar = expand_bar {
390
+ layout_data :fill, :fill, true, true
391
+ font height: 17, style: :bold
392
+ foreground @default_foreground
393
+
394
+ on_swt_show {
395
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
505
396
  }
506
- text 'File Explorer'
507
- height display.bounds.height
508
397
 
509
- @file_explorer_tree = file_explorer_tree(gladiator: self, foreground_color: @default_foreground) {
510
- layout_data :fill, :fill, true, true
398
+ on_swt_Resize(&resize_expand_items)
399
+
400
+ @file_explorer_expand_item = expand_item {
401
+ grid_layout {
402
+ margin_width 0
403
+ margin_height 0
404
+ }
405
+ text 'File Explorer'
406
+ height display.bounds.height
407
+
408
+ @file_explorer_tree = file_explorer_tree(gladiator: self, foreground_color: @default_foreground) {
409
+ layout_data :fill, :fill, true, true
410
+ }
411
+ }
412
+
413
+ on_item_collapsed { |event|
414
+ if @file_lookup_expand_item.swt_expand_item.get_expanded
415
+ @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
416
+ @file_explorer_expand_item.swt_expand_item.height = 0
417
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
418
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
419
+ @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]
420
+ end
511
421
  }
512
- }
513
422
 
514
- on_item_collapsed { |event|
515
- if @file_lookup_expand_item.swt_expand_item.get_expanded
516
- @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
517
- @file_explorer_expand_item.swt_expand_item.height = 0
518
- @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
519
- @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
520
- @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]
521
- end
522
- }
523
-
524
- on_item_expanded {
525
- @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
526
- @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
423
+ on_item_expanded {
424
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
425
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
426
+ }
427
+
527
428
  }
528
-
529
- }
530
-
531
- }
532
429
 
533
- }
534
-
535
- @editor_area_composite = composite {
536
- grid_layout(1, false) {
537
- margin_width 0
538
- margin_height 0
430
+ }
431
+
539
432
  }
540
433
 
541
- @navigation_expand_bar = expand_bar {
542
- layout_data :fill, :top, true, false
543
- font height: 17, style: :bold
544
- foreground @default_foreground
434
+ @editor_area_composite = composite {
435
+ grid_layout(1, false) {
436
+ margin_width 0
437
+ margin_height 0
438
+ }
545
439
 
546
- @navigation_expand_item = expand_item {
547
- text 'Navigation'
548
- height 115
549
-
550
- grid_layout(5, false) {
551
- margin_right 5
440
+ @navigation_expand_bar = expand_bar {
441
+ layout_data(:fill, :top, true, false) {
442
+ minimum_width 480
552
443
  }
444
+ font height: 17, style: :bold
445
+ foreground @default_foreground
553
446
 
554
- stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
555
-
556
- # row 1
447
+ @navigation_expand_item = expand_item {
448
+ text 'Navigation'
449
+ height 115
557
450
 
558
- label {
559
- layout_data(:left, :center, false, false)
560
- text 'File:'
561
- foreground @default_foreground
562
- }
563
-
564
- @file_path_label = styled_text(:none) {
565
- layout_data(:fill, :center, true, false) {
566
- horizontal_span 2
451
+ grid_layout(5, false) {
452
+ margin_right 5
567
453
  }
568
- background color(:widget_background)
569
- foreground @default_foreground
570
- editable false
571
- caret nil
572
- text bind(project_dir, 'selected_child.path')
573
- on_mouse_up {
574
- @file_path_label.swt_widget.selectAll
454
+
455
+ stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
456
+
457
+ # row 1
458
+
459
+ label {
460
+ layout_data(:left, :center, false, false)
461
+ text 'File:'
462
+ foreground @default_foreground
575
463
  }
576
- on_focus_lost {
577
- @file_path_label.swt_widget.setSelection(0, 0)
464
+
465
+ @file_path_label = styled_text(:none) {
466
+ layout_data(:fill, :center, true, false) {
467
+ horizontal_span 2
468
+ }
469
+ background color(:widget_background)
470
+ foreground @default_foreground
471
+ editable false
472
+ caret nil
473
+ text bind(project_dir, 'selected_child.path')
474
+ on_mouse_up {
475
+ @file_path_label.swt_widget.selectAll
476
+ }
477
+ on_focus_lost {
478
+ @file_path_label.swt_widget.setSelection(0, 0)
479
+ }
578
480
  }
579
- }
580
-
581
- label {
582
- layout_data(:left, :center, false, false)
583
- text 'Caret Position:'
584
- foreground @default_foreground
585
- }
586
- label(:right) {
587
- layout_data(:fill, :center, true, false)
588
- text bind(project_dir, 'selected_child.caret_position')
589
- foreground @default_foreground
590
- font stat_font
591
- }
592
-
593
- # row 2
594
-
595
- label {
596
- layout_data(:left, :center, false, false)
597
- text 'Line:'
598
- foreground @default_foreground
599
- }
600
- @line_number_text = text {
601
- layout_data(:fill, :center, true, false) {
602
- minimum_width 400
481
+
482
+ label {
483
+ layout_data(:left, :center, false, false) {
484
+ minimum_width 100
485
+ }
486
+ text 'Caret Position:'
487
+ foreground @default_foreground
603
488
  }
604
- text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
605
- foreground @default_foreground
606
- font stat_font
607
- on_key_pressed { |key_event|
608
- if key_event.keyCode == swt(:cr)
609
- @current_text_editor&.text_widget&.setFocus
610
- end
489
+ label(:right) {
490
+ layout_data(:fill, :center, true, false) {
491
+ minimum_width 50
492
+ }
493
+ text bind(project_dir, 'selected_child.caret_position')
494
+ foreground @default_foreground
495
+ font stat_font
611
496
  }
612
- on_verify_text { |event|
613
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
497
+
498
+ # row 2
499
+
500
+ label {
501
+ layout_data(:left, :center, false, false)
502
+ text 'Line:'
503
+ foreground @default_foreground
614
504
  }
615
- }
616
- label # filler
617
-
618
- label {
619
- layout_data(:left, :center, false, false)
620
- text 'Line Position:'
621
- foreground @default_foreground
622
- }
623
- label(:right) {
624
- layout_data(:fill, :center, true, false)
625
- text bind(project_dir, 'selected_child.line_position')
626
- foreground @default_foreground
627
- font stat_font
628
- }
629
-
630
- # row 3
631
-
632
- label {
633
- layout_data(:left, :center, false, false)
634
- text 'Find:'
635
- foreground @default_foreground
636
- }
637
- @find_text = text {
638
- layout_data(:fill, :center, true, false) {
639
- minimum_width 400
505
+ @line_number_text = text {
506
+ layout_data(:fill, :center, true, false) {
507
+ width_hint 400
508
+ minimum_width 100
509
+ }
510
+ text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
511
+ foreground @default_foreground
512
+ font stat_font
513
+ on_key_pressed { |key_event|
514
+ if key_event.keyCode == swt(:cr)
515
+ @current_text_editor&.text_widget&.setFocus
516
+ end
517
+ }
518
+ on_verify_text { |event|
519
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
520
+ }
640
521
  }
641
- text bind(project_dir, 'selected_child.find_text')
642
- foreground @default_foreground
643
- font stat_font
644
- on_key_pressed { |key_event|
645
- if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
646
- project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
647
- project_dir.selected_child&.find_next
648
- end
649
- if key_event.keyCode == swt(:cr)
650
- project_dir.selected_child&.find_next
651
- end
522
+ label # filler
523
+
524
+ label {
525
+ layout_data(:left, :center, false, false) {
526
+ minimum_width 100
527
+ }
528
+ text 'Line Position:'
529
+ foreground @default_foreground
652
530
  }
653
- }
654
- composite {
655
- layout_data(:left, :center, true, false)
656
- row_layout {
657
- margin_width 0
658
- margin_height 0
531
+ label(:right) {
532
+ layout_data(:fill, :center, true, false) {
533
+ minimum_width 50
534
+ }
535
+ text bind(project_dir, 'selected_child.line_position')
536
+ foreground @default_foreground
537
+ font stat_font
659
538
  }
660
- button(:check) {
661
- selection bind(project_dir, 'selected_child.case_sensitive')
539
+
540
+ # row 3
541
+
542
+ label {
543
+ layout_data(:left, :center, false, false)
544
+ text 'Find:'
545
+ foreground @default_foreground
546
+ }
547
+ @find_text = text {
548
+ layout_data(:fill, :center, true, false) {
549
+ width_hint 400
550
+ minimum_width 100
551
+ }
552
+ text bind(project_dir, 'selected_child.find_text')
553
+ foreground @default_foreground
554
+ font stat_font
662
555
  on_key_pressed { |key_event|
556
+ if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
557
+ project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
558
+ project_dir.selected_child&.find_next
559
+ end
663
560
  if key_event.keyCode == swt(:cr)
664
561
  project_dir.selected_child&.find_next
665
562
  end
666
563
  }
667
564
  }
565
+ composite {
566
+ layout_data(:left, :center, true, false) {
567
+ minimum_width 120
568
+ }
569
+ row_layout {
570
+ margin_width 0
571
+ margin_height 0
572
+ }
573
+ button(:check) {
574
+ selection bind(project_dir, 'selected_child.case_sensitive')
575
+ on_key_pressed { |key_event|
576
+ if key_event.keyCode == swt(:cr)
577
+ project_dir.selected_child&.find_next
578
+ end
579
+ }
580
+ }
581
+ label {
582
+ text 'Case-sensitive'
583
+ foreground @default_foreground
584
+ }
585
+ }
586
+
668
587
  label {
669
- text 'Case-sensitive'
588
+ layout_data(:left, :center, false, false) {
589
+ minimum_width 100
590
+ }
591
+ text 'Selection Count:'
670
592
  foreground @default_foreground
671
593
  }
672
- }
673
-
674
- label {
675
- layout_data(:left, :center, false, false)
676
- text 'Selection Count:'
677
- foreground @default_foreground
678
- }
679
- label(:right) {
680
- layout_data(:fill, :center, true, false)
681
- text bind(project_dir, 'selected_child.selection_count')
682
- foreground @default_foreground
683
- font stat_font
684
- }
685
-
686
- # row 4
687
-
688
- label {
689
- layout_data(:left, :center, false, false)
690
- text 'Replace:'
691
- foreground @default_foreground
692
- }
693
- @replace_text = text {
694
- layout_data(:fill, :center, true, false) {
695
- minimum_width 400
594
+ label(:right) {
595
+ layout_data(:fill, :center, true, false) {
596
+ minimum_width 50
597
+ }
598
+ text bind(project_dir, 'selected_child.selection_count')
599
+ foreground @default_foreground
600
+ font stat_font
696
601
  }
697
- text bind(project_dir, 'selected_child.replace_text')
698
- foreground @default_foreground
699
- font stat_font
700
- on_focus_gained {
701
- project_dir.selected_child&.ensure_find_next
602
+
603
+ # row 4
604
+
605
+ label {
606
+ layout_data(:left, :center, false, false)
607
+ text 'Replace:'
608
+ foreground @default_foreground
702
609
  }
703
- on_key_pressed { |key_event|
704
- if key_event.keyCode == swt(:cr)
705
- if project_dir.selected_child
706
- Command.do(project_dir.selected_child, :replace_next!)
610
+ @replace_text = text {
611
+ layout_data(:fill, :center, true, false) {
612
+ width_hint 400
613
+ minimum_width 100
614
+ }
615
+ text bind(project_dir, 'selected_child.replace_text')
616
+ foreground @default_foreground
617
+ font stat_font
618
+ on_focus_gained {
619
+ project_dir.selected_child&.ensure_find_next
620
+ }
621
+ on_key_pressed { |key_event|
622
+ if key_event.keyCode == swt(:cr)
623
+ if project_dir.selected_child
624
+ Command.do(project_dir.selected_child, :replace_next!)
625
+ end
707
626
  end
708
- end
627
+ }
628
+ }
629
+ label # filler
630
+ label {
631
+ layout_data(:left, :center, false, false) {
632
+ minimum_width 100
633
+ }
634
+ text 'Top Pixel:'
635
+ foreground @default_foreground
636
+ }
637
+ label(:right) {
638
+ layout_data(:fill, :center, true, false) {
639
+ minimum_width 50
640
+ }
641
+ text bind(project_dir, 'selected_child.top_pixel')
642
+ foreground @default_foreground
643
+ font stat_font
709
644
  }
710
645
  }
711
- label # filler
712
- label {
713
- layout_data(:left, :center, false, false)
714
- text 'Top Pixel:'
715
- foreground @default_foreground
646
+
647
+ on_item_collapsed {
648
+ collapse_navigation_expand_bar_height
716
649
  }
717
- label(:right) {
718
- layout_data(:fill, :center, true, false)
719
- text bind(project_dir, 'selected_child.top_pixel')
720
- foreground @default_foreground
721
- font stat_font
650
+
651
+ on_item_expanded {
652
+ expand_navigation_expand_bar_height
722
653
  }
723
- }
724
654
 
725
- on_item_collapsed {
726
- collapse_navigation_expand_bar_height
727
- }
728
-
729
- on_item_expanded {
730
- expand_navigation_expand_bar_height
731
655
  }
732
-
733
- }
734
-
735
- @tab_folder_sash_form = sash_form {
736
- layout_data(:fill, :fill, true, true) {
737
- width_hint 768
738
- height_hint 576
739
- minimum_width 768
740
- minimum_height 576
741
- }
742
- orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
743
- self.current_tab_folder = self.tab_folder1 = tab_folder {
744
- drag_source(DND::DROP_COPY) {
745
- transfer [TextTransfer.getInstance].to_java(Transfer)
746
- event_data = nil
747
- on_drag_start {|event|
748
- Gladiator.drag = true
749
- tab_folder = event.widget.getControl
750
- tab_item = tab_folder.getItem(Point.new(event.x, event.y))
751
- event_data = tab_item.getData('file_path')
752
- }
753
- on_drag_set_data { |event|
754
- event.data = event_data
755
- }
656
+
657
+ @tab_folder_sash_form = sash_form {
658
+ layout_data(:fill, :fill, true, true) {
659
+ width_hint 768
660
+ height_hint 576
661
+ minimum_width 168
662
+ minimum_height 176
756
663
  }
664
+ orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
665
+ self.current_tab_folder = self.tab_folder1 = text_editor_group_tab_folder
666
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder) # TODO see if we could get rid of this as it seems redundant
757
667
  }
758
- @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
759
668
  }
669
+ } # end of sash form
670
+ }
671
+ end
672
+ }
673
+
674
+ def text_editor_group_tab_folder
675
+ tab_folder { |tab_folder_proxy|
676
+ on_widget_selected {
677
+ self.current_tab_folder = tab_folder_proxy
678
+ selected_file = @current_tab_item&.swt_tab_item&.getData('file')
679
+ if selected_file
680
+ project_dir.selected_child = selected_file
681
+ @current_tab_item = @current_tab_folder.swt_widget.getSelection.first.getData('proxy')
682
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item) #TODO see if we can get rid of this as it seems redundant
683
+ @current_text_editor = @current_tab_item.swt_tab_item.getData('text_editor')
684
+ @current_text_editor&.load_content
685
+ @current_text_editor&.text_widget&.setFocus
686
+ end
687
+ }
688
+ drag_source(DND::DROP_COPY) {
689
+ transfer [TextTransfer.getInstance].to_java(Transfer)
690
+ event_data = nil
691
+ on_drag_start {|event|
692
+ Gladiator.drag = true
693
+ tab_folder = event.widget.getControl
694
+ tab_item = tab_folder.getItem(Point.new(event.x, event.y))
695
+ event_data = tab_item&.getData('file_path')
760
696
  }
761
- } # end of sash form
697
+ on_drag_set_data { |event|
698
+ event.data = event_data
699
+ }
700
+ }
762
701
  }
763
- }
702
+ end
764
703
 
765
704
  def load_config_ignore_paths
766
705
  # TODO eliminate duplication with load_config
@@ -770,8 +709,6 @@ module Glimmer
770
709
  @config = YAML.load(config_yaml)
771
710
  project_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
772
711
  project_dir.ignore_paths ||= ['packages', 'tmp']
773
- else
774
- @loaded_config = true
775
712
  end
776
713
  end
777
714
 
@@ -785,22 +722,10 @@ module Glimmer
785
722
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
786
723
  open_file_paths2 = @config[:open_file_paths2]
787
724
  self.split_orientation = (swt(@config[:split_orientation]) rescue swt(:horizontal)) if @config[:split_orientation]
788
- if @progress_bar_shell.nil?
789
- @progress_bar_shell = shell(body_root, :title) {
790
- text 'Gladiator'
791
- fill_layout(:vertical) {
792
- margin_width 15
793
- margin_height 15
794
- spacing 5
795
- }
796
- label(:center) {
797
- text "Opening Last Open Files"
798
- font height: 20
799
- }
800
- # @progress_bar = progress_bar(:horizontal, :indeterminate)
801
- }
725
+ if @progress_shell.nil?
726
+ @progress_shell = progress_shell(gladiator: self, progress_text: 'Opening Last Open Files')
802
727
  async_exec {
803
- @progress_bar_shell.open
728
+ @progress_shell.open
804
729
  }
805
730
  end
806
731
  open_file_paths1.to_a.each do |file_path|
@@ -842,8 +767,8 @@ module Glimmer
842
767
  }
843
768
  async_exec {
844
769
  Gladiator.drag = false
845
- @progress_bar_shell&.close
846
- @progress_bar_shell = nil
770
+ @progress_shell&.close
771
+ @progress_shell = nil
847
772
  @loaded_config = true
848
773
  }
849
774
  }
@@ -861,16 +786,16 @@ module Glimmer
861
786
  end
862
787
 
863
788
  def save_config
864
- return if !@loaded_config || body_root.disposed?
789
+ return if !@loaded_config || body_root&.disposed?
865
790
  child = project_dir.selected_child
866
791
  return if child.nil?
867
792
  tab_folder1 = @tab_folder1 || @current_tab_folder
868
793
  tab_folder2 = @tab_folder2
869
- open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
870
- open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
794
+ open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}.reject {|path| path.to_s.strip.empty?}
795
+ open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}.reject {|path| path.to_s.strip.empty?}
871
796
  split_orientation_value = split_orientation == swt(:horizontal) ? 'horizontal' : (split_orientation == swt(:vertical) ? 'vertical' : nil)
872
797
  @config = {
873
- selected_child_path: child.path,
798
+ selected_child_path: child.nil? ? open_file_paths1&.first&.path : child.path,
874
799
  split_orientation: split_orientation_value,
875
800
  caret_position: child.caret_position,
876
801
  top_pixel: child.top_pixel,
@@ -885,7 +810,7 @@ module Glimmer
885
810
  config_yaml = YAML.dump(@config)
886
811
  ::File.write(@config_file_path, config_yaml) unless config_yaml.to_s.empty?
887
812
  rescue => e
888
- puts e.full_message
813
+ Glimmer::Config.logger.error {e.full_message}
889
814
  end
890
815
 
891
816
  def navigate_to_next_tab_folder
@@ -988,27 +913,16 @@ module Glimmer
988
913
  def open_project
989
914
  selected_directory = directory_dialog.open
990
915
  return if selected_directory.nil?
991
- @progress_bar_shell = shell(body_root, :title) {
992
- text 'Gladiator'
993
- fill_layout(:vertical) {
994
- margin_width 15
995
- margin_height 15
996
- spacing 5
997
- }
998
- label(:center) {
999
- text "Opening Project: #{::File.basename(selected_directory)}"
1000
- font height: 20
1001
- }
1002
- # @progress_bar = progress_bar(:horizontal, :indeterminate)
1003
- }
916
+ @progress_shell = progress_shell(gladiator: self, progress_text: "Opening Project: #{::File.basename(selected_directory)}")
1004
917
  async_exec {
1005
- @progress_bar_shell.open
918
+ @progress_shell.open
1006
919
  }
1007
920
  async_exec {
1008
921
  gladiator(project_dir_path: selected_directory) {
1009
922
  on_swt_show {
1010
- @progress_bar_shell.close
1011
- @progress_bar_shell = nil
923
+ body_root.close if app_mode?
924
+ @progress_shell.close
925
+ @progress_shell = nil
1012
926
  }
1013
927
  }.open if selected_directory
1014
928
  }
@@ -1033,29 +947,22 @@ module Glimmer
1033
947
  label {
1034
948
  layout_data :fill, :fill, true, true
1035
949
  background :white
1036
- text "Gladiator v#{VERSION}\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
950
+ text "Gladiator v#{VERSION} (Beta)\n\n#{LICENSE}\n\nGladiator icon made by Freepik from www.flaticon.com"
1037
951
  }
1038
952
  }.open
1039
953
  end
1040
954
 
1041
955
  def handle_display_shortcut(key_event)
1042
956
  if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'f'
1043
- find_action = lambda do
1044
- if current_text_editor&.text_widget&.getSelectionText && current_text_editor&.text_widget&.getSelectionText&.size.to_i > 0
1045
- find_text.swt_widget.setText current_text_editor.text_widget.getSelectionText
1046
- end
1047
- find_text.swt_widget.selectAll
1048
- find_text.swt_widget.setFocus
1049
- end
1050
- if @navigation_expand_item.swt_expand_item.get_expanded
1051
- find_action.call
1052
- else
957
+ if !@navigation_expand_item.swt_expand_item.get_expanded
958
+ expand_navigation_expand_bar_height
1053
959
  @navigation_expand_item.swt_expand_item.set_expanded true
1054
- async_exec {
1055
- body_root.pack_same_size
1056
- find_action.call
1057
- }
1058
960
  end
961
+ if current_text_editor&.text_widget&.getSelectionText && current_text_editor&.text_widget&.getSelectionText&.size.to_i > 0
962
+ find_text.swt_widget.setText current_text_editor.text_widget.getSelectionText
963
+ end
964
+ find_text.swt_widget.selectAll
965
+ find_text.swt_widget.setFocus
1059
966
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
1060
967
  Clipboard.copy(project_dir.selected_child.path)
1061
968
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
@@ -1092,16 +999,18 @@ module Glimmer
1092
999
  # async_exec { current_text_editor&.text_widget&.setFocus }
1093
1000
  end
1094
1001
  end
1095
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
1002
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']' || Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :ctrl) && key_event.keyCode == swt(:page_down)
1096
1003
  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
1097
1004
  current_text_editor&.text_widget&.setFocus
1098
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == '['
1005
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == '[' || Glimmer::SWT::SWTProxy.include?(key_event.stateMask, :ctrl) && key_event.keyCode == swt(:page_up)
1099
1006
  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
1100
1007
  current_text_editor&.text_widget&.setFocus
1101
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == ']'
1008
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, CONTROL_KEY) && extract_char(key_event) == ']'
1102
1009
  navigate_to_next_tab_folder
1103
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == '['
1010
+ key_event.doit = false
1011
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, CONTROL_KEY) && extract_char(key_event) == '['
1104
1012
  navigate_to_previous_tab_folder
1013
+ key_event.doit = false
1105
1014
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
1106
1015
  current_tab_folder.swt_widget.setSelection(0) if current_tab_folder.swt_widget.getItemCount >= 1
1107
1016
  current_text_editor&.text_widget&.setFocus