glimmer-cs-gladiator 0.6.4 → 0.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3cd0eb6cc355224d16ee58053749632dcc0efe0c94911fcb13b9902f179640a7
4
- data.tar.gz: 9f0d696fb116eb29c10ac749c9107263cecd93013189d56f722ba45e48787508
3
+ metadata.gz: d57a77e5086a7cab8a622d21e6ef4d4089d544e6c8d28f709fb19405523db22e
4
+ data.tar.gz: 8e36f9855229b227658b2873cfece17ea0fd214f447b5cb561d3126f05234f28
5
5
  SHA512:
6
- metadata.gz: 73f6aabe6c03813764d3adfd8f4778467e01b8f7a30710a207f8b05f4b58a87cb85455600f11b652bf61f95fa096a3ed892abf6eb204c0db6311e2a8c85415b8
7
- data.tar.gz: 3cab30bb643329cc6a3402836d85d48726b11fd4afe6c8d134fe983baba8a3d40eaeccf1fec868631fbe2819a463ff4fcc6c14c656eebe44e67a69d694b0deee
6
+ metadata.gz: b4795a89aab52db16e32c47b06fdf8800dff22418de7b07c5421704d9be285fdb8c1c230e3d9a068a74aaf85637e7c17a34c74fe3298f75d24c874e6d108b0c9
7
+ data.tar.gz: 8b811a0f1278860b79c334fdebb71eb0c1116e94cfceb028b87e03bc7d06fc904fef4549f789cc6a79e643b2509058268dd6e39623a1823279796d2b4138f5d8
@@ -1,5 +1,21 @@
1
1
  # Change Log
2
2
 
3
+ ## 0.7.0
4
+
5
+ - Upgrade to glimmer-dsl-swt v4.18.0.0
6
+ - Implement sash form for separator between file area and editing area to make resizable
7
+ - Change shortcut for open project from CMD+SHIFT+P to CMD+O
8
+ - Unsplit pane Menu Item / Keyboard Shortcut (CMD+SHIFT+U)
9
+ - Maximize Split Pane Size Menu Item / Keyboard Shortcut (CMD+SHIFT+M)
10
+ - Reset Split Pane Menu Item / Keyboard Shortcut (CMD+SHIFT+M again while maximized or CMD+SHIFT+P to reset split widths)
11
+ - Maximize Editor Menu Item / Keyboard Shortcut (CMD+CTRL+M)
12
+ - Reset Editor Menu Item / Keyboard Shortcut (CMD+CTRL+M again while maximized or CMD+CTRL+R to reset all sizes)
13
+ - Make CMD R and CMD T shortcuts show the file lookup/file explorer if collapsed (just like CMD + F shows navigation area)
14
+ - Display Accelerators (keyboard shortcuts) on Mac Menu Items
15
+ - Show exception dialog on error when invoking Run -> Ruby
16
+ - Fix issue with creating a new directory in a different project from the main one open
17
+ - Fix issue with quitting gladiator when multiple projects are open requiring multiple presses of CMD+Q
18
+
3
19
  ## 0.6.4
4
20
 
5
21
  - Ensured Gladiator logo in the about menu has a white background
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-cs-gladiator-logo.svg' height=85 /> Gladiator 0.6.4 - [Ugliest Text Editor Ever](https://www.reddit.com/r/ruby/comments/hgve8k/gladiator_glimmer_editor_ugliest_text_editor_ever/)
1
+ # <img src='https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-cs-gladiator-logo.svg' height=85 /> Gladiator 0.7.0 - [Ugliest Text Editor Ever](https://www.reddit.com/r/ruby/comments/hgve8k/gladiator_glimmer_editor_ugliest_text_editor_ever/)
2
2
  ## [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=40 /> Glimmer Custom Shell](https://github.com/AndyObtiva/glimmer-dsl-swt#custom-shell-gem)
