1
%% ``The contents of this file are subject to the Erlang Public License,
2
%% Version 1.1, (the "License"); you may not use this file except in
3
%% compliance with the License. You should have received a copy of the
4
%% Erlang Public License along with this software. If not, it can be
5
%% retrieved via the world wide web at http://www.erlang.org/.
7
%% Software distributed under the License is distributed on an "AS IS"
8
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
9
%% the License for the specific language governing rights and limitations
12
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
13
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
14
%% AB. All Rights Reserved.''
16
%% $Id: gs_make.erl,v 1.1 2008/12/17 09:53:50 mikpe Exp $
25
{ok,OutFd} = file:open("gstk_generic.hrl", [write]),
27
% io:format("terms: ~p ~n ets:~p~n",[Terms,ets:tab2list(DB)]),
28
p("% Don't edit this file. It was generated by gs_make:start/0 "),
29
p("at ~p-~p-~p, ~p:~p:~p.\n\n",
30
lists:append(tuple_to_list(date()),tuple_to_list(time()))),
34
{ok,"gstk_generic.hrl",DB}.
37
DB = ets:new(gs_mapping,[bag,public]),
40
fill_ets(DB,[]) -> DB;
41
fill_ets(DB,[{Objs,Opt,Fun,Access}|Terms]) ->
42
fill_ets(DB,lists:flatten(Objs),Opt,Fun,Access),
45
fill_ets(_DB,[],_,_,_) -> done;
46
fill_ets(DB,[Obj|Objs],Opt,Fun,rw) ->
47
ets:insert(DB,{Obj,Opt,Fun,read}),
48
ets:insert(DB,{Obj,Opt,Fun,write}),
49
fill_ets(DB,Objs,Opt,Fun,rw);
50
fill_ets(DB,[Obj|Objs],Opt,Fun,r) ->
51
ets:insert(DB,{Obj,Opt,Fun,read}),
52
fill_ets(DB,Objs,Opt,Fun,r);
53
fill_ets(DB,[Obj|Objs],Opt,Fun,w) ->
54
ets:insert(DB,{Obj,Opt,Fun,write}),
55
fill_ets(DB,Objs,Opt,Fun,w).
60
ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',write}))),
61
p("out_opts([Option|Options],Gstkid,TkW,DB,ExtraArg,S,P,C) ->\n"),
63
p(" case Option of \n"),
64
p(" {{default,Cat,Key},V} -> {default,{Cat,{Key,V}}};\n"),
65
p(" {_Key,_V} -> Option;\n"),
66
p(" {default,Cat,Opti} -> {default,{Cat,Opti}};\n"),
67
p(" Atom when atom(Atom) -> {Atom,undefined};\n"),
68
p(" _ -> {error, {invalid_option,Option}}\n"),
70
p(" case Gstkid#gstkid.objtype of\n"),
71
gen_out_type_case_clauses(merge_types(ObjTypes),DB),
72
p(" Q -> exit({internal_error,unknown_objtype,Q})\n"),
74
p("out_opts([],_Gstkid,_TkW,_DB,_ExtraArg,S,P,C) -> \n"),
78
gen_out_type_case_clauses([],_DB) -> done;
79
gen_out_type_case_clauses([Objtype|Objtypes],DB) ->
80
OptsFuns = lists:map(fun (L) -> list_to_tuple(L) end,
81
ets:match(DB,{Objtype,'$1','$2',write})),
82
p(" ~p -> \ncase Opt of\n",[Objtype]),
83
gen_opt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
85
p(" handle_external_opt_call([Option|Options],Gstkid,TkW,DB,ExtraArg,"
86
" gstk_~p:option(Option,Gstkid,TkW,DB,ExtraArg),S,P,C)\n",
89
gen_out_type_case_clauses(Objtypes,DB).
91
gen_opt_case_clauses([]) ->
93
gen_opt_case_clauses([{Opt,Fun}|OptFuncs]) ->
95
p(" ~p(Val,Options,Gstkid,TkW,DB,ExtraArg,S,P,C);\n",[Fun]),
96
gen_opt_case_clauses(OptFuncs).
99
ObjTypes = lists:flatten(ordsets:from_list(ets:match(DB,{'$1','_','_',read}))),
100
p("read_option(DB,Gstkid,TkW,Option,ExtraArg) ->\n"),
101
p(" Key = case Option of\n"),
102
p(" Atom when atom(Atom) -> Atom;\n"),
103
p(" Opt when tuple(Opt) -> element(1,Opt)\n"),
105
p(" case Gstkid#gstkid.objtype of\n"),
106
gen_read_type_clauses(merge_types(ObjTypes),DB),
107
p(" Q -> exit({internal_error,unknown_objtype,Q})\n"),
111
gen_read_type_clauses([],_) -> done;
112
gen_read_type_clauses([Objtype|Objtypes],DB) ->
113
OptsFuns = lists:map(fun (L) -> list_to_tuple(L) end,
114
ets:match(DB,{Objtype,'$1','$2',read})),
115
p(" ~p -> \ncase Key of\n",[Objtype]),
116
gen_readopt_case_clauses(merge_opts(opt_prio(),OptsFuns)),
117
p(" _ -> \nhandle_external_read(gstk_~p:read_option(Option,Gstkid,TkW,DB,ExtraArg))\n",[Objtype]),
119
gen_read_type_clauses(Objtypes,DB).
121
gen_readopt_case_clauses([]) ->
123
gen_readopt_case_clauses([{Opt,Fun}|OptFuncs]) ->
124
p(" ~p -> \n~p(Option,Gstkid,TkW,DB,ExtraArg);\n",[Opt,Fun]),
125
gen_readopt_case_clauses(OptFuncs).
129
ok = io:format(get(stdout),Str,[]).
132
ok = io:format(get(stdout),Format,Data).
134
%%----------------------------------------------------------------------
135
%% There items should be placed early in a case statement.
136
%%----------------------------------------------------------------------
137
obj_prio() -> [rectangle,line,gridline,image,button,canvas,checkbutton,radiobutton].
138
opt_prio() -> [x,y,width,height,move,coords,data].
140
merge_types(Types) ->
141
T2 = ordsets:from_list(Types),
142
P2 = ordsets:from_list(obj_prio()),
143
obj_prio() ++ ordsets:subtract(T2, P2).
145
merge_opts([],L) -> L;
146
merge_opts([Opt|Opts],Dict) ->
147
case gs:assq(Opt,Dict) of
148
{value,V} -> [{Opt,V}|merge_opts(Opts,lists:keydelete(Opt,1,Dict))];
149
false -> merge_opts(Opts,Dict)
153
Buttons=[button,checkbutton,radiobutton],
154
AllPureTk = [Buttons,canvas,editor,entry,frame,label,listbox,
155
menubar,menubutton,scale,window],
156
CanvasObj = [arc,image,line,oval,polygon,rectangle,text],
157
All = [AllPureTk,CanvasObj,grid,gridline,menu,menuitem,gs],
158
Containers = [canvas,frame,grid,menu,menubar,menubutton,menuitem,window],
159
Ob1 = [Buttons,canvas,grid,frame,label,entry,editor,listbox,scale],
160
Ob2 = [button,checkbutton,radiobutton,label,menubutton],
161
Ob3 = [Buttons,frame,label,entry,editor,listbox,scale,menubutton,
163
Ob4 = [canvas,editor,listbox],
164
[{[Buttons,entry,scale,menubutton],enable,gen_enable,rw},
165
{[Buttons,label,entry,scale,menubutton,menu],fg,gen_fg,rw},
166
{[Buttons,label,entry,scale,menubutton,menu],bg,gen_bg,rw},
167
{Ob1,anchor,gen_anchor,rw},
168
{Ob1,height,gen_height,r},
169
{Ob1--[frame],height,gen_height,w},
170
{Ob1,width,gen_width,r},
171
{Ob1--[frame],width,gen_width,w},
172
{Ob1,pack_x,gen_pack_x,rw},
173
{Ob1,pack_y,gen_pack_y,rw},
174
{Ob1,pack_xy,gen_pack_xy,w},
177
{Ob1,raise,gen_raise,w},
178
{Ob1,lower,gen_lower,w},
179
{Ob2,align,gen_align,rw},
180
{Ob2,font,gen_font,rw},
181
{Ob2,justify,gen_justify,rw},
182
{Ob2,padx,gen_padx,rw},
183
{Ob2,pady,gen_pady,rw},
184
{Containers,default,gen_default,w},
185
{[AllPureTk,menu],relief,gen_relief,rw},
186
{[AllPureTk,menu],bw,gen_bw,rw},
187
{[Buttons,canvas,frame,label,entry,scale,menubutton,menu,menubar],
188
setfocus,gen_setfocus,rw},
189
{Ob3,buttonpress,gen_buttonpress,rw},
190
{Ob3,buttonrelease,gen_buttonrelease,rw},
191
{Ob3,configure,gen_configure,rw},
192
{[Ob3,window],destroy,gen_destroy,rw},
193
{[Ob3,window],enter,gen_enter,rw},
194
{[Ob3,window],leave,gen_leave,rw},
195
{[Ob3,window],focus,gen_focus_ev,rw},
196
{[Ob3,window],keypress,gen_keypress,rw},
197
{[Ob3,window],keyrelease,gen_keyrelease,rw},
198
{Ob3,motion,gen_motion,rw},
199
%% events containing x,y are special
200
{[window],buttonpress,gen_buttonpress,r},
201
{[window],buttonrelease,gen_buttonrelease,r},
202
{[window],motion,gen_motion,r},
203
{All,font_wh,gen_font_wh,r},
204
{All,choose_font,gen_choose_font,r},
205
{All,data,gen_data,rw},
206
{All,children,gen_children,r},
208
{All,parent,gen_parent,r},
209
{All,type,gen_type,r},
210
{All,beep,gen_beep,w},
211
{All,keep_opt,gen_keep_opt,w},
212
{All,flush,gen_flush,rw},
213
{AllPureTk,highlightbw,gen_highlightbw,rw},
214
{AllPureTk,highlightbg,gen_highlightbg,rw},
215
{AllPureTk,highlightfg,gen_highlightfg,rw},
216
{AllPureTk,cursor,gen_cursor,rw}, % bug
217
{[Buttons,label,menubutton],label,gen_label,rw},
218
{[Buttons,menubutton,menu],activebg,gen_activebg,rw},
219
{[Buttons,menubutton,menu],activefg,gen_activefg,rw},
220
{[entry],selectbg,gen_selectbg,rw},
221
{[entry],selectbw,gen_selectbw,rw},
222
{[entry],selectfg,gen_selectfg,rw},
223
{Ob4,activebg,gen_so_activebg,rw},
224
{Ob4,bc,gen_so_bc,rw},
225
{Ob4,bg,gen_so_bg,rw},
226
{Ob4,hscroll,gen_so_hscroll,r},
227
{Ob4,scrollbg,gen_so_scrollbg,rw},
228
{Ob4,scrollfg,gen_so_scrollfg,rw},
229
{Ob4,scrolls,gen_so_scrolls,w},
230
{Ob4,selectbg,gen_so_selectbg,rw},
231
{Ob4,selectbg,gen_so_selectbg,rw},
232
{Ob4,selectbw,gen_so_selectbw,rw},
233
{Ob4,selectbw,gen_so_selectbw,rw},
234
{Ob4,selectfg,gen_so_selectfg,rw},
235
{Ob4,selectfg,gen_so_selectfg,rw},
236
{Ob4,vscroll,gen_so_vscroll,r},
237
{CanvasObj,coords,gen_citem_coords,rw},
238
{CanvasObj,lower,gen_citem_lower,w},
239
{CanvasObj,raise,gen_citem_raise,w},
240
{CanvasObj,move,gen_citem_move,w},
241
{CanvasObj,setfocus,gen_citem_setfocus,rw},
242
{CanvasObj,buttonpress,gen_citem_buttonpress,w}, % should be rw
243
{CanvasObj,buttonrelease,gen_citem_buttonrelease,w},
244
{CanvasObj,enter,gen_citem_enter,w},
245
{CanvasObj,focus,gen_citem_setfocus,w},
246
{CanvasObj,keypress,gen_citem_keypress,w},
247
{CanvasObj,keyrelease,gen_citem_keyrelease,w},
248
{CanvasObj,leave,gen_citem_leave,w},
249
{CanvasObj,motion,gen_citem_motion,w},
250
{CanvasObj,buttonpress,gen_buttonpress,r},
251
{CanvasObj,buttonrelease,gen_buttonrelease,r},
252
{CanvasObj,configure,gen_configure,r},
253
{CanvasObj,destroy,gen_destroy,r},
254
{CanvasObj,enter,gen_enter,r},
255
{CanvasObj,leave,gen_leave,r},
256
{CanvasObj,focus,gen_focus_ev,r},
257
{CanvasObj,keypress,gen_keypress,r},
258
{CanvasObj,keyrelease,gen_keyrelease,r},
259
{CanvasObj,motion,gen_motion,r},
260
{[arc,oval,polygon,rectangle],fill,gen_citem_fill,rw}].