Prefab: module { PATH: con "$Prefab"; # types of Elements EIcon: con 0; EText: con 1; ETitle: con 2; EHorizontal: con 3; EVertical: con 4; ESeparator: con 5; # first arg to Element.adjust: size of elements Adjpack: con 10; # leave alone, pack tightly Adjequal: con 11; # make equal Adjfill: con 12; # make equal, filling available space # second arg: position of element within space Adjleft: con 20; Adjup: con 20; Adjcenter: con 21; Adjright: con 22; Adjdown: con 22; # default fonts and colors for objects Style: adt { titlefont: ref Draw->Font; textfont: ref Draw->Font; elemcolor: ref Draw->Image; edgecolor: ref Draw->Image; titlecolor: ref Draw->Image; textcolor: ref Draw->Image; highlightcolor: ref Draw->Image; }; # drawing environment for objects Environ: adt { screen: ref Draw->Screen; style: ref Style; }; # operand for layout operators; set either (font, color, text) or (icon, mask) Layout: adt { font: ref Draw->Font; color: ref Draw->Image; text: string; icon: ref Draw->Image; mask: ref Draw->Image; tag: string; }; # graphical objects in the interface, recursively defined for making lists Element: adt { # part of Ell elements kind: int; # type: EIcon, EText, etc. r: Draw->Rect; # rectangle on screen environ: ref Environ; # graphics screen, style tag: string; # identifier for selection # different fields defined for different kinds of Elements kids: list of ref Element; # children of EHorizontal, EVertical str: string; # text in an EText element mask: ref Draw->Image; # part of Eicon, ESeparator image: ref Draw->Image; # part of Eicon, ESeparator, EText, Etitle font: ref Draw->Font; # part of EText, Etitle # constructors icon: fn(env: ref Environ, r: Draw->Rect, icon, mask: ref Draw->Image): ref Element; text: fn(env: ref Environ, text: string, r: Draw->Rect, kind: int): ref Element; layout: fn(env: ref Environ, lay: list of Layout, r: Draw->Rect, kind: int): ref Element; elist: fn(env: ref Environ, elem: ref Element, kind: int): ref Element; separator: fn(env: ref Environ, r: Draw->Rect, icon, mask: ref Draw->Image): ref Element; # editing and geometry append: fn(elist: self ref Element, elem: ref Element): int; adjust: fn(elem: self ref Element, equal: int, dir: int); clip: fn(elem: self ref Element, r: Draw->Rect); scroll: fn(elem: self ref Element, d: Draw->Point); translate: fn(elem: self ref Element, d: Draw->Point); show: fn(elist: self ref Element, elem: ref Element): int; }; # connects an element to a window for display Compound: adt { image: ref Draw->Image; # window on which contents are drawn environ: ref Environ; # graphics screen, style r: Draw->Rect; # rectangle on screen title: ref Element; # above the line (may be nil) contents: ref Element; # below the line # constructors iconbox: fn(env: ref Environ, p: Draw->Point, title: string, icon, mask: ref Draw->Image): ref Compound; textbox: fn(env: ref Environ, r: Draw->Rect, title, text: string): ref Compound; layoutbox:fn(env: ref Environ, r: Draw->Rect, title: string, lay: list of Layout): ref Compound; box: fn(env: ref Environ, p: Draw->Point, title, elist: ref Element): ref Compound; # display draw: fn(comp: self ref Compound); redraw: fn(comp: self ref Compound, r: Draw->Rect); scroll: fn(comp: self ref Compound, elem: ref Element, d: Draw->Point); show: fn(comp: self ref Compound, elem: ref Element): int; # support for using EHorizontal and EVertical as menus select: fn(comp: self ref Compound, elem: ref Element, i: int, c: chan of int): (int, int, ref Element); tagselect: fn(comp: self ref Compound, elem: ref Element, i: int, c: chan of int): (int, int, ref Element); highlight: fn(comp: self ref Compound, elem: ref Element, on: int); }; };