hilfer 0.9.5 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,61 +1,84 @@
1
+ require 'hilfer/window.rb'
2
+
1
3
  # handle director interface to scite
2
4
  class SciteEditor
3
- # options can contain :debug
4
- # view is a GtkTreeView
5
- def initialize( options = {} )
6
- @scite_pipe_name = "/tmp/#{ENV['USER']}.#{Process.pid}.scite"
7
- @director_pipe_name = "/tmp/#{ENV['USER']}.#{Process.pid}.director"
8
-
9
- # delete these if they already exist because we
10
- # need to use their existence to determine if scite
11
- # is running
12
- File.exists?( @scite_pipe_name ) && File.unlink( @scite_pipe_name )
13
- File.exists?( @director_pipe_name ) && File.unlink( @director_pipe_name )
14
-
15
- # this is an array of TreeViewer objects
16
- @views = []
17
- # the command-line options
18
- @options = options
19
- end
5
+ # options can contain :debug
6
+ # view is a GtkTreeView
7
+ def initialize( options = {} )
8
+ @scite_pipe_name = "/tmp/#{ENV['USER']}.#{Process.pid}.scite"
9
+ @director_pipe_name = "/tmp/#{ENV['USER']}.#{Process.pid}.director"
10
+
11
+ cleanup
12
+
13
+ # this is an array of TreeViewer objects
14
+ @views = []
15
+ # the command-line options
16
+ @options = options
17
+ end
18
+
19
+ attr_reader :options
20
+ attr_reader :scite_pid
20
21
 
21
22
  def launched?
22
- File.exists?( @director_pipe_name )
23
+ !@scite_pid.nil?
24
+ end
25
+
26
+ def window
27
+ @window ||= Window.pid( @scite_pid )
28
+ end
29
+
30
+ def reset
31
+ @scite_pid = nil
32
+ @window = nil
33
+ end
34
+
35
+ def kill
36
+ `kill #{@scite_pid}`
37
+ reset
38
+ cleanup
23
39
  end
24
40
 
25
41
  def cleanup
26
42
  FileUtils.rm @scite_pipe_name if File.exist? @scite_pipe_name
27
- FileUtils.rm @director_pipe_name if File.exist? @director_pipe_name
43
+ FileUtils.rm @director_pipe_name if File.exist? @director_pipe_name
28
44
  FileUtils.rm pipe_name_file if File.exist? pipe_name_file
29
45
  end
30
46
 
31
- # send some command
32
- def send( cmd, arg = '' )
33
- launch
34
- File.open( @scite_pipe_name, 'a' ) do |file|
35
- file.print( cmd + ":" + arg.to_s, "\n" )
36
- puts "sending: #{cmd}:#{arg.to_s}" if $options[:debug]
37
- end
38
- end
47
+ # send a command to SciTE
48
+ def send_cmd( cmd, arg = '' )
49
+ launch
50
+ File.open( @scite_pipe_name, 'a' ) do |file|
51
+ file.puts "#{cmd.to_s}:#{arg.to_s}"
52
+ puts "sending: #{cmd.to_s}:#{arg.to_s}" if @options[:debug]
53
+ end
54
+ end
55
+
56
+ # bring the SciTE instance to the current
57
+ # desktop and raise it.
58
+ def activate
59
+ window.activate unless window.nil?
60
+ end
39
61
 
40
- # open files in scite
41
- def open_action( files )
42
- files.each { |x| send "open", x.path }
43
- send 'identity',0
44
- end
62
+ # open files in scite
63
+ def open_action( files )
64
+ files.each { |x| send_cmd "open", x.path }
65
+ send_cmd :identity, 0
66
+ activate
67
+ end
45
68
 
46
69
  def dump
47
- %w{dyn local user base embed}.each {|x| send 'enumproperties', x}
48
- #~ send 'askproperty','dyn:CurrentWord'
70
+ %w{dyn local user base embed}.each {|x| send_cmd 'enumproperties', x}
71
+ #~ send_cmd 'askproperty','dyn:CurrentWord'
49
72
  end
50
73
 
51
74
  # fetch the current file in scite
52
- def synchronize_path
53
- send 'askfilename'
54
- end
75
+ def synchronize_path
76
+ send_cmd :askfilename
77
+ end
55
78
 
56
79
  # shut down editor, if it's open
57
80
  def quit
58
- send 'quit' if launched?
81
+ send_cmd :quit if launched?
59
82
  end
60
83
 
