IMPLEMENTATION MODULE GtkDemo ; FROM DemoImpl IMPORT DoLinks, DoListBox, DoFlowBox, DoExpander, DoCss; FROM DemosBasic IMPORT DoSpinner, DoPanes, DoOverlay; FROM DemosLayout IMPORT DoSizeGroup, DoFixed2, DoLayoutManager; FROM DemosText IMPORT DoReadMore, DoRotatedText, DoTextMask, DoTextScroll, DoTextUndo; FROM DemosWindows IMPORT DoHeaderBar, DoInfoBar, DoTabs, DoAssistant; FROM DemosInput IMPORT DoPasswordEntry, DoSearchEntry, DoTaggedEntry, DoShortcutTriggers; FROM DemosChooser IMPORT DoComboBox, DoEntryCompletion, DoEntryUndo, DoDialog; FROM DemosCanvas IMPORT DoDrawingArea, DoGestures, DoMask, DoSnapping; FROM SYSTEM IMPORT ADDRESS; TYPE Demo = RECORD name: ARRAY [0..47] OF CHAR; build: BuildProc; END; VAR demos: ARRAY [0..255] 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 (name: ARRAY OF CHAR; build: BuildProc); BEGIN IF n <= HIGH(demos) THEN Copy(demos[n].name, name); demos[n].build := build; INC(n) END END Register; PROCEDURE Count () : CARDINAL; BEGIN RETURN n END Count; PROCEDURE NameOf (i: CARDINAL; VAR name: ARRAY OF CHAR); BEGIN IF i < n THEN Copy(name, demos[i].name) ELSE name[0] := 0C END END NameOf; PROCEDURE BuildByName (name: ARRAY OF CHAR; doWidget: ADDRESS) : ADDRESS; VAR i: CARDINAL; BEGIN i := 0; WHILE i < n DO IF Equal(demos[i].name, name) THEN RETURN demos[i].build(doWidget) END; INC(i) END; RETURN NIL END BuildByName; PROCEDURE IsPorted (name: ARRAY OF CHAR) : BOOLEAN; VAR i: CARDINAL; BEGIN i := 0; WHILE i < n DO IF Equal(demos[i].name, name) THEN RETURN TRUE END; INC(i) END; RETURN FALSE END IsPorted; BEGIN n := 0; Register("links", DoLinks); Register("listbox", DoListBox); Register("flowbox", DoFlowBox); Register("expander", DoExpander); Register("css_basics", DoCss); Register("spinner", DoSpinner); Register("panes", DoPanes); Register("overlay", DoOverlay); Register("sizegroup", DoSizeGroup); Register("fixed2", DoFixed2); Register("layoutmanager", DoLayoutManager); Register("read_more", DoReadMore); Register("rotated_text", DoRotatedText); Register("textmask", DoTextMask); Register("textscroll", DoTextScroll); Register("textundo", DoTextUndo); Register("headerbar", DoHeaderBar); Register("infobar", DoInfoBar); Register("tabs", DoTabs); Register("assistant", DoAssistant); Register("password_entry", DoPasswordEntry); Register("search_entry", DoSearchEntry); Register("tagged_entry", DoTaggedEntry); Register("shortcut_triggers", DoShortcutTriggers); Register("combobox", DoComboBox); Register("entry_completion", DoEntryCompletion); Register("entry_undo", DoEntryUndo); Register("dialog", DoDialog); Register("drawingarea", DoDrawingArea); Register("gestures", DoGestures); Register("mask", DoMask); Register("snapping", DoSnapping) END GtkDemo.