mrdialog 1.0.1

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.
data/lib/mrdialog.rb ADDED
@@ -0,0 +1,3 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+
3
+ require 'mrdialog/mrdialog'
Binary file
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
4
+ require 'pp'
5
+
6
+ begin
7
+ ME = File.basename($0)
8
+ text = <<EOF
9
+ This example is taken from dialog/samples/menulist
10
+ shell script.
11
+
12
+ Hi, this is a buildlist dialog. The list on the left
13
+ shows the unselected items. The list on the right shows
14
+ the selected items. Use SPACE bar to select/unselect
15
+ items.
16
+
17
+ EOF
18
+ items = []
19
+ Struct.new("BuildListData", :tag, :item, :status)
20
+ data = Struct::BuildListData.new
21
+
22
+ data.tag = "1"
23
+ data.item = "Item number 1"
24
+ data.status = true
25
+ items.push(data.to_a)
26
+
27
+ data = Struct::BuildListData.new
28
+ data.tag = "2"
29
+ data.item = "Item number 2"
30
+ data.status = false
31
+ items.push(data.to_a)
32
+
33
+ data = Struct::BuildListData.new
34
+ data.tag = "3"
35
+ data.item = "Item number 3"
36
+ data.status = false
37
+ items.push(data.to_a)
38
+
39
+ data = Struct::BuildListData.new
40
+ data.tag = "4"
41
+ data.item = "Item number 4"
42
+ data.status = true
43
+ items.push(data.to_a)
44
+
45
+ data = Struct::BuildListData.new
46
+ data.tag = "5"
47
+ data.item = "Item number 5"
48
+ data.status = false
49
+ items.push(data.to_a)
50
+
51
+ data = Struct::BuildListData.new
52
+ data.tag = "6"
53
+ data.item = "Item number 6"
54
+ data.status = true
55
+ items.push(data.to_a)
56
+
57
+ dialog = MRDialog.new
58
+ dialog.clear = true
59
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
60
+
61
+ height = 0
62
+ width = 0
63
+ listheight = 0
64
+
65
+ selected_items = dialog.buildlist(text, items, height, width, listheight)
66
+ exit_code = dialog.exit_code
67
+ puts "Exit code: #{exit_code}"
68
+ puts "Selecetd tags:"
69
+ selected_items.each do |item|
70
+ puts " '#{item}'"
71
+ end
72
+
73
+ rescue => e
74
+ puts "#{$!}"
75
+ t = e.backtrace.join("\n\t")
76
+ puts "Error: #{t}"
77
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ########################################################################
4
+ # Example for calendar widget.
5
+ # muquit@muquit.com Apr-02-2014
6
+ ########################################################################
7
+ #
8
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
9
+ require 'date'
10
+
11
+ begin
12
+ ME = File.basename($0)
13
+ text = "Please choose a date..."
14
+
15
+ height = 0
16
+ width = 0
17
+ day = Date.today.mday
18
+ month =Date.today.mon
19
+ year =Date.today.year
20
+
21
+ dialog = MRDialog.new
22
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
23
+ dialog.clear = true
24
+ dialog.title = "CALENDAR"
25
+
26
+ date = dialog.calendar(text, height, width, day, month, year)
27
+ puts "Result is: #{date.to_s}"
28
+
29
+ rescue => e
30
+ puts "#{$!}"
31
+ t = e.backtrace.join("\n\t")
32
+ puts "Error: #{t}"
33
+ end
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
4
+ require 'pp'
5
+
6
+ begin
7
+ ME = File.basename($0)
8
+ text = <<EOF
9
+ This example is taken from dialog/samples/radiolist
10
+ shell script.
11
+
12
+ Hi, this is a radiolist box. You can use this to
13
+ present a list of choices which can be turned on or
14
+ off. If there are more items than can fit on the
15
+ screen, the list will be scrolled. You can use the
16
+ UP/DOWN arrow keys, the first letter of the choice as a
17
+ hot key, or the number keys 1-9 to choose an option.
18
+ Press SPACE to toggle an option on/off.
19
+
20
+ Which of the following are fruits?
21
+
22
+ EOF
23
+ items = []
24
+ checklist_data = Struct.new(:tag, :item, :select)
25
+
26
+ data = checklist_data.new
27
+ data.tag = "Apple"
28
+ data.item = "It's an applie"
29
+ data.select = false
30
+ items.push(data.to_a)
31
+
32
+ data = checklist_data.new
33
+ data.tag = "Dog"
34
+ data.item = "No it's not my dog"
35
+ data.select = true
36
+ items.push(data.to_a)
37
+
38
+ data = checklist_data.new
39
+ data.tag = "Orange"
40
+ data.item = "Yeah! it is juicy"
41
+ data.select = false
42
+ items.push(data.to_a)
43
+
44
+ data = checklist_data.new
45
+ data.tag = "Chicken"
46
+ data.item = "Normally not a pet"
47
+ data.select = true
48
+ items.push(data.to_a)
49
+
50
+ dialog = MRDialog.new
51
+ dialog.clear = true
52
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
53
+
54
+ selected_items = dialog.checklist(text, items)
55
+ exit_code = dialog.exit_code
56
+ puts selected_items.class
57
+ puts "Exit code: #{exit_code}"
58
+ puts "Selected Items:"
59
+ selected_items.each do |item|
60
+ puts " '#{item}'"
61
+ end
62
+
63
+ rescue => e
64
+ puts "#{$!}"
65
+ t = e.backtrace.join("\n\t")
66
+ puts "Error: #{t}"
67
+ end
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
4
+ require 'pp'
5
+ require 'tempfile'
6
+
7
+ begin
8
+ ME = File.basename($0)
9
+
10
+ tmp = Tempfile.new('editbox')
11
+ tmp.puts <<-EOF
12
+ Hi, this is an edit box. It can be used to edit text from a file.
13
+
14
+ It's like a simple text editor, with these keys implemented:
15
+
16
+ PGDN - Move down one page
17
+ PGUP - Move up one page
18
+ DOWN - Move down one line
19
+ UP - Move up one line
20
+ DELETE - Delete the current character
21
+ BACKSPC - Delete the previous character
22
+
23
+ Unlike Xdialog, it does not do these:
24
+
25
+ CTRL C - Copy text
26
+ CTRL V - Paste text
27
+
28
+ Because dialog normally uses TAB for moving between fields,
29
+ this editbox uses CTRL/V as a literal-next character. You
30
+ can enter TAB characters by first pressing CTRL/V. This
31
+ example contains a few tab characters.
32
+
33
+ It supports the mouse - but only for positioning in the editbox,
34
+ or for clicking on buttons. Your terminal (emulator) may support
35
+ cut/paste.
36
+
37
+ Try to input some text below:
38
+
39
+ EOF
40
+ tmp.close
41
+
42
+ height = 0
43
+ width = 0
44
+
45
+ dialog = MRDialog.new
46
+ dialog.clear = true
47
+ dialog.shadow = false
48
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
49
+
50
+ output = dialog.editbox(tmp.path, height, width)
51
+ exit_code = dialog.exit_code
52
+ puts "Exit code: #{exit_code}"
53
+ if exit_code == 0
54
+ puts "Output: #{output}"
55
+ end
56
+ rescue => e
57
+ puts "#{$!}"
58
+ t = e.backtrace.join("\n\t")
59
+ puts "Error: #{t}"
60
+ end
data/samples/form1.rb ADDED
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # muquit@muquit.com Apr-01-2014
4
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
5
+ require 'pp'
6
+
7
+ begin
8
+ ME = File.basename($0)
9
+ # uid=1000(muquit) gid=1000(muquit)
10
+ # groups=1000(muquit),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),107(lpadmin),125(sambashare)
11
+ user = ''
12
+ uid = ''
13
+ gid = ''
14
+ home = ENV["HOME"]
15
+
16
+ id = `id`.chomp
17
+ if id =~ /^uid=(\d+)\((.+)\)\sgid=(\d+)\(.*$/
18
+ uid = $1
19
+ user = $2
20
+ gid = $3
21
+ end
22
+
23
+ dialog = MRDialog.new
24
+ dialog.clear = true
25
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
26
+
27
+ text = <<EOF
28
+ Here is a possible piece of a configuration program.
29
+ EOF
30
+ items = []
31
+ form_data = Struct.new(:label, :ly, :lx, :item, :iy, :ix, :flen, :ilen)
32
+
33
+ data = form_data.new
34
+ data.label = "Username:"
35
+ data.ly = 1
36
+ data.lx = 1
37
+ data.item = user
38
+ data.iy = 1
39
+ data.ix = 10
40
+ data.flen = user.length + 10
41
+ data.ilen = 0
42
+ items.push(data.to_a)
43
+
44
+ data = form_data.new
45
+ data.label = "UID:"
46
+ data.ly = 2
47
+ data.lx = 1
48
+ data.item = uid.to_s
49
+ data.iy = 2
50
+ data.ix = 10
51
+ data.flen = uid.length + 10
52
+ data.ilen = 0
53
+ items.push(data.to_a)
54
+
55
+ data = form_data.new
56
+ data.label = "GID:"
57
+ data.ly = 3
58
+ data.lx = 1
59
+ data.item = gid.to_s
60
+ data.iy =3
61
+ data.ix = 10
62
+ data.flen = gid.length + 2
63
+ data.ilen = 0
64
+ items.push(data.to_a)
65
+
66
+ data = form_data.new
67
+ data.label = "HOME:"
68
+ data.ly = 4
69
+ data.lx = 1
70
+ data.item = home
71
+ data.iy = 4
72
+ data.ix = 10
73
+ data.flen = home.length + 40
74
+ data.ilen = 0
75
+ items.push(data.to_a)
76
+
77
+ result_hash = dialog.form(text, items, 20, 50, 0)
78
+ if result_hash
79
+ puts "Resulting data:"
80
+ result_hash.each do |key, val|
81
+ puts " #{key} = #{val}"
82
+ end
83
+ end
84
+
85
+
86
+ rescue => e
87
+ puts "#{$!}"
88
+ t = e.backtrace.join("\n\t")
89
+ puts "Error: #{t}"
90
+ end
data/samples/form2.rb ADDED
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ########################################################################
4
+ # Same as form1 but dialog will not go away unless all the fields are
5
+ # specified
6
+ # muquit@muquit.com
7
+ ########################################################################
8
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
9
+
10
+ class TestForm2
11
+ ME = File.basename($0)
12
+ def initialize
13
+ @hsh = {}
14
+ end
15
+
16
+
17
+ def show_warning
18
+ msg = ''
19
+ label = 'Username:'
20
+ if @hsh[label].length == 0
21
+ msg << "#{label} field is empty"
22
+ end
23
+ label = 'UID:'
24
+ if @hsh[label].length == 0
25
+ msg << "\n"
26
+ msg << "#{label} field is empty"
27
+ end
28
+ label = 'GID:'
29
+ if @hsh[label].length == 0
30
+ msg << "\n"
31
+ msg << "#{label} field is empty"
32
+ end
33
+ label = 'HOME:'
34
+ if @hsh[label].length == 0
35
+ msg << "\n"
36
+ msg << "#{label} field is empty"
37
+ end
38
+ dialog = MRDialog.new
39
+ dialog.title = "ERROR"
40
+ dialog.clear = true
41
+ dialog.msgbox(msg, 10, 41)
42
+ end
43
+
44
+ def form_filled?
45
+ if @hsh['Username:'].length > 0 &&
46
+ @hsh['UID:'].length > 0 &&
47
+ @hsh['GID:'].length > 0 &&
48
+ @hsh['HOME:'].length > 0
49
+ return true
50
+ end
51
+ return false
52
+ end
53
+
54
+ def doit
55
+ user = ''
56
+ uid = ''
57
+ gid = ''
58
+ home = ENV["HOME"]
59
+
60
+ id = `id`.chomp
61
+ if id =~ /^uid=(\d+)\((.+)\)\sgid=(\d+)\(.*$/
62
+ uid = $1
63
+ user = $2
64
+ gid = $3
65
+ end
66
+
67
+ dialog = MRDialog.new
68
+ dialog.clear = true
69
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
70
+
71
+ text = <<EOF
72
+ In this example of form, if any field is empty a dialog
73
+ will POP show an error. The form will exit if Cancel
74
+ button is selectged or Esc key is pressed twice.
75
+ EOF
76
+
77
+ @hsh['Username:'] = user
78
+ @hsh['UID:'] = uid.to_s
79
+ @hsh['GID:'] = gid.to_s
80
+ @hsh['HOME:'] = home
81
+
82
+ flen = 60
83
+ form_data = Struct.new(:label, :ly, :lx, :item, :iy, :ix, :flen, :ilen)
84
+
85
+ # infinite loop. break out
86
+ # - if all the values of the form are filled in when OK button is pressed
87
+ # - if Esc button is pressed twice
88
+ loop do
89
+ items = []
90
+ label = "Username:"
91
+ data = form_data.new
92
+ data.label = label
93
+ data.ly = 1
94
+ data.lx = 1
95
+ data.item = @hsh[label]
96
+ data.iy = 1
97
+ data.ix = 10
98
+ data.flen = flen
99
+ data.ilen = 0
100
+ items.push(data.to_a)
101
+
102
+ data = form_data.new
103
+ label = "UID:"
104
+ data.label = label
105
+ data.ly = 2
106
+ data.lx = 1
107
+ data.item = @hsh[label]
108
+ data.iy = 2
109
+ data.ix = 10
110
+ data.flen = flen
111
+ data.ilen = 0
112
+ items.push(data.to_a)
113
+
114
+ data = form_data.new
115
+ label = "GID:"
116
+ data.label = label
117
+ data.ly = 3
118
+ data.lx = 1
119
+ data.item = @hsh[label]
120
+ data.iy =3
121
+ data.ix = 10
122
+ data.flen = flen
123
+ data.ilen = 0
124
+ items.push(data.to_a)
125
+
126
+ data = form_data.new
127
+ label = "HOME:"
128
+ data.label = label
129
+ data.ly = 4
130
+ data.lx = 1
131
+ data.item = @hsh[label]
132
+ data.iy = 4
133
+ data.ix = 10
134
+ data.flen = flen
135
+ data.ilen = 0
136
+ items.push(data.to_a)
137
+
138
+ @hsh = dialog.form(text, items, 20, 60, 0)
139
+ exit_code = dialog.exit_code
140
+ @hsh.each do |key, val|
141
+ puts "'#{key}' = #{val}"
142
+ end
143
+
144
+ puts "Exit code: #{exit_code}"
145
+ case exit_code
146
+ when dialog.dialog_cancel
147
+ puts "Username: #{@hsh["Username:"]}"
148
+ puts "CANCEL"
149
+ break
150
+ when dialog.dialog_esc
151
+ puts "Username: #{@hsh["Username:"]}"
152
+ puts "Escape.. exiting"
153
+ break
154
+ end
155
+ if !form_filled?
156
+ show_warning
157
+ else
158
+ puts "Resulting data:"
159
+ @hsh.each do |key, val|
160
+ puts "'#{key}' = #{val}"
161
+ end
162
+ break
163
+ end
164
+ end
165
+ end
166
+ end
167
+
168
+ if __FILE__ == $0
169
+ TestForm2.new.doit
170
+ end
data/samples/form3.rb ADDED
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ########################################################################
4
+ # Culculate the max length of key as the x for the item
5
+ ########################################################################
6
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
7
+ require 'pp'
8
+
9
+ class TestForm
10
+ ME = File.basename($0)
11
+ HIDDEN = 1
12
+ READ_ONLY = 2
13
+ def initialize
14
+ @a = []
15
+ @h = {}
16
+ end
17
+
18
+ def populate_data
19
+ @a << "Base DN: "
20
+ @a << "LDAP URI: "
21
+ @a << "LDAP Version: "
22
+ @a << "LDAP Bind DN: "
23
+ @a << "LDAP Bind Password: "
24
+ @a << "Login Attribute: "
25
+
26
+ @h[@a[0]] = "dc=example,dc=com"
27
+ @h[@a[1]] = "ldap://192.168.1.1:389"
28
+ @h[@a[2]] = "3"
29
+ @h[@a[3]] = "cn=Mary Jane, cn=Users, dc=example, dc=com"
30
+ @h[@a[4]] = "secret"
31
+ @h[@a[5]] = "sAMAccountName"
32
+ end
33
+
34
+ def max_key_len
35
+ len = 0
36
+ @a.each do |v|
37
+ if v.length > len
38
+ len = v.length
39
+ end
40
+ end
41
+ return len
42
+ end
43
+
44
+ def show_form
45
+ items = []
46
+ form_data = Struct.new(:label, :ly, :lx, :item, :iy, :ix, :flen, :ilen, :attr)
47
+
48
+ ly = 1
49
+ lx = 1
50
+ iy = 1
51
+ ix = max_key_len
52
+ flen = 1024
53
+ @a.each do |key|
54
+ data = form_data.new
55
+ data.label = key
56
+ data.ly = ly
57
+ data.lx = lx
58
+ data.item = @h[key]
59
+ data.iy = ly
60
+ data.ix = ix
61
+ data.flen = flen
62
+ data.ilen = 0
63
+ if key =~ /password/i
64
+ data.attr = HIDDEN
65
+ else
66
+ data.attr = 0
67
+ end
68
+ items.push(data.to_a)
69
+ ly = ly + 1
70
+ end
71
+
72
+ dialog = MRDialog.new
73
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
74
+ dialog.clear = true
75
+ dialog.insecure = true
76
+ dialog.title = "MIXEDFORM"
77
+
78
+ text = <<EOF
79
+ In this example of mixedform, the x co-ordinate of the items
80
+ are calculated dynamically. The longest value among the keys
81
+ is the x value for the items.
82
+ EOF
83
+ height = 20
84
+ width = 70
85
+ result_hash = dialog.mixedform(text, items, height, width, 0)
86
+ end
87
+
88
+ def doit
89
+ populate_data
90
+ show_form
91
+ end
92
+ end
93
+
94
+ if __FILE__ == $0
95
+ TestForm.new.doit
96
+ end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # muquit@muquit.com Apr-01-2014
4
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
5
+ require 'pp'
6
+
7
+ begin
8
+ ME = File.basename($0)
9
+ text = <<EOF
10
+ Please set the time...
11
+ EOF
12
+
13
+
14
+ dialog = MRDialog.new
15
+ dialog.clear = true
16
+ dialog.title = "Please choose a file"
17
+
18
+ h = 14
19
+ w = 48
20
+ file_path = ENV["HOME"] + "/"
21
+ file = dialog.fselect(file_path, h, w)
22
+
23
+ puts "Result is: #{file}"
24
+
25
+ rescue => e
26
+ puts "#{$!}"
27
+ t = e.backtrace.join("\n\t")
28
+ puts "Error: #{t}"
29
+ end
data/samples/gauge.rb ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Example for gauge widget. It is similar to the
4
+ # one comes with dialog source code.
5
+ # muquit@muquit.com Apr-02-2014
6
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
7
+
8
+ class TestGauge
9
+ ME = File.basename($0)
10
+ def initialize
11
+ end
12
+
13
+ def doit
14
+ text = "Hi, this is a gauge widget"
15
+
16
+ height = 20
17
+ width = 70
18
+ percent = 0
19
+
20
+ dialog = MRDialog.new
21
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
22
+ dialog.clear = true
23
+ dialog.title = "GAUGE"
24
+
25
+ dialog.gauge(text, height, width, percent) do |f|
26
+ 1.upto(100) do |a|
27
+ f.puts "XXX"
28
+ f.puts a
29
+ f.puts "The new\nmessage (#{a} percent)"
30
+ f.puts "XXX"
31
+ sleep 0.05
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ if __FILE__ == $0
38
+ TestGauge.new.doit
39
+ end
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # muquit@muquit.com Apr-20-2014
4
+ require [File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mrdialog'].join('/')
5
+ require 'pp'
6
+
7
+ class TestInfobox
8
+ ME = File.basename($0)
9
+ def initialize
10
+ end
11
+
12
+ def doit
13
+ dialog = MRDialog.new
14
+ dialog.logger = Logger.new(ENV["HOME"] + "/dialog_" + ME + ".log")
15
+ dialog.clear = true
16
+ dialog.title = "INFOBOX"
17
+
18
+ text = <<EOF
19
+ Hi, this is an information box. It is
20
+ different from a message box: it will
21
+ not pause waiting for input after displaying
22
+ the message. The pause here is only introduced
23
+ by the sleep command within dialog.
24
+
25
+ You have 10 seconds to read this...
26
+
27
+ EOF
28
+ dialog.sleep = 10
29
+ result = dialog.infobox(text, 10, 52)
30
+ puts "result: #{result}"
31
+ end
32
+ end
33
+
34
+ if __FILE__ == $0
35
+ TestInfobox.new.doit
36
+ end