61
84
  # insert text to editor, at current caret, or overwriting the current selection
@@ -66,21 +89,21 @@ class SciteEditor
66
89
  when arg.respond_to?( :join ); arg.join( '\\n' ) + '\\n'
67
90
  else; arg.to_s
68
91
  end
69
- send 'insert', value
92
+ send_cmd :insert, value
70
93
  end
71
94
 
72
- # send selection to all registered views
73
- def set_selection ( fs_path )
74
- @views.each { |v| v.synchronise_editor_path( fs_path ) }
75
- end
95
+ # send selection to all registered views
96
+ def set_selection ( fs_path )
97
+ @views.each { |v| v.synchronise_editor_path( fs_path ) }
98
+ end
76
99
 
77
- def register_view( view )
78
- @views << view
79
- end
100
+ def register_view( view )
101
+ @views << view
102
+ end
80
103
 
81
- def unregister_view( view )
82
- @views.delete( view )
83
- end
104
+ def unregister_view( view )
105
+ @views.delete( view )
106
+ end
84
107
 
85
108
  def pipe_name_file
86
109
  @pipe_name_file ||= "/tmp/#{ENV['USER']}.hilfer.scite"
@@ -93,98 +116,110 @@ class SciteEditor
93
116
  end
94
117
  end
95
118
 
119
+ # start up the editor if there isn't already one
120
+ # calling it when the editor is already open does nothing
121
+ def launch
122
+ return if launched?
123
+
124
+ # create the director pipe if it isn't there already
125
+ unless File.exists?( @director_pipe_name )
126
+ system( "mkfifo #{@director_pipe_name}" )
127
+ end
128
+
129
+ scite_cmd = "/usr/bin/scite"
130
+
131
+ # start a process to clean up when scite exits
132
+ @scite_pid = fork()
133
+ if @scite_pid.nil?
134
+ # in child, so exec scite from here, so this pid will become scite's pid
135
+ # not passing the first arg as a 2 element array doesn't work. So
136
+ # use the same value for the command and as argv[0]
137
+ exec(
138
+ [ scite_cmd ] *2,
139
+ "-ipc.director.name=#{@director_pipe_name}",
140
+ "-ipc.scite.name=#{@scite_pipe_name}"
141
+ )
142
+ else
143
+ start_cleanup
144
+ end
145
+
146
+ puts "scite launched with pid #{@scite_pid}" if @options[:debug]
147
+
148
+ # start the listener thread
149
+ start_listener
150
+ end
151
+
96
152
  protected
97
153
 
98
- # start up the editor if there isn't already one
99
- # calling it when the editor is already open does nothing
100
- def launch
101
- # create the director pipe if it isn't there already
102
- if !File.exists?( @director_pipe_name )
103
- system( "mkfifo #{@director_pipe_name}" )
104
- end
105
-
106
- # scite already open, so don't launch another instance
107
- return if File.exists? @scite_pipe_name
108
-
109
- cmd = <<EOF
110
- /usr/bin/scite
111
- -ipc.director.name=#{@director_pipe_name}
112
- -ipc.scite.name=#{@scite_pipe_name}
113
- EOF
114
- oneline = cmd.gsub( "\n", " ")
115
- child_pid = fork
116
- if child_pid.nil?
117
- # start the editor and wait for it to end
118
- system( oneline )
119
-
120
- # scite ended, so delete the pipes
154
+ def start_cleanup
155
+ Thread.new do
156
+ # wait for Scite to end, and cleanup
121
157
  begin
122
- File.unlink @director_pipe_name if File.exist? @director_pipe_name
123
- File.unlink @scite_pipe_name if File.exist? @scite_pipe_name
158
+ puts "waiting for scite(#{@scite_pid})" if @options[:debug]
159
+ Process.wait( @scite_pid )
160
+ cleanup
161
+ reset
162
+ puts "cleaned up scite pipes" if @options[:debug]
124
163
  rescue Exception => e
125
- puts e.message
164
+ puts "e: #{e.inspect}"
165
+ puts e.backtrace
126
166
  end
