diff options
Diffstat (limited to 'lib/wx/api_gen')
-rw-r--r-- | lib/wx/api_gen/Makefile | 4 | ||||
-rw-r--r-- | lib/wx/api_gen/README | 15 | ||||
-rw-r--r-- | lib/wx/api_gen/gen_util.erl | 58 | ||||
-rw-r--r-- | lib/wx/api_gen/gl_gen.erl | 13 | ||||
-rw-r--r-- | lib/wx/api_gen/gl_gen_c.erl | 4 | ||||
-rw-r--r-- | lib/wx/api_gen/gl_gen_erl.erl | 432 | ||||
-rw-r--r-- | lib/wx/api_gen/gl_scan_doc.erl | 286 | ||||
-rw-r--r-- | lib/wx/api_gen/glapi.conf | 8 | ||||
-rw-r--r-- | lib/wx/api_gen/wx_doxygen.conf | 1 | ||||
-rw-r--r-- | lib/wx/api_gen/wx_extra/wxEvtHandler.erl | 28 | ||||
-rw-r--r-- | lib/wx/api_gen/wx_extra/wxListCtrl.c_src | 161 | ||||
-rw-r--r-- | lib/wx/api_gen/wx_extra/wxListCtrl.erl | 112 | ||||
-rw-r--r-- | lib/wx/api_gen/wx_gen.erl | 32 | ||||
-rw-r--r-- | lib/wx/api_gen/wx_gen_cpp.erl | 396 | ||||
-rw-r--r-- | lib/wx/api_gen/wx_gen_erl.erl | 750 | ||||
-rw-r--r-- | lib/wx/api_gen/wxapi.conf | 74 |
16 files changed, 1587 insertions, 787 deletions
diff --git a/lib/wx/api_gen/Makefile b/lib/wx/api_gen/Makefile index 756ec598ce..8adb485ba9 100644 --- a/lib/wx/api_gen/Makefile +++ b/lib/wx/api_gen/Makefile @@ -1,7 +1,7 @@ # # %CopyrightBegin% # -# Copyright Ericsson AB 2008-2010. All Rights Reserved. +# Copyright Ericsson AB 2008-2012. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in @@ -30,7 +30,7 @@ ERL_COMPILE_FLAGS=+debug_info +warn_unused_vars COMPILER = gen_util wx_gen wx_gen_erl wx_gen_cpp COMPILER_T = $(COMPILER:%=$(EBIN)/%.beam) -GL_COMP = gl_gen gl_gen_erl gl_gen_c +GL_COMP = gl_gen gl_gen_erl gl_gen_c gl_scan_doc GL_COMP_T = $(GL_COMP:%=$(EBIN)/%.beam) TARGET_EDIR = ../src/gen diff --git a/lib/wx/api_gen/README b/lib/wx/api_gen/README index 10b5209789..dd0c49d227 100644 --- a/lib/wx/api_gen/README +++ b/lib/wx/api_gen/README @@ -1,6 +1,6 @@ API GENERATION: - Most of the code in wx is generated. - Users of wxErlang should not normally need to regenerate the generated code, + Most of the code in wx is generated. + Users of wxErlang should not normally need to regenerate the generated code, as it is checked in by wxErlang developers, when changes are made. Code checked in is currently generated from wxwidgets 2.8.10. @@ -10,6 +10,8 @@ REQUIREMENTS: used to parse wxWidgets c++ headers and generate xml files (in wx_xml/). + 2012-02-09 doxygen 1.7.4 is working fine + 2008-09-29 doxygen 1.4.6 is required. Later versions of Doxygen - up to 1.5.6 at least - have a bug in the xml generation which causes us problems. This has been logged and we are waiting for a fix. @@ -32,5 +34,12 @@ RUNNING: I keep the opengl headers separate so I don't go backwards in version when generating the code from another machine. + Also gl.h from different vendors differ so keep it consistent, + I have used mesa's gl.h and the glext.h from opengl.org + (version see GL_GLEXT_VERSION in gl.hrl) + + I also get the xml documentation from opengl.org (subversion) and place it in + api_gen/gl_man2 (all old functions) and api_gen/gl_man4 (all the new functions). + CONTRIBUTION: - Send me patches or update the svn version. + Send me patches diff --git a/lib/wx/api_gen/gen_util.erl b/lib/wx/api_gen/gen_util.erl index b53f817ce0..4638d4c7ea 100644 --- a/lib/wx/api_gen/gen_util.erl +++ b/lib/wx/api_gen/gen_util.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -43,23 +43,27 @@ strip_name(String,[]) -> String. get_hook(_Type, undefined) -> ignore; get_hook(Type, List) -> proplists:get_value(Type, List, ignore). - + +get_taylor_made(Str, Name) -> + re:run(Str, "<<"++Name++"(.*)"++Name++">>", + [dotall, {capture, all_but_first, list}]). + open_write(File) -> %% io:format("Generating ~s~n",[File]), {ok, Fd} = file:open(File++".temp", [write]), put(current_file, {Fd,File}). - + close() -> case get(current_file) of - undefined -> + undefined -> ok; {closed, File} -> io:format("Closing twice ~s~n",[File]); {Fd,File} -> file:close(Fd), case os:cmd("diff " ++ File ++ " " ++ File ++ ".temp" ++ "| head -30") of - [] -> + [] -> ok = file:delete(File ++ ".temp"), %% So that make understands that we have made this %% case os:getenv("CLEARCASE_ROOT") of @@ -71,11 +75,11 @@ close() -> case check_diff(Diff) of copyright -> %% We ignore copyright changes only ok = file:delete(File ++ ".temp"); - _ -> + _ -> io:format("Diff in ~s~n~s ~n", [File, Diff]), case file:rename(File ++ ".temp", File) of ok -> ok; - _ -> + _ -> io:format("***** Failed to save file ~p ~n",[File]) end end @@ -85,15 +89,15 @@ close() -> check_diff(Diff) -> - try + try [_,D1,_,D2|Tail] = re:split(Diff, "\n"), - case Tail of + case Tail of [] -> ok; [<<>>] -> ok; _ -> throw(diff) end, - <<_, _, "%% Copyright", _/binary>> = D1, - <<_, _, "%% Copyright", _/binary>> = D2, + copyright(D1), + copyright(D2), copyright catch throw:_ -> diff; @@ -104,6 +108,10 @@ check_diff(Diff) -> diff end. +copyright(<<_, _, "%% Copyright", _/binary>>) -> ok; +copyright(<<_, _, " * Copyright", _/binary>>) -> ok; +copyright(_) -> throw(diff). + w(Str) -> w(Str, []). w(Str,Args) -> @@ -117,29 +125,29 @@ args(Fun, Limit, List, Max) -> args(Fun, Limit, List, Max, 0). args(_Fun, _Limit, [], _Max, _) -> ""; %% No args -args(Fun, _Limit, [Last], _Max, _Pos) -> - case Fun(Last) of +args(Fun, _Limit, [Last], _Max, _Pos) -> + case Fun(Last) of skip -> ""; %% FIXME bug if last skips Str -> Str end; args(Fun, Limit, [H|R], Max, Pos) -> - case Fun(H) of + case Fun(H) of skip -> args(Fun,Limit,R, Max, Pos); - Str -> - {NL, NewPos} = + Str -> + {NL, NewPos} = case length(Str) + Pos of Curr when Curr > Max -> {"\n ", 0}; - Curr -> + Curr -> {"", Curr} end, - case args(Fun,Limit,R, Max, NewPos) of + case args(Fun,Limit,R, Max, NewPos) of "" -> Str; End -> Str ++ Limit ++ NL ++ End end end. - + tokens(S) -> @@ -167,11 +175,11 @@ replace_and_remove([E|R], Acc) when is_list(E) -> %% Keep everything that is a w replace_and_remove(R, [E|Acc]); replace_and_remove([$\n | R], Acc) -> %% It is semi line oriented so keep eol replace_and_remove(R, [eol|Acc]); -replace_and_remove([$( | R], Acc) -> +replace_and_remove([$( | R], Acc) -> replace_and_remove(R, ["("|Acc]); replace_and_remove([$) | R], Acc) -> replace_and_remove(R, [")"|Acc]); -replace_and_remove([${ | R], Acc) -> +replace_and_remove([${ | R], Acc) -> replace_and_remove(R, ["{"|Acc]); replace_and_remove([$} | R], Acc) -> replace_and_remove(R, ["}"|Acc]); @@ -187,7 +195,7 @@ replace_and_remove([$, | R], Acc) -> replace_and_remove(R, [cont|Acc]); replace_and_remove([$; | R], Acc) -> replace_and_remove(R, [eoe|Acc]); -replace_and_remove([$@ | R], Acc) -> +replace_and_remove([$@ | R], Acc) -> replace_and_remove(R, [directive|Acc]); replace_and_remove([_E|R], Acc) -> %% Ignore everthing else @@ -213,7 +221,7 @@ erl_copyright() -> w("%%~n",[]), w("%% %CopyrightBegin%~n",[]), w("%%~n",[]), - w("%% Copyright Ericsson AB ~p-2010. All Rights Reserved.~n", + w("%% Copyright Ericsson AB ~p-2012. All Rights Reserved.~n", [StartYear]), w("%%~n",[]), w("%% The contents of this file are subject to the Erlang Public License,~n",[]), @@ -229,11 +237,11 @@ erl_copyright() -> w("%%~n",[]), w("%% %CopyrightEnd%~n",[]). -c_copyright() -> +c_copyright() -> w("/*~n",[]), w(" * %CopyrightBegin%~n",[]), w(" *~n",[]), - w(" * Copyright Ericsson AB 2008-2010. All Rights Reserved.~n",[]), + w(" * Copyright Ericsson AB 2008-2012. All Rights Reserved.~n",[]), w(" *~n",[]), w(" * The contents of this file are subject to the Erlang Public License,~n",[]), w(" * Version 1.1, (the \"License\"); you may not use this file except in~n",[]), diff --git a/lib/wx/api_gen/gl_gen.erl b/lib/wx/api_gen/gl_gen.erl index 374e0bd12b..ce0cb922e9 100644 --- a/lib/wx/api_gen/gl_gen.erl +++ b/lib/wx/api_gen/gl_gen.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -44,7 +44,7 @@ devcode() -> spawn(fun() -> safe(fun gen_code/0,false) end). safe(What, QuitOnErr) -> try What(), - io:format("Completed succesfully~n~n", []), + io:format("Completed successfully~n~n", []), QuitOnErr andalso gen_util:halt(0) catch Err:Reason -> io:format("Error ~p: ~p:~p~n ~p~n", @@ -62,11 +62,11 @@ gen_code() -> GLDefs = parse_gl_defs(Opts), {GLUDefines,GLUFuncs} = setup(GLUDefs, Opts), {GLDefines,GLFuncs} = setup(GLDefs, Opts), + gl_gen_erl:gl_defines(GLDefines), + gl_gen_erl:gl_api(GLFuncs), gl_gen_erl:glu_defines(GLUDefines), gl_gen_erl:glu_api(GLUFuncs), - gl_gen_erl:gl_defines(GLDefines), - gl_gen_erl:gl_api(GLFuncs), %%gl_gen_erl:gen_debug(GLFuncs,GLUFuncs), gl_gen_c:gen(GLFuncs,GLUFuncs), ok. @@ -360,7 +360,9 @@ extract_type_info2("**", Acc) -> [{by_ref,{pointer,2}}|Acc]; extract_type_info2(Type, Acc) -> [Type|Acc]. parse_type2(["void"], _T, _Opts) -> void; -parse_type2([N="void"|R], T, Opts) -> +parse_type2([N="void", const|R], T, Opts) -> + parse_type2([const|R],T#type{name=N, base=idx_binary},Opts); +parse_type2([N="void"|R], T, Opts) -> parse_type2(R,T#type{name=N},Opts); parse_type2([const|R],T=#type{mod=Mod},Opts) -> parse_type2(R,T#type{mod=[const|Mod]},Opts); @@ -676,6 +678,7 @@ get_extension(ExtName,_Opts) -> "IGP" ++ Name -> {reverse(Name),"PGI"}; "PH" ++ Name -> {reverse(Name),"HP"}; "YDEMERG" ++ Name -> {reverse(Name),"GREMEDY"}; + "SEO" ++ Name -> {reverse(Name),"OES"}; %%["" ++ Name] -> {Name; %% _ -> {ExtName, ""} end. diff --git a/lib/wx/api_gen/gl_gen_c.erl b/lib/wx/api_gen/gl_gen_c.erl index 0f5cb0e1f4..be2c5cf2bf 100644 --- a/lib/wx/api_gen/gl_gen_c.erl +++ b/lib/wx/api_gen/gl_gen_c.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2011. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -238,7 +238,7 @@ decode_arg(P=#arg{name=Name,type=#type{size=BSz,name=Type,single={list,TSz}}},A0 {P, A}; decode_arg(P=#arg{name=Name,type=#type{name=Type,base=guard_int}},A0) -> A = align(4,A0), - w(" ~s *~s = (~s *) * (int *) bp; bp += 4;~n", [Type,Name,Type]), + w(" ~s *~s = (~s *) (ErlDrvSInt) * (int *) bp; bp += 4;~n", [Type,Name,Type]), {P, A}; decode_arg(P=#arg{name=Name,type=#type{name=Type,base=string,single=true}},A0) -> w(" ~s *~s = (~s *) bp;~n", [Type,Name,Type]), diff --git a/lib/wx/api_gen/gl_gen_erl.erl b/lib/wx/api_gen/gl_gen_erl.erl index f292c8723e..f77b2d8e24 100644 --- a/lib/wx/api_gen/gl_gen_erl.erl +++ b/lib/wx/api_gen/gl_gen_erl.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -19,7 +19,7 @@ %%%------------------------------------------------------------------- %%% File : gl_gen_erl.erl %%% Author : Dan Gudmundsson <[email protected]> -%%% Description : +%%% Description : %%% %%% Created : 18 Apr 2007 by Dan Gudmundsson <[email protected]> %%%------------------------------------------------------------------- @@ -31,7 +31,7 @@ -import(lists, [foldl/3,foldr/3,reverse/1, keysearch/3, map/2, filter/2, max/1]). -import(gen_util, [lowercase/1, lowercase_all/1, uppercase/1, uppercase_all/1, - open_write/1, close/0, erl_copyright/0, w/2, + open_write/1, close/0, erl_copyright/0, w/2, args/3, args/4, strip_name/2]). gl_defines(Defs) -> @@ -40,7 +40,7 @@ gl_defines(Defs) -> w("~n%% OPENGL DEFINITIONS~n~n", []), w("%% This file is generated DO NOT EDIT~n~n", []), [gen_define(Def) || Def=#def{} <- Defs], - close(), + close(), ok. glu_defines(Defs) -> @@ -50,36 +50,38 @@ glu_defines(Defs) -> w("%% This file is generated DO NOT EDIT~n~n", []), [gen_define(Def) || Def=#def{} <- Defs], close(), - ok. + ok. gen_define(#def{name=N, val=Val, type=int}) -> w("-define(~s, ~p).~n", [N,Val]); gen_define(#def{name=N, val=Val, type=hex}) -> w("-define(~s, ~.16#).~n", [N,Val]); gen_define(#def{name=N, val=Val, type=string}) -> - w("-define(~s, ?~s).~n", [N,Val]). + w("-define(~s, ?~s).~n", [N,Val]); +gen_define(#def{name="GLEXT_64_TYPES"++_, val=undefined, type=undefined}) -> + ok. types() -> [{"GLenum", "32/native-unsigned"}, {"GLboolean", "8/native-unsigned"}, {"GLbitfield","32/native-unsigned"}, % %%{"GLvoid",":void "},% - {"GLbyte", "8/native-signed"}, % 1-byte signed - {"GLshort", "16/native-signed"}, % 2-byte signed - {"GLint", "32/native-signed"}, % 4-byte signed - {"GLubyte", "8/native-unsigned"}, % 1-byte unsigned - {"GLushort", "16/native-unsigned"}, % 2-byte unsigned - {"GLuint", "32/native-unsigned"}, % 4-byte unsigned - {"GLsizei", "32/native-signed"}, % 4-byte signed - {"GLfloat", "32/native-float"}, % single precision float - {"GLclampf", "32/native-float"}, % single precision float in [0,1] - {"GLdouble", "64/native-float"}, % double precision float - {"GLclampd", "64/native-float"}, % double precision float in [0,1] + {"GLbyte", "8/native-signed"}, % 1-byte signed + {"GLshort", "16/native-signed"}, % 2-byte signed + {"GLint", "32/native-signed"}, % 4-byte signed + {"GLubyte", "8/native-unsigned"}, % 1-byte unsigned + {"GLushort", "16/native-unsigned"}, % 2-byte unsigned + {"GLuint", "32/native-unsigned"}, % 4-byte unsigned + {"GLsizei", "32/native-signed"}, % 4-byte signed + {"GLfloat", "32/native-float"}, % single precision float + {"GLclampf", "32/native-float"}, % single precision float in [0,1] + {"GLdouble", "64/native-float"}, % double precision float + {"GLclampd", "64/native-float"}, % double precision float in [0,1] {"GLsizeiptr","64/native-unsigned"}, % 64 bits int, convert on c-side {"GLintptr", "64/native-unsigned"}, % 64 bits int, convert on c-sidew {"GLUquadric", "64/native-unsigned"},% Handle 32bits aargh 64bits on mac64 {"GLhandleARB","64/native-unsigned"},% Handle 32bits aargh 64bits on mac64 - + {"GLsync", "64/native-unsigned"}, % Pointer to record {"GLuint64", "64/native-unsigned"}, {"GLint64", "64/native-signed"} @@ -94,20 +96,17 @@ gl_api(Fs) -> w("%% See <a href=\"http://www.opengl.org/sdk/docs/man/\">www.opengl.org</a>~n",[]), w("%%~n", []), w("%% Booleans are represented by integers 0 and 1.~n~n", []), - w("%% @type mem(). memory block~n", []), - w("%% @type enum(). An integer defined in gl.hrl~n", []), - w("%% @type offset(). An integer which is an offset in an array~n", []), - w("%% @type clamp(). A float clamped between 0.0 - 1.0~n", []), - - w("-module(gl).~n~n",[]), + + w("-module(gl).~n~n",[]), w("-compile(inline).~n", []), %% w("-include(\"wxe.hrl\").~n", []), [w("-define(~s,~s).~n", [GL,Erl]) || {GL,Erl} <- types()], gen_types(gl), - + Exp = fun(F) -> gen_export(F) end, ExportList = lists:map(Exp,Fs), + w("~n-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", ExportList, 60)]), w("-export([call/2, cast/2, send_bin/1]).~n",[]), w("%% @hidden~n", []), @@ -140,10 +139,10 @@ gl_api(Fs) -> w(" erlang:port_command(Port,Bin)~n", []), w(" end.~n", []), w("~n", []), - + w("~n%% API~n~n", []), [gen_funcs(F) || F <- Fs], - close(), + close(), ok. glu_api(Fs) -> @@ -155,28 +154,24 @@ glu_api(Fs) -> w("%% See <a href=\"http://www.opengl.org/sdk/docs/man/\">www.opengl.org</a>~n",[]), w("%%~n", []), w("%% Booleans are represented by integers 0 and 1.~n~n", []), - w("%% @type mem(). memory block~n", []), - w("%% @type enum(). An integer defined in gl.hrl~n", []), - w("%% @type offset(). An integer which is an offset in an array~n", []), - w("%% @type clamp(). A float clamped between 0.0 - 1.0~n~n", []), - w("-module(glu).~n",[]), + w("-module(glu).~n",[]), w("-compile(inline).~n", []), %%w("-include(\"wxe.hrl\").~n", []), [w("-define(~s,~s).~n", [GL,Erl]) || {GL,Erl} <- types()], gen_types(glu), - + Exp = fun(F) -> gen_export(F) end, ExportList = ["tesselate/2" | lists:map(Exp,Fs)], w("~n-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", ExportList, 60)]), w("-import(gl, [call/2,cast/2,send_bin/1]).", []), w("~n%% API~n~n", []), - w("%% @spec (Vec3, [Vec3]) -> {Triangles, VertexPos}~n",[]), - w("%% Vec3 = {float(),float(),float()}~n",[]), - w("%% Triangles = [VertexIndex::integer()]~n",[]), - w("%% VertexPos = binary()~n",[]), + %% w("%% @spec (Vec3, [Vec3]) -> {Triangles, VertexPos}~n",[]), + %% w("%% Vec3 = {float(),float(),float()}~n",[]), + %% w("%% Triangles = [VertexIndex::integer()]~n",[]), + %% w("%% VertexPos = binary()~n",[]), w("%% @doc General purpose polygon triangulation.~n",[]), w("%% The first argument is the normal and the second a list of~n" "%% vertex positions. Returned is a list of indecies of the vertices~n" @@ -184,6 +179,9 @@ glu_api(Fs) -> "%% vertex positions, it starts with the vertices in Vs and~n" "%% may contain newly created vertices in the end.~n", []), + w("-spec tesselate(Normal, [Vs]) -> {Triangles, VertexPos}~n", []), + w(" when Normal :: vertex(), Vs :: vertex(),~n", []), + w(" Triangles :: [integer()], VertexPos :: binary().~n", []), w("tesselate({Nx,Ny,Nz}, Vs) ->~n",[]), w(" call(5000, <<(length(Vs)):32/native,0:32,~n" " Nx:?GLdouble,Ny:?GLdouble,Nz:?GLdouble,~n" @@ -215,15 +213,21 @@ gen_funcs(F) -> erase(current_func), w(".~n~n",[]). -gen_types(Where) -> +gen_types(Where) -> case Where of - glu -> ignore; + glu -> + w("-type vertex() :: {float(), float(), float()}.~n", []), + w("-type enum() :: non_neg_integer(). %% See wx/include/gl.hrl or glu.hrl~n", []); gl -> - w("-type clamp() :: float().~n", []), - w("-type offset() :: non_neg_integer().~n", []) + w("-type enum() :: non_neg_integer(). %% See wx/include/gl.hrl~n", []), + w("-type clamp() :: float(). %% 0.0..1.0~n", []), + w("-type offset() :: non_neg_integer(). %% Offset in memory block~n", []) end, - w("-type enum() :: non_neg_integer().~n", []), - w("-type mem() :: binary() | tuple().~n", []), + w("-type matrix() :: {float(),float(),float(),float(),~n", []), + w(" float(),float(),float(),float(),~n", []), + w(" float(),float(),float(),float(),~n", []), + w(" float(),float(),float(),float()}.~n", []), + w("-type mem() :: binary() | tuple(). %% Memory block~n", []), ok. gen_export(F) -> @@ -238,43 +242,182 @@ gen_export_1([F|_]) when is_list(F) -> gen_export_1(F) when is_list(F) -> gen_export2(get(F)). -gen_export2(#func{name=Name,alt={vector,VecPos,Vec}}) -> - #func{params=As0} = get(Vec), +gen_export2(#func{name=Name,alt=Alt={vector,VecPos,Vec}}) -> + #func{params=As0} = get(Vec), {As1,_As2} = lists:split(VecPos, As0), Args = lists:filter(fun(Arg) -> func_arg(Arg) =/= skip end, As1), - erl_func_name(Name) ++ "/" ++ integer_to_list(length(Args) +1); -gen_export2(#func{name=Name,params=As0}) -> + Export = erl_func_name(Name) ++ "/" ++ integer_to_list(length(Args) +1), + DocN = doc_name(Name,Alt), + (get({export_arg,DocN}) == undefined) andalso put({export_arg, DocN}, Export), + Export; +gen_export2(#func{name=Name,params=As0, alt=Alt}) -> Args = lists:filter(fun(Arg) -> func_arg(Arg) =/= skip end, As0), - erl_func_name(Name) ++ "/" ++ integer_to_list(length(Args)). + Export = erl_func_name(Name) ++ "/" ++ integer_to_list(length(Args)), + DocN = doc_name(Name,Alt), + (get({export_arg,DocN}) == undefined) andalso put({export_arg, DocN}, Export), + Export. -gen_doc([#func{name=Name, alt={vector,VecPos,Vec}}]) -> - #func{type=T,params=As} = get(Vec), +gen_doc([#func{name=Name, params=Orig, alt={vector,VecPos,Vec}}]) -> + #func{type=T,params=As} = get(Vec), {As1,As2} = lists:split(VecPos, As), + #arg{name=OrigName} = lists:last(Orig), Args1 = case args(fun func_arg/1, ",", As1) of [] -> []; Else -> Else++"," end, Args2 = args(fun func_arg/1, ",", As2), - w("%% @spec (~s{~s}) -> ~s~n",[Args1,Args2,doc_return_types(T,As, doc)]), w("%% @equiv ~s(~s)~n",[erl_func_name(Vec), Args1++Args2]), - SA1 = case doc_arg_types(As1, spec) of [] -> []; E -> E++"," end, - SA2 = doc_arg_types(As2, spec), - w("-spec ~s(~s{~s}) -> ~s.~n", - [erl_func_name(Name), SA1, SA2, - doc_return_types(T,As, spec)]); - -gen_doc([#func{name=Name,type=T,params=As,alt=Alt}|_]) -> - w("%% @spec (~s) -> ~s~n", [doc_arg_types(As, doc),doc_return_types(T,As, doc)]), - GLDoc = "http://www.opengl.org/sdk/docs/man/xhtml/", - w("%% @doc See <a href=\"~s~s.xml\">external</a> documentation.~n", - [GLDoc, doc_name(Name,Alt)]), - w("-spec ~s(~s) -> ~s.~n", - [erl_func_name(Name), doc_arg_types(As, spec), doc_return_types(T,As, spec)]). + SA1 = case doc_arg_types(As1) of [] -> []; E -> E++"," end, + SA2 = doc_arg_types(As2), + w("-spec ~s(~s~s) -> ~s when ~s :: {~s}.~n", + [erl_func_name(Name), SA1, erl_arg_name(OrigName), + doc_return_types(T,As), erl_arg_name(OrigName), SA2]); + +gen_doc([F=#func{name=Name,type=T,params=As, alt=Alt}|_]) -> + gen_doc(Name, Alt, gen_export2(F)), + Ps = [Arg || #arg{name=Arg, in=In, where=Where} <- As, + In =/= false, Where =/= c], + Args = args(fun erl_arg_name/1, ", ", Ps), + case Args of + [] -> + w("-spec ~s(~s) -> ~s.~n", + [erl_func_name(Name), Args, doc_return_types(T,As)]); + _ -> w("-spec ~s(~s) -> ~s when ~s.~n", + [erl_func_name(Name), Args, doc_return_types(T,As), doc_arg_types(As)]) + end. + +-define(LINE_LEN, 90). + +gen_doc(Name0, Alt, Export) -> + Name = doc_name(Name0, Alt), + case get({doc, Name}) of + undefined -> + GLDoc = "http://www.opengl.org/sdk/docs/man/xhtml/", + case parse_doc(Name, _Dir1 ="gl_man4", _Dir2="gl_man2") of + {error, _} -> + case reverse(Name) of + "BRA" ++ _ -> ok; + "TXE" ++ _ -> ok; + _ -> + %% io:format("Missing doc: no ~s.xml (~s) found in ~s or ~s~n", + %% [Name, Name0, Dir1, Dir2]), + ok + end, + w("%% @doc ~s~n%%~n%% See <a href=\"~s~s.xml\">external</a> documentation.~n", + [Name, GLDoc, Name]); + Doc -> + put({doc, Name}, Export), + format_doc(Doc, ?LINE_LEN), + w("~n%%~n%% See <a href=\"~s~s.xml\">external</a> documentation.~n", + [GLDoc, Name]) + end; + Where -> + w("%% @doc ~n", []), + w("%% See {@link ~s}~n", [Where]) + end. +parse_doc(Name, Dir1, Dir2) -> + case gl_scan_doc:file(filename:join(Dir1, Name++".xml"), []) of + {error, {_, "no such" ++ _}} -> + gl_scan_doc:file(filename:join(Dir2, Name++".xml"), []); + Doc -> + Doc + end. + +format_doc(Strs, Count) when Count < 0 -> + w("~n%% ", []), + format_doc(Strs, ?LINE_LEN); +format_doc([{constant, Const}|Rest], Count) -> + w("`?~s'", [Const]), + format_doc(Rest, Count-length(Const)-8); +format_doc([{emphasis, Const}|Rest], Count) -> + w("`~s'", [Const]), + format_doc(Rest, Count-length(Const)-7); +format_doc([{function, Func}|Rest], Count) -> + case Func of + "glu" ++ _ -> + w("``glu:~s''", [erl_func_name(Func)]); + "gl" ++ _ -> + w("``gl:~s''", [erl_func_name(Func)]); + _ -> + w("`~s'", [Func]) + end, + format_doc(Rest, Count-length(Func)-7); +format_doc([{reffunc, Func}|Rest], Count) -> + Out = fun(Export) -> + case Func of + "glu" ++ _ -> w(" {@link glu:~s} ", [Export]); + "gl" ++ _ -> w(" {@link gl:~s} ", [Export]) + end + end, + case get({export_arg, Func}) of + undefined -> + case get({export_arg, doc_name(Func, undefined)}) of + undefined -> + %% io:format("Func ~p undefined (~p) ~n", + %% [Func, doc_name(Func, undef)]), + w("see `~s'", [Func]); + Export -> Out(Export) + end; + Export -> + Out(Export) + end, + format_doc(Rest, Count-length(Func)-10); +format_doc([{parameter, Param}|Rest], Count) -> + w(" `~s' ", [erl_arg_name(Param)]), + format_doc(Rest, Count-length(Param)-7); +format_doc([{equation, Eq}|Rest], Count) -> +%% w("```", []), + format_doc([Eq], Count), +%% w("'''", []), + format_doc(Rest, Count); +format_doc([{fenced, Open, Close, Eq}|Rest], Count) -> + w(Open, []), + format_doc(Eq, Count), + w(Close, []), + format_doc(Rest, Count); + +format_doc([{code, Code}|Rest], Count) -> + w("``~s''", [Code]), + format_doc(Rest, Count-length(Code)-7); + +format_doc([para|Rest], _Count) -> + w("~n%%~n%% ", []), + format_doc(Rest, ?LINE_LEN); +format_doc([break|Rest], _Count) -> + w("<br />~n%% ", []), + format_doc(Rest, ?LINE_LEN); +format_doc([{purpose, Purpose}, para | Doc], _Count) -> + w("%% @doc ~s~n%%~n%% ", [uppercase(Purpose)]), + format_doc(Doc, ?LINE_LEN); +format_doc([{purpose, Purpose} | Doc], _Count) -> + w("%% @doc ~s~n%%~n%% ", [Purpose]), + format_doc(Doc, ?LINE_LEN); +format_doc([listentry|Rest], _Count) -> + w("~n%%~n%% ", []), + format_doc(Rest, ?LINE_LEN); +format_doc([Str|Rest], Count) -> + case length(Str) of + Len when Len < Count -> + w("~s", [Str]), + format_doc(Rest, Count-Len); + _ -> + {Str1, Str2} = split(Str, Count, []), + w("~s~n%% ", [Str1]), + format_doc([Str2|Rest], ?LINE_LEN) + end; +format_doc([], _) -> ok. + +split([$ |Str], Count, Acc) when Count =< 5 -> + {reverse(Acc), Str}; +split([Chr|Str], Count, Acc) -> + split(Str, Count-1, [Chr|Acc]); +split([], _, Acc) -> + {reverse(Acc), []}. gen_func(#func{name=Name,alt={vector,VecPos,Vec}}) -> - #func{params=As} = get(Vec), + #func{params=As} = get(Vec), {As1,As2} = lists:split(VecPos, As), Args1 = case args(fun func_arg/1, ",", As1) of [] -> []; Else -> Else++"," end, Args2 = args(fun func_arg/1, ",", As2), - + w("~s(~s{~s}) ->", [erl_func_name(Name),Args1,Args2]), w(" ~s(~s)", [erl_func_name(Vec), Args1++Args2]); gen_func(_F=#func{name=Name,type=T,params=As,id=MId}) -> @@ -290,7 +433,7 @@ gen_func(_F=#func{name=Name,type=T,params=As,id=MId}) -> w(" cast(~p, <<~s>>)", [MId, StrArgs]) end. -func_arg(#arg{in=In,where=W,name=Name,type=Type}) +func_arg(#arg{in=In,where=W,name=Name,type=Type}) when In =/= false, W =/= c -> case Type of #type{single={tuple,TSz0}} when TSz0 =/= undefined -> @@ -305,45 +448,39 @@ func_arg(#arg{in=In,where=W,name=Name,type=Type}) end; func_arg(_) -> skip. -doc_arg_types(Ps0, Type) -> +doc_arg_types(Ps0) -> Ps = [P || P=#arg{in=In, where=Where} <- Ps0,In =/= false, Where =/= c], - args(fun(Arg) -> doc_arg_type(Arg, Type) end, ",", Ps). + args(fun(Arg) -> doc_arg_type(Arg) end, ",", Ps). -doc_return_types(T, Ps0, Type) -> +doc_return_types(T, Ps0) -> Ps = [P || P=#arg{in=In, where=Where} <- Ps0,In =/= true, Where =/= c], - doc_return_types2(T, Ps, Type). - -doc_return_types2(void, [], _) -> "ok"; -doc_return_types2(void, [#arg{type=T}], _) -> doc_arg_type2(T); -doc_return_types2(T, [], _) -> doc_arg_type2(T); -doc_return_types2(void, Ps, Type) -> - "{" ++ args(fun(Arg) -> doc_arg_type(Arg, Type) end,",",Ps) ++ "}"; -doc_return_types2(T, Ps, Type) -> - "{" ++ doc_arg_type2(T) ++ "," ++ - args(fun(Arg) -> doc_arg_type(Arg, Type) end,",",Ps) ++ "}". - -doc_arg_type(#arg{name=Name,type=T}, doc) -> - try - erl_arg_name(Name) ++ "::" ++ doc_arg_type2(T) - catch _:Error -> - io:format("Error: ~p ~p~n~p~n",[Name, Error, erlang:get_stacktrace()]), - exit(error) - end; -doc_arg_type(#arg{name=Name,type=T}, spec) -> - try - doc_arg_type2(T) + doc_return_types2(T, Ps). + +doc_return_types2(void, []) -> "ok"; +doc_return_types2(void, [#arg{type=T}]) -> doc_arg_type2(T); +doc_return_types2(T, []) -> doc_arg_type2(T); +doc_return_types2(void, Ps) -> + "{" ++ args(fun(Arg) -> doc_arg_type(Arg) end,",",Ps) ++ "}"; +doc_return_types2(T, Ps) -> + "{" ++ doc_arg_type2(T) ++ "," ++ + args(fun(Arg) -> doc_arg_type(Arg) end,",",Ps) ++ "}". + +doc_arg_type(#arg{name=Name,type=T}) -> + try + erl_arg_name(Name) ++ " :: " ++ doc_arg_type2(T) catch _:Error -> io:format("Error spec: ~p ~p~n~p~n",[Name, Error, erlang:get_stacktrace()]), exit(error) end. - doc_arg_type2(T=#type{single=true}) -> doc_arg_type3(T); doc_arg_type2(T=#type{single=undefined}) -> doc_arg_type3(T); doc_arg_type2(T=#type{single={tuple,undefined}}) -> "{" ++ doc_arg_type3(T) ++ "}"; +doc_arg_type2(#type{base=float, single={tuple,16}}) -> + "matrix()"; doc_arg_type2(T=#type{single={tuple,Sz}}) -> "{" ++ args(fun doc_arg_type3/1, ",", lists:duplicate(Sz,T)) ++ "}"; doc_arg_type2(T=#type{single=list}) -> @@ -365,21 +502,21 @@ doc_arg_type3(#type{base=bool}) -> "0|1"; doc_arg_type3(#type{base=binary}) -> "binary()"; doc_arg_type3(#type{base=memory}) -> "mem()". -guard_test(As) -> - Str = args(fun(#arg{name=N,type=#type{base=guard_int}}) -> - " is_integer("++erl_arg_name(N)++")"; - (_) -> +guard_test(As) -> + Str = args(fun(#arg{name=N,type=#type{base=guard_int}}) -> + " is_integer("++erl_arg_name(N)++")"; + (_) -> skip end, ",", As), case Str of [] -> []; Other -> " when " ++ Other - end. + end. -pre_marshal([#arg{name=N,in=true,type=#type{base=binary}}|R]) -> +pre_marshal([#arg{name=N,in=true,type=#type{base=binary}}|R]) -> w(" send_bin(~s),~n", [erl_arg_name(N)]), pre_marshal(R); -pre_marshal([#arg{name=N,type=#type{base=memory}}|R]) -> +pre_marshal([#arg{name=N,type=#type{base=memory}}|R]) -> w(" send_bin(~s),~n", [erl_arg_name(N)]), pre_marshal(R); pre_marshal([A=#arg{name=N,type=#type{base=string,single=list}}|R]) -> @@ -412,14 +549,14 @@ marshal_arg(#type{size=Sz,name=Type,single={tuple,undefined}},Name,A0) -> " (<< <<C:?"++Type++ ">> ||" "C <- tuple_to_list("++Name++")>>)/binary", case Sz of - 4 -> + 4 -> {Str,Align} = align(4,A0,Str0), {Str++",0:((("++integer_to_list(Align div 4)++ "+size("++Name++")) rem 2)*32)",0}; - 8 -> + 8 -> align(8,A0,Str0) end; -marshal_arg(#type{size=BSz,name=Type,single={tuple,TSz}},Name,A0) +marshal_arg(#type{size=BSz,name=Type,single={tuple,TSz}},Name,A0) when is_integer(TSz) -> NameId = hd(Name), Names = [[NameId|integer_to_list(Id)] || Id <- lists:seq(1,TSz)], @@ -427,7 +564,7 @@ marshal_arg(#type{size=BSz,name=Type,single={tuple,TSz}},Name,A0) align(BSz,TSz,A0,All); marshal_arg(#type{size=BSz,name=Type,single={tuple,matrix12}},Name,A0) -> - NameId = hd(Name), + NameId = hd(Name), Ns0 = [[NameId|integer_to_list(Id)] || Id <- lists:seq(1,3)], Ns1 = [[NameId|integer_to_list(Id)] || Id <- lists:seq(4,6)], Ns2 = [[NameId|integer_to_list(Id)] || Id <- lists:seq(7,9)], @@ -436,7 +573,7 @@ marshal_arg(#type{size=BSz,name=Type,single={tuple,matrix12}},Name,A0) -> Ns0 ++ ["0"] ++ Ns1 ++ ["0"] ++ Ns2 ++ ["0"] ++ Ns3 ++ ["1"]), align(BSz,16,A0,All); -marshal_arg(#type{size=Sz,name=Type,base=Base,single=list},Name,A0) +marshal_arg(#type{size=Sz,name=Type,base=Base,single=list},Name,A0) when Base =:= float; Base =:= int -> KeepA = case Sz of 8 -> "0:32,"; _ -> "" end, Str0 = "(length("++Name++")):?GLuint,"++KeepA++"\n" @@ -459,14 +596,14 @@ marshal_arg(#type{base=string,single=true,ref={pointer,1}},Name,A0) -> align_after(1,A0,1,1,Name,Str); marshal_arg(#type{base=string,single=list,ref={pointer,2}},Name,A0) -> - Str0 = + Str0 = "(length("++Name++")):?GLuint," "(size("++Name ++ "Temp)):?GLuint," "(" ++ Name ++ "Temp)/binary", {Str,A} = align(4,A0,Str0), - {Str ++ ",0:((8-((size("++Name++"Temp)+"++ + {Str ++ ",0:((8-((size("++Name++"Temp)+"++ integer_to_list(A) ++") rem 8)) rem 8)", 0}; - + marshal_arg(#type{size=Sz,name=Type,single={tuple_list,TSz}},Name,A0) -> NameId = hd(Name), Names = [[NameId|integer_to_list(Id)] || Id <- lists:seq(1,TSz)], @@ -508,11 +645,11 @@ align(8,_,6,Str) -> {"0:16,"++Str, 0}; align(8,_,7,Str) -> {"0:8," ++Str, 0}. align_after(8,0,_Add,_Multiplier,_Name,Str) -> {Str,0}; -align_after(4,0,Add,Mult,Name,Str) -> +align_after(4,0,Add,Mult,Name,Str) -> Extra = extra_align(Add,Mult), Align = ",0:(((length("++Name++")"++Extra++") rem 2)*32)", {Str ++ Align,0}; -align_after(4,4,Add,Mult,Name,Str) -> +align_after(4,4,Add,Mult,Name,Str) -> Extra = extra_align(Add,Mult), Align = ",0:(((1+length("++Name++")"++Extra++") rem 2)*32)", {Str ++ Align,0}; @@ -531,14 +668,14 @@ align_after(Sz,A,Add,Mult,Name,Str) -> extra_align(0,1) -> ""; extra_align(0,M) when M > 1 -> "* " ++ integer_to_list(M); extra_align(A,1) when A > 0 -> "+ " ++ integer_to_list(A); -extra_align(A,M) when A > 0,M>1 -> +extra_align(A,M) when A > 0,M>1 -> "* " ++ integer_to_list(M) ++ "+ " ++ integer_to_list(A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% have_return_vals(void, Ps) -> - lists:any(fun(#arg{in=In, type=#type{base=B}}) -> - In =/= true orelse B =:= memory + lists:any(fun(#arg{in=In, type=#type{base=B}}) -> + In =/= true orelse B =:= memory end, Ps); have_return_vals(#type{}, _) -> true. @@ -550,21 +687,28 @@ erl_arg_name(Name) -> uppercase(Name). check_name("begin") -> "'begin'"; check_name("end") -> "'end'"; check_name(Other) -> Other. - - -doc_name(Name0, Alt) -> - Name = doc_name2(Name0,Alt), -%% case lists:member(lists:last(Name0), "uvbisdf987654312") of -%% true -> io:format("~s ~s~n", [Name0,Name]); -%% false -> ignore -%% end, - Name. - -doc_name2(N="glGetBufferParameteriv", _) -> N; -doc_name2(N="glEnd", _) -> N; -doc_name2(Name, {has_vector,_,_}) -> + +doc_name(N="glGetBufferParameteriv", _) -> N; +doc_name("glEnd"++What, _) -> "glBegin"++What; +doc_name("glDisable" ++ What, _) -> "glEnable" ++ What; +doc_name("glPop" ++ What, _) -> "glPush" ++ What; +doc_name("glGetBooleanv", _) -> "glGet"; +doc_name("glGetBooleani_v", _) -> "glGet"; +doc_name("glGetIntegerv", _) -> "glGet"; +doc_name("glGetIntegeri_v", _) -> "glGet"; +doc_name("glGetInteger64v", _) -> "glGet"; +doc_name("glGetInteger64i_v", _) -> "glGet"; +doc_name("glGetFloatv", _) -> "glGet"; +doc_name("glGetDoublev", _) -> "glGet"; +doc_name("glGetFloati_v", _) -> "glGet"; +doc_name("glGetDoublei_v", _) -> "glGet"; +doc_name("glUniformMatr" ++ _, _) -> "glUniform"; +doc_name("glTexSubImage" ++ _, _) -> "glTexSubImage"; +doc_name("glFramebufferText" ++ _, _) -> "glFramebufferTexture"; +doc_name("glProgramUniformMatr" ++ _, _) -> "glProgramUniform"; +doc_name(Name, {has_vector,_,_}) -> strip_hard(reverse(Name)); -doc_name2(Name, _) -> +doc_name(Name, _) -> reverse(strip(reverse(Name))). strip_hard(Rev) -> @@ -583,6 +727,21 @@ strip([$v,$s,$N,N|R]) when N > 47, N < 58 -> R; strip([$v,$d,$N,N|R]) when N > 47, N < 58 -> R; strip([$v,$f,$N,N|R]) when N > 47, N < 58 -> R; strip([$b,$u,$N,N|R]) when N > 47, N < 58 -> R; +strip([$v,$b,$I,N|R]) when N > 47, N < 58 -> R; +strip([$v,$i,$I,N|R]) when N > 47, N < 58 -> R; +strip([$v,$s,$I,N|R]) when N > 47, N < 58 -> R; +strip([$v,$d,$I,N|R]) when N > 47, N < 58 -> R; +strip([$v,$f,$I,N|R]) when N > 47, N < 58 -> R; +strip([$b,$u,$I,N|R]) when N > 47, N < 58 -> R; + +strip([$v,$b,$u,N,$I|R]) when N > 47, N < 58 ->R; +strip([$v,$i,$u,N,$I|R]) when N > 47, N < 58 ->R; +strip([$v,$s,$u,N,$I|R]) when N > 47, N < 58 ->R; +strip([$v,$b,N,$I|R]) when N > 47, N < 58 -> R; +strip([$v,$i,N,$I|R]) when N > 47, N < 58 -> R; +strip([$v,$s,N,$I|R]) when N > 47, N < 58 -> R; +strip([$v,$d,N,$I|R]) when N > 47, N < 58 -> R; +strip([$v,$f,N,$I|R]) when N > 47, N < 58 -> R; strip([$v,$b,$u,N|R]) when N > 47, N < 58 ->R; strip([$v,$i,$u,N|R]) when N > 47, N < 58 ->R; @@ -593,6 +752,15 @@ strip([$v,$s,N|R]) when N > 47, N < 58 -> R; strip([$v,$d,N|R]) when N > 47, N < 58 -> R; strip([$v,$f,N|R]) when N > 47, N < 58 -> R; +strip([$b,$u,N,$I|R]) when N > 47, N < 58 ->R; +strip([$i,$u,N,$I|R]) when N > 47, N < 58 ->R; +strip([$s,$u,N,$I|R]) when N > 47, N < 58 ->R; +strip([$b,N,$I|R]) when N > 47, N < 58 -> R; +strip([$i,N,$I|R]) when N > 47, N < 58 -> R; +strip([$s,N,$I|R]) when N > 47, N < 58 -> R; +strip([$d,N,$I|R]) when N > 47, N < 58 -> R; +strip([$f,N,$I|R]) when N > 47, N < 58 -> R; + strip([$b,$u,N|R]) when N > 47, N < 58 ->R; strip([$i,$u,N|R]) when N > 47, N < 58 ->R; strip([$s,$u,N|R]) when N > 47, N < 58 ->R; @@ -606,6 +774,7 @@ strip([$v,$b,$u|R]) -> R; strip([$v,$i,$u|R]) -> R; strip([$v,$s,$u|R]) -> R; strip([$v,$b|R]) -> R; +strip([$v,$i,$I|R]) -> R; strip([$v,$i|R]) -> R; strip([$v,$s|R]) -> R; strip([$v,$d|R]) -> R; @@ -629,6 +798,12 @@ strip([$i,$n|R]) -> [$n|R]; strip([$f,$n|R]) -> [$n|R]; strip([$d,$n|R]) -> [$n|R]; +%% strip([$D,$3|R]) -> R; +%% strip([$D,$2|R]) -> R; +%% strip([$D,$1|R]) -> R; + +strip([$I|R]) -> R; +strip([$L|R]) -> R; strip([$v,R]) -> R; strip([N|R]) when N > 47, N < 58 -> R; strip([_|R="tceRlg"]) -> R; @@ -656,7 +831,6 @@ gen_debug(GL, GLU) -> w("].~n~n", []), close(). - printd([F|R],Mod) when is_list(F) -> printd(F,Mod), printd(R,Mod); @@ -667,6 +841,6 @@ printd(F,Mod) -> #func{where=erl} -> ok; #func{id=Id, name=Method} -> w(" {~p, {~s, ~s, 0}},~n", [Id, Mod, erl_func_name(Method)]); - _Other -> - io:format("F= ~p => ~p~n", [F, _Other]) + _Other -> + io:format("F= ~p => ~p~n", [F, _Other]) end. diff --git a/lib/wx/api_gen/gl_scan_doc.erl b/lib/wx/api_gen/gl_scan_doc.erl new file mode 100644 index 0000000000..fc7b7cf275 --- /dev/null +++ b/lib/wx/api_gen/gl_scan_doc.erl @@ -0,0 +1,286 @@ +%%-*-erlang-*- +%%-------------------------------------------------------------------- +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2012. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%%---------------------------------------------------------------------- +-module(gl_scan_doc). + +-export([file/2]). +-export([event/3]). + +-compile(export_all). + +-define(error(Reason), + throw({gl_output_error, Reason})). + +-record(state, {type=undefined, gen_output=false, str=[]}). + +file(FileName, Options0) -> + {Options2, State} = parse_options(Options0), + Options = [skip_external_dtd, {event_fun, fun event/3}, {event_state, State}|Options2], + case xmerl_sax_parser:file(FileName, Options) of + {ok, #state{str=Str}, _} -> lists:reverse(Str); + Else -> Else + end. + +event(Event, _LineNo, State) -> + gen_output(Event, State). + +parse_options(Options) -> + parse_options(Options, #state{}). + +parse_options(Options, State) -> + {Options, State}. + +%% Element +%%---------------------------------------------------------------------- +gen_output({characters, String0}, #state{gen_output=true, type=Type, str=Str} = State) -> + case fix_str(strip_white_space(String0)) of + [] -> State; + String -> + Add = case Type of + mi -> case hd(Str) of + "/" -> String; + "*" -> String; + "+" -> String; + "-" -> String; + {fenced,_,_} -> String; + _ -> + [$ |String] + end; + constant -> {constant, String}; + emphasis -> {emphasis, String}; + function -> {function, String}; + reffunc -> {reffunc, String}; + purpose -> {purpose, String}; + parameter -> {parameter, String}; + equation -> {equation, String}; + _ -> String + end, + State#state{str=[Add|Str]} + end; + +gen_output({startElement, _Uri, "function", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{type=function}; +gen_output({endElement, _Uri, "function", _QName}, #state{gen_output=true} = State) -> + State#state{type=undefined}; + +gen_output({startElement, _Uri, "constant", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{type=constant}; +gen_output({endElement, _Uri, "constant", _QName}, #state{gen_output=true} = State) -> + State#state{type=undefined}; + +gen_output({startElement, _Uri, "parameter", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{type=parameter}; +gen_output({endElement, _Uri, "parameter", _QName}, #state{gen_output=true} = State) -> + State#state{type=undefined}; + +gen_output({startElement, _Uri, "emphasis", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{type=emphasis}; +gen_output({endElement, _Uri, "emphasis", _QName}, #state{gen_output=true} = State) -> + State#state{type=undefined}; + +gen_output(startDocument, State) -> + State; +gen_output(endDocument, State) -> + State; + +gen_output({startElement, _Uri, "refentrytitle", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{type=reffunc}; +gen_output({endElement, _Uri, "refentrytitle", _QName}, #state{gen_output=true} = State) -> + State#state{type=undefined}; + +gen_output({startElement, _Uri, "refpurpose", _QName, _Attributes}, State) -> + State#state{gen_output=true, type=purpose}; +gen_output({endElement, _Uri, "refpurpose", _QName}, State) -> + State#state{gen_output=false, type=undefined}; + +gen_output({startElement, _Uri, "refsect1", _QName, [{_, _, "id", "description"}]}, State) -> + State#state{gen_output=true}; +gen_output({endElement, _Uri, "refsect1", _QName}, State) -> + State#state{gen_output=false}; + +gen_output({startElement, _Uri, "title", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{gen_output=skip}; +gen_output({endElement, _Uri, "title", _QName}, #state{gen_output=skip} = State) -> + State#state{gen_output=true}; + +%% gen_output({startElement, _Uri, "inlineequation", _QName, _Attributes}, #state{gen_output=true} = State) -> +%% State#state{type=equation}; +%% gen_output({endElement, _Uri, "inlineequation", _QName}, #state{gen_output=skip} = State) -> +%% State#state{type=undefined}; +%% gen_output({startElement, _Uri, "informalequation", _QName, _Attributes}, #state{gen_output=true} = State) -> +%% State#state{type=equation}; +%% gen_output({endElement, _Uri, "informalequation", _QName}, #state{gen_output=skip} = State) -> +%% State#state{type=undefined}; +gen_output({startElement, _Uri, "mfenced", _QName, Attributes}, #state{gen_output=true, str=Str} = State) -> + Fenc = get_fenc(Attributes, "(", ")"), + State#state{str=[Fenc|Str]}; +gen_output({endElement, _Uri, "mfenced", _QName}, #state{gen_output=true, str=Str0} = State) -> + Check = fun(What) -> case What of {fenced,_,_} ->false; _ -> true end end, + {Fenced, [{fenced, Open, Close}|Str]} = lists:splitwith(Check, Str0), + State#state{str=[{fenced, Open, Close, lists:reverse(Fenced)}| Str]}; + +%% gen_output({startElement, _Uri, "tgroup", _QName, Attributes}, #state{gen_output=true, str=Str} = State) -> +%% {_, _, _, ValueStr} = lists:keyfind(3, "cols", Attributes), +%% ColSz = list_to_integer(ValueStr), +%% State#state{str=[{tgroup, ColSz}|Str]}; +%% gen_output({endElement, _Uri, "tgroup", _QName}, #state{gen_output=true, str=Str0} = State) -> +%% Check = fun(What) -> case What of {tgroup, _} ->false; _ -> true end end, +%% {Rows, [{tgroup, ColSize}|Str]} = lists:splitwith(Check, Str0), +%% State#state{str=[{tgroup, ColSize, lists:reverse(Rows)}| Str]}; + +%% gen_output({endElement, _Uri, "row", _QName}, #state{gen_output=true, str=Str} = State) -> +%% State#state{type=undefined, str=[break|Str]}; +gen_output({startElement, _Uri, "informaltable", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["<table>"|Str]}; +gen_output({endElement, _Uri, "informaltable", _QName}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["</table>"|Str]}; +gen_output({startElement, _Uri, "table", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["<table>"|Str]}; +gen_output({endElement, _Uri, "table", _QName}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["</table>"|Str]}; + +gen_output({startElement, _Uri, "tbody", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["<tbody>"|Str]}; +gen_output({endElement, _Uri, "tbody", _QName}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["</tbody>"|Str]}; + +gen_output({startElement, _Uri, "thead", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["<tbody>"|Str]}; +gen_output({endElement, _Uri, "thead", _QName}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["</tbody>"|Str]}; +gen_output({startElement, _Uri, "row", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["<tr>"|Str]}; +gen_output({endElement, _Uri, "row", _QName}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["</tr>"|Str]}; +gen_output({startElement, _Uri, "entry", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["<td>"|Str]}; +gen_output({endElement, _Uri, "entry", _QName}, #state{gen_output=true, str=Str} = State) -> + State#state{str=["</td>"|Str]}; + +gen_output({startElement, _Uri, "mi", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{type=mi}; +gen_output({endElement, _Uri, "mi", _QName}, #state{gen_output=true} = State) -> + State#state{type=undefined}; +gen_output({startElement, _Uri, "mn", _QName, _Attributes}, #state{gen_output=true} = State) -> + State#state{type=mi}; +gen_output({endElement, _Uri, "mn", _QName}, #state{gen_output=true} = State) -> + State#state{type=undefined}; + + + +gen_output({startElement, _Uri, "varlistentry", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + State#state{str=[listentry|Str]}; + +gen_output({endElement, _Uri, "mfrac", _QName}, #state{gen_output=true, str=[A0,B|Str]} = State) -> + A = case A0 of + [$ |A1] -> A1; + A1 -> A1 + end, + State#state{str=[A,"/",B|Str]}; + +gen_output({startElement, _Uri, "para", _QName, _Attributes}, #state{gen_output=true, str=Str} = State) -> + case Str of + [para|_] -> State; + [": "|_] -> State; + [Const, listentry | Rest] -> + State#state{str=[": ",Const,para|Rest]}; + [Mod, Const, listentry | Rest] -> + State#state{str=[": ",Mod,Const,para|Rest]}; + _ -> + State#state{str=[para|Str]} + end; + +%% gen_output({startElement, _Uri, What, _QName, _Attributes}, State) -> +%% io:format("Skipped ~s~n",[What]), +%% State; + +gen_output(_E, State) -> + State. + +%%---------------------------------------------------------------------- +%% Function : parse_attributes(Attributes) -> Result +%% Parameters: +%% Result : +%% Description: +%%---------------------------------------------------------------------- +print_attributes([]) -> + ok; +print_attributes([{_Uri, _Prefix, LocalName, AttrValue} |Attributes]) -> + io:format(" ~s=\"~s\"",[LocalName, AttrValue]), + print_attributes(Attributes). + +get_fenc([{_Uri, _Prefix, "open", AttrValue} |Attributes], _Open, Close) + when AttrValue /= "" -> + get_fenc(Attributes, fenc(AttrValue), Close); +get_fenc([{_Uri, _Prefix, "close", AttrValue} |Attributes], Open, _Close) + when AttrValue /= "" -> + get_fenc(Attributes, Open, fenc(AttrValue)); +get_fenc([_|Attributes], Open, Close) -> + get_fenc(Attributes, Open, Close); +get_fenc([], Open, Close) -> + {fenced,Open,Close}. + +fenc("∥") -> "||"; +fenc("∣") -> "|"; +fenc("⌈") -> "|"; +fenc("⌉") -> "|"; +fenc("⌈") -> "|"; +fenc("⌉") -> "|"; +fenc("⌊") -> "|"; +fenc("⌋") -> "|"; +fenc("⌊") -> "|"; +fenc("⌋") -> "|"; +fenc("[") -> "["; +fenc("]") -> "]"; +fenc(Else = [_]) -> Else. + +strip_white_space([$ | Str = [$ |_]]) -> + strip_white_space(Str); +strip_white_space([$\n| Str]) -> + strip_white_space([$ |Str]); +strip_white_space([$\t| Str]) -> + strip_white_space([$ |Str]); +strip_white_space([$\\| Str]) -> + strip_white_space(Str); + +strip_white_space([Char|Str]) -> + [Char|strip_white_space(Str)]; +strip_white_space([]) -> []. + +fix_str([$<|Str]) -> + [$&,$l,$t,$;|fix_str(Str)]; +fix_str([$>|Str]) -> + [$&,$g,$t,$;|fix_str(Str)]; +fix_str("×"++Str) -> + [$*|fix_str(Str)]; +fix_str("″"++Str) -> + [$"|fix_str(Str)]; +fix_str("·"++Str) -> + [$.|fix_str(Str)]; +fix_str("⁡"++Str) -> + fix_str(Str); +fix_str("⁢"++Str) -> + [$ |fix_str(Str)]; +fix_str([$&|Str]) -> + [$&,$a,$m,$p,$; |fix_str(Str)]; +fix_str([C|Str]) when C > 255 -> + fix_str(Str); +fix_str([C|Str]) -> + [C|fix_str(Str)]; +fix_str([]) -> []. diff --git a/lib/wx/api_gen/glapi.conf b/lib/wx/api_gen/glapi.conf index 525ccf8b68..59fa8f7727 100644 --- a/lib/wx/api_gen/glapi.conf +++ b/lib/wx/api_gen/glapi.conf @@ -57,11 +57,13 @@ "glVertexAttribP3", %* "glVertexAttribP4", %* - "glGetActiveSubroutineUniformiv", %% Bad API don't know what to allocate needs to ask + %% Bad API don't know what to allocate needs to ask + "glGetActiveSubroutineUniformiv", + "glGetActiveAtomicCounterBufferiv", %% EXT %% By default skip these extensions - "SGIX","SGIS","NV","ATI","AMD","SUN","SUNX","GREMEDY", + "SGIX","SGIS","NV","ATI","AMD","SUN","SUNX","GREMEDY","OES","MESA", "HP","IBM","INTEL","APPLE","3DFX","PGI","EXT"]}. %% Exceptions to the above @@ -336,7 +338,6 @@ {"length", [skip, {single, true}]}, {"name", {string,"bufSize","length"}}]}. - {"glGenRenderbuffers", {"renderbuffers", {single,{list,"n","n"}}}}. {"glGenFramebuffers", {"framebuffers",{single,{list,"n","n"}}}}. {"glGetRenderbufferParameteriv", {"params", {single,true}}}. @@ -491,4 +492,5 @@ {"glScissorIndexedv", {"v", {single,{tuple,4}}}}. {"glDepthRangeArrayv", [{"count",{c_only,{length,"v"}}}, {"v", [{single,{tuple_list,2}}]}]}. +{"glGetInternalformativ", {"params", [out, {single, {list, "bufSize", "bufSize"}}]}}. diff --git a/lib/wx/api_gen/wx_doxygen.conf b/lib/wx/api_gen/wx_doxygen.conf index df150fd154..829702cbbf 100644 --- a/lib/wx/api_gen/wx_doxygen.conf +++ b/lib/wx/api_gen/wx_doxygen.conf @@ -251,6 +251,7 @@ PREDEFINED = \ wxUSE_DATAOBJ=1 \ wxUSE_SLIDER=1 \ wxUSE_CLIPBOARD=1 \ + wxUSE_SYSTEM_OPTIONS=1 \ wxABI_VERSION=20809 \ __WXGTK24__=1 \ __WXGTK20__=1 \ diff --git a/lib/wx/api_gen/wx_extra/wxEvtHandler.erl b/lib/wx/api_gen/wx_extra/wxEvtHandler.erl index c6810eb32c..23a34225ca 100644 --- a/lib/wx/api_gen/wx_extra/wxEvtHandler.erl +++ b/lib/wx/api_gen/wx_extra/wxEvtHandler.erl @@ -18,10 +18,7 @@ %% <a href="http://www.wxwidgets.org/manuals/stable/wx_wxevthandler.html"> %% The orginal documentation</a>. %% -%% @headerfile "../../include/wx.hrl" %% -%%@type wxEvtHandler(). An object reference - -module(wxEvtHandler). -include("wxe.hrl"). -include("../include/wx.hrl"). @@ -34,17 +31,16 @@ new_evt_listener/0, destroy_evt_listener/1, get_callback/1, replace_fun_with_id/2]). --record(evh, {et=null,id=?wxID_ANY,lastId=?wxID_ANY,skip=undefined,userdata=[],cb=0}). - +-export_type([wxEvtHandler/0, wx/0, event/0]). +-type wxEvtHandler() :: wx:wx_object(). +-record(evh, {et=null,id=?wxID_ANY,lastId=?wxID_ANY,skip=undefined,userdata=[],cb=0}). -%% @spec (This::wxEvtHandler(), EventType::wxEventType()) -> ok %% @doc Equivalent to {@link connect/3. connect(This, EventType, [])} - +-spec connect(This::wxEvtHandler(), EventType::wxEventType()) -> ok. connect(This, EventType) -> connect(This, EventType, []). -%% @spec (This::wxEvtHandler(), EventType::wxEventType(), [Options]) -> ok %% @doc This function subscribes the to events of EventType, %% in the range id, lastId. The events will be received as messages %% if no callback is supplied. @@ -63,6 +59,9 @@ connect(This, EventType) -> %% to process the event. Default not specfied i.e. a message will %% be delivered to the process calling this function. %% {userData, term()} An erlang term that will be sent with the event. Default: []. +-spec connect(This::wxEvtHandler(), EventType::wxEventType(), [Option]) -> ok when + Option :: {id, integer()} | {lastId, integer()} | {skip, boolean()} | + {callback, function()} | {userData, term()}. connect(This=#wx_ref{type=ThisT}, EventType, Options) -> EvH = parse_opts(Options, #evh{et=EventType}), ?CLASS(ThisT,wxEvtHandler), @@ -76,7 +75,7 @@ parse_opts([{callback,Fun}|R], Opts) when is_function(Fun) -> %% Check Fun Arity? parse_opts(R, Opts#evh{cb=Fun}); parse_opts([callback|R], Opts) -> - parse_opts(R, Opts#evh{cb=1}); + parse_opts(R, Opts#evh{cb=self()}); parse_opts([{userData, UserData}|R],Opts) -> parse_opts(R, Opts#evh{userdata=UserData}); parse_opts([{skip, Skip}|R],Opts) when is_boolean(Skip) -> @@ -99,26 +98,27 @@ parse_opts([], Opts = #evh{id=Id,lastId=Lid,skip=Skip, cb=CB}) -> Opts end. -%% @spec (This::wxEvtHandler()) -> true | false + %% @doc Equivalent to {@link disconnect/3. disconnect(This, null, [])} %% Can also have an optional callback Fun() as an additional last argument. - +-spec disconnect(This::wxEvtHandler()) -> boolean(). disconnect(This=#wx_ref{type=ThisT,ref=_ThisRef}) -> ?CLASS(ThisT,wxEvtHandler), disconnect(This, null, []). -%% @spec (This::wxEvtHandler(), EventType::wxEventType()) -> true | false %% @doc Equivalent to {@link disconnect/3. disconnect(This, EventType, [])} +-spec disconnect(This::wxEvtHandler(), EventType::wxEventType()) -> boolean(). disconnect(This=#wx_ref{type=ThisT,ref=_ThisRef}, EventType) when is_atom(EventType) -> ?CLASS(ThisT,wxEvtHandler), disconnect(This, EventType, []). -%% @spec (This::wxEvtHandler(), EventType::wxEventType(), Opts) -> true | false %% @doc See <a href="http://www.wxwidgets.org/manuals/stable/wx_wxevthandler.html#wxevthandlerdisconnect">external documentation</a> %% This function unsubscribes the process or callback fun from the event handler. %% EventType may be the atom 'null' to match any eventtype. %% Notice that the options skip and userdata is not used to match the eventhandler. -disconnect(This=#wx_ref{type=ThisT,ref=_ThisRef}, EventType, Opts) -> +-spec disconnect(This::wxEvtHandler(), EventType::wxEventType(), [Option]) -> boolean() when + Option :: {id, integer()} | {lastId, integer()} | {callback, function()}. +disconnect(This=#wx_ref{type=ThisT,ref=_ThisRef}, EventType, Opts) -> ?CLASS(ThisT,wxEvtHandler), EvH = parse_opts(Opts, #evh{et=EventType}), case wxe_util:disconnect_cb(This, EvH) of diff --git a/lib/wx/api_gen/wx_extra/wxListCtrl.c_src b/lib/wx/api_gen/wx_extra/wxListCtrl.c_src index cd3074e481..54d6fafd01 100644 --- a/lib/wx/api_gen/wx_extra/wxListCtrl.c_src +++ b/lib/wx/api_gen/wx_extra/wxListCtrl.c_src @@ -1,3 +1,161 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2011. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + + +<<wxListCtrl_class +class EwxListCtrl : public wxListCtrl { + public: ~EwxListCtrl(); + EwxListCtrl(wxWindow * parent,wxWindowID winid,const wxPoint& pos,const wxSize& size,long style,const wxValidator& validator) : wxListCtrl(parent,winid,pos,size,style,validator) {}; + EwxListCtrl() : wxListCtrl() {}; + + int onGetItemText; + int onGetItemAttr; + int onGetItemColumnImage; + ErlDrvPort port; + + private: + virtual wxString OnGetItemText(long item, long col) const; + virtual wxListItemAttr* OnGetItemAttr(long item) const; + virtual int OnGetItemImage(long item) const; + virtual int OnGetItemColumnImage(long item, long column) const; +}; +wxListCtrl_class>> + +<<wxListCtrl_new_0 +case ~s: { // wxListCtrl::wxListCtrl + wxListCtrl * Result = new EwxListCtrl(); + newPtr((void *) Result, 0, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxListCtrl"); + break; +} +wxListCtrl_new_0>> + +<<wxListCtrl_new_2 +case ~s: { // wxListCtrl::wxListCtrl + wxWindowID winid=wxID_ANY; + wxPoint pos= wxDefaultPosition; + wxSize size= wxDefaultSize; + long style=wxLC_ICON; + const wxValidator * validator= &wxDefaultValidator; + wxWindow *parent = (wxWindow *) getPtr(bp,memenv); bp += 4; + int onGetItemText = 0, onGetItemAttr = 0, onGetItemColumnImage = 0; + + bp += 4; /* Align */ + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + winid = (wxWindowID)*(int *) bp; bp += 4; + } break; + case 2: {bp += 4; + int * posX = (int *) bp; bp += 4; + int * posY = (int *) bp; bp += 4; + pos = wxPoint(*posX,*posY); + bp += 4; /* Align */ + } break; + case 3: {bp += 4; + int * sizeW = (int *) bp; bp += 4; + int * sizeH = (int *) bp; bp += 4; + size = wxSize(*sizeW,*sizeH); + bp += 4; /* Align */ + } break; + case 4: {bp += 4; + style = (long)*(int *) bp; bp += 4; + } break; + case 5: {bp += 4; +validator = (wxValidator *) getPtr(bp,memenv); bp += 4; + } break; + case 6: {bp += 4; + onGetItemText = *(int *) bp; bp += 4; + } break; + case 7: {bp += 4; + onGetItemAttr = *(int *) bp; bp += 4; + } break; + case 8: {bp += 4; + onGetItemColumnImage = *(int *) bp; bp += 4; + } break; + }}; + EwxListCtrl * Result = new EwxListCtrl(parent,winid,pos,size,style,*validator); + Result->onGetItemText = onGetItemText; + Result->onGetItemAttr = onGetItemAttr; + Result->onGetItemColumnImage = onGetItemColumnImage; + Result->port = Ecmd.port; + newPtr((void *) Result, 0, memenv); + rt.addRef(getRef((void *)Result,memenv), "wxListCtrl"); + break; +} +wxListCtrl_new_2>> + +<<Create +case ~s: { // wxListCtrl::Create + wxWindowID winid=wxID_ANY; + wxPoint pos= wxDefaultPosition; + wxSize size= wxDefaultSize; + long style=wxLC_ICON; + const wxValidator * validator= &wxDefaultValidator; + EwxListCtrl *This = (EwxListCtrl *) getPtr(bp,memenv); bp += 4; + wxWindow *parent = (wxWindow *) getPtr(bp,memenv); bp += 4; + int onGetItemText = 0, onGetItemAttr = 0, onGetItemColumnImage = 0; + + bp += 4; /* Align */ + while( * (int*) bp) { switch (* (int*) bp) { + case 1: {bp += 4; + winid = (wxWindowID)*(int *) bp; bp += 4; + } break; + case 2: {bp += 4; + int * posX = (int *) bp; bp += 4; + int * posY = (int *) bp; bp += 4; + pos = wxPoint(*posX,*posY); + bp += 4; /* Align */ + } break; + case 3: {bp += 4; + int * sizeW = (int *) bp; bp += 4; + int * sizeH = (int *) bp; bp += 4; + size = wxSize(*sizeW,*sizeH); + bp += 4; /* Align */ + } break; + case 4: {bp += 4; + style = (long)*(int *) bp; bp += 4; + } break; + case 5: {bp += 4; +validator = (wxValidator *) getPtr(bp,memenv); bp += 4; + } break; + case 6: {bp += 4; + onGetItemText = *(int *) bp; bp += 4; + } break; + case 7: {bp += 4; + onGetItemAttr = *(int *) bp; bp += 4; + } break; + case 8: {bp += 4; + onGetItemColumnImage = *(int *) bp; bp += 4; + } break; + }}; + if(!This) throw wxe_badarg(0); + bool Result = This->Create(parent,winid,pos,size,style,*validator); + This->onGetItemText = onGetItemText; + This->onGetItemAttr = onGetItemAttr; + This->onGetItemColumnImage = onGetItemColumnImage; + This->port = Ecmd.port; + + rt.addBool(Result); + break; +} +Create>> + <<SortItems case ~s: { // wxListCtrl::SortItems taylormade wxListCtrl *This = (wxListCtrl *) getPtr(bp,memenv); bp += 4; @@ -22,3 +180,6 @@ case ~s: { // wxListCtrl::SortItems taylormade break; } SortItems>> + + + diff --git a/lib/wx/api_gen/wx_extra/wxListCtrl.erl b/lib/wx/api_gen/wx_extra/wxListCtrl.erl index e6470182cb..99255bc53f 100644 --- a/lib/wx/api_gen/wx_extra/wxListCtrl.erl +++ b/lib/wx/api_gen/wx_extra/wxListCtrl.erl @@ -1,32 +1,33 @@ %% %% %CopyrightBegin% -%% -%% Copyright Ericsson AB 2009. All Rights Reserved. -%% +%% +%% Copyright Ericsson AB 2011. All Rights Reserved. +%% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. -%% +%% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. -%% +%% %% %CopyrightEnd% %% + <<EXPORT:SortItems sortItems/2 SortItems:EXPORT>> <<SortItems %% @spec (This::wxListCtrl(), SortCallBack::function()) -> boolean() %% @doc Sort the items in the list control<br /> -%% <pre>SortCalBack(Item1,Item2) -> integer()</pre> +%% <pre>SortCallBack(Item1,Item2) -> integer()</pre> %% <br /> SortCallBack receives the client data associated with two items %% to compare, and should return 0 if the items are equal, a negative %% value if the first item is less than the second one and a positive %% value if the first item is greater than the second one. -%% <br /> NOTE: The callback may not call other processes. +%% <br /> NOTE: The callback may not call other (wx) processes. sortItems(#wx_ref{type=ThisT,ref=ThisRef}, SortCallBack) when is_function(SortCallBack, 2) -> ?CLASS(ThisT,wxListCtrl), @@ -37,3 +38,100 @@ sortItems(#wx_ref{type=ThisT,ref=ThisRef}, SortCallBack) SortId = wxe_util:get_cbId(Sort), wxe_util:call(~s, <<ThisRef:32/?UI,SortId:32/?UI>>). SortItems>> + +<<EXPORT:wxListCtrl new/0, new/1, new/2 wxListCtrl:EXPORT>> + +<<wxListCtrl_new_0 +%% @spec () -> wxListCtrl() +%% @doc See <a href="http://www.wxwidgets.org/manuals/stable/wx_wxlistctrl.html#wxlistctrlwxlistctrl">external documentation</a>. +new() -> + wxe_util:construct(~s, <<>>). +wxListCtrl_new_0>> + +<<wxListCtrl_new_2 +%% @spec (Parent::wxWindow:wxWindow()) -> wxListCtrl() +%% @equiv new(Parent, []) +new(Parent) + when is_record(Parent, wx_ref) -> + new(Parent, []). + +%% @spec (Parent::wxWindow:wxWindow(), [Option]) -> wxListCtrl() +%% Option = {winid, integer()} | +%% {pos, {X::integer(),Y::integer()}} | +%% {size, {W::integer(),H::integer()}} | +%% {style, integer()} | +%% {validator, wx:wx()} | +%% {onGetItemText, OnGetItemText} | +%% {onGetItemAttr, OnGetItemAttr} | +%% {onGetItemColumnImage, OnGetItemColumnImage} +%% +%% OnGetItemText = (This, Item, Column) -> wxString() +%% OnGetItemAttr = (This, Item) -> wxListItemAttr() +%% OnGetItemColumnImage = (This, Item, Column) -> integer() +%% @doc See <a href="http://www.wxwidgets.org/manuals/stable/wx_wxlistctrl.html#wxlistctrlwxlistctrl">external documentation</a>. + +new(#wx_ref{type=ParentT,ref=ParentRef}, Options) + when is_list(Options)-> + ?CLASS(ParentT,wxWindow), + MOpts = fun({winid, Winid}, Acc) -> [<<1:32/?UI,Winid:32/?UI>>|Acc]; + ({pos, {PosX,PosY}}, Acc) -> [<<2:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; + ({size, {SizeW,SizeH}}, Acc) -> [<<3:32/?UI,SizeW:32/?UI,SizeH:32/?UI,0:32>>|Acc]; + ({style, Style}, Acc) -> [<<4:32/?UI,Style:32/?UI>>|Acc]; + ({validator, #wx_ref{type=ValidatorT,ref=ValidatorRef}}, Acc) -> + ?CLASS(ValidatorT,wx),[<<5:32/?UI,ValidatorRef:32/?UI>>|Acc]; + ({onGetItemText, F}, Acc) when is_function(F) -> + Fun = fun([This,Item,Col]) -> unicode:characters_to_binary([F(This,Item,Col),0]) end, + [<<6:32/?UI,(wxe_util:get_cbId(Fun)):32/?UI>>|Acc]; + ({onGetItemAttr, F}, Acc) when is_function(F) -> + Fun = fun([This,Item]) -> + #wx_ref{type=wxListItemAttr,ref=ThisRef} = F(This,Item), + <<ThisRef:32/?UI>> + end, + [<<7:32/?UI,(wxe_util:get_cbId(Fun)):32/?UI>>|Acc]; + ({onGetItemColumnImage, F}, Acc) when is_function(F) -> + Fun = fun([This,Item, Col]) -> <<(F(This,Item,Col)):32/?I>> end, + [<<8:32/?UI,(wxe_util:get_cbId(Fun)):32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:construct(~s, <<ParentRef:32/?UI, 0:32,BinOpt/binary>>). + +wxListCtrl_new_2>> + +<<EXPORT:Create create/2, create/3 Create:EXPORT>> + +<<Create +%% @spec (This::wxListCtrl(), Parent::wxWindow:wxWindow()) -> bool() +%% @equiv create(This,Parent, []) +create(This,Parent) + when is_record(This, wx_ref),is_record(Parent, wx_ref) -> + create(This,Parent, []). + +%% @spec (This::wxListCtrl(), Parent::wxWindow:wxWindow(), [Option]) -> bool() +%% Option = {winid, integer()} | +%% {pos, {X::integer(),Y::integer()}} | +%% {size, {W::integer(),H::integer()}} | +%% {style, integer()} | +%% {validator, wx:wx()} | +%% {onGetItemText, OnGetItemText} | +%% {onGetItemAttr, OnGetItemAttr} | +%% {onGetItemColumnImage, OnGetItemColumnImage} +%% +%% OnGetItemText = (This, Item, Column) -> wxString() +%% OnGetItemAttr = (This, Item) -> wxListItemAttr() +%% OnGetItemColumnImage = (This, Item, Column) -> integer() +%% @doc See <a href="http://www.wxwidgets.org/manuals/stable/wx_wxlistctrl.html#wxlistctrlcreate">external documentation</a>. +create(#wx_ref{type=ThisT,ref=ThisRef},#wx_ref{type=ParentT,ref=ParentRef}, Options) + when is_list(Options) -> + ?CLASS(ThisT,wxListCtrl), + ?CLASS(ParentT,wxWindow), + MOpts = fun({winid, Winid}, Acc) -> [<<1:32/?UI,Winid:32/?UI>>|Acc]; + ({pos, {PosX,PosY}}, Acc) -> [<<2:32/?UI,PosX:32/?UI,PosY:32/?UI,0:32>>|Acc]; + ({size, {SizeW,SizeH}}, Acc) -> [<<3:32/?UI,SizeW:32/?UI,SizeH:32/?UI,0:32>>|Acc]; + ({style, Style}, Acc) -> [<<4:32/?UI,Style:32/?UI>>|Acc]; + ({validator, #wx_ref{type=ValidatorT,ref=ValidatorRef}}, Acc) -> ?CLASS(ValidatorT,wx),[<<5:32/?UI,ValidatorRef:32/?UI>>|Acc]; + (BadOpt, _) -> erlang:error({badoption, BadOpt}) end, + BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)), + wxe_util:call(~s, + <<ThisRef:32/?UI,ParentRef:32/?UI, BinOpt/binary>>). + +Create>> diff --git a/lib/wx/api_gen/wx_gen.erl b/lib/wx/api_gen/wx_gen.erl index 2f20c42a5d..7f85151d03 100644 --- a/lib/wx/api_gen/wx_gen.erl +++ b/lib/wx/api_gen/wx_gen.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -30,6 +30,12 @@ -compile(export_all). +-define(DBGCF(Class, Func, Format, Args), + case {get(current_class), get(current_func)} of + {Class, Func} -> io:format("~p:~p: " ++ Format, [?MODULE,?LINE] ++ Args); + _ -> ok + end). + code() -> safe(fun gen_code/0,true). xml() -> safe(fun gen_xml/0,true). @@ -38,7 +44,7 @@ devcode() -> erase(),safe(fun gen_code/0,false). safe(What, QuitOnErr) -> try What(), - io:format("Completed succesfully~n~n", []), + io:format("Completed successfully~n~n", []), QuitOnErr andalso gen_util:halt(0) catch Err:Reason -> io:format("Error in ~p ~p~n", [get(current_class),get(current_func)]), @@ -659,7 +665,11 @@ extract_type_info2("&", Acc) -> [{by_ref,reference}|Acc]; extract_type_info2("WXDLLIMP" ++ _, Acc) -> Acc; extract_type_info2(Type, Acc) -> [Type|Acc]. -parse_type2(["void"], _Info, _Opts, _T) -> void; +parse_type2(["void"], _Info, _Opts, #type{by_val=ByVal}) -> + case ByVal of + true -> void; + false -> voidp + end; parse_type2(["virtual"|R], _Info, _Opts, _T) -> [] = R, %% Bug in old doxygen virtual destructors have type virtual @@ -957,17 +967,17 @@ erl_skip_opt(All=[Ms=[{_,{Len,_,_},_}|_]|R],Acc1=[{_,{N,_,_},_}|_], Acc2) -> end; erl_skip_opt([],Acc1,Acc2) -> [strip_ti(Acc1)|Acc2]. -erl_skip_opt2([F={_,{N,In,_},M=#method{where=Where}}|Ms],Acc1,Acc2,Check) -> +erl_skip_opt2([F={_,{N,In,_},M=#method{where=Where}}|Ms],Acc1,Acc2,Check) -> case N > 0 andalso lists:last(In) =:= opt_list of - true when Where =/= merged_c, Where =/= taylormade -> - case Check of - [] -> + true when Where =/= merged_c, Where =/= taylormade -> + case Check of + [] -> erl_skip_opt2(Ms,[F|Acc1],[M#method{where=erl_no_opt}|Acc2],[]); - _ -> + _ -> Skipped = reverse(tl(reverse(In))), T = fun({_,{_,Args,_},_}) -> true =:= types_differ(Skipped,Args) end, case lists:all(T, Check) of - true -> + true -> erl_skip_opt2(Ms,[F|Acc1], [M#method{where=erl_no_opt}|Acc2], Check); @@ -976,7 +986,7 @@ erl_skip_opt2([F={_,{N,In,_},M=#method{where=Where}}|Ms],Acc1,Acc2,Check) -> end end; _ -> - erl_skip_opt2(Ms,[F|Acc1],Acc2,[]) + erl_skip_opt2(Ms,[F|Acc1],Acc2,Check) end; erl_skip_opt2([],Acc1,Acc2,_) -> {Acc1,Acc2}. @@ -1025,7 +1035,6 @@ types_differ([{class,C1}|R1], [{class,C2}|R2]) -> true -> true; false -> -%% _ -> {class,C1,C2}; {class,C1,C2} -> {class,C1,C2}; @@ -1101,6 +1110,7 @@ type_foot_print(#type{base={enum,_}}) -> int; type_foot_print(#type{base={ref,_}}) -> ref; type_foot_print(#type{base={term,_}}) -> term; type_foot_print(#type{base=eventType}) -> atom; +type_foot_print(voidp) -> int; %% type_foot_print({Type,Str}) when is_list(Str) -> %% type_foot_print(Type); type_foot_print(#type{base={comp,_,R={record,_}}}) -> diff --git a/lib/wx/api_gen/wx_gen_cpp.erl b/lib/wx/api_gen/wx_gen_cpp.erl index 4b33068d8f..69e7510a95 100644 --- a/lib/wx/api_gen/wx_gen_cpp.erl +++ b/lib/wx/api_gen/wx_gen_cpp.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -19,7 +19,7 @@ %%%------------------------------------------------------------------- %%% File : wx_gen_cpp.erl %%% Author : Dan Gudmundsson <[email protected]> -%%% Description : +%%% Description : %%% %%% Created : 19 Feb 2007 by Dan Gudmundsson <[email protected]> %%%------------------------------------------------------------------- @@ -35,7 +35,7 @@ args/3, strip_name/2]). -import(wx_gen, [next_id/1]). -gen(Defs) -> +gen(Defs) -> open_write("../c_src/gen/wxe_derived_dest.h"), c_copyright(), w("~n/***** This file is generated do not edit ****/~n~n", []), @@ -49,48 +49,31 @@ gen(Defs) -> open_write("../c_src/gen/wxe_macros.h"), c_copyright(), - gen_macros(), + gen_macros(), close(), open_write("../c_src/gen/wxe_init.cpp"), c_copyright(), build_enums(), close(), - + build_events(), Res. - + gen_derived_dest(Defs) -> [gen_derived_dest_2(Class) || Class <- Defs], - - UglySkipList = ["wxCaret", "wxCalendarDateAttr", - "wxFileDataObject", "wxTextDataObject", "wxBitmapDataObject" - ], + ok. - ?WTC("gen_derived_dest"), - w("void WxeApp::delete_object(void *ptr, wxeRefData *refd) {~n", []), - w(" switch(refd->type) {~n", []), - Case = fun(#class{name=Class, id=Id, abstract=IsAbs, parent=P}) when P /= "static" -> - UglyWorkaround = lists:member(Class, UglySkipList), - case hd(reverse(wx_gen_erl:parents(Class))) of - root when IsAbs == false, UglyWorkaround == false -> - w(" case ~p: delete (~s *) ptr; break;~n", [Id, Class]); - root when IsAbs == false, UglyWorkaround == true -> - w(" case ~p: /* delete (~s *) ptr;" - "These objects must be deleted by owner object */ " - "break;~n", [Id, Class]); - _ -> ok - end; - (_) -> ok - end, - [Case(Class) || Class <- Defs], - w(" default: delete (wxObject *) ptr;~n", []), - w("}}~n~n", []). +gen_derived_dest_2(C=#class{name=Class, options=Opts}) -> + ?WTC("gen_derived_dest_2"), + Derived = is_derived(C), + TaylorMade = taylormade_class(C), -gen_derived_dest_2(C=#class{name=Class}) -> - case is_derived(C) of - true -> - ?WTC("gen_derived_dest_2"), + if Derived andalso (TaylorMade =:= false) -> + case lists:keysearch(ifdef,1,Opts) of + {value, {ifdef, What}} -> w("#if ~p~n",[What]); + _ -> ok + end, w("class E~s : public ~s {~n",[Class,Class]), case Class of "wxGLCanvas" -> %% Special for cleaning up gl context @@ -100,16 +83,39 @@ gen_derived_dest_2(C=#class{name=Class}) -> w(" public: ~~E~s() {((WxeApp *)wxTheApp)->clearPtr(this);};~n", [Class]) end, gen_constructors(C), - w("};~n~n", []); - false -> + case lists:keysearch(ifdef,1,Opts) of + {value, {ifdef, Endif}} -> + w("};~n", []), + w("#endif // ~p~n~n",[Endif]); + _ -> + w("};~n~n", []) + end; + TaylorMade /= false -> + w("~s~n", [TaylorMade]); + true -> ignore end. +taylormade_class(#class{name=CName, methods=Ms}) -> + TaylorMade = lists:any(fun([#method{where=taylormade}|_]) -> true; + (_) -> false + end, Ms), + case TaylorMade of + false -> false; + true -> + {ok, Bin} = file:read_file(filename:join([wx_extra, CName ++".c_src"])), + Src = binary_to_list(Bin), + case gen_util:get_taylor_made(Src, CName ++ "_class") of + nomatch -> false; + {match, [Str0]} -> Str0 + end + end. + gen_constructors(#class{name=Class, methods=Ms0}) -> Ms = lists:append(Ms0), Cs = lists:filter(fun(#method{method_type=MT}) -> MT =:= constructor end, Ms), [gen_constructor(Class, Const) || Const <- Cs]. - + gen_constructor(_Class, #method{where=merged_c}) -> ok; gen_constructor(_Class, #method{where=erl_no_opt}) -> ok; gen_constructor(Class, _M=#method{params=Ps}) -> @@ -119,7 +125,7 @@ gen_constructor(Class, _M=#method{params=Ps}) -> HaveMergedType = fun(#param{type={merged,_,_,_,_,_,_}}) -> true; (_) -> false end, ?WTC("gen_constructor"), case lists:any(HaveMergedType, Ps) of - false -> + false -> w(" E~s(~s) : ~s(~s) {};~n", [Class,args(Gen1,",",Ps),Class,args(CallA,",",Ps)]); true -> @@ -141,9 +147,9 @@ gen_type(#type{name=Type, ref=undefined, single=array, mod=Mod},_) -> mods(Mod) ++ to_string(Type) ++ " * "; gen_type(#type{name=Type, ref=undefined, mod=Mod},_) -> mods(Mod) ++ to_string(Type) ++ " "; -gen_type({merged, _, T1, _,_, _T2,_}, 1) -> +gen_type({merged, _, T1, _,_, _T2,_}, 1) -> gen_type(T1,error); -gen_type({merged, _, _T1,_, _, T2,_}, 2) -> +gen_type({merged, _, _T1,_, _, T2,_}, 2) -> gen_type(T2,error). gen_funcs(Defs) -> @@ -168,7 +174,7 @@ gen_funcs(Defs) -> %% w(" case WXE_REMOVE_PORT:~n", []), %% w(" { destroyMemEnv(Ecmd.port); } break;~n", []), w(" case DESTROY_OBJECT: {~n"), - w(" wxObject *This = (wxObject *) getPtr(bp,memenv); "), + w(" wxObject *This = (wxObject *) getPtr(bp,memenv); "), w(" if(This) {"), w(" ((WxeApp *) wxTheApp)->clearPtr((void *) This);~n"), w(" delete This; }~n } break;~n"), @@ -203,16 +209,39 @@ gen_funcs(Defs) -> w(" error.addTupleCount(2);~n"), w(" error.addTupleCount(3);~n"), w(" error.send();~n"), - w("}} /* The End */~n"), + w("}} /* The End */~n~n~n"), + + UglySkipList = ["wxCaret", "wxCalendarDateAttr", + "wxFileDataObject", "wxTextDataObject", "wxBitmapDataObject" + ], + + w("void WxeApp::delete_object(void *ptr, wxeRefData *refd) {~n", []), + w(" switch(refd->type) {~n", []), + Case = fun(#class{name=Class, id=Id, abstract=IsAbs, parent=P}) when P /= "static" -> + UglyWorkaround = lists:member(Class, UglySkipList), + case hd(reverse(wx_gen_erl:parents(Class))) of + root when IsAbs == false, UglyWorkaround == false -> + w(" case ~p: delete (~s *) ptr; break;~n", [Id, Class]); + root when IsAbs == false, UglyWorkaround == true -> + w(" case ~p: /* delete (~s *) ptr;" + "These objects must be deleted by owner object */ " + "break;~n", [Id, Class]); + _ -> ok + end; + (_) -> ok + end, + [Case(Class) || Class <- Defs], + w(" default: delete (wxObject *) ptr;~n", []), + w("}}~n~n", []), Res. - + gen_class(C=#class{name=Name,methods=Ms,options=Opts}) -> put(current_class, Name), - NewMs = + NewMs = case lists:member(taylormade, Opts) of true -> {ok, Bin} = file:read_file(filename:join([wx_extra,Name++".c_src"])), - ?WTC("gen_class"), + ?WTC("gen_class"), w("~s~n", [binary_to_list(Bin)]), Ms; false -> @@ -220,13 +249,13 @@ gen_class(C=#class{name=Name,methods=Ms,options=Opts}) -> {value, {ifdef, What}} -> w("#if ~p~n",[What]), Methods = lists:flatten(Ms), - MsR = [gen_method(Name,M) || + MsR = [gen_method(Name,M) || M <- lists:keysort(#method.id, Methods)], w("#endif // ~p~n",[What]), MsR; false -> Methods = lists:flatten(Ms), - [gen_method(Name,M) || + [gen_method(Name,M) || M <- lists:keysort(#method.id, Methods)] end end, @@ -234,15 +263,19 @@ gen_class(C=#class{name=Name,methods=Ms,options=Opts}) -> C#class{methods=NewMs}. gen_method(_CName, M=#method{where=erl_no_opt}) -> M; -gen_method(CName, M=#method{where=taylormade, name=Name, id=Id}) -> +gen_method(CName, M=#method{where=taylormade, name=Name, id=Id}) -> {ok, Bin} = file:read_file(filename:join([wx_extra, CName ++".c_src"])), - Str0 = binary_to_list(Bin), + Src = binary_to_list(Bin), %% io:format("C++ Class ~p ~p~n", [CName, Name]), - - {match, [Str1]} = re:run(Str0, "<<"++Name++"(.*)"++Name++">>", - [dotall, {capture, all_but_first, list}]), + Str = case gen_util:get_taylor_made(Src, Name) of + nomatch -> + {match, [Str0]} = gen_util:get_taylor_made(Src, wx_gen_erl:get_unique_name(Id)), + Str0; + {match, [Str0]} -> + Str0 + end, ?WTC("gen_method"), - w(Str1, [wx_gen_erl:get_unique_name(Id)]), + w(Str, [wx_gen_erl:get_unique_name(Id)]), M; gen_method(CName, M=#method{name=N,params=[Ps],method_type=destructor,id=MethodId}) -> case hd(reverse(wx_gen_erl:parents(CName))) of @@ -253,7 +286,7 @@ gen_method(CName, M=#method{name=N,params=[Ps],method_type=destructor,id=MethodI w(" if(This) {", []), w(" ((WxeApp *) wxTheApp)->clearPtr((void *) This);~n", []), w(" delete This;}~n", []), - free_args(), + free_args(), w(" break;~n}~n", []); object -> %% Use default ignore @@ -266,7 +299,7 @@ gen_method(CName, M=#method{name=N,params=Ps0,type=T,method_type=MT,id=MethodId w("case ~s: { // ~s::~s~n", [wx_gen_erl:get_unique_name(MethodId),CName,N]), Ps1 = declare_variables(void, Ps0), {Ps2,Align} = decode_arguments(Ps1), - Opts = [Opt || Opt = #param{def=Def,in=In,where=Where} <- Ps2, + Opts = [Opt || Opt = #param{def=Def,in=In,where=Where} <- Ps2, Def =/= none, In =/= false, Where =/= c], decode_options(Opts, Align), case gen_util:get_hook(c, M#method.pre_hook) of @@ -292,7 +325,7 @@ declare_variables(T, Ps) -> declare_var(P = #param{where=erl}) -> P; declare_var(P = #param{where=this}) -> P; -declare_var(P = #param{name=Name,def=Def,type=Type,in=true}) when Def =/= none -> +declare_var(P = #param{name=Name,def=Def,type=Type,in=true}) when Def =/= none -> declare_type(Name, true, Def, Type), P; declare_var(P = #param{in=In}) when In =/= false -> P; @@ -302,9 +335,11 @@ declare_var(P = #param{name=Name,in=In,def=Def,type=Type}) -> declare_type(N,false,_,#type{name="wxArrayInt"}) -> w(" wxArrayInt ~s;~n", [N]); +declare_type(N,false,_,#type{name="wxArrayDouble"}) -> + w(" wxArrayDouble ~s;~n", [N]); declare_type(N,false,_,#type{name="wxArrayString"}) -> w(" wxArrayString ~s;~n", [N]); -declare_type(N,false,_,#type{base=Base,single=true,name=Type,by_val=false,mod=Mod}) +declare_type(N,false,_,#type{base=Base,single=true,name=Type,by_val=false,mod=Mod}) when Base =:= int; Base =:= long; Base =:= float; Base =:= double -> w(" ~s~s ~s;~n", [mods(Mod),Type,N]); declare_type(N,false,_,#type{base={enum,_},single=true,name=Type,by_val=false,mod=Mod}) -> @@ -313,9 +348,11 @@ declare_type(N,false,_,#type{name="wxArrayTreeItemIds",ref=reference}) -> w(" wxArrayTreeItemIds ~s;~n", [N]); declare_type(N,false,_,#type{name="wxDateTime"}) -> w(" wxDateTime ~s;~n", [N]); +declare_type(N,false,_,#type{name="wxColour"}) -> + w(" wxColour ~s;~n", [N]); declare_type(N,false,_,#type{name=Type, base=int64, ref=reference}) -> w(" ~s ~s;~n", [Type,N]); -declare_type(N,true,Def,#type{base=Base,single=true,name=Type,by_val=true}) +declare_type(N,true,Def,#type{base=Base,single=true,name=Type,by_val=true}) when Base =:= int; Base =:= long; Base =:= float; Base =:= double; Base =:= bool -> w(" ~s ~s=~s;~n", [Type,N,Def]); declare_type(N,true,Def,#type{base={comp,_,_},single=true,name=Type,mod=Mod,ref={pointer,1}}) -> @@ -328,7 +365,7 @@ declare_type(N,true,Def,#type{base={class,_},single=true,name=Type,ref={pointer, w(" ~s~s * ~s=~s;~n", [mods(Mod),Type,N,Def]); declare_type(N,true,Def,#type{base={class,_},single=true,name=Type,ref=reference,mod=Mod}) -> w(" ~s~s * ~s= &~s;~n", [mods(Mod),Type,N,Def]); -declare_type(N,true,Def,#type{base=Base,single=true,name=Type,by_val=false,ref={pointer,1}}) +declare_type(N,true,Def,#type{base=Base,single=true,name=Type,by_val=false,ref={pointer,1}}) when Base =:= int; Base =:= long; Base =:= float; Base =:= double; Base =:= bool -> w(" ~s *~s=~s;~n", [Type,N,Def]); declare_type(N,true,Def,#type{single=true,name="wxArtClient"}) -> @@ -341,11 +378,13 @@ declare_type(N,true,Def,#type{base=binary, name=char}) -> w(" char ~sD[] = {~s}, * ~s = ~sD;~n", [N,Def,N,N]); declare_type(_N,true,_Def,void) -> skip; +declare_type(_N,true,_Def,voidp) -> + skip; declare_type(N,true,Def,#type{name=Type, ref={pointer,2}}) -> %% xxxx w(" ~s ** ~s = ~s;~n", [Type,N,Def]); declare_type(N,true,Def,#type{name=Type, single=array, ref={pointer,1}}) -> - w(" int * ~sLen = 0;~n", [N]), + w(" int * ~sLen = 0;~n", [N]), w(" ~s * ~s = ~s;~n", [Type,N,Def]); declare_type(N,true,"",#type{name="wxArrayString", single=array, ref=reference}) -> w(" wxArrayString ~s;~n", [N]); @@ -363,12 +402,12 @@ decode_options(Opts, Align) -> decode_opt(#param{name=Name,type=Type}, N) -> w(" case ~p: {bp += 4;~n", [N]), - Align = decode_arg(Name,Type,opt,1), + Align = decode_arg(Name,Type,opt,1), align(Align, 64), w(" } break;~n", []), N+1. -decode_arguments(Ps0) -> +decode_arguments(Ps0) -> lists:mapfoldl(fun decode_arg/2,0,Ps0). store_free(N) -> @@ -380,7 +419,7 @@ store_free(N) -> free_args() -> case get(free_args) of undefined -> ignore; - List -> + List -> erase(free_args), [w(" driver_free(~s);~n", [Arg]) || Arg <- List] end. @@ -388,7 +427,7 @@ free_args() -> decode_arg(P = #param{where=erl},A) -> {P,A}; decode_arg(P = #param{where=c},A) -> {P,A}; decode_arg(P = #param{in=false},A) -> {P,A}; -decode_arg(P = #param{def=Def},A) when Def =/= none -> {P,A}; +decode_arg(P = #param{def=Def},A) when Def =/= none -> {P,A}; decode_arg(P = #param{name=Name,type=Type},A0) -> A = decode_arg(Name, Type, arg, A0), {P, A}. @@ -426,22 +465,22 @@ decode_arg(N,#type{base=float,single=true,name=Type},arg,A0) -> align(A0,32); decode_arg(N,#type{base=double,single=true,name=Type},Arg,A0) -> A = align(A0,64), - case Arg of + case Arg of arg -> w(" ~s * ~s = (~s *) bp; bp += 8;~n", [Type,N,Type]); opt -> w(" ~s = * (~s *) bp; bp += 8;~n", [N,Type]) end, A; decode_arg(N,#type{base=bool,single=true,name=Type},Arg,A0) -> - case Arg of + case Arg of arg -> w(" bool * ~s = (~s *) bp; bp += 4;~n", [N,Type]); opt -> w(" ~s = *(~s *) bp; bp += 4;~n", [N,Type]) end, align(A0,32); decode_arg(N,#type{base={enum,Type},single=true},Arg,A0) -> - wa(" ~s ", [enum_type(Type)], "~s = *(~s *) bp; bp += 4;;~n",[N, enum_type(Type)], Arg), + wa(" ~s ", [enum_type(Type)], "~s = *(~s *) bp; bp += 4;;~n",[N, enum_type(Type)], Arg), align(A0,32); decode_arg(N,#type{base={comp,"wxDateTime",List},single=true,name=Type,ref=Ref},Arg,A0) -> - Decl = fun({int,Spec}) -> + Decl = fun({int,Spec}) -> w(" int * ~s~s = (int *) bp; bp += 4;~n", [N,Spec]) end, align(A0,32), @@ -452,15 +491,15 @@ decode_arg(N,#type{base={comp,"wxDateTime",List},single=true,name=Type,ref=Ref}, end, case Arg of arg -> w(" ~s ~s = ~s(~s);~n", [Type,N,Type,args(Name, ",", List)]); - opt when Ref =:= {pointer,1} -> - w(" ~sTmp = ~s(~s); ~s = & ~sTmp;~n", + opt when Ref =:= {pointer,1} -> + w(" ~sTmp = ~s(~s); ~s = & ~sTmp;~n", [N,Type,args(Name, ",", List), N,N]); opt -> w(" ~s = ~s(~s);~n", [N,Type,args(Name, ",", List)]) end, (A0+length(List)) rem 2; decode_arg(N,#type{base={comp,_,List},single=true,name=Type,ref=Ref},Arg,A0) -> - Decl = fun({int,Spec}) -> + Decl = fun({int,Spec}) -> w(" int * ~s~s = (int *) bp; bp += 4;~n", [N,Spec]); ({double, Spec}) -> w(" wxDouble * ~s~s = (wxDouble *) bp; bp += 8;~n", [N,Spec]) @@ -473,8 +512,8 @@ decode_arg(N,#type{base={comp,_,List},single=true,name=Type,ref=Ref},Arg,A0) -> Name = fun({_,Spec}) -> "*"++N++Spec end, case Arg of arg -> w(" ~s ~s = ~s(~s);~n", [Type,N,Type,args(Name, ",", List)]); - opt when Ref =:= {pointer,1} -> - w(" ~sTmp = ~s(~s); ~s = & ~sTmp;~n", + opt when Ref =:= {pointer,1} -> + w(" ~sTmp = ~s(~s); ~s = & ~sTmp;~n", [N,Type,args(Name, ",", List), N,N]); opt -> w(" ~s = ~s(~s);~n", [N,Type,args(Name, ",", List)]) @@ -483,7 +522,7 @@ decode_arg(N,#type{base={comp,_,List},single=true,name=Type,ref=Ref},Arg,A0) -> {int, _} -> (A0+length(List)) rem 2; {double, _} -> 0 end; - + decode_arg(N,#type{name=Class="wxTreeItemId",single=true},Arg,A0) -> A = align(A0,64), wa(" ~s ",[Class],"~s = wxTreeItemId((void *) *(wxUint64 *) bp); bp += 8;~n",[N],Arg), @@ -492,7 +531,7 @@ decode_arg(N,#type{name=Class="wxTreeItemIdValue",single=true},Arg,A0) -> A = align(A0,64), wa(" ~s ",[Class],"~s = (~s) * (wxUint64 *) bp; bp += 8;~n",[N,Class],Arg), A; -decode_arg(N,#type{name="wxChar", single=S},Arg,A0) +decode_arg(N,#type{name="wxChar", single=S},Arg,A0) when S =/= true -> w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), wa(" wxString", []," ~s = wxString(bp, wxConvUTF8);~n", [N],Arg), @@ -501,7 +540,7 @@ decode_arg(N,#type{name="wxChar", single=S},Arg,A0) decode_arg(N,#type{base=string, name="wxFileName"},Arg,A0) -> w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), wa(" wxString", []," ~sStr = wxString(bp, wxConvUTF8);~n", [N],Arg), - w(" bp += *~sLen+((8-((~p+ *~sLen) & 7)) & 7);~n", [N,4*((A0+1) rem 2),N]), + w(" bp += *~sLen+((8-((~p+ *~sLen) & 7)) & 7);~n", [N,4*((A0+1) rem 2),N]), w(" wxFileName ~s = wxFileName(~sStr);~n",[N,N]), 0; decode_arg(N,#type{base=string},Arg,A0) -> @@ -541,7 +580,7 @@ decode_arg(N,#type{name="wxArrayDouble"},arg,A0) -> decode_arg(_N,#type{base=eventType},_Arg,A0) -> %% w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), %% case Arg of -%% arg -> +%% arg -> %% w(" int ~s = wxeEventTypeFromAtom(bp);bp += *~sLen;~n",[N,N]), %% w(" char *class_name = bp;~n", []), %% w(" wxeCallbackData * Evt_cb = new wxeCallbackData(Ecmd.caller,This,class_name);~n", @@ -551,7 +590,7 @@ decode_arg(_N,#type{base=eventType},_Arg,A0) -> decode_arg(N,#type{name=Type,base=binary,mod=Mod0},Arg,A0) -> Mod = mods([M || M <- Mod0]), case Arg of - arg -> + arg -> w(" ~s~s * ~s = (~s~s*) Ecmd.bin[~p]->base;~n", [Mod,Type,N,Mod,Type, next_id(bin_count)]); opt -> @@ -564,10 +603,10 @@ decode_arg(N,#type{base={term,"wxTreeItemData"},mod=Mod0},Arg,A0) -> Type = "wxETreeItemData", BinCnt = next_id(bin_count), case Arg of - arg -> + arg -> w(" ~s~s * ~s = new ~s(Ecmd.bin[~p]->size, Ecmd.bin[~p]->base);~n", [Mod,Type,N,Type,BinCnt,BinCnt]); - opt -> + opt -> w(" ~s = new ~s(Ecmd.bin[~p]->size, Ecmd.bin[~p]->base);~n", [N,Type,BinCnt,BinCnt]) end, @@ -576,10 +615,10 @@ decode_arg(N,#type{name=Type,base={term,_},mod=Mod0},Arg,A0) -> Mod = mods([M || M <- Mod0]), BinCnt = next_id(bin_count), case Arg of - arg -> + arg -> w(" ~s~s * ~s = new ~s(Ecmd.bin[~p]);~n", [Mod,Type,N,Type,BinCnt]); - opt -> + opt -> w(" ~s = new ~s(Ecmd.bin[~p]);~n", [N,Type,BinCnt]) end, @@ -588,17 +627,17 @@ decode_arg(N,#type{single=array,base=int},Arg,A0) -> case Arg of arg -> w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), - w(" int * ~s = (int *) bp; bp += *~sLen*4+((~p+ *~sLen)%2 )*4;~n", + w(" int * ~s = (int *) bp; bp += *~sLen*4+((~p+ *~sLen)%2 )*4;~n", [N,N,(A0+1) rem 2,N]); - opt -> + opt -> w(" ~sLen = (int *) bp; bp += 4;~n", [N]), - w(" ~s = (int *) bp; bp += *~sLen*4+((~p+ *~sLen)%2 )*4;~n", + w(" ~s = (int *) bp; bp += *~sLen*4+((~p+ *~sLen)%2 )*4;~n", [N,N,(A0+1) rem 2,N]) end, 0; decode_arg(N,#type{by_val=true,single=array,base={comp,Class="wxPoint",_}},arg,A0) -> - w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), - w(" ~s *~s;~n",[Class,N]), + w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), + w(" ~s *~s;~n",[Class,N]), w(" ~s = (~s *) driver_alloc(sizeof(~s) * *~sLen);~n",[N,Class,Class,N]), store_free(N), w(" for(int i=0; i < *~sLen; i++) {~n", [N]), @@ -623,19 +662,29 @@ decode_arg(N,#type{name=Type,single=list,base={class,Class}},arg,A0) -> w(" ~s.Append(*(~s *) getPtr(bp,memenv)); bp += 4;}~n", [N,Class]), w(" bp += ((~p+ *~sLen)%2 )*4;~n", [A,N]), 0; +decode_arg(N,#type{single=array,base={comp,Class="wxPoint2DDouble",_}},arg,A0) -> + w(" int * ~sLen = (int *) bp; bp += 4;~n", [N]), + w(" ~s *~s;~n",[Class,N]), + w(" ~s = (~s *) driver_alloc(sizeof(~s) * *~sLen);~n",[N,Class,Class,N]), + store_free(N), + align(A0+1,64), + w(" for(int i=0; i < *~sLen; i++) {~n", [N]), + w(" double x = * (double *) bp; bp += 8;~n double y = * (double *) bp; bp += 8;~n", []), + w(" ~s[i] = wxPoint2DDouble(x,y);}~n", [N]), + 0; decode_arg(Name,T, Arg,_A) -> ?error({unhandled_type, {Name,T, Arg}}). align(0, 32) -> 1; align(1, 32) -> 0; align(0, 64) -> 0; -align(1, 64) -> +align(1, 64) -> w(" bp += 4; /* Align */~n"), 0; align(N,Sz) -> align(N rem 2, Sz). -call_wx(_N,{constructor,_},#type{base={class,RClass}},Ps) -> +call_wx(_N,{constructor,_},#type{base={class,RClass}},Ps) -> #class{id=Id} = ClassDef = get({class,RClass}), Class = case is_derived(ClassDef) of true -> "E" ++ RClass; @@ -648,8 +697,8 @@ call_wx(_N,{constructor,_},#type{base={class,RClass}},Ps) -> case is_dialog(RClass) of true -> 2; %% Dialogs must be closed first event before windows false -> 0 - end; - false -> + end; + false -> case hd(reverse(wx_gen_erl:parents(RClass))) of root -> Id; _ -> 1 @@ -682,10 +731,10 @@ call_wx(N,{static,Class},Type,Ps) -> return_res(void) -> {"", ""}; return_res(Type = #type{mod=Mod}) -> case lists:member(const, Mod) of - true -> - {Beg, End} = return_res1(Type), + true -> + {Beg, End} = return_res1(Type), {"const " ++ Beg, End}; - _ -> + _ -> return_res1(Type) end. @@ -695,8 +744,8 @@ return_res1(#type{name=Type,ref={pointer,_}}) -> {Type ++ " * Result = (" ++ Type ++ "*)", ""}; return_res1(#type{name=Type,single=true,ref=reference}) -> {Type ++ " * Result = &", ""}; -return_res1(#type{name=Type,single=true,by_val=true}) - when is_atom(Type) -> +return_res1(#type{name=Type,single=true,by_val=true}) + when is_atom(Type) -> {atom_to_list(Type) ++ " Result = ", ""}; return_res1(#type{name=Type="wxArrayInt"}) -> {Type ++ " Result = ", ""}; @@ -705,19 +754,19 @@ return_res1(#type{name=Type,base={class,_},single=list,ref=reference}) -> return_res1(#type{name=Type,base={comp,_,_},single=array,by_val=true}) -> {Type ++ " Result = ", ""}; return_res1(#type{name=Type,single=true,by_val=true, base={class, _}}) -> - %% Memory leak !!!!!! XXXX BUGBUG FIXME or doument!! - case Type of + %% Memory leak !!!!!! XXXX BUGBUG FIXME or doument!! + case Type of "wxImage" -> ok; "wxFont" -> ok; "wxBitmap" -> ok; "wxIcon" -> ok; "wxGraphics" ++ _ -> ok; _ -> - io:format("~s::~s Building return value of temp ~s~n", + io:format("~s::~s Building return value of temp ~s~n", [get(current_class),get(current_func),Type]) end, %% #class{id=Id} = get({class,Type}), - {Type ++ " * Result = new " ++ Type ++ "(", "); newPtr((void *) Result," + {Type ++ " * Result = new " ++ Type ++ "(", "); newPtr((void *) Result," ++ "3, memenv);"}; return_res1(#type{base={enum,_Type},single=true,by_val=true}) -> {"int Result = " , ""}; @@ -730,7 +779,7 @@ return_res1(#type{name=Type,single=true,by_val=true}) -> filter(Ps) -> lists:filter(fun filter_arg/1, Ps). -filter_arg(#param{where=erl}) -> false; +filter_arg(#param{where=erl}) -> false; filter_arg(#param{where=this}) -> false; filter_arg(#param{}) -> true. %%filter_arg(#param{def=Def, in=In}) -> Def =:= none orelse In =:= false. @@ -739,20 +788,20 @@ filter_arg(#param{}) -> true. call_arg(#param{where=c, alt={length,Alt}}) when is_list(Alt) -> "*" ++ Alt ++ "Len"; call_arg(#param{where=c, alt={size,Id}}) when is_integer(Id) -> - %% It's a binary + %% It's a binary "Ecmd.bin["++ integer_to_list(Id) ++ "]->size"; -call_arg(#param{name=N,def=Def,type=#type{name=Type,by_val=true,single=true,base=Base}}) - when Base =:= int; Base =:= long; Base =:= float; Base =:= double; Base =:= bool -> +call_arg(#param{name=N,def=Def,type=#type{name=Type,by_val=true,single=true,base=Base}}) + when Base =:= int; Base =:= long; Base =:= float; Base =:= double; Base =:= bool -> case Def of none -> "(" ++ to_string(Type) ++ ") *" ++ N; _ -> N end; -call_arg(#param{name=N,type=#type{base={enum,Type}, by_val=true,single=true}}) -> +call_arg(#param{name=N,type=#type{base={enum,Type}, by_val=true,single=true}}) -> "(" ++ enum_type(Type) ++") " ++ N; call_arg(#param{name=N,type=#type{base={class,_},by_val=true,single=true}}) -> "*" ++ N; call_arg(#param{name=N,type=#type{base={class,_},ref=reference,single=true}}) -> "*" ++ N; -call_arg(#param{name=N,type=#type{base=eventType}}) -> +call_arg(#param{name=N,type=#type{base=eventType}}) -> N ++ ", (wxObjectEventFunction)(wxEventFunction) &WxeApp::handle_evt, Evt_cb, this"; call_arg(#param{name=N,type=#type{by_val=true, single=_False}}) -> N; call_arg(#param{name=N,def=Def,type=#type{by_val=false, ref={pointer,2}}}) @@ -760,20 +809,21 @@ call_arg(#param{name=N,def=Def,type=#type{by_val=false, ref={pointer,2}}}) call_arg(#param{name=N,type=#type{by_val=false, ref={pointer,2}}}) -> "&" ++ N; call_arg(#param{name=N,in=false,type=#type{ref=reference, single=true}}) -> N; call_arg(#param{name=N,in=false,type=#type{by_val=false, single=true}}) -> "&" ++ N; -call_arg(#param{name=N,def=Def,type=#type{base={comp,_,_},ref={pointer,1},single=true}}) +call_arg(#param{name=N,def=Def,type=#type{base={comp,_,_},ref={pointer,1},single=true}}) when Def =:= none -> "&" ++N; call_arg(#param{name=N,type=#type{by_val=false}}) -> N; call_arg(#param{name=N,type={merged,_,#type{base={class,_},single=true, by_val=ByVal, - ref=Ref},_,_,_,_}}) - when ByVal =:= true; Ref =:= reference -> + ref=Ref},_,_,_,_}}) + when ByVal =:= true; Ref =:= reference -> "*" ++ N; -call_arg(#param{def=Def, type=void}) when Def =/= none -> Def; +call_arg(#param{def=Def, type=void}) when Def =/= none -> Def; +call_arg(#param{def=Def, type=voidp}) when Def =/= none -> Def; call_arg(#param{name=N,type=#type{base={ref,_},by_val=true,single=true}}) -> N; call_arg(#param{name=N,type={merged,_,_,_,_,_,_}}) -> N. -%% call_arg(#param{name=N,type=#type{base=Tuple,ref=reference}}) +%% call_arg(#param{name=N,type=#type{base=Tuple,ref=reference}}) %% when is_tuple(Tuple) -> "&" ++ N; to_string(Type) when is_atom(Type) -> atom_to_list(Type); @@ -781,19 +831,19 @@ to_string(Type) when is_list(Type) -> Type. virtual_dest(#class{abstract=true, parent="root"}) -> false; virtual_dest(#class{abstract=true, parent="object"}) -> true; -virtual_dest(#class{abstract=true, parent=Parent}) -> +virtual_dest(#class{abstract=true, parent=Parent}) -> virtual_dest(get({class,Parent})); virtual_dest(#class{methods=Ms, parent=Parent}) -> case lists:keysearch(destructor,#method.method_type, lists:append(Ms)) of {value, #method{method_type=destructor, virtual=Virtual}} -> case Virtual of - undefined -> + undefined -> case get({class,Parent}) of - undefined -> + undefined -> case Parent of - "object" -> + "object" -> true; - "root" -> + "root" -> false; _ -> io:format("Error: ~p~n",[Parent]), @@ -802,10 +852,10 @@ virtual_dest(#class{methods=Ms, parent=Parent}) -> PClass -> virtual_dest(PClass) end; - _ -> + _ -> Virtual end; - false -> + false -> false end. @@ -819,24 +869,24 @@ is_derived(#class{abstract=true}) -> false; is_derived(C = #class{}) -> virtual_dest(C). is_window(Class) -> - lists:member("wxWindow", wx_gen_erl:parents(Class)). + lists:member("wxWindow", wx_gen_erl:parents(Class)). is_dialog(Class) -> lists:member("wxDialog", wx_gen_erl:parents(Class)). - + build_return_vals(Type,Ps) -> HaveType = case Type of void -> 0; _ -> 1 end, NoOut = lists:sum([1 || #param{in=In} <- Ps, In =/= true]) + HaveType, OutTupSz = if NoOut > 1 -> NoOut; true -> 0 end, - + build_ret_types(Type,Ps), - if + if OutTupSz > 1 -> w(" rt.addTupleCount(~p);~n",[OutTupSz]); true -> ignore - end, + end, Ps. -build_ret_types(void,Ps) -> +build_ret_types(void,Ps) -> Calc = fun(#param{name=N,in=False,type=T}, Free) when False =/= true -> case build_ret(N, False, T) of ok -> Free; @@ -845,7 +895,7 @@ build_ret_types(void,Ps) -> (_, Free) -> Free end, lists:foldl(Calc, [], Ps); -build_ret_types(Type,Ps) -> +build_ret_types(Type,Ps) -> Free = case build_ret("Result", out, Type) of ok -> []; FreeStr -> [FreeStr] @@ -854,8 +904,8 @@ build_ret_types(Type,Ps) -> case build_ret(N, False, T) of ok -> FreeAcc; FreeMe -> [FreeMe|FreeAcc] - end; - (_, FreeAcc) -> FreeAcc + end; + (_, FreeAcc) -> FreeAcc end, lists:foldl(Calc, Free, Ps). @@ -895,20 +945,22 @@ build_ret(Name,_,#type{base=int,single=true,mod=M}) -> end; build_ret(Name,_,#type{name="wxArrayInt"}) -> w(" rt.add(~s);~n", [Name]); +build_ret(Name,_,#type{name="wxArrayDouble"}) -> + w(" rt.add(~s);~n", [Name]); build_ret(Name,_,#type{base={comp,_,_},single=array}) -> w(" for(unsigned int i=0; i < ~s.GetCount(); i++) {~n", [Name]), w(" rt.add(~s[i]);~n }~n",[Name]), - w(" rt.endList(~s.GetCount());~n",[Name]); + w(" rt.endList(~s.GetCount());~n",[Name]); build_ret(Name,_,#type{name=List,single=list,base={class,Class}}) -> w(" int i=0;~n"), w(" for(~s::const_iterator it = ~s.begin(); it != ~s.end(); ++it) {~n", [List, Name, Name]), w(" ~s * ~sTmp = *it;~n", [Class,Name]), w(" rt.addRef(getRef((void *)~sTmp,memenv), \"~s\"); i++;}~n",[Name,Class]), - w(" rt.endList(~s.GetCount());~n",[Name]); - + w(" rt.endList(~s.GetCount());~n",[Name]); + build_ret(Name,_,#type{name="wxArrayTreeItemIds"}) -> - w(" for(unsigned int i=0; i < ~s.GetCount(); i++) {~n", [Name]), + w(" for(unsigned int i=0; i < ~s.GetCount(); i++) {~n", [Name]), w(" rt.add((wxUIntPtr *)~s[i].m_pItem);}~n",[Name]), w(" rt.endList(~s.GetCount());~n",[Name]); @@ -923,10 +975,10 @@ build_ret(Name,_,#type{name="wxArrayString", single=array}) -> w(" rt.add(~s);~n", [Name]); build_ret(Name,In,T) -> ?error({nyi, Name,In, T}). - + mods([const|R]) -> "const " ++ mods(R); mods([unsigned|R]) -> "unsigned " ++ mods(R); -mods([]) -> "". +mods([]) -> "". build_enums() -> Tree = get(consts), @@ -935,13 +987,13 @@ build_enums() -> w("#include \"../wxe_impl.h\"~n"), w("#include \"wxe_macros.h\"~n"), w("#include \"../wxe_return.h\"~n"), - w("void WxeApp::init_nonconsts(wxeMemEnv *memenv, ErlDrvTermData caller) {~n"), + w("void WxeApp::init_nonconsts(wxeMemEnv *memenv, ErlDrvTermData caller) {~n"), NotConsts = [NC || NC = #const{is_const=false} <- gb_trees:values(Tree)], Size = length(NotConsts), GVars = get(gvars), GSize = length(GVars), w(" wxeReturn rt = wxeReturn(WXE_DRV_PORT, caller);~n"), - w(" rt.addAtom((char*)\"wx_consts\");~n"), + w(" rt.addAtom((char*)\"wx_consts\");~n"), [build_enum(NConst) || NConst <- lists:keysort(#const.val, NotConsts)], _Cnt = foldl(fun(Gvar, I) -> build_gvar(Gvar,I) end, 0, lists:sort(GVars)), w(" rt.endList(~p);~n", [Size+GSize]), @@ -968,9 +1020,9 @@ build_gvar({Name, Class, _Id}, Cnt) -> Cnt+1. gen_macros() -> - w("#include <wx/caret.h>~n"), %% Arrg wxw forgot?? some files - w("#include <wx/tooltip.h>~n"), - w("#include <wx/gbsizer.h>~n"), + w("#include <wx/caret.h>~n"), %% Arrg wxw forgot?? some files + w("#include <wx/tooltip.h>~n"), + w("#include <wx/gbsizer.h>~n"), w("#include <wx/splash.h>~n"), w("#include <wx/grid.h>~n"), w("#include <wx/image.h>~n"), @@ -995,31 +1047,33 @@ gen_macros() -> w("#include <wx/stc/stc.h>~n"), w("#include <wx/minifram.h>~n"), w("#include <wx/sashwin.h>~n"), - w("#include <wx/laywin.h>~n"), - w("#include <wx/graphics.h>~n"), - w("#include <wx/aui/aui.h>~n"), - w("#include <wx/datectrl.h>~n"), - w("#include <wx/filepicker.h>~n"), - w("#include <wx/fontpicker.h>~n"), - w("#include <wx/clrpicker.h>~n"), - w("#include <wx/statline.h>~n"), - w("#include <wx/clipbrd.h>~n"), + w("#include <wx/laywin.h>~n"), + w("#include <wx/graphics.h>~n"), + w("#include <wx/aui/aui.h>~n"), + w("#include <wx/datectrl.h>~n"), + w("#include <wx/filepicker.h>~n"), + w("#include <wx/fontpicker.h>~n"), + w("#include <wx/clrpicker.h>~n"), + w("#include <wx/statline.h>~n"), + w("#include <wx/clipbrd.h>~n"), w("#include <wx/splitter.h>~n"), w("#include <wx/choicebk.h>~n"), w("#include <wx/toolbook.h>~n"), w("#include <wx/listbook.h>~n"), w("#include <wx/treebook.h>~n"), + w("#include <wx/taskbar.h>~n"), w("#include <wx/html/htmlwin.h>~n"), w("#include <wx/html/htmlcell.h>~n"), w("#include <wx/filename.h>~n"), - + w("#include <wx/sysopt.h>~n"), + w("~n~n", []), w("#ifndef wxICON_DEFAULT_BITMAP_TYPE~n",[]), w(" #define wxICON_DEFAULT_BITMAP_TYPE wxBITMAP_TYPE_ICO_RESOURCE~n",[]), w("#endif~n", []), w("~n~n", []), - [w("#define ~s_~s ~p~n", [Class,Name,Id]) || + [w("#define ~s_~s ~p~n", [Class,Name,Id]) || {Class,Name,_,Id} <- wx_gen_erl:get_unique_names()], w("~n~n"). @@ -1032,29 +1086,29 @@ build_events() -> w("#include \"wxe_macros.h\"~n"), w("#include \"../wxe_events.h\"~n~n"), w("#include \"../wxe_return.h\"~n~n"), - + w("wxeEtype::wxeEtype(const char *name, int Id) {eName = name;cID = Id;}~n~n"), w("WX_DECLARE_HASH_MAP(int, wxeEtype*, wxIntegerHash, wxIntegerEqual, wxeETmap );~n~n"), - + w("wxeETmap etmap;~n~n"), - + w( "int wxeEventTypeFromAtom(char *etype_atom) { wxeETmap::iterator it; for(it = etmap.begin(); it != etmap.end(); ++it) { wxeEtype * value = it->second; - if(strcmp(value->eName, etype_atom) == 0) { - if(it->first > wxEVT_USER_FIRST) { + if(strcmp(value->eName, etype_atom) == 0) { + if(it->first > wxEVT_USER_FIRST) { return it->first - wxEVT_USER_FIRST; } else { return it->first; } } - } - return -1; + } + return -1; } -"), +"), Evs0 = [C || {_,C=#class{event=Evs}} <- get(), Evs =/= false], Evs = lists:keysort(#class.id, Evs0), @@ -1067,7 +1121,7 @@ initEventTable(Evs) -> w(" struct { ",[]), w("int ev_type; int class_id; const char * ev_name;} event_types[] =~n {~n",[]), - lists:foreach(fun(Ev) -> init_event_classes(Ev) end, + lists:foreach(fun(Ev) -> init_event_classes(Ev) end, [#class{id=0,event=[wxEVT_NULL]}|Evs]), w(" {-1, 0, ""}~n };~n",[]), w(" for(int i=0; event_types[i].ev_type != -1; i++) {~n",[]), @@ -1085,7 +1139,7 @@ initEventTable(Evs) -> " }~n" " }~n", []), w("}~n~n"). - + init_event_classes(#class{event=ETs, id=Id}) -> F = fun({Eev, Cev, OtherClass}) -> w(" {~w + wxEVT_USER_FIRST, ~w, ~p},~n", @@ -1105,7 +1159,7 @@ find_id(OtherClass) -> Class = get({class,atom_to_list(OtherClass)}), %%{value, Class} = lists:keysearch(atom_to_list(OtherClass), #class.name, All), Class#class.id. - + encode_events(Evs) -> ?WTC("encode_events"), w("void wxeEvtListener::forward(wxEvent& event)~n" @@ -1132,7 +1186,7 @@ encode_events(Evs) -> " wxeMemEnv *memenv = app->getMemEnv(port);~n" " if(!memenv) return 0;~n~n" " wxeReturn rt = wxeReturn(port, cb->listener);~n"), - + w("~n rt.addAtom((char*)\"wx\");~n" " rt.addInt((int) event->GetId());~n" " rt.addRef(getRef((void *)(cb->obj), memenv), cb->class_name);~n" @@ -1155,15 +1209,15 @@ encode_events(Evs) -> w(" app->clearPtr((void *) event);~n"), w(" } else {~n"), w(" send_res = rt.send();~n"), - w(" if(cb->skip) event->Skip();~n"), + w(" if(cb->skip) event->Skip();~n"), w(" };~n"), w(" return send_res;~n"), w(" }~n"). encode_event(C = #class{name=Class, id=Id, options=Opts}) -> ?WTC("encode_event"), - case proplists:get_value("mixed_event", Opts) of - undefined -> + case proplists:get_value("mixed_event", Opts) of + undefined -> w("case ~p: {// ~s~n", [Id,Class]), encode_event2(C), ok; @@ -1189,10 +1243,10 @@ encode_event2(Class = #class{name=Name}) -> build_event_attrs(ClassRec = #class{name=Class}) -> Attrs0 = wx_gen_erl:filter_attrs(ClassRec), - Rename = - fun(Att = #param{name=Name,prot=public,acc=undefined}, {All,Use}) -> + Rename = + fun(Att = #param{name=Name,prot=public,acc=undefined}, {All,Use}) -> {[Att#param{name= "ev->" ++ Name}|All],Use}; - (Att = #param{acc=Acc}, {All,_}) -> + (Att = #param{acc=Acc}, {All,_}) -> {[Att#param{name= "ev->" ++ Acc}|All], true} end, case foldr(Rename,{[],false},Attrs0) of @@ -1202,9 +1256,9 @@ build_event_attrs(ClassRec = #class{name=Class}) -> %% Attrs; {Attrs,_} -> w(" ~s * ev = (~s *) event;~n",[Class,Class]), - FixClass = + FixClass = fun(P=#param{name=N,acc=Acc,type=#type{single=Single,by_val=ByVal, - base={class,C}}}) + base={class,C}}}) when Acc =/= undefined -> Var = var_name(N), if Single, ByVal -> @@ -1215,17 +1269,17 @@ build_event_attrs(ClassRec = #class{name=Class}) -> end, P#param{name=Var}; (P) -> P - end, + end, lists:map(FixClass, Attrs) end. -var_name("ev->" ++ Name0) -> +var_name("ev->" ++ Name0) -> case reverse(Name0) of ")(" ++ Name -> reverse(Name); _ -> Name0 end; var_name(Name) -> Name. - + enum_name({Class,Type}) -> uppercase_all(Class ++ "_" ++ Type); enum_name(Type) -> diff --git a/lib/wx/api_gen/wx_gen_erl.erl b/lib/wx/api_gen/wx_gen_erl.erl index e1201ab0d4..aac57586bc 100644 --- a/lib/wx/api_gen/wx_gen_erl.erl +++ b/lib/wx/api_gen/wx_gen_erl.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -19,7 +19,7 @@ %%%------------------------------------------------------------------- %%% File : wx_gen_erl.erl %%% Author : Dan Gudmundsson <[email protected]> -%%% Description : +%%% Description : %%% %%% Created : 25 Jan 2007 by Dan Gudmundsson <[email protected]> %%%------------------------------------------------------------------- @@ -28,12 +28,16 @@ -include("wx_gen.hrl"). --compile(export_all). +%%-compile(export_all). +-export([gen/1]). +-export([parents/1, get_unique_names/0, get_unique_name/1, + event_type_name/1, event_rec_name/1, filter_attrs/1]). --import(lists, [foldl/3,foldr/3,reverse/1, keysearch/3, map/2, filter/2]). --import(gen_util, [lowercase/1, lowercase_all/1, uppercase/1, uppercase_all/1, - open_write/1, close/0, erl_copyright/0, w/2, - args/3, args/4, strip_name/2]). + +-import(lists, [foldl/3,reverse/1, filter/2]). +-import(gen_util, [lowercase/1, lowercase_all/1, uppercase/1, + open_write/1, close/0, erl_copyright/0, w/2, + args/3, args/4]). gen(Defs) -> [put({class,N},C) || C=#class{name=N} <- Defs], @@ -42,9 +46,9 @@ gen(Defs) -> gen_enums_ints(), [gen_class(Class) || Class <- Defs], gen_funcnames(). - + gen_class(Class) -> - try + try gen_class1(Class) catch throw:skipped -> Class @@ -52,10 +56,10 @@ gen_class(Class) -> gen_class1(C=#class{name=Name,parent="static",methods=Ms,options=_Opts}) -> open_write("../src/gen/wx_misc.erl"), - put(current_class, Name), + put(current_class, Name), erl_copyright(), w("", []), - w("%% This file is generated DO NOT EDIT~n~n", []), + w("%% This file is generated DO NOT EDIT~n~n", []), w("%% @doc See external documentation: " "<a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html\">Misc</a>.\n\n",[]), @@ -67,8 +71,8 @@ gen_class1(C=#class{name=Name,parent="static",methods=Ms,options=_Opts}) -> Exp = fun(M) -> gen_export(C,M) end, ExportList = lists:usort(lists:append(lists:map(Exp,reverse(Ms)))), w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", ExportList, 60)]), - - + + Gen = fun(M) -> gen_method(Name,M) end, NewMs = lists:map(Gen,reverse(Ms)), close(), @@ -79,13 +83,13 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> case Opts of ["ignore"] -> throw(skipped); _ -> ok - end, + end, open_write("../src/gen/"++Name++".erl"), - put(current_class, Name), + put(current_class, Name), erl_copyright(), w("", []), - w("%% This file is generated DO NOT EDIT~n~n", []), - + w("%% This file is generated DO NOT EDIT~n~n", []), + case lists:member(taylormade, Opts) of true -> {ok, Bin} = file:read_file(filename:join([wx_extra, Name++".erl"])), @@ -95,41 +99,39 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> w("%% @doc See external documentation: " "<a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html\">~s</a>.\n", [lowercase_all(Name), Name]), - + case C#class.doc of undefined -> ignore; Str -> w("%%~n%% ~s~n~n%%~n", [Str]) end, - + case C#class.event of false -> ignore; Evs -> EvTypes = [event_type_name(Ev) || Ev <- Evs], EvStr = args(fun(Ev) -> "<em>"++Ev++"</em>" end, ", ", EvTypes), - + w("%% <dl><dt>Use {@link wxEvtHandler:connect/3.} with EventType:</dt>~n",[]), w("%% <dd>~s</dd></dl>~n", [EvStr]), - w("%% See also the message variant {@link wxEvtHandler:~s(). #~s{}} event record type.~n", + w("%% See also the message variant {@link wxEvtHandler:~s(). #~s{}} event record type.~n", [event_rec_name(Name),event_rec_name(Name)]), w("%%~n",[]), ok end, - + Parents = parents(Parent), case [P || P <- Parents, P =/= root, P =/= object] of [] -> ignore; - Ps -> + Ps -> w("%% <p>This class is derived (and can use functions) from:~n", []), [w("%% <br />{@link ~s}~n", [P]) || P <- Ps], - w("%% </p>~n",[]) + w("%% </p>~n",[]) end, w("%% @type ~s(). An object reference, The representation is internal~n",[Name]), w("%% and can be changed without notice. It can't be used for comparsion~n", []), w("%% stored on disc or distributed for use on other nodes.~n~n", []), w("-module(~s).~n", [Name]), w("-include(\"wxe.hrl\").~n",[]), - %% w("-compile(export_all).~n~n", []), %% XXXX remove ??? - %% w("-compile(nowarn_unused_vars).~n~n", []), %% XXXX remove ??? Exp = fun(M) -> gen_export(C,M) end, ExportList = lists:usort(lists:append(lists:map(Exp,reverse(Ms)))), w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", ExportList, 60)]), @@ -137,17 +139,17 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> Done0 = ["Destroy", "New", "Create", "destroy", "new", "create"], Done = gb_sets:from_list(Done0 ++ [M|| #method{name=M} <- lists:append(Ms)]), {_, InExported} = gen_inherited(Parents, Done, []), - w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", - lists:usort(["parent_class/1"|InExported]), + w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", + lists:usort(["parent_class/1"|InExported]), 60)]), - + w("-export_type([~s/0]).~n", [Name]), w("%% @hidden~n", []), parents_check(Parents), - + w("-type ~s() :: wx:wx_object().~n", [Name]), Gen = fun(M) -> gen_method(Name,M) end, NewMs = lists:map(Gen,reverse(Ms)), - gen_dest(C, Ms), - + gen_dest(C, Ms), + gen_inherited(Parents, Done, true) end, @@ -203,26 +205,26 @@ gen_export(#class{name=Class,abstract=Abs},Ms0) -> [] -> []; [M=#method{where=taylormade}|_] -> [taylormade_export(Class, M)]; - Ms -> + Ms -> GetF = fun(#method{method_type=constructor,where=W,params=Ps}) -> {Args,Opts} = split_optional(Ps), - OptLen = case Opts of - [] -> 0; + OptLen = case Opts of + [] -> 0; _ when W =:= erl_no_opt -> 0; - _ -> 1 + _ -> 1 end, "new/" ++ integer_to_list(length(Args)+OptLen); (#method{method_type=destructor}) -> - case Abs of - true -> []; + case Abs of + true -> []; _ -> "destroy/1" end; (#method{name=N,alias=A,where=W, params=Ps}) -> {Args,Opts} = split_optional(Ps), - OptLen = case Opts of - [] -> 0; + OptLen = case Opts of + [] -> 0; _ when W =:= erl_no_opt -> 0; - _ -> 1 + _ -> 1 end, erl_func_name(N,A) ++ "/" ++ integer_to_list(length(Args) + OptLen) end, @@ -235,10 +237,10 @@ gen_method(Class,Ms0) -> Res = filter(RemoveC, Ms0), case Res of [] -> Ms0; - [M=#method{where=taylormade}|_] -> - taylormade_func(Class, M), + [#method{where=taylormade}|_] -> + taylormade_func(Class, Res), Ms0; - Ms -> + Ms -> gen_doc(Class,Ms), gen_method1(Ms), Ms0 @@ -279,22 +281,22 @@ gen_method2(M=#method{name=N,alias=A,params=Ps,type=T,method_type=MT,id=MethodId ignore -> skip; _ -> w(" _Result =", []) end, - + case have_return_vals(T, Ps) of _ when MT =:= constructor -> w(" wxe_util:construct(~s,~n <<~s~s>>)", [MId, MArgs,MOpts]); true -> w(" wxe_util:call(~s,~n <<~s~s>>)", [MId, MArgs,MOpts]); - false -> + false -> w(" wxe_util:cast(~s,~n <<~s~s>>)", [MId, MArgs,MOpts]) end, case gen_util:get_hook(erl, M#method.post_hook) of ignore -> skip; - Post -> + Post -> w(",~n ~s~n", [Post]), w(" _Result", []) end, - + erase(current_func), M. @@ -306,9 +308,9 @@ gen_dest(#class{name=CName,abstract=Abs}, Ms) -> case lists:keysearch(destructor,#method.method_type, lists:append(Ms)) of {value, #method{method_type=destructor, id=Id}} -> case hd(reverse(parents(CName))) of - object -> + object -> gen_dest2(CName, object); - root -> + root -> gen_dest2(CName, Id) end; false -> @@ -317,10 +319,10 @@ gen_dest(#class{name=CName,abstract=Abs}, Ms) -> end. gen_dest2(Class, Id) -> - w("%% @spec (This::~s()) -> ok~n", [Class]), w("%% @doc Destroys this object, do not use object again~n", []), + w("-spec destroy(This::~s()) -> ok.~n", [Class]), w("destroy(Obj=#wx_ref{type=Type}) ->~n", []), - w(" ?CLASS(Type,~s),~n",[Class]), + w(" ?CLASS(Type,~s),~n",[Class]), case Id of object -> w(" wxe_util:destroy(?DESTROY_OBJECT,Obj),~n ok.~n", []); @@ -341,14 +343,14 @@ gen_inherited([Parent|Ps], Done0, Exported0) -> gen_inherited(Ps, gb_sets:union(Done,Done0), Exported). gen_inherited_ms([[#method{name=Name,alias=A,params=Ps0,where=W,method_type=MT}|_]|R], - Class,Skip,Done, Exported) - when W =/= merged_c -> + Class,Skip,Done, Exported) + when W =/= merged_c -> case gb_sets:is_member(Name,Skip) of false when MT =:= member, Exported =:= true -> Ps = [patch_param(P,all) || P <- Ps0], Opts = if W =:= erl_no_opt -> []; - true -> - [Opt || Opt = #param{def=Def,in=In, where=Where} <- Ps, + true -> + [Opt || Opt = #param{def=Def,in=In, where=Where} <- Ps, Def =/= none, In =/= false, Where =/= c] end, w("%% @hidden~n", []), @@ -359,10 +361,10 @@ gen_inherited_ms([[#method{name=Name,alias=A,params=Ps0,where=W,method_type=MT}| gen_inherited_ms(R,Class, Skip, gb_sets:add(Name,Done), Exported); false when MT =:= member, is_list(Exported) -> {Args,Opts} = split_optional(Ps0), - OptLen = case Opts of - [] -> 0; + OptLen = case Opts of + [] -> 0; _ when W =:= erl_no_opt -> 0; - _ -> 1 + _ -> 1 end, Export = erl_func_name(Name,A) ++ "/" ++ integer_to_list(length(Args) + OptLen), gen_inherited_ms(R,Class,Skip, gb_sets:add(Name,Done), [Export|Exported]); @@ -374,17 +376,21 @@ gen_inherited_ms([[_|Check]|R],Class,Skip, Done0,Exp) -> gen_inherited_ms([[]|R],Class,Skip,Done0,Exp) -> gen_inherited_ms(R,Class,Skip,Done0,Exp); gen_inherited_ms([], _, _Skip, Done,Exp) -> {Done,Exp}. - + %%%%%%%%%%%%%%% -taylormade_func(Class, #method{name=Name, id=Id}) -> +taylormade_func(Class, [#method{name=Name, id=Id}|_]) -> {ok, Bin} = file:read_file(filename:join([wx_extra, Class ++".erl"])), - Str0 = binary_to_list(Bin), - {match, [Str1]} = re:run(Str0, "<<"++Name++"(.*)"++Name++">>", - [dotall, {capture, all_but_first, list}]), - - w(Str1, ["?" ++ get_unique_name(Id)]), + Src = binary_to_list(Bin), + Str = case gen_util:get_taylor_made(Src, Name) of + nomatch -> + {match, [Str0]} = gen_util:get_taylor_made(Src, get_unique_name(Id)), + Str0; + {match, [Str0]} -> + Str0 + end, + w(Str, ["?" ++ get_unique_name(Id)]), ok. taylormade_export(Class, #method{name=Name}) -> @@ -398,12 +404,12 @@ taylormade_export(Class, #method{name=Name}) -> arg_type_tests([P|Ps], Mid0) -> case arg_type_test(P,"\n",Mid0) of - Mid0 -> + Mid0 -> arg_type_tests(Ps, Mid0); Mid -> %% Already checked the other args Mid end; -arg_type_tests([],Mid) -> Mid. +arg_type_tests([],Mid) -> Mid. arg_type_test(#param{where=c}, _, Acc) -> Acc; @@ -412,7 +418,7 @@ arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T},single=true},def Name = erl_arg_name(Name0), w(" ?CLASS(~sT,~s),~s", [Name,T,EOS]), Acc; -arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS,Acc) +arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS,Acc) when In =/= false -> Name = erl_arg_name(Name0), w(" [?CLASS(~sT,~s) || #wx_ref{type=~sT} <- ~s],~s", [Name,T,Name,Name,EOS]), @@ -420,35 +426,35 @@ arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS, arg_type_test(#param{name=Name0,def=none,in=In, type={merged, M1, #type{base={class,T1},single=true},Ps1, - M2, #type{base={class,T2},single=true},Ps2}}, EOS, _Acc) + M2, #type{base={class,T2},single=true},Ps2}}, EOS, _Acc) when In =/= false -> Name = erl_arg_name(Name0), Opname = Name++"OP", w(" ~s = case ?CLASS_T(~sT,~s) of~n true ->\n ", [Opname,Name,T1]), - lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, + lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, element(1,split_optional(Ps1))), w("?~s;~n",[get_unique_name(M1)]), w(" _ -> ?CLASS(~sT,~s),\n ",[Name,T2]), {Ps21,_} = split_optional(patchArgName(Ps2,Ps1)), - lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, + lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, Ps21), w("?~s\n end,~s",[get_unique_name(M2),EOS]), Opname; -arg_type_test(#param{name=Name0, type=#type{base=eventType}}, EOS, Acc) -> +arg_type_test(#param{name=Name0, type=#type{base=eventType}}, EOS, Acc) -> Name = erl_arg_name(Name0), w(" ~sBin = list_to_binary([atom_to_list(~s)|[0]]),~s", [Name,Name,EOS]), w(" ThisTypeBin = list_to_binary([atom_to_list(ThisT)|[0]]),~s", [EOS]), Acc; -arg_type_test(#param{name=Name0,def=none,type=#type{base={term,_}}}, EOS, Acc) -> +arg_type_test(#param{name=Name0,def=none,type=#type{base={term,_}}}, EOS, Acc) -> Name = erl_arg_name(Name0), w(" wxe_util:send_bin(term_to_binary(~s)),~s", [Name,EOS]), Acc; -arg_type_test(#param{name=Name0,type=#type{base=binary}},EOS,Acc) -> +arg_type_test(#param{name=Name0,type=#type{base=binary}},EOS,Acc) -> Name = erl_arg_name(Name0), w(" wxe_util:send_bin(~s),~s", [Name,EOS]), Acc; -arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},EOS,Acc) -> - if +arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},EOS,Acc) -> + if Type =:= "wxArtClient", Single =:= true -> Name = erl_arg_name(Name0), w(" ~s_UC = unicode:characters_to_binary([~s, $_, $C,0]),~s", @@ -458,11 +464,11 @@ arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},E w(" ~s_UC = unicode:characters_to_binary([~s,0]),~s", [Name,Name,EOS]); Type =:= "wxArrayString" -> Name = erl_arg_name(Name0), - w(" ~s_UCA = [unicode:characters_to_binary([~sTemp,0]) || ~s", + w(" ~s_UCA = [unicode:characters_to_binary([~sTemp,0]) || ~s", [Name,Name, EOS]), w(" ~sTemp <- ~s],~s", [Name,Name,EOS]); true -> %% Not a string - ignore + ignore end, Acc; arg_type_test(_,_,Acc) -> Acc. @@ -476,10 +482,10 @@ have_return_vals(void, Ps) -> have_return_vals(#type{}, _) -> true. gen_function_clause(Name0,MT,Ps,Optional,Variant) -> - PArg = fun(Arg) -> + PArg = fun(Arg) -> case lists:member(name_only, Variant) of true -> func_arg_name(Arg); - false -> + false -> case lists:member(name_type, Variant) of true -> Name = func_arg_name(Arg), @@ -495,17 +501,17 @@ gen_function_clause(Name0,MT,Ps,Optional,Variant) -> Args = args(PArg, ",", Ps), Name = case MT of constructor -> "new"; _ -> Name0 end, w("~s(~s",[Name,Args]), - Opts = case Optional of + Opts = case Optional of [] -> ""; empty_list when Args =:= [] -> "[]"; empty_list -> ", []"; _ when Args =:= [] -> "Options"; - _ -> ", Options" + _ -> ", Options" end, w("~s)", [Opts]), case lists:member(no_guards, Variant) of true -> ok; - false -> + false -> Guards = args(fun guard_test/1, ",", Ps), if Guards =:= [], Opts =:= "" -> w(" ->~n", []); @@ -517,10 +523,10 @@ gen_function_clause(Name0,MT,Ps,Optional,Variant) -> split_optional(Ps) -> split_optional(Ps, [], []). -split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) +split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) when Def =/= none, In =/= false, Where =/= c -> split_optional(Ps, Standard, [P|Opts]); -split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) +split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) when Def =:= none, In =/= false, Where =/= c -> split_optional(Ps, [P|Standard], Opts); split_optional([_|Ps], Standard, Opts) -> @@ -532,24 +538,24 @@ patch_param(P=#param{type=#type{base=Tuple}}, all) when is_tuple(Tuple) -> P#param{type={class,ignore}}; patch_param(P=#param{type={merged,_,_,_,_,_,_}}, _) -> P#param{type={class,ignore}}; -patch_param(P=#param{type=#type{base={class,_}}},_) -> +patch_param(P=#param{type=#type{base={class,_}}},_) -> P#param{type={class,ignore}}; -patch_param(P=#param{type=#type{base={ref,_}}},_) -> +patch_param(P=#param{type=#type{base={ref,_}}},_) -> P#param{type={class,ignore}}; patch_param(P,_) -> P. func_arg_name(#param{def=Def}) when Def =/= none -> skip; func_arg_name(#param{in=false}) -> skip; func_arg_name(#param{where=c}) -> skip; -func_arg_name(#param{name=Name}) -> +func_arg_name(#param{name=Name}) -> erl_arg_name(Name). func_arg(#param{def=Def}) when Def =/= none -> skip; func_arg(#param{in=false}) -> skip; func_arg(#param{where=c}) -> skip; -func_arg(#param{name=Name,type=#type{base=string}}) -> +func_arg(#param{name=Name,type=#type{base=string}}) -> erl_arg_name(Name); -func_arg(#param{name=Name,type=#type{name="wxArrayString"}}) -> +func_arg(#param{name=Name,type=#type{name="wxArrayString"}}) -> erl_arg_name(Name); func_arg(#param{name=Name0,type=#type{base={class,_CN}, single=true}}) -> Name = erl_arg_name(Name0), @@ -570,7 +576,7 @@ func_arg(#param{name=Name,type=#type{base={comp,"wxDateTime",_Tup}, single=true} func_arg(#param{name=Name,type=#type{name="wxArtClient", single=true}}) -> erl_arg_name(Name); func_arg(#param{name=Name,type=#type{base={comp,_,Tup}, single=true}}) -> - N = erl_arg_name(Name), + N = erl_arg_name(Name), Doc = fun({_,V}) -> erl_arg_name(N)++V end, "{" ++ args(Doc, ",", Tup) ++ "}"; func_arg(#param{name=Name}) -> @@ -587,7 +593,7 @@ guard_test(#param{name=N, type=#type{name="wxArtClient"}}) -> "is_list(" ++ erl_arg_name(N) ++")"; guard_test(#param{name=N, type=#type{name="wxArrayString"}}) -> "is_list(" ++ erl_arg_name(N) ++")"; -guard_test(#param{name=Name,type=#type{single=Single}}) +guard_test(#param{name=Name,type=#type{single=Single}}) when Single =/= true-> "is_list(" ++ erl_arg_name(Name) ++ ")"; guard_test(#param{name=N,type=#type{base=int}}) -> @@ -597,9 +603,9 @@ guard_test(#param{name=N,type=#type{base=int64}}) -> guard_test(#param{name=N,type=#type{base=long}}) -> "is_integer(" ++ erl_arg_name(N) ++ ")"; guard_test(#param{name=N,type=#type{base=float}}) -> - "is_float(" ++ erl_arg_name(N) ++ ")"; + "is_number(" ++ erl_arg_name(N) ++ ")"; guard_test(#param{name=N,type=#type{base=double}}) -> - "is_float(" ++ erl_arg_name(N) ++ ")"; + "is_number(" ++ erl_arg_name(N) ++ ")"; guard_test(#param{name=N,type=#type{base=bool}}) -> "is_boolean(" ++ erl_arg_name(N) ++ ")"; guard_test(#param{name=N,type=#type{name="wxDateTime"}}) -> @@ -631,245 +637,200 @@ guard_test(#param{name=N,type={class,ignore}}) -> guard_test(T) -> ?error({unknown_type,T}). gen_doc(_Class, [#method{method_type=destructor}]) -> skip; -gen_doc(_Class,[#method{name=N,alias=A,params=Ps,type=T,where=erl_no_opt,method_type=MT}])-> - w("%% @spec (~s~s) -> ~s~n",[doc_arg_types(Ps),"",doc_return_types(T,Ps)]), +gen_doc(_Class,Ms=[#method{name=N,alias=A,params=Ps,where=erl_no_opt,method_type=MT}])-> w("%% @equiv ", []), - gen_function_clause(erl_func_name(N,A),MT,Ps,empty_list,[no_guards,name_only]); -gen_doc(Class,[#method{name=N,params=Ps,type=T}])-> - {_, Optional} = split_optional(Ps), - NonDef = [Arg || Arg = #param{def=Def,in=In, where=Where} <- Ps, - Def =:= none, In =/= false, Where =/= c], - OptsType = case Optional of - [] -> ""; - _ when NonDef =:= [] -> "[Option]"; - _ -> ", [Option]" - end, - w("%% @spec (~s~s) -> ~s~n", - [doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]), - doc_optional(Optional, normal), - DocEnum = doc_enum(T,Ps, normal), - case Class of - "utils" -> - w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" - "external documentation</a>.~n", - [lowercase_all(N)]); - _ -> - w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">" - "external documentation</a>.~n", - [lowercase_all(Class),lowercase_all(Class),lowercase_all(N)]) - end, - doc_enum_desc(DocEnum); -gen_doc(Class, Cs = [#method{name=N, alias=A,method_type=MT}|_]) -> - GetRet = fun(#method{params=Ps,type=T}) -> - doc_return_types(T,Ps) - end, - GetArgs = fun(#method{params=Ps, where=Where}) -> - Opt = case Where of - erl_no_opt -> []; - _ -> - case split_optional(Ps) of - {_, []} -> []; - _ -> ["[Option]"] - end - end, - [doc_arg_type(P) || - P=#param{in=In,def=none,where=W} <- Ps, - In =/= false, W =/= c] ++ Opt - end, - Args = zip(lists:map(GetArgs, Cs)), - Ret = lists:map(GetRet, Cs), - w("%% @spec (~s) -> ~s~n",[args(fun doc_arg/1,",",Args),doc_ret(Ret)]), - case Class of - "utils" -> - w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" - "external documentation</a>.~n", - [lowercase_all(N)]); - _ -> - w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">" - "external documentation</a>.~n", - [lowercase_all(Class),lowercase_all(Class),lowercase_all(N)]) - end, - Name = case MT of constructor -> "new"; _ -> erl_func_name(N,A) end, - w("%% <br /> Alternatives:~n",[]), - [gen_doc2(Name, Clause) || Clause <- Cs], + gen_function_clause(erl_func_name(N,A),MT,Ps,empty_list,[no_guards,name_only]), + w("~n-spec ",[]), + write_specs(Ms, "\n"); +gen_doc(Class,Ms=[#method{name=N, type=T}|Rest])-> + %%doc_optional(Optional, normal), + doc_link(Class, N), + gen_overload_doc(Rest), + Ps = lists:foldl(fun(#method{params=Ps}, Acc) -> Ps ++ Acc end,[],Ms), + doc_enum_desc(lists:usort(doc_enum(T,Ps))), + w("-spec ",[]), + write_specs(Ms, "\n"), ok. -gen_doc2(Name,#method{params=Ps,where=erl_no_opt,method_type=MT}) -> - w("%% <p><c>~n",[]), - w("%% ~s(~s) -> ", [Name,doc_arg_types(Ps)]), - gen_function_clause(Name,MT,Ps,empty_list,[no_guards,name_only]), - w(" </c></p>~n",[]); -gen_doc2(Name,#method{params=Ps,type=T}) -> +gen_overload_doc([]) -> ok; +%%gen_overload_doc(_) -> ok; +gen_overload_doc(Cs) -> + w("%% <br /> Also:<br />~n%% ",[]), + write_specs(Cs, "<br />\n%% "), + w("~n", []). + +write_specs(M=[#method{method_type=constructor}|_], Eol) -> + w("new", []), + write_specs1(M, Eol); +write_specs(M=[#method{name=N, alias=A}|_], Eol) -> + w("~s", [erl_func_name(N,A)]), + write_specs1(M, Eol). + +write_specs1([M], Eol) -> + write_spec(M, Eol), + w(".~s", [Eol]); +write_specs1([M|Next], Eol) -> + write_spec(M, Eol), + w(";~s ", [Eol]), + write_specs1(Next, Eol). + +write_spec(#method{params=Ps,type=T,where=erl_no_opt}, Eol) -> + {NonDef, _Optional} = split_optional(Ps), + Res = doc_return_types(T,Ps), + write_spec(NonDef, [], Res, Eol); +write_spec(#method{params=Ps,type=T}, Eol) -> {NonDef, Optional} = split_optional(Ps), - OptsType = case Optional of - [] -> ""; - _ when NonDef =:= [] -> "[Option]"; - _ -> ", [Option]" - end, - w("%% <p><c>~n",[]), - w("%% ~s(~s~s) -> ~s </c>~n", - [Name,doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]), - doc_optional(Optional, xhtml), - DocEnum = doc_enum(T,Ps, xhtml), - doc_enum_desc(DocEnum), - w("%% </p>~n",[]). - -doc_arg(ArgList) -> - case all_eq(ArgList) of - true -> hd(ArgList); - false -> - Get = fun(Str) -> - [_Name|Types] = string:tokens(Str, ":"), - case Types of - [Type] -> Type; - _ -> - "term()" - end - end, - Args0 = lists:map(Get, ArgList), - Args = unique(Args0, []), - "X::" ++ args(fun(A) -> A end, "|", Args) - end. - -doc_ret(ArgList) -> - case all_eq(ArgList) of - true -> hd(ArgList); - false -> - args(fun(A) -> A end, "|", ArgList) - end. - -unique([], U) -> reverse(U); -unique([H|R], U) -> - case lists:member(H,U) of - false -> unique(R,[H|U]); - true -> unique(R,U) - end. - -all_eq([H|R]) -> all_eq(R,H). - -all_eq([H|R],H) -> all_eq(R,H); -all_eq([],_) -> true; -all_eq(_,_) -> false. - -zip(List) -> - zip(List, [], [], []). - -zip([[F|L1]|List], Rest, AccL, Acc) -> - zip(List, [L1|Rest], [F|AccL], Acc); -zip(Empty, Rest, AccL, Acc) -> - true = empty(Empty), - case empty(Rest) andalso empty(AccL) of - true -> reverse(Acc); - false -> - zip(reverse(Rest), [], [], [reverse(AccL)|Acc]) - end. - -empty([[]|R]) -> empty(R); -empty([]) -> true; -empty(_) -> false. + Res = doc_return_types(T,Ps), + write_spec(NonDef, Optional, Res, Eol). + +write_spec([], [], {simple, Res}, _Eol) -> + w("() -> ~s", [Res]); +write_spec([], [], {complex, Res}, Eol) -> + w("() -> Resultwhen~s\tResult ::~s", [Eol,Res]); +write_spec(Args, [], {simple, Res}, Eol) -> + w("(~s) -> ~s when~s\t~s", + [erl_arg_names(Args), Res, Eol, doc_arg_types(Args)]); +write_spec(Args, [], {complex, Res}, Eol) -> + w("(~s) -> Result when~s\tResult ::~s,~s\t~s", + [erl_arg_names(Args), Eol, Res, Eol, doc_arg_types(Args)]); +write_spec([], Optional, {simple, Res}, Eol) -> + w("([Option]) -> ~s when~s\t~s", + [Res, Eol, optional_type(Optional, Eol)]); +write_spec([], Optional, {complex, Res}, Eol) -> + w("([Option]) -> Result when~s\tResult :: ~s,~s\t~s", + [Eol, Res, Eol, optional_type(Optional, Eol)]); +write_spec(Args, Optional, {simple, Res}, Eol) -> + w("(~s, [Option]) -> ~s when~s\t~s,~s\t~s", + [erl_arg_names(Args), Res, Eol, doc_arg_types(Args), Eol, optional_type(Optional, Eol)]); +write_spec(Args, Optional, {complex, Res}, Eol) -> + w("(~s, [Option]) -> Result when~s\tResult :: ~s,~s\t~s,~s\t~s", + [erl_arg_names(Args), Eol, Res, Eol, doc_arg_types(Args), Eol, optional_type(Optional, Eol)]). + +optional_type(Opts, Eol) -> + "Option :: " ++ args(fun optional_type2/1, Eol++"\t\t | ", Opts). +optional_type2(#param{name=Name, def=Def, type=T}) -> + "{" ++ erl_option_name(Name) ++ ", " ++ doc_arg_type2(T) ++ "}". %% %% Default: " ++ Def. + +doc_link("utils", Func) -> + w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" + "external documentation</a>.~n", + [lowercase_all(Func)]); +doc_link(Class, Func) -> + w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">" + "external documentation</a>.~n", + [lowercase_all(Class),lowercase_all(Class),lowercase_all(Func)]). + +erl_arg_names(Ps0) -> + Ps = [Name || #param{name=Name, in=In, where=Where} <- Ps0,In =/= false, Where =/= c], + args(fun erl_arg_name/1, ", ", Ps). doc_arg_types(Ps0) -> Ps = [P || P=#param{in=In, where=Where} <- Ps0,In =/= false, Where =/= c], args(fun doc_arg_type/1, ", ", Ps). -doc_arg_type(#param{name=Name,def=none,type=T}) -> - erl_arg_name(Name) ++ "::" ++ doc_arg_type2(T); -doc_arg_type(#param{name=Name,in=false,type=T}) -> - erl_arg_name(Name) ++ "::" ++ doc_arg_type2(T); -doc_arg_type(_) -> skip. - -doc_arg_type2(T=#type{single=Single}) when Single =:= array; Single =:= list -> - "[" ++ doc_arg_type3(T) ++ "]"; -doc_arg_type2(T) -> - doc_arg_type3(T). - -doc_arg_type3(#type{base=string}) -> "string()"; -doc_arg_type3(#type{name="wxChar", single=S}) when S =/= true -> "string()"; -doc_arg_type3(#type{name="wxArrayString"}) -> "[string()]"; -doc_arg_type3(#type{name="wxDateTime"}) -> "wx:datetime()"; -doc_arg_type3(#type{name="wxArtClient"}) -> "string()"; -doc_arg_type3(#type{base=int}) -> "integer()"; -doc_arg_type3(#type{base=int64}) -> "integer()"; -doc_arg_type3(#type{base=long}) -> "integer()"; -doc_arg_type3(#type{name="wxTreeItemId"}) -> "wxTreeCtrl:treeItemId()"; -doc_arg_type3(#type{base=bool}) -> "bool()"; -doc_arg_type3(#type{base=float}) -> "float()"; -doc_arg_type3(#type{base=double}) -> "float()"; -doc_arg_type3(#type{base=binary}) -> "binary()"; -doc_arg_type3(#type{base={binary,_}}) -> "binary()"; -doc_arg_type3(#type{base=eventType}) -> "atom()"; -doc_arg_type3(#type{base={ref,N}}) -> N++"()"; -doc_arg_type3(#type{base={term,_N}}) -> "term()"; -doc_arg_type3(T=#type{base={class,N}}) -> - check_class(T), + +doc_arg_type(T) -> + doc_arg_type(T, in). + +doc_arg_type(#param{name=Name,def=none,type=T}, Out) -> + erl_arg_name(Name) ++ "::" ++ doc_arg_type2(T, Out); +doc_arg_type(#param{name=Name,in=false,type=T}, Out) -> + erl_arg_name(Name) ++ "::" ++ doc_arg_type2(T, Out); +doc_arg_type(_, _) -> skip. + +doc_arg_type2(T) -> + doc_arg_type2(T, in). + +doc_arg_type2(T=#type{single=Single}, Out) when Single =:= array; Single =:= list -> + "[" ++ doc_arg_type3(T, Out) ++ "]"; +doc_arg_type2(T, Out) -> + doc_arg_type3(T, Out). + +doc_arg_type3(#type{base=string}, in) -> "unicode:chardata()"; +doc_arg_type3(#type{base=string}, out) -> "unicode:charlist()"; +doc_arg_type3(#type{name="wxChar", single=S},in) when S =/= true -> "unicode:chardata()"; +doc_arg_type3(#type{name="wxChar", single=S},out) when S =/= true -> "unicode:charlist()"; +doc_arg_type3(#type{name="wxArrayString"},in) -> "[unicode:chardata()]"; +doc_arg_type3(#type{name="wxArrayString"},out) -> "[unicode:charlist()]"; +doc_arg_type3(#type{name="wxDateTime"}, _) -> "wx:wx_datetime()"; +doc_arg_type3(#type{name="wxArtClient"}, _) -> "unicode:chardata()"; +doc_arg_type3(#type{base=int}, _) -> "integer()"; +doc_arg_type3(#type{base=int64}, _) -> "integer()"; +doc_arg_type3(#type{base=long}, _) -> "integer()"; +doc_arg_type3(#type{name="wxTreeItemId"}, _) -> "wxTreeCtrl:treeItemId()"; +doc_arg_type3(#type{base=bool}, _) -> "boolean()"; +doc_arg_type3(#type{base=float}, _) -> "number()"; +doc_arg_type3(#type{base=double}, _) -> "number()"; +doc_arg_type3(#type{base=binary}, _) -> "binary()"; +doc_arg_type3(#type{base={binary,_}}, _) -> "binary()"; +doc_arg_type3(#type{base=eventType}, _) -> "atom()"; +doc_arg_type3(#type{base={ref,N}}, _) -> N++"()"; +doc_arg_type3(#type{base={term,_N}}, _) -> "term()"; +doc_arg_type3(T=#type{base={class,N}}, _) -> + check_class(T), case get(current_class) of N -> N ++ "()"; _ -> N++":" ++ N++"()" end; -doc_arg_type3({merged,_,T1=#type{base={class,N1}},_,_,T2=#type{base={class,N2}},_}) -> +doc_arg_type3({merged,_,T1=#type{base={class,N1}},_,_,T2=#type{base={class,N2}},_}, _) -> check_class(T1), check_class(T2), Curr = get(current_class), - if + if N1 =:= Curr, N2 =:= Curr -> N1++"() | "++ N2++"()"; N1 =:= Curr -> N1++"() | "++ N2++":" ++ N2++"()"; N2 =:= Curr -> N1++":" ++ N1++"() | "++ N2++"()"; true -> N1++":" ++ N1++"() | "++ N2++":" ++ N2++"()" end; -doc_arg_type3(#type{base={enum,{_,N}}}) -> uppercase(N); -doc_arg_type3(#type{base={enum,N}}) -> uppercase(N); -doc_arg_type3(#type{base={comp,"wxColour",_Tup}}) -> - "wx:colour()"; -doc_arg_type3(#type{base={comp,_,{record,Name}}}) -> - "wx:" ++ atom_to_list(Name) ++ "()"; -doc_arg_type3(#type{base={comp,_,Tup}}) -> +%% doc_arg_type3(#type{base={enum,{_,N}}}, _) -> uppercase(N); +%% doc_arg_type3(#type{base={enum,N}}, _) -> uppercase(N); +doc_arg_type3(#type{base={enum,_N}}, _) -> "wx:wx_enum()"; +doc_arg_type3(#type{base={comp,"wxColour",_Tup}}, in) -> + "wx:wx_colour()"; +doc_arg_type3(#type{base={comp,"wxColour",_Tup}}, out) -> + "wx:wx_colour4()"; +doc_arg_type3(#type{base={comp,_,{record,Name}}}, _) -> + "wx:wx_" ++ atom_to_list(Name) ++ "()"; +doc_arg_type3(#type{base={comp,_,Tup}}, _) -> Doc = fun({int,V}) -> V ++ "::integer()"; - ({double,V}) -> V ++ "::float()" + ({double,V}) -> V ++ "::float()" end, - "{" ++ args(Doc, ",", Tup) ++ "}"; -doc_arg_type3(T) -> ?error({unknown_type,T}). + "{" ++ args(Doc, ", ", Tup) ++ "}"; +doc_arg_type3(T, _) -> ?error({unknown_type,T}). doc_return_types(T, Ps) -> doc_return_types2(T, [P || P=#param{in=In} <- Ps,In =/= true]). -doc_return_types2(void, []) -> "ok"; -doc_return_types2(void, [#param{type=T}]) -> doc_arg_type2(T); -doc_return_types2(T, []) -> doc_arg_type2(T); -doc_return_types2(void, Ps) -> - "{" ++ args(fun doc_arg_type/1,",",Ps) ++ "}"; +doc_return_types2(void, []) -> {simple, "ok"}; +doc_return_types2(void, [#param{type=T}]) -> {simple, doc_arg_type2(T, out)}; +doc_return_types2(T, []) -> {simple, doc_arg_type2(T, out)}; +doc_return_types2(void, Ps) when length(Ps) < 4 -> + {simple, "{" ++ args(fun(Arg) -> doc_arg_type(Arg, out) end,", ",Ps) ++ "}"}; +doc_return_types2(void, Ps) -> + {complex, "{" ++ args(fun(Arg) -> doc_arg_type(Arg, out) end,", ",Ps) ++ "}"}; doc_return_types2(T, Ps) -> - "{" ++ doc_arg_type2(T) ++ "," ++ args(fun doc_arg_type/1,",",Ps) ++ "}". - -break(xhtml) -> "<br />"; -break(_) -> "". - -doc_optional([],_) -> ok; -doc_optional(Opts,Type) -> - w("%%~s Option = ~s~n", [break(Type),args(fun doc_optional2/1, " | ", Opts)]). + {complex, "{Res ::" ++ doc_arg_type2(T, out) ++ ", " ++ + args(fun(Arg) -> doc_arg_type(Arg, out) end,", ",Ps) ++ "}"}. -doc_optional2(#param{name=Name, def=_Def, type=T}) -> - "{" ++ erl_option_name(Name) ++ ", " ++ doc_arg_type2(T) ++ "}". +doc_enum(#type{base={enum,Enum}},Ps) -> + [doc_enum_type(Enum, "res") | + [doc_enum_type(Type,Name) || #param{name=Name, type=#type{base={enum,Type}}} <- Ps]]; +doc_enum(_,Ps) -> + [doc_enum_type(Type,Name) || #param{name=Name, type=#type{base={enum,Type}}} <- Ps]. -doc_enum(#type{base={enum,Enum}},Ps,Break) -> - [doc_enum_type(Enum,Break) | - [doc_enum_type(Type,Break) || #param{type=#type{base={enum,Type}}} <- Ps]]; -doc_enum(_,Ps,Break) -> - [doc_enum_type(Type,Break) || #param{type=#type{base={enum,Type}}} <- Ps]. - -doc_enum_type(Type,Break) -> +doc_enum_type(Type, Name) -> {Enum0, #enum{vals=Vals}} = wx_gen:get_enum(Type), - case Enum0 of {_, Enum} -> Enum; Enum -> Enum end, + Enum = case Enum0 of {_, E} -> E; E -> E end, Consts = get(consts), - Format = fun({Name,_What}) -> - #const{name=Name} = gb_trees:get(Name, Consts), - "?" ++ enum_name(Name) + Format = fun({N,_What}) -> + #const{name=N} = gb_trees:get(N, Consts), + "?" ++ enum_name(N) end, Vs = args(Format, " | ", Vals), - w("%%~s ~s = integer()~n", [break(Break),uppercase(Enum)]), - {uppercase(Enum),Vs}. + {uppercase(Enum),Name, Vs}. doc_enum_desc([]) -> ok; -doc_enum_desc([{Enum,Vs}|R]) -> - w("%%<br /> ~s is one of ~s~n", [Enum,Vs]), +doc_enum_desc([{_Enum,Name,Vs}|R]) -> + w("%%<br /> ~s = ~s~n", [erl_arg_name(Name),Vs]), doc_enum_desc(R). %% Misc functions prefixed with wx @@ -887,7 +848,7 @@ check_name(Name) -> Name. marshal_opts([], _,_) -> ""; %% No opts skip this! marshal_opts(Opts, Align, Args) -> - w(" MOpts = fun", []), + w(" MOpts = fun", []), marshal_opts1(Opts,1), w(";~n (BadOpt, _) -> erlang:error({badoption, BadOpt}) end,~n", []), w(" BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)),~n", []), @@ -896,7 +857,7 @@ marshal_opts(Opts, Align, Args) -> [] -> Str; % All Args are optional _ -> ", " ++ Str end. - + marshal_opts1([P],N) -> marshal_opt(P,N); marshal_opts1([P|R],N) -> @@ -909,15 +870,15 @@ marshal_opt(P0=#param{name=Name,type=Type},N) -> {Arg,Align} = marshal_arg(Type,erl_arg_name(Name),1), AStr = if Align =:= 0 -> ""; Align =:= 1 -> ",0:32" - end, - w("({~s, ~s}, Acc) -> ", [erl_option_name(Name), func_arg(P)]), + end, + w("({~s, ~s}, Acc) -> ", [erl_option_name(Name), func_arg(P)]), arg_type_test(P,"",[]), case Arg of - skip -> + skip -> w("[<<~p:32/?UI~s>>|Acc]", [N, AStr]); - _ -> + _ -> w("[<<~p:32/?UI,~s~s>>|Acc]", [N, Arg,AStr]) - end. + end. marshal_args(Ps) -> marshal_args(Ps, [], 0). @@ -957,23 +918,23 @@ marshal_arg(#type{single=true,base={enum,_Enum}}, Name, Align) -> marshal_arg(#type{single=true,base=bool}, Name, Align) -> align(32, Align, "(wxe_util:from_bool(" ++ Name ++ ")):32/?UI"); -marshal_arg(#type{name="wxChar", single=Single}, Name, Align0) +marshal_arg(#type{name="wxChar", single=Single}, Name, Align0) when Single =/= true -> - {Str,Align} = + {Str,Align} = align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"), MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))", {Str++", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",0}; marshal_arg(#type{base=string}, Name, Align0) -> - {Str,Align} = + {Str,Align} = align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"), MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))", {Str++", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",0}; marshal_arg(#type{name="wxArrayString"}, Name, Align0) -> - InnerBin = "<<(byte_size(UC_Str)):32/?UI, UC_Str/binary>>", + InnerBin = "<<(byte_size(UC_Str)):32/?UI, UC_Str/binary>>", Outer = "(<< " ++ InnerBin ++ "|| UC_Str <- "++ Name ++"_UCA>>)/binary", Str0 = "(length("++Name++"_UCA)):32/?UI, " ++ Outer, {Str,Align} = align(32,Align0,Str0), - MsgSize = "("++integer_to_list(Align*4) ++ + MsgSize = "("++integer_to_list(Align*4) ++ " + lists:sum([byte_size(S)+4||S<-" ++ Name ++"_UCA]))", AStr = ", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8", {Str ++ AStr, 0}; @@ -989,7 +950,7 @@ marshal_arg(#type{single=true,base={comp,_,Comp}}, Name, Align0) -> Str = args(fun(Str) -> Str end, ",", A), {Str,(Align0 + length(Comp)) rem 2}; {double,_} -> - A = [Name++Spec++":64/float" || {double,Spec} <- Comp], + A = [Name++Spec++":64/?F" || {double,Spec} <- Comp], Str = args(fun(Str) -> Str end, ",", A), align(64,Align0,Str) end; @@ -997,15 +958,15 @@ marshal_arg(#type{base={term,_}}, _Name, Align0) -> {skip,Align0}; marshal_arg(#type{base=binary}, _Name, Align0) -> {skip,Align0}; -marshal_arg(#type{base=Base, single=Single}, Name, Align0) +marshal_arg(#type{base=Base, single=Single}, Name, Align0) when Single =/= true -> - case Base of - int -> + case Base of + int -> Str0 = "(length("++Name++")):32/?UI,\n" " (<< <<C:32/?I>> || C <- "++Name++">>)/binary", {Str,Align} = align(32,Align0, Str0), {Str ++ ", 0:((("++integer_to_list(Align)++"+length("++Name++ ")) rem 2)*32)", 0}; - {ObjRef,_} when ObjRef =:= class; ObjRef =:= ref -> + {ObjRef,_} when ObjRef =:= class; ObjRef =:= ref -> Str0 = "(length("++Name++")):32/?UI,", Str1 = "\n (<< <<(C#wx_ref.ref):32/?UI>> || C <- "++Name++">>)/binary", {Str2,Align} = align(32, Align0, Str1), @@ -1015,9 +976,14 @@ marshal_arg(#type{base=Base, single=Single}, Name, Align0) Str0 = "(length("++Name++")):32/?UI,\n" " (<< <<X:32/?I,Y:32/?I>> || {X,Y} <- "++Name++">>)/binary", align(32,Align0, Str0); + {comp, "wxPoint2DDouble", _} -> + Str0 = "(length("++Name++")):32/?UI,\n", + Str1 = " (<< <<X:64/?F,Y:64/?F>> || {X,Y} <- "++Name++">>)/binary", + {Str,_Align} = align(64,Align0+1, Str1), + {Str0 ++ Str, 0}; double -> Str0 = "(length("++Name++")):32/?UI,\n", - Str1 = " (<< <<C:64/float>> || C <- "++Name++">>)/binary", + Str1 = " (<< <<C:64/?F>> || C <- "++Name++">>)/binary", {Str,_Align} = align(64,Align0+1, Str1), {Str0 ++ Str, 0}; _ -> @@ -1033,7 +999,7 @@ align(64, 0, Str) -> {Str, 0}; align(64, 1, Str) -> {"0:32," ++ Str,0}; align(Sz, W, Str) -> align(Sz, W rem 2, Str). -enum_name(Name) -> +enum_name(Name) -> case string:tokens(Name, ":") of [Name] -> Name; [C,N] -> C ++ "_" ++ N @@ -1049,14 +1015,14 @@ gen_enums_ints() -> " controlDown, shiftDown, altDown, metaDown, cmdDown %% bool()~n" " }).~n", []), w("-record(wxHtmlLinkInfo, {~n" - " href, target %% string()~n" + " href, target %% unicode:chardata()~n" " }).~n", []), w("~n%% Hardcoded Defines~n", []), Enums = [E || {{enum,_},E = #enum{as_atom=false}} <- get()], - w("-define(wxDefaultSize, {-1,-1}).~n", []), - w("-define(wxDefaultPosition, {-1,-1}).~n", []), + w("-define(wxDefaultSize, {-1,-1}).~n", []), + w("-define(wxDefaultPosition, {-1,-1}).~n", []), w("~n%% Global Variables~n", []), - [w("-define(~s, wxe_util:get_const(~s)).~n", [Gvar, Gvar]) || + [w("-define(~s, wxe_util:get_const(~s)).~n", [Gvar, Gvar]) || {Gvar,_,_Id} <- get(gvars)], w("~n%% Enum and defines~n", []), foldl(fun(Enum= #enum{vals=Vals}, Done) when Vals =/= [] -> @@ -1076,7 +1042,7 @@ build_enum_ints(#enum{from=From, vals=Vals},Done) -> {_File, Class, Name} -> w("% From class ~s::~s~n",[Class, Name]) end, - + Format = fun(#const{name="wxEVT_" ++ _}) -> ignore; %% Ignore event macros they are not valid in our event model (#const{name=Name,val=Value,is_const=true}) when is_integer(Value) -> @@ -1100,12 +1066,12 @@ build_enum_ints(#enum{from=From, vals=Vals},Done) -> Consts = get(consts), Write = fun({Name,_What}, Skip) -> case gb_sets:is_member(Name,Skip) of - true -> + true -> Skip; false -> case gb_trees:lookup(Name, Consts) of {value, Const} -> - Format(Const), + Format(Const), gb_sets:add(Name,Skip); none -> Skip end @@ -1119,86 +1085,57 @@ gen_event_recs() -> w("", []), w("%% This file is generated DO NOT EDIT~n~n", []), w("%% All event messages are encapsulated in a wx record~n" - "%% they contain the widget id and a specialized event record.~n" - "%% Each event record may be sent for one or more event types.~n" + "%% they contain the widget id and a specialized event record.~n" + "%% Each event record may be sent for one or more event types.~n" "%% The mapping to wxWidgets is one record per class.~n~n",[]), - w("%% @type wx() = #wx{id=integer(), obj=wx:wxObject(), userData=term(), event=Rec}. Rec is a event record.~n",[]), - w("-record(wx, {id, %% Integer Identity of object.~n" - " obj, %% Object reference that was used in the connect call.~n" - " userData, %% User data specified in the connect call.~n" - " event}).%% The event record~n~n",[]), + w("-record(wx, {id :: integer(), %% Integer Identity of object.~n" + " obj :: wx:wx_object(), %% Object reference that was used in the connect call.~n" + " userData :: term(), %% User data specified in the connect call.~n" + " event :: event() %% The event record~n" + " }).~n~n", []), + w("-type wx() :: #wx{}. %% wx event record ~n",[]), w("%% Here comes the definitions of all event records.~n" "%% they contain the event type and possible some extra information.~n~n",[]), - Types = [build_event_rec(C) || {_,C=#class{event=Evs}} <- get(), Evs =/= false], - w("%% @type wxEventType() = ~s.~n", - [args(fun(Ev) -> Ev end, " | ", lists:sort(lists:append(Types)))]), + Events = [build_event_rec(C) || {_,C=#class{event=Evs}} <- get(), Evs =/= false], + EventSubTypes = [Type || {_Rec, Type} <- Events], + EventRecs = [Rec || {Rec, _Type} <- Events], + w("-type event() :: ~s.~n", + [args(fun(Ev) -> Ev++"()" end, " | ", lists:sort(EventRecs))]), + + w("-type wxEventType() :: ~s.~n", + [args(fun(Ev) -> Ev++"()" end, " | ", lists:sort(EventSubTypes))]), %% close(), closed in gen_enums_ints ok. -find_inherited_attr(Param = {PName,_}, Name) -> - #class{parent=Parent, attributes=Attrs} = get({class, Name}), - case lists:keysearch(atom_to_list(PName), #param.name, Attrs) of - {value, P=#param{}} -> - P; - _ -> - find_inherited_attr(Param, Parent) - end. - -filter_attrs(#class{name=Name, parent=Parent,attributes=Attrs}) -> - Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc; - (P=#param{prot=public},Acc) -> [P|Acc]; - (#param{acc=undefined},Acc) -> Acc; - ({inherited, PName},Acc) -> - case find_inherited_attr(PName, Parent) of - undefined -> - io:format("~p:~p: Missing Event Attr ~p in ~p~n", - [?MODULE,?LINE, PName, Name]), - Acc; - P -> - [P|Acc] - end; - (P, Acc) -> [P|Acc] - end, [], Attrs), - lists:reverse(Attr1). - build_event_rec(Class=#class{name=Name, event=Evs}) -> EvTypes = [event_type_name(Ev) || Ev <- Evs], - Str = args(fun(Ev) -> "<em>"++Ev++"</em>" end, ", ", EvTypes), + Str = args(fun(Ev) -> Ev end, " | ", EvTypes), Attr = filter_attrs(Class), Rec = event_rec_name(Name), - GetName = fun(#param{name=N}) ->event_attr_name(N) end, + %%GetName = fun(#param{name=N}) ->event_attr_name(N) end, GetType = fun(#param{name=N,type=T}) -> - event_attr_name(N) ++ "=" ++ doc_arg_type2(T) + event_attr_name(N) ++ " :: " ++ doc_arg_type2(T) end, + EventType = Name ++ "Type", case Attr =:= [] of - true -> - w("%% @type ~s() = #~s{type=wxEventType()}.~n", [Rec,Rec]), - w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), -%% case is_command_event(Name) of -%% true -> w("%% This event skips other event handlers.~n",[]); -%% false -> w("%% This event will be handled by other handlers~n",[]) -%% end, - w("%% Callback event: {@link ~s}~n", [Name]), - w("-record(~s, {type}).~n~n", [Rec]); + true -> + %% w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), + %% w("%% Callback event: {@link ~s}~n", [Name]), + w("-record(~s, {type :: ~s()}). %% Callback event: {@link ~s}~n", + [Rec, EventType, Name]), + w("-type ~s() :: ~s.~n", [EventType, Str]); false -> - w("%% @type ~s() = #~s{type=wxEventType(),~s}.~n", - [Rec,Rec,args(GetType,",",Attr)]), - w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), -%% case is_command_event(Name) of -%% true -> w("%% This event skips other event handlers.~n",[]); -%% false -> w("%% This event will be handled by other handlers~n",[]) -%% end, - w("%% Callback event: {@link ~s}~n", [Name]), - w("-record(~s,{type, ~s}).~n~n", [Rec,args(GetName,",",Attr)]) + %% w("%% @type ~s() = #~s{type=wxEventType(),~s}.~n", + %% [Rec,Rec,args(GetType,",",Attr)]), + %% w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), + %% w("%% Callback event: {@link ~s}~n", [Name]), + w("-record(~s,{type :: ~s(), %% Callback event: {@link ~s}~n\t~s}).~n", + [Rec,EventType, Name, args(GetType,",\n\t",Attr)]), + w("-type ~s() :: ~s.~n", [EventType, Str]) end, - EvTypes. + w("-type ~s() :: #~s{}. %% Callback event: {@link ~s}~n~n", [Rec,Rec,Name]), + {Rec, EventType}. -is_command_event(Name) -> - case lists:member("wxCommandEvent", parents(Name)) of - true -> true; - false -> false - end. - event_rec_name(Name0 = "wx" ++ _) -> "tnevE" ++ Name1 = reverse(Name0), reverse(Name1). @@ -1214,8 +1151,33 @@ event_attr_name("m_" ++ Attr) -> event_attr_name(Attr) -> lowercase(Attr). +find_inherited_attr(Param = {PName,_}, Name) -> + #class{parent=Parent, attributes=Attrs} = get({class, Name}), + case lists:keysearch(atom_to_list(PName), #param.name, Attrs) of + {value, P=#param{}} -> + P; + _ -> + find_inherited_attr(Param, Parent) + end. -gen_funcnames() -> +filter_attrs(#class{name=Name, parent=Parent,attributes=Attrs}) -> + Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc; + (P=#param{prot=public},Acc) -> [P|Acc]; + (#param{acc=undefined},Acc) -> Acc; + ({inherited, PName},Acc) -> + case find_inherited_attr(PName, Parent) of + undefined -> + io:format("~p:~p: Missing Event Attr ~p in ~p~n", + [?MODULE,?LINE, PName, Name]), + Acc; + P -> + [P|Acc] + end; + (P, Acc) -> [P|Acc] + end, [], Attrs), + lists:reverse(Attr1). + +gen_funcnames() -> open_write("../src/gen/wxe_debug.hrl"), erl_copyright(), w("%% This file is generated DO NOT EDIT~n~n", []), @@ -1257,7 +1219,7 @@ unique_names(Ms0, Class) -> Ms = split_list(fun(#method{name=N}, M) -> {N =:= M, N} end, undefined, Ms2), unique_names2(Ms,Class). %% by Names -unique_names2([[#method{id=Id, name=Method,alias=Alias, max_arity=A}]|Ms], Class) -> +unique_names2([[#method{id=Id, name=Method,alias=Alias, max_arity=A}]|Ms], Class) -> [{Class,uname(alias(Method,Alias),Class),A,Id} | unique_names2(Ms,Class)]; unique_names2([Ms0|RMs], Class) -> Split = fun(#method{max_arity=A}, P) -> {A =:= P, A} end, @@ -1278,11 +1240,11 @@ unique_names4([], _, _Class) -> []. alias(Method, undefined) -> Method; alias(_, Alias) -> Alias. - + uname(Class,Class) -> "new"; uname([$~ | _], _ ) -> "destruct"; uname(Name, _) -> Name. - + split_list(F, Keep, List) -> split_list(F, Keep, List, []). @@ -1297,5 +1259,5 @@ split_list(F, Keep, [M|Ms], Acc) -> end; split_list(_, _, [], []) -> []; split_list(_, _, [], Acc) -> [lists:reverse(Acc)]. - + diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf index aec8a4944a..383addfe3f 100644 --- a/lib/wx/api_gen/wxapi.conf +++ b/lib/wx/api_gen/wxapi.conf @@ -2,7 +2,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -330,9 +330,11 @@ {'DrawRotatedText',3}, 'DrawRoundedRectangle',%'DrawSpline', {'DrawText',2}, 'EndDoc','EndPage',{'FloodFill',3},'GetBackground','GetBackgroundMode', - 'GetBrush','GetCharHeight','GetCharWidth',{'GetClippingBox',1},'GetFont', - 'GetLayoutDirection','GetLogicalFunction','GetMapMode','GetMultiLineTextExtent', - 'GetPartialTextExtents','GetPen',{'GetPixel',2},'GetPPI','GetSize','GetSizeMM', + 'GetBrush','GetCharHeight','GetCharWidth',{'GetClippingBox',[{"rect", skip_member}]}, + 'GetFont','GetLayoutDirection','GetLogicalFunction','GetMapMode','GetMultiLineTextExtent', + {'GetPartialTextExtents', [{"widths", out}]}, + 'GetPen',{'GetPixel', [{"col", out}, {"x", skip_member}]}, + 'GetPPI','GetSize','GetSizeMM', 'GetTextBackground','GetTextExtent','GetTextForeground', 'GetUserScale','GradientFillConcentric','GradientFillLinear', 'LogicalToDeviceX','LogicalToDeviceXRel','LogicalToDeviceY','LogicalToDeviceYRel', @@ -355,20 +357,28 @@ %%{class,wxAutoBufferedPaintDC,wxBufferedPaintDC,[],['wxAutoBufferedPaintDC']}. {class, wxGraphicsObject, object, [{ifdef, wxUSE_GRAPHICS_CONTEXT}], - ['GetRenderer','IsNull']}. -{class, wxGraphicsContext, wxGraphicsObject, [{ifdef, wxUSE_GRAPHICS_CONTEXT}], - ['Create', %%CreateFromNative CreateFromNativeWindow + ['~wxGraphicsObject', 'GetRenderer','IsNull']}. +{class, wxGraphicsContext, wxGraphicsObject, + [{ifdef, wxUSE_GRAPHICS_CONTEXT}, {skip, [{'StrokeLines',4}]}], + ['~wxGraphicsContext', + 'Create', %%CreateFromNative CreateFromNativeWindow 'CreatePen','CreateBrush','CreateRadialGradientBrush', 'CreateLinearGradientBrush','CreateFont','CreateMatrix', 'CreatePath','Clip','ResetClip', - 'DrawBitmap','DrawEllipse','DrawIcon','DrawLines','DrawPath', + 'DrawBitmap','DrawEllipse','DrawIcon', + {'DrawLines', [{"n",{c_only,{length,"points"}}}, {"points", {single,array}}]}, + 'DrawPath', 'DrawRectangle','DrawRoundedRectangle','DrawText','FillPath', - 'StrokePath','GetNativeContext','GetPartialTextExtents', + 'StrokePath', %% 'GetNativeContext', + {'GetPartialTextExtents', [{"widths", out}]}, 'GetTextExtent','Rotate','Scale','Translate', 'GetTransform','SetTransform','ConcatTransform', - 'SetBrush','SetFont','SetPen','StrokeLine','StrokeLines']}. + 'SetBrush','SetFont','SetPen','StrokeLine', + {'StrokeLines', [{"n",{c_only,{length,"points"}}}, {"points", {single,array}}]} + ]}. {class, wxGraphicsMatrix, wxGraphicsObject, [{ifdef, wxUSE_GRAPHICS_CONTEXT}], - ['Concat','Get','GetNativeMatrix','Invert','IsEqual','IsIdentity', + ['Concat','Get',%%'GetNativeMatrix', + 'Invert','IsEqual','IsIdentity', 'Rotate','Scale','Translate','Set','TransformPoint','TransformDistance']}. {class, wxGraphicsPath, wxGraphicsObject, [{ifdef, wxUSE_GRAPHICS_CONTEXT}], ['MoveToPoint','AddArc','AddArcToPoint','AddCircle','AddCurveToPoint', @@ -400,17 +410,17 @@ {class, wxControl, wxWindow, [], [% 'Command','GetLabelText', 'GetLabel','SetLabel']}. -{class, wxControlWithItems, wxControl, - [{skip, [{'GetClientObject',1},{'SetClientObject',2}]}], +{class, wxControlWithItems, wxControl, + [{skip, [{'GetClientObject',1},{'SetClientObject',2}]}], [ - {'Append',[{"clientData",[{skip_member, void}]}, - {"strings", [{erl_func, "appendStrings"}]}]}, + {'Append',[{"clientData",[{skip_member, voidp}]}, + {"strings", [{erl_func, "appendStrings"}]}]}, 'Clear','Delete','FindString', %% 'GetClientData','SetClientData', {'GetClientObject', [{"n", [{erl_func, "getClientData"}]}]}, {'SetClientObject', [{"n", [{erl_func, "setClientData"}]}]}, 'GetCount','GetSelection','GetString','GetStringSelection', - {'Insert',[{"clientData",[{skip_member, void}]}]},%'Number', + {'Insert',[{"clientData",[{skip_member, voidp}]}]},%'Number', 'IsEmpty','Select','SetSelection','SetString','SetStringSelection' ]}. @@ -756,7 +766,9 @@ 'SetFirstItem']}. {class, wxListCtrl, wxControl, [], - ['wxListCtrl','~wxListCtrl','Arrange','AssignImageList','ClearAll','Create', + [{'wxListCtrl', [{where, taylormade}]}, + '~wxListCtrl','Arrange','AssignImageList','ClearAll', + {'Create',[{where, taylormade}]}, 'DeleteAllItems','DeleteColumn','DeleteItem', {'EditLabel',[{"textControlClass",nowhere}]}, 'EnsureVisible', @@ -788,6 +800,13 @@ 'SetFont','SetId','SetImage','SetMask','SetState', 'SetStateMask','SetText','SetTextColour','SetWidth']}. +{class, wxListItemAttr, root, [], + ['wxListItemAttr','~wxListItemAttr', + 'GetBackgroundColour', 'GetFont', + 'GetTextColour', 'HasBackgroundColour', 'HasFont', + 'HasTextColour', 'SetBackgroundColour', 'SetFont', 'SetTextColour' + ]}. + {class, wxImageList, object, [{skip, [{'Create',1}]}], %% No create/0 on windows ['wxImageList','~wxImageList','Add','Create','Draw','GetBitmap','GetIcon','GetImageCount', 'GetSize','Remove','RemoveAll','Replace']}. @@ -1583,9 +1602,9 @@ 'HomeWrapExtend', 'LineEndWrap', 'LineEndWrapExtend', 'VCHomeWrap', 'VCHomeWrapExtend', 'LineCopy', 'MoveCaretInsideView', 'LineLength', 'BraceHighlight', 'BraceBadLight', 'BraceMatch', 'GetViewEOL', 'SetViewEOL', %'GetDocPointer', 'SetDocPointer', Hmm void pointers - 'SetModEventMask', 'GetEdgeColumn', 'SetEdgeColumn', - 'GetEdgeMode', 'GetEdgeColour', 'SetEdgeColour', 'SearchAnchor', 'SearchNext', - 'SearchPrev', 'LinesOnScreen', + 'SetModEventMask', 'GetEdgeColumn', 'SetEdgeColumn', + 'SetEdgeMode', 'GetEdgeMode', 'GetEdgeColour', 'SetEdgeColour', 'SearchAnchor', 'SearchNext', + 'SearchPrev', 'LinesOnScreen', 'UsePopUp', 'SelectionIsRectangle', 'SetZoom', 'GetZoom', %%'CreateDocument', 'AddRefDocument', 'ReleaseDocument', Hmm void pointers 'GetModEventMask', 'SetSTCFocus', 'GetSTCFocus', 'SetStatus', 'GetStatus', @@ -1746,6 +1765,9 @@ 'GetColour','GetFont','GetMetric','GetScreenType' ]}. +{class, wxSystemOptions, object, [], + ['GetOption', 'GetOptionInt', 'HasOption', 'IsFalse', 'SetOption']}. + {class, wxAuiNotebookEvent, wxNotifyEvent, [{acc, [{old_selection, "GetOldSelection()"}, {selection, "GetSelection()"}, @@ -1791,4 +1813,14 @@ {class, wxLogNull, root, [], [wxLogNull, '~wxLogNull']}. - + +{class, wxTaskBarIcon, wxEvtHandler, [], + [wxTaskBarIcon,'~wxTaskBarIcon', + %%'CreatePopupMenu', virtual overrided is a callback + %% 'IsIconInstalled', 'IsOk', not available on mac + 'PopupMenu','RemoveIcon','SetIcon']}. + +{class, wxTaskBarIconEvent, wxEvent, + [{event,[wxEVT_TASKBAR_MOVE,wxEVT_TASKBAR_LEFT_DOWN,wxEVT_TASKBAR_LEFT_UP, + wxEVT_TASKBAR_RIGHT_DOWN,wxEVT_TASKBAR_RIGHT_UP, + wxEVT_TASKBAR_LEFT_DCLICK,wxEVT_TASKBAR_RIGHT_DCLICK]}],[]}. |