glimmer-cs-gladiator 0.3.1 → 0.5.2

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.
@@ -14,216 +14,127 @@ module Glimmer
14
14
  # Gladiator (Glimmer Editor)
15
15
  class Gladiator
16
16
  include Glimmer::UI::CustomShell
17
-
17
+
18
+ APP_ROOT = ::File.expand_path('../../../..', __FILE__)
19
+ # TODO make sure COMMAND_KEY doesn't clash on Linux/Windows for CMD+CTRL shortcuts
18
20
  COMMAND_KEY = OS.mac? ? :command : :ctrl
19
21
 
20
22
  class << self
21
23
  attr_accessor :drag_and_drop
22
24
  attr_accessor :drag
23
25
  end
24
-
26
+
25
27
  ## Add options like the following to configure CustomShell by outside consumers
26
28
  #
27
29
  # options :title, :background_color
28
30
  # option :width, 320
29
31
  # option :height, 240
32
+ option :project_dir_path
30
33
 
34
+ def project_dir
35
+ @project_dir ||= Dir.new(project_dir_path)
36
+ end
37
+
38
+ attr_reader :find_text, :tab_folder1, :tab_folder2, :filter_text, :rename_in_progress, :line_number_text, :file_tree
39
+ attr_accessor :split_orientation, :current_tab_item, :current_tab_folder, :current_text_editor
40
+
31
41
  ## Uncomment before_body block to pre-initialize variables to use in body
32
42
  #
33
43
  #
34
44
  before_body {
45
+ # TODO consider doing loading project files after displaying the GUI instead of holding it up before
46
+ project_dir #pre-initialize directory
47
+ at_exit do
48
+ project_dir.selected_child&.write_raw_dirty_content
49
+ end
35
50
  Display.setAppName('Gladiator')
36
- @display = display {
37
- on_swt_keydown { |key_event|
38
- if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'f'
39
- if @text_editor&.text_widget&.getSelectionText && @text_editor&.text_widget&.getSelectionText&.size.to_i > 0
40
- @find_text.swt_widget.setText @text_editor.text_widget.getSelectionText
41
- end
42
- @find_text.swt_widget.selectAll
43
- @find_text.swt_widget.setFocus
44
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
45
- Clipboard.copy(Dir.local_dir.selected_child.path)
46
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
47
- Dir.local_dir.selected_child.find_previous
48
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'w'
49
- @tab_folder.swt_widget.getItems.each do |tab_item|
50
- Dir.local_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
51
- tab_item.getData('proxy')&.dispose
52
- end
53
- close_tab_folder
54
- @tab_item = @text_editor = Dir.local_dir.selected_child = nil
55
- @filter_text.swt_widget.selectAll
56
- @filter_text.swt_widget.setFocus
57
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :alt) && extract_char(key_event) == 'w'
58
- other_tab_items.each do |tab_item|
59
- Dir.local_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
60
- tab_item.getData('proxy')&.dispose
61
- end
62
- elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'w'
63
- if selected_tab_item
64
- Dir.local_dir.selected_child_path_history.delete(Dir.local_dir.selected_child.path)
65
- selected_tab_item.getData('proxy')&.dispose
66
- close_tab_folder
67
- if selected_tab_item.nil?
68
- @tab_item = @text_editor = Dir.local_dir.selected_child = nil
69
- @filter_text.swt_widget.selectAll
70
- @filter_text.swt_widget.setFocus
71
- else
72
- @text_editor&.text_widget&.setFocus
73
- end
74
- end
75
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
76
- @tab_folder.swt_widget.setSelection((@tab_folder.swt_widget.getSelectionIndex() + 1) % @tab_folder.swt_widget.getItemCount) if @tab_folder.swt_widget.getItemCount > 0
77
- @text_editor&.text_widget&.setFocus
78
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == '['
79
- @tab_folder.swt_widget.setSelection((@tab_folder.swt_widget.getSelectionIndex() - 1) % @tab_folder.swt_widget.getItemCount) if @tab_folder.swt_widget.getItemCount > 0
80
- @text_editor&.text_widget&.setFocus
81
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == ']'
82
- if @tab_folder2
83
- if @tab_folder == @tab_folder1
84
- @tab_folder = @tab_folder2
85
- else
86
- @tab_folder = @tab_folder1
87
- end
88
- @tab_item = @tab_folder.swt_widget.getData('selected_tab_item')
89
- Dir.local_dir.selected_child = @tab_item&.swt_tab_item&.getData('file')
90
- @tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
91
- end
92
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == '['
93
- if @tab_folder2
94
- if @tab_folder == @tab_folder2
95
- @tab_folder = @tab_folder1
96
- else
97
- @tab_folder = @tab_folder2
98
- end
99
- @tab_item = @tab_folder.swt_widget.getData('selected_tab_item')
100
- Dir.local_dir.selected_child = @tab_item&.swt_tab_item&.getData('file')
101
- @tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
102
- end
103
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
104
- @tab_folder.swt_widget.setSelection(0) if @tab_folder.swt_widget.getItemCount >= 1
105
- @text_editor&.text_widget&.setFocus
106
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '2'
107
- @tab_folder.swt_widget.setSelection(1) if @tab_folder.swt_widget.getItemCount >= 2
108
- @text_editor&.text_widget&.setFocus
109
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '3'
110
- @tab_folder.swt_widget.setSelection(2) if @tab_folder.swt_widget.getItemCount >= 3
111
- @text_editor&.text_widget&.setFocus
112
- @tab_folder.swt_widget.setSelection(3) if @tab_folder.swt_widget.getItemCount >= 4
113
- @text_editor&.text_widget&.setFocus
114
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '5'
115
- @tab_folder.swt_widget.setSelection(4) if @tab_folder.swt_widget.getItemCount >= 5
116
- @text_editor&.text_widget&.setFocus
117
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '4'
118
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '6'
119
- @tab_folder.swt_widget.setSelection(5) if @tab_folder.swt_widget.getItemCount >= 6
120
- @text_editor&.text_widget&.setFocus
121
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '7'
122
- @tab_folder.swt_widget.setSelection(6) if @tab_folder.swt_widget.getItemCount >= 7
123
- @text_editor&.text_widget&.setFocus
124
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '8'
125
- @tab_folder.swt_widget.setSelection(7) if @tab_folder.swt_widget.getItemCount >= 8
126
- @text_editor&.text_widget&.setFocus
127
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '9'
128
- @tab_folder.swt_widget.setSelection(@tab_folder.swt_widget.getItemCount - 1) if @tab_folder.swt_widget.getItemCount > 0
129
- @text_editor&.text_widget&.setFocus
130
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'g'
131
- Dir.local_dir.selected_child.find_next
132
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'l'
133
- @line_number_text.swt_widget.selectAll
134
- @line_number_text.swt_widget.setFocus
135
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'r'
136
- @filter_text.swt_widget.selectAll
137
- @filter_text.swt_widget.setFocus
138
- elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 't'
139
- select_tree_item unless @rename_in_progress
140
- @tree.swt_widget.setFocus
141
- elsif key_event.keyCode == swt(:esc)
142
- if @text_editor
143
- Dir.local_dir.selected_child_path = @text_editor.file.path
144
- @text_editor&.text_widget&.setFocus
145
- end
146
- end
51
+ # make sure the display events are only hooked once if multiple gladiators are created
52
+ unless defined?(@@display)
53
+ @@display = display {
54
+ on_swt_keydown { |key_event|
55
+ focused_gladiator = display.focus_control.shell&.get_data('custom_shell')
56
+ focused_gladiator.handle_display_shortcut(key_event) if !focused_gladiator.nil? && key_event.widget.shell == focused_gladiator&.swt_widget
57
+ }
147
58
  }
148
- }
59
+ end
149
60
 
150
- local_dir = ENV['LOCAL_DIR'] || '.'
151
- @config_file_path = ::File.join(local_dir, '.gladiator')
61
+ @split_orientation = swt(:horizontal)
62
+ @config_file_path = ::File.join(project_dir.path, '.gladiator')
152
63
  @config = {}
153
64
  load_config_ignore_paths
154
- # Dir.local_dir.all_children # pre-caches children
65
+ # project_dir.all_children # pre-caches children
155
66
  }