127
-
128
- # unfork, don't trigger a SystemException
129
- exit! true
130
- else
131
- # start the listener thread
132
- start_listener
133
- end
134
- end
135
-
136
- def start_listener
137
-
138
- sleep 0.1 while !File.exists? @scite_pipe_name
139
-
140
- Thread.new( self ) do |arg|
141
- begin
142
- arg.listen
143
- rescue Errno::ENOENT
144
- break
145
- rescue Exception => e
146
- print "listener thread ended: ", e.inspect, "\n"
147
- e.backtrace.each { |x| print x, "\n" }
148
- end
149
- end
150
-
151
- end
167
+ end
168
+ end
169
+
170
+ def start_listener
171
+
172
+ sleep 0.1 while !File.exists? @scite_pipe_name
173
+
174
+ Thread.new( self ) do |arg|
175
+ begin
176
+ arg.listen
177
+ rescue Errno::ENOENT
178
+ break
179
+ rescue Exception => e
180
+ print "listener thread ended: ", e.inspect, "\n"
181
+ puts e.backtrace
182
+ end
183
+ end
184
+
185
+ end
152
186
 
153
- # respond to strings from scite
154
- def listen
155
- File.open( @director_pipe_name ).each( "\x0" ) do |line|
156
- begin
157
- line = line.slice(0...-1) if line[-1] = 0
158
- print "heard #{line}\n" if $options[:debug]
159
- case line
160
- # scite sends one of these for each file opened
161
- when /^opened:(.*)$/
162
- set_selection( $1 )
187
+ # respond to strings from scite
188
+ def listen
189
+ File.open( @director_pipe_name ).each( "\x0" ) do |line|
190
+ begin
191
+ line = line.slice(0...-1) if line[-1] = 0
192
+ print "heard #{line}\n" if @options[:debug]
193
+ case line
194
+ # scite sends one of these for each file opened
195
+ when /^opened:(.*)$/
196
+ set_selection( $1 )
163
197
 
164
- # scite sends one of these each time the buffer is switched
165
- when /^switched:(.*)$/
166
- set_selection( $1 )
198
+ # scite sends one of these each time the buffer is switched
199
+ when /^switched:(.*)$/
200
+ set_selection( $1 )
167
201
 
168
- # response to askfilename, as sent by synchronize_path
169
- when /^filename:(.*)$/
170
- set_selection( $1 )
202
+ # response to askfilename, as sent by synchronize_path
203
+ when /^filename:(.*)$/
204
+ set_selection( $1 )
171
205
 
172
- # the specified file has just been saved. Do nothing.
173
- # TODO could check that it exists and add it if not.
174
- when /^saved:(.*)$/
175
-
176
- when /^closed$/
206
+ # the specified file has just been saved. Do nothing.
207
+ # TODO could check that it exists and add it if not.
208
+ when /^saved:(.*)$/
209
+
210
+ when /^closed$/
177
211
  puts "SciTE closing"
178
- break
212
+ break
179
213
 
180
- # print it out
181
- else
182
- print "unknown: ", line, "\n" if $options[:debug]
183
- end
184
- rescue Exception => e
185
- print "caught Exception in listen: ", e.inspect, "\n"
186
- end
187
- end
188
- end
214
+ # print it out
215
+ else
216
+ print "unknown: ", line, "\n" if @options[:debug]
217
+ end
218
+ rescue Exception => e
219
+ print "caught Exception in listen: ", e.inspect, "\n"
220
+ puts e.backtrace
221
+ end
222
+ end
223
+ end
189
224
 
190
225
  end
@@ -3,6 +3,7 @@ require 'pathname'
3
3
  require 'hilfer/hilfer_item.rb'
4
4
  require 'hilfer/scite_editor.rb'
5
5
  require 'hilfer/hilfer_model.rb'
6
+ require 'hilfer/extensions.rb'
6
7
 
7
8
  # try to load Gnome terminal
8
9
  begin
@@ -42,15 +43,6 @@ rescue
42
43
  HAS_SUBVERSION = false
43
44
  end
44
45
 
45
-
46
- module Gdk
47
- class EventKey
48
- def inspect
49
- "#<Gdk::EventKey keycode=#{hardware_keycode} state=#{state.inspect}"
50
- end
51
- end
52
- end
53
-
54
46
  =begin
55
47
  This is the tree viewer object. It contains a GtkTreeView
56
48
  and references an editor object. It also contains a HilferItem
@@ -148,11 +140,11 @@ class TreeViewer
148
140
 
149
141
  @view.signal_connect( 'row-expanded' ) do
150
142
  |view, iter, path|
151
- print "expanding row: #{iter[0].path}, #{iter[0].populated?}\n" if $options[:debug]
143
+ puts "expanding row: #{iter[0].path}, #{iter[0].populated?}" if $options[:debug]
152
144
  iter[0].status = :expanded