3
3
  [![Gem Version](https://badge.fury.io/rb/glimmer-cs-gladiator.svg)](http://badge.fury.io/rb/glimmer-cs-gladiator)
4
4
 
@@ -13,6 +13,8 @@ I leave building truly professional text editors to software tooling experts who
13
13
 
14
14
  Gladiator currently supports the following text editing features (including keyboard shortcuts with Mac CMD=CTRL on Windows/Linux)
15
15
 
16
+ ![Gladiator Demo](images/glimmer-gladiator.gif)
17
+
16
18
  ### Text Editor
17
19
 
18
20
  - Text Editor with Colored Ruby Syntax Highlighting
@@ -47,8 +49,18 @@ Gladiator currently supports the following text editing features (including keyb
47
49
 
48
50
  ### Menus
49
51
 
50
- - File Menu to Open Project (CMD+SHIFT+P) and open Scratchpad for running arbitrary Ruby/Glimmer code without saving to disk (CMD+SHIFT+S)
51
- - View Menu to Split Pane & Change Split Orientation to Horizontal/Vertical (CMD+SHIFT+O)
52
+ - File Menu:
53
+ - Open Project (CMD+O)
54
+ - Quit Project (CMD+ALT+Q)
55
+ - New Scratchpad for running arbitrary Ruby/Glimmer code without saving to disk (CMD+SHIFT+S)
56
+ - View Menu
57
+ - Split Pane
58
+ - Orientation change to Horizontal/Vertical (CMD+SHIFT+O)
59
+ - Maximize Pane: maximizes current pane in split pane to take entire area (CMD+SHIFT+M)
60
+ - Reset Panes: resets pane sizes if split width/height was adjusted (CMD+SHIFT+P)
61
+ - Unsplit: closes the second pane (CMD+SHIFT+U)
62
+ - Maximize Editor: maximizes editor area to hide file lookup list and file explorer tree (CMD+CTRL+M)
63
+ - Reset All: resizes sizes of all areas in the editor (CMD+CTRL+R)
52
64
  - Run Menu to run Ruby code (CMD+SHIFT+R)
53
65
 
54
66
  ### Watch External Changes
@@ -70,9 +82,9 @@ Gladiator currently supports the following text editing features (including keyb
70
82
 
71
83
  ## Pre-requisites
72
84
 
73
- - [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) (JRuby Desktop Development GUI Framework): '>= 4.17.2.0', '< 5.0.0.0' (dependency included in Ruby gem).
74
- - [JRuby](https://www.jruby.org/download): Same version required by [Glimmer](https://github.com/AndyObtiva/glimmer-dsl-swt)
75
85
  - [JDK](https://www.oracle.com/java/technologies/javase-downloads.html): Same version required by [Glimmer](https://github.com/AndyObtiva/glimmer-dsl-swt)
86
+ - [JRuby](https://www.jruby.org/download): Same version required by [Glimmer](https://github.com/AndyObtiva/glimmer-dsl-swt)
87
+ - [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) (JRuby Desktop Development GUI Framework): '>= 4.17.2.0', '< 5.0.0.0' (dependency included in Ruby gem).
76
88
 
77
89
  ## Setup Instructions
78
90
 
@@ -138,7 +150,7 @@ To reuse Gladiator as a Glimmer Custom Shell inside another Glimmer application,
138
150
  following to the application's `Gemfile`:
139
151
 
140
152
  ```
141
- gem 'glimmer-cs-gladiator', '>= 0.6.4'
153
+ gem 'glimmer-cs-gladiator', '>= 0.7.0'
142
154
  ```
143
155
 
144
156
  Run:
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.4
1
+ 0.7.0
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: glimmer-cs-gladiator 0.6.4 ruby lib
5
+ # stub: glimmer-cs-gladiator 0.7.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "glimmer-cs-gladiator".freeze
9
- s.version = "0.6.4"
9
+ s.version = "0.7.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Andy Maleh".freeze]
14
- s.date = "2020-12-30"
14
+ s.date = "2021-01-11"
15
15
  s.description = "Gladiator (short for Glimmer Editor) is a Glimmer sample project under on-going development. It is not intended to be a full-fledged editor by any means, yet mostly a fun educational exercise in using Glimmer to build a text editor. Gladiator is also a personal tool for shaping an editor exactly the way I like. I leave building truly professional text editors to software tooling experts who would hopefully use Glimmer one day.".freeze
16
16
  s.email = "andy.am@gmail.com".freeze
17
17
  s.executables = ["gladiator".freeze]
@@ -38,20 +38,20 @@ Gem::Specification.new do |s|
38
38
  s.homepage = "http://github.com/AndyObtiva/glimmer-cs-gladiator".freeze
39
39
  s.licenses = ["MIT".freeze]
40
40
  s.rubygems_version = "3.0.6".freeze
41
- s.summary = "Gladiator (Glimmer Editor) - Glimmer Custom Shell".freeze
41
+ s.summary = "Gladiator (Glimmer Editor) - Glimmer Custom Shell - Text Editor Built in Ruby".freeze
42
42
 
43
43
  if s.respond_to? :specification_version then
44
44
  s.specification_version = 4
45
45
 
46
46
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
- s.add_runtime_dependency(%q<glimmer-dsl-swt>.freeze, [">= 4.17.10.3", "< 5.0.0.0"])
47
+ s.add_runtime_dependency(%q<glimmer-dsl-swt>.freeze, [">= 4.18.0.0", "< 5.0.0.0"])
48
48
  s.add_runtime_dependency(%q<filewatcher>.freeze, ["~> 1.1.1"])
49
49
  s.add_runtime_dependency(%q<clipboard>.freeze, ["~> 1.3.5"])
50
50
  s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
51
51
  s.add_development_dependency(%q<jeweler>.freeze, ["= 2.3.9"])
52
52
  s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
53
53
  else
54
- s.add_dependency(%q<glimmer-dsl-swt>.freeze, [">= 4.17.10.3", "< 5.0.0.0"])
54
+ s.add_dependency(%q<glimmer-dsl-swt>.freeze, [">= 4.18.0.0", "< 5.0.0.0"])
55
55
  s.add_dependency(%q<filewatcher>.freeze, ["~> 1.1.1"])
56
56
  s.add_dependency(%q<clipboard>.freeze, ["~> 1.3.5"])
57
57
  s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
@@ -59,7 +59,7 @@ Gem::Specification.new do |s|
59
59
  s.add_dependency(%q<simplecov>.freeze, [">= 0"])
60
60
  end
61
61
  else
62
- s.add_dependency(%q<glimmer-dsl-swt>.freeze, [">= 4.17.10.3", "< 5.0.0.0"])
62
+ s.add_dependency(%q<glimmer-dsl-swt>.freeze, [">= 4.18.0.0", "< 5.0.0.0"])
63
63
  s.add_dependency(%q<filewatcher>.freeze, ["~> 1.1.1"])
64
64
  s.add_dependency(%q<clipboard>.freeze, ["~> 1.3.5"])
65
65
  s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
@@ -60,7 +60,7 @@ module Glimmer
60
60
  def name=(the_name)
61
61
  self.display_path = display_path.sub(/#{Regexp.escape(@name)}$/, the_name)
62
62
  @name = the_name
63
- new_path = ::File.expand_path(display_path)
63
+ new_path = @project_dir.nil? ? ::File.expand_path(display_path) : ::File.join(project_dir.path, display_path)
64
64
  FileUtils.mv(path, new_path)
65
65
  self.path = display_path
66
66
  end
@@ -512,16 +512,11 @@ module Glimmer
512
512
  end
513
513
 
514
514
  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
515
+ if scratchpad?
516
+ eval content
517
+ else
518
+ write_dirty_content
519
+ load path
525
520
  end
526
521
  end
527
522
 
@@ -42,7 +42,7 @@ module Glimmer
42
42
  def split_orientation=(value)
43
43
  @split_orientation = value
44
44
  save_config
45
- if @loaded_config && !split_pane?
45
+ if @loaded_config && !split_pane? && !value.nil?
46
46
  Gladiator.drag = true
47
47
  child_path = project_dir.selected_child_path
48
48
  project_dir.selected_child = nil
@@ -56,9 +56,11 @@ module Glimmer
56
56
  pane_count = @tab_folder_sash_form&.children&.size
57
57
  pane_count && pane_count > 1
58
58
  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
59
+
60
+ attr_reader :find_text, :filter_text, :rename_in_progress, :line_number_text, :file_tree, :split_orientation
61
+ attr_accessor :current_tab_item, :current_tab_folder, :current_text_editor, :tab_folder1, :tab_folder2, :maximized_pane, :maximized_editor
62
+ alias maximized_pane? maximized_pane
63
+ alias maximized_editor? maximized_editor
62
64
 
63
65
  ## Uncomment before_body block to pre-initialize variables to use in body
64
66
  #
@@ -105,12 +107,12 @@ module Glimmer
105
107
  observe(project_dir, 'selected_child') do |selected_file|
106
108
  if selected_file
107
109
  if Gladiator.drag && !@tab_folder2
108
- @tab_folder1 = @current_tab_folder
109
- async_exec { body_root.pack_same_size}
110
+ self.tab_folder1 = current_tab_folder
110
111
  @tab_folder_sash_form.content {
111
- @current_tab_folder = @tab_folder2 = tab_folder
112
+ self.current_tab_folder = self.tab_folder2 = tab_folder {}
112
113
  @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
113
114
  }
115
+ body_root.pack_same_size
114
116
  end
115
117
  select_tree_item unless @rename_in_progress || Gladiator.startup
116
118
  found_tab_item = selected_tab_item
@@ -136,7 +138,7 @@ module Glimmer
136
138
  @current_text_editor.text_proxy.content {
137
139
  on_focus_gained {
138
140
  tab_folder = the_text_editor.swt_widget.getParent.getParent
139
- @current_tab_folder = tab_folder.getData('proxy')
141
+ self.current_tab_folder = tab_folder.getData('proxy')
140
142
  @current_tab_item = the_tab_item
141
143
  @current_text_editor = the_text_editor
142
144
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
@@ -149,13 +151,11 @@ module Glimmer
149
151
  on_swt_show {
150
152
  @current_tab_item = the_tab_item
151
153
  @current_text_editor = the_text_editor
152
- @current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
154
+ self.current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
153
155
  @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
154
156
  @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
155
157
  project_dir.selected_child = selected_file
156
- async_exec {
157
- @current_text_editor&.text_widget&.setFocus
158
- }
158
+ @current_text_editor&.text_widget&.setFocus
159
159
  }
160
160
  on_widget_disposed {
161
161
  project_dir.selected_child&.write_dirty_content
@@ -168,13 +168,21 @@ module Glimmer
168
168
  @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
169
169
  }
170
170
  @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
171
-
172
171
  body_root.pack_same_size
173
- async_exec { body_root.pack_same_size}
174
172
  end
175
173
  @current_text_editor&.text_widget&.setFocus
176
174
  end
177
175
  end
176
+ observe(self, 'maximized_pane') do
177
+ if tab_folder2
178
+ @tab_folder_sash_form.maximized_control = (current_tab_folder.swt_widget if maximized_pane?)
179
+ end
180
+ end
181
+ observe(self, 'maximized_editor') do
182
+ @file_area_and_editor_area_sash_form.maximized_control = (@editor_area_composite.swt_widget if maximized_editor?)
183
+ @navigation_expand_item.swt_expand_item.set_expanded !maximized_editor?
184
+ body_root.pack_same_size
185
+ end
178
186
  observe(project_dir, 'selected_child') do
179
187
  save_config
180
188
  end
@@ -192,7 +200,6 @@ module Glimmer
192
200
  #
193
201
  body {
194
202
  shell {
195
- grid_layout(2, false)
196
203
  text "Gladiator - #{::File.expand_path(project_dir.path)}"
197
204
  minimum_size 520, 250
198
205
  size 1440, 900
@@ -235,7 +242,7 @@ module Glimmer
235
242
  display.swt_display.system_menu.items.find {|mi| mi.id == swt(:id_quit)}.add_selection_listener {
236
243
  save_config
237
244
  project_dir.selected_child&.write_dirty_content
238
- exit(0)
245
+ display.swt_display.shells.each(&:close)
239
246
  }
240
247
  end
241
248
 
@@ -245,37 +252,91 @@ module Glimmer
245
252
 
246
253
  menu_item {
247
254
  text 'New &Scratchpad'
255
+ accelerator COMMAND_KEY, :shift, :s
248
256
  on_widget_selected {
249
- begin
250
- project_dir.selected_child_path = ''
251
- rescue => e
252
- puts e.full_message
253
- end
257
+ project_dir.selected_child_path = ''
254
258
  }
255
259
  }
256
- menu_item(:separator)
257
260
  menu_item {
258
261
  text 'Open &Project...'
262
+ accelerator COMMAND_KEY, :o
259
263
  on_widget_selected {
260
264
  open_project
261
265
  }
262
266
  }
267
+ menu_item(:separator)
268
+ menu_item {
269
+ text '&Quit Project'
270
+ accelerator COMMAND_KEY, :alt, :q
271
+ on_widget_selected {
272
+ save_config
273
+ project_dir.selected_child&.write_dirty_content
274
+ body_root.close
275
+ }
276
+ }
263
277
  }
264
278
  menu {
265
279
  text '&View'
266
280
  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) })
281
+ text '&Split Pane'
282
+ menu { |menu_proxy|
283
+ text '&Orientation'
284
+ menu_item(:radio) {
285
+ text '&Horizontal'
286
+ selection bind(self, :split_orientation,
287
+ on_read: ->(o) { split_pane? && o == swt(:horizontal) },
288
+ on_write: ->(b) { b.nil? ? nil : (b ? swt(:horizontal) : swt(:vertical)) })
289
+ }
290
+ menu_item(:radio) {
291
+ text '&Vertical'
292
+ selection bind(self, :split_orientation,
293
+ on_read: ->(o) { split_pane? && o == swt(:vertical) },
294
+ on_write: ->(b) { b.nil? ? nil : (b ? swt(:vertical) : swt(:horizontal)) })
295
+ }
273
296
  }
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) })
297
+ menu_item(:check) {
298
+ text '&Maximize Pane'
299
+ enabled bind(self, :tab_folder2)
300
+ accelerator COMMAND_KEY, :shift, :m
301
+ selection bind(self, :maximized_pane)
302
+ }
303
+ menu_item {
304
+ text 'Reset &Panes'
305
+ enabled bind(self, :tab_folder2)
306
+ accelerator COMMAND_KEY, :shift, :p
307
+ on_widget_selected {
308
+ if tab_folder2
309
+ self.maximized_pane = false
310
+ @tab_folder_sash_form.weights = [1, 1]
311
+ end
312
+ }
313
+ }
314
+ menu_item {
315
+ text '&Unsplit'
316
+ enabled bind(self, :tab_folder2)
317
+ accelerator COMMAND_KEY, :shift, :u
318
+ on_widget_selected {
319
+ if tab_folder2
320
+ self.maximized_pane = false
321
+ navigate_to_next_tab_folder if current_tab_folder != tab_folder2
322
+ close_all_tabs(tab_folder2)
323
+ self.split_orientation = nil
324
+ body_root.pack_same_size
325
+ end
326
+ }
327
+ }
328
+ }
329
+ menu_item(:check) {
330
+ text '&Maximize Editor'
331
+ accelerator COMMAND_KEY, :ctrl, :m
332
+ selection bind(self, :maximized_editor)
333
+ }
334
+ menu_item {
335
+ text '&Reset All'
336
+ accelerator COMMAND_KEY, :ctrl, :r
337
+ on_widget_selected {
338
+ self.maximized_editor = false
339
+ @file_area_and_editor_area_sash_form.weights = [1, 5]
279
340
  }
280
341
  }
281
342
  }
@@ -296,8 +357,18 @@ module Glimmer
296
357
  # }
297
358
  menu_item {
298
359
  text '&Ruby'
360
+ accelerator COMMAND_KEY, :shift, :r
299
361
  on_widget_selected {
300
- project_dir.selected_child.run
362
+ begin
363
+ project_dir.selected_child.run
364
+ rescue Exception => e
365
+ dialog {
366
+ text 'Run - Ruby - Error Encountered!'
367
+ label {
368
+ text e.full_message
369
+ }
370
+ }.open
371
+ end
301
372
  }
302
373
  }
303
374
  }
@@ -305,468 +376,461 @@ module Glimmer
305
376
  text '&Help'
306
377
  menu_item {
307
378
  text '&About'
379
+ accelerator COMMAND_KEY, :shift, :a
308
380
  on_widget_selected {
309
381
  display_about_dialog
310
382
  }
311
383
  }
312
384
  }
313
385
  }
