glimmer-cs-gladiator 0.3.1 → 0.5.2

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