153
145
  child = iter.first_child
154
146
  loop do
155
- print "expanded child: #{child[0].path}, #{child[0].populated?}\n" if $options[:debug]
147
+ puts "expanded child: #{child[0].path}, #{child[0].populated?}" if $options[:debug]
156
148
  populate( @view.model, child[0], child ) unless child[0].populated?
157
149
  break if !child.next!
158
150
  end
@@ -328,14 +320,14 @@ class TreeViewer
328
320
 
329
321
  # handle keypresses
330
322
  def init_keys
331
- @view.signal_connect( 'key-press-event' ) do
332
- |widget,event|
333
- puts event.inspect if $options[:debug]
323
+ @view.signal_connect( 'key-press-event' ) do |widget,event|
324
+ puts "event: #{event.inspect}" if $options[:debug]
325
+
334
326
  retval = true
335
327
  case
336
328
  # enter - go into directory
337
329
  # or open all selected files
338
- when event.hardware_keycode == 36 && !event.state.control_mask?
330
+ when event.match( /return/i, /enter/i ) && !event.state.control_mask?
339
331
  items = []
340
332
 
341
333
  # fetch all selected items
@@ -347,7 +339,7 @@ class TreeViewer
347
339
  open_action( items )
348
340
 
349
341
  # ctrl-enter opens new window with the selected root(s)
350
- when event.hardware_keycode == 36 && event.state.control_mask?
342
+ when event.match( /return/i, /enter/i ) && event.state.control_mask?
351
343
  widget.selection.selected_each do |model, path, iter|
352
344
  new_path =
353
345
  if !iter[0].dir?
@@ -362,14 +354,14 @@ class TreeViewer
362
354
  end
363
355
 
364
356
  # backspace - go up to parent directory
365
- when event.hardware_keycode == 22
357
+ when event =~ 'BackSpace'
366
358
  # go up one directory
367
359
  temp = Pathname.new( @root_item.path )
368
360
  @root_item.path = temp.parent.realpath.to_s
369
361
  go_into( @root_item.path )
370
362
 
371
363
  # del on main keyboard or keypad deletes a file
372
- when [91,107].include?( event.hardware_keycode )
364
+ when event =~ /Delete/
373
365
  iters = []
374
366
  widget.selection.selected_each do |model, path, iter|
375
367
  iters << iter
@@ -377,7 +369,7 @@ class TreeViewer
377
369
  confirm_delete_files( iters )
378
370
 
379
371
  # ctrl-e and F2 edits the file name
380
- when ( event.hardware_keycode == 26 && event.state.control_mask? ) || event.hardware_keycode == 68
372
+ when event.match( :e, :f2 ) && event.state.control_mask?
381
373
  # make sure all the files are selected
382
374
  rows = widget.selection.selected_rows
383
375
  rows.each do |path|
@@ -391,11 +383,11 @@ class TreeViewer
391
383
  end
392
384
 
393
385
  # ctrl-d sends some debug/info commands to scite
394
- when event.hardware_keycode == 40 && event.state.control_mask? && !event.state.shift_mask?
386
+ when event.d? && event.state.control_mask? && !event.state.shift_mask?
395
387
  @editor.dump
396
388
 
397
389
  # ctrl-b sends the current selection to the editor
398
- when event.hardware_keycode == 56 && event.state.control_mask? && !event.state.shift_mask?
390
+ when event.b? && event.state.control_mask? && !event.state.shift_mask?
399
391
  paths = []
400
392
  widget.selection.selected_each do |model, path, iter|
401
393
  # note use of single quotes
@@ -404,7 +396,7 @@ class TreeViewer
404
396
  @editor.insert paths
405
397
 
406
398
  # ctrl-c copies current selections as text
407
- when event.hardware_keycode == 54 && event.state.control_mask? && !event.state.shift_mask?
399
+ when event.c? && event.state.control_mask? && !event.state.shift_mask?
408
400
  paths = ""
409
401
 
410
402
  # fetch all selected items
@@ -416,7 +408,7 @@ class TreeViewer
416
408
  Gtk::Clipboard.get( Gdk::Selection::CLIPBOARD ).text = paths
417
409
 
418
410
  # ctrl-v selects the files in the clipboard
419
- when event.hardware_keycode == 55 && event.state.control_mask? && !event.state.shift_mask?
411
+ when event.v? && event.state.control_mask? && !event.state.shift_mask?
420
412
  text = Gtk::Clipboard.get( Gdk::Selection::CLIPBOARD ).wait_for_text
