arcadia 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +90 -28
  3. data/conf/LC/en-UK.LANG +6 -0
  4. data/conf/LC/ru-RU.LANG +0 -0
  5. data/conf/arcadia.conf +8 -4
  6. data/conf/arcadia.res.rb +86 -1
  7. data/conf/theme-dark.conf +2 -1
  8. data/ext/ae-breakpoints/ae-breakpoints.rb +1 -1
  9. data/ext/ae-dir-projects/ae-dir-projects.rb +42 -6
  10. data/ext/ae-editor/ae-editor.rb +227 -120
  11. data/ext/ae-editor/langs/coderay.tokens +0 -0
  12. data/ext/ae-editor/langs/conf.lang +0 -0
  13. data/ext/ae-editor/langs/css.lang +0 -0
  14. data/ext/ae-editor/langs/html.lang +0 -0
  15. data/ext/ae-editor/langs/java.lang +0 -0
  16. data/ext/ae-editor/langs/python.lang +0 -0
  17. data/ext/ae-editor/langs/ruby.lang +0 -0
  18. data/ext/ae-editor/langs/text.lang +0 -0
  19. data/ext/ae-editor/langs/xml.lang +0 -0
  20. data/ext/ae-editor/lib/rbeautify.rb +0 -0
  21. data/ext/ae-file-history/ae-file-history.rb +4 -3
  22. data/ext/ae-output/ae-output.rb +44 -31
  23. data/ext/ae-ruby-debug/ae-ruby-debug.conf +3 -2
  24. data/ext/ae-ruby-debug/ae-ruby-debug.rb +1 -0
  25. data/ext/ae-search-in-files/ae-search-in-files.rb +3 -3
  26. data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.conf +0 -0
  27. data/ext/ae-search-in-files/ext/ack-in-files/ack-in-files.rb +0 -0
  28. data/ext/ae-shell/ae-shell.rb +37 -15
  29. data/ext/ae-subprocess-inspector/ae-subprocess-inspector.rb +14 -8
  30. data/ext/ae-subprocess-inspector/butterfly.res +0 -0
  31. data/ext/ae-subprocess-inspector/process.res +0 -0
  32. data/ext/ae-subprocess-inspector/space-invader.res +0 -0
  33. data/ext/ae-term/ae-term.conf +0 -0
  34. data/ext/ae-term/ae-term.rb +0 -0
  35. data/ext/test-shutdown-after-startup/test-shutdown-after-startup.conf +0 -0
  36. data/ext/test-shutdown-after-startup/test-shutdown-after-startup.rb +0 -0
  37. data/lib/a-commons.rb +1 -1
  38. data/lib/a-contracts.rb +13 -3
  39. data/lib/a-core.rb +612 -142
  40. data/lib/a-tkcommons.rb +661 -50
  41. data/lib/anigif.rb +0 -0
  42. data/lib/iosync.rb +71 -0
  43. data/tcl/anigif/anigif.tcl +0 -0
  44. data/tcl/anigif/pkgIndex.tcl +0 -0
  45. metadata +5 -2
@@ -98,7 +98,7 @@ module TkMovable
98
98
  @moving_obj_m = _moving_obj
99
99
  @moved_obj_m = _moved_obj
100
100
  @moving_obj_m.bind_append("B1-Motion", proc{|x, y| moving_do_move_obj(x,y)},"%x %y")
101
- @moving_obj_m.bind_append("ButtonPress-1", proc{|e| moving_do_press(e.x, e.y)})
101
+ @moving_obj_m.bind_append("ButtonPress-1", proc{|x, y| moving_do_press(x, y)},"%x %y")
102
102
  end
103
103
 
104
104
  def stop_moving
@@ -128,7 +128,7 @@ module TkResizable
128
128
  @moving_obj_r = _moving_obj
129
129
  @moved_obj_r = _moved_obj
130
130
  @moving_obj_r.bind_append("B1-Motion", proc{|x, y| resizing_do_move_obj(x,y)},"%x %y")
131
- @moving_obj_r.bind_append("ButtonPress-1", proc{|e| resizing_do_press(e.x, e.y)})
131
+ @moving_obj_r.bind_append("ButtonPress-1", proc{|x, y| resizing_do_press(x, y)},"%x %y")
132
132
  end
133
133
 
134
134
  def stop_resizing
@@ -189,7 +189,7 @@ class AGTkObjPlace
189
189
  @cursor = _cursor
190
190
  if _bind
191
191
  @obj.bind_append("Enter", proc{|x, y| do_enter(x, y)}, "%x %y")
192
- @obj.bind_append("ButtonPress-1", proc{|e| do_press(e.x, e.y)})
192
+ @obj.bind_append("ButtonPress-1", proc{|x, y| do_press(x,y)}, "%x %y")
193
193
  @obj.bind_append("B1-Motion", proc{|x, y| do_motion(x,y)},"%x %y")
194
194
  end
195
195
  end
@@ -289,6 +289,9 @@ class TkFrameAdapter < TkFrame
289
289
  end
290
290
 
291
291
  def attach_frame(_frame, _extension = nil, _frame_index=0)
292
+ if _frame.kind_of?(Tk::ScrollFrame)
293
+ _frame = _frame.baseframe
294
+ end
292
295
  @frame = _frame
293
296
  refresh_layout_manager
294
297
  self.map
@@ -820,9 +823,281 @@ class AGTkOSplittedFrames < AGTkSplittedFrames
820
823
 
821
824
  def show(_name)
822
825
  end
