rbhex-core 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/CHANGELOG +2000 -0
  4. data/LICENSE +56 -0
  5. data/README.md +44 -0
  6. data/examples/abasiclist.rb +179 -0
  7. data/examples/alpmenu.rb +50 -0
  8. data/examples/app.sample +19 -0
  9. data/examples/atree.rb +100 -0
  10. data/examples/bline.rb +136 -0
  11. data/examples/common/file.rb +45 -0
  12. data/examples/data/README.markdown +9 -0
  13. data/examples/data/brew.txt +38 -0
  14. data/examples/data/color.2 +37 -0
  15. data/examples/data/gemlist.txt +60 -0
  16. data/examples/data/lotr.txt +12 -0
  17. data/examples/data/ports.txt +136 -0
  18. data/examples/data/table.txt +37 -0
  19. data/examples/data/tasks.csv +88 -0
  20. data/examples/data/tasks.txt +27 -0
  21. data/examples/data/todo.txt +10 -0
  22. data/examples/data/todo.txt.bak +10 -0
  23. data/examples/data/todocsv.csv +28 -0
  24. data/examples/data/unix1.txt +21 -0
  25. data/examples/data/unix2.txt +11 -0
  26. data/examples/dbdemo.rb +502 -0
  27. data/examples/dirtree.rb +94 -0
  28. data/examples/newtabbedwindow.rb +100 -0
  29. data/examples/newtesttabp.rb +92 -0
  30. data/examples/tabular.rb +146 -0
  31. data/examples/tasks.rb +178 -0
  32. data/examples/term2.rb +84 -0
  33. data/examples/testbuttons.rb +296 -0
  34. data/examples/testcombo.rb +102 -0
  35. data/examples/testfields.rb +195 -0
  36. data/examples/testkeypress.rb +72 -0
  37. data/examples/testlistbox.rb +170 -0
  38. data/examples/testmessagebox.rb +140 -0
  39. data/examples/testprogress.rb +116 -0
  40. data/examples/testree.rb +106 -0
  41. data/examples/testwsshortcuts.rb +66 -0
  42. data/examples/testwsshortcuts2.rb +128 -0
  43. data/lib/rbhex.rb +6 -0
  44. data/lib/rbhex/core/docs/index.txt +73 -0
  45. data/lib/rbhex/core/include/action.rb +80 -0
  46. data/lib/rbhex/core/include/actionmanager.rb +49 -0
  47. data/lib/rbhex/core/include/appmethods.rb +214 -0
  48. data/lib/rbhex/core/include/bordertitle.rb +48 -0
  49. data/lib/rbhex/core/include/chunk.rb +203 -0
  50. data/lib/rbhex/core/include/io.rb +553 -0
  51. data/lib/rbhex/core/include/listbindings.rb +74 -0
  52. data/lib/rbhex/core/include/listcellrenderer.rb +140 -0
  53. data/lib/rbhex/core/include/listeditable.rb +317 -0
  54. data/lib/rbhex/core/include/listscrollable.rb +663 -0
  55. data/lib/rbhex/core/include/listselectable.rb +271 -0
  56. data/lib/rbhex/core/include/multibuffer.rb +83 -0
  57. data/lib/rbhex/core/include/orderedhash.rb +77 -0
  58. data/lib/rbhex/core/include/ractionevent.rb +73 -0
  59. data/lib/rbhex/core/include/rchangeevent.rb +27 -0
  60. data/lib/rbhex/core/include/rhistory.rb +95 -0
  61. data/lib/rbhex/core/include/rinputdataevent.rb +47 -0
  62. data/lib/rbhex/core/include/vieditable.rb +172 -0
  63. data/lib/rbhex/core/include/widgetmenu.rb +66 -0
  64. data/lib/rbhex/core/system/colormap.rb +165 -0
  65. data/lib/rbhex/core/system/keyboard.rb +150 -0
  66. data/lib/rbhex/core/system/keydefs.rb +30 -0
  67. data/lib/rbhex/core/system/ncurses.rb +236 -0
  68. data/lib/rbhex/core/system/panel.rb +162 -0
  69. data/lib/rbhex/core/system/window.rb +913 -0
  70. data/lib/rbhex/core/util/ansiparser.rb +119 -0
  71. data/lib/rbhex/core/util/app.rb +1228 -0
  72. data/lib/rbhex/core/util/basestack.rb +410 -0
  73. data/lib/rbhex/core/util/bottomline.rb +1859 -0
  74. data/lib/rbhex/core/util/colorparser.rb +77 -0
  75. data/lib/rbhex/core/util/focusmanager.rb +31 -0
  76. data/lib/rbhex/core/util/padreader.rb +192 -0
  77. data/lib/rbhex/core/util/rcommandwindow.rb +604 -0
  78. data/lib/rbhex/core/util/rdialogs.rb +574 -0
  79. data/lib/rbhex/core/util/viewer.rb +149 -0
  80. data/lib/rbhex/core/util/widgetshortcuts.rb +506 -0
  81. data/lib/rbhex/core/version.rb +5 -0
  82. data/lib/rbhex/core/widgets/applicationheader.rb +103 -0
  83. data/lib/rbhex/core/widgets/box.rb +58 -0
  84. data/lib/rbhex/core/widgets/divider.rb +310 -0
  85. data/lib/rbhex/core/widgets/keylabelprinter.rb +194 -0
  86. data/lib/rbhex/core/widgets/rcombo.rb +253 -0
  87. data/lib/rbhex/core/widgets/rcontainer.rb +415 -0
  88. data/lib/rbhex/core/widgets/rlink.rb +30 -0
  89. data/lib/rbhex/core/widgets/rlist.rb +696 -0
  90. data/lib/rbhex/core/widgets/rmenu.rb +958 -0
  91. data/lib/rbhex/core/widgets/rmenulink.rb +22 -0
  92. data/lib/rbhex/core/widgets/rmessagebox.rb +387 -0
  93. data/lib/rbhex/core/widgets/rprogress.rb +118 -0
  94. data/lib/rbhex/core/widgets/rtabbedpane.rb +634 -0
  95. data/lib/rbhex/core/widgets/rtabbedwindow.rb +70 -0
  96. data/lib/rbhex/core/widgets/rtextarea.rb +960 -0
  97. data/lib/rbhex/core/widgets/rtextview.rb +739 -0
  98. data/lib/rbhex/core/widgets/rtree.rb +768 -0
  99. data/lib/rbhex/core/widgets/rwidget.rb +3277 -0
  100. data/lib/rbhex/core/widgets/scrollbar.rb +143 -0
  101. data/lib/rbhex/core/widgets/statusline.rb +113 -0
  102. data/lib/rbhex/core/widgets/tabular.rb +264 -0
  103. data/lib/rbhex/core/widgets/tabularwidget.rb +1142 -0
  104. data/lib/rbhex/core/widgets/textpad.rb +995 -0
  105. data/lib/rbhex/core/widgets/tree/treecellrenderer.rb +150 -0
  106. data/lib/rbhex/core/widgets/tree/treemodel.rb +428 -0
  107. data/rbhex-core.gemspec +32 -0
  108. metadata +172 -0
