arcadia 1.0.0 → 1.1.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.
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"))