Files
EWF/tools/ise_wizard/src/lib/wizard.e
Jocelyn Fiat 9b13aa27dd Added simple console wizard for Eiffel Studio.
(It is not very user friendly, this is a first draft)
It should be improved in the future (with GUI, ...)
2012-06-22 15:54:50 +02:00

266 lines
5.6 KiB
Plaintext

note
description : "Objects that ..."
author : "$Author$"
date : "$Date$"
revision : "$Revision$"
deferred class
WIZARD
inherit
ARGUMENTS
feature {NONE} -- Initialization
initialize
-- Initialize `Current'.
local
i,n: INTEGER
s: READABLE_STRING_8
wizard_directory_name: detachable READABLE_STRING_8
callback_file_name: detachable READABLE_STRING_8
do
create variables.make (5)
n := argument_count
if n > 0 then
from
i := 1
until
i > n
loop
s := argument (i)
if s.same_string ("-callback") or s.same_string ("--callback") then
i := i + 1
if i <= n then
callback_file_name := argument (i)
end
elseif wizard_directory_name = Void then
wizard_directory_name := s
else
debug
io.error.put_string ("Ignoring argument %"" + s + "%"%N")
end
end
i := i + 1
end
end
if wizard_directory_name = Void then
display_usage (io.error)
quit ("ERROR: Missing wizard directory name.")
elseif callback_file_name = Void then
display_usage (io.error)
quit ("ERROR: Missing Eiffel Studio callback file name.")
else
create layout.make (wizard_directory_name, callback_file_name)
end
end
feature -- Status
display_usage (f: FILE)
do
f.put_string ("Usage: wizard {dirname} -callback {filename}%N")
f.put_string (" -callback filename: file used to communicate back with Eiffel Studio%N")
f.put_string (" dirname: folder containing the wizard resources, pixmaps, ...%N")
end
quit (m: detachable READABLE_STRING_8)
do
if m /= Void then
io.error.put_string (m)
end
send_response (create {WIZARD_FAILED_RESPONSE})
ensure
False -- never reached
end
die (code: INTEGER)
do
(create {EXCEPTIONS}).die (code)
end
feature -- Access
variables: HASH_TABLE [READABLE_STRING_8, READABLE_STRING_8]
layout: detachable WIZARD_LAYOUT
feature -- Response
send_response (res: WIZARD_RESPONSE)
local
f: RAW_FILE
do
if attached layout as lay then
create f.make (lay.callback_file_name)
if not f.exists or else f.is_writable then
f.open_write
res.send (f)
f.close
else
die (0)
end
else
die (0)
end
end
feature {NONE} -- Implementation
boolean_question (m: READABLE_STRING_8; a_options: detachable ITERABLE [TUPLE [key: READABLE_STRING_8; value: BOOLEAN]]; def: detachable STRING_8): BOOLEAN
local
s: STRING_8
l_answered: BOOLEAN
l_options: detachable ITERABLE [TUPLE [key: READABLE_STRING_8; value: BOOLEAN]]
do
from
until
l_answered
loop
io.put_string (m)
if l_options = Void then
l_options := a_options
end
if l_options = Void then
l_options := <<["y", True], ["Y", True]>>
end
io.read_line
s := io.last_string
s.left_adjust
s.right_adjust
if s.is_empty and def /= Void then
s := def
end
if not s.is_empty then
across
l_options as o
until
l_answered
loop
if o.item.key.same_string (s) then
l_answered := True
Result := o.item.value
end
end
if not l_answered then
l_answered := True
Result := False
end
end
end
end
string_question (m: READABLE_STRING_8; a_options: detachable ITERABLE [TUPLE [key: READABLE_STRING_8; value: detachable READABLE_STRING_8]]; def: detachable READABLE_STRING_8; a_required_valid_option: BOOLEAN): detachable READABLE_STRING_8
local
s: STRING_8
l_answered: BOOLEAN
do
from
until
l_answered
loop
io.put_string (m)
io.read_line
s := io.last_string
s.left_adjust
s.right_adjust
if s.is_empty and def /= Void then
s := def
end
if not s.is_empty then
if a_options /= Void then
across
a_options as o
until
l_answered
loop
if o.item.key.same_string (s) then
l_answered := True
Result := o.item.value
end
end
end
if not l_answered then
l_answered := True
Result := s
if
a_required_valid_option and then
a_options /= Void and then
not across a_options as o some attached o.item.value as v and then Result.same_string (v) end
then
l_answered := False
Result := Void
end
end
end
end
end
copy_file (a_src, a_target: READABLE_STRING_8)
local
f,t: RAW_FILE
do
create f.make (a_src)
if f.exists and f.is_readable then
create t.make (a_target)
if not t.exists or else t.is_writable then
f.open_read
t.open_write
f.copy_to (t)
t.close
f.close
end
end
end
new_uuid: STRING_8
local
gen: UUID_GENERATOR
do
create gen
Result := gen.generate_uuid.out
end
feature -- Resources
copy_resource (a_res: READABLE_STRING_8; a_target: READABLE_STRING_8)
do
if attached layout as lay then
copy_file (lay.resource (a_res), a_target)
end
end
copy_resource_template (a_res: READABLE_STRING_8; a_target: READABLE_STRING_8)
local
f,t: RAW_FILE
do
if attached layout as lay then
create f.make (lay.resource (a_res))
if f.exists and f.is_readable then
create t.make (a_target)
if not t.exists or else t.is_writable then
f.open_read
t.create_read_write
from
f.read_line
until
f.exhausted
loop
across
variables as v
loop
f.last_string.replace_substring_all ("${WIZ:" + v.key + "}", v.item)
end
t.put_string (f.last_string)
t.put_new_line
f.read_line
end
t.close
f.close
end
end
end
end
end