826
+
827
+ end
828
+
829
+
830
+ class Tk::ScrollFrame < TkFrame
831
+ include TkComposite
832
+
833
+ # DEFAULT_WIDTH = 200
834
+ # DEFAULT_HEIGHT = 200
835
+
836
+ def baseframe
837
+ #@frame
838
+ @base
839
+ end
840
+
841
+ def initialize_composite(keys={})
842
+ #@frame.configure(:width=>DEFAULT_WIDTH, :height=>DEFAULT_HEIGHT)
843
+
844
+ # create scrollbars
845
+ # @h_scroll = TkScrollbar.new(@frame, 'orient'=>'horizontal')
846
+ # @v_scroll = TkScrollbar.new(@frame, 'orient'=>'vertical')
823
847
 
848
+ @v_scroll = Arcadia.wf.scrollbar(@frame,{'orient'=>'vertical'})
849
+ @h_scroll = Arcadia.wf.scrollbar(@frame,{'orient'=>'horizontal'})
850
+
851
+
852
+ # create a canvas widget
853
+ @canvas = TkCanvas.new(@frame,
854
+ :borderwidth=>0, :selectborderwidth=>0,
855
+ :highlightthickness=>0)
856
+
857
+ # allignment
858
+ TkGrid.rowconfigure(@frame, 0, 'weight'=>1, 'minsize'=>0)
859
+ TkGrid.columnconfigure(@frame, 0, 'weight'=>1, 'minsize'=>0)
860
+ @canvas.grid('row'=>0, 'column'=>0, 'sticky'=>'news')
861
+ @frame.grid_propagate(false)
862
+
863
+ # assign scrollbars
864
+ @canvas.xscrollbar(@h_scroll)
865
+ @canvas.yscrollbar(@v_scroll)
866
+
867
+ # convert hash keys
868
+ keys = _symbolkey2str(keys)
869
+
870
+ # check options for the frame
871
+ framekeys = {}
872
+ if keys.key?('classname')
873
+ keys['class'] = keys.delete('classname')
874
+ end
875
+ if @classname = keys.delete('class')
876
+ framekeys['class'] = @classname
877
+ end
878
+ if @colormap = keys.delete('colormap')
879
+ framekeys['colormap'] = @colormap
880
+ end
881
+ if @container = keys.delete('container')
882
+ framekeys['container'] = @container
883
+ end
884
+ if @visual = keys.delete('visual')
885
+ framekeys['visual'] = @visual
886
+ end
887
+ if @classname.kind_of? TkBindTag
888
+ @db_class = @classname
889
+ @classname = @classname.id
890
+ elsif @classname
891
+ @db_class = TkDatabaseClass.new(@classname)
892
+ else
893
+ @db_class = self.class
894
+ @classname = @db_class::WidgetClassName
895
+ end
896
+
897
+ # create base frame
898
+ @base = TkFrame.new(@canvas, framekeys)
899
+
900
+ # embed base frame
901
+ @cwin = TkcWindow.new(@canvas, [0, 0], :window=>@base, :anchor=>'nw')
902
+ @canvas.scrollregion(@cwin.bbox)
903
+
904
+ # binding to reset scrollregion
905
+ @base.bind('Configure'){_reset_scrollregion(nil, nil) }
906
+
907
+ # set default receiver of method calls
908
+ @path = @base.path
909
+
910
+ # scrollbars ON
911
+ vscroll(keys.delete('vscroll'){true})
912
+ hscroll(keys.delete('hscroll'){true})
913
+
914
+ # please check the differences of the following definitions
915
+ # option_methods(
916
+ # :scrollbarwidth
917
+ # )
918
+
919
+ # set receiver widgets for configure methods (with alias)
920
+ delegate_alias('scrollbarrelief', 'relief', @h_scroll, @v_scroll)
921
+
922
+ # set receiver widgets for configure methods
923
+ delegate('DEFAULT', @base)
924
+ delegate('background', @frame, @base, @canvas, @h_scroll, @v_scroll)
925
+ delegate('width', @frame)
926
+ delegate('height', @frame)
927
+ delegate('activebackground', @h_scroll, @v_scroll)
928
+ delegate('troughcolor', @h_scroll, @v_scroll)
929
+ delegate('repeatdelay', @h_scroll, @v_scroll)
930
+ delegate('repeatinterval', @h_scroll, @v_scroll)
931
+ delegate('borderwidth', @frame)
932
+ delegate('relief', @frame)
933
+
934
+ # do configure
935
+ configure keys unless keys.empty?
936
+
937
+ @canvas.yscrollcommand(proc{|first,last|
938
+ do_yscrollcommand(first,last)
939
+ })
940
+
941
+ @canvas.xscrollcommand(proc{|first,last|
942
+ do_xscrollcommand(first,last)
943
+ })
944
+
945
+ end
946
+
947
+
948
+ def y_scrolled?
949
+ TkWinfo.mapped?(@v_scroll)
950
+ end
951
+
952
+ def x_scrolled?
953
+ TkWinfo.mapped?(@h_scroll)
954
+ end
955
+
956
+ def yview_moveto(_index)
957
+ @canvas.yview_moveto(_index)
958
+ end
959
+
960
+ def xview_moveto(_index)
961
+ @canvas.xview_moveto(_index)
962
+ end
963
+
964
+ def do_yscrollcommand(first,last)
965
+ if first != nil && last != nil
966
+ delta = last.to_f - first.to_f
967
+ if delta != @last_y_delta
968
+ if delta < 1 && delta > 0 && last != @last_y_last
969
+ vscroll(true)
970
+ begin
971
+ @v_scroll.set(first,last) if TkWinfo.mapped?(@v_scroll)
972
+ rescue Exception => e
973
+ Arcadia.runtime_error(e)
974
+ end
975
+ elsif delta == 1 || delta == 0
976
+ vscroll(false)
977
+ end
978
+ end
979
+ @last_y_last = last if last.to_f < 1
980
+ @last_y_delta = delta
981
+ end
982
+ end
983
+
984
+ def do_xscrollcommand(first,last)
985
+ if first != nil && last != nil
986
+ delta = last.to_f - first.to_f
987
+ if delta != @last_x_delta
988
+ if delta < 1 && delta > 0.2 && last != @last_x_last
989
+ hscroll(true)
990
+ begin
991
+ @h_scroll.set(first,last) if TkWinfo.mapped?(@h_scroll)
992
+ rescue Exception => e
993
+ Arcadia.runtime_error(e)
994
+ end
995
+ elsif delta == 1 || delta == 0
996
+ hscroll(false)
997
+ end
998
+ end
999
+ @last_x_last = last if last.to_f < 1
1000
+ @last_x_delta = delta
1001
+ end
1002
+ end
1003
+
1004
+ # callback for Configure event
1005
+ def _reset_scrollregion(h_mod=nil, v_mod=nil)
1006
+ cx1, cy1, cx2, cy2 = @canvas.scrollregion
1007
+ x1, y1, x2, y2 = @cwin.bbox
1008
+ @canvas.scrollregion([x1, y1, x2, y2])
1009
+
1010
+ if h_mod.nil? && v_mod.nil?
1011
+ if x2 != cx2 && TkGrid.info(@h_scroll).size == 0
1012
+ @frame.grid_propagate(true)
1013
+ @canvas.width = x2
1014
+ Tk.update_idletasks
1015
+ @frame.grid_propagate(false)
1016
+ end
1017
+ if y2 != cy2 && TkGrid.info(@v_scroll).size == 0
1018
+ @frame.grid_propagate(true)
1019
+ @canvas.height = y2
1020
+ Tk.update_idletasks
1021
+ @frame.grid_propagate(false)
1022
+ end
1023
+ else
1024
+ @h_scroll.ungrid if h_mod == false
1025
+ @v_scroll.ungrid if v_mod == false
1026
+
1027
+ h_flag = (TkGrid.info(@h_scroll).size == 0)
1028
+ v_flag = (TkGrid.info(@v_scroll).size == 0)
1029
+
1030
+ @frame.grid_propagate(true)
1031
+
1032
+ @canvas.width = (h_flag)? x2: @canvas.winfo_width
1033
+ @canvas.height = (v_flag)? y2: @canvas.winfo_height
1034
+
1035
+ @h_scroll.grid('row'=>1, 'column'=>0, 'sticky'=>'ew') if h_mod
1036
+ @v_scroll.grid('row'=>0, 'column'=>1, 'sticky'=>'ns') if v_mod
1037
+
1038
+ Tk.update_idletasks
1039
+
1040
+ @frame.grid_propagate(false)
1041
+ end
1042
+ end
1043
+ private :_reset_scrollregion
1044
+
1045
+ # forbid to change binding of @base frame
1046
+ def bind(*args)
1047
+ @frame.bind(*args)
1048
+ end
1049
+ def bind_append(*args)
1050
+ @frame.bind_append(*args)
1051
+ end
1052
+ def bind_remove(*args)
1053
+ @frame.bind_remove(*args)
1054
+ end
1055
+ def bindinfo(*args)
1056
+ @frame.bindinfo(*args)
1057
+ end
1058
+
1059
+ # set width of scrollbar
1060
+ # def scrollbarwidth(width = nil)
1061
+ # if width
1062
+ # @h_scroll.width(width)
1063
+ # @v_scroll.width(width)
1064
+ # else
1065
+ # @h_scroll.width
1066
+ # end
1067
+ # end
1068
+
1069
+ # vertical scrollbar : ON/OFF
1070
+ def vscroll(mode)
1071
+ Tk.update_idletasks
1072
+ st = TkGrid.info(@v_scroll)
1073
+ if mode && st.size == 0 then
1074
+ # @v_scroll.grid('row'=>0, 'column'=>1, 'sticky'=>'ns')
1075
+ _reset_scrollregion(nil, true)
1076
+ elsif !mode && st.size != 0 then
1077
+ _reset_scrollregion(nil, false)
1078
+ else
1079
+ _reset_scrollregion(nil, nil)
1080
+ end
1081
+ self
1082
+ end
1083
+
1084
+ # horizontal scrollbar : ON/OFF
1085
+ def hscroll(mode)
1086
+ Tk.update_idletasks
1087
+ st = TkGrid.info(@h_scroll)
1088
+ if mode && st.size == 0 then
1089
+ _reset_scrollregion(true, nil)
1090
+ elsif !mode && st.size != 0 then
1091
+ _reset_scrollregion(false, nil)
1092
+ else
1093
+ _reset_scrollregion(nil, nil)
1094
+ end
1095
+ self
1096
+ end
824
1097
  end
