IMPLEMENTATION MODULE GtkDemo ; FROM DemoImpl IMPORT DoLinks, DoListBox, DoFlowBox, DoExpander, DoCss; FROM SYSTEM IMPORT ADDRESS; TYPE Demo = RECORD title: ARRAY [0..63] OF CHAR; keywords: ARRAY [0..127] OF CHAR; build: BuildProc; END; VAR demos: ARRAY [0..31] OF Demo; n: CARDINAL; PROCEDURE Copy (VAR dst: ARRAY OF CHAR; src: ARRAY OF CHAR); VAR i: CARDINAL; BEGIN i := 0; WHILE (i < HIGH(dst)) AND (i <= HIGH(src)) AND (src[i] # 0C) DO dst[i] := src[i]; INC(i) END; dst[i] := 0C END Copy; PROCEDURE Equal (a, b: ARRAY OF CHAR) : BOOLEAN; VAR i: CARDINAL; BEGIN i := 0; WHILE (a[i] # 0C) AND (b[i] # 0C) DO IF a[i] # b[i] THEN RETURN FALSE END; INC(i) END; RETURN a[i] = b[i] END Equal; PROCEDURE Register (title, keywords: ARRAY OF CHAR; build: BuildProc); BEGIN IF n <= HIGH(demos) THEN Copy(demos[n].title, title); Copy(demos[n].keywords, keywords); demos[n].build := build; INC(n) END END Register; PROCEDURE Count () : CARDINAL; BEGIN RETURN n END Count; PROCEDURE TitleOf (i: CARDINAL; VAR title: ARRAY OF CHAR); BEGIN IF i < n THEN Copy(title, demos[i].title) ELSE title[0] := 0C END END TitleOf; PROCEDURE KeywordsOf (i: CARDINAL; VAR keywords: ARRAY OF CHAR); BEGIN IF i < n THEN Copy(keywords, demos[i].keywords) ELSE keywords[0] := 0C END END KeywordsOf; PROCEDURE BuildByTitle (title: ARRAY OF CHAR; doWidget: ADDRESS) : ADDRESS; VAR i: CARDINAL; buf: ARRAY [0..63] OF CHAR; BEGIN i := 0; WHILE i < n DO TitleOf(i, buf); IF Equal(buf, title) THEN RETURN demos[i].build(doWidget) END; INC(i) END; RETURN NIL END BuildByTitle; BEGIN n := 0; Register("Links", "hyperlinks markup label uri anchor", DoLinks); Register("List Box", "list rows selection box", DoListBox); Register("Flow Box", "flow grid reflow colors swatches", DoFlowBox); Register("Expander", "disclosure triangle expand collapse", DoExpander); Register("CSS Basics", "css styling theme provider", DoCss) END GtkDemo.