rbcurse 1.5.0 → 1.5.2

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 (104) hide show
  1. data/Makefile +21 -0
  2. data/Manifest.txt +6 -0
  3. data/README.markdown +6 -4
  4. data/TODO +372 -0
  5. data/TODO2.txt +121 -0
  6. data/VERSION +1 -1
  7. data/examples/README.txt +67 -0
  8. data/examples/abasiclist.rb +33 -0
  9. data/examples/alpmenu.rb +42 -0
  10. data/examples/app.rb +859 -0
  11. data/examples/app.sample +17 -0
  12. data/examples/appdirtree.rb +74 -0
  13. data/examples/appemail.rb +191 -0
  14. data/examples/appemaillb.rb +308 -0
  15. data/examples/appgcompose.rb +315 -0
  16. data/examples/atree.rb +64 -0
  17. data/examples/common/file.rb +40 -0
  18. data/examples/common/rmail.rb +257 -0
  19. data/examples/data.txt +683 -0
  20. data/examples/data/README.markdown +9 -0
  21. data/examples/data/brew.txt +38 -0
  22. data/examples/data/color.2 +37 -0
  23. data/examples/data/gemlist.txt +60 -0
  24. data/examples/data/lotr.txt +12 -0
  25. data/examples/data/ports.txt +136 -0
  26. data/examples/data/tasks.txt +27 -0
  27. data/examples/data/todocsv.csv +28 -0
  28. data/examples/data/unix1.txt +21 -0
  29. data/examples/data/unix2.txt +11 -0
  30. data/examples/dbdemo.rb +495 -0
  31. data/examples/deprecated/appgmail.rb +952 -0
  32. data/examples/deprecated/splitp.rb +56 -0
  33. data/examples/deprecated/testscrolllb.rb +86 -0
  34. data/examples/deprecated/testscrollp.rb +88 -0
  35. data/examples/deprecated/testscrollta.rb +80 -0
  36. data/examples/deprecated/testscrolltable.rb +165 -0
  37. data/examples/deprecated/testsplit.rb +87 -0
  38. data/examples/deprecated/testsplit2.rb +123 -0
  39. data/examples/deprecated/testsplit3.rb +215 -0
  40. data/examples/deprecated/testsplit3_1.rb +244 -0
  41. data/examples/deprecated/testsplit3a.rb +215 -0
  42. data/examples/deprecated/testsplit3b.rb +237 -0
  43. data/examples/deprecated/testsplitta.rb +148 -0
  44. data/examples/deprecated/testsplittv.rb +142 -0
  45. data/examples/deprecated/testsplittvv.rb +144 -0
  46. data/examples/deprecated/testtpane.rb +215 -0
  47. data/examples/deprecated/testtpane2.rb +145 -0
  48. data/examples/deprecated/testtpanetable.rb +203 -0
  49. data/examples/dirtree.rb +88 -0
  50. data/examples/experimental/resultsetdemo.rb +280 -0
  51. data/examples/experimental/testmform.rb +35 -0
  52. data/examples/experimental/testscroller.rb +117 -0
  53. data/examples/experimental/teststackflow.rb +111 -0
  54. data/examples/menu1.rb +112 -0
  55. data/examples/multispl.rb +86 -0
  56. data/examples/newmessagebox.rb +131 -0
  57. data/examples/newtabbedwindow.rb +100 -0
  58. data/examples/newtesttabp.rb +121 -0
  59. data/examples/qdfilechooser.rb +68 -0
  60. data/examples/rfe.rb +1239 -0
  61. data/examples/rfe_renderer.rb +121 -0
  62. data/examples/sqlc.rb +454 -0
  63. data/examples/sqlm.rb +437 -0
  64. data/examples/sqlt.rb +408 -0
  65. data/examples/status.txt +68 -0
  66. data/examples/table1.rb +24 -0
  67. data/examples/term2.rb +84 -0
  68. data/examples/test1.rb +239 -0
  69. data/examples/test2.rb +674 -0
  70. data/examples/testapp.rb +44 -0
  71. data/examples/testapp2.rb +58 -0
  72. data/examples/testchars.rb +137 -0
  73. data/examples/testcombo.rb +91 -0
  74. data/examples/testkeypress.rb +66 -0
  75. data/examples/testlistbox.rb +113 -0
  76. data/examples/testmenu.rb +101 -0
  77. data/examples/testmulticomp.rb +70 -0
  78. data/examples/testmulticontainer.rb +94 -0
  79. data/examples/testmultispl.rb +199 -0
  80. data/examples/testree.rb +106 -0
  81. data/examples/testtable.rb +264 -0
  82. data/examples/testtabp.rb +107 -0
  83. data/examples/testtodo.rb +584 -0
  84. data/examples/testvimsplit.rb +112 -0
  85. data/examples/testwsshortcuts.rb +64 -0
  86. data/examples/testwsshortcuts2.rb +126 -0
  87. data/examples/todo.db +0 -0
  88. data/examples/todo.yml +191 -0
  89. data/examples/viewtodo.rb +574 -0
  90. data/lib/rbcurse/deprecated/README.markdown +12 -0
  91. data/lib/rbcurse/deprecated/rpad.rb +375 -0
  92. data/lib/rbcurse/deprecated/rscrollpane.rb +512 -0
  93. data/lib/rbcurse/deprecated/rsplitpane.rb +894 -0
  94. data/lib/rbcurse/deprecated/rsplitpane2.rb +1009 -0
  95. data/lib/rbcurse/deprecated/rviewport.rb +204 -0
  96. data/lib/rbcurse/deprecated/widgets/mapper.rb +130 -0
  97. data/lib/rbcurse/deprecated/widgets/rmessagebox.rb +348 -0
  98. data/lib/rbcurse/deprecated/widgets/rtabbedpane.rb +1158 -0
  99. data/lib/rbcurse/deprecated/widgets/rtabbedwindow.rb +167 -0
  100. data/lib/rbcurse/deprecated/widgets/scrollable.rb +301 -0
  101. data/lib/rbcurse/deprecated/widgets/stdscrwindow.rb +309 -0
  102. data/lib/ver/keyboard2.rb +170 -0
  103. data/test/test_rbcurse.rb +0 -0
  104. metadata +131 -9
