glimmer-cs-gladiator 0.6.4 → 0.8.0

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