156
67
 
157
68
  ## Uncomment after_body block to setup observers for widgets in body
158
69
  #
159
70
  after_body {
160
- observe(Dir.local_dir, 'children') do
71
+ observe(project_dir, 'children') do
161
72
  select_tree_item unless @rename_in_progress
162
73
  end
163
- observe(Dir.local_dir, 'selected_child') do |selected_file|
74
+ observe(project_dir, 'selected_child') do |selected_file|
164
75
  if selected_file
165
76
  if Gladiator.drag && !@tab_folder2
166
- @tab_folder1 = @tab_folder
77
+ @tab_folder1 = @current_tab_folder
167
78
  @tab_folder_sash_form.content {
168
- @tab_folder = @tab_folder2 = tab_folder
169
- @tab_folder.swt_widget.setData('proxy', @tab_folder)
79
+ @current_tab_folder = @tab_folder2 = tab_folder
80
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
170
81
  }
171
82
  end
172
83
  select_tree_item unless @rename_in_progress
173
84
  found_tab_item = selected_tab_item
174
85
  if found_tab_item
175
- @tab_folder.swt_widget.setSelection(found_tab_item)
176
- @tab_item = found_tab_item.getData('proxy')
177
- @text_editor = found_tab_item.getData('text_editor')
178
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
86
+ @current_tab_folder.swt_widget.setSelection(found_tab_item)
87
+ @current_tab_item = found_tab_item.getData('proxy')
88
+ @current_text_editor = found_tab_item.getData('text_editor')
89
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
179
90
  elsif selected_file
180
- @tab_folder.content {
181
- @tab_item = tab_item { |the_tab_item|
91
+ @current_tab_folder.content {
92
+ @current_tab_item = tab_item { |the_tab_item|
182
93
  text selected_file.name
183
94
  fill_layout :horizontal
184
- @text_editor = the_text_editor = text_editor(file: selected_file)
185
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
186
- @text_editor.text_proxy.content {
95
+ @current_text_editor = the_text_editor = text_editor(project_dir: project_dir, file: selected_file)
96
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
97
+ @current_text_editor.text_proxy.content {
187
98
  on_focus_gained {
188
99
  tab_folder = the_text_editor.swt_widget.getParent.getParent
189
- @tab_folder = tab_folder.getData('proxy')
190
- @tab_item = the_tab_item
191
- @text_editor = the_text_editor
192
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
193
- @tab_folder.swt_widget.setSelection(@tab_item.swt_tab_item)
194
- Dir.local_dir.selected_child = @tab_item.swt_tab_item.getData('file')
100
+ @current_tab_folder = tab_folder.getData('proxy')
101
+ @current_tab_item = the_tab_item
102
+ @current_text_editor = the_text_editor
103
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
104
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
105
+ project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
195
106
  }
196
107
  }
197
108
  on_swt_show {
198
- @tab_item = the_tab_item
199
- @text_editor = the_text_editor
200
- @tab_folder = @tab_item.swt_widget.getParent.getData('proxy')
201
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
202
- @tab_folder.swt_widget.setSelection(@tab_item.swt_tab_item)
203
- Dir.local_dir.selected_child = selected_file
109
+ @current_tab_item = the_tab_item
110
+ @current_text_editor = the_text_editor
111
+ @current_tab_folder = @current_tab_item.swt_widget.getParent.getData('proxy')
112
+ @current_tab_folder.swt_widget.setData('selected_tab_item', @current_tab_item)
113
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
114
+ project_dir.selected_child = selected_file
204
115
  async_exec {
205
- @text_editor&.text_widget&.setFocus
116
+ @current_text_editor&.text_widget&.setFocus
206
117
  }
207
118
  }
208
119
  }
209
- @tab_item.swt_tab_item.setData('file_path', selected_file.path)
210
- @tab_item.swt_tab_item.setData('file', selected_file)
211
- @tab_item.swt_tab_item.setData('text_editor', @text_editor)
212
- @tab_item.swt_tab_item.setData('proxy', @tab_item)
213
- }
214
- @tab_folder.swt_widget.setSelection(@tab_item.swt_tab_item)
120
+ @current_tab_item.swt_tab_item.setData('file_path', selected_file.path)
121
+ @current_tab_item.swt_tab_item.setData('file', selected_file)
122
+ @current_tab_item.swt_tab_item.setData('text_editor', @current_text_editor)
123
+ @current_tab_item.swt_tab_item.setData('proxy', @current_tab_item)
124
+ }
125
+ @current_tab_folder.swt_widget.setSelection(@current_tab_item.swt_tab_item)
215
126
  body_root.pack_same_size
216
127
  end
217
- @text_editor&.text_widget&.setFocus
128
+ @current_text_editor&.text_widget&.setFocus
218
129
  end
219
130
  end
220
- observe(Dir.local_dir, 'selected_child') do
131
+ observe(project_dir, 'selected_child') do
221
132
  save_config
222
133
  end
223
- observe(Dir.local_dir, 'selected_child.caret_position') do
134
+ observe(project_dir, 'selected_child.caret_position') do
224
135
  save_config
225
136
  end
226
- observe(Dir.local_dir, 'selected_child.top_index') do
137
+ observe(project_dir, 'selected_child.top_pixel') do
227
138
  save_config
228
139
  end
229
140
  load_config
@@ -234,20 +145,20 @@ module Glimmer
234
145
  #
235
146
  body {
236
147
  shell {
237
- text "Gladiator - #{::File.expand_path(Dir.local_dir.path)}"
148
+ text "Gladiator - #{::File.expand_path(project_dir.path)}"
238
149
  minimum_size 520, 250
239
- size 1440, 900
150
+ size 1440, 900
240
151
  grid_layout(2, false)
241
152
  on_swt_show {
242
153
  swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
243
- swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
154
+ swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
244
155
  @loaded_config = true
245
156
  }
246
157
  on_swt_close {
247
- Dir.local_dir.selected_child&.write_dirty_content
158
+ project_dir.selected_child&.write_dirty_content
248
159
  }
249
160
  on_widget_disposed {
250
- Dir.local_dir.selected_child&.write_dirty_content
161
+ project_dir.selected_child&.write_dirty_content
251
162
  }
252
163
  on_control_resized {
253
164
  save_config
@@ -256,8 +167,69 @@ module Glimmer
256
167
  save_config
257
168
  }
258
169
  on_shell_deactivated {
259
- @text_editor&.file&.write_dirty_content
260
- }
170
+ @current_text_editor&.file&.write_dirty_content
171
+ }
172
+
173
+ menu_bar {
174
+ menu {
175
+ text '&File'
176
+
177
+ menu_item {
178
+ text 'New &Scratchpad'
179
+ on_widget_selected {
180
+ begin
181
+ project_dir.selected_child_path = ''
182
+ rescue => e
183
+ pd e
184
+ end
185
+ }
186
+ }
187
+ menu_item(:separator)
188
+ menu_item {
189
+ text 'Open &Project...'
190
+ on_widget_selected {
191
+ open_project
192
+ }
193
+ }
194
+ }
195
+ menu {
196
+ text '&View'
197
+ menu {
198
+ text '&Split'
199
+ menu_item(:radio) {
200
+ text '&Horizontal'
201
+ selection bind(self, :split_orientation, on_read: ->(o) { o == swt(:horizontal)}, on_write: ->(b) { b ? swt(:horizontal) : swt(:vertical)})
202
+ }
203
+ menu_item(:radio) {
204
+ text '&Vertical'
205
+ selection bind(self, :split_orientation, on_read: ->(o) { o == swt(:vertical)}, on_write: ->(b) { b ? swt(:vertical) : swt(:horizontal)})
206
+ }
207
+ }
208
+ }
209
+ menu {
210
+ text '&Run'
211
+ # menu_item {
212
+ # text 'Launch Glimmer &App'
213
+ # on_widget_selected {
214
+ # parent_path = project_dir.path
215
+ ## current_directory_name = ::File.basename(parent_path)
216
+ ## assumed_shell_script = ::File.join(parent_path, 'bin', current_directory_name)
217
+ ## 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)
218
+ ## load assumed_shell_script
219
+ # FileUtils.cd(parent_path) do
220
+ # system 'glimmer run'
221
+ # end
222
+ # }
223
+ # }
224
+ menu_item {
225
+ text '&Ruby'
226
+ on_widget_selected {
227
+ project_dir.selected_child.run
228
+ }
229
+ }
230
+ }
231
+ }
232
+
261
233
  composite {
262
234
  grid_layout 1, false
263
235
  layout_data(:fill, :fill, false, true) {
@@ -265,16 +237,16 @@ module Glimmer
265
237
  }
266
238
  @filter_text = text {
267
239
  layout_data :fill, :center, true, false
268
- text bind(Dir.local_dir, 'filter')
240
+ text bind(project_dir, 'filter')
269
241
  on_key_pressed { |key_event|
270
- if key_event.keyCode == swt(:tab) ||
271
- key_event.keyCode == swt(:cr) ||
242
+ if key_event.keyCode == swt(:tab) ||
243
+ key_event.keyCode == swt(:cr) ||
272
244
  key_event.keyCode == swt(:arrow_up) ||
273
245
  key_event.keyCode == swt(:arrow_down)
274
246
  @list.swt_widget.select(0) if @list.swt_widget.getSelectionIndex() == -1
275
247
  @list.swt_widget.setFocus
276
248
  end
277
- }
249
+ }
278
250
  }
279
251
  composite {
280
252
  fill_layout(:vertical) {
@@ -282,15 +254,15 @@ module Glimmer
282
254
  }
283
255
  layout_data(:fill, :fill, true, true)
284
256
  @list = list(:border, :h_scroll, :v_scroll) {
285
- #visible bind(Dir, 'local_dir.filter') {|f| !!f}
286
- selection bind(Dir.local_dir, :filtered_path)
257
+ #visible bind(self, 'project_dir.filter') {|f| !!f}
258
+ selection bind(project_dir, :filtered_path)
287
259
  on_mouse_up {
288
- Dir.local_dir.selected_child_path = @list.swt_widget.getSelection.first
260
+ project_dir.selected_child_path = @list.swt_widget.getSelection.first
289
261
  }
290
262
  on_key_pressed { |key_event|
291
263
  if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
292
- Dir.local_dir.selected_child_path = @list.swt_widget.getSelection.first
293
- @text_editor&.text_widget&.setFocus
264
+ project_dir.selected_child_path = @list.swt_widget.getSelection.first
265
+ @current_text_editor&.text_widget&.setFocus
294
266
  end
295
267
  }
296
268
  drag_source(DND::DROP_COPY) {
@@ -300,11 +272,11 @@ module Glimmer
300
272
  list = event.widget.getControl
301
273
  event.data = list.getSelection.first
302
274
  }
303
- }
275
+ }
304
276
  }
305
- @tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
306
- #visible bind(Dir, 'local_dir.filter') {|f| !f}
307
- items bind(Dir, :local_dir), tree_properties(children: :children, text: :name)
277
+ @file_tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
278
+ #visible bind(self, 'project_dir.filter') {|f| !f}
279
+ items bind(self, :project_dir), tree_properties(children: :children, text: :name)
308
280
  drag_source(DND::DROP_COPY) {
309
281
  transfer [TextTransfer.getInstance].to_java(Transfer)
310
282
  on_drag_set_data { |event|
@@ -318,21 +290,21 @@ module Glimmer
318
290
  @open_menu_item = menu_item {
319
291
  text 'Open'
320
292
  on_widget_selected {
321
- Dir.local_dir.selected_child_path = extract_tree_item_path(@tree.swt_widget.getSelection.first)
293
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
322
294
  }
323
295
  }
324
296
  menu_item(:separator)
325
297
  menu_item {
326
298
  text 'Delete'
327
299
  on_widget_selected {
328
- tree_item = @tree.swt_widget.getSelection.first
300
+ tree_item = @file_tree.swt_widget.getSelection.first
329
301
  delete_tree_item(tree_item)
330
302
  }
331
303
  }
332
304
  menu_item {
333
305
  text 'Refresh'
334
306
  on_widget_selected {
335
- Dir.local_dir.refresh
307
+ project_dir.refresh
336
308
  }
337
309
  }
338
310
  menu_item {
@@ -355,25 +327,25 @@ module Glimmer
355
327
  }
356
328
  }
357
329
  on_swt_menudetect { |event|
358
- path = extract_tree_item_path(@tree.swt_widget.getSelection.first)
330
+ path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
359
331
  @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
360
332
  }
361
333
  on_mouse_up {
362
334
  if Gladiator.drag_and_drop
363
335
  Gladiator.drag_and_drop = false
364
336
  else
365
- Dir.local_dir.selected_child_path = extract_tree_item_path(@tree.swt_widget.getSelection&.first)
366
- @text_editor&.text_widget&.setFocus
337
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
338
+ @current_text_editor&.text_widget&.setFocus
367
339
  end
368
340
  }
369
341
  on_key_pressed { |key_event|
370
342
  if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
371
- Dir.local_dir.selected_child_path = extract_tree_item_path(@tree.swt_widget.getSelection&.first)
372
- @text_editor&.text_widget&.setFocus
343
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
344
+ @current_text_editor&.text_widget&.setFocus
373
345
  end
374
346
  }
375
347
  on_paint_control {
376
- root_item = @tree.swt_widget.getItems.first
348
+ root_item = @file_tree.swt_widget.getItems.first
377
349
  if root_item && !root_item.getExpanded
378
350
  root_item.setExpanded(true)
379
351
  end
@@ -381,10 +353,11 @@ module Glimmer
381
353
  }
382
354
  }
383
355
 
384
- @tree_editor = TreeEditor.new(@tree.swt_widget);
385
- @tree_editor.horizontalAlignment = swt(:left);
386
- @tree_editor.grabHorizontal = true;
387
- @tree_editor.minimumHeight = 20;
356
+ # TODO see if you could replace some of this with Glimmer DSL/API syntax
357
+ @file_tree_editor = TreeEditor.new(@file_tree.swt_widget);
358
+ @file_tree_editor.horizontalAlignment = swt(:left);
359
+ @file_tree_editor.grabHorizontal = true;
360
+ @file_tree_editor.minimumHeight = 20;
388
361
 
389
362
  }
390
363
  @editor_container = composite {
@@ -392,17 +365,21 @@ module Glimmer
392
365
  layout_data :fill, :fill, true, true
393
366
  composite {
394
367
  grid_layout 3, false
395
-
368
+
396
369
  # row 1
397
-
370
+
371
+ label {
372
+ text 'File:'
373
+ }
374
+
398
375
  @file_path_label = styled_text(:none) {
399
376
  layout_data(:fill, :fill, true, false) {
400
- horizontal_span 3
377
+ horizontal_span 2
401
378
  }
402
379
  background color(:widget_background)
403
380
  editable false
404
381
  caret nil
405
- text bind(Dir.local_dir, 'selected_child.path')
382
+ text bind(project_dir, 'selected_child.path')
406
383
  on_mouse_up {
407
384
  @file_path_label.swt_widget.selectAll
408
385
  }
@@ -410,9 +387,9 @@ module Glimmer
410
387
  @file_path_label.swt_widget.setSelection(0, 0)
411
388
  }
412
389
  }
413
-
390
+
414
391
  # row 2
415
-
392
+
416
393
  label {
417
394
  text 'Line:'
418
395
  }
@@ -420,18 +397,18 @@ module Glimmer
420
397
  layout_data(:fill, :fill, true, false) {
421
398
  minimum_width 400
422
399
  }
423
- text bind(Dir.local_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
400
+ text bind(project_dir, 'selected_child.line_number', on_read: :to_s, on_write: :to_i)
424
401
  on_key_pressed { |key_event|
425
402
  if key_event.keyCode == swt(:cr)
426
- @text_editor&.text_widget&.setFocus
403
+ @current_text_editor&.text_widget&.setFocus
427
404
  end
428
405
  }
429
406
  on_verify_text { |event|
430
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
407
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
431
408
  }
432
409
  }
433
410
  label
434
-
411
+
435
412
  # row 3
436
413
 
437
414
  label {
@@ -441,34 +418,34 @@ module Glimmer
441
418
  layout_data(:fill, :center, true, false) {
442
419
  minimum_width 400
443
420
  }
444
- text bind(Dir.local_dir, 'selected_child.find_text')
421
+ text bind(project_dir, 'selected_child.find_text')
445
422
  on_key_pressed { |key_event|
446
423
  if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
447
- Dir.local_dir.selected_child.case_sensitive = !Dir.local_dir.selected_child.case_sensitive
448
- Dir.local_dir.selected_child&.find_next
424
+ project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
425
+ project_dir.selected_child&.find_next
449
426
  end
450
427
  if key_event.keyCode == swt(:cr)
451
- Dir.local_dir.selected_child&.find_next
428
+ project_dir.selected_child&.find_next
452
429
  end
453
430
  }
454
431
  }
455
432
  composite {
456
433
  row_layout
457
434
  button(:check) {
458
- selection bind(Dir.local_dir, 'selected_child.case_sensitive')
435
+ selection bind(project_dir, 'selected_child.case_sensitive')
459
436
  on_key_pressed { |key_event|
460
437
  if key_event.keyCode == swt(:cr)
461
- Dir.local_dir.selected_child&.find_next
438
+ project_dir.selected_child&.find_next
462
439
  end
463
- }
440
+ }
464
441
  }
465
442
  label {
466
443
  text 'Case-sensitive'
467
444
  }
468
445
  }
469
-
446
+
470
447
  # row 4
471
-
448
+
472
449
  label {
473
450
  text 'Replace:'
474
451
  }
@@ -476,14 +453,14 @@ module Glimmer
476
453
  layout_data(:fill, :fill, true, false) {
477
454
  minimum_width 300
478
455
  }
479
- text bind(Dir.local_dir, 'selected_child.replace_text')
480
- on_focus_gained {
481
- Dir.local_dir.selected_child&.ensure_find_next
456
+ text bind(project_dir, 'selected_child.replace_text')
457
+ on_focus_gained {
458
+ project_dir.selected_child&.ensure_find_next
482
459
  }
483
460
  on_key_pressed { |key_event|
484
461
  if key_event.keyCode == swt(:cr)
485
- if Dir.local_dir.selected_child
486
- Command.do(Dir.local_dir.selected_child, :replace_next!)
462
+ if project_dir.selected_child
463
+ Command.do(project_dir.selected_child, :replace_next!)
487
464
  end
488
465
  end
489
466
  }
@@ -496,7 +473,8 @@ module Glimmer
496
473
  height_hint 480
497
474
  }
498
475
  sash_width 10
499
- @tab_folder = tab_folder {
476
+ orientation bind(self, :split_orientation)
477
+ @current_tab_folder = tab_folder {
500
478
  drag_source(DND::DROP_COPY) {
501
479
  transfer [TextTransfer.getInstance].to_java(Transfer)
502
480
  event_data = nil
@@ -511,7 +489,7 @@ module Glimmer
511
489
  }
512
490
  }
513
491
  }
514
- @tab_folder.swt_widget.setData('proxy', @tab_folder)
492
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
515
493
  }
516
494
  }
