tool_mgr(initialize):-
	to_bb(mk_area, application_dialog),
	to_bb(update_me, application_dialog, application_dialog),
	to_bb(mk_area, transaction),
	to_bb(update_me, transaction, transaction),
	get_env_var('IFE_HOME', _Ife_Home),	% load installation defaults
	name(_Ife_Home, _Str1),
	append(_Str1, "lib/ac/ac/kbs/tools_pw3", _Str2),	%%%% should get 'pw3' from env variable
	name(_TL_fname, _Str2),
	to_bb(journal,[' scanning the ', _TL_fname,' tool list...'] ),
	[-_TL_fname].


/* Assuming all tools need data, get it. Then data_for predicate will start the tool.  */
start(_DesignFunction):-
	tool(_DesignFunction, _Application, _Args),		/* check tool exists */
	to_bb(application_dialog, get_data_for, _DesignFunction, _Application),
	assert(starting(_DesignFunction)).

start(_DesignFunction):-
	not_found(_DesignFunction).


/* Data_model returns requested data (filename in _Data; later step file/actual data)  
 * data requested is in a format suitable for the tool, _Application 
 * Note: ife_ah listening for "new_application" and matches the _DesignFunction
 * with script in sys/bin/IFe_xx where xx = 'DesignFunction' name.
 * Note: lib/startup/ah_clients no longer used.
 */
data_for(_DesignFunction, _Application, _Data):-
	starting(_DesignFunction),	/* check still trying to start the tool */
	to_bb(journal, ['past ', _DesignFunction, ' "starting" predicate '] ),
	tool(_DesignFunction, _Application, _Args),		/* check tool exists */
	to_bb(journal, ['matched ', _DesignFunction, _Application, ' "tool" predicate '] ),
%% <!!>  need a version of to_bb that takes another parameter...
%%	to_bb(application_dialog, new_application, _Application, _DesignFunction, _Args, _Data),
	to_bb(application_dialog, new_application, _Application, _DesignFunction, _Data),
	to_bb(journal, ['asked new_applicaiton ', _Application, _DesignFunction, _Args, _Data, ' ... '] ),
	to_bb(journal, started, _DesignFunction).
data_for(_DesignFunction, _Data):-
	to_bb(journal, error, ['no-one wanted ', _DesignFunction, ' data'] ).



finished(_DesignFunction):-
	tool(_DesignFunction, _Application, _Args),
	retract(starting(__DesignFunction)),
	to_bb(transaction, [[_DesignFunction, '_complete	finished_ok']]),
	to_bb(journal, stopped, _DesignFunction).
finished(_DesignFunction):-
	tool(_DesignFunction, _Application, _Args),
	to_bb(transaction, [[_DesignFunction, '_complete	finished_ok']]),
	to_bb(journal, error, [['unstarted tool, "', _DesignFunction, '" finished']]).

finished(_DesignFunction):-
	to_bb(transaction, [[_DesignFunction, '_complete	finished_ok']]),
	to_bb(journal, error, [['unknown tool, "', _DesignFunction, '" finished']]).

not_found(_DesignFunction):-
	to_bb(transaction, [[_DesignFunction, '_aborted	unknown']]),
	to_bb(journal, error, [['unknown tool, "', _DesignFunction, '": not started']]).

aborted(_DesignFunction, _Exit_code):-
	tool(_DesignFunction, _Application, _Args),
	retract(starting(_DesignFunction)),
	to_bb(transaction, [[_DesignFunction, '_aborted']],
			[['aborted: exit code ', _Exit_code]]),
	to_bb(journal, stopped, _Application).
aborted(_DesignFunction, _Exit_code):-
	tool(_DesignFunction, _Application, _Args),
	to_bb(transaction, [[_DesignFunction, '_aborted']],
			[['aborted: exit code ', _Exit_code]]),
	to_bb(journal, error, [['unstarted tool, "', _Application, '" aborted']]).

