glimmer-cs-gladiator 0.4.1 → 0.5.4

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