%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% File : MULTI_EVAL %% Created by : Joakim Eriksson & Niclas Finne %% Created date : 01-12-4 %% %% $Author: joakime $ %% $Date: 2001/12/18 20:20:15 $ %% $Revision: 1.2 $ %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Description: %% %% Methods: %% :- module(logic_jeval, [start/0,stop/0,alt/0]). :- use_module('../../jeval/jeval_server', []). :- use_module('../../jeval/jeval', []). :- use_module('../../http/http_server', []). :- use_module('../../html/html', []). :- dynamic monitor/4. :- jeval_server:register_applet(eval, logic_jeval).%% applet or application... :- http_server:register_page('index.html', logic_jeval). :- http_server:set_default_port(P). http_request(_HttpReq, HttpRes) :- html:page_start(HttpRes, "Logic Monitor Jeval Example"), html:heading1(HttpRes, "Logic Monitor Jeval Example"), html:send(HttpRes, 'Enter expressions to monitor
',[]), jeval_server:generate_applet(HttpRes, eval, "width=400 height=200"), html:page_end(HttpRes). client_connected(_Host, User) :- jeval:jeval(User, '\c jevalApplet.setLayout(new GridLayout(0,2));\c expr = new TextField[5]; result = new Label[5]; for (int i=0; i < 5; i++) {\c expr[i] = new TextField("");\c jevalApplet.add(expr[i]);\c result[i] = new Label("Result:");\c jevalApplet.add(result[i]);\c } button = new Button("Update Monitors!");\c jevalApplet.add(button);\c jeval.addActionListener("button");\c jevalApplet.validate();\c jevalApplet.repaint();'). client_disconnected(_User). client_event(action_event(_, _, _), User) :- set_monitors(4, User). client_result(N, ExpAtom, User) :- retractall(monitor(N, _, _, User)), get_term(ExpAtom, Expr, Vars), !, assert(monitor(N, Expr, Vars, User)), call_robust(Expr, Vars, Result), jeval:jeval(User, 'result[' + N + '].setText("Result: ' + Result + '")'). client_result(_N, '', _User) :- !. client_result(N, _ExpAtom, User) :- jeval:jeval(User, 'result[' + N + '].setText("Result: syntax error")'). resume(_) :- monitor(N, Expr, Vars, User), call_robust(Expr, Vars, Result), jeval:jeval(User, 'result[' + N + '].setText("Result: ' + Result + '")'), fail. resume(_). set_monitors(-1, _) :- !. set_monitors(N, User) :- jeval:jeval(User, N, 'expr[' + N + '].getText().trim()'), NextN is N - 1, set_monitors(NextN, User). call_robust(Term, Vars, Result) :- catch(charsio:with_output_to_chars(Term, Str), _Error, fail), !, Result = Str + ' ' + D, print_result(Vars, D). call_robust(_Term, _Vars, failed). print_result([], []). print_result([Name=Var | Rest], Name + ' = ' + Var + ' ' + Stream) :- print_result(Rest, Stream). get_term(Result, Term, Vars) :- charsio:atom_to_chars(Result, R_S, "."), charsio:open_chars_stream(R_S, DataStream), catch(read_term(DataStream, Term, [variable_names(Vars)]), _Error, (close(DataStream),fail)), close(DataStream). start :- server:init, http_server:get_url(URL), format('Please browse to ~s~n', [URL]), server:new_thread(tick, logic_jeval), server:run.