517
495
  }
@@ -523,89 +501,96 @@ module Glimmer
523
501
  config_yaml = ::File.read(@config_file_path)
524
502
  return if config_yaml.to_s.strip.empty?
525
503
  @config = YAML.load(config_yaml)
526
- Dir.local_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
527
- Dir.local_dir.ignore_paths ||= ['packages', 'tmp']
504
+ project_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
505
+ project_dir.ignore_paths ||= ['packages', 'tmp']
528
506
  else
529
507
  @loaded_config = true
530
508
  end
531
509
  end
532
-
510
+
533
511
  def load_config
534
512
  if ::File.exists?(@config_file_path)
535
513
  config_yaml = ::File.read(@config_file_path)
536
514
  return if config_yaml.to_s.strip.empty?
537
515
  @config = YAML.load(config_yaml)
538
- Dir.local_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
539
- Dir.local_dir.ignore_paths ||= ['packages', 'tmp']
516
+ project_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
517
+ project_dir.ignore_paths ||= ['packages', 'tmp']
540
518
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
541
519
  open_file_paths2 = @config[:open_file_paths2]
542
520
  open_file_paths1.to_a.each do |file_path|
543
- Dir.local_dir.selected_child_path = file_path
521
+ project_dir.selected_child_path = file_path
544
522
  end
