arcadia 0.6.0 → 0.7.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,5 +1,5 @@
1
1
  name=file_history
2
- frames=0.0
2
+ frames=1.0
3
3
  frames.labels=File history
4
4
  frames.names=file_history
5
5
  active=yes
@@ -7,7 +7,7 @@ require=ext/ae-file-history/ae-file-history
7
7
  class=FilesHistrory
8
8
 
9
9
  file.name=arcadia.history
10
- length=35
10
+ length=20
11
11
  font=courier 11
12
12
  font.bold=courier 11 bold
13
13
  color.background=#ffffff
@@ -30,36 +30,6 @@ class TreeNode
30
30
  self.label.strip <=> other.label.strip
31
31
  end
32
32
 
33
- # def path
34
- # _path = @label
35
- # if @parent != nil
36
- # _path = @parent.path+_path
37
- # end
38
- # return _path
39
- # end
40
-
41
- def dir_old(_path)
42
- node = nil
43
- parent = self
44
- sons.each{|_tree|
45
- if _path[0.._tree.label.length-1] == _tree.label
46
- res = _path[_tree.label.length.._path.length-1]
47
- if ["\\","/"].include?(res[0,1])
48
- parent = _tree
49
- node= _tree.dir(res)
50
- end
51
- end
52
- break if node != nil
53
- }
54
- if node == nil
55
- node = TreeNode.new(parent,'KDir') do |_node|
56
- _node.label=_path
57
- _node.rif= parent.path+_path
58
- end
59
- end
60
- return node
61
- end
62
-
63
33
  def dir(_path)
64
34
  node = nil
65
35
  parent = self
@@ -108,13 +78,10 @@ class FilesHistrory < ArcadiaExt
108
78
  def sync_on
109
79
  @sync = true
110
80
  select_file_without_event(@last_file) if @last_file
111
-
112
- #Arcadia.attach_listener(self, BufferRaisedEvent)
113
81
  end
114
82
 
115
83
  def sync_off
116
84
  @sync = false
117
- #Arcadia.detach_listener(self, BufferRaisedEvent)
118
85
  end
119
86
 
120
87
  def on_before_build(_event)
@@ -126,11 +93,18 @@ class FilesHistrory < ArcadiaExt
126
93
  @cb_sync = TkCheckButton.new(self.frame.hinner_frame, Arcadia.style('checkbox')){
127
94
  text 'Sync'
128
95
  justify 'left'
129
- variable 1
130
- #command do_check
131
- place('x' => 0,'y' => 0,'height' => 22)
96
+ indicatoron 0
97
+ offrelief 'raised'
98
+ image TkPhotoImage.new('dat' => SYNCICON20_GIF)
99
+ place('x' => 0,'y' => 0,'height' => 26)
132
100
  }
133
101
 
102
+ Tk::BWidget::DynamicHelp::add(@cb_sync,
103
+ 'text'=>'Link open editors with content in the Navigator')
104
+
105
+
106
+
107
+
134
108
  do_check = proc {
135
109
  if @cb_sync.cget('onvalue')==@cb_sync.cget('variable').value.to_i
136
110
  sync_on
@@ -162,19 +136,26 @@ class FilesHistrory < ArcadiaExt
162
136
  #EditorContract.instance.open_file(self,'file'=>_file)
163
137
  end
164
138
  }
165
- # _background = conf('color.background')
166
- # _foreground = conf('color.foreground')
139
+
140
+ do_open_folder = proc{|_node|
141
+ children = @htree.nodes(_node)
142
+ if children.length == 1
143
+ @htree.open_tree(children[0],false)
144
+ end
145
+ }
146
+
167
147
  @font = Arcadia.conf('treeitem.font')
168
148
  @font_b = "#{Arcadia.conf('treeitem.font')} bold"
169
149
 
170
150
  @htree = Tk::BWidget::Tree.new(self.frame.hinner_frame, Arcadia.style('treepanel')){
171
151
  showlines false
172
152
  deltay 18
153
+ opencmd proc{|node| do_open_folder.call(node)}
173
154
  selectcommand proc{ do_select_item.call(self) }
174
155
  # place('relwidth' => 1,'relheight' => '1', 'x' => '0','y' => '22', 'height' => -22)
175
156
  }