386
+
387
+ @file_area_and_editor_area_sash_form = sash_form(:horizontal) {
388
+ weights 1, 5
314
389
 
315
- composite {
316
- grid_layout(1, false) {
317
- margin_width 0
318
- margin_height 0
319
- }
320
-
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
390
+ composite {
391
+ grid_layout(1, false) {
392
+ margin_width 0
393
+ margin_height 0
331
394
  }
332
395
 
333
- @file_lookup_expand_bar = expand_bar {
334
- layout_data :fill, :fill, true, true
335
- font height: 17, style: :bold
336
- foreground @default_foreground
396
+ @side_bar_sash_form = sash_form(:vertical) {
397
+ layout_data(:fill, :fill, true, true)
398
+ sash_width 4
337
399
 
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
400
+ resize_expand_items = lambda { |event=nil|
401
+ @file_lookup_expand_item&.swt_expand_item&.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
402
+ @file_explorer_expand_item&.swt_expand_item&.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
340
403
  }
341
404
 
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
405
+ @file_lookup_expand_bar = expand_bar {
406
+ layout_data :fill, :fill, true, true
407
+ font height: 17, style: :bold
408
+ foreground @default_foreground
409
+
410
+ on_swt_show {
411
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_bar.size.y - @file_lookup_expand_item.swt_expand_item.header_height
348
412
  }
349
- text 'File Lookup'
350
- height display.bounds.height
351
413
 
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
362
- end
414
+ on_swt_Resize(&resize_expand_items)
415
+
416
+ @file_lookup_expand_item = expand_item {
417
+ grid_layout {
418
+ margin_width 0
419
+ margin_height 0
363
420
  }
364
- }
365
-
366
- @file_lookup_list = list(:border, :h_scroll, :v_scroll) {
367
- layout_data :fill, :fill, true, true
368
- #visible bind(self, 'project_dir.filter') {|f| !!f}
369
- selection bind(project_dir, :filtered_path)
370
- foreground @default_foreground
371
- on_mouse_up {
372
- project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
421
+ text 'File Lookup'
422
+ height display.bounds.height
423
+
424
+ @filter_text = text {
425
+ layout_data :fill, :center, true, false
426
+ text bind(project_dir, 'filter')
427
+ on_key_pressed { |key_event|
428
+ if key_event.keyCode == swt(:tab) ||
429
+ key_event.keyCode == swt(:cr) ||
430
+ key_event.keyCode == swt(:arrow_up) ||
431
+ key_event.keyCode == swt(:arrow_down)
432
+ @file_lookup_list.swt_widget.select(0) if @file_lookup_list.swt_widget.getSelectionIndex() == -1
433
+ @file_lookup_list.swt_widget.setFocus
434
+ end
435
+ }
373
436
  }
374
- on_key_pressed { |key_event|
375
- if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
437
+
438
+ @file_lookup_list = list(:border, :h_scroll, :v_scroll) {
439
+ layout_data :fill, :fill, true, true
440
+ #visible bind(self, 'project_dir.filter') {|f| !!f}
441
+ selection bind(project_dir, :filtered_path)
442
+ foreground @default_foreground
443
+ on_mouse_up {
376
444
  project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
377
- @current_text_editor&.text_widget&.setFocus
378
- end
379
- }
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
445
+ }
446
+ on_key_pressed { |key_event|
447
+ if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
448
+ project_dir.selected_child_path = @file_lookup_list.swt_widget.getSelection.first
449
+ @current_text_editor&.text_widget&.setFocus
450
+ end
451
+ }
452
+ drag_source(DND::DROP_COPY) {
453
+ transfer [TextTransfer.getInstance].to_java(Transfer)
454
+ on_drag_set_data { |event|
455
+ Gladiator.drag = true
456
+ list = event.widget.getControl
457
+ event.data = list.getSelection.first
458
+ }
386
459
  }
387
460
  }
388
461
  }
389
- }
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
-
406
- }
407
-
408
- @file_explorer_expand_bar = expand_bar {
409
- layout_data :fill, :fill, true, true
410
- font height: 17, style: :bold
411
- foreground @default_foreground
462
+
463
+ on_item_collapsed { |event|
464
+ if @file_explorer_expand_item.swt_expand_item.get_expanded
465
+ @file_lookup_expand_item_height = @file_lookup_expand_item.swt_expand_item.height
466
+ @file_lookup_expand_item.swt_expand_item.height = 0
467
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
468
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
469
+ @side_bar_sash_form.weights = [@file_lookup_expand_item.swt_expand_item.header_height, @file_lookup_expand_bar_height + @file_explorer_expand_bar_height - @file_lookup_expand_item.swt_expand_item.header_height]
470
+ end
471
+ }
412
472
 
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
473
+ on_item_expanded {
474
+ @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
475
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
476
+ }
477
+
415
478
  }
416
479
 
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
480
+ @file_explorer_expand_bar = expand_bar {
481
+ layout_data :fill, :fill, true, true
482
+ font height: 17, style: :bold
483
+ foreground @default_foreground
484
+
485
+ on_swt_show {
486
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_bar.size.y - @file_explorer_expand_item.swt_expand_item.header_height
423
487
  }
424
- text 'File Explorer'
425
- height display.bounds.height
426
488
 
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
439
- }
489
+ on_swt_Resize(&resize_expand_items)
490
+
491
+ @file_explorer_expand_item = expand_item {
492
+ grid_layout {
493
+ margin_width 0
494
+ margin_height 0
440
495
  }
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)
496
+ text 'File Explorer'
497
+ height display.bounds.height
498
+
499
+ @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
500
+ layout_data :fill, :fill, true, true
501
+ #visible bind(self, 'project_dir.filter') {|f| !f}
502
+ items bind(self, :project_dir), tree_properties(children: :children, text: :name)
503
+ foreground @default_foreground
504
+ drag_source(DND::DROP_COPY) {
505
+ transfer [TextTransfer.getInstance].to_java(Transfer)
506
+ on_drag_set_data { |event|
507
+ Gladiator.drag = true
508
+ tree = event.widget.getControl
509
+ tree_item = tree.getSelection.first
510
+ event.data = tree_item.getData.path
446
511
  }
447
512
  }
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)
513
+ menu {
514
+ @open_menu_item = menu_item {
515
+ text 'Open'
516
+ on_widget_selected {
517
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
518
+ }
454
519
  }
455
- }
456
- menu_item {
457
- text 'Refresh'
458
- on_widget_selected {
459
- project_dir.refresh
520
+ menu_item(:separator)
521
+ menu_item {
522
+ text 'Delete'
523
+ on_widget_selected {
524
+ tree_item = @file_tree.swt_widget.getSelection.first
525
+ delete_tree_item(tree_item)
526
+ }
460
527
  }
461
- }
462
- menu_item {
463
- text 'Rename'
464
- on_widget_selected {
465
- rename_selected_tree_item
528
+ menu_item {
529
+ text 'Refresh'
530
+ on_widget_selected {
531
+ project_dir.refresh
532
+ }
466
533
  }
467
- }
468
- menu_item {
469
- text 'New Directory'
470
- on_widget_selected {
471
- add_new_directory_to_selected_tree_item
534
+ menu_item {
535
+ text 'Rename'
536
+ on_widget_selected {
537
+ rename_selected_tree_item
538
+ }
472
539
  }
473
- }
474
- menu_item {
475
- text 'New File'
476
- on_widget_selected {
477
- add_new_file_to_selected_tree_item
540
+ menu_item {
541
+ text 'New Directory'
542
+ on_widget_selected {
543
+ add_new_directory_to_selected_tree_item
544
+ }
545
+ }
546
+ menu_item {
547
+ text 'New File'
548
+ on_widget_selected {
549
+ add_new_file_to_selected_tree_item
550
+ }
478
551
  }
479
552
  }
480
- }
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
484
- }
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
492
- }
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
498
- }
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
553
+ on_swt_menudetect { |event|
554
+ path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
555
+ @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
556
+ }
557
+ on_mouse_up {
558
+ if Gladiator.drag_and_drop
559
+ Gladiator.drag_and_drop = false
560
+ else
561
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
562
+ @current_text_editor&.text_widget&.setFocus
563
+ end
564
+ }
565
+ on_key_pressed { |key_event|
566
+ if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
567
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
568
+ @current_text_editor&.text_widget&.setFocus
569
+ end
570
+ }
571
+ on_paint_control {
572
+ root_item = @file_tree.swt_widget.getItems.first
573
+ if root_item && !root_item.getExpanded
574
+ root_item.setExpanded(true)
575
+ end
576
+ }
504
577
  }
505
578
  }
506
- }
579
+
580
+ on_item_collapsed { |event|
581
+ if @file_lookup_expand_item.swt_expand_item.get_expanded
582
+ @file_explorer_expand_item_height = @file_explorer_expand_item.swt_expand_item.height
583
+ @file_explorer_expand_item.swt_expand_item.height = 0
584
+ @file_explorer_expand_bar_height = @file_explorer_expand_bar.swt_widget.size.y
585
+ @file_lookup_expand_bar_height = @file_lookup_expand_bar.swt_widget.size.y
586
+ @side_bar_sash_form.weights = [@file_explorer_expand_bar_height + @file_explorer_expand_bar_height - @file_explorer_expand_item.swt_expand_item.header_height, @file_explorer_expand_item.swt_expand_item.header_height]
587
+ end
588
+ }
507
589
 
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]
590
+ on_item_expanded {
591
+ @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height
592
+ @side_bar_sash_form.weights = [@file_lookup_expand_bar_height, @file_explorer_expand_bar_height]
593
+ }
594
+
521
595
  }