825
1098
 
1099
+
1100
+
826
1101
  class TkBaseTitledFrame < TkFrame
827
1102
  attr_reader :frame
828
1103
  attr_reader :top
@@ -856,6 +1131,7 @@ class TkBaseTitledFrame < TkFrame
856
1131
  end
857
1132
 
858
1133
  def create_frame
1134
+ # return Tk::ScrollFrame.new(self).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
859
1135
  return TkFrame.new(self,Arcadia.style('panel')).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
860
1136
  end
861
1137
 
@@ -1649,7 +1925,7 @@ end
1649
1925
  class TkTitledScrollFrame < TkTitledFrame
1650
1926
 
1651
1927
  def create_frame
1652
- return Tk::ScrollFrame.new(self,:scrollbarwidth=>10, :width=>300, :height=>200).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
1928
+ return Tk::ScrollFrame.new(self).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
1653
1929
  end
1654
1930
 
1655
1931
  end
@@ -1927,9 +2203,16 @@ end
1927
2203
  class TkWidgetFactory
1928
2204
 
1929
2205
  module WidgetEnhancer
2206
+
1930
2207
  def hint=(_hint=nil)
2208
+ hint(_hint)
2209
+ end
2210
+
2211
+ def hint(_hint=nil)
1931
2212
  Tk::BWidget::DynamicHelp::add(self, 'text'=>_hint) if _hint
