diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /appl/wm/debdata.b | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'appl/wm/debdata.b')
| -rw-r--r-- | appl/wm/debdata.b | 418 |
1 files changed, 418 insertions, 0 deletions
diff --git a/appl/wm/debdata.b b/appl/wm/debdata.b new file mode 100644 index 00000000..1f5b6752 --- /dev/null +++ b/appl/wm/debdata.b @@ -0,0 +1,418 @@ +implement DebData; + +include "sys.m"; + sys: Sys; + +include "draw.m"; + +include "string.m"; + str: String; + +include "tk.m"; + tk: Tk; + +include "tkclient.m"; + tkclient: Tkclient; + +include "dialog.m"; + +include "selectfile.m"; + +include "debug.m"; + debug: Debug; + Sym, Src, Exp, Module: import debug; + +include "wmdeb.m"; + debsrc: DebSrc; + +DatumSize: con 32; +WalkWidth: con "20"; + +context: ref Draw->Context; +tktop: ref Tk->Toplevel; +var: ref Vars; +vid: int; +tkids := 1; # increasing id of tk pieces + +icondir : con "debug/"; + +tkconfig := array[] of { + "frame .body -width 400 -height 400", + "pack .Wm_t -side top -fill x", + "pack .body -expand 1 -fill both", + "pack propagate . 0", + "update", + "image create bitmap Itemopen -file "+icondir+ + "open.bit -maskfile "+icondir+"open.mask", + "image create bitmap Itemclosed -file "+icondir+ + "closed.bit -maskfile "+icondir+"closed.mask", +}; + +init(acontext: ref Draw->Context, + geom: string, + adebsrc: DebSrc, + astr: String, + adebug: Debug): (ref Tk->Toplevel, chan of string, chan of string) +{ + context = acontext; + debsrc = adebsrc; + sys = load Sys Sys->PATH; + tk = load Tk Tk->PATH; + str = astr; + debug = adebug; + + tkclient = load Tkclient Tkclient->PATH; + + tkclient->init(); + titlebut: chan of string; + (tktop, titlebut) = tkclient->toplevel(context, geom, "Stack", Tkclient->Resize); + buts := chan of string; + tk->namechan(tktop, buts, "buts"); + + for(i := 0; i < len tkconfig; i++) + tk->cmd(tktop, tkconfig[i]); + + tkcmd("update"); + tkclient->onscreen(tktop, nil); + tkclient->startinput(tktop, "kbd" :: "ptr" :: nil); + return (tktop, buts, titlebut); +} + +ctl(s: string) +{ + if(var == nil) + return; + arg := s[1:]; + case s[0]{ + 'o' => + var.expand(arg); + var.update(); + 'c' => + var.contract(arg); + var.update(); + 'y' => + var.scrolly(arg); + 's' => + var.showsrc(arg); + } + tkcmd("update"); +} + +wmctl(s: string) +{ + if(s == "exit"){ + tkcmd(". unmap"); + return; + } + tkclient->wmctl(tktop, s); + tkcmd("update"); +} + +Vars.create(): ref Vars +{ + t := ".body.v"+string vid++; + + tkcmd("frame "+t); + tkcmd("canvas "+t+".cvar -width 2 -height 2 -yscrollcommand {"+t+".sy set} -xscrollcommand {"+t+".sxvar set}"); + tkcmd("frame "+t+".f0"); + + tkcmd(t+".cvar create window 0 0 -window "+t+".f0 -anchor nw"); + tkcmd("scrollbar "+t+".sxvar -orient horizontal -command {"+t+".cvar xview}"); + + tkcmd("scrollbar "+t+".sy -command {send buts y}"); + tkcmd("pack "+t+".sy -side right -fill y -in "+t); + tkcmd("pack "+t+".sxvar -fill x -side bottom -in "+t); + tkcmd("pack "+t+".cvar -expand 1 -fill both -in "+t); + + return ref Vars(t, 0, nil); +} + +Vars.show(v: self ref Vars) +{ + if(v == var) + return; + if(var != nil) + tkcmd("pack forget "+var.tk); + var = v; + tkcmd("pack "+var.tk+" -expand 1 -fill both"); + v.update(); +} + +Vars.delete(v: self ref Vars) +{ + if(var == v) + var = nil; + tkcmd("destroy "+v.tk); + tkcmd("update"); +} + +Vars.refresh(v: self ref Vars, ea: array of ref Exp) +{ + nea := len ea; + newd := array[nea] of ref Datum; + da := v.d; + nd := len da; + n := nea; + if(n > nd) + n = nd; + for(i := 0; i < n; i++){ + d := da[nd-i-1]; + if(!sameexp(ea[nea-i-1], d.e, 1)) + break; + newd[nea-i-1] = d; + } + n = nea-i; + for(; i < nd; i++) + da[nd-i-1].destroy(); + v.d = nil; + for(i = 0; i < n; i++){ + debsrc->findmod(ea[i].m); + ea[i].findsym(); + newd[i] = mkkid(ea[i], v.tk, "0", string tkids++, nil, nil, -1, ""); + } + for(; i < nea; i++){ + debsrc->findmod(ea[i].m); + ea[i].findsym(); + d := newd[i]; + newd[i] = mkkid(ea[i], v.tk, "0", d.tkid, d.kids, d.val, d.canwalk, ""); + } + v.d = newd; + v.update(); +} + +Vars.update(v: self ref Vars) +{ + tkcmd("update"); + tkcmd(v.tk+".cvar configure -scrollregion {0 0 ["+v.tk+".f0 cget -width] ["+v.tk+".f0 cget -height]}"); + tkcmd("update"); +} + +Vars.scrolly(v: self ref Vars, pos: string) +{ + tkcmd(v.tk+".cvar yview"+pos); +} + +Vars.showsrc(v: self ref Vars, who: string) +{ + (sid, kids) := str->splitl(who[1:], "."); + showsrc(v.d, sid, kids); +} + +showsrc(da: array of ref Datum, id, kids: string) +{ + if(da == nil) + return; + for(i := 0; i < len da; i++){ + d := da[i]; + if(d.tkid != id) + continue; + if(kids == "") + d.showsrc(); + else{ + sid : string; + (sid, kids) = str->splitl(kids[1:], "."); + showsrc(d.kids, sid, kids); + } + break; + } +} + +Vars.expand(v: self ref Vars, who: string) +{ + (sid, kids) := str->splitl(who[1:], "."); + v.d = expandkid(v.d, sid, kids, who); +} + +expandkid(da: array of ref Datum, id, kids, who: string): array of ref Datum +{ + if(da == nil) + return nil; + for(i := 0; i < len da; i++){ + d := da[i]; + if(d.tkid != id) + continue; + if(kids == "") + da[i] = d.expand(nil, who); + else{ + sid : string; + (sid, kids) = str->splitl(kids[1:], "."); + d.kids = expandkid(d.kids, sid, kids, who); + } + break; + } + return da; +} + +Vars.contract(v: self ref Vars, who: string) +{ + (sid, kids) := str->splitl(who[1:], "."); + v.d = contractkid(v.d, sid, kids, who); +} + +contractkid(da: array of ref Datum, id, kids, who: string): array of ref Datum +{ + if(da == nil) + return nil; + for(i := 0; i < len da; i++){ + d := da[i]; + if(d.tkid != id) + continue; + if(kids == "") + da[i] = d.contract(who); + else{ + sid : string; + (sid, kids) = str->splitl(kids[1:], "."); + d.kids = contractkid(d.kids, sid, kids, who); + } + break; + } + return da; +} + +Datum.contract(d: self ref Datum, who: string): ref Datum +{ + vtk := d.vtk; + tkid := d.tkid; + if(tkid == "") + return d; + kids := d.kids; + if(kids == nil){ + tkcmd(vtk+".v"+tkid+".b configure -image Itemclosed -command {send buts o"+who+"}"); + return d; + } + + for(i := 0; i < len kids; i++) + kids[i].destroy(); + d.kids = nil; + tkcmd("destroy "+vtk+".f"+tkid); + tkcmd(vtk+".v"+tkid+".b configure -image Itemclosed -command {send buts o"+who+"}"); + + return d; +} + +Datum.showsrc(d: self ref Datum) +{ + debsrc->showmodsrc(debsrc->findmod(d.e.m), d.e.src()); +} + +Datum.destroy(d: self ref Datum) +{ + kids := d.kids; + for(i := 0; i < len kids; i++) + kids[i].destroy(); + vtk := d.vtk; + tkid := string d.tkid; + if(d.kids != nil){ + tkcmd("destroy "+vtk+".f"+tkid); + } + d.kids = nil; + tkcmd("destroy "+vtk+".v"+tkid); +} + +mkkid(e: ref Exp, vtk, parent, me: string, okids: array of ref Datum, oval:string, owalk: int, who: string): ref Datum +{ + (val, walk) := e.val(); + + who = who+"."+me; + + # make the tk goo + if(walk != owalk){ + if(owalk == -1){ + tkcmd("frame "+vtk+".v"+me); + tkcmd("label "+vtk+".v"+me+".l -text '"+e.name); + tkcmd("bind "+vtk+".v"+me+".l <ButtonRelease-1> 'send buts s"+who); + }else{ + tkcmd("destroy "+vtk+".v"+me+".b"); + } + if(walk) + tkcmd("button "+vtk+".v"+me+".b -image Itemclosed -command 'send buts o"+who); + else + tkcmd("frame "+vtk+".v"+me+".b -width "+WalkWidth); + } + + n := 16 - len e.name; + if(n < 4) + n = 4; + pad := " "[:n]; + + # tk value goo + if(val == "") + val = " "; + if(oval != ""){ + if(val != oval) + tkcmd(vtk+".v"+me+".val configure -text '"+pad+val); + }else + tkcmd("label "+vtk+".v"+me+".val -text '"+pad+val); + + tkcmd("pack "+vtk+".v"+me+".b "+vtk+".v"+me+".l "+vtk+".v"+me+".val -side left"); + tkcmd("pack "+vtk+".v"+me+" -side top -anchor w -in "+vtk+".f"+parent); + + d := ref Datum(me, parent, vtk, e, val, walk, nil); + if(okids != nil){ + if(walk) + return d.expand(okids, who); + for(i := 0; i < len okids; i++) + okids[i].destroy(); + } + return d; +} + +Datum.expand(d: self ref Datum, okids: array of ref Datum, who: string): ref Datum +{ + e := d.e.expand(); + if(e == nil) + return d; + + vtk := d.vtk; + + me := d.tkid; + + # make the tk goo for holding kids + needtk := okids == nil; + if(needtk){ + tkcmd("frame "+vtk+".f"+me); + tkcmd("frame "+vtk+".f"+me+".x -width "+WalkWidth); + tkcmd("frame "+vtk+".f"+me+".v"); + tkcmd("pack "+vtk+".f"+me+".x "+vtk+".f"+me+".v -side left -fill y -expand 1"); + } + + kids := array[len e] of ref Datum; + for(i := 0; i < len e; i++){ + if(i >= len okids) + break; + ok := okids[i]; + if(!sameexp(e[i], ok.e, 0)) + break; + kids[i] = mkkid(e[i], vtk, me, ok.tkid, ok.kids, ok.val, ok.canwalk, who); + } + for(oi := i; oi < len okids; oi++) + okids[oi].destroy(); + for(; i < len e; i++) + kids[i] = mkkid(e[i], vtk, me, string tkids++, nil, nil, -1, who); + + tkcmd("pack "+vtk+".f"+me+" -side top -anchor w -after "+vtk+".v"+me); + tkcmd(vtk+".v"+me+".b configure -image Itemopen -command {send buts c"+who+"}"); + + d.kids = kids; + return d; +} + +sameexp(e, f: ref Exp, offmatch: int): int +{ + if(e.m != f.m || e.p != f.p || e.name != f.name) + return 0; + return !offmatch || e.offset == f.offset; +} + +tkcmd(cmd: string): string +{ + s := tk->cmd(tktop, cmd); +# if(len s != 0 && s[0] == '!') +# sys->print("%s '%s'\n", s, cmd); + return s; +} + +raisex() +{ + tkcmd(". map; raise .; update"); +} |
