%
%	(C)1992 Institute for New Generation Computer Technology
%	$BG[I[$=$NB>$O(BCOPYRIGHT$B%U%!%$%k$r;2>H$7$F2<$5$$(B
%	(Read COPYRIGHT for detailed information.)
%

class init_load has

attribute
    trouble,
    (buf := Buf :- :create(#standard_io_buffer,Buf)),
    (menu := Menu :- :get(#font_def,k16,Font),:create(#standard_temporary_menu,[items_list([]),title("troubles"),font(Font)],Menu)),
    (mesg_menu := Mesg :- :get(#font_def,k16,Font),:create(#standard_temporary_menu,[items_list([]),label_flag(off),font(Font)],Mesg));

:init_load_def_data(Class,Device) :-
    init_load_def_data(Class,Device);

:filled_grid(Class,Win) :-
    :get_node_index(#node_index,Index),
    :get_contents(Index,Nodes),
    :get_grid_index(Win,Grid),
    filled_grid(Nodes,Grid);

:show_troubles(Class,Win,Trouble) :-
    :open_mesg(Class,initialize),
    show_troubles(Class,Win,Trouble),
    :open_mesg(Class,{check,Trouble});

:open_mesg(Class,Code) :-
    :get_slot(Class,mesg_menu,Mesg),
    :get_slot(Class,buf,Buf),
    get_items(Code,Items,Buf),
    :clear_items(Mesg),
    :add_items(Mesg,Items,0),
    :show(Mesg);
        
local

get_items(initialize,Items,_):- !,
    Items = [{"$B8N>c$r@_Dj$7$?$$ItIJ$r(B",no_select,_,_},
             {"$B%^%&%9$GA*$s$G$/$@$5$$(B",no_select,_,_}];
get_items({check,trouble(Dev,Trouble)},Items,Buf):-
    :reset(Buf),:putt(Buf,Dev),:putl(Buf),:getl(Buf,L1),
    :reset(Buf),:putt(Buf,Trouble),:putl(Buf),:getl(Buf,L2),
    :append(#string,[L1,"$B$K(B",L2,"$B$N@_Dj$,9T$o$l$^$9(B"],Str),
    Items = [{Str,no_select,_,_}];

filled_grid([],_) :- !;
filled_grid([Node|Nodes],Grid) :-
    :get_func_class(Node,Func),
    :get_level(Func,Level),
    (Level == system,!,
        filled_grid(Nodes,Grid);
        :get_point(Node,X,Y),
        :get_size(Node,Xs,Ys),
        XX is X + Xs,
        YY is Y + Ys,
        f_grid(X,Y,XX,YY,XX,Grid,Node),
        filled_grid(Nodes,Grid));

f_grid(X,Y,XX,YY,XX0,Grid,Obj) :-
    XX > X, YY >= Y,!,
%    :get_edit_window(#edit_window,W),
%    :draw_filled_circle(W,XX*7,YY*13,2,2,fix,set),
    set_grid_type(node,XX,YY,Grid,Obj),
    XX1 is XX - 1,
    f_grid(X,Y,XX1,YY,XX0,Grid,Obj);
f_grid(X,Y,XX,YY,XX0,Grid,Obj) :-
    YY >= Y ,!,
%    :get_edit_window(#edit_window,W),
%    :draw_filled_circle(W,XX*7,YY*13,2,2,fix,set),
    set_grid_type(node,XX,YY,Grid,Obj),
    YY1 is YY- 1,
    f_grid(X,Y,XX0,YY1,XX0,Grid,Obj);
f_grid(_,_,_,_,_,_,_) :- !;

set_grid_type(Type,X1,Y1,Gr,Obj) :-
    make_key(X1,Y1,Key),
    :get_at(Gr,Grid,Key),
    :set_type_on_grid(Grid,Type),
    :set_object_on_grid(Grid,Obj);

make_key(X,Y,Key) :-
    X1 is X * 10000,
    Key is X1 + Y;


show_troubles(Class,Win,Trouble) :-
    :show(Win),
    :read_click_with_position(Win,Code,X,Y),
    :get_slot(Class,menu,Menu),
    :deactivate(Menu),
    :get_grid_point(Win,X,Y,XX,YY),
    :get_grid_object(Win,XX,YY,Gr),
    :get_object_on_grid(Gr,Node),
    :is_object(#symbolizer,Node),
    :class_object(Node,#node),
    :get_name(Node,Cmp),
    :get_troubles(Node,Troubles),
    show_troubles(Troubles,Cmp,Menu,Trouble,Class),!,
    :deactivate(Menu);

show_troubles(Class,Win,Trouble) :- !,
    show_troubles(Class,Win,Trouble);

show_troubles(Troubles,Cmp,Menu,Trouble,Class) :-
    :clear_items(Menu),
    :get_slot(Class,buf,Buf),
    get_items_list(Troubles,Trs,Buf,RR),
    :get_atom_string(#symbolizer,Cmp,Dev),
    :append(#string,["DEVICE NAME : ",Dev],StrDev),
    :add_item(Menu,{StrDev,no_select,_,_},0),
    :add_items(Menu,Trs,1),
    :show(Menu),
    (RR == abort ,!,fail;true),!,
    :show(Menu),
    :read(Menu,Code),
    (Code == abort ,!,fail;true),
    :reset(Buf),:putl(Buf,Dev),:putb(Buf,". ",2),
    :gett(Buf,Device),
    Trouble = trouble(Device,Code);

get_items_list([],[],_,_) :- !;
get_items_list([Tr|Troubles],[Item|Trs],Buf,_) :-
    :reset(Buf),
    :putt(Buf,Tr),:putl(Buf),:getl(Buf,STr),
    Item = {STr,common,Tr,_},!,
    get_items_list(Troubles,Trs,Buf,_);
get_items_list(_,Item,_,abort) :- !,
    Item = [
    {"$B$3$NItIJ$K$O8N>c@_Dj$,$"$j$^$;$s(B",no_select,_,_},
      {"$BJL$NItIJ$rA*Br$7$F$/$@$5$$(B",no_select,_,_}];

init_load_def_data(Class,Device) :-
    :append(#string,[Device,".troubles"],Filename),
    :append(#pathname,"me:tr_data",Filename,New),
    load_trouble(New,Troubles),
    :get_slot(Class,buf,Buf),
    set_troubles(Troubles,Buf);

load_trouble(Path,Troubles) :- 
    :create(#standard_input_file,Std_in,Path),
    get_term(Std_in,Troubles);

get_term(Std,Troubles) :-
    :end_of_input(Std),!,
    :close_input(Std),
    Troubles = [];
get_term(Std,Troubles) :-
    :gett(Std,Term),
    Troubles = [Term|TroublesL],
    get_term(Std,TroublesL);

set_troubles([],_) :- !;
set_troubles([trouble(normal,Tr)|Troubles],Buf) :- !,
    set_troubles(Troubles,Buf);
set_troubles([trouble(Dev,Tr)|Troubles],Buf) :-
    :get_node_index(#node_index,Index),
    :reset(Buf),
    :putt(Buf,Dev),:putl(Buf),:getl(Buf,StrDev),
    :enter_atom(#symbolizer,Cmp,StrDev),
    :get_at(Index,Node,Cmp),!,
    :set_troubles(Node,Tr),
    set_troubles(Troubles,Buf);

set_troubles([_|Troubles],Buf) :-
    set_troubles(Troubles,Buf);

end.