@@ -0,0 +1,1009 @@
1
+ =begin
2
+ * Name: SplitPane
3
+ * Description: allows user to split 2 components vertically or horizontally
4
+ Try to make it simpler for user to use.
5
+ Should work with no constraints, and take percentage or integer for div location. No more.
6
+ **** THIS IS EXPERIMENTAL AND NEW
7
+ NOTE: it can crash if you change orientation after painting and if you try too much resizing.
8
+ Also it will not notify children of changes in size. it avoids all complexity and tries
9
+ to be as simple as possible.
10
+ * NOTE that VERTICAL_SPLIT means the *divider* is vertical.
11
+ * Recommend you move to rvimsplit.rb
12
+ * If you insist on using this, please copy it off into your own
13
+ * application folder in case i deprecate it.
14
+ * Author: rkumar (arunachalesha)
15
+ * file created 2010-09-14 10:31
16
+ * major change: Feb 2010, removed buffers
17
+ Todo:
18
+
19
+ --------
20
+ * License:
21
+ Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
22
+
23
+ =end
24
+ #require 'rubygems'
25
+ #require 'ncurses'
26
+ require 'logger'
27
+ require 'rbcurse'
28
+
29
+ #include Ncurses # FFI 2011-09-8
30
+ include RubyCurses
31
+ module RubyCurses
32
+ extend self
33
+
34
+ ##
35
+ # A simpler SplitPane allows user to split 2 components vertically or horizontally.
36
+ # such as textarea, table or a list.
37
+ # Besides components, it allows user to set position of divider using divider_at (fraction).
38
+ # @since 1.2.0
39
+ # TODO -
40
+
41
+ class SplitPane < Widget
42
+ #dsl_property :height # added to widget and here as method
43
+ #dsl_accessor :width # already present in widget
44
+ # row and col also present int widget
45
+ #dsl_accessor :first_component # top or left component that is being viewed
46
+ #dsl_accessor :second_component # right or bottom component that is being viewed
47
+ # dsl_property` :orientation # :VERTICAL_SPLIT or :HORIZONTAL_SPLIT # changed 2010
48
+ attr_reader :orientation # :VERTICAL_SPLIT or :HORIZONTAL_SPLIT
49
+ attr_reader :divider_location #
50
+ attr_reader :resize_weight
51
+ attr_writer :last_divider_location
52
+ dsl_accessor :border_color
53
+ dsl_accessor :border_attrib
54
+ attr_accessor :one_touch_expandable # boolean, default true
55
+
56
+ def initialize form, config={}, &block
57
+ @focusable = true
58
+ @editable = false
59
+ #@left_margin = 1
60
+ @row = 0
61
+ @col = 0
62
+ super
63
+ @row_offset = @col_offset = 1
64
+ @orig_col = @col
65
+ #@use_absolute = true; # set to true if not using subwins XXX
66
+ init_vars
67
+ end
68
+ def init_vars
69
+ @orientation ||= :HORIZONTAL_SPLIT # added 2010-01-13 15:05 since not set
70
+ @divider_at ||= 0.5
71
+ if @orientation == :VERTICAL_SPLIT
72
+ @divider_location ||= (@width * @divider_at).to_i
73
+ else
74
+ @divider_location ||= (@height * @divider_at).to_i
75
+ end
76
+ @divider_offset ||= 0
77
+
78
+ # cascade_changes keeps the child exactly sized as per the pane which looks nice
79
+ #+ but may not really be what you want.
80
+ @cascade_changes=true
81
+ ## if this splp is increased (ht or wid) then expand the child
82
+ @cascade_boundary_changes = true
83
+
84
+ # true means will request child to create a buffer, since cropping will be needed
85
+ @_child_buffering = false # private, internal. not to be changed by callers.
86
+ @one_touch_expandable = true
87
+ @is_expanding = false
88
+
89
+ bind_key([?\C-w, ?o], :expand)
90
+ bind_key([?\C-w, ?1], :expand)
91
+ bind_key([?\C-w, ?2], :unexpand)
92
+ bind_key([?\C-w, ?x], :exchange)
93
+
94
+ end
95
+ def orientation(*val)
96
+ if val.empty?
97
+ return @orientation
98
+ else
99
+ if @orientation.nil?
100
+ @orientation = val[0]
101
+ $log.debug " orientation returning without changing divi loc to #{@divider_location} "
102
+ return
103
+ end
104
+ $log.debug " orientation CAME HERE #{val[0]} prev div loc was #{@divider_location} "
105
+ case val[0]
106
+ when :VERTICAL_SPLIT
107
+ @divider_location = (@width * @divider_at).to_i
108
+ when :HORIZONTAL_SPLIT
109
+ @divider_location = (@height * @divider_at).to_i
110
+ else
111
+ raise ArgumentError "orientation value is wrong"
112
+ end
113
+ @orientation = val[0]
114
+ @repaint_required = true
115
+ $log.debug " orientation set divi loc to #{@divider_location} "
116
+ end
117
+ end
118
+ # sets a fraction to use to determine placement of divider_location and consequently
119
+ # size of components
120
+ # @param [Float] percent for placing divider e.g. 0.5. Should be between 0.2 and 0.8
121
+ # @return [Float] fraction if no param passed
122
+ def divider_at(*val)
123
+ if val.empty?
124
+ return @divider_at
125
+ else
126
+ where = val[0]
127
+ raise ArgumentError "divider_at value should be between 0.2 and 0.8" if where < 0.2 || where > 0.8
128
+ @divider_at = where
129
+ @repaint_required = true
130
+ end
131
+ self
132
+ end
133
+
134
+ ##
135
+ # Sets the first component (top or left)
136
+ #
137
+ # @param [String] comp comment
138
+ # @return [true, false] comment
139
+ #
140
+ # XXX This originally working fine if the child was also a splitpane
141
+ # Now with other comps, it works fine with them if they create a buffer in const
142
+ # but now SPLP bombs since it creates a buffer in repaint.
143
+
144
+ def first_component(comp)
145
+ screen_col = 1
146
+ screen_row = 1 # offset for copying pad 2010-02-09 19:02
147
+ @first_component = comp;
148
+ @first_component.parent_component = self ## added 2010-01-13 12:54
149
+ ## These setting are quite critical, otherwise on startup
150
+ ##+ it can create 2 tiled buffers.
151
+ a = 0 # =1
152
+ @first_component.row(@row + a)
153
+ @first_component.col(@col + a)
154
+ @first_component.min_height ||= 5
155
+ @first_component.min_width ||= 5
156
+ comp.should_create_buffer = @_child_buffering
157
+ comp.ext_row_offset += @ext_row_offset + @row #- @subform1.window.top #0# screen_row
158
+ comp.ext_col_offset += @ext_col_offset + @col #-@subform1.window.left # 0# screen_col
159
+
160
+ return # XXX
161
+
162
+ # The suggestd heights depend on orientation.
163
+ a = 0 # = 2
164
+ if @orientation == :HORIZONTAL_SPLIT
165
+ raise "SPLP width of #{comp.name} required " unless @width
166
+ $log.debug "H FC ht #{comp.height} , w #{comp.width} #{comp.name}, #{comp.class} "
167
+ @first_component.height = (@height * @divider_at - 1).to_i #1
168
+ @first_component.width = @width - a
169
+ $log.debug " FC2 ht #{comp.height} , w #{comp.width} #{comp.name} "
170
+ @divider_location = comp.height + 1
171
+ else
172
+ raise "SPLP height of #{comp.name} required " unless @height
173
+ $log.debug "V FC ht #{comp.height} , w #{comp.width} #{comp.name} "
174
+ @first_component.height = @height - a
175
+ @first_component.width = (@width * @divider_at -1).to_i
176
+ @divider_location = comp.width + 1
177
+ $log.debug " FC2 ht #{comp.height} , w #{comp.width} #{comp.name} "
178
+ end
179
+ # form may not be available at this point if setting internal componnedts FC first
180
+ #comp.set_buffering(:target_window => @target_window || @form.window, :bottom => comp.height-1, :right => comp.width-1, :form => @form )
181
+ # added 2010-09-13 23:33 XXX
182
+ raise "first components height or preferred height is required" unless comp.height
183
+ raise "first components width or preferred width is required" unless comp.width
184
+ comp.set_buffering(:screen_top => @row, :screen_left => @col)
185
+ @first_component.min_height ||= 5
186
+ @first_component.min_width ||= 5
187
+
188
+
189
+ # if i set the above 2 to 0, it starts fine but then on any action loses the first row.
190
+ # Just begun happeing suddenly! 2010-01-11 23:38
191
+
192
+ # explicit top and left.
193
+ if !@first_component.get_buffer().nil?
194
+ @first_component.get_buffer().set_screen_row_col(screen_row, screen_col)
195
+ end
196
+ @current_component ||= @first_component # added 2010-01-13 15:39
197
+ end # first_component
198
+ ##
199
+ # Sets the second component (bottom or right)
200
+ #
201
+ # @param [String] comp comment
202
+ # @return [true, false] comment
203
+
204
+ def second_component(comp)
205
+ $log.debug " #{@name}: #{comp.name} inside second component, div loc: #{@divider_location}, #{@col_offset} parent #{@row} #{@col}, h #{@height} w #{@width} "
206
+ @second_component = comp;
207
+ @second_component.parent_component = self ## added 2010-01-13 12:54
208
+ comp.should_create_buffer = @_child_buffering
209
+ @second_component.min_height ||= 5 # added 2010-01-16 12:37
210
+ @second_component.min_width ||= 5 # added 2010-01-16 12:37
211
+ return # XXX
212
+
213
+ ## jeez, we;ve postponed create of buffer XX
214
+ ## trying out 2010-01-16 12:11 so component does not have to set size
215
+ # The suggestd heights really depend on orientation.
216
+ if @orientation == :HORIZONTAL_SPLIT
217
+ @second_component.row(@row+@divider_location)
218
+ @second_component.col(@col+@col_offset)
219
+ @second_component.height = (@height * @divider_at - 1).to_i #1
220
+ @second_component.width = @width - 0 # 2
221
+ $log.debug "H SC2 ht #{comp.height} , w #{comp.width} #{comp.name} "
222
+ $log.debug "H SC2 rc #{comp.row} , c #{comp.col} #{comp.name} "
223
+ else
224
+ @second_component.row(@row+@row_offset)
225
+ @second_component.col(@col+@divider_location)
226
+ @second_component.height = @height - 0 # 2
227
+ @second_component.width = (@width * @divider_at -4).to_i # 1 to 4 2010-01-16 22:10 TRYING COULD BREAK STUFF testsplit3a;s right splitpane
228
+ $log.debug "V SC2 ht #{comp.height} , w #{comp.width} #{comp.name} "
229
+ $log.debug "V SC2 rc #{comp.row} , c #{comp.col} #{comp.name} "
230
+ # added 2010-01-16 23:55
231
+ end
232
+ comp.ext_row_offset += @ext_row_offset + @row
233
+ $log.debug "SPLP exp_col #{@name} 2 #{comp}: #{comp.ext_col_offset} += #{@ext_col_offset} + #{@col} "
234
+ comp.ext_col_offset += @ext_col_offset + @col
235
+ #comp.set_buffering(:target_window => @target_window || @form.window, :bottom => comp.height-1,
236
+ #:right => comp.width-1, :form => @form )
237
+ $log.debug " setting c2 screen_top n left to #{@row} #{@col} "
238
+ @second_component.set_buffering(:screen_top => @row, :screen_left => @col)
239
+ end # second_component
240
+
241
+ ## faster access to the 2 components
242
+ def c1; @first_component; end
243
+ def c2; @second_component; end
244
+
245
+ ##
246
+ #
247
+ # change height of splitpane
248
+ # @param val [int] new height of splitpane
249
+ # @return [int] old ht if nil passed
250
+ def OLDheight(*val)
251
+ return @height if val.empty?
252
+ oldvalue = @height || 0
253
+ super
254
+ @height = val[0]
255
+ return if @first_component.nil? or @second_component.nil?
256
+ delta = @height - oldvalue
257
+ @repaint_required = true
258
+ if !@cascade_boundary_changes.nil?
259
+ # must tell children if height changed which will happen in nested splitpanes
260
+ # must adjust to components own offsets too
261
+ if @orientation == :VERTICAL_SPLIT
262
+ @first_component.height += delta
263
+ @second_component.height += delta
264
+ # RFED16 2010-02-16 20:44 whenever we change dimensions need to update
265
+ # buffering_params since we are not using Pad's buffer_to_screen
266
+ @second_component.set_buffering(:bottom => @second_component.height-1)
267
+ @first_component.set_buffering(:bottom => @first_component.height-1)
268
+ else
269
+ @second_component.height += delta
270
+ @second_component.set_buffering(:bottom => @second_component.height-1)
271
+ end
272
+ end
273
+ end
274
+ ##
275
+ # change width of splitpane
276
+ # @param val [int, nil] new width of splitpane
277
+ # @return [int] old width if nil passed
278
+ # NOTE: if VERTICAL, then expand or contract only second
279
+ # If HORIZ then expand / contract both
280
+ # Actually this is very complicated since reducing should take into account min_width
281
+ def OLDwidth(*val)
282
+ return @width if val.empty?
283
+ # must tell children if height changed which will happen in nested splitpanes
284
+ oldvalue = @width || 0
285
+ super
286
+ @width = val[0]
287
+ delta = @width - oldvalue
288
+ $log.debug " SPLP #{@name} width #{oldvalue}, #{@width}, #{delta} "
289
+ @repaint_required = true
290
+ if !@cascade_boundary_changes.nil?
291
+ # must adjust to components own offsets too
292
+ # NOTE: 2010-01-10 20:11 if we increase width by one, each time will both components get increased by one.
293
+ if @orientation == :HORIZONTAL_SPLIT
294
+ if @first_component != nil
295
+ old = @first_component.width
296
+ #@first_component.width = @width - @col_offset + @divider_offset
297
+ @first_component.width += delta
298
+ $log.debug "width() #{@name} set fc width to #{@first_component.width}, old was #{old} "
299
+ @first_component.set_buffering(:right => @first_component.width-1)
300
+ end
301
+ # added 2010-01-11 23:02 horiz 2c not displaying since width issue
302
+ if @second_component != nil
303
+ old = @second_component.width
304
+ #@first_component.width = @width - @col_offset + @divider_offset
305
+ @second_component.width += delta
306
+ @second_component.set_buffering(:right => @second_component.width-1)
307
+ $log.debug "width() #{@name} set 2c width to #{@second_component.width}, old was #{old} "
308
+ end
309
+ else
310
+ rc = @divider_location
311
+ # ## next change should only happen if sc w < ...
312
+ # 2010-01-11 22:11
313
+ # if @second_component.width < @width - (rc + @col_offset + @divider_offset + 1)
314
+ if @second_component != nil
315
+ if @second_component.width < @width - (rc + @col_offset + @divider_offset + 1)
316
+ old = @second_component.width
317
+ #@second_component.width = @width - @col_offset + @divider_offset
318
+ @second_component.width += delta
319
+ @second_component.set_buffering(:right => @second_component.width-1)
320
+ $log.debug "width() #{@name} set 2c width to #{@second_component.width} , old was #{old} "
321
+ end
322
+ end
323
+ end
324
+ end
325
+ end
326
+ # set location of divider (row or col depending on orientation)
327
+ # internally sets the second components row or col
328
+ # also to set widths or heights
329
+ # Check minimum sizes are not disrespected
330
+ # @param rc [int] row or column to place divider
331
+ # 2010-01-09 23:07 : added sections to prevent a process crash courtesy copywin
332
+ #+ when pane size exceeds buffer size, so in these cases we increase size of component
333
+ #+ and therefore buffer size. Needs to be tested for VERTICAL.
334
+ # If this returns :ERROR, caller may avoid repainting form needlessly.
335
+ # We may give more meaningful error retval in future. TODO
336
+ def set_divider_location rc
337
+ # add a check for out of bounds since no buffering
338
+ v = 2 # earlier 2
339
+ if @orientation == :HORIZONTAL_SPLIT
340
+ if rc < v || rc > @height - v
341
+ Ncurses.beep
342
+ return :ERROR
343
+ end
344
+ else
345
+ if rc < v || rc > @width - v
346
+ Ncurses.beep
347
+ return :ERROR
348
+ end
349
+ end
350
+ # check min_h
351
+ $log.debug " XXXX setting div location to #{rc} "
352
+ @repaint_required = true
353
+ old_divider_location = @divider_location || 0
354
+ # we first check against min_sizes
355
+ # the calculation is repeated here, and in the actual change
356
+ # so if modifying, be sure to do in both places.
357
+ if !@is_expanding # if expanding then i can't check against min_width
358
+ if rc > old_divider_location
359
+ if @second_component != nil
360
+ if @orientation == :VERTICAL_SPLIT
361
+ # check second comps width
362
+ if @width - (rc + @col_offset + @divider_offset+1) < @second_component.min_width
363
+ $log.debug " #{@name} SORRY 2c min width prevents further resizing: #{@width} #{rc}"
364
+ Ncurses.beep
365
+ return :ERROR
366
+ end
367
+ else
368
+ # check second comps ht
369
+ $log.debug " YYYY SORRY 2c H:#{@height} rc: #{rc} 2cmh: #{@second_component.name} "
370
+ if @height - rc -2 < @second_component.min_height
371
+ Ncurses.beep
372
+ $log.debug " #{@name} SORRY 2c min height prevents further resizing"
373
+ return :ERROR
374
+ end
375
+ end
376
+ end
377
+ elsif rc < old_divider_location
378
+ if @first_component != nil
379
+ $log.debug " #{@name} fc min width #{rc}, #{@first_component.min_width} "
380
+ if @orientation == :VERTICAL_SPLIT
381
+ # check first comps width
382
+
383
+ if rc-1 < @first_component.min_width
384
+ Ncurses.beep
385
+ $log.debug " SORRY fc min width prevents further resizing"
386
+ return :ERROR
387
+ end
388
+ else
389
+ if rc-1 < @first_component.min_height
390
+ $log.debug " SORRY fc min height prevents further resizing"
391
+ Ncurses.beep
392
+ return :ERROR
393
+ end
394
+ end
395
+ end
396
+ end
397
+ end # expanding
398
+ @divider_location = rc
399
+ end
400
+ def OLDset_divider_location rc
401
+ $log.debug " SPLP #{@name} setting divider to #{rc} "
402
+ # add a check for out of bounds since no buffering
403
+ v = 1 # earlier 2
404
+ if @orientation == :HORIZONTAL_SPLIT
405
+ if rc < v || rc > @height - v
406
+ return :ERROR
407
+ end
408
+ else
409
+ if rc < v || rc > @width - v
410
+ return :ERROR
411
+ end
412
+ end
413
+ @repaint_required = true
414
+ old_divider_location = @divider_location || 0
415
+ # we first check against min_sizes
416
+ # the calculation is repeated here, and in the actual change
417
+ # so if modifying, be sure to do in both places.
418
+ if !@is_expanding # if expanding then i can't check against min_width
419
+ if rc > old_divider_location
420
+ if @second_component != nil
421
+ if @orientation == :VERTICAL_SPLIT
422
+ # check second comps width
423
+ if @width - (rc + @col_offset + @divider_offset+1) < @second_component.min_width
424
+ $log.debug " #{@name} SORRY 2c min width prevents further resizing: #{@width} #{rc}"
425
+ return :ERROR
426
+ end
427
+ else
428
+ # check second comps ht
429
+ $log.debug " YYYY SORRY 2c H:#{@height} rc: #{rc} 2cmh: #{@second_component.name} "
430
+ if @height - rc -2 < @second_component.min_height
431
+ $log.debug " #{@name} SORRY 2c min height prevents further resizing"
432
+ return :ERROR
433
+ end
434
+ end
435
+ end
436
+ elsif rc < old_divider_location
437
+ if @first_component != nil
438
+ $log.debug " #{@name} fc min width #{rc}, #{@first_component.min_width} "
439
+ if @orientation == :VERTICAL_SPLIT
440
+ # check first comps width
441
+
442
+ if rc-1 < @first_component.min_width
443
+ $log.debug " SORRY fc min width prevents further resizing"
444
+ return :ERROR
445
+ end
446
+ else
447
+ if rc-1 < @first_component.min_height
448
+ $log.debug " SORRY fc min height prevents further resizing"
449
+ return :ERROR
450
+ end
451
+ end
452
+ end
453
+ end
454
+ end # expanding
455
+ @is_expanding = false
456
+ @old_divider_location = @divider_location
457
+ @divider_location = rc
458
+ if @first_component != nil
459
+
460
+ ## added in case not set. it will be set to a sensible default
461
+ @first_component.height ||= 0
462
+ @first_component.width ||= 0
463
+
464
+ $log.debug " #{@name} set div location, setting first comp width #{rc}"
465
+ if !@cascade_changes.nil?
466
+ if @orientation == :VERTICAL_SPLIT
467
+ $log.warn " SPLP height nil in #{@name} #{@first_component.name} " unless @height
468
+ @height ||= 23
469
+ @first_component.width(rc-0) #+ @col_offset + @divider_offset
470
+ @first_component.height(@height-0) #2+ @col_offset + @divider_offset
471
+ else
472
+ $log.warn " SPLP width nil in #{@name} #{@first_component.name} " unless @width
473
+ @first_component.height(rc+0) #-1) #1+ @col_offset + @divider_offset
474
+ @first_component.width(@width-0) #2+ @col_offset + @divider_offset
475
+ end
476
+ else
477
+ if @orientation == :VERTICAL_SPLIT
478
+ $log.debug " DOES IT COME HERE compare fc wt #{@first_component.width} to match #{rc}-1 "
479
+ # added 2010-01-09 19:00 increase fc to avoid copywin crashing process
480
+ if @first_component.width < rc -0 then
481
+ $log.debug " INCRease fc wt #{@first_component.width} to match #{rc}-1 "
482
+ @first_component.width(rc-0) #+ @col_offset + @divider_offset
483
+ @first_component.repaint_all(true) if !@first_component.nil?
484
+ @repaint_required = true
485
+ end
486
+ ## added this condition 2010-01-11 21:44 again switching needs this
487
+ a = 0 #2
488
+ if @first_component.height < @height - a then
489
+ $log.debug " INCRease fc ht #{@first_component.height} to match #{@height}- #{a} "
490
+ @first_component.height(@height-a) #+ @col_offset + @divider_offset
491
+ end
492
+ else
493
+ # added 2010-01-09 19:00 increase fc to avoid copywin crashing process
494
+ a = 0 #1
495
+ if @first_component.height < rc -a then
496
+ $log.debug " INCRease fc ht #{@first_component.height} to match #{rc}-1 "
497
+ @first_component.height(rc-a) #+ @col_offset + @divider_offset
498
+ @first_component.repaint_all(true) if !@first_component.nil?
499
+ @repaint_required = true
500
+ end
501
+ # added 2010-01-11 19:24 to match c2. Sometimes switching from V to H means
502
+ # fc's width needs to be expanded.
503
+ if @first_component.width < @width - 1 #+ @col_offset + @divider_offset
504
+ $log.debug " INCRease fc wi #{@first_component.width} to match #{@width}-2 "
505
+ @first_component.width = @width - 1 #+ @col_offset + @divider_offset
506
+ @first_component.repaint_all(true)
507
+ @repaint_required = true
508
+ end
509
+ end
510
+ end
511
+ $log.debug " #{@name} TA set C1 H W RC #{@first_component.height} #{@first_component.width} #{rc} "
512
+ @first_component.set_buffering(:bottom => @first_component.height-1, :right => @first_component.width-1, :form => @form )
513
+ end
514
+ if !@second_component.nil?
515
+
516
+ ## added 2010-01-11 23:09 since some cases don't set, like splits within split.
517
+ @second_component.height ||= 0
518
+ @second_component.width ||= 0
519
+
520
+ if @orientation == :VERTICAL_SPLIT
521
+ #@second_component.col = rc + @col_offset + @divider_offset
522
+ #@second_component.row = 0 # 1
523
+ @second_component.col = @col + rc #+ @col_offset + @divider_offset
524
+ @second_component.row = @row # 1
525
+ if !@cascade_changes.nil?
526
+ #@second_component.width = @width - (rc + @col_offset + @divider_offset + 1)
527
+ #@second_component.height = @height-2 #+ @row_offset + @divider_offset
528
+ @second_component.width = @width - rc #+ @col_offset + @divider_offset + 1)
529
+ @second_component.height = @height #+ @row_offset + @divider_offset
530
+ else
531
+ # added 2010-01-09 22:49 to be tested XXX
532
+ # In a vertical split, if widgets w and thus buffer w is less than
533
+ #+ pane, a copywin can crash process, so we must expand component, and thus buffer
534
+ $log.debug " #{@name} 2c width does it come here? #{@second_component.name} #{@second_component.width} < #{@width} -( #{rc}+#{@col_offset}+#{@divider_offset} +1 "
535
+ if @second_component.width < @width - rc #+ @col_offset + @divider_offset + 1)
536
+ $log.debug " YES 2c width "
537
+ @second_component.width = @width - rc #+ @col_offset + @divider_offset + 1)
538
+ @second_component.repaint_all(true)
539
+ @repaint_required = true
540
+ end
541
+ # adding 2010-01-17 19:33 since when changing to VERT, it was not expanding
542
+ if @second_component.height < @height-0 #+ @row_offset + @divider_offset
543
+ $log.debug " JUST ADDED 2010-01-17 19:35 HOPE DOES NOT BREAK ANYTHING "
544
+ @second_component.height = @height-0 #+ @row_offset + @divider_offset
545
+ end
546
+ end
547
+ else
548
+ #rc += @row
549
+ ## HORIZ SPLIT
550
+ offrow = offcol = 0
551
+ #@second_component.row = offrow + rc + 0 #1 #@row_offset + @divider_offset
552
+ #@second_component.col = 0 + offcol # was 1
553
+ offrow = @row; offcol = @col
554
+ @second_component.row = offrow + rc + 0 #1 #@row_offset + @divider_offset
555
+ $log.debug "C2 Horiz row #{@second_component.row} = #{offrow} + #{rc} "
556
+ @second_component.col = 0 + offcol # was 1
557
+ if !@cascade_changes.nil?
558
+ #@second_component.width = @width - 2 #+ @col_offset + @divider_offset
559
+ #@second_component.height = @height - rc -2 #+ @row_offset + @divider_offset
560
+ @second_component.width = @width - 0 #+ @col_offset + @divider_offset
561
+ @second_component.height = @height - rc -0 #+ @row_offset + @divider_offset
562
+ else
563
+ # added 2010-01-16 19:14 -rc since its a HORIZ split
564
+ # 2010-01-16 20:45 made 2 to 3 for scrollpanes within splits!!! hope it doesnt
565
+ # break, and why 3.
566
+ # 2010-01-17 13:33 reverted to 2. 3 was required since i was not returning when error in set_screen_max.
567
+ if @second_component.height < @height-rc-1 #2 #+ @row_offset + @divider_offset
568
+ $log.debug " #{@name} INCRease 2c #{@second_component.name} ht #{@second_component.height} to match #{@height}-2- #{rc} "
569
+ @second_component.height = @height-rc-1 #2 #+ @row_offset + @divider_offset
570
+ @second_component.repaint_all(true)
571
+ @repaint_required = true
572
+ end
573
+ # # added 2010-01-10 15:36 still not expanding
574
+ if @second_component.width < @width - 2 #+ @col_offset + @divider_offset
575
+ $log.debug " #{@name} INCRease 2c #{@second_component.name} wi #{@second_component.width} to match #{@width}-2 "
576
+ @second_component.width = @width - 2 #+ @col_offset + @divider_offset
577
+ @second_component.repaint_all(true)
578
+ @repaint_required = true
579
+ end
580
+ end
581
+ end
582
+ raise "2nd components height or preferred height is required (#{@second_component.name})" unless @second_component.height
583
+ raise "2nd components width or preferred width is required(#{@second_component.name})" unless @second_component.width
584
+ # i need to keep top and left sync for print_border which uses it UGH !!!
585
+ if !@second_component.get_buffer().nil?
586
+ # now that TV and others are creating a buffer in repaint we need another way to set
587
+ #$log.debug " setting second comp row col offset - i think it doesn't come here till much later "
588
+ #XXX @second_component.get_buffer().set_screen_row_col(@second_component.row+@ext_row_offset+@row, @second_component.col+@ext_col_offset+@col)
589
+ # 2010-02-13 09:15 RFED16
590
+ @second_component.get_buffer().set_screen_row_col(@second_component.row, @second_component.col)
591
+ end
592
+ #@second_component.set_buffering(:screen_top => @row, :screen_left => @col)
593
+ #@second_component.set_buffering(:screen_top => @row+@second_component.row, :screen_left => @col+@second_component.col)
594
+ #@second_component.set_buffering(:screen_top => @row+@second_component.row, :screen_left => @col+@second_component.col)
595
+ $log.debug "sdl: #{@name} setting C2 screen_top n left to #{@second_component.row}, #{@second_component.col} "
596
+ @second_component.set_buffering(:screen_top => @second_component.row, :screen_left => @second_component.col)
597
+ @second_component.set_buffering(:bottom => @second_component.height-1, :right => @second_component.width-1, :form => @form )
598
+ #@second_component.ext_row_offset = @row + @ext_row_offset
599
+ #@second_component.ext_col_offset = @col + @ext_col_offset
600
+ $log.debug " #{@name} 2 set div location, rc #{rc} width #{@width} height #{@height}"
601
+ $log.debug " 2 set div location, setting r #{@second_component.row}, #{@ext_row_offset}, #{@row} "
602
+ $log.debug " 2 set div location, setting c #{@second_component.col}, #{@ext_col_offset}, #{@col} "
603
+ $log.debug " C2 set div location, setting w #{@second_component.width} "
604
+ $log.debug " C2 set div location, setting h #{@second_component.height} "
605
+
606
+ end
607
+ fire_property_change("divider_location", old_divider_location, @divider_location)
608
+
609
+ end
610
+
611
+ # calculate divider location based on weight
612
+ # Weight implies weight of first component, e.g. .70 for 70% of splitpane
613
+ # @param wt [float, :read] weight of first component
614
+ def set_resize_weight wt
615
+ raise ArgumentError if wt < 0 or wt >1
616
+ @repaint_required = true
617
+ oldvalue = @resize_weight
618
+ @resize_weight = wt
619
+ if @orientation == :VERTICAL_SPLIT
620
+ rc = (@width||@preferred_width) * wt
621
+ else
622
+ rc = (@height||@preferred_height) * wt
623
+ end
624
+ fire_property_change("resize_weight", oldvalue, @resize_weight)
625
+ rc = rc.ceil
626
+ set_divider_location rc
627
+ end
628
+ ##
629
+ # resets divider location based on preferred size of first component
630
+ # @return :ERROR if min sizes failed
631
+ # You may want to check for ERROR and if so, resize_weight to 0.50
632
+ def reset_to_preferred_sizes
633
+ raise "not using now please remove or redo"
634
+ return if @first_component.nil?
635
+ @repaint_required = true
636
+ ph, pw = @first_component.get_preferred_size
637
+ if @orientation == :VERTICAL_SPLIT
638
+ pw ||= (@width * @divider_at-1).to_i # added 2010-01-16 12:31 so easier to use, 1 to 2 2010-01-16 22:13
639
+ rc = pw+1 ## added 1 2010-01-11 23:26 else divider overlaps comp
640
+ @first_component.width ||= pw ## added 2010-01-11 23:19
641
+ else
642
+ ph ||= (@height * @divider_at - 0).to_i # 1 # added 2010-01-16 12:31 so easier to use
643
+ rc = ph+0 #1 ## added 1 2010-01-11 23:26 else divider overlaps comp
644
+ @first_component.height ||= ph ## added 2010-01-11 23:19
645
+ end
646
+ set_divider_location rc
647
+ end
648
+ # is vertical
649
+ def v?
650
+ @orientation == :VERTICAL_SPLIT
651
+ end
652
+ def h?
653
+ !v?
654
+ end
655
+ def update_first_component
656
+ $log.debug " #{@name} update+first dl: #{@divider_location} "
657
+ raise "XXX 540 SPLP" if @divider_location == 0
658
+ @first_component.row(@row)
659
+ @first_component.col(@col)
660
+ $log.debug "UCF #{@name} #{@first_component.row} #{@first_component.col} "
661
+ comp = @first_component
662
+ if v?
663
+ comp.width(@divider_location)
664
+ comp.height(@height)
665
+ else
666
+ comp.height(@divider_location)
667
+ comp.width(@width)
668
+ end
669
+ comp.set_buffering(:target_window => @target_window || @form.window, :bottom => comp.height-1, :right => comp.width-1, :form => @form )
670
+ @first_component.set_buffering(:screen_top => @first_component.row, :screen_left => @first_component.col)
671
+ end
672
+ def update_second_component
673
+ $log.debug " #{@name} update+secoond dl: #{@divider_location} "
674
+ comp = @second_component
675
+ return if @divider_location == 0
676
+ if @orientation == :HORIZONTAL_SPLIT
677
+ @second_component.row(@row+@divider_location)
678
+ @second_component.col(@col)
679
+ else
680
+ @second_component.row(@row)
681
+ @second_component.col(@col+@divider_location)
682
+ end
683
+ if v?
684
+ $log.debug " width of parent #{@name} is #{@width} , w - dl "
685
+ comp.width(@width - @divider_location)
686
+ comp.height(@height)
687
+ else
688
+ $log.debug " height of parent is #{height} , w - dl "
689
+ comp.height(@height - @divider_location)
690
+ comp.width(@width)
691
+ end
692
+ $log.debug "UCS #{@name} #{@second_component.row} #{@second_component.col}, hw #{comp.height} #{comp.width} "
693
+ comp.set_buffering(:target_window => @target_window || @form.window, :bottom => comp.height-1,
694
+ :right => comp.width-1, :form => @form )
695
+ @second_component.set_buffering(:screen_top => @second_component.row, :screen_left => @second_component.col)
696
+ end
697
+ def repaint # splitpane
698
+ if @graphic.nil?
699
+ @graphic = @target_window || @form.window
700
+ raise "graphic nil in rsplitpane #{@name} " unless @graphic
701
+ end
702
+ #XXX safe_create_buffer
703
+ # this is in case, not called by form
704
+ # we need to clip components
705
+ # note that splitpanes can be nested
706
+
707
+ if @repaint_required
708
+ # Note: this only if major change
709
+ #XXX @graphic.wclear
710
+ @first_component.repaint_all(true) if !@first_component.nil?
711
+ @second_component.repaint_all(true) if !@second_component.nil?
712
+ end
713
+ if @repaint_required
714
+ ## paint border and divider
715
+ $log.debug "SPLP #{@name} repaint split H #{@height} W #{@width} dl #{@divider_location} "
716
+ if v?
717
+ if @divider_location >= @width
718
+ @divider_location = (@width*@divider_at).to_i
719
+ $log.debug " SPLP correcting div loc to #{@divider_location} "
720
+ end
721
+ end
722
+ bordercolor = @border_color || $datacolor
723
+ borderatt = @border_attrib || Ncurses::A_NORMAL
724
+ absrow = @row
725
+ abscol = @col
726
+ $log.debug " #{@graphic} calling print_border #{@row} #{@col} "
727
+ @graphic.print_border(@row, @col, @height-1, @width-1, bordercolor, borderatt)
728
+ rc = @divider_location
729
+
730
+ @graphic.attron(Ncurses.COLOR_PAIR(bordercolor) | borderatt)
731
+ # 2010-02-14 18:23 - non buffered, have to make relative coords into absolute
732
+ #+ by adding row and col
733
+ if @orientation == :VERTICAL_SPLIT
734
+ $log.debug "SPLP #{@name} prtingign split vline divider 1, rc: #{rc}, h:#{@height} - 2 "
735
+ @graphic.mvvline(absrow+1, rc+abscol, 0, @height-2)
736
+ else
737
+ $log.debug "SPLP #{@name} prtingign split hline divider rc: #{rc} , 1 , w:#{@width} - 2"
738
+ @graphic.mvhline(rc+absrow, abscol+1, 0, @width-2)
739
+ end
740
+ @graphic.attroff(Ncurses.COLOR_PAIR(bordercolor) | borderatt)
741
+ end
742
+ if @first_component != nil
743
+ $log.debug " SPLP #{@name} repaint 1c ..."
744
+ # this means that some components will create a buffer with default top and left of 0 the
745
+ # first time. Is there no way we can tell FC what top and left to use.
746
+ update_first_component
747
+ @first_component.repaint
748
+ # earlier before repaint but bombs since some chaps create buffer in repaint
749
+ #XXX @first_component.get_buffer().set_screen_row_col(1, 1) # check this out XXX
750
+ ## the next block is critical for when we switch from one orientation to the other
751
+ ##+ We want first component to expand as much as possible
752
+ if @orientation == :VERTICAL_SPLIT
753
+ #XXX @first_component.get_buffer().set_screen_max_row_col(@height-2, @divider_location-1)
754
+ else
755
+ #XXX @first_component.get_buffer().set_screen_max_row_col(@divider_location-1, @width-2)
756
+ end
757
+ #XXX ret = @first_component.buffer_to_screen(@graphic)
758
+ #XXX $log.debug " SPLP repaint #{@name} fc ret = #{ret} "
759
+ end
760
+ if @second_component != nil
761
+ $log.debug " SPLP repaint #{@name} 2c ... dl: #{@divider_location} "
762
+ # this is required since c2 gets its row and col only after divider has been set
763
+ update_second_component
764
+ @second_component.repaint unless @divider_location == 0
765
+
766
+ # we need to keep top and left of buffer synced with components row and col.
767
+ # Since buffer has no link to comp therefore it can't check back.
768
+ #XXX @second_component.get_buffer().set_screen_row_col(@second_component.row, @second_component.col)
769
+ if @orientation == :VERTICAL_SPLIT
770
+ #XXX @second_component.get_buffer().set_screen_max_row_col(@height-2, @width-2)
771
+ else
772
+ #XXX @second_component.get_buffer().set_screen_max_row_col(@height-2, @width-2)
773
+ end
774
+
775
+ #XXX ret = @second_component.buffer_to_screen(@graphic)
776
+ #XXX $log.debug " SPLP repaint #{@name} 2c ret = #{ret} "
777
+ end
778
+ #XXX @buffer_modified = true
779
+ @graphic.wrefresh # 2010-02-14 20:18 SUBWIN ONLY ??? what is this doing here ? XXX
780
+ paint
781
+ # TODO
782
+ end
783
+ def getvalue
784
+ # TODO
785
+ end
786
+ # we forgot to call the on_enter and on_leave
787
+ # this switches between components. Now we tab out after last.
788
+ def goto_next_component
789
+ if @current_component != nil
790
+ if @current_component == @first_component
791
+ @current_component.on_leave
792
+ if @second_component
793
+ @current_component = @second_component
794
+ @current_component.on_enter
795
+ else
796
+ return :UNHANDLED
797
+ end
798
+ else
799
+ #@current_component = @first_component
800
+ @current_component.on_leave
801
+ return :UNHANDLED # try to get him out.
802
+ end
803
+ set_form_row
804
+ else
805
+ # this happens in one_tab_expand
806
+ @current_component = @second_component if @first_component.nil?
807
+ @current_component = @first_component if @second_component.nil?
808
+ set_form_row
809
+ end
810
+ 0
811
+ end
812
+ def goto_prev_component
813
+ if @current_component != nil
814
+ if @current_component == @second_component
815
+ @current_component.on_leave
816
+ if @first_component
817
+ @current_component = @first_component
818
+ @current_component.on_enter
819
+ else
820
+ return :UNHANDLED
821
+ end
822
+ else
823
+ #@current_component = @first_component
824
+ @current_component.on_leave
825
+ return :UNHANDLED # try to get him out.
826
+ end
827
+ set_form_row
828
+ else
829
+ # this happens in one_tab_expand
830
+ @current_component = @second_component if @first_component.nil?
831
+ @current_component = @first_component if @second_component.nil?
832
+ set_form_row
833
+ end
834
+ 0
835
+ end
836
+ ## Handles key for splitpanes
837
+ ## By default, first component gets focus, not the SPL itself.
838
+ ##+ Mostly passing to child, and handling child's left-overs.
839
+ ## NOTE: How do we switch to the other outer SPL?
840
+ def handle_key ch
841
+ _multiplier = ($multiplier == 0 ? 1 : $multiplier )
842
+ @current_component ||= @first_component
843
+ ## 2010-01-15 12:57 this helps me switch between highest level
844
+ ## However, i should do as follows:
845
+ ## If tab on second component, return UNHA so form can take to next field
846
+ ## If B_tab on second comp, switch to first
847
+ ## If B_tab on first comp, return UNHA so form can take to prev field
848
+ if ch == 9
849
+ #return goto_next_component
850
+ #return 0
851
+ end
852
+
853
+ if @current_component != nil
854
+ # give the child the key to handle, this is the last current child
855
+ ret = @current_component.handle_key ch
856
+ return ret if ret != :UNHANDLED
857
+ else
858
+ ## added 2010-01-07 18:59 in case nothing in there.
859
+ $log.debug " SPLP #{@name} - no component installed in splitpane"
860
+ #return :UNHANDLED
861
+ end
862
+ $log.debug " splitpane #{@name} gets KEY #{ch}"
863
+ case ch
864
+ when KEY_TAB
865
+ return goto_next_component
866
+ when KEY_BTAB
867
+ return goto_prev_component
868
+ #return 0
869
+ when ?\M-w.getbyte(0)
870
+ # switch panes
871
+ if @current_component != nil
872
+ if @current_component == @first_component
873
+ @current_component = @second_component
874
+ else
875
+ @current_component = @first_component
876
+ end
877
+ set_form_row
878
+ else
879
+ return goto_next_component
880
+ #return 0
881
+ # if i've expanded bottom pane, tabbed to opposite higher level, tabbing back
882
+ # brings me to null first pane and i can't go to second, so switch
883
+ # this was added for a non-realistic test program with embedded splitpanes
884
+ #+ but no component inside them. At least one can go from one outer to another.
885
+ #+ In real life, this should not come.
886
+
887
+ return :UNHANDLED
888
+ end
889
+ when ?\M-V.getbyte(0)
890
+ self.orientation(:VERTICAL_SPLIT)
891
+ @repaint_required = true
892
+ when ?\M-H.getbyte(0)
893
+ self.orientation(:HORIZONTAL_SPLIT)
894
+ @repaint_required = true
895
+ when ?\M--.getbyte(0)
896
+ self.set_divider_location(self.divider_location-_multiplier)
897
+ when ?\M-\+.getbyte(0)
898
+ self.set_divider_location(self.divider_location+_multiplier)
899
+ when ?\M-\=.getbyte(0)
900
+ self.set_resize_weight(0.50)
901
+ #when ?\C-u.getbyte(0)
902
+ ## multiplier. Series is 4 16 64
903
+ #@multiplier = (@multiplier == 0 ? 4 : @multiplier *= 4)
904
+ #return 0
905
+ when ?\C-c.getbyte(0)
906
+ $multiplier = 0
907
+ return 0
908
+ else
909
+ # check for bindings, these cannot override above keys since placed at end
910
+ ret = process_key ch, self
911
+ return :UNHANDLED if ret == :UNHANDLED
912
+ end
913
+ $multiplier = 0
914
+ return 0
915
+ end
916
+ def paint
917
+ @repaint_required = false
918
+ end
919
+ # on entering this component
920
+ # place user on first child
921
+ # TODO if he backtabs in then place on last
922
+ def on_enter
923
+ # 2010-09-14 00:58 forcing first always
924
+ if $current_key == KEY_BTAB
925
+ @current_component = @second_component
926
+ else
927
+ @current_component = @first_component
928
+ end
929
+ @current_component.on_enter if @current_component
930
+
931
+ set_form_row
932
+ end
933
+ # used to set form to whatever was current last
934
+ # now we set to first so user can cycle through. User does not see it as a split
935
+ # within split, just as panes.
936
+ def set_form_row
937
+ if !@current_component.nil?
938
+ $log.debug " #{@name} set_form_row calling sfr for #{@current_component.name} "
939
+ @current_component.set_form_row
940
+ @current_component.set_form_col
941
+ end
942
+ end
943
+ # added 2010-02-09 10:10
944
+ # sets the forms cursor column correctly
945
+ # earlier the super was being called which missed out on child's column.
946
+ # Note: splitpane does not use the cursor, so it does not know where cursor should be displayed,
947
+ #+ the child has to decide where it should be displayed.
948
+ def set_form_col
949
+ if !@current_component.nil?
950
+ $log.debug " #{@name} set_form_col calling sfc for #{@current_component.name} "
951
+ @current_component.set_form_col
952
+ end
953
+ end
954
+ private
955
+ #def _other_component
956
+ #if @current_component == @first_component
957
+ #return @second_component
958
+ #end
959
+ #return @first_component
960
+ #end
961
+ ## expand a split to maximum. This is the one_touch_expandable feature
962
+ # Currently mapped to C-w 1 (mnemonic for one touch), or C-w o (vim's only)
963
+ # To revert, you have to unexpand
964
+ # Note: basically, i nil the component that we don't want to see
965
+ def expand
966
+ @is_expanding = true # this is required so i don't check for min_width later
967
+ $log.debug " callign expand "
968
+ if @current_component == @first_component
969
+ @saved_component = @second_component
970
+ @second_component = nil
971
+ if @orientation == :VERTICAL_SPLIT
972
+ set_divider_location @width - 1
973
+ else
974
+ set_divider_location @height - 1
975
+ end
976
+ $log.debug " callign expand 2 nil #{@divider_location}, h:#{@height} w: #{@width} "
977
+ else
978
+ @saved_component = @first_component
979
+ @first_component = nil
980
+ set_divider_location 1
981
+ $log.debug " callign expand 1 nil #{@divider_location}, h:#{@height} w: #{@width} "
982
+ end
983
+ @repaint_required = true
984
+ end
985
+ # after expanding one split, revert to original - actually i reset, rather than revert
986
+ # This only works after expand has been done
987
+ def unexpand
988
+ $log.debug " inside unexpand "
989
+ return unless @saved_component
990
+ if @first_component.nil?
991
+ @first_component = @saved_component
992
+ else
993
+ @second_component = @saved_component
994
+ end
995
+ @saved_component = nil
996
+ @repaint_required = true
997
+ reset_to_preferred_sizes
998
+ end
999
+
1000
+ # exchange 2 splits, bound to C-w x
1001
+ def exchange
1002
+ tmp = @first_component
1003
+ @first_component = @second_component
1004
+ @second_component = tmp
1005
+ @repaint_required = true
1006
+ reset_to_preferred_sizes
1007
+ end
1008
+ end # class SplitPane
1009
+ end # module