glimmer-cs-gladiator 0.3.0 → 0.5.1

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,203 +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
65
  load_config_ignore_paths
154
- # Dir.local_dir.all_children # pre-caches children
66
+ # project_dir.all_children # pre-caches children
155
67
  }
156
68
 
157
69
  ## Uncomment after_body block to setup observers for widgets in body
158
70
  #
159
71
  after_body {
160
- observe(Dir.local_dir, 'children') do
72
+ observe(project_dir, 'children') do
161
73
  select_tree_item unless @rename_in_progress
162
74
  end
163
- observe(Dir.local_dir, 'selected_child') do |selected_file|
75
+ observe(project_dir, 'selected_child') do |selected_file|
164
76
  if selected_file
165
77
  if Gladiator.drag && !@tab_folder2
166
- @tab_folder1 = @tab_folder
78
+ @tab_folder1 = @current_tab_folder
167
79
  @tab_folder_sash_form.content {
168
- @tab_folder = @tab_folder2 = tab_folder
169
- @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)
170
82
  }
171
83
  end
172
84
  select_tree_item unless @rename_in_progress
173
85
  found_tab_item = selected_tab_item
174
86
  if found_tab_item
175
- @tab_folder.swt_widget.setSelection(found_tab_item)
176
- @tab_item = found_tab_item.getData('proxy')
177
- @text_editor = found_tab_item.getData('text_editor')
178
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
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)
179
91
  elsif selected_file