523
+ # TODO replace the next line with one that selects the visible tab
524
+ project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path] && open_file_paths1.to_a.include?(@config[:selected_child_path])
545
525
  Gladiator.drag = true
546
526
  open_file_paths2.to_a.each do |file_path|
547
- Dir.local_dir.selected_child_path = file_path
527
+ project_dir.selected_child_path = file_path
548
528
  end
529
+ # TODO replace the next line with one that selects the visible tab
530
+ project_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path] && open_file_paths2.to_a.include?(@config[:selected_child_path])
549
531
  Gladiator.drag = false
550
- Dir.local_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
551
- Dir.local_dir.selected_child&.caret_position = Dir.local_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
552
- Dir.local_dir.selected_child&.top_index = @config[:top_index].to_i if @config[:top_index]
532
+ project_dir.selected_child&.caret_position = project_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
533
+ project_dir.selected_child&.top_pixel = @config[:top_pixel].to_i if @config[:top_pixel]
553
534
  else
554
535
  @loaded_config = true
555
536
  end
556
537
  end
557
-
538
+
558
539
  def save_config
559
540
  return unless @loaded_config
560
- child = Dir.local_dir.selected_child
541
+ child = project_dir.selected_child
561
542
  return if child.nil?
562
- tab_folder1 = @tab_folder1 || @tab_folder
543
+ tab_folder1 = @tab_folder1 || @current_tab_folder
563
544
  tab_folder2 = @tab_folder2