421
413
  paths = text.strip.split( /\s*\n\s*/ )
422
414
  location_path = Pathname.new( @root_item.path )
@@ -428,27 +420,27 @@ class TreeViewer
428
420
  select_fs_paths( paths )
429
421
 
430
422
  # ctrl-n opens new window with same root
431
- when event.hardware_keycode == 57 && event.state.control_mask?
423
+ when event.n? && event.state.control_mask?
432
424
  TreeViewerWindow.new( @root_item.path, @editor )
433
425
 
434
426
  # ctrl-y synchronizes with current editor file
435
- when event.hardware_keycode == 29 && event.state.control_mask?
427
+ when event.y? && event.state.control_mask?
436
428
  # make sure other windows don't synchronize
437
429
  @expecting_synchronize_path = true
438
430
  # ask editor for current file and sync
439
431
  @editor.synchronize_path
440
432
 
441
433
  # alt-y toggles automatic synchronization
442
- when event.hardware_keycode == 29 && event.state.mod1_mask?
434
+ when event.y? && event.state.mod1_mask?
443
435
  @auto_synchronize_path = !@auto_synchronize_path
444
436
 
445
437
  # ctrl-r refreshes from filesystem
446
- when event.hardware_keycode == 27 && event.state.control_mask?
438
+ when event.r? && event.state.control_mask?
447
439
  refresh
448
440
 
449
441
  # ctrl-t opens a terminal window on the given directorties.
450
442
  # Uses gnome-terminal and opens directories in tabs
451
- when event.hardware_keycode == 28 && event.state.control_mask? && !event.state.shift_mask?
443
+ when event.t? && event.state.control_mask? && !event.state.shift_mask?
452
444
  # collect all unique directories
453
445
  dirs = []
454
446
  widget.selection.selected_each do |model, path, iter|
@@ -465,22 +457,22 @@ class TreeViewer
465
457
  terminal.launch( dirs )
466
458
 
467
459
  # alt-l toggles the location bar
468
- when event.hardware_keycode == 46 && event.state.mod1_mask?
460
+ when event.l? && event.state.mod1_mask?
469
461
  @location.no_show_all = true
470
462
  @location.visible = !@location.visible?
471
463
 
472
464
  # alt-q toggles whether shutdown is automatic or not
473
- when event.hardware_keycode == 24 && event.state.mod1_mask?
465
+ when event.q? && event.state.mod1_mask?
474
466
  $options[:quit_editor] = !$options[:quit_editor]
475
467
 
476
468
  # ctrl-* on keypad means expand the entire tree
477
- when event.hardware_keycode == 63 && event.state.control_mask?
469
+ when event =~ 'KP_Multiply' && event.state.control_mask?
478
470
  # 100 levels of directories should be enough...
479
471
  populate( @view.model, @root_item, nil, 100 )
480
472
  @view.expand_all
481
473
 
482
474
  # * on keypad means expand subtree
483
- when event.hardware_keycode == 63 && event.state.empty?
475
+ when event =~ 'KP_Multiply' && event.state.empty?
484
476
  widget.selection.selected_rows.each do |path|
485
477
  iter = @view.model.get_iter( path )
486
478
  if iter[0].dir?
@@ -489,11 +481,11 @@ class TreeViewer
489
481
  end
490
482
 
491
483
  # shift-/ on keypad means collapse the entire tree
492
- when event.hardware_keycode == 112 && event.state.shift_mask?
484
+ when event =~ 'KP_Divide' && event.state.shift_mask?
493
485
  @view.collapse_all
494
486
 
495
487
  # ctrl-left means go to parent
496
- when event.hardware_keycode == 100 && event.state.control_mask?
488
+ when event =~ /left$/i && event.state.control_mask?
497
489
  widget.selection.selected_each do |model, path, iter|
498
490
  if iter.parent != nil
499
491
  iter.parent[0].last_child_used = path
@@ -505,7 +497,7 @@ class TreeViewer
505
497
  end
506
498
 
507
499
  # ctrl-right means go to last used path, or first child
508
- when event.hardware_keycode == 102 && event.state.control_mask?
500
+ when event.right? && event.state.control_mask?
509
501
  widget.selection.selected_each do |model, path, iter|
510
502
  if iter[0].dir?
511
503
  widget.expand_row( iter.path, false )