2213
+ self
1932
2214
  end
2215
+
1933
2216
  end
1934
2217
 
1935
2218
  def initialize
@@ -2142,11 +2425,34 @@ class TkWidgetFactory
2142
2425
  ])
2143
2426
 
2144
2427
 
2428
+ #TFrame
2429
+ Tk::Tile::Style.configure("Arcadia.TFrame", Arcadia.style('panel'))
2430
+
2431
+
2432
+
2145
2433
  #Tk::Tile::Style.configure(Tk::Tile::TLabel, Arcadia.style('label'))
2146
2434
  #TLabel
2147
2435
  Tk::Tile::Style.configure("Arcadia.TLabel", Arcadia.style('label'))
2148
2436
 
2149
2437
 
2438
+ #TEntry
2439
+ Tk::Tile::Style.layout("Arcadia.TEntry", [
2440
+ 'Entry.border', { :sticky => 'nswe', :border => 1,
2441
+ :children => ['Entry.padding', { :sticky => 'nswe',
2442
+ :children => [ 'Entry.textarea', { :sticky => 'nswe' } ] }] } ])
2443
+
2444
+
2445
+ Tk::Tile::Style.configure("Arcadia.TEntry", Arcadia.style('edit').update(
2446
+ 'fieldbackground' => Arcadia.style('edit')['background'],
2447
+ 'selectbackground' => 'red',
2448
+ 'selectforeground' => 'yellow'
2449
+ )
2450
+ )
2451
+
2452
+ #TText
2453
+ Tk::Tile::Style.configure("Arcadia.TText", Arcadia.style('text'))
2454
+
2455
+
2150
2456
  #TButton