522
-
596
+
523
597
  }
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
598
+
599
+ # TODO see if you could replace some of this with Glimmer DSL/API syntax
600
+ @file_tree_editor = TreeEditor.new(@file_tree.swt_widget);
601
+ @file_tree_editor.horizontalAlignment = swt(:left);
602
+ @file_tree_editor.grabHorizontal = true;
603
+ @file_tree_editor.minimumHeight = 20;
604
+
539
605
  }
540
- layout_data :fill, :fill, true, true
541
606
 
542
- @navigation_expand_bar = expand_bar {
543
- layout_data :fill, :top, true, false
544
- font height: 17, style: :bold
545
- foreground @default_foreground
607
+ @editor_area_composite = composite {
608
+ grid_layout(1, false) {
609
+ margin_width 0
610
+ margin_height 0
611
+ }
546
612
 
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
- }
613
+ @navigation_expand_bar = expand_bar {
614
+ layout_data :fill, :top, true, false
615
+ font height: 17, style: :bold
616
+ foreground @default_foreground
617
+
618
+ @navigation_expand_item = expand_item {
619
+ text 'Navigation'
620
+ height 115
564
621
 
565
- @file_path_label = styled_text(:none) {
566
- layout_data(:fill, :center, true, false) {
567
- horizontal_span 2
622
+ grid_layout(5, false) {
623
+ margin_right 5
568
624
  }
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
625
+
626
+ stat_font = {name: 'Consolas', height: OS.mac? ? 15 : 12}
627
+
628
+ # row 1
629
+
630
+ label {
631
+ layout_data(:left, :center, false, false)
632
+ text 'File:'
633
+ foreground @default_foreground
576
634
  }
577
- on_focus_lost {
578
- @file_path_label.swt_widget.setSelection(0, 0)
635
+
636
+ @file_path_label = styled_text(:none) {
637
+ layout_data(:fill, :center, true, false) {
638
+ horizontal_span 2
639
+ }
640
+ background color(:widget_background)
641
+ foreground @default_foreground
642
+ editable false
643
+ caret nil
644
+ text bind(project_dir, 'selected_child.path')
645
+ on_mouse_up {
646
+ @file_path_label.swt_widget.selectAll
647
+ }
648
+ on_focus_lost {
649
+ @file_path_label.swt_widget.setSelection(0, 0)
650
+ }
579
651
  }
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
-
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
652
+
653
+ label {
654
+ layout_data(:left, :center, false, false)
655
+ text 'Caret Position:'
656
+ foreground @default_foreground
604
657
  }
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
658
+ label(:right) {
659
+ layout_data(:fill, :center, true, false)
660
+ text bind(project_dir, 'selected_child.caret_position')
661
+ foreground @default_foreground
662
+ font stat_font
612
663
  }
613
- on_verify_text { |event|
614
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
664
+
665
+ # row 2
666
+
667
+ label {
668
+ layout_data(:left, :center, false, false)
669
+ text 'Line:'
670
+ foreground @default_foreground
615
671
  }
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
672
+ @line_number_text = text {
673
+ layout_data(:fill, :center, true, false) {
674
+ minimum_width 400
675
+ }
676
+ text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
677
+ foreground @default_foreground
678
+ font stat_font
679
+ on_key_pressed { |key_event|
680
+ if key_event.keyCode == swt(:cr)
681
+ @current_text_editor&.text_widget&.setFocus
682
+ end
683
+ }
684
+ on_verify_text { |event|
685
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
686
+ }
641
687
  }
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
688
+ label # filler
689
+
690
+ label {
691
+ layout_data(:left, :center, false, false)
692
+ text 'Line Position:'
693
+ foreground @default_foreground
653
694
  }
654
- }
655
- composite {
656
- layout_data(:left, :center, true, false)
657
- row_layout {
658
- margin_width 0
659
- margin_height 0
695
+ label(:right) {
696
+ layout_data(:fill, :center, true, false)
697
+ text bind(project_dir, 'selected_child.line_position')
698
+ foreground @default_foreground
699
+ font stat_font
660
700
  }
661
- button(:check) {
662
- selection bind(project_dir, 'selected_child.case_sensitive')
701
+
702
+ # row 3
703
+
704
+ label {
705
+ layout_data(:left, :center, false, false)
706
+ text 'Find:'
707
+ foreground @default_foreground
708
+ }
709
+ @find_text = text {
710
+ layout_data(:fill, :center, true, false) {
711
+ minimum_width 400
712
+ }
713
+ text bind(project_dir, 'selected_child.find_text')
714
+ foreground @default_foreground
715
+ font stat_font
663
716
  on_key_pressed { |key_event|
717
+ if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
718
+ project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
719
+ project_dir.selected_child&.find_next
720
+ end
664
721
  if key_event.keyCode == swt(:cr)
665
722
  project_dir.selected_child&.find_next
666
723
  end
667
724
  }
668
725
  }
726
+ composite {
727
+ layout_data(:left, :center, true, false)
728
+ row_layout {
729
+ margin_width 0
730
+ margin_height 0
731
+ }
732
+ button(:check) {
733
+ selection bind(project_dir, 'selected_child.case_sensitive')
734
+ on_key_pressed { |key_event|
735
+ if key_event.keyCode == swt(:cr)
736
+ project_dir.selected_child&.find_next
737
+ end
738
+ }
739
+ }
740
+ label {
741
+ text 'Case-sensitive'
742
+ foreground @default_foreground
743
+ }
744
+ }
745
+
669
746
  label {
670
- text 'Case-sensitive'
747
+ layout_data(:left, :center, false, false)
748
+ text 'Selection Count:'
671
749
  foreground @default_foreground
672
750
  }
673
- }
674
-
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
- }
686
-
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
751
+ label(:right) {
752
+ layout_data(:fill, :center, true, false)
753
+ text bind(project_dir, 'selected_child.selection_count')
754
+ foreground @default_foreground
755
+ font stat_font
697
756
  }
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
757
+
758
+ # row 4
759
+
760
+ label {
761
+ layout_data(:left, :center, false, false)
762
+ text 'Replace:'
763
+ foreground @default_foreground
703
764
  }
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!)
765
+ @replace_text = text {
766
+ layout_data(:fill, :center, true, false) {
767
+ minimum_width 400
768
+ }
769
+ text bind(project_dir, 'selected_child.replace_text')
770
+ foreground @default_foreground
771
+ font stat_font
772
+ on_focus_gained {
773
+ project_dir.selected_child&.ensure_find_next
774
+ }
775
+ on_key_pressed { |key_event|
776
+ if key_event.keyCode == swt(:cr)
777
+ if project_dir.selected_child
778
+ Command.do(project_dir.selected_child, :replace_next!)
779
+ end
708
780
  end
709
- end
781
+ }
782
+ }
783
+ label # filler
784
+ label {
785
+ layout_data(:left, :center, false, false)
786
+ text 'Top Pixel:'
787
+ foreground @default_foreground
788
+ }
789
+ label(:right) {
790
+ layout_data(:fill, :center, true, false)
791
+ text bind(project_dir, 'selected_child.top_pixel')
792
+ foreground @default_foreground
793
+ font stat_font
710
794
  }
711
795
  }
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
796
+
797
+ on_item_collapsed {
798
+ collapse_navigation_expand_bar_height
723
799
  }
724
- }
725
800
 
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
801
+ on_item_expanded {
802
+ expand_navigation_expand_bar
731
803
  }
804
+
732
805
  }
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
806
+
807
+ @tab_folder_sash_form = sash_form {
808
+ layout_data(:fill, :fill, true, true) {
809
+ width_hint 768
810
+ height_hint 576
811
+ minimum_width 768
812
+ minimum_height 576
738
813
  }
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
814
+ orientation bind(self, :split_orientation) {|value| async_exec { body_root.pack_same_size}; value}
815
+ self.current_tab_folder = self.tab_folder1 = tab_folder {
816
+ drag_source(DND::DROP_COPY) {
817
+ transfer [TextTransfer.getInstance].to_java(Transfer)
818
+ event_data = nil
819
+ on_drag_start {|event|
820
+ Gladiator.drag = true
821
+ tab_folder = event.widget.getControl
822
+ tab_item = tab_folder.getItem(Point.new(event.x, event.y))
823
+ event_data = tab_item.getData('file_path')
824
+ }
825
+ on_drag_set_data { |event|
826
+ event.data = event_data
827
+ }
764
828
  }
765
829
  }
830
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
766
831
  }
767
- @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
768
832
  }
769
- }
833
+ } # end of sash form
770
834
  }