176
157
  _wrapper = TkScrollWidget.new(@htree)
177
- _wrapper.show(0,22)
158
+ _wrapper.show(0,26)
178
159
  _wrapper.show_v_scroll
179
160
  _wrapper.show_h_scroll
180
161
  # _scrollcommand = proc{|*args| @htree.yview(*args)}
@@ -97,7 +97,7 @@ class SearchOutput
97
97
  @results = {}
98
98
  _open_file = proc do |tree, sel|
99
99
  n_parent, n = sel.split('@@@')
100
- Arcadia.process_event(OpenBufferEvent.new(self,'file'=>@results[n_parent][n][0], 'row'=>@results[n_parent][n][1])) if n && @results[n_parent][n]
100
+ Arcadia.process_event(OpenBufferTransientEvent.new(self,'file'=>@results[n_parent][n][0], 'row'=>@results[n_parent][n][1])) if n && @results[n_parent][n]
101
101
  #EditorContract.instance.open_file(self, 'file'=>@results[n_parent][n][0], 'line'=>@results[n_parent][n][1]) if n && @results[n_parent][n]
102
102
  end
103
103
 
@@ -170,6 +170,7 @@ class SearchOutput
170
170
  Tk.update
171
171
  @results[_r_node]={}
172
172
  @count = 0
173
+ @tree.set_focus
173
174
  return _r_node
174
175
  end
175
176
 
@@ -614,6 +614,10 @@ class Application
614
614
  def Application.conf(_property)
615
615
  @@instance['conf'][_property] if @@instance
616
616
  end
617
+
618
+ def conf(_property)
619
+ self['conf'][_property]
620
+ end
617
621
 
618
622
  def sys_info
619
623
  "[Platform = #{RUBY_PLATFORM}] [Ruby version = #{RUBY_VERSION}]"
@@ -58,6 +58,9 @@ end
58
58
  class OpenBufferEvent < BufferEvent
59
59
  end
60
60
 
61
+ class OpenBufferTransientEvent < OpenBufferEvent
62
+ end
63
+
61
64
  class CloseBufferEvent < BufferEvent
62
65
  end
63
66
 
@@ -68,6 +71,11 @@ class SaveAsBufferEvent < SaveBufferEvent
68
71
  attr_accessor :new_file
69
72
  end
70
73
 
74
+ class MoveBufferEvent < BufferEvent
75
+ attr_accessor :old_file
76
+ attr_accessor :new_file
77
+ end
78
+
71
79
  class GoToLineBufferEvent < BufferEvent
72
80
  attr_accessor :line
73
81
  end
@@ -23,7 +23,7 @@ class Arcadia < TkApplication
23
23
  super(
24
24
  ApplicationParams.new(
25
25
  'arcadia',
26
- '0.6.0',
26
+ '0.7.0',
27
27
  'conf/arcadia.conf',
28
28
  'conf/arcadia.pers'
29
29
  )
@@ -43,7 +43,9 @@ class Arcadia < TkApplication
43
43
  title _title
44
44
  withdraw
45
45
  protocol( "WM_DELETE_WINDOW", $arcadia['action.on_exit'])
46
+ iconphoto(TkPhotoImage.new('dat'=>ARCADIA_RING_GIF))
46
47
  }
48
+
47
49
  @on_event = Hash.new
48
50
 
