33
33
-import(lists, [foldl/3,foldr/3,reverse/1, keysearch/3, map/2, filter/2]).
34
34
-import(gen_util, [lowercase/1, lowercase_all/1, uppercase/1, uppercase_all/1,
35
open_write/1, close/0, erl_copyright/0, w/2,
35
open_write/1, close/0, erl_copyright/0, w/2,
36
36
args/3, args/4, strip_name/2]).
53
53
gen_class1(C=#class{name=Name,parent="static",methods=Ms,options=_Opts}) ->
54
54
open_write("../src/gen/wx_misc.erl"),
55
put(current_class, Name),
55
put(current_class, Name),
58
w("%% This file is generated DO NOT EDIT~n~n", []),
58
w("%% This file is generated DO NOT EDIT~n~n", []),
59
59
w("%% @doc See external documentation: "
60
60
"<a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html\">Misc</a>.\n\n",[]),
80
80
["ignore"] -> throw(skipped);
83
83
open_write("../src/gen/"++Name++".erl"),
84
put(current_class, Name),
84
put(current_class, Name),
87
w("%% This file is generated DO NOT EDIT~n~n", []),
87
w("%% This file is generated DO NOT EDIT~n~n", []),
89
89
case lists:member(taylormade, Opts) of
91
91
{ok, Bin} = file:read_file(filename:join([wx_extra, Name++".erl"])),
95
95
w("%% @doc See external documentation: "
96
96
"<a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html\">~s</a>.\n",
97
97
[lowercase_all(Name), Name]),
99
99
case C#class.doc of
100
100
undefined -> ignore;
101
101
Str -> w("%%~n%% ~s~n~n%%~n", [Str])
104
104
case C#class.event of
107
107
EvTypes = [event_type_name(Ev) || Ev <- Evs],
108
108
EvStr = args(fun(Ev) -> "<em>"++Ev++"</em>" end, ", ", EvTypes),
110
110
w("%% <dl><dt>Use {@link wxEvtHandler:connect/3.} with EventType:</dt>~n",[]),
111
111
w("%% <dd>~s</dd></dl>~n", [EvStr]),
112
w("%% See also the message variant {@link wxEvtHandler:~s(). #~s{}} event record type.~n",
112
w("%% See also the message variant {@link wxEvtHandler:~s(). #~s{}} event record type.~n",
113
113
[event_rec_name(Name),event_rec_name(Name)]),
118
118
Parents = parents(Parent),
119
119
case [P || P <- Parents, P =/= root, P =/= object] of
122
122
w("%% <p>This class is derived (and can use functions) from:~n", []),
123
123
[w("%% <br />{@link ~s}~n", [P]) || P <- Ps],
126
126
w("%% @type ~s(). An object reference, The representation is internal~n",[Name]),
127
127
w("%% and can be changed without notice. It can't be used for comparsion~n", []),
137
137
Done0 = ["Destroy", "New", "Create", "destroy", "new", "create"],
138
138
Done = gb_sets:from_list(Done0 ++ [M|| #method{name=M} <- lists:append(Ms)]),
139
139
{_, InExported} = gen_inherited(Parents, Done, []),
140
w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",",
141
lists:usort(["parent_class/1"|InExported]),
140
w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",",
141
lists:usort(["parent_class/1"|InExported]),
144
144
w("%% @hidden~n", []),
145
145
parents_check(Parents),
147
147
Gen = fun(M) -> gen_method(Name,M) end,
148
148
NewMs = lists:map(Gen,reverse(Ms)),
151
151
gen_inherited(Parents, Done, true)
204
204
[M=#method{where=taylormade}|_] ->
205
205
[taylormade_export(Class, M)];
207
207
GetF = fun(#method{method_type=constructor,where=W,params=Ps}) ->
208
208
{Args,Opts} = split_optional(Ps),
209
OptLen = case Opts of
209
OptLen = case Opts of
211
211
_ when W =:= erl_no_opt -> 0;
214
214
"new/" ++ integer_to_list(length(Args)+OptLen);
215
215
(#method{method_type=destructor}) ->
220
220
(#method{name=N,alias=A,where=W, params=Ps}) ->
221
221
{Args,Opts} = split_optional(Ps),
222
OptLen = case Opts of
222
OptLen = case Opts of
224
224
_ when W =:= erl_no_opt -> 0;
227
227
erl_func_name(N,A) ++ "/" ++ integer_to_list(length(Args) + OptLen)
320
320
w("%% @spec (This::~s()) -> ok~n", [Class]),
321
321
w("%% @doc Destroys this object, do not use object again~n", []),
322
322
w("destroy(Obj=#wx_ref{type=Type}) ->~n", []),
323
w(" ?CLASS(Type,~s),~n",[Class]),
323
w(" ?CLASS(Type,~s),~n",[Class]),
326
326
w(" wxe_util:destroy(?DESTROY_OBJECT,Obj),~n ok.~n", []);
341
341
gen_inherited(Ps, gb_sets:union(Done,Done0), Exported).
343
343
gen_inherited_ms([[#method{name=Name,alias=A,params=Ps0,where=W,method_type=MT}|_]|R],
344
Class,Skip,Done, Exported)
345
when W =/= merged_c ->
344
Class,Skip,Done, Exported)
345
when W =/= merged_c ->
346
346
case gb_sets:is_member(Name,Skip) of
347
347
false when MT =:= member, Exported =:= true ->
348
348
Ps = [patch_param(P,all) || P <- Ps0],
349
349
Opts = if W =:= erl_no_opt -> [];
351
[Opt || Opt = #param{def=Def,in=In, where=Where} <- Ps,
351
[Opt || Opt = #param{def=Def,in=In, where=Where} <- Ps,
352
352
Def =/= none, In =/= false, Where =/= c]
354
354
w("%% @hidden~n", []),
374
374
gen_inherited_ms([[]|R],Class,Skip,Done0,Exp) ->
375
375
gen_inherited_ms(R,Class,Skip,Done0,Exp);
376
376
gen_inherited_ms([], _, _Skip, Done,Exp) -> {Done,Exp}.
381
taylormade_func(Class, #method{name=Name, id=Id}) ->
381
taylormade_func(Class, [#method{name=Name, id=Id}|_]) ->
382
382
{ok, Bin} = file:read_file(filename:join([wx_extra, Class ++".erl"])),
383
Str0 = binary_to_list(Bin),
384
{match, [Str1]} = re:run(Str0, "<<"++Name++"(.*)"++Name++">>",
385
[dotall, {capture, all_but_first, list}]),
387
w(Str1, ["?" ++ get_unique_name(Id)]),
383
Src = binary_to_list(Bin),
384
Str = case gen_util:get_taylor_made(Src, Name) of
386
{match, [Str0]} = gen_util:get_taylor_made(Src, get_unique_name(Id)),
391
w(Str, ["?" ++ get_unique_name(Id)]),
390
394
taylormade_export(Class, #method{name=Name}) ->
412
416
Name = erl_arg_name(Name0),
413
417
w(" ?CLASS(~sT,~s),~s", [Name,T,EOS]),
415
arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS,Acc)
419
arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS,Acc)
416
420
when In =/= false ->
417
421
Name = erl_arg_name(Name0),
418
422
w(" [?CLASS(~sT,~s) || #wx_ref{type=~sT} <- ~s],~s", [Name,T,Name,Name,EOS]),
420
424
arg_type_test(#param{name=Name0,def=none,in=In,
422
426
M1, #type{base={class,T1},single=true},Ps1,
423
M2, #type{base={class,T2},single=true},Ps2}}, EOS, _Acc)
427
M2, #type{base={class,T2},single=true},Ps2}}, EOS, _Acc)
424
428
when In =/= false ->
425
429
Name = erl_arg_name(Name0),
426
430
Opname = Name++"OP",
427
431
w(" ~s = case ?CLASS_T(~sT,~s) of~n true ->\n ", [Opname,Name,T1]),
428
lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end,
432
lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end,
429
433
element(1,split_optional(Ps1))),
430
434
w("?~s;~n",[get_unique_name(M1)]),
431
435
w(" _ -> ?CLASS(~sT,~s),\n ",[Name,T2]),
432
436
{Ps21,_} = split_optional(patchArgName(Ps2,Ps1)),
433
lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end,
437
lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end,
435
439
w("?~s\n end,~s",[get_unique_name(M2),EOS]),
437
arg_type_test(#param{name=Name0, type=#type{base=eventType}}, EOS, Acc) ->
441
arg_type_test(#param{name=Name0, type=#type{base=eventType}}, EOS, Acc) ->
438
442
Name = erl_arg_name(Name0),
439
443
w(" ~sBin = list_to_binary([atom_to_list(~s)|[0]]),~s", [Name,Name,EOS]),
440
444
w(" ThisTypeBin = list_to_binary([atom_to_list(ThisT)|[0]]),~s", [EOS]),
442
arg_type_test(#param{name=Name0,def=none,type=#type{base={term,_}}}, EOS, Acc) ->
446
arg_type_test(#param{name=Name0,def=none,type=#type{base={term,_}}}, EOS, Acc) ->
443
447
Name = erl_arg_name(Name0),
444
448
w(" wxe_util:send_bin(term_to_binary(~s)),~s", [Name,EOS]),
446
arg_type_test(#param{name=Name0,type=#type{base=binary}},EOS,Acc) ->
450
arg_type_test(#param{name=Name0,type=#type{base=binary}},EOS,Acc) ->
447
451
Name = erl_arg_name(Name0),
448
452
w(" wxe_util:send_bin(~s),~s", [Name,EOS]),
450
arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},EOS,Acc) ->
454
arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},EOS,Acc) ->
452
456
Type =:= "wxArtClient", Single =:= true ->
453
457
Name = erl_arg_name(Name0),
454
458
w(" ~s_UC = unicode:characters_to_binary([~s, $_, $C,0]),~s",
458
462
w(" ~s_UC = unicode:characters_to_binary([~s,0]),~s", [Name,Name,EOS]);
459
463
Type =:= "wxArrayString" ->
460
464
Name = erl_arg_name(Name0),
461
w(" ~s_UCA = [unicode:characters_to_binary([~sTemp,0]) || ~s",
465
w(" ~s_UCA = [unicode:characters_to_binary([~sTemp,0]) || ~s",
462
466
[Name,Name, EOS]),
463
467
w(" ~sTemp <- ~s],~s", [Name,Name,EOS]);
464
468
true -> %% Not a string
468
472
arg_type_test(_,_,Acc) -> Acc.
518
522
split_optional(Ps) ->
519
523
split_optional(Ps, [], []).
520
split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts)
524
split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts)
521
525
when Def =/= none, In =/= false, Where =/= c ->
522
526
split_optional(Ps, Standard, [P|Opts]);
523
split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts)
527
split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts)
524
528
when Def =:= none, In =/= false, Where =/= c ->
525
529
split_optional(Ps, [P|Standard], Opts);
526
530
split_optional([_|Ps], Standard, Opts) ->
532
536
P#param{type={class,ignore}};
533
537
patch_param(P=#param{type={merged,_,_,_,_,_,_}}, _) ->
534
538
P#param{type={class,ignore}};
535
patch_param(P=#param{type=#type{base={class,_}}},_) ->
539
patch_param(P=#param{type=#type{base={class,_}}},_) ->
536
540
P#param{type={class,ignore}};
537
patch_param(P=#param{type=#type{base={ref,_}}},_) ->
541
patch_param(P=#param{type=#type{base={ref,_}}},_) ->
538
542
P#param{type={class,ignore}};
539
543
patch_param(P,_) -> P.
541
545
func_arg_name(#param{def=Def}) when Def =/= none -> skip;
542
546
func_arg_name(#param{in=false}) -> skip;
543
547
func_arg_name(#param{where=c}) -> skip;
544
func_arg_name(#param{name=Name}) ->
548
func_arg_name(#param{name=Name}) ->
545
549
erl_arg_name(Name).
547
551
func_arg(#param{def=Def}) when Def =/= none -> skip;
548
552
func_arg(#param{in=false}) -> skip;
549
553
func_arg(#param{where=c}) -> skip;
550
func_arg(#param{name=Name,type=#type{base=string}}) ->
554
func_arg(#param{name=Name,type=#type{base=string}}) ->
551
555
erl_arg_name(Name);
552
func_arg(#param{name=Name,type=#type{name="wxArrayString"}}) ->
556
func_arg(#param{name=Name,type=#type{name="wxArrayString"}}) ->
553
557
erl_arg_name(Name);
554
558
func_arg(#param{name=Name0,type=#type{base={class,_CN}, single=true}}) ->
555
559
Name = erl_arg_name(Name0),
637
641
gen_function_clause(erl_func_name(N,A),MT,Ps,empty_list,[no_guards,name_only]);
638
642
gen_doc(Class,[#method{name=N,params=Ps,type=T}])->
639
643
{_, Optional} = split_optional(Ps),
640
NonDef = [Arg || Arg = #param{def=Def,in=In, where=Where} <- Ps,
644
NonDef = [Arg || Arg = #param{def=Def,in=In, where=Where} <- Ps,
641
645
Def =:= none, In =/= false, Where =/= c],
642
646
OptsType = case Optional of
644
648
_ when NonDef =:= [] -> "[Option]";
647
651
w("%% @spec (~s~s) -> ~s~n",
648
652
[doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]),
649
653
doc_optional(Optional, normal),
650
DocEnum = doc_enum(T,Ps, normal),
654
DocEnum = doc_enum(T,Ps, normal),
653
657
w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">"
654
"external documentation</a>.~n",
658
"external documentation</a>.~n",
655
659
[lowercase_all(N)]);
657
661
w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">"
658
"external documentation</a>.~n",
662
"external documentation</a>.~n",
659
663
[lowercase_all(Class),lowercase_all(Class),lowercase_all(N)])
661
665
doc_enum_desc(DocEnum);
662
666
gen_doc(Class, Cs = [#method{name=N, alias=A,method_type=MT}|_]) ->
663
GetRet = fun(#method{params=Ps,type=T}) ->
667
GetRet = fun(#method{params=Ps,type=T}) ->
664
668
doc_return_types(T,Ps)
666
GetArgs = fun(#method{params=Ps, where=Where}) ->
670
GetArgs = fun(#method{params=Ps, where=Where}) ->
667
671
Opt = case Where of
668
672
erl_no_opt -> [];
670
674
case split_optional(Ps) of
672
676
_ -> ["[Option]"]
676
680
P=#param{in=In,def=none,where=W} <- Ps,
677
681
In =/= false, W =/= c] ++ Opt
684
688
w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">"
685
"external documentation</a>.~n",
689
"external documentation</a>.~n",
686
690
[lowercase_all(N)]);
688
692
w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">"
689
"external documentation</a>.~n",
693
"external documentation</a>.~n",
690
694
[lowercase_all(Class),lowercase_all(Class),lowercase_all(N)])
692
696
Name = case MT of constructor -> "new"; _ -> erl_func_name(N,A) end,
693
697
w("%% <br /> Alternatives:~n",[]),
694
[gen_doc2(Name, Clause) || Clause <- Cs],
698
[gen_doc2(Name, Clause) || Clause <- Cs],
697
701
gen_doc2(Name,#method{params=Ps,where=erl_no_opt,method_type=MT}) ->
704
708
OptsType = case Optional of
706
710
_ when NonDef =:= [] -> "[Option]";
709
713
w("%% <p><c>~n",[]),
710
714
w("%% ~s(~s~s) -> ~s </c>~n",
711
[Name,doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]),
715
[Name,doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]),
712
716
doc_optional(Optional, xhtml),
713
717
DocEnum = doc_enum(T,Ps, xhtml),
714
718
doc_enum_desc(DocEnum),
824
828
"wx:" ++ atom_to_list(Name) ++ "()";
825
829
doc_arg_type3(#type{base={comp,_,Tup}}) ->
826
830
Doc = fun({int,V}) -> V ++ "::integer()";
827
({double,V}) -> V ++ "::float()"
831
({double,V}) -> V ++ "::float()"
829
"{" ++ args(Doc, ",", Tup) ++ "}";
833
"{" ++ args(Doc, ", ", Tup) ++ "}";
830
834
doc_arg_type3(T) -> ?error({unknown_type,T}).
832
836
doc_return_types(T, Ps) ->
834
838
doc_return_types2(void, []) -> "ok";
835
839
doc_return_types2(void, [#param{type=T}]) -> doc_arg_type2(T);
836
840
doc_return_types2(T, []) -> doc_arg_type2(T);
837
doc_return_types2(void, Ps) ->
838
"{" ++ args(fun doc_arg_type/1,",",Ps) ++ "}";
841
doc_return_types2(void, Ps) ->
842
"{" ++ args(fun doc_arg_type/1,", ",Ps) ++ "}";
839
843
doc_return_types2(T, Ps) ->
840
"{" ++ doc_arg_type2(T) ++ "," ++ args(fun doc_arg_type/1,",",Ps) ++ "}".
844
"{" ++ doc_arg_type2(T) ++ ", " ++ args(fun doc_arg_type/1,", ",Ps) ++ "}".
842
846
break(xhtml) -> "<br />";
909
913
{Arg,Align} = marshal_arg(Type,erl_arg_name(Name),1),
910
914
AStr = if Align =:= 0 -> "";
911
915
Align =:= 1 -> ",0:32"
913
w("({~s, ~s}, Acc) -> ", [erl_option_name(Name), func_arg(P)]),
917
w("({~s, ~s}, Acc) -> ", [erl_option_name(Name), func_arg(P)]),
914
918
arg_type_test(P,"",[]),
917
921
w("[<<~p:32/?UI~s>>|Acc]", [N, AStr]);
919
923
w("[<<~p:32/?UI,~s~s>>|Acc]", [N, Arg,AStr])
921
925
marshal_args(Ps) ->
922
926
marshal_args(Ps, [], 0).
958
962
marshal_arg(#type{single=true,base=bool}, Name, Align) ->
959
963
align(32, Align, "(wxe_util:from_bool(" ++ Name ++ ")):32/?UI");
960
marshal_arg(#type{name="wxChar", single=Single}, Name, Align0)
964
marshal_arg(#type{name="wxChar", single=Single}, Name, Align0)
961
965
when Single =/= true ->
963
967
align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"),
964
968
MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))",
965
969
{Str++", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",0};
966
970
marshal_arg(#type{base=string}, Name, Align0) ->
968
972
align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"),
969
973
MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))",
970
974
{Str++", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",0};
971
975
marshal_arg(#type{name="wxArrayString"}, Name, Align0) ->
972
InnerBin = "<<(byte_size(UC_Str)):32/?UI, UC_Str/binary>>",
976
InnerBin = "<<(byte_size(UC_Str)):32/?UI, UC_Str/binary>>",
973
977
Outer = "(<< " ++ InnerBin ++ "|| UC_Str <- "++ Name ++"_UCA>>)/binary",
974
978
Str0 = "(length("++Name++"_UCA)):32/?UI, " ++ Outer,
975
979
{Str,Align} = align(32,Align0,Str0),
976
MsgSize = "("++integer_to_list(Align*4) ++
980
MsgSize = "("++integer_to_list(Align*4) ++
977
981
" + lists:sum([byte_size(S)+4||S<-" ++ Name ++"_UCA]))",
978
982
AStr = ", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",
979
983
{Str ++ AStr, 0};
998
1002
marshal_arg(#type{base=binary}, _Name, Align0) ->
1000
marshal_arg(#type{base=Base, single=Single}, Name, Align0)
1004
marshal_arg(#type{base=Base, single=Single}, Name, Align0)
1001
1005
when Single =/= true ->
1004
1008
Str0 = "(length("++Name++")):32/?UI,\n"
1005
1009
" (<< <<C:32/?I>> || C <- "++Name++">>)/binary",
1006
1010
{Str,Align} = align(32,Align0, Str0),
1007
1011
{Str ++ ", 0:((("++integer_to_list(Align)++"+length("++Name++ ")) rem 2)*32)", 0};
1008
{ObjRef,_} when ObjRef =:= class; ObjRef =:= ref ->
1012
{ObjRef,_} when ObjRef =:= class; ObjRef =:= ref ->
1009
1013
Str0 = "(length("++Name++")):32/?UI,",
1010
1014
Str1 = "\n (<< <<(C#wx_ref.ref):32/?UI>> || C <- "++Name++">>)/binary",
1011
1015
{Str2,Align} = align(32, Align0, Str1),
1054
1058
w("~n%% Hardcoded Defines~n", []),
1055
1059
Enums = [E || {{enum,_},E = #enum{as_atom=false}} <- get()],
1056
w("-define(wxDefaultSize, {-1,-1}).~n", []),
1057
w("-define(wxDefaultPosition, {-1,-1}).~n", []),
1060
w("-define(wxDefaultSize, {-1,-1}).~n", []),
1061
w("-define(wxDefaultPosition, {-1,-1}).~n", []),
1058
1062
w("~n%% Global Variables~n", []),
1059
[w("-define(~s, wxe_util:get_const(~s)).~n", [Gvar, Gvar]) ||
1063
[w("-define(~s, wxe_util:get_const(~s)).~n", [Gvar, Gvar]) ||
1060
1064
{Gvar,_,_Id} <- get(gvars)],
1061
1065
w("~n%% Enum and defines~n", []),
1062
1066
foldl(fun(Enum= #enum{vals=Vals}, Done) when Vals =/= [] ->
1120
1124
w("%% This file is generated DO NOT EDIT~n~n", []),
1121
1125
w("%% All event messages are encapsulated in a wx record~n"
1122
"%% they contain the widget id and a specialized event record.~n"
1123
"%% Each event record may be sent for one or more event types.~n"
1126
"%% they contain the widget id and a specialized event record.~n"
1127
"%% Each event record may be sent for one or more event types.~n"
1124
1128
"%% The mapping to wxWidgets is one record per class.~n~n",[]),
1125
1129
w("%% @type wx() = #wx{id=integer(), obj=wx:wxObject(), userData=term(), event=Rec}. Rec is a event record.~n",[]),
1126
1130
w("-record(wx, {id, %% Integer Identity of object.~n"
1147
1151
filter_attrs(#class{name=Name, parent=Parent,attributes=Attrs}) ->
1148
Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc;
1152
Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc;
1149
1153
(P=#param{prot=public},Acc) -> [P|Acc];
1150
(#param{acc=undefined},Acc) -> Acc;
1154
(#param{acc=undefined},Acc) -> Acc;
1151
1155
({inherited, PName},Acc) ->
1152
1156
case find_inherited_attr(PName, Parent) of
1154
1158
io:format("~p:~p: Missing Event Attr ~p in ~p~n",
1155
1159
[?MODULE,?LINE, PName, Name]),
1160
1164
(P, Acc) -> [P|Acc]
1161
1165
end, [], Attrs),
1162
1166
lists:reverse(Attr1).
1164
1168
build_event_rec(Class=#class{name=Name, event=Evs}) ->
1165
1169
EvTypes = [event_type_name(Ev) || Ev <- Evs],
1166
1170
Str = args(fun(Ev) -> "<em>"++Ev++"</em>" end, ", ", EvTypes),
1168
1172
Rec = event_rec_name(Name),
1169
1173
GetName = fun(#param{name=N}) ->event_attr_name(N) end,
1170
1174
GetType = fun(#param{name=N,type=T}) ->
1171
event_attr_name(N) ++ "=" ++ doc_arg_type2(T)
1175
event_attr_name(N) ++ "=" ++ doc_arg_type2(T)
1173
1177
case Attr =:= [] of
1175
1179
w("%% @type ~s() = #~s{type=wxEventType()}.~n", [Rec,Rec]),
1176
1180
w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]),
1177
%% case is_command_event(Name) of
1181
%% case is_command_event(Name) of
1178
1182
%% true -> w("%% This event skips other event handlers.~n",[]);
1179
1183
%% false -> w("%% This event will be handled by other handlers~n",[])
1181
1185
w("%% Callback event: {@link ~s}~n", [Name]),
1182
1186
w("-record(~s, {type}).~n~n", [Rec]);
1184
w("%% @type ~s() = #~s{type=wxEventType(),~s}.~n",
1188
w("%% @type ~s() = #~s{type=wxEventType(),~s}.~n",
1185
1189
[Rec,Rec,args(GetType,",",Attr)]),
1186
1190
w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]),
1187
%% case is_command_event(Name) of
1191
%% case is_command_event(Name) of
1188
1192
%% true -> w("%% This event skips other event handlers.~n",[]);
1189
1193
%% false -> w("%% This event will be handled by other handlers~n",[])
1191
1195
w("%% Callback event: {@link ~s}~n", [Name]),
1192
1196
w("-record(~s,{type, ~s}).~n~n", [Rec,args(GetName,",",Attr)])
1257
1261
Ms = split_list(fun(#method{name=N}, M) -> {N =:= M, N} end, undefined, Ms2),
1258
1262
unique_names2(Ms,Class).
1260
unique_names2([[#method{id=Id, name=Method,alias=Alias, max_arity=A}]|Ms], Class) ->
1264
unique_names2([[#method{id=Id, name=Method,alias=Alias, max_arity=A}]|Ms], Class) ->
1261
1265
[{Class,uname(alias(Method,Alias),Class),A,Id} | unique_names2(Ms,Class)];
1262
1266
unique_names2([Ms0|RMs], Class) ->
1263
1267
Split = fun(#method{max_arity=A}, P) -> {A =:= P, A} end,