564
- open_file_paths1 = tab_folder1&.swt_widget&.items&.to_a.map {|i| i.get_data('file_path')}
565
- open_file_paths2 = tab_folder2&.swt_widget&.items&.to_a.map {|i| i.get_data('file_path')}
545
+ open_file_paths1 = tab_folder1&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
546
+ open_file_paths2 = tab_folder2&.swt_widget&.items.to_a.map {|i| i.get_data('file_path')}
566
547
  @config = {
567
548
  selected_child_path: child.path,
568
549
  caret_position: child.caret_position,
569
- top_index: child.top_index,
550
+ top_pixel: child.top_pixel,
570
551
  shell_width: swt_widget&.getBounds&.width,
571
552
  shell_height: swt_widget&.getBounds&.height,
572
553
  shell_x: swt_widget&.getBounds&.x,
573
554
  shell_y: swt_widget&.getBounds&.y,
574
555
  open_file_paths1: open_file_paths1,
575
556
  open_file_paths2: open_file_paths2,
576
- ignore_paths: Dir.local_dir.ignore_paths
557
+ ignore_paths: project_dir.ignore_paths
577
558
  }
578
559
  config_yaml = YAML.dump(@config)
579
560
  ::File.write(@config_file_path, config_yaml) unless config_yaml.to_s.empty?