49
51
  @main_menu_bar = TkMenubar.new(
@@ -69,7 +71,6 @@ class Arcadia < TkApplication
69
71
  @splash.set_progress(50) if @splash
70
72
  @splash.deiconify if @splash
71
73
  Tk.update
72
- #sleep(1)
73
74
  @splash.next_step('..prepare') if @splash
74
75
  prepare
75
76
  @splash.last_step('..load finish') if @splash
@@ -406,7 +407,7 @@ class Arcadia < TkApplication
406
407
 
407
408
 
408
409
  def do_exit
409
- q1 = (Arcadia.dialog(self,
410
+ q1 = conf('confirm-on-exit')!='yes' || (Arcadia.dialog(self,
410
411
  'type'=>'yes_no',
411
412
  'msg'=>"Do you want exit?",
412
413
  'title' => '(Arcadia) Exit',
@@ -816,6 +817,21 @@ class ArcadiaMainMenu < ArcadiaUserControl
816
817
  @menu.add_menu(menu_spec_view)
817
818
  @menu.add_menu(menu_spec_tools)
818
819
  @menu.add_menu(menu_spec_help)
820
+
821
+ #@menu.bind_append("1", proc{
822
+ # chs = TkWinfo.children(@menu)
823
+ # hh = 25
824
+ # @last_post = nil
825
+ # chs.each{|ch|
826
+ # ch.bind_append("Enter", proc{|x,y,rx,ry|
827
+ # @last_post.unpost if @last_post
828
+ # ch.menu.post(x-rx,y-ry+hh)
829
+ # @last_post=ch.menu}, "%X %Y %x %y")
830
+ # ch.bind_append("Leave", proc{
831
+ # @last_post.unpost if @last_post
832
+ # })
833
+ # }
834
+ #})
819
835
  end
820
836
 
821
837
  end
@@ -869,6 +885,14 @@ class ArcadiaAboutSplash < TkToplevel
869
885
  justify 'left'
870
886
  place('width' => '120','x' => 150,'y' => 65,'height' => 19)
871
887
  }
888
+ @tkLabel21 = TkLabel.new(self){
889
+ text 'by Antonio Galeone - 2004/2009'
890
+ background _bgcolor
891
+ foreground '#ffffff'
892
+ font Arcadia.instance['conf']['splash.credits.font']
893
+ justify 'left'
894
+ place('width' => '210','x' => 100,'y' => 95,'height' => 19)
895
+ }
872
896
  @tkLabelStep = TkLabel.new(self){
873
897
  text ''
874
898
  background _bgcolor
@@ -876,20 +900,12 @@ class ArcadiaAboutSplash < TkToplevel
876
900
  font Arcadia.instance['conf']['splash.banner.font']
877
901
  justify 'left'
878
902
  anchor 'w'
879
- place('width'=>-5,'relwidth' => 1,'x' => 5,'y' => 175,'height' => 19)
880
- }
881
- @tkLabel21 = TkLabel.new(self){
882
- text 'by Antonio Galeone - 2004/2009'
883
- background _bgcolor
884
- foreground '#ffffff'
885
- font Arcadia.instance['conf']['splash.credits.font']
886
- justify 'left'
887
- place('width' => '210','x' => 100,'y' => 146,'height' => 19)
903
+ place('width'=>-5,'relwidth' => 1,'x' => 5,'y' => 160,'height' => 19)
888
904
  }
889
905
  @progress = TkVariable.new
890
906
  reset
891
907
  _width = 340
892
- _height = 210
908
+ _height = 200
893
909
  #_width = 0;_height = 0
894
910
  _x = TkWinfo.screenwidth(self)/2 - _width / 2
895
911
  _y = TkWinfo.screenheight(self)/2 - _height / 2
@@ -908,11 +924,12 @@ class ArcadiaAboutSplash < TkToplevel
908
924
  @max = _max
909
925
  Tk::BWidget::ProgressBar.new(self, :width=>150, :height=>10,
910
926
  :background=>'black',
911
- :foreground=>'yellow',
927
+ :troughcolor=>'black',
928
+ :foreground=>'#a11934',
912
929
  :variable=>@progress,
913
930
  :borderwidth=>0,
914
931
  :relief=>'flat',
915
- :maximum=>_max).place('width' => '150','x' => 145,'y' => 95,'height' => 15)
932
+ :maximum=>_max).place('relwidth' => '1','y' => 146,'height' => 2)
916
933
  end
917
934
 
918
935
  def reset
@@ -961,25 +978,36 @@ class ArcadiaDialogManager
961
978
  @arcadia = _arcadia
962
979
  Arcadia.attach_listener(self, DialogEvent)
963
980
  end
981
+
964
982
  def on_dialog(_event)
983
+ type = _event.type
984
+ if !DialogEvent::TYPE_PATTERNS.include?(_event.type)
985
+ type = 'ok'
986
+ end
987
+ res_array = type.split('_')
988
+ icon = _event.level
989
+ tktype = type.gsub('_','').downcase
990
+
991
+ tkdialog = Tk::BWidget::MessageDlg.new(
992
+ 'icon' => icon,
993
+ 'bg' => Arcadia.conf('background'),
994
+ 'fg' => Arcadia.conf('foreground'),
995
+ 'type' => tktype,
996
+ 'title' => _event.title,
997
+ 'message' => _event.msg)
998
+
999
+ tkdialog.configure('font'=>'courier 6')
1000
+ res = tkdialog.create
1001
+ _event.add_result(self, 'value'=>res_array[res.to_i])
1002
+ end
1003
+
1004
+
1005
+ def on_dialog_old(_event)
965
1006
  type = _event.type
966
1007
  if !DialogEvent::TYPE_PATTERNS.include?(_event.type)
967
1008
  type = 'ok'
968
1009
  end
969
1010
  icon = _event.level
970
- # case _event
971
- # when QuestionDialogEvent
972
- # icon = 'question'
973
- # when InfoDialogEvent
974
- # icon = 'info'
975
- # when WarningDialogEvent
976
- # icon = 'warning'
977
- # when ErrorDialogEvent
978
- # icon = 'error'
979
- # else
980
- # icon = 'info'
981
- # end
982
-
983
1011
  tktype = type.gsub('_','').downcase
984
1012
 
985
1013
  res = Tk.messageBox(
@@ -6,6 +6,46 @@
6
6
  require "lib/a-commons"
7
7
  require "tk/menu"
8
8
 
9
+ class MyBwTree < Tk::BWidget::Tree
10
+
11
+ def open?(node)
12
+ bool(self.itemcget(tagid(node), 'open'))
13
+ end
14
+
15
+ def areabind(context, *args)
16
+ if TkComm._callback_entry?(args[0]) || !block_given?
17
+ cmd = args.shift
18
+ else
19
+ cmd = Proc.new
20
+ end
21
+ _bind_for_event_class(Event_for_Items, [path, 'bindArea'],
22
+ context, cmd, *args)
23
+ self
24
+ end
25
+
26
+ def areabind_append(context, *args)
27
+ if TkComm._callback_entry?(args[0]) || !block_given?
28
+ cmd = args.shift
29
+ else
30
+ cmd = Proc.new
31
+ end
32
+ _bind_append_for_event_class(Event_for_Items, [path, 'bindArea'],
33
+ context, cmd, *args)
34
+ self
35
+ end
36
+
37
+ def areabind_remove(*args)
38
+ _bind_remove_for_event_class(Event_for_Items, [path, 'bindArea'], *args)
39
+ self
40
+ end
41
+
42
+ def areabindinfo(*args)
43
+ _bindinfo_for_event_class(Event_for_Items, [path, 'bindArea'], *args)
44
+ end
45
+
46
+ end
47
+
48
+
9
49
  class TkApplication < Application
10
50
  attr_reader :tcltk_info
11
51
  def initialize(_application_params)
@@ -275,11 +315,7 @@ class AGTkVSplittedFrames < AGTkSplittedFrames
275
315
  attr_reader :left_frame, :right_frame, :splitter_frame
276
316
  def initialize(parent=nil, frame=nil, width=10, slen=5, perc=false, keys=nil)
277
317
  super(parent, frame, width, slen, keys)
278
- #self.place('relheight'=>1, 'relwidth'=>1, 'bordermode'=>'outside' )
279
- #self.pack(:expand=>true, :fill=>:both)
280
- @left_frame = TkFrame.new(self, Arcadia.style('panel')){
281
- #relief 'flat'
282
- }
318
+ @left_frame = TkFrame.new(self, Arcadia.style('panel'))
283
319
  @frame1 = @left_frame
284
320
  if perc
285
321
  p_width = TkWinfo.screenwidth(self)
@@ -303,10 +339,7 @@ class AGTkVSplittedFrames < AGTkSplittedFrames
303
339
  @left_frame_obj.relwidth = 0
304
340
  @left_frame_obj.relheight = 1
305
341
 
306
- @splitter_frame = TkFrame.new(self, Arcadia.style('splitter')){
307
- #relief 'raised'
308
- #border 1
309
- }
342
+ @splitter_frame = TkFrame.new(self, Arcadia.style('splitter'))
310
343
 
311
344
  @splitter_frame.place(
312
345
  'relx' => 0,
@@ -321,81 +354,99 @@ class AGTkVSplittedFrames < AGTkSplittedFrames
321
354
  "ButtonRelease-1",
322
355
  proc{do_resize}
323
356
  )
324
- _self = self
325
- @b_left = TkButton.new(nil, Arcadia.style('button')){
326
- image TkPhotoImage.new('dat'=>LEFT_SIDE_GIF)
327
- }
328
-
329
- @b_right = TkButton.new(nil, Arcadia.style('button')){
330
- image TkPhotoImage.new('dat'=>RIGHT_SIDE_GIF)
331
- }
332
- @proc_unplace = proc{
333
- @b_left.unplace
334
- @b_right.unplace
335
- }
336
- @splitter_frame.bind_append(
337
- "B1-Motion",
338
- proc{@splitter_frame.raise;@proc_unplace.call}
339
- )
340
- @@last_b_left = nil
341
- @@last_b_right = nil
342
- @b_left.bind_append('ButtonPress-1',proc{_self.hide_left;@proc_unplace.call})
343
- @b_right.bind_append('ButtonPress-1',proc{_self.hide_right;@proc_unplace.call})
344
- @proc_place = proc{|x,y|
345
- if !TkWinfo.mapped?(@b_left)
346
- _x = TkWinfo.pointerx(self) - 10
347
- _y = TkWinfo.pointery(self) - 20
348
- if @@last_b_left != nil
349
- @@last_b_left.unplace
350
- @@last_b_right.unplace
351
- end
352
- @b_left.place('x'=>_x,'y'=>_y,'border'=>'outside')
353
- @b_right.place('x'=>_x,'y'=>_y+25,'border'=>'outside')
354
- @b_left.raise
355
- @b_right.raise
356
- @@last_b_left = @b_left
357
- @@last_b_right = @b_right
358
- if @thread_unplace
359
- @thread_unplace.kill
360
- end
361
- @thread_unplace= Thread.new {
362
- sleep(5)
363
- @proc_unplace.call
364
- kill
365
- }
366
- end
367
- }
368
-
369
- @splitter_frame.bind_append(
370
- 'ButtonPress-1',
371
- proc{|x,y|
372
- @thread_place= Thread.new {
373
- @proc_place.call(x,y)
374
- }
375
- }, "%x %y")
376
-
357
+ #-----
358
+ #-----
359
+ # _self = self
360
+ # @b_left = TkButton.new(nil, Arcadia.style('button')){
361
+ # image TkPhotoImage.new('dat'=>LEFT_SIDE_GIF)
362
+ # }
363
+ #
364
+ # @b_right = TkButton.new(nil, Arcadia.style('button')){
365
+ # image TkPhotoImage.new('dat'=>RIGHT_SIDE_GIF)
366
+ # }
367
+ # @proc_unplace = proc{
368
+ # @b_left.unplace
369
+ # @b_right.unplace
370
+ # }
377
371
  # @splitter_frame.bind_append(
378
- # "Enter",
379
- # proc{
380
- # @color_save = @splitter_frame.background
381
- # @splitter_frame.background(Arcadia.conf('splitter.highlightbackground'))}
382
- # #@splitter_frame.background('#9aa6a7')}
372
+ # "B1-Motion",
373
+ # proc{@splitter_frame.raise;@proc_unplace.call}
383
374
  # )
375
+ # @@last_b_left = nil
376
+ # @@last_b_right = nil
377
+ # @b_left.bind_append('ButtonPress-1',proc{_self.hide_left;@proc_unplace.call})
378
+ # @b_right.bind_append('ButtonPress-1',proc{_self.hide_right;@proc_unplace.call})
379
+ # @proc_place = proc{|x,y|
380
+ # if !TkWinfo.mapped?(@b_left)
381
+ # _x = TkWinfo.pointerx(self) - 10
382
+ # _y = TkWinfo.pointery(self) - 20
383
+ # if @@last_b_left != nil
384
+ # @@last_b_left.unplace
385
+ # @@last_b_right.unplace
386
+ # end
387
+ # @b_left.place('x'=>_x,'y'=>_y,'border'=>'outside')
388
+ # @b_right.place('x'=>_x,'y'=>_y+25,'border'=>'outside')
389
+ # @b_left.raise
390
+ # @b_right.raise
391
+ # @@last_b_left = @b_left
392
+ # @@last_b_right = @b_right
393
+ # if @thread_unplace
394
+ # @thread_unplace.kill
395
+ # end
396
+ # @thread_unplace= Thread.new {
397
+ # sleep(5)
398
+ # @proc_unplace.call
399
+ # kill
400
+ # }
401
+ # end
402
+ # }
403
+ #
384
404
  # @splitter_frame.bind_append(
385
- # "Leave",
386
- # proc{
387
- # @splitter_frame.background(@color_save)
405
+ # 'ButtonPress-1',
406
+ # proc{|x,y|
407
+ # @thread_place= Thread.new {
408
+ # @proc_place.call(x,y)
388
409
  # }
389
- # )
410
+ # }, "%x %y")
411
+ #-----
412
+ #-----
413
+ _xbutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
414
+ background '#4966d7'
415
+ }
416
+ _xbutton.place(
417
+ 'x' => 0,
418
+ 'y' => 0,
419
+ 'relwidth' => 1,
420
+ 'bordermode' => 'outside',
421
+ 'height' => 20
422
+ )
423
+ _xbutton.bind_append(
424
+ "ButtonPress-1",
425
+ proc{hide_left}
426
+ )
427
+ _ybutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
428
+ background '#118124'
429
+ }
430
+ _ybutton.place(
431
+ 'x' => 0,
432
+ 'y' => 21,
433
+ 'bordermode' => 'outside',
434
+ 'height' => 20,
435
+ 'relwidth' => 1
436
+ )
437
+ _ybutton.bind_append(
438
+ "ButtonPress-1",
439
+ proc{hide_right}
440
+ )
441
+ #-----
442
+ #-----
390
443
  @splitter_frame_obj = AGTkObjPlace.new(@splitter_frame, 'x')
391
444
  @splitter_frame_obj.width = @slen
392
445
  @splitter_frame_obj.height = 0
393
446
  @splitter_frame_obj.relwidth = 0
394
447
  @splitter_frame_obj.relheight = 1
395
448
  x = x + @slen
396
- @right_frame = TkFrame.new(self, Arcadia.style('panel')){
397
- #relief 'flat'
398
- }
449
+ @right_frame = TkFrame.new(self, Arcadia.style('panel'))
399
450
  @frame2 = @right_frame
400
451
  @right_frame.place(
401
452
  'relwidth' => 1,
@@ -506,15 +557,6 @@ class AGTkOSplittedFrames < AGTkSplittedFrames
506
557
  attr_reader :top_frame, :bottom_frame, :splitter_frame
507
558
  def initialize(parent=nil, frame=nil, height=10, slen=5, perc=false, keys=nil)
508
559
  super(parent, frame, height, slen, keys)
509
- # self.place(
510
- # 'relwidth' => 1,
511
- # 'relx' => 0,
512
- # 'x' => 0,
513
- # 'y' => 0,
514
- # 'relheight' => 1,
515
- # 'rely' => 0,
516
- # 'bordermode' => 'inside'
517
- # )
518
560
  @top_frame = TkFrame.new(self, Arcadia.style('panel')){
519
561
  # relief 'flat'
520
562
  }
@@ -584,8 +626,6 @@ class AGTkOSplittedFrames < AGTkSplittedFrames
584
626
  @bottom_frame_obj.relheight = 1
585
627
  _xbutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
586
628
  background '#4966d7'
587
- #overrelief 'raised'
588
- #relief 'flat'
589
629
  }
590
630
  _xbutton.place(
591
631
  'x' => 0,
@@ -600,8 +640,6 @@ class AGTkOSplittedFrames < AGTkSplittedFrames
600
640
  )
601
641
  _ybutton = TkButton.new(@splitter_frame, Arcadia.style('toolbarbutton')){
602
642
  background '#118124'
603
- #overrelief 'raised'
604
- #relief 'flat'
605
643
  }
606
644
  _ybutton.place(
607
645
  'x' => 21,
@@ -1172,7 +1210,8 @@ end
1172
1210
  class TclTkInfo
1173
1211
  attr_reader :level
1174
1212
  def initialize
1175
- @level = TclTkIp.new._eval "info patchlevel"
1213
+ @level = Tk.tk_call( "eval", "info patchlevel")
1214
+ # @level = TclTkIp.new._eval "info patchlevel"
1176
1215
  end
1177
1216
  end
1178
1217