180
- @tab_folder.content {
181
- @tab_item = tab_item { |the_tab_item|
92
+ @current_tab_folder.content {
93
+ @current_tab_item = tab_item { |the_tab_item|
182
94
  text selected_file.name
183
95
  fill_layout :horizontal
184
- @text_editor = the_text_editor = text_editor(file: selected_file)
185
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
186
- @text_editor.text_proxy.content {
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 {
187
99
  on_focus_gained {
188
100
  tab_folder = the_text_editor.swt_widget.getParent.getParent
189
- @tab_folder = tab_folder.getData('proxy')
190
- @tab_item = the_tab_item
191
- @text_editor = the_text_editor
192
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
193
- @tab_folder.swt_widget.setSelection(@tab_item.swt_tab_item)
194
- Dir.local_dir.selected_child = @tab_item.swt_tab_item.getData('file')
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')
195
107
  }
196
108
  }
197
109
  on_swt_show {
198
- @tab_item = the_tab_item
199
- @text_editor = the_text_editor
200
- @tab_folder = @tab_item.swt_widget.getParent.getData('proxy')
201
- @tab_folder.swt_widget.setData('selected_tab_item', @tab_item)
202
- @tab_folder.swt_widget.setSelection(@tab_item.swt_tab_item)
203
- Dir.local_dir.selected_child = selected_file
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
204
116
  async_exec {
205
- @text_editor&.text_widget&.setFocus
117
+ @current_text_editor&.text_widget&.setFocus
206
118
  }
207
119
  }
208
120
  }
209
- @tab_item.swt_tab_item.setData('file_path', selected_file.path)
210
- @tab_item.swt_tab_item.setData('file', selected_file)
211
- @tab_item.swt_tab_item.setData('text_editor', @text_editor)
212
- @tab_item.swt_tab_item.setData('proxy', @tab_item)
213
- }
214
- @tab_folder.swt_widget.setSelection(@tab_item.swt_tab_item)
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)
215
127
  body_root.pack_same_size
216
128
  end
217
- @text_editor&.text_widget&.setFocus
129
+ @current_text_editor&.text_widget&.setFocus
218
130
  end
219
131
  end
220
- observe(Dir.local_dir, 'selected_child') do
132
+ observe(project_dir, 'selected_child') do
221
133
  save_config
222
134
  end
223
- observe(Dir.local_dir, 'selected_child.caret_position') do
135
+ observe(project_dir, 'selected_child.caret_position') do
224
136
  save_config
225
137
  end
226
- observe(Dir.local_dir, 'selected_child.top_index') do
138
+ observe(project_dir, 'selected_child.top_pixel') do
227
139
  save_config
228
140
  end
229
141
  load_config
@@ -234,20 +146,20 @@ module Glimmer
234
146
  #
235
147
  body {
236
148
  shell {
237
- text "Gladiator - #{::File.expand_path(Dir.local_dir.path)}"
149
+ text "Gladiator - #{::File.expand_path(project_dir.path)}"
238
150
  minimum_size 520, 250
239
- size 1440, 900
151
+ size 1440, 900
240
152
  grid_layout(2, false)
241
153
  on_swt_show {
242
154
  swt_widget.setSize(@config[:shell_width], @config[:shell_height]) if @config[:shell_width] && @config[:shell_height]
243
- swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
155
+ swt_widget.setLocation(@config[:shell_x], @config[:shell_y]) if @config[:shell_x] && @config[:shell_y]
244
156
  @loaded_config = true
245
157
  }
246
158
  on_swt_close {
247
- Dir.local_dir.selected_child&.write_dirty_content
159
+ project_dir.selected_child&.write_dirty_content
248
160
  }
249
161
  on_widget_disposed {
250
- Dir.local_dir.selected_child&.write_dirty_content
162
+ project_dir.selected_child&.write_dirty_content
251
163
  }
252
164
  on_control_resized {
253
165
  save_config
@@ -256,8 +168,69 @@ module Glimmer
256
168
  save_config
257
169
  }
258
170
  on_shell_deactivated {
259
- @text_editor&.file&.write_dirty_content
260
- }
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
+
261
234
  composite {
262
235
  grid_layout 1, false
263
236
  layout_data(:fill, :fill, false, true) {
@@ -265,16 +238,16 @@ module Glimmer
265
238
  }
266
239
  @filter_text = text {
267
240
  layout_data :fill, :center, true, false
268
- text bind(Dir.local_dir, 'filter')
241
+ text bind(project_dir, 'filter')
269
242
  on_key_pressed { |key_event|
270
- if key_event.keyCode == swt(:tab) ||
271
- key_event.keyCode == swt(:cr) ||
243
+ if key_event.keyCode == swt(:tab) ||
244
+ key_event.keyCode == swt(:cr) ||
272
245
  key_event.keyCode == swt(:arrow_up) ||
273
246
  key_event.keyCode == swt(:arrow_down)
274
247
  @list.swt_widget.select(0) if @list.swt_widget.getSelectionIndex() == -1
275
248
  @list.swt_widget.setFocus
276
249
  end
277
- }
250
+ }
278
251
  }
279
252
  composite {
280
253
  fill_layout(:vertical) {
@@ -282,15 +255,15 @@ module Glimmer
282
255
  }
283
256
  layout_data(:fill, :fill, true, true)
284
257
  @list = list(:border, :h_scroll, :v_scroll) {
285
- #visible bind(Dir, 'local_dir.filter') {|f| !!f}
286
- selection bind(Dir.local_dir, :filtered_path)
258
+ #visible bind(self, 'project_dir.filter') {|f| !!f}
259
+ selection bind(project_dir, :filtered_path)
287
260
  on_mouse_up {
288
- Dir.local_dir.selected_child_path = @list.swt_widget.getSelection.first
261
+ project_dir.selected_child_path = @list.swt_widget.getSelection.first
289
262
  }
290
263
  on_key_pressed { |key_event|
291
264
  if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
292
- Dir.local_dir.selected_child_path = @list.swt_widget.getSelection.first
293
- @text_editor&.text_widget&.setFocus
265
+ project_dir.selected_child_path = @list.swt_widget.getSelection.first
266
+ @current_text_editor&.text_widget&.setFocus
294
267
  end
295
268
  }
296
269
  drag_source(DND::DROP_COPY) {
@@ -300,11 +273,11 @@ module Glimmer
300
273
  list = event.widget.getControl
301
274
  event.data = list.getSelection.first
302
275
  }
303
- }
276
+ }
304
277
  }
305
- @tree = tree(:virtual, :border, :h_scroll, :v_scroll) {
306
- #visible bind(Dir, 'local_dir.filter') {|f| !f}
307
- items bind(Dir, :local_dir), tree_properties(children: :children, text: :name)
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)
308
281
  drag_source(DND::DROP_COPY) {
309
282
  transfer [TextTransfer.getInstance].to_java(Transfer)
310
283
  on_drag_set_data { |event|
@@ -318,21 +291,21 @@ module Glimmer
318
291
  @open_menu_item = menu_item {
319
292
  text 'Open'
320
293
  on_widget_selected {
321
- 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)
322
295
  }
323
296
  }
324
297
  menu_item(:separator)
325
298
  menu_item {
326
299
  text 'Delete'
327
300
  on_widget_selected {
328
- tree_item = @tree.swt_widget.getSelection.first
301
+ tree_item = @file_tree.swt_widget.getSelection.first
329
302
  delete_tree_item(tree_item)
330
303
  }
331
304
  }
332
305
  menu_item {
333
306
  text 'Refresh'
334
307
  on_widget_selected {
335
- Dir.local_dir.refresh
308
+ project_dir.refresh
336
309
  }
337
310
  }
338
311
  menu_item {
@@ -355,25 +328,25 @@ module Glimmer
355
328
  }
356
329
  }
357
330
  on_swt_menudetect { |event|
358
- path = extract_tree_item_path(@tree.swt_widget.getSelection.first)
331
+ path = extract_tree_item_path(@file_tree.swt_widget.getSelection.first)
359
332
  @open_menu_item.swt_widget.setEnabled(!::Dir.exist?(path)) if path
360
333
  }
361
334
  on_mouse_up {
362
335
  if Gladiator.drag_and_drop
363
336
  Gladiator.drag_and_drop = false
364
337
  else
365
- Dir.local_dir.selected_child_path = extract_tree_item_path(@tree.swt_widget.getSelection&.first)
366
- @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
367
340
  end
368
341
  }
369
342
  on_key_pressed { |key_event|
370
343
  if Glimmer::SWT::SWTProxy.include?(key_event.keyCode, :cr)
371
- Dir.local_dir.selected_child_path = extract_tree_item_path(@tree.swt_widget.getSelection&.first)
372
- @text_editor&.text_widget&.setFocus
344
+ project_dir.selected_child_path = extract_tree_item_path(@file_tree.swt_widget.getSelection&.first)
345
+ @current_text_editor&.text_widget&.setFocus
373
346
  end
374
347
  }
375
348
  on_paint_control {
376
- root_item = @tree.swt_widget.getItems.first
349
+ root_item = @file_tree.swt_widget.getItems.first
377
350
  if root_item && !root_item.getExpanded
378
351
  root_item.setExpanded(true)
379
352
  end
@@ -381,10 +354,11 @@ module Glimmer
381
354
  }
382
355
  }
383
356
 
384
- @tree_editor = TreeEditor.new(@tree.swt_widget);
385
- @tree_editor.horizontalAlignment = swt(:left);
386
- @tree_editor.grabHorizontal = true;
387
- @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;
388
362
 
389
363
  }
390
364
  @editor_container = composite {
@@ -392,17 +366,21 @@ module Glimmer
392
366
  layout_data :fill, :fill, true, true
393
367
  composite {
394
368
  grid_layout 3, false
395
-
369
+
396
370
  # row 1
397
-
371
+
372
+ label {
373
+ text 'File:'
374
+ }
375
+
398
376
  @file_path_label = styled_text(:none) {
399
377
  layout_data(:fill, :fill, true, false) {
400
- horizontal_span 3
378
+ horizontal_span 2
401
379
  }
402
380
  background color(:widget_background)
403
381
  editable false
404
382
  caret nil
405
- text bind(Dir.local_dir, 'selected_child.path')
383
+ text bind(project_dir, 'selected_child.path')
406
384
  on_mouse_up {
407
385
  @file_path_label.swt_widget.selectAll
408
386
  }
@@ -410,9 +388,9 @@ module Glimmer
410
388
  @file_path_label.swt_widget.setSelection(0, 0)
411
389
  }
412
390
  }
413
-
391
+
414
392
  # row 2
415
-
393
+
416
394
  label {
417
395
  text 'Line:'
418
396
  }
@@ -420,18 +398,18 @@ module Glimmer
420
398
  layout_data(:fill, :fill, true, false) {
421
399
  minimum_width 400
422
400
  }
423
- 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)
424
402
  on_key_pressed { |key_event|
425
403
  if key_event.keyCode == swt(:cr)
426
- @text_editor&.text_widget&.setFocus
404
+ @current_text_editor&.text_widget&.setFocus
427
405
  end
428
406
  }
429
407
  on_verify_text { |event|
430
- event.doit = !event.text.match(/^\d*$/).to_a.empty?
408
+ event.doit = !event.text.match(/^\d*$/).to_a.empty?
431
409
  }
432
410
  }