2151
2457
  Tk::Tile::Style.configure("Arcadia.TButton", Arcadia.style('button').update(
2152
2458
  'padding'=>"0 0 0 0"
@@ -2201,6 +2507,24 @@ class TkWidgetFactory
2201
2507
  end
2202
2508
  end
2203
2509
 
2510
+ def frame(_parent,_args={}, &b)
2511
+ begin
2512
+ if @use_tile
2513
+ obj = Tk::Tile::TFrame.new(_parent,{:style=>"Arcadia.TFrame"}.update(_args), &b)
2514
+ else
2515
+ obj = TkFrame.new(_parent,Arcadia.style('panel').update(_args), &b)
2516
+ end
2517
+ class << obj
2518
+ include WidgetEnhancer
2519
+ end
2520
+ return obj
2521
+ rescue RuntimeError => e
2522
+ Arcadia.runtime_error(e)
2523
+ return nil
2524
+ end
2525
+ end
2526
+
2527
+
2204
2528
  def label(_parent,_args={}, &b)
2205
2529
  begin
2206
2530
  if @use_tile
@@ -2218,6 +2542,40 @@ class TkWidgetFactory
2218
2542
  end
2219
2543
  end
2220
2544
 
2545
+ def entry(_parent,_args={}, &b)
2546
+ begin
2547
+ if @use_tile
2548
+ obj = Tk::Tile::TEntry.new(_parent,{:style=>"Arcadia.TEntry"}.update(_args), &b)
2549
+ else
2550
+ obj = TkEntry.new(_parent,Arcadia.style('edit').update(_args), &b)
2551
+ end
2552
+ class << obj
2553
+ include WidgetEnhancer
2554
+ end
2555
+ return obj
2556
+ rescue RuntimeError => e
2557
+ Arcadia.runtime_error(e)
2558
+ return nil
2559
+ end
2560
+ end
2561
+
2562
+ def text(_parent,_args={}, &b)
2563
+ begin
2564
+ # if @use_tile
2565
+ # obj = Tk::Tile::Text.new(_parent,{:style=>"Arcadia.TText"}.update(_args), &b)
2566
+ # else
2567
+ obj = TkText.new(_parent,Arcadia.style('text').update(_args), &b)
2568
+ # end
2569
+ class << obj
2570
+ include WidgetEnhancer
2571
+ end
2572
+ return obj
2573
+ rescue RuntimeError => e
2574
+ Arcadia.runtime_error(e)
2575
+ return nil
2576
+ end
2577
+ end
2578
+
2221
2579
  def button(_parent,_args={}, &b)
2222
2580
  begin
2223
2581
  if @use_tile
@@ -2667,15 +3025,16 @@ module TkScrollableWidget
2667
3025
  _w != nil ? @w=_w : @w=-@x
2668
3026
  _h != nil ? @h=_h : @h=-@y
2669
3027
  @widget.place(
2670
- 'x'=>@x,
2671
- 'y'=>@y,
2672
- 'width' => @w,
2673
- 'height' => @h,
2674
- 'relheight'=>1,
2675
- 'relwidth'=>1,
2676
- 'bordermode'=>_border_mode
3028
+ 'x'=>@x,
3029
+ 'y'=>@y,
3030
+ 'width' => @w,
3031
+ 'height' => @h,
3032
+ 'relheight'=>1,
3033
+ 'relwidth'=>1,
3034
+ 'bordermode'=>_border_mode
2677
3035
  )
2678
3036
  @widget.raise
3037
+ @widget_manager = 'place'
2679
3038
  if @v_scroll_on
2680
3039
  show_v_scroll(true)
2681
3040
  end
@@ -2690,9 +3049,13 @@ module TkScrollableWidget
2690
3049
  end
2691
3050
  end
2692
3051
 
3052
+ def widget_manager
3053
+ defined?(@widget_manager)? @widget_manager : nil
3054
+ end
3055
+
2693
3056
  def hide
2694
3057
  disarm_scroll_binding
2695
- @widget.unplace
3058
+ @widget.unplace if widget_manager == 'place'
2696
3059
  @v_scroll.unpack
2697
3060
  @h_scroll.unpack
2698
3061
  end
@@ -2722,7 +3085,7 @@ module TkScrollableWidget
2722
3085
  def show_v_scroll(_force=false)
2723
3086
  if _force || !@v_scroll_on
2724
3087
  begin
2725
- @widget.place('width' => -@scroll_width-@x)
3088
+ @widget.place('width' => -@scroll_width-@x) if widget_manager == 'place'
2726
3089
  @v_scroll.pack('side' => 'right', 'fill' => 'y')
2727
3090
  @v_scroll_on = true
2728
3091
  @v_scroll.raise
@@ -2743,7 +3106,7 @@ module TkScrollableWidget
2743
3106
  def show_h_scroll(_force=false)
2744
3107
  if _force || !@h_scroll_on
2745
3108
  begin
2746
- @widget.place('height' => -@scroll_width-@y)
3109
+ @widget.place('height' => -@scroll_width-@y) if widget_manager == 'place'
2747
3110
  @h_scroll.pack('side' => 'bottom', 'fill' => 'x')
2748
3111
  @h_scroll_on = true
2749
3112
  @h_scroll.raise
@@ -2764,7 +3127,7 @@ module TkScrollableWidget
2764
3127
  def hide_v_scroll
2765
3128
  if @v_scroll_on
2766
3129
  begin
2767
- @widget.place('width' => 0)
3130
+ @widget.place('width' => 0) if widget_manager == 'place'
2768
3131
  @v_scroll.unpack
2769
3132
  @v_scroll_on = false
2770
3133
  rescue RuntimeError => e
@@ -2778,7 +3141,7 @@ module TkScrollableWidget
2778
3141
  def hide_h_scroll
2779
3142
  if @h_scroll_on
2780
3143
  begin
2781
- @widget.place('height' => 0)
3144
+ @widget.place('height' => 0) if widget_manager == 'place'
2782
3145
  @h_scroll.unpack
2783
3146
  @h_scroll_on = false
2784
3147
  rescue RuntimeError => e
@@ -2801,8 +3164,8 @@ class KeyTest < TkFloatTitledFrame
2801
3164
  background Arcadia.conf("background")
2802
3165
  foreground Arcadia.conf("foreground")
2803
3166
  #place('relwidth' => '1','relx' => 0,'x' => '0','y' => '0','relheight' => '1','rely' => 0,'height' => '0','bordermode' => 'inside','width' => '0')
2804
- }.bind("KeyPress"){|e|
2805
- @ttest.insert('end'," "+e.keysym+" ")
3167
+ }.bind("KeyPress", "%K"){|_keysym|
3168
+ @ttest.insert('end'," "+_keysym+" ")
2806
3169
  break
2807
3170
  }
2808
3171
  @ttest.extend(TkScrollableWidget).show
@@ -2820,6 +3183,7 @@ class HinnerDialog < TkFrame
2820
3183
  newargs.update(args)
2821
3184
  end
2822
3185
  super(Arcadia.layout.parent_frame, newargs)
3186
+
2823
3187
  case side
2824
3188
  when 'top'
2825
3189
  # self.pack('side' =>side,'before'=>Arcadia.layout.root, 'anchor'=>'nw','fill'=>'both', 'padx'=>0, 'pady'=>0, 'expand'=>'yes')
@@ -2830,6 +3194,108 @@ class HinnerDialog < TkFrame
2830
3194
  @modal = false
2831
3195
  end
2832
3196
 
3197
+ def make_scrollable_frame(_frame)
3198
+
3199
+
3200
+ TkGrid.rowconfigure(_frame, 0, 'weight'=>1, 'minsize'=>0)
3201
+ TkGrid.columnconfigure(_frame, 0, 'weight'=>1, 'minsize'=>0)
3202
+ canvas = TkCanvas.new(_frame)
3203
+ canvas.grid('row'=>0, 'column'=>0, 'sticky'=>'news')
3204
+
3205
+
3206
+ v_scroll = Arcadia.wf.scrollbar(_frame,{'orient'=>'vertical'})
3207
+ h_scroll = Arcadia.wf.scrollbar(_frame,{'orient'=>'horizontal'})
3208
+
3209
+
3210
+
3211
+
3212
+ p_vscroll = proc{|mode|
3213
+ st = TkGrid.info(v_scroll)
3214
+ if mode && st.size == 0 then
3215
+ v_scroll.grid('row'=>0, 'column'=>1, 'sticky'=>'ns')
3216
+ elsif mode == false
3217
+ v_scroll.ungrid
3218
+ end
3219
+ }
3220
+
3221
+ p_hscroll = proc{|mode|
3222
+ st = TkGrid.info(h_scroll)
3223
+ if mode && st.size == 0 then
3224
+ h_scroll.grid('row'=>1, 'column'=>0, 'sticky'=>'ew')
3225
+ elsif mode == false
3226
+ h_scroll.ungrid
3227
+ end
3228
+ }
3229
+
3230
+ p_do_yscrollcommand = proc{|first,last|
3231
+ if first != nil && last != nil
3232
+ delta = last.to_f - first.to_f
3233
+ if delta != @last_y_delta
3234
+ if delta < 1 && delta > 0 && last != @last_y_last
3235
+ p_vscroll.call(true)
3236
+ begin
3237
+ v_scroll.set(first,last)
3238
+ rescue Exception => e
3239
+ Arcadia.runtime_error(e)
3240
+ end
3241
+ elsif delta == 1 || delta == 0
3242
+ p_vscroll.call(false)
3243
+ end
3244
+ end
3245
+ @last_y_last = last if last.to_f < 1
3246
+ @last_y_delta = delta
3247
+ end
3248
+ }
3249
+
3250
+ p_do_xscrollcommand = proc{|first,last|
3251
+ if first != nil && last != nil
3252
+ delta = last.to_f - first.to_f
3253
+ if delta != @last_x_delta
3254
+ if delta < 1 && delta > 0 && last != @last_x_last
3255
+ p_hscroll.call(true)
3256
+ begin
3257
+ h_scroll.set(first,last)
3258
+ rescue Exception => e
3259
+ Arcadia.runtime_error(e)
3260
+ end
3261
+ elsif delta == 1 || delta == 0
3262
+ p_hscroll.call(false)
3263
+ end
3264
+ end
3265
+ @last_x_last = last if last.to_f < 1
3266
+ @last_x_delta = delta
3267
+ end
3268
+ }
3269
+
3270
+ canvas.yscrollbar(v_scroll)
3271
+ canvas.xscrollbar(h_scroll)
3272
+
3273
+
3274
+ canvas.yscrollcommand(proc{|first,last|
3275
+ p_do_yscrollcommand.call(first,last)
3276
+ })
3277
+
3278
+ canvas.xscrollcommand(proc{|first,last|
3279
+ p_do_xscrollcommand.call(first,last)
3280
+ })
3281
+
3282
+
3283
+
3284
+ frame = TkFrame.new(canvas)
3285
+
3286
+
3287
+
3288
+ frame.bind("Configure", proc{canvas.configure(:scrollregion=>canvas.bbox("all"))})
3289
+
3290
+
3291
+ cwin = TkcWindow.new(canvas, 0, 0, :window=>frame)
3292
+
3293
+ canvas.scrollregion(cwin.bbox)
3294
+
3295
+ return frame
3296
+
3297
+ end
3298
+
2833
3299
  def is_modal?
2834
3300
  @modal
2835
3301
  end
@@ -2860,9 +3326,9 @@ class HinnerSplittedDialog < HinnerDialog
2860
3326
  attr_reader :frame, :splitter_frame
2861
3327
  def initialize(side='top', height=100, args=nil)
2862
3328
  super(side, args)
2863
- y0 = height
3329
+ @y0= height
2864
3330
  fr = TkFrame.new(self){
2865
- height y0
3331
+ height height
2866
3332
  pack('side' =>side,'padx'=>0, 'pady'=>0, 'fill'=>'x', 'expand'=>'1')
2867
3333
  }
2868
3334
  splitter_frame = TkFrame.new(self, Arcadia.style('splitter')){
@@ -2882,46 +3348,71 @@ class HinnerSplittedDialog < HinnerDialog
2882
3348
  splitter_frame.raise
2883
3349
  } ,"%x %y")
2884
3350
 
2885
- splitter_frame.bind_append("ButtonRelease-1", proc{|e|
3351
+ splitter_frame.bind_append("ButtonRelease-1", proc{
2886
3352
  splitter_frame.configure('cursor'=> oldcursor)
2887
3353
  if side == 'top'
2888
- h = (y0+yx).abs
3354
+ h = (@y0+yx).abs
2889
3355
  elsif side == 'bottom'
2890
- h = (y0-yx).abs
3356
+ h = (@y0-yx).abs
2891
3357
  end
2892
- y0 = h
3358
+ @y0 = h
2893
3359
  fr.configure('height'=>h)
2894
3360
  })
2895
3361
  @frame = fr
2896
3362
  @splitter_frame = splitter_frame
2897
3363
  end
3364
+
3365
+ def height(_h=nil)
3366
+ if _h.nil?
3367
+ @frame.height
3368
+ else
3369
+ @frame.configure('height'=>_h)
3370
+ @y0 = _h
3371
+ end
3372
+ end
2898
3373
  end
2899
3374
 
2900
3375
  class HinnerSplittedDialogTitled < HinnerSplittedDialog
2901
- attr_accessor :hinner_frame
3376
+ attr_accessor :hinner_frame, :titled_frame
2902
3377
  def initialize(title=nil, side='top', height=100, args=nil)
2903
3378
  super(side, height, args)
2904
- btf = TkLabelTitledFrameClosable.new(self.frame, title).place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1)
3379
+ @titled_frame = TkLabelTitledFrameClosable.new(self.frame, title).place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1)
3380
+ @ext_proc = nil
2905
3381
  close = proc{
2906
- self.destroy
2907
- Tk.callback_break
3382
+ do_close
3383
+ #self.destroy
3384
+ #Tk.callback_break
2908
3385
  }
2909
- btf.add_close_action(close)
2910
- @hinner_frame = btf.frame
2911
- end
3386
+ @titled_frame.add_close_action(close)
3387
+ @hinner_frame = @titled_frame.frame
3388
+ #@hinner_frame = make_scrollable_frame(@titled_frame.frame)
3389
+ #@hinner_frame = Tk::ScrollFrame.new(@titled_frame.frame).place('x'=>0, 'y'=>0, 'relheight'=>1, 'relwidth'=>1).baseframe
3390
+ end
3391
+
3392
+ def do_close
3393
+ @ext_proc.call if !@ext_proc.nil?
3394
+ self.destroy
3395
+ Tk.callback_break
3396
+ end
3397
+
3398
+ def on_close=(_proc)
3399
+ @ext_proc = _proc
3400
+ end
3401
+
2912
3402
  end
2913
3403
 
2914
3404
  class HinnerFileDialog < HinnerDialog
2915
3405
  SELECT_FILE_MODE=0
2916
3406
  SAVE_FILE_MODE=1
2917
3407
  SELECT_DIR_MODE=2
2918
- def initialize(mode=SELECT_FILE_MODE , must_exist = nil, side='top',args=nil)
3408
+ def initialize(mode=SELECT_FILE_MODE, must_exist=nil, label=nil, side='top',args=nil)
2919
3409
  super(side, args)