771
835
  }
772
836
 
@@ -792,7 +856,7 @@ module Glimmer
792
856
  project_dir.ignore_paths ||= ['packages', 'tmp']
793
857
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
794
858
  open_file_paths2 = @config[:open_file_paths2]
795
- self.split_orientation = swt(@config[:split_orientation] || :horizontal) rescue swt(:horizontal)
859
+ self.split_orientation = (swt(@config[:split_orientation]) rescue swt(:horizontal)) if @config[:split_orientation]
796
860
  if @progress_bar_shell.nil?
797
861
  @progress_bar_shell = shell(body_root, :title) {
798
862
  text 'Gladiator'
@@ -869,16 +933,17 @@ module Glimmer
869
933
  end
870
934
 
871
935
  def save_config
872
- return unless @loaded_config
936
+ return if !@loaded_config || body_root.disposed?
873
937
  child = project_dir.selected_child
874
938
  return if child.nil?
875
939
  tab_folder1 = @tab_folder1 || @current_tab_folder
876
940
  tab_folder2 = @tab_folder2
877
941
  open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
878
942
  open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
943
+ split_orientation_value = split_orientation == swt(:horizontal) ? 'horizontal' : (split_orientation == swt(:vertical) ? 'vertical' : nil)
879
944
  @config = {
880
945
  selected_child_path: child.path,
881
- split_orientation: split_orientation == swt(:horizontal) ? 'horizontal' : 'vertical',
946
+ split_orientation: split_orientation_value,
882
947
  caret_position: child.caret_position,
883
948
  top_pixel: child.top_pixel,
884
949
  shell_width: swt_widget&.getBounds&.width,
@@ -894,23 +959,70 @@ module Glimmer
894
959
  rescue => e
895
960
  puts e.full_message
896
961
  end
962
+
963
+ def navigate_to_next_tab_folder
964
+ if tab_folder2
965
+ self.maximized_pane = false
966
+ if current_tab_folder == tab_folder1
967
+ self.current_tab_folder = tab_folder2
968
+ else
969
+ self.current_tab_folder = tab_folder1
970
+ end
971
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
972
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
973
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
974
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
975
+ end
976
+ end
897
977
 
898
- def close_tab_folder
978
+ def navigate_to_previous_tab_folder
979
+ if tab_folder2
980
+ self.maximized_pane = false
981
+ if current_tab_folder == tab_folder2
982
+ self.current_tab_folder = tab_folder1
983
+ else
984
+ self.current_tab_folder = tab_folder2
985
+ end
986
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
987
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
988
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
989
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
990
+ end
991
+ end
992
+
993
+ def close_all_tabs(closing_tab_folder = nil)
994
+ closing_tab_folder ||= current_tab_folder
995
+ closing_tab_folder.swt_widget.getItems.each do |tab_item|
996
+ project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
997
+ tab_item.getData('proxy')&.dispose
998
+ end
999
+ close_tab_folder(closing_tab_folder)
1000
+ if self.current_tab_item.nil?
1001
+ filter_text.swt_widget.selectAll
1002
+ filter_text.swt_widget.setFocus
1003
+ end
1004
+ end
1005
+
1006
+ def close_tab_folder(closing_tab_folder = nil)
1007
+ closing_tab_folder ||= current_tab_folder
899
1008
  if @tab_folder2 && !selected_tab_item
900
- if @current_tab_folder == @tab_folder2
1009
+ if closing_tab_folder == @tab_folder2
901
1010
  @tab_folder2.swt_widget.dispose
902
- @current_tab_folder = @tab_folder1
1011
+ self.current_tab_folder = @tab_folder1
903
1012
  else
904
1013
  @tab_folder1.swt_widget.dispose
905
- @current_tab_folder = @tab_folder1 = @tab_folder2
1014
+ self.current_tab_folder = self.tab_folder1 = @tab_folder2
906
1015
  end
907
- @tab_folder2 = nil
1016
+ self.tab_folder2 = nil
1017
+ body_root.pack_same_size
908
1018
 
909
- @current_tab_item = @current_tab_folder.swt_widget.getData('selected_tab_item')
1019
+ @current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
910
1020
  @current_text_editor = @current_tab_item.swt_tab_item.getData('text_editor')
911
1021
  project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
912
-
913
- async_exec { body_root.pack_same_size }
1022
+ @current_text_editor&.text_widget&.setFocus
1023
+ async_exec { @current_text_editor&.text_widget&.setFocus }
1024
+ else
1025
+ self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
914
1026
  end
915
1027
  end
916
1028
 
@@ -925,6 +1037,23 @@ module Glimmer
925
1037
  def other_tab_items
926
1038
  @current_tab_folder.swt_widget.getItems.reject { |ti| ti.getData('file_path') == project_dir.selected_child&.path }
927
1039
  end
1040
+
1041
+ def collapse_navigation_expand_bar_height
1042
+ @navigation_expand_item_height = @navigation_expand_item.swt_expand_item.height if @navigation_expand_item.swt_expand_item.height > 0
1043
+ @navigation_expand_item.swt_expand_item.height = 0
1044
+ body_root.pack_same_size
1045
+ async_exec {
1046
+ body_root.pack_same_size
1047
+ }
1048
+ end
1049
+
1050
+ def expand_navigation_expand_bar_height
1051
+ @navigation_expand_item.swt_expand_item.height = @navigation_expand_item_height if @navigation_expand_item_height
1052
+ body_root.pack_same_size
1053
+ async_exec {
1054
+ body_root.pack_same_size
1055
+ }
1056
+ end
928
1057
 
929
1058
  def extract_tree_item_path(tree_item)
930
1059
  return if tree_item.nil?
@@ -1018,22 +1147,24 @@ module Glimmer
1018
1147
  file = edited_tree_item.getData
1019
1148
  file_path = file.path
1020
1149
  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
1150
+ if ::File.file?(file_path)
1151
+ if new_file
1030
1152
  project_dir.selected_child_path = file_path
1031
1153
  else
1032
- selected_tab_item&.getData('text_editor')&.text_widget&.setFocus
1154
+ found_text_editor&.file = file
1155
+ found_tab_item&.setData('file', file)
1156
+ found_tab_item&.setData('file_path', file.path)
1157
+ found_tab_item&.setText(file.name)
1158
+ body_root.pack_same_size
1159
+ if current_file
1160
+ project_dir.selected_child_path = file_path
1161
+ else
1162
+ selected_tab_item&.getData('text_editor')&.text_widget&.setFocus
1163
+ end
1164
+ async_exec {
1165
+ @file_tree.swt_widget.showItem(edited_tree_item)
1166
+ }
1033
1167
  end
1034
- async_exec {
1035
- @file_tree.swt_widget.showItem(edited_tree_item)
1036
- }
1037
1168
  end
1038
1169
  project_dir.resume_refresh
1039
1170
  },
@@ -1115,29 +1246,20 @@ module Glimmer
1115
1246
  find_action.call
1116
1247
  else
1117
1248
  @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
1249
  async_exec {
1120
1250
  body_root.pack_same_size
1251
+ find_action.call
1121
1252
  }
1122
- async_exec(&find_action)
1123
1253
  end
1124
1254
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
1125
1255
  Clipboard.copy(project_dir.selected_child.path)
1126
1256
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
1127
1257
  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
1258
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
1259
+ self.maximized_pane = false
1260
+ self.split_orientation = split_pane? && split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
1132
1261
  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
1262
+ close_all_tabs
1141
1263
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :alt) && extract_char(key_event) == 'w'
1142
1264
  other_tab_items.each do |tab_item|
