From 37da2899f40661e3e9631e497da8dc59b971cbd0 Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 17:07:39 +0000 Subject: 20060303a --- libprefab/textbox.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 libprefab/textbox.c (limited to 'libprefab/textbox.c') diff --git a/libprefab/textbox.c b/libprefab/textbox.c new file mode 100644 index 00000000..6211bfdb --- /dev/null +++ b/libprefab/textbox.c @@ -0,0 +1,138 @@ +#include +#include +#include +#include +#include "../libinterp/runt.h" +#include +#include + +PCompound* +layoutbox(Prefab_Environ *e, Draw_Rect rr, String *titletext, List *texttext) +{ + Draw_Rect er, r, lr; + PCompound *pc; + Prefab_Compound *c; + PElement *title, *text; + Image *disp; + Draw_Image *ddisp; + Screen *screen; + Heap *h; + Rectangle t; + int wid, w; + Point p, pt; + + screen = lookupscreen(e->screen); + if(screen == nil) + return H; + + gchalt++; + wid = Dx(rr); + P2P(p, rr.min); + title = H; + text = H; + if(texttext != H){ + er.min.x = 0; + er.min.y = 0; + er.max.x = wid-5; + er.max.y = Dy(rr); + text = layoutelement(e, texttext, er, EText); + if(text == H){ + gchalt--; + return H; + } + if(wid <= 0) + wid = Dx(text->e.r)+5; + } + if(titletext != H){ + /* see how wide title wants to be */ + memset(&er, 0, sizeof er); + title = textelement(e, titletext, er, ETitle); + if(title == H){ + Errtitle: + destroy(text); + gchalt--; + return H; + } + w = 2+1+3+Dx(title->e.r)+1; + /* if title is wider than text, adjust wid accordingly */ + if(text!=0 && Dx(text->e.r)e.r) < 100){ /* narrow text; don't let title get too wide */ + if(w > 250+5) + w = 250+5; + wid = w; + } + destroy(title); + er.min.x = 0; + er.min.y = 0; + er.max.x = wid-5; + er.max.y = 0; + title = textelement(e, titletext, er, ETitle); + if(title == H) + goto Errtitle; + } + if(wid <= 0) + wid = Dx(title->e.r)+5; + } + + h = heapz(TCompound); + pc = H2D(PCompound*, h); + c = &pc->c; + c->title = (Prefab_Element*)title; + c->contents = (Prefab_Element*)text; + /* now can just destroy c to clean up */ + + r.min = DPOINT(p); + r.max.x = r.min.x+wid; + r.max.y = p.y+2+1 + 1+1; + if(title != H) + r.max.y += title->nkids*e->style->titlefont->height+1; + if(text != H) + r.max.y += Dy(text->e.r); + + er = edgerect(e, DPOINT(p), &r); + + R2R(t, er); + disp = allocwindow(screen, t, Refbackup /*refreshcompound*/, DWhite); + if(disp == nil){ + Err: + destroy(c); + gchalt--; + return H; + } + if((ddisp=mkdrawimage(disp, e->screen, e->screen->display, nil)) == H){ + freeimage(disp); + goto Err; + } + + lr = r; + if(title != H){ + pt.x = r.min.x+3; + pt.y = r.min.y+3; + translateelement(&title->e, pt); + lr.min.y = title->e.r.max.y+1; + } + + if(text != H) + translateelement((Prefab_Element*)text, subpt(IPOINT(lr.min), IPOINT(text->e.r.min))); + + c->r = r; + c->environ = e; + c->image = ddisp; + D2H(e)->ref++; + pc->display = screen->display; + gchalt--; + return pc; + +} + +PCompound* +textbox(Prefab_Environ *e, Draw_Rect rr, String *titletext, String *texttext) +{ + PCompound *pc; + List *l; + + l = listoflayout(e->style, texttext, EText); + pc = layoutbox(e, rr, titletext, l); + free(l); + return pc; +} -- cgit v1.2.3