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