433
411
  label
434
-
412
+
435
413
  # row 3
436
414
 
437
415
  label {
@@ -441,34 +419,34 @@ module Glimmer
441
419
  layout_data(:fill, :center, true, false) {
442
420
  minimum_width 400
443
421
  }
444
- text bind(Dir.local_dir, 'selected_child.find_text')
422
+ text bind(project_dir, 'selected_child.find_text')
445
423
  on_key_pressed { |key_event|
446
424
  if key_event.stateMask == swt(COMMAND_KEY) && key_event.keyCode == swt(:cr)
447
- Dir.local_dir.selected_child.case_sensitive = !Dir.local_dir.selected_child.case_sensitive
448
- Dir.local_dir.selected_child&.find_next
425
+ project_dir.selected_child.case_sensitive = !project_dir.selected_child.case_sensitive
426
+ project_dir.selected_child&.find_next
449
427
  end
450
428
  if key_event.keyCode == swt(:cr)
451
- Dir.local_dir.selected_child&.find_next
429
+ project_dir.selected_child&.find_next
452
430
  end
453
431
  }
454
432
  }
455
433
  composite {
456
434
  row_layout
457
435
  button(:check) {
458
- selection bind(Dir.local_dir, 'selected_child.case_sensitive')
436
+ selection bind(project_dir, 'selected_child.case_sensitive')
459
437
  on_key_pressed { |key_event|
460
438
  if key_event.keyCode == swt(:cr)
461
- Dir.local_dir.selected_child&.find_next
439
+ project_dir.selected_child&.find_next
462
440
  end
463
- }
441
+ }
464
442
  }
