1*37da2899SCharles.Forsyth #include <lib9.h>
2*37da2899SCharles.Forsyth #include <draw.h>
3*37da2899SCharles.Forsyth #include <interp.h>
4*37da2899SCharles.Forsyth #include <isa.h>
5*37da2899SCharles.Forsyth #include "../libinterp/runt.h"
6*37da2899SCharles.Forsyth #include <drawif.h>
7*37da2899SCharles.Forsyth #include <prefab.h>
8*37da2899SCharles.Forsyth
9*37da2899SCharles.Forsyth PCompound*
iconbox(Prefab_Environ * e,Draw_Point p,String * titletext,Draw_Image * icon,Draw_Image * mask)10*37da2899SCharles.Forsyth iconbox(Prefab_Environ *e, Draw_Point p, String *titletext, Draw_Image *icon, Draw_Image *mask)
11*37da2899SCharles.Forsyth {
12*37da2899SCharles.Forsyth Draw_Rect er, r, ir;
13*37da2899SCharles.Forsyth PCompound *pc;
14*37da2899SCharles.Forsyth Prefab_Compound *c;
15*37da2899SCharles.Forsyth PElement *elem, *title;
16*37da2899SCharles.Forsyth Image *disp;
17*37da2899SCharles.Forsyth Draw_Image *ddisp;
18*37da2899SCharles.Forsyth Screen *screen;
19*37da2899SCharles.Forsyth Heap *h;
20*37da2899SCharles.Forsyth Rectangle t;
21*37da2899SCharles.Forsyth Point pt;
22*37da2899SCharles.Forsyth
23*37da2899SCharles.Forsyth screen = lookupscreen(e->screen);
24*37da2899SCharles.Forsyth if(screen == nil)
25*37da2899SCharles.Forsyth return H;
26*37da2899SCharles.Forsyth h = heapz(TCompound);
27*37da2899SCharles.Forsyth if(h == H)
28*37da2899SCharles.Forsyth return H;
29*37da2899SCharles.Forsyth pc = H2D(PCompound*, h);
30*37da2899SCharles.Forsyth c = &pc->c;
31*37da2899SCharles.Forsyth
32*37da2899SCharles.Forsyth gchalt++;
33*37da2899SCharles.Forsyth title = H;
34*37da2899SCharles.Forsyth if(titletext != H){
35*37da2899SCharles.Forsyth er.min.x = 0;
36*37da2899SCharles.Forsyth er.min.y = 0;
37*37da2899SCharles.Forsyth er.max.x = Dx(icon->r)-5;
38*37da2899SCharles.Forsyth er.max.y = 0;
39*37da2899SCharles.Forsyth title = textelement(e, titletext, er, ETitle);
40*37da2899SCharles.Forsyth if(title == H){
41*37da2899SCharles.Forsyth Err:
42*37da2899SCharles.Forsyth destroy(c);
43*37da2899SCharles.Forsyth gchalt--;
44*37da2899SCharles.Forsyth return H;
45*37da2899SCharles.Forsyth }
46*37da2899SCharles.Forsyth c->title = (Prefab_Element*)title;
47*37da2899SCharles.Forsyth }
48*37da2899SCharles.Forsyth
49*37da2899SCharles.Forsyth r = icon->r;
50*37da2899SCharles.Forsyth if(title != H)
51*37da2899SCharles.Forsyth r.max.y += 2+1+title->nkids*e->style->titlefont->height+1;
52*37da2899SCharles.Forsyth
53*37da2899SCharles.Forsyth er = edgerect(e, p, &r);
54*37da2899SCharles.Forsyth
55*37da2899SCharles.Forsyth R2R(t, er);
56*37da2899SCharles.Forsyth disp = allocwindow(screen, t, Refbackup /*refreshcompound*/, DWhite);
57*37da2899SCharles.Forsyth if(disp == nil)
58*37da2899SCharles.Forsyth goto Err;
59*37da2899SCharles.Forsyth
60*37da2899SCharles.Forsyth if((ddisp=mkdrawimage(disp, e->screen, e->screen->display, nil)) == H){
61*37da2899SCharles.Forsyth freeimage(disp);
62*37da2899SCharles.Forsyth goto Err;
63*37da2899SCharles.Forsyth }
64*37da2899SCharles.Forsyth
65*37da2899SCharles.Forsyth ir = r;
66*37da2899SCharles.Forsyth if(title != H){
67*37da2899SCharles.Forsyth ir = r;
68*37da2899SCharles.Forsyth pt.x = r.min.x+3;
69*37da2899SCharles.Forsyth pt.y = r.min.y+3;
70*37da2899SCharles.Forsyth translateelement(&title->e, pt);
71*37da2899SCharles.Forsyth ir.min.y = title->e.r.max.y+1;
72*37da2899SCharles.Forsyth }
73*37da2899SCharles.Forsyth
74*37da2899SCharles.Forsyth elem = iconelement(e, ir, icon, mask);
75*37da2899SCharles.Forsyth c->r = r;
76*37da2899SCharles.Forsyth c->image = ddisp;
77*37da2899SCharles.Forsyth c->environ = e;
78*37da2899SCharles.Forsyth D2H(e)->ref++;
79*37da2899SCharles.Forsyth c->contents = (Prefab_Element*)elem;
80*37da2899SCharles.Forsyth pc->display = screen->display;
81*37da2899SCharles.Forsyth gchalt--;
82*37da2899SCharles.Forsyth return pc;
83*37da2899SCharles.Forsyth }
84