1143
1265
  project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
@@ -1156,8 +1278,6 @@ module Glimmer
1156
1278
  current_text_editor&.text_widget&.setFocus
1157
1279
  end
1158
1280
  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
1281
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
1162
1282
  current_tab_folder.swt_widget.setSelection((current_tab_folder.swt_widget.getSelectionIndex() + 1) % current_tab_folder.swt_widget.getItemCount) if current_tab_folder.swt_widget.getItemCount > 0
1163
1283
  current_text_editor&.text_widget&.setFocus
@@ -1165,27 +1285,9 @@ module Glimmer
1165
1285
  current_tab_folder.swt_widget.setSelection((current_tab_folder.swt_widget.getSelectionIndex() - 1) % current_tab_folder.swt_widget.getItemCount) if current_tab_folder.swt_widget.getItemCount > 0
1166
1286
  current_text_editor&.text_widget&.setFocus
1167
1287
  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
1288
+ navigate_to_next_tab_folder
1178
1289
  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
1290
+ navigate_to_previous_tab_folder
1189
1291
  elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
1190
1292
  current_tab_folder.swt_widget.setSelection(0) if current_tab_folder.swt_widget.getItemCount >= 1
1191
1293
  current_text_editor&.text_widget&.setFocus
@@ -1231,6 +1333,7 @@ module Glimmer
1231
1333
  line_number_text.swt_widget.setFocus
1232
1334
  end
1233
1335
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'r'
1336
+ self.maximized_editor = false
1234
1337
  unless @file_lookup_expand_item.swt_expand_item.get_expanded
1235
1338
  @file_lookup_expand_item.swt_expand_item.set_expanded true
1236
1339
  @file_lookup_expand_item.swt_expand_item.height = @file_lookup_expand_item_height if @file_lookup_expand_item_height
@@ -1239,6 +1342,7 @@ module Glimmer
1239
1342
  filter_text.swt_widget.selectAll
1240
1343
  filter_text.swt_widget.setFocus
1241
1344
  elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 't'
1345
+ self.maximized_editor = false
1242
1346
  unless @file_explorer_expand_item.swt_expand_item.get_expanded
1243
1347
  @file_explorer_expand_item.swt_expand_item.set_expanded true
1244
1348
  @file_explorer_expand_item.swt_expand_item.height = @file_explorer_expand_item_height if @file_explorer_expand_item_height