diff --git a/src/www/gfse/editor.css b/src/www/gfse/editor.css index 876e56759..2abebd09e 100644 --- a/src/www/gfse/editor.css +++ b/src/www/gfse/editor.css @@ -93,7 +93,7 @@ table.matrixview th { background: #cef; color: #009; } table.tabs td.gap { border-top-width: 0; border-left-width: 0; border-right-width: 0; } -table.tabs input[type=button] { +table.tabs input[type=button], table.matrixview th input[type=button] { border: 0; background: inherit; color: #009; diff --git a/src/www/gfse/editor.js b/src/www/gfse/editor.js index 381cf33a7..34486f429 100644 --- a/src/www/gfse/editor.js +++ b/src/www/gfse/editor.js @@ -146,9 +146,16 @@ function edit_grammar(g) { } function draw_grammar(g) { - var files=div_class("files",[draw_filebar(g),draw_file(g)]); - return div_class("grammar",[draw_namebar(g,files),files]) - + switch(g.view) { + case "matrix": + var matrix=div_class("files",draw_matrix(g)) + return div_class("grammar",[draw_namebar(g,matrix),matrix]) + case "row": + /* ... */ + default: + var files=div_class("files",[draw_filebar(g),draw_file(g)]); + return div_class("grammar",[draw_namebar(g,files),files]) + } } function draw_namebar(g,files) { @@ -192,21 +199,16 @@ function draw_plainbutton(g,files) { } function draw_matrixbutton(g,files) { - var b2; - function show_editor() { edit_grammar(g); } - function show_matrix() { - clear(files) - files.appendChild(draw_matrix(g)) - b.style.display="none"; - if(b2) b2.style.display=""; - else { - b2=button("Show editor",show_editor); - insertAfter(b2,b); - } + switch(g.view) { + case "matrix": + function show_editor() { g.view="column"; reload_grammar(g); } + var b=button("Show editor",show_editor); + return b; + default: + var b=button("Matrix view",function(){open_matrix(g);}); + b.title="Show matrix view of the grammar"; + return b; } - var b=button("Matrix view",show_matrix); - b.title="Show matrix view of the grammar"; - return b; } function show_compile_error(res,err_ind) { @@ -520,8 +522,9 @@ function add_concrete2(ix,code) { open_concrete(g,ci); } -function open_abstract(g) { g.current=0; reload_grammar(g); } -function open_concrete(g,i) { g.current=i+1; reload_grammar(g); } +function open_abstract(g) { g.view="column"; g.current=0; reload_grammar(g); } +function open_concrete(g,i) { g.view="column"; g.current=i+1; reload_grammar(g); } +function open_matrix(g) { g.view="matrix"; reload_grammar(g); } function td_gap(c) {return wrap_class("td","gap",c); } function gap() { return td_gap(text(" ")); } @@ -543,26 +546,33 @@ function delete_concrete(g,ci) { } } +function abs_tab_button(g) { + return button("Abstract",function(){open_abstract(g);}) +} + +function conc_tab_button(g,ci) { + var cs=g.concretes + function del() { delete_concrete(g,ci); } + function open_conc() {open_concrete(g,1*ci); } + return deletable(del,button(concname(cs[ci].langcode),open_conc),"Delete this concrete syntax") +} + function draw_filebar(g) { var cur=(g.current||0)-1; var filebar = empty_class("tr","extensible") filebar.appendChild(gap()); - filebar.appendChild( - tab(cur== -1,button("Abstract",function(){open_abstract(g);}))); - var cs=g.concretes; - function del(ci) { return function() { delete_concrete(g,ci); }} - function open_conc(i) { return function() {open_concrete(g,1*i); }} - for(var i in cs) { + filebar.appendChild(tab(cur== -1,abs_tab_button(g))); + for(var i in g.concretes) { filebar.appendChild(gap()); - filebar.appendChild( - tab(i==cur,deletable(del(i),button(concname(cs[i].langcode),open_conc(i)),"Delete this concrete syntax"))); + filebar.appendChild(tab(i==cur,conc_tab_button(g,i))); } filebar.appendChild(td_gap(more(g,add_concrete,"Add a concrete syntax"))); return wrap_class("table","tabs",filebar); } function draw_file(g) { - return g.current>0 // && g.current<=g.concretes.length + if(g.current>g.concretes.length) g.current=0; // bug resilience + return g.current>0 ? draw_concrete(g,g.current-1) : draw_abstract(g); } @@ -795,21 +805,24 @@ function duplicated(g,kind,orig) { : "Same "+kind+" already defined in "+orig } +function draw_ecat(g,i,dc) { // modifies dc !! + var cs=g.abstract.cats; + var cat=cs[i] + function ren(g,el) { rename_cat(g,el,cat); } + var eident=editable("span",ident(cat),g,ren,"Rename category"); + var check=ifError(dc[cat],duplicated(g,"category",dc[cat]),eident); + function del() { delete_cat(g,i); } + var c=deletable(del,check,"Delete this category") + dc[cs[i]]=g.basename; + return c +} + function draw_cats(g) { var cs=g.abstract.cats; var es=[]; - var defined=inherited_cats(g); - function eident(cat) { - function ren(g,el) { rename_cat(g,el,cat); } - return editable("span",ident(cat),g,ren,"Rename category"); - } - function check(cat,el) { - return ifError(defined[cat],duplicated(g,"category",defined[cat]),el); - } - function del(i) { return function() { delete_cat(g,i); }} + var dc=inherited_cats(g); for(var i in cs) { - es.push(deletable(del(i),check(cs[i],eident(cs[i])),"Delete this category")); - defined[cs[i]]=g.basename; + es.push(draw_ecat(g,i,dc)); es.push(sep("; ")); } es.push(more(g,add_cat,"Add more categories")); @@ -863,18 +876,21 @@ function draw_funs(g) { var es=[]; var dc=defined_cats(g); var df=inherited_funs(g); - function del(i) { return function() { delete_fun(g,i); }} - function draw_efun(i,df) { - return editable("span",draw_fun(g,funs[i],dc,df),g,edit_fun(i),"Edit this function"); - } for(var i in funs) { - es.push(node_sortable("fun",funs[i].name,[deletable(del(i),draw_efun(i,df),"Delete this function")])); - df[funs[i].name]=g.basename; + es.push(node_sortable("fun",funs[i].name,[draw_efun(g,i,dc,df)])); } es.push(more(g,add_fun,"Add a new function")); return es; } +function draw_efun(g,i,dc,df) { // modifies df !! + var funs=g.abstract.funs; + function del() { delete_fun(g,i); } + var f=deletable(del,editable("span",draw_fun(g,funs[i],dc,df),g,edit_fun(i),"Edit this function"),"Delete this function"); + df[funs[i].name]=g.basename; + return f +} + function draw_fun(g,fun,dc,df) { function check(el) { return ifError(dc[fun.name], @@ -1295,7 +1311,7 @@ function draw_lins(g,ci) { function dl(f,cls) { var fn=ident(f.fun) var fty=function_type(g,f.fun) - var linty=lintype(g,conc,igs,dc,fty) + var linty=fty && lintype(g,conc,igs,dc,fty) if(fty) fn.title="fun "+f.fun+": "+show_type(fty) +"\nlin "+f.fun+": "+show_lintype(linty) @@ -1303,7 +1319,7 @@ function draw_lins(g,ci) { for(var i=0; i