@@ -0,0 +1,22 @@
1
+ require 'rbhex/core/widgets/rlink'
2
+ ##
3
+ module RubyCurses
4
+ class MenuLink < Link
5
+ dsl_property :description
6
+
7
+ def initialize form, config={}, &block
8
+ config[:hotkey] = true
9
+ super
10
+ @col_offset = -1 * (@col || 1)
11
+ @row_offset = -1 * (@row || 1)
12
+ end
13
+ # added for some standardization 2010-09-07 20:28
14
+ # alias :text :getvalue # NEXT VERSION
15
+ # change existing text to label
16
+
17
+ def getvalue_for_paint
18
+ "%s %-12s - %-s" % [ @mnemonic , getvalue(), @description ]
19
+ end
20
+ ##
21
+ end # class
22
+ end # module
@@ -0,0 +1,387 @@
1
+ # --------------------------------------------------------------------------------- #
2
+ # File: rmessagebox.rb
3
+ # Description: This is a cleaner attempt at messagebox on the lines of
4
+ # the new tabbedpane and window.
5
+ # Author: rkumar http://github.com/rkumar/rbcurse/
6
+ # Date: 03.11.11 - 22:15
7
+ # License: Same as Ruby's License (http://www.ruby-lang.org/LICENSE.txt)
8
+ # Last update: 03.11.11 - 23:47
9
+ # == CHANGES
10
+ # == TODO
11
+ # _ <ENTER> should result in OK being pressed if its default, ESC should result in cancel esp 2 time
12
+ # ensure that text and message are used in isolation and not with other things
13
+ #
14
+ # _ determine window size, but we are doing instance eval later.
15
+ #
16
+ # _ maybe have shortcuts for some widgets field, buttons, text and label and
17
+ # share with app and otherszz
18
+ #
19
+ # _ stack, flow and grid
20
+ #
21
+ # --------------------------------------------------------------------------------- #
22
+
23
+ require 'rbhex'
24
+ require 'rbhex/core/include/bordertitle'
25
+
26
+ include RubyCurses
27
+ module RubyCurses
28
+ extend self
29
+ class MessageBox
30
+ include BorderTitle
31
+ include RubyCurses::Utils
32
+
33
+ attr_reader :form
34
+ attr_reader :window
35
+ dsl_accessor :button_type
36
+ dsl_accessor :default_button
37
+ #
38
+ # a message to be printed, usually this will be the only thing supplied
39
+ # with an OK button. This should be a short string, a label will be used
40
+ # and input_config passed to it
41
+
42
+ #dsl_accessor :message
43
+ # you can also set button_orientation : :right, :left, :center
44
+ #
45
+ def initialize config={}, &block
46
+
47
+ h = config.fetch(:height, nil)
48
+ w = config.fetch(:width, nil)
49
+ t = config.fetch(:row, nil)
50
+ l = config.fetch(:col, nil)
51
+ if h && w && t && l
52
+ @window = VER::Window.new :height => h, :width => w, :top => t, :left => l
53
+ @graphic = @window
54
+ end
55
+ @form = Form.new @window
56
+
57
+ config.each_pair { |k,v| instance_variable_set("@#{k}",v) }
58
+ @config = config
59
+ @row = 0
60
+ @col = 0
61
+ @row_offset = 1
62
+ @col_offset = 2
63
+ #bordertitle_init
64
+ @color ||= :black
65
+ @bgcolor ||= :white
66
+ @maxrow = 3
67
+
68
+ #instance_eval &block if block_given?
69
+ yield_or_eval &block if block_given?
70
+
71
+ end
72
+ def item widget
73
+ # remove from existing form if set FIXME
74
+ if widget.form
75
+ f = widget.form
76
+ f.remove_widget widget
77
+ end
78
+ @maxrow ||= 3
79
+ widget.set_form @form
80
+ widget.row ||= 0
81
+ widget.col ||= 0
82
+ if widget.row == 0
83
+ widget.row = [@maxrow+1, 3].max if widget.row == 0
84
+ else
85
+ widget.row += @row_offset
86
+ end
87
+ if widget.col === 0
88
+ widget.col = 5 if widget.col === 0
89
+ else
90
+ # i don't know button_offset as yet
91
+ widget.col += @col_offset
92
+ end
93
+ # in most cases this override is okay, but what if user has set it
94
+ # The problem is that widget and field are doing a default setting so i don't know
95
+ # if user has set or widget has done a default setting. NOTE
96
+ widget.color ||= @color # we are overriding colors, how to avoid since widget sets it
97
+ widget.bgcolor ||= @bgcolor
98
+ widget.attr = @attr if @attr # we are overriding what user has put. DARN !
99
+ @maxrow = widget.row if widget.row > @maxrow
100
+ @suggested_h = @height || @maxrow+6
101
+ @suggested_w ||= 0
102
+ @suggested_w = widget.col + 15 if widget.col > @suggested_w
103
+ # if w's given col is > width then add to suggested_w or text.length
104
+ end
105
+ alias :add :item
106
+ # returns button index
107
+ # Call this after instantiating the window
108
+ def run
109
+ repaint
110
+ @form.repaint
111
+ @window.wrefresh
112
+ return handle_keys
113
+ end
114
+ def repaint
115
+ _create_window unless @window
116
+ acolor = get_color $reverscolor # this implicitly uses color and bgcolor fooling me often
117
+ $log.debug " MESSAGE BOX bg:#{@bgcolor} , co:#{@color} , colorpair:#{acolor}"
118
+ @window.wbkgd(Ncurses.COLOR_PAIR(acolor)); # does not work on xterm-256color
119
+
120
+ #print_borders unless @suppress_borders # do this once only, unless everything changes
121
+ #@window.print_border_mb 1,2, @height, @width, $normalcolor, FFI::NCurses::A_REVERSE
122
+ @color_pair = get_color($datacolor)
123
+ bordercolor = @border_color || @color_pair
124
+ borderatt = @border_attrib || Ncurses::A_NORMAL
125
+ @window.wattron(Ncurses.COLOR_PAIR(bordercolor) | (borderatt || FFI::NCurses::A_NORMAL))
126
+ @window.print_border_mb 1,2, @height, @width, bordercolor, borderatt
127
+ @window.wattroff(Ncurses.COLOR_PAIR(bordercolor) | (borderatt || FFI::NCurses::A_NORMAL))
128
+ @title ||= "+-+"
129
+ title = " "+@title+" "
130
+ @window.printstring(@row=1,@col=(@width-title.length)/2,title, color=$normalcolor)
131
+ #print_message if @message
132
+ create_action_buttons unless @action_buttons
133
+ end
134
+ # Pass a short message to be printed.
135
+ # This creates a label for a short message, and a field for a long one.
136
+ # @yield field created
137
+ # @param [String] text to display
138
+ def message message # yield label or field being used for display for further customization
139
+ @suggested_h = @height || 10
140
+ message = message.gsub(/[\n\r\t]/,' ') rescue message
141
+ message_col = 5
142
+ @suggested_w = @width || [message.size + 8 + message_col , FFI::NCurses.COLS-2].min
143
+ r = 3
144
+ len = message.length
145
+ @suggested_w = len + 8 + message_col if len < @suggested_w - 8 - message_col
146
+
147
+ display_length = @suggested_w-8
148
+ display_length -= message_col
149
+ message_height = 2
150
+ clr = @color || :white
151
+ bgclr = @bgcolor || :black
152
+
153
+ # trying this out. sometimes very long labels get truncated, so i give a field in wchich user
154
+ # can use arrow key or C-a and C-e
155
+ if message.size > display_length
156
+ message_label = RubyCurses::Field.new @form, {:text => message, :name=>"message_label",
157
+ :row => r, :col => message_col, :display_length => display_length,
158
+ :bgcolor => bgclr , :color => clr, :editable => false}
159
+ else
160
+ message_label = RubyCurses::Label.new @form, {:text => message, :name=>"message_label",
161
+ :row => r, :col => message_col, :display_length => display_length,
162
+ :height => message_height, :bgcolor => bgclr , :color => clr}
163
+ end
164
+ @maxrow = 3
165
+ yield message_label if block_given?
166
+ end
167
+ alias :message= :message
168
+
169
+ # This is for larger messages, or messages where the size is not known.
170
+ # A textview object is created and yielded.
171
+ #
172
+ def text message
173
+ @suggested_w = @width || (FFI::NCurses.COLS * 0.80).floor
174
+ @suggested_h = @height || (FFI::NCurses.LINES * 0.80).floor
175
+
176
+ message_col = 3
177
+ r = 2
178
+ display_length = @suggested_w-4
179
+ display_length -= message_col
180
+ clr = @color || :white
181
+ bgclr = @bgcolor || :black
182
+
183
+ if message.is_a? Array
184
+ l = longest_in_list message
185
+ if l > @suggested_w
186
+ if l < FFI::NCurses.COLS
187
+ #@suggested_w = l
188
+ @suggested_w = FFI::NCurses.COLS-2
189
+ else
190
+ @suggested_w = FFI::NCurses.COLS-2
191
+ end
192
+ display_length = @suggested_w-6
193
+ end
194
+ # reduce width and height if you can based on array contents
195
+ else
196
+ message = wrap_text(message, display_length).split("\n")
197
+ end
198
+ message_height = message.size + 8
199
+ # reduce if possible if its not required.
200
+ #
201
+ r1 = (FFI::NCurses.LINES-@suggested_h)/2
202
+ r1 = r1.floor
203
+ w = @suggested_w
204
+ c1 = (FFI::NCurses.COLS-w)/2
205
+ c1 = c1.floor
206
+ @suggested_row = r1
207
+ @suggested_col = c1
208
+ brow = @button_row || @suggested_h-4
209
+ available_ht = brow - r + 1
210
+ message_height = [message_height, available_ht].min
211
+ require 'rbhex/core/widgets/rtextview'
212
+ message_label = RubyCurses::TextView.new @form, {:name=>"message_label", :text => message,
213
+ :row => r, :col => message_col, :width => display_length, :suppress_borders => true,
214
+ :height => message_height, :bgcolor => bgclr , :color => clr}
215
+ #message_label.set_content message
216
+ yield message_label if block_given?
217
+
218
+ end
219
+ alias :text= :text
220
+
221
+ # returns button index (or in some cases, whatever value was thrown
222
+ # if user did not specify any button_type but gave his own and did throw (:close, x)
223
+ private
224
+ def handle_keys
225
+ buttonindex = catch(:close) do
226
+ while((ch = @window.getchar()) != FFI::NCurses::KEY_F10 )
227
+ break if ch == ?\C-q.getbyte(0) || ch == 2727 # added double esc
228
+ begin
229
+ @form.handle_key(ch)
230
+ @window.wrefresh
231
+ rescue => err
232
+ $log.debug( err) if err
233
+ $log.debug(err.backtrace.join("\n")) if err
234
+ textdialog ["Error in Messagebox: #{err} ", *err.backtrace], :title => "Exception"
235
+ @window.refresh # otherwise the window keeps showing (new FFI-ncurses issue)
236
+ $error_message.value = ""
237
+ ensure
238
+ end
239
+
240
+ end # while loop
241
+ end # close
242
+ $log.debug "XXX: CALLER GOT #{buttonindex} "
243
+ @window.destroy
244
+ return buttonindex
245
+ end
246
+ private
247
+ def create_action_buttons
248
+ return unless @button_type
249
+ @default_button = 0 if !@default_button
250
+ case @button_type.to_s.downcase
251
+ when "ok"
252
+ make_buttons ["&OK"]
253
+ when "ok_cancel" #, "input", "list", "field_list"
254
+ make_buttons %w[&OK &Cancel]
255
+ when "ok_apply_cancel" #, "input", "list", "field_list"
256
+ make_buttons %w[&OK &Apply &Cancel]
257
+ when "yes_no"
258
+ make_buttons %w[&Yes &No]
259
+ when "yes_no_cancel"
260
+ make_buttons ["&Yes", "&No", "&Cancel"]
261
+ when "custom"
262
+ raise "Blank list of buttons passed to custom" if @buttons.nil? or @buttons.size == 0
263
+ make_buttons @buttons
264
+ else
265
+ $log.warn "No buttontype passed for creating tabbedpane. Not creating any"
266
+ #make_buttons ["&OK"]
267
+ end
268
+ end
269
+ private
270
+ def make_buttons names
271
+ @action_buttons = []
272
+ $log.debug "XXX: came to NTP make buttons FORM= #{@form.name} names #{names} "
273
+ total = names.inject(0) {|total, item| total + item.length + 4}
274
+ bcol = align_buttons total, @button_orientation
275
+
276
+ # this craps out when height is zero
277
+ brow = @row + @height-4
278
+ brow = FFI::NCurses.LINES-2 if brow < 0
279
+ @button_row = brow
280
+ #color_pair = get_color($normalcolor)
281
+ #@window.wattron(Ncurses.COLOR_PAIR(color_pair) | (@attrib || FFI::NCurses::A_NORMAL))
282
+ #@window.mvwhline( brow-1, @col+1, Ncurses::ACS_HLINE, @width-2)
283
+ #@window.wattroff(Ncurses.COLOR_PAIR(color_pair) | (@attrib || FFI::NCurses::A_NORMAL))
284
+ $log.debug "XXX: putting buttons :on #{brow} , #{bcol} : #{@row} , #{@height} "
285
+ button_ct =0
286
+ tpp = self
287
+ _color = @color
288
+ _bgcolor = @bgcolor
289
+ names.each_with_index do |bname, ix|
290
+ text = bname
291
+
292
+ button = Button.new @form do
293
+ text text
294
+ name bname
295
+ row brow
296
+ col bcol
297
+ highlight_background $reversecolor
298
+ color _color
299
+ bgcolor _bgcolor
300
+ end
301
+ @action_buttons << button
302
+ button.form = @form
303
+ button.override_graphic @graphic
304
+ button.default_button(true) if (@default_button && @default_button == ix)
305
+ index = button_ct
306
+ tpp = self
307
+ button.command { |form| @selected_index = index; @stop = true;
308
+ # ActionEvent has source event and action_command
309
+ action = ActionEvent.new(tpp, index, button.text)
310
+ if @command
311
+ @command.call(action, @args)
312
+ else
313
+ # default action if you don't specify anything
314
+ throw(:close, @selected_index)
315
+ end
316
+ }
317
+ # we map the key of the button to the alphabet so user can press just the mnemonic, and not
318
+ # just the Alt combination.
319
+ mn = button.mnemonic
320
+ @form.bind_key(mn.downcase) { button.fire} if mn
321
+ button_ct += 1
322
+ bcol += text.length+6
323
+ end
324
+ end
325
+ def _create_window
326
+
327
+ @width ||= @suggested_w || 60
328
+ @height = @suggested_h || 10
329
+ if @suggested_row
330
+ @row = @suggested_row
331
+ else
332
+ @row = ((FFI::NCurses.LINES-@height)/2).floor
333
+ end
334
+ if @suggested_col
335
+ @col = @suggested_col
336
+ else
337
+ w = @width
338
+ @col = ((FFI::NCurses.COLS-w)/2).floor
339
+ end
340
+ @window = VER::Window.new :height => @height, :width => @width, :top => @row, :left => @col
341
+ @graphic = @window
342
+ @form.window = @window
343
+ end
344
+ #
345
+ # specify a code block to be fired when an action button is pressed
346
+ # This will supply (to the code block) an ActionEvent followed by
347
+ # whatever args that were given.
348
+ # ActionEvent contains source, event, action_command which map to
349
+ # the messagebox, selected_index (base 0) and button title.
350
+ #
351
+ public
352
+ def command *args, &blk
353
+ @command = blk
354
+ @args = args
355
+ end
356
+ # returns array of widgets declared for querying
357
+ def widgets
358
+ @form.widgets
359
+ end
360
+ # returns a widget based on offset, or name (if you gave it a :name)
361
+ # e.g. a list was declared and we wish to know the selected_indices
362
+ def widget n
363
+ case n
364
+ when Fixnum
365
+ @form.widgets[n]
366
+ when String, Symbol
367
+ @form.by_name[n]
368
+ else
369
+ raise "messagebox.widget can't handle #{n.class} "
370
+ end
371
+ end
372
+
373
+ # returns starting column for buttons to start painting
374
+ # Not very correct in case of :right
375
+ private
376
+ def align_buttons textlen, orient=:center
377
+ case orient
378
+ when :left
379
+ return @col+@col_offset
380
+ when :right
381
+ return (@width-textlen)-5
382
+ else
383
+ return (@width-textlen)/2
384
+ end
385
+ end
386
+ end
387
+ end
@@ -0,0 +1,118 @@
1
+ #require 'ncurses'
2
+ require 'logger'
3
+ require 'rbhex'
4
+
5
+ #include Ncurses # FFI 2011-09-8
6
+ include RubyCurses
7
+ module RubyCurses
8
+ extend self
9
+ ##
10
+ # TODO user may want to print a label on progress: like not started or complete.
11
+ class Progress < Widget
12
+ dsl_property :width # please give this to ensure the we only print this much
13
+ dsl_property :fraction # how much to cover
14
+ dsl_property :char # what char to use for filling, default space
15
+ dsl_property :text # text to put over bar
16
+ dsl_accessor :style # :old or nil/anything else
17
+ dsl_accessor :surround_chars # "[]"
18
+
19
+ def initialize form, config={}, &block
20
+
21
+ @row = config.fetch("row",-1)
22
+ @col = config.fetch("col",-1)
23
+ @bgcolor = config.fetch("bgcolor", $def_bg_color)
24
+ @color = config.fetch("color", $def_fg_color)
25
+ @name = config.fetch("name", "pbar")
26
+ @editable = false
27
+ @focusable = false
28
+ super
29
+ @surround_chars ||= "[]" # for :old style
30
+ @repaint_required = true
31
+ end
32
+ def getvalue
33
+ @fraction || 0.0
34
+ end
35
+
36
+ ##
37
+ #
38
+ def repaint
39
+ return unless @repaint_required
40
+ $log.debug " XXXX PBAR inside repaint #{@color} , #{@fraction} "
41
+ r,c = rowcol
42
+ #value = getvalue_for_paint
43
+ acolor = get_color @bgcolor
44
+ bcolor = get_color @color
45
+ @graphic = @form.window if @graphic.nil? ## HACK messagebox givig this in repaint, 423 not working ??
46
+ len = 0
47
+ w2 = @width - 6 #2 account for brackets and printing of percentage
48
+ if @fraction
49
+ @fraction = 1.0 if @fraction > 1.0
50
+ @fraction = 0 if @fraction < 0
51
+ if @fraction > 0
52
+ len = @fraction * @width
53
+ end
54
+ end
55
+ if @style == :old
56
+ ftext=""
57
+ char = @char || "="
58
+ if @fraction && @fraction >= 0
59
+ len = @fraction * (w2)
60
+ ftext << sprintf("%3d%s",(@fraction * 100).to_i, "%")
61
+ end
62
+ incomplete = w2 - len
63
+ complete = len
64
+ # I am printing 2 times since sometimes the ending bracket gets printed one position less
65
+ str = @surround_chars[0] + " "*w2 + @surround_chars[1] + ftext
66
+ @graphic.printstring r, c, str , acolor,@attr
67
+ str = char*complete
68
+ str[-1] = ">" if char == "=" && complete > 2
69
+ @graphic.printstring r, c+1, str , acolor,@attr
70
+ else
71
+
72
+ char = @char || " "
73
+ # first print the background horizonal bar
74
+ @graphic.printstring r, c, " " * @width , acolor,@attr
75
+
76
+ # if the user has passed a percentage we need to print that in @color
77
+ if @fraction
78
+ #bcolor = get_color @color
79
+ #@fraction = 1.0 if @fraction > 1.0
80
+ #@fraction = 0 if @fraction < 0
81
+ #if @fraction > 0
82
+ #len = @fraction * @width
83
+ #char = @char || " "
84
+
85
+ # if text is to printed over the bar
86
+ if @text
87
+ textcolor = get_color $datacolor, 'black'
88
+ txt = @text
89
+ txt = @text[0..@width] if @text.length > @width
90
+ textattr = 'bold'
91
+ # write the text in a color that contrasts with the background
92
+ # typically black
93
+ @graphic.printstring r, c, txt , textcolor, textattr if @text
94
+
95
+ # now write the text again, in a color that contrasts with the progress
96
+ # bar color that is expanding. However, the text must be padded to len and truncated
97
+ # to len as well. it must be exactly len in size.
98
+ txt = sprintf("%-*s", len, txt)
99
+ if len > 0
100
+ if len < txt.length
101
+ txt = txt[0..len]
102
+ end
103
+ textcolor = get_color $datacolor, 'white', @color
104
+ @graphic.printstring r, c, txt , textcolor, textattr if @text
105
+ end
106
+ else
107
+ # no text was given just print a horizontal bar
108
+ @graphic.printstring r, c, char * len , bcolor, 'reverse'
109
+ end
110
+ end # frac > 0
111
+ end # fraction
112
+ end # style
113
+ @repaint_required = false
114
+ end
115
+ def repaint_old
116
+ end
117
+ # ADD HERE progress
118
+ end