580
561
  rescue => e
581
562
  puts e.full_message
582
563
  end
583
-
564
+
584
565
  def close_tab_folder
585
566
  if @tab_folder2 && !selected_tab_item
586
- if @tab_folder == @tab_folder2
567
+ if @current_tab_folder == @tab_folder2
587
568
  @tab_folder2.swt_widget.dispose
588
- @tab_folder = @tab_folder1
569
+ @current_tab_folder = @tab_folder1
589
570
  else
590
571
  @tab_folder1.swt_widget.dispose
591
- @tab_folder = @tab_folder1 = @tab_folder2
572
+ @current_tab_folder = @tab_folder1 = @tab_folder2
592
573
  end
593
- @tab_folder2 = nil
594
-
595
- @tab_item = @tab_folder.swt_widget.getData('selected_tab_item')
596
- @text_editor = @tab_item.swt_tab_item.getData('text_editor')
597
- Dir.local_dir.selected_child = @tab_item.swt_tab_item.getData('file')
598
-
574
+ @tab_folder2 = nil
575
+
576
+ @current_tab_item = @current_tab_folder.swt_widget.getData('selected_tab_item')
577
+ @current_text_editor = @current_tab_item.swt_tab_item.getData('text_editor')
578
+ project_dir.selected_child = @current_tab_item.swt_tab_item.getData('file')
579
+
599
580
  body_root.pack_same_size
600
581
  end
601
582
  end
602
-
583
+
584
+ def find_tab_item(file_path)
585
+ @current_tab_folder.swt_widget.getItems.detect { |ti| ti.getData('file_path') == file_path }
586
+ end
587
+
603
588
  def selected_tab_item
604
- @tab_folder.swt_widget.getItems.detect { |ti| ti.getData('file_path') == Dir.local_dir.selected_child&.path }
589
+ find_tab_item(project_dir.selected_child&.path)
605
590
  end
606
591
 
607
592
  def other_tab_items
608
- @tab_folder.swt_widget.getItems.reject { |ti| ti.getData('file_path') == Dir.local_dir.selected_child&.path }
593
+ @current_tab_folder.swt_widget.getItems.reject { |ti| ti.getData('file_path') == project_dir.selected_child&.path }
609
594
  end
610
595
 
611
596
  def extract_tree_item_path(tree_item)
@@ -613,14 +598,14 @@ module Glimmer
613
598
  if tree_item.getParentItem
614
599
  ::File.join(extract_tree_item_path(tree_item.getParentItem), tree_item.getText)
615
600
  else
616
- Dir.local_dir.path
601
+ project_dir.path
617
602
  end
618
603
  end
619
-
604
+
620
605
  def select_tree_item
621
- return unless Dir.local_dir.selected_child&.name
622
- tree_items_to_select = @tree.depth_first_search { |ti| ti.getData.path == Dir.local_dir.selected_child.path }
623
- @tree.swt_widget.setSelection(tree_items_to_select)
606
+ return unless project_dir.selected_child&.name
607
+ tree_items_to_select = @file_tree.depth_first_search { |ti| ti.getData.path == project_dir.selected_child.path }
608
+ @file_tree.swt_widget.setSelection(tree_items_to_select)
624
609
  end
625
610
 
626
611
  def delete_tree_item(tree_item)
@@ -628,27 +613,23 @@ module Glimmer
628
613
  file = tree_item.getData
629
614
  parent_path = ::File.dirname(file.path)
630
615
  file.delete! # TODO consider supporting command undo/redo
631
- Dir.local_dir.refresh(async: false)
632
- parent_tree_item = @tree.depth_first_search {|ti| ti.getData.path == parent_path}.first
633
- @tree.swt_widget.showItem(parent_tree_item)
616
+ project_dir.refresh(async: false)
617
+ parent_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == parent_path}.first
618
+ @file_tree.swt_widget.showItem(parent_tree_item)
634
619
  parent_tree_item.setExpanded(true)
