forsyth20121205-174063a80cc13 years agoHistory
138 lines · 2.7 KB · C
RawDownload
#include <lib9.h>#include <draw.h>#include <interp.h>#include <isa.h>#include "../libinterp/runt.h"#include <drawif.h>#include <prefab.h> 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)<w){			if(Dx(text->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;}