@@ -521,7 +513,7 @@ class TreeViewer
521
513
  end
522
514
 
523
515
  # ctrl-up means go to previous sibling with children
524
- when event.hardware_keycode == 98 && event.state.control_mask?
516
+ when event.up? && event.state.control_mask?
525
517
  widget.selection.selected_each do |model, path, iter|
526
518
  if iter[0].dir?
527
519
  while path.prev!
@@ -537,7 +529,7 @@ class TreeViewer
537
529
  end
538
530
 
539
531
  # ctrl-down means go to next sibling with children
540
- when event.hardware_keycode == 104 && event.state.control_mask?
532
+ when event.down? && event.state.control_mask?
541
533
  widget.selection.selected_each do |model, path, iter|
542
534
  if iter[0].dir?
543
535
  while iter.next!
@@ -560,7 +552,7 @@ class TreeViewer
560
552
  end
561
553
 
562
554
  # shift-left means select parent
563
- when event.hardware_keycode == 100 && event.state.shift_mask?
555
+ when event.left? && event.state.shift_mask?
564
556
  widget.selection.selected_each do |model, path, iter|
565
557
  if iter.parent != nil
566
558
  select_children( widget, iter.parent )
@@ -568,7 +560,7 @@ class TreeViewer
568
560
  end
569
561
 
570
562
  # shift-right means select children
571
- when event.hardware_keycode == 102 && event.state.shift_mask?
563
+ when event.right? && event.state.shift_mask?
572
564
  widget.selection.selected_each do |model, path, iter|
573
565
  if iter[0].dir?
574
566
  select_children( widget, iter )
@@ -576,13 +568,13 @@ class TreeViewer
576
568
  end
577
569
 
578
570
  # left means close level(s)
579
- when event.hardware_keycode == 100 && event.state.empty?
571
+ when event.left? && event.state.empty?
580
572
  widget.selection.selected_each do |model, path, iter|
581
573
  widget.collapse_row( path ) if iter[0].dir?
582
574
  end
583
575
 
584
576
  # right means open level(s)
585
- when event.hardware_keycode == 102
577
+ when event.right?
586
578
  widget.selection.selected_each do
587
579
  |model, path, iter|
588
580
  # false means don't expand children
@@ -595,7 +587,7 @@ class TreeViewer
595
587
  # pass keypress to all locators
596
588
  @locators.each {|x| retval = x.handle_keypress( widget, event ) and retval }
597
589
  if $options[:debug] && !retval
598
- print "hardware_keycode: #{event.hardware_keycode}\n"
590
+ puts "not handled"
599
591
  end
600
592
  end
601
593
  retval
@@ -825,7 +817,7 @@ class TreeViewer
825
817
  # recursively populate files, so the TreeView
826
818
  # knows to draw the expanders
827
819
  if ( ( File.directory?( next_item_path ) && level < levels_to_populate ) || iter[0].expanded? )
828
- print "populating level #{level} #{iter[0].path}\n" if $options[:debug]
820
+ puts "populating level #{level} #{iter[0].path}" if $options[:debug]
829
821
  # populate children
830
822
  populate( model, iter[0], iter, levels_to_populate, level + 1 )
831
823
  end
@@ -833,8 +825,8 @@ class TreeViewer
833
825
  rescue Errno::EACCES
834
826
  # mostly to protect against permissions errors
835
827
  rescue Exception => ex
836
- print "caught exception: #{ex} #{ex.class}\n"
837
- ex.backtrace.each { |x| print x, "\n" }
828
+ puts "caught exception: #{ex} #{ex.class}"
829
+ puts ex.backtrace
838
830
  end
839
831
 
840
832
  end
@@ -9,15 +9,15 @@ class TreeViewerWindow
9
9
 
10
10
  def initialize( root_fs_path, editor )
11
11
  @window = Gtk::Window.new
12
-
12
+
13
13
  # initialize viewer with a path
14
14
  @editor = editor
15
-
15
+
16
16
  # location bar
17
17
  @location = Gtk::Entry.new
18
-
18
+
19
19
  @tv = TreeViewer.new( root_fs_path, editor, @window, @location )
20
-
20
+
21
21
  # add scrollbars
22
22
  @scroll = Gtk::ScrolledWindow.new( nil, nil )
23
23
  @scroll.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC )
@@ -1,3 +1,3 @@
1
1
  module Hilfer
2
- VERSION = '0.9.5'
2
+ VERSION = '0.10.0'
3
3
  end