mrdialog 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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