465
443
  label {
466
444
  text 'Case-sensitive'
467
445
  }
468
446
  }
469
-
447
+
470
448
  # row 4
471
-
449
+
472
450
  label {
473
451
  text 'Replace:'
474
452
  }
@@ -476,14 +454,14 @@ module Glimmer
476
454
  layout_data(:fill, :fill, true, false) {
477
455
  minimum_width 300
478
456
  }
479
- text bind(Dir.local_dir, 'selected_child.replace_text')
480
- on_focus_gained {
481
- 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
482
460
  }
483
461
  on_key_pressed { |key_event|
484
462
  if key_event.keyCode == swt(:cr)
485
- if Dir.local_dir.selected_child
486
- Command.do(Dir.local_dir.selected_child, :replace_next!)
463
+ if project_dir.selected_child
464
+ Command.do(project_dir.selected_child, :replace_next!)
487
465
  end
488
466
  end
489
467
  }
@@ -496,7 +474,8 @@ module Glimmer
496
474
  height_hint 480
497
475
  }
498
476
  sash_width 10
499
- @tab_folder = tab_folder {
477
+ orientation bind(self, :split_orientation)
478
+ @current_tab_folder = tab_folder {
500
479
  drag_source(DND::DROP_COPY) {
501
480
  transfer [TextTransfer.getInstance].to_java(Transfer)
502
481
  event_data = nil
@@ -511,7 +490,7 @@ module Glimmer
511
490
  }
512
491
  }
513
492
  }
514
- @tab_folder.swt_widget.setData('proxy', @tab_folder)
493
+ @current_tab_folder.swt_widget.setData('proxy', @current_tab_folder)
515
494
  }
516
495
  }
517
496
  }
@@ -523,89 +502,92 @@ module Glimmer
523
502
  config_yaml = ::File.read(@config_file_path)
524
503
  return if config_yaml.to_s.strip.empty?
525
504
  @config = YAML.load(config_yaml)
526
- Dir.local_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
527
- Dir.local_dir.ignore_paths ||= ['packages', 'tmp']
505
+ project_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
506
+ project_dir.ignore_paths ||= ['packages', 'tmp']
528
507
  else
529
508
  @loaded_config = true
530
509
  end
531
510
  end
532
-
511
+
533
512
  def load_config
534
513
  if ::File.exists?(@config_file_path)
535
514
  config_yaml = ::File.read(@config_file_path)
536
515
  return if config_yaml.to_s.strip.empty?
537
516
  @config = YAML.load(config_yaml)
538
- Dir.local_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
539
- Dir.local_dir.ignore_paths ||= ['packages', 'tmp']
517
+ project_dir.ignore_paths = @config[:ignore_paths] if @config[:ignore_paths]
518
+ project_dir.ignore_paths ||= ['packages', 'tmp']
540
519
  open_file_paths1 = @config[:open_file_paths1] || @config[:open_file_paths]
541
520
  open_file_paths2 = @config[:open_file_paths2]