635
- # TODO close text editor tab
636
- # if file.is_a?(::File)
637
- # close tab
638
- # end
620
+ # TODO close text editor tab
621
+ found_tab_item = find_tab_item(file.path)
622
+ if found_tab_item
623
+ project_dir.selected_child_path_history.delete(found_tab_item.getData('file_path'))
624
+ found_tab_item.getData('proxy')&.dispose
625
+ end
639
626
  rescue => e
640
- puts e.full_message
641
- end
642
-
643
- def rename_selected_tree_item
644
- Dir.local_dir.pause_refresh
645
- tree_item = @tree.swt_widget.getSelection.first
646
- rename_tree_item(tree_item)
627
+ puts e.full_message
647
628
  end
648
-
629
+
649
630
  def add_new_directory_to_selected_tree_item
650
- Dir.local_dir.pause_refresh
651
- tree_item = @tree.swt_widget.getSelection.first
631
+ project_dir.pause_refresh
632
+ tree_item = @file_tree.swt_widget.getSelection.first
652
633
  directory_path = extract_tree_item_path(tree_item)
653
634
  return if directory_path.nil?
654
635
  if !::Dir.exist?(directory_path)
@@ -657,15 +638,15 @@ module Glimmer
657
638
  end
658
639
  new_directory_path = ::File.expand_path(::File.join(directory_path, 'new_directory'))
659
640
  FileUtils.mkdir_p(new_directory_path)
660
- Dir.local_dir.refresh(async: false, force: true)
661
- new_tree_item = @tree.depth_first_search {|ti| ti.getData.path == new_directory_path}.first
662
- @tree.swt_widget.showItem(new_tree_item)
663
- rename_tree_item(new_tree_item, true)
641
+ project_dir.refresh(async: false, force: true)
642
+ new_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == new_directory_path}.first
643
+ @file_tree.swt_widget.showItem(new_tree_item)
644
+ rename_tree_item(new_tree_item)
664
645
  end
665
-
646
+
666
647
  def add_new_file_to_selected_tree_item
667
- Dir.local_dir.pause_refresh
668
- tree_item = @tree.swt_widget.getSelection.first
648
+ project_dir.pause_refresh
649
+ tree_item = @file_tree.swt_widget.getSelection.first
669
650
  directory_path = extract_tree_item_path(tree_item)
670
651
  if !::Dir.exist?(directory_path)
671
652
  tree_item = tree_item.getParentItem
@@ -674,24 +655,47 @@ module Glimmer
674
655
  new_file_path = ::File.expand_path(::File.join(directory_path, 'new_file'))
675
656
  FileUtils.touch(new_file_path)
676
657
  # TODO look into refreshing only the parent directory to avoid slowdown
677
- Dir.local_dir.refresh(async: false, force: true)
678
- new_tree_item = @tree.depth_first_search {|ti| ti.getData.path == new_file_path}.first
679
- @tree.swt_widget.showItem(new_tree_item)
658
+ project_dir.refresh(async: false, force: true)
659
+ new_tree_item = @file_tree.depth_first_search {|ti| ti.getData.path == new_file_path}.first
660
+ @file_tree.swt_widget.showItem(new_tree_item)
680
661
  rename_tree_item(new_tree_item, true)
681
662
  end
