glimmer-cs-gladiator 0.2.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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