hilfer 0.9.5 → 0.10.0

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