682
-
683
- def rename_tree_item(tree_item, open_afterwards = false)
684
- @tree.edit_tree_item(
663
+
664
+ def rename_selected_tree_item
665
+ project_dir.pause_refresh
666
+ tree_item = @file_tree.swt_widget.getSelection.first
667
+ rename_tree_item(tree_item)
668
+ end
669
+
670
+ def rename_tree_item(tree_item, new_file = false)
671
+ original_file = tree_item.getData
672
+ current_file = project_dir.selected_child_path == original_file.path
673
+ found_tab_item = find_tab_item(original_file.path)
674
+ found_text_editor = found_tab_item&.getData('text_editor')
675
+ @file_tree.edit_tree_item(
685
676
  tree_item,
686
677
  after_write: -> (edited_tree_item) {
687
678
  file = edited_tree_item.getData
688
679
  file_path = file.path
689
- # TODO rename file in tab title
690
- Dir.local_dir.selected_child_path = file_path if open_afterwards
691
- Dir.local_dir.resume_refresh
680
+ file.name
681
+ if new_file
682
+ project_dir.selected_child_path = file_path
683
+ else
684
+ found_text_editor&.file = file
685
+ found_tab_item&.setData('file', file)
686
+ found_tab_item&.setData('file_path', file.path)
687
+ found_tab_item&.setText(file.name)
688
+ body_root.pack_same_size
689
+ if current_file
690
+ project_dir.selected_child_path = file_path
691
+ else
692
+ selected_tab_item&.getData('text_editor')&.text_widget&.setFocus
693
+ end
694
+ end
695
+ project_dir.resume_refresh
692
696
  },
693
697
  after_cancel: -> {
694
- Dir.local_dir.resume_refresh
698
+ project_dir.resume_refresh
695
699
  }
696
700
  )
697
701
  end
@@ -701,5 +705,154 @@ module Glimmer
701
705
  rescue => e
702
706
  nil
703
707
  end
708
+
709
+ def open_project
710
+ selected_directory = directory_dialog.open
711
+ @progress_bar_shell = shell(body_root) {
712
+ text 'Opening Project'
713
+ fill_layout(:vertical) {
714
+ margin_width 15
715
+ margin_height 15
716
+ spacing 5
717
+ }
718
+ label(:center) {
719
+ text "Opening Project: #{::File.basename(selected_directory)}"
720
+ font height: 20
721
+ }
722
+ # @progress_bar = progress_bar(:horizontal, :indeterminate)
723
+ }
724
+ Thread.new {
725
+ async_exec {
726
+ @progress_bar_shell.open
727
+ }
728
+ }
729
+ Thread.new {
730
+ async_exec {
731
+ gladiator(project_dir_path: selected_directory) {
732
+ on_swt_show {
733
+ @progress_bar_shell.close
734
+ }
735
+ }.open if selected_directory
736
+ }
737
+ }
738
+ end
739
+
740
+ def handle_display_shortcut(key_event)
741
+ if key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'f'
742
+ if current_text_editor&.text_widget&.getSelectionText && current_text_editor&.text_widget&.getSelectionText&.size.to_i > 0
743
+ find_text.swt_widget.setText current_text_editor.text_widget.getSelectionText
744
+ end
745
+ find_text.swt_widget.selectAll
746
+ find_text.swt_widget.setFocus
747
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'c'
748
+ Clipboard.copy(project_dir.selected_child.path)
749
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'g'
750
+ project_dir.selected_child.find_previous
751
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'p'
752
+ open_project
753
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 's'
754
+ project_dir.selected_child_path = '' # scratchpad
755
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'w'
756
+ current_tab_folder.swt_widget.getItems.each do |tab_item|
757
+ project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
758
+ tab_item.getData('proxy')&.dispose
759
+ end
760
+ close_tab_folder
761
+ self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
762
+ filter_text.swt_widget.selectAll
763
+ filter_text.swt_widget.setFocus
764
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :alt) && extract_char(key_event) == 'w'
765
+ other_tab_items.each do |tab_item|
766
+ project_dir.selected_child_path_history.delete(tab_item.getData('file_path'))
767
+ tab_item.getData('proxy')&.dispose
768
+ end
769
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'w'
770
+ if selected_tab_item
771
+ project_dir.selected_child_path_history.delete(project_dir.selected_child.path)
772
+ selected_tab_item.getData('proxy')&.dispose
773
+ close_tab_folder
774
+ if selected_tab_item.nil?
775
+ self.current_tab_item = self.current_text_editor = project_dir.selected_child = nil
776
+ filter_text.swt_widget.selectAll
777
+ filter_text.swt_widget.setFocus
778
+ else
779
+ current_text_editor&.text_widget&.setFocus
780
+ end
781
+ end
782
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == 'o'
783
+ self.split_orientation = split_orientation == swt(:horizontal) ? swt(:vertical) : swt(:horizontal)
784
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == ']'
785
+ 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
786
+ current_text_editor&.text_widget&.setFocus
787
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :shift) && extract_char(key_event) == '['
788
+ 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
789
+ current_text_editor&.text_widget&.setFocus
790
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == ']'
791
+ if tab_folder2
792
+ if current_tab_folder == tab_folder1
793
+ self.current_tab_folder = tab_folder2
794
+ else
795
+ self.current_tab_folder = tab_folder1
796
+ end
797
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
798
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
799
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
800
+ end
801
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY, :ctrl) && extract_char(key_event) == '['
802
+ if tab_folder2
803
+ if current_tab_folder == tab_folder2
804
+ self.current_tab_folder = tab_folder1
805
+ else
806
+ self.current_tab_folder = tab_folder2
807
+ end
808
+ self.current_tab_item = current_tab_folder.swt_widget.getData('selected_tab_item')
809
+ self.project_dir.selected_child = current_tab_item&.swt_tab_item&.getData('file')
810
+ current_tab_item&.swt_tab_item&.getData('text_editor')&.text_widget&.setFocus
811
+ end
812
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '1'
813
+ current_tab_folder.swt_widget.setSelection(0) if current_tab_folder.swt_widget.getItemCount >= 1
814
+ current_text_editor&.text_widget&.setFocus
815
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '2'
816
+ current_tab_folder.swt_widget.setSelection(1) if current_tab_folder.swt_widget.getItemCount >= 2
817
+ current_text_editor&.text_widget&.setFocus
818
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '3'
819
+ current_tab_folder.swt_widget.setSelection(2) if current_tab_folder.swt_widget.getItemCount >= 3
820
+ current_text_editor&.text_widget&.setFocus
821
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '4'
822
+ current_tab_folder.swt_widget.setSelection(3) if current_tab_folder.swt_widget.getItemCount >= 4
823
+ current_text_editor&.text_widget&.setFocus
824
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '5'
825
+ current_tab_folder.swt_widget.setSelection(4) if current_tab_folder.swt_widget.getItemCount >= 5
826
+ current_text_editor&.text_widget&.setFocus
827
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '6'
828
+ current_tab_folder.swt_widget.setSelection(5) if current_tab_folder.swt_widget.getItemCount >= 6
829
+ current_text_editor&.text_widget&.setFocus
830
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '7'
831
+ current_tab_folder.swt_widget.setSelection(6) if current_tab_folder.swt_widget.getItemCount >= 7
832
+ current_text_editor&.text_widget&.setFocus
833
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '8'
834
+ current_tab_folder.swt_widget.setSelection(7) if current_tab_folder.swt_widget.getItemCount >= 8
835
+ current_text_editor&.text_widget&.setFocus
836
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == '9'
837
+ current_tab_folder.swt_widget.setSelection(current_tab_folder.swt_widget.getItemCount - 1) if current_tab_folder.swt_widget.getItemCount > 0
838
+ current_text_editor&.text_widget&.setFocus
839
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'g'
840
+ project_dir.selected_child.find_next
841
+ elsif Glimmer::SWT::SWTProxy.include?(key_event.stateMask, COMMAND_KEY) && extract_char(key_event) == 'l'
842
+ line_number_text.swt_widget.selectAll
843
+ line_number_text.swt_widget.setFocus
844
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 'r'
845
+ filter_text.swt_widget.selectAll
846
+ filter_text.swt_widget.setFocus
847
+ elsif key_event.stateMask == swt(COMMAND_KEY) && extract_char(key_event) == 't'
848
+ select_tree_item unless rename_in_progress
849
+ file_tree.swt_widget.setFocus
850
+ elsif key_event.keyCode == swt(:esc)
851
+ if current_text_editor
852
+ project_dir.selected_child_path = current_text_editor.file.path
853
+ current_text_editor&.text_widget&.setFocus
854
+ end
855
+ end
856
+ end
704
857
  end
705
- end
858
+ end