542
521
  open_file_paths1.to_a.each do |file_path|
543
- Dir.local_dir.selected_child_path = file_path
522
+ project_dir.selected_child_path = file_path
544
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])
545
526
  Gladiator.drag = true
546
527
  open_file_paths2.to_a.each do |file_path|
547
- Dir.local_dir.selected_child_path = file_path
528
+ project_dir.selected_child_path = file_path
548
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])
549
532
  Gladiator.drag = false
550
- Dir.local_dir.selected_child_path = @config[:selected_child_path] if @config[:selected_child_path]
551
- Dir.local_dir.selected_child&.caret_position = Dir.local_dir.selected_child&.caret_position_for_caret_position_start_of_line(@config[:caret_position].to_i) if @config[:caret_position]
552
- Dir.local_dir.selected_child&.top_index = @config[:top_index].to_i if @config[:top_index]
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]
553
535
  else
554
536
  @loaded_config = true
555
537
  end
556
538
  end
557
-
539
+
558
540
  def save_config
559
541
  return unless @loaded_config
560
- child = Dir.local_dir.selected_child
542
+ child = project_dir.selected_child
561
543
  return if child.nil?
562
- tab_folder1 = @tab_folder1 || @tab_folder
544
+ tab_folder1 = @tab_folder1 || @current_tab_folder
563
545
  tab_folder2 = @tab_folder2
564
- open_file_paths1 = tab_folder1&.swt_widget&.items&.to_a.map {|i| i.get_data('file_path')}
565
- open_file_paths2 = tab_folder2&.swt_widget&.items&.to_a.map {|i| i.get_data('file_path')}
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')}
566
548
  @config = {
567
549
  selected_child_path: child.path,
568
550
  caret_position: child.caret_position,
569
- top_index: child.top_index,
551
+ top_pixel: child.top_pixel,
570
552
  shell_width: swt_widget&.getBounds&.width,
571
553
  shell_height: swt_widget&.getBounds&.height,
572
554
  shell_x: swt_widget&.getBounds&.x,
573
555
  shell_y: swt_widget&.getBounds&.y,
574
556
  open_file_paths1: open_file_paths1,
575
557
  open_file_paths2: open_file_paths2,
576
- ignore_paths: Dir.local_dir.ignore_paths
558
+ ignore_paths: project_dir.ignore_paths
577
559
  }
578
560
  config_yaml = YAML.dump(@config)
579
561
  ::File.write(@config_file_path, config_yaml) unless config_yaml.to_s.empty?
580
562
  rescue => e
581
563
  puts e.full_message
582
564
  end
583
-
565
+
584
566
  def close_tab_folder
585
567
  if @tab_folder2 && !selected_tab_item
586
- if @tab_folder == @tab_folder2
568
+ if @current_tab_folder == @tab_folder2
587
569
  @tab_folder2.swt_widget.dispose
588
- @tab_folder = @tab_folder1
570
+ @current_tab_folder = @tab_folder1
589
571
  else
590
572
  @tab_folder1.swt_widget.dispose
591
- @tab_folder = @tab_folder1 = @tab_folder2
573
+ @current_tab_folder = @tab_folder1 = @tab_folder2
592
574
  end
593
- @tab_folder2 = nil
594
-
595
- @tab_item = @tab_folder.swt_widget.getData('selected_tab_item')
596
- @text_editor = @tab_item.swt_tab_item.getData('text_editor')
597
- Dir.local_dir.selected_child = @tab_item.swt_tab_item.getData('file')
598
-
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
+
599
581
  body_root.pack_same_size
600
582
  end
601
583
  end
602
-
584
+
603
585
  def selected_tab_item
604
- @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 }
605
587
  end
606
588
 
607
589
  def other_tab_items
608
- @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 }
609
591
  end
610
592
 
611
593
  def extract_tree_item_path(tree_item)
@@ -613,14 +595,14 @@ module Glimmer
613
595
  if tree_item.getParentItem
614
596
  ::File.join(extract_tree_item_path(tree_item.getParentItem), tree_item.getText)
615
597
  else
616
- Dir.local_dir.path
598
+ project_dir.path
617
599
  end
618
600
  end
619
-
601
+
620
602
  def select_tree_item
621
- return unless Dir.local_dir.selected_child&.name
622
- tree_items_to_select = @tree.depth_first_search { |ti| ti.getData.path == Dir.local_dir.selected_child.path }
623
- @tree.swt_widget.setSelection(tree_items_to_select)
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)
624
606
  end