2920
3410
  @mode = mode
2921
3411
  if must_exist.nil?
2922
3412
  must_exist = mode != SAVE_FILE_MODE
2923
3413
  end
2924
3414
  @must_exist = must_exist
3415
+ @label = label
2925
3416
  build_gui
2926
3417
  @closed = false
2927
3418
  end
@@ -2931,6 +3422,9 @@ class HinnerFileDialog < HinnerDialog
2931
3422
  @font_bold = "#{Arcadia.conf('edit.font')} bold"
2932
3423
  @font_metrics = TkFont.new(@font).metrics
2933
3424
  @font_metrics_bold = TkFont.new(@font_bold).metrics
3425
+ if !@label.nil?
3426
+ Arcadia.wf.label(self, 'text' => @label).pack('side' =>'left')
3427
+ end
2934
3428
  @dir_text = TkText.new(self, Arcadia.style('text').update({"height"=>'1',"highlightcolor"=>Arcadia.conf('panel.background'), "bg"=>Arcadia.conf('panel.background')})).pack('side' =>'left','padx'=>5, 'pady'=>5, 'fill'=>'x', 'expand'=>'1')
2935
3429
  #{"bg"=>'white', "height"=>'1', "borderwidth"=>0, 'font'=>@font}
2936
3430
  @dir_text.bind_append("Enter", proc{ @dir_text.set_insert("end")})
@@ -2943,12 +3437,13 @@ class HinnerFileDialog < HinnerDialog
2943
3437
  @dir_text.tag_configure(@tag_selected,'borderwidth'=>0, 'relief'=>'flat', 'underline'=>true)
2944
3438
  @dir_text.tag_bind(@tag_selected,"ButtonRelease-1", proc{
2945
3439
  self.release
3440
+ Tk.callback_break
2946
3441
  } )
2947
3442
  @dir_text.tag_bind(@tag_selected,"Enter", proc{@dir_text.configure('cursor'=> 'hand2')})
2948
3443
  @dir_text.tag_bind(@tag_selected,"Leave", proc{@dir_text.configure('cursor'=> @cursor)})
2949
3444
  _self=self
2950
- @dir_text.bind_append('KeyPress'){|e|
2951
- case e.keysym
3445
+ @dir_text.bind_append('KeyPress', "%K"){|_keysym|
3446
+ case _keysym
2952
3447
  when 'Escape','Tab'
2953
3448
  i1 = @dir_text.index("insert")
2954
3449
  raise_candidates(i1, @dir_text.get("#{i1} linestart", i1))
@@ -2970,8 +3465,8 @@ class HinnerFileDialog < HinnerDialog
2970
3465
  end
2971
3466
  end
2972
3467
  }
2973
- @dir_text.bind_append('KeyRelease'){|e|
2974
- case e.keysym
3468
+ @dir_text.bind_append('KeyRelease', "%K"){|_keysym|
3469
+ case _keysym
2975
3470
  when 'Escape','Tab', "Return"
2976
3471
  else
2977
3472
  @dir_text.tag_remove(@tag_selected,'1.0','end')
@@ -2993,8 +3488,8 @@ class HinnerFileDialog < HinnerDialog
2993
3488
  end
2994
3489
  }
2995
3490
 
2996
- @dir_text.bind_append("Control-KeyPress"){|e|
2997
- case e.keysym
3491
+ @dir_text.bind_append("Control-KeyPress", "%K"){|_keysym|
3492
+ case _keysym
2998
3493
  when 'd'
2999
3494
  _self.close
3000
3495
  Tk.callback_break
@@ -3252,15 +3747,15 @@ class HinnerFileDialog < HinnerDialog
3252
3747
  #filter = @dir_text.get("insert -1 chars wordstart", "insert")
3253
3748
 
3254
3749
 
3255
- @raised_listbox.bind_append('KeyPress'){|e|
3750
+ @raised_listbox.bind_append('KeyPress', "%K %A"){|_keysym, _char|
3256
3751
  is_list_for_update = false
3257
- case e.keysym
3752
+ case _keysym
3258
3753
  when 'a'..'z','A'..'Z','0'..'9'
3259
- @dir_text.insert('end', e.keysym)
3754
+ @dir_text.insert('end', _keysym)
3260
3755
  @dir_text.see("end")
3261
3756
  is_list_for_update = true
3262
3757
  when 'minus'
3263
- @dir_text.insert('end', e.char)
3758
+ @dir_text.insert('end', _char)
3264
3759
  @dir_text.see("end")
3265
3760
  is_list_for_update = true
3266
3761
  when 'period'
@@ -3285,18 +3780,18 @@ class HinnerFileDialog < HinnerDialog
3285
3780
  end
3286
3781
  _update_list.call(get_filter.call) if is_list_for_update
3287
3782
  @raised_listbox.focus
3288
- Tk.callback_break if !["Next","Prior"].include?(e.keysym)
3783
+ Tk.callback_break if !["Next","Prior"].include?(_keysym)
3289
3784
  }
3290
3785
 
3291
- @raised_listbox.bind_append('Shift-KeyPress'){|e|
3786
+ @raised_listbox.bind_append('Shift-KeyPress', "%K %A"){|_keysym, _char|
3292
3787
  is_list_for_update = false
3293
- case e.keysym
3788
+ case _keysym
3294
3789
  when 'asterisk','underscore'
3295
- @dir_text.insert('end', e.char)
3790
+ @dir_text.insert('end', _char)
3296
3791
  @dir_text.see("end")
3297
3792
  is_list_for_update = true
3298
3793
  when 'a'..'z','A'..'Z'
3299
- @dir_text.insert('end', e.keysym)
3794
+ @dir_text.insert('end', _keysym)
3300
3795
  @dir_text.see("end")
3301
3796
  is_list_for_update = true
3302
3797
 
@@ -3306,8 +3801,8 @@ class HinnerFileDialog < HinnerDialog
3306
3801
  Tk.callback_break
3307
3802
  }
3308
3803
 
3309
- @raised_listbox.bind_append('KeyRelease'){|e|
3310
- case e.keysym
3804
+ @raised_listbox.bind_append('KeyRelease', "%K"){|_keysym|
3805
+ case _keysym
3311
3806
  when 'Return'
3312
3807
  _select_value.call
3313
3808
  end
@@ -3366,4 +3861,120 @@ class HinnerFileDialog < HinnerDialog
3366
3861
  return childrens_dir,childrens_file
3367
3862
  end
3368
3863
 
3369
- end
3864
+ end
3865
+
3866
+
3867
+ class HinnerStringDialog < HinnerDialog
3868
+
3869
+ def initialize(label=nil, side='top',args=nil)
3870
+ super(side, args)
3871
+ @label = label
3872
+ build_gui
3873
+ @closed = false
3874
+ end
3875
+
3876
+ def build_gui
3877
+ @font = Arcadia.conf('edit.font')
3878
+ @font_bold = "#{Arcadia.conf('edit.font')} bold"
3879
+ @font_metrics = TkFont.new(@font).metrics
3880
+ @font_metrics_bold = TkFont.new(@font_bold).metrics
3881
+ if !@label.nil?
3882
+ Arcadia.wf.label(self, 'text' => @label).pack('side' =>'left')
3883
+ end
3884
+ @string_text = TkText.new(self, Arcadia.style('text').update({"height"=>'1',"highlightcolor"=>Arcadia.conf('panel.background'), "bg"=>Arcadia.conf('panel.background')})).pack('side' =>'left','padx'=>5, 'pady'=>5, 'fill'=>'x', 'expand'=>'1')
3885
+ #{"bg"=>'white', "height"=>'1', "borderwidth"=>0, 'font'=>@font}
3886
+ @string_text.bind_append("Enter", proc{ @string_text.set_insert("end")})
3887
+
3888
+
3889
+ @tag_selected = "link_selected"
3890
+ @string_text.tag_configure(@tag_selected,'borderwidth'=>0, 'relief'=>'flat', 'underline'=>true)
3891
+ @string_text.tag_bind(@tag_selected,"ButtonRelease-1", proc{
3892
+ self.release
3893
+ } )
3894
+ @string_text.tag_bind(@tag_selected,"Enter", proc{@string_text.configure('cursor'=> 'hand2')})
3895
+ @string_text.tag_bind(@tag_selected,"Leave", proc{@string_text.configure('cursor'=> @cursor)})
3896
+ _self=self
3897
+ @string_text.bind_append('KeyPress', "%K"){|_keysym|
3898
+ case _keysym
3899
+ when "Return"
3900
+ _self.release
3901
+ end
3902
+ }
3903
+ @string_text.bind_append('KeyRelease', "%K"){|_keysym|
3904
+ case _keysym
3905
+ when 'Escape','Tab', "Return"
3906
+ else
3907
+ @string_text.tag_remove(@tag_selected,'1.0','end')
3908
+ @string_text.tag_add(@tag_selected ,'1.0','end')
3909
+ end
3910
+ }
3911
+
3912
+ @string_text.bind_append("Control-KeyPress", "%K"){|_keysym|
3913
+ case _keysym
3914
+ when 'd'
3915
+ _self.close
3916
+ Tk.callback_break
3917
+ end
3918
+ }
3919
+
3920
+ @close_button = Arcadia.wf.toolbutton(self){
3921
+ command proc{_self.close}
3922
+ image Arcadia.image_res(CLOSE_FRAME_GIF)
3923
+ }.pack('side' =>'right','padx'=>5, 'pady'=>0)
3924
+ end
3925
+
3926
+ def string
3927
+ @string_text.focus
3928
+ @string_text.set_insert("end")
3929
+ @string_text.see("end")
3930
+
3931
+ show_modal(false)
3932
+ if @closed == false
3933
+ string_selected = @string_text.get("0.1","end").strip
3934
+ destroy
3935
+ string_selected
3936
+ end
3937
+ end
3938
+
3939
+
3940
+ def close
3941
+ @closed=true
3942
+ self.release
3943
+ destroy
3944
+ end
3945
+
3946
+
3947
+
3948
+ end
3949
+
3950
+
3951
+
3952
+ #class Example(tk.Frame):
3953
+ # def __init__(self, root):
3954
+ #
3955
+ # tk.Frame.__init__(self, root)
3956
+ # self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
3957
+ # self.frame = tk.Frame(self.canvas, background="#ffffff")
3958
+ # self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
3959
+ # self.canvas.configure(yscrollcommand=self.vsb.set)
3960
+ #
3961
+ # self.vsb.pack(side="right", fill="y")
3962
+ # self.canvas.pack(side="left", fill="both", expand=True)
3963
+ # self.canvas.create_window((4,4), window=self.frame, anchor="nw",
3964
+ # tags="self.frame")
3965
+ #
3966
+ # self.frame.bind("<Configure>", self.onFrameConfigure)
3967
+ #
3968
+ # self.populate()
3969
+ #
3970
+ # def populate(self):
3971
+ # '''Put in some fake data'''
3972
+ # for row in range(100):
3973
+ # tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1",
3974
+ # relief="solid").grid(row=row, column=0)
3975
+ # t="this is the second column for row %s" %row
3976
+ # tk.Label(self.frame, text=t).grid(row=row, column=1)
3977
+ #
3978
+ # def onFrameConfigure(self, event):
3979
+ # '''Reset the scroll region to encompass the inner frame'''
3980
+ # self.canvas.configure(scrollregion=self.canvas.bbox("all"))