625
607
 
626
608
  def delete_tree_item(tree_item)
@@ -628,27 +610,27 @@ module Glimmer
628
610
  file = tree_item.getData
629
611
  parent_path = ::File.dirname(file.path)
630
612
  file.delete! # TODO consider supporting command undo/redo
631
- Dir.local_dir.refresh(async: false)
632
- parent_tree_item = @tree.depth_first_search {|ti| ti.getData.path == parent_path}.first
633
- @tree.swt_widget.showItem(parent_tree_item)
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)
634
616
  parent_tree_item.setExpanded(true)
635
- # TODO close text editor tab
617
+ # TODO close text editor tab
636
618
  # if file.is_a?(::File)
637
619
  # close tab
638
620
  # end
639
621
  rescue => e
640
- puts e.full_message
622
+ puts e.full_message
641
623
  end
642
-
624
+
643
625
  def rename_selected_tree_item
644
- Dir.local_dir.pause_refresh
645
- tree_item = @tree.swt_widget.getSelection.first
626
+ project_dir.pause_refresh
627
+ tree_item = @file_tree.swt_widget.getSelection.first
646
628
  rename_tree_item(tree_item)
647
629
  end
648
-
630
+
649
631
  def add_new_directory_to_selected_tree_item
650
- Dir.local_dir.pause_refresh
651
- tree_item = @tree.swt_widget.getSelection.first
632
+ project_dir.pause_refresh
633
+ tree_item = @file_tree.swt_widget.getSelection.first
652
634
  directory_path = extract_tree_item_path(tree_item)
653
635
  return if directory_path.nil?
654
636
  if !::Dir.exist?(directory_path)
@@ -657,15 +639,15 @@ module Glimmer
657
639
  end
658
640
  new_directory_path = ::File.expand_path(::File.join(directory_path, 'new_directory'))
659
641
  FileUtils.mkdir_p(new_directory_path)
660
- Dir.local_dir.refresh(async: false, force: true)
661
- new_tree_item = @tree.depth_first_search {|ti| ti.getData.path == new_directory_path}.first
662
- @tree.swt_widget.showItem(new_tree_item)
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)
663
645
  rename_tree_item(new_tree_item, true)
664
646
  end
665
-
647
+
666
648
  def add_new_file_to_selected_tree_item
667
- Dir.local_dir.pause_refresh
668
- tree_item = @tree.swt_widget.getSelection.first
649
+ project_dir.pause_refresh
650
+ tree_item = @file_tree.swt_widget.getSelection.first
669
651
  directory_path = extract_tree_item_path(tree_item)
670
652
  if !::Dir.exist?(directory_path)
671
653
  tree_item = tree_item.getParentItem
@@ -674,24 +656,24 @@ module Glimmer
674
656
  new_file_path = ::File.expand_path(::File.join(directory_path, 'new_file'))
675
657
  FileUtils.touch(new_file_path)
676
658
  # TODO look into refreshing only the parent directory to avoid slowdown
677
- Dir.local_dir.refresh(async: false, force: true)
678
- new_tree_item = @tree.depth_first_search {|ti| ti.getData.path == new_file_path}.first
679
- @tree.swt_widget.showItem(new_tree_item)
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)
680
662
  rename_tree_item(new_tree_item, true)
681
663
  end
682
-
664
+
683
665
  def rename_tree_item(tree_item, open_afterwards = false)
684
- @tree.edit_tree_item(
666
+ @file_tree.edit_tree_item(
685
667
  tree_item,
686
668
  after_write: -> (edited_tree_item) {
687
669
  file = edited_tree_item.getData
688
670
  file_path = file.path
689
671
  # TODO rename file in tab title
690
- Dir.local_dir.selected_child_path = file_path if open_afterwards
691
- Dir.local_dir.resume_refresh
672
+ project_dir.selected_child_path = file_path if open_afterwards
673
+ project_dir.resume_refresh
692
674
  },
693
675
  after_cancel: -> {
694
- Dir.local_dir.resume_refresh
676
+ project_dir.resume_refresh
695
677
  }
696
678
  )
697
679
  end
@@ -701,5 +683,154 @@ module Glimmer
701
683
  rescue => e
702
684
  nil
703
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
